267 lines
4.5 KiB
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);
|
|
}
|
|
}
|