Skip to content

Batch 2026-09-30: account menu, settings dialogs, share select, document images, onboarding recovery, table quick filter, view tabs, and fixes (13 PRs) - #1915

Merged
joepio merged 23 commits into
developfrom
claude/ui-batch-2026-09-29
Sep 30, 2026
Merged

joepio merged 23 commits into
developfrom
claude/ui-batch-2026-09-29

Conversation

@joepio

@joepio joepio commented Sep 29, 2026 •

Copy link
Copy Markdown
Member

Requested by Joep

Before: four finished PRs from the UI fixes thread sat open. Since #1661, pushes to a PR no longer run the full pipeline, so none of them had an e2e verdict.

After: they sit together on one branch off develop (dd6a959), and one Mancave run decides them. Merge this with a merge commit, not squash: then each included PR head is in develop and GitHub marks it as merged.

Included, at these heads:

Decisions made while resolving:

Fixes found by the batch runs:

  • SearchBoxWindow.test.tsx (from Find already-fetched external classes in New Table's class picker #1842, already on develop) failed run 3 with two unhandled ReferenceError: window is not defined. Its stores connected a WebSocket to server.example. The failed socket reported "Server disconnected", and the resulting React state update landed after jsdom was torn down. The test's stores now use connect: false, as bootstrap.test.ts does.
  • Runs 1 and 2 each failed on one different e2e test (ai-chat-discovery "independent signed-in devices…", then canvas-undo "undo works right after a cold reload…"), both on 60 s timeouts while Mancave was running 4 shards at once. On a Mac, against this branch, the first passed 8/8 and the second 24/24 with 6 parallel workers. Develop's own run on Make Try Atomic one calm start, and a demo tour that keeps up with you #1876 failed the same way on ai-mobile.
  • Develop moved on while run 5 was green (c2e2682, Make Try Atomic one calm start, and a demo tour that keeps up with you #1876 follow-up): ShowRoute now skips consuming the drive search param while isDriveSignInError says the subject needs a sign-in, and Fix onboarding recovery, metadata request bursts and local bootstrap #1917 makes the same effect wait for selectReadableDrive. Both are kept: the effect returns early on signInRedirect, otherwise waits for a readable drive, then consumes. Its new open-locked-drive.spec.ts clicked the old sidebar a[href$="/app/agent"], which Replace the sidebar App panel with an account menu #1890 replaces, so it now goes through clickAccountMenuItem(page, 'Profile') like Replace the sidebar App panel with an account menu #1890's other sign-out specs. Locally: route/readableDrive/isDriveSignInError vitest 20/20, and open-locked-drive + signout-signin-data 6/6.
  • Run 6 failed @tomic/lib's upload-roundtrip.integration.test.ts: the blob was not downloadable within the test's 15 s polling window. Locally it arrives in about 1.2 s both with this branch's websockets.ts and develop's, so Fix onboarding recovery, metadata request bursts and local bootstrap #1917's sync gating does not slow it. On Mancave the whole test takes 10–24 s on develop too. The window is now 45 s, inside the test's 60 s budget.
  • Upload traces of failed e2e tests as a CI artifact #1932 was added after run 6 and reverted again. Its Directory.export inside the Dagger module writes into the function's sandbox, not onto the runner, so nothing reached the artifact upload. It gets reworked on its own PR.
  • Run 7 failed ai-chat-discovery "independent signed-in devices…" (as run 1 did). It cold-starts a second browser context, whose local database opened too late on Mancave: "ClientDb is running without its local cache". That context's app did not render within signIn's 20 s, and its chat answer did not arrive within 10 s. The test is now test.slow(), allows that ClientDb warning as an optional diagnostic, and waits up to 30 s for both answers. signIn's cold-boot wait is now 45 s; it only takes longer when boot is slow. Locally against a CI-style production build: 6/6.
  • Develop moved again after run 8 (List a drive once when its address is spelled two ways #1937, and my SearchBoxWindow fix plus the other offline test stores landed there directly). Merged in cleanly.
  • After adding the eight PRs: catalogs settled (2301 entries, de.po keeps its 12 translations), data-browser tsc passes, pnpm run -r lint is clean, and vitest passes 1519 of 1519.

Checked locally on this branch: data-browser tsc --noEmit passes, pnpm --filter @tomic/data-browser lint is clean, and vitest passes (1471 of 1471 after adding #1917, plus @tomic/lib websockets 34 of 34; scripts/integration-mcp.test.mjs is a node:test file vitest can't collect, the same as on develop).

claude and others added 11 commits September 29, 2026 12:22
Editing inside the settings section swapped the list for a long form and
put the Save/Cancel buttons below it, which felt cramped. The lists stay
on the AI settings page; creating or editing an agent, skill or MCP
server now opens a shared ConfigEditorDialog with the form and
Cancel/Save actions. Escape, the close button and an outside click
cancel; Save is disabled until the required fields are filled in.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P648McUYrscNsheXY5Ya81
The App panel at the bottom of the sidebar listed eight entries. It is now
a single row: the current user opens a dropdown with Profile,
Notifications (with the unread count), Integrations, Sync, Feedback,
About and, when available, Install App. Settings sits beside the row as a
gear icon button. Signed out, the row reads "Login / New User" and its
first item leads to the sign-in page.

The row reuses DropdownMenu, so arrow keys, Enter and Escape work and
focus returns to the trigger. An unread-notifications dot shows on the
row while the menu is closed.

To serve both the floating Feedback button and the menu item, the
feedback dialog moved into useFeedbackDialog (FeedbackMenuItem is now
FeedbackButton), and SyncMenuItem became a useSyncStatus hook.

E2E specs that clicked the old panel entries go through the new
openAccountMenu / clickAccountMenuItem helpers, and signIn waits for the
account row instead of a link to /app/agent.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P648McUYrscNsheXY5Ya81
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P648McUYrscNsheXY5Ya81
The email invite field focused its input on every click inside it,
including clicks on the "Can write / Can read" select. Moving focus to
the input blurred the native select right after it opened its option
list, so the list closed again. The field now only focuses the input
when the click lands outside its controls.

The input also asks password managers not to fill it (data-bwignore,
data-1p-ignore, data-lpignore, data-form-type) and uses
autocomplete="off", since it holds other people's addresses rather than
the user's own. It stays type="email".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P648McUYrscNsheXY5Ya81
An image uploaded into a document keeps only its `downloadURL`
(`<server>/download/files/<hash>`) in the node's `src`. In a browser-only
drive (the default for the hosted distribution and for drives created
there), neither the File's commit nor its bytes ever reach a server, so
that URL answers 404 and the editor's node view showed "Failed to load
image". File previews did not have this problem because they resolve
the bytes locally through `useFileObjectUrl`; the editor image never did.

- `@tomic/lib`: `blobSubjectFromDownloadUrl` maps a content-addressed
  download URL back to its `atomic:blob:<hash>`.
- `@tomic/react`: `useBlobObjectUrl`, the blob-reference half of
  `useFileObjectUrl`, for callers without a File resource.
- `ImagePicker`: render the local copy when there is one, fall back to
  the URL otherwise, wait for the lookup instead of racing it, and key
  the error state by src so a new src gets a fresh attempt. The document
  still stores the portable URL.
- Wrap two label texts in spans: the i18n transform turned them into
  keyless arrays, which logged a React key warning whenever the picker
  opened.

Adds `document-image.spec.ts`, which fails with "Failed to load image."
before this change and passes after, including across a reload.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P648McUYrscNsheXY5Ya81
The status icon's SVG title ("Connected", "Offline") became part of the
menu item's accessible name. Hide the icon from assistive tech; the status
is still in the item's tooltip.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P648McUYrscNsheXY5Ya81
# Conflicts:
#	browser/CHANGELOG.md
#	browser/data-browser/src/components/SideBar/FeedbackMenuItem.tsx
#	browser/data-browser/src/locales/de.po
#	browser/data-browser/src/locales/en.po
#	browser/data-browser/src/locales/es.po
#	browser/data-browser/src/locales/fr.po
# Conflicts:
#	browser/CHANGELOG.md
#	browser/data-browser/src/locales/de.po
#	browser/data-browser/src/locales/en.po
#	browser/data-browser/src/locales/es.po
#	browser/data-browser/src/locales/fr.po
@joepio joepio self-assigned this Sep 29, 2026
…al bootstrap

# Conflicts:
#	browser/data-browser/src/locales/de.po
#	browser/data-browser/src/locales/en.po
#	browser/data-browser/src/locales/es.po
#	browser/data-browser/src/locales/fr.po
@joepio joepio changed the title Batch 2026-09-29: new sidebar account menu, settings dialogs, share select, document images (#1889, #1890, #1891, #1895) Batch 2026-09-29: new sidebar account menu, settings dialogs, share select, document images, onboarding recovery fixes (#1889, #1890, #1891, #1895, #1917) Sep 29, 2026
@joepio joepio changed the title Batch 2026-09-29: new sidebar account menu, settings dialogs, share select, document images, onboarding recovery fixes (#1889, #1890, #1891, #1895, #1917) Batch 2026-09-29: new sidebar account menu, settings dialogs, share select, document images, onboarding recovery fixes, e2e traces (#1889, #1890, #1891, #1895, #1917, #1932) Sep 30, 2026
joepio added a commit that referenced this pull request Sep 30, 2026
…date React after teardown

Before: the data-browser unit stage failed with "ReferenceError: window is not
defined" counted as an unhandled error, although all tests passed. It stopped
develop's run for c2e2682 before e2e started.

After: the unit stage passes.

The test stores connected to server.example, which runs no atomic-server. The
socket failed a moment later, the store reported "Server disconnected", and the
components' state update landed after jsdom was torn down. The stores are now
created with `connect: false`, as in bootstrap.test.ts. Same change as the one
in #1915, so that PR merges without a conflict.
@joepio joepio changed the title Batch 2026-09-29: new sidebar account menu, settings dialogs, share select, document images, onboarding recovery fixes, e2e traces (#1889, #1890, #1891, #1895, #1917, #1932) Batch 2026-09-29: new sidebar account menu, settings dialogs, share select, document images, onboarding recovery fixes (#1889, #1890, #1891, #1895, #1917) Sep 30, 2026
@joepio
joepio merged commit c2f22e6 into develop Sep 30, 2026
8 checks passed
@joepio
joepio deleted the claude/ui-batch-2026-09-29 branch September 30, 2026 21:24
@joepio joepio changed the title Batch 2026-09-29: new sidebar account menu, settings dialogs, share select, document images, onboarding recovery fixes (#1889, #1890, #1891, #1895, #1917) Batch 2026-09-30: account menu, settings dialogs, share select, document images, onboarding recovery, table quick filter, view tabs, and fixes (13 PRs) Sep 30, 2026
joepio added a commit that referenced this pull request Sep 30, 2026
# Conflicts:
#	browser/data-browser/src/locales/de.po
#	browser/data-browser/src/locales/en.po
#	browser/data-browser/src/locales/es.po
#	browser/data-browser/src/locales/fr.po
joepio added a commit that referenced this pull request Oct 1, 2026
The parent fan-out, Store.subscribeLive and the Collection change for
unsynced drives move to their own PR (claude/shared-resource-live),
which needs its own review. This PR keeps the plan and the client
polish: grouped rows, reading on return, the OS-notification offer and
the loading state.

The top-bar bell goes: #1915 already shows the unread count next to
Notifications in the account menu, so the bell showed the same number
twice. The plan says so too.
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.

2 participants