ExtensionController.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  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\Support\Helper;
  9. use Dcat\Admin\Support\StringOutput;
  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 Illuminate\Routing\Controller;
  15. use Illuminate\Support\Facades\Artisan;
  16. class ExtensionController extends Controller
  17. {
  18. use HasResourceActions;
  19. /**
  20. * Index interface.
  21. *
  22. * @param Content $content
  23. *
  24. * @return Content
  25. */
  26. public function index(Content $content)
  27. {
  28. $this->define();
  29. return $content
  30. ->title(admin_trans_label('Extensions'))
  31. ->description(trans('admin.list'))
  32. ->body($this->grid());
  33. }
  34. /**
  35. * @return \Illuminate\Http\JsonResponse
  36. */
  37. public function import()
  38. {
  39. $extension = request('id');
  40. if (! $extension) {
  41. return response()->json(['status' => false, 'messages' => 'Invalid extension hash.']);
  42. }
  43. $box = Alert::make()
  44. ->title("<span>php artisan admin:import $extension</span>")
  45. ->content(Terminal::call('admin:import', ['extension' => $extension, '--force' => '1'])->transparent())
  46. ->success()
  47. ->removable();
  48. return response()->json(['status' => true, 'content' => $box->render()]);
  49. }
  50. /**
  51. * Make a grid builder.
  52. *
  53. * @return Grid
  54. */
  55. protected function grid()
  56. {
  57. $grid = new Grid(new Extension());
  58. $grid->number();
  59. $grid->name;
  60. $grid->version;
  61. $grid->alias;
  62. $grid->description
  63. ->if(function () {
  64. return mb_strlen($this->description) > 14;
  65. })
  66. ->limit(14)
  67. ->expand(function ($expand) {
  68. if (! $this->description) {
  69. return;
  70. }
  71. return "<div style='padding:10px 20px'>{$this->description}</div>";
  72. });
  73. $grid->authors;
  74. $grid->enable->switch();
  75. $grid->imported;
  76. $view = ucfirst(trans('admin.view'));
  77. $grid->config
  78. ->if(function () {
  79. return $this->config ? true : false;
  80. })
  81. ->display($view)
  82. ->expand($this->getExpandHandler('config'))
  83. ->else()
  84. ->emptyString();
  85. $grid->require
  86. ->if(function () {
  87. return $this->require ? true : false;
  88. })
  89. ->display($view)
  90. ->expand($this->getExpandHandler())
  91. ->else()
  92. ->emptyString();
  93. $grid->require_dev
  94. ->if(function () {
  95. return $this->require_dev ? true : false;
  96. })
  97. ->display($view)
  98. ->expand($this->getExpandHandler('require_dev'))
  99. ->else()
  100. ->emptyString();
  101. $grid->disablePagination();
  102. $grid->disableCreateButton();
  103. $grid->disableDeleteButton();
  104. $grid->disableBatchDelete();
  105. $grid->disableFilterButton();
  106. $grid->disableFilter();
  107. $grid->disableQuickEditButton();
  108. $grid->disableEditButton();
  109. $grid->disableDeleteButton();
  110. $grid->disableViewButton();
  111. $grid->actions(new ImportButton());
  112. $grid->quickCreate(function (Grid\Tools\QuickCreate $create) {
  113. $create->text('package_name')->required();
  114. $create->text('namespace')
  115. ->attribute('style', 'width:240px')
  116. ->required()
  117. ->default('Dcat\\Admin\\Extension\\:Name');
  118. });
  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->text('package_name')->rules(function () {
  130. return [
  131. 'required',
  132. function ($attribute, $value, $fail) {
  133. if (! Helper::validateExtensionName($value)) {
  134. return $fail(
  135. "[$value] is not a valid package name, please input a name like \"vendor/name\""
  136. );
  137. }
  138. },
  139. ];
  140. });
  141. $form->text('namespace')->required();
  142. $form->hidden('enable');
  143. $form->saving(function (Form $form) {
  144. $package = $form->package_name;
  145. $namespace = $form->namespace;
  146. if ($package && $namespace) {
  147. $results = $this->createExtension($package, $namespace);
  148. return $form->success($results);
  149. }
  150. });
  151. return $form;
  152. }
  153. /**
  154. * 创建扩展
  155. *
  156. * @return string
  157. */
  158. public function createExtension($package, $namespace)
  159. {
  160. $namespace = trim($namespace, '\\');
  161. $output = new StringOutput();
  162. Artisan::call('admin:extend', [
  163. 'extension' => $package,
  164. '--namespace' => $namespace,
  165. ], $output);
  166. return $output->getContent();
  167. }
  168. /**
  169. * @param string $key
  170. *
  171. * @return \Closure
  172. */
  173. protected function getExpandHandler($key = 'require')
  174. {
  175. return function () use ($key) {
  176. if (! $this->{$key}) {
  177. return;
  178. }
  179. $rows = [];
  180. foreach ((array) $this->{$key} as $k => $v) {
  181. $k = "<b class='text-80'>$k</b>";
  182. $rows[$k] = is_array($v) ? "<pre>{$v}</pre>" : $v;
  183. }
  184. return new Table($rows);
  185. };
  186. }
  187. /**
  188. * 字段显示定义.
  189. */
  190. protected function define()
  191. {
  192. $name = function ($v) {
  193. $url = $this->homepage;
  194. return "<a href='$url' target='_blank'>$v</a>";
  195. };
  196. $version = function ($v) {
  197. $this->version = $this->version ?: 'unknown';
  198. $style = in_array($this->version, ['dev-master', 'unknown']) ? 'default' : 'primary';
  199. return $this->version ? "<span class='label bg-$style'>{$this->version}</span>" : '';
  200. };
  201. $authors = function ($v) {
  202. if (! $v) {
  203. return;
  204. }
  205. foreach ($v as &$item) {
  206. $item = "<span class='text-80'>{$item['name']}</span> <<code>{$item['email']}</code>>";
  207. }
  208. return implode('<br/>', $v);
  209. };
  210. $imported = function ($v) {
  211. if (! $v) {
  212. $text = trans('admin.is_not_import');
  213. return "<label class='label label-default'>$text</label>";
  214. }
  215. return $this->imported_at;
  216. };
  217. Grid\Column::define('name', $name);
  218. Grid\Column::define('version', $version);
  219. Grid\Column::define('authors', $authors);
  220. Grid\Column::define('imported', $imported);
  221. }
  222. }