$settings) { foreach ($settings as $setting) { $setting_values[$setting['name']] = config("settings.{$setting['name']}", $setting['default'] ?? null); } } $this->form->fill($setting_values); } public function form(Form $form): Form { $tabs = []; foreach (ClassesSettings::settings() as $key => $categories) { $tab = Tabs\Tab::make($key) ->label(ucwords(str_replace('-', ' ', $key))) ->schema(function () use ($categories, $key) { $inputs = []; foreach ($categories as $setting) { $inputs[] = FilamentInput::convert($setting); } if ($key === 'theme') { // Add a reset colors button if there are color settings array_unshift($inputs, Actions::make([ Actions\Action::make('resetColors') ->label('Reset Colors') ->color('danger') ->requiresConfirmation() ->action(fn () => $this->resetColors()), ])); // Wrap the first two inputs in a group if there are more than one if (count($inputs) > 1) { $inputs[0] = Group::make([ $inputs[1]->columnSpan(3), $inputs[0], ])->columns(4)->columnSpanFull(); unset($inputs[1]); } } return $inputs; }); $tabs[] = $tab; } return $form ->schema([ Tabs::make('Tabs') ->tabs($tabs) ->persistTabInQueryString(), ]) ->statePath('data'); } public function save(): void { Gate::authorize('has-permission', 'admin.settings.update'); $data = $this->form->getState(); $settings = Setting::where('settingable_type', null) ->whereIn('key', array_keys($data)) ->get() ->keyBy('key'); foreach ($data as $key => $value) { // Get only the settings that have changed $avSetting = (object) collect(\App\Classes\Settings::settings())->flatten(1)->firstWhere('name', $key); $avSetting->value = $settings[$key]->value ?? $avSetting->default ?? null; if ($value !== $avSetting->value || (($avSetting->database_type ?? 'string') === 'boolean' && (bool) $value !== (bool) $avSetting->value)) { if ($setting = $settings[$key] ?? null) { $setting->update([ 'value' => $value, 'type' => $avSetting->database_type ?? 'string', ]); } else { Setting::create([ 'key' => $key, 'value' => $value, 'settingable_type' => null, 'type' => $avSetting->database_type ?? 'string', 'encrypted' => $avSetting->encrypted ?? false, ]); } } } Notification::make() ->title('Saved successfully!') ->success() ->send(); } public function resetColors(): void { Gate::authorize('has-permission', 'admin.settings.update'); $colorSettings = []; foreach (\App\Classes\Settings::settings() as $group => $settings) { foreach ($settings as $setting) { if (($setting['type'] ?? '') === 'color') { $colorSettings[$setting['name']] = $setting['default'] ?? ''; } } } $currentData = $this->form->getState(); foreach ($colorSettings as $key => $defaultValue) { $currentData[$key] = $defaultValue; } $this->form->fill($currentData); Notification::make() ->title('Colors has been reset!') ->success() ->send(); } public static function getFormActions(): array { return [ Actions\Action::make('save') ->submit('save') ->keyBindings(['mod+s']), ]; } public static function canAccess(): bool { /** @var \App\Models\User */ $user = auth()->user(); return $user && $user->hasPermission('admin.settings.view'); } }