Files

110 lines
4.8 KiB
PHP

<?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;
use App\Filament\Concerns\SoloSuperadmin;
/** Gruppi di opzioni del configuratore: un nuovo gruppo si crea qui, le sue voci in "Opzioni e supplementi". */
class GruppoOpzioniResource extends Resource
{
use SoloSuperadmin;
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('/'),
];
}
}