175 lines
6.0 KiB
PHP
175 lines
6.0 KiB
PHP
<?php
|
|
namespace nur\v\bs3;
|
|
|
|
use nur\A;
|
|
use nur\data\types\md_utils;
|
|
use nur\data\types\Metadata;
|
|
use nur\v\html5\Html5Messenger;
|
|
use nur\v\v;
|
|
use nur\v\vo;
|
|
|
|
class Bs3Messenger extends Html5Messenger {
|
|
const KEY_DISMISSIBLE = "dismissible";
|
|
const MESSAGE_OPTIONS_SCHEMA = [
|
|
self::KEY_DISMISSIBLE => ["bool", false, "le message peut-il être masqué par l'utilisateur?"],
|
|
];
|
|
|
|
/** @var Metadata */
|
|
private static $message_md;
|
|
|
|
protected static function message_md(): Metadata {
|
|
return md_utils::ensure_md(self::$message_md
|
|
, array_merge(self::MESSAGE_SCHEMA, self::MESSAGE_OPTIONS_SCHEMA));
|
|
}
|
|
|
|
const ICON_ERROR = Bs3IconManager::ERROR[0];
|
|
const ICON_WARNING = Bs3IconManager::WARNING[0];
|
|
const ICON_INFO = Bs3IconManager::INFO[0];
|
|
const ICON_DEBUG = Bs3IconManager::DEBUG[0];
|
|
|
|
const SECTION_LEVEL_CLASSES = [
|
|
# les clés doivent être ordonnées de la plus grande à la plus petite
|
|
self::LEVEL_CRITICAL => "msg-section-critical",
|
|
self::LEVEL_MAJOR => "msg-section-major",
|
|
self::LEVEL_NORMAL => "msg-section-normal",
|
|
self::LEVEL_MINOR => "msg-section-minor",
|
|
];
|
|
const SECTION_TYPE_CLASSES = [
|
|
# les clés doivent être ordonnées de la plus grande à la plus petite
|
|
self::TYPE_ERROR => "msg-section-danger",
|
|
self::TYPE_WARNING => "msg-section-warning",
|
|
self::TYPE_INFO => "msg-section-default",
|
|
self::TYPE_DEBUG => "msg-section-default",
|
|
];
|
|
const SECTION_TYPE_PREFIXES = [
|
|
# les clés doivent être ordonnées de la plus grande à la plus petite
|
|
self::LEVEL_CRITICAL => [
|
|
self::TYPE_ERROR => self::ICON_ERROR.self::ICON_ERROR." ",
|
|
self::TYPE_WARNING => self::ICON_WARNING.self::ICON_WARNING." ",
|
|
self::TYPE_DEBUG => self::ICON_INFO.self::ICON_INFO." ",
|
|
],
|
|
self::LEVEL_MAJOR => [
|
|
self::TYPE_ERROR => self::ICON_ERROR." ",
|
|
self::TYPE_WARNING => self::ICON_WARNING." ",
|
|
self::TYPE_DEBUG => self::ICON_INFO." ",
|
|
],
|
|
self::LEVEL_NORMAL => [
|
|
self::TYPE_DEBUG => null,
|
|
],
|
|
self::LEVEL_MINOR => [
|
|
self::TYPE_DEBUG => null,
|
|
],
|
|
];
|
|
|
|
const GROUP_LEVEL_CLASSES = [
|
|
# les clés doivent être ordonnées de la plus grande à la plus petite
|
|
self::LEVEL_CRITICAL => "msg-group-critical",
|
|
self::LEVEL_MAJOR => "msg-group-major",
|
|
self::LEVEL_NORMAL => "msg-group-normal",
|
|
self::LEVEL_MINOR => "msg-group-minor",
|
|
];
|
|
const GROUP_TYPE_CLASSES = [
|
|
# les clés doivent être ordonnées de la plus grande à la plus petite
|
|
self::TYPE_ERROR => "msg-group-danger",
|
|
self::TYPE_WARNING => "msg-group-warning",
|
|
self::TYPE_INFO => "msg-group-info",
|
|
self::TYPE_DEBUG => "msg-group-light",
|
|
];
|
|
|
|
const LEVEL_CLASSES = [
|
|
# les clés doivent être ordonnées de la plus grande à la plus petite
|
|
self::LEVEL_CRITICAL => "msg-critical",
|
|
self::LEVEL_MAJOR => "msg-major",
|
|
self::LEVEL_NORMAL => "msg-normal",
|
|
self::LEVEL_MINOR => "msg-minor",
|
|
];
|
|
const TYPE_CLASSES = [
|
|
# les clés doivent être ordonnées de la plus grande à la plus petite
|
|
self::TYPE_ERROR => "msg-danger",
|
|
self::TYPE_WARNING => "msg-warning",
|
|
self::TYPE_INFO => "msg-info",
|
|
self::TYPE_DEBUG => "msg-light",
|
|
];
|
|
const TYPE_PREFIXES = [
|
|
# les clés doivent être ordonnées de la plus grande à la plus petite
|
|
self::LEVEL_CRITICAL => [
|
|
self::TYPE_ERROR => self::ICON_ERROR.self::ICON_ERROR." ",
|
|
self::TYPE_WARNING => self::ICON_WARNING.self::ICON_WARNING." ",
|
|
self::TYPE_DEBUG => self::ICON_INFO.self::ICON_INFO." ",
|
|
],
|
|
self::LEVEL_MAJOR => [
|
|
self::TYPE_ERROR => self::ICON_ERROR." ",
|
|
self::TYPE_WARNING => self::ICON_WARNING." ",
|
|
self::TYPE_INFO => self::ICON_INFO." ",
|
|
self::TYPE_DEBUG => self::ICON_DEBUG." ",
|
|
],
|
|
self::LEVEL_NORMAL => [
|
|
self::TYPE_DEBUG => null,
|
|
],
|
|
self::LEVEL_MINOR => [
|
|
self::TYPE_ERROR => "[error] ",
|
|
self::TYPE_WARNING => "[warn] ",
|
|
self::TYPE_INFO => null,
|
|
self::TYPE_DEBUG => "[debug] ",
|
|
],
|
|
];
|
|
|
|
const RESULT_CLASS_PREFIXES = [
|
|
self::RESULT_FAILURE => ["msg-result-failure", "✘ "],
|
|
self::RESULT_SUCCESS => ["msg-result-success", "✔ "],
|
|
self::RESULT_NEUTRAL => ["msg-result-neutral", ". "],
|
|
self::RESULT_NONE => [null, null],
|
|
];
|
|
|
|
protected function printMsg(
|
|
?array $groups,
|
|
bool $showUser, $userMsg,
|
|
bool $showTech, $techMsg,
|
|
bool $showException, $exceptionMsg,
|
|
int $type, int $level, array $options
|
|
): void {
|
|
$group = A::last($groups);
|
|
if ($group === false) {
|
|
# groupe neutralisé
|
|
return;
|
|
}
|
|
$groupPrefix = $this->getGroupPrefix($group);
|
|
|
|
$result = $type & self::RESULT_MASK;
|
|
$type = $type & self::TYPE_MASK;
|
|
[$typeClass, $typePrefix] = $this->getClassPrefix($type, $level
|
|
, static::LEVEL_CLASSES
|
|
, static::TYPE_CLASSES
|
|
, static::TYPE_PREFIXES
|
|
);
|
|
[$resultClass, $resultPrefix] = $this->getResultClassPrefix($result);
|
|
|
|
if ($showUser || $showTech || $showException) {
|
|
$dismissible = $options[self::KEY_DISMISSIBLE];
|
|
$lines = v::sdiv([
|
|
"class" => ["msg", $typeClass, $resultClass, $dismissible? "alert msg-dismissible": null],
|
|
v::if($dismissible, v::tag("button", [
|
|
"type" => "button", "class" => "close", "aria-label" => "Close",
|
|
"data-dismiss" => "alert",
|
|
v::span(["aria-hidden" => "true", "×"]),
|
|
])),
|
|
$typePrefix, $resultPrefix, $groupPrefix,
|
|
]);
|
|
if ($showUser) $lines[] = $userMsg;
|
|
elseif ($userMsg) $lines[] = ["\n<!--", $userMsg, "-->"];
|
|
if ($showTech) $lines[] = $techMsg;
|
|
elseif ($techMsg) $lines[] = ["\n<!--", $techMsg, "-->"];
|
|
if ($showException) $lines[] = $exceptionMsg;
|
|
elseif ($exceptionMsg) $lines[] = ["\n<!--", $exceptionMsg, "-->"];
|
|
$lines[] = v::ediv();
|
|
} else {
|
|
$lines = ["\n<!--", $typePrefix, $resultPrefix];
|
|
if ($userMsg) $lines[] = ["\n", $userMsg];
|
|
if ($techMsg) $lines[] = ["\n", $techMsg];
|
|
if ($exceptionMsg) $lines[] = ["\n", $exceptionMsg];
|
|
$lines[] = "-->";
|
|
}
|
|
vo::print($lines);
|
|
}
|
|
}
|