From ad55d30d787b7f06133df1499a6ad320cd88e182 Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Fri, 5 Dec 2025 14:33:06 +0530 Subject: [PATCH] Added product characteristics master resource pages --- .../ProductCharacteristicsMasterResource.php | 364 ++++++++++++++++++ .../CreateProductCharacteristicsMaster.php | 23 ++ .../EditProductCharacteristicsMaster.php | 49 +++ .../ListProductCharacteristicsMasters.php | 24 ++ .../ViewProductCharacteristicsMaster.php | 24 ++ 5 files changed, 484 insertions(+) create mode 100644 app/Filament/Resources/ProductCharacteristicsMasterResource.php create mode 100644 app/Filament/Resources/ProductCharacteristicsMasterResource/Pages/CreateProductCharacteristicsMaster.php create mode 100644 app/Filament/Resources/ProductCharacteristicsMasterResource/Pages/EditProductCharacteristicsMaster.php create mode 100644 app/Filament/Resources/ProductCharacteristicsMasterResource/Pages/ListProductCharacteristicsMasters.php create mode 100644 app/Filament/Resources/ProductCharacteristicsMasterResource/Pages/ViewProductCharacteristicsMaster.php diff --git a/app/Filament/Resources/ProductCharacteristicsMasterResource.php b/app/Filament/Resources/ProductCharacteristicsMasterResource.php new file mode 100644 index 0000000..e30c791 --- /dev/null +++ b/app/Filament/Resources/ProductCharacteristicsMasterResource.php @@ -0,0 +1,364 @@ +schema([ + Forms\Components\Select::make('plant_id') + ->label('Plant') + ->relationship('plant', 'name') + ->options(function (callable $get) { + $userHas = Filament::auth()->user()->plant_id; + return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::pluck('name', 'id')->toArray(); + }) + ->reactive() + ->required(), + Forms\Components\Select::make('item_id') + ->label('Item Code') + //->relationship('item', 'code') + ->searchable() + ->reactive() + ->options(function (callable $get) { + $plantId = $get('plant_id'); + if (empty($plantId)) { + return []; + } + return \App\Models\Item::where('plant_id', $plantId)->pluck('code', 'id'); + }) + ->required(), + Forms\Components\Select::make('line_id') + ->label('Line') + ->reactive() + ->options(function (callable $get) { + $plantId = $get('plant_id'); + if (empty($plantId)) { + return []; + } + return Line::where('plant_id', $plantId)->pluck('name', 'id'); + }) + ->afterStateUpdated(function ($state, callable $set, callable $get) { + $set('machine_id', null); + + if (!$get('work_group_master_id')) { + $set('machine_id', null); + } + }) + ->required(), + // ->relationship('line', 'name'), + Forms\Components\Select::make('work_group_master_id') + ->label('Group Work Center') + ->required() + ->reactive() + ->options(function (callable $get) { + if (!$get('plant_id') || !$get('line_id')) { + return []; + } + + $line = Line::find($get('line_id')); + $workGroupIds = []; + for ($i = 1; $i <= $line->no_of_operation; $i++) { + $column = "work_group{$i}_id"; + if (!empty($line->$column)) { + $workGroupIds[] = $line->$column; + } + } + + return WorkGroupMaster::where('plant_id', $get('plant_id'))->whereIn('id', $workGroupIds)->pluck('name', 'id')->toArray(); + }) + ->disabled(fn (Get $get) => !empty($get('id'))) + ->afterStateUpdated(function ($state, callable $set, callable $get) { + $lineId = $get('line_id'); + if (!$lineId) { + $set('mGroupWorkError', 'Please select a line first.'); + $set('machine_id', null); + return; + } + else + { + // $grpWrkCnr = Line::find($lineId)->group_work_center; + // if (!$grpWrkCnr || Str::length($grpWrkCnr) < 1) + // { + // $set('mGroupWorkError', 'Please select a group work center line.'); + // $set('line_id', null); + // return; + // } + $set('mGroupWorkError', null); + $set('machine_id', null); + } + }) + ->extraAttributes(fn ($get) => [ + 'class' => $get('mGroupWorkError') ? 'border-red-500' : '', + ]) + // ->dehydrateStateUsing(fn ($state) => null) + ->hint(fn ($get) => $get('mGroupWorkError') ? $get('mGroupWorkError') : null) + ->hintColor('danger'), + Forms\Components\Select::make('machine_id') + ->label('Work Center') + //->relationship('machine', 'name'), + ->searchable() + ->reactive() + ->options(function (callable $get) { + $plantId = $get('plant_id'); + $lineId = $get('line_id'); + $workGroupId = $get('work_group_master_id'); + + if (empty($plantId) || empty($lineId) || empty($workGroupId)) { + return []; + } + + return Machine::where('plant_id', $plantId) + ->where('line_id', $lineId) + ->where('work_group_master_id', $workGroupId) + ->pluck('work_center', 'id'); + }) + ->afterStateUpdated(function ($state, callable $set, callable $get) { + if (!$get('plant_id') || !$get('line_id') || !$get('work_group_master_id')) { + $set('machine_id', null); + } + }) + ->required(), + Forms\Components\Select::make('characteristics_type') + ->label('Characteristics Type') + ->options([ + 'Product' => 'Product', + 'Process' => 'Process', + ]) + ->reactive() + ->required(), + Forms\Components\TextInput::make('name') + ->label('Name'), + Forms\Components\Select::make('inspection_type') + ->label('Inspection Type') + ->options([ + 'Visual' => 'Visual', + 'Value' => 'Value', + ]) + ->reactive() + ->required(), + // Forms\Components\Select::make('result') + // ->label('Visual Type') + // ->reactive() + // ->options(function (callable $get) { + // if ($get('inspection_type') == 'Visual') { + // return [ + // 'Ok' => 'OK', + // 'NotOk' => 'Not Ok', + // ]; + // } + // return []; //empty options if type ≠ Visual + // }) + // ->afterStateUpdated(function ($state, $set) { + // $set('result', $state); // store in form state only + // session()->put('temp_result', $state); + // }) + // ->hidden(fn (callable $get) => $get('inspection_type') != 'Visual'), + Forms\Components\TextInput::make('upper') + ->label('Upper') + ->numeric() + ->default(0.0) + ->visible(fn (callable $get) => $get('inspection_type') == 'Value'), + Forms\Components\TextInput::make('lower') + ->label('Lower') + ->numeric() + ->default(0.0) + ->visible(fn (callable $get) => $get('inspection_type') == 'Value'), + Forms\Components\TextInput::make('middle') + ->label('Middle') + ->numeric() + ->visible(fn (callable $get) => $get('inspection_type') == 'Value') + ->rule(function (callable $get) { + return function (string $attribute, $value, \Closure $fail) use ($get) { + $lower = $get('lower'); + $upper = $get('upper'); + $middle = $value; + + if (!is_null($lower) && !is_null($upper) && !is_null($middle)) { + if (!($lower <= $middle && $middle <= $upper)) { + $fail("Middle must be between Lower and Upper (Lower ≤ Middle ≤ Upper)."); + } + } + }; + }), + Forms\Components\Hidden::make('created_by') + ->label('Created By') + ->default(Filament::auth()->user()?->name), + Forms\Components\Hidden::make('updated_by') + ->label('Updated By'), + ]); + } + + public static function table(Table $table): Table + { + return $table + ->columns([ + Tables\Columns\TextColumn::make('No.') + ->label('No.') + ->getStateUsing(function ($record, $livewire, $column, $rowLoop) { + $paginator = $livewire->getTableRecords(); + $perPage = method_exists($paginator, 'perPage') ? $paginator->perPage() : 10; + $currentPage = method_exists($paginator, 'currentPage') ? $paginator->currentPage() : 1; + return ($currentPage - 1) * $perPage + $rowLoop->iteration; + }), + Tables\Columns\TextColumn::make('plant.name') + ->label('Plant') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('item.code') + ->label('Item Code') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('line.name') + ->label('Line') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('characteristics_type') + ->label('Characteristics Type') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('workGroupMaster.name') + ->label('Group Work Center') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('machine.work_center') + ->label('Work Center') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('machine.work_center') + ->label('Work Center') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('inspection_type') + ->label('Inspection Type') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('upper') + ->label('Upper') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('lower') + ->label('Lower') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('middle') + ->label('Middle') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('created_at') + ->label('Created At') + ->alignCenter() + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + Tables\Columns\TextColumn::make('created_by') + ->label('Created By') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('updated_at') + ->label('Updated At') + ->alignCenter() + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + Tables\Columns\TextColumn::make('updated_by') + ->label('Updated By') + ->alignCenter() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + Tables\Columns\TextColumn::make('deleted_at') + ->label('Deleted At') + ->alignCenter() + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + ]) + ->filters([ + Tables\Filters\TrashedFilter::make(), + ]) + ->actions([ + Tables\Actions\ViewAction::make(), + Tables\Actions\EditAction::make(), + ]) + ->bulkActions([ + Tables\Actions\BulkActionGroup::make([ + Tables\Actions\DeleteBulkAction::make(), + Tables\Actions\ForceDeleteBulkAction::make(), + Tables\Actions\RestoreBulkAction::make(), + ]), + ]) + ->headerActions([ + ImportAction::make() + ->label('Import Product Characteristics Masters') + ->color('warning') + ->importer(ProductCharacteristicsMasterImporter::class) + ->visible(function() { + return Filament::auth()->user()->can('view import product characteristics master'); + }), + ExportAction::make() + ->label('Export Product Characteristics Masters') + ->color('warning') + ->exporter(ProductCharacteristicsMasterExporter::class) + ->visible(function() { + return Filament::auth()->user()->can('view export product characteristics master'); + }), + ]); + } + + public static function getRelations(): array + { + return [ + // + ]; + } + + public static function getPages(): array + { + return [ + 'index' => Pages\ListProductCharacteristicsMasters::route('/'), + 'create' => Pages\CreateProductCharacteristicsMaster::route('/create'), + 'view' => Pages\ViewProductCharacteristicsMaster::route('/{record}'), + 'edit' => Pages\EditProductCharacteristicsMaster::route('/{record}/edit'), + ]; + } + + public static function getNavigationLabel(): string + { + return 'Characteristics'; + } + + public static function getEloquentQuery(): Builder + { + return parent::getEloquentQuery() + ->withoutGlobalScopes([ + SoftDeletingScope::class, + ]); + } +} diff --git a/app/Filament/Resources/ProductCharacteristicsMasterResource/Pages/CreateProductCharacteristicsMaster.php b/app/Filament/Resources/ProductCharacteristicsMasterResource/Pages/CreateProductCharacteristicsMaster.php new file mode 100644 index 0000000..fc7f4d8 --- /dev/null +++ b/app/Filament/Resources/ProductCharacteristicsMasterResource/Pages/CreateProductCharacteristicsMaster.php @@ -0,0 +1,23 @@ +getRecord(); // actual model instance + + // Step 1: Fill the actual saved fields first + $this->form->fill([ + 'plant_id' => $model->plant_id, + 'line_id' => $model->line_id, + 'item_id' => $model->item_id, + 'machine_id' => $model->machine_id, + 'name' => $model->name, + 'type' => $model->type, + 'upper' => $model->upper, + 'lower' => $model->lower, + 'middle' => $model->middle, + 'work_group_master_id' => optional($model->machine)->work_group_master_id, + ]); + + } + + protected function getHeaderActions(): array + { + return [ + Actions\ViewAction::make(), + Actions\DeleteAction::make(), + Actions\ForceDeleteAction::make(), + Actions\RestoreAction::make(), + ]; + } +} diff --git a/app/Filament/Resources/ProductCharacteristicsMasterResource/Pages/ListProductCharacteristicsMasters.php b/app/Filament/Resources/ProductCharacteristicsMasterResource/Pages/ListProductCharacteristicsMasters.php new file mode 100644 index 0000000..7bcbae0 --- /dev/null +++ b/app/Filament/Resources/ProductCharacteristicsMasterResource/Pages/ListProductCharacteristicsMasters.php @@ -0,0 +1,24 @@ +