schema(OpzioneResource::campi(conSistema: false, modello: fn () => $this->getOwnerRecord())); } public function table(Table $table): Table { return OpzioneResource::tabella($table) ->description('I gruppi presenti qui sostituiscono, per questo modello, quelli definiti in "Opzioni e supplementi" del sistema (es. icone di apertura proprie o un supplemento diverso). Eliminando tutte le righe di un gruppo torna a valere quello del sistema.') ->headerActions([ Tables\Actions\Action::make('personalizza') ->label('Personalizza gruppo') ->icon('heroicon-o-document-duplicate') ->color('gray') ->modalDescription('Copia nel modello le opzioni del gruppo definite sul sistema, da modificare qui.') ->form([ Forms\Components\Select::make('gruppo') ->label('Gruppo') ->options(fn () => $this->gruppiPersonalizzabili()) ->required(), ]) ->action(function (array $data) { $copiate = $this->copiaGruppo($data['gruppo']); Notification::make()->title("Copiate {$copiate} opzioni dal sistema")->success()->send(); }), Tables\Actions\CreateAction::make() ->mutateFormDataUsing(fn (array $data) => $this->conIconaDelSistema($data) + ['sistema_id' => $this->getOwnerRecord()->sistema_id]), ]); } public function isReadOnly(): bool { return false; } /** Gruppi del sistema non ancora personalizzati per il modello. */ private function gruppiPersonalizzabili(): array { $modello = $this->getOwnerRecord(); $personalizzati = $modello->opzioni()->distinct()->pluck('gruppo')->all(); return Opzione::query() ->where('sistema_id', $modello->sistema_id) ->whereNull('modello_id') ->whereNotIn('gruppo', $personalizzati) ->distinct() ->pluck('gruppo') ->mapWithKeys(fn (string $g) => [$g => GruppoOpzioni::where('codice', $g)->value('etichetta') ?? $g]) ->all(); } private function copiaGruppo(string $gruppo): int { $modello = $this->getOwnerRecord(); $righe = Opzione::query() ->where('sistema_id', $modello->sistema_id) ->whereNull('modello_id') ->where('gruppo', $gruppo) ->get(); DB::transaction(function () use ($righe, $modello) { foreach ($righe as $riga) { $copia = $riga->replicate(['icona']); $copia->modello_id = $modello->getKey(); $copia->icona = $this->copiaIcona($riga); $copia->save(); } }); return $righe->count(); } /** Nuova opzione con un valore del sistema e senza icona: prende una copia di quella del sistema. */ private function conIconaDelSistema(array $data): array { if (blank($data['icona'] ?? null)) { $origine = OpzioneResource::catalogo($this->getOwnerRecord(), $data['gruppo'] ?? null)->firstWhere('valore', $data['valore'] ?? null); $data['icona'] = $origine ? $this->copiaIcona($origine) : null; } return $data; } /** Icona duplicata: ogni record ha i suoi file (vedi HaImmaginiCatalogo). */ private function copiaIcona(Opzione $origine): ?string { $disco = Storage::disk('public'); if (! $origine->icona || ! $disco->exists($origine->icona)) { return null; } $percorso = 'configuratore/opzioni/'.Str::random(20).'.'.pathinfo($origine->icona, PATHINFO_EXTENSION); $disco->copy($origine->icona, $percorso); return $percorso; } }