jqh 5 lat temu
rodzic
commit
114739318e

+ 32 - 34
resources/assets/dcat/js/bootstrappers/DataActions.js

@@ -1,17 +1,19 @@
 import Dropdown from "../../../adminlte/js/Dropdown";
 
+let $document = $(document);
+
 let defaultActions = {
     // 刷新按钮
-    refresh: function ($action, Dcat) {
-        return function () {
+    refresh: function (action, Dcat) {
+        $document.on('click', action, function () {
             Dcat.reload($(this).data('url'));
-        };
+        });
     },
     // 删除按钮初始化
-    delete: function ($action, Dcat) {
+    delete: function (action, Dcat) {
         let lang = Dcat.lang;
 
-        return function() {
+        $document.on('click', action, function() {
             let url = $(this).data('url'),
                 redirect = $(this).data('redirect'),
                 msg = $(this).data('message');
@@ -31,11 +33,11 @@ let defaultActions = {
                     }
                 });
             });
-        };
+        });
     },
     // 批量删除按钮初始化
-    'batch-delete': function ($action, Dcat) {
-        return function() {
+    'batch-delete': function (action, Dcat) {
+        $document.on('click', action, function() {
             let url = $(this).data('url'),
                 name = $(this).data('name'),
                 keys = Dcat.grid.selected(name),
@@ -59,26 +61,28 @@ let defaultActions = {
                     }
                 });
             });
-        };
+        });
     },
 
     // 图片预览
