<?php
namespace PHPFUI\Input;
class CheckBoxMenu extends \PHPFUI\Menu
{
private ?\PHPFUI\MenuItem $allMenuItem = null;
private string $callbackName = '';
private string $className;
private ?\PHPFUI\MenuItem $submitMenuItem = null;
public function __construct(private string $name)
{
parent::__construct();
$this->addClass('cbmenu');
$this->className = $this->getId();
}
public function addAll(string $name = 'All') : \PHPFUI\MenuItem
{
$this->allMenuItem = $this->addCheckBox($name, false, '', -1);
$callback = $this->callbackName ? ($this->callbackName . '("' . $name . '","' . $name . '",active);') : '';
$this->allMenuItem->setAttribute('onclick', 'var active,t=$(this);active=t.toggleClass("is-active").hasClass("is-active");var m=$(".' . $this->className .
'");if(active){m.addClass("is-active");}else{m.removeClass("is-active");};var cb=$("li.' . $this->className .
' input[type=checkbox]");cb.prop("checked",active);' . $callback . 'return false;');
return $this->allMenuItem;
}
public function addCheckBox(string $name, bool $active, string $value, ?int $index = null) : \PHPFUI\MenuItem
{
if (-1 == $index)
{
$hidden = new \PHPFUI\Input('checkbox', '', $value);
$cbName = '';
}
else
{
$otherCount = 0;
if ($this->allMenuItem)
{
++$otherCount;
}
if ($this->submitMenuItem)
{
++$otherCount;
}
$cbName = $this->name . '[' . ($index ?? \count($this) - $otherCount) . ']';
$hidden = new \PHPFUI\Input('checkbox', $cbName, $value);
}
$hidden->addAttribute('style', 'display:none');
if ($active)
{
$hidden->addAttribute('checked');
}
$hiddenId = $hidden->getId();
$menuItem = new \PHPFUI\MenuItem($name, '#');
$menuItem->add($hidden);
$menuItem->addClass($this->className);
$callback = $this->callbackName ? ($this->callbackName . '("' . $cbName . '","' . $value . '",active);') : '';
$menuItem->addAttribute('onclick', 'var active,t=$(this);active=t.toggleClass("is-active").hasClass("is-active");$("#' .
$hiddenId . '").prop("checked",active);' . $callback . 'return false;');
$menuItem->setActive($active);
$this->addMenuItem($menuItem);
return $menuItem;
}
public function addSubmit(\PHPFUI\Form $form, string $name = 'Submit') : \PHPFUI\MenuItem
{
$this->submitMenuItem = new \PHPFUI\MenuItem($name, '#');
$formId = $form->getId();
$this->submitMenuItem->addAttribute('onclick', '$("#' . $formId . '").submit();return false;');
$this->addMenuItem($this->submitMenuItem);
return $this->submitMenuItem;
}
public function getMenuItemClass() : string
{
return $this->className;
}
public function setJavaScriptCallback(string $functionName) : static
{
$this->callbackName = $functionName;
return $this;
}
protected function getStart() : string
{
if ($this->allMenuItem)
{
foreach ($this->menuItems as $item)
{
if (! $item->getActive() && $this->allMenuItem != $item && $this->submitMenuItem != $item)
{
return parent::getStart();
}
}
$this->allMenuItem->setActive();
}
return parent::getStart();
}
}