Update Logging\ErrorMsg to add a Jump Target list for direct jumps

So we can return a list for css element ids we want to jump directly to
This commit is contained in:
Clemens Schwaighofer
2023-10-02 14:02:00 +09:00
parent 7ab03913ac
commit 2f8f98642b
3 changed files with 121 additions and 0 deletions

View File

@@ -421,6 +421,70 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
);
}
}
/**
* Undocumented function
*
* @testdox Test jump target set and reporting
*
* @return void
*/
public function testJumpTarget(): void
{
$log = new \CoreLibs\Logging\Logging([
'log_file_id' => 'testErrorMessagesLogDebug',
'log_folder' => self::LOG_FOLDER,
'log_level' => Level::Debug,
'log_per_run' => true
]);
$em = new \CoreLibs\Logging\ErrorMessage($log);
$em->setJumpTarget(
'target-f',
'Target text'
);
$this->assertEquals(
[
'target-f' => 'Target text'
],
$em->getJumpTarget()
);
// set same target, keep as before
$em->setJumpTarget(
'target-f',
'Other text'
);
$this->assertEquals(
[
'target-f' => 'Target text'
],
$em->getJumpTarget()
);
// add new now two messages
$em->setJumpTarget(
'target-s',
'More text'
);
$this->assertEquals(
[
'target-f' => 'Target text',
'target-s' => 'More text'
],
$em->getJumpTarget()
);
// add empty info
$em->setJumpTarget(
'target-e',
''
);
$this->assertEquals(
[
'target-f' => 'Target text',
'target-s' => 'More text',
'target-e' => 'Jump to: target-e'
],
$em->getJumpTarget()
);
}
}
// __END__

View File

@@ -48,9 +48,16 @@ $em->setErrorMsg('123', 'error', 'msg this is bad, never logged', log_error:fals
$em->setErrorMsg('1000', 'info', 'This is good');
$em->setErrorMsg('9999', 'abort', 'BAD: This is critical (abort)');
$em->setErrorMsg('10-1000', 'wrong', 'Wrong level: This is emergency');
// set some jump targets too
$em->setErrorMsg('100-1', 'error', 'Input wring', jump_target:['target' => 'foo-123', 'info' => 'Jump Target 123']);
$em->setErrorMsg('100-2', 'error', 'Input wring', jump_target:['target' => 'foo-123', 'info' => 'Jump Target 456']);
$em->setMessage('error', 'I have no id set', jump_target:['target' => 'bar-123', 'info' => 'Jump Bar']);
$em->setMessage('error', 'Jump empty', jump_target:['target' => 'bar-empty']);
print "ErrorsLast: <pre>" . $log->prAr($em->getLastErrorMsg()) . "</pre>";
print "ErrorsIds: <pre>" . $log->prAr($em->getErrorIds()) . "</pre>";
print "Errors: <pre>" . $log->prAr($em->getErrorMsg()) . "</pre>";
print "JumpTargets: <pre>" . $log->prAr($em->getJumpTarget()) . "</pre>";
print "</body></html>";

View File

@@ -17,6 +17,8 @@ class ErrorMessage
{
/** @var array<int,array{id:string,level:string,str:string,target:string,target_style:string,highlight:string[]}> */
private array $error_str = [];
/** @var array<string,string> */
private array $jump_targets;
/** @var \CoreLibs\Logging\Logging $log */
public \CoreLibs\Logging\Logging $log;
@@ -61,6 +63,8 @@ class ErrorMessage
* highlight is a list of other target points to highlight
* for highlight targets css names are $level without a prefix and should be
* nested in the target element "input .error { ... }"
* jump_target: a target id for to jump and message, is stored in separate jump array
* where the target is unique, first one set is used for info message
* target_style: if not set uses 'error-' $level as css style. applies to targets or main only
*
* @param string $error_id Any internal error ID for this error
@@ -70,6 +74,9 @@ class ErrorMessage
* @param string $target_style Alternate color style for the error message
* @param array<string> $highlight Any additional error data as error OR
* highlight points for field highlights
* @param array{}|array{target:string,info?:string} $jump_target with "target" for where to jump and
* "info" for string to show in jump list
* target must be set, if info not set, default message used
* @param string|null $message If abort/crash, non localized $str
* @param array<mixed> $context Additionl info for abort/crash messages
* @param bool|null $log_error [=null] log level 'error' to error, if null use global,
@@ -82,6 +89,7 @@ class ErrorMessage
string $target = '',
string $target_style = '',
array $highlight = [],
array $jump_target = [],
?string $message = null,
array $context = [],
?bool $log_error = null,
@@ -103,6 +111,8 @@ class ErrorMessage
'target_style' => $target_style,
'highlight' => $highlight,
];
// set a jump target
$this->setJumpTarget($jump_target['target'] ?? null, $jump_target['info'] ?? null);
// write to log for abort/crash
switch ($level) {
case 'notice':
@@ -152,6 +162,9 @@ class ErrorMessage
* @param string $target_style Alternate color style for the error message
* @param array<string> $highlight Any additional error data as error OR
* highlight points for field highlights
* @param array{}|array{target:string,info?:string} $jump_target with "target" for where to jump and
* "info" for string to show in jump list
* target must be set, if info not set, default message used
* @param string|null $message If abort/crash, non localized $str
* @param array<mixed> $context Additionl info for abort/crash messages
* @param bool|null $log_error [=null] log level 'error' to error, if null use global,
@@ -164,6 +177,7 @@ class ErrorMessage
string $target = '',
string $target_style = '',
array $highlight = [],
array $jump_target = [],
?string $message = null,
array $context = [],
?bool $log_error = null,
@@ -175,12 +189,38 @@ class ErrorMessage
$target,
$target_style,
$highlight,
$jump_target,
$message,
$context,
$log_error
);
}
/**
* Set a jump target. This can be used to jump directly a frontend html block
* with the target id set
*
* @param string|null $target
* @param string|null $info
* @return void
*/
public function setJumpTarget(
?string $target,
?string $info,
): void {
if (
empty($target) ||
!empty($this->jump_targets[$target])
// also check if this is an alphanumeric string? css id compatible?
) {
return;
}
if (empty($info)) {
$info = 'Jump to: ' . $target;
}
$this->jump_targets[$target] = $info;
}
// *********************************************************************
// GETTERS
// *********************************************************************
@@ -223,6 +263,16 @@ class ErrorMessage
];
}
/**
* Return the jump target list
*
* @return array{}|array{string,string} List of jump targets with info text, or empty array if not set
*/
public function getJumpTarget(): array
{
return $this->jump_targets ?? [];
}
// *********************************************************************
// FLAG SETTERS
// *********************************************************************