Los criterios del listado viven solo en la dirección (?estado=…&agrupar=…): se pueden compartir, el botón Atrás funciona y una recarga muestra lo mismo. La API aplica a cada persona la misma regla de visibilidad que el detalle, traducida a SQL, así que nadie ve en la lista algo que no podría abrir.
Paso a paso
- PersonaFiltra, busca, agrupa u ordena
Estado, prioridad, asignado (o sin asignar), creador, rangos de creación y de vencimiento, vencidos, reapertura pendiente y, con permiso, ver eliminados. En celular y tablet los filtros van en un panel en borrador que dice cuántos saldrían antes de aplicar.
- NavegadorEscribe los criterios en la dirección
La búsqueda se envía desde 3 letras. Un filtro nuevo solo toca
listing.ts,listQuery.tsylistApi.ts. - NavegadorPide GET /incidents con los parámetros
page,per_page(máximo 100),sortde lista blanca,search,group_byyfilter[...]. - API¿Parámetros válidos?
Una búsqueda necesita al menos una palabra de 3 letras o un código (
TZ-26-0142o26-142). - APISi pide eliminados, ¿tiene incidents.restore?
- APITraduce la visibilidad a SQL
Todos (
incidents.view.any), lo propio, lo asignado y lo sin asignar, según los permisos. Es la misma regla del detalle (VisibilityScope) y una prueba compara ambas persona por persona. - Base de datosBusca con FULLTEXT o por código
Búsqueda booleana con prefijos ("impre" encuentra "impresora") sobre título y descripción; los operadores que alguien intente colar se quitan. Un código se busca exacto con su año.
- Base de datos¿Agrupado?
Por defecto la lista se agrupa por vencimiento: Vencidos, Vencen hoy, Próximos 7 días, Más adelante y Terminados. También por estado, prioridad, asignado o sin grupos.
- Base de datosCuenta cada grupo y salta los anteriores
Cuenta cada grupo con índices, sin cruzar tablas; salta los grupos que quedan antes de la página y pide solo los ids de los que la tocan. Con 100.000 incidentes, entre 22 y 42 ms.
- Base de datosTrae la página con desempate por id
Orden de lista blanca y
idcomo desempate, para que dos filas iguales no se repitan ni se salten entre páginas. Carga todo lo de la página de una vez (sin N+1). - APIResponde data + meta con actions
Cada incidente trae
actions(lo que esta persona puede hacer),is_overdueydeadlinecalculados en el back;metatrae el total y, si hay grupos, el total real de cada uno. - NavegadorMuestra la lista agrupada o la tabla
Lista por defecto;
?vista=tablacambia a tabla en portátil y monitor (con vista previa lateral en monitor) y tarjetas en tablet y celular. Si otras personas cambian incidentes, aparece "Hay N incidentes con cambios de otras personas · Actualizar" sin mover las filas.
Qué ve la persona en cada error
| Código | HTTP | Cuándo | Mensaje en pantalla |
|---|---|---|---|
SEARCH_TOO_SHORT | 422 | La búsqueda no tiene una palabra de 3 letras ni un código | No tiene mensaje en pantalla: el navegador solo envía la búsqueda desde 3 letras, así que este error solo lo recibe quien llama a la API directamente. |
FORBIDDEN_ACTION | 403 | Pide eliminados sin poder restaurar | No tienes permiso para hacer esta acción. Si crees que deberías tenerlo, habla con un administrador. |
Una lista sin resultados no es un error: muestra el estado vacío con la opción de quitar los filtros.
Dónde está en el código
ListIncidentsyListIncidentsRequest.VisibilityScopeyVisibilitySql: una regla, dos formas.EloquentIncidentList,IncidentFilterseIncidentGroups.SearchText: mínimo de la búsqueda.listQuery,useIncidentListeIncidentListPage.- Explicación del módulo: Módulo Incidents.