改为:
<?php
namespace Encore\Admin;
use Closure;
use Encore\Admin\Tree\Tools;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Database\Eloquent\Model;
class Tree implements Renderable
{
/**
* @var array
*/
protected $items = [];
/**
* @var string
*/
protected $elementId = 'tree-';
/**
* @var Model
*/
protected $model;
/**
* @var \Closure
*/
protected $queryCallback;
/**
* View of tree to render.
*
* @var string
*/
protected $view = [
'tree' => 'admin::tree',
'branch' => 'admin::tree.branch',
];
/**
* @var \Closure
*/
protected $callback;
/**
* @var null
*/
protected $branchCallback = null;
/**
* @var bool
*/
public $useCreate = true;
/**
* @var bool
*/
public $useSave = true;
/**
* @var bool
* 加入 public $useDelete = true;
*/
public $useDelete = true;
/**
* @var bool
*/
public $useRefresh = true;
/**
* @var array
*/
protected $nestableOptions = [];
/**
* Header tools.
*
* @var Tools
*/
public $tools;
/**
* Menu constructor.
*
* @param Model|null $model
*/
public function __construct(Model $model = null, \Closure $callback = null)
{
$this->model = $model;
$this->path = \request()->getPathInfo();
$this->elementId .= uniqid();
$this->setupTools();
if ($callback instanceof \Closure) {
call_user_func($callback, $this);
}
$this->initBranchCallback();
}
/**
* Setup tree tools.
*/
public function setupTools()
{
$this->tools = new Tools($this);
}
/**
* Initialize branch callback.
*
* @return void
*/
protected function initBranchCallback()
{
if (is_null($this->branchCallback)) {
$this->branchCallback = function ($branch) {
$key = $branch[$this->model->getKeyName()];
$title = $branch[$this->model->getTitleColumn()];
return "$key - $title";
};
}
}
/**
* Set branch callback.
*
* @param \Closure $branchCallback
*
* @return $this
*/
public function branch(\Closure $branchCallback)
{
$this->branchCallback = $branchCallback;
return $this;
}
/**
* Set query callback this tree.
*
* @return Model
*/
public function query(\Closure $callback)
{
$this->queryCallback = $callback;
return $this;
}
/**
* Set nestable options.
*
* @param array $options
*
* @return $this
*/
public function nestable($options = [])
{
$this->nestableOptions = array_merge($this->nestableOptions, $options);
return $this;
}
/**
* Disable create.
*
* @return void
*/
public function disableCreate()
{
$this->useCreate = false;
}
/**
* Disable save.
*
* @return void
*/
public function disableSave()
{
$this->useSave = false;
}
/**
* Disable disableDelete.
* 加入 disableDelete()
* @return void
*/
public function disableDelete()
{
$this->useDelete = false;
}
/**
* Disable refresh.
*
* @return void
*/
public function disableRefresh()
{
$this->useRefresh = false;
}
/**
* Save tree order from a input.
*
* @param string $serialize
*
* @return bool
*/
public function saveOrder($serialize)
{
$tree = json_decode($serialize, true);
if (json_last_error() != JSON_ERROR_NONE) {
throw new \InvalidArgumentException(json_last_error_msg());
}
$this->model->saveOrder($tree);
return true;
}
/**
* Build tree grid scripts.
*
* @return string
*/
protected function script()
{
$trans = [
'delete_confirm' => trans('admin.delete_confirm'),
'save_succeeded' => trans('admin.save_succeeded'),
'refresh_succeeded' => trans('admin.refresh_succeeded'),
'delete_succeeded' => trans('admin.delete_succeeded'),
'confirm' => trans('admin.confirm'),
'cancel' => trans('admin.cancel'),
];
$nestableOptions = json_encode($this->nestableOptions);
$url = url($this->path);
return <<<SCRIPT
$('#{$this->elementId}').nestable($nestableOptions);
$('.tree_branch_delete').click(function() {
var id = $(this).data('id');
swal({
title: "{$trans['delete_confirm']}",
type: "warning",
showCancelButton: true,
confirmButtonColor: "#DD6B55",
confirmButtonText: "{$trans['confirm']}",
showLoaderOnConfirm: true,
cancelButtonText: "{$trans['cancel']}",
preConfirm: function() {
return new Promise(function(resolve) {
$.ajax({
method: 'post',
url: '{$url}/' + id,
data: {
_method:'delete',
_token:LA.token,
},
success: function (data) {
$.pjax.reload('#pjax-container');
toastr.success('{$trans['delete_succeeded']}');
resolve(data);
}
});
});
}
}).then(function(result) {
var data = result.value;
if (typeof data === 'object') {
if (data.status) {
swal(data.message, '', 'success');
} else {
swal(data.message, '', 'error');
}
}
});
});
$('.{$this->elementId}-save').click(function () {
var serialize = $('#{$this->elementId}').nestable('serialize');
$.post('{$url}', {
_token: LA.token,
_order: JSON.stringify(serialize)
},
function(data){
$.pjax.reload('#pjax-container');
toastr.success('{$trans['save_succeeded']}');
});
});
$('.{$this->elementId}-refresh').click(function () {
$.pjax.reload('#pjax-container');
toastr.success('{$trans['refresh_succeeded']}');
});
$('.{$this->elementId}-tree-tools').on('click', function(e){
var action = $(this).data('action');
if (action === 'expand') {
$('.dd').nestable('expandAll');
}
if (action === 'collapse') {
$('.dd').nestable('collapseAll');
}
});
SCRIPT;
}
/**
* Set view of tree.
*
* @param string $view
*/
public function setView($view)
{
$this->view = $view;
}
/**
* Return all items of the tree.
*
* @param array $items
*/
public function getItems()
{
return $this->model->withQuery($this->queryCallback)->toTree();
}
/**
* Variables in tree template.
*
* @return array
*/
public function variables()
{
return [
'id' => $this->elementId,
'tools' => $this->tools->render(),
'items' => $this->getItems(),
'useCreate' => $this->useCreate,
'useSave' => $this->useSave,
'useDelete' => $this->useDelete, //加入这行
'useRefresh' => $this->useRefresh,
];
}
/**
* Setup grid tools.
*
* @param Closure $callback
*
* @return void
*/
public function tools(Closure $callback)
{
call_user_func($callback, $this->tools);
}
/**
* Render a tree.
*
* @return \Illuminate\Http\JsonResponse|string
*/
public function render()
{
Admin::script($this->script());
view()->share([
'path' => $this->path,
'keyName' => $this->model->getKeyName(),
'branchView' => $this->view['branch'],
'branchCallback' => $this->branchCallback,
]);
return view($this->view['tree'], $this->variables())->render();
}
/**
* Get the string contents of the grid view.
*
* @return string
*/
public function __toString()
{
return $this->render();
}
}