feat(issues): tipo/categoría de incidencia (defecto/seguridad/calidad/documentación/otro)

- Issue::TYPES + typeLabels() (ES) + accessors type_label/type_color; columna type
  (string, default 'other') + fillable.
- IssueForm: select "Tipo de incidencia" con validación/carga/guardado.
- IssueTable: columna Tipo (badge) + SelectFilter por tipo.
- IssueDetail: badge de tipo en la cabecera.
- Sync offline: issue.create/update aceptan type; bundle (mapIssue) lo incluye.

Tests: IssuesEnhancementsTest (create muestra el campo vía HTTP, edición persiste) +
MobileApiTest (create con type). Suite 61 passing (solo 2 pre-existentes sqlite).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-18 13:30:54 +02:00
parent 19e1f57983
commit 3d0f4d5cad
10 changed files with 114 additions and 2 deletions
@@ -26,6 +26,7 @@
<div class="flex flex-wrap items-center gap-2 mt-2">
<span class="badge badge-sm" style="background-color: {{ $issue->status_color }}; color:#fff; border:0;">{{ $statusLabel }}</span>
<span class="badge badge-sm" style="background-color: {{ $issue->priority_color }}; color:#fff; border:0;">Prioridad: {{ $priorityLabel }}</span>
<span class="badge badge-sm" style="background-color: {{ $issue->type_color }}; color:#fff; border:0;">{{ $issue->type_label }}</span>
@if($issue->feature)
<span class="badge badge-outline badge-sm">{{ $issue->feature->name }}</span>
@endif
@@ -80,6 +80,22 @@
</div>
</div>
{{-- Tipo / categoría --}}
<div class="form-control">
<label class="label">
<span class="label-text font-medium">Tipo de incidencia <span class="text-error">*</span></span>
</label>
<select wire:model="type"
class="select select-bordered w-full @error('type') select-error @enderror">
@foreach(\App\Models\Issue::typeLabels() as $value => $label)
<option value="{{ $value }}">{{ $label }}</option>
@endforeach
</select>
@error('type')
<label class="label"><span class="label-text-alt text-error">{{ $message }}</span></label>
@enderror
</div>
{{-- Asignado a --}}
<div class="form-control">
<label class="label"><span class="label-text font-medium">Asignado a</span></label>