(function(){ var TAB = "USULISTASITE"; var IDDIV = ""; var FORM_ID = "BFAICS_USULISTASITE_Form1"; if (IDDIV){ var container = document.getElementById(IDDIV); var form = container.querySelector(FORM_ID); if (!form) { form = document.getElementById(FORM_ID);} } else { var form = document.getElementById(FORM_ID); } if (!form) return; window.AICS_SESSAO_ID = gerarSessaoId(); var MANIFEST = {onInsert: True}; // ========== Helpers locais ========== function getFormData(form){ var data = {}; var forms = document.querySelectorAll("form"); for (var i = 0; i < forms.length; i++){ var f = forms[i]; if (!f.id) continue; var inputs = f.querySelectorAll("input,select,textarea"); for (var j = 0; j < inputs.length; j++){ var el = inputs[j]; if (!el.name) continue; //data[f.id + ":" + el.name] = el.value; data[el.name] = el.value; } } return data; } function applyChanges(changes){ if (!changes) return; Object.keys(changes).forEach(function(col){ var el = document.getElementById(TAB + "_" + col); if (el) el.value = changes[col]; }); } // ========== Deteccao do Bootstrap (opcional) ========== function detectarBootstrap() { if (typeof bootstrap !== "undefined" && bootstrap.Modal) return 5; if (typeof $ !== "undefined" && $.fn && $.fn.modal) { var ver = $.fn.modal.Constructor && $.fn.modal.Constructor.VERSION; if (ver && ver.indexOf("3") === 0) return 3; if (ver && ver.indexOf("4") === 0) return 4; } return 0; } var BS_VERSION = detectarBootstrap(); // ========== CSS customizado (injetado 1 vez) ========== function injetarCSS() { if (document.getElementById("aics-modal-css")) return; var css = [ ".aics-modal-bg { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.5); z-index: 9998; }", ".aics-modal-wrap { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 9999; display: flex; align-items: center; justify-content: center; }", ".aics-modal { background: white; border-radius: 8px; box-shadow: 0 4px 20px rgba(0,0,0,0.3); max-width: 500px; width: 90%; max-height: 90vh; overflow: hidden; display: flex; flex-direction: column; }", ".aics-modal-header { padding: 16px 20px; border-bottom: 1px solid #e5e5e5; display: flex; justify-content: space-between; align-items: center; }", ".aics-modal-title { font-size: 18px; font-weight: 600; margin: 0; color: #333; }", ".aics-modal-body { padding: 20px; overflow-y: auto; flex: 1; }", ".aics-modal-pergunta { font-size: 15px; color: #333; margin-bottom: 16px; line-height: 1.4; white-space: pre-wrap; }", ".aics-modal-input { width: 100%; padding: 8px 12px; font-size: 14px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; }", ".aics-modal-list { max-height: 200px; overflow-y: auto; border: 1px solid #e5e5e5; border-radius: 4px; padding: 4px; }", ".aics-modal-option { display: block; padding: 8px 12px; cursor: pointer; border-radius: 4px; }", ".aics-modal-option:hover { background: #f5f5f5; }", ".aics-modal-option.selected { background: #d4edda; font-weight: 500; }", ".aics-modal-footer { padding: 12px 20px; border-top: 1px solid #e5e5e5; display: flex; justify-content: flex-end; gap: 8px; }", ".aics-modal-btn { padding: 8px 20px; font-size: 14px; border: 1px solid transparent; border-radius: 4px; cursor: pointer; }", ".aics-modal-btn-primary { background: #337ab7; color: white; border-color: #2e6da4; }", ".aics-modal-btn-primary:hover { background: #286090; }", ".aics-modal-btn-default { background: white; color: #333; border-color: #ccc; }", ".aics-modal-btn-default:hover { background: #f5f5f5; }" ].join("\n"); var style = document.createElement("style"); style.id = "aics-modal-css"; style.textContent = css; document.head.appendChild(style); } injetarCSS(); // ========== Modal generico (1 template, conteudo varia) ========== function criarModal(titulo, pergunta, tipo, opcoes, valorPadrao) { return new Promise(function(resolve){ var bg = document.createElement("div"); bg.className = "aics-modal-bg"; var wrap = document.createElement("div"); wrap.className = "aics-modal-wrap"; var modal = document.createElement("div"); modal.className = "aics-modal"; // Header var header = document.createElement("div"); header.className = "aics-modal-header"; var h2 = document.createElement("h2"); h2.className = "aics-modal-title"; h2.textContent = titulo || "AICS"; header.appendChild(h2); modal.appendChild(header); // Body var body = document.createElement("div"); body.className = "aics-modal-body"; var p = document.createElement("div"); p.className = "aics-modal-pergunta"; p.textContent = pergunta; body.appendChild(p); var input = null; var radioButtons = []; var opcoesEscolhidas = opcoes || []; if (tipo === "INPUTBOX") { input = document.createElement("input"); input.type = "text"; input.className = "aics-modal-input"; input.value = valorPadrao || ""; body.appendChild(input); } else if (tipo === "INPUTBOXLIST") { var list = document.createElement("div"); list.className = "aics-modal-list"; opcoesEscolhidas.forEach(function(op){ var label = document.createElement("label"); label.className = "aics-modal-option"; var radio = document.createElement("input"); radio.type = "radio"; radio.name = "aics-modal-opt"; radio.value = op; radio.style.marginRight = "8px"; radio.addEventListener("change", function(){ list.querySelectorAll(".aics-modal-option").forEach(function(l){ l.classList.remove("selected"); }); if (radio.checked) label.classList.add("selected"); }); label.appendChild(radio); label.appendChild(document.createTextNode(op)); list.appendChild(label); radioButtons.push(radio); }); body.appendChild(list); } modal.appendChild(body); // Footer com botoes var footer = document.createElement("div"); footer.className = "aics-modal-footer"; var btnCancelar = document.createElement("button"); btnCancelar.className = "aics-modal-btn aics-modal-btn-default"; btnCancelar.textContent = "Cancelar"; var btnPrimario = document.createElement("button"); btnPrimario.className = "aics-modal-btn aics-modal-btn-primary"; btnPrimario.textContent = (tipo === "SIMNAO") ? "Sim" : "OK"; footer.appendChild(btnCancelar); footer.appendChild(btnPrimario); modal.appendChild(footer); wrap.appendChild(modal); document.body.appendChild(bg); document.body.appendChild(wrap); // Foco no input ou no primeiro radio setTimeout(function(){ if (input) input.focus(); else if (radioButtons[0]) radioButtons[0].focus(); }, 50); function fechar(resposta){ document.body.removeChild(bg); document.body.removeChild(wrap); document.removeEventListener("keydown", onKey); resolve(resposta); } function onKey(e){ if (e.key === "Escape") fechar(tipo === "SIMNAO" ? "Nao" : ""); if (e.key === "Enter") { if (tipo === "SIMNAO") { fechar("Sim"); } else if (input) { fechar(input.value); } else { var checked = radioButtons.find(function(r){ return r.checked; }); fechar(checked ? checked.value : ""); } } } document.addEventListener("keydown", onKey); btnCancelar.addEventListener("click", function(){ fechar(tipo === "SIMNAO" ? "Nao" : ""); }); btnPrimario.addEventListener("click", function(){ if (tipo === "SIMNAO") { fechar("Sim"); } else if (input) { fechar(input.value); } else { var checked = radioButtons.find(function(r){ return r.checked; }); fechar(checked ? checked.value : ""); } }); bg.addEventListener("click", function(){ fechar(""); }); }); } // ========== Wrappers para os 4 tipos ========== function showSimNao(pergunta) { return criarModal("Confirmacao", pergunta, "SIMNAO", null, null); } function showInputBox(pergunta, valorPadrao) { return criarModal("Entrada de dados", pergunta, "INPUTBOX", null, valorPadrao); } function showInputBoxList(pergunta, opcoes) { return criarModal("Escolha uma opcao", pergunta, "INPUTBOXLIST", opcoes, null); } function showMessage(msg, kind) { if (!msg) return; //if (window.console && console.log) console.log("[AICS " + (kind || "info") + "]", msg); if (kind === "info") { alert(msg);} if (kind === "error") { criarModal("Aviso", msg, "INPUTBOX", null, null).then(function(){}); } } // ========== API publica ========== window.activepooling=false; function makeAsk(tabela, iddiv, formRef) { return function ask(evento, params){ params = params || {}; var sessaoId = window.AICS_SESSAO_ID || gerarSessaoId(); window.AICS_SESSAO_ID = sessaoId; window.activepooling=true; var body = JSON.stringify({ sessao_id: sessaoId, tab: tabela, iddiv: iddiv, evento: evento, col: params.col || null, values: getFormData(formRef) }); return fetch("/ask?tab=" + tabela + "&iddiv=" + iddiv + "&event=" + encodeURIComponent(evento), { method: "POST", credentials: "same-origin", headers: { "Content-Type": "application/json" }, body: body }) .then(function(r){ return r.json(); }) .then(function(resp){ window.activepooling=false; if (resp.changes) applyChanges(resp.changes); if (resp.message) showMessage(resp.message, resp.block ? "error" : "info"); return resp; }); }; } function gerarSessaoId() { return "sess-" + Date.now() + "-" + Math.random().toString(36).substr(2, 9); } window.AICS = window.AICS || {}; window.AICS[TAB] = window.AICS[TAB] || {}; window.AICS[TAB][IDDIV] = { ask: makeAsk(TAB, IDDIV, form), set: function(col, val){ var el=document.getElementById(TAB+"_"+col); if(el) el.value=val; }, get: function(col){ var el=document.getElementById(TAB+"_"+col); return el?el.value:null; }, confirm: showSimNao, inputbox: showInputBox, inputboxlist: showInputBoxList }; // ========== Loop de polling (Canal B) ========== (function loopDePolling(){ var sessaoId = window.AICS_SESSAO_ID; if (!sessaoId || !window.activepooling) { setTimeout(loopDePolling, 1000); return; } fetch("/ask?opt=pendencias&codigo=" + sessaoId, { credentials: "same-origin" }) .then(function(r){ return r.json(); }) .then(function(data){ var pendencias = data.pendencias || []; if (pendencias.length === 0){ setTimeout(loopDePolling, 1000); return; } var idx = 0; function processarProxima(){ if (idx >= pendencias.length){ loopDePolling(); return; } var pend = pendencias[idx++]; var opcoes = pend.opcoes ? JSON.parse(pend.opcoes) : null; var promessa; if (pend.tipo === "SIMNAO") promessa = showSimNao(pend.pergunta); else if (pend.tipo === "INPUTBOX") promessa = showInputBox(pend.pergunta, pend.valor_padrao); else if (pend.tipo === "INPUTBOXLIST") promessa = showInputBoxList(pend.pergunta, opcoes); else promessa = Promise.resolve(""); promessa.then(function(resposta){ console.log(resposta); return fetch("/ask?opt=resolver&id=" + pend.id , { method: "POST", credentials: "same-origin", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ resposta: resposta }) }); }).then(function(){ processarProxima(); }); } processarProxima(); }) .catch(function(){ setTimeout(loopDePolling, 2000); }); })(); // ========== Listeners do manifesto ========== if (MANIFEST.onExit) MANIFEST.onExit.forEach(function(col){ var el = document.getElementById(TAB+"_"+col); if (!el) return; el.addEventListener("blur", function(){ window.AICS[TAB][IDDIV].ask("onExit", { col: col }); }); }); if (MANIFEST.onEnter) MANIFEST.onExit.forEach(function(col){ var el = document.getElementById(TAB+"_"+col); if (!el) return; el.addEventListener("focus", function(){ window.AICS[TAB][IDDIV].ask("onEnter", { col: col }); }); }); if (MANIFEST.onChange) MANIFEST.onChange.forEach(function(col){ var el = document.getElementById(TAB+"_"+col); if (!el) return; el.addEventListener("change", function(){ window.AICS[TAB][IDDIV].ask("onChange", { col: col }); }); }); if (MANIFEST.onBeforeSave){ form.addEventListener("submit", function(ev){ ev.preventDefault(); window.AICS[TAB][IDDIV].ask("onBeforeSave", {}).then(function(resp){ if (!resp.block) form.submit(); }); }); } })();