v1.0.178: Фаза 4 — renderStepper(state). Степпер через state.ui.steps вместо прямой манипуляции DOM. stepDone/stepActive/resetStepper мутируют state → renderStepper.
This commit is contained in:
+52
-17
@@ -36,31 +36,66 @@ var fileTable = document.getElementById('fileTable');
|
|||||||
*/
|
*/
|
||||||
function render(state) {
|
function render(state) {
|
||||||
renderFiles(state);
|
renderFiles(state);
|
||||||
|
renderStepper(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
// syncDB, statusToHTML, renderFiles, toggleClassifyDetail, uploadFile, refreshSupps
|
// syncDB, statusToHTML, renderFiles, toggleClassifyDetail, uploadFile, refreshSupps
|
||||||
// → вынесены в files.js (Фаза 1)
|
// → вынесены в files.js (Фаза 1)
|
||||||
|
|
||||||
// ── Pipeline stepper ─────────────────────────────────────────
|
// ── Pipeline stepper (Фаза 4: state-driven) ──────────────────
|
||||||
function stepDone(id) {
|
|
||||||
var el = document.getElementById(id);
|
/**
|
||||||
if (el) { el.innerHTML = el.innerHTML.replace('○','✓'); el.style.color = 'var(--green)'; }
|
* renderStepper(state) — Рендер степпера из state.ui.steps (Фаза 4).
|
||||||
}
|
*
|
||||||
function stepActive(id) {
|
* Читает state.ui.steps.{upload,classify,groups,compare}, обновляет DOM.
|
||||||
var el = document.getElementById(id);
|
* Значения: '○' (не начат) | '⏳' (в процессе) | '✓' (завершён).
|
||||||
if (el) { el.innerHTML = el.innerHTML.replace('○','⏳').replace('✓','⏳'); el.style.color = 'var(--brand-primary)'; }
|
*/
|
||||||
}
|
function renderStepper(state) {
|
||||||
function resetStepper(fromId) {
|
var steps = state.ui.steps;
|
||||||
var steps = ['stepUpload','stepClassify','stepGroups','stepCompare'];
|
var map = { upload: 'stepUpload', classify: 'stepClassify', groups: 'stepGroups', compare: 'stepCompare' };
|
||||||
var reset = false;
|
var colors = { '○': 'var(--muted)', '⏳': 'var(--brand-primary)', '✓': 'var(--green)' };
|
||||||
steps.forEach(function(id) {
|
Object.keys(map).forEach(function(key) {
|
||||||
if (id === fromId) reset = true;
|
var el = document.getElementById(map[key]);
|
||||||
if (reset) {
|
if (el) {
|
||||||
var el = document.getElementById(id);
|
el.textContent = steps[key] + ' ' + {upload:'Загрузка',classify:'Классификация',groups:'Группировка',compare:'Сравнение'}[key];
|
||||||
if (el) { el.innerHTML = el.innerHTML.replace('✓','○').replace('⏳','○'); el.style.color = 'var(--muted)'; }
|
el.style.color = colors[steps[key]] || 'var(--muted)';
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* stepDone(id) — Отметить шаг как завершённый (Фаза 4).
|
||||||
|
* Мутирует state.ui.steps, вызывает renderStepper.
|
||||||
|
*/
|
||||||
|
function stepDone(id) {
|
||||||
|
var key = { stepUpload: 'upload', stepClassify: 'classify', stepGroups: 'groups', stepCompare: 'compare' }[id];
|
||||||
|
if (key) { state.ui.steps[key] = '✓'; renderStepper(state); }
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* stepActive(id) — Отметить шаг как активный (Фаза 4).
|
||||||
|
* Мутирует state.ui.steps, вызывает renderStepper.
|
||||||
|
*/
|
||||||
|
function stepActive(id) {
|
||||||
|
var key = { stepUpload: 'upload', stepClassify: 'classify', stepGroups: 'groups', stepCompare: 'compare' }[id];
|
||||||
|
if (key) { state.ui.steps[key] = '⏳'; renderStepper(state); }
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* resetStepper(fromId) — Сбросить шаги начиная с fromId (Фаза 4).
|
||||||
|
* Все шаги после (и включая) fromId получают '○'.
|
||||||
|
* Мутирует state.ui.steps, вызывает renderStepper.
|
||||||
|
*/
|
||||||
|
function resetStepper(fromId) {
|
||||||
|
var order = ['stepUpload','stepClassify','stepGroups','stepCompare'];
|
||||||
|
var keys = ['upload','classify','groups','compare'];
|
||||||
|
var reset = false;
|
||||||
|
order.forEach(function(id, i) {
|
||||||
|
if (id === fromId) reset = true;
|
||||||
|
if (reset) { state.ui.steps[keys[i]] = '○'; }
|
||||||
|
});
|
||||||
|
renderStepper(state);
|
||||||
|
}
|
||||||
// Утилиты (formatSize, formatDate, moveUp, moveDown, escHtml, fmtDate) —
|
// Утилиты (formatSize, formatDate, moveUp, moveDown, escHtml, fmtDate) —
|
||||||
// вынесены в app_utils.js для облегчения анализа и отладки.
|
// вынесены в app_utils.js для облегчения анализа и отладки.
|
||||||
// statusToHTML, renderFiles → files.js (Фаза 1)
|
// statusToHTML, renderFiles → files.js (Фаза 1)
|
||||||
|
|||||||
Reference in New Issue
Block a user