Repository navigation
feat(files): begin Filesystem Collections ingestion - #134
Merged
Merged
Conversation
devnull03
force-pushed
the
feat/filesystem-collections-plan
branch
from
September 14, 2026 21:19
c2b140a to
0591ff2
Compare
The hierarchy was written ahead of the dataset save, so structure naming an unsaved row failed its foreign key and the next save restored the stale copy. save_dataset now writes the live structure in the same transaction. Also keeps inserted and duplicated rows beside their neighbour, queues dropped roots after existing siblings, promotes children into a deleted parent's place, stores dropped source paths relative to the files root, and indexes hierarchy traversal instead of rescanning every row.
Structure projection only fills blank cells, and the flat JSON-LD writer that the hierarchy-aware one replaced is removed.
Opening, creating, and dropping into a project now record their row and component counts and the active description profile, and the paths that get skipped are named rather than only counted. A failed folder scan, a row that cannot be placed beside its neighbour, and a deleted row missing its structure each say so instead of passing silently. Drops the unused subtree delete mode the row-deletion path replaced.
A pure matcher for ASNT-77: the same stored source path, then exactly one filename-key match, and anything matching several rows stays ambiguous rather than merging. Skip, update, or add-as-new decide only the matches. A path reached twice in one import collapses on its own, and a skipped folder still adopts the files below it that are new, so a second batch lands inside the series the first batch made.
Project creation resolves its folder against the spreadsheet rows instead of claiming each file for the last row that named it, and the Files step offers the choice only when the folder actually holds such a file. Files are matched with the same key rule the Files step counts with, so a multi-part item counted as matched is also linked at creation. The answer is saved per project for the next import.
A drop resolves against the open project first. The prompt says how much of it is already catalogued and offers skip, update, or add as new; a drop with nothing in common still asks only whether to import. Update re-links the row and leaves its metadata and its place in the arrangement alone, and the whole import stays one undo step.
Hand GIFs to gpui at every size. The thumbnail ladder decoded frame 0 only, so a GIF only moved in the fullscreen viewer.
Extract the wizard's config dialog into ColumnConfigLoader, a self-rendering view with the file and Sheet tabs and the column mapping. The wizard dialog holds it as a child, which removes the close-and-reopen refresh. Data > Load Column Config... applies it to the open project, writing only what the config states.
- Group selected rows under a new parent, undone as one step. - Draw nesting in the row gutter the way the Problems panel does: tint, guide lines, and a chevron with a child count. - Offer the child-aware delete commands only on rows with children. - Double-click a column header to rename it. - Push added, removed, and renamed columns into the open project so Settings sees them. - Write a path the preview can resolve when a file is picked from outside the files folder.
devnull03
force-pushed
the
feat/filesystem-collections-plan
branch
from
September 21, 2026 07:45
1316c1e to
1b9e61d
Compare
devnull03
marked this pull request as ready for review
September 21, 2026 16:57
The target's position was counted with the moving row still among its siblings, so a row moved below a later sibling landed one slot too far.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Overview
This draft begins the Filesystem Collections release: qrate will build archival components from files and folders, accept dropped material in open projects, and expose nested descriptions as collapsible rows.
The first implementation slice adds a shared filesystem inventory used by project creation and open-project file resolution. Recursive discovery now preserves relative paths, so files such as
photographs/001.jpganddocuments/001.jpgremain distinct instead of collapsing to the same basename. The photo index understands those relative paths while retaining basename matching for existing projects.The design plan in
docs/dev/filesystem-collections-plan.mdcovers the remaining schema v4 migration, standards-aware field roles and labels, import preview, drag-and-drop surfaces, hierarchy editing, interchange, and release sequencing. Parent descriptions are normal archival components and will participate in search, diagnostics, galleries, exports, plugins, and Google Sheets.Implemented in this draft
file-ingestcrate with deterministic recursive discovery.Verification
cargo fmt --all --check— passedcargo test -p file-ingest -p project-wizard -p table --target-dir target/rust-analyzer— passed (101 tests)cargo clippy -p file-ingest -p project-wizard -p table --all-targets --target-dir target/rust-analyzer -- -D warnings -A dead_code— passedgit diff --check— passedThe PR remains a draft while the higher-level schema and UI slices are implemented.
Import duplicates (ASNT-77)
Closes #87 (Notion ID: 3b821d32-b13b-818d-a1b6-c542b16fe2d7)
Re-importing a batch folder no longer copies what the project already holds.
file_ingest::duplicatesmatches an import against existing components by stored source path, then by a single filename-key match; anything several rows could claim stays ambiguous and is never merged automatically.Plan and the two deliberate deviations:
docs/dev/import-duplicates-plan.md.Audit fixes in this branch
Verification (latest)
./scripts/ci.sh— passed (fmt, clippy-D warnings, full workspace tests)