ExtensionController.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. <?php
  2. namespace Dcat\Admin\Controllers;
  3. use Dcat\Admin\Admin;
  4. use Dcat\Admin\Extension\Grid\BuildExtensionButton;
  5. use Dcat\Admin\Extension\Grid\ImportButton;
  6. use Dcat\Admin\Form;
  7. use Dcat\Admin\Grid;
  8. use Dcat\Admin\Layout\Content;
  9. use Dcat\Admin\Models\Repositories\Extension;
  10. use Dcat\Admin\Widgets\Alert;
  11. use Dcat\Admin\Widgets\Box;
  12. use Dcat\Admin\Widgets\Table;
  13. use Dcat\Admin\Widgets\Terminal;
  14. use Dcat\Admin\Widgets\Tooltip;
  15. use Illuminate\Routing\Controller;
  16. class ExtensionController extends Controller
  17. {
  18. use HasResourceActions;
  19. /**
  20. * Index interface.
  21. *
  22. * @param Content $content
  23. * @return Content
  24. */
  25. public function index(Content $content)
  26. {
  27. $this->define();
  28. return $content
  29. ->header(admin_trans_label('Extensions'))
  30. ->description(trans('admin.list'))
  31. ->body($this->grid());
  32. }
  33. /**
  34. * @return \Illuminate\Http\JsonResponse
  35. */
  36. public function import()
  37. {
  38. $extension = request('id');
  39. if (!$extension) {
  40. return response()->json(['status' => false, 'messages' => 'Invalid extension hash.']);
  41. }
  42. $box = Box::make("<span>admin:import <small>$extension</small></span>")
  43. ->content(Terminal::call('admin:import', ['extension' => $extension, '--force' => '1']))
  44. ->style('default')
  45. ->collapsable()
  46. ->removable();
  47. return response()->json(['status' => true, 'content' => $box->render()]);
  48. }
  49. /**
  50. * @return \Illuminate\Http\JsonResponse
  51. */
  52. public function create()
  53. {
  54. $name = request('name');
  55. $namespace = trim(request('namespace'), '\\');
  56. $box = Box::make("<span>admin:extend <small>$name --namespace=$namespace</small></span>")
  57. ->content(Terminal::call('admin:extend', ['extension' => $name, '--namespace' => $namespace]))
  58. ->style('default')
  59. ->collapsable()
  60. ->removable();
  61. return response()->json(['status' => true, 'content' => $box->render()]);
  62. }
  63. /**
  64. * Make a grid builder.
  65. *
  66. * @return Grid
  67. */
  68. protected function grid()
  69. {
  70. $grid = new Grid(new Extension);
  71. $grid->disablePagination();
  72. $grid->disableCreateButton();
  73. $grid->disableQuickCreateButton();
  74. $grid->disableDeleteButton();
  75. $grid->disableBatchDelete();
  76. $grid->disableFilterButton();
  77. $grid->disableFilter();
  78. $grid->disableQuickEditButton();
  79. $grid->disableEditButton();
  80. $grid->disableDeleteButton();
  81. $grid->disableViewButton();
  82. $grid->actions(function (Grid\Displayers\Actions $actions) {
  83. $actions->append(new ImportButton($this));
  84. });
  85. $grid->tools(function (Grid\Tools $tools) {
  86. $tools->append(new BuildExtensionButton());
  87. });
  88. $grid->number();
  89. $grid->name;
  90. $grid->version;
  91. $grid->alias;
  92. $grid->description
  93. ->if(function () {
  94. return mb_strlen($this->description) > 14;
  95. })
  96. ->limit(14)
  97. ->expand(function ($expand) {
  98. if (!$this->description) return;
  99. return "<div style='padding:10px 20px'>{$this->description}</div>";
  100. });
  101. $grid->authors;
  102. $grid->enable->switch();
  103. $grid->imported;
  104. $view = ucfirst(trans('admin.view'));
  105. $grid->config
  106. ->if(function () {
  107. return $this->config ? true : false;
  108. })
  109. ->display($view)
  110. ->expand($this->getExpandHandler('config'))
  111. ->else()
  112. ->showEmpty();
  113. $grid->require
  114. ->display($view)
  115. ->expand($this->getExpandHandler());
  116. $grid->require_dev
  117. ->display($view)
  118. ->expand($this->getExpandHandler('require_dev'));
  119. return $grid;
  120. }
  121. /**
  122. * Make a form builder.
  123. *
  124. * @return Form
  125. */
  126. public function form()
  127. {
  128. $form = new Form(new Extension);
  129. $form->hidden('enable');
  130. return $form;
  131. }
  132. /**
  133. * @param string $key
  134. * @return \Closure
  135. */
  136. protected function getExpandHandler($key = 'require')
  137. {
  138. return function () use ($key) {
  139. if (!$this->{$key}) return;
  140. $rows = [];
  141. foreach ((array)$this->{$key} as $k => $v) {
  142. $k = "<b class='text-80'>$k</b>";
  143. $rows[$k] = $v;
  144. }
  145. $table = new Table([], $rows);
  146. return $table;
  147. };
  148. }
  149. /**
  150. * Make definitions.
  151. */
  152. protected function define()
  153. {
  154. $name = function ($v) {
  155. $url = $this->homepage;
  156. return "<a href='$url' target='_blank'>$v</a>";
  157. };
  158. $version = function ($v) {
  159. $this->version = $this->version ?: 'unknown';
  160. $style = in_array($this->version, ['dev-master', 'unknown']) ? 'default' : 'primary';
  161. return $this->version ? "<span class='label label-$style'>{$this->version}</span>" : '';
  162. };
  163. $authors = function ($v) {
  164. if (!$v) return;
  165. foreach ($v as &$item) {
  166. $item = "<span class='text-80 bold'>{$item['name']}</span> <<code>{$item['email']}</code>>";
  167. }
  168. return join('<br/>', $v);
  169. };
  170. $imported = function ($v) {
  171. if (!$v) {
  172. $text = trans('admin.is_not_import');
  173. return "<label class='label label-default'>$text</label>";
  174. }
  175. return "<label class='label label-success'>{$this->imported_at}</label>";
  176. };
  177. Grid\Column::define('name', $name);
  178. Grid\Column::define('version', $version);
  179. Grid\Column::define('authors', $authors);
  180. Grid\Column::define('imported', $imported);
  181. }
  182. }