From bef4a545d966795e164d13ab1002b5ee7fb8479b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Sat, 2 May 2026 17:24:35 +0400 Subject: [PATCH] refactor(ui): step7 - extract modals.js (openHelp, closeHelp, openInvoke, closeInvoke, submitInvoke) --- console/ui/index.html | 24 +------------ console/ui/js/modals.js | 76 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 23 deletions(-) create mode 100644 console/ui/js/modals.js diff --git a/console/ui/index.html b/console/ui/index.html index 37f7126..c5bb615 100644 --- a/console/ui/index.html +++ b/console/ui/index.html @@ -18,6 +18,7 @@ + @@ -559,14 +560,6 @@ S.currentEdit = null; } - function openHelp() { - document.getElementById('help-modal').classList.add('open'); - } - - function closeHelp() { - document.getElementById('help-modal').classList.remove('open'); - } - async function submitEdit() { if (!S.currentEdit) return; const btn = document.getElementById('e-submit'); @@ -590,21 +583,6 @@ } } - function openInvoke(name) { - S.currentInvoke = name; - document.getElementById('i-title').textContent = '\u0412\u044b\u0437\u043e\u0432: ' + name; - document.getElementById('i-resp').value = ''; - document.getElementById('i-status').textContent = ''; - document.getElementById('i-meta').style.display = 'none'; - document.getElementById('i-meta').textContent = ''; - document.getElementById('invoke-modal').classList.add('open'); - } - - function closeInvoke() { - document.getElementById('invoke-modal').classList.remove('open'); - S.currentInvoke = null; - } - async function submitInvoke() { if (!S.currentInvoke) return; const btn = document.getElementById('i-submit'); diff --git a/console/ui/js/modals.js b/console/ui/js/modals.js new file mode 100644 index 0000000..a8a4e2d --- /dev/null +++ b/console/ui/js/modals.js @@ -0,0 +1,76 @@ +/* modals.js — управление модальными окнами Help и Invoke */ + +function openHelp() { + document.getElementById('help-modal').classList.add('open'); +} + +function closeHelp() { + document.getElementById('help-modal').classList.remove('open'); +} + +function openInvoke(name) { + S.currentInvoke = name; + document.getElementById('i-title').textContent = 'Вызов: ' + name; + document.getElementById('i-resp').value = ''; + document.getElementById('i-status').textContent = ''; + document.getElementById('i-meta').style.display = 'none'; + document.getElementById('i-meta').textContent = ''; + document.getElementById('invoke-modal').classList.add('open'); +} + +function closeInvoke() { + document.getElementById('invoke-modal').classList.remove('open'); + S.currentInvoke = null; +} + +async function submitInvoke() { + if (!S.currentInvoke) return; + const btn = document.getElementById('i-submit'); + const statusEl = document.getElementById('i-status'); + const metaEl = document.getElementById('i-meta'); + const respEl = document.getElementById('i-resp'); + btn.disabled = true; + respEl.value = ''; + metaEl.style.display = 'none'; + metaEl.textContent = ''; + let elapsed = 0; + statusEl.textContent = 'Вызов...'; + const timer = setInterval(() => { + elapsed++; + if (elapsed < 5) { + statusEl.textContent = 'Вызов... ' + elapsed + 'с'; + } else if (elapsed < 10) { + statusEl.textContent = '⏳ Возможен cold start — прогрев пула... ' + elapsed + 'с'; + } else { + statusEl.textContent = '⏳ Возможны cold start или specialization... ' + elapsed + 'с'; + } + }, 1000); + try { + const raw = document.getElementById('i-body').value.trim(); + let parsed = {}; + if (raw) parsed = JSON.parse(raw); + const result = await requestJSON(API_BASE + '/functions/' + encodeURIComponent(S.currentInvoke) + '/invoke', 'POST', parsed); + var latencyMs = Number(result.latency_ms || 0); + var measuredSeconds = latencyMs > 0 ? Math.max(1, Math.round(latencyMs / 1000)) : elapsed; + statusEl.textContent = '✓ Выполнено за ' + formatSeconds(measuredSeconds); + metaEl.style.display = 'block'; + metaEl.textContent = [ + 'HTTP status: ' + (result.status || 'n/a'), + 'Latency: ' + (latencyMs || 'n/a') + ' ms', + 'Причина задержки: ' + explainDelay(measuredSeconds), + 'Invoke URL: ' + (result.invoke_url || 'n/a') + ].join('\n'); + respEl.value = JSON.stringify(result, null, 2); + } catch (e) { + statusEl.textContent = '✗ Ошибка после ' + formatSeconds(elapsed); + metaEl.style.display = 'block'; + metaEl.textContent = [ + 'Последняя ошибка: ' + e.message, + 'Вероятная причина задержки: ' + explainDelay(elapsed) + ].join('\n'); + respEl.value = 'Ошибка вызова: ' + e.message; + } finally { + clearInterval(timer); + btn.disabled = false; + } +}