From 07160656f53af40aac399efaaa497c049e645b6d Mon Sep 17 00:00:00 2001 From: "Sabrina B." Date: Thu, 23 Oct 2025 11:41:56 +0200 Subject: [PATCH] feat(Admin Panel & Charts) --- .../MemberGroups/MemberGroupResource.php | 2 + .../Resources/Members/MemberResource.php | 3 + .../Resources/Members/Widgets/MemberCount.php | 22 ++ .../Memberships/MembershipResource.php | 2 + .../Memberships/Widgets/MembershipsChart.php | 38 +++ .../Resources/Packages/PackageResource.php | 2 + .../Resources/Services/ServiceResource.php | 2 + .../Resources/Users/Pages/CreateUser.php | 11 + .../Resources/Users/Pages/EditUser.php | 19 ++ .../Resources/Users/Pages/ListUsers.php | 19 ++ .../Resources/Users/Schemas/UserForm.php | 27 ++ .../Resources/Users/Tables/UsersTable.php | 46 +++ app/Filament/Resources/Users/UserResource.php | 49 ++++ app/Models/User.php | 12 + app/Providers/Filament/AdminPanelProvider.php | 4 + lang/en/users.php | 13 +- lang/fr/members.php | 6 + lang/fr/users.php | 12 + .../Resources/Services/Pages/CreateService.ts | 83 ++++++ .../Resources/Services/Pages/EditService.ts | 101 +++++++ .../Resources/Services/Pages/ListServices.ts | 83 ++++++ .../Resources/Services/Pages/index.ts | 11 + .../App/Filament/Resources/Services/index.ts | 7 + .../actions/App/Filament/Resources/index.ts | 2 + .../routes/filament/admin/resources/index.ts | 2 + .../admin/resources/services/index.ts | 269 ++++++++++++++++++ 26 files changed, 840 insertions(+), 7 deletions(-) create mode 100644 app/Filament/Resources/Members/Widgets/MemberCount.php create mode 100644 app/Filament/Resources/Memberships/Widgets/MembershipsChart.php create mode 100644 app/Filament/Resources/Users/Pages/CreateUser.php create mode 100644 app/Filament/Resources/Users/Pages/EditUser.php create mode 100644 app/Filament/Resources/Users/Pages/ListUsers.php create mode 100644 app/Filament/Resources/Users/Schemas/UserForm.php create mode 100644 app/Filament/Resources/Users/Tables/UsersTable.php create mode 100644 app/Filament/Resources/Users/UserResource.php create mode 100644 resources/js/actions/App/Filament/Resources/Services/Pages/CreateService.ts create mode 100644 resources/js/actions/App/Filament/Resources/Services/Pages/EditService.ts create mode 100644 resources/js/actions/App/Filament/Resources/Services/Pages/ListServices.ts create mode 100644 resources/js/actions/App/Filament/Resources/Services/Pages/index.ts create mode 100644 resources/js/actions/App/Filament/Resources/Services/index.ts create mode 100644 resources/js/routes/filament/admin/resources/services/index.ts diff --git a/app/Filament/Resources/MemberGroups/MemberGroupResource.php b/app/Filament/Resources/MemberGroups/MemberGroupResource.php index 235f3ff..6ed3a83 100644 --- a/app/Filament/Resources/MemberGroups/MemberGroupResource.php +++ b/app/Filament/Resources/MemberGroups/MemberGroupResource.php @@ -18,6 +18,8 @@ class MemberGroupResource extends Resource { protected static ?string $model = MemberGroup::class; + protected static string|null|\UnitEnum $navigationGroup = 'Administration'; + protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedGlobeEuropeAfrica; public static function form(Schema $schema): Schema diff --git a/app/Filament/Resources/Members/MemberResource.php b/app/Filament/Resources/Members/MemberResource.php index 0006b69..e7d97b1 100644 --- a/app/Filament/Resources/Members/MemberResource.php +++ b/app/Filament/Resources/Members/MemberResource.php @@ -18,6 +18,8 @@ class MemberResource extends Resource { protected static ?string $model = Member::class; + protected static string|null|\UnitEnum $navigationGroup = 'Administration'; + protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedUserGroup; public static function form(Schema $schema): Schema @@ -55,4 +57,5 @@ class MemberResource extends Resource { return Member::getAttributeLabel('members'); } + } diff --git a/app/Filament/Resources/Members/Widgets/MemberCount.php b/app/Filament/Resources/Members/Widgets/MemberCount.php new file mode 100644 index 0000000..ed44924 --- /dev/null +++ b/app/Filament/Resources/Members/Widgets/MemberCount.php @@ -0,0 +1,22 @@ +description(Member::getAttributeLabel('widgets.stats.description')) + ->descriptionIcon('heroicon-o-user-group', IconPosition::Before) + ->chart([7, 2, 10, 3, 15, 4, 17]) + ->color('primary') + ]; + } +} diff --git a/app/Filament/Resources/Memberships/MembershipResource.php b/app/Filament/Resources/Memberships/MembershipResource.php index aefab26..4535ff4 100644 --- a/app/Filament/Resources/Memberships/MembershipResource.php +++ b/app/Filament/Resources/Memberships/MembershipResource.php @@ -18,6 +18,8 @@ class MembershipResource extends Resource { protected static ?string $model = Membership::class; + protected static string|null|\UnitEnum $navigationGroup = 'Administration'; + protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedIdentification; public static function form(Schema $schema): Schema diff --git a/app/Filament/Resources/Memberships/Widgets/MembershipsChart.php b/app/Filament/Resources/Memberships/Widgets/MembershipsChart.php new file mode 100644 index 0000000..b2af3de --- /dev/null +++ b/app/Filament/Resources/Memberships/Widgets/MembershipsChart.php @@ -0,0 +1,38 @@ +selectRaw('status, count(*) as total') + ->groupBy('status') + ->get(); + + return [ + 'datasets' => [ + [ + 'data' => $memberships->pluck('total')->toArray(), + 'backgroundColor' => [ + 'rgb(54, 162, 235)', + 'rgb(255, 99, 132)', + 'rgb(255, 205, 86)', + ], + ], + ], + 'labels' => $memberships->pluck('status')->toArray(), + ]; + } + + protected function getType(): string + { + return 'doughnut'; + } +} diff --git a/app/Filament/Resources/Packages/PackageResource.php b/app/Filament/Resources/Packages/PackageResource.php index acf4aa9..b4419b1 100644 --- a/app/Filament/Resources/Packages/PackageResource.php +++ b/app/Filament/Resources/Packages/PackageResource.php @@ -20,6 +20,8 @@ class PackageResource extends Resource { protected static ?string $model = Package::class; + protected static string|null|\UnitEnum $navigationGroup = 'Modules'; + protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedShoppingCart; public static function form(Schema $schema): Schema diff --git a/app/Filament/Resources/Services/ServiceResource.php b/app/Filament/Resources/Services/ServiceResource.php index 2250aee..4f79fee 100644 --- a/app/Filament/Resources/Services/ServiceResource.php +++ b/app/Filament/Resources/Services/ServiceResource.php @@ -18,6 +18,8 @@ class ServiceResource extends Resource { protected static ?string $model = Service::class; + protected static string|null|\UnitEnum $navigationGroup = 'Modules'; + protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedPuzzlePiece; public static function form(Schema $schema): Schema diff --git a/app/Filament/Resources/Users/Pages/CreateUser.php b/app/Filament/Resources/Users/Pages/CreateUser.php new file mode 100644 index 0000000..125b3ff --- /dev/null +++ b/app/Filament/Resources/Users/Pages/CreateUser.php @@ -0,0 +1,11 @@ +components([ + TextInput::make('name') + ->required(), + TextInput::make('email') + ->label('Email address') + ->email() + ->required(), + DateTimePicker::make('email_verified_at'), + TextInput::make('password') + ->password() + ->required(), + ]); + } +} diff --git a/app/Filament/Resources/Users/Tables/UsersTable.php b/app/Filament/Resources/Users/Tables/UsersTable.php new file mode 100644 index 0000000..e0da462 --- /dev/null +++ b/app/Filament/Resources/Users/Tables/UsersTable.php @@ -0,0 +1,46 @@ +columns([ + TextColumn::make('name') + ->searchable(), + TextColumn::make('email') + ->label('Email address') + ->searchable(), + TextColumn::make('email_verified_at') + ->dateTime() + ->sortable(), + TextColumn::make('created_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + TextColumn::make('updated_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + ]) + ->filters([ + // + ]) + ->recordActions([ + EditAction::make(), + ]) + ->toolbarActions([ + BulkActionGroup::make([ + DeleteBulkAction::make(), + ]), + ]); + } +} diff --git a/app/Filament/Resources/Users/UserResource.php b/app/Filament/Resources/Users/UserResource.php new file mode 100644 index 0000000..f1b9dfc --- /dev/null +++ b/app/Filament/Resources/Users/UserResource.php @@ -0,0 +1,49 @@ + ListUsers::route('/'), + 'create' => CreateUser::route('/create'), + 'edit' => EditUser::route('/{record}/edit'), + ]; + } +} diff --git a/app/Models/User.php b/app/Models/User.php index 69a950c..62864f8 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -48,6 +48,18 @@ class User extends Authenticatable ]; } + + public static function getAttributeLabel(string $attribute): string + { + return __("users.fields.' . $attribute"); + } + + /*public static function getRoleLabel(string $role): string + { + return __("roles.fields.' . $role"); + }*/ + + public function members(): hasMany { return $this->hasMany(Member::class); diff --git a/app/Providers/Filament/AdminPanelProvider.php b/app/Providers/Filament/AdminPanelProvider.php index 06fd663..a632667 100644 --- a/app/Providers/Filament/AdminPanelProvider.php +++ b/app/Providers/Filament/AdminPanelProvider.php @@ -3,6 +3,8 @@ namespace App\Providers\Filament; use Andreia\FilamentNordTheme\FilamentNordThemePlugin; +use App\Filament\Resources\Members\Widgets\MemberCount; +use App\Filament\Resources\Memberships\Widgets\MembershipsChart; use Filament\Http\Middleware\Authenticate; use Filament\Http\Middleware\AuthenticateSession; use Filament\Http\Middleware\DisableBladeIconComponents; @@ -42,6 +44,8 @@ class AdminPanelProvider extends PanelProvider ->widgets([ AccountWidget::class, FilamentInfoWidget::class, + MemberCount::class, + //MembershipsChart::class, ]) ->middleware([ EncryptCookies::class, diff --git a/lang/en/users.php b/lang/en/users.php index 928c8b6..ac3f05e 100644 --- a/lang/en/users.php +++ b/lang/en/users.php @@ -2,13 +2,12 @@ return [ 'fields' => [ - 'user' => 'Utilisateur', - 'users' => 'Utilisateurs', - 'name' => 'Nom', + 'user' => 'User', + 'users' => 'Users', + 'name' => 'Name', 'email' => 'Email', - 'email_verified_at' => 'Email vérifié le', - 'password' => '', - 'password_confirmation' => '', - 'role' => 'Rôle' + 'email_verified_at' => 'Email verified at', + 'password' => 'Password', + 'role' => 'Role' ] ]; diff --git a/lang/fr/members.php b/lang/fr/members.php index 4141871..56f1dd6 100644 --- a/lang/fr/members.php +++ b/lang/fr/members.php @@ -32,5 +32,11 @@ return [ 'created_at' => 'Créé le', 'updated_at' => 'Mis à jour le', 'deleted_at' => 'Supprimé le', + 'widgets' => [ + 'stats' => [ + 'name' => 'Nouveaux Membres', + 'description' => 'Nombre de nouveaux membres par jour', + ] + ] ], ]; diff --git a/lang/fr/users.php b/lang/fr/users.php index b3d9bbc..c5e16b3 100644 --- a/lang/fr/users.php +++ b/lang/fr/users.php @@ -1 +1,13 @@ [ + 'user' => 'Utilisateur', + 'users' => 'Utilisateurs', + 'name' => 'Nom', + 'email' => 'Email', + 'email_verified_at' => 'Email vérifié le', + 'password' => 'Mot de passe', + 'role' => 'Rôle' + ] +]; diff --git a/resources/js/actions/App/Filament/Resources/Services/Pages/CreateService.ts b/resources/js/actions/App/Filament/Resources/Services/Pages/CreateService.ts new file mode 100644 index 0000000..231f94d --- /dev/null +++ b/resources/js/actions/App/Filament/Resources/Services/Pages/CreateService.ts @@ -0,0 +1,83 @@ +import { queryParams, type RouteQueryOptions, type RouteDefinition, type RouteFormDefinition } from './../../../../../../wayfinder' +/** +* @see \App\Filament\Resources\Services\Pages\CreateService::__invoke +* @see app/Filament/Resources/Services/Pages/CreateService.php:7 +* @route '/admin/services/create' +*/ +const CreateService = (options?: RouteQueryOptions): RouteDefinition<'get'> => ({ + url: CreateService.url(options), + method: 'get', +}) + +CreateService.definition = { + methods: ["get","head"], + url: '/admin/services/create', +} satisfies RouteDefinition<["get","head"]> + +/** +* @see \App\Filament\Resources\Services\Pages\CreateService::__invoke +* @see app/Filament/Resources/Services/Pages/CreateService.php:7 +* @route '/admin/services/create' +*/ +CreateService.url = (options?: RouteQueryOptions) => { + return CreateService.definition.url + queryParams(options) +} + +/** +* @see \App\Filament\Resources\Services\Pages\CreateService::__invoke +* @see app/Filament/Resources/Services/Pages/CreateService.php:7 +* @route '/admin/services/create' +*/ +CreateService.get = (options?: RouteQueryOptions): RouteDefinition<'get'> => ({ + url: CreateService.url(options), + method: 'get', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\CreateService::__invoke +* @see app/Filament/Resources/Services/Pages/CreateService.php:7 +* @route '/admin/services/create' +*/ +CreateService.head = (options?: RouteQueryOptions): RouteDefinition<'head'> => ({ + url: CreateService.url(options), + method: 'head', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\CreateService::__invoke +* @see app/Filament/Resources/Services/Pages/CreateService.php:7 +* @route '/admin/services/create' +*/ +const CreateServiceForm = (options?: RouteQueryOptions): RouteFormDefinition<'get'> => ({ + action: CreateService.url(options), + method: 'get', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\CreateService::__invoke +* @see app/Filament/Resources/Services/Pages/CreateService.php:7 +* @route '/admin/services/create' +*/ +CreateServiceForm.get = (options?: RouteQueryOptions): RouteFormDefinition<'get'> => ({ + action: CreateService.url(options), + method: 'get', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\CreateService::__invoke +* @see app/Filament/Resources/Services/Pages/CreateService.php:7 +* @route '/admin/services/create' +*/ +CreateServiceForm.head = (options?: RouteQueryOptions): RouteFormDefinition<'get'> => ({ + action: CreateService.url({ + [options?.mergeQuery ? 'mergeQuery' : 'query']: { + _method: 'HEAD', + ...(options?.query ?? options?.mergeQuery ?? {}), + } + }), + method: 'get', +}) + +CreateService.form = CreateServiceForm + +export default CreateService \ No newline at end of file diff --git a/resources/js/actions/App/Filament/Resources/Services/Pages/EditService.ts b/resources/js/actions/App/Filament/Resources/Services/Pages/EditService.ts new file mode 100644 index 0000000..ecf68c3 --- /dev/null +++ b/resources/js/actions/App/Filament/Resources/Services/Pages/EditService.ts @@ -0,0 +1,101 @@ +import { queryParams, type RouteQueryOptions, type RouteDefinition, type RouteFormDefinition, applyUrlDefaults } from './../../../../../../wayfinder' +/** +* @see \App\Filament\Resources\Services\Pages\EditService::__invoke +* @see app/Filament/Resources/Services/Pages/EditService.php:7 +* @route '/admin/services/{record}/edit' +*/ +const EditService = (args: { record: string | number } | [record: string | number ] | string | number, options?: RouteQueryOptions): RouteDefinition<'get'> => ({ + url: EditService.url(args, options), + method: 'get', +}) + +EditService.definition = { + methods: ["get","head"], + url: '/admin/services/{record}/edit', +} satisfies RouteDefinition<["get","head"]> + +/** +* @see \App\Filament\Resources\Services\Pages\EditService::__invoke +* @see app/Filament/Resources/Services/Pages/EditService.php:7 +* @route '/admin/services/{record}/edit' +*/ +EditService.url = (args: { record: string | number } | [record: string | number ] | string | number, options?: RouteQueryOptions) => { + if (typeof args === 'string' || typeof args === 'number') { + args = { record: args } + } + + if (Array.isArray(args)) { + args = { + record: args[0], + } + } + + args = applyUrlDefaults(args) + + const parsedArgs = { + record: args.record, + } + + return EditService.definition.url + .replace('{record}', parsedArgs.record.toString()) + .replace(/\/+$/, '') + queryParams(options) +} + +/** +* @see \App\Filament\Resources\Services\Pages\EditService::__invoke +* @see app/Filament/Resources/Services/Pages/EditService.php:7 +* @route '/admin/services/{record}/edit' +*/ +EditService.get = (args: { record: string | number } | [record: string | number ] | string | number, options?: RouteQueryOptions): RouteDefinition<'get'> => ({ + url: EditService.url(args, options), + method: 'get', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\EditService::__invoke +* @see app/Filament/Resources/Services/Pages/EditService.php:7 +* @route '/admin/services/{record}/edit' +*/ +EditService.head = (args: { record: string | number } | [record: string | number ] | string | number, options?: RouteQueryOptions): RouteDefinition<'head'> => ({ + url: EditService.url(args, options), + method: 'head', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\EditService::__invoke +* @see app/Filament/Resources/Services/Pages/EditService.php:7 +* @route '/admin/services/{record}/edit' +*/ +const EditServiceForm = (args: { record: string | number } | [record: string | number ] | string | number, options?: RouteQueryOptions): RouteFormDefinition<'get'> => ({ + action: EditService.url(args, options), + method: 'get', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\EditService::__invoke +* @see app/Filament/Resources/Services/Pages/EditService.php:7 +* @route '/admin/services/{record}/edit' +*/ +EditServiceForm.get = (args: { record: string | number } | [record: string | number ] | string | number, options?: RouteQueryOptions): RouteFormDefinition<'get'> => ({ + action: EditService.url(args, options), + method: 'get', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\EditService::__invoke +* @see app/Filament/Resources/Services/Pages/EditService.php:7 +* @route '/admin/services/{record}/edit' +*/ +EditServiceForm.head = (args: { record: string | number } | [record: string | number ] | string | number, options?: RouteQueryOptions): RouteFormDefinition<'get'> => ({ + action: EditService.url(args, { + [options?.mergeQuery ? 'mergeQuery' : 'query']: { + _method: 'HEAD', + ...(options?.query ?? options?.mergeQuery ?? {}), + } + }), + method: 'get', +}) + +EditService.form = EditServiceForm + +export default EditService \ No newline at end of file diff --git a/resources/js/actions/App/Filament/Resources/Services/Pages/ListServices.ts b/resources/js/actions/App/Filament/Resources/Services/Pages/ListServices.ts new file mode 100644 index 0000000..28642b9 --- /dev/null +++ b/resources/js/actions/App/Filament/Resources/Services/Pages/ListServices.ts @@ -0,0 +1,83 @@ +import { queryParams, type RouteQueryOptions, type RouteDefinition, type RouteFormDefinition } from './../../../../../../wayfinder' +/** +* @see \App\Filament\Resources\Services\Pages\ListServices::__invoke +* @see app/Filament/Resources/Services/Pages/ListServices.php:7 +* @route '/admin/services' +*/ +const ListServices = (options?: RouteQueryOptions): RouteDefinition<'get'> => ({ + url: ListServices.url(options), + method: 'get', +}) + +ListServices.definition = { + methods: ["get","head"], + url: '/admin/services', +} satisfies RouteDefinition<["get","head"]> + +/** +* @see \App\Filament\Resources\Services\Pages\ListServices::__invoke +* @see app/Filament/Resources/Services/Pages/ListServices.php:7 +* @route '/admin/services' +*/ +ListServices.url = (options?: RouteQueryOptions) => { + return ListServices.definition.url + queryParams(options) +} + +/** +* @see \App\Filament\Resources\Services\Pages\ListServices::__invoke +* @see app/Filament/Resources/Services/Pages/ListServices.php:7 +* @route '/admin/services' +*/ +ListServices.get = (options?: RouteQueryOptions): RouteDefinition<'get'> => ({ + url: ListServices.url(options), + method: 'get', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\ListServices::__invoke +* @see app/Filament/Resources/Services/Pages/ListServices.php:7 +* @route '/admin/services' +*/ +ListServices.head = (options?: RouteQueryOptions): RouteDefinition<'head'> => ({ + url: ListServices.url(options), + method: 'head', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\ListServices::__invoke +* @see app/Filament/Resources/Services/Pages/ListServices.php:7 +* @route '/admin/services' +*/ +const ListServicesForm = (options?: RouteQueryOptions): RouteFormDefinition<'get'> => ({ + action: ListServices.url(options), + method: 'get', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\ListServices::__invoke +* @see app/Filament/Resources/Services/Pages/ListServices.php:7 +* @route '/admin/services' +*/ +ListServicesForm.get = (options?: RouteQueryOptions): RouteFormDefinition<'get'> => ({ + action: ListServices.url(options), + method: 'get', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\ListServices::__invoke +* @see app/Filament/Resources/Services/Pages/ListServices.php:7 +* @route '/admin/services' +*/ +ListServicesForm.head = (options?: RouteQueryOptions): RouteFormDefinition<'get'> => ({ + action: ListServices.url({ + [options?.mergeQuery ? 'mergeQuery' : 'query']: { + _method: 'HEAD', + ...(options?.query ?? options?.mergeQuery ?? {}), + } + }), + method: 'get', +}) + +ListServices.form = ListServicesForm + +export default ListServices \ No newline at end of file diff --git a/resources/js/actions/App/Filament/Resources/Services/Pages/index.ts b/resources/js/actions/App/Filament/Resources/Services/Pages/index.ts new file mode 100644 index 0000000..af6eeec --- /dev/null +++ b/resources/js/actions/App/Filament/Resources/Services/Pages/index.ts @@ -0,0 +1,11 @@ +import ListServices from './ListServices' +import CreateService from './CreateService' +import EditService from './EditService' + +const Pages = { + ListServices: Object.assign(ListServices, ListServices), + CreateService: Object.assign(CreateService, CreateService), + EditService: Object.assign(EditService, EditService), +} + +export default Pages \ No newline at end of file diff --git a/resources/js/actions/App/Filament/Resources/Services/index.ts b/resources/js/actions/App/Filament/Resources/Services/index.ts new file mode 100644 index 0000000..3245f9f --- /dev/null +++ b/resources/js/actions/App/Filament/Resources/Services/index.ts @@ -0,0 +1,7 @@ +import Pages from './Pages' + +const Services = { + Pages: Object.assign(Pages, Pages), +} + +export default Services \ No newline at end of file diff --git a/resources/js/actions/App/Filament/Resources/index.ts b/resources/js/actions/App/Filament/Resources/index.ts index 53b7370..703f270 100644 --- a/resources/js/actions/App/Filament/Resources/index.ts +++ b/resources/js/actions/App/Filament/Resources/index.ts @@ -2,12 +2,14 @@ import MemberGroups from './MemberGroups' import Members from './Members' import Memberships from './Memberships' import Packages from './Packages' +import Services from './Services' const Resources = { MemberGroups: Object.assign(MemberGroups, MemberGroups), Members: Object.assign(Members, Members), Memberships: Object.assign(Memberships, Memberships), Packages: Object.assign(Packages, Packages), + Services: Object.assign(Services, Services), } export default Resources \ No newline at end of file diff --git a/resources/js/routes/filament/admin/resources/index.ts b/resources/js/routes/filament/admin/resources/index.ts index 16cb0f1..95288c2 100644 --- a/resources/js/routes/filament/admin/resources/index.ts +++ b/resources/js/routes/filament/admin/resources/index.ts @@ -2,12 +2,14 @@ import memberGroups from './member-groups' import members from './members' import memberships from './memberships' import packages from './packages' +import services from './services' const resources = { memberGroups: Object.assign(memberGroups, memberGroups), members: Object.assign(members, members), memberships: Object.assign(memberships, memberships), packages: Object.assign(packages, packages), + services: Object.assign(services, services), } export default resources \ No newline at end of file diff --git a/resources/js/routes/filament/admin/resources/services/index.ts b/resources/js/routes/filament/admin/resources/services/index.ts new file mode 100644 index 0000000..7521000 --- /dev/null +++ b/resources/js/routes/filament/admin/resources/services/index.ts @@ -0,0 +1,269 @@ +import { queryParams, type RouteQueryOptions, type RouteDefinition, type RouteFormDefinition, applyUrlDefaults } from './../../../../../wayfinder' +/** +* @see \App\Filament\Resources\Services\Pages\ListServices::__invoke +* @see app/Filament/Resources/Services/Pages/ListServices.php:7 +* @route '/admin/services' +*/ +export const index = (options?: RouteQueryOptions): RouteDefinition<'get'> => ({ + url: index.url(options), + method: 'get', +}) + +index.definition = { + methods: ["get","head"], + url: '/admin/services', +} satisfies RouteDefinition<["get","head"]> + +/** +* @see \App\Filament\Resources\Services\Pages\ListServices::__invoke +* @see app/Filament/Resources/Services/Pages/ListServices.php:7 +* @route '/admin/services' +*/ +index.url = (options?: RouteQueryOptions) => { + return index.definition.url + queryParams(options) +} + +/** +* @see \App\Filament\Resources\Services\Pages\ListServices::__invoke +* @see app/Filament/Resources/Services/Pages/ListServices.php:7 +* @route '/admin/services' +*/ +index.get = (options?: RouteQueryOptions): RouteDefinition<'get'> => ({ + url: index.url(options), + method: 'get', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\ListServices::__invoke +* @see app/Filament/Resources/Services/Pages/ListServices.php:7 +* @route '/admin/services' +*/ +index.head = (options?: RouteQueryOptions): RouteDefinition<'head'> => ({ + url: index.url(options), + method: 'head', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\ListServices::__invoke +* @see app/Filament/Resources/Services/Pages/ListServices.php:7 +* @route '/admin/services' +*/ +const indexForm = (options?: RouteQueryOptions): RouteFormDefinition<'get'> => ({ + action: index.url(options), + method: 'get', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\ListServices::__invoke +* @see app/Filament/Resources/Services/Pages/ListServices.php:7 +* @route '/admin/services' +*/ +indexForm.get = (options?: RouteQueryOptions): RouteFormDefinition<'get'> => ({ + action: index.url(options), + method: 'get', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\ListServices::__invoke +* @see app/Filament/Resources/Services/Pages/ListServices.php:7 +* @route '/admin/services' +*/ +indexForm.head = (options?: RouteQueryOptions): RouteFormDefinition<'get'> => ({ + action: index.url({ + [options?.mergeQuery ? 'mergeQuery' : 'query']: { + _method: 'HEAD', + ...(options?.query ?? options?.mergeQuery ?? {}), + } + }), + method: 'get', +}) + +index.form = indexForm + +/** +* @see \App\Filament\Resources\Services\Pages\CreateService::__invoke +* @see app/Filament/Resources/Services/Pages/CreateService.php:7 +* @route '/admin/services/create' +*/ +export const create = (options?: RouteQueryOptions): RouteDefinition<'get'> => ({ + url: create.url(options), + method: 'get', +}) + +create.definition = { + methods: ["get","head"], + url: '/admin/services/create', +} satisfies RouteDefinition<["get","head"]> + +/** +* @see \App\Filament\Resources\Services\Pages\CreateService::__invoke +* @see app/Filament/Resources/Services/Pages/CreateService.php:7 +* @route '/admin/services/create' +*/ +create.url = (options?: RouteQueryOptions) => { + return create.definition.url + queryParams(options) +} + +/** +* @see \App\Filament\Resources\Services\Pages\CreateService::__invoke +* @see app/Filament/Resources/Services/Pages/CreateService.php:7 +* @route '/admin/services/create' +*/ +create.get = (options?: RouteQueryOptions): RouteDefinition<'get'> => ({ + url: create.url(options), + method: 'get', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\CreateService::__invoke +* @see app/Filament/Resources/Services/Pages/CreateService.php:7 +* @route '/admin/services/create' +*/ +create.head = (options?: RouteQueryOptions): RouteDefinition<'head'> => ({ + url: create.url(options), + method: 'head', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\CreateService::__invoke +* @see app/Filament/Resources/Services/Pages/CreateService.php:7 +* @route '/admin/services/create' +*/ +const createForm = (options?: RouteQueryOptions): RouteFormDefinition<'get'> => ({ + action: create.url(options), + method: 'get', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\CreateService::__invoke +* @see app/Filament/Resources/Services/Pages/CreateService.php:7 +* @route '/admin/services/create' +*/ +createForm.get = (options?: RouteQueryOptions): RouteFormDefinition<'get'> => ({ + action: create.url(options), + method: 'get', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\CreateService::__invoke +* @see app/Filament/Resources/Services/Pages/CreateService.php:7 +* @route '/admin/services/create' +*/ +createForm.head = (options?: RouteQueryOptions): RouteFormDefinition<'get'> => ({ + action: create.url({ + [options?.mergeQuery ? 'mergeQuery' : 'query']: { + _method: 'HEAD', + ...(options?.query ?? options?.mergeQuery ?? {}), + } + }), + method: 'get', +}) + +create.form = createForm + +/** +* @see \App\Filament\Resources\Services\Pages\EditService::__invoke +* @see app/Filament/Resources/Services/Pages/EditService.php:7 +* @route '/admin/services/{record}/edit' +*/ +export const edit = (args: { record: string | number } | [record: string | number ] | string | number, options?: RouteQueryOptions): RouteDefinition<'get'> => ({ + url: edit.url(args, options), + method: 'get', +}) + +edit.definition = { + methods: ["get","head"], + url: '/admin/services/{record}/edit', +} satisfies RouteDefinition<["get","head"]> + +/** +* @see \App\Filament\Resources\Services\Pages\EditService::__invoke +* @see app/Filament/Resources/Services/Pages/EditService.php:7 +* @route '/admin/services/{record}/edit' +*/ +edit.url = (args: { record: string | number } | [record: string | number ] | string | number, options?: RouteQueryOptions) => { + if (typeof args === 'string' || typeof args === 'number') { + args = { record: args } + } + + if (Array.isArray(args)) { + args = { + record: args[0], + } + } + + args = applyUrlDefaults(args) + + const parsedArgs = { + record: args.record, + } + + return edit.definition.url + .replace('{record}', parsedArgs.record.toString()) + .replace(/\/+$/, '') + queryParams(options) +} + +/** +* @see \App\Filament\Resources\Services\Pages\EditService::__invoke +* @see app/Filament/Resources/Services/Pages/EditService.php:7 +* @route '/admin/services/{record}/edit' +*/ +edit.get = (args: { record: string | number } | [record: string | number ] | string | number, options?: RouteQueryOptions): RouteDefinition<'get'> => ({ + url: edit.url(args, options), + method: 'get', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\EditService::__invoke +* @see app/Filament/Resources/Services/Pages/EditService.php:7 +* @route '/admin/services/{record}/edit' +*/ +edit.head = (args: { record: string | number } | [record: string | number ] | string | number, options?: RouteQueryOptions): RouteDefinition<'head'> => ({ + url: edit.url(args, options), + method: 'head', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\EditService::__invoke +* @see app/Filament/Resources/Services/Pages/EditService.php:7 +* @route '/admin/services/{record}/edit' +*/ +const editForm = (args: { record: string | number } | [record: string | number ] | string | number, options?: RouteQueryOptions): RouteFormDefinition<'get'> => ({ + action: edit.url(args, options), + method: 'get', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\EditService::__invoke +* @see app/Filament/Resources/Services/Pages/EditService.php:7 +* @route '/admin/services/{record}/edit' +*/ +editForm.get = (args: { record: string | number } | [record: string | number ] | string | number, options?: RouteQueryOptions): RouteFormDefinition<'get'> => ({ + action: edit.url(args, options), + method: 'get', +}) + +/** +* @see \App\Filament\Resources\Services\Pages\EditService::__invoke +* @see app/Filament/Resources/Services/Pages/EditService.php:7 +* @route '/admin/services/{record}/edit' +*/ +editForm.head = (args: { record: string | number } | [record: string | number ] | string | number, options?: RouteQueryOptions): RouteFormDefinition<'get'> => ({ + action: edit.url(args, { + [options?.mergeQuery ? 'mergeQuery' : 'query']: { + _method: 'HEAD', + ...(options?.query ?? options?.mergeQuery ?? {}), + } + }), + method: 'get', +}) + +edit.form = editForm + +const services = { + index: Object.assign(index, index), + create: Object.assign(create, create), + edit: Object.assign(edit, edit), +} + +export default services \ No newline at end of file