title($this->title()) ->description(trans('admin.list')) ->body($this->treeView()); } protected function treeView() { $model = config('admin.database.permissions_model'); return new Tree(new $model(), function (Tree $tree) { $tree->disableCreateButton(); $tree->disableEditButton(); $tree->branch(function ($branch) { $branchName = htmlspecialchars($branch['name']); $branchSlug = htmlspecialchars($branch['slug']); $payload = "
{$branchName}  [{$branchSlug}]"; $path = array_filter($branch['http_path']); if (! $path) { return $payload.'
 '; } $max = 3; if (count($path) > $max) { $path = array_slice($path, 0, $max); array_push($path, '...'); } $method = $branch['http_method'] ?: []; $path = collect($path)->map(function ($path) use (&$method) { if (Str::contains($path, ':')) { [$me, $path] = explode(':', $path); $method = array_merge($method, explode(',', $me)); } if ($path !== '...' && ! empty(config('admin.route.prefix')) && ! Str::contains($path, '.')) { $path = trim(admin_base_path($path), '/'); } $color = Admin::color()->primaryDarker(); return "$path"; })->implode('  '); $method = collect($method ?: ['ANY'])->unique()->map(function ($name) { return strtoupper($name); })->map(function ($name) { return "{$name}"; })->implode(' ').' '; $payload .= "  $method$path"; return $payload; }); }); } public function form() { $with = []; if ($bindMenu = config('admin.menu.permission_bind_menu', true)) { $with[] = 'menus'; } return Form::make(Permission::with($with), function (Form $form) use ($bindMenu) { $permissionTable = config('admin.database.permissions_table'); $connection = config('admin.database.connection'); $permissionModel = config('admin.database.permissions_model'); $id = $form->getKey(); $form->display('id', 'ID'); $form->select('parent_id', trans('admin.parent_id')) ->options($permissionModel::selectOptions()) ->saving(function ($v) { return (int) $v; }); $form->text('slug', trans('admin.slug')) ->required() ->creationRules(['required', "unique:{$connection}.{$permissionTable}"]) ->updateRules(['required', "unique:{$connection}.{$permissionTable},slug,$id"]); $form->text('name', trans('admin.name'))->required(); $form->multipleSelect('http_method', trans('admin.http.method')) ->options($this->getHttpMethodsOptions()) ->help(trans('admin.all_methods_if_empty')); $form->tags('http_path', trans('admin.http.path')) ->options($this->getRoutes()); if ($bindMenu) { $form->tree('menus', trans('admin.menu')) ->treeState(false) ->setTitleColumn('title') ->nodes(function () { $model = config('admin.database.menu_model'); return (new $model())->allNodes(); }) ->customFormat(function ($v) { if (! $v) { return []; } return array_column($v, 'id'); }); } $form->display('created_at', trans('admin.created_at')); $form->display('updated_at', trans('admin.updated_at')); $form->disableViewButton(); $form->disableViewCheck(); })->saved(function () { $model = config('admin.database.menu_model'); (new $model())->flushCache(); }); } public function getRoutes() { $prefix = (string) config('admin.route.prefix'); $container = collect(); $routes = collect(app('router')->getRoutes())->map(function ($route) use ($prefix, $container) { if (! Str::startsWith($uri = $route->uri(), $prefix) && $prefix) { return; } if (! Str::contains($uri, '{')) { $route = Str::replaceFirst($prefix, '', $uri.'*'); if ($route !== '*') { $container->push($route); } } return Str::replaceFirst($prefix, '', preg_replace('/{.*}+/', '*', $uri)); }); return $container->merge($routes)->filter()->all(); } /** * Get options of HTTP methods select field. * * @return array */ protected function getHttpMethodsOptions() { $permissionModel = config('admin.database.permissions_model'); return array_combine($permissionModel::$httpMethods, $permissionModel::$httpMethods); } }