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:
@@ -189,6 +189,7 @@ class SyncController extends Controller
|
||||
'description' => ['nullable', 'string'],
|
||||
'priority' => ['nullable', 'in:' . implode(',', Issue::PRIORITIES)],
|
||||
'status' => ['nullable', 'in:' . implode(',', Issue::STATUSES)],
|
||||
'type' => ['nullable', 'in:' . implode(',', Issue::TYPES)],
|
||||
]);
|
||||
if ($v->fails()) {
|
||||
return $this->error($uuid, 'validation: ' . $v->errors()->first());
|
||||
@@ -208,6 +209,7 @@ class SyncController extends Controller
|
||||
'description' => $d['description'] ?? null,
|
||||
'priority' => $d['priority'] ?? 'medium',
|
||||
'status' => $d['status'] ?? 'open',
|
||||
'type' => $d['type'] ?? 'other',
|
||||
'reported_by' => $user->id,
|
||||
'client_updated_at' => $op['client_updated_at'] ?? null,
|
||||
]);
|
||||
@@ -223,6 +225,7 @@ class SyncController extends Controller
|
||||
'description' => ['nullable', 'string'],
|
||||
'priority' => ['nullable', 'in:' . implode(',', Issue::PRIORITIES)],
|
||||
'status' => ['nullable', 'in:' . implode(',', Issue::STATUSES)],
|
||||
'type' => ['nullable', 'in:' . implode(',', Issue::TYPES)],
|
||||
'assigned_to' => ['nullable', 'integer', 'exists:users,id'],
|
||||
'resolution_notes' => ['nullable', 'string'],
|
||||
]);
|
||||
|
||||
Reference in New Issue
Block a user