'; protected $view = 'admin::widgets.dropdown'; /** * @var array */ protected $button = [ 'text' => null, 'class' => 'btn btn-sm btn-white waves-effect', 'style' => null, ]; /** * @var string */ protected $buttonId; /** * @var \Closure */ protected $builder; /** * @var bool */ protected $divider; /** * @var bool */ protected $click = false; public function __construct(array $options = []) { $this->options($options); } /** * Set the options of dropdown menus. * * @param array $options * @param string|null $title * * @return $this */ public function options($options = [], ?string $title = null) { if (! $options) { return $this; } $this->options[] = [$title, Helper::array($options)]; return $this; } /** * Set the button text. * * @param string|null $text * * @return $this */ public function button(?string $text) { $this->button['text'] = $text; return $this; } /** * Set the button class. * * @param string $class * * @return $this */ public function buttonClass(?string $class) { $this->button['class'] = $class; return $this; } /** * Set the button style. * * @param string $class * * @return $this */ public function buttonStyle(?string $style) { $this->button['style'] = $style; return $this; } /** * Show divider. * * @param string $class * * @return $this */ public function divider() { $this->divider = true; return $this; } /** * Applies the callback to the elements of the options. * * @param string $class * * @return $this */ public function map(\Closure $builder) { $this->builder = $builder; return $this; } /** * Add click event listener. * * @param string|null $defaultLabel * * @return $this */ public function click(?string $defaultLabel = null) { $this->click = true; $this->buttonId = 'dropd-'.Str::random(8); if ($defaultLabel !== null) { $this->button($defaultLabel); } return $this; } /** * @return string */ public function getButtonId() { return $this->buttonId; } /** * @return string */ protected function renderOptions() { $html = ''; foreach ($this->options as &$items) { [$title, $options] = $items; if ($title) { $html .= ""; } foreach ($options as $key => $val) { $html .= $this->renderOption($key, $val); } } return $html; } /** * @param mixed $k * @param mixed $v * * @return mixed|string */ protected function renderOption($k, $v) { if ($v === static::DIVIDER) { return static::$dividerHtml; } if ($builder = $this->builder) { $v = $builder->call($this, $v, $k); } $v = mb_strpos($v, '') ? $v : "$v"; $v = ""; if ($this->divider) { $v .= static::$dividerHtml; $this->divider = null; } return $v; } /** * @return string */ public function render() { $this->addVariables([ 'options' => $this->renderOptions(), 'button' => $this->button, 'buttonId' => $this->buttonId, 'click' => $this->click, ]); return parent::render(); } }