Módulo compartido
src/app/shared/ agrupa lo reutilizable entre features. SharedModule (shared/shared.module.ts) declara y exporta la mayoría; además importa y reexporta SwitchModule y RichTextEditorModule. ConfirmDialogComponent, BootstrapModalComponent y ContactEditModalComponent no están en SharedModule: se declaran directamente en AppModule.
Componentes
| Selector | Archivo | Uso |
|---|---|---|
shared-content, shared-full | components/layout/content, layout/full | Layouts autenticado y de login (ver Rutas) |
shared-header (+ my-account, notifications, search) | components/header | Barra superior; header.component.ts avisa si las notificaciones del navegador están bloqueadas |
shared-sidebar | components/sidebar | Menú lateral alimentado por MENU_ITEMS |
shared-breadcrumb | components/breadcrumb | Título y migas en cada página |
app-connection-status-bar | components/connection-status-bar | Estado de ambos sockets |
shared-tables-ngx-datatable, shared-tables-ngx-datatable-mobile-cards | components/tables | Tablas de escritorio y tarjetas para móvil |
shared-skeletons-cards-ngx-datatable-mobile | components/skeletons | Esqueletos de carga |
app-confirm-dialog | components/confirm-dialog | Confirmaciones (title, message, icon) |
app-switch | components/switch | Interruptor compatible con formularios reactivos |
app-rich-text-editor | components/rich-text-editor | Editor de texto enriquecido (usa el helper de marcado WhatsApp) |
app-date-time-picker | components/date-time-picker | Selector de fecha y hora |
app-audio-player | components/audio-player | Reproductor de audios del chat |
shared-metric-card, shared-apex-chart | components/metric-card, apex-chart | Dashboard |
shared-modals-contact-edit | components/modals/contact-edit-modal | Edición de contacto desde el chat |
shared-accordions-toogle-panel, shared-feather-icons, svg-icon, tap-to-top | varios | Utilidades de UI |
Directivas
Detalle de cada directiva (inputs, comportamiento, uso real) en Directivas compartidas.
| Directiva | Archivo | Descripción |
|---|---|---|
*appShowWithPermission | show-with-permission.directive.ts | Muestra el contenido solo con el permiso indicado (ver RBAC) |
ShowForUserTypesDirective | show-for-user-types.directive.ts | Condiciona por tipo de usuario |
click-out-side, max-characters, only-numbers, only-alphabets, restrict-negative, decimal-input, disable-key-press, required-asterisk, validation-border, custom-badge | shared/directives/ | Utilidades de formularios y UI |
Pipes
Detalle en Pipes compartidos.
TruncatePipe y WhatsappMarkupPipe están en SharedModule. Otros pipes del directorio: sanitize-html, boolean-to-yes-no, boolean-to-active-inactive, active-descative, status-message, social-network-badge (clases badge bg-facebook / bg-instagram / bg-youtube / bg-tiktok), lowercase, gender, build-client-environment, cashdesk-type y cashdesk-commision-type (estos dos últimos son restos de otro dominio).
Validadores
Detalle en Validadores de formularios; funciones puras en Utilidades.
shared/validators/: noSpacesValidator, passwordMatch, validatorsAdult, validatorsPhoneNumber, notifyBeforeResolve.
Helpers de core/helpers
| Archivo | Contenido |
|---|---|
global/global.constant.ts | API_URLS, PAGE_URLS, API_ENDPOINTS, TOKEN_HEADER_KEY, USER_SESSION, AVAILABLE_LANGUAGES |
global/chat-socket.constants.ts | SOCKET_EVENTS |
global/whatsapp-markup.util.ts | renderWhatsappMarkup(text, { linkify? }) |
ui/nav.constant.ts | MENU_ITEMS del sidebar |
ui/ui.constant.ts | Formatos de fecha, BUTTON_ACTIONS, configuración de toastr, temas |
renderWhatsappMarkup
Convierte el marcado de WhatsApp a HTML con escape previo (&, <, >): *negrita* a strong, _cursiva_ a em, ~tachado~ a s. La rama feat/meta_connections añade el parámetro { linkify: true }: antes de formatear extrae las URLs http(s)://... a marcadores (\u0000N\u0000), recorta puntuación final (.,;:!?)]}*_~) y las vuelve a insertar como <a href=... target="_blank" rel="noopener noreferrer"> con la URL escapada. Así los asteriscos o guiones bajos dentro de una URL no se interpretan como formato. ChatConversationComponent.renderMessageMarkup usa linkify: true para el texto de mensajes y las leyendas (captions) de medios; renderWhatsappMarkup sin opciones se conserva para otros usos. El estilo de los enlaces (color: inherit, subrayado, word-break: break-all) está en chat-conversation.component.scss. El HTML resultante pasa además por SanitizationService.sanitizeHtml cuando se muestra el texto truncado de un mensaje.