diff --git a/app/Nova/HomeSlide.php b/app/Nova/HomeSlide.php index d4f865d61..5ae411264 100644 --- a/app/Nova/HomeSlide.php +++ b/app/Nova/HomeSlide.php @@ -5,6 +5,7 @@ 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; @@ -93,117 +94,8 @@ 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(), @@ -242,7 +134,13 @@ 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)', [ - ...$overrideFields, + 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.' + ), ]), ]; } diff --git a/database/migrations/2026_02_09_180000_add_locale_overrides_to_home_slides_if_missing.php b/database/migrations/2026_02_09_180000_add_locale_overrides_to_home_slides_if_missing.php new file mode 100644 index 000000000..e31c29684 --- /dev/null +++ b/database/migrations/2026_02_09_180000_add_locale_overrides_to_home_slides_if_missing.php @@ -0,0 +1,30 @@ +json('locale_overrides')->nullable()->after('button2_text'); + }); + } + } + + public function down(): void + { + if (Schema::hasColumn('home_slides', 'locale_overrides')) { + Schema::table('home_slides', function (Blueprint $table) { + $table->dropColumn('locale_overrides'); + }); + } + } +};