["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"]; if ($showTech) $lines[] = $techMsg; elseif ($techMsg) $lines[] = ["\n"]; if ($showException) $lines[] = $exceptionMsg; elseif ($exceptionMsg) $lines[] = ["\n"]; $lines[] = v::ediv(); } else { $lines = ["\n"; } vo::print($lines); } }