Added
-
Task notes get the formatting toolbar the notes module has always had (#731). Task notes have
rendered as Markdown since v2.7.0, through the same renderer the notes module uses - but there was
no way to write it except by typing the syntax. On a phone,- [ ]is a detour nobody should have
to know about.The toolbar is not a copy: it moved out of the notes module into a shared component both now draw
from, along with its insertion rules. Two versions of thirteen buttons would only have drifted, and
the checklist button in particular had to behave identically on both sides - a checkbox written in
a task should be the same characters as one written in a note.Its labels moved with it, from
notes.format*tomarkdown.*, because they no longer belong to
one module.Both new pieces are ordinary browser libraries under
/utils/, so a third-party module can import
them the same way it imports/api.js:markdown-toolbar.jsfor the toolbar and its insertion
rules,markdown-checklist.jsfor the one definition of what a checklist line is - the same file
the server validates against. -
A rendered checkbox can be ticked by tapping it (#704). Notes drew
- [ ]as a styled box that
was deliberately inert. To tick something off you opened the note, changed[ ]into[x]in the
text and saved - three steps for what looks like a one-tap control, and on a wall tablet with a
shopping list that is the whole feature. The box is now a real control on the card and in the
reader.Ticking rewrites exactly one line of the stored text and leaves the rest byte for byte alone,
through a route of its own (PATCH /api/v1/notes/:id/check) rather than through the full-body
save. That is not tidiness: notes are shared, and two members ticking different items in the same
minute would otherwise have had the later save drop the earlier tick without a word.Which line is meant comes from the source line number the renderer leaves on the box, never from
the item's text - two entries reading "Milk" are otherwise indistinguishable. The client sends the
line it saw along with the tick, and if somebody has edited the note in between, the tick is
refused rather than landing in the wrong row.Boxes stay decorative wherever a tick could not be written back honestly: on the dashboard, which
shows a truncated excerpt whose line numbers are not the note's, in task notes, and in the reader
while the editor holds unsaved text.
Fixed
-
Two buttons had no icon at all. "Remove tags" in the task bulk bar and "Find logo" in the
subscription form asked fortag-offandimage-search, neither of which is in the bundled Lucide
build.createIcons()leaves an unknown name alone rather than failing, so both buttons simply
stood there empty, with the only trace a browser console warning. They now use icons that exist,
and a guard checks every icon name against the bundle - which is also the net under the next
Lucide update, since it drops renamed aliases and the app still uses some of them. -
The formatting toolbar wrote German into every language (#731). Clicking "Link" inserted
[Linktext](url)and clicking "Bold" without a selection insertedText- both fixed in the
source rather than translated. That text lands in the note itself, so it is interface text like
any other, and 23 of 24 languages got the German word. It now comes from the translation.