From e1e359503d3c770f8bfd6f6162f9c3a9ad8331b5 Mon Sep 17 00:00:00 2001 From: Martin Folkerts Date: Mon, 30 Jun 2025 14:49:21 +0200 Subject: [PATCH] added role viewer and command to create user viewer updated application to hide components for viewer --- laravel_app/app/Casts/RoleCast.php | 19 ++++++ .../app/Console/Commands/CreateUser.php | 60 +++++++++++++++++++ laravel_app/app/Enums/UserRole.php | 29 +++++++++ .../Components/DownloadNotification.php | 13 ++-- laravel_app/app/Models/User.php | 14 +++++ .../app/Providers/AppServiceProvider.php | 9 ++- ..._093413_add_role_column_to_users_table.php | 28 +++++++++ .../components/application-logo.blade.php | 18 ++++-- .../components/project-manager-grid.blade.php | 39 ++++++++---- .../views/livewire/projects/menu.blade.php | 2 + .../livewire/projects/report-row.blade.php | 3 +- .../livewire/projects/tabs/download.blade.php | 4 ++ .../livewire/projects/tabs/mosaic.blade.php | 2 + .../livewire/projects/tabs/report.blade.php | 6 +- 14 files changed, 222 insertions(+), 24 deletions(-) create mode 100644 laravel_app/app/Casts/RoleCast.php create mode 100644 laravel_app/app/Console/Commands/CreateUser.php create mode 100644 laravel_app/app/Enums/UserRole.php create mode 100644 laravel_app/database/migrations/2025_06_30_093413_add_role_column_to_users_table.php diff --git a/laravel_app/app/Casts/RoleCast.php b/laravel_app/app/Casts/RoleCast.php new file mode 100644 index 0000000..93d6bf2 --- /dev/null +++ b/laravel_app/app/Casts/RoleCast.php @@ -0,0 +1,19 @@ +value : $value; + } +} diff --git a/laravel_app/app/Console/Commands/CreateUser.php b/laravel_app/app/Console/Commands/CreateUser.php new file mode 100644 index 0000000..e6dbc85 --- /dev/null +++ b/laravel_app/app/Console/Commands/CreateUser.php @@ -0,0 +1,60 @@ +ask('Naam van de gebruiker'); + $email = $this->ask('E-mailadres'); + $password = $this->secret('Wachtwoord'); + + $choices = collect(UserRole::cases())->map(fn($role) => $role->label())->toArray(); + $names = collect(UserRole::cases())->map(fn($role) => $role->name)->toArray(); + + $index = $this->choice('Welke rol?', $choices); // string zoals 'Beheerder' + $name = $names[array_search($index, $choices)]; + + + $role = UserRole::tryFromName($name); + + if (!$role) { + $this->error("Ongeldige rol opgegeven."); + return Command::FAILURE; + } + + $user = User::create([ + 'name' => $name, + 'email' => $email, + 'password' => Hash::make($password), + 'role' => $role, + ]); + + $this->info("Gebruiker {$user->email} aangemaakt met rol {$role->name}"); + + return Command::SUCCESS; + } +} diff --git a/laravel_app/app/Enums/UserRole.php b/laravel_app/app/Enums/UserRole.php new file mode 100644 index 0000000..3f3cbe8 --- /dev/null +++ b/laravel_app/app/Enums/UserRole.php @@ -0,0 +1,29 @@ + self::Manager, + 'viewer' => self::Viewer, + default => null, + }; + } + + public function label(): string + { + return $this->name; + } + + public static function labels(): array + { + return collect(self::cases())->mapWithKeys(function ($role) { + return [$role->value => $role->label()]; + })->toArray(); + } +} diff --git a/laravel_app/app/Livewire/Components/DownloadNotification.php b/laravel_app/app/Livewire/Components/DownloadNotification.php index 0a1326d..3ef0ad8 100644 --- a/laravel_app/app/Livewire/Components/DownloadNotification.php +++ b/laravel_app/app/Livewire/Components/DownloadNotification.php @@ -13,8 +13,11 @@ class DownloadNotification extends Component // TODO Change session bool to timestamp so i can check if i show it in 5 min. public function mount(Project $project) { - $this->show_download_notification = session()->get('show-download.'.$project->id,$project->hasMissingDownloadsDateInHarvestFile()); - $this->project = $project; + if (auth()->user()->hasRole('manager')) { + $this->show_download_notification = session()->get('show-download.'.$project->id, + $project->hasMissingDownloadsDateInHarvestFile()); + $this->project = $project; + } } public function getSessionKey() @@ -25,8 +28,10 @@ public function getSessionKey() #[On('download_notify')] public function open() { - $this->show_download_notification = true; - session([$this->getSessionKey()=>true]); + if (auth()->user()->hasRole('manager')) { + $this->show_download_notification = true; + session([$this->getSessionKey() => true]); + } } public function close(): void { diff --git a/laravel_app/app/Models/User.php b/laravel_app/app/Models/User.php index 0611f75..94e259c 100644 --- a/laravel_app/app/Models/User.php +++ b/laravel_app/app/Models/User.php @@ -3,6 +3,7 @@ namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; +use App\Enums\UserRole; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; @@ -28,6 +29,7 @@ class User extends Authenticatable 'name', 'email', 'password', + 'role', ]; /** @@ -49,6 +51,7 @@ class User extends Authenticatable */ protected $casts = [ 'email_verified_at' => 'datetime', + 'role' => UserRole::class, ]; /** @@ -59,4 +62,15 @@ class User extends Authenticatable protected $appends = [ 'profile_photo_url', ]; + + public function hasRole(string|UserRole $role): bool + { + if (is_string($role)) { + $role = UserRole::tryFromName($role); // custom helper zie onder + } + + return $this->role === $role; + } + + } diff --git a/laravel_app/app/Providers/AppServiceProvider.php b/laravel_app/app/Providers/AppServiceProvider.php index 452e6b6..50ef65f 100644 --- a/laravel_app/app/Providers/AppServiceProvider.php +++ b/laravel_app/app/Providers/AppServiceProvider.php @@ -2,6 +2,7 @@ namespace App\Providers; +use Illuminate\Support\Facades\Blade; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider @@ -19,6 +20,12 @@ public function register(): void */ public function boot(): void { - // + Blade::if('manager', function () { + return auth()->check() && auth()->user()->hasRole('manager'); + }); + + Blade::if('viewer', function () { + return auth()->check() && auth()->user()->hasRole('viewer'); + }); } } diff --git a/laravel_app/database/migrations/2025_06_30_093413_add_role_column_to_users_table.php b/laravel_app/database/migrations/2025_06_30_093413_add_role_column_to_users_table.php new file mode 100644 index 0000000..054d12b --- /dev/null +++ b/laravel_app/database/migrations/2025_06_30_093413_add_role_column_to_users_table.php @@ -0,0 +1,28 @@ +integer('role')->default(UserRole::Manager); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('role'); + }); + } +}; diff --git a/laravel_app/resources/views/components/application-logo.blade.php b/laravel_app/resources/views/components/application-logo.blade.php index b9725e6..8181b51 100644 --- a/laravel_app/resources/views/components/application-logo.blade.php +++ b/laravel_app/resources/views/components/application-logo.blade.php @@ -1,5 +1,13 @@ - - - - - +

