ExtensionController.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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->expand(function ($expand) {
  93. if (!$this->description) return;
  94. $expand->button(trans('admin.view'));
  95. return "<div style='padding:10px 20px'>{$this->description}</div>";
  96. });
  97. $grid->authors;
  98. $grid->enable->switch();
  99. $grid->imported;
  100. $view = ucfirst(trans('admin.view'));
  101. $grid->config
  102. ->display($view)
  103. ->expand($this->getExpandHandler('config'));
  104. $grid->require
  105. ->display($view)
  106. ->expand($this->getExpandHandler());
  107. $grid->require_dev
  108. ->display($view)
  109. ->expand($this->getExpandHandler('require_dev'));
  110. return $grid;
  111. }
  112. /**
  113. * Make a form builder.
  114. *
  115. * @return Form
  116. */
  117. public function form()
  118. {
  119. $form = new Form(new Extension);
  120. $form->hidden('enable');
  121. return $form;
  122. }
  123. /**
  124. * @param string $key
  125. * @return \Closure
  126. */
  127. protected function getExpandHandler($key = 'require')
  128. {
  129. return function () use ($key) {
  130. if (!$this->{$key}) return;
  131. $rows = [];
  132. foreach ((array)$this->{$key} as $k => $v) {
  133. $k = "<b class='text-80'>$k</b>";
  134. $rows[$k] = $v;
  135. }
  136. $table = new Table([], $rows);
  137. return $table;
  138. };
  139. }
  140. /**
  141. * Make definitions.
  142. */
  143. protected function define()
  144. {
  145. $name = function ($v) {
  146. $url = $this->homepage;
  147. return "<a href='$url' target='_blank'>$v</a>";
  148. };
  149. $version = function ($v) {
  150. $this->version = $this->version ?: 'unknown';
  151. $style = in_array($this->version, ['dev-master', 'unknown']) ? 'default' : 'primary';
  152. return $this->version ? "<span class='label label-$style'>{$this->version}</span>" : '';
  153. };
  154. $authors = function ($v) {
  155. if (!$v) return;
  156. foreach ($v as &$item) {
  157. $item = "<span class='text-80 bold'>{$item['name']}</span> <<code>{$item['email']}</code>>";
  158. }
  159. return join('<br/>', $v);
  160. };
  161. $imported = function ($v) {
  162. if (!$v) {
  163. $text = trans('admin.is_not_import');
  164. return "<label class='label label-default'>$text</label>";
  165. }
  166. return "<label class='label label-success'>{$this->imported_at}</label>";
  167. };
  168. Grid\Column::define('name', $name);
  169. Grid\Column::define('version', $version);
  170. Grid\Column::define('authors', $authors);
  171. Grid\Column::define('imported', $imported);
  172. }
  173. }