Módulos de negocio (src/app/features)
Cada feature es un NgModule cargado de forma perezosa (ver Rutas). La mayoría de los CRUD siguen el mismo patrón: una página contenedora (pages/<x>-page) que compone un componente de filtro, una tabla y un modal-formulario, con las acciones protegidas por *appShowWithPermission.
| Feature | Ruta | Contenido |
|---|---|---|
| Chat de tickets (whaticket) | whaticket/chat | Lista de tickets y conversación; detalle en lista, hilo, compositor, acciones del ticket, tiempo real y etiquetas |
| Chat interno | internal-chat/conversations | Chat entre agentes: lista de conversaciones, hilo, creación de chats y grupos, panel de grupo, mensajes destacados |
| Conexiones | connections | Canales Web, WhatsApp QR e Instagram; detalle en Meta y conexiones |
| Dashboard | dashboard | Métricas y gráficos; DashboardDataService consulta /dashboard/overview, top-contacts, top-users, top-labels, messages-timeline y tickets-by-type |
| Contactos | contacts | ContactsFilter, ContactsTable, ContactModalForm; asignación de etiquetas (assign-labels) |
| Usuarios | users | UsersFilter, UsersTable, UserModalForm |
| Departamentos | departments | DepartmentsFilter, DepartmentsTable, DepartmentModal; estado en NgRx |
| Etiquetas | labels | LabelsFilter, LabelsTable, LabelModalForm |
| Respuestas rápidas | quick-responses | QuickResponsesFilter, QuickResponsesTable, QuickResponseModalForm |
| Tickets bloqueados | locked-tickets | LockedTicketsTable; vista de administración de tickets bloqueados con "Mantener conmigo" (permiso TICKET_UNLOCK_ANY, acción force-unlock) |
| Mensajes programados | scheduled-messages | ScheduledMessagesFilter y ScheduledMessagesTable (mis envíos programados); permiso MESSAGE_READ; no figura en el menú lateral |
| Perfil | profile y profile/starred-messages | Perfil del usuario (firma, avatar con recorte avatar-cropper-dialog) y página de mensajes destacados |
| Configuración | settings | Dos pestañas (SettingsTab: general y attention): GeneralSettings, BusinessHoursPanel, AutoResolutionPanel, CsatPanel; exige AdminGuard |
| Control de acceso | access-control/* | Administración de RBAC: roles, permisos, módulos, roles-permisos y constructor de permisos (permissions-builder) |
| Autenticación | auth/login, auth/reconnect | Login y reconexión en iframe |
Patrón de una pantalla CRUD
Ejemplo con conexiones (el patrón se repite en contactos, usuarios, etiquetas, etc.):
features/<x>/
├── <x>.module.ts, <x>-routing.module.ts
├── pages/<x>-page/ # solo compone: breadcrumb + tabla
└── components/
├── <x>-filter/ # formulario de filtro (emite filterApply / filterReset)
├── <x>-table/ # carga y paginación, acciones por fila
└── <x>-modal-form/ # alta y edición
Convenciones:
- La página recibe el título del
shared-breadcrumbcon claves i18n ('connections.title' | translate). - Los modales se abren con
NgbModal.open(Componente, { centered: true, size: 'lg' })y devuelven resultado conclosedodismissed; la tabla recarga la lista enclosed. - Las confirmaciones destructivas reutilizan
ConfirmDialogComponentcontitle,messageeicon. - Los textos y errores vienen de
assets/i18n/*.jsony las notificaciones de éxito delToastrNotificationService.