-    'preview-img': function ($action, Dcat) {
-        return function () {
+    'preview-img': function (action, Dcat) {
+        $document.on('click', action, function () {
             return Dcat.helpers.previewImage($(this).attr('src'));
-        };
+        });
     },
 
-    'popover': function ($action) {
-        $('.popover').remove();
+    'popover': function (action, Dcat) {
+        Dcat.onPjaxComplete(function () {
+            $('.popover').remove();
+        }, false);
 
-        return function () {
-            $action.popover()
-        };
+        $document.on('click', action, function () {
+            $(this).popover()
+        });
     },
 
     'box-actions': function () {
-        $('.box [data-action="collapse"]').click(function (e) {
+        $document.on('click', '.box [data-action="collapse"]', function (e) {
             e.preventDefault();
 
             $(this).find('i').toggleClass('icon-minus icon-plus');
@@ -87,7 +91,7 @@ let defaultActions = {
         });
 
         // Close box
-        $('.box [data-action="remove"]').click(function () {
+        $document.on('click', '.box [data-action="remove"]', function () {
             $(this).closest(".box").removeClass().slideUp("fast");
         });
     },
@@ -96,8 +100,7 @@ let defaultActions = {
         function hide() {
             $('.dropdown-menu').removeClass('show')
         }
-        $(document).off('click', document, hide)
-        $(document).on('click', hide);
+        $document.on('click', hide);
 
         function toggle(event) {
             var $this = $(this);
@@ -114,32 +117,27 @@ let defaultActions = {
         function fix(event) {
             event.preventDefault()
             event.stopPropagation()
-            // console.log(666);
+
             setTimeout(function() {
                 $(this).Dropdown('fixPosition')
             }, 1)
         }
 
-        $('[data-toggle="dropdown"]').off('click').on("click", toggle).on("click", fix);
+        let selector = '[data-toggle="dropdown"]';
+
+        $document
+            .on('click', selector, toggle)
+            .on('click', selector, fix);
     }
 };
 
 export default class DataActions {
     constructor(Dcat) {
         let actions = $.extend(defaultActions, Dcat.actions()),
-            $action,
-            name,
-            func;
+            name;
 
         for (name in actions) {
-            $action = $(`[data-action="${name}"]`);
-
-            func = actions[name]($action, Dcat);
-
-            if (typeof func === 'function') {
-                // 必须先取消再绑定,否则可能造成重复绑定的效果
-                $action.off('click').click(func);
-            }
+            actions[name](`[data-action="${name}"]`, Dcat);
         }
     }
 }

+ 2 - 3
resources/assets/dcat/js/dcat-app.js

@@ -93,6 +93,8 @@ function listen(Dcat) {
         new Menu(Dcat);
         // 返回顶部按钮
         new Footer(Dcat);
+        // data-action 动作绑定(包括删除、批量删除等操作)
+        new DataActions(Dcat);
     });
 
     // 每个请求都初始化
@@ -108,9 +110,6 @@ function listen(Dcat) {
 
         // pjax初始化功能
         new Pjax(Dcat);
-        // data-action 动作绑定(包括删除、批量删除等操作)
-        new DataActions(Dcat);
-
     });
 }
 

+ 1 - 1
resources/assets/dcat/sass/components/_custom-data-table.scss

@@ -57,7 +57,7 @@ $table-border-radius: .3rem;
   padding: 1.25rem 2.8rem !important;
   border-radius: 5rem;
   border: 0;
-  background: #f0f0f5;
+  background: lighten(#f0f0f0, 1%);
   font-size: .82rem;
 }
 /* #eef1f4; */

+ 6 - 1
resources/assets/dcat/sass/components/_img.scss

@@ -1,3 +1,8 @@
-.img {
+[data-action='preview-img'],.img {
   cursor: pointer;
+}
+
+.avatar {
+  max-width: 120px;
+  border: 2px solid #ddd;
 }

+ 5 - 5
resources/views/partials/menu.blade.php

@@ -1,7 +1,7 @@
 @php
     $active = $builder->isActive($item);
 
-    $layer = $item['layer'] ?? 0;
+    $depth = $item['depth'] ?? 0;
 @endphp
 
 @if($builder->visible($item))
@@ -9,10 +9,10 @@
         <li class="nav-header">
             {{ $builder->translate($item['title']) }}
         </li>
-    @elseif(! isset($item['children']))
+    @elseif(empty($item['children']))
         <li class="nav-item">
             <a @if(mb_strpos($item['uri'], '://') !== false) target="_blank" @endif href="{{ $builder->getUrl($item['uri']) }}" class="nav-link {!! $builder->isActive($item) ? 'active' : '' !!}">
-                {!! str_repeat('&nbsp;', $layer) !!}<i class="fa {{ $item['icon'] ?: 'feather icon-circle' }}"></i>
+                {!! str_repeat('&nbsp;', $depth) !!}<i class="fa {{ $item['icon'] ?: 'feather icon-circle' }}"></i>
                 <p>
                     {{ $builder->translate($item['title']) }}
                 </p>
@@ -25,7 +25,7 @@
 
         <li class="nav-item has-treeview {{ $active ? 'menu-open' : '' }}">
             <a href="#" class="nav-link">
-                {!! str_repeat('&nbsp;', $layer) !!}<i class="fa {{ $item['icon'] ?: 'feather icon-circle' }}"></i>
+                {!! str_repeat('&nbsp;', $depth) !!}<i class="fa {{ $item['icon'] ?: 'feather icon-circle' }}"></i>
                 <p>
                     {{ $builder->translate($item['title']) }}
                     <i class="right fa fa-angle-left"></i>
@@ -34,7 +34,7 @@
             <ul class="nav nav-treeview">
                 @foreach($item['children'] as $item)
                     @php
-                        $item['layer'] = $layer + 1;
+                        $item['depth'] = $depth + 1;
                     @endphp
 
                     @include('admin::partials.menu', $item)

+ 14 - 4
src/Form.php

@@ -552,7 +552,7 @@ class Form implements Renderable
                 'message' => $result ? trans('admin.delete_succeeded') : trans('admin.delete_failed'),
             ];
         } catch (\Throwable $exception) {
-            $response = Admin::makeExceptionHandler()->handle($exception);
+            $response = $this->handleException($exception);
 
             if ($response instanceof Response) {
                 return $response;
@@ -567,6 +567,16 @@ class Form implements Renderable
         return response()->json($response);
     }
 
+    /**
+     * @param \Throwable $e
+     *
+     * @return mixed
+     */
+    protected function handleException(\Throwable $e)
+    {
+        return Admin::makeExceptionHandler()->handle($e);
+    }
+
     /**
      * Store a new record.
      *
@@ -611,7 +621,7 @@ class Form implements Renderable
                 trans('admin.save_succeeded')
             );
         } catch (\Throwable $e) {
-            $response = Admin::makeExceptionHandler()->handle($e);
+            $response = $this->handleException($e);
 
             if ($response instanceof Response) {
                 return $response;
@@ -783,7 +793,7 @@ class Form implements Renderable
 
             return $this->redirect($this->redirectUrl($id, $redirectTo), trans('admin.update_succeeded'));
         } catch (\Throwable $e) {
-            $response = Admin::makeExceptionHandler()->handle($e);
+            $response = $this->handleException($e);
 
             if ($response instanceof Response) {
                 return $response;
@@ -1547,7 +1557,7 @@ class Form implements Renderable
 
             return $this->builder->render();
         } catch (\Throwable $e) {
-            return Admin::makeExceptionHandler()->handle($e);
+            return $this->handleException($e);
         }
     }
 

+ 6 - 1
src/Grid.php

@@ -947,7 +947,7 @@ HTML;
 
             $this->setUpOptions();
         } catch (\Throwable $e) {
-            return Admin::makeExceptionHandler()->handle($e);
+            return $this->handleException($e);
         }
 
         return $this->doWrap();
@@ -967,6 +967,11 @@ HTML;
         return $wrapper($view);
     }
 
+    protected function handleException(\Throwable $e)
+    {
+        return Admin::makeExceptionHandler()->handle($e);
+    }
+
     /**
      * Add column to grid.
      *

+ 8 - 8
src/Grid/Concerns/HasFilter.php

@@ -13,7 +13,7 @@ trait HasFilter
      *
      * @var Grid\Filter
      */
-    protected $__filter;
+    protected $filter;
 
     /**
      * @var array
@@ -27,7 +27,7 @@ trait HasFilter
      */
     protected function setupFilter()
     {
-        $this->__filter = new Grid\Filter($this->model());
+        $this->filter = new Grid\Filter($this->model());
     }
 
     /**
@@ -46,7 +46,7 @@ trait HasFilter
         $this->applyColumnFilter();
         $this->applySelectorQuery();
 
-        return $this->__filter->execute($toArray);
+        return $this->filter->execute($toArray);
     }
 
     /**
@@ -59,10 +59,10 @@ trait HasFilter
     public function filter(Closure $callback = null)
     {
         if ($callback === null) {
-            return $this->__filter;
+            return $this->filter;
         }
 
-        call_user_func($callback, $this->__filter);
+        call_user_func($callback, $this->filter);
 
         return $this;
     }
@@ -100,7 +100,7 @@ trait HasFilter
             return '';
         }
 
-        return $this->__filter->render();
+        return $this->filter->render();
     }
 
     /**
@@ -110,7 +110,7 @@ trait HasFilter
      */
     public function expandFilter()
     {
-        $this->__filter->expand();
+        $this->filter->expand();
 
         return $this;
     }
@@ -122,7 +122,7 @@ trait HasFilter
      */
     public function disableFilter(bool $disable = true)
     {
-        $this->__filter->disableCollapse($disable);
+        $this->filter->disableCollapse($disable);
 
         return $this->option('show_filter', ! $disable);
     }

+ 4 - 3
src/Grid/Model.php

@@ -6,6 +6,7 @@ use Dcat\Admin\Admin;
 use Dcat\Admin\Grid;
 use Dcat\Admin\Middleware\Pjax;
 use Dcat\Admin\Repositories\Repository;
+use Dcat\Utils\Backtrace\BacktraceFormatter;
 use Illuminate\Contracts\Support\Arrayable;
 use Illuminate\Database\Eloquent\Relations\Relation;
 use Illuminate\Database\Query\Builder;
@@ -424,10 +425,10 @@ class Model
             $this->setPaginator($data);
 
             $data = $data->getCollection();
-        } elseif (is_array($data)) {
+        } elseif ($data instanceof Collection) {
+
+        } elseif ($data instanceof Arrayable || is_array($data)) {
             $data = collect($data);
-        } elseif ($data instanceof Arrayable) {
-            $data = collect($data->toArray());
         }
 
         if ($data instanceof Collection) {

+ 3 - 1
src/Http/Controllers/UserController.php

@@ -22,7 +22,9 @@ class UserController extends AdminController
     {
         return Grid::make(new Administrator('roles'), function (Grid $grid) {
             $grid->column('id', 'ID')->sortable();
-            $grid->column('username');
+            $grid->column('username')->prepend(function () {
+                return "<img src='{$this->getAvatar()}' data-action='preview-img' width='40' class='avatar img-circle' /> &nbsp; ";
+            });
             $grid->column('name');
 
             if (config('admin.permission.enable')) {

+ 4 - 5
src/Http/Repositories/Administrator.php

@@ -21,16 +21,15 @@ class Administrator extends EloquentRepository
 
         $isPaginator = $results instanceof AbstractPaginator;
 
-        $items = collect($isPaginator ? $results->items() : $results)->toArray();
+        $items = $isPaginator ? $results->getCollection() : $results;
+        $items = is_array($items) ? collect($items) : $items;
 
-        if (! $items) {
+        if ($items->isEmpty()) {
             return $results;
         }
 
         $roleModel = config('admin.database.roles_model');
 
-        $items = collect($items);
-
         $roleKeyName = (new $roleModel())->getKeyName();
 
         $roleIds = $items
@@ -45,7 +44,7 @@ class Administrator extends EloquentRepository
             $items = $items->map(function ($v) use ($roleKeyName, $permissions) {
                 $v['permissions'] = [];
 
-                foreach (array_column($v['roles'], $roleKeyName) as $roleId) {
+                foreach ($v['roles']->pluck($roleKeyName) as $roleId) {
                     $v['permissions'] = array_merge($v['permissions'], $permissions->get($roleId, []));
                 }
 

+ 8 - 7
src/Layout/Menu.php

@@ -56,7 +56,7 @@ class Menu
             admin_inject_default_section(Admin::SECTION['LEFT_SIDEBAR_MENU'], function () {
                 $menuModel = config('admin.database.menu_model');
 
-                return $this->toHtml((new $menuModel())->allNodes());
+                return $this->toHtml((new $menuModel())->allNodes()->toArray());
             });
         }
 
@@ -87,9 +87,10 @@ class Menu
      *
      * @return string
      */
-    public function toHtml(array $nodes)
+    public function toHtml($nodes)
     {
         $html = '';
+
         foreach (Helper::buildNestedArray($nodes) as $item) {
             $html .= $this->render($item);
         }
@@ -114,7 +115,7 @@ class Menu
      *
      * @return string
      */
-    public function render(array $item)
+    public function render($item)
     {
         return view($this->view, ['item' => &$item, 'builder' => $this])->render();
     }
@@ -125,7 +126,7 @@ class Menu
      *
      * @return bool
      */
-    public function isActive(array $item, ?string $path = null)
+    public function isActive($item, ?string $path = null)
     {
         if (empty($path)) {
             $path = request()->path();
@@ -158,11 +159,11 @@ class Menu
      *
      * @return bool
      */
-    public function visible(array $item)
+    public function visible($item)
     {
         $permissionIds = $item['permission_id'] ?? null;
-        $roles = array_column($item['roles'] ?? [], 'slug');
-        $permissions = array_column($item['permissions'] ?? [], 'slug');
+        $roles = array_column(Helper::array($item['roles'] ?? []), 'slug');
+        $permissions = array_column(Helper::array($item['permissions'] ?? []), 'slug');
 
         if (! $permissionIds && ! $roles && ! $permissions) {
             return true;

+ 4 - 4
src/Models/Menu.php

@@ -82,9 +82,9 @@ class Menu extends Model implements Sortable
      *
      * @param bool $force
      *
-     * @return array
+     * @return static[]|\Illuminate\Support\Collection
      */
-    public function allNodes(bool $force = false): array
+    public function allNodes(bool $force = false)
     {
         if ($force || $this->queryCallbacks) {
             return $this->fetchAll();
@@ -98,9 +98,9 @@ class Menu extends Model implements Sortable
     /**
      * Fetch all elements.
      *
-     * @return array
+     * @return static[]|\Illuminate\Support\Collection
      */
-    public function fetchAll(): array
+    public function fetchAll()
     {
         return $this->withQuery(function ($query) {
             if (static::withPermission()) {

+ 2 - 2
src/Repositories/EloquentRepository.php

@@ -159,9 +159,9 @@ class EloquentRepository extends Repository implements TreeRepository
         }
 
         $model->getQueries()->unique()->each(function ($value) use (&$query) {
-            if ($value['method'] == 'paginate') {
+            if ($value['method'] === 'paginate') {
                 $value['arguments'][1] = $this->getGridColumns();
-            } elseif ($value['method'] == 'get') {
+            } elseif ($value['method'] === 'get') {
                 $value['arguments'] = [$this->getGridColumns()];
             }
 

+ 18 - 18
src/Show.php

@@ -134,7 +134,7 @@ class Show implements Renderable
                 $this->key = $model->getKey();
                 $this->keyName = $model->getKeyName();
 
-                $this->model(new Fluent($model->toArray()));
+                $this->model($model);
             } else {
                 $this->repository = Admin::repository($model);
             }
@@ -145,6 +145,10 @@ class Show implements Renderable
         } else {
             $this->model(new Fluent());
         }
+
+        if (! $this->model && $this->repository) {
+            $this->model($this->repository->detail($this));
+        }
     }
 
     /**
@@ -206,34 +210,25 @@ class Show implements Renderable
     }
 
     /**
-     * @param Fluent|null $model
+     * @param Fluent|\Illuminate\Database\Eloquent\Model|null $model
      *
-     * @return Fluent|$this
+     * @return Fluent|$this|\Illuminate\Database\Eloquent\Model
      */
-    public function model(Fluent $model = null)
+    public function model($model = null)
     {
         if ($model === null) {
-            if (! $this->model) {
-                $this->setupModel();
-            }
-
             return $this->model;
         }
 
+        if (is_array($model)) {
+            $model = new Fluent($model);
+        }
+
         $this->model = $model;
 
         return $this;
     }
 
-    protected function setupModel()
-    {
-        if ($this->repository) {
-            $this->model(new Fluent($this->repository->detail($this)));
-        } else {
-            $this->model(new Fluent());
-        }
-    }
-
     /**
      * Set a view to render.
      *
@@ -706,10 +701,15 @@ class Show implements Renderable
 
             return view($this->view, $data)->render();
         } catch (\Throwable $e) {
-            return Admin::makeExceptionHandler()->handle($e);
+            return $this->handleException($e);
         }
     }
 
+    protected function handleException(\Throwable $e)
+    {
+        return Admin::makeExceptionHandler()->handle($e);
+    }
+
     /**
      * Add a row in Show.
      *

+ 2 - 2
src/Support/Helper.php

@@ -319,13 +319,13 @@ class Helper
         $parentId = is_numeric($parentId) ? (int) $parentId : $parentId;
 
         foreach ($nodes as $node) {
-            $pk = Arr::get($node, $parentKeyName);
+            $pk = $node[$parentKeyName];
             $pk = is_numeric($pk) ? (int) $pk : $pk;
 
             if ($pk === $parentId) {
                 $children = static::buildNestedArray(
                     $nodes,
-                    Arr::get($node, $primaryKeyName),
+                    $node[$primaryKeyName],
                     $primaryKeyName,
                     $parentKeyName,
                     $childrenKeyName

+ 4 - 25
src/Traits/ModelTree.php

@@ -30,26 +30,6 @@ trait ModelTree
      */
     protected $queryCallbacks = [];
 
-    /**
-     * Get children of current node.
-     *
-     * @return \Illuminate\Database\Eloquent\Relations\HasMany
-     */
-    public function children()
-    {
-        return $this->hasMany(static::class, $this->getParentColumn());
-    }
-
-    /**
-     * Get parent of current node.
-     *
-     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
-     */
-    public function parent()
-    {
-        return $this->belongsTo(static::class, $this->getParentColumn());
-    }
-
     /**
      * @return string
      */
@@ -114,14 +94,13 @@ trait ModelTree
     /**
      * Get all elements.
      *
-     * @return mixed
+     * @return static[]|\Illuminate\Support\Collection
      */
     public function allNodes()
     {
         return $this->callQueryCallbacks(new static())
             ->orderBy($this->getOrderColumn(), 'asc')
-            ->get()
-            ->toArray();
+            ->get();
     }
 
     /**
@@ -307,14 +286,14 @@ trait ModelTree
      *
      * @return array
      */
-    protected function buildSelectOptions(array $nodes = [], $parentId = 0, $prefix = '')
+    protected function buildSelectOptions($nodes = [], $parentId = 0, $prefix = '')
     {
         $prefix = $prefix ?: str_repeat('&nbsp;', 6);
 
         $options = [];
 
         if (empty($nodes)) {
-            $nodes = $this->allNodes();
+            $nodes = $this->allNodes()->toArray();
         }
 
         $titleColumn = $this->getTitleColumn();

+ 6 - 1
src/Tree.php

@@ -556,7 +556,7 @@ JS;
 
             return $this->doWrap();
         } catch (\Throwable $e) {
-            return Admin::makeExceptionHandler()->handle($e);
+            return $this->handleException($e);
         }
     }
 
@@ -574,6 +574,11 @@ JS;
         return $wrapper($view);
     }
 
+    protected function handleException(\Throwable $e)
+    {
+        return Admin::makeExceptionHandler()->handle($e);
+    }
+
     /**
      * Get the string contents of the grid view.
      *

+ 10 - 0
src/Tree/Actions.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace Dcat\Admin\Tree;
+
+use Dcat\Admin\Actions\Action;
+
+class Actions extends Action
+{
+
+}

+ 29 - 0
src/Tree/Actions/Delete.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace Dcat\Admin\Tree\Actions;
+
+use Dcat\Admin\Tree\RowAction;
+
+class Delete extends RowAction
+{
+    public function title()
+    {
+        return '<i class="feather icon-trash"></i> '.__('admin.delete');
+    }
+
+    public function render()
+    {
+        $this->setHtmlAttribute([
+            'data-url'     => $this->url(),
+            'data-message' => "ID - {$this->getKey()}",
+            'data-action'  => 'delete',
+        ]);
+
+        return parent::render(); // TODO: Change the autogenerated stub
+    }
+
+    public function url()
+    {
+        return "{$this->resource()}/{$this->getKey()}";
+    }
+}

+ 10 - 0
src/Tree/Actions/Edit.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace Dcat\Admin\Tree\Actions;
+
+use Dcat\Admin\Tree\RowAction;
+
+class Edit extends RowAction
+{
+
+}

+ 10 - 0
src/Tree/Actions/QuickEdit.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace Dcat\Admin\Tree\Actions;
+
+use Dcat\Admin\Tree\RowAction;
+
+class QuickEdit extends RowAction
+{
+
+}

+ 10 - 0
src/Tree/Actions/Show.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace Dcat\Admin\Tree\Actions;
+
+use Dcat\Admin\Tree\RowAction;
+
+class Show extends RowAction
+{
+
+}

+ 10 - 0
src/Tree/RowAction.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace Dcat\Admin\Tree;
+
+use Dcat\Admin\Actions\Action;
+
+class RowAction extends Action
+{
+
+}