${sec.name}
${sec.id} · компаний: ${count || "—"}
`;
btn.addEventListener("click", () => selectSector(sec.id, sec.name));
sectorListEl.appendChild(btn);
});
}
function setActiveSectorBtn(sectorId){
const buttons = sectorListEl.querySelectorAll(".moexrs__sectorBtn");
buttons.forEach(b => b.classList.toggle("is-active", b.dataset.sector === sectorId));
}
function setActiveLookbackBtn(lookback){
const buttons = periodsEl.querySelectorAll(".moexrs__btn--pill");
buttons.forEach(b => b.classList.toggle("is-active", Number(b.dataset.lookback) === Number(lookback)));
}
function renderSkeletonTable(items){
tableBodyEl.innerHTML = "";
(items || []).forEach(it => {
const tr = document.createElement("tr");
tr.id = "row_" + it.ticker;
tr.innerHTML = `
${ex.reason}`; excludedEl.appendChild(div); }); if(excluded.length > 80){ const more = document.createElement("div"); more.className = "moexrs__muted"; more.style.fontSize = "12px"; more.textContent = "…и ещё " + (excluded.length - 80) + " шт."; excludedEl.appendChild(more); } } function applyResultsToTable(rsData){ const ranking = rsData.ranking || []; const excluded = rsData.excluded || []; const used = rsData.usedTickers || 0; const total = rsData.totalTickers || 0; const baseEnd = rsData.base?.end || "—"; const rankMap = new Map(); ranking.forEach(r => rankMap.set(r.ticker, r)); const exclMap = new Map(); excluded.forEach(e => exclMap.set(e.ticker, e)); constituents.forEach(it => { const tr = document.getElementById("row_" + it.ticker); if(!tr) return; tr.classList.remove("is-top", "is-bottom"); const r = rankMap.get(it.ticker); const e = exclMap.get(it.ticker); const tds = tr.querySelectorAll("td"); if(!tds || tds.length < 8) return; if(r){ tds[2].textContent = String(r.rank); tds[3].textContent = String(r.points); tds[4].textContent = String(r.wins); tds[5].textContent = String(r.ties); tds[6].textContent = String(r.losses); tds[7].textContent = r.highlight === "top" ? "ТОП 20%" : (r.highlight === "bottom" ? "НИЗ 20%" : "OK"); if(r.highlight === "top") tr.classList.add("is-top"); if(r.highlight === "bottom") tr.classList.add("is-bottom"); } else if(e){ tds[2].textContent = "—"; tds[3].textContent = "—"; tds[4].textContent = "—"; tds[5].textContent = "—"; tds[6].textContent = "—"; tds[7].textContent = "нет данных"; } else { tds[7].textContent = "—"; } }); sectorMetaEl.textContent = `Компании: ${total} · с данными: ${used} · дата базы: ${baseEnd} · период: ${selectedLookback} баров`; } function renderMatrix(rsData){ matrixScroll.innerHTML = ""; const m = rsData?.matrix; if(!m || !m.tickers || !m.values || !m.tickers.length){ matrixScroll.innerHTML = "
Матрица недоступна (нет данных)
";
return;
}
const tickers = m.tickers;
const values = m.values;
const table = document.createElement("table");
table.className = "moexrs__matrix";
// THEAD
const thead = document.createElement("thead");
const hr = document.createElement("tr");
const th0 = document.createElement("th");
th0.className = "sticky-left";
th0.textContent = "Ticker";
hr.appendChild(th0);
tickers.forEach(t => {
const th = document.createElement("th");
th.textContent = t;
th.title = t;
hr.appendChild(th);
});
thead.appendChild(hr);
table.appendChild(thead);
// TBODY
const tbody = document.createElement("tbody");
for(let i=0;iНажми «Обновить сектор», чтобы построить матрицу.
";
}
}
});
// ==========================================================
// START
// ==========================================================
setActiveLookbackBtn(selectedLookback);
if(isAuthed()){
showApp();
initApp();
} else {
showLogin();
}
})();