Docs
Integrations

Updating copied code

Review upstream changes while preserving local customizations.

Treat a registry update as a source-code change. Commit your current files, inspect the incoming diff, then review the merged behavior in your application.

Upgrade sequence

  1. Identify whether the project uses a current artifact or an immutable snapshot.

  2. Review the upstream changelog and registry diff.

  3. Update copied source and dependencies together.

  4. Resolve local customizations deliberately.

  5. Type-check and exercise search, mutations, views and exports.

  6. Record the installed source version or commit for the next update.

Known compatibility boundaries

TanStack Table 9 replaces v8 internals; import table-bound types through the copied adapter when extending the components. Yayaw continues to serialize left and right for pinning even though the v9 engine uses start and end. Provide the shared QueryClient required by current React tables. Refresh Vue styles with its components and install newly declared Shadcn dependencies such as Empty.

Preserve saved state

Renaming a label is safe when the column ID stays stable. Renaming or deleting an ID requires reviewing saved filters, order, grouping and card settings that reference it. Keep serializable view data out of renderer code. See compatibility before using examples from a newer distribution.

Row click now opens the record view

With rowClickMode: 'default' (the default), a row click now opens the record view in every display mode instead of doing nothing when no edit, link, or onRowActivate handler was configured. Hosts that relied on a plain click having no effect should pass details={false} (:details="false" in Vue) and omit onOpenDetails/onRowActivate, or set rowClickMode: 'none', to keep clicks inert after updating.

Date rules carry days (v3.8.0)

FilterValues<"date"> is now CalendarDay | [CalendarDay, CalendarDay], where CalendarDay is a YYYY-MM-DD string, instead of Date | [Date, Date]. DateFilter and CompactDateFilter call onValueChange with days and still read older values, DateRangeShortcuts calls onSelect with days, and getDefaultFilterValue returns today's day. Code that builds date rules with Date objects should pass days instead; older Date values are still read as the viewer's days. On your server, compare days as Date rules describes, and pass saved rules through normalizeDateFilterRules where no browser reads them first.

Dashboards become version 2 (v3.8.0)

Dashboard is now JSON version 2: sections place its widgets. Type version 1 literals as DashboardV1 (or unknown when they come from storage); dashboard.layout is now a grid section's layout; applyGridLayout(section, items) takes a section, and applyDashboardSectionLayout(dashboard, sectionId, items) changes a document. validateDashboard returns ok and migratedFrom, and each issue has a severity and a path. Stored version 1 documents keep loading and are saved as version 2, which v3.7.0 refuses: upgrade every place that reads your dashboards first. A block's name is now its label, and DashboardBlockDefinition is DashboardBlockSchema. See Dashboard.

Order of views and the "…" overflow (v3.9.0)

Each person can order their saved views; see Order of views. TableViewActions.list now answers TableViewListResult ({ data, order? }), and the optional setOrder keeps the order on your server; without it the order stays in the browser. createLocalTableViewActions() returns LocalTableViewActions, without setOrder: code that typed it as Required<TableViewActions> uses the new type. The tabs' overflow is now an icon button named views.more (Vue moreViews): translate it as "More views". New keys are listed in View tabs translations.

The screen editor (v3.9.0)

The dashboard's widget dialog replaces React's AddWidgetDialog (dashboard-dialogs.tsx) and Vue's DashboardAddWidget.vue. addDashboardWidget and moveWidgetToSection take blocks, so a block lands where its placement allows. ToolbarActionContext gains getViewConfig(), and DashboardBlockProps gains setFilter and filterRules: code that builds either itself, such as a test, adds them. The React dashboard item now installs the shadcn alert-dialog and command components. See Edit a screen.

Pages, first load and column order (v3.9.1, v3.9.2)

No API is removed, but check three contracts. Your list action answers a page past the last one with meta.totalCount and meta.pageCount and no rows, not an error: the table then moves to the last page those counts give (see The page shown). A custom display mode loads its data at mount, then again when revision or the query in listParams changes: React mounts it once, with the first page, and hands it the same rows until the data changes; in Vue, revision no longer moves while the first page loads. React's useTableUrlData ignores its getRowId option: rows keep the order list returns, and {tableId}-order holds the column order only.

A React table now starts in its columns.order, as Vue does, and writes no column order of its own to the URL: only moving a column or applying a view writes one. A table whose columns.order differs from its definitions shows its columns in that order and opens on the favorite or an isDefault view (see URL state); the Properties menu and the bulk export follow the same order. Applying a saved view or hiding a column no longer remounts the React table.