Andrew Wallo 10 months ago
parent
commit
d34069be0a

+ 12
- 0
app/Filament/Company/Clusters/Settings/Pages/Appearance.php View File

8
 use App\Enums\Setting\TableSortDirection;
8
 use App\Enums\Setting\TableSortDirection;
9
 use App\Filament\Company\Clusters\Settings;
9
 use App\Filament\Company\Clusters\Settings;
10
 use App\Models\Setting\Appearance as AppearanceModel;
10
 use App\Models\Setting\Appearance as AppearanceModel;
11
+use App\Services\CompanySettingsService;
11
 use Filament\Actions\Action;
12
 use Filament\Actions\Action;
12
 use Filament\Actions\ActionGroup;
13
 use Filament\Actions\ActionGroup;
13
 use Filament\Forms\Components\Component;
14
 use Filament\Forms\Components\Component;
165
             'font',
166
             'font',
166
         ];
167
         ];
167
 
168
 
169
+        $cachedKeysToWatch = [
170
+            'primary_color',
171
+            'font',
172
+            'table_sort_direction',
173
+            'records_per_page',
174
+        ];
175
+
168
         if ($record->isDirty($keysToWatch)) {
176
         if ($record->isDirty($keysToWatch)) {
169
             $this->dispatch('appearanceUpdated');
177
             $this->dispatch('appearanceUpdated');
170
         }
178
         }
171
 
179
 
180
+        if ($record->isDirty($cachedKeysToWatch)) {
181
+            CompanySettingsService::invalidateSettings($record->company_id);
182
+        }
183
+
172
         $record->save();
184
         $record->save();
173
 
185
 
174
         return $record;
186
         return $record;

+ 2
- 0
app/Filament/Company/Clusters/Settings/Pages/Localization.php View File

9
 use App\Filament\Company\Clusters\Settings;
9
 use App\Filament\Company\Clusters\Settings;
10
 use App\Models\Setting\CompanyProfile as CompanyProfileModel;
10
 use App\Models\Setting\CompanyProfile as CompanyProfileModel;
11
 use App\Models\Setting\Localization as LocalizationModel;
11
 use App\Models\Setting\Localization as LocalizationModel;
12
+use App\Services\CompanySettingsService;
12
 use App\Utilities\Localization\Timezone;
13
 use App\Utilities\Localization\Timezone;
13
 use Filament\Actions\Action;
14
 use Filament\Actions\Action;
14
 use Filament\Actions\ActionGroup;
15
 use Filament\Actions\ActionGroup;
214
         ];
215
         ];
215
 
216
 
216
         if ($record->isDirty($keysToWatch)) {
217
         if ($record->isDirty($keysToWatch)) {
218
+            CompanySettingsService::invalidateSettings($record->company_id);
217
             $this->dispatch('localizationUpdated');
219
             $this->dispatch('localizationUpdated');
218
         }
220
         }
219
 
221
 

+ 17
- 27
app/Listeners/ConfigureCompanyDefault.php View File

2
 
2
 
3
 namespace App\Listeners;
3
 namespace App\Listeners;
4
 
4
 
5
-use App\Enums\Setting\DateFormat;
6
-use App\Enums\Setting\Font;
7
 use App\Enums\Setting\PrimaryColor;
5
 use App\Enums\Setting\PrimaryColor;
8
 use App\Enums\Setting\RecordsPerPage;
6
 use App\Enums\Setting\RecordsPerPage;
9
-use App\Enums\Setting\TableSortDirection;
10
-use App\Enums\Setting\WeekStart;
11
 use App\Events\CompanyConfigured;
7
 use App\Events\CompanyConfigured;
8
+use App\Services\CompanySettingsService;
12
 use App\Utilities\Currency\ConfigureCurrencies;
9
 use App\Utilities\Currency\ConfigureCurrencies;
13
 use Filament\Facades\Filament;
10
 use Filament\Facades\Filament;
14
 use Filament\Forms\Components\DatePicker;
11
 use Filament\Forms\Components\DatePicker;
26
     public function handle(CompanyConfigured $event): void
23
     public function handle(CompanyConfigured $event): void
