refactor(classifier): rename the misleading mdl* internals to worklist* (#8)
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) <noreply@anthropic.com>
This commit is contained in:
parent
605f4ab3e0
commit
36fe38b235
5 changed files with 91 additions and 91 deletions
|
|
@ -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__group { display: flex; gap: 0.25rem; }
|
||||||
.target-tabs__divider { width: 1px; align-self: stretch; margin: 0.2rem 0.6rem 0; background: var(--border); }
|
.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. */
|
/* The "By existing" catalog is now a normal in-flow tab panel. */
|
||||||
#mdlTree { flex: 1; min-height: 0; }
|
#worklistTable { flex: 1; min-height: 0; }
|
||||||
#mdlTree .seltable { height: 100%; }
|
#worklistTable .seltable { height: 100%; }
|
||||||
/* Editable "From a list" cells — fill the column (the table is width:auto, so
|
/* 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). */
|
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;
|
width: 100%; min-width: 4rem; box-sizing: border-box;
|
||||||
padding: 0.15rem 0.35rem; border: 1px solid var(--border);
|
padding: 0.15rem 0.35rem; border: 1px solid var(--border);
|
||||||
border-radius: var(--radius); background: var(--bg); color: var(--text); font-size: 0.8rem;
|
border-radius: var(--radius); background: var(--bg); color: var(--text); font-size: 0.8rem;
|
||||||
}
|
}
|
||||||
.fromlist-tn__input { font-family: var(--mono, monospace); }
|
.worklist-tn__input { font-family: var(--mono, monospace); }
|
||||||
.mdl-rev__input.is-warn, .fromlist-tn__input.is-warn { border-color: var(--warning, #b8860b); }
|
.worklist-rev__input.is-warn, .worklist-tn__input.is-warn { border-color: var(--warning, #b8860b); }
|
||||||
.fromlist-src { white-space: nowrap; }
|
.worklist-src { white-space: nowrap; }
|
||||||
.src-badge {
|
.src-badge {
|
||||||
display: inline-block; margin-right: 0.25rem; padding: 0 0.3rem; border-radius: 0.7rem;
|
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;
|
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; }
|
.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; }
|
.seltable__extra { white-space: normal; }
|
||||||
.mdlfile__name { font-size: 0.78rem; }
|
.mdlfile__name { font-size: 0.78rem; }
|
||||||
#mdlPanel .tfile { gap: 0.3rem; align-items: center; padding: 0.05rem 0; cursor: grab; }
|
#worklistPanel .tfile { gap: 0.3rem; align-items: center; padding: 0.05rem 0; cursor: grab; }
|
||||||
#mdlPanel .tfile--err .mdlfile__name { color: var(--danger); }
|
#worklistPanel .tfile--err .mdlfile__name { color: var(--danger); }
|
||||||
#mdlPanel .tfile__remove { opacity: 0.6; }
|
#worklistPanel .tfile__remove { opacity: 0.6; }
|
||||||
#mdlPanel .tfile:hover .tfile__remove { opacity: 1; }
|
#worklistPanel .tfile:hover .tfile__remove { opacity: 1; }
|
||||||
|
|
||||||
/* Paste + Match dialogs (inside the .copy-choice modal shell) */
|
/* Paste + Match dialogs (inside the .copy-choice modal shell) */
|
||||||
.scratch-modal__body { margin: 0 0 1rem; }
|
.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
|
/* 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
|
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. */
|
here. */
|
||||||
|
|
||||||
/* ── Copy destination dialog ────────────────────────────────────────────── */
|
/* ── Copy destination dialog ────────────────────────────────────────────── */
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@
|
||||||
transmittalTree: [], // [ { id, kind:'party', name, children:[ slot ] } ]
|
transmittalTree: [], // [ { id, kind:'party', name, children:[ slot ] } ]
|
||||||
outputName: null, // remembered output directory display name
|
outputName: null, // remembered output directory display name
|
||||||
config: defaultConfig(), // tracking-number pattern (fields/statuses/modifiers)
|
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 }
|
// id -> { node, kind:'tracking'|'party'|'slot'|'transmittal', parent }
|
||||||
|
|
@ -417,7 +417,7 @@
|
||||||
config: state.config,
|
config: state.config,
|
||||||
// Strip the transient row→keys hint (`placed`) — it's rebuilt as
|
// Strip the transient row→keys hint (`placed`) — it's rebuilt as
|
||||||
// drops happen and would otherwise bloat every autosave.
|
// 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 };
|
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.transmittalTree = obj.transmittalTree || [];
|
||||||
state.outputName = obj.outputName || null;
|
state.outputName = obj.outputName || null;
|
||||||
state.config = normalizeConfig(obj.config);
|
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();
|
rebuildIndex();
|
||||||
migrateLegacyMdl(obj.mdlList); // BEFORE anything can prune; materializes old mdl placements
|
migrateLegacyMdl(obj.worklist); // BEFORE anything can prune; materializes old mdl placements
|
||||||
notify();
|
notify();
|
||||||
}
|
}
|
||||||
// Pre-"From a list" workspaces stored a separate `mdlNodeId` axis pointing at
|
// Pre-"From a list" workspaces stored a separate `mdlNodeId` axis pointing at
|
||||||
|
|
@ -504,10 +504,10 @@
|
||||||
placed: Object.create(null),
|
placed: Object.create(null),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
function setMdlList(rows) { state.mdlList = (rows || []).map(normalizeRow); notify(); }
|
function setWorklist(rows) { state.worklist = (rows || []).map(normalizeRow); notify(); }
|
||||||
function appendMdlRows(rows) {
|
function appendWorklist(rows) {
|
||||||
var byTn = Object.create(null);
|
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) {
|
(rows || []).forEach(function (raw) {
|
||||||
var r = normalizeRow(raw), ex = r.trackingNumber ? byTn[r.trackingNumber] : null;
|
var r = normalizeRow(raw), ex = r.trackingNumber ? byTn[r.trackingNumber] : null;
|
||||||
if (ex) {
|
if (ex) {
|
||||||
|
|
@ -518,15 +518,15 @@
|
||||||
ex.source.pasted = ex.source.pasted || r.source.pasted;
|
ex.source.pasted = ex.source.pasted || r.source.pasted;
|
||||||
if (r.archiveRevisions.length && !ex.archiveRevisions.length) ex.archiveRevisions = r.archiveRevisions;
|
if (r.archiveRevisions.length && !ex.archiveRevisions.length) ex.archiveRevisions = r.archiveRevisions;
|
||||||
} else {
|
} else {
|
||||||
state.mdlList.push(r);
|
state.worklist.push(r);
|
||||||
if (r.trackingNumber) byTn[r.trackingNumber] = r;
|
if (r.trackingNumber) byTn[r.trackingNumber] = r;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
notify();
|
notify();
|
||||||
}
|
}
|
||||||
function clearMdlList() { state.mdlList = []; notify(); } // rows only — assignments survive
|
function clearWorklist() { state.worklist = []; notify(); } // rows only — assignments survive
|
||||||
function getMdlList() { return state.mdlList; }
|
function getWorklist() { return state.worklist; }
|
||||||
function getMdlRow(id) { return state.mdlList.filter(function (r) { return r.id === id; })[0] || null; }
|
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:
|
// Build (creating folders as needed) the tracking-tree leaf a row points at:
|
||||||
// "<tracking>_<rev (status)>". A tracking number's last segment is an
|
// "<tracking>_<rev (status)>". A tracking number's last segment is an
|
||||||
|
|
@ -593,12 +593,12 @@
|
||||||
if (old) pruneEmptyTrackingChain(old);
|
if (old) pruneEmptyTrackingChain(old);
|
||||||
}
|
}
|
||||||
function setRowTracking(rowId, tn) {
|
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();
|
r.trackingNumber = (tn == null ? '' : String(tn)).trim();
|
||||||
restampRow(r); notify();
|
restampRow(r); notify();
|
||||||
}
|
}
|
||||||
function setRowTitle(rowId, title) {
|
function setRowTitle(rowId, title) {
|
||||||
var r = getMdlRow(rowId); if (!r) return;
|
var r = getWorklistRow(rowId); if (!r) return;
|
||||||
r.title = (title == null ? '' : String(title));
|
r.title = (title == null ? '' : String(title));
|
||||||
Object.keys(r.placed || {}).forEach(function (k) { if (state.assignments[k]) setTitleOverride(k, r.title); });
|
Object.keys(r.placed || {}).forEach(function (k) { if (state.assignments[k]) setTitleOverride(k, r.title); });
|
||||||
notify();
|
notify();
|
||||||
|
|
@ -607,7 +607,7 @@
|
||||||
function setRevisionCells(rowIds, value) {
|
function setRevisionCells(rowIds, value) {
|
||||||
var set = Object.create(null); (rowIds || []).forEach(function (i) { set[i] = true; });
|
var set = Object.create(null); (rowIds || []).forEach(function (i) { set[i] = true; });
|
||||||
var changed = false;
|
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 (set[r.id]) { r.revisionCell = (value == null ? '' : String(value)); restampRow(r); changed = true; }
|
||||||
});
|
});
|
||||||
if (changed) notify();
|
if (changed) notify();
|
||||||
|
|
@ -844,8 +844,8 @@
|
||||||
transmittalRecord: transmittalRecord,
|
transmittalRecord: transmittalRecord,
|
||||||
findOrAddParty: findOrAddParty, findOrAddTransmittalBin: findOrAddTransmittalBin,
|
findOrAddParty: findOrAddParty, findOrAddTransmittalBin: findOrAddTransmittalBin,
|
||||||
getConfig: getConfig, setConfig: setConfig, getTrackingFields: getTrackingFields,
|
getConfig: getConfig, setConfig: setConfig, getTrackingFields: getTrackingFields,
|
||||||
setMdlList: setMdlList, appendMdlRows: appendMdlRows, clearMdlList: clearMdlList,
|
setWorklist: setWorklist, appendWorklist: appendWorklist, clearWorklist: clearWorklist,
|
||||||
getMdlList: getMdlList, getMdlRow: getMdlRow,
|
getWorklist: getWorklist, getWorklistRow: getWorklistRow,
|
||||||
assignFromRow: assignFromRow, unassignRowFile: unassignRowFile,
|
assignFromRow: assignFromRow, unassignRowFile: unassignRowFile,
|
||||||
setRowTracking: setRowTracking, setRowTitle: setRowTitle,
|
setRowTracking: setRowTracking, setRowTitle: setRowTitle,
|
||||||
setRevisionCell: setRevisionCell, setRevisionCells: setRevisionCells,
|
setRevisionCell: setRevisionCell, setRevisionCells: setRevisionCells,
|
||||||
|
|
|
||||||
|
|
@ -19,9 +19,9 @@
|
||||||
var collapsed = {}; // nodeId -> true when collapsed (default expanded)
|
var collapsed = {}; // nodeId -> true when collapsed (default expanded)
|
||||||
var openForm = null; // { partyId, slot } when a bin form is open
|
var openForm = null; // { partyId, slot } when a bin form is open
|
||||||
var initialized = false;
|
var initialized = false;
|
||||||
var currentTab = 'tracking'; // 'tracking' | 'existing' | 'transmittal' — active tab
|
var currentTab = 'tracking'; // 'tracking' | 'worklist' | 'transmittal' — active tab
|
||||||
var mdlTable = null; // the seltable controller for the "From a list" tab
|
var worklistGrid = null; // the seltable controller for the "From a list" tab
|
||||||
var mdlPlaced = {}; // trackingNumber -> placed files (read by the Files cell)
|
var worklistPlaced = {}; // trackingNumber -> placed files (read by the Files cell)
|
||||||
var hideAssigned = false; // "Hide assigned" toggle in the From-a-list toolbar
|
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)
|
var listScanned = false; // a Load has run this session (drives the "new" badge)
|
||||||
|
|
||||||
|
|
@ -30,15 +30,15 @@
|
||||||
initialized = true;
|
initialized = true;
|
||||||
els = {
|
els = {
|
||||||
trackingTab: document.getElementById('trackingTab'),
|
trackingTab: document.getElementById('trackingTab'),
|
||||||
existingTab: document.getElementById('existingTab'),
|
worklistTab: document.getElementById('worklistTab'),
|
||||||
transmittalTab: document.getElementById('transmittalTab'),
|
transmittalTab: document.getElementById('transmittalTab'),
|
||||||
trackingPanel: document.getElementById('trackingPanel'),
|
trackingPanel: document.getElementById('trackingPanel'),
|
||||||
transmittalPanel: document.getElementById('transmittalPanel'),
|
transmittalPanel: document.getElementById('transmittalPanel'),
|
||||||
mdlPanel: document.getElementById('mdlPanel'),
|
worklistPanel: document.getElementById('worklistPanel'),
|
||||||
trackingTree: document.getElementById('trackingTree'),
|
trackingTree: document.getElementById('trackingTree'),
|
||||||
transmittalTree: document.getElementById('transmittalTree'),
|
transmittalTree: document.getElementById('transmittalTree'),
|
||||||
mdlTree: document.getElementById('mdlTree'),
|
worklistTable: document.getElementById('worklistTable'),
|
||||||
loadMdlBtn: document.getElementById('loadMdlBtn'),
|
loadWorklistBtn: document.getElementById('loadWorklistBtn'),
|
||||||
pasteRowsBtn: document.getElementById('pasteRowsBtn'),
|
pasteRowsBtn: document.getElementById('pasteRowsBtn'),
|
||||||
matchNamesBtn: document.getElementById('matchNamesBtn'),
|
matchNamesBtn: document.getElementById('matchNamesBtn'),
|
||||||
clearListBtn: document.getElementById('clearListBtn'),
|
clearListBtn: document.getElementById('clearListBtn'),
|
||||||
|
|
@ -49,13 +49,13 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
els.trackingTab.addEventListener('click', function () { showTab('tracking'); });
|
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'); });
|
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.pasteRowsBtn) els.pasteRowsBtn.addEventListener('click', function () { openPasteDialog(''); });
|
||||||
if (els.matchNamesBtn) els.matchNamesBtn.addEventListener('click', openMatchDialog);
|
if (els.matchNamesBtn) els.matchNamesBtn.addEventListener('click', openMatchDialog);
|
||||||
if (els.clearListBtn) els.clearListBtn.addEventListener('click', function () {
|
if (els.clearListBtn) els.clearListBtn.addEventListener('click', function () {
|
||||||
var list = C().getMdlList();
|
var list = C().getWorklist();
|
||||||
if (!list.length) return;
|
if (!list.length) return;
|
||||||
// Warn before stranding files that still need a revision: they stay
|
// Warn before stranding files that still need a revision: they stay
|
||||||
// assigned (on a "pending" leaf under By tracking number), but the
|
// assigned (on a "pending" leaf under By tracking number), but the
|
||||||
|
|
@ -63,16 +63,16 @@
|
||||||
var pending = 0;
|
var pending = 0;
|
||||||
list.forEach(function (r) { if (!(r.revisionCell || '').trim()) pending += Object.keys(r.placed || {}).length; });
|
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;
|
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');
|
window.zddc.toast('List cleared — every assignment is kept (see By tracking number).', 'info');
|
||||||
});
|
});
|
||||||
if (els.hideAssignedToggle) els.hideAssignedToggle.addEventListener('change', function () {
|
if (els.hideAssignedToggle) els.hideAssignedToggle.addEventListener('change', function () {
|
||||||
hideAssigned = !!els.hideAssignedToggle.checked;
|
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.
|
// Ctrl-V anywhere on the From-a-list panel opens the paste dialog prefilled.
|
||||||
if (els.mdlPanel) els.mdlPanel.addEventListener('paste', function (e) {
|
if (els.worklistPanel) els.worklistPanel.addEventListener('paste', function (e) {
|
||||||
if (currentTab !== 'existing') return;
|
if (currentTab !== 'worklist') return;
|
||||||
if (e.target && e.target.closest('input, textarea')) return; // let real inputs paste
|
if (e.target && e.target.closest('input, textarea')) return; // let real inputs paste
|
||||||
var t = (e.clipboardData || window.clipboardData);
|
var t = (e.clipboardData || window.clipboardData);
|
||||||
var text = t ? t.getData('text') : '';
|
var text = t ? t.getData('text') : '';
|
||||||
|
|
@ -135,12 +135,12 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
function showTab(which) {
|
function showTab(which) {
|
||||||
currentTab = (which === 'transmittal' || which === 'existing') ? which : 'tracking';
|
currentTab = (which === 'transmittal' || which === 'worklist') ? which : 'tracking';
|
||||||
els.trackingTab.classList.toggle('active', currentTab === '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.transmittalTab.classList.toggle('active', currentTab === 'transmittal');
|
||||||
els.trackingPanel.hidden = currentTab !== 'tracking';
|
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';
|
els.transmittalPanel.hidden = currentTab !== 'transmittal';
|
||||||
render();
|
render();
|
||||||
// The source-tree Show filters are per-axis, so the visible set changes
|
// The source-tree Show filters are per-axis, so the visible set changes
|
||||||
|
|
@ -174,7 +174,7 @@
|
||||||
var placed = buildPlaced(files);
|
var placed = buildPlaced(files);
|
||||||
renderTrackingInto(els.trackingTree, C().getTrackingTree(), placed.tracking);
|
renderTrackingInto(els.trackingTree, C().getTrackingTree(), placed.tracking);
|
||||||
renderTransmittalInto(els.transmittalTree, C().getTransmittalTree(), placed.transmittal);
|
renderTransmittalInto(els.transmittalTree, C().getTransmittalTree(), placed.transmittal);
|
||||||
renderMdlInto(placed.byTracking);
|
renderWorklist(placed.byTracking);
|
||||||
renderStats(files);
|
renderStats(files);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -509,51 +509,51 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── "From a list" (scratch worklist via the shared seltable) ────────────
|
// ── "From a list" (scratch worklist via the shared seltable) ────────────
|
||||||
function renderMdlInto(placedByTracking) {
|
function renderWorklist(placedByTracking) {
|
||||||
mdlPlaced = placedByTracking || {};
|
worklistPlaced = placedByTracking || {};
|
||||||
if (!C().getMdlList().length) {
|
if (!C().getWorklist().length) {
|
||||||
mdlTable = null;
|
worklistGrid = null;
|
||||||
els.mdlTree.textContent = '';
|
els.worklistTable.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).'));
|
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;
|
return;
|
||||||
}
|
}
|
||||||
ensureMdlTable();
|
ensureWorklistGrid();
|
||||||
mdlTable.renderBody();
|
worklistGrid.renderBody();
|
||||||
}
|
}
|
||||||
function rowPlaced(r) { var f = mdlPlaced[r.trackingNumber]; return f && f.length ? f : null; }
|
function rowPlaced(r) { var f = worklistPlaced[r.trackingNumber]; return f && f.length ? f : null; }
|
||||||
function ensureMdlTable() {
|
function ensureWorklistGrid() {
|
||||||
if (mdlTable) return mdlTable;
|
if (worklistGrid) return worklistGrid;
|
||||||
var c = C();
|
var c = C();
|
||||||
var cols = [
|
var cols = [
|
||||||
{ key: 'tn', title: 'Tracking number', cls: 'fromlist-tn', get: function (r) { return r.trackingNumber || ''; },
|
{ key: 'tn', title: 'Tracking number', cls: 'worklist-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)); } },
|
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: 'fromlist-title', get: function (r) { return r.title || ''; },
|
{ key: 'title', title: 'Title', cls: 'worklist-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); }); } },
|
render: function (r, td) { editCell(td, 'worklist-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: '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); } },
|
render: function (r, td) { renderSource(r, td); } },
|
||||||
{ key: 'latest', title: 'Latest rev', get: function (r) { return latestRevOf(r.archiveRevisions); } },
|
{ 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; },
|
{ 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({
|
worklistGrid = window.app.modules.seltable.create({
|
||||||
container: els.mdlTree,
|
container: els.worklistTable,
|
||||||
extraTitle: 'Files',
|
extraTitle: 'Files',
|
||||||
rows: function () {
|
rows: function () {
|
||||||
var list = c.getMdlList();
|
var list = c.getWorklist();
|
||||||
return hideAssigned ? list.filter(function (r) { return !rowPlaced(r); }) : list;
|
return hideAssigned ? list.filter(function (r) { return !rowPlaced(r); }) : list;
|
||||||
},
|
},
|
||||||
rowId: function (r) { return r.id; },
|
rowId: function (r) { return r.id; },
|
||||||
columns: cols,
|
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) {
|
onActivate: function (ids) {
|
||||||
if (!ids.length) return;
|
if (!ids.length) return;
|
||||||
var v = prompt('Set the revision on ' + ids.length + ' selected row(s) (e.g. "A (IFR)"):', '');
|
var v = prompt('Set the revision on ' + ids.length + ' selected row(s) (e.g. "A (IFR)"):', '');
|
||||||
if (v != null) c.setRevisionCells(ids, v.trim());
|
if (v != null) c.setRevisionCells(ids, v.trim());
|
||||||
},
|
},
|
||||||
rowExtra: function (r, td) { renderMdlPlaced(r, td); },
|
rowExtra: function (r, td) { renderWorklistFiles(r, td); },
|
||||||
});
|
});
|
||||||
mdlTable.render();
|
worklistGrid.render();
|
||||||
return mdlTable;
|
return worklistGrid;
|
||||||
}
|
}
|
||||||
// An editable seltable cell: an <input> that commits on change. `warn` is an
|
// An editable seltable cell: an <input> that commits on change. `warn` is an
|
||||||
// optional tooltip that flags (without blocking) a questionable value.
|
// optional tooltip that flags (without blocking) a questionable value.
|
||||||
|
|
@ -584,7 +584,7 @@
|
||||||
td.appendChild(el('span', 'src-badge src-badge--pasted', 'pasted'));
|
td.appendChild(el('span', 'src-badge src-badge--pasted', 'pasted'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function renderMdlPlaced(row, td) {
|
function renderWorklistFiles(row, td) {
|
||||||
var c = C(), files = rowPlaced(row) || [];
|
var c = C(), files = rowPlaced(row) || [];
|
||||||
files.forEach(function (f) {
|
files.forEach(function (f) {
|
||||||
var d = c.deriveTarget(f);
|
var d = c.deriveTarget(f);
|
||||||
|
|
@ -655,7 +655,7 @@
|
||||||
}
|
}
|
||||||
return [{ label: scope.one, handle: archiveOf('/' + scope.one + '/') }];
|
return [{ label: scope.one, handle: archiveOf('/' + scope.one + '/') }];
|
||||||
}
|
}
|
||||||
async function loadMdl() {
|
async function loadWorklist() {
|
||||||
var roots = await buildRoots();
|
var roots = await buildRoots();
|
||||||
if (!roots) return;
|
if (!roots) return;
|
||||||
var picked = await window.app.modules.dirPicker.pick(roots);
|
var picked = await window.app.modules.dirPicker.pick(roots);
|
||||||
|
|
@ -706,8 +706,8 @@
|
||||||
}
|
}
|
||||||
function finishLoad(rows) {
|
function finishLoad(rows) {
|
||||||
listScanned = true;
|
listScanned = true;
|
||||||
C().appendMdlRows(rows); // APPEND — the list accumulates across batches
|
C().appendWorklist(rows); // APPEND — the list accumulates across batches
|
||||||
showTab('existing');
|
showTab('worklist');
|
||||||
window.zddc.toast(rows.length
|
window.zddc.toast(rows.length
|
||||||
? ('Added ' + rows.length + ' tracking number' + (rows.length === 1 ? '' : 's') + ' from the selected directories. Drag files on, set revisions.')
|
? ('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');
|
: 'No files or deliverables in the selected directories.', rows.length ? 'success' : 'warning');
|
||||||
|
|
@ -765,8 +765,8 @@
|
||||||
}
|
}
|
||||||
add.addEventListener('click', function () {
|
add.addEventListener('click', function () {
|
||||||
var n = parsed.rows.length;
|
var n = parsed.rows.length;
|
||||||
c.appendMdlRows(parsed.rows);
|
c.appendWorklist(parsed.rows);
|
||||||
m.close(); showTab('existing');
|
m.close(); showTab('worklist');
|
||||||
window.zddc.toast('Added ' + n + ' pasted row' + (n === 1 ? '' : 's') + '.', 'success');
|
window.zddc.toast('Added ' + n + ' pasted row' + (n === 1 ? '' : 's') + '.', 'success');
|
||||||
});
|
});
|
||||||
ta.addEventListener('input', refresh);
|
ta.addEventListener('input', refresh);
|
||||||
|
|
@ -774,7 +774,7 @@
|
||||||
}
|
}
|
||||||
function openMatchDialog() {
|
function openMatchDialog() {
|
||||||
var c = C();
|
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; }
|
if (!rows.length) { window.zddc.toast('Load or paste some tracking numbers first.', 'warning'); return; }
|
||||||
var files = allFiles().filter(function (f) {
|
var files = allFiles().filter(function (f) {
|
||||||
var a = c.getAssignment(c.srcKeyForFile(f));
|
var a = c.getAssignment(c.srcKeyForFile(f));
|
||||||
|
|
@ -815,7 +815,7 @@
|
||||||
var p = proposals[Number(cb.dataset.i)];
|
var p = proposals[Number(cb.dataset.i)];
|
||||||
if (p) { c.assignFromRow([c.srcKeyForFile(p.file)], p.row); n++; }
|
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');
|
window.zddc.toast('Assigned ' + n + ' file' + (n === 1 ? '' : 's') + ' by name match.', n ? 'success' : 'info');
|
||||||
});
|
});
|
||||||
fuzzy.addEventListener('change', function () { opts.fuzzy = fuzzy.checked; refresh(); });
|
fuzzy.addEventListener('change', function () { opts.fuzzy = fuzzy.checked; refresh(); });
|
||||||
|
|
|
||||||
|
|
@ -163,7 +163,7 @@
|
||||||
<div class="target-tabs" role="tablist">
|
<div class="target-tabs" role="tablist">
|
||||||
<div class="target-tabs__group">
|
<div class="target-tabs__group">
|
||||||
<button class="target-tab active" id="trackingTab" role="tab">By tracking number</button>
|
<button class="target-tab active" id="trackingTab" role="tab">By tracking number</button>
|
||||||
<button class="target-tab" id="existingTab" role="tab" title="Drag files onto a list of tracking numbers — loaded from the archive/MDL, pasted from Excel, or auto-matched by name.">From a list</button>
|
<button class="target-tab" id="worklistTab" role="tab" title="Drag files onto a list of tracking numbers — loaded from the archive/MDL, pasted from Excel, or auto-matched by name.">From a list</button>
|
||||||
</div>
|
</div>
|
||||||
<span class="target-tabs__divider" aria-hidden="true"></span>
|
<span class="target-tabs__divider" aria-hidden="true"></span>
|
||||||
<div class="target-tabs__group">
|
<div class="target-tabs__group">
|
||||||
|
|
@ -205,16 +205,16 @@
|
||||||
Dragging a file onto a row MATERIALIZES a real "By tracking number"
|
Dragging a file onto a row MATERIALIZES a real "By tracking number"
|
||||||
placement, so Clear keeps every assignment. The left filetree is
|
placement, so Clear keeps every assignment. The left filetree is
|
||||||
the drag source. -->
|
the drag source. -->
|
||||||
<section id="mdlPanel" class="target-panel" hidden>
|
<section id="worklistPanel" class="target-panel" hidden>
|
||||||
<div class="target-panel__toolbar">
|
<div class="target-panel__toolbar">
|
||||||
<button id="loadMdlBtn" class="btn btn-sm btn-secondary" title="Add tracking numbers from the project archive/MDL (pick directories to scan).">⊞ Load…</button>
|
<button id="loadWorklistBtn" class="btn btn-sm btn-secondary" title="Add tracking numbers from the project archive/MDL (pick directories to scan).">⊞ Load…</button>
|
||||||
<button id="pasteRowsBtn" class="btn btn-sm btn-secondary" title="Paste rows from Excel: Tracking · Rev (Status) · Title.">⎘ Paste rows…</button>
|
<button id="pasteRowsBtn" class="btn btn-sm btn-secondary" title="Paste rows from Excel: Tracking · Rev (Status) · Title.">⎘ Paste rows…</button>
|
||||||
<button id="matchNamesBtn" class="btn btn-sm btn-secondary" title="Auto-suggest assignments by matching unassigned filenames against the list.">⚡ Match names</button>
|
<button id="matchNamesBtn" class="btn btn-sm btn-secondary" title="Auto-suggest assignments by matching unassigned filenames against the list.">⚡ Match names</button>
|
||||||
<button id="clearListBtn" class="btn btn-sm btn-secondary" title="Empty the list. Every assignment is kept — see By tracking number.">Clear list</button>
|
<button id="clearListBtn" class="btn btn-sm btn-secondary" title="Empty the list. Every assignment is kept — see By tracking number.">Clear list</button>
|
||||||
<label class="target-toggle" title="Hide rows that already have files assigned."><input type="checkbox" id="hideAssignedToggle"> Hide assigned</label>
|
<label class="target-toggle" title="Hide rows that already have files assigned."><input type="checkbox" id="hideAssignedToggle"> Hide assigned</label>
|
||||||
<span class="target-hint">Drag files onto a row to name them; edit the Tracking number / Revision inline (ctrl-shift + ctrl-Enter sets many). Clearing the list keeps every assignment.</span>
|
<span class="target-hint">Drag files onto a row to name them; edit the Tracking number / Revision inline (ctrl-shift + ctrl-Enter sets many). Clearing the list keeps every assignment.</span>
|
||||||
</div>
|
</div>
|
||||||
<div id="mdlTree" class="target-tree"></div>
|
<div id="worklistTable" class="target-tree"></div>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
|
|
|
||||||
|
|
@ -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' };
|
const f = { originalFilename: 'messy scan 47', extension: 'pdf', folderPath: 'R' };
|
||||||
window.app.folderTree = [{ name: 'R', path: 'R', files: [f], children: [] }];
|
window.app.folderTree = [{ name: 'R', path: 'R', files: [f], children: [] }];
|
||||||
const key = c.srcKeyForFile(f);
|
const key = c.srcKeyForFile(f);
|
||||||
c.setMdlList([{ id: 'm1', trackingNumber: 'ACM-PRJ-EL-SPC-0001', title: 'Switchgear Spec' }]);
|
c.setWorklist([{ id: 'm1', trackingNumber: 'ACM-PRJ-EL-SPC-0001', title: 'Switchgear Spec' }]);
|
||||||
c.assignFromRow([key], c.getMdlRow('m1')); // blank revision → partial
|
c.assignFromRow([key], c.getWorklistRow('m1')); // blank revision → partial
|
||||||
const placedTracking = !!(c.getAssignment(key) || {}).trackingNodeId; // a REAL tracking placement
|
const placedTracking = !!(c.getAssignment(key) || {}).trackingNodeId; // a REAL tracking placement
|
||||||
const beforeRev = c.deriveTarget(f);
|
const beforeRev = c.deriveTarget(f);
|
||||||
c.setRevisionCell('m1', 'A (IFR)'); // re-stamps onto the leaf
|
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' };
|
const f = { originalFilename: 'scan', extension: 'pdf', folderPath: 'R' };
|
||||||
window.app.folderTree = [{ name: 'R', path: 'R', files: [f], children: [] }];
|
window.app.folderTree = [{ name: 'R', path: 'R', files: [f], children: [] }];
|
||||||
const key = c.srcKeyForFile(f);
|
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: '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)'] },
|
{ id: 'm2', trackingNumber: 'ACM-PRJ-EL-SPC-0002', title: 'Spec 2', archiveRevisions: ['0 (IFC)'] },
|
||||||
]);
|
]);
|
||||||
tt.showTab('existing');
|
tt.showTab('worklist');
|
||||||
const row = document.querySelector('#mdlTree .seltable__row[data-id="m1"]');
|
const row = document.querySelector('#worklistTable .seltable__row[data-id="m1"]');
|
||||||
const latestShown = !!row && row.textContent.includes('B (IFC)'); // latest archive rev shown
|
const latestShown = !!row && row.textContent.includes('B (IFC)'); // latest archive rev shown
|
||||||
window.app.modules.dnd.setDrag([key]);
|
window.app.modules.dnd.setDrag([key]);
|
||||||
row.dispatchEvent(new Event('drop', { bubbles: true, cancelable: true })); // drop on m1 (rev C set)
|
row.dispatchEvent(new Event('drop', { bubbles: true, cancelable: true })); // drop on m1 (rev C set)
|
||||||
const named = c.deriveTarget(f).filename;
|
const named = c.deriveTarget(f).filename;
|
||||||
c.clearMdlList(); // list emptied — assignment must survive
|
c.clearWorklist(); // list emptied — assignment must survive
|
||||||
return {
|
return {
|
||||||
hasRow: !!row, latestShown,
|
hasRow: !!row, latestShown,
|
||||||
placedAfterDrop: !!(c.getAssignment(key) || {}).trackingNodeId,
|
placedAfterDrop: !!(c.getAssignment(key) || {}).trackingNodeId,
|
||||||
named,
|
named,
|
||||||
listLen: c.getMdlList().length,
|
listLen: c.getWorklist().length,
|
||||||
stillPlaced: !!(c.getAssignment(key) || {}).trackingNodeId,
|
stillPlaced: !!(c.getAssignment(key) || {}).trackingNodeId,
|
||||||
stillNamed: c.deriveTarget(f).filename,
|
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' };
|
const f = { originalFilename: 'plan', extension: 'pdf', folderPath: 'R' };
|
||||||
window.app.folderTree = [{ name: 'R', path: 'R', files: [f], children: [] }];
|
window.app.folderTree = [{ name: 'R', path: 'R', files: [f], children: [] }];
|
||||||
const key = c.srcKeyForFile(f);
|
const key = c.srcKeyForFile(f);
|
||||||
c.setMdlList([{ id: 'm1', trackingNumber: 'ACM-PRJ-EL-DWG-0007', title: 'Plan', revisionCell: 'A (IFR)' }]);
|
c.setWorklist([{ id: 'm1', trackingNumber: 'ACM-PRJ-EL-DWG-0007', title: 'Plan', revisionCell: 'A (IFR)' }]);
|
||||||
c.assignFromRow([key], c.getMdlRow('m1'));
|
c.assignFromRow([key], c.getWorklistRow('m1'));
|
||||||
const before = c.deriveTarget(f).filename;
|
const before = c.deriveTarget(f).filename;
|
||||||
c.setRowTracking('m1', 'ACM-PRJ-EL-DWG-0008'); // it's the next drawing
|
c.setRowTracking('m1', 'ACM-PRJ-EL-DWG-0008'); // it's the next drawing
|
||||||
const after = c.deriveTarget(f).filename;
|
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.
|
// A pre-"From a list" serialized workspace: the file points at an mdl row.
|
||||||
c.load({
|
c.load({
|
||||||
assignments: { [key]: { mdlNodeId: 'old1', titleFromDeliverable: true, transmittalNodeId: null, excluded: false, titleOverride: null } },
|
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) || {};
|
const a = c.getAssignment(key) || {};
|
||||||
return {
|
return {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue