From 504ddfbf8d1bfca74158c6c1ddf75f7a920ed754 Mon Sep 17 00:00:00 2001 From: Nurmuhammet Allanov Date: Mon, 3 Nov 2025 23:29:08 +0500 Subject: [PATCH] wip --- .../Clusters/Cards/Cards/CardResource.php | 7 ++-- .../Resources/Users/Schemas/UserForm.php | 10 +++++- .../Resources/Users/Tables/UsersTable.php | 3 ++ app/Filament/Resources/Users/UserResource.php | 19 ++++++++++ app/Http/Middleware/EnsureProfileIsFilled.php | 5 +++ .../RedirectIfUserPhoneIsUnVerfied.php | 14 ++++++-- app/Modules/Branch/Models/UserBranch.php | 24 +++++++++++++ .../Traits/UserAdjustments.php | 10 ++++++ app/Providers/AppServiceProvider.php | 2 -- app/Providers/AuthServiceProvider.php | 36 +++++++++++++++++++ app/Providers/Filament/WorkPanelProvider.php | 1 - bootstrap/providers.php | 1 + database/seeders/FillJsonData.php | 5 --- .../livewire/user-passport-fields.blade.php | 22 +++++++----- 14 files changed, 138 insertions(+), 21 deletions(-) create mode 100644 app/Modules/Branch/Models/UserBranch.php create mode 100644 app/Providers/AuthServiceProvider.php diff --git a/app/Filament/Clusters/Cards/Cards/CardResource.php b/app/Filament/Clusters/Cards/Cards/CardResource.php index ad5bee6..0340fe9 100644 --- a/app/Filament/Clusters/Cards/Cards/CardResource.php +++ b/app/Filament/Clusters/Cards/Cards/CardResource.php @@ -9,7 +9,6 @@ use App\Modules\Card\Filament\Actions\CheckCardBalanceAction; use App\Modules\Card\Filament\Actions\DownloadCardRequisteAction; use App\Modules\Card\Filament\Actions\DownloadCardTransactionAction; use App\Modules\Card\Models\Card; -use App\Modules\DefaultQueryForResourceIndex\Repositories\DefaultQueryForResourceIndexRepository; use BackedEnum; use Filament\Actions\BulkActionGroup; use Filament\Actions\DeleteAction; @@ -91,7 +90,11 @@ class CardResource extends Resource { return $table ->modifyQueryUsing(function (Builder $query) { - DefaultQueryForResourceIndexRepository::make($query); + if (user()->isAdmin()) { + return; + } + + $query->where('user_id', user()->id); }) ->columns([ TextColumn::make('number') diff --git a/app/Filament/Resources/Users/Schemas/UserForm.php b/app/Filament/Resources/Users/Schemas/UserForm.php index 4ad7404..bc266f7 100644 --- a/app/Filament/Resources/Users/Schemas/UserForm.php +++ b/app/Filament/Resources/Users/Schemas/UserForm.php @@ -5,6 +5,7 @@ namespace App\Filament\Resources\Users\Schemas; use Filament\Forms\Components\Select; use Filament\Forms\Components\TextInput; use Filament\Schemas\Schema; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\Hash; class UserForm @@ -29,7 +30,6 @@ class UserForm TextInput::make('phone') ->label(__('Phone number')) - ->required() ->unique(ignoreRecord: true), TextInput::make('email') @@ -51,6 +51,14 @@ class UserForm ->preload() ->native(false) ->required(), + + Select::make('branches') + ->label(__('Branches')) + ->relationship('branches', 'name', fn (Builder $query) => $query->distinct('id')->orderBy('id')) + ->multiple() + ->preload() + ->native(false) + ->required(), ]); } } diff --git a/app/Filament/Resources/Users/Tables/UsersTable.php b/app/Filament/Resources/Users/Tables/UsersTable.php index 372918d..63851b6 100644 --- a/app/Filament/Resources/Users/Tables/UsersTable.php +++ b/app/Filament/Resources/Users/Tables/UsersTable.php @@ -13,7 +13,10 @@ class UsersTable public static function configure(Table $table): Table { return $table + ->defaultSort('created_at', direction: 'desc') ->columns([ + TextColumn::make('id'), + TextColumn::make('first_name') ->label(__('First name')) ->searchable() diff --git a/app/Filament/Resources/Users/UserResource.php b/app/Filament/Resources/Users/UserResource.php index d339397..c1aa1bd 100644 --- a/app/Filament/Resources/Users/UserResource.php +++ b/app/Filament/Resources/Users/UserResource.php @@ -16,12 +16,31 @@ use Filament\Tables\Table; class UserResource extends Resource { + protected static ?int $navigationSort = 2; + protected static ?string $model = User::class; protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedUsers; + protected static string|BackedEnum|null $activeNavigationIcon = Heroicon::Users; + protected static ?string $recordTitleAttribute = 'first_name'; + public static function getNavigationLabel(): string + { + return __('Users'); + } + + public static function getModelLabel(): string + { + return __('User'); + } + + public static function getPluralModelLabel(): string + { + return __('Users'); + } + public static function form(Schema $schema): Schema { return UserForm::configure($schema); diff --git a/app/Http/Middleware/EnsureProfileIsFilled.php b/app/Http/Middleware/EnsureProfileIsFilled.php index 470c3b4..68a8a50 100644 --- a/app/Http/Middleware/EnsureProfileIsFilled.php +++ b/app/Http/Middleware/EnsureProfileIsFilled.php @@ -20,6 +20,11 @@ class EnsureProfileIsFilled /** @var \App\Models\User */ $user = $request->user(); + // Skip if user is system user... + if ($user->isSystemUser()) { + return $next($request); + } + // 1. If user is not logged in, or profile is already complete, do nothing. // (Based on your logic: must_fill_profile == true means complete) if (! $user->must_fill_profile) { diff --git a/app/Modules/BaseAuth/Middleware/RedirectIfUserPhoneIsUnVerfied.php b/app/Modules/BaseAuth/Middleware/RedirectIfUserPhoneIsUnVerfied.php index 5d3161d..420f32e 100644 --- a/app/Modules/BaseAuth/Middleware/RedirectIfUserPhoneIsUnVerfied.php +++ b/app/Modules/BaseAuth/Middleware/RedirectIfUserPhoneIsUnVerfied.php @@ -16,8 +16,18 @@ class RedirectIfUserPhoneIsUnVerfied */ public function handle(Request $request, Closure $next): Response { - if (Auth::check() && is_null($request->user()?->phone_verified_at)) { - return redirect()->route('sms-verification'); + if (Auth::check()) { + /** @var \App\Models\User */ + $user = $request->user(); + + // Skip if user is system user... + if ($user->isSystemUser()) { + return $next($request); + } + + if (is_null($user->phone_verified_at)) { + return redirect()->route('sms-verification'); + } } return $next($request); diff --git a/app/Modules/Branch/Models/UserBranch.php b/app/Modules/Branch/Models/UserBranch.php new file mode 100644 index 0000000..43b3253 --- /dev/null +++ b/app/Modules/Branch/Models/UserBranch.php @@ -0,0 +1,24 @@ +belongsTo(Branch::class); + } + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } +} diff --git a/app/Modules/UserAdjustments/Traits/UserAdjustments.php b/app/Modules/UserAdjustments/Traits/UserAdjustments.php index 5c062d6..82f56af 100644 --- a/app/Modules/UserAdjustments/Traits/UserAdjustments.php +++ b/app/Modules/UserAdjustments/Traits/UserAdjustments.php @@ -3,7 +3,9 @@ namespace App\Modules\UserAdjustments\Traits; use App\Modules\Branch\Models\Branch; +use App\Modules\Branch\Models\UserBranch; use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use Illuminate\Database\Eloquent\Relations\HasMany; use Spatie\Permission\Traits\HasRoles; /** @@ -71,4 +73,12 @@ trait UserAdjustments { return $this->belongsToMany(Branch::class); } + + /** + * User branches + */ + public function userBranches(): HasMany + { + return $this->hasMany(UserBranch::class); + } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 86564d7..4c305b9 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -58,7 +58,5 @@ class AppServiceProvider extends ServiceProvider return $builder; }); - - logDB(); } } diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php new file mode 100644 index 0000000..af46b23 --- /dev/null +++ b/app/Providers/AuthServiceProvider.php @@ -0,0 +1,36 @@ + $user->isMe()); + Gate::define('isSuperAdmin', fn (User $user) => $user->isSuperAdmin()); + Gate::define('isAdmin', fn (User $user) => $user->isAdmin()); + Gate::define('isCurrencyMaintainer', fn (User $user) => $user->isCurrencyMaintainer()); + Gate::define('systemUser', fn (User $user) => $user->isSystemUser()); + Gate::define('notSystemUser', fn (User $user) => ! $user->isSystemUser()); + + // Tooling permissions... + // Gate::define('viewPulse', fn ($user) => $user->isAdmin()); + // Gate::define('viewApiDocs', fn ($user) => $user->canAccessApiDocs()); + } +} diff --git a/app/Providers/Filament/WorkPanelProvider.php b/app/Providers/Filament/WorkPanelProvider.php index 027cfdc..8f592da 100644 --- a/app/Providers/Filament/WorkPanelProvider.php +++ b/app/Providers/Filament/WorkPanelProvider.php @@ -85,7 +85,6 @@ class WorkPanelProvider extends PanelProvider ]) ->spa() ->databaseTransactions() - ->breadcrumbs(false) ->colors([ 'danger' => Color::Rose, 'gray' => Color::Gray, diff --git a/bootstrap/providers.php b/bootstrap/providers.php index a7d5467..ce83e8b 100644 --- a/bootstrap/providers.php +++ b/bootstrap/providers.php @@ -2,6 +2,7 @@ return [ App\Providers\AppServiceProvider::class, + App\Providers\AuthServiceProvider::class, App\Modules\ModuleServiceProvider::class, App\Providers\Filament\WorkPanelProvider::class, ]; diff --git a/database/seeders/FillJsonData.php b/database/seeders/FillJsonData.php index f21c264..231f3db 100644 --- a/database/seeders/FillJsonData.php +++ b/database/seeders/FillJsonData.php @@ -3,11 +3,6 @@ namespace Database\Seeders; use Illuminate\Database\Seeder; -use Illuminate\Support\Facades\DB; -use Illuminate\Support\Facades\File; -use Illuminate\Support\Str; -use LazyJson\JsonElement; -use SplFileObject; class FillJsonData extends Seeder { diff --git a/resources/views/livewire/user-passport-fields.blade.php b/resources/views/livewire/user-passport-fields.blade.php index c91ef06..3a0a06a 100644 --- a/resources/views/livewire/user-passport-fields.blade.php +++ b/resources/views/livewire/user-passport-fields.blade.php @@ -1,9 +1,15 @@ -
- {{ $this->form }} +
+ @if(! user()->isSystemUser()) + + {{ $this->form }} -
- - {{ __('filament-edit-profile::default.save') }} - -
- +
+ + {{ __('filament-edit-profile::default.save') }} + +
+ + @else + + @endif +