123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- <?php
- namespace App\Traits;
- use App\Admin\Actions\Tree\RowAction\CustomColumnDeleteAction;
- use App\Admin\Actions\Tree\ToolAction\ConsumableColumnSortDeleteAction;
- use App\Admin\Actions\Tree\ToolAction\DeviceColumnSortDeleteAction;
- use App\Admin\Actions\Tree\ToolAction\PartColumnSortDeleteAction;
- use App\Admin\Actions\Tree\ToolAction\ServiceColumnSortDeleteAction;
- use App\Admin\Actions\Tree\ToolAction\SoftwareColumnSortDeleteAction;
- use App\Admin\Repositories\ConsumableRecord;
- use App\Admin\Repositories\DeviceRecord;
- use App\Admin\Repositories\PartRecord;
- use App\Admin\Repositories\ServiceRecord;
- use App\Admin\Repositories\SoftwareRecord;
- use App\Form;
- use App\Models\ColumnSort;
- use App\Models\CustomColumn;
- use App\Support\Data;
- use Dcat\Admin\Admin;
- use Dcat\Admin\Form\NestedForm;
- use Dcat\Admin\Layout\Column;
- use Dcat\Admin\Layout\Row;
- use Dcat\Admin\Tree;
- use Dcat\Admin\Widgets\Box;
- use Dcat\Admin\Widgets\Form as WidgetForm;
- use Exception;
- use Illuminate\Database\Schema\Blueprint;
- use Illuminate\Support\Facades\Schema;
- trait ControllerHasColumnSort
- {
- /**
- * 页面渲染.
- *
- * @return Row
- */
- protected function render(): Row
- {
- return new Row(function (Column $column) {
- $column->row(function (Row $row) {
- if ($this->creatable()) {
- $row->column(6, $this->treeView());
- $row->column(6, function (Column $column) {
- $column->row($this->createBox());
- });
- } else {
- $row->column(12, $this->treeView());
- }
- });
- });
- }
- /**
- * 判断当前实例和权限,是否有可创建的权限.
- *
- * @return bool
- */
- public function creatable(): bool
- {
- $repository = $this->repository();
- $creatable = false;
- // @permissions
- if ($repository instanceof DeviceRecord && Admin::user()->can('device.column.create')) {
- $creatable = true;
- }
- if ($repository instanceof PartRecord && Admin::user()->can('part.column.create')) {
- $creatable = true;
- }
- if ($repository instanceof SoftwareRecord && Admin::user()->can('software.column.create')) {
- $creatable = true;
- }
- if ($repository instanceof ConsumableRecord && Admin::user()->can('consumable.column.create')) {
- $creatable = true;
- }
- if ($repository instanceof ServiceRecord && Admin::user()->can('service.column.create')) {
- $creatable = true;
- }
- return $creatable;
- }
- /**
- * 模型树渲染,也就是字段排序的那块.
- *
- * @return Tree
- */
- protected function treeView(): Tree
- {
- $repository = $this->repository();
- $repository = new $repository();
- return new Tree($repository, function (Tree $tree) use ($repository) {
- $tree->maxDepth(1);
- /**
- * 行操作按钮.
- */
- $deletable = $this->deletable();
- $tree->actions(function (Tree\Actions $actions) use ($repository, $deletable) {
- $custom_column = CustomColumn::where('table_name', $repository->getTable())
- ->where('name', $actions->getRow()->title)
- ->first();
- if (!empty($custom_column) && $deletable) {
- $form_data = [
- 'table_name' => $repository->getTable(),
- 'name' => $actions->getRow()->title
- ];
- $html = '<i class="fa fa-fw feather icon-edit"></i>';
- $actions->append('<a href="' . admin_route('columns.update', $form_data) . '">' . $html . admin_trans('main.update_column') . '</a>');
- $actions->append(' ');
- $actions->append(new CustomColumnDeleteAction($repository->getTable(), $actions->getRow()->title));
- }
- $actions->disableQuickEdit();
- $actions->disableEdit();
- $actions->disableDelete();
- });
- $tree->tools(function (Tree\Tools $tools) {
- // @permissions
- if ($this->repository() instanceof DeviceRecord && Admin::user()->can('device.column.sort.delete')) {
- $tools->add(new DeviceColumnSortDeleteAction());
- }
- // @permissions
- if ($this->repository() instanceof PartRecord && Admin::user()->can('part.column.sort.delete')) {
- $tools->add(new PartColumnSortDeleteAction());
- }
- // @permissions
- if ($this->repository() instanceof SoftwareRecord && Admin::user()->can('software.column.sort.delete')) {
- $tools->add(new SoftwareColumnSortDeleteAction());
- }
- // @permissions
- if ($this->repository() instanceof ConsumableRecord && Admin::user()->can('consumable.column.sort.delete')) {
- $tools->add(new ConsumableColumnSortDeleteAction());
- }
- // @permissions
- if ($this->repository() instanceof ServiceRecord && Admin::user()->can('service.column.sort.delete')) {
- $tools->add(new ServiceColumnSortDeleteAction());
- }
- });
- /**
- * 按钮控制.
- */
- $tree->disableCreateButton();
- $tree->disableQuickCreateButton();
- $tree->disableDeleteButton();
- });
- }
- /**
- * 判断当前实例和权限,是否有可创建的权限.
- *
- * @return bool
- */
- public function deletable(): bool
- {
- $repository = $this->repository();
- $deletable = false;
- // @permissions
- if ($repository instanceof DeviceRecord && Admin::user()->can('device.column.delete')) {
- $deletable = true;
- }
- if ($repository instanceof PartRecord && Admin::user()->can('part.column.delete')) {
- $deletable = true;
- }
- if ($repository instanceof SoftwareRecord && Admin::user()->can('software.column.delete')) {
- $deletable = true;
- }
- if ($repository instanceof ConsumableRecord && Admin::user()->can('consumable.column.delete')) {
- $deletable = true;
- }
- if ($repository instanceof ServiceRecord && Admin::user()->can('service.column.delete')) {
- $deletable = true;
- }
- return $deletable;
- }
- /**
- * 表单渲染,也就是新建字段那块.
- *
- * @return Box
- */
- protected function createBox(): Box
- {
- $form = new WidgetForm();
- $form->text('name')
- ->help(admin_trans_label('Name Help'))
- ->required();
- $form->text('nick_name')
- ->help(admin_trans_label('Nick Name Help'))
- ->required();
- $form->select('type')
- ->when('select', function (WidgetForm $form) {
- $form->table('select_options', function (NestedForm $table) {
- $table->text('item');
- });
- })
- ->options(Data::customColumnTypes())
- ->required();
- $form->radio('must')
- ->options(['否', '是'])
- ->help(admin_trans_label('Must Help'))
- ->default(0);
- return Box::make(trans('admin.new'), $form);
- }
- /**
- * Make a form builder.
- *
- * @return Form
- */
- protected function form(): Form
- {
- $repository = $this->repository();
- $repository = new $repository();
- return Form::make($repository, function (Form $form) use ($repository) {
- /**
- * 拦截saving回调,是为了实现字段排序,因为默认是对DeviceRecord做数据处理
- * 但是DeviceRecord重写了数据仓库中toTree方法后,就变成了模型树排序也会走到这个方法中
- * 因此要做拦截,然后在拦截中做判断.
- */
- $form->saving(function (Form $form) use ($repository) {
- $table_name = $repository->getTable();
- /**
- * 如果请求中包含了_order字段,就表示这个请求是排序,而不是DeviceRecord的表单提交
- * 这里做判断是为了区别是排序还是对DeviceRecord数据做处理.
- */
- if (request()->has('_order')) {
- // orders的索引代表排序,orders['id']代表现在数据表中的排序
- $needle_columns = $repository->sortNeedleColumns($table_name);
- $orders = request('_order');
- $orders = json_decode($orders, true);
- foreach ($orders as $key => $order) {
- $column_name = $needle_columns[$order['id']];
- $column_sort = ColumnSort::where('table_name', $table_name)
- ->where('name', $column_name)
- ->first();
- if (empty($column_sort)) {
- $column_sort = new ColumnSort();
- }
- $column_sort->table_name = $table_name;
- $column_sort->name = $column_name;
- $column_sort->order = $key;
- $column_sort->save();
- }
- return $form->response()
- ->success(trans('main.success'))
- ->refresh();
- } else {
- /**
- * 这里是对字段创建拦截处理,拦截表单提交后自行代码实现字段新建的动作
- * 然后直接return请求,达到拦截并转而创建字段的目的.
- */
- $exist_columns = Schema::getColumnListing($table_name);
- if (in_array($form->input('name'), $exist_columns)) {
- return $form->response()
- ->error(trans('main.record_same'));
- }
- $custom_column = new CustomColumn();
- $custom_column->table_name = $table_name;
- $custom_column->name = $form->input('name');
- $custom_column->nick_name = $form->input('nick_name');
- $custom_column->type = $form->input('type');
- if ($custom_column->type == 'select') {
- $custom_column->select_options = $form->input('select_options');
- }
- $custom_column->must = $form->input('must');
- /**
- * 创建自定义字段的数据库迁移动作.
- */
- if ($custom_column->save()) {
- try {
- Schema::table($table_name, function (Blueprint $table) use ($custom_column) {
- $type = $custom_column->type;
- if ($type == 'select') {
- $type = 'string';
- }
- if ((bool)$custom_column->must == 0 || ($type == 'date' || $type == 'dateTime' || $type == 'select')) {
- $table->$type($custom_column->name)->nullable();
- } else {
- $table->$type($custom_column->name)->default(0);
- }
- });
- return $form->response()
- ->success(trans('main.success'))
- ->refresh();
- } catch (Exception $exception) {
- return $form->response()
- ->error(trans('main.fail') . ':' . $exception->getMessage());
- }
- } else {
- return $form->response()
- ->error(trans('main.fail'));
- }
- }
- });
- });
- }
- }
|