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('/'), ]; } }