27
     {
24
     {
28
         $company = $event->company;
25
         $company = $event->company;
26
+        $companyId = $company->id;
29
 
27
 
30
-        session([
31
-            'current_company_id' => $company->id,
32
-            'default_language' => $company->locale->language ?? config('transmatic.source_locale'),
33
-            'default_timezone' => $company->locale->timezone ?? config('app.timezone'),
34
-            'default_pagination_page_option' => $company->appearance->records_per_page->value ?? RecordsPerPage::DEFAULT,
35
-            'default_sort' => $company->appearance->table_sort_direction->value ?? TableSortDirection::DEFAULT,
36
-            'default_primary_color' => $company->appearance->primary_color->value ?? PrimaryColor::DEFAULT,
37
-            'default_font' => $company->appearance->font->value ?? Font::DEFAULT,
38
-            'default_date_format' => $company->locale->date_format->value ?? DateFormat::DEFAULT,
39
-            'default_week_start' => $company->locale->week_start->value ?? WeekStart::DEFAULT,
40
-        ]);
28
+        session(['current_company_id' => $companyId]);
29
+
30
+        $settings = CompanySettingsService::getSettings($companyId);
41
 
31
 
42
-        app()->setLocale(session('default_language'));
43
-        locale_set_default(session('default_language'));
44
-        config(['app.timezone' => session('default_timezone')]);
45
-        date_default_timezone_set(session('default_timezone'));
32
+        app()->setLocale($settings['default_language']);
33
+        locale_set_default($settings['default_language']);
34
+        config(['app.timezone' => $settings['default_timezone']]);
35
+        date_default_timezone_set($settings['default_timezone']);
46
 
36
 
47
         $paginationPageOptions = RecordsPerPage::caseValues();
37
         $paginationPageOptions = RecordsPerPage::caseValues();
48
 
38
 
49
-        Table::configureUsing(static function (Table $table) use ($paginationPageOptions): void {
39
+        Table::configureUsing(static function (Table $table) use ($settings, $paginationPageOptions): void {
50
 
40
 
51
             $table
41
             $table
52
                 ->paginationPageOptions($paginationPageOptions)
42
                 ->paginationPageOptions($paginationPageOptions)
53
-                ->defaultSort(column: 'id', direction: session('default_sort'))
54
-                ->defaultPaginationPageOption(session('default_pagination_page_option'));
43
+                ->defaultSort(column: 'id', direction: $settings['default_sort'])
44
+                ->defaultPaginationPageOption($settings['default_pagination_page_option']);
55
         }, isImportant: true);
45
         }, isImportant: true);
56
 
46
 
57
         FilamentColor::register([
47
         FilamentColor::register([
58
-            'primary' => PrimaryColor::from(session('default_primary_color'))->getColor(),
48
+            'primary' => PrimaryColor::from($settings['default_primary_color'])->getColor(),
59
         ]);
49
         ]);
60
 
50
 
61
         Filament::getPanel('company')
51
         Filament::getPanel('company')
62
-            ->font(session('default_font'))
52
+            ->font($settings['default_font'])
63
             ->brandName($company->name);
53
             ->brandName($company->name);
64
 
54
 
65
-        DatePicker::configureUsing(static function (DatePicker $component) {
55
+        DatePicker::configureUsing(static function (DatePicker $component) use ($settings) {
66
             $component
56
             $component
67
-                ->displayFormat(session('default_date_format'))
68
-                ->firstDayOfWeek(session('default_week_start'));
57
+                ->displayFormat($settings['default_date_format'])
58
+                ->firstDayOfWeek($settings['default_week_start']);
69
         });
59
         });
70
 
60
 
71
         Tab::configureUsing(static function (Tab $tab) {
61
         Tab::configureUsing(static function (Tab $tab) {

+ 93
- 0
app/Services/CompanySettingsService.php View File

1
+<?php
2
+
3
+namespace App\Services;
4
+
5
+use App\Enums\Setting\DateFormat;
6
+use App\Enums\Setting\Font;
7
+use App\Enums\Setting\PrimaryColor;
8
+use App\Enums\Setting\RecordsPerPage;
9
+use App\Enums\Setting\TableSortDirection;
10
+use App\Enums\Setting\WeekStart;
11
+use App\Models\Company;
12
+use Illuminate\Support\Facades\Cache;
13
+
14
+class CompanySettingsService
15
+{
16
+    public static function getSettings(int $companyId): array
17
+    {
18
+        $cacheKey = "company_settings_{$companyId}";
19
+
20
+        return Cache::rememberForever($cacheKey, function () use ($companyId) {
21
+            $company = Company::with(['locale', 'appearance'])->find($companyId);
22
+
23
+            if (! $company) {
24
+                return self::getDefaultSettings();
25
+            }
26
+
27
+            return [
28
+                'default_language' => $company->locale->language ?? config('transmatic.source_locale'),
29
+                'default_timezone' => $company->locale->timezone ?? config('app.timezone'),
30
+                'default_currency' => $company->currency_code ?? 'USD',
31
+                'default_pagination_page_option' => $company->appearance->records_per_page->value ?? RecordsPerPage::DEFAULT,
32
+                'default_sort' => $company->appearance->table_sort_direction->value ?? TableSortDirection::DEFAULT,
33
+                'default_primary_color' => $company->appearance->primary_color->value ?? PrimaryColor::DEFAULT,
34
+                'default_font' => $company->appearance->font->value ?? Font::DEFAULT,
35
+                'default_date_format' => $company->locale->date_format->value ?? DateFormat::DEFAULT,
36
+                'default_week_start' => $company->locale->week_start->value ?? WeekStart::DEFAULT,
37
+            ];
38
+        });
39
+    }
40
+
41
+    public static function invalidateSettings(int $companyId): void
42
+    {
43
+        $cacheKey = "company_settings_{$companyId}";
44
+        Cache::forget($cacheKey);
45
+    }
46
+
47
+    public static function getDefaultSettings(): array
48
+    {
49
+        return [
50
+            'default_language' => config('transmatic.source_locale'),
51
+            'default_timezone' => config('app.timezone'),
52
+            'default_currency' => 'USD',
53
+            'default_pagination_page_option' => RecordsPerPage::DEFAULT,
54
+            'default_sort' => TableSortDirection::DEFAULT,
55
+            'default_primary_color' => PrimaryColor::DEFAULT,
56
+            'default_font' => Font::DEFAULT,
57
+            'default_date_format' => DateFormat::DEFAULT,
58
+            'default_week_start' => WeekStart::DEFAULT,
59
+        ];
60
+    }
61
+
62
+    public static function getSpecificSetting(int $companyId, string $key, $default = null)
63
+    {
64
+        $settings = self::getSettings($companyId);
65
+
66
+        return $settings[$key] ?? $default;
67
+    }
68
+
69
+    public static function getDefaultLanguage(int $companyId): string
70
+    {
71
+        return self::getSpecificSetting($companyId, 'default_language', config('transmatic.source_locale'));
72
+    }
73
+
74
+    public static function getDefaultTimezone(int $companyId): string
75
+    {
76
+        return self::getSpecificSetting($companyId, 'default_timezone', config('app.timezone'));
77
+    }
78
+
79
+    public static function getDefaultCurrency(int $companyId): string
80
+    {
81
+        return self::getSpecificSetting($companyId, 'default_currency', 'USD');
82
+    }
83
+
84
+    public static function getDefaultPaginationOption(int $companyId): int
85
+    {
86
+        return self::getSpecificSetting($companyId, 'default_pagination_page_option', RecordsPerPage::DEFAULT);
87
+    }
88
+
89
+    public static function getDefaultPrimaryColor(int $companyId): string
90
+    {
91
+        return self::getSpecificSetting($companyId, 'default_primary_color', PrimaryColor::DEFAULT);
92
+    }
93
+}

+ 3
- 3
package-lock.json View File

1187
             "license": "MIT"
1187
             "license": "MIT"
1188
         },
1188
         },
1189
         "node_modules/electron-to-chromium": {
1189
         "node_modules/electron-to-chromium": {
1190
-            "version": "1.5.65",
1191
-            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.65.tgz",
1192
-            "integrity": "sha512-PWVzBjghx7/wop6n22vS2MLU8tKGd4Q91aCEGhG/TYmW6PP5OcSXcdnxTe1NNt0T66N8D6jxh4kC8UsdzOGaIw==",
1190
+            "version": "1.5.67",
1191
+            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.67.tgz",
1192
+            "integrity": "sha512-nz88NNBsD7kQSAGGJyp8hS6xSPtWwqNogA0mjtc2nUYeEf3nURK9qpV18TuBdDmEDgVWotS8Wkzf+V52dSQ/LQ==",
1193
             "dev": true,
1193
             "dev": true,
1194
             "license": "ISC"
1194
             "license": "ISC"
1195
         },
1195
         },

Loading…
Cancel
Save