Fixed Faction population
This commit is contained in:
@@ -146,9 +146,10 @@ async function loadMembers(kind) {
|
||||
domElement: null
|
||||
};
|
||||
map.set(m.id, newMember);
|
||||
// create card but DO NOT automatically append here;
|
||||
// placement will be handled by loadAssignmentsFromServer()
|
||||
createMemberCard(newMember, kind);
|
||||
// create card and append to main list if not in a group
|
||||
const card = createMemberCard(newMember, kind);
|
||||
// Don't append yet - let applyAssignmentsToDOM handle placement
|
||||
// This ensures members end up in the right place (main list or group)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -228,16 +229,20 @@ function ensureMainListContains(member, kind) {
|
||||
const container = kind === "friendly" ? friendlyContainer : enemyContainer;
|
||||
const parent = member.domElement?.parentElement;
|
||||
|
||||
console.log(`>>> ensureMainListContains for ${member.id}, has parent: ${!!parent}, domElement exists: ${!!member.domElement}`);
|
||||
|
||||
// Detect group zone: ids like "group-1-friendly" or "group-2-enemy"
|
||||
const isInGroupZone = parent && typeof parent.id === "string" && /^group-\d+-/.test(parent.id);
|
||||
|
||||
// If member has no parent yet, or is in a group zone, ensure it ends up in the main list
|
||||
if (!parent || isInGroupZone) {
|
||||
console.log(`>>> Member ${member.id} needs placement (no parent or in group zone)`);
|
||||
// If it's already in the right container, nothing to do
|
||||
if (member.domElement && member.domElement.parentElement !== container) {
|
||||
// remove from previous parent (if any) and append to main list
|
||||
const prev = member.domElement.parentElement;
|
||||
if (prev) prev.removeChild(member.domElement);
|
||||
console.log(`>>> Appending member ${member.id} to main ${kind} container`);
|
||||
container.appendChild(member.domElement);
|
||||
}
|
||||
}
|
||||
@@ -245,6 +250,7 @@ function ensureMainListContains(member, kind) {
|
||||
|
||||
|
||||
function applyAssignmentsToDOM(assignments) {
|
||||
console.log(">>> applyAssignmentsToDOM called with assignments:", assignments);
|
||||
if (!assignments) return;
|
||||
|
||||
// First, move all assigned members into their group zones
|
||||
@@ -428,28 +434,46 @@ function setupDropZones() {
|
||||
// Populate & Status functions
|
||||
// ---------------------------
|
||||
async function populateFriendly() {
|
||||
console.log(">>> populateFriendly called");
|
||||
const id = toInt(document.getElementById("friendly-id").value);
|
||||
console.log(">>> Friendly faction ID:", id);
|
||||
if (!id) return alert("Enter Friendly Faction ID");
|
||||
|
||||
// Clear existing friendly members before populating new faction
|
||||
console.log(">>> Clearing existing friendly members");
|
||||
friendlyMembers.forEach(m => {
|
||||
if (m.domElement?.parentElement) {
|
||||
m.domElement.parentElement.removeChild(m.domElement);
|
||||
}
|
||||
});
|
||||
friendlyMembers.clear();
|
||||
|
||||
try {
|
||||
console.log(">>> Sending populate request to /api/populate_friendly");
|
||||
const res = await fetch("/api/populate_friendly", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ faction_id: id, interval: 0 })
|
||||
});
|
||||
console.log(">>> Response status:", res.status);
|
||||
const data = await res.json();
|
||||
console.log(">>> Response data:", data);
|
||||
|
||||
// Update in-memory map & DOM
|
||||
if (data.members) {
|
||||
console.log(`>>> Processing ${data.members.length} friendly members`);
|
||||
for (const m of data.members) {
|
||||
console.log(`>>> Processing member ${m.id}: ${m.name}`);
|
||||
let existing = friendlyMembers.get(m.id);
|
||||
if (existing) {
|
||||
console.log(`>>> Updating existing member ${m.id}`);
|
||||
existing.name = m.name;
|
||||
existing.level = m.level;
|
||||
existing.estimate = m.estimate;
|
||||
existing.status = m.status || "Unknown";
|
||||
updateMemberCard(existing);
|
||||
} else {
|
||||
console.log(`>>> Creating new member ${m.id}`);
|
||||
const newMember = {
|
||||
id: m.id,
|
||||
name: m.name,
|
||||
@@ -460,9 +484,13 @@ async function populateFriendly() {
|
||||
};
|
||||
friendlyMembers.set(m.id, newMember);
|
||||
const card = createMemberCard(newMember, "friendly");
|
||||
console.log(`>>> Appending card for ${m.name} to container`);
|
||||
friendlyContainer.appendChild(card);
|
||||
}
|
||||
}
|
||||
console.log(`>>> Friendly members count in map: ${friendlyMembers.size}`);
|
||||
} else {
|
||||
console.log(">>> No members in response!");
|
||||
}
|
||||
|
||||
// Refresh assignments & status UI
|
||||
@@ -474,27 +502,45 @@ async function populateFriendly() {
|
||||
}
|
||||
|
||||
async function populateEnemy() {
|
||||
console.log(">>> populateEnemy called");
|
||||
const id = toInt(document.getElementById("enemy-id").value);
|
||||
console.log(">>> Enemy faction ID:", id);
|
||||
if (!id) return alert("Enter Enemy Faction ID");
|
||||
|
||||
// Clear existing enemy members before populating new faction
|
||||
console.log(">>> Clearing existing enemy members");
|
||||
enemyMembers.forEach(m => {
|
||||
if (m.domElement?.parentElement) {
|
||||
m.domElement.parentElement.removeChild(m.domElement);
|
||||
}
|
||||
});
|
||||
enemyMembers.clear();
|
||||
|
||||
try {
|
||||
console.log(">>> Sending populate request to /api/populate_enemy");
|
||||
const res = await fetch("/api/populate_enemy", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ faction_id: id, interval: 0 })
|
||||
});
|
||||
console.log(">>> Response status:", res.status);
|
||||
const data = await res.json();
|
||||
console.log(">>> Response data:", data);
|
||||
|
||||
if (data.members) {
|
||||
console.log(`>>> Processing ${data.members.length} enemy members`);
|
||||
for (const m of data.members) {
|
||||
console.log(`>>> Processing member ${m.id}: ${m.name}`);
|
||||
let existing = enemyMembers.get(m.id);
|
||||
if (existing) {
|
||||
console.log(`>>> Updating existing member ${m.id}`);
|
||||
existing.name = m.name;
|
||||
existing.level = m.level;
|
||||
existing.estimate = m.estimate;
|
||||
existing.status = m.status || "Unknown";
|
||||
updateMemberCard(existing);
|
||||
} else {
|
||||
console.log(`>>> Creating new member ${m.id}`);
|
||||
const newMember = {
|
||||
id: m.id,
|
||||
name: m.name,
|
||||
@@ -505,9 +551,13 @@ async function populateEnemy() {
|
||||
};
|
||||
enemyMembers.set(m.id, newMember);
|
||||
const card = createMemberCard(newMember, "enemy");
|
||||
console.log(`>>> Appending card for ${m.name} to container`);
|
||||
enemyContainer.appendChild(card);
|
||||
}
|
||||
}
|
||||
console.log(`>>> Enemy members count in map: ${enemyMembers.size}`);
|
||||
} else {
|
||||
console.log(">>> No members in response!");
|
||||
}
|
||||
|
||||
// Refresh assignments & status UI
|
||||
@@ -602,32 +652,33 @@ async function resetGroups() {
|
||||
// Wire up buttons & init
|
||||
// ---------------------------
|
||||
function wireUp() {
|
||||
document.getElementById("friendly-populate-btn").addEventListener("click", populateFriendly);
|
||||
document.getElementById("enemy-populate-btn").addEventListener("click", populateEnemy);
|
||||
console.log(">>> wireUp called");
|
||||
const friendlyBtn = document.getElementById("friendly-populate-btn");
|
||||
const enemyBtn = document.getElementById("enemy-populate-btn");
|
||||
console.log(">>> Friendly populate button:", friendlyBtn);
|
||||
console.log(">>> Enemy populate button:", enemyBtn);
|
||||
|
||||
if (friendlyBtn) friendlyBtn.addEventListener("click", populateFriendly);
|
||||
if (enemyBtn) enemyBtn.addEventListener("click", populateEnemy);
|
||||
document.getElementById("friendly-status-btn").addEventListener("click", toggleFriendlyStatus);
|
||||
document.getElementById("enemy-status-btn").addEventListener("click", toggleEnemyStatus);
|
||||
const resetBtn = document.getElementById("reset-groups-btn");
|
||||
if (resetBtn) resetBtn.addEventListener("click", resetGroups);
|
||||
|
||||
setupDropZones();
|
||||
console.log(">>> wireUp completed");
|
||||
}
|
||||
|
||||
// ---------------------------
|
||||
// Initial load
|
||||
// ---------------------------
|
||||
document.addEventListener("DOMContentLoaded", async () => {
|
||||
console.log(">>> DOMContentLoaded fired");
|
||||
wireUp();
|
||||
|
||||
// load members first
|
||||
await loadMembers("friendly");
|
||||
await loadMembers("enemy");
|
||||
// DON'T load members on initial page load - wait for user to click Populate
|
||||
// This prevents showing stale data from server STATE
|
||||
|
||||
// load assignments and apply them
|
||||
await pollAssignments();
|
||||
// Start polling for assignments (but there won't be any until members are populated)
|
||||
startAssignmentsPolling();
|
||||
|
||||
// kick off status polling for initial UI (but status loops are triggered by Start Refresh buttons)
|
||||
// immediate status pull so cards show current status
|
||||
await refreshStatus("friendly");
|
||||
await refreshStatus("enemy");
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user