From 6791ac540723f89c101cf3d2de9c2dec750e1b29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anna-Sara=20S=C3=A9lea?= Date: Sat, 15 Nov 2025 17:07:19 +0100 Subject: [PATCH] Volunteer resource --- .../Volunteers/Pages/CreateVolunteer.php | 13 +++ .../Volunteers/Pages/EditVolunteer.php | 21 ++++ .../Volunteers/Pages/ListVolunteers.php | 19 +++ .../Volunteers/Schemas/VolunteerForm.php | 50 ++++++++ .../Volunteers/Tables/VolunteersTable.php | 109 ++++++++++++++++++ .../Volunteers/VolunteerResource.php | 48 ++++++++ app/Http/Controllers/VolunteerController.php | 51 ++++++++ app/Models/Volunteer.php | 82 +++++++++++++ ...15_create_personal_access_tokens_table.php | 33 ++++++ ...5_10_27_165817_create_volunteers_table.php | 36 ++++++ 10 files changed, 462 insertions(+) create mode 100644 app/Filament/Resources/Volunteers/Pages/CreateVolunteer.php create mode 100644 app/Filament/Resources/Volunteers/Pages/EditVolunteer.php create mode 100644 app/Filament/Resources/Volunteers/Pages/ListVolunteers.php create mode 100644 app/Filament/Resources/Volunteers/Schemas/VolunteerForm.php create mode 100644 app/Filament/Resources/Volunteers/Tables/VolunteersTable.php create mode 100644 app/Filament/Resources/Volunteers/VolunteerResource.php create mode 100644 app/Http/Controllers/VolunteerController.php create mode 100644 app/Models/Volunteer.php create mode 100644 database/migrations/2025_10_19_130615_create_personal_access_tokens_table.php create mode 100644 database/migrations/2025_10_27_165817_create_volunteers_table.php diff --git a/app/Filament/Resources/Volunteers/Pages/CreateVolunteer.php b/app/Filament/Resources/Volunteers/Pages/CreateVolunteer.php new file mode 100644 index 0000000..ba130b7 --- /dev/null +++ b/app/Filament/Resources/Volunteers/Pages/CreateVolunteer.php @@ -0,0 +1,13 @@ +components([ + GazeBanner::make() + ->pollTimer(10) + ->hideOnCreate(), + TextInput::make('lan_id') + ->integer(), + Toggle::make('gdpr') + ->columnSpan('full') + ->required(), + TextInput::make('first_name') + ->required(), + TextInput::make('surname') + ->required(), + TextInput::make('phone') + ->tel() + ->required(), + TextInput::make('email') + ->label('Email address') + ->email() + ->required(), + + CheckboxList::make('areas') + ->required() + ->columnSpan('full') + ->options([ + 'Städ' => 'Städ', + 'Säkerhet' => 'Säkerhet', + 'Kiosk' => 'Kiosk', + ]), + Textarea::make('comment') + ->columnSpan('full'), + ]); + } +} diff --git a/app/Filament/Resources/Volunteers/Tables/VolunteersTable.php b/app/Filament/Resources/Volunteers/Tables/VolunteersTable.php new file mode 100644 index 0000000..b766853 --- /dev/null +++ b/app/Filament/Resources/Volunteers/Tables/VolunteersTable.php @@ -0,0 +1,109 @@ +recordAction(null) + ->columns([ + TextColumn::make('lan_id') + ->label('ID') + ->searchable() + ->sortable(), + IconColumn::make('emailed') + ->boolean() + ->sortable(), + TextColumn::make('first_name') + ->searchable() + ->sortable(), + TextColumn::make('surname') + ->searchable() + ->sortable(), + TextColumn::make('phone') + ->searchable() + ->sortable(), + TextColumn::make('email') + ->label('Email address') + ->searchable() + ->sortable(), + TextColumn::make('areas') + ->label('Areas') + ->searchable() + ->sortable(), + IconColumn::make('gdpr') + ->boolean() + ->sortable(), + TextColumn::make('comment') + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + TextColumn::make('created_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + TextColumn::make('updated_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + ]) + ->filters([ + // + ]) + ->recordActions([ + EditAction::make() + ->modalWidth() + ->slideOver(), + Action::make('sendEmail') + ->label('Send email') + ->icon(Heroicon::Envelope) + ->schema([ + Select::make('mailtemplate') + ->label('Mailtemplate') + ->options(Mailtemplate::all()->pluck('title', 'id')) + ]) + ->action(function (array $data, Volunteer $record) { + $mailContent = Mailtemplate::where('id', $data['mailtemplate'])->get(); + Mail::to($record->email) + ->send(new LanMail($mailContent, $record)); + Volunteer::where('id', $record->id)->update(['emailed' => true]); + }) + ->hidden(fn($record) => $record->emailed), + Action::make('sendRemindEmail') + ->label('Send remind email') + ->icon(Heroicon::Envelope) + ->schema([ + Select::make('mailtemplate') + ->label('Mailtemplate') + ->options(Mailtemplate::all()->pluck('title', 'id')) + ]) + ->action(function (array $data, Volunteer $record) { + $mailContent = Mailtemplate::where('id', $data['mailtemplate'])->get(); + Mail::to($record->email) + ->send(new LanMail($mailContent, $record)); + Volunteer::where('id', $record->id)->update(['emailed' => true]); + }) + ->hidden(fn($record) => !$record->emailed) + ]) + ->toolbarActions([ + BulkActionGroup::make([ + DeleteBulkAction::make(), + ]), + ]); + } +} diff --git a/app/Filament/Resources/Volunteers/VolunteerResource.php b/app/Filament/Resources/Volunteers/VolunteerResource.php new file mode 100644 index 0000000..9471553 --- /dev/null +++ b/app/Filament/Resources/Volunteers/VolunteerResource.php @@ -0,0 +1,48 @@ + ListVolunteers::route('/'), + 'create' => CreateVolunteer::route('/create'), + //'edit' => EditVolunteer::route('/{record}/edit'), + ]; + } +} diff --git a/app/Http/Controllers/VolunteerController.php b/app/Http/Controllers/VolunteerController.php new file mode 100644 index 0000000..4ca88a1 --- /dev/null +++ b/app/Http/Controllers/VolunteerController.php @@ -0,0 +1,51 @@ +ability; + + if ($ability === "key_1") { + + + $request->validate([ + 'first_name' => 'required', + 'surname' => 'required', + 'phone' => 'required', + 'email' => 'required', + 'gdpr' => 'required', + 'areas' => 'required', + ]); + + + Volunteer::create([ + 'first_name' => $request->first_name, + 'surname' => $request->surname, + 'phone' => $request->phone, + 'email' => $request->email, + 'gdpr' => $request->gdpr, + 'areas' => $request->areas, + ]); + + + return response()->json([ + 'success' => true, 'message' => 'Volunteer was created successfully' + ]); + + } + + return response()->json([ + 'success' => false, 'message' => 'Unauthorized' + ]); + + } +} diff --git a/app/Models/Volunteer.php b/app/Models/Volunteer.php new file mode 100644 index 0000000..a621e99 --- /dev/null +++ b/app/Models/Volunteer.php @@ -0,0 +1,82 @@ + + */ + protected function casts(): array + { + return [ + 'areas' => 'array', + ]; + } + + protected static function booted() + { + static::created(function ($post) { + $latest_version = Version::where('table', 'volunteers')->latest()->first(); + + if($latest_version) { + Version::create([ + 'table' => 'volunteers', + 'version' => $latest_version->version + 1, + ]); + } else { + Version::create([ + 'table' => 'volunteers', + 'version' => 1, + ]); + } + }); + static::updated(function ($post) { + $latest_version = Version::where('table', 'volunteers')->latest()->first(); + + if($latest_version) { + Version::create([ + 'table' => 'volunteers', + 'version' => $latest_version->version + 1, + ]); + } else { + Version::create([ + 'table' => 'volunteers', + 'version' => 1, + ]); + } + }); + static::deleted(function ($post) { + $latest_version = Version::where('table', 'volunteers')->latest()->first(); + + if($latest_version) { + Version::create([ + 'table' => 'volunteers', + 'version' => $latest_version->version + 1, + ]); + } else { + Version::create([ + 'table' => 'volunteers', + 'version' => 1, + ]); + } + }); + } + + +} diff --git a/database/migrations/2025_10_19_130615_create_personal_access_tokens_table.php b/database/migrations/2025_10_19_130615_create_personal_access_tokens_table.php new file mode 100644 index 0000000..40ff706 --- /dev/null +++ b/database/migrations/2025_10_19_130615_create_personal_access_tokens_table.php @@ -0,0 +1,33 @@ +id(); + $table->morphs('tokenable'); + $table->text('name'); + $table->string('token', 64)->unique(); + $table->text('abilities')->nullable(); + $table->timestamp('last_used_at')->nullable(); + $table->timestamp('expires_at')->nullable()->index(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('personal_access_tokens'); + } +}; diff --git a/database/migrations/2025_10_27_165817_create_volunteers_table.php b/database/migrations/2025_10_27_165817_create_volunteers_table.php new file mode 100644 index 0000000..2aaa6e9 --- /dev/null +++ b/database/migrations/2025_10_27_165817_create_volunteers_table.php @@ -0,0 +1,36 @@ +id(); + $table->integer('lan_id')->nullable(); + $table->string('first_name'); + $table->string('surname'); + $table->string('phone'); + $table->string('email'); + $table->boolean('gdpr')->default(false); + $table->json('areas'); + $table->boolean('emailed')->default(false); + $table->string('comment')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('volunteers'); + } +};