This commit is contained in:
salam committed 2025-09-07 19:05:29 +02:00
1 parent b005c7677e
commit 59eea97d5a
21 files changed
+582 -764

No files matched your search

+70 -21
View File
@@ -2,6 +2,9 @@
namespace App\Models; namespace App\Models;
use Filament\Auth\MultiFactor\App\Contracts\HasAppAuthentication;
use Filament\Auth\MultiFactor\App\Contracts\HasAppAuthenticationRecovery;
use Filament\Auth\MultiFactor\Email\Contracts\HasEmailAuthentication;
use Filament\Models\Contracts\FilamentUser; use Filament\Models\Contracts\FilamentUser;
use Filament\Panel; use Filament\Panel;
use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Contracts\Auth\MustVerifyEmail;
@@ -9,10 +12,9 @@ use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable; use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\Log;
use Spatie\Permission\Traits\HasRoles; use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable implements FilamentUser, MustVerifyEmail class User extends Authenticatable implements FilamentUser, HasAppAuthentication, HasAppAuthenticationRecovery, HasEmailAuthentication, MustVerifyEmail
{ {
/** @use HasFactory<\Database\Factories\UserFactory> */ /** @use HasFactory<\Database\Factories\UserFactory> */
use HasFactory, HasRoles, Notifiable, SoftDeletes; use HasFactory, HasRoles, Notifiable, SoftDeletes;
@@ -47,6 +49,8 @@ class User extends Authenticatable implements FilamentUser, MustVerifyEmail
protected $hidden = [ protected $hidden = [
'password', 'password',
'remember_token', 'remember_token',
'app_authentication_secret',
'app_authentication_recovery_codes',
]; ];
/** /**
@@ -60,38 +64,83 @@ class User extends Authenticatable implements FilamentUser, MustVerifyEmail
'email_verified_at' => 'datetime', 'email_verified_at' => 'datetime',
'password' => 'hashed', 'password' => 'hashed',
'app_verified_at' => 'datetime', 'app_verified_at' => 'datetime',
'app_authentication_secret' => 'encrypted',
'app_authentication_recovery_codes' => 'encrypted:array',
'has_email_authentication' => 'boolean',
]; ];
} }
public function getAppAuthenticationSecret(): ?string
{
// This method should return the user's saved app authentication secret.
return $this->app_authentication_secret;
}
public function saveAppAuthenticationSecret(?string $secret): void
{
// This method should save the user's app authentication secret.
$this->app_authentication_secret = $secret;
$this->save();
}
public function getAppAuthenticationHolderName(): string
{
// In a user's authentication app, each account can be represented by a "holder name".
// If the user has multiple accounts in your app, it might be a good idea to use
// their email address as then they are still uniquely identifiable.
return $this->email;
}
/**
* @return ?array<string>
*/
public function getAppAuthenticationRecoveryCodes(): ?array
{
// This method should return the user's saved app authentication recovery codes.
return $this->app_authentication_recovery_codes;
}
/**
* @param array<string> | null $codes
*/
public function saveAppAuthenticationRecoveryCodes(?array $codes): void
{
// This method should save the user's app authentication recovery codes.
$this->app_authentication_recovery_codes = $codes;
$this->save();
}
public function hasEmailAuthentication(): bool
{
// This method should return true if the user has enabled email authentication.
return $this->has_email_authentication;
}
public function toggleEmailAuthentication(bool $condition): void
{
// This method should save whether or not the user has enabled email authentication.
$this->has_email_authentication = $condition;
$this->save();
}
public function canAccessPanel(Panel $panel): bool public function canAccessPanel(Panel $panel): bool
{ {
Log::info('canAccessPanel');
return true; return true;
} }
public function canAccessAdminPanel(Panel $panel): bool public function canAccessAdminPanel(Panel $panel): bool
{ {
Log::info('canAccessAdminPanel');
if ($panel->getId() === 'admin') { if ($panel->getId() === 'admin') {
return ( return $this->hasVerifiedEmail();
str_ends_with($this->email, '@webwerkstatt.tirol') ||
str_ends_with($this->email, '@kammerwest.at')
)
&& $this->hasVerifiedEmail();
} }
return false; return false;
} }
public function kammer()
{
return $this->belongsTo(Kammer::class);
}
public function bundesland()
{
return $this->belongsTo(Bundesland::class);
}
} }
+25 -63
View File
@@ -1,8 +1,10 @@
<?php <?php
declare(strict_types=1);
namespace App\Policies; namespace App\Policies;
use App\Models\User; use Illuminate\Foundation\Auth\User as AuthUser;
use App\Models\Gutachter; use App\Models\Gutachter;
use Illuminate\Auth\Access\HandlesAuthorization; use Illuminate\Auth\Access\HandlesAuthorization;
@@ -10,99 +12,59 @@ class GutachterPolicy
{ {
use HandlesAuthorization; use HandlesAuthorization;
/** public function viewAny(AuthUser $authUser): bool
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool
{ {
return $user->can('view_any_gutachters::gutachter'); return $authUser->can('ViewAny:Gutachter');
} }
/** public function view(AuthUser $authUser, Gutachter $gutachter): bool
* Determine whether the user can view the model.
*/
public function view(User $user, Gutachter $gutachter): bool
{ {
return $user->can('view_gutachters::gutachter'); return $authUser->can('View:Gutachter');
} }
/** public function create(AuthUser $authUser): bool
* Determine whether the user can create models.
*/
public function create(User $user): bool
{ {
return $user->can('create_gutachters::gutachter'); return $authUser->can('Create:Gutachter');
} }
/** public function update(AuthUser $authUser, Gutachter $gutachter): bool
* Determine whether the user can update the model.
*/
public function update(User $user, Gutachter $gutachter): bool
{ {
return $user->can('update_gutachters::gutachter'); return $authUser->can('Update:Gutachter');
} }
/** public function delete(AuthUser $authUser, Gutachter $gutachter): bool
* Determine whether the user can delete the model.
*/
public function delete(User $user, Gutachter $gutachter): bool
{ {
return $user->can('delete_gutachters::gutachter'); return $authUser->can('Delete:Gutachter');
} }
/** public function restore(AuthUser $authUser, Gutachter $gutachter): bool
* Determine whether the user can bulk delete.
*/
public function deleteAny(User $user): bool
{ {
return $user->can('delete_any_gutachters::gutachter'); return $authUser->can('Restore:Gutachter');
} }
/** public function forceDelete(AuthUser $authUser, Gutachter $gutachter): bool
* Determine whether the user can permanently delete.
*/
public function forceDelete(User $user, Gutachter $gutachter): bool
{ {
return $user->can('force_delete_gutachters::gutachter'); return $authUser->can('ForceDelete:Gutachter');
} }
/** public function forceDeleteAny(AuthUser $authUser): bool
* Determine whether the user can permanently bulk delete.
*/
public function forceDeleteAny(User $user): bool
{ {
return $user->can('force_delete_any_gutachters::gutachter'); return $authUser->can('ForceDeleteAny:Gutachter');
} }
/** public function restoreAny(AuthUser $authUser): bool
* Determine whether the user can restore.
*/
public function restore(User $user, Gutachter $gutachter): bool
{ {
return $user->can('restore_gutachters::gutachter'); return $authUser->can('RestoreAny:Gutachter');
} }
/** public function replicate(AuthUser $authUser, Gutachter $gutachter): bool
* Determine whether the user can bulk restore.
*/
public function restoreAny(User $user): bool
{ {
return $user->can('restore_any_gutachters::gutachter'); return $authUser->can('Replicate:Gutachter');
} }
/** public function reorder(AuthUser $authUser): bool
* Determine whether the user can replicate.
*/
public function replicate(User $user, Gutachter $gutachter): bool
{ {
return $user->can('replicate_gutachters::gutachter'); return $authUser->can('Reorder:Gutachter');
} }
/**
* Determine whether the user can reorder.
*/
public function reorder(User $user): bool
{
return $user->can('reorder_gutachters::gutachter');
}
} }
+25 -63
View File
@@ -1,8 +1,10 @@
<?php <?php
declare(strict_types=1);
namespace App\Policies; namespace App\Policies;
use App\Models\User; use Illuminate\Foundation\Auth\User as AuthUser;
use App\Models\Konto; use App\Models\Konto;
use Illuminate\Auth\Access\HandlesAuthorization; use Illuminate\Auth\Access\HandlesAuthorization;
@@ -10,99 +12,59 @@ class KontoPolicy
{ {
use HandlesAuthorization; use HandlesAuthorization;
/** public function viewAny(AuthUser $authUser): bool
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool
{ {
return $user->can('view_any_kontos::konto'); return $authUser->can('ViewAny:Konto');
} }
/** public function view(AuthUser $authUser, Konto $konto): bool
* Determine whether the user can view the model.
*/
public function view(User $user, Konto $konto): bool
{ {
return $user->can('view_kontos::konto'); return $authUser->can('View:Konto');
} }
/** public function create(AuthUser $authUser): bool
* Determine whether the user can create models.
*/
public function create(User $user): bool
{ {
return $user->can('create_kontos::konto'); return $authUser->can('Create:Konto');
} }
/** public function update(AuthUser $authUser, Konto $konto): bool
* Determine whether the user can update the model.
*/
public function update(User $user, Konto $konto): bool
{ {
return $user->can('update_kontos::konto'); return $authUser->can('Update:Konto');
} }
/** public function delete(AuthUser $authUser, Konto $konto): bool
* Determine whether the user can delete the model.
*/
public function delete(User $user, Konto $konto): bool
{ {
return $user->can('delete_kontos::konto'); return $authUser->can('Delete:Konto');
} }
/** public function restore(AuthUser $authUser, Konto $konto): bool
* Determine whether the user can bulk delete.
*/
public function deleteAny(User $user): bool
{ {
return $user->can('delete_any_kontos::konto'); return $authUser->can('Restore:Konto');
} }
/** public function forceDelete(AuthUser $authUser, Konto $konto): bool
* Determine whether the user can permanently delete.
*/
public function forceDelete(User $user, Konto $konto): bool
{ {
return $user->can('force_delete_kontos::konto'); return $authUser->can('ForceDelete:Konto');
} }
/** public function forceDeleteAny(AuthUser $authUser): bool
* Determine whether the user can permanently bulk delete.
*/
public function forceDeleteAny(User $user): bool
{ {
return $user->can('force_delete_any_kontos::konto'); return $authUser->can('ForceDeleteAny:Konto');
} }
/** public function restoreAny(AuthUser $authUser): bool
* Determine whether the user can restore.
*/
public function restore(User $user, Konto $konto): bool
{ {
return $user->can('restore_kontos::konto'); return $authUser->can('RestoreAny:Konto');
} }
/** public function replicate(AuthUser $authUser, Konto $konto): bool
* Determine whether the user can bulk restore.
*/
public function restoreAny(User $user): bool
{ {
return $user->can('restore_any_kontos::konto'); return $authUser->can('Replicate:Konto');
} }
/** public function reorder(AuthUser $authUser): bool
* Determine whether the user can replicate.
*/
public function replicate(User $user, Konto $konto): bool
{ {
return $user->can('replicate_kontos::konto'); return $authUser->can('Reorder:Konto');
} }
/**
* Determine whether the user can reorder.
*/
public function reorder(User $user): bool
{
return $user->can('reorder_kontos::konto');
}
} }
+25 -63
View File
@@ -1,8 +1,10 @@
<?php <?php
declare(strict_types=1);
namespace App\Policies; namespace App\Policies;
use App\Models\User; use Illuminate\Foundation\Auth\User as AuthUser;
use App\Models\Kontooptionen; use App\Models\Kontooptionen;
use Illuminate\Auth\Access\HandlesAuthorization; use Illuminate\Auth\Access\HandlesAuthorization;
@@ -10,99 +12,59 @@ class KontooptionenPolicy
{ {
use HandlesAuthorization; use HandlesAuthorization;
/** public function viewAny(AuthUser $authUser): bool
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool
{ {
return $user->can('view_any_kontooptionens::kontooptionen'); return $authUser->can('ViewAny:Kontooptionen');
} }
/** public function view(AuthUser $authUser, Kontooptionen $kontooptionen): bool
* Determine whether the user can view the model.
*/
public function view(User $user, Kontooptionen $kontooptionen): bool
{ {
return $user->can('view_kontooptionens::kontooptionen'); return $authUser->can('View:Kontooptionen');
} }
/** public function create(AuthUser $authUser): bool
* Determine whether the user can create models.
*/
public function create(User $user): bool
{ {
return $user->can('create_kontooptionens::kontooptionen'); return $authUser->can('Create:Kontooptionen');
} }
/** public function update(AuthUser $authUser, Kontooptionen $kontooptionen): bool
* Determine whether the user can update the model.
*/
public function update(User $user, Kontooptionen $kontooptionen): bool
{ {
return $user->can('update_kontooptionens::kontooptionen'); return $authUser->can('Update:Kontooptionen');
} }
/** public function delete(AuthUser $authUser, Kontooptionen $kontooptionen): bool
* Determine whether the user can delete the model.
*/
public function delete(User $user, Kontooptionen $kontooptionen): bool
{ {
return $user->can('delete_kontooptionens::kontooptionen'); return $authUser->can('Delete:Kontooptionen');
} }
/** public function restore(AuthUser $authUser, Kontooptionen $kontooptionen): bool
* Determine whether the user can bulk delete.
*/
public function deleteAny(User $user): bool
{ {
return $user->can('delete_any_kontooptionens::kontooptionen'); return $authUser->can('Restore:Kontooptionen');
} }
/** public function forceDelete(AuthUser $authUser, Kontooptionen $kontooptionen): bool
* Determine whether the user can permanently delete.
*/
public function forceDelete(User $user, Kontooptionen $kontooptionen): bool
{ {
return $user->can('force_delete_kontooptionens::kontooptionen'); return $authUser->can('ForceDelete:Kontooptionen');
} }
/** public function forceDeleteAny(AuthUser $authUser): bool
* Determine whether the user can permanently bulk delete.
*/
public function forceDeleteAny(User $user): bool
{ {
return $user->can('force_delete_any_kontooptionens::kontooptionen'); return $authUser->can('ForceDeleteAny:Kontooptionen');
} }
/** public function restoreAny(AuthUser $authUser): bool
* Determine whether the user can restore.
*/
public function restore(User $user, Kontooptionen $kontooptionen): bool
{ {
return $user->can('restore_kontooptionens::kontooptionen'); return $authUser->can('RestoreAny:Kontooptionen');
} }
/** public function replicate(AuthUser $authUser, Kontooptionen $kontooptionen): bool
* Determine whether the user can bulk restore.
*/
public function restoreAny(User $user): bool
{ {
return $user->can('restore_any_kontooptionens::kontooptionen'); return $authUser->can('Replicate:Kontooptionen');
} }
/** public function reorder(AuthUser $authUser): bool
* Determine whether the user can replicate.
*/
public function replicate(User $user, Kontooptionen $kontooptionen): bool
{ {
return $user->can('replicate_kontooptionens::kontooptionen'); return $authUser->can('Reorder:Kontooptionen');
} }
/**
* Determine whether the user can reorder.
*/
public function reorder(User $user): bool
{
return $user->can('reorder_kontooptionens::kontooptionen');
}
} }
+25 -63
View File
@@ -1,8 +1,10 @@
<?php <?php
declare(strict_types=1);
namespace App\Policies; namespace App\Policies;
use App\Models\User; use Illuminate\Foundation\Auth\User as AuthUser;
use App\Models\Permission; use App\Models\Permission;
use Illuminate\Auth\Access\HandlesAuthorization; use Illuminate\Auth\Access\HandlesAuthorization;
@@ -10,99 +12,59 @@ class PermissionPolicy
{ {
use HandlesAuthorization; use HandlesAuthorization;
/** public function viewAny(AuthUser $authUser): bool
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool
{ {
return $user->can('view_any_permissions::permission'); return $authUser->can('ViewAny:Permission');
} }
/** public function view(AuthUser $authUser, Permission $permission): bool
* Determine whether the user can view the model.
*/
public function view(User $user, Permission $permission): bool
{ {
return $user->can('view_permissions::permission'); return $authUser->can('View:Permission');
} }
/** public function create(AuthUser $authUser): bool
* Determine whether the user can create models.
*/
public function create(User $user): bool
{ {
return $user->can('create_permissions::permission'); return $authUser->can('Create:Permission');
} }
/** public function update(AuthUser $authUser, Permission $permission): bool
* Determine whether the user can update the model.
*/
public function update(User $user, Permission $permission): bool
{ {
return $user->can('update_permissions::permission'); return $authUser->can('Update:Permission');
} }
/** public function delete(AuthUser $authUser, Permission $permission): bool
* Determine whether the user can delete the model.
*/
public function delete(User $user, Permission $permission): bool
{ {
return $user->can('delete_permissions::permission'); return $authUser->can('Delete:Permission');
} }
/** public function restore(AuthUser $authUser, Permission $permission): bool
* Determine whether the user can bulk delete.
*/
public function deleteAny(User $user): bool
{ {
return $user->can('delete_any_permissions::permission'); return $authUser->can('Restore:Permission');
} }
/** public function forceDelete(AuthUser $authUser, Permission $permission): bool
* Determine whether the user can permanently delete.
*/
public function forceDelete(User $user, Permission $permission): bool
{ {
return $user->can('force_delete_permissions::permission'); return $authUser->can('ForceDelete:Permission');
} }
/** public function forceDeleteAny(AuthUser $authUser): bool
* Determine whether the user can permanently bulk delete.
*/
public function forceDeleteAny(User $user): bool
{ {
return $user->can('force_delete_any_permissions::permission'); return $authUser->can('ForceDeleteAny:Permission');
} }
/** public function restoreAny(AuthUser $authUser): bool
* Determine whether the user can restore.
*/
public function restore(User $user, Permission $permission): bool
{ {
return $user->can('restore_permissions::permission'); return $authUser->can('RestoreAny:Permission');
} }
/** public function replicate(AuthUser $authUser, Permission $permission): bool
* Determine whether the user can bulk restore.
*/
public function restoreAny(User $user): bool
{ {
return $user->can('restore_any_permissions::permission'); return $authUser->can('Replicate:Permission');
} }
/** public function reorder(AuthUser $authUser): bool
* Determine whether the user can replicate.
*/
public function replicate(User $user, Permission $permission): bool
{ {
return $user->can('replicate_permissions::permission'); return $authUser->can('Reorder:Permission');
} }
/**
* Determine whether the user can reorder.
*/
public function reorder(User $user): bool
{
return $user->can('reorder_permissions::permission');
}
} }
+25 -63
View File
@@ -1,8 +1,10 @@
<?php <?php
declare(strict_types=1);
namespace App\Policies; namespace App\Policies;
use App\Models\User; use Illuminate\Foundation\Auth\User as AuthUser;
use Spatie\Permission\Models\Role; use Spatie\Permission\Models\Role;
use Illuminate\Auth\Access\HandlesAuthorization; use Illuminate\Auth\Access\HandlesAuthorization;
@@ -10,99 +12,59 @@ class RolePolicy
{ {
use HandlesAuthorization; use HandlesAuthorization;
/** public function viewAny(AuthUser $authUser): bool
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool
{ {
return $user->can('view_any_role'); return $authUser->can('ViewAny:Role');
} }
/** public function view(AuthUser $authUser, Role $role): bool
* Determine whether the user can view the model.
*/
public function view(User $user, Role $role): bool
{ {
return $user->can('view_role'); return $authUser->can('View:Role');
} }
/** public function create(AuthUser $authUser): bool
* Determine whether the user can create models.
*/
public function create(User $user): bool
{ {
return $user->can('create_role'); return $authUser->can('Create:Role');
} }
/** public function update(AuthUser $authUser, Role $role): bool
* Determine whether the user can update the model.
*/
public function update(User $user, Role $role): bool
{ {
return $user->can('update_role'); return $authUser->can('Update:Role');
} }
/** public function delete(AuthUser $authUser, Role $role): bool
* Determine whether the user can delete the model.
*/
public function delete(User $user, Role $role): bool
{ {
return $user->can('delete_role'); return $authUser->can('Delete:Role');
} }
/** public function restore(AuthUser $authUser, Role $role): bool
* Determine whether the user can bulk delete.
*/
public function deleteAny(User $user): bool
{ {
return $user->can('delete_any_role'); return $authUser->can('Restore:Role');
} }
/** public function forceDelete(AuthUser $authUser, Role $role): bool
* Determine whether the user can permanently delete.
*/
public function forceDelete(User $user, Role $role): bool
{ {
return $user->can('{{ ForceDelete }}'); return $authUser->can('ForceDelete:Role');
} }
/** public function forceDeleteAny(AuthUser $authUser): bool
* Determine whether the user can permanently bulk delete.
*/
public function forceDeleteAny(User $user): bool
{ {
return $user->can('{{ ForceDeleteAny }}'); return $authUser->can('ForceDeleteAny:Role');
} }
/** public function restoreAny(AuthUser $authUser): bool
* Determine whether the user can restore.
*/
public function restore(User $user, Role $role): bool
{ {
return $user->can('{{ Restore }}'); return $authUser->can('RestoreAny:Role');
} }
/** public function replicate(AuthUser $authUser, Role $role): bool
* Determine whether the user can bulk restore.
*/
public function restoreAny(User $user): bool
{ {
return $user->can('{{ RestoreAny }}'); return $authUser->can('Replicate:Role');
} }
/** public function reorder(AuthUser $authUser): bool
* Determine whether the user can replicate.
*/
public function replicate(User $user, Role $role): bool
{ {
return $user->can('{{ Replicate }}'); return $authUser->can('Reorder:Role');
} }
/**
* Determine whether the user can reorder.
*/
public function reorder(User $user): bool
{
return $user->can('{{ Reorder }}');
}
} }
+23 -100
View File
@@ -2,143 +2,66 @@
namespace App\Policies; namespace App\Policies;
use App\Models\User; use Illuminate\Foundation\Auth\User as AuthUser;
use Illuminate\Auth\Access\HandlesAuthorization; use Illuminate\Auth\Access\HandlesAuthorization;
class UserPolicy class UserPolicy
{ {
use HandlesAuthorization; use HandlesAuthorization;
/** public function viewAny(AuthUser $authUser): bool
* Determine whether the user can view any models.
*
* @param \App\Models\User $user
* @return bool
*/
public function viewAny(User $user): bool
{ {
return $user->can('view_any_users::user'); return $authUser->can('ViewAny:User');
} }
/** public function view(AuthUser $authUser): bool
* Determine whether the user can view the model.
*
* @param \App\Models\User $user
* @return bool
*/
public function view(User $user): bool
{ {
return $user->can('view_users::user'); return $authUser->can('View:User');
} }
/** public function create(AuthUser $authUser): bool
* Determine whether the user can create models.
*
* @param \App\Models\User $user
* @return bool
*/
public function create(User $user): bool
{ {
return $user->can('create_users::user'); return $authUser->can('Create:User');
} }
/** public function update(AuthUser $authUser): bool
* Determine whether the user can update the model.
*
* @param \App\Models\User $user
* @return bool
*/
public function update(User $user): bool
{ {
return $user->can('update_users::user'); return $authUser->can('Update:User');
} }
/** public function delete(AuthUser $authUser): bool
* Determine whether the user can delete the model.
*
* @param \App\Models\User $user
* @return bool
*/
public function delete(User $user): bool
{ {
return $user->can('delete_users::user'); return $authUser->can('Delete:User');
} }
/** public function restore(AuthUser $authUser): bool
* Determine whether the user can bulk delete.
*
* @param \App\Models\User $user
* @return bool
*/
public function deleteAny(User $user): bool
{ {
return $user->can('delete_any_users::user'); return $authUser->can('Restore:User');
} }
/** public function forceDelete(AuthUser $authUser): bool
* Determine whether the user can permanently delete.
*
* @param \App\Models\User $user
* @return bool
*/
public function forceDelete(User $user): bool
{ {
return $user->can('force_delete_users::user'); return $authUser->can('ForceDelete:User');
} }
/** public function forceDeleteAny(AuthUser $authUser): bool
* Determine whether the user can permanently bulk delete.
*
* @param \App\Models\User $user
* @return bool
*/
public function forceDeleteAny(User $user): bool
{ {
return $user->can('force_delete_any_users::user'); return $authUser->can('ForceDeleteAny:User');
} }
/** public function restoreAny(AuthUser $authUser): bool
* Determine whether the user can restore.
*
* @param \App\Models\User $user
* @return bool
*/
public function restore(User $user): bool
{ {
return $user->can('restore_users::user'); return $authUser->can('RestoreAny:User');
} }
/** public function replicate(AuthUser $authUser): bool
* Determine whether the user can bulk restore.
*
* @param \App\Models\User $user
* @return bool
*/
public function restoreAny(User $user): bool
{ {
return $user->can('restore_any_users::user'); return $authUser->can('Replicate:User');
} }
/** public function reorder(AuthUser $authUser): bool
* Determine whether the user can bulk restore.
*
* @param \App\Models\User $user
* @return bool
*/
public function replicate(User $user): bool
{ {
return $user->can('replicate_users::user'); return $authUser->can('Reorder:User');
} }
/**
* Determine whether the user can reorder.
*
* @param \App\Models\User $user
* @return bool
*/
public function reorder(User $user): bool
{
return $user->can('reorder_users::user');
}
} }
+3 -3
View File
@@ -23,9 +23,9 @@ class AppServiceProvider extends ServiceProvider
*/ */
public function boot(): void public function boot(): void
{ {
FilamentColor::register([ // FilamentColor::register([
'primary' => '#47847f', // 'primary' => '#733e0a',
]); // ]);
FilamentView::registerRenderHook( FilamentView::registerRenderHook(
PanelsRenderHook::AUTH_LOGIN_FORM_BEFORE, fn (): View => view('login-links'), PanelsRenderHook::AUTH_LOGIN_FORM_BEFORE, fn (): View => view('login-links'),
+19 -2
View File
@@ -7,6 +7,8 @@ use App\Http\Middleware\AppUserVerifiedMiddleware;
use Awcodes\LightSwitch\Enums\Alignment; use Awcodes\LightSwitch\Enums\Alignment;
use Awcodes\LightSwitch\LightSwitchPlugin; use Awcodes\LightSwitch\LightSwitchPlugin;
use BezhanSalleh\FilamentShield\FilamentShieldPlugin; use BezhanSalleh\FilamentShield\FilamentShieldPlugin;
use Filament\Auth\MultiFactor\App\AppAuthentication;
use Filament\Auth\MultiFactor\Email\EmailAuthentication;
use Filament\Http\Middleware\Authenticate; use Filament\Http\Middleware\Authenticate;
use Filament\Http\Middleware\AuthenticateSession; use Filament\Http\Middleware\AuthenticateSession;
use Filament\Http\Middleware\DisableBladeIconComponents; use Filament\Http\Middleware\DisableBladeIconComponents;
@@ -26,6 +28,7 @@ use Illuminate\Session\Middleware\StartSession;
use Illuminate\Support\Facades\Blade; use Illuminate\Support\Facades\Blade;
use Illuminate\View\Middleware\ShareErrorsFromSession; use Illuminate\View\Middleware\ShareErrorsFromSession;
use Swis\Filament\Backgrounds\FilamentBackgroundsPlugin; use Swis\Filament\Backgrounds\FilamentBackgroundsPlugin;
use Swis\Filament\Backgrounds\ImageProviders\MyImages;
class AdminPanelProvider extends PanelProvider class AdminPanelProvider extends PanelProvider
{ {
@@ -35,11 +38,22 @@ class AdminPanelProvider extends PanelProvider
->id('admin') ->id('admin')
->path('') ->path('')
->login() ->login()
->registration()
->passwordReset()
->emailVerification()
->emailChangeVerification()
->profile()
->default() ->default()
->renderHook( ->renderHook(
PanelsRenderHook::GLOBAL_SEARCH_BEFORE, PanelsRenderHook::GLOBAL_SEARCH_BEFORE,
fn (): string => auth()->user()->hasRole('gutachter_switch') ? Blade::render('@livewire(\'tenancy-switch\')') : false fn (): string => auth()->user()->hasRole('gutachter_switch') ? Blade::render('@livewire(\'tenancy-switch\')') : false
) )
->multiFactorAuthentication([
EmailAuthentication::make(),
AppAuthentication::make()
->recoverable(),
])
// ], isRequired: true)
->maxContentWidth(Width::ScreenExtraLarge) ->maxContentWidth(Width::ScreenExtraLarge)
// ->sidebarCollapsibleOnDesktop() // ->sidebarCollapsibleOnDesktop()
// ->font('Open Sans') // ->font('Open Sans')
@@ -74,10 +88,13 @@ class AdminPanelProvider extends PanelProvider
Authenticate::class, Authenticate::class,
])->plugins([ ])->plugins([
FilamentShieldPlugin::make(), FilamentShieldPlugin::make(),
FilamentBackgroundsPlugin::make(), FilamentBackgroundsPlugin::make()
->imageProvider(
MyImages::make()
->directory('images/backgrounds')
),
LightSwitchPlugin::make()->position(Alignment::TopCenter), LightSwitchPlugin::make()->position(Alignment::TopCenter),
// HooksHelperPlugin::make(), // HooksHelperPlugin::make(),
]); ]);
} }
} }
+5 -3
View File
@@ -3,20 +3,22 @@
"name": "laravel/laravel", "name": "laravel/laravel",
"type": "project", "type": "project",
"description": "The skeleton application for the Laravel framework.", "description": "The skeleton application for the Laravel framework.",
"keywords": ["laravel", "framework"], "keywords": [
"laravel",
"framework"
],
"license": "MIT", "license": "MIT",
"require": { "require": {
"php": "^8.3", "php": "^8.3",
"agencetwogether/hookshelper": "^0.0.2", "agencetwogether/hookshelper": "^0.0.2",
"awcodes/light-switch": "^2.0", "awcodes/light-switch": "^2.0",
"bezhansalleh/filament-shield": "^4.0@beta", "bezhansalleh/filament-shield": "*",
"filament/filament": "^4.0", "filament/filament": "^4.0",
"laravel/framework": "^12.0", "laravel/framework": "^12.0",
"laravel/tinker": "^2.10.1", "laravel/tinker": "^2.10.1",
"livewire/livewire": "^3.6", "livewire/livewire": "^3.6",
"mallardduck/blade-lucide-icons": "^1.23", "mallardduck/blade-lucide-icons": "^1.23",
"spatie/laravel-login-link": "^1.6", "spatie/laravel-login-link": "^1.6",
"spatie/laravel-multitenancy": "^4.0",
"swisnl/filament-backgrounds": "^2.0", "swisnl/filament-backgrounds": "^2.0",
"ysfkaya/filament-phone-input": "^4.0@beta" "ysfkaya/filament-phone-input": "^4.0@beta"
}, },
Generated
+99 -264
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "bad50230eed48fcdbd195c9d49310cfa", "content-hash": "86131fc6e2814af73859860025a45afe",
"packages": [ "packages": [
{ {
"name": "agencetwogether/hookshelper", "name": "agencetwogether/hookshelper",
@@ -219,24 +219,103 @@
"time": "2025-08-25T13:58:07+00:00" "time": "2025-08-25T13:58:07+00:00"
}, },
{ {
"name": "bezhansalleh/filament-shield", "name": "bezhansalleh/filament-plugin-essentials",
"version": "4.0.0-beta2", "version": "1.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/bezhanSalleh/filament-shield.git", "url": "https://github.com/bezhanSalleh/filament-plugin-essentials.git",
"reference": "a1ff497383cfbbe9107cb7991859d94506a471d8" "reference": "fb4656c661270133b1b1c4297616745e4d586ca7"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/bezhanSalleh/filament-shield/zipball/a1ff497383cfbbe9107cb7991859d94506a471d8", "url": "https://api.github.com/repos/bezhanSalleh/filament-plugin-essentials/zipball/fb4656c661270133b1b1c4297616745e4d586ca7",
"reference": "a1ff497383cfbbe9107cb7991859d94506a471d8", "reference": "fb4656c661270133b1b1c4297616745e4d586ca7",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"filament/filament": "^4.0", "filament/filament": "^4.0",
"filament/upgrade": "^4.0",
"illuminate/contracts": "^11.28|^12.0", "illuminate/contracts": "^11.28|^12.0",
"php": "^8.2", "php": "^8.2",
"spatie/laravel-package-tools": "^1.9"
},
"require-dev": {
"larastan/larastan": "^2.9||^3.0",
"laravel/pint": "^1.14",
"nunomaduro/collision": "^8.1.1||^7.10.0",
"orchestra/testbench": "^10.0.0||^9.0.0",
"pestphp/pest": "^3.0",
"pestphp/pest-plugin-arch": "^3.0",
"pestphp/pest-plugin-laravel": "^3.0",
"pestphp/pest-plugin-type-coverage": "^3.5",
"phpstan/extension-installer": "^1.3||^2.0",
"phpstan/phpstan-deprecation-rules": "^1.1||^2.0",
"phpstan/phpstan-phpunit": "^1.3||^2.0",
"rector/rector": "^2.1",
"spatie/laravel-ray": "^1.40"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"BezhanSalleh\\PluginEssentials\\PluginEssentialsServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"BezhanSalleh\\PluginEssentials\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Bezhan Salleh",
"email": "bezhan_salleh@yahoo.com",
"role": "Developer"
}
],
"description": "A collection of essential traits that streamline Filament plugin development by taking care of the boilerplate, so you can focus on shipping real features faster",
"homepage": "https://github.com/bezhansalleh/filament-plugin-essentials",
"keywords": [
"Bezhan Salleh",
"filament-plugin-essentials",
"laravel"
],
"support": {
"issues": "https://github.com/bezhanSalleh/filament-plugin-essentials/issues",
"source": "https://github.com/bezhanSalleh/filament-plugin-essentials/tree/1.0.0"
},
"funding": [
{
"url": "https://github.com/bezhanSalleh",
"type": "github"
}
],
"time": "2025-08-31T06:50:44+00:00"
},
{
"name": "bezhansalleh/filament-shield",
"version": "4.0.0",
"source": {
"type": "git",
"url": "https://github.com/bezhanSalleh/filament-shield.git",
"reference": "c58355c913dcf987ce6e09294544ade597454dca"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/bezhanSalleh/filament-shield/zipball/c58355c913dcf987ce6e09294544ade597454dca",
"reference": "c58355c913dcf987ce6e09294544ade597454dca",
"shasum": ""
},
"require": {
"bezhansalleh/filament-plugin-essentials": "^1.0",
"filament/filament": "^4.0",
"illuminate/contracts": "^11.28|^12.0",
"illuminate/support": "*",
"php": "^8.2",
"spatie/laravel-package-tools": "^1.9", "spatie/laravel-package-tools": "^1.9",
"spatie/laravel-permission": "^6.0" "spatie/laravel-permission": "^6.0"
}, },
@@ -254,6 +333,7 @@
"phpstan/phpstan-deprecation-rules": "^2.0", "phpstan/phpstan-deprecation-rules": "^2.0",
"phpstan/phpstan-phpunit": "^2.0", "phpstan/phpstan-phpunit": "^2.0",
"phpunit/phpunit": "^10.1|^11.0", "phpunit/phpunit": "^10.1|^11.0",
"rector/rector": "^2.1",
"spatie/laravel-ray": "^1.40" "spatie/laravel-ray": "^1.40"
}, },
"type": "library", "type": "library",
@@ -300,7 +380,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/bezhanSalleh/filament-shield/issues", "issues": "https://github.com/bezhanSalleh/filament-shield/issues",
"source": "https://github.com/bezhanSalleh/filament-shield/tree/4.0.0-beta2" "source": "https://github.com/bezhanSalleh/filament-shield/tree/4.0.0"
}, },
"funding": [ "funding": [
{ {
@@ -308,7 +388,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2025-07-10T22:46:16+00:00" "time": "2025-09-07T07:11:27+00:00"
}, },
{ {
"name": "blade-ui-kit/blade-heroicons", "name": "blade-ui-kit/blade-heroicons",
@@ -1623,53 +1703,6 @@
}, },
"time": "2025-09-04T14:12:44+00:00" "time": "2025-09-04T14:12:44+00:00"
}, },
{
"name": "filament/upgrade",
"version": "v4.0.7",
"source": {
"type": "git",
"url": "https://github.com/filamentphp/upgrade.git",
"reference": "21a3da29b7ebc4e85372b9a6dd39e391cbc47fdb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/filamentphp/upgrade/zipball/21a3da29b7ebc4e85372b9a6dd39e391cbc47fdb",
"reference": "21a3da29b7ebc4e85372b9a6dd39e391cbc47fdb",
"shasum": ""
},
"require": {
"nunomaduro/termwind": "^2.0",
"php": "^8.2",
"rector/rector": "^2.0"
},
"bin": [
"bin/filament-v4"
],
"type": "library",
"extra": {
"laravel": {
"providers": [
"Filament\\Upgrade\\UpgradeServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Filament\\Upgrade\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "Upgrade Filament v3 code to Filament v4.",
"homepage": "https://github.com/filamentphp/filament",
"support": {
"issues": "https://github.com/filamentphp/filament/issues",
"source": "https://github.com/filamentphp/filament"
},
"time": "2025-09-02T11:01:30+00:00"
},
{ {
"name": "filament/widgets", "name": "filament/widgets",
"version": "v4.0.7", "version": "v4.0.7",
@@ -3836,16 +3869,16 @@
}, },
{ {
"name": "nesbot/carbon", "name": "nesbot/carbon",
"version": "3.10.2", "version": "3.10.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/CarbonPHP/carbon.git", "url": "https://github.com/CarbonPHP/carbon.git",
"reference": "76b5c07b8a9d2025ed1610e14cef1f3fd6ad2c24" "reference": "8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/76b5c07b8a9d2025ed1610e14cef1f3fd6ad2c24", "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f",
"reference": "76b5c07b8a9d2025ed1610e14cef1f3fd6ad2c24", "reference": "8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -3863,13 +3896,13 @@
"require-dev": { "require-dev": {
"doctrine/dbal": "^3.6.3 || ^4.0", "doctrine/dbal": "^3.6.3 || ^4.0",
"doctrine/orm": "^2.15.2 || ^3.0", "doctrine/orm": "^2.15.2 || ^3.0",
"friendsofphp/php-cs-fixer": "^3.75.0", "friendsofphp/php-cs-fixer": "^v3.87.1",
"kylekatarnls/multi-tester": "^2.5.3", "kylekatarnls/multi-tester": "^2.5.3",
"phpmd/phpmd": "^2.15.0", "phpmd/phpmd": "^2.15.0",
"phpstan/extension-installer": "^1.4.3", "phpstan/extension-installer": "^1.4.3",
"phpstan/phpstan": "^2.1.17", "phpstan/phpstan": "^2.1.22",
"phpunit/phpunit": "^10.5.46", "phpunit/phpunit": "^10.5.53",
"squizlabs/php_codesniffer": "^3.13.0" "squizlabs/php_codesniffer": "^3.13.4"
}, },
"bin": [ "bin": [
"bin/carbon" "bin/carbon"
@@ -3937,7 +3970,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2025-08-02T09:36:06+00:00" "time": "2025-09-06T13:39:36+00:00"
}, },
{ {
"name": "nette/php-generator", "name": "nette/php-generator",
@@ -4542,64 +4575,6 @@
], ],
"time": "2025-08-21T11:53:16+00:00" "time": "2025-08-21T11:53:16+00:00"
}, },
{
"name": "phpstan/phpstan",
"version": "2.1.22",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
"reference": "41600c8379eb5aee63e9413fe9e97273e25d57e4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/41600c8379eb5aee63e9413fe9e97273e25d57e4",
"reference": "41600c8379eb5aee63e9413fe9e97273e25d57e4",
"shasum": ""
},
"require": {
"php": "^7.4|^8.0"
},
"conflict": {
"phpstan/phpstan-shim": "*"
},
"bin": [
"phpstan",
"phpstan.phar"
],
"type": "library",
"autoload": {
"files": [
"bootstrap.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "PHPStan - PHP Static Analysis Tool",
"keywords": [
"dev",
"static analysis"
],
"support": {
"docs": "https://phpstan.org/user-guide/getting-started",
"forum": "https://github.com/phpstan/phpstan/discussions",
"issues": "https://github.com/phpstan/phpstan/issues",
"security": "https://github.com/phpstan/phpstan/security/policy",
"source": "https://github.com/phpstan/phpstan-src"
},
"funding": [
{
"url": "https://github.com/ondrejmirtes",
"type": "github"
},
{
"url": "https://github.com/phpstan",
"type": "github"
}
],
"time": "2025-08-04T19:17:37+00:00"
},
{ {
"name": "pragmarx/google2fa", "name": "pragmarx/google2fa",
"version": "v8.0.3", "version": "v8.0.3",
@@ -5479,66 +5454,6 @@
}, },
"time": "2025-09-04T20:59:21+00:00" "time": "2025-09-04T20:59:21+00:00"
}, },
{
"name": "rector/rector",
"version": "2.1.5",
"source": {
"type": "git",
"url": "https://github.com/rectorphp/rector.git",
"reference": "1cd6abfb5976fd4ed728d5b73ebd67c7c810cd88"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/rectorphp/rector/zipball/1cd6abfb5976fd4ed728d5b73ebd67c7c810cd88",
"reference": "1cd6abfb5976fd4ed728d5b73ebd67c7c810cd88",
"shasum": ""
},
"require": {
"php": "^7.4|^8.0",
"phpstan/phpstan": "^2.1.18"
},
"conflict": {
"rector/rector-doctrine": "*",
"rector/rector-downgrade-php": "*",
"rector/rector-phpunit": "*",
"rector/rector-symfony": "*"
},
"suggest": {
"ext-dom": "To manipulate phpunit.xml via the custom-rule command"
},
"bin": [
"bin/rector"
],
"type": "library",
"autoload": {
"files": [
"bootstrap.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "Instant Upgrade and Automated Refactoring of any PHP code",
"homepage": "https://getrector.com/",
"keywords": [
"automation",
"dev",
"migration",
"refactoring"
],
"support": {
"issues": "https://github.com/rectorphp/rector/issues",
"source": "https://github.com/rectorphp/rector/tree/2.1.5"
},
"funding": [
{
"url": "https://github.com/tomasvotruba",
"type": "github"
}
],
"time": "2025-09-04T14:19:07+00:00"
},
{ {
"name": "ryangjchandler/blade-capture-directive", "name": "ryangjchandler/blade-capture-directive",
"version": "v1.1.0", "version": "v1.1.0",
@@ -5819,85 +5734,6 @@
}, },
"time": "2025-04-16T13:42:34+00:00" "time": "2025-04-16T13:42:34+00:00"
}, },
{
"name": "spatie/laravel-multitenancy",
"version": "4.0.5",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-multitenancy.git",
"reference": "7b43b33a4e4194157949470a04effc64b8bac2a3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spatie/laravel-multitenancy/zipball/7b43b33a4e4194157949470a04effc64b8bac2a3",
"reference": "7b43b33a4e4194157949470a04effc64b8bac2a3",
"shasum": ""
},
"require": {
"illuminate/support": "^11.0|^12.0",
"php": "^8.2",
"spatie/laravel-package-tools": "^1.9"
},
"require-dev": {
"laravel/legacy-factories": "^1.0.4",
"laravel/octane": "^2.5|dev-develop",
"laravel/serializable-closure": "^1.1|^2.0",
"mockery/mockery": "^1.4",
"orchestra/testbench": "^9.0|^10.0",
"pestphp/pest": "^2.34|^3.7",
"spatie/valuestore": "^1.2"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"Multitenancy": "Spatie\\Multitenancy\\MultitenancyFacade"
},
"providers": [
"Spatie\\Multitenancy\\MultitenancyServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Spatie\\Multitenancy\\": "src",
"Spatie\\Multitenancy\\Database\\Factories\\": "database/factories"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Freek Van der Herten",
"email": "freek@spatie.be",
"homepage": "http://spatie.be",
"role": "Developer"
}
],
"description": "Make your Laravel app usable by multiple tenants",
"homepage": "https://github.com/spatie/laravel-multitenancy",
"keywords": [
"laravel-multitenancy",
"spatie"
],
"support": {
"issues": "https://github.com/spatie/laravel-multitenancy/issues",
"source": "https://github.com/spatie/laravel-multitenancy/tree/4.0.5"
},
"funding": [
{
"url": "https://spatie.be/open-source/support-us",
"type": "custom"
},
{
"url": "https://github.com/spatie",
"type": "github"
}
],
"time": "2025-05-12T09:56:03+00:00"
},
{ {
"name": "spatie/laravel-package-tools", "name": "spatie/laravel-package-tools",
"version": "1.92.7", "version": "1.92.7",
@@ -12396,7 +12232,6 @@
"aliases": [], "aliases": [],
"minimum-stability": "stable", "minimum-stability": "stable",
"stability-flags": { "stability-flags": {
"bezhansalleh/filament-shield": 10,
"ysfkaya/filament-phone-input": 10 "ysfkaya/filament-phone-input": 10
}, },
"prefer-stable": true, "prefer-stable": true,
+215 -46
View File
@@ -1,83 +1,243 @@
<?php <?php
return [ return [
/*
|--------------------------------------------------------------------------
| Shield Resource
|--------------------------------------------------------------------------
|
| Here you may configure the built-in role management resource. You can
| customize the URL, choose whether to show model paths, group it under
| a cluster, and decide which permission tabs to display.
|
*/
'shield_resource' => [ 'shield_resource' => [
'should_register_navigation' => true,
'slug' => 'shield/roles', 'slug' => 'shield/roles',
'navigation_sort' => -1,
'navigation_badge' => true,
'navigation_group' => true,
'sub_navigation_position' => null,
'is_globally_searchable' => false,
'show_model_path' => true, 'show_model_path' => true,
'is_scoped_to_tenant' => true,
'cluster' => null, 'cluster' => null,
'tabs' => [
'pages' => true,
'widgets' => true,
'resources' => true,
'custom_permissions' => false,
], ],
],
/*
|--------------------------------------------------------------------------
| Multi-Tenancy
|--------------------------------------------------------------------------
|
| When your application supports teams, Shield will automatically detect
| and configure the tenant model during setup. This enables tenant-scoped
| roles and permissions throughout your application.
|
*/
'tenant_model' => null, 'tenant_model' => null,
'auth_provider_model' => [ /*
'fqcn' => 'App\\Models\\User', |--------------------------------------------------------------------------
], | User Model
|--------------------------------------------------------------------------
|
| This value contains the class name of your user model. This model will
| be used for role assignments and must implement the HasRoles trait
| provided by the Spatie\Permission package.
|
*/
'auth_provider_model' => 'App\\Models\\User',
/*
|--------------------------------------------------------------------------
| Super Admin
|--------------------------------------------------------------------------
|
| Here you may define a super admin that has unrestricted access to your
| application. You can choose to implement this via Laravel's gate system
| or as a traditional role with all permissions explicitly assigned.
|
*/
'super_admin' => [ 'super_admin' => [
'enabled' => true, 'enabled' => true,
'name' => 'super_admin', 'name' => 'super_admin',
'define_via_gate' => false, 'define_via_gate' => false,
'intercept_gate' => 'before', // after 'intercept_gate' => 'before',
], ],
/*
|--------------------------------------------------------------------------
| Panel User
|--------------------------------------------------------------------------
|
| When enabled, Shield will create a basic panel user role that can be
| assigned to users who should have access to your Filament panels but
| don't need any specific permissions beyond basic authentication.
|
*/
'panel_user' => [ 'panel_user' => [
'enabled' => true, 'enabled' => true,
'name' => 'panel_user', 'name' => 'panel_user',
], ],
'permission_prefixes' => [ /*
'resource' => [ |--------------------------------------------------------------------------
| Permission Builder
|--------------------------------------------------------------------------
|
| You can customize how permission keys are generated to match your
| preferred naming convention and organizational standards. Shield uses
| these settings when creating permission names from your resources.
|
| Supported formats: snake, kebab, pascal, camel, upper_snake, lower_snake
|
*/
'permissions' => [
'separator' => ':',
'case' => 'pascal',
'generate' => true,
],
/*
|--------------------------------------------------------------------------
| Policies
|--------------------------------------------------------------------------
|
| Shield can automatically generate Laravel policies for your resources.
| When merge is enabled, the methods below will be combined with any
| resource-specific methods you define in the resources section.
|
*/
'policies' => [
'path' => app_path('Policies'),
'merge' => true,
'generate' => true,
'methods' => [
'viewAny', 'view', 'create', 'update', 'delete', 'restore',
'forceDelete', 'forceDeleteAny', 'restoreAny', 'replicate', 'reorder',
],
'single_parameter_methods' => [
'viewAny',
'create',
'deleteAny',
'forceDeleteAny',
'restoreAny',
'reorder',
],
],
/*
|--------------------------------------------------------------------------
| Localization
|--------------------------------------------------------------------------
|
| Shield supports multiple languages out of the box. When enabled, you
| can provide translated labels for permissions and roles to create a
| more localized experience for your international users.
|
*/
'localization' => [
'enabled' => false,
'key' => 'filament-shield::filament-shield',
],
/*
|--------------------------------------------------------------------------
| Resources
|--------------------------------------------------------------------------
|
| Here you can fine-tune permissions for specific Filament resources.
| Use the 'manage' array to override the default policy methods for
| individual resources, giving you granular control over permissions.
|
*/
'resources' => [
'subject' => 'model',
'manage' => [
\BezhanSalleh\FilamentShield\Resources\Roles\RoleResource::class => [
'viewAny',
'view', 'view',
'view_any',
'create', 'create',
'update', 'update',
'restore',
'restore_any',
'replicate',
'reorder',
'delete', 'delete',
'delete_any',
'force_delete',
'force_delete_any',
], ],
'page' => 'page',
'widget' => 'widget',
], ],
'entities' => [
'pages' => true,
'widgets' => true,
'resources' => true,
'custom_permissions' => false,
],
'generator' => [
'option' => 'policies_and_permissions',
'policy_directory' => 'Policies',
'policy_namespace' => 'Policies',
],
'exclude' => [ 'exclude' => [
'enabled' => true, //
],
],
/*
|--------------------------------------------------------------------------
| Pages
|--------------------------------------------------------------------------
|
| Most Filament pages only require view permissions. Pages listed in the
| exclude array will be skipped during permission generation and won't
| appear in your role management interface.
|
*/
'pages' => [ 'pages' => [
'Dashboard', 'subject' => 'class',
'prefix' => 'view',
'exclude' => [
\Filament\Pages\Dashboard::class,
], ],
],
/*
|--------------------------------------------------------------------------
| Widgets
|--------------------------------------------------------------------------
|
| Like pages, widgets typically only need view permissions. Add widgets
| to the exclude array if you don't want them to appear in your role
| management interface.
|
*/
'widgets' => [ 'widgets' => [
'AccountWidget', 'FilamentInfoWidget', 'subject' => 'class',
'prefix' => 'view',
'exclude' => [
\Filament\Widgets\AccountWidget::class,
\Filament\Widgets\FilamentInfoWidget::class,
],
], ],
'resources' => [], /*
], |--------------------------------------------------------------------------
| Custom Permissions
|--------------------------------------------------------------------------
|
| Sometimes you need permissions that don't map to resources, pages, or
| widgets. Define any custom permissions here and they'll be available
| when editing roles in your application.
|
*/
'custom_permissions' => [],
/*
|--------------------------------------------------------------------------
| Entity Discovery
|--------------------------------------------------------------------------
|
| By default, Shield only looks for entities in your default Filament
| panel. Enable these options if you're using multiple panels and want
| Shield to discover entities across all of them.
|
*/
'discovery' => [ 'discovery' => [
'discover_all_resources' => false, 'discover_all_resources' => false,
@@ -85,8 +245,17 @@ return [
'discover_all_pages' => false, 'discover_all_pages' => false,
], ],
'register_role_policy' => [ /*
'enabled' => true, |--------------------------------------------------------------------------
], | Role Policy
|--------------------------------------------------------------------------
|
| Shield can automatically register a policy for role management itself.
| This lets you control who can manage roles using Laravel's built-in
| authorization system. Requires a RolePolicy class in your app.
|
*/
'register_role_policy' => true,
]; ];
@@ -13,13 +13,18 @@ return new class extends Migration
{ {
Schema::create('users', function (Blueprint $table) { Schema::create('users', function (Blueprint $table) {
$table->id(); $table->id();
$table->foreignId('konto_id')->constrained()->cascadeOnDelete(); $table->foreignId('konto_id')->constrained()->cascadeOnDelete()->default(0);
$table->string('gender')->nullable(); $table->string('gender')->nullable();
$table->string('name'); $table->string('name');
$table->string('email')->unique(); $table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable(); $table->timestamp('email_verified_at')->nullable();
$table->string('password'); $table->string('password');
$table->boolean('super_admin')->default(0); $table->boolean('super_admin')->default(0);
$table->text('app_authentication_secret')->nullable();
$table->text('app_authentication_recovery_codes')->nullable();
$table->boolean('has_email_authentication')->default(false);
$table->rememberToken(); $table->rememberToken();
$table->timestamp('app_verified_at')->nullable(); $table->timestamp('app_verified_at')->nullable();
$table->timestamp('deleted_at')->nullable(); $table->timestamp('deleted_at')->nullable();
Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

+8 -4
View File
@@ -1,5 +1,9 @@
<div> <div class="text-justify">
Durch die Parifizierung oder Nutzwertberechnung wird im Österreichischen Wohnungseigentumsrecht das Verhältnis der <p
Eigentumsanteile der einzelnen Miteigentümer eines Hauses, an dem Wohnungseigentum begründet ist, untereinander class="first-letter:float-left first-letter:mr-2 first-letter:text-5xl first-letter:font-bold first-letter:text-primary-900">
bestimmt. Mit diesem Programm wird die Parifizierung oder Nutzwertberechnung welche im Österreichischen
Wohnungseigentumsrecht das Verhältnis der Eigentumsanteile der einzelnen Miteigentümer eines Hauses, an dem
Wohnungseigentum begründet, anhand von importierten Daten mit Hilfe von konfigurierbaren Kriterien und Methoden
berechnet und bestimmt.
</p>
</div> </div>
+1 -1
View File
@@ -45,7 +45,7 @@ case "$1" in
echo "4 => chown -R apache:apache ." echo "4 => chown -R apache:apache ."
echo "5 => a storage:link" echo "5 => a storage:link"
echo "6 => a filament:assets . copy to prod" echo "6 => a filament:assets . copy to prod"
echo "7 => a shield:setup with tenancy" echo "7 => a shield:setup"
echo "--------------------------" echo "--------------------------"
echo "" echo ""
;; ;;
+8 -4
View File
@@ -1,11 +1,15 @@
import { defineConfig } from 'vite'; import { defineConfig } from "vite";
import laravel from 'laravel-vite-plugin'; import laravel from "laravel-vite-plugin";
import tailwindcss from '@tailwindcss/vite'; import tailwindcss from "@tailwindcss/vite";
export default defineConfig({ export default defineConfig({
plugins: [ plugins: [
laravel({ laravel({
input: ['resources/css/app.css', 'resources/js/app.js'], input: [
"resources/css/filament/admin/theme.css",
"resources/css/app.css",
"resources/js/app.js",
],
refresh: true, refresh: true,
}), }),
tailwindcss(), tailwindcss(),