From 579047a54d13b3401a33317ac36b8312bf2f7182 Mon Sep 17 00:00:00 2001 From: James Date: Fri, 20 Mar 2026 01:35:36 -0400 Subject: [PATCH] feat: add contact saves immediately without needing Save Changes --- portal/templates/app/orgs.html | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/portal/templates/app/orgs.html b/portal/templates/app/orgs.html index aea999b..eba56bd 100644 --- a/portal/templates/app/orgs.html +++ b/portal/templates/app/orgs.html @@ -365,7 +365,7 @@ if (editingMembers[i]) editingMembers[i][field] = value; } - function addGlobalMember() { + async function addGlobalMember() { const name = document.getElementById('newMemberName').value.trim(); const email = document.getElementById('newMemberEmail').value.trim(); const title = document.getElementById('newMemberTitle').value.trim(); @@ -380,11 +380,38 @@ return; } errEl.classList.add('hidden'); - editingMembers.push({ name, email, title, phone_business, phone_personal, photo: '', bio: '', linkedin: '' }); + const newMember = { name, email, title, phone_business, phone_personal, photo: '', bio: '', linkedin: '' }; + editingMembers.push(newMember); ['newMemberName','newMemberEmail','newMemberTitle','newMemberPhoneBiz','newMemberPhonePersonal'].forEach(id => document.getElementById(id).value = ''); window._memberExpanded = {}; renderMemberList(); document.getElementById('newMemberName').focus(); + // Save immediately + const btn = document.getElementById('saveOrgBtn'); + const addBtn = document.querySelector('[onclick="addGlobalMember()"]'); + if (addBtn) { addBtn.disabled = true; addBtn.textContent = 'Saving...'; } + try { + const freshRes = await fetchAPI('/api/orgs/' + editingOrgId); + const freshOrg = await freshRes.json(); + const version = freshOrg.version || 1; + const mRes = await fetchAPI('/api/orgs/' + editingOrgId + '/members', { + method: 'PUT', + body: JSON.stringify({ members: editingMembers, version }) + }); + const mData = await mRes.json(); + if (!mRes.ok) throw new Error(mData.error || 'Failed'); + document.getElementById('eVersion').value = mData.version; + if (window._orgsMap && window._orgsMap[editingOrgId]) { + window._orgsMap[editingOrgId].version = mData.version; + window._orgsMap[editingOrgId].members = editingMembers; + } + } catch(e) { + errEl.textContent = 'Save failed: ' + e.message; + errEl.classList.remove('hidden'); + setTimeout(() => errEl.classList.add('hidden'), 4000); + } finally { + if (addBtn) { addBtn.disabled = false; addBtn.textContent = '+ Add contact'; } + } } function removeGlobalMember(idx) {