mirror of
https://code.castopod.org/adaures/castopod.git
synced 2024-08-16 14:53:23 +02:00
63 lines
1.8 KiB
PHP
63 lines
1.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Views\Components;
|
|
|
|
use Exception;
|
|
use ViewComponents\Component;
|
|
|
|
class DropdownMenu extends Component
|
|
{
|
|
public string $id = '';
|
|
|
|
public string $placement = 'bottom-end';
|
|
|
|
public string $offsetX = '0';
|
|
|
|
public string $offsetY = '0';
|
|
|
|
public array $items = [];
|
|
|
|
public function setItems(string $value): void
|
|
{
|
|
$this->items = json_decode(html_entity_decode($value), true);
|
|
}
|
|
|
|
public function render(): string
|
|
{
|
|
if ($this->items === []) {
|
|
throw new Exception('Dropdown menu has no items');
|
|
}
|
|
|
|
$menuItems = '';
|
|
foreach ($this->items as $item) {
|
|
switch ($item['type']) {
|
|
case 'link':
|
|
$menuItems .= anchor($item['uri'], $item['title'], [
|
|
'class' => 'px-4 py-1 hover:bg-gray-100 focus:ring-castopod focus:ring-inset' . (array_key_exists('class', $item) ? ' ' . $item['class'] : ''),
|
|
]);
|
|
break;
|
|
case 'html':
|
|
$menuItems .= html_entity_decode($item['content']);
|
|
break;
|
|
case 'separator':
|
|
$menuItems .= '<hr class="my-2 border border-gray-100">';
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
return <<<HTML
|
|
<nav id="{$this->id}"
|
|
class="absolute z-50 flex flex-col py-2 text-black whitespace-no-wrap bg-white border-black rounded-lg border-3"
|
|
aria-labelledby="{$this->labelledby}"
|
|
data-dropdown="menu"
|
|
data-dropdown-placement="{$this->placement}"
|
|
data-dropdown-offset-x="{$this->offsetX}"
|
|
data-dropdown-offset-y="{$this->offsetY}">{$menuItems}</nav>
|
|
HTML;
|
|
}
|
|
}
|