Enhance settings form and model: Added support for array type in SettingForm with a new repeater field for managing key-value pairs. Updated Setting model to handle array values and modified localization files to include new keys for array-specific fields in both English and Turkish.

This commit is contained in:
Ümit Tunç
2025-10-23 15:31:26 -03:00
parent 7e269e6543
commit f38a9ccd9e
4 changed files with 69 additions and 2 deletions
@@ -9,6 +9,7 @@ use Filament\Forms\Components\Toggle;
use Filament\Forms\Components\FileUpload; use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\DateTimePicker; use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\DatePicker; use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\Repeater;
use Filament\Schemas\Components\Section; use Filament\Schemas\Components\Section;
use Filament\Schemas\Components\Utilities\Get; use Filament\Schemas\Components\Utilities\Get;
use Filament\Schemas\Components\Utilities\Set; use Filament\Schemas\Components\Utilities\Set;
@@ -84,10 +85,10 @@ class SettingForm
->label(__('settings.value')) ->label(__('settings.value'))
->helperText(__('settings.value_helper')) ->helperText(__('settings.value_helper'))
->required() ->required()
->visible(fn (Get $get) => !in_array($get('type'), ['boolean', 'file', 'date', 'datetime'])) ->visible(fn (Get $get) => !in_array($get('type'), ['boolean', 'file', 'date', 'datetime', 'array']))
->rows(fn (Get $get) => $get('type') === 'text' ? 5 : 3) ->rows(fn (Get $get) => $get('type') === 'text' ? 5 : 3)
->formatStateUsing(function ($state, $record) { ->formatStateUsing(function ($state, $record) {
if ($record && !in_array($record->type, ['boolean', 'file', 'date', 'datetime'])) { if ($record && !in_array($record->type, ['boolean', 'file', 'date', 'datetime', 'array'])) {
return $record->value; return $record->value;
} }
return $state; return $state;
@@ -155,6 +156,43 @@ class SettingForm
}) })
->columnSpanFull(), ->columnSpanFull(),
Repeater::make('value_array')
->label(__('settings.value'))
->helperText(__('settings.value_helper'))
->required()
->visible(fn (Get $get) => $get('type') === 'array')
->schema([
TextInput::make('key')
->label(__('settings.array_key'))
->required()
->placeholder(__('settings.array_key_placeholder')),
TextInput::make('value')
->label(__('settings.array_value'))
->required()
->placeholder(__('settings.array_value_placeholder')),
Textarea::make('description')
->label(__('settings.array_description'))
->placeholder(__('settings.array_description_placeholder'))
->rows(2),
Toggle::make('active')
->label(__('settings.array_active'))
->default(true),
])
->columns(2)
->defaultItems(1)
->addActionLabel(__('settings.array_add_item'))
->reorderable()
->collapsible()
->itemLabel(fn (array $state): ?string => $state['key'] ?? null)
->formatStateUsing(function ($state, $record) {
if ($record && $record->type === 'array') {
$decoded = json_decode($record->value, true);
return is_array($decoded) ? $decoded : [];
}
return is_array($state) ? $state : [];
})
->columnSpanFull(),
Toggle::make('is_active') Toggle::make('is_active')
->label(__('settings.is_active')) ->label(__('settings.is_active'))
->helperText(__('settings.is_active_helper')) ->helperText(__('settings.is_active_helper'))
+9
View File
@@ -18,6 +18,7 @@ class Setting extends Model
'value_file', 'value_file',
'value_date', 'value_date',
'value_datetime', 'value_datetime',
'value_array',
'type', 'type',
'group', 'group',
'label', 'label',
@@ -77,6 +78,14 @@ class Setting extends Model
$this->attributes['value'] = $value; $this->attributes['value'] = $value;
} }
/**
* Set value from different field names
*/
public function setValueArrayAttribute($value)
{
$this->attributes['value'] = is_array($value) ? json_encode($value) : $value;
}
/** /**
* Get setting by key * Get setting by key
*/ */
+10
View File
@@ -81,6 +81,16 @@ return [
'type_required' => 'Type field is required.', 'type_required' => 'Type field is required.',
'label_required' => 'Label field is required.', 'label_required' => 'Label field is required.',
// Array type specific
'array_key' => 'Key',
'array_key_placeholder' => 'Array key (e.g: name, email)',
'array_value' => 'Value',
'array_value_placeholder' => 'Array value',
'array_description' => 'Description',
'array_description_placeholder' => 'Description for this item',
'array_active' => 'Active',
'array_add_item' => 'Add Item',
// Filters // Filters
'filter_group' => 'By Group', 'filter_group' => 'By Group',
'filter_type' => 'By Type', 'filter_type' => 'By Type',
+10
View File
@@ -81,6 +81,16 @@ return [
'type_required' => 'Tip alanı zorunludur.', 'type_required' => 'Tip alanı zorunludur.',
'label_required' => 'Etiket alanı zorunludur.', 'label_required' => 'Etiket alanı zorunludur.',
// Array type specific
'array_key' => 'Anahtar',
'array_key_placeholder' => 'Dizi anahtarı (örn: name, email)',
'array_value' => 'Değer',
'array_value_placeholder' => 'Dizi değeri',
'array_description' => 'Açıklama',
'array_description_placeholder' => 'Bu öğe için açıklama',
'array_active' => 'Aktif',
'array_add_item' => 'Öğe Ekle',
// Filters // Filters
'filter_group' => 'Gruba Göre', 'filter_group' => 'Gruba Göre',
'filter_type' => 'Tipe Göre', 'filter_type' => 'Tipe Göre',