- #7 seltable CSS: the classifier carried its own copy of the base seltable
rules (diverged from shared/seltable.css — a stale sticky offset + a dead
.seltable__filter). Bundle shared/seltable.css and keep only the
classifier-specific catalog bits (.seltable__extra, .mdl-rev__input,
.fromlist-*, .src-badge, #mdlTree). One source of truth, shared with tables.
- #9 Clear list now confirms when it would strand files that still need a
revision (on a "pending" leaf) — they stay assigned under By tracking number,
but the row to finish them here is going away, so warn first.
- #10 serialize() strips the transient row→keys hint (`placed`) — it's rebuilt
as drops happen and was needlessly bloating every workspace autosave.
(#8, renaming the internal mdl* identifiers to match "From a list", is left as
deliberate churn-avoidance — purely cosmetic, spans template/css/js/tests/DOM
ids, and the user-facing strings already read "From a list".)
Full suite 340 passed / 0 failed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Reshape the catalog from a button+overlay into a proper tab and let the user
choose which directories feed it.
- Tabs: the Catalog button becomes a third tab "By existing", grouped with "By
tracking number" (both assign a tracking number) and visually separated from
"By transmittal" (which assigns the path). A brief goal line above the tabs
states the workflow. The overlay #mdlPanel becomes a normal in-flow tab panel.
- Load: instead of auto-scanning a whole project, "Load…" opens a lazy,
multi-select (checkbox) directory tree (new classifier/js/dir-picker.js).
Ticking a directory includes its whole subtree; confirm resolves the topmost
ticked handles. Scope follows where the classifier is served: /_apps/… → all
accessible projects, under <project>/… → that one project, file:// → a picked
folder. The picker is handle-agnostic (HttpDirectoryHandle or native FS).
- Rows: every ticked directory is walked recursively into the union of existing
files (zddc.parseFilename) and MDL deliverables (mdl/*.yaml → inMdl + title),
deduped to one row per tracking number. The "Archive revs" (all) column
becomes a single informational "Latest rev" computed via zddc.compareRevisions.
Drop still assigns the tracking number only; the Revision cell stays blank.
- classify.js is unchanged — the mdl axis model and row shape are reused as-is
(Latest rev derives from the preserved archiveRevisions).
- Tests: the catalog test now asserts latest-rev; new unit tests cover
walkDirInto union/dedupe-to-latest, _latestRevOf draft/modifier ordering,
_detectScope routing, and the dir-picker topmost-ticked resolution. 61 green.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Instantiating deliverable yamls from existing archive files is an MDL-side
workflow (assigning files to deliverables stays here; registering tracking
numbers belongs with the MDL). It moved to the tables tool's project MDL
rollup in the prior commit, so remove the classifier copy:
- delete classifier/js/mdl-instantiate.js + its build entry
- remove the ⊞ MDL from archive header button + its app.js wiring
- drop the two mdl-instantiate unit tests (the equivalents now live in
tests/tables-mdl.spec.js)
The read-only Catalog button (MDL ∪ archive, drop-to-assign) is unaffected.
Classifier + classify suites: 58 green.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Move classifier/js/seltable.js → shared/seltable.js so both the classifier and
the tables tool can use it (the MDL realignment splits work across both). Adds
per-column autofilter inputs (one per column, AND-combined) on top of the
programmatic global filter; selection + select-filtered + ctrl-Enter unchanged.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>