feat: i18n, language switcher fix, DataTable improvements, blade translations

- Translation system: lang/es/ PHP files (auth, validation, pagination, passwords)
- Rappasoft vendor translations published (lang/vendor/livewire-tables/es/)
- JSON files synced to 391 keys (EN + ES, full parity)
- APP_LOCALE changed to 'es', users.locale column default changed to 'es'
- Language switcher fixed: JS event + window.location.reload() avoids /livewire/update redirect
- SetLocale middleware fallback uses config('app.locale') instead of hardcoded 'en'
- setSortingPillsEnabled(false) on ProjectTable, CompanyTable, UserTable
- Translated 17 blade views: project-map, template-manager, layer-manager,
  company-management, phase-list, media-manager, reports-dashboard,
  client-projects, layer-upload, project-form, project-map-editor-tab,
  admin/users, projects/media, projects/templates, layouts/client
- Navigation 'Empresas' link uses __('Companies')
- Fixed typo key 'Fases and layers' -> 'Phases and layers'

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-16 18:05:53 +02:00
parent 052e1397df
commit 7d854ffb0a
85 changed files with 8499 additions and 1339 deletions
@@ -0,0 +1,89 @@
<div>
{{-- Issue form --}}
@if($editing)
<div class="card bg-base-100 shadow mb-4">
<div class="card-body">
<h3 class="card-title text-base">
{{ $editingId ? 'Editar Issue' : 'Nuevo Issue' }}
</h3>
<div class="form-control mb-3">
<label class="label"><span class="label-text">Título *</span></label>
<input type="text" wire:model="title" class="input input-bordered" placeholder="Título del issue" />
@error('title') <span class="text-error text-xs mt-1">{{ $message }}</span> @enderror
</div>
<div class="form-control mb-3">
<label class="label"><span class="label-text">Descripción</span></label>
<textarea wire:model="description" class="textarea textarea-bordered" rows="3" placeholder="Descripción..."></textarea>
</div>
<div class="grid grid-cols-2 gap-3 mb-3">
<div class="form-control">
<label class="label"><span class="label-text">Estado</span></label>
<select wire:model="status" class="select select-bordered">
<option value="open">Abierto</option>
<option value="in_review">En revisión</option>
<option value="resolved">Resuelto</option>
<option value="closed">Cerrado</option>
</select>
</div>
<div class="form-control">
<label class="label"><span class="label-text">Prioridad</span></label>
<select wire:model="priority" class="select select-bordered">
<option value="low">Baja</option>
<option value="medium">Media</option>
<option value="high">Alta</option>
<option value="critical">Crítica</option>
</select>
</div>
</div>
<div class="flex gap-2 justify-end mt-2">
<button wire:click="cancel" class="btn btn-ghost btn-sm">Cancelar</button>
<button wire:click="save" class="btn btn-primary btn-sm">Guardar</button>
</div>
</div>
</div>
@else
<div class="flex justify-end mb-3">
<button wire:click="create" class="btn btn-primary btn-sm">
+ Nuevo Issue
</button>
</div>
@endif
{{-- Issue list --}}
<div class="space-y-2">
@forelse($issues as $issue)
<div class="card bg-base-100 shadow-sm border border-base-200">
<div class="card-body py-3 px-4">
<div class="flex items-start justify-between gap-2">
<div class="flex-1">
<p class="font-medium text-sm">{{ $issue->title }}</p>
@if($issue->description)
<p class="text-xs text-base-content/60 mt-0.5 line-clamp-2">{{ $issue->description }}</p>
@endif
<div class="flex gap-2 mt-1">
<span class="badge badge-xs" style="background-color: {{ $issue->priority_color }}; color: #fff;">
{{ ucfirst($issue->priority) }}
</span>
<span class="badge badge-xs badge-outline">
{{ ucfirst(str_replace('_', ' ', $issue->status)) }}
</span>
</div>
</div>
<div class="flex gap-1 shrink-0">
<button wire:click="edit({{ $issue->id }})" class="btn btn-ghost btn-xs">Editar</button>
<button wire:click="delete({{ $issue->id }})"
wire:confirm="¿Eliminar este issue?"
class="btn btn-ghost btn-xs text-error">Eliminar</button>
</div>
</div>
</div>
</div>
@empty
<p class="text-center text-sm text-base-content/50 py-6">No hay issues registrados</p>
@endforelse
</div>
</div>