description('Per ogni finitura del profilo scegli se nel modello vale l\'impostazione del sistema (lato e attivazione in "Finiture e maniglie") o una propria: un lato diverso, oppure disattivata. La scelta del modello può anche attivare una finitura disattiva nel sistema.') ->defaultSort('ordine') ->defaultPaginationPageOption(50) ->columns([ Tables\Columns\ImageColumn::make('anteprima')->label('Anteprima')->disk('public')->height(36), Tables\Columns\TextColumn::make('descrizione') ->label('Finitura') ->description(fn (Finitura $record) => $record->codice) ->searchable(['descrizione', 'codice']), Tables\Columns\TextColumn::make('sistema') ->label('Nel sistema') ->state(fn (Finitura $record) => $record->attivo ? Finitura::LATI[$record->lato] : 'Disattiva') ->color('gray'), Tables\Columns\SelectColumn::make('scelta_modello') ->label('In questo modello') ->options(Finitura::LATI_MODELLO) ->placeholder('Come il sistema') ->getStateUsing(fn (Finitura $record) => $this->scelte()->get($record->id)) ->updateStateUsing(function (Finitura $record, ?string $state) { $this->salvaScelta([$record->id], $state); return $state; }), Tables\Columns\TextColumn::make('effettiva') ->label('Risultato') ->state(function (Finitura $record) { $lato = $this->scelte()->get($record->id) ?? ($record->attivo ? $record->lato : 'nessuno'); return $lato === 'nessuno' ? 'Non disponibile' : Finitura::LATI[$lato]; }) ->badge() ->color(fn (string $state) => $state === 'Non disponibile' ? 'danger' : 'success'), ]) ->filters([ Tables\Filters\TernaryFilter::make('personalizzata') ->label('Scelta del modello') ->placeholder('Tutte') ->trueLabel('Personalizzate') ->falseLabel('Come il sistema') ->queries( true: fn ($query) => $query->whereIn('id', $this->scelte()->keys()), false: fn ($query) => $query->whereNotIn('id', $this->scelte()->keys()), ), ]) ->headerActions([ Tables\Actions\Action::make('ripristina') ->label('Tutte come il sistema') ->icon('heroicon-o-arrow-uturn-left') ->color('gray') ->requiresConfirmation() ->modalDescription('Elimina le scelte del modello: per tutte le finiture torna a valere l\'impostazione del sistema.') ->visible(fn () => $this->scelte()->isNotEmpty()) ->action(function () { DB::table('finiture_modelli')->where('modello_id', $this->getOwnerRecord()->getKey())->delete(); $this->scelte = null; Notification::make()->title('Finiture ripristinate come nel sistema')->success()->send(); }), ]) ->bulkActions([ Tables\Actions\BulkAction::make('imposta') ->label('Imposta nel modello') ->icon('heroicon-o-adjustments-horizontal') ->form([ Forms\Components\Select::make('lato') ->label('In questo modello') ->options(['sistema' => 'Come il sistema'] + Finitura::LATI_MODELLO) ->required(), ]) ->action(fn (Collection $records, array $data) => $this->salvaScelta( $records->modelKeys(), $data['lato'] === 'sistema' ? null : $data['lato'], )) ->deselectRecordsAfterCompletion(), ]); } public function isReadOnly(): bool { return false; } private function scelte(): \Illuminate\Support\Collection { return $this->scelte ??= DB::table('finiture_modelli') ->where('modello_id', $this->getOwnerRecord()->getKey()) ->pluck('lato', 'finitura_id'); } /** null = come il sistema (rimuove la scelta del modello). */ private function salvaScelta(array $finiture, ?string $lato): void { $modello = $this->getOwnerRecord()->getKey(); $righe = DB::table('finiture_modelli')->where('modello_id', $modello)->whereIn('finitura_id', $finiture); if ($lato === null || $lato === '') { $righe->delete(); } else { abort_unless(array_key_exists($lato, Finitura::LATI_MODELLO), 422); DB::table('finiture_modelli')->upsert( array_map(fn ($id) => ['modello_id' => $modello, 'finitura_id' => $id, 'lato' => $lato, 'created_at' => now(), 'updated_at' => now()], $finiture), ['modello_id', 'finitura_id'], ['lato', 'updated_at'], ); } $this->scelte = null; } }