4
0
Fork 0
dcat-admin/src/Actions/Action.php

267 lines
4.5 KiB
PHP

<?php
namespace Dcat\Admin\Actions;
use Dcat\Admin\Admin;
use Dcat\Admin\Support\Helper;
use Dcat\Admin\Traits\HasHtmlAttributes;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Support\Str;
/**
* Class Action.
*
* @method string href
*/
abstract class Action implements Renderable
{
use HasHtmlAttributes;
use HasActionHandler;
/**
* @var array|string
*/
protected $primaryKey;
/**
* @var string
*/
protected $title;
/**
* @var string
*/
protected $selector;
/**
* @var string
*/
protected $method = 'POST';
/**
* @var string
*/
protected $event = 'click';
/**
* @var bool
*/
protected $disabled = false;
/**
* @var bool
*/
protected $allowHandler = true;
/**
* @var array
*/
protected $htmlClasses = [];
/**
* Action constructor.
*
* @param string $title
*/
public function __construct($title = null)
{
if ($title) {
$this->title = $title;
}
}
/**
* 是否禁用动作.
*
* @param bool $disable
* @return $this
*/
public function disable(bool $disable = true)
{
$this->disabled = $disable;
return $this;
}
/**
* @return bool
*/
public function allowed()
{
return ! $this->disabled;
}
/**
* Get primary key value of action.
*
* @return array|string
*/
public function getKey()
{
return $this->primaryKey;
}
/**
* 设置主键.
*
* @param mixed $key
* @return $this
*/
public function setKey($key)
{
$this->primaryKey = $key;
return $this;
}
/**
* @return string
*/
protected function getElementClass()
{
return ltrim($this->selector(), '.');
}
/**
* 获取动作标题.
*
* @return string
*/
public function title()
{
return $this->title;
}
/**
* @return mixed|string
*/
public function selector()
{
return $this->selector ?: ($this->selector = $this->makeSelector());
}
/**
* 生成选择器.
*
* @param string $prefix
* @return string
*/
public function makeSelector()
{
return '.act-'.Str::random();
}
/**
* @param string|array $class
* @return $this
*/
public function addHtmlClass($class)
{
$this->htmlClasses = array_merge($this->htmlClasses, (array) $class);
return $this;
}
/**
* 需要执行的JS代码.
*
* @return string|void
*/
protected function script()
{
}
/**
* @return string
*/
protected function html()
{
$this->defaultHtmlAttribute('href', 'javascript:void(0)');
return <<<HTML
<a {$this->formatHtmlAttributes()}>{$this->title()}</a>
HTML;
}
/**
* @return void
*/
protected function prepareHandler()
{
if (
! $this->allowHandler
|| ! method_exists($this, 'handle')
) {
return;
}
$this->addHandlerScript();
}
/**
* @return string
*/
public function render()
{
if (! $this->allowed()) {
return '';
}
$this->prepareHandler();
$this->setUpHtmlAttributes();
if ($script = $this->script()) {
Admin::script($script);
}
return $this->html();
}
/**
* @return string
*/
protected function formatHtmlClasses()
{
return implode(' ', array_unique($this->htmlClasses));
}
/**
* @return void
*/
protected function setUpHtmlAttributes()
{
$this->addHtmlClass($this->getElementClass());
$attributes = [
'class' => $this->formatHtmlClasses(),
];
if (method_exists($this, 'href') && ($href = $this->href())) {
$this->allowHandler = false;
$attributes['href'] = $href;
}
$this->defaultHtmlAttribute('style', 'cursor: pointer;');
$this->setHtmlAttribute($attributes);
}
/**
* @return string
*/
public function __toString()
{
return Helper::render($this->render());
}
/**
* @param mixed ...$params
* @return $this
*/
public static function make(...$params)
{
return new static(...$params);
}
}