";
}).join("");
};
function statusPill(s) {
var m = { "Заявка": "info", "Подтверждена": "ok", "Отменена": "muted" };
return '' + esc(s) + "";
}
function renderKpi(rows) {
var all = ALL || [];
var total = all.length;
var confirmed = all.filter(function (r) { return r.status === "Подтверждена"; }).length;
var cancelled = all.filter(function (r) { return r.status === "Отменена"; }).length;
var pending = total - confirmed - cancelled;
var tracks = {};
rows.forEach(function (r) { tracks[r.track] = (tracks[r.track] || 0) + 1; });
var top = Object.keys(tracks).sort(function (a, b) { return tracks[b] - tracks[a]; })[0];
var strip = document.getElementById("kpiStrip");
strip.innerHTML =
kpi(String(total), "всего заявок") +
kpi(String(pending), "ждут подтверждения") +
kpi(String(confirmed), "подтверждено") +
(top ? kpi(String(tracks[top]), "мест: " + top) : "");
renderConclusion(rows, total, confirmed);
}
function kpi(value, label) {
return '
' + esc(value) + '' + esc(label) + "
";
}
function renderConclusion(rows, total, confirmed) {
var el = document.getElementById("conclusion");
if (!total) { el.innerHTML = ""; return; }
var cancelled = (ALL || []).filter(function (r) { return r.status === "Отменена"; }).length;
el.innerHTML = '
Состояние потоков
' +
"Всего заявок: " + total + ". Подтверждено: " + confirmed + "." +
(cancelled ? " Отменено: " + cancelled + "." : "") +
(rows.length === total ? " Фильтры не применены." : " По текущему фильтру: " + rows.length + ".") +
" Данные обновляются после каждого действия — статусы меняются из карточки заявки, а список записей доступен во вкладке «Данные» с выгрузкой в Excel.
";
}
function exportCsv() {
var rows = visible();
if (!rows.length) { toast("Экспортировать нечего", "warn"); return; }
var cols = ["id", "name", "email", "phone", "department", "position", "role", "track", "food", "status", "note", "createdAt"];
var head = ["id", "ФИО", "Почта", "Телефон", "Филиал", "Должность", "Роль", "Сессия", "Питание", "Статус", "Примечание", "Заявка"];
var lines = [head.join(",")].concat(rows.map(function (r) {
return cols.map(function (c) {
var v = r[c];
v = v == null ? "" : String(v);
return '"' + v.replace(/"/g, '""') + '"';
}).join(",");
}));
var blob = new Blob(["\uFEFF" + lines.join("\n")], { type: "text/csv;charset=utf-8" });
var a = document.createElement("a");
a.href = URL.createObjectURL(blob);
a.download = "registratsii-" + new Date().toISOString().slice(0, 10) + ".csv";
document.body.appendChild(a);
a.click();
a.remove();
toast("Таблица выгружена");
}
function closeDrawer() {
document.getElementById("drawer").hidden = true;
}
document.getElementById("regBody").addEventListener("click", function (e) {
var tr = e.target.closest("tr[data-id]");
if (tr) openDrawer(Number(tr.getAttribute("data-id")));
});
document.getElementById("regBody").addEventListener("keydown", function (e) {
if (e.key === "Enter") {
var tr = e.target.closest("tr[data-id]");
if (tr) openDrawer(Number(tr.getAttribute("data-id")));
}
});
function openDrawer(id) {
var r = (ALL || []).find(function (x) { return x.id === id; });
if (!r) return;
var d = document.getElementById("drawer");
d.innerHTML =
'