+ + @manager + Welcome + @endmanager + + @viewer + Hi + @endviewer + + {{ auth()->user()->name }} (role: {{ auth()->user()->role->label() }} ) +

+ diff --git a/laravel_app/resources/views/components/project-manager-grid.blade.php b/laravel_app/resources/views/components/project-manager-grid.blade.php index c9e691a..a95dd0e 100644 --- a/laravel_app/resources/views/components/project-manager-grid.blade.php +++ b/laravel_app/resources/views/components/project-manager-grid.blade.php @@ -10,11 +10,18 @@ + @manager {{ __('You may delete any of your projects if they are no longer needed.') }} + @endmanager + @viewer + {{ __('This is a overview of all projects. When mail scheduled it means it will create a report and mail the recipients.') }} + @endviewer +
+ @manager
{{ __('Create Project') }} @@ -29,6 +36,10 @@ Create
+ @endmanager + + +
Name @@ -37,9 +48,11 @@ Mail Scheduled
+ @manager Actions + @endmanager
- @foreach ($projectManager->projects->sortBy('name') as $project) + @foreach ($projectManager->projects->sortBy('name') as $project)
{{ $project->name }}
@@ -47,18 +60,20 @@ 'text-green-500' => $project->mail_scheduled, 'text-red-500' => !$project->mail_scheduled, ])"> - {!! $project->mail_scheduled ? 'Yes' : 'No' !!} -
-
- -
+ {!! $project->mail_scheduled ? 'Yes' : 'No' !!} + +
+ @manager + + @endmanager +
@endforeach - -
- + + + diff --git a/laravel_app/resources/views/livewire/projects/menu.blade.php b/laravel_app/resources/views/livewire/projects/menu.blade.php index 5415c0a..abbd78b 100644 --- a/laravel_app/resources/views/livewire/projects/menu.blade.php +++ b/laravel_app/resources/views/livewire/projects/menu.blade.php @@ -3,7 +3,9 @@ Mosaics Reports Mailings + @manager Settings Exports Logs + @endmanager diff --git a/laravel_app/resources/views/livewire/projects/report-row.blade.php b/laravel_app/resources/views/livewire/projects/report-row.blade.php index 0edce3f..d36b2c1 100644 --- a/laravel_app/resources/views/livewire/projects/report-row.blade.php +++ b/laravel_app/resources/views/livewire/projects/report-row.blade.php @@ -11,7 +11,7 @@ wire:key="{{$report->id}}"> - +@manager + @manager {{ __('Create Download') }} + @endmanager
@@ -65,6 +67,8 @@ class="px-3 py-3.5 text-right pr-4 sm:pr-8 lg:pr-8 text-sm font-semibold text-gr
+ @manager + @endmanager diff --git a/laravel_app/resources/views/livewire/projects/tabs/mosaic.blade.php b/laravel_app/resources/views/livewire/projects/tabs/mosaic.blade.php index 17777c9..f4da1cc 100644 --- a/laravel_app/resources/views/livewire/projects/tabs/mosaic.blade.php +++ b/laravel_app/resources/views/livewire/projects/tabs/mosaic.blade.php @@ -7,10 +7,12 @@
+ @manager Create Mosaic + @endmanager
diff --git a/laravel_app/resources/views/livewire/projects/tabs/report.blade.php b/laravel_app/resources/views/livewire/projects/tabs/report.blade.php index e6f8f21..16d8ed9 100644 --- a/laravel_app/resources/views/livewire/projects/tabs/report.blade.php +++ b/laravel_app/resources/views/livewire/projects/tabs/report.blade.php @@ -12,10 +12,12 @@ class="inline-flex items-center rounded-md bg-white px-3 py-2 text-sm font-semibold text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50"> Create Test Report - Create Report + @endmanager
@@ -63,7 +65,9 @@ class="py-3.5 pl-3 pr-4 text-left text-sm font-semibold text-gray-900 sm:pl-6 lg + @manager + @endmanager