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);
 | 
						|
  }
 | 
						|
}
 |