ddcore 0.22
0.22.1 — 2026-09-30
Added
defineListView({ actions }): app buttons over the rows selected in the List or Cards view, shown next to "Delete (n)" aslabel (n). An optional per-rowconditionpicks the rows an action applies to;onClick(ids, list)receives their ids and loaded values, and the list clears the selection and reloads once it settles. Seeform-api(#53).
0.22.0 — 2026-09-30
Added
Desk scripts receive
ddcore.publishevents:frm.onRealtime(event, handler)for as long as the form is open, andddcore.realtime.on(event, handler)/offanywhere else.publishhonours{ doctype, id }: the event reaches only sessions that may read that document (#49).ddcore.files.savestores bytes server code holds or downloads (content,contentBase64orfromUrlwith headers, a size limit and a timeout) as aFile, with the rules of an upload. The row is on the current transaction, and a rollback deletes the bytes too.ddcore.files.presign(fileUrl, { ttl })returns a presigned URL for a third party with no session; it needs the s3 storage backend. Seestorage(#50).An upload whose transaction rolls back after the
Filerow was inserted no longer leaves its bytes behind in the store (#50).ddcore.httptakesresponseType: "base64", which returns a binary body (an image, an audio file) base64-encoded instead of corrupted as text, andmaxBytes, the largest body accepted (default 10 MiB) (#51).
Changed
ddcore.publishthrows on an event name outside letters, digits and_ . : -: the name is written into the SSE stream as is, and a line break in it could forge events (#49).- A
ddcore.httpresponse larger than its limit now throws instead of being silently cut at 10 MiB. Pass a largermaxByteswhere a bigger body is expected (#51).
Fixed
ddcore i18n extractcollects_()/__()inside a template literal's${…}, and a template nested in an interpolation no longer ends the outer one and hides every key after it in the file. Both used to pass--checksilently. Runddcore i18n extractagain: keys that were missed now show up as missing and need a translation (#52).