Releases: pilotiqjs/pilotiq
Release list
@pilotiq/tiptap@4.5.0
Minor Changes
- 18b9794: Add
SuggestionReviewPopover— a single floating popover wizard that steps through pending inline-diff suggestions one at a time, replacing the scattered per-region ✓/✕ overlay. The popover anchors to each suggestion's DOM element, shows a step counter (1 of 3), a before/after text preview, and Accept/Reject buttons that advance to the next suggestion automatically. Clicking a diff region in the editor jumps the popover to that suggestion. Dismiss (×) collapses the card without resolving.DiffRegionControlsremains exported for backward compatibility but is no longer used internally.
@pilotiq/tiptap@4.4.2
Patch Changes
- c858821: Fix inline diff regions not reverting when rejected from the pending-suggestions pill. The context→editor cleanup in
useInlineDiffnow callsrejectInlineDiffRegionwhen a suggestion is dismissed externally (e.g. via the chat sidebar pill), so the editor's green/red highlights revert correctly instead of remaining as orphaned regions.
@pilotiq/pilotiq@0.46.0
Minor Changes
-
bad1541: FileUpload:
metaColumn()escape hatch — writes meta to a separate database column.metaFields([...]).metaColumn('col')now splits the stored value into two columns:
the primary column holds just the bare URL (orstring[]for multi), and the
companion column holds only the meta object (or an array of them for multi).The wire format between server and browser remains
{ url, ...meta }in both
directions — the split/merge is transparent to the renderer.Model setup: declare
static casts = { col: 'json' }for the meta column.
For multi-file mode, also declarestatic casts = { field: 'json' }if the
ORM requires it to persiststring[].
@pilotiq/pilotiq@0.45.0
Minor Changes
-
3aae0d4: FileUpload: editable per-file metadata via
metaFields([...])(#237)FileUpload.make('image').metaFields([TextField.make('alt')])collects editable per-file metadata (alt text, caption, …) alongside each upload. Pass core field instances; their config (label / placeholder / options / helper text) travels to the renderer, which mounts the inputs in a row beneath every uploaded file.- Inline rich value. Opting in widens the stored value from a bare URL string to a rich object in the same column —
{ url, …meta }for single-file,[{ url, … }]formultiple(). Declare a'json'cast on the model column. - Back-compat. Without
metaFields()the field is byte-identical to before (zero cost). Legacy plain-string values still read back — coerced to{ url }on load. - Coercion normalizes the JSON the client serializes (object / array / legacy string); entries without a usable
urlare dropped.
The separate-column escape hatch (
.metaColumn()) is tracked separately.@pilotiq/mediametadata editing follows in a second PR. - Inline rich value. Opting in widens the stored value from a bare URL string to a rich object in the same column —
@pilotiq/media@0.7.0
Minor Changes
-
bad1541: Media: panel-scoped library registry — two panels with the same library name no longer clobber each other (#244)
The library registry is now keyed by both panel path and library name. Two panels can register a
'default'library (or any named library) with differentmetaFields,conversions,disk, oracceptedMimeswithout the last registration silently winning.Upgrade notes:
registerLibrary,getLibrary,getDefaultLibrary, andgetLibraryNamesall accept an optional leadingpanelPathargument (e.g.'/admin'). The old single-argument forms remain valid and fall back to an unscoped registry bucket — backward-compatible for code that doesn't have panel context (e.g.mediaUpload()).mediaUpload()now also acceptspanelPath?: stringin its config to opt into scoped lookup when panels have different storage configs.
@pilotiq/media@0.6.0
Minor Changes
-
29d24a2: Media: panel-scoped library registry — two panels with the same library name no longer clobber each other (#244)
The library registry is now keyed by both panel path and library name. Two panels can register a
'default'library (or any named library) with differentmetaFields,conversions,disk, oracceptedMimeswithout the last registration silently winning.Upgrade notes:
registerLibrary,getLibrary,getDefaultLibrary, andgetLibraryNamesall accept an optional leadingpanelPathargument (e.g.'/admin'). The old single-argument forms remain valid and fall back to an unscoped registry bucket — backward-compatible for code that doesn't have panel context (e.g.mediaUpload()).mediaUpload()now also acceptspanelPath?: stringin its config to opt into scoped lookup when panels have different storage configs.
@pilotiq/media@0.5.0
Minor Changes
-
2257b07: Media: editable per-file metadata — alt text + custom
metafields (#237)The library browser's detail panel now edits each file's alt text and any custom metadata fields the library declares, persisted and round-tripping end-to-end.
metaFieldsconfig.media({ metaFields: [TextField.make('credit'), …] })declares custom fields (core@pilotiq/pilotiqfield instances — consistent with coreFileUpload.metaFields([...])). Serialized toFieldMetaat registration and rendered in the detail panel.- Alt editable post-upload. Alt text (its own column) is editable in the panel, not just at upload time.
metajson column is now live. Previously dead weight (hardcoded{}, never read/edited) — custom fields write to it via the newupdateMetadatastore fn +POST {base}/_media/:id/metadataroute.MediaRefround-tripsmeta.toMediaRefnow carries the custommetaso a file picked throughMediaFieldkeeps its metadata in the form value.
Note: the library registry is keyed by library name across panels — panels sharing the default library should declare the same
metaFields.
@pilotiq/media@0.4.0
Minor Changes
-
71ac6cc: Media browser: richer interactions — list view, context menu, multi-select, richer drag-and-drop (#231)
Rounds out the library browser (
@pilotiq/media):- List view — a grid ⇄ list toggle in the header with a Name / Type / Size / Modified table. The preference persists across sessions (
localStorage), applied in a mount effect so it doesn't trip an SSR hydration mismatch. - Context menu — right-click any item (grid tile or list row) for Rename, Move… (folder picker), Download (files), and Delete, backed by the existing
_media/:id/rename+:id/moveroutes. - Multi-select — checkbox affordance on tiles + rows, plus cmd/ctrl-click to toggle and shift-click to range-select; a bulk-action toolbar (Move / Delete / Clear) drives bulk delete and bulk move.
- Richer drag-and-drop — drop a folder (recurses the
webkitGetAsEntrytree, recreating subfolders), drop a URL (fetched → uploaded), and drag a tile/row onto a folder to reparent it.
All client-side — no new routes. Cluster-prefixed mounts resolve the
_mediabase from the server-passedapiBase(the URL-strippingderiveApiBaseis a standalone-page fallback only). - List view — a grid ⇄ list toggle in the header with a Name / Type / Size / Modified table. The preference persists across sessions (
@pilotiq/tiptap@4.4.1
Patch Changes
-
37ace3b: Inline diff: preserve inline marks on the deleted (red) side
The deleted side of a whole-field AI inline diff now keeps its inline formatting (bold / italic / link / code) instead of flattening to plain text. Previously the single-paragraph branch of the deleted widget extracted the old text via
node.textContent, dropping every mark, so a removed<strong>/<em>/<a>run rendered as plain struck text while the inserted side stayed formatted — the diff read as broken. The deleted run is now serialized through the schema'sDOMSerializer(inline content only, so the inline look is kept), matching the inserted side.Also documents a known limitation: a formatting-only change (same text, a mark toggled) is not surfaced, because
prosemirror-changesetis driven by step position maps and mark steps have identity maps.
@pilotiq/pilotiq@0.44.0
Minor Changes
-
528efac: Add a
mediacoerce branch to the form pipeline (#208)coerceFormValuesnow handlesfieldType: 'media'(used by@pilotiq/media's newMediaField): the JSON-encoded media reference posted via the field's hidden input is parsed back into a real object (single) or array (multiple) so a'json'-cast column persists it; empty / unparseable values coerce tonull. Mirrors the existingrichtext/keyValuebranches — no impact on panels that don't use the media field.
Patch Changes
-
ef03cdb: Title (and other single-line collab/AI) fields grow to fit wrapped content
The Tiptap-backed single-line text field (used when a field has AI agents or a collab room attached) was chromed for a strict one line: a fixed
h-8height,items-center, andwhitespace-nowrap overflow-x-clip. When a long title wrapped to a second line the box looked cramped and the padding/line-height no longer matched the content. The variant now grows gracefully —min-h-8keeps the compact resting height for short titles, whilewhitespace-pre-wrap break-words+ balancedpy-1.5/leading-snuglet the border hug multi-line content. Both axes stayoverflow: visible, so the collaboration caret's presence label still renders above the line.