new: [helpers:bootstrap] Added notification bubble

pull/93/head
Sami Mokaddem 2022-02-08 17:57:20 +01:00
parent 62ca877f0b
commit d1cf408163
No known key found for this signature in database
GPG Key ID: 164C473F627A06FA
2 changed files with 73 additions and 6 deletions

View File

@ -147,6 +147,12 @@ class BootstrapHelper extends Helper
return $bsSwitch->switch(); return $bsSwitch->switch();
} }
public function notificationBubble($options)
{
$bsNotificationBubble = new BoostrapNotificationBuble($options, $this);
return $bsNotificationBubble->notificationBubble();
}
public function dropdownMenu($options) public function dropdownMenu($options)
{ {
$bsDropdownMenu = new BoostrapDropdownMenu($options, $this); $bsDropdownMenu = new BoostrapDropdownMenu($options, $this);
@ -1381,6 +1387,67 @@ class BoostrapSwitch extends BootstrapGeneric
} }
} }
class BoostrapNotificationBuble extends BootstrapGeneric
{
private $defaultOptions = [
'label' => '',
'variant' => 'warning',
'borderVariant' => 'ligth',
'title' => 'Notification',
'class' => [],
'attrs' => [],
];
function __construct($options)
{
$this->allowedOptionValues = [
'variant' => BootstrapGeneric::$variants,
];
$this->defaultOptions['label'] = __('New notifications');
$this->processOptions($options);
}
private function processOptions($options)
{
$this->options = array_merge($this->defaultOptions, $options);
$this->checkOptionValidity();
if (!empty($this->options['attrs']['style'])) {
$this->options['attrs']['style'] += 'box-shadow: 0 0.125rem 0.25rem #00000050;';
} else {
$this->options['attrs']['style'] = 'box-shadow: 0 0.125rem 0.25rem #00000050;';
}
}
public function notificationBubble()
{
return $this->genNotificationBubble();
}
private function genNotificationBubble()
{
$tmpId = 'tmp-' . mt_rand();
$html = $this->genNode('span', [
'id' => $tmpId,
'class' => [
'position-absolute',
'top-0',
'start-100',
'translate-middle',
'p-1',
'border border-2 rounded-circle',
"border-{$this->options['borderVariant']}",
"bg-{$this->options['variant']}",
],
'title' => $this->options['title']
], $this->genNode('span', [
'class' => [
],
$this->options['label']
]));
return $html;
}
}
class BoostrapProgress extends BootstrapGeneric class BoostrapProgress extends BootstrapGeneric
{ {
private $defaultOptions = [ private $defaultOptions = [

View File

@ -20,12 +20,12 @@ $variant = array_flip($severity)[$maxSeverity];
<a class="nav-link px-2 text-decoration-none profile-button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" href="#" data-bs-offset="10,20"> <a class="nav-link px-2 text-decoration-none profile-button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" href="#" data-bs-offset="10,20">
<span class="position-relative"> <span class="position-relative">
<i class="<?= $this->FontAwesome->getClass('bell') ?> fa-lg"></i> <i class="<?= $this->FontAwesome->getClass('bell') ?> fa-lg"></i>
<span <?=
class="<?= empty($notifications) ? 'd-none' : '' ?> position-absolute top-0 start-100 translate-middle p-1 bg-<?= $variant ?> border border-light border-2 rounded-circle" $this->Bootstrap->notificationBubble([
style="box-shadow: 0 0.125rem 0.25rem #00000050;" 'class' => empty($notifications) ? 'd-none' : '',
> 'variant' => $variant,
<span class="visually-hidden"><?= __('New notifications') ?></span> ])
</span> ?>
</span> </span>
</a> </a>
<div class="dropdown-menu dropdown-menu-end" style="min-width: 320px; max-width: 25vw"> <div class="dropdown-menu dropdown-menu-end" style="min-width: 320px; max-width: 25vw">