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();