jqh 5 tahun lalu
induk
melakukan
2b22091efa

+ 0 - 11
resources/views/widgets/modal.blade.php

@@ -1,11 +0,0 @@
-<div class="modal fade" id="{{ $id }}" role="dialog">
-    <div class="modal-dialog modal-{{ $size }}">
-        <div class="modal-content">
-            <div class="modal-header">
-                <h4 class="modal-title">{!! $title !!}</h4>
-                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-            </div>
-            <div class="modal-body">{!! $content !!}</div>
-        </div>
-    </div>
-</div>

+ 28 - 9
src/Controllers/RenderableController.php

@@ -4,6 +4,7 @@ namespace Dcat\Admin\Controllers;
 
 use Dcat\Admin\Admin;
 use Dcat\Admin\Support\Helper;
+use Dcat\Admin\Support\LazyRenderable;
 use Illuminate\Http\Request;
 
 class RenderableController
@@ -15,21 +16,18 @@ class RenderableController
      */
     public function handle(Request $request)
     {
-        $class = $request->get('renderable');
+        $renderable = $this->newRenderable($request);
 
-        $class = str_replace('_', '\\', $class);
+        $renderable::collectAssets();
+        $this->addScript();
 
-        if (class_exists($class)) {
-            return $this->render(new $class($request->all()));
-        }
+        $this->forgetDefaultAssets();
 
-        return $class;
+        return $this->render($renderable);
     }
 
-    protected function render($renderable)
+    protected function render(LazyRenderable $renderable)
     {
-        Admin::script('Dcat.pjaxResponded()', true);
-
         $asset = Admin::asset();
 
         return Helper::render($renderable->render())
@@ -39,4 +37,25 @@ class RenderableController
             .$asset->scriptToHtml()
             .$asset->styleToHtml();
     }
+
+    protected function newRenderable(Request $request)
+    {
+        $class = $request->get('renderable');
+
+        $class = str_replace('_', '\\', $class);
+
+        return new $class($request->all());
+    }
+
+    protected function addScript()
+    {
+        Admin::script('Dcat.pjaxResponded()', true);
+    }
+
+    protected function forgetDefaultAssets()
+    {
+        Admin::baseJs([]);
+        Admin::baseCss([]);
+        Admin::fonts([]);
+    }
 }

+ 1 - 8
src/Grid/Displayers/Expand.php

@@ -21,11 +21,6 @@ class Expand extends AbstractDisplayer
         $this->button = $button;
     }
 
-    protected function setUpLazyRenderable(LazyRenderable $renderable)
-    {
-        $renderable::collectAssets();
-    }
-
     public function display($callbackOrButton = null)
     {
         $html = $this->value;
@@ -44,13 +39,11 @@ class Expand extends AbstractDisplayer
         if ($callbackOrButton instanceof LazyRenderable) {
             $html = '<div style="min-height: 150px"></div>';
 
-            $this->setUpLazyRenderable($callbackOrButton);
-
             $remoteUrl = $callbackOrButton->getUrl();
         } elseif (is_string($callbackOrButton) && is_subclass_of($callbackOrButton, LazyRenderable::class)) {
             $html = '<div style="min-height: 150px"></div>';
 
-            $this->setUpLazyRenderable($renderable = $callbackOrButton::make());
+            $renderable = $callbackOrButton::make();
 
             $remoteUrl = $renderable->getUrl();
         } elseif ($callbackOrButton && is_string($callbackOrButton)) {

+ 16 - 67
src/Grid/Displayers/Modal.php

@@ -2,10 +2,9 @@
 
 namespace Dcat\Admin\Grid\Displayers;
 
-use Dcat\Admin\Admin;
+use Dcat\Admin\Widgets\Modal as WidgetModal;
 use Dcat\Admin\Support\Helper;
 use Dcat\Admin\Support\LazyRenderable;
-use Illuminate\Support\Str;
 
 class Modal extends AbstractDisplayer
 {
@@ -16,45 +15,9 @@ class Modal extends AbstractDisplayer
         $this->title = $title;
     }
 
-    protected function generateElementId()
+    protected function setUpLazyRenderable(LazyRenderable $renderable)
     {
-        $key = Str::random(8);
-
-        return 'grid-modal-'.$this->grid->getName().$key;
-    }
-
-    protected function addRenderableScript(string $modalId, string $url)
-    {
-        $script = <<<JS
-(function () {
-    var modal = $('#{$modalId}');
-    
-    modal.on('show.bs.modal', function (e) {
-        modal.find('.modal-body').html('<div style="min-height:150px"></div>');
-    
-        modal.find('.modal-body').loading();
-        
-        $.ajax('{$url}').then(function (data) {
-            var html = Dcat.assets.executeScripts(data, function () {
-                Dcat.triggerReady();
-            }).render();
-            
-            modal.find('.modal-body').html(html);
-        });
-    })
-})();
-JS;
-
-        Admin::script($script);
-    }
-
-    protected function setUpLazyRenderable(string $modalId, LazyRenderable $renderable)
-    {
-        $renderable->with('key', $this->getKey());
-
-        $this->addRenderableScript($modalId, $renderable->getUrl());
-
-        $renderable::collectAssets();
+        return $renderable->with('key', $this->getKey());
     }
 
     public function display($callback = null)
@@ -65,7 +28,6 @@ JS;
         }
 
         $html = $this->value;
-        $id = $this->generateElementId();
 
         if ($callback instanceof \Closure) {
             $callback = $callback->call($this->row, $this);
@@ -77,37 +39,24 @@ JS;
             }
         }
 
