PermissionController.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. <?php
  2. namespace Dcat\Admin\Controllers;
  3. use Dcat\Admin\Form;
  4. use Dcat\Admin\Grid;
  5. use Dcat\Admin\Layout\Content;
  6. use Dcat\Admin\Layout\Row;
  7. use Dcat\Admin\Models\Repositories\Permission;
  8. use Dcat\Admin\Show;
  9. use Dcat\Admin\SimpleGrid;
  10. use Dcat\Admin\Tree;
  11. use Illuminate\Support\Str;
  12. class PermissionController extends AdminController
  13. {
  14. /**
  15. * Get content title.
  16. *
  17. * @return string
  18. */
  19. protected function title()
  20. {
  21. return trans('admin.permissions');
  22. }
  23. /**
  24. * Index interface.
  25. *
  26. * @param Content $content
  27. *
  28. * @return Content
  29. */
  30. public function index(Content $content)
  31. {
  32. if (request(SimpleGrid::QUERY_NAME)) {
  33. return $content->body($this->simpleGrid());
  34. }
  35. return $content
  36. ->title($this->title())
  37. ->description(trans('admin.list'))
  38. ->body(function (Row $row) {
  39. if (request('_layout')) {
  40. $row->column(12, $this->grid());
  41. } else {
  42. $row->column(12, $this->treeView());
  43. }
  44. });
  45. }
  46. protected function simpleGrid()
  47. {
  48. $grid = new SimpleGrid(new Permission());
  49. $grid->id->bold()->sortable();
  50. $grid->slug;
  51. $grid->name;
  52. $grid->filter(function (Grid\Filter $filter) {
  53. $filter->like('slug');
  54. $filter->like('name');
  55. });
  56. return $grid;
  57. }
  58. /**
  59. * @return \Dcat\Admin\Tree
  60. */
  61. protected function treeView()
  62. {
  63. $model = config('admin.database.permissions_model');
  64. $tree = new Tree(new $model());
  65. $tree->disableCreateButton();
  66. $tree->tools(function (Tree\Tools $tools) {
  67. $label = trans('admin.table');
  68. $url = url(request()->getPathInfo()).'?_layout=1';
  69. $tools->add("<a class='btn btn-sm btn-white ' href='{$url}'>$label</a>");
  70. });
  71. $tree->branch(function ($branch) {
  72. $payload = "<div class='pull-left' style='min-width:310px'><b>{$branch['name']}</b>&nbsp;&nbsp;[<span class='text-blue'>{$branch['slug']}</span>]";
  73. $path = array_filter($branch['http_path']);
  74. if (! $path) {
  75. return $payload.'</div>&nbsp;';
  76. }
  77. $max = 3;
  78. if (count($path) > $max) {
  79. $path = array_slice($path, 0, $max);
  80. array_push($path, '...');
  81. }
  82. $method = $branch['http_method'] ?: [];
  83. $path = collect($path)->map(function ($path) use ($branch, &$method) {
  84. if (Str::contains($path, ':')) {
  85. [$me, $path] = explode(':', $path);
  86. $method = array_merge($method, explode(',', $me));
  87. }
  88. if ($path !== '...' && ! empty(config('admin.route.prefix'))) {
  89. $path = admin_base_path($path);
  90. }
  91. return "<code>$path</code>";
  92. })->implode('&nbsp;&nbsp;');
  93. $method = collect($method ?: ['ANY'])->unique()->map(function ($name) {
  94. return strtoupper($name);
  95. })->map(function ($name) {
  96. return "<span class='label label-primary'>{$name}</span>";
  97. })->implode('&nbsp;').'&nbsp;';
  98. $payload .= "</div>&nbsp; $method<a class=\"dd-nodrag\">$path</a>";
  99. return $payload;
  100. });
  101. return $tree;
  102. }
  103. /**
  104. * Make a grid builder.
  105. *
  106. * @return Grid
  107. */
  108. protected function grid()
  109. {
  110. $grid = new Grid(new Permission());
  111. $grid->id('ID')->bold()->sortable();
  112. $grid->name->tree();
  113. $grid->order->orderable();
  114. $grid->slug->label('primary');
  115. $grid->http_path->display(function ($path) {
  116. if (! $path) {
  117. return;
  118. }
  119. $method = $this->http_method ?: ['ANY'];
  120. $method = collect($method)->map(function ($name) {
  121. return strtoupper($name);
  122. })->map(function ($name) {
  123. return "<span class='label label-primary'>{$name}</span>";
  124. })->implode('&nbsp;').'&nbsp;';
  125. return collect($path)->filter()->map(function ($path) use ($method) {
  126. if (Str::contains($path, ':')) {
  127. [$method, $path] = explode(':', $path);
  128. $method = collect(explode(',', $method))->map(function ($name) {
  129. return strtoupper($name);
  130. })->map(function ($name) {
  131. return "<span class='label label-primary'>{$name}</span>";
  132. })->implode('&nbsp;').'&nbsp;';
  133. }
  134. if (! empty(config('admin.route.prefix'))) {
  135. $path = admin_base_path($path);
  136. }
  137. return "<div style='margin-bottom: 5px;'>$method<code>$path</code></div>";
  138. })->implode('');
  139. });
  140. $grid->created_at;
  141. $grid->updated_at->sortable();
  142. $grid->disableEditButton();
  143. $grid->showQuickEditButton();
  144. $grid->enableDialogCreate();
  145. $grid->tools(function (Grid\Tools $tools) {
  146. $tools->batch(function (Grid\Tools\BatchActions $actions) {
  147. $actions->disableDelete();
  148. });
  149. $label = trans('admin.default');
  150. $url = url(request()->getPathInfo());
  151. $tools->append("<a class='btn btn-sm btn-white ' href='{$url}'>$label</a>");
  152. });
  153. $grid->filter(function (Grid\Filter $filter) {
  154. $filter->like('slug');
  155. $filter->like('name');
  156. $filter->like('http_path');
  157. });
  158. return $grid;
  159. }
  160. /**
  161. * Make a show builder.
  162. *
  163. * @param mixed $id
  164. *
  165. * @return Show
  166. */
  167. protected function detail($id)
  168. {
  169. $show = new Show($id, new Permission());
  170. $show->id;
  171. $show->slug;
  172. $show->name;
  173. $show->http_path->unescape()->as(function ($path) {
  174. return collect($path)->filter()->map(function ($path) {
  175. $method = $this->http_method ?: ['ANY'];
  176. if (Str::contains($path, ':')) {
  177. [$method, $path] = explode(':', $path);
  178. $method = explode(',', $method);
  179. }
  180. $method = collect($method)->map(function ($name) {
  181. return strtoupper($name);
  182. })->map(function ($name) {
  183. return "<span class='label label-primary'>{$name}</span>";
  184. })->implode('&nbsp;');
  185. if (! empty(config('admin.route.prefix'))) {
  186. $path = '/'.trim(config('admin.route.prefix'), '/').$path;
  187. }
  188. return "<div style='margin-bottom: 5px;'>$method<code>$path</code></div>";
  189. })->implode('');
  190. });
  191. $show->created_at;
  192. $show->updated_at;
  193. return $show;
  194. }
  195. /**
  196. * Make a form builder.
  197. *
  198. * @return Form
  199. */
  200. public function form()
  201. {
  202. return Form::make(new Permission(), function (Form $form) {
  203. $permissionTable = config('admin.database.permissions_table');
  204. $connection = config('admin.database.connection');
  205. $permissionModel = config('admin.database.permissions_model');
  206. $id = $form->getKey();
  207. $form->display('id', 'ID');
  208. $form->select('parent_id', trans('admin.parent_id'))
  209. ->options($permissionModel::selectOptions())
  210. ->saving(function ($v) {
  211. return (int) $v;
  212. });
  213. $form->text('slug', trans('admin.slug'))
  214. ->required()
  215. ->creationRules(['required', "unique:{$connection}.{$permissionTable}"])
  216. ->updateRules(['required', "unique:{$connection}.{$permissionTable},slug,$id"]);
  217. $form->text('name', trans('admin.name'))->required();
  218. $form->multipleSelect('http_method', trans('admin.http.method'))
  219. ->options($this->getHttpMethodsOptions())
  220. ->help(trans('admin.all_methods_if_empty'));
  221. $form->tags('http_path', trans('admin.http.path'))
  222. ->options($this->getRoutes());
  223. $form->display('created_at', trans('admin.created_at'));
  224. $form->display('updated_at', trans('admin.updated_at'));
  225. $form->disableViewButton();
  226. $form->disableViewCheck();
  227. });
  228. }
  229. /**
  230. * @return array
  231. */
  232. public function getRoutes()
  233. {
  234. $prefix = config('admin.route.prefix');
  235. return collect(app('router')->getRoutes())->map(function ($route) use ($prefix) {
  236. if (! Str::startsWith($uri = $route->uri(), $prefix)) {
  237. return;
  238. }
  239. return Str::replaceFirst($prefix, '', preg_replace('/{.*}+/', '*', $uri));
  240. })->filter()->all();
  241. }
  242. /**
  243. * Get options of HTTP methods select field.
  244. *
  245. * @return array
  246. */
  247. protected function getHttpMethodsOptions()
  248. {
  249. $permissionModel = config('admin.database.permissions_model');
  250. return array_combine($permissionModel::$httpMethods, $permissionModel::$httpMethods);
  251. }
  252. }