From 36fe38b235d47f2cf328b4ef0c4b2ea385efce2d Mon Sep 17 00:00:00 2001 From: ZDDC Date: Mon, 15 Jun 2026 07:57:07 -0500 Subject: [PATCH] refactor(classifier): rename the misleading mdl* internals to worklist* (#8) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The "From a list" scratch worklist still carried "mdl"/"existing" identifiers from when it was the MDL/By-existing catalog — misleading now that it's a generic scratch list and the real MDL is just the archive's mdl/ folder. Mechanical rename across classify.js, target-tree.js, template.html, layout.css, and the spec, leaving the genuine MDL concept (readMdlYamls, the mdl/ folder, inMdl, migrateLegacyMdl) untouched: - API/state: setMdlList→setWorklist, appendMdlRows→appendWorklist, clearMdlList→clearWorklist, getMdlList→getWorklist, getMdlRow→getWorklistRow, state.mdlList→state.worklist. - DOM/UI: #mdlPanel→#worklistPanel, #mdlTree→#worklistTable, #existingTab→#worklistTab, #loadMdlBtn→#loadWorklistBtn, the currentTab value 'existing'→'worklist'. - internals: mdlTable→worklistGrid, mdlPlaced→worklistPlaced, renderMdlInto→renderWorklist, ensureMdlTable→ensureWorklistGrid, renderMdlPlaced→renderWorklistFiles, loadMdl→loadWorklist; CSS .mdl-rev__input + .fromlist-* → .worklist-*. No behavior change; classify + classifier suites stay 66 green. Co-Authored-By: Claude Opus 4.8 (1M context) --- classifier/css/layout.css | 22 ++++---- classifier/js/classify.js | 32 +++++------ classifier/js/target-tree.js | 100 +++++++++++++++++------------------ classifier/template.html | 8 +-- tests/classify.spec.js | 20 +++---- 5 files changed, 91 insertions(+), 91 deletions(-) diff --git a/classifier/css/layout.css b/classifier/css/layout.css index 8c25979..59adf75 100644 --- a/classifier/css/layout.css +++ b/classifier/css/layout.css @@ -579,18 +579,18 @@ input.tfile__name:focus { border-color: var(--primary); background: var(--bg); o .target-tabs__group { display: flex; gap: 0.25rem; } .target-tabs__divider { width: 1px; align-self: stretch; margin: 0.2rem 0.6rem 0; background: var(--border); } /* The "By existing" catalog is now a normal in-flow tab panel. */ -#mdlTree { flex: 1; min-height: 0; } -#mdlTree .seltable { height: 100%; } +#worklistTable { flex: 1; min-height: 0; } +#worklistTable .seltable { height: 100%; } /* Editable "From a list" cells — fill the column (the table is width:auto, so the column sizes to its header/content, and the input never widens it). */ -.mdl-rev__input, .fromlist-tn__input, .fromlist-title__input { +.worklist-rev__input, .worklist-tn__input, .worklist-title__input { width: 100%; min-width: 4rem; box-sizing: border-box; padding: 0.15rem 0.35rem; border: 1px solid var(--border); border-radius: var(--radius); background: var(--bg); color: var(--text); font-size: 0.8rem; } -.fromlist-tn__input { font-family: var(--mono, monospace); } -.mdl-rev__input.is-warn, .fromlist-tn__input.is-warn { border-color: var(--warning, #b8860b); } -.fromlist-src { white-space: nowrap; } +.worklist-tn__input { font-family: var(--mono, monospace); } +.worklist-rev__input.is-warn, .worklist-tn__input.is-warn { border-color: var(--warning, #b8860b); } +.worklist-src { white-space: nowrap; } .src-badge { display: inline-block; margin-right: 0.25rem; padding: 0 0.3rem; border-radius: 0.7rem; font-size: 0.64rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.03em; @@ -603,10 +603,10 @@ input.tfile__name:focus { border-color: var(--primary); background: var(--bg); o .target-toggle { display: inline-flex; align-items: center; gap: 0.3rem; font-size: 0.8rem; color: var(--text-muted); cursor: pointer; } .seltable__extra { white-space: normal; } .mdlfile__name { font-size: 0.78rem; } -#mdlPanel .tfile { gap: 0.3rem; align-items: center; padding: 0.05rem 0; cursor: grab; } -#mdlPanel .tfile--err .mdlfile__name { color: var(--danger); } -#mdlPanel .tfile__remove { opacity: 0.6; } -#mdlPanel .tfile:hover .tfile__remove { opacity: 1; } +#worklistPanel .tfile { gap: 0.3rem; align-items: center; padding: 0.05rem 0; cursor: grab; } +#worklistPanel .tfile--err .mdlfile__name { color: var(--danger); } +#worklistPanel .tfile__remove { opacity: 0.6; } +#worklistPanel .tfile:hover .tfile__remove { opacity: 1; } /* Paste + Match dialogs (inside the .copy-choice modal shell) */ .scratch-modal__body { margin: 0 0 1rem; } @@ -630,7 +630,7 @@ input.tfile__name:focus { border-color: var(--primary); background: var(--bg); o /* The base seltable rules live in shared/seltable.css (bundled by build.sh and shared with the tables tool); only the classifier-specific catalog bits - (.seltable__extra, .mdl-rev__input, .fromlist-*, .src-badge, #mdlTree) are + (.seltable__extra, .worklist-rev__input, .worklist-*, .src-badge, #worklistTable) are here. */ /* ── Copy destination dialog ────────────────────────────────────────────── */ diff --git a/classifier/js/classify.js b/classifier/js/classify.js index 16ce1c5..612046d 100644 --- a/classifier/js/classify.js +++ b/classifier/js/classify.js @@ -59,7 +59,7 @@ transmittalTree: [], // [ { id, kind:'party', name, children:[ slot ] } ] outputName: null, // remembered output directory display name config: defaultConfig(), // tracking-number pattern (fields/statuses/modifiers) - mdlList: [], // loaded MDL deliverables (drop targets): [ { id, party, trackingNumber, title, revisionCell } ] + worklist: [], // "From a list" scratch rows: [ { id, trackingNumber, title, revisionCell, source, archiveRevisions } ] }; // id -> { node, kind:'tracking'|'party'|'slot'|'transmittal', parent } @@ -417,7 +417,7 @@ config: state.config, // Strip the transient row→keys hint (`placed`) — it's rebuilt as // drops happen and would otherwise bloat every autosave. - mdlList: state.mdlList.map(function (r) { + worklist: state.worklist.map(function (r) { return { id: r.id, party: r.party, trackingNumber: r.trackingNumber, title: r.title, revisionCell: r.revisionCell, source: r.source, archiveRevisions: r.archiveRevisions }; }), }; @@ -429,9 +429,9 @@ state.transmittalTree = obj.transmittalTree || []; state.outputName = obj.outputName || null; state.config = normalizeConfig(obj.config); - state.mdlList = (Array.isArray(obj.mdlList) ? obj.mdlList : []).map(normalizeRow); + state.worklist = (Array.isArray(obj.worklist) ? obj.worklist : []).map(normalizeRow); rebuildIndex(); - migrateLegacyMdl(obj.mdlList); // BEFORE anything can prune; materializes old mdl placements + migrateLegacyMdl(obj.worklist); // BEFORE anything can prune; materializes old mdl placements notify(); } // Pre-"From a list" workspaces stored a separate `mdlNodeId` axis pointing at @@ -504,10 +504,10 @@ placed: Object.create(null), }; } - function setMdlList(rows) { state.mdlList = (rows || []).map(normalizeRow); notify(); } - function appendMdlRows(rows) { + function setWorklist(rows) { state.worklist = (rows || []).map(normalizeRow); notify(); } + function appendWorklist(rows) { var byTn = Object.create(null); - state.mdlList.forEach(function (r) { if (r.trackingNumber) byTn[r.trackingNumber] = r; }); + state.worklist.forEach(function (r) { if (r.trackingNumber) byTn[r.trackingNumber] = r; }); (rows || []).forEach(function (raw) { var r = normalizeRow(raw), ex = r.trackingNumber ? byTn[r.trackingNumber] : null; if (ex) { @@ -518,15 +518,15 @@ ex.source.pasted = ex.source.pasted || r.source.pasted; if (r.archiveRevisions.length && !ex.archiveRevisions.length) ex.archiveRevisions = r.archiveRevisions; } else { - state.mdlList.push(r); + state.worklist.push(r); if (r.trackingNumber) byTn[r.trackingNumber] = r; } }); notify(); } - function clearMdlList() { state.mdlList = []; notify(); } // rows only — assignments survive - function getMdlList() { return state.mdlList; } - function getMdlRow(id) { return state.mdlList.filter(function (r) { return r.id === id; })[0] || null; } + function clearWorklist() { state.worklist = []; notify(); } // rows only — assignments survive + function getWorklist() { return state.worklist; } + function getWorklistRow(id) { return state.worklist.filter(function (r) { return r.id === id; })[0] || null; } // Build (creating folders as needed) the tracking-tree leaf a row points at: // "_". A tracking number's last segment is an @@ -593,12 +593,12 @@ if (old) pruneEmptyTrackingChain(old); } function setRowTracking(rowId, tn) { - var r = getMdlRow(rowId); if (!r) return; + var r = getWorklistRow(rowId); if (!r) return; r.trackingNumber = (tn == null ? '' : String(tn)).trim(); restampRow(r); notify(); } function setRowTitle(rowId, title) { - var r = getMdlRow(rowId); if (!r) return; + var r = getWorklistRow(rowId); if (!r) return; r.title = (title == null ? '' : String(title)); Object.keys(r.placed || {}).forEach(function (k) { if (state.assignments[k]) setTitleOverride(k, r.title); }); notify(); @@ -607,7 +607,7 @@ function setRevisionCells(rowIds, value) { var set = Object.create(null); (rowIds || []).forEach(function (i) { set[i] = true; }); var changed = false; - state.mdlList.forEach(function (r) { + state.worklist.forEach(function (r) { if (set[r.id]) { r.revisionCell = (value == null ? '' : String(value)); restampRow(r); changed = true; } }); if (changed) notify(); @@ -844,8 +844,8 @@ transmittalRecord: transmittalRecord, findOrAddParty: findOrAddParty, findOrAddTransmittalBin: findOrAddTransmittalBin, getConfig: getConfig, setConfig: setConfig, getTrackingFields: getTrackingFields, - setMdlList: setMdlList, appendMdlRows: appendMdlRows, clearMdlList: clearMdlList, - getMdlList: getMdlList, getMdlRow: getMdlRow, + setWorklist: setWorklist, appendWorklist: appendWorklist, clearWorklist: clearWorklist, + getWorklist: getWorklist, getWorklistRow: getWorklistRow, assignFromRow: assignFromRow, unassignRowFile: unassignRowFile, setRowTracking: setRowTracking, setRowTitle: setRowTitle, setRevisionCell: setRevisionCell, setRevisionCells: setRevisionCells, diff --git a/classifier/js/target-tree.js b/classifier/js/target-tree.js index bfda46a..fe78b70 100644 --- a/classifier/js/target-tree.js +++ b/classifier/js/target-tree.js @@ -19,9 +19,9 @@ var collapsed = {}; // nodeId -> true when collapsed (default expanded) var openForm = null; // { partyId, slot } when a bin form is open var initialized = false; - var currentTab = 'tracking'; // 'tracking' | 'existing' | 'transmittal' — active tab - var mdlTable = null; // the seltable controller for the "From a list" tab - var mdlPlaced = {}; // trackingNumber -> placed files (read by the Files cell) + var currentTab = 'tracking'; // 'tracking' | 'worklist' | 'transmittal' — active tab + var worklistGrid = null; // the seltable controller for the "From a list" tab + var worklistPlaced = {}; // trackingNumber -> placed files (read by the Files cell) var hideAssigned = false; // "Hide assigned" toggle in the From-a-list toolbar var listScanned = false; // a Load has run this session (drives the "new" badge) @@ -30,15 +30,15 @@ initialized = true; els = { trackingTab: document.getElementById('trackingTab'), - existingTab: document.getElementById('existingTab'), + worklistTab: document.getElementById('worklistTab'), transmittalTab: document.getElementById('transmittalTab'), trackingPanel: document.getElementById('trackingPanel'), transmittalPanel: document.getElementById('transmittalPanel'), - mdlPanel: document.getElementById('mdlPanel'), + worklistPanel: document.getElementById('worklistPanel'), trackingTree: document.getElementById('trackingTree'), transmittalTree: document.getElementById('transmittalTree'), - mdlTree: document.getElementById('mdlTree'), - loadMdlBtn: document.getElementById('loadMdlBtn'), + worklistTable: document.getElementById('worklistTable'), + loadWorklistBtn: document.getElementById('loadWorklistBtn'), pasteRowsBtn: document.getElementById('pasteRowsBtn'), matchNamesBtn: document.getElementById('matchNamesBtn'), clearListBtn: document.getElementById('clearListBtn'), @@ -49,13 +49,13 @@ }; els.trackingTab.addEventListener('click', function () { showTab('tracking'); }); - if (els.existingTab) els.existingTab.addEventListener('click', function () { showTab('existing'); }); + if (els.worklistTab) els.worklistTab.addEventListener('click', function () { showTab('worklist'); }); els.transmittalTab.addEventListener('click', function () { showTab('transmittal'); }); - if (els.loadMdlBtn) els.loadMdlBtn.addEventListener('click', loadMdl); + if (els.loadWorklistBtn) els.loadWorklistBtn.addEventListener('click', loadWorklist); if (els.pasteRowsBtn) els.pasteRowsBtn.addEventListener('click', function () { openPasteDialog(''); }); if (els.matchNamesBtn) els.matchNamesBtn.addEventListener('click', openMatchDialog); if (els.clearListBtn) els.clearListBtn.addEventListener('click', function () { - var list = C().getMdlList(); + var list = C().getWorklist(); if (!list.length) return; // Warn before stranding files that still need a revision: they stay // assigned (on a "pending" leaf under By tracking number), but the @@ -63,16 +63,16 @@ var pending = 0; list.forEach(function (r) { if (!(r.revisionCell || '').trim()) pending += Object.keys(r.placed || {}).length; }); if (pending && !confirm(pending + ' file' + (pending === 1 ? '' : 's') + ' still need a revision. They stay assigned (a “pending” folder under By tracking number), but the list row to finish them here goes away. Clear anyway?')) return; - C().clearMdlList(); + C().clearWorklist(); window.zddc.toast('List cleared — every assignment is kept (see By tracking number).', 'info'); }); if (els.hideAssignedToggle) els.hideAssignedToggle.addEventListener('change', function () { hideAssigned = !!els.hideAssignedToggle.checked; - if (mdlTable) mdlTable.renderBody(); + if (worklistGrid) worklistGrid.renderBody(); }); // Ctrl-V anywhere on the From-a-list panel opens the paste dialog prefilled. - if (els.mdlPanel) els.mdlPanel.addEventListener('paste', function (e) { - if (currentTab !== 'existing') return; + if (els.worklistPanel) els.worklistPanel.addEventListener('paste', function (e) { + if (currentTab !== 'worklist') return; if (e.target && e.target.closest('input, textarea')) return; // let real inputs paste var t = (e.clipboardData || window.clipboardData); var text = t ? t.getData('text') : ''; @@ -135,12 +135,12 @@ } function showTab(which) { - currentTab = (which === 'transmittal' || which === 'existing') ? which : 'tracking'; + currentTab = (which === 'transmittal' || which === 'worklist') ? which : 'tracking'; els.trackingTab.classList.toggle('active', currentTab === 'tracking'); - if (els.existingTab) els.existingTab.classList.toggle('active', currentTab === 'existing'); + if (els.worklistTab) els.worklistTab.classList.toggle('active', currentTab === 'worklist'); els.transmittalTab.classList.toggle('active', currentTab === 'transmittal'); els.trackingPanel.hidden = currentTab !== 'tracking'; - if (els.mdlPanel) els.mdlPanel.hidden = currentTab !== 'existing'; + if (els.worklistPanel) els.worklistPanel.hidden = currentTab !== 'worklist'; els.transmittalPanel.hidden = currentTab !== 'transmittal'; render(); // The source-tree Show filters are per-axis, so the visible set changes @@ -174,7 +174,7 @@ var placed = buildPlaced(files); renderTrackingInto(els.trackingTree, C().getTrackingTree(), placed.tracking); renderTransmittalInto(els.transmittalTree, C().getTransmittalTree(), placed.transmittal); - renderMdlInto(placed.byTracking); + renderWorklist(placed.byTracking); renderStats(files); } @@ -509,51 +509,51 @@ } // ── "From a list" (scratch worklist via the shared seltable) ──────────── - function renderMdlInto(placedByTracking) { - mdlPlaced = placedByTracking || {}; - if (!C().getMdlList().length) { - mdlTable = null; - els.mdlTree.textContent = ''; - els.mdlTree.appendChild(el('div', 'target-empty', 'Empty — “Load…” numbers from the archive/MDL, “Paste rows…” from Excel, or “⚡ Match names”. Then drag files onto a row to name them. The list is a scratch pad — clearing it keeps every assignment (see By tracking number).')); + function renderWorklist(placedByTracking) { + worklistPlaced = placedByTracking || {}; + if (!C().getWorklist().length) { + worklistGrid = null; + els.worklistTable.textContent = ''; + els.worklistTable.appendChild(el('div', 'target-empty', 'Empty — “Load…” numbers from the archive/MDL, “Paste rows…” from Excel, or “⚡ Match names”. Then drag files onto a row to name them. The list is a scratch pad — clearing it keeps every assignment (see By tracking number).')); return; } - ensureMdlTable(); - mdlTable.renderBody(); + ensureWorklistGrid(); + worklistGrid.renderBody(); } - function rowPlaced(r) { var f = mdlPlaced[r.trackingNumber]; return f && f.length ? f : null; } - function ensureMdlTable() { - if (mdlTable) return mdlTable; + function rowPlaced(r) { var f = worklistPlaced[r.trackingNumber]; return f && f.length ? f : null; } + function ensureWorklistGrid() { + if (worklistGrid) return worklistGrid; var c = C(); var cols = [ - { key: 'tn', title: 'Tracking number', cls: 'fromlist-tn', get: function (r) { return r.trackingNumber || ''; }, - render: function (r, td) { editCell(td, 'fromlist-tn__input', r.trackingNumber, 'ACME-…-0001', function (v) { c.setRowTracking(r.id, v); }, tnWarn(r)); } }, - { key: 'title', title: 'Title', cls: 'fromlist-title', get: function (r) { return r.title || ''; }, - render: function (r, td) { editCell(td, 'fromlist-title__input', r.title, 'title', function (v) { c.setRowTitle(r.id, v); }); } }, - { key: 'src', title: 'Source', cls: 'fromlist-src', get: function (r) { var s = r.source || {}; return [s.mdl ? 'mdl' : '', s.archive ? 'arch' : '', s.pasted ? 'pasted' : ''].filter(Boolean).join(' '); }, + { key: 'tn', title: 'Tracking number', cls: 'worklist-tn', get: function (r) { return r.trackingNumber || ''; }, + render: function (r, td) { editCell(td, 'worklist-tn__input', r.trackingNumber, 'ACME-…-0001', function (v) { c.setRowTracking(r.id, v); }, tnWarn(r)); } }, + { key: 'title', title: 'Title', cls: 'worklist-title', get: function (r) { return r.title || ''; }, + render: function (r, td) { editCell(td, 'worklist-title__input', r.title, 'title', function (v) { c.setRowTitle(r.id, v); }); } }, + { key: 'src', title: 'Source', cls: 'worklist-src', get: function (r) { var s = r.source || {}; return [s.mdl ? 'mdl' : '', s.archive ? 'arch' : '', s.pasted ? 'pasted' : ''].filter(Boolean).join(' '); }, render: function (r, td) { renderSource(r, td); } }, { key: 'latest', title: 'Latest rev', get: function (r) { return latestRevOf(r.archiveRevisions); } }, { key: 'rev', title: 'Revision', cls: 'mdl-rev', get: function (r) { return r.revisionCell; }, - render: function (r, td) { editCell(td, 'mdl-rev__input', r.revisionCell, 'A (IFR)', function (v) { c.setRevisionCell(r.id, v); }); } }, + render: function (r, td) { editCell(td, 'worklist-rev__input', r.revisionCell, 'A (IFR)', function (v) { c.setRevisionCell(r.id, v); }); } }, ]; - mdlTable = window.app.modules.seltable.create({ - container: els.mdlTree, + worklistGrid = window.app.modules.seltable.create({ + container: els.worklistTable, extraTitle: 'Files', rows: function () { - var list = c.getMdlList(); + var list = c.getWorklist(); return hideAssigned ? list.filter(function (r) { return !rowPlaced(r); }) : list; }, rowId: function (r) { return r.id; }, columns: cols, - onRowDrop: function (rowId, keys) { var row = c.getMdlRow(rowId); if (row) c.assignFromRow(keys, row); }, + onRowDrop: function (rowId, keys) { var row = c.getWorklistRow(rowId); if (row) c.assignFromRow(keys, row); }, onActivate: function (ids) { if (!ids.length) return; var v = prompt('Set the revision on ' + ids.length + ' selected row(s) (e.g. "A (IFR)"):', ''); if (v != null) c.setRevisionCells(ids, v.trim()); }, - rowExtra: function (r, td) { renderMdlPlaced(r, td); }, + rowExtra: function (r, td) { renderWorklistFiles(r, td); }, }); - mdlTable.render(); - return mdlTable; + worklistGrid.render(); + return worklistGrid; } // An editable seltable cell: an that commits on change. `warn` is an // optional tooltip that flags (without blocking) a questionable value. @@ -584,7 +584,7 @@ td.appendChild(el('span', 'src-badge src-badge--pasted', 'pasted')); } } - function renderMdlPlaced(row, td) { + function renderWorklistFiles(row, td) { var c = C(), files = rowPlaced(row) || []; files.forEach(function (f) { var d = c.deriveTarget(f); @@ -655,7 +655,7 @@ } return [{ label: scope.one, handle: archiveOf('/' + scope.one + '/') }]; } - async function loadMdl() { + async function loadWorklist() { var roots = await buildRoots(); if (!roots) return; var picked = await window.app.modules.dirPicker.pick(roots); @@ -706,8 +706,8 @@ } function finishLoad(rows) { listScanned = true; - C().appendMdlRows(rows); // APPEND — the list accumulates across batches - showTab('existing'); + C().appendWorklist(rows); // APPEND — the list accumulates across batches + showTab('worklist'); window.zddc.toast(rows.length ? ('Added ' + rows.length + ' tracking number' + (rows.length === 1 ? '' : 's') + ' from the selected directories. Drag files on, set revisions.') : 'No files or deliverables in the selected directories.', rows.length ? 'success' : 'warning'); @@ -765,8 +765,8 @@ } add.addEventListener('click', function () { var n = parsed.rows.length; - c.appendMdlRows(parsed.rows); - m.close(); showTab('existing'); + c.appendWorklist(parsed.rows); + m.close(); showTab('worklist'); window.zddc.toast('Added ' + n + ' pasted row' + (n === 1 ? '' : 's') + '.', 'success'); }); ta.addEventListener('input', refresh); @@ -774,7 +774,7 @@ } function openMatchDialog() { var c = C(); - var rows = c.getMdlList(); + var rows = c.getWorklist(); if (!rows.length) { window.zddc.toast('Load or paste some tracking numbers first.', 'warning'); return; } var files = allFiles().filter(function (f) { var a = c.getAssignment(c.srcKeyForFile(f)); @@ -815,7 +815,7 @@ var p = proposals[Number(cb.dataset.i)]; if (p) { c.assignFromRow([c.srcKeyForFile(p.file)], p.row); n++; } }); - m.close(); showTab('existing'); + m.close(); showTab('worklist'); window.zddc.toast('Assigned ' + n + ' file' + (n === 1 ? '' : 's') + ' by name match.', n ? 'success' : 'info'); }); fuzzy.addEventListener('change', function () { opts.fuzzy = fuzzy.checked; refresh(); }); diff --git a/classifier/template.html b/classifier/template.html index bde4bbe..7e0ea8a 100644 --- a/classifier/template.html +++ b/classifier/template.html @@ -163,7 +163,7 @@
- +
@@ -205,16 +205,16 @@ Dragging a file onto a row MATERIALIZES a real "By tracking number" placement, so Clear keeps every assignment. The left filetree is the drag source. --> -
diff --git a/tests/classify.spec.js b/tests/classify.spec.js index d282090..1753b91 100644 --- a/tests/classify.spec.js +++ b/tests/classify.spec.js @@ -1251,8 +1251,8 @@ test('From a list: a drop materializes a real tracking placement; row revision + const f = { originalFilename: 'messy scan 47', extension: 'pdf', folderPath: 'R' }; window.app.folderTree = [{ name: 'R', path: 'R', files: [f], children: [] }]; const key = c.srcKeyForFile(f); - c.setMdlList([{ id: 'm1', trackingNumber: 'ACM-PRJ-EL-SPC-0001', title: 'Switchgear Spec' }]); - c.assignFromRow([key], c.getMdlRow('m1')); // blank revision → partial + c.setWorklist([{ id: 'm1', trackingNumber: 'ACM-PRJ-EL-SPC-0001', title: 'Switchgear Spec' }]); + c.assignFromRow([key], c.getWorklistRow('m1')); // blank revision → partial const placedTracking = !!(c.getAssignment(key) || {}).trackingNodeId; // a REAL tracking placement const beforeRev = c.deriveTarget(f); c.setRevisionCell('m1', 'A (IFR)'); // re-stamps onto the leaf @@ -1288,22 +1288,22 @@ test('From a list: clearing the list keeps classifications; the row drives the s const f = { originalFilename: 'scan', extension: 'pdf', folderPath: 'R' }; window.app.folderTree = [{ name: 'R', path: 'R', files: [f], children: [] }]; const key = c.srcKeyForFile(f); - c.setMdlList([ + c.setWorklist([ { id: 'm1', trackingNumber: 'ACM-PRJ-EL-SPC-0001', title: 'Spec', inMdl: true, archiveRevisions: ['A (IFR)', 'B (IFC)'], revisionCell: 'C (IFC)' }, { id: 'm2', trackingNumber: 'ACM-PRJ-EL-SPC-0002', title: 'Spec 2', archiveRevisions: ['0 (IFC)'] }, ]); - tt.showTab('existing'); - const row = document.querySelector('#mdlTree .seltable__row[data-id="m1"]'); + tt.showTab('worklist'); + const row = document.querySelector('#worklistTable .seltable__row[data-id="m1"]'); const latestShown = !!row && row.textContent.includes('B (IFC)'); // latest archive rev shown window.app.modules.dnd.setDrag([key]); row.dispatchEvent(new Event('drop', { bubbles: true, cancelable: true })); // drop on m1 (rev C set) const named = c.deriveTarget(f).filename; - c.clearMdlList(); // list emptied — assignment must survive + c.clearWorklist(); // list emptied — assignment must survive return { hasRow: !!row, latestShown, placedAfterDrop: !!(c.getAssignment(key) || {}).trackingNodeId, named, - listLen: c.getMdlList().length, + listLen: c.getWorklist().length, stillPlaced: !!(c.getAssignment(key) || {}).trackingNodeId, stillNamed: c.deriveTarget(f).filename, }; @@ -1325,8 +1325,8 @@ test('From a list: editing the tracking number (bump sequence) re-stamps placed const f = { originalFilename: 'plan', extension: 'pdf', folderPath: 'R' }; window.app.folderTree = [{ name: 'R', path: 'R', files: [f], children: [] }]; const key = c.srcKeyForFile(f); - c.setMdlList([{ id: 'm1', trackingNumber: 'ACM-PRJ-EL-DWG-0007', title: 'Plan', revisionCell: 'A (IFR)' }]); - c.assignFromRow([key], c.getMdlRow('m1')); + c.setWorklist([{ id: 'm1', trackingNumber: 'ACM-PRJ-EL-DWG-0007', title: 'Plan', revisionCell: 'A (IFR)' }]); + c.assignFromRow([key], c.getWorklistRow('m1')); const before = c.deriveTarget(f).filename; c.setRowTracking('m1', 'ACM-PRJ-EL-DWG-0008'); // it's the next drawing const after = c.deriveTarget(f).filename; @@ -1351,7 +1351,7 @@ test('From a list: load() migrates a legacy mdlNodeId placement into a tracking // A pre-"From a list" serialized workspace: the file points at an mdl row. c.load({ assignments: { [key]: { mdlNodeId: 'old1', titleFromDeliverable: true, transmittalNodeId: null, excluded: false, titleOverride: null } }, - mdlList: [{ id: 'old1', trackingNumber: 'ACM-PRJ-EL-SPC-0009', title: 'Legacy', revisionCell: 'B (IFC)' }], + worklist: [{ id: 'old1', trackingNumber: 'ACM-PRJ-EL-SPC-0009', title: 'Legacy', revisionCell: 'B (IFC)' }], }); const a = c.getAssignment(key) || {}; return {