-        if (is_string($callback) && is_subclass_of($callback, LazyRenderable::class)) {
-            $html = '';
-
-            $this->setUpLazyRenderable($id, $callback::make());
-        } elseif ($callback instanceof LazyRenderable) {
-            $html = '';
+        if ($callback && is_string($callback) && is_subclass_of($callback, LazyRenderable::class)) {
+            $html = $this->setUpLazyRenderable($callback::make());
 
-            $this->setUpLazyRenderable($id, $callback);
+        } elseif ($callback && $callback instanceof LazyRenderable) {
+            $html = $this->setUpLazyRenderable($callback);
         }
 
         $title = $this->title ?: $title;
 
-        return <<<EOT
-<span class="grid-expand" data-toggle="modal" data-target="#{$id}">
-   <a href="javascript:void(0)"><i class="fa fa-clone"></i>&nbsp;&nbsp;{$this->value}</a>
-</span>
-
-<div class="modal fade" id="{$id}" role="dialog">
-  <div class="modal-dialog modal-lg">
-    <div class="modal-content">
-      <div class="modal-header">
-        <h4 class="modal-title">{$title}</h4>
-         <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-      </div>
-      <div class="modal-body">
-        {$html}
-      </div>
-    </div>
-  </div>
-</div>
+        return WidgetModal::make()
+            ->lg()
+            ->title($title)
+            ->body($html)
+            ->button($this->renderButton());
+    }
 
-EOT;
+    protected function renderButton()
+    {
+        return "<a href=\"javascript:void(0)\"><i class=\"fa fa-clone\"></i>&nbsp;&nbsp;{$this->value}</a>";
     }
 }

+ 1 - 3
src/Traits/AsyncRenderable.php

@@ -51,10 +51,8 @@ trait AsyncRenderable
         }
 
         return <<<JS
-function render(callback) {
+function render(callback) {
     $.ajax('{$this->getRequestUrl()}').then(function (data) {
-        _loading = 0;
-        
         callback(
             Dcat.assets.executeScripts(data, function () {
                 Dcat.triggerReady();

+ 26 - 18
src/Widgets/Modal.php

@@ -239,14 +239,14 @@ class Modal extends Widget
         $script = '';
 
         foreach ($this->events as $v) {
-            $script .= "modal.on('{$v['event']}', function (event) {
-                {$v['script']}
+            $script .= "modal.on('{$v['event']}', function (event) {
+                {$v['script']}
             });";
         }
 
         $this->script = <<<JS
-(function () {
-    var modal = $('{$this->getElementSelector()}');
+(function () {
+    var modal = $('{$this->getElementSelector()}');
     {$script}
 })();
 JS;
@@ -260,10 +260,10 @@ JS;
         }
 
         $this->on('show.bs.modal', <<<JS
-var modal = $(this).find('.modal-body');
-
-modal.html('<div style="min-height:150px"></div>').loading();
-        
+var modal = $(this).find('.modal-body');
+
+modal.html('<div style="min-height:150px"></div>').loading();
+        
 {$script}
 
 render(function (html) {
@@ -278,18 +278,28 @@ JS
         $this->addRenderableScript();
         $this->addEventScript();
 
-        $this->with([
-            'id'      => $this->id,
-            'size'    => $this->size,
-            'title'   => $this->renderTitle(),
-            'content' => $this->renderContent(),
-        ]);
-
         Admin::html(parent::render());
 
         return $this->renderButton();
     }
 
+    public function html()
+    {
+        return <<<HTML
+<div class="modal fade" id="{$this->getId()}" role="dialog">
+    <div class="modal-dialog modal-{$this->size}">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h4 class="modal-title">{$this->renderTitle()}</h4>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+            </div>
+            <div class="modal-body">{$this->renderContent()}</div>
+        </div>
+    </div>
+</div>
+HTML;
+    }
+
     protected function renderTitle()
     {
         return Helper::render($this->title);
@@ -314,9 +324,7 @@ JS
         }
 
         return <<<HTML
-<span class="grid-expand" data-toggle="modal" data-target="#{$this->getId()}">
-   $button
-</span>
+<span data-toggle="modal" data-target="#{$this->getId()}">{$button}</span>
 HTML;
     }
 }

+ 4 - 0
src/Widgets/Widget.php

@@ -174,6 +174,10 @@ abstract class Widget implements Renderable
      */
     public function html()
     {
+        if (! $this->view) {
+            return;
+        }
+
         return view($this->view, $this->variables())->render();
     }