diff --git a/'s/home/truncgil/web/citrus.truncgil.com/public_html/database/seeders/DatabaseSeeder.php b/'s/home/truncgil/web/citrus.truncgil.com/public_html/database/seeders/DatabaseSeeder.php new file mode 100644 index 0000000..15a4df5 --- /dev/null +++ b/'s/home/truncgil/web/citrus.truncgil.com/public_html/database/seeders/DatabaseSeeder.php @@ -0,0 +1,29 @@ +call([ + SettingSeeder::class, + ]); + + // User::factory(10)->create(); + + User::factory()->create([ + 'name' => 'Test User', + 'email' => 'test@example.com', + ]); + } +} + diff --git a/app/Filament/Admin/Resources/Settings/Pages/ListSettings.php b/app/Filament/Admin/Resources/Settings/Pages/ListSettings.php index c07e9c9..f72d940 100644 --- a/app/Filament/Admin/Resources/Settings/Pages/ListSettings.php +++ b/app/Filament/Admin/Resources/Settings/Pages/ListSettings.php @@ -3,18 +3,37 @@ namespace App\Filament\Admin\Resources\Settings\Pages; use App\Filament\Admin\Resources\Settings\SettingResource; +use App\Filament\Admin\Resources\Settings\Tables\SettingsTable; use Filament\Actions\CreateAction; +use Filament\Forms\Concerns\InteractsWithForms; +use Filament\Forms\Contracts\HasForms; use Filament\Resources\Pages\ListRecords; +use Filament\Support\Icons\Heroicon; +use Illuminate\Contracts\Support\Htmlable; -class ListSettings extends ListRecords +class ListSettings extends ListRecords implements HasForms { + use InteractsWithForms; + protected static string $resource = SettingResource::class; + public ?string $activeGroup = null; + + public function getView(): string + { + return 'filament.admin.resources.settings.pages.list-settings'; + } + public function getTitle(): string { return __('settings.title'); } + public function getHeading(): string | Htmlable + { + return __('settings.title'); + } + protected function getHeaderActions(): array { return [ @@ -22,4 +41,78 @@ class ListSettings extends ListRecords ->label(__('settings.create')), ]; } + + public function mount(): void + { + parent::mount(); + + // Query string'den activeGroup' 별 al, yoksa tüm ayarları göster (null) + $this->activeGroup = request()->query('group', null); + } + + public function getGroups(): \Illuminate\Support\Collection + { + return \App\Models\Setting::whereNull('deleted_at') + ->select('group') + ->distinct() + ->orderBy('group') + ->pluck('group') + ->mapWithKeys(function ($group) { + return [$group => __("settings.group_{$group}")]; + }); + } + + public function setActiveGroup(?string $group): void + { + $this->activeGroup = $group; + } + + protected function getTableQuery(): \Illuminate\Database\Eloquent\Builder + { + $query = parent::getTableQuery(); + + // Eğer bir grup seçildiyse filtrele + if ($this->activeGroup) { + $query->where('group', $this->activeGroup); + } + + return $query; + } + + protected function getGroupIcon(?string $group): string + { + if (!$group) { + return 'heroicon-o-squares-2x2'; + } + + return match($group) { + 'general' => 'heroicon-o-cog-6-tooth', + 'theme' => 'heroicon-o-paint-brush', + 'localization' => 'heroicon-o-language', + 'email' => 'heroicon-o-envelope', + 'seo' => 'heroicon-o-magnifying-glass', + 'social' => 'heroicon-o-share', + 'security' => 'heroicon-o-shield-check', + 'upload' => 'heroicon-o-cloud-arrow-up', + 'payment' => 'heroicon-o-credit-card', + 'notification' => 'heroicon-o-bell', + 'cache' => 'heroicon-o-arrow-path', + 'api' => 'heroicon-o-code-bracket', + 'logging' => 'heroicon-o-document-text', + 'performance' => 'heroicon-o-bolt', + 'integration' => 'heroicon-o-puzzle-piece', + default => 'heroicon-o-squares-2x2', + }; + } + + protected function getGroupCount(?string $group): int + { + if (!$group) { + return \App\Models\Setting::whereNull('deleted_at')->count(); + } + + return \App\Models\Setting::where('group', $group) + ->whereNull('deleted_at') + ->count(); + } } diff --git a/app/Filament/Admin/Resources/Settings/Schemas/SettingForm.php b/app/Filament/Admin/Resources/Settings/Schemas/SettingForm.php index bf7ac58..e70976b 100644 --- a/app/Filament/Admin/Resources/Settings/Schemas/SettingForm.php +++ b/app/Filament/Admin/Resources/Settings/Schemas/SettingForm.php @@ -92,12 +92,20 @@ class SettingForm ->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'), diff --git a/app/Filament/Admin/Resources/Settings/Tables/SettingsTable.php b/app/Filament/Admin/Resources/Settings/Tables/SettingsTable.php index ae1b375..234061a 100644 --- a/app/Filament/Admin/Resources/Settings/Tables/SettingsTable.php +++ b/app/Filament/Admin/Resources/Settings/Tables/SettingsTable.php @@ -88,19 +88,6 @@ class SettingsTable ->toggleable(isToggledHiddenByDefault: true), ]) ->filters([ - SelectFilter::make('group') - ->label(__('settings.filter_group')) - ->options([ - 'general' => __('settings.group_general'), - 'email' => __('settings.group_email'), - 'seo' => __('settings.group_seo'), - 'social' => __('settings.group_social'), - 'security' => __('settings.group_security'), - 'payment' => __('settings.group_payment'), - 'notification' => __('settings.group_notification'), - 'other' => __('settings.group_other'), - ]), - SelectFilter::make('type') ->label(__('settings.filter_type')) ->options([ diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index d01a0ef..6f892db 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -13,6 +13,11 @@ class DatabaseSeeder extends Seeder */ public function run(): void { + // Settings seed + $this->call([ + SettingSeeder::class, + ]); + // User::factory(10)->create(); User::factory()->create([ diff --git a/database/seeders/SettingSeeder.php b/database/seeders/SettingSeeder.php index e750004..487976c 100644 --- a/database/seeders/SettingSeeder.php +++ b/database/seeders/SettingSeeder.php @@ -3,7 +3,6 @@ namespace Database\Seeders; use App\Models\Setting; -use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; class SettingSeeder extends Seeder @@ -14,14 +13,16 @@ class SettingSeeder extends Seeder public function run(): void { $settings = [ - // Genel Ayarlar + // ========================================== + // GENEL AYARLAR (general) + // ========================================== [ 'key' => 'site_name', 'value' => 'Citrus Platform', 'type' => 'string', 'group' => 'general', 'label' => 'Site Adı', - 'description' => 'Web sitesinin adı', + 'description' => 'Web sitesinin başlığı', 'is_public' => true, 'is_active' => true, ], @@ -31,17 +32,77 @@ class SettingSeeder extends Seeder 'type' => 'text', 'group' => 'general', 'label' => 'Site Açıklaması', - 'description' => 'Web sitesinin açıklaması', + 'description' => 'Web sitesinin kısa açıklaması', 'is_public' => true, 'is_active' => true, ], [ 'key' => 'site_keywords', - 'value' => 'citrus, platform, web, modern', - 'type' => 'string', + 'value' => json_encode(['citrus', 'platform', 'web', 'modern']), + 'type' => 'tags_input', 'group' => 'general', 'label' => 'Site Anahtar Kelimeleri', - 'description' => 'SEO için anahtar kelimeler', + 'description' => 'SEO için anahtar kelimeler (virgülle ayrılmış)', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'site_logo', + 'value' => '', + 'type' => 'file', + 'group' => 'general', + 'label' => 'Site Logosu', + 'description' => 'Üst kısımda görünecek logo dosyası', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'site_favicon', + 'value' => '', + 'type' => 'file', + 'group' => 'general', + 'label' => 'Site Favicon', + 'description' => 'Tarayıcı sekmesinde görünecek favicon', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'site_version', + 'value' => '1.0.0', + 'type' => 'string', + 'group' => 'general', + 'label' => 'Site Versiyonu', + 'description' => 'Uygulama versiyon numarası', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'site_url', + 'value' => 'https://citrus.truncgil.com', + 'type' => 'string', + 'group' => 'general', + 'label' => 'Site URL', + 'description' => 'Web sitesinin tam adresi', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'default_language', + 'value' => 'tr', + 'type' => 'toggle_buttons', + 'group' => 'general', + 'label' => 'Varsayılan Dil', + 'description' => 'Site varsayılan dili', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'available_languages', + 'value' => json_encode(['tr', 'en']), + 'type' => 'checkbox_list', + 'group' => 'general', + 'label' => 'Aktif Diller', + 'description' => 'Sitede kullanılacak diller', 'is_public' => true, 'is_active' => true, ], @@ -55,14 +116,384 @@ class SettingSeeder extends Seeder 'is_public' => false, 'is_active' => true, ], - - // E-posta Ayarları + [ + 'key' => 'maintenance_message', + 'value' => '

Site Bakımda

Yakında döneceğiz...

', + 'type' => 'rich_editor', + 'group' => 'general', + 'label' => 'Bakım Modu Mesajı', + 'description' => 'Bakım modundayken gösterilecek mesaj', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'copyright_text', + 'value' => '© 2024 Citrus Platform. Tüm hakları saklıdır.', + 'type' => 'text', + 'group' => 'general', + 'label' => 'Telif Hakkı Metni', + 'description' => 'Alt kısımda görünecek telif hakkı metni', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'contact_phone', + 'value' => '+90 555 555 55 55', + 'type' => 'string', + 'group' => 'general', + 'label' => 'İletişim Telefonu', + 'description' => 'İletişim telefon numarası', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'contact_email', + 'value' => 'info@citrus.truncgil.com', + 'type' => 'string', + 'group' => 'general', + 'label' => 'İletişim E-posta', + 'description' => 'İletişim e-posta adresi', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'contact_address', + 'value' => 'İstanbul, Türkiye', + 'type' => 'text', + 'group' => 'general', + 'label' => 'İletişim Adresi', + 'description' => 'İletişim fiziksel adresi', + 'is_public' => true, + 'is_active' => true, + ], + + // ========================================== + // TEMA VE RENK AYARLARI (theme) + // ========================================== + [ + 'key' => 'theme_primary_color', + 'value' => '#3b82f6', + 'type' => 'color_picker', + 'group' => 'theme', + 'label' => 'Primary Color', + 'description' => 'Ana tema rengi (Tailwind/Bootstrap primary)', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'theme_secondary_color', + 'value' => '#6b7280', + 'type' => 'color_picker', + 'group' => 'theme', + 'label' => 'Secondary Color', + 'description' => 'İkincil tema rengi', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'theme_success_color', + 'value' => '#10b981', + 'type' => 'color_picker', + 'group' => 'theme', + 'label' => 'Success Color', + 'description' => 'Başarı mesajları için renk', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'theme_danger_color', + 'value' => '#ef4444', + 'type' => 'color_picker', + 'group' => 'theme', + 'label' => 'Danger Color', + 'description' => 'Hata ve uyarı mesajları için renk', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'theme_warning_color', + 'value' => '#f59e0b', + 'type' => 'color_picker', + 'group' => 'theme', + 'label' => 'Warning Color', + 'description' => 'Uyarı mesajları için renk', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'theme_info_color', + 'value' => '#06b6d4', + 'type' => 'color_picker', + 'group' => 'theme', + 'label' => 'Info Color', + 'description' => 'Bilgi mesajları için renk', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'theme_light_color', + 'value' => '#f9fafb', + 'type' => 'color_picker', + 'group' => 'theme', + 'label' => 'Light Color', + 'description' => 'Açık renk', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'theme_dark_color', + 'value' => '#1f2937', + 'type' => 'color_picker', + 'group' => 'theme', + 'label' => 'Dark Color', + 'description' => 'Koyu renk', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'theme_body_background', + 'value' => '#ffffff', + 'type' => 'color_picker', + 'group' => 'theme', + 'label' => 'Body Background Color', + 'description' => 'Sayfa arka plan rengi', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'theme_text_color', + 'value' => '#111827', + 'type' => 'color_picker', + 'group' => 'theme', + 'label' => 'Text Color', + 'description' => 'Varsayılan metin rengi', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'theme_mode', + 'value' => 'light', + 'type' => 'toggle_buttons', + 'group' => 'theme', + 'label' => 'Tema Modu', + 'description' => 'Açık, koyu veya otomatik tema', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'theme_border_radius', + 'value' => '8', + 'type' => 'slider', + 'group' => 'theme', + 'label' => 'Border Radius (px)', + 'description' => 'Öğelerin köşe yuvarlaklığı (0-20 arası)', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'custom_css', + 'value' => '/* Özel CSS kodlarınızı buraya ekleyin */', + 'type' => 'code_editor', + 'group' => 'theme', + 'label' => 'Özel CSS', + 'description' => 'Site genelinde uygulanacak özel CSS kodları', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'custom_js', + 'value' => '// Özel JavaScript kodlarınızı buraya ekleyin', + 'type' => 'code_editor', + 'group' => 'theme', + 'label' => 'Özel JavaScript', + 'description' => 'Site genelinde uygulanacak özel JavaScript kodları', + 'is_public' => false, + 'is_active' => true, + ], + + // ========================================== + // LOKALİZASYON AYARLARI (localization) + // ========================================== + [ + 'key' => 'timezone', + 'value' => 'Europe/Istanbul', + 'type' => 'string', + 'group' => 'localization', + 'label' => 'Zaman Dilimi', + 'description' => 'Sunucu zaman dilimi (Europe/Istanbul, UTC, vb.)', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'date_format', + 'value' => 'd/m/Y', + 'type' => 'radio', + 'group' => 'localization', + 'label' => 'Tarih Formatı', + 'description' => 'Tarih gösterim formatı', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'time_format', + 'value' => '24', + 'type' => 'toggle_buttons', + 'group' => 'localization', + 'label' => 'Saat Formatı', + 'description' => '12 veya 24 saatlik format', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'currency', + 'value' => 'TRY', + 'type' => 'string', + 'group' => 'localization', + 'label' => 'Para Birimi', + 'description' => 'Varsayılan para birimi kodu (TRY, USD, EUR)', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'currency_symbol', + 'value' => '₺', + 'type' => 'string', + 'group' => 'localization', + 'label' => 'Para Birimi Sembolü', + 'description' => 'Para birimi sembolü', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'currency_position', + 'value' => 'after', + 'type' => 'radio', + 'group' => 'localization', + 'label' => 'Para Birimi Konumu', + 'description' => 'Sembolün fiyatın önünde mi arkasında mı olacağı', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'thousands_separator', + 'value' => '.', + 'type' => 'string', + 'group' => 'localization', + 'label' => 'Binlik Ayırıcı', + 'description' => 'Sayılarda binlik ayırıcı karakter', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'decimal_separator', + 'value' => ',', + 'type' => 'string', + 'group' => 'localization', + 'label' => 'Ondalık Ayırıcı', + 'description' => 'Sayılarda ondalık ayırıcı karakter', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'decimal_places', + 'value' => '2', + 'type' => 'integer', + 'group' => 'localization', + 'label' => 'Ondalık Basamak Sayısı', + 'description' => 'Para birimi için ondalık basamak sayısı', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'week_start_day', + 'value' => 'Monday', + 'type' => 'radio', + 'group' => 'localization', + 'label' => 'Haftanın İlk Günü', + 'description' => 'Haftanın başlangıç günü', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'calendar_type', + 'value' => 'Gregorian', + 'type' => 'toggle_buttons', + 'group' => 'localization', + 'label' => 'Takvim Tipi', + 'description' => 'Gregorian veya Miladi takvim', + 'is_public' => true, + 'is_active' => true, + ], + + // ========================================== + // E-POSTA AYARLARI (email) + // ========================================== + [ + 'key' => 'mail_driver', + 'value' => 'smtp', + 'type' => 'radio', + 'group' => 'email', + 'label' => 'Mail Driver', + 'description' => 'E-posta gönderim yöntemi', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'mail_host', + 'value' => 'smtp.gmail.com', + 'type' => 'string', + 'group' => 'email', + 'label' => 'SMTP Host', + 'description' => 'SMTP sunucu adresi', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'mail_port', + 'value' => '587', + 'type' => 'integer', + 'group' => 'email', + 'label' => 'SMTP Port', + 'description' => 'SMTP port numarası', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'mail_username', + 'value' => '', + 'type' => 'string', + 'group' => 'email', + 'label' => 'SMTP Kullanıcı Adı', + 'description' => 'SMTP kullanıcı adı', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'mail_password', + 'value' => '', + 'type' => 'string', + 'group' => 'email', + 'label' => 'SMTP Şifre', + 'description' => 'SMTP şifresi', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'mail_encryption', + 'value' => 'tls', + 'type' => 'toggle_buttons', + 'group' => 'email', + 'label' => 'SMTP Şifreleme', + 'description' => 'TLS veya SSL şifreleme', + 'is_public' => false, + 'is_active' => true, + ], [ 'key' => 'mail_from_address', 'value' => 'noreply@citrus.truncgil.com', 'type' => 'string', 'group' => 'email', - 'label' => 'E-posta Gönderen Adres', + 'label' => 'Gönderen E-posta Adresi', 'description' => 'Sistem e-postalarının gönderileceği adres', 'is_public' => false, 'is_active' => true, @@ -72,7 +503,7 @@ class SettingSeeder extends Seeder 'value' => 'Citrus Platform', 'type' => 'string', 'group' => 'email', - 'label' => 'E-posta Gönderen İsim', + 'label' => 'Gönderen İsim', 'description' => 'Sistem e-postalarının gönderen adı', 'is_public' => false, 'is_active' => true, @@ -88,7 +519,32 @@ class SettingSeeder extends Seeder 'is_active' => true, ], - // SEO Ayarları + // ========================================== + // SOSYAL MEDYA AYARLARI (social) + // ========================================== + [ + 'key' => 'social_links', + 'value' => json_encode([ + 'facebook' => '', + 'twitter' => '', + 'instagram' => '', + 'linkedin' => '', + 'youtube' => '', + 'tiktok' => '', + 'github' => '', + 'discord' => '', + ]), + 'type' => 'key_value', + 'group' => 'social', + 'label' => 'Sosyal Medya Linkleri', + 'description' => 'Sosyal medya platformlarının URL\'leri', + 'is_public' => true, + 'is_active' => true, + ], + + // ========================================== + // SEO AYARLARI (seo) + // ========================================== [ 'key' => 'seo_meta_title', 'value' => 'Citrus Platform - Modern Web Platformu', @@ -110,7 +566,17 @@ class SettingSeeder extends Seeder 'is_active' => true, ], [ - 'key' => 'seo_google_analytics', + 'key' => 'seo_meta_keywords', + 'value' => json_encode(['citrus', 'platform', 'web', 'modern', 'laravel']), + 'type' => 'tags_input', + 'group' => 'seo', + 'label' => 'SEO Meta Anahtar Kelimeler', + 'description' => 'Varsayılan SEO meta anahtar kelimeler', + 'is_public' => true, + 'is_active' => true, + ], + [ + 'key' => 'seo_google_analytics_id', 'value' => '', 'type' => 'string', 'group' => 'seo', @@ -119,57 +585,77 @@ class SettingSeeder extends Seeder 'is_public' => false, 'is_active' => true, ], - - // Sosyal Medya Ayarları [ - 'key' => 'social_facebook', + 'key' => 'seo_google_tag_manager_id', 'value' => '', 'type' => 'string', - 'group' => 'social', - 'label' => 'Facebook URL', - 'description' => 'Facebook sayfa URL\'si', + 'group' => 'seo', + 'label' => 'Google Tag Manager ID', + 'description' => 'Google Tag Manager takip kodu', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'seo_bing_webmaster', + 'value' => '', + 'type' => 'string', + 'group' => 'seo', + 'label' => 'Bing Webmaster Tools', + 'description' => 'Bing Webmaster doğrulama kodu', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'seo_robots_txt', + 'value' => "User-agent: *\nAllow: /", + 'type' => 'code_editor', + 'group' => 'seo', + 'label' => 'Robots.txt İçeriği', + 'description' => 'Robots.txt dosyası içeriği', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'seo_sitemap_url', + 'value' => '/sitemap.xml', + 'type' => 'string', + 'group' => 'seo', + 'label' => 'Sitemap URL', + 'description' => 'XML sitemap dosyasının adresi', 'is_public' => true, 'is_active' => true, ], [ - 'key' => 'social_twitter', - 'value' => '', + 'key' => 'seo_canonical_url', + 'value' => 'https://citrus.truncgil.com', 'type' => 'string', - 'group' => 'social', - 'label' => 'Twitter URL', - 'description' => 'Twitter profil URL\'si', + 'group' => 'seo', + 'label' => 'Canonical URL', + 'description' => 'Varsayılan canonical URL', 'is_public' => true, 'is_active' => true, ], [ - 'key' => 'social_instagram', - 'value' => '', - 'type' => 'string', - 'group' => 'social', - 'label' => 'Instagram URL', - 'description' => 'Instagram profil URL\'si', - 'is_public' => true, + 'key' => 'seo_opengraph_enabled', + 'value' => '1', + 'type' => 'boolean', + 'group' => 'seo', + 'label' => 'Open Graph Etiketleri', + 'description' => 'Open Graph meta etiketleri aktif mi?', + 'is_public' => false, 'is_active' => true, ], - [ - 'key' => 'social_linkedin', - 'value' => '', - 'type' => 'string', - 'group' => 'social', - 'label' => 'LinkedIn URL', - 'description' => 'LinkedIn profil URL\'si', - 'is_public' => true, - 'is_active' => true, - ], - - // Güvenlik Ayarları + + // ========================================== + // GÜVENLİK AYARLARI (security) + // ========================================== [ 'key' => 'security_max_login_attempts', 'value' => '5', - 'type' => 'integer', + 'type' => 'slider', 'group' => 'security', 'label' => 'Maksimum Giriş Denemesi', - 'description' => 'Kullanıcı hesabının kilitlenmesi için maksimum giriş denemesi', + 'description' => 'Kullanıcı hesabının kilitlenmesi için maksimum giriş denemesi (3-10 arası)', 'is_public' => false, 'is_active' => true, ], @@ -193,15 +679,181 @@ class SettingSeeder extends Seeder 'is_public' => false, 'is_active' => true, ], - - // Bildirim Ayarları + [ + 'key' => 'security_password_min_length', + 'value' => '8', + 'type' => 'slider', + 'group' => 'security', + 'label' => 'Şifre Minimum Uzunluk', + 'description' => 'Şifre için minimum karakter sayısı (6-20 arası)', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'security_password_require_uppercase', + 'value' => '1', + 'type' => 'boolean', + 'group' => 'security', + 'label' => 'Şifrede Büyük Harf Zorunlu', + 'description' => 'Şifrede en az bir büyük harf olmalı mı?', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'security_password_require_lowercase', + 'value' => '1', + 'type' => 'boolean', + 'group' => 'security', + 'label' => 'Şifrede Küçük Harf Zorunlu', + 'description' => 'Şifrede en az bir küçük harf olmalı mı?', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'security_password_require_numbers', + 'value' => '1', + 'type' => 'boolean', + 'group' => 'security', + 'label' => 'Şifrede Rakam Zorunlu', + 'description' => 'Şifrede en az bir rakam olmalı mı?', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'security_password_require_symbols', + 'value' => '0', + 'type' => 'boolean', + 'group' => 'security', + 'label' => 'Şifrede Özel Karakter Zorunlu', + 'description' => 'Şifrede en az bir özel karakter olmalı mı?', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'security_api_rate_limit', + 'value' => '60', + 'type' => 'integer', + 'group' => 'security', + 'label' => 'API Rate Limit', + 'description' => 'Dakikada maksimum API isteği sayısı', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'security_ip_whitelist', + 'value' => json_encode([]), + 'type' => 'tags_input', + 'group' => 'security', + 'label' => 'IP Whitelist', + 'description' => 'Yönetim paneline erişebilecek IP adresleri (boş = tüm IP\'ler)', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'security_csrf_protection', + 'value' => '1', + 'type' => 'boolean', + 'group' => 'security', + 'label' => 'CSRF Koruması', + 'description' => 'CSRF koruması aktif mi?', + 'is_public' => false, + 'is_active' => true, + ], + + // ========================================== + // DOSYA YÜKLEME AYARLARI (upload) + // ========================================== + [ + 'key' => 'upload_max_size', + 'value' => '10', + 'type' => 'slider', + 'group' => 'upload', + 'label' => 'Maksimum Yükleme Boyutu (MB)', + 'description' => 'Dosya yükleme için maksimum boyut (1-100 MB arası)', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'upload_allowed_image_types', + 'value' => json_encode(['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg']), + 'type' => 'tags_input', + 'group' => 'upload', + 'label' => 'İzin Verilen Resim Formatları', + 'description' => 'Yüklenebilecek resim dosya türleri', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'upload_allowed_document_types', + 'value' => json_encode(['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'txt']), + 'type' => 'tags_input', + 'group' => 'upload', + 'label' => 'İzin Verilen Belge Formatları', + 'description' => 'Yüklenebilecek belge dosya türleri', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'upload_allowed_video_types', + 'value' => json_encode(['mp4', 'avi', 'mov', 'wmv', 'flv', 'webm']), + 'type' => 'tags_input', + 'group' => 'upload', + 'label' => 'İzin Verilen Video Formatları', + 'description' => 'Yüklenebilecek video dosya türleri', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'upload_image_quality', + 'value' => '85', + 'type' => 'slider', + 'group' => 'upload', + 'label' => 'Resim Kalitesi (%)', + 'description' => 'Yüklenen resimlerin sıkıştırma kalitesi (1-100 arası)', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'upload_storage_driver', + 'value' => 'local', + 'type' => 'radio', + 'group' => 'upload', + 'label' => 'Storage Driver', + 'description' => 'Dosya saklama yöntemi', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'upload_cdn_url', + 'value' => '', + 'type' => 'string', + 'group' => 'upload', + 'label' => 'CDN URL', + 'description' => 'CDN sunucusu adresi (boş bırakılabilir)', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'upload_folder_structure', + 'value' => 'date', + 'type' => 'radio', + 'group' => 'upload', + 'label' => 'Klasör Yapısı', + 'description' => 'Dosyaların saklanma klasör yapısı', + 'is_public' => false, + 'is_active' => true, + ], + + // ========================================== + // BİLDİRİM AYARLARI (notification) + // ========================================== [ 'key' => 'notification_email_enabled', 'value' => '1', 'type' => 'boolean', 'group' => 'notification', 'label' => 'E-posta Bildirimleri', - 'description' => 'E-posta bildirimleri gönderilsin mi?', + 'description' => 'E-posta bildirimleri aktif mi?', 'is_public' => false, 'is_active' => true, ], @@ -211,7 +863,7 @@ class SettingSeeder extends Seeder 'type' => 'boolean', 'group' => 'notification', 'label' => 'SMS Bildirimleri', - 'description' => 'SMS bildirimleri gönderilsin mi?', + 'description' => 'SMS bildirimleri aktif mi?', 'is_public' => false, 'is_active' => true, ], @@ -221,7 +873,371 @@ class SettingSeeder extends Seeder 'type' => 'boolean', 'group' => 'notification', 'label' => 'Push Bildirimleri', - 'description' => 'Push bildirimleri gönderilsin mi?', + 'description' => 'Push bildirimleri aktif mi?', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'notification_in_app_enabled', + 'value' => '1', + 'type' => 'boolean', + 'group' => 'notification', + 'label' => 'İn-App Bildirimleri', + 'description' => 'Uygulama içi bildirimler aktif mi?', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'notification_channels', + 'value' => json_encode(['email', 'in_app']), + 'type' => 'checkbox_list', + 'group' => 'notification', + 'label' => 'Aktif Bildirim Kanalları', + 'description' => 'Aktif olacak bildirim kanalları', + 'is_public' => false, + 'is_active' => true, + ], + + // ========================================== + // CACHE AYARLARI (cache) + // ========================================== + [ + 'key' => 'cache_driver', + 'value' => 'file', + 'type' => 'radio', + 'group' => 'cache', + 'label' => 'Cache Driver', + 'description' => 'Cache saklama yöntemi', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'cache_duration', + 'value' => '60', + 'type' => 'integer', + 'group' => 'cache', + 'label' => 'Cache Süresi (dakika)', + 'description' => 'Cache\'in geçerlilik süresi', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'cache_enabled', + 'value' => '1', + 'type' => 'boolean', + 'group' => 'cache', + 'label' => 'Cache Aktif', + 'description' => 'Cache sistemi aktif mi?', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'cache_prefix', + 'value' => 'citrus_', + 'type' => 'string', + 'group' => 'cache', + 'label' => 'Cache Prefix', + 'description' => 'Cache anahtarları için önek', + 'is_public' => false, + 'is_active' => true, + ], + + // ========================================== + // ÖDEME AYARLARI (payment) + // ========================================== + [ + 'key' => 'payment_default_gateway', + 'value' => 'stripe', + 'type' => 'radio', + 'group' => 'payment', + 'label' => 'Varsayılan Ödeme Gateway\'i', + 'description' => 'Varsayılan ödeme servisi', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'payment_test_mode', + 'value' => '1', + 'type' => 'boolean', + 'group' => 'payment', + 'label' => 'Test Modu', + 'description' => 'Ödeme test modunda mı?', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'payment_currency', + 'value' => 'TRY', + 'type' => 'string', + 'group' => 'payment', + 'label' => 'Ödeme Para Birimi', + 'description' => 'Ödemeler için para birimi', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'payment_tax_rate', + 'value' => '20', + 'type' => 'float', + 'group' => 'payment', + 'label' => 'Vergi Oranı (%)', + 'description' => 'Varsayılan vergi oranı', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'payment_methods', + 'value' => json_encode(['credit_card', 'bank_transfer']), + 'type' => 'checkbox_list', + 'group' => 'payment', + 'label' => 'Ödeme Yöntemleri', + 'description' => 'Aktif ödeme yöntemleri', + 'is_public' => false, + 'is_active' => true, + ], + + // ========================================== + // API AYARLARI (api) + // ========================================== + [ + 'key' => 'api_rate_limit', + 'value' => '60', + 'type' => 'integer', + 'group' => 'api', + 'label' => 'API Rate Limit', + 'description' => 'Dakikada maksimum API isteği sayısı', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'api_auth_method', + 'value' => 'jwt', + 'type' => 'radio', + 'group' => 'api', + 'label' => 'API Kimlik Doğrulama Yöntemi', + 'description' => 'API için kimlik doğrulama yöntemi', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'api_key_expiration', + 'value' => '30', + 'type' => 'integer', + 'group' => 'api', + 'label' => 'API Key Geçerlilik Süresi (gün)', + 'description' => 'API anahtarının geçerlilik süresi', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'api_versioning_enabled', + 'value' => '1', + 'type' => 'boolean', + 'group' => 'api', + 'label' => 'API Versiyonlama', + 'description' => 'API versiyonlama aktif mi?', + 'is_public' => false, + 'is_active' => true, + ], + + // ========================================== + // LOGGING AYARLARI (logging) + // ========================================== + [ + 'key' => 'log_level', + 'value' => 'info', + 'type' => 'radio', + 'group' => 'logging', + 'label' => 'Log Seviyesi', + 'description' => 'Kaydedilecek log seviyesi', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'log_driver', + 'value' => 'daily', + 'type' => 'radio', + 'group' => 'logging', + 'label' => 'Log Driver', + 'description' => 'Log saklama yöntemi', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'log_retention_days', + 'value' => '30', + 'type' => 'integer', + 'group' => 'logging', + 'label' => 'Log Saklama Süresi (gün)', + 'description' => 'Log dosyalarının saklanma süresi', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'log_error_reporting', + 'value' => '1', + 'type' => 'boolean', + 'group' => 'logging', + 'label' => 'Hata Raporlama', + 'description' => 'Hata raporlama aktif mi?', + 'is_public' => false, + 'is_active' => true, + ], + + // ========================================== + // PERFORMANS AYARLARI (performance) + // ========================================== + [ + 'key' => 'performance_query_cache_enabled', + 'value' => '1', + 'type' => 'boolean', + 'group' => 'performance', + 'label' => 'Query Cache Aktif', + 'description' => 'Veritabanı sorgu cache\'i aktif mi?', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'performance_asset_minification', + 'value' => '1', + 'type' => 'boolean', + 'group' => 'performance', + 'label' => 'Asset Minification', + 'description' => 'CSS/JS dosyalarının küçültülmesi aktif mi?', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'performance_cdn_enabled', + 'value' => '0', + 'type' => 'boolean', + 'group' => 'performance', + 'label' => 'CDN Aktif', + 'description' => 'CDN kullanımı aktif mi?', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'performance_lazy_loading_enabled', + 'value' => '1', + 'type' => 'boolean', + 'group' => 'performance', + 'label' => 'Lazy Loading Aktif', + 'description' => 'Resimler için lazy loading aktif mi?', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'performance_image_optimization', + 'value' => '1', + 'type' => 'boolean', + 'group' => 'performance', + 'label' => 'Resim Optimizasyonu', + 'description' => 'Otomatik resim optimizasyonu aktif mi?', + 'is_public' => false, + 'is_active' => true, + ], + + // ========================================== + // ENTEGRASYON AYARLARI (integration) + // ========================================== + [ + 'key' => 'integration_recaptcha_site_key', + 'value' => '', + 'type' => 'string', + 'group' => 'integration', + 'label' => 'reCAPTCHA Site Key', + 'description' => 'Google reCAPTCHA site anahtarı', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'integration_recaptcha_secret_key', + 'value' => '', + 'type' => 'string', + 'group' => 'integration', + 'label' => 'reCAPTCHA Secret Key', + 'description' => 'Google reCAPTCHA gizli anahtarı', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'integration_google_maps_api_key', + 'value' => '', + 'type' => 'string', + 'group' => 'integration', + 'label' => 'Google Maps API Key', + 'description' => 'Google Maps API anahtarı', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'integration_stripe_public_key', + 'value' => '', + 'type' => 'string', + 'group' => 'integration', + 'label' => 'Stripe Public Key', + 'description' => 'Stripe public anahtarı', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'integration_stripe_secret_key', + 'value' => '', + 'type' => 'string', + 'group' => 'integration', + 'label' => 'Stripe Secret Key', + 'description' => 'Stripe gizli anahtarı', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'integration_paypal_client_id', + 'value' => '', + 'type' => 'string', + 'group' => 'integration', + 'label' => 'PayPal Client ID', + 'description' => 'PayPal client ID', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'integration_paypal_secret', + 'value' => '', + 'type' => 'string', + 'group' => 'integration', + 'label' => 'PayPal Secret', + 'description' => 'PayPal secret anahtarı', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'integration_aws_access_key', + 'value' => '', + 'type' => 'string', + 'group' => 'integration', + 'label' => 'AWS Access Key', + 'description' => 'Amazon Web Services erişim anahtarı', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'integration_aws_secret_key', + 'value' => '', + 'type' => 'string', + 'group' => 'integration', + 'label' => 'AWS Secret Key', + 'description' => 'Amazon Web Services gizli anahtarı', + 'is_public' => false, + 'is_active' => true, + ], + [ + 'key' => 'integration_aws_region', + 'value' => 'us-east-1', + 'type' => 'string', + 'group' => 'integration', + 'label' => 'AWS Region', + 'description' => 'Amazon Web Services bölgesi', 'is_public' => false, 'is_active' => true, ], diff --git a/lang/en/settings.php b/lang/en/settings.php index 54135cb..6bafed3 100644 --- a/lang/en/settings.php +++ b/lang/en/settings.php @@ -75,12 +75,20 @@ return [ // Groups 'group_general' => 'General', + 'group_theme' => 'Theme', + 'group_localization' => 'Localization', 'group_email' => 'Email', 'group_seo' => 'SEO', 'group_social' => 'Social Media', 'group_security' => 'Security', + 'group_upload' => 'Upload', 'group_payment' => 'Payment', 'group_notification' => 'Notification', + 'group_cache' => 'Cache', + 'group_api' => 'API', + 'group_logging' => 'Logging', + 'group_performance' => 'Performance', + 'group_integration' => 'Integration', 'group_other' => 'Other', // Validation messages @@ -121,5 +129,10 @@ return [ 'filter_type' => 'By Type', 'filter_active' => 'Active', 'filter_public' => 'Public', + + // Tabs + 'tabs_title' => 'Setting Groups', + 'settings_count' => 'settings', + 'all_settings' => 'All Settings', ]; diff --git a/lang/tr/settings.php b/lang/tr/settings.php index 07c4095..d67862d 100644 --- a/lang/tr/settings.php +++ b/lang/tr/settings.php @@ -75,12 +75,20 @@ return [ // Groups 'group_general' => 'Genel', + 'group_theme' => 'Tema', + 'group_localization' => 'Lokalizasyon', 'group_email' => 'E-posta', 'group_seo' => 'SEO', 'group_social' => 'Sosyal Medya', 'group_security' => 'Güvenlik', + 'group_upload' => 'Dosya Yükleme', 'group_payment' => 'Ödeme', 'group_notification' => 'Bildirim', + 'group_cache' => 'Cache', + 'group_api' => 'API', + 'group_logging' => 'Logging', + 'group_performance' => 'Performans', + 'group_integration' => 'Entegrasyon', 'group_other' => 'Diğer', // Validation messages @@ -121,5 +129,10 @@ return [ 'filter_type' => 'Tipe Göre', 'filter_active' => 'Aktif', 'filter_public' => 'Herkese Açık', + + // Tabs + 'tabs_title' => 'Ayar Grupları', + 'settings_count' => 'ayar', + 'all_settings' => 'Tüm Ayarlar', ]; diff --git a/resources/views/filament/admin/resources/settings/pages/list-settings.blade.php b/resources/views/filament/admin/resources/settings/pages/list-settings.blade.php new file mode 100644 index 0000000..2c73fd1 --- /dev/null +++ b/resources/views/filament/admin/resources/settings/pages/list-settings.blade.php @@ -0,0 +1,122 @@ + + +
+ + + + +
+ + @if($activeGroup) +
+
+ +
+
+

+ {{ $this->getGroups()->get($activeGroup) }} +

+

+ {{ $this->getGroupCount($activeGroup) }} {{ __('settings.settings_count') }} +

+
+
+ @else +
+
+ +
+
+

+ {{ __('settings.all_settings') }} +

+

+ {{ $this->getGroupCount(null) }} {{ __('settings.settings_count') }} +

+
+
+ @endif + + + {{ $this->table }} +
+
+
+