Fix race condition in member domains table

This commit is contained in:
Rachid Mrad 2025-02-14 12:49:02 -05:00
parent 11a7288109
commit 29c4dbd0ec
No known key found for this signature in database

View file

@ -24,6 +24,9 @@ export class EditMemberDomainsTable extends BaseTable {
this.reviewButton = document.getElementById('review-domain-assignments'); this.reviewButton = document.getElementById('review-domain-assignments');
this.backButton = document.getElementById('back-to-edit-domain-assignments'); this.backButton = document.getElementById('back-to-edit-domain-assignments');
this.saveButton = document.getElementById('save-domain-assignments'); this.saveButton = document.getElementById('save-domain-assignments');
this.domainAssignmentsLoaded = false; // Flag to track if API request has completed
this.initializeDomainAssignments(); this.initializeDomainAssignments();
this.initCancelEditDomainAssignmentButton(); this.initCancelEditDomainAssignmentButton();
this.initEventListeners(); this.initEventListeners();
@ -134,27 +137,37 @@ export class EditMemberDomainsTable extends BaseTable {
* member. It populates both initialDomainAssignments and initialDomainAssignmentsOnlyMember. * member. It populates both initialDomainAssignments and initialDomainAssignmentsOnlyMember.
* It is called once per page load, but not called with subsequent table changes. * It is called once per page load, but not called with subsequent table changes.
*/ */
initializeDomainAssignments() { async initializeDomainAssignments() {
if (this.domainAssignmentsLoaded) return; // Prevent multiple calls
const baseUrlValue = this.getBaseUrl()?.innerHTML ?? null; const baseUrlValue = this.getBaseUrl()?.innerHTML ?? null;
if (!baseUrlValue) return; if (!baseUrlValue) {
let searchParams = this.getDomainAssignmentSearchParams(this.portfolioValue); console.error("Base URL not found");
let url = baseUrlValue + "?" + searchParams.toString();
fetch(url)
.then(response => response.json())
.then(data => {
if (data.error) {
console.error('Error in AJAX call: ' + data.error);
return; return;
}
try {
let searchParams = this.getDomainAssignmentSearchParams(this.portfolioValue);
let url = baseUrlValue + "?" + searchParams.toString();
let response = await fetch(url);
let data = await response.json();
if (data.error) {
console.error("Error in AJAX call:", data.error);
return;
} }
let dataObjects = this.getDataObjects(data); let dataObjects = this.getDataObjects(data);
// Map the id attributes of dataObjects to this.initialDomainAssignments
this.initialDomainAssignments = dataObjects.map(obj => obj.id); this.initialDomainAssignments = dataObjects.map(obj => obj.id);
this.initialDomainAssignmentsOnlyMember = dataObjects this.initialDomainAssignmentsOnlyMember = dataObjects
.filter(obj => obj.member_is_only_manager) .filter(obj => obj.member_is_only_manager)
.map(obj => obj.id); .map(obj => obj.id);
}) } catch (error) {
.catch(error => console.error('Error fetching domain assignments:', error)); console.error("Error fetching domain assignments:", error);
}
this.domainAssignmentsLoaded = true; // Flag as complete whether data was found or not
} }
/** /**
* Initializes listeners on checkboxes in the table. Checkbox listeners are used * Initializes listeners on checkboxes in the table. Checkbox listeners are used
@ -345,13 +358,23 @@ export class EditMemberDomainsTable extends BaseTable {
export function initEditMemberDomainsTable() { export function initEditMemberDomainsTable() {
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
const isEditMemberDomainsPage = document.getElementById("edit-member-domains"); const isEditMemberDomainsPage = document.getElementById("edit-member-domains");
if (isEditMemberDomainsPage) { if (!isEditMemberDomainsPage) return; // Exit if not on the right page
const editMemberDomainsTable = new EditMemberDomainsTable();
if (editMemberDomainsTable.tableWrapper) { const editMemberDomainsTable = new EditMemberDomainsTable();
// Initial load
editMemberDomainsTable.loadTable(1); function attemptInitTable() {
} if (!editMemberDomainsTable.domainAssignmentsLoaded) {
console.warn("initEditMemberDomainsTable called before domain assignments loaded. Retrying later...");
setTimeout(attemptInitTable, 50); // Retry with a slight delay
return;
} }
});
if (editMemberDomainsTable.tableWrapper) {
editMemberDomainsTable.loadTable(1); // Initial load
}
}
attemptInitTable(); // Call the function immediately
});
} }