From a681833d8dc89204cca8ee5f3078c187394a9778 Mon Sep 17 00:00:00 2001 From: M1 Date: Mon, 16 Mar 2026 17:04:30 +0400 Subject: [PATCH] feat: detail edit form matches new monitor form (method, headers, body, timeout) --- apps/web/src/views/detail.ejs | 130 ++++++++++++++++++++++++++++------ 1 file changed, 108 insertions(+), 22 deletions(-) diff --git a/apps/web/src/views/detail.ejs b/apps/web/src/views/detail.ejs index f6e6883..f385b71 100644 --- a/apps/web/src/views/detail.ejs +++ b/apps/web/src/views/detail.ejs @@ -79,33 +79,71 @@

Edit Monitor

-
-
-
- - -
-
- - + + +
+ + +
+ +
+ +
+ +
+
- - +
+ + +
+
+ + + +
+
+ + +
+
+ + +
+
+
- + +

Define up/down conditions. Defaults to status < 400.

+ @@ -123,6 +161,30 @@ editQuery = q; }); + // Method/body visibility + const editMethod = document.getElementById('edit-method'); + const editBodySection = document.getElementById('edit-body-section'); + function updateEditBodyVisibility() { + editBodySection.classList.toggle('hidden', ['GET','HEAD','OPTIONS'].includes(editMethod.value)); + } + editMethod.addEventListener('change', updateEditBodyVisibility); + + // Dynamic headers + document.getElementById('edit-add-header').addEventListener('click', () => { + addHeaderRow(document.getElementById('edit-headers-list')); + }); + + function addHeaderRow(container, key='', value='') { + const row = document.createElement('div'); + row.className = 'header-row flex gap-2'; + row.innerHTML = ` + + + + `; + container.appendChild(row); + } + async function load() { try { const data = await api(`/monitors/${monitorId}`); @@ -190,7 +252,18 @@ // Edit form document.getElementById('edit-name').value = data.name; document.getElementById('edit-url').value = data.url; + document.getElementById('edit-method').value = data.method || 'GET'; document.getElementById('edit-interval').value = String(data.interval_s); + document.getElementById('edit-timeout').value = String(data.timeout_ms || 30000); + document.getElementById('edit-request-body').value = data.request_body || ''; + updateEditBodyVisibility(); + + const headersList = document.getElementById('edit-headers-list'); + headersList.innerHTML = ''; + if (data.request_headers && typeof data.request_headers === 'object') { + Object.entries(data.request_headers).forEach(([k, v]) => addHeaderRow(headersList, k, v)); + } + editQuery = data.query; editQb.setQuery(data.query); } catch (e) { @@ -252,11 +325,24 @@ const errEl = document.getElementById('edit-error'); errEl.classList.add('hidden'); try { + const headers = {}; + document.querySelectorAll('#edit-headers-list .header-row').forEach(row => { + const k = row.querySelector('.hk').value.trim(); + const v = row.querySelector('.hv').value.trim(); + if (k) headers[k] = v; + }); + const body = { - name: document.getElementById('edit-name').value.trim(), - url: document.getElementById('edit-url').value.trim(), + name: document.getElementById('edit-name').value.trim(), + url: document.getElementById('edit-url').value.trim(), + method: document.getElementById('edit-method').value, interval_s: Number(document.getElementById('edit-interval').value), + timeout_ms: Number(document.getElementById('edit-timeout').value), }; + if (Object.keys(headers).length) body.request_headers = headers; + else body.request_headers = null; + const rb = document.getElementById('edit-request-body').value.trim(); + body.request_body = rb || null; if (editQuery) body.query = editQuery; await api(`/monitors/${monitorId}`, { method: 'PATCH', body }); load();