Skip to content

Release 1.1.51 (versionCode 54) - #144

Merged
adibhanna merged 5 commits into
mainfrom
release/1.1.51
Oct 30, 2026
Merged

adibhanna merged 5 commits into
mainfrom
release/1.1.51

Conversation

@adibhanna

Copy link
Copy Markdown
Contributor

ZenNotes for Android 1.1.51 (versionCode 54), on core 2.80.0 (core-2.80.0-core.hc5a4589d040cd0da, from ZenNotes/zennotes 31520814, the v2.80.0 tag).

  • Core 2.80.0 (8bb4b93): Kanban swimlanes (View, Lanes), subtasks folded into their card with a progress bar, WIP limits from a column's menu, Hide empty tasks across Tasks, the Calendar and the widgets' data, and a template folder in Settings, Templates (Feature Request: Support Custom Template Folders zennotes#1024 to #1028). Mirrored by hand in the shell's vault code: vault.json templates.folder survives a save from the phone (shared-domain normalizeTemplateFolderSettings), follows a folder rename or move (rewriteTemplateFolderForRename), stays out of the task scan and a note's rescan (tasksFolderListsForSettings) and out of text search. parentId comes from the shared parser the scan already calls; a test runs the scan over the core's task-subtasks.json fixture, fresh and from the in-memory cache. A folder's sheet in the drawer gains Open as Gallery (openBrowseFolderGallery). phone-focus-guards.test.ts holds core to its new hostOpensNotesToRead gates; read-open.ts keeps its guards as a second line.
  • Kanban cards open notes to read (b545653): opening a note from a card (the card, its title, its arrow or a subtask line) raised the keyboard; read-open.ts treats a card tap as an open to read. Same file as the iPhone shell. Found by the walk.
  • One file Cloud refuses no longer stops sync (d5d9038, Cloud sync error zennotes#1004): the transport keeps a 422's errors under details.errors, and the inline/direct-upload split throws CloudSyncPathRefusedError with batch positions and what was applied, a port of desktop's DesktopCloudSyncApiClient.mutate.
  • Phone layout (45aa4ee): a card's subtask bar stops short of the move handle (the handle covered "1/3 · 33%"); the Tasks Keys button is hidden on phones like the hint strips it replaced, and its sheet is one column where it shows; the lanes board no longer draws a white scrollbar corner. Found by the walk.
  • Version (8ac8917): 1.1.51, versionCode 54.

Validation: npm run upstream, 456 tests, build and sync. The release build (upload-key assembleRelease) was walked on a throwaway API 37 emulator (WebView 145) with generic sample data, recording the clips: lanes and folding, subtasks ticked from the card, a WIP limit set and cleared, empty tasks in Tasks, the Calendar sheet and the Today widget, the template folder from Settings to a new note and back to Tasks, and Open as Gallery. The walk found the four phone issues above; each was fixed with a test and walked again on the final build.

…ban cards and Open as Gallery

Core core-2.80.0-core.hc5a4589d040cd0da, built by CI from ZenNotes/zennotes
31520814, the desktop v2.80.0 tag. core:adopt checked SHA-256, SHA-512,
packed versions and clean-source provenance. The lock keeps main's dev
flags; only the three core entries change.

What it brings the phone: Kanban swimlanes (View, Lanes), subtasks folded
into their card with a progress bar, WIP limits from a column's menu, Hide
empty tasks across Tasks, the Calendar and the widgets' data, and a
template folder in Settings, Templates (#1024).

The template folder lives in vault.json as templates.folder, and the
phone's own vault code writes vault.json and scans tasks and text itself,
so it mirrors desktop vault.ts by hand: a save from this device keeps the
folder, normalized by shared-domain's normalizeTemplateFolderSettings as
desktop does (folder only; an unusable value leaves no stub); a folder
rename or move carries it along (rewriteTemplateFolderForRename); the task
scan and a single note's rescan go through tasksFolderListsForSettings, so
a template's checkboxes stay out of Tasks even inside a Task folder; text
search never walks the folder. The capabilities say supportsTemplateFolder,
and a self-hosted vault keeps answering with its server's flag. Template
notes reach the picker through core, which reads them with readNote.

Subtasks (#1028) need nothing of the shell's: the scan already calls
shared-domain's parseTasksFromBody, which now sets parentId, and the scan's
cache is in memory only, so no stale entry without it survives an update.
A test runs the shell's scan over the core's task-subtasks.json fixture,
fresh and from the cache.

A folder's sheet in the drawer gains Open as Gallery, through core's new
openBrowseFolderGallery (desktop c82c334d); a database's sheet has none,
as on desktop. Core 2.80 also gates the Columns find field and a callout
pick on hostOpensNotesToRead itself; read-open.ts keeps its own guards as a
second line, and phone-focus-guards.test.ts now holds core to the new
gates. gallery-phone.test.ts and phone-focus-guards.test.ts match the
iPhone shell's byte for byte.

Bridge contract: no new method; VaultSettings.templates, VaultTask.parentId,
TemplateSource 'folder', the portable keys hideEmptyTasks, kanbanWipLimits
and kanbanLanes, and Cloud's refused_paths. No new desktop-only palette
command: the four Lanes commands and Toggle Empty Tasks work on a phone.
Version stays 1.1.50, versionCode 53.
… down

Walking core 2.80.0's board on the release build: opening a note from a
Kanban card raised the soft keyboard over it. Core opens the card's note
from a tap on the card, its title, its open arrow and now a subtask line,
and follows the open with an editor focus, as it does for the Tasks list.
The list's rows arm read-open.ts's hold; the board's cards never did.

read-open.ts treats a tap anywhere on a card ([data-kanban-task-id]) as an
open to read. The card's checkboxes, its subtask bar and the move handle
never focus the editor, so the hold a tap on them arms lapses unused, and
the next touch releases it as before. The click listener and the other
guards are unchanged. Same file in both phone shells.

Tests: core still opens the note from the card, its arrow and a subtask
line (a change there fails at the next adoption), and the cards arm the
hold. On the release build: a tick from the card, then the arrow, opens
the note with the keyboard down.
…#1004)

Core 2.80.0's sync coordinator sets a path Cloud refuses aside and sends
the rest of the batch (desktop 3c8fb850), but it can tell which path Cloud
refused only from the 422's errors keys (mutations.3.path), and the
phone's transport dropped them: a refused path still failed every run, as
the desktop commit noted the shells would until they forwarded them.

cloud-sync-client.ts keeps the answer's errors object under
details.errors (errorDetails, desktop's asErrorPayload). And since the
phone sends one batch as several requests (inline posts and direct
uploads above 5 MiB), mutateWithMobileDirectUploads now throws
CloudSyncPathRefusedError on a refusal, with the refused positions in the
batch it was given and what the earlier requests applied, so the
coordinator commits that and resends only what went unanswered. A direct
upload refused for its own path is named as that mutation's path. A port
of DesktopCloudSyncApiClient.mutate; any other validation failure still
stops the run. The run summary's refused_paths comes from shared-domain's
CloudSyncHostService, which the phone already uses.

Tests: a 422 keeps its field errors and names the refused index; an
inline refusal after a direct upload, and a direct upload refused for its
path after an inline request, are named by their place in the batch with
what was applied; a refusal of any other field throws the original error.
…ones, no white scrollbar corner

Three things the release-build walk of core 2.80.0's board found at phone
width, all in mobile.css.

A card's subtask bar spans the card with its "1/3 · 33%" at the right
end, just above the shell's 30 px move handle in the card's bottom-right
corner, which covered the label. The bar now stops 34 px short of the
card's edge.

The Tasks views' Keys button (core 2.80) replaced the key-hint strips the
phone already hides, so it is hidden on the phone layout as well; tablets
keep it. Where its sheet does show at a narrow width, its two columns of
key chips in a 92vw popover shrank the chips below their text: one group
to a row, chips at their own width. Same rules as the iPhone shell.

Core styles the scrollbars but not the corner where two meet, which
Chromium paints white; the lanes board scrolls both ways, so a white
square sat at its bottom-right corner. The corner is transparent now.

Tests: each rule, and the core markup each one holds to (the progress
button, the Keys button and sheet markers, the sheet's grid and chips).
@adibhanna
adibhanna merged commit da8df9e into main Oct 30, 2026
2 checks passed
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