- Implemented session storage management for the last configuration choices made by the user. - Added functionality to prompt users when changing models to retain their previous selections. - Introduced methods to apply previous choices to the newly loaded model, including finishes, handles, glass types, and options. - Enhanced user experience by ensuring selections are automatically applied where applicable.
131 lines
4.8 KiB
PHP
131 lines
4.8 KiB
PHP
<?php
|
|
|
|
namespace App\Filament\Resources\ModelloResource\RelationManagers;
|
|
|
|
use App\Filament\Resources\OpzioneResource;
|
|
use App\Models\GruppoOpzioni;
|
|
use App\Models\Opzione;
|
|
use Filament\Forms;
|
|
use Filament\Forms\Form;
|
|
use Filament\Notifications\Notification;
|
|
use Filament\Resources\RelationManagers\RelationManager;
|
|
use Filament\Tables;
|
|
use Filament\Tables\Table;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Storage;
|
|
use Illuminate\Support\Str;
|
|
|
|
/**
|
|
* Opzioni personalizzate del modello: se il modello ha almeno una riga in un gruppo,
|
|
* per quel modello il gruppo del sistema è sostituito per intero.
|
|
*/
|
|
class OpzioniRelationManager extends RelationManager
|
|
{
|
|
protected static string $relationship = 'opzioni';
|
|
|
|
protected static ?string $title = 'Opzioni personalizzate';
|
|
|
|
protected static ?string $modelLabel = 'opzione';
|
|
|
|
protected static ?string $pluralModelLabel = 'opzioni';
|
|
|
|
public function form(Form $form): Form
|
|
{
|
|
return $form->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;
|
|
}
|
|
}
|