Browse Source

downloadable copyable

Jiang qinghua 5 years ago
parent
commit
d370efa988
3 changed files with 103 additions and 17 deletions
  1. 21 17
      src/Grid/Column.php
  2. 47 0
      src/Grid/Displayers/Copyable.php
  3. 35 0
      src/Grid/Displayers/Downloadable.php

+ 21 - 17
src/Grid/Column.php

@@ -33,6 +33,8 @@ use Illuminate\Support\Str;
  * @method $this modal($title = '', \Closure $callback = null)
  * @method $this tree($callbackOrNodes = null)
  * @method $this qrcode($formatter = null, $width = 150, $height = 150)
+ * @method $this downloadable()
+ * @method $this copyable()
  *
  * @method $this limit($limit = 100, $end = '...')
  * @method $this ascii()
@@ -62,23 +64,25 @@ class Column
      * @var array
      */
     protected static $displayers = [
-        'editable'    => Displayers\Editable::class,
-        'switch'      => Displayers\SwitchDisplay::class,
-        'switchGroup' => Displayers\SwitchGroup::class,
-        'select'      => Displayers\Select::class,
-        'image'       => Displayers\Image::class,
-        'label'       => Displayers\Label::class,
-        'button'      => Displayers\Button::class,
-        'link'        => Displayers\Link::class,
-        'badge'       => Displayers\Badge::class,
-        'progressBar' => Displayers\ProgressBar::class,
-        'radio'       => Displayers\Radio::class,
-        'checkbox'    => Displayers\Checkbox::class,
-        'table'       => Displayers\Table::class,
-        'expand'      => Displayers\Expand::class,
-        'modal'       => Displayers\Modal::class,
-        'tree'        => Displayers\Tree::class,
-        'qrcode'      => Displayers\QRCode::class,
+        'editable'     => Displayers\Editable::class,
+        'switch'       => Displayers\SwitchDisplay::class,
+        'switchGroup'  => Displayers\SwitchGroup::class,
+        'select'       => Displayers\Select::class,
+        'image'        => Displayers\Image::class,
+        'label'        => Displayers\Label::class,
+        'button'       => Displayers\Button::class,
+        'link'         => Displayers\Link::class,
+        'badge'        => Displayers\Badge::class,
+        'progressBar'  => Displayers\ProgressBar::class,
+        'radio'        => Displayers\Radio::class,
+        'checkbox'     => Displayers\Checkbox::class,
+        'table'        => Displayers\Table::class,
+        'expand'       => Displayers\Expand::class,
+        'modal'        => Displayers\Modal::class,
+        'tree'         => Displayers\Tree::class,
+        'qrcode'       => Displayers\QRCode::class,
+        'downloadable' => Displayers\Downloadable::class,
+        'copyable'     => Displayers\Copyable::class,
     ];
 
     /**

+ 47 - 0
src/Grid/Displayers/Copyable.php

@@ -0,0 +1,47 @@
+<?php
+
+namespace Dcat\Admin\Grid\Displayers;
+
+use Dcat\Admin\Admin;
+
+/**
+ * Class Copyable.
+ *
+ * @see https://codepen.io/shaikmaqsood/pen/XmydxJ
+ */
+class Copyable extends AbstractDisplayer
+{
+    protected function addScript()
+    {
+        $script = <<<'JS'
+$('.grid-column-copyable').click(function (e) {
+    
+    var content = $(this).data('content');
+    
+    var $temp = $('<input>');
+    
+    $("body").append($temp);
+    $temp.val(content).select();
+    document.execCommand("copy");
+    $temp.remove();
+    
+    $(this).tooltip('show');
+});
+JS;
+        Admin::script($script);
+    }
+
+    public function display()
+    {
+        $this->addScript();
+
+        $content = $this->column->getOriginal();
+
+        return <<<HTML
+<a href="javascript:void(0);" class="grid-column-copyable text-muted" data-content="{$content}" title="Copied!" data-placement="bottom">
+    <i class="fa fa-copy"></i>
+</a>&nbsp;{$this->value}
+HTML;
+    }
+
+}

+ 35 - 0
src/Grid/Displayers/Downloadable.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace Dcat\Admin\Grid\Displayers;
+
+use Dcat\Admin\Support\Helper;
+use Illuminate\Support\Facades\Storage;
+
+class Downloadable extends AbstractDisplayer
+{
+    public function display($server = '')
+    {
+        return collect(Helper::array($this->value))->filter()->map(function ($value) use ($server) {
+            if (empty($value)) {
+                return '';
+            }
+
+            if (url()->isValidUrl($value)) {
+                $src = $value;
+            } elseif ($server) {
+                $src = rtrim($server, '/') . '/' . ltrim($value, '/');
+            } else {
+                $src = Storage::disk(config('admin.upload.disk'))->url($value);
+            }
+
+            $name = basename($value);
+
+            return <<<HTML
+<a href='$src' download='{$name}' target='_blank' class='text-muted'>
+    <i class="fa fa-download"></i> {$name}
+</a>
+HTML;
+        })->implode('<br>');
+    }
+
+}