110 lines
4.8 KiB
PHP
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('/'),
|
|
];
|
|
}
|
|
}
|