Skip to content
This repository was archived by the owner on Mar 12, 2024. It is now read-only.

Commit a15ec77

Browse files
committed
wip
Signed-off-by: Dieter Coopman <dieter@deltasolutions.be>
1 parent 1d3af21 commit a15ec77

23 files changed

+493
-212
lines changed

README.md

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,19 @@ a ui to link users to roles and assign permissions to roles.
1818

1919
It provides a ui for navigation management and navigation permissions.
2020

21+
### Assets
2122

23+
LLoadout enforce uses some default menus and permissions, these can be created via the provided migrations and seeder.
2224

23-
### Publish files
25+
```shell
26+
php artisan vendor:publish --tag=LLoadoutEnforce-migrations
27+
php artisan vendor:publish --tag=LLoadoutEnforce-seeders
28+
php artisan db:seed --class=EnforceSeeder
29+
```shell
30+
31+
### Publish optional assets
2432
2533
```shell
2634
php artisan vendor:publish --tag=LLoadoutEnforce-views
27-
php artisan vendor:publish --tag=LLoadoutEnforce-seeders
28-
php artisan vendor:publish --tag=LLoadoutEnforce-stubs
2935
```
3036

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
use Illuminate\Support\Facades\Schema;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Database\Migrations\Migration;
6+
7+
class CreateEnforceTables extends Migration
8+
{
9+
/**
10+
* Run the migrations.
11+
*
12+
* @return void
13+
*/
14+
public function up()
15+
{
16+
Schema::create('menus', function (Blueprint $table) {
17+
$table->id();
18+
$table->bigInteger('parent_id')->nullable();
19+
$table->string('name');
20+
$table->string('route')->nullable();
21+
$table->bigInteger('sort_order');
22+
$table->text('icon')->nullable();
23+
$table->timestamps();
24+
});
25+
}
26+
27+
/**
28+
* Reverse the migrations.
29+
*
30+
* @return void
31+
*/
32+
public function down()
33+
{
34+
Schema::drop("menus");
35+
}
36+
}

database/seeders/EnforceSeeder.php

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
<?php
2+
3+
namespace Database\Seeders;
4+
5+
use App\Models\User;
6+
use Illuminate\Database\Seeder;
7+
use Illuminate\Support\Facades\DB;
8+
use LLoadoutEnforce\Models\Menu;
9+
use Spatie\Permission\Models\Permission;
10+
use Spatie\Permission\Models\Role;
11+
12+
13+
class EnforceSeeder extends Seeder
14+
{
15+
/**
16+
* Run the database seeds.
17+
*
18+
* @return void
19+
*/
20+
public function run()
21+
{
22+
app()->make(\Spatie\Permission\PermissionRegistrar::class)->forgetCachedPermissions();
23+
DB::table('permissions')->delete();
24+
DB::table('menus')->delete();
25+
DB::table('model_has_permissions')->delete();
26+
DB::table('role_has_permissions')->delete();
27+
DB::table('roles')->delete();
28+
29+
collect(['superuser', 'admin', 'user'])->each(function ($name) {
30+
DB::table('roles')->insert([
31+
'name' => $name,
32+
'guard_name' => 'web'
33+
]);
34+
});
35+
36+
$sortOrder = 1;
37+
collect(["customers", "suppliers", "products", "news"])->each(function ($section) use ($sortOrder) {
38+
Menu::create([
39+
'name' => ucfirst($section),
40+
'sort_order' => $sortOrder++
41+
]);
42+
43+
Permission::create([
44+
'name' => 'menu.' . $section,
45+
'guard_name' => 'web'
46+
]);
47+
48+
collect(['create', 'read', 'update', 'delete'])->each(function ($permission) use ($section) {
49+
Permission::create([
50+
'name' => $section . "." . $permission,
51+
'guard_name' => 'web'
52+
]);
53+
});
54+
});
55+
56+
57+
$usersMenu = Menu::create([
58+
'name' => __('User management'),
59+
'sort_order' => $sortOrder++
60+
]);
61+
62+
Permission::create([
63+
'name' => 'menu.user-management',
64+
'guard_name' => 'web'
65+
]);
66+
67+
Menu::create([
68+
'parent_id' => $usersMenu->id,
69+
'name' => __('Manage users'),
70+
'route' => 'users.index',
71+
'sort_order' => $sortOrder++
72+
]);
73+
74+
Permission::create([
75+
'name' => 'menu.user-management.manage-users',
76+
'guard_name' => 'web'
77+
]);
78+
79+
Menu::create([
80+
'parent_id' => $usersMenu->id,
81+
'name' => __('Manage roles'),
82+
'route' => 'users.roles',
83+
'sort_order' => $sortOrder++
84+
]);
85+
86+
Permission::create([
87+
'name' => 'menu.user-management.manage-roles',
88+
'guard_name' => 'web'
89+
]);
90+
91+
Menu::create([
92+
'parent_id' => $usersMenu->id,
93+
'name' => __('Manage access'),
94+
'route' => 'users.access',
95+
'sort_order' => $sortOrder++
96+
]);
97+
98+
Permission::create([
99+
'name' => 'menu.user-management.manage-access',
100+
'guard_name' => 'web'
101+
]);
102+
103+
$devMenu = Menu::create([
104+
'name' => __('Developer menu'),
105+
'sort_order' => $sortOrder++
106+
]);
107+
108+
Permission::create([
109+
'name' => 'menu.developer-menu',
110+
'guard_name' => 'web'
111+
]);
112+
113+
Menu::create([
114+
'parent_id' => $devMenu->id,
115+
'name' => __('Permissions'),
116+
'route' => 'developers.permissions',
117+
'sort_order' => $sortOrder++
118+
]);
119+
120+
Permission::create([
121+
'name' => 'menu.developer-menu.permissions',
122+
'guard_name' => 'web'
123+
]);
124+
125+
Menu::create([
126+
'parent_id' => $devMenu->id,
127+
'name' => __('Menus'),
128+
'route' => 'developers.menus',
129+
'sort_order' => $sortOrder++
130+
]);
131+
132+
Permission::create([
133+
'name' => 'menu.developer-menu.menus',
134+
'guard_name' => 'web'
135+
]);
136+
137+
$developer = Role::create(['name' => 'developer']);
138+
139+
$developer->givePermissionTo('menu.user-management');
140+
$developer->givePermissionTo('menu.user-management.manage-users');
141+
$developer->givePermissionTo('menu.user-management.manage-roles');
142+
$developer->givePermissionTo('menu.user-management.manage-access');
143+
144+
$developer->givePermissionTo('menu.developer-menu');
145+
$developer->givePermissionTo('menu.developer-menu.permissions');
146+
$developer->givePermissionTo('menu.developer-menu.menus');
147+
148+
User::all()->each(function ($user) {
149+
$user->assignRole('developer');
150+
});
151+
152+
153+
}
154+
}

