ExtensionController.php 6.1 KB

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