diff --git a/portal/templates/app/orgs.html b/portal/templates/app/orgs.html index bd6e732..aea999b 100644 --- a/portal/templates/app/orgs.html +++ b/portal/templates/app/orgs.html @@ -279,18 +279,21 @@ const domains = domainsRaw ? domainsRaw.split(',').map(d => d.trim().replace(/^@/, '')).filter(Boolean) : undefined; btn.disabled = true; btn.textContent = 'Saving...'; errEl.classList.add('hidden'); try { - const version = parseInt(document.getElementById('eVersion').value) || 1; - // Single write: details + members together via members endpoint first, then details - // Actually: save details (which preserves existing members in orgData), then members - // To avoid version race, save members FIRST then details (or combine) - // Simplest: save members first with current version, details second with version+1 + // Always fetch fresh version to avoid stale version conflicts + const freshRes = await fetchAPI('/api/orgs/' + editingOrgId); + const freshOrg = await freshRes.json(); + let version = freshOrg.version || 1; + + // Save members first 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 to save members'); - const newVersion = mData.version || version + 1; + if (!mRes.ok) throw new Error(mData.error || 'Failed to save contacts'); + version = mData.version; + + // Save details with updated version const res = await fetchAPI('/api/orgs/' + editingOrgId, { method: 'PUT', body: JSON.stringify({ @@ -304,7 +307,7 @@ address: document.getElementById('eAddress').value.trim(), state: document.getElementById('eState').value.trim(), logo: document.getElementById('eLogo').value.trim(), - version: newVersion, + version, }) }); const data = await res.json();