diff --git a/Modules/Core/Filament/Company/Resources/CompanyUsers/CompanyUserResource.php b/Modules/Core/Filament/Company/Resources/CompanyUsers/CompanyUserResource.php new file mode 100644 index 000000000..cd6b897e1 --- /dev/null +++ b/Modules/Core/Filament/Company/Resources/CompanyUsers/CompanyUserResource.php @@ -0,0 +1,117 @@ +schema([ + TextInput::make('email') + ->label(trans('ip.email')) + ->email() + ->required(), + ]); + } + + public static function table(Table $table): Table + { + return $table + ->query(fn () => Company::getTenant()?->users() ?? User::query()) + ->columns([ + TextColumn::make('name') + ->label(trans('ip.name')) + ->searchable() + ->sortable(), + TextColumn::make('email') + ->label(trans('ip.email')) + ->searchable() + ->sortable(), + ]) + ->filters([]) + ->actions([ + \Filament\Tables\Actions\Action::make('remove') + ->label(trans('ip.remove')) + ->icon('heroicon-m-trash-2') + ->color('danger') + ->action(function (User $record) { + Company::getTenant()?->users()->detach($record->id); + }) + ->requiresConfirmation(), + ]) + ->bulkActions([ + BulkActionGroup::make([ + DeleteBulkAction::make() + ->action(function ($records) { + $company = Company::getTenant(); + foreach ($records as $record) { + $company?->users()->detach($record->id); + } + }), + ]), + ]); + } + + public static function getRelations(): array + { + return []; + } + + public static function getPages(): array + { + return [ + 'index' => ListCompanyUsers::route('/'), + ]; + } + + public static function canViewAny(): bool + { + $roles = array_merge(UserRole::elevated(), [UserRole::CUSTOMER_ADMIN->value]); + return auth()->user()?->hasRole($roles) ?? false; + } + + public static function canCreate(): bool + { + $roles = array_merge(UserRole::elevated(), [UserRole::CUSTOMER_ADMIN->value]); + return auth()->user()?->hasRole($roles) ?? false; + } + + public static function canView(Model $record): bool + { + $roles = array_merge(UserRole::elevated(), [UserRole::CUSTOMER_ADMIN->value]); + return auth()->user()?->hasRole($roles) ?? false; + } + + public static function canEdit(Model $record): bool + { + $roles = array_merge(UserRole::elevated(), [UserRole::CUSTOMER_ADMIN->value]); + return auth()->user()?->hasRole($roles) ?? false; + } + + public static function canDelete(Model $record): bool + { + $roles = array_merge(UserRole::elevated(), [UserRole::CUSTOMER_ADMIN->value]); + return auth()->user()?->hasRole($roles) ?? false; + } +} diff --git a/Modules/Core/Filament/Company/Resources/CompanyUsers/Pages/ListCompanyUsers.php b/Modules/Core/Filament/Company/Resources/CompanyUsers/Pages/ListCompanyUsers.php new file mode 100644 index 000000000..fa6ea1e8e --- /dev/null +++ b/Modules/Core/Filament/Company/Resources/CompanyUsers/Pages/ListCompanyUsers.php @@ -0,0 +1,52 @@ +label(trans('ip.add_team_member')) + ->icon('heroicon-m-plus') + ->form([ + TextInput::make('email') + ->label(trans('ip.email')) + ->email() + ->required() + ->unique(ignoreRecord: true), + ]) + ->action(function (array $data) { + $user = User::whereEmail($data['email'])->first(); + if (!$user) { + \Filament\Notifications\Notification::make() + ->danger() + ->title(trans('ip.user_not_found')) + ->body(trans('ip.no_user_found_with_email', ['email' => $data['email']])) + ->send(); + return; + } + + Company::getTenant()?->users()->syncWithoutDetaching([$user->id]); + + \Filament\Notifications\Notification::make() + ->success() + ->title(trans('ip.team_member_added')) + ->body(trans('ip.user_added_to_team', ['name' => $user->name])) + ->send(); + }) + ->modalHeading(trans('ip.add_team_member')) + ->modalSubmitActionLabel(trans('ip.add_member')), + ]; + } +} diff --git a/Modules/Core/Filament/Company/Resources/EmailTemplates/EmailTemplateResource.php b/Modules/Core/Filament/Company/Resources/EmailTemplates/EmailTemplateResource.php new file mode 100644 index 000000000..5eb96e200 --- /dev/null +++ b/Modules/Core/Filament/Company/Resources/EmailTemplates/EmailTemplateResource.php @@ -0,0 +1,78 @@ + ListEmailTemplates::route('/'), + 'create' => CreateEmailTemplate::route('/create'), + 'edit' => EditEmailTemplate::route('/{record}/edit'), + ]; + } + + public static function canViewAny(): bool + { + $roles = array_merge(UserRole::elevated(), [UserRole::CUSTOMER_ADMIN->value]); + return auth()->user()?->hasRole($roles) ?? false; + } + + public static function canCreate(): bool + { + $roles = array_merge(UserRole::elevated(), [UserRole::CUSTOMER_ADMIN->value]); + return auth()->user()?->hasRole($roles) ?? false; + } + + public static function canView(Model $record): bool + { + $roles = array_merge(UserRole::elevated(), [UserRole::CUSTOMER_ADMIN->value]); + return auth()->user()?->hasRole($roles) ?? false; + } + + public static function canEdit(Model $record): bool + { + $roles = array_merge(UserRole::elevated(), [UserRole::CUSTOMER_ADMIN->value]); + return auth()->user()?->hasRole($roles) ?? false; + } + + public static function canDelete(Model $record): bool + { + $roles = array_merge(UserRole::elevated(), [UserRole::CUSTOMER_ADMIN->value]); + return auth()->user()?->hasRole($roles) ?? false; + } +} diff --git a/Modules/Core/Filament/Company/Resources/EmailTemplates/Pages/CreateEmailTemplate.php b/Modules/Core/Filament/Company/Resources/EmailTemplates/Pages/CreateEmailTemplate.php new file mode 100644 index 000000000..d45d6f25f --- /dev/null +++ b/Modules/Core/Filament/Company/Resources/EmailTemplates/Pages/CreateEmailTemplate.php @@ -0,0 +1,11 @@ +discoverPages(in: app_path('Filament/Company/Pages'), for: 'App\Filament\Company\Pages') ->discoverWidgets(in: app_path('Filament/Company/Widgets'), for: 'App\Filament\Company\Widgets') @@ -248,6 +252,8 @@ public function panel(Panel $panel): Panel //->icon('heroicon-o-cog-6-tooth') ->items([ ...NoteTemplateResource::getNavigationItems(), + ...EmailTemplateResource::getNavigationItems(), + ...CompanyUserResource::getNavigationItems(), ]), ]); })