new admin design with mnodules

This commit is contained in:
Mark Gregory
2026-07-24 09:35:18 +01:00
parent 5e9f95a5b4
commit c2a19a16e6
28 changed files with 205 additions and 42 deletions
@@ -0,0 +1,20 @@
<?php
namespace Modules\Roles\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;
final class RoleController extends Controller
{
public function index() { return view('roles::index',['roles'=>Role::withCount(['users','permissions'])->orderBy('name')->get()]); }
public function create() { return view('roles::form',['role'=>new Role(['guard_name'=>'web']),'permissions'=>Permission::orderBy('name')->get()]); }
public function store(Request $request) { $data=$this->validated($request); $role=Role::create(['name'=>$data['name'],'guard_name'=>'web']); $role->syncPermissions($data['permissions']??[]); return redirect()->route('administration.roles.index')->with('status','Role created.'); }
public function edit(Role $role) { return view('roles::form',['role'=>$role->load('permissions'),'permissions'=>Permission::orderBy('name')->get()]); }
public function update(Request $request, Role $role) { $data=$this->validated($request,$role); $role->update(['name'=>$data['name']]); $role->syncPermissions($data['permissions']??[]); return redirect()->route('administration.roles.index')->with('status','Role updated.'); }
public function destroy(Role $role) { abort_if($role->name==='admin',422,'The administrator role cannot be deleted.'); $role->delete(); return back()->with('status','Role deleted.'); }
private function validated(Request $request, ?Role $role=null): array { return $request->validate(['name'=>['required','string','max:100',Rule::unique('roles','name')->ignore($role)],'permissions'=>['array'],'permissions.*'=>['string','exists:permissions,name']]); }
}
@@ -0,0 +1 @@
<x-layouts.app :title="$role->exists ? __('Edit role') : __('Create role')"><div class="max-w-3xl space-y-6"><div><h1 class="text-2xl font-semibold">{{ $role->exists ? 'Edit role' : 'Create role' }}</h1></div><form method="POST" action="{{ $role->exists ? route('administration.roles.update',$role) : route('administration.roles.store') }}" class="space-y-6 rounded-xl border border-zinc-200 bg-white p-6 dark:border-zinc-700 dark:bg-zinc-900">@csrf @if($role->exists)@method('PUT')@endif<flux:input name="name" label="Name" :value="old('name',$role->name)" required/><div><div class="mb-3 font-medium">Permissions</div><div class="grid gap-3 sm:grid-cols-2">@foreach($permissions as $permission)<label class="flex items-center gap-3 rounded-lg border border-zinc-200 p-3 dark:border-zinc-700"><input type="checkbox" name="permissions[]" value="{{ $permission->name }}" @checked(in_array($permission->name,old('permissions',$role->exists ? $role->permissions->pluck('name')->all() : [])))><span class="text-sm">{{ $permission->name }}</span></label>@endforeach</div></div><div class="flex justify-end gap-2"><flux:button :href="route('administration.roles.index')">Cancel</flux:button><flux:button type="submit" variant="primary">Save</flux:button></div></form></div></x-layouts.app>
@@ -0,0 +1 @@
<x-layouts.app :title="__('Roles')"><div class="space-y-6"><div class="flex items-start justify-between"><div><h1 class="text-2xl font-semibold">Roles & permissions</h1><p class="mt-1 text-sm text-zinc-500">Control administrative access.</p></div><flux:button variant="primary" :href="route('administration.roles.create')" wire:navigate>Create role</flux:button></div>@if(session('status'))<div class="rounded-xl bg-emerald-50 p-3 text-sm text-emerald-800">{{ session('status') }}</div>@endif<div class="rounded-xl border border-zinc-200 bg-white dark:border-zinc-700 dark:bg-zinc-900"><div class="divide-y divide-zinc-200 dark:divide-zinc-800">@foreach($roles as $role)<div class="flex items-center justify-between p-4"><div><div class="font-medium">{{ $role->name }}</div><div class="text-xs text-zinc-500">{{ $role->users_count }} users · {{ $role->permissions_count }} permissions</div></div><div class="flex gap-2"><flux:button size="sm" :href="route('administration.roles.edit',$role)" wire:navigate>Edit</flux:button>@if($role->name!=='admin')<form method="POST" action="{{ route('administration.roles.destroy',$role) }}">@csrf @method('DELETE')<flux:button size="sm" variant="danger" type="submit">Delete</flux:button></form>@endif</div></div>@endforeach</div></div></div></x-layouts.app>
+2 -4
View File
@@ -1,5 +1,3 @@
<?php
use Illuminate\Support\Facades\Route;
// Module routes are intentionally registered by each feature as it is enabled.
use Illuminate\Support\Facades\Route; use Modules\Roles\Http\Controllers\RoleController;
Route::middleware(['auth','verified'])->prefix('administration/roles')->name('administration.roles.')->group(function (): void { Route::resource('', RoleController::class)->parameters([''=>'role'])->except(['show']); });