database/seeders/PermissionSeeder.php

Lines changed: 0 additions & 38 deletions
This file was deleted.

resources/views/access-ui/access.blade.php

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,20 @@
1010
<div class="container mx-auto">
1111
<div class="grid grid-cols-3 rounded-md ">
1212
<div>
13-
<!-- This example requires Tailwind CSS v2.0+ -->
1413
<nav aria-label="Sidebar">
1514
@foreach($roles as $role)
16-
<a href="#" wire:click="forRole({{ $role->id }})" class="@if(optional($this->selectedRole)->id === $role->id) bg-gray-100 @endif py-4 m-4 text-gray-600 hover:bg-gray-50 hover:text-gray-900 flex items-center px-3 py-2 text-sm font-medium rounded-md">
15+
<a href="#" wire:click="forRole({{ $role->id }})" class="@if(optional($this->selectedModel)->id === $role->id) bg-gray-100 @endif py-4 m-4 text-gray-600 hover:bg-gray-50 hover:text-gray-900 flex items-center px-3 py-2 text-sm font-medium rounded-md">
1716
<span class="truncate">{{ $role->name }}</span>
1817
</a>
1918
@endforeach
2019
</nav>
2120

2221
</div>
2322
<div>
24-
@if($selectedRole)
25-
<nav wire:key="{{ $selectedRole->id }}" aria-label="Sidebar">
23+
@if($selectedModel)
24+
<nav wire:key="{{ $selectedModel->id }}" aria-label="Sidebar">
2625
@foreach($permissionGroups as $name => $permissionGroup)
27-
<a href="#" wire:key="{{ $name }}" wire:click="withGroup('{{ $name }}')" class="@if($this->selectedGroup === $name) bg-gray-100 @endif py-4 m-4 text-gray-600 hover:bg-gray-50 hover:text-gray-900 flex items-center px-3 py-2 text-sm font-medium rounded-md">
26+
<a href="#" wire:key="{{ $name }}" wire:click="forGroup('{{ $name }}')" class="@if($this->selectedGroup === $name) bg-gray-100 @endif py-4 m-4 text-gray-600 hover:bg-gray-50 hover:text-gray-900 flex items-center px-3 py-2 text-sm font-medium rounded-md">
2827
<span class="truncate">{{ $name }}</span>
2928
</a>
3029
@endforeach

