MenuController.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. <?php
  2. namespace Dcat\Admin\Http\Controllers;
  3. use Dcat\Admin\Form;
  4. use Dcat\Admin\Http\Actions\Menu\Show;
  5. use Dcat\Admin\Http\Repositories\Menu;
  6. use Dcat\Admin\Layout\Column;
  7. use Dcat\Admin\Layout\Content;
  8. use Dcat\Admin\Layout\Row;
  9. use Dcat\Admin\Tree;
  10. use Dcat\Admin\Widgets\Box;
  11. use Dcat\Admin\Widgets\Form as WidgetForm;
  12. class MenuController extends AdminController
  13. {
  14. public function title()
  15. {
  16. return trans('admin.menu');
  17. }
  18. public function index(Content $content)
  19. {
  20. return $content
  21. ->title($this->title())
  22. ->description(trans('admin.list'))
  23. ->body(function (Row $row) {
  24. $row->column(7, $this->treeView()->render());
  25. $row->column(5, function (Column $column) {
  26. $form = new WidgetForm();
  27. $form->action(admin_url('auth/menu'));
  28. $menuModel = config('admin.database.menu_model');
  29. $permissionModel = config('admin.database.permissions_model');
  30. $roleModel = config('admin.database.roles_model');
  31. $form->select('parent_id', trans('admin.parent_id'))->options($menuModel::selectOptions());
  32. $form->text('title', trans('admin.title'))->required();
  33. $form->icon('icon', trans('admin.icon'))->help($this->iconHelp());
  34. $form->text('uri', trans('admin.uri'));
  35. if ($menuModel::withRole()) {
  36. $form->multipleSelect('roles', trans('admin.roles'))->options($roleModel::all()->pluck('name', 'id'));
  37. }
  38. if ($menuModel::withPermission()) {
  39. $form->tree('permissions', trans('admin.permission'))
  40. ->expand(false)
  41. ->treeState(false)
  42. ->nodes((new $permissionModel())->allNodes());
  43. }
  44. $form->width(9, 2);
  45. $column->append(Box::make(trans('admin.new'), $form));
  46. });
  47. });
  48. }
  49. /**
  50. * @return \Dcat\Admin\Tree
  51. */
  52. protected function treeView()
  53. {
  54. $menuModel = config('admin.database.menu_model');
  55. return new Tree(new $menuModel(), function (Tree $tree) {
  56. $tree->disableCreateButton();
  57. $tree->disableQuickCreateButton();
  58. $tree->disableEditButton();
  59. $tree->maxDepth(3);
  60. $tree->actions(function (Tree\Actions $actions) {
  61. if ($actions->getRow()->extension) {
  62. $actions->disableDelete();
  63. }
  64. $actions->prepend(new Show());
  65. });
  66. $tree->branch(function ($branch) {
  67. $payload = "<i class='fa {$branch['icon']}'></i>&nbsp;<strong>{$branch['title']}</strong>";
  68. if (! isset($branch['children'])) {
  69. if (url()->isValidUrl($branch['uri'])) {
  70. $uri = $branch['uri'];
  71. } else {
  72. $uri = admin_base_path($branch['uri']);
  73. }
  74. $payload .= "&nbsp;&nbsp;&nbsp;<a href=\"$uri\" class=\"dd-nodrag\">$uri</a>";
  75. }
  76. return $payload;
  77. });
  78. });
  79. }
  80. /**
  81. * Make a form builder.
  82. *
  83. * @return Form
  84. */
  85. public function form()
  86. {
  87. $menuModel = config('admin.database.menu_model');
  88. $relations = $menuModel::withPermission() ? ['permissions', 'roles'] : 'roles';
  89. return Form::make(Menu::with($relations), function (Form $form) use ($menuModel) {
  90. $form->tools(function (Form\Tools $tools) {
  91. $tools->disableView();
  92. });
  93. $form->display('id', 'ID');
  94. $form->select('parent_id', trans('admin.parent_id'))->options(function () use ($menuModel) {
  95. return $menuModel::selectOptions();
  96. })->saving(function ($v) {
  97. return (int) $v;
  98. });
  99. $form->text('title', trans('admin.title'))->required();
  100. $form->icon('icon', trans('admin.icon'))->help($this->iconHelp());
  101. $form->text('uri', trans('admin.uri'));
  102. $form->switch('show', trans('admin.show'));
  103. if ($menuModel::withRole()) {
  104. $form->multipleSelect('roles', trans('admin.roles'))
  105. ->options(function () {
  106. $roleModel = config('admin.database.roles_model');
  107. return $roleModel::all()->pluck('name', 'id');
  108. })
  109. ->customFormat(function ($v) {
  110. return array_column($v, 'id');
  111. });
  112. }
  113. if ($menuModel::withPermission()) {
  114. $form->tree('permissions', trans('admin.permission'))
  115. ->treeState(false)
  116. ->nodes(function () {
  117. $permissionModel = config('admin.database.permissions_model');
  118. return (new $permissionModel())->allNodes();
  119. })
  120. ->customFormat(function ($v) {
  121. if (! $v) {
  122. return [];
  123. }
  124. return array_column($v, 'id');
  125. });
  126. }
  127. $form->display('created_at', trans('admin.created_at'));
  128. $form->display('updated_at', trans('admin.updated_at'));
  129. })->saved(function (Form $form, $result) {
  130. $response = $form->response()->location('auth/menu');
  131. if ($result) {
  132. return $response->success(__('admin.save_succeeded'));
  133. }
  134. return $response->info(__('admin.nothing_updated'));
  135. });
  136. }
  137. /**
  138. * Help message for icon field.
  139. *
  140. * @return string
  141. */
  142. protected function iconHelp()
  143. {
  144. return 'For more icons please see <a href="http://fontawesome.io/icons/" target="_blank">http://fontawesome.io/icons/</a>';
  145. }
  146. }