From ec815d8c26c746668ec5445b34a585ed198bd777 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 2 Feb 2026 01:31:37 +0000 Subject: [PATCH] add missing fields to admin time entry form and derive user/org from member, fixes #997 https://claude.ai/code/session_01CVi5hmyiPDpvEzzTD7RPr7 --- app/Filament/Resources/TimeEntryResource.php | 21 ++++++++++++++++++- .../Pages/CreateTimeEntry.php | 19 +++++++++++++++++ .../TimeEntryResource/Pages/EditTimeEntry.php | 19 +++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/app/Filament/Resources/TimeEntryResource.php b/app/Filament/Resources/TimeEntryResource.php index ffd133b3..f50d8967 100644 --- a/app/Filament/Resources/TimeEntryResource.php +++ b/app/Filament/Resources/TimeEntryResource.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace App\Filament\Resources; use App\Filament\Resources\TimeEntryResource\Pages; +use App\Models\Member; use App\Models\TimeEntry; use Filament\Forms\Components\DateTimePicker; use Filament\Forms\Components\Select; @@ -16,6 +17,7 @@ use Filament\Tables; use Filament\Tables\Columns\TextColumn; use Filament\Tables\Filters\SelectFilter; use Filament\Tables\Table; +use Illuminate\Database\Eloquent\Builder; class TimeEntryResource extends Resource { @@ -51,6 +53,20 @@ class TimeEntryResource extends Resource ->rules([ 'after_or_equal:start', ]), + Select::make('organization_id') + ->relationship(name: 'organization', titleAttribute: 'name') + ->searchable(['name']) + ->required(), + Select::make('member_id') + ->relationship( + name: 'member', + titleAttribute: 'id', + modifyQueryUsing: fn (Builder $query) => $query->with(['user', 'organization']) + ) + ->getOptionLabelFromRecordUsing(fn (Member $record): string => $record->user->email.' ('.$record->organization->name.')') + ->searchable() + ->preload() + ->required(), Select::make('user_id') ->relationship(name: 'user', titleAttribute: 'email') ->searchable(['name', 'email']) @@ -59,7 +75,10 @@ class TimeEntryResource extends Resource ->relationship(name: 'project', titleAttribute: 'name') ->searchable(['name']) ->nullable(), - // TODO + Select::make('task_id') + ->relationship(name: 'task', titleAttribute: 'name') + ->searchable(['name']) + ->nullable(), ]); } diff --git a/app/Filament/Resources/TimeEntryResource/Pages/CreateTimeEntry.php b/app/Filament/Resources/TimeEntryResource/Pages/CreateTimeEntry.php index 35a85daf..a8bb9498 100644 --- a/app/Filament/Resources/TimeEntryResource/Pages/CreateTimeEntry.php +++ b/app/Filament/Resources/TimeEntryResource/Pages/CreateTimeEntry.php @@ -5,9 +5,28 @@ declare(strict_types=1); namespace App\Filament\Resources\TimeEntryResource\Pages; use App\Filament\Resources\TimeEntryResource; +use App\Models\Member; use Filament\Resources\Pages\CreateRecord; class CreateTimeEntry extends CreateRecord { protected static string $resource = TimeEntryResource::class; + + /** + * @param array $data + * @return array + */ + protected function mutateFormDataBeforeCreate(array $data): array + { + if (isset($data['member_id'])) { + /** @var Member|null $member */ + $member = Member::query()->find($data['member_id']); + if ($member !== null) { + $data['user_id'] = $member->user_id; + $data['organization_id'] = $member->organization_id; + } + } + + return $data; + } } diff --git a/app/Filament/Resources/TimeEntryResource/Pages/EditTimeEntry.php b/app/Filament/Resources/TimeEntryResource/Pages/EditTimeEntry.php index 96105ecd..f8ef533f 100644 --- a/app/Filament/Resources/TimeEntryResource/Pages/EditTimeEntry.php +++ b/app/Filament/Resources/TimeEntryResource/Pages/EditTimeEntry.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace App\Filament\Resources\TimeEntryResource\Pages; use App\Filament\Resources\TimeEntryResource; +use App\Models\Member; use Filament\Actions; use Filament\Resources\Pages\EditRecord; @@ -19,4 +20,22 @@ class EditTimeEntry extends EditRecord ->icon('heroicon-m-trash'), ]; } + + /** + * @param array $data + * @return array + */ + protected function mutateFormDataBeforeSave(array $data): array + { + if (isset($data['member_id'])) { + /** @var Member|null $member */ + $member = Member::query()->find($data['member_id']); + if ($member !== null) { + $data['user_id'] = $member->user_id; + $data['organization_id'] = $member->organization_id; + } + } + + return $data; + } }