From aeb3b694e4041c91c668b8f73b03dc29a0e4050e Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Wed, 9 Jul 2025 11:00:31 +0530 Subject: [PATCH] Added filter functionality on view report --- app/Filament/Resources/LocatorResource.php | 162 ++++++++++++++++++++- 1 file changed, 158 insertions(+), 4 deletions(-) diff --git a/app/Filament/Resources/LocatorResource.php b/app/Filament/Resources/LocatorResource.php index 9efb7f411..920b540bf 100644 --- a/app/Filament/Resources/LocatorResource.php +++ b/app/Filament/Resources/LocatorResource.php @@ -8,14 +8,19 @@ use App\Filament\Resources\LocatorResource\Pages; use App\Filament\Resources\LocatorResource\RelationManagers; use App\Models\Locator; use App\Models\PalletValidation; +use App\Models\Plant; +use Filament\Forms\Components\DateTimePicker; +use Filament\Forms\Components\TextInput; use Filament\Forms\Get; use Filament\Tables\Actions\ImportAction; use Filament\Facades\Filament; use Filament\Forms; +use Filament\Forms\Components\Select; use Filament\Forms\Form; use Filament\Resources\Resource; use Filament\Tables; use Filament\Tables\Actions\ExportAction; +use Filament\Tables\Filters\Filter; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\SoftDeletingScope; @@ -139,34 +144,183 @@ class LocatorResource extends Resource return ($currentPage - 1) * $perPage + $rowLoop->iteration; }), Tables\Columns\TextColumn::make('plant.name') - ->numeric() - ->searchable() + ->label('Plant') + ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('locator_number') ->label('Locator Number') + ->alignCenter() ->searchable() ->sortable(), Tables\Columns\TextColumn::make('locator_quantity') ->label('Locator Quantity') + ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('operator_id') - ->label('Operator ID') - ->searchable() + ->label('Created By') + ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('created_at') + ->label('Created At') ->dateTime() + ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('updated_at') + ->label('Updated At') ->dateTime() + ->alignCenter() ->sortable(), Tables\Columns\TextColumn::make('deleted_at') + ->label('Deleted At') ->dateTime() + ->alignCenter() ->sortable() ->toggleable(isToggledHiddenByDefault: true), ]) ->filters([ Tables\Filters\TrashedFilter::make(), + Filter::make('advanced_filters') + ->label('Advanced Filters') + ->form([ + Select::make('Plant') + ->label('Select Plant') + ->nullable() + ->options(function () { + return Plant::pluck('name', 'id'); + }) + ->reactive() + ->afterStateUpdated(function ($state, callable $set, callable $get): void { + $set('locator_number', null); + $set('locator_quantity', null); + $set('created_from', null); + $set('created_to', null); + $set('created_by', null); + $set('updated_from', null); + $set('updated_to', null); + }), + Select::make('locator_number') + ->label('Locator Number') + ->options(function (callable $get) { + $plantId = $get('Plant'); + if (!$plantId) { + return []; + } + return Locator::where('plant_id', $plantId)->orderBy('locator_number', 'asc')->get()->unique('locator_number')->pluck('locator_number', 'locator_number')->toArray(); + // ->whereNotNull('locator_number') + // ->where('locator_number','!=', '') + }) + ->searchable() + ->reactive(), + Select::make('locator_quantity') + ->label('Locator Quantity') + ->options([ + 0 => 0, + 1 => 1, + 2 => 2, + ]) + ->reactive(), + DateTimePicker::make(name: 'created_from') + ->label('Created From') + ->placeholder(placeholder: 'Select From DateTime') + ->reactive() + ->native(false), + DateTimePicker::make('created_to') + ->label('Created To') + ->placeholder(placeholder: 'Select To DateTime') + ->reactive() + ->native(false), + TextInput::make('created_by') + ->label('Created By') + ->reactive() + ->placeholder(placeholder: 'Enter Created By'), + DateTimePicker::make(name: 'updated_from') + ->label('Updated From') + ->placeholder(placeholder: 'Select From DateTime') + ->reactive() + ->native(false), + DateTimePicker::make('updated_to') + ->label('Updated To') + ->placeholder(placeholder: 'Select To DateTime') + ->reactive() + ->native(false), + ]) + ->query(function ($query, array $data) { + // Hide all records initially if no filters are applied + if (empty($data['Plant']) && empty($data['locator_number']) && $data['locator_quantity'] == null && empty($data['created_from']) && empty($data['created_to']) && empty($data['created_by']) && empty($data['updated_from']) && empty($data['updated_to'])) { + return $query->whereRaw('1 = 0'); + } + + if (!empty($data['Plant'])) { //$plant = $data['Plant'] ?? null + $query->where('plant_id', $data['Plant']); + } + + if (!empty($data['locator_number'])) { + $query->where('locator_number', $data['locator_number']); + } + + if ($data['locator_quantity'] != null && $data['locator_quantity'] != '') { //isset($data['locator_quantity']) && + $query->where('locator_quantity', $data['locator_quantity']);//(int) + } + + if (!empty($data['created_from'])) { + $query->where('created_at', '>=', $data['created_from']); + } + + if (!empty($data['created_to'])) { + $query->where('created_at', '<=', $data['created_to']); + } + + if (!empty($data['created_by'])) { + $query->where('operator_id', $data['created_by']); + } + + if (!empty($data['updated_from'])) { + $query->where('updated_at', '>=', $data['updated_from']); + } + + if (!empty($data['updated_to'])) { + $query->where('updated_at', '<=', $data['updated_to']); + } + }) + ->indicateUsing(function (array $data) { + $indicators = []; + + if (!empty($data['Plant'])) { + $indicators[] = 'Plant: ' . Plant::where('id', $data['Plant'])->value('name'); + } + + if (!empty($data['locator_number'])) { + $indicators[] = 'Locator Number: ' . $data['locator_number']; + } + + if ($data['locator_quantity'] != null && $data['locator_quantity'] != '') { //isset($data['locator_quantity']) && + $indicators[] = 'Locator Quantity: ' . $data['locator_quantity']; + } + + if (!empty($data['created_from'])) { + $indicators[] = 'From: ' . $data['created_from']; + } + + if (!empty($data['created_to'])) { + $indicators[] = 'To: ' . $data['created_to']; + } + + if (!empty($data['created_by'])) { + $indicators[] = 'Created By: ' . $data['created_by']; + } + + if (!empty($data['updated_from'])) { + $indicators[] = 'Updated From: ' . $data['updated_from']; + } + + if (!empty($data['updated_to'])) { + $indicators[] = 'Updated To: ' . $data['updated_to']; + } + + return $indicators; + }) ]) + ->filtersFormMaxHeight('280px') ->actions([ Tables\Actions\ViewAction::make(), Tables\Actions\EditAction::make(),