Buscar en la documentación

Listado: filtros, búsqueda y grupos

Cómo se arma el listado de incidentes, desde los criterios en la dirección hasta la consulta con la visibilidad de cada persona, la búsqueda y los grupos.

Módulo incidents1 min de lecturaVer en GitHub

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.

Diagrama4 carriles · 12 pasos · 2 salidas de error
SíNoSíNoSíNoFiltra, busca,agrupa u ordena1Escribe loscriterios en ladirección2Pide GET /incidentscon los parámetros3¿Parámetrosválidos?4Responde 422Si pideeliminados,¿tieneincidents.restore?5Responde 403Traduce lavisibilidad a SQL6Busca con FULLTEXTo por código7¿Agrupado?8Cuenta cada grupo ysalta losanteriores9Trae la página condesempate por id10Responde data +meta con actions11Muestra la listaagrupada o la tabla12
Los números coinciden con el paso a paso. En pantallas pequeñas el diagrama se desliza de lado.

Paso a paso

  1. 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.

  2. NavegadorEscribe los criterios en la dirección

    La búsqueda se envía desde 3 letras. Un filtro nuevo solo toca listing.ts, listQuery.ts y listApi.ts.

  3. NavegadorPide GET /incidents con los parámetros

    page, per_page (máximo 100), sort de lista blanca, search, group_by y filter[...].

  4. API¿Parámetros válidos?

    Una búsqueda necesita al menos una palabra de 3 letras o un código (TZ-26-0142 o 26-142).

  5. APISi pide eliminados, ¿tiene incidents.restore?
  6. 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.

  7. 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.

  8. 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.

  9. 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.

  10. Base de datosTrae la página con desempate por id

    Orden de lista blanca y id como 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).

  11. APIResponde data + meta con actions

    Cada incidente trae actions (lo que esta persona puede hacer), is_overdue y deadline calculados en el back; meta trae el total y, si hay grupos, el total real de cada uno.

  12. NavegadorMuestra la lista agrupada o la tabla

    Lista por defecto; ?vista=tabla cambia 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ódigoHTTPCuándoMensaje en pantalla
SEARCH_TOO_SHORT422La búsqueda no tiene una palabra de 3 letras ni un códigoNo 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_ACTION403Pide eliminados sin poder restaurarNo 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