components([ Section::make(__('settings.title')) ->schema([ TextInput::make('key') ->label(__('settings.key')) ->helperText(__('settings.key_helper')) ->required() ->unique(ignoreRecord: true) ->regex('/^[a-z0-9_-]+$/') ->maxLength(255) ->disabled(fn ($record) => $record !== null) ->columnSpanFull(), TextInput::make('label') ->label(__('settings.label')) ->helperText(__('settings.label_helper')) ->required() ->maxLength(255) ->columnSpanFull(), Textarea::make('description') ->label(__('settings.description')) ->helperText(__('settings.description_helper')) ->rows(3) ->columnSpanFull(), Select::make('type') ->label(__('settings.type')) ->helperText(__('settings.type_helper')) ->required() ->options([ 'string' => __('settings.type_string'), 'text' => __('settings.type_text'), 'boolean' => __('settings.type_boolean'), 'integer' => __('settings.type_integer'), 'float' => __('settings.type_float'), 'array' => __('settings.type_array'), 'json' => __('settings.type_json'), 'file' => __('settings.type_file'), 'date' => __('settings.type_date'), 'datetime' => __('settings.type_datetime'), 'color_picker' => __('settings.type_color_picker'), 'code_editor' => __('settings.type_code_editor'), 'rich_editor' => __('settings.type_rich_editor'), 'markdown_editor' => __('settings.type_markdown_editor'), 'tags_input' => __('settings.type_tags_input'), 'checkbox_list' => __('settings.type_checkbox_list'), 'radio' => __('settings.type_radio'), 'toggle_buttons' => __('settings.type_toggle_buttons'), 'slider' => __('settings.type_slider'), 'key_value' => __('settings.type_key_value'), ]) ->live() ->afterStateUpdated(fn (Set $set) => $set('value', null)), Select::make('group') ->label(__('settings.group')) ->helperText(__('settings.group_helper')) ->required() ->options([ 'general' => __('settings.group_general'), 'theme' => __('settings.group_theme'), 'localization' => __('settings.group_localization'), 'email' => __('settings.group_email'), 'seo' => __('settings.group_seo'), 'social' => __('settings.group_social'), 'security' => __('settings.group_security'), 'upload' => __('settings.group_upload'), 'payment' => __('settings.group_payment'), 'notification' => __('settings.group_notification'), 'cache' => __('settings.group_cache'), 'api' => __('settings.group_api'), 'logging' => __('settings.group_logging'), 'performance' => __('settings.group_performance'), 'integration' => __('settings.group_integration'), 'other' => __('settings.group_other'), ]) ->default('general'), Textarea::make('value_text') ->label(__('settings.value')) ->helperText(__('settings.value_helper')) ->required() ->visible(fn (Get $get) => in_array($get('type'), ['string', 'text', 'json'])) ->rows(fn (Get $get) => $get('type') === 'text' ? 5 : 3) ->columnSpanFull(), Toggle::make('value_boolean') ->label(__('settings.value')) ->helperText(__('settings.value_helper')) ->required() ->visible(fn (Get $get) => $get('type') === 'boolean') ->columnSpanFull(), FileUpload::make('value_file') ->label(__('settings.value')) ->helperText(__('settings.value_helper')) ->required() ->visible(fn (Get $get) => $get('type') === 'file') ->disk('public') ->directory('settings') ->acceptedFileTypes(['image/*', 'application/pdf', 'text/*']) ->maxSize(10240) // 10MB ->openable() ->downloadable() ->previewable(true) ->columnSpanFull() ->afterStateHydrated(function ($component, $state, $record) { if ($record && $record->type === 'file') { $component->state($record->value); } }), DatePicker::make('value_date') ->label(__('settings.value')) ->helperText(__('settings.value_helper')) ->required() ->visible(fn (Get $get) => $get('type') === 'date') ->displayFormat('d/m/Y') ->format('Y-m-d') ->columnSpanFull(), DateTimePicker::make('value_datetime') ->label(__('settings.value')) ->helperText(__('settings.value_helper')) ->required() ->visible(fn (Get $get) => $get('type') === 'datetime') ->displayFormat('d/m/Y H:i') ->format('Y-m-d H:i:s') ->seconds(false) ->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) ->columnSpanFull(), ColorPicker::make('value_color_picker') ->label(__('settings.value')) ->helperText(__('settings.value_helper')) ->required() ->visible(fn (Get $get) => $get('type') === 'color_picker') ->columnSpanFull(), CodeEditor::make('value_code_editor') ->label(__('settings.value')) ->helperText(__('settings.value_helper')) ->required() ->visible(fn (Get $get) => $get('type') === 'code_editor') ->language(CodeEditorLanguage::Php) ->columnSpanFull(), RichEditor::make('value_rich_editor') ->label(__('settings.value')) ->helperText(__('settings.value_helper')) ->required() ->visible(fn (Get $get) => $get('type') === 'rich_editor') ->fileAttachmentsDisk('public') ->fileAttachmentsDirectory('settings') ->toolbarButtons([ 'attachFiles', 'blockquote', 'bold', 'bulletList', 'codeBlock', 'h2', 'h3', 'italic', 'link', 'orderedList', 'redo', 'strike', 'underline', 'undo', ]) ->columnSpanFull(), MarkdownEditor::make('value_markdown_editor') ->label(__('settings.value')) ->helperText(__('settings.value_helper')) ->required() ->visible(fn (Get $get) => $get('type') === 'markdown_editor') ->columnSpanFull(), TagsInput::make('value_tags_input') ->label(__('settings.value')) ->helperText(__('settings.value_helper')) ->required() ->visible(fn (Get $get) => $get('type') === 'tags_input') ->separator(',') ->columnSpanFull(), CheckboxList::make('value_checkbox_list') ->label(__('settings.value')) ->helperText(__('settings.value_helper')) ->required() ->visible(fn (Get $get) => $get('type') === 'checkbox_list') ->options(fn () => [ 'option1' => __('settings.checkbox_option_1'), 'option2' => __('settings.checkbox_option_2'), 'option3' => __('settings.checkbox_option_3'), ]) ->columnSpanFull(), Radio::make('value_radio') ->label(__('settings.value')) ->helperText(__('settings.value_helper')) ->required() ->visible(fn (Get $get) => $get('type') === 'radio') ->options(fn () => [ 'option1' => __('settings.radio_option_1'), 'option2' => __('settings.radio_option_2'), 'option3' => __('settings.radio_option_3'), ]) ->columnSpanFull(), ToggleButtons::make('value_toggle_buttons') ->label(__('settings.value')) ->helperText(__('settings.value_helper')) ->required() ->visible(fn (Get $get) => $get('type') === 'toggle_buttons') ->options(fn () => [ 'option1' => __('settings.toggle_option_1'), 'option2' => __('settings.toggle_option_2'), 'option3' => __('settings.toggle_option_3'), ]) ->columnSpanFull(), Slider::make('value_slider') ->label(__('settings.value')) ->helperText(__('settings.value_helper')) ->required() ->visible(fn (Get $get) => $get('type') === 'slider') ->range(minValue: 0, maxValue: 100) ->step(1) ->columnSpanFull(), KeyValue::make('value_key_value') ->label(__('settings.value')) ->helperText(__('settings.value_helper')) ->required() ->visible(fn (Get $get) => $get('type') === 'key_value') ->columnSpanFull(), Toggle::make('is_active') ->label(__('settings.is_active')) ->helperText(__('settings.is_active_helper')) ->default(true) ->columnSpan(1), Toggle::make('is_public') ->label(__('settings.is_public')) ->helperText(__('settings.is_public_helper')) ->default(false) ->columnSpan(1), ]) ->columns(2), ]); } }