// Confirmación de envío de formulario en welcome document.addEventListener('DOMContentLoaded', function () { const form = document.querySelector('form[action="/formulario"]'); const btnConfirmar = document.getElementById('btnConfirmarEnvioForm'); if (form && btnConfirmar) { btnConfirmar.addEventListener('click', function () { form.submit(); }); } // Confirmación de envío de formulario en dashboard cliente const formCliente = document.querySelector('form[action="/cliente/formulario"]'); const btnConfirmarCliente = document.getElementById('btnConfirmarEnvioFormCliente'); if (formCliente && btnConfirmarCliente) { btnConfirmarCliente.addEventListener('click', function () { formCliente.submit(); }); } }); import './bootstrap'; import * as bootstrap from 'bootstrap'; import html2canvas from 'html2canvas'; import { Calendar } from '@fullcalendar/core'; import dayGridPlugin from '@fullcalendar/daygrid'; import interactionPlugin from '@fullcalendar/interaction'; import esLocale from '@fullcalendar/core/locales/es'; window.html2canvas = html2canvas; import timeGridPlugin from '@fullcalendar/timegrid'; window.FullCalendar = { Calendar }; window.FullCalendarPlugins = { dayGridPlugin, interactionPlugin, timeGridPlugin, }; window.FullCalendarLocales = { es: esLocale, }; window.bootstrap = bootstrap; document.addEventListener('DOMContentLoaded', function () { const carouseles = document.querySelectorAll('.carousel'); if (!carouseles.length) { return; } carouseles.forEach((carouselEl) => { const totalItems = carouselEl.querySelectorAll('.carousel-item').length; if (totalItems <= 1) { return; } const instancia = bootstrap.Carousel.getOrCreateInstance(carouselEl, { interval: 10000, ride: 'carousel', pause: 'hover', wrap: true, touch: true, }); instancia.cycle(); }); }); const requiereSidebarLateral = window.location.pathname.startsWith('/administrador') || window.location.pathname.startsWith('/profesional'); const mainSidebarTarget = requiereSidebarLateral ? document.querySelector('main') : null; const limpiarEstadoPendingSidebar = () => { document.documentElement.classList.remove('sidebar-nav-pending'); mainSidebarTarget?.classList.remove('sidebar-main-pending'); }; if (requiereSidebarLateral) { if (mainSidebarTarget) { mainSidebarTarget.classList.add('admin-main-content', 'sidebar-main-pending'); } document.documentElement.classList.add('sidebar-nav-pending'); window.setTimeout(() => { limpiarEstadoPendingSidebar(); }, 900); } const asegurarFavicon = () => { const faviconHref = '/favicon.ico?v=20260403'; const rels = ['icon', 'shortcut icon', 'apple-touch-icon']; rels.forEach((rel) => { let link = document.head?.querySelector(`link[rel="${rel}"]`); if (!link) { link = document.createElement('link'); link.setAttribute('rel', rel); document.head?.appendChild(link); } link.setAttribute('type', 'image/x-icon'); link.setAttribute('href', faviconHref); }); }; if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', asegurarFavicon, { once: true }); } else { asegurarFavicon(); } document.addEventListener('DOMContentLoaded', function () { const mapWidgets = document.querySelectorAll('[data-map-widget]'); if (!mapWidgets.length) { return; } const updateMapWidget = (widget) => { const iframe = widget.querySelector('[data-map-embed]'); const fallback = widget.querySelector('[data-map-fallback]'); if (!iframe) { return; } const mapSrc = iframe.getAttribute('data-map-src') || ''; const offline = !navigator.onLine; if (offline) { iframe.classList.add('d-none'); fallback?.classList.remove('d-none'); return; } if (mapSrc && iframe.getAttribute('src') !== mapSrc) { iframe.setAttribute('src', mapSrc); } iframe.classList.remove('d-none'); fallback?.classList.add('d-none'); }; mapWidgets.forEach((widget) => { const iframe = widget.querySelector('[data-map-embed]'); if (iframe) { iframe.addEventListener('error', () => { iframe.classList.add('d-none'); widget.querySelector('[data-map-fallback]')?.classList.remove('d-none'); }); } updateMapWidget(widget); }); window.addEventListener('online', () => { mapWidgets.forEach(updateMapWidget); }); window.addEventListener('offline', () => { mapWidgets.forEach(updateMapWidget); }); }); const STORAGE_KEY_NOTIF_CERRADAS = 'notif_cerradas_profesional'; const STORAGE_KEY_NOTIF_VISTAS = 'notif_vistas_profesional'; function getNotificacionesCerradas() { try { return JSON.parse(localStorage.getItem(STORAGE_KEY_NOTIF_CERRADAS) || '[]'); } catch { return []; } } function guardarNotificacionesCerradas(claves) { localStorage.setItem(STORAGE_KEY_NOTIF_CERRADAS, JSON.stringify(claves)); } function getNotificacionesVistas() { try { const vistas = JSON.parse(localStorage.getItem(STORAGE_KEY_NOTIF_VISTAS) || '[]'); return Array.from(new Set([...(Array.isArray(vistas) ? vistas : []), ...getNotificacionesCerradas()])); } catch { return getNotificacionesCerradas(); } } function guardarNotificacionesVistas(claves) { localStorage.setItem(STORAGE_KEY_NOTIF_VISTAS, JSON.stringify(Array.from(new Set(claves)))); } function marcarNotificacionesComoVistas(clavesActivas) { if (!Array.isArray(clavesActivas) || !clavesActivas.length) { return; } const vistasActuales = getNotificacionesVistas(); guardarNotificacionesVistas([...vistasActuales, ...clavesActivas]); } function podarNotificacionesVistas(clavesActivas) { const vistas = getNotificacionesVistas(); if (!vistas.length) { return []; } const vistasVigentes = vistas.filter((clave) => clavesActivas.includes(clave)); if (vistasVigentes.length !== vistas.length) { guardarNotificacionesVistas(vistasVigentes); } return vistasVigentes; } function actualizarBadgeNotificaciones() { const enlace = document.querySelector('a[href="/profesional/notificaciones"][data-notificaciones-claves]'); if (!enlace) { return; } const badge = enlace.querySelector('.js-notificaciones-badge'); if (!badge) { return; } let clavesActivas = []; try { clavesActivas = JSON.parse(enlace.dataset.notificacionesClaves || '[]'); } catch { clavesActivas = []; } if (window.location.pathname === '/profesional/notificaciones') { marcarNotificacionesComoVistas(clavesActivas); } const vistas = podarNotificacionesVistas(clavesActivas); const tienePendientes = clavesActivas.some((clave) => !vistas.includes(clave)); badge.classList.toggle('d-none', !tienePendientes); } window.actualizarBadgeNotificaciones = actualizarBadgeNotificaciones; actualizarBadgeNotificaciones(); document.addEventListener('DOMContentLoaded', function () { actualizarBadgeNotificaciones(); }); document.addEventListener('DOMContentLoaded', function () { const soloNumeros = ['cuil', 'celular', 'telefono']; const soloLetras = ['nombre', 'apellido']; const normalizarIdentificador = (valor) => String(valor || '').trim().toLowerCase(); const esCampo = (input, listaCampos) => { const nombre = normalizarIdentificador(input.name); const id = normalizarIdentificador(input.id); return listaCampos.includes(nombre) || listaCampos.includes(id); }; const esNumerico = (char) => /\d/.test(char); const esLetra = (char) => /[A-Za-zÁÉÍÓÚáéíóúÑñ\s]/.test(char); const inputs = Array.from(document.querySelectorAll('input')); inputs.forEach((input) => { if (esCampo(input, soloNumeros)) { input.setAttribute('inputmode', 'numeric'); input.setAttribute('pattern', '[0-9]+'); input.addEventListener('beforeinput', function (e) { if (!esNumerico(e.data) && e.data !== null) { e.preventDefault(); } }); input.addEventListener('input', function () { input.value = input.value.replace(/\D/g, ''); }); } if (esCampo(input, soloLetras)) { input.setAttribute('pattern', '[A-Za-zÁÉÍÓÚáéíóúÑñ\\s]+'); input.addEventListener('beforeinput', function (e) { if (!esLetra(e.data) && e.data !== null) { e.preventDefault(); } }); input.addEventListener('input', function () { input.value = input.value.replace(/[^A-Za-zÁÉÍÓÚáéíóúÑñ\s]/g, ''); }); } if (input.type === 'password') { const formAction = String(input.form?.getAttribute('action') || ''); const nombre = normalizarIdentificador(input.name); const esLogin = formAction.includes('/login/'); const esContraActual = nombre === 'contra_actual' || nombre === 'contra_actual_secreta'; if (!esLogin && !esContraActual) { input.setAttribute('minlength', '6'); } } }); }); document.addEventListener('DOMContentLoaded', function () { if (!window.location.pathname.startsWith('/administrador')) { return; } const header = document.querySelector('.app-navbar'); if (!header) { limpiarEstadoPendingSidebar(); return; } const navbarContainer = header.querySelector('.navbar .container'); const collapse = header.querySelector('#menuPrincipal'); const logout = (collapse || header).querySelector('a[href="/logout"]'); const adminMenuList = (collapse || header).querySelector('ul.navbar-nav'); if (adminMenuList && !adminMenuList.querySelector('a[href="/administrador/ayuda"]')) { const ayudaItem = document.createElement('li'); ayudaItem.className = 'nav-item'; const ayudaLink = document.createElement('a'); ayudaLink.className = 'btn app-navbar-link'; ayudaLink.setAttribute('href', '/administrador/ayuda'); ayudaLink.setAttribute('title', 'Ayuda para administrador'); ayudaLink.setAttribute('aria-label', 'Ayuda para administrador'); ayudaLink.textContent = '¿Necesitas Ayuda?'; ayudaItem.appendChild(ayudaLink); adminMenuList.appendChild(ayudaItem); } const menuLinks = Array.from((collapse || header).querySelectorAll('ul .app-navbar-link')); if (menuLinks.length && !document.querySelector('.admin-sidebar')) { const aside = document.createElement('aside'); aside.className = 'admin-sidebar'; aside.setAttribute('aria-label', 'Menu administrador'); const nav = document.createElement('nav'); nav.className = 'admin-sidebar-nav'; const subitemsContenido = [ { label: 'Quienes Somos', href: '/administrador/contenido/quienes-somos' }, { label: 'Profesiones', href: '/administrador/contenido/profesiones' }, { label: 'Servicios', href: '/administrador/contenido/servicios' }, { label: 'Asistente Virtual', href: '/administrador/contenido/asistente-virtual/ver-faqs' }, ]; menuLinks.forEach((link) => { const href = link.getAttribute('href') || ''; if (href === '/administrador/contenido-web') { const enContenido = window.location.pathname.startsWith('/administrador/contenido/') || window.location.pathname === '/administrador/contenido-web' || window.location.pathname === '/administrador/asistente-consultas'; const details = document.createElement('details'); details.className = 'admin-sidebar-details'; if (enContenido) { details.setAttribute('open', ''); } const summary = document.createElement('summary'); summary.className = 'btn app-navbar-link admin-sidebar-link admin-sidebar-summary'; if (enContenido) { summary.classList.add('active'); } summary.textContent = 'Contenido'; details.appendChild(summary); const subitemsContenidoConConsultas = [ ...subitemsContenido, { label: 'Consultas sin respuesta', href: '/administrador/asistente-consultas' }, ]; subitemsContenidoConConsultas.forEach(({ label, href: subhref }) => { const a = document.createElement('a'); a.className = 'btn app-navbar-link admin-sidebar-link admin-sidebar-sublink'; a.setAttribute('href', subhref); if (window.location.pathname === subhref) { a.classList.add('active'); } a.textContent = label; details.appendChild(a); }); nav.appendChild(details); return; } const item = link.cloneNode(true); item.classList.add('admin-sidebar-link'); const esRutaActiva = href && href !== '#top' && (window.location.pathname === href || window.location.pathname.startsWith(`${href}/`)); const esMisDatosEnDashboard = href === '#top' && window.location.pathname === '/administrador/dashboard'; if (esRutaActiva || esMisDatosEnDashboard) { item.classList.add('active'); } nav.appendChild(item); }); aside.appendChild(nav); header.insertAdjacentElement('afterend', aside); } if (collapse) { const ul = collapse.querySelector('ul'); if (ul) { ul.remove(); } collapse.classList.remove('collapse', 'navbar-collapse'); collapse.removeAttribute('id'); collapse.classList.add('d-flex', 'ms-auto', 'align-items-center'); } const toggler = header.querySelector('.navbar-toggler'); if (toggler) { toggler.remove(); } if (logout && navbarContainer) { logout.classList.add('btn', 'app-navbar-link'); navbarContainer.appendChild(logout); } const actualizarOffsetSidebar = () => { const alturaNavbar = Math.ceil(header.offsetHeight || 74); document.documentElement.style.setProperty('--admin-navbar-height', `${alturaNavbar}px`); }; actualizarOffsetSidebar(); window.addEventListener('resize', actualizarOffsetSidebar); limpiarEstadoPendingSidebar(); }); document.addEventListener('DOMContentLoaded', function () { if (!window.location.pathname.startsWith('/profesional')) { return; } const header = document.querySelector('.app-navbar'); if (!header) { limpiarEstadoPendingSidebar(); return; } const navbarContainer = header.querySelector('.navbar .container'); const collapse = header.querySelector('#menuPrincipal'); const logout = (collapse || header).querySelector('a[href="/logout"]'); const menuList = (collapse || header).querySelector('ul.navbar-nav'); if (menuList && !menuList.querySelector('a[href="/profesional/ayuda"]')) { const ayudaItem = document.createElement('li'); ayudaItem.className = 'nav-item'; const ayudaLink = document.createElement('a'); ayudaLink.className = 'btn app-navbar-link'; ayudaLink.setAttribute('href', '/profesional/ayuda'); ayudaLink.setAttribute('title', 'Ayuda para profesionales'); ayudaLink.setAttribute('aria-label', 'Ayuda para profesionales'); ayudaLink.textContent = '¿Necesitas Ayuda?'; ayudaItem.appendChild(ayudaLink); menuList.appendChild(ayudaItem); } const menuLinks = Array.from((collapse || header).querySelectorAll('ul .app-navbar-link')); if (menuLinks.length && !document.querySelector('.admin-sidebar')) { const aside = document.createElement('aside'); aside.className = 'admin-sidebar'; aside.setAttribute('aria-label', 'Menu profesional'); const nav = document.createElement('nav'); nav.className = 'admin-sidebar-nav'; menuLinks.forEach((link) => { const href = link.getAttribute('href') || ''; const item = link.cloneNode(true); item.classList.add('admin-sidebar-link'); const esRutaActiva = href && href !== '#top' && (window.location.pathname === href || window.location.pathname.startsWith(`${href}/`)); const esMiAgendaEnDashboard = href === '#top' && window.location.pathname === '/profesional/dashboard'; if (esRutaActiva || esMiAgendaEnDashboard) { item.classList.add('active'); } nav.appendChild(item); }); aside.appendChild(nav); header.insertAdjacentElement('afterend', aside); } if (collapse) { const ul = collapse.querySelector('ul'); if (ul) { ul.remove(); } collapse.classList.remove('collapse', 'navbar-collapse'); collapse.removeAttribute('id'); collapse.classList.add('d-flex', 'ms-auto', 'align-items-center'); } const toggler = header.querySelector('.navbar-toggler'); if (toggler) { toggler.remove(); } if (logout && navbarContainer) { logout.classList.add('btn', 'app-navbar-link'); navbarContainer.appendChild(logout); } const actualizarOffsetSidebar = () => { const alturaNavbar = Math.ceil(header.offsetHeight || 74); document.documentElement.style.setProperty('--admin-navbar-height', `${alturaNavbar}px`); }; actualizarOffsetSidebar(); window.addEventListener('resize', actualizarOffsetSidebar); limpiarEstadoPendingSidebar(); });