feat: add previous configuration handling for user selections in quotes
- 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.
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
<?php
|
||||
|
||||
namespace App\Filament\Resources;
|
||||
|
||||
use App\Filament\Resources\GruppoOpzioniResource\Pages;
|
||||
use App\Models\GruppoOpzioni;
|
||||
use App\Models\Modello;
|
||||
use Filament\Forms;
|
||||
use Filament\Forms\Form;
|
||||
use Filament\Resources\Resource;
|
||||
use Filament\Tables;
|
||||
use Filament\Tables\Table;
|
||||
|
||||
/** Gruppi di opzioni del configuratore: un nuovo gruppo si crea qui, le sue voci in "Opzioni e supplementi". */
|
||||
class GruppoOpzioniResource extends Resource
|
||||
{
|
||||
protected static ?string $model = GruppoOpzioni::class;
|
||||
|
||||
protected static ?string $navigationIcon = 'heroicon-o-queue-list';
|
||||
|
||||
protected static ?string $slug = 'gruppi-opzioni';
|
||||
|
||||
protected static ?string $navigationGroup = 'Configuratore';
|
||||
|
||||
protected static ?string $navigationLabel = 'Gruppi di opzioni';
|
||||
|
||||
protected static ?string $modelLabel = 'gruppo di opzioni';
|
||||
|
||||
protected static ?string $pluralModelLabel = 'gruppi di opzioni';
|
||||
|
||||
protected static ?int $navigationSort = 24;
|
||||
|
||||
public static function form(Form $form): Form
|
||||
{
|
||||
return $form->schema([
|
||||
Forms\Components\Section::make()
|
||||
->columns(2)
|
||||
->schema([
|
||||
Forms\Components\TextInput::make('codice')
|
||||
->label('Codice')
|
||||
->helperText('Chiave del gruppo nelle opzioni e nel preventivo (es. soglia_ribassata). Non modificarlo se il gruppo ha già opzioni.')
|
||||
->required()
|
||||
->alphaDash()
|
||||
->maxLength(50)
|
||||
->unique(ignoreRecord: true)
|
||||
->live(onBlur: true)
|
||||
->afterStateUpdated(fn (Forms\Set $set, Forms\Get $get, ?string $state) => blank($get('modulo')) ? $set('modulo', $state) : null),
|
||||
Forms\Components\TextInput::make('etichetta')
|
||||
->label('Titolo nel configuratore')
|
||||
->required()
|
||||
->maxLength(255),
|
||||
Forms\Components\Select::make('ui')
|
||||
->label('Controllo')
|
||||
->options(GruppoOpzioni::UI)
|
||||
->default('select')
|
||||
->required(),
|
||||
Forms\Components\Select::make('sezione')
|
||||
->label('Sezione del menu')
|
||||
->options(GruppoOpzioni::SEZIONI)
|
||||
->default('accessori')
|
||||
->required(),
|
||||
Forms\Components\TextInput::make('modulo')
|
||||
->label('Modulo')
|
||||
->helperText('Il gruppo compare nei modelli che hanno questo modulo tra i "Moduli" (scheda del modello).')
|
||||
->required()
|
||||
->alphaDash()
|
||||
->maxLength(50)
|
||||
->notIn(array_keys(Modello::MODULI))
|
||||
->validationMessages(['not_in' => 'È un modulo base: scegline uno dedicato al gruppo.']),
|
||||
Forms\Components\TextInput::make('ordine')->label('Ordine')->numeric()->minValue(0)->default(0),
|
||||
]),
|
||||
]);
|
||||
}
|
||||
|
||||
public static function table(Table $table): Table
|
||||
{
|
||||
return $table
|
||||
->defaultSort('ordine')
|
||||
->reorderable('ordine')
|
||||
->columns([
|
||||
Tables\Columns\TextColumn::make('etichetta')->label('Titolo')->description(fn (GruppoOpzioni $record) => $record->codice)->searchable(['etichetta', 'codice']),
|
||||
Tables\Columns\TextColumn::make('ui')->label('Controllo')->formatStateUsing(fn (string $state) => GruppoOpzioni::UI[$state] ?? $state)->wrap(),
|
||||
Tables\Columns\TextColumn::make('sezione')->label('Sezione')->badge()->formatStateUsing(fn (string $state) => ucfirst($state)),
|
||||
Tables\Columns\TextColumn::make('modulo')->label('Modulo')->color('gray'),
|
||||
Tables\Columns\TextColumn::make('opzioni_count')->label('Opzioni')->counts('opzioni'),
|
||||
Tables\Columns\TextColumn::make('modelli')
|
||||
->label('Modelli')
|
||||
->state(fn (GruppoOpzioni $record) => Modello::whereJsonContains('moduli', $record->modulo)->count()),
|
||||
])
|
||||
->actions([
|
||||
Tables\Actions\EditAction::make()->iconButton(),
|
||||
Tables\Actions\DeleteAction::make()
|
||||
->iconButton()
|
||||
->disabled(fn (GruppoOpzioni $record) => $record->codice === 'tipo_finitura' || $record->opzioni()->exists())
|
||||
->tooltip(fn (GruppoOpzioni $record) => $record->opzioni()->exists() ? 'Elimina prima le opzioni del gruppo' : null),
|
||||
]);
|
||||
}
|
||||
|
||||
public static function getPages(): array
|
||||
{
|
||||
return [
|
||||
'index' => Pages\ManageGruppiOpzioni::route('/'),
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user