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 = "
$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);
}
}