1/** 2 * Alert Service - Wrapper para o componente Modal 3 * 4 * Fornece uma API simplificada para alertas e confirmações 5 * inspirada no SweetAlert, mas com a estética premium do portal. 6 */ 7const CoreAlert = { 8 /** 9 * Mostra uma mensagem de sucesso 10 */ 11 success(title, message, buttonLabel = 'OK', autoClose = true) { 12 return new Promise((resolve) => { 13 Modal.showSuccess(title, message, buttonLabel, resolve, autoClose); 14 }); 15 }, 16 17 /** 18 * Mostra uma mensagem de erro 19 */ 20 error(title, message, buttonLabel = 'Fechar') { 21 return new Promise((resolve) => { 22 Modal.showError(title, message, buttonLabel, resolve); 23 }); 24 }, 25 26 /** 27 * Mostra um aviso informativo 28 */ 29 info(title, message, buttonLabel = 'Entendi') { 30 return new Promise((resolve) => { 31 Modal.showInfo(title, message, buttonLabel, resolve); 32 }); 33 }, 34 35 /** 36 * Mostra um alerta de atenção/aviso 37 */ 38 warning(title, message, buttonLabel = 'Entendi') { 39 return new Promise((resolve) => { 40 const modalId = Modal.create({ 41 type: 'warning', 42 title: title, 43 content: `<p class="text-gray-600">${message}</p>`, 44 submitLabel: buttonLabel 45 }); 46 47 const button = document.getElementById(`${modalId}-submit-btn`); 48 if (button) { 49 button._resolveHandler = resolve; 50 button.addEventListener('click', () => { 51 resolve(); 52 }, { once: true }); 53 } 54 }); 55 }, 56 57 /** 58 * Solicita confirmação do usuário 59 */ 60 confirm(options = {}) { 61 const { 62 title = 'Confirmar', 63 text = 'Deseja realmente prosseguir?', 64 html = null, 65 confirmLabel = 'Confirmar', 66 cancelLabel = 'Cancelar', 67 type = 'warning' 68 } = options; 69 70 return new Promise((resolve) => { 71 const modalId = Modal.create({ 72 type: type, 73 title: title, 74 content: html ? `<div class="text-gray-600">${html}</div>` : `<p class="text-gray-600">${Modal.escapeHtml(text)}</p>`, 75 submitLabel: confirmLabel, 76 cancelLabel: cancelLabel 77 }); 78 79 // Handler único de resolução para evitar múltiplas chamadas 80 let isResolved = false; 81 const safeResolve = (value) => { 82 if (isResolved) return; 83 isResolved = true; 84 resolve(value); 85 }; 86 87 // Se o usuário clicar em confirmar 88 const submitButton = document.getElementById(`${modalId}-submit-btn`); 89 if (submitButton) { 90 submitButton.addEventListener('click', () => { 91 safeResolve({ isConfirmed: true }); 92 Modal.closeAndRemove(modalId); 93 }, { once: true }); 94 } 95 96 // Se o usuário clicar em cancelar 97 // O seletor busca botões que não são o de submit dentro do footer 98 const footerButtons = document.querySelectorAll(`#${modalId} .pb-10 button`); 99 footerButtons.forEach(btn => { 100 if (btn.id !== `${modalId}-submit-btn`) { 101 btn.addEventListener('click', () => { 102 safeResolve({ isConfirmed: false }); 103 Modal.closeAndRemove(modalId); 104 }, { once: true }); 105 } 106 }); 107 108 // Backdrop click também deve resolver como false 109 const backdrop = document.querySelector(`#${modalId} .fixed.inset-0:not(.relative)`); 110 if (backdrop) { 111 backdrop.addEventListener('click', () => { 112 safeResolve({ isConfirmed: false }); 113 Modal.closeAndRemove(modalId); 114 }, { once: true });
115 } 116 117 // ESC key handler para este modal especÃfico 118 const escHandler = (e) => { 119 if (e.key === 'Escape') { 120 safeResolve({ isConfirmed: false }); 121 Modal.closeAndRemove(modalId); 122 document.removeEventListener('keydown', escHandler); 123 } 124 }; 125 document.addEventListener('keydown', escHandler); 126 }); 127 } 128}; 129 130window.CoreAlert = CoreAlert;
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.