diff --git a/public/js/app.js b/public/js/app.js index a2293a0..135e2bc 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -2121,7 +2121,8 @@ ${source.description ? `
${escapeHtml(source.description)}
` : ''}
- + +
`).join(''); @@ -2166,6 +2167,55 @@ } // ---- Add Source ---- + let editingSourceId = null; + + window.editSource = function(source) { + editingSourceId = source.id; + dom.sourceName.value = source.name || ''; + dom.sourceUrl.value = source.url || ''; + dom.sourceType.value = source.type || 'prometheus'; + dom.sourceDesc.value = source.description || ''; + dom.isServerSource.checked = !!source.is_server_source; + + // Toggle Blackbox UI + if (source.type === 'blackbox') { + dom.serverSourceOption.style.display = 'none'; + } else { + dom.serverSourceOption.style.display = 'flex'; + } + + dom.btnAdd.textContent = '保存修改'; + + // Add cancel button if not already there + if (!document.getElementById('btnCancelEditSource')) { + const cancelBtn = document.createElement('button'); + cancelBtn.id = 'btnCancelEditSource'; + cancelBtn.className = 'btn btn-secondary'; + cancelBtn.style.marginLeft = '8px'; + cancelBtn.textContent = '取消'; + cancelBtn.onclick = cancelEditSource; + dom.btnAdd.parentNode.appendChild(cancelBtn); + } + + // Scroll to form + dom.sourceName.focus(); + }; + + function cancelEditSource() { + editingSourceId = null; + dom.sourceName.value = ''; + dom.sourceUrl.value = ''; + dom.sourceType.value = 'prometheus'; + dom.sourceDesc.value = ''; + dom.isServerSource.checked = true; + dom.serverSourceOption.style.display = 'flex'; + dom.btnAdd.textContent = '添加'; + + const cancelBtn = document.getElementById('btnCancelEditSource'); + if (cancelBtn) cancelBtn.remove(); + hideMessage(); + } + async function addSource() { if (!user) { showMessage('请先登录后操作', 'error'); @@ -2185,21 +2235,29 @@ return; } - dom.btnAdd.textContent = '添加中...'; + const isEditing = editingSourceId !== null; + dom.btnAdd.textContent = isEditing ? '保存中...' : '添加中...'; dom.btnAdd.disabled = true; try { - const response = await fetch('/api/sources', { - method: 'POST', + const urlPath = isEditing ? `/api/sources/${editingSourceId}` : '/api/sources'; + const method = isEditing ? 'PUT' : 'POST'; + + const response = await fetch(urlPath, { + method: method, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name, url, description, is_server_source, type }) }); if (response.ok) { - showMessage('数据源添加成功', 'success'); - dom.sourceName.value = ''; - dom.sourceUrl.value = ''; - dom.sourceDesc.value = ''; + showMessage(isEditing ? '数据源更新成功' : '数据源添加成功', 'success'); + if (isEditing) { + cancelEditSource(); + } else { + dom.sourceName.value = ''; + dom.sourceUrl.value = ''; + dom.sourceDesc.value = ''; + } loadSources(); fetchMetrics(); fetchNetworkHistory(); diff --git a/server/index.js b/server/index.js index bebedda..071fa35 100644 --- a/server/index.js +++ b/server/index.js @@ -507,7 +507,7 @@ app.post('/api/sources', requireAuth, async (req, res) => { // Update a Prometheus source app.put('/api/sources/:id', requireAuth, async (req, res) => { - let { name, url, description, is_server_source } = req.body; + let { name, url, description, is_server_source, type } = req.body; if (url && !/^https?:\/\//i.test(url)) url = 'http://' + url; try { await db.query(