Skip to content

feat(ui): folder picker sort/filter/create/rename and exclusions size rollups - #315

Merged
pmaxhogan merged 1 commit into
mainfrom
wave-1-picker-exclusions
Aug 17, 2026
Merged

feat(ui): folder picker sort/filter/create/rename and exclusions size rollups#315
pmaxhogan merged 1 commit into
mainfrom
wave-1-picker-exclusions

Conversation

@pmaxhogan

Copy link
Copy Markdown
Owner

Summary

Closes #305, #306, #307 (v2.12.0 wave, PR3).

  • feat(ui): remote folder picker - sort, type-to-filter, full pagination, folders-only, near-fullscreen #306 destination folder picker: client-side sort (Name asc/desc,
    Modified asc/desc, default Name asc), type-to-filter (substring, current
    folder only, auto-focus on open, resets on navigation), backend pagination
    verified complete on all three backends, near-fullscreen sizing (92vw x
    85vh capped 1400px) in the add-source wizard modal specifically on the
    destination-folder and exclusions steps.
  • feat: create folders (all backends) and rename folders (Drive+SFTP) in the remote picker #307 create/rename: "New folder" button on every browsable backend
    (Drive, S3, SFTP - reuses ensure_folder's idempotent search-then-create),
    inline hover rename on Drive + SFTP (RemoteStore::rename_folder: Drive is
    a files.update name-only PATCH; SFTP does a real RENAME + moves the
    sidecar, and can mint a new id since SFTP ids are path-derived - the UI
    replaces the row by its old id with the backend's returned entry). S3 stays
    on the trait's unsupported default (BackendKind::supports_rename = false)
    and shows a disabled control with an explanatory tooltip instead of hiding
    the affordance outright. All actions surface errors inline, next to the
    control that failed - never an alert dialog.
  • feat(ui): exclusions browser - per-folder file count + size rollups, near-fullscreen #305 exclusions rollups: the backend preview walker now streams a
    per-directory file-count + byte-size rollup with each batch - a descended
    directory's rollup starts at 0 and settles upward as its subtree streams in
    (re-emitting the same row without duplicating it), a pruned excluded
    directory gets its final answer immediately via one lightweight recursive
    disk count (no classification). The summary line gained an excluded-bytes
    "would be freed" stat to match the existing included-bytes one.

Visual baselines

Not touched in this PR. Per the wave lead's sequencing note: #311
(bottleneck tile) and #313 (queue nav button, which changes all 104
full-page screenshots) land first; I'll rebase and run just visual-update
in a follow-up commit on this branch afterward. The one baseline my changes
affect is setup-wizard.spec.ts's step3-source.png (light + dark) - the
SetupWizard step 3 embeds the picker's new toolbar (sort/filter/new-folder
button).

Test plan

  • cargo test across touched crates (driven-remote, driven-drive,
    driven-sftp, driven-backend, driven-core) and src-tauri - 447
    src-tauri tests + all crate tests green, including new coverage for
    rollup settling/pruning, SFTP rename (real move + sidecar + id change +
    clobber refusal + same-name no-op), and the fake Drive store's rename.
  • cargo clippy --all-targets clean (driven-remote/-drive/-sftp/
    -backend/-core and src-tauri).
  • cargo fmt --check clean.
  • pnpm run test:unit - 806 vitest tests green (added ~30: picker
    sort/filter/create/rename, tree rollup rendering + fill sizing, store
    rollup settling).
  • vue-tsc --noEmit, eslint ., prettier --check all clean.
  • just e2e-run wizard-first-run local-folder-round-trip - both PASS
    against the real containerized app (boots into the setup wizard,
    renders the picker, completes a real backup/restore round trip). Did
    not run the full just e2e suite (expensive); these two scenarios are
    the ones that exercise the wizard/picker paths this PR touches.
  • Visual regression (just visual-update) - deferred per the baseline
    sequencing above.

README

Updated: the live-exclusion-preview bullet now mentions the per-folder size
rollup, and a new bullet describes the picker's sort/filter/new-folder/rename
behavior including the S3 rename caveat.

🤖 Generated with Claude Code

https://claude.ai/code/session_019xKUm9vH4ifb5LHR5szy1v

@github-actions

github-actions Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Coverage

Area main this PR delta
Rust (lib crates) 84.64% 84.58% -0.05 (OK)
UI (vue/ts) 93.14% 93.36% +0.22 (OK)

Gate: passed - no coverage regression (epsilon 0.1 pp).

… rollups

Closes #305, #306, #307.

- Destination folder picker: client-side sort (name/modified, Shared Drive
  roots pinned first), type-to-filter (auto-focus, resets on navigation),
  inline "New folder" on every browsable backend, inline hover-rename on
  Drive + SFTP (disabled with an explanatory tooltip on S3), row-level
  inline errors, near-fullscreen sizing in the add-source wizard modal.
- Exclusions preview tree: per-folder file-count + byte-size rollups
  streamed from the backend walker (settle progressively for a descended
  folder, final immediately for a pruned excluded folder via a lightweight
  recursive disk count), an excluded-bytes "would be freed" summary stat,
  and the same near-fullscreen sizing.
- New RemoteStore::rename_folder (Drive PATCH, SFTP real rename + sidecar
  move, S3 stays unsupported by design) and create_remote_folder/
  rename_remote_folder IPC commands; BackendDto.supportsRename and
  DriveFolderEntry.modifiedTime added to the wire contract.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019xKUm9vH4ifb5LHR5szy1v
@pmaxhogan
pmaxhogan force-pushed the wave-1-picker-exclusions branch from e047997 to b68624f Compare August 17, 2026 19:46
@pmaxhogan
pmaxhogan merged commit 7e87341 into main Aug 17, 2026
18 checks passed
@pmaxhogan
pmaxhogan deleted the wave-1-picker-exclusions branch August 17, 2026 20:20
@github-project-automation github-project-automation Bot moved this from Todo to Done in Driven Aug 17, 2026
pmaxhogan added a commit that referenced this pull request Aug 18, 2026
🤖 I have created a release *beep* *boop*
---


##
[2.12.0](v2.11.1...v2.12.0)
(2026-08-18)


### Features

* **app:** opt-in debug logging mode and safer, richer diagnostic
bundles ([#314](#314))
([33c281c](33c281c))
* **core:** allow nested backup sources when the parent excludes the
child ([#294](#294))
([0b62df9](0b62df9))
* **core:** live exclusion pickup and a visible pending-work queue
([#313](#313))
([e6427c7](e6427c7))
* live bottleneck indicator on the Activity dashboard
([#311](#311))
([2d9d763](2d9d763))
* **ui:** folder picker sort/filter/create/rename and exclusions size
rollups ([#315](#315))
([7e87341](7e87341))


### Bug Fixes

* **app:** never freeze on tray quit during a backup; quitting tray
state; honest recovery status
([#312](#312))
([f951cde](f951cde))
* clear the attention banner after a passing run and make source removal
backend-aware ([#310](#310))
([6d8e1ab](6d8e1ab))
* **s3:** honest per-source versioning across backends and
multipart-upload leak sweep
([#316](#316))
([d462592](d462592))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

feat(ui): exclusions browser - per-folder file count + size rollups, near-fullscreen

1 participant