diff --git a/app/Nova/HomeSlide.php b/app/Nova/HomeSlide.php index 5ae411264..a6b30abc3 100644 --- a/app/Nova/HomeSlide.php +++ b/app/Nova/HomeSlide.php @@ -5,7 +5,6 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\File; use Laravel\Nova\Fields\Boolean; -use Laravel\Nova\Fields\Code; use Laravel\Nova\Fields\DateTime; use Laravel\Nova\Fields\ID; use Laravel\Nova\Fields\Number; @@ -94,8 +93,117 @@ public static function localeOptions(): array return $out; } + private const OVERRIDE_KEYS = ['title', 'description', 'button_text', 'button2_text']; + + private static function parseOverrideAttribute(string $attribute): ?array + { + if (! str_starts_with($attribute, 'override_') || strlen($attribute) < 12) { + return null; + } + $rest = substr($attribute, 9); + $parts = explode('_', $rest); + if (count($parts) < 2) { + return null; + } + $locale = $parts[0]; + $key = implode('_', array_slice($parts, 1)); + if (! in_array($key, self::OVERRIDE_KEYS, true)) { + return null; + } + return ['locale' => $locale, 'key' => $key]; + } + public function fields(Request $request): array { + $locales = self::localesSorted(); + $overrideFields = []; + + foreach ($locales as $locale) { + $overrideFields[] = Text::make('[' . $locale . '] Title', 'override_' . $locale . '_title') + ->nullable() + ->onlyOnForms() + ->hideFromIndex() + ->resolveUsing(function () use ($locale) { + $overrides = $this->resource->locale_overrides ?? []; + return $overrides[$locale]['title'] ?? ''; + }) + ->fillUsing(function ($request, $model, $attribute, $requestAttribute) { + $parsed = self::parseOverrideAttribute($attribute); + if ($parsed === null) { + return; + } + $overrides = $model->locale_overrides ?? []; + if (! isset($overrides[$parsed['locale']])) { + $overrides[$parsed['locale']] = []; + } + $overrides[$parsed['locale']][$parsed['key']] = $request->get($requestAttribute) ?: null; + $model->locale_overrides = $overrides; + }); + + $overrideFields[] = Textarea::make('[' . $locale . '] Description', 'override_' . $locale . '_description') + ->nullable() + ->onlyOnForms() + ->hideFromIndex() + ->resolveUsing(function () use ($locale) { + $overrides = $this->resource->locale_overrides ?? []; + return $overrides[$locale]['description'] ?? ''; + }) + ->fillUsing(function ($request, $model, $attribute, $requestAttribute) { + $parsed = self::parseOverrideAttribute($attribute); + if ($parsed === null) { + return; + } + $overrides = $model->locale_overrides ?? []; + if (! isset($overrides[$parsed['locale']])) { + $overrides[$parsed['locale']] = []; + } + $overrides[$parsed['locale']][$parsed['key']] = $request->get($requestAttribute) ?: null; + $model->locale_overrides = $overrides; + }); + + $overrideFields[] = Text::make('[' . $locale . '] Button', 'override_' . $locale . '_button_text') + ->nullable() + ->onlyOnForms() + ->hideFromIndex() + ->resolveUsing(function () use ($locale) { + $overrides = $this->resource->locale_overrides ?? []; + return $overrides[$locale]['button_text'] ?? ''; + }) + ->fillUsing(function ($request, $model, $attribute, $requestAttribute) { + $parsed = self::parseOverrideAttribute($attribute); + if ($parsed === null) { + return; + } + $overrides = $model->locale_overrides ?? []; + if (! isset($overrides[$parsed['locale']])) { + $overrides[$parsed['locale']] = []; + } + $overrides[$parsed['locale']][$parsed['key']] = $request->get($requestAttribute) ?: null; + $model->locale_overrides = $overrides; + }); + + $overrideFields[] = Text::make('[' . $locale . '] Button 2', 'override_' . $locale . '_button2_text') + ->nullable() + ->onlyOnForms() + ->hideFromIndex() + ->resolveUsing(function () use ($locale) { + $overrides = $this->resource->locale_overrides ?? []; + return $overrides[$locale]['button2_text'] ?? ''; + }) + ->fillUsing(function ($request, $model, $attribute, $requestAttribute) { + $parsed = self::parseOverrideAttribute($attribute); + if ($parsed === null) { + return; + } + $overrides = $model->locale_overrides ?? []; + if (! isset($overrides[$parsed['locale']])) { + $overrides[$parsed['locale']] = []; + } + $overrides[$parsed['locale']][$parsed['key']] = $request->get($requestAttribute) ?: null; + $model->locale_overrides = $overrides; + }); + } + return [ ID::make()->sortable(), @@ -134,13 +242,8 @@ public function fields(Request $request): array ->help('Target date/time for countdown (e.g. Code Week start). Only used if Show countdown is on.'), new Panel('Per-locale overrides (optional)', [ - Code::make('Locale overrides', 'locale_overrides') - ->json() - ->nullable() - ->help( - 'Optional. Override text per locale. Use "Export locale overrides (CSV)" to download a template, edit in Excel, then "Import locale overrides (CSV)" to apply. ' . - 'Or enter JSON: {"es": {"title": "Título", "description": "...", "button_text": "Ver", "button2_text": ""}}. Leave empty to use lang keys above.' - ), + \Laravel\Nova\Fields\Heading::make('One row per locale (A–Z). Columns: Title, Description, Button, Button 2. Use Export/Import CSV for bulk edit.'), + ...$overrideFields, ]), ]; }