resources/views/access-ui/permission.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
@else
66

77
<label class=" items-center mx-4 bg-gray-100 flex items-center px-3 py-2 my-2 text-sm font-medium rounded-md">
8-
<input type="checkbox" class="form-checkbox" {{ $selectedRole->hasPermissionTo($permissionId) ? 'checked' : '' }} wire:click="assign({{ $permissionId }})">
8+
<input @if(isset($user) && $user->hasPermissionTo($permissionId) && !$user->hasAnyDirectPermission([$permissionId])) disabled style="background-color:lightgrey" @endif type="checkbox" class="form-checkbox" {{ $selectedModel->hasPermissionTo($permissionId) ? 'checked' : '' }} wire:click="assign({{ $permissionId }})">
99
<span class="ml-2">{{ $permission }}</span>
1010
</label>
1111

resources/views/menu-ui/menu.blade.php

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,27 @@
88
</h2>
99
</x-slot>
1010
<div class="max-w-7xl mx-auto py-10 sm:px-6 lg:px-8">
11-
<x-jet-form-section submit="updatePermission">
11+
<x-jet-form-section submit="updateMenu">
1212
<x-slot name="title">
1313
{{ __('Menu') }}
1414
</x-slot>
1515

1616
<x-slot name="description">
17-
{{ __('You can group menus by dottet notation') }}
17+
{{ __('Define the menu properties') }}
1818

1919
</x-slot>
2020

2121
<x-slot name="form">
2222
<div class="col-span-6 sm:col-span-4">
2323
<x-jet-label for="name" value="{{ __('Menu name') }}"/>
24-
<x-jet-input id="name" type="text" class="mt-1 block w-full" wire:model.debounce.250ms="menu.name" autocomplete="name"/>
24+
<x-jet-input id="name" type="text" class="mt-1 block w-full" wire:model.defer="menu.name" autocomplete="name"/>
2525
<x-jet-input-error for="permission.name" class="mt-2"/>
2626
</div>
2727
<div class="col-span-6 sm:col-span-4">
2828
<x-jet-label for="name" value="{{ __('Menu parent') }}"/>
2929
<select wire:model.defer="menu.parent_id" id="parent_id" name="parent_id" autocomplete="activity_id" class="mt-1 block w-full border-gray-300 focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50 rounded-md shadow-sm">
3030
<option value="0">{{ __('Choose') }}</option>
31+
3132
@foreach($parents as $id => $label)
3233
<option value="{{ $id }}">{{ $label }}</option>
3334
@endforeach
@@ -39,6 +40,20 @@
3940
<x-jet-input id="route" type="text" class="mt-1 block w-full" wire:model.defer="menu.route" autocomplete="route"/>
4041
<x-jet-input-error for="menu.route" class="mt-2"/>
4142
</div>
43+
<div class="col-span-6 sm:col-span-4">
44+
<x-jet-label for="sort_order" value="{{ __('Sort order') }}"/>
45+
<x-jet-input id="sort_order" type="text" class="mt-1 block w-full" wire:model.defer="menu.sort_order" autocomplete="sort order "/>
46+
<x-jet-input-error for="menu.sort_order" class="mt-2"/>
47+
</div>
48+
</x-slot>
49+
<x-slot name="actions">
50+
<x-jet-action-message class="mr-3" on="saved">
51+
{{ __('Saved.') }}
52+
</x-jet-action-message>
53+
54+
<x-jet-button wire:loading.attr="disabled">
55+
{{ __('Save') }}
56+
</x-jet-button>
4257
</x-slot>
4358
</x-jet-form-section>
4459
<x-jet-section-border/>
@@ -53,13 +68,10 @@
5368
{{ __('Perks are additional features ') }}
5469
</x-slot>
5570
<x-slot name="form">
56-
<div class="col-span-6 sm:col-span-4">
57-
<x-jet-label for="sort_order" value="{{ __('Sort order') }}"/>
58-
<x-jet-input id="sort_order" type="text" class="mt-1 block w-full" wire:model.defer="menu.sort_order" autocomplete="sort order "/>
59-
</div>
71+
6072
<div class="col-span-6 sm:col-span-4">
6173
<x-jet-label for="permission" value="{{ __('Permission') }}"/>
62-
<x-jet-input id="permission" type="text" class="mt-1 block w-full" wire:model.debounce.250ms="menu.permission" autocomplete="route"/>
74+
menu.{{ \Str::slug($menu->name) }}
6375
</div>
6476
@if(empty($menu->parent_id))
6577
<div class="col-span-6 sm:col-span-4">

0 commit comments

Comments
 (0)