10 KiB
10 KiB
Reglas obligatorias para páginas de catálogo
Estas reglas complementan AGENTS.md, AGENTS_PAGE_STRUCTURE.md, AGENTS_WEBFORMS_PARTIAL_POSTBACKS.md y AGENTS_JAVASCRIPT_INITIALIZATION.md.
Estructura visual
Toda página de catálogo debe organizarse, en este orden:
- Título de la página.
- Barra de navegación ascendente y menú de acciones.
- Barra o control de filtros.
- Sección opcional de cabecera con indicadores o resúmenes.
- Grid o contenido principal.
- El título, breadcrumb y contenedor de acciones pertenecen a
Site.master; no deben duplicarse en cada ASPX. - La barra de navegación debe mostrar la jerarquía ascendente hasta la página actual, por ejemplo
Inicio > Desarrolladores > Fraccionamientos. - La master debe exponer un
ContentPlaceHolderde acciones dentro de un<ul>; las páginas insertan elementos<li>o unUpdatePanelque produzca esos elementos. - Las acciones principales del catálogo, como agregar, exportar o imprimir, deben colocarse en ese menú cuando corresponda.
Filtros
- Los catálogos deben usar el control reutilizable de filtros activos; no construir una barra distinta en cada página.
- El control muestra los filtros aplicados y permite abrir un modal para seleccionarlos o modificarlos.
- Los combos, buscadores y demás campos de selección pertenecen al modal de filtros.
- Todo
asp:DropDownListnuevo de una página de catálogo debe incluir la claseselect2me, además de sus clases visuales necesarias. - Los filtros aplicados deben describirse con texto comprensible y permitir retirarse o limpiarse.
- La búsqueda debe volver a enlazar indicadores y contenido principal con el mismo conjunto de filtros.
- El control reutilizable de filtros debe permanecer como server control de C#, conservar la imagen de chips y toolbar acordada, y exponer un evento
Consultarpara que cada página ejecute su propia búsqueda. - Los estilos del control de filtros pertenecen a
Styles/Filtros.cssy deben registrarse en el bundle global; no duplicarlos enEstilos2.css, en páginas ASPX ni registrarlos desde el control. - El control debe reconstruir sus hijos con IDs estables y conservar su estado y eventos al trabajar dentro de un
UpdatePanel; no debe registrar scripts globales ni crear otroScriptManager.
Presentación de grids
- Todo
asp:GridViewnuevo o modificado debe declararGridLines="None". - Su
CssClassdebe incluir la clase exactaWidthall. - No usar la clase
table-bordereden grids de catálogo o detalle. - Se pueden conservar
table,table-stripedytable-hovercuando correspondan al diseño.
Ordenamiento manual de catálogos
- Cuando una tabla de catálogo tenga el campo
Orden, no mostrar ese campo en formularios, modales ni columnas del grid. - En el alta, el procedimiento almacenado asigna
ISNULL(MAX(Orden), 0) + 1; cuando el orden dependa de una entidad padre, calcular el máximo únicamente dentro de ese padre. - Las modificaciones ordinarias conservan el orden existente. Si el registro cambia de padre, asignarle el siguiente orden disponible dentro del nuevo padre.
- El procedimiento de listado ordena primero por
Ordeny después por un campo descriptivo estable. - El grid permite reordenar filas mediante arrastre y muestra únicamente un asa visual; no muestra el valor numérico de
Orden. - El reordenamiento usa un procedimiento almacenado dedicado, valida en servidor el registro, la referencia y su pertenencia al mismo padre, y se ejecuta mediante repositorio y servicio.
- Todo cambio de orden se registra mediante
IBitacoraServicedentro de la misma transacción de aplicación que actualiza el catálogo. - La inicialización del arrastre debe ser idempotente y volver a ejecutarse después de postbacks parciales sin duplicar eventos.
Indicadores y contenido
- La sección de cabecera es opcional; se usa cuando existen indicadores útiles como totales, activos, pendientes, etapas o avances.
- No agregar tarjetas decorativas sin información funcional.
- El grid o contenido principal siempre aparece después de filtros e indicadores.
- Los estados vacíos deben explicar que no existen registros para los filtros actuales.
Mensajes originados en modales
- Los labels dentro del modal se reservan para validaciones de captura conocidas, como campos requeridos, formatos inválidos o valores que el usuario puede corregir directamente.
- Las reglas de negocio, resultados de servicios, errores técnicos, confirmaciones y mensajes de éxito deben mostrarse mediante el sistema central de alertas, aunque la acción se haya iniciado dentro del modal.
- Cuando guardar falle, el modal debe conservar los valores y permanecer abierto o volver a abrirse; la alerta debe mostrarse por encima del overlay.
- Un guardado exitoso puede cerrar el modal y mostrar un toast. Las alertas deben encolarse para no sobreponerse.
- La misma regla aplica durante postbacks completos y parciales con
UpdatePanel.
Navegación a páginas de detalle
- Cuando una fila abre una página de detalle, usar
asp:HyperLinkconNavigateUrlo un enlace HTML real. - No usar
LinkButton,CommandName,RowCommandni postback únicamente para navegar al detalle. - Los nombres de controles, métodos y variables deben identificar la entidad de la fila, por ejemplo
LnkFraccionamientoDetalle,cveFraccionamientoyfraccionamientoDetalleUrl. - Reservar los comandos con postback para operaciones de servidor como guardar, eliminar, activar o ejecutar una acción de negocio.
Pestañas y estado de página
- AjaxControlToolkit debe registrarse globalmente en
Web.configcon el prefijo exactoajax; no agregar directivas<%@ Register ... %>en cada página. - Las pestañas de catálogos y páginas de detalle deben implementarse con
ajax:TabContaineryajax:TabPanel. - No crear pestañas funcionales mediante
nav-tabsde Bootstrap, paneles ocultos manualmente o navegación JavaScript independiente del ciclo de vida de WebForms. - Las claves y modos internos que deban sobrevivir postback se conservan en propiedades tipadas de
ViewState. - No usar
asp:HiddenFieldpara estado exclusivamente del servidor. Reservarlo para valores que JavaScript necesite leer o modificar y validarlos nuevamente en el servidor. - Los nombres de las propiedades ViewState deben describir la entidad, por ejemplo
CveFraccionamientoActualyCveFraccionamientoEtapaActual.
Alta rápida y detalle
- Antes de implementar un catálogo se debe definir si agregar y editar usarán modal, página de detalle o ambas modalidades.
- La captura rápida se realiza en modal y contiene únicamente los campos necesarios para crear el registro.
- Cuando el alta tenga modalidad básica y avanzada, el modal debe incluir un botón
Avanzadoque navegue a la página completa. - Cuando editar requiera relaciones, historial, etapas, documentos, trámites o estados, debe abrir una página de detalle en lugar de sobrecargar el modal.
- La página de detalle puede editar la información principal y administrar sus relaciones en secciones o pestañas claramente identificadas.
- No asumir automáticamente que alta y edición usan la misma interfaz.
Bitácora de catálogos
- Toda alta, modificación, activación, desactivación o eliminación de un catálogo debe registrarse mediante
IBitacoraServicedentro de la misma transacción de aplicación que la operación principal. - El servicio confirma la transacción únicamente después de guardar correctamente la operación y toda su bitácora. Un fallo del encabezado, relaciones o campos revierte también la operación principal.
- No registrar consultas, búsquedas, filtros, paginación ni visualizaciones de detalle sin cambios.
- El servicio del catálogo construye el evento; el ASPX, su code-behind y los repositorios de negocio no deben registrar la bitácora directamente.
Bit_Bitacoraguarda el encabezado del movimiento. Cada evento debe enviar una lista genérica de relaciones formada por tabla, campo y valor; el procedimiento resuelveCveTabla,CveCampoy si el valor se almacena como número entero o texto.- Los catálogos ligados a un cliente deben incluir una relación para la entidad afectada y otra para
Clientes.CveCliente. Cada relación declara explícitamenteVisibleDesarrollador. - Las altas envían todos los campos auditables y establecen
DiscriminarCamposSinCambios = false. - Las modificaciones envían valor anterior y nuevo de los campos candidatos;
DiscriminarCamposSinCambios = truees el valor predeterminado y guarda únicamente los campos que realmente cambiaron, distinguiendo correctamente entreNULLy texto vacío. - Las eliminaciones registran encabezado y relaciones, pero no requieren registros en
Bit_BitacoraCampos. - Nunca registrar contraseñas, hashes, tokens, secretos ni otros valores sensibles en los campos de bitácora.
- Para consultar la bitácora,
SuperUsuarioyAdministradorpueden ver todos los registros. El rolEmpresase considera desarrollador y sólo puede ver eventos con una relaciónClientes.CveClientevisible que coincida con cualquiera de sus clientes activos enSis_UsuariosClientes. - Antes de liberar un catálogo nuevo, sus tablas y campos auditables deben estar registrados y activos en
Bit_TablasyBit_Campos, junto con el script de configuración correspondiente.
Regla actual para fraccionamientos
Agregar fraccionamientousa captura rápida en modal.EditaroVer detallenavega a una página dedicada.- El detalle muestra la información del fraccionamiento, sus etapas, los trámites asociados a cada etapa y el último estado disponible, incluyendo estados finales como cancelado o terminado cuando existan.
Legibilidad del código
- El ASPX, C#, CSS y JavaScript del catálogo debe conservar sangría y saltos de línea legibles.
- No colocar grids, columnas, modales, controles anidados, validaciones ni varios statements C# en una sola línea.
- Los archivos deben quedar preparados para que otro programador pueda localizar y modificar una sección sin tener que reformatearla primero.
WebForms
- Los modales permanecen dentro del único formulario de
Site.master; ninguna página declara un formulario adicional. - Los eventos de botones dentro de acciones o modales siguen pasando por code-behind delgado, servicios, contratos, repositorios y procedimientos almacenados.
- Después de un postback parcial, Select2 y los modales deben reinicializarse de manera idempotente según
AGENTS_JAVASCRIPT_INITIALIZATION.md. - No copiar VB del sistema anterior; sólo usarlo como referencia funcional y reconstruir la solución en C#.