"use strict"; function overviewRegiments(state) { if (customization) return; closeDialogs(".stable"); const body = document.getElementById("regimentsBody"); updateFilter(); addLines(); $("#regimentsOverview").dialog(); if (modules.overviewRegiments) return; modules.overviewRegiments = true; updateHeaders(); $("#regimentsOverview").dialog({ title: "Regiments Overview", resizable: false, width: fitContent(), position: {my: "center", at: "center", of: "svg"} }); // add listeners document.getElementById("regimentsOverviewRefresh").addEventListener("click", addLines); document.getElementById("regimentsPercentage").addEventListener("click", togglePercentageMode); document.getElementById("regimentsAddNew").addEventListener("click", toggleAddRegiment); document.getElementById("regimentsExport").addEventListener("click", downloadRegimentsData); document.getElementById("regimentsFilter").addEventListener("change", filterRegiments); body.addEventListener("click", function(ev) { const el = ev.target, line = el.parentNode, state = +line.dataset.id; //if (el.tagName === "SPAN") showRegimentList(state); }); // update military types in header and tooltips function updateHeaders() { const header = document.getElementById("regimentsHeader"); header.querySelectorAll(".removable").forEach(el => el.remove()); const insert = html => document.getElementById("regimentsTotal").insertAdjacentHTML("beforebegin", html); for (const u of options.military) { const label = capitalize(u.name.replace(/_/g, ' ')); insert(`
${label} 
`); } header.querySelectorAll(".removable").forEach(function(e) { e.addEventListener("click", function() {sortLines(this);}); }); } // add line for each state function addLines() { body.innerHTML = ""; let lines = ""; const regiments = []; for (const s of pack.states) { if (!s.i || s.removed || !s.military.length) continue; if (state !== -1 && s.i !== state) continue; // specific state is selected for (const r of s.military) { const sortData = options.military.map(u => `data-${u.name}=${r.u[u.name]||0}`).join(" "); const lineData = options.military.map(u => `
${r.u[u.name]||0}
`).join(" "); lines += `
${r.icon} ${lineData}
${r.a}
`; regiments.push(r); } } lines += `
Regiments: ${regiments.length}
${options.military.map(u => `
${si(d3.sum(regiments.map(r => r.u[u.name]||0)))}
`).join(" ")}
${si(d3.sum(regiments.map(r => r.a)))}
`; body.insertAdjacentHTML("beforeend", lines); if (body.dataset.type === "percentage") {body.dataset.type = "absolute"; togglePercentageMode();} applySorting(regimentsHeader); // add listeners body.querySelectorAll("div.states").forEach(el => el.addEventListener("mouseenter", ev => regimentHighlightOn(ev))); body.querySelectorAll("div.states").forEach(el => el.addEventListener("mouseleave", ev => regimentHighlightOff(ev))); } function updateFilter() { const filter = document.getElementById("regimentsFilter"); filter.options.length = 0; // remove all options filter.options.add(new Option(`all`, -1, false, state === -1)); const statesSorted = pack.states.filter(s => s.i && !s.removed).sort((a, b) => (a.name > b.name) ? 1 : -1); statesSorted.forEach(s => filter.options.add(new Option(s.name, s.i, false, s.i == state))); } function filterRegiments() { state = +this.value; addLines(); } function regimentHighlightOn(event) { const state = +event.target.dataset.s; const id = +event.target.dataset.id; if (customization || !state) return; armies.select(`g > g#regiment${state}-${id}`).transition().duration(2000).style("fill", "#ff0000"); } function regimentHighlightOff(event) { const state = +event.target.dataset.s; const id = +event.target.dataset.id; armies.select(`g > g#regiment${state}-${id}`).transition().duration(1000).style("fill", null); } function togglePercentageMode() { if (body.dataset.type === "absolute") { body.dataset.type = "percentage"; const lines = body.querySelectorAll(":scope > div:not(.totalLine)"); const array = Array.from(lines), cache = []; const total = function(type) { if (cache[type]) cache[type]; cache[type] = d3.sum(array.map(el => +el.dataset[type])); return cache[type]; } lines.forEach(function(el) { el.querySelectorAll("div").forEach(function(div) { const type = div.dataset.type; if (type === "rate") return; div.textContent = rn(+el.dataset[type] / total(type) * 100) + "%"; }); }); } else { body.dataset.type = "absolute"; addLines(); } } function toggleAddRegiment() { } function downloadRegimentsData() { const units = options.military.map(u => u.name); let data = "State,Id,Name,"+units.map(u => capitalize(u)).join(",")+",Total\n"; // headers body.querySelectorAll(":scope > div:not(.totalLine)").forEach(function(el) { data += el.dataset.state + ","; data += el.dataset.id + ","; data += el.dataset.name + ","; data += units.map(u => el.dataset[u]).join(",") + ","; data += el.dataset.total + "\n"; }); const name = getFileName("Regiments") + ".csv"; downloadFile(data, name); } }