jqh před 5 roky
rodič
revize
4ce65bd454
47 změnil soubory, kde provedl 237 přidání a 162 odebrání
  1. 1 1
      resources/assets/dcat/sass/components/_custom-data-table.scss
  2. 1 1
      resources/assets/dcat/sass/components/_form.scss
  3. 4 6
      resources/views/form/tree.blade.php
  4. 2 2
      resources/views/layouts/content.blade.php
  5. 2 2
      resources/views/layouts/full-content.blade.php
  6. 3 3
      resources/views/layouts/full-page.blade.php
  7. 1 3
      resources/views/layouts/page.blade.php
  8. 2 2
      resources/views/layouts/vertical.blade.php
  9. 2 2
      resources/views/partials/navbar.blade.php
  10. 3 3
      resources/views/partials/sidebar.blade.php
  11. 15 9
      resources/views/widgets/dialogtable.blade.php
  12. 27 12
      src/Admin.php
  13. 6 16
      src/AdminServiceProvider.php
  14. 1 1
      src/Console/ImportCommand.php
  15. 1 1
      src/Form.php
  16. 1 1
      src/Form/BlockForm.php
  17. 1 1
      src/Form/EmbeddedForm.php
  18. 48 6
      src/Form/Field.php
  19. 1 1
      src/Form/Field/Map.php
  20. 2 6
      src/Form/Field/SelectTable.php
  21. 2 3
      src/Form/Field/Tree.php
  22. 1 1
      src/Form/NestedForm.php
  23. 3 3
      src/Form/Step/Builder.php
  24. 3 4
      src/Grid/Column/Filter/Between.php
  25. 3 4
      src/Grid/Column/Filter/Equal.php
  26. 2 2
      src/Grid/Displayers/AbstractDisplayer.php
  27. 1 1
      src/Grid/Filter/AbstractFilter.php
  28. 1 1
      src/Grid/Filter/Between.php
  29. 1 1
      src/Grid/Filter/Presenter/Presenter.php
  30. 1 1
      src/Grid/Responsive.php
  31. 1 1
      src/Grid/Tools/QuickCreate.php
  32. 2 2
      src/Http/Controllers/RenderableController.php
  33. 1 1
      src/Http/Controllers/ScaffoldController.php
  34. 1 1
      src/Http/Repositories/Extension.php
  35. 2 2
      src/Layout/Asset.php
  36. 3 3
      src/Layout/Menu.php
  37. 2 1
      src/Models/Setting.php
  38. 0 31
      src/Support/AdminSection.php
  39. 1 1
      src/Support/LazyRenderable.php
  40. 49 0
      src/Support/Setting.php
  41. 23 0
      src/Support/helpers.php
  42. 3 3
      src/Traits/HasAssets.php
  43. 1 1
      src/Traits/HasHtml.php
  44. 3 3
      src/Tree.php
  45. 0 9
      src/Widgets/DialogTable.php
  46. 1 1
      src/Widgets/Form.php
  47. 2 2
      src/Widgets/Widget.php

+ 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: $dark40;
+  background: #f0f0f5;
   font-size: .82rem;
 }
 /* #eef1f4; */

+ 1 - 1
resources/assets/dcat/sass/components/_form.scss

@@ -254,7 +254,7 @@ select.form-control:not([multiple=multiple]) {
 }
 .form-control-position {
   position: absolute;
-  top: 2px;
+  top: 0;
   right: 0;
   z-index: 2;
   display: block;

+ 4 - 6
resources/views/form/tree.blade.php

@@ -22,21 +22,19 @@
     </div>
 </div>
 
-@php($formId = $formId ? '#'.$formId : '')
-
 <script require="@jstree">
-    var $tree = $('{!!$formId !!} .{{$class}}-tree-wrapper').find('.da-tree'),
+    var $tree = $('.{{ $class }}-tree-wrapper').find('.da-tree'),
+        $input = $('input[name="{{$name}}"].{{ $class }}'),
         opts = {!! $options !!},
-        $input = $('{!!$formId !!} input[name="{{$name}}"]'),
         parents = {!! $parents !!};
 
     opts.core = opts.core || {};
     opts.core.data = {!! $nodes !!};
 
-    $(document).on("click", "{!!$formId !!} .{{$class}}-tree-wrapper input[value=1]", function () {
+    $(document).on("click", ".{{$class}}-tree-wrapper input[value=1]", function () {
         $tree.jstree($(this).prop("checked") ? "check_all" : "uncheck_all");
     });
-    $(document).on("click", "{!!$formId !!} .{{$class}}-tree-wrapper input[value=2]", function () {
+    $(document).on("click", ".{{$class}}-tree-wrapper input[value=2]", function () {
         $tree.jstree($(this).prop("checked") ? "open_all" : "close_all");
     });
 

+ 2 - 2
resources/views/layouts/content.blade.php

@@ -32,12 +32,12 @@
 
     <div class="content-body" id="app">
         {{-- 页面埋点--}}
-        {!! admin_section(AdminSection::APP_INNER_BEFORE) !!}
+        {!! admin_section(Dcat\Admin\Admin::SECTION['APP_INNER_BEFORE']) !!}
 
         @yield('content')
 
         {{-- 页面埋点--}}
-        {!! admin_section(AdminSection::APP_INNER_AFTER) !!}
+        {!! admin_section(Dcat\Admin\Admin::SECTION['APP_INNER_AFTER']) !!}
     </div>
 
     {!! Dcat\Admin\Admin::asset()->scriptToHtml() !!}

+ 2 - 2
resources/views/layouts/full-content.blade.php

@@ -14,12 +14,12 @@
 
     <div class="content-body" id="app">
         {{-- 页面埋点--}}
-        {!! admin_section(AdminSection::APP_INNER_BEFORE) !!}
+        {!! admin_section(Dcat\Admin\Admin::SECTION['APP_INNER_BEFORE']) !!}
 
         @yield('content')
 
         {{-- 页面埋点--}}
-        {!! admin_section(AdminSection::APP_INNER_AFTER) !!}
+        {!! admin_section(Dcat\Admin\Admin::SECTION['APP_INNER_AFTER']) !!}
     </div>
 
     {!! Dcat\Admin\Admin::asset()->scriptToHtml() !!}

+ 3 - 3
resources/views/layouts/full-page.blade.php

@@ -18,7 +18,7 @@
         <link rel="shortcut icon" href="{{$favicon}}">
     @endif
 
-    {!! admin_section(\AdminSection::HEAD) !!}
+    {!! admin_section(Dcat\Admin\Admin::SECTION['HEAD']) !!}
 
     {!! Dcat\Admin\Admin::asset()->headerJsToHtml() !!}
 
@@ -32,7 +32,7 @@
 </script>
 
 {{-- 页面埋点 --}}
-{!! admin_section(\AdminSection::BODY_INNER_BEFORE) !!}
+{!! admin_section(Dcat\Admin\Admin::SECTION['BODY_INNER_BEFORE']) !!}
 
 <div class="app-content content">
     <div class="wrapper" id="{{ $pjaxContainerId }}">
@@ -40,7 +40,7 @@
     </div>
 </div>
 
-{!! admin_section(\AdminSection::BODY_INNER_AFTER) !!}
+{!! admin_section(Dcat\Admin\Admin::SECTION['BODY_INNER_AFTER']) !!}
 
 {!! Dcat\Admin\Admin::asset()->jsToHtml() !!}
 

+ 1 - 3
resources/views/layouts/page.blade.php

@@ -18,13 +18,11 @@
         <link rel="shortcut icon" href="{{ $favicon }}">
     @endif
 
-    {!! admin_section(\AdminSection::HEAD) !!}
+    {!! admin_section(Dcat\Admin\Admin::SECTION['HEAD']) !!}
 
     {!! Dcat\Admin\Admin::asset()->headerJsToHtml() !!}
 
     {!! Dcat\Admin\Admin::asset()->cssToHtml() !!}
-
-    <!--[if IE]><![endif]-->
 </head>
 
 @extends('admin::layouts.vertical')

+ 2 - 2
resources/views/layouts/vertical.blade.php

@@ -6,7 +6,7 @@
         var Dcat = CreateDcat({!! Dcat\Admin\Admin::jsVariables() !!});
     </script>
 
-    {!! admin_section(\AdminSection::BODY_INNER_BEFORE) !!}
+    {!! admin_section(Dcat\Admin\Admin::SECTION['BODY_INNER_BEFORE']) !!}
 
     <div class="wrapper">
         @include('admin::partials.sidebar')
@@ -35,7 +35,7 @@
         </p>
     </footer>
 
-    {!! admin_section(\AdminSection::BODY_INNER_AFTER) !!}
+    {!! admin_section(Dcat\Admin\Admin::SECTION['BODY_INNER_AFTER']) !!}
 
     {!! Dcat\Admin\Admin::asset()->jsToHtml() !!}
 

+ 2 - 2
resources/views/partials/navbar.blade.php

@@ -25,9 +25,9 @@
                 </div>
                 <ul class="nav navbar-nav float-right">
                     {{--User Account Menu--}}
-                    {!! admin_section(AdminSection::NAVBAR_USER_PANEL) !!}
+                    {!! admin_section(Dcat\Admin\Admin::SECTION['NAVBAR_USER_PANEL']) !!}
 
-                    {!! admin_section(AdminSection::NAVBAR_AFTER_USER_PANEL) !!}
+                    {!! admin_section(Dcat\Admin\Admin::SECTION['NAVBAR_AFTER_USER_PANEL']) !!}
                 </ul>
             </div>
         </div>

+ 3 - 3
resources/views/partials/sidebar.blade.php

@@ -14,11 +14,11 @@
 
             <div class="sidebar p-0 pb-3">
                 <ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" style="padding-top: 10px">
-                    {!! admin_section(AdminSection::LEFT_SIDEBAR_MENU_TOP) !!}
+                    {!! admin_section(Dcat\Admin\Admin::SECTION['LEFT_SIDEBAR_MENU_TOP']) !!}
 
-                    {!! admin_section(AdminSection::LEFT_SIDEBAR_MENU) !!}
+                    {!! admin_section(Dcat\Admin\Admin::SECTION['LEFT_SIDEBAR_MENU']) !!}
 
-                    {!! admin_section(AdminSection::LEFT_SIDEBAR_MENU_BOTTOM) !!}
+                    {!! admin_section(Dcat\Admin\Admin::SECTION['LEFT_SIDEBAR_MENU_BOTTOM']) !!}
                 </ul>
             </div>
         </aside>

+ 15 - 9
resources/views/widgets/dialogtable.blade.php

@@ -1,14 +1,16 @@
-<span style="cursor: pointer" id="button-{{ $id }}">{!! $button !!}</span>
+<span>
+    <span style="cursor: pointer" id="button-{{ $id }}">{!! $button !!}</span>
 
-<template id="temp-{$this->id()}">
-    <div {!! $attributes !!}>
-        <div class="p-2 dialog-body">{!! $table !!}</div>
+    <template id="temp-{{ $id }}">
+        <div {!! $attributes !!}>
+            <div class="p-2 dialog-body">{!! $table !!}</div>
 
-        @if($footer)
-        <div class="dialog-footer layui-layer-btn">{!! $footer !!}</div>
-        @endif
-    </div>
-</template>
+            @if($footer)
+                <div class="dialog-footer layui-layer-btn">{!! $footer !!}</div>
+            @endif
+        </div>
+    </template>
+</span>
 
 <script>
     var id = replaceNestedFormIndex('{{ $id }}'),
@@ -40,6 +42,10 @@
 
                 {!! $events['shown'] !!}
 
+                @if(!empty($events['load']))
+                    $(_tb).on('table:loaded', function (event) { {!! $events['load'] !!} });
+                @endif
+
                 setTimeout(function () {
                     Dcat.grid.AsyncTable({container: _tb});
 

+ 27 - 12
src/Admin.php

@@ -22,24 +22,39 @@ use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Event;
 use Illuminate\Support\Str;
 
-/**
- * Class Admin.
- */
 class Admin
 {
     use HasAssets;
     use HasHtml;
 
-    /**
-     * 版本号.
-     *
-     * @var string
-     */
     const VERSION = '2.0.0-beta';
 
-    /**
-     * @var string
-     */
+    const SECTION = [
+        // 往 <head> 标签内输入内容
+        'HEAD' => 'ADMIN_HEAD',
+
+        // 往body标签内部输入内容
+        'BODY_INNER_BEFORE' => 'ADMIN_BODY_INNER_BEFORE',
+        'BODY_INNER_AFTER' => 'ADMIN_BODY_INNER_AFTER',
+
+        // 往#app内部输入内容
+        'APP_INNER_BEFORE' => 'ADMIN_APP_INNER_BEFORE',
+        'APP_INNER_AFTER' => 'ADMIN_APP_INNER_AFTER',
+
+        // 顶部导航栏用户面板
+        'NAVBAR_USER_PANEL' => 'ADMIN_NAVBAR_USER_PANEL',
+        'NAVBAR_AFTER_USER_PANEL' => 'ADMIN_NAVBAR_AFTER_USER_PANEL',
+
+        // 侧边栏顶部用户信息面板
+        'LEFT_SIDEBAR_USER_PANEL' => 'ADMIN_LEFT_SIDEBAR_USER_PANEL',
+        // 菜单栏
+        'LEFT_SIDEBAR_MENU' => 'ADMIN_LEFT_SIDEBAR_MENU',
+        // 菜单栏顶部
+        'LEFT_SIDEBAR_MENU_TOP' => 'ADMIN_LEFT_SIDEBAR_MENU_TOP',
+        // 菜单栏底部
+        'LEFT_SIDEBAR_MENU_BOTTOM' => 'ADMIN_LEFT_SIDEBAR_MENU_BOTTOM',
+    ];
+
     private static $defaultPjaxContainerId = 'pjax-container';
 
     /**
@@ -298,7 +313,7 @@ class Admin
      *
      * @return \Dcat\Admin\Extend\Manager
      */
-    public static function extensions()
+    public static function extension()
     {
         return app('admin.extend');
     }

+ 6 - 16
src/AdminServiceProvider.php

@@ -76,8 +76,6 @@ class AdminServiceProvider extends ServiceProvider
 
     public function register()
     {
-        require_once __DIR__.'/Support/AdminSection.php';
-
         $this->aliasAdmin();
         $this->loadAdminAuthConfig();
         $this->registerRouteMiddleware();
@@ -186,14 +184,14 @@ class AdminServiceProvider extends ServiceProvider
     protected function registerDefaultSections()
     {
         Content::composing(function () {
-            if (! admin_has_default_section(\AdminSection::NAVBAR_USER_PANEL)) {
-                admin_inject_default_section(\AdminSection::NAVBAR_USER_PANEL, function () {
+            if (! admin_has_default_section(Admin::SECTION['NAVBAR_USER_PANEL'])) {
+                admin_inject_default_section(Admin::SECTION['NAVBAR_USER_PANEL'], function () {
                     return view('admin::partials.navbar-user-panel', ['user' => Admin::user()]);
                 });
             }
 
-            if (! admin_has_default_section(\AdminSection::LEFT_SIDEBAR_USER_PANEL)) {
-                admin_inject_default_section(\AdminSection::LEFT_SIDEBAR_USER_PANEL, function () {
+            if (! admin_has_default_section(Admin::SECTION['LEFT_SIDEBAR_USER_PANEL'])) {
+                admin_inject_default_section(Admin::SECTION['LEFT_SIDEBAR_USER_PANEL'], function () {
                     return view('admin::partials.sidebar-user-panel', ['user' => Admin::user()]);
                 });
             }
@@ -221,24 +219,16 @@ class AdminServiceProvider extends ServiceProvider
 
     protected function registerExtensions()
     {
-        Admin::extensions()->register();
+        Admin::extension()->register();
     }
 
     protected function bootExtensions()
     {
-        Admin::extensions()->boot();
+        Admin::extension()->boot();
     }
 
     protected function registerBladeDirective()
     {
-        Blade::directive('color', function ($color = 'primary', $amt = 0) {
-            $color = $amt ? admin_color()->darken($color, $amt) : admin_color($color);
-
-            return <<<PHP
-<?php echo "{$color}";?>
-PHP;
-        });
-
         Blade::directive('primary', function ($amt = 0) {
             $color = $amt ? admin_color()->darken('primary', $amt) : admin_color('primary');
 

+ 1 - 1
src/Console/ImportCommand.php

@@ -33,7 +33,7 @@ class ImportCommand extends VendorPublishCommand
     {
         $extension = $this->argument('extension');
 
-        $extensions = Admin::extensions();
+        $extensions = Admin::extension();
 
         if (empty($extension) || ! Arr::has($extensions, $extension)) {
             $extension = $this->choice('Please choose a extension to import', array_keys($extensions));

+ 1 - 1
src/Form.php

@@ -312,7 +312,7 @@ class Form implements Renderable
 
         $field->width($width['field'], $width['label']);
 
-        $field::collectAssets();
+        $field::requireAssets();
 
         return $this;
     }

+ 1 - 1
src/Form/BlockForm.php

@@ -57,7 +57,7 @@ class BlockForm extends WidgetForm
         $field->setForm($this->form);
         $field->width($this->width['field'], $this->width['label']);
 
-        $field::collectAssets();
+        $field::requireAssets();
 
         return $this;
     }

+ 1 - 1
src/Form/EmbeddedForm.php

@@ -266,7 +266,7 @@ class EmbeddedForm
 
         $this->fields->push($field);
 
-        $field::collectAssets();
+        $field::requireAssets();
 
         return $this;
     }

+ 48 - 6
src/Form/Field.php

@@ -211,7 +211,17 @@ class Field implements Renderable
     /**
      * @var array
      */
-    protected $labelClass = [];
+    protected $labelClass = ['text-capitalize'];
+
+    /**
+     * @var array
+     */
+    protected $fieldClass = [];
+
+    /**
+     * @var array
+     */
+    protected $formGroupClass = ['form-field'];
 
     /**
      * @var \Closure[]
@@ -938,13 +948,17 @@ class Field implements Renderable
     {
         if ($this->horizontal) {
             return [
-                'label'      => "col-md-{$this->width['label']} {$this->getLabelClass()} text-capitalize",
-                'field'      => "col-md-{$this->width['field']}",
-                'form-group' => 'form-group row form-field',
+                'label'      => "col-md-{$this->width['label']} {$this->getLabelClass()}",
+                'field'      => "col-md-{$this->width['field']} {$this->getFieldClass()}",
+                'form-group' => "form-group row {$this->getFormGroupClass()}",
             ];
         }
 
-        return ['label' => $this->getLabelClass().' text-capitalize', 'field' => '', 'form-group' => 'form-field'];
+        return [
+            'label'      => $this->getLabelClass(),
+            'field'      => $this->getFieldClass(),
+            'form-group' => $this->getFormGroupClass(),
+        ];
     }
 
     /**
@@ -1136,6 +1150,34 @@ class Field implements Renderable
         return implode(' ', $this->labelClass);
     }
 
+    public function setFormGroupClass($labelClass, bool $append = true)
+    {
+        $this->formGroupClass = $append
+            ? array_unique(array_merge($this->formGroupClass, (array) $labelClass))
+            : (array) $labelClass;
+
+        return $this;
+    }
+
+    public function getFormGroupClass()
+    {
+        return implode(' ', $this->formGroupClass);
+    }
+
+    public function setFieldClass($labelClass, bool $append = true)
+    {
+        $this->fieldClass = $append
+            ? array_unique(array_merge($this->fieldClass, (array) $labelClass))
+            : (array) $labelClass;
+
+        return $this;
+    }
+
+    public function getFieldClass()
+    {
+        return implode(' ', $this->fieldClass);
+    }
+
     /**
      * Get the view variables of this field.
      *
@@ -1259,7 +1301,7 @@ class Field implements Renderable
     /**
      * Collect assets required by this field.
      */
-    public static function collectAssets()
+    public static function requireAssets()
     {
         static::$js && Admin::js(static::$js);
         static::$css && Admin::css(static::$css);

+ 1 - 1
src/Form/Field/Map.php

@@ -19,7 +19,7 @@ class Map extends Field
      *
      * @return void
      */
-    public static function collectAssets()
+    public static function requireAssets()
     {
         $keys = config('admin.map.keys');
 

+ 2 - 6
src/Form/Field/SelectTable.php

@@ -138,21 +138,17 @@ class SelectTable extends Field
         $this->setUpTable();
         $this->formatOptions();
 
-        $name = $this->getElementName();
-
         $this->prepend('<i class="feather icon-arrow-up"></i>')
             ->defaultAttribute('class', 'form-control '.$this->getElementClassString())
             ->defaultAttribute('type', 'text')
-            ->defaultAttribute('name', $name)
+            ->defaultAttribute('name', $this->getElementName())
             ->defaultAttribute('id', 'container-'.$this->getElementId());
 
-        $dialog = $this->dialog->render();
-
         $this->addVariables([
             'prepend'      => $this->prepend,
             'append'       => $this->append,
             'style'        => $this->style,
-            'dialog'       => $dialog,
+            'dialog'       => $this->dialog->render(),
             'placeholder'  => $this->placeholder(),
             'dialogId'     => $this->dialog->id(),
             'dialogScript' => $this->dialog->getScript(),

+ 2 - 3
src/Form/Field/Tree.php

@@ -231,9 +231,8 @@ class Tree extends Field
             1 => trans('admin.selectall'),
             2 => trans('admin.expand'),
         ]);
-        if ($this->readOnly) {
-            $checkboxes->disable(1);
-        }
+
+        $this->readOnly && $checkboxes->disable(1);
 
         $this->expand && $checkboxes->check(2);
 

+ 1 - 1
src/Form/NestedForm.php

@@ -336,7 +336,7 @@ class NestedForm
             'key'      => $this->key,
         ]);
 
-        $field::collectAssets();
+        $field::requireAssets();
 
         return $this;
     }

+ 3 - 3
src/Form/Step/Builder.php

@@ -47,7 +47,7 @@ class Builder
             $this->flushStash();
         });
 
-        $this->collectAssets();
+        $this->requireAssets();
     }
 
     /**
@@ -347,9 +347,9 @@ class Builder
     /**
      * @return void
      */
-    protected function collectAssets()
+    protected function requireAssets()
     {
-        Admin::collectAssets('@smart-wizard');
+        Admin::requireAssets('@smart-wizard');
     }
 
     /**

+ 3 - 4
src/Grid/Column/Filter/Between.php

@@ -74,7 +74,7 @@ class Between extends Filter
     {
         $this->dateFormat = $format;
 
-        $this->collectAssets();
+        $this->requireAssets();
 
         return $this;
     }
@@ -198,9 +198,8 @@ JS;
 EOT;
     }
 
-    protected function collectAssets()
+    protected function requireAssets()
     {
-        Admin::collectAssets('moment');
-        Admin::collectAssets('bootstrap-datetimepicker');
+        Admin::requireAssets(['moment', 'bootstrap-datetimepicker']);
     }
 }

+ 3 - 4
src/Grid/Column/Filter/Equal.php

@@ -66,7 +66,7 @@ class Equal extends Filter
     {
         $this->dateFormat = $format;
 
-        $this->collectAssets();
+        $this->requireAssets();
         $this->addDateScript();
 
         return $this;
@@ -111,9 +111,8 @@ class Equal extends Filter
         return $this->renderInput();
     }
 
-    protected function collectAssets()
+    protected function requireAssets()
     {
-        Admin::collectAssets('moment');
-        Admin::collectAssets('bootstrap-datetimepicker');
+        Admin::requireAssets(['moment', 'bootstrap-datetimepicker']);
     }
 }

+ 2 - 2
src/Grid/Displayers/AbstractDisplayer.php

@@ -55,10 +55,10 @@ abstract class AbstractDisplayer
         $this->column = $column;
 
         $this->setRow($row);
-        $this->collectAssets();
+        $this->requireAssets();
     }
 
-    protected function collectAssets()
+    protected function requireAssets()
     {
         if (static::$js) {
             Admin::js(static::$js);

+ 1 - 1
src/Grid/Filter/AbstractFilter.php

@@ -431,7 +431,7 @@ abstract class AbstractFilter
     {
         $presenter->setParent($this);
 
-        $presenter::collectAssets();
+        $presenter::requireAssets();
 
         return $this->presenter = $presenter;
     }

+ 1 - 1
src/Grid/Filter/Between.php

@@ -129,7 +129,7 @@ class Between extends AbstractFilter
     {
         $this->view = 'admin::filter.between-datetime';
 
-        DateTime::collectAssets();
+        DateTime::requireAssets();
 
         $this->setupDatetime($options);
 

+ 1 - 1
src/Grid/Filter/Presenter/Presenter.php

@@ -133,7 +133,7 @@ abstract class Presenter
     /**
      * Collect assets.
      */
-    public static function collectAssets()
+    public static function requireAssets()
     {
         if (static::$js) {
             Admin::js(static::$js);

+ 1 - 1
src/Grid/Responsive.php

@@ -75,7 +75,7 @@ class Responsive
 
     public function build()
     {
-        Admin::collectAssets('rwd-table');
+        Admin::requireAssets('rwd-table');
 
         $this->disablePerfectScrollbar();
 

+ 1 - 1
src/Grid/Tools/QuickCreate.php

@@ -262,7 +262,7 @@ class QuickCreate implements Renderable
 
         $field->setView($this->resolveView(get_class($field)));
 
-        $field::collectAssets();
+        $field::requireAssets();
 
         $this->fields->push($field);
 

+ 2 - 2
src/Http/Controllers/RenderableController.php

@@ -47,8 +47,8 @@ class RenderableController
 
         $renderable->payload($request->all());
 
-        if (method_exists($renderable, 'collectAssets')) {
-            $renderable->collectAssets();
+        if (method_exists($renderable, 'requireAssets')) {
+            $renderable->requireAssets();
         }
 
         return $renderable;

+ 1 - 1
src/Http/Controllers/ScaffoldController.php

@@ -72,7 +72,7 @@ class ScaffoldController extends Controller
             return $this->singular($tableName);
         }
 
-        Admin::collectAssets('select2');
+        Admin::requireAssets('select2');
 
         $dbTypes = static::$dbTypes;
         $dataTypeMap = static::$dataTypeMap;

+ 1 - 1
src/Http/Repositories/Extension.php

@@ -15,7 +15,7 @@ class Extension extends Repository
     public function get(Grid\Model $model)
     {
         $data = [];
-        foreach (Admin::extensions() as $class) {
+        foreach (Admin::extension() as $class) {
             $data[] = $this->each($class::make());
         }
 

+ 2 - 2
src/Layout/Asset.php

@@ -344,11 +344,11 @@ class Asset
      *
      * @param string|array $alias
      */
-    public function collect($alias)
+    public function require($alias)
     {
         if (is_array($alias)) {
             foreach ($alias as $v) {
-                $this->collect($v);
+                $this->require($v);
             }
 
             return;

+ 3 - 3
src/Layout/Menu.php

@@ -52,8 +52,8 @@ class Menu
      */
     public function register()
     {
-        if (! admin_has_default_section(\AdminSection::LEFT_SIDEBAR_MENU)) {
-            admin_inject_default_section(\AdminSection::LEFT_SIDEBAR_MENU, function () {
+        if (! admin_has_default_section(Admin::SECTION['LEFT_SIDEBAR_MENU'])) {
+            admin_inject_default_section(Admin::SECTION['LEFT_SIDEBAR_MENU'], function () {
                 $menuModel = config('admin.database.menu_model');
 
                 return $this->toHtml((new $menuModel())->allNodes());
@@ -73,7 +73,7 @@ class Menu
      */
     public function add(array $nodes = [], int $priority = 10)
     {
-        admin_inject_section(\AdminSection::LEFT_SIDEBAR_MENU_BOTTOM, function () use (&$nodes) {
+        admin_inject_section(Admin::SECTION['LEFT_SIDEBAR_MENU_BOTTOM'], function () use (&$nodes) {
             return $this->toHtml($nodes);
         }, true, $priority);
     }

+ 2 - 1
src/Models/Setting.php

@@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Model;
 class Setting extends Model
 {
     protected $table = 'admin_settings';
-
+    protected $primaryKey = 'slug';
+    public $incrementing = false;
     protected $fillable = ['slug', 'value'];
 }

+ 0 - 31
src/Support/AdminSection.php

@@ -1,31 +0,0 @@
-<?php
-
-class AdminSection
-{
-    // head标签区块,此区块可以往<head>标签内输入内容
-    const HEAD = 'ADMIN_HEAD';
-
-    // 往body标签内部输入内容
-    const BODY_INNER_BEFORE = 'ADMIN_BODY_INNER_BEFORE';
-    const BODY_INNER_AFTER = 'ADMIN_BODY_INNER_AFTER';
-
-    // 往#app内部输入内容
-    // #app div之前
-    const APP_INNER_BEFORE = 'ADMIN_APP_INNER_BEFORE';
-    // #app div结束之后
-    const APP_INNER_AFTER = 'ADMIN_APP_INNER_AFTER';
-
-    // 顶部导航栏用户面板区块
-    const NAVBAR_USER_PANEL = 'ADMIN_NAVBAR_USER_PANEL';
-    // 顶部导航栏用户面板之后区块
-    const NAVBAR_AFTER_USER_PANEL = 'ADMIN_NAVBAR_AFTER_USER_PANEL';
-
-    // 侧边栏顶部用户信息面板区块
-    const LEFT_SIDEBAR_USER_PANEL = 'ADMIN_LEFT_SIDEBAR_USER_PANEL';
-    // 菜单栏区块
-    const LEFT_SIDEBAR_MENU = 'ADMIN_LEFT_SIDEBAR_MENU';
-    // 菜单栏顶部区块
-    const LEFT_SIDEBAR_MENU_TOP = 'ADMIN_LEFT_SIDEBAR_MENU_TOP';
-    // 菜单栏底部区块
-    const LEFT_SIDEBAR_MENU_BOTTOM = 'ADMIN_LEFT_SIDEBAR_MENU_BOTTOM';
-}

+ 1 - 1
src/Support/LazyRenderable.php

@@ -24,7 +24,7 @@ abstract class LazyRenderable implements Renderable
         return new static(...$params);
     }
 
-    public static function collectAssets()
+    public static function requireAssets()
     {
         Admin::js(static::$js);
         Admin::css(static::$css);

+ 49 - 0
src/Support/Setting.php

@@ -22,6 +22,55 @@ class Setting extends Fluent
         return Arr::get($this->attributes, $key, $default);
     }
 
+    /**
+     * 设置配置信息.
+     *
+     * @param array $data
+     *
+     * @return $this
+     */
+    public function set($key, $value = null)
+    {
+        $data = is_array($key) ? $key : [$key => $value];
+
+        foreach ($data as $key => $value) {
+            Arr::set($this->attributes, $key, $value);
+        }
+
+        return $this;
+    }
+
+    /**
+     * 保存配置到数据库
+     *
+     * @param array $data
+     *
+     * @return $this
+     */
+    public function save(array $data = [])
+    {
+        if ($data) {
+            $this->set($data);
+        }
+
+        foreach ($this->attributes as $key => $value) {
+            if (is_array($value)) {
+                $value = json_encode($value);
+            }
+
+            $model = Model::query()
+                ->where('slug', $key)
+                ->first() ?: new Model();
+
+            $model->fill([
+                'slug'  => $key,
+                'value' => (string) $value,
+            ])->save();
+        }
+
+        return $this;
+    }
+
     /**
      * 获取启用的扩展.
      *

+ 23 - 0
src/Support/helpers.php

@@ -6,6 +6,29 @@ use Illuminate\Contracts\Support\Htmlable;
 use Illuminate\Contracts\Support\Renderable;
 use Illuminate\Support\MessageBag;
 
+if (! function_exists('admin_setting')) {
+    /**
+     * @param string|array $key
+     * @param mixed         $default
+     *
+     * @return \Dcat\Admin\Support\Setting|mixed
+     */
+    function admin_setting($key = null, $default = [])
+    {
+        if ($key === null) {
+            return app('admin.setting');
+        }
+
+        if (is_array($key)) {
+            app('admin.setting')->save($key);
+
+            return;
+        }
+
+        return app('admin.setting')->get($key, $default);
+    }
+}
+
 if (! function_exists('admin_section')) {
     /**
      * Get the string contents of a section.

+ 3 - 3
src/Traits/HasAssets.php

@@ -13,13 +13,13 @@ trait HasAssets
     }
 
     /**
-     * @param string $name
+     * @param string|array $name
      *
      * @return void
      */
-    public static function collectAssets(string $name)
+    public static function requireAssets($name)
     {
-        static::asset()->collect($name);
+        static::asset()->require($name);
     }
 
     /**

+ 1 - 1
src/Traits/HasHtml.php

@@ -120,7 +120,7 @@ trait HasHtml
 
         if (! empty($script = trim($element->nodeValue))) {
             if ($require = $element->getAttribute('require')) {
-                static::asset()->collect(explode(',', $require));
+                static::asset()->require(explode(',', $require));
             }
 
             $script = '(function () {'.$script.'})();';

+ 3 - 3
src/Tree.php

@@ -141,7 +141,7 @@ class Tree implements Renderable
         $this->elementId .= Str::random(8);
 
         $this->setupTools();
-        $this->collectAssets();
+        $this->requireAssets();
 
         if ($callback instanceof \Closure) {
             call_user_func($callback, $this);
@@ -185,9 +185,9 @@ class Tree implements Renderable
     /**
      * Collect assets.
      */
-    protected function collectAssets()
+    protected function requireAssets()
     {
-        Admin::collectAssets('jquery.nestable');
+        Admin::requireAssets('jquery.nestable');
     }
 
     /**

+ 0 - 9
src/Widgets/DialogTable.php

@@ -183,17 +183,8 @@ class DialogTable extends Widget
         return $this->table;
     }
 
-    protected function addScript()
-    {
-        if ($this->events['load']) {
-            $this->table->onLoad($this->events['load']);
-        }
-    }
-
     public function render()
     {
-        $this->addScript();
-
         $this->with([
             'id'     => $this->id(),
             'title'  => $this->title,

+ 1 - 1
src/Widgets/Form.php

@@ -559,7 +559,7 @@ class Form implements Renderable
 
         $this->setFileUploadUrl($field);
 
-        $field::collectAssets();
+        $field::requireAssets();
 
         return $this;
     }

+ 2 - 2
src/Widgets/Widget.php

@@ -148,7 +148,7 @@ abstract class Widget implements Renderable
     /**
      * 收集静态资源.
      */
-    public static function collectAssets()
+    public static function requireAssets()
     {
         static::$js && Admin::js(static::$js);
         static::$css && Admin::css(static::$css);
@@ -179,7 +179,7 @@ abstract class Widget implements Renderable
      */
     public function render()
     {
-        static::collectAssets();
+        static::requireAssets();
 
         $html = $this->html();