ExtensionController.php 5.9 KB

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