Skip to content

feat(app): bulk actions on a selection skip and tell - #171

Merged
aicayzer merged 9 commits into
mainfrom
feat/bulk-actions
Oct 26, 2026
Merged

aicayzer merged 9 commits into
mainfrom
feat/bulk-actions

Conversation

@aicayzer

Copy link
Copy Markdown
Contributor

What changes for a person

Commands on a selection now do what they can and say what they could not, instead of refusing the whole selection or dropping items without a word.

  • An item a command cannot change (in Recently Deleted, archived or with a problem, a file for Change Type, a collection for Add to Collection, an item that already has the most tags) is skipped. The person gets one notice with how many and why. If nothing could change, the notice carries the command's own title; otherwise it reads "Some Items Were Skipped".
  • Moving more than one item to Recently Deleted asks first: "Move 12 items to Recently Deleted?". One item does not ask, since Undo puts it back. This covers the Delete key, the menus, the context menu, the More menu and the palette.
  • Change Type offers every type at least one selected item can become, and its sheet names the items it will leave alone.
  • Favorite, Add Tag, Delete, Change Type and the collection commands now treat files like any other item in the menus, the More menu and the palette. Before, files were filtered out of some and not others.
  • On the board, Move To in a card's context menu moves the whole selection when the card is selected, and skips what the lane does not suit instead of refusing all of it.
  • Every batch is one undo step, and each item goes through the same queued, offline-safe write it uses alone.

Audit

Checked in the code, for the list, table, gallery and board, through the menu bar, context menus, More menu and palette. Every command already took a set of items; the gaps were all-or-nothing refusals, silent drops and files treated differently from notes.

Command Multi-select before What changed
Add Tag Yes, but one full item refused the whole set Skips full or unchangeable items, tags the rest, tells the count
Change Type Yes, but only types every item could become, and any failing item blocked the sheet Offers types any item can become, changes those that can, names the rest; one undo step
Add to Collection Yes, but silently dropped files in some menus, and one collection in the set refused all Whole selection goes in; skips and tells; one undo step
Remove from Collection Yes, same drops Whole selection; skips items in the bin and tells
Favorite / Unfavorite Yes, notes only in menus; items in the bin were silently sent a write Active items only decide the toggle and get the write; bin items are counted and told
Move to Bin Yes, no confirmation Asks with the count for more than one item
Delete Immediately Yes, already confirms with the count Unchanged
Recover Yes Unchanged
Board Move To Single card only Moves the selection when the card is selected; skips and tells
Change parent Single item only (it is a relationship edit on one item's page) Not extended: no sensible single parent for a mixed selection, and a wrong one is hard to spot
Duplicate Does not exist Nothing to do
Open in New Window Yes Unchanged; a selection of hundreds opens hundreds of windows (see below)
Version History Single item only Unchanged, by design

What I chose

  • An item already as the command would leave it is a no-op, not a skip (already favorite, already in the collection, already in the bin).
  • The Delete confirmation is a plain confirmationDialog in the window, like the existing Delete Immediately one.
  • All four Delete routes now go through deleteAfterSaving, so a mixed selection that includes items already in the bin offers to erase those for good in every route, as the list's Delete key already did.
  • No SDK workaround: a batch is one queued write per item. submit only queues, so the main thread is not held; the engine still rereads and drains once per write.
  • I removed two board strings the new behaviour made dead and appended the new keys by hand to the String Catalog.

Tested

Unit plan passes (MarfaBulkActionsTests is new): partial success with a told skip, nothing changeable, empty selection, one undo step, items in the bin, a 500-item selection under one undo step, and the confirmation path for Move to Bin. Three older tests that pinned the whole-set refusals were updated.

Not tested

Nothing was run on screen, by agreement: the confirmation dialog, the menus, the palette, the sheets' new caption lines and the board's context menu were not seen. The UI and Live plans were not run.

For the SDK and Marfa

The Swift SDK offers no bulk write, and Marfa's server-side bulk-action job is unused. A selection of hundreds queues hundreds of single writes, each with its own reread and drain. A bulk call would give one queue entry and one atomic outcome per batch.

@aicayzer
aicayzer merged commit a8bf456 into main Oct 26, 2026
4 checks passed
@aicayzer
aicayzer deleted the feat/bulk-actions branch October 26, 2026 16:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant