Docyrus Data Grid Page Design
Build full Docyrus list pages around the web DataGrid stack.
Choose the build mode
Standard Docyrus page → use
useDocyrusDataGrid.- Best when rows come from a Docyrus data source or generated collection.
- Gives you metadata-driven columns, saved views, toolbar wiring, search, filters (with async option search for relation/user fields), grouping, sorting, row-height, display mode, fields visibility menu, paging, and reload.
- Auto-wires reference field expansion, tenant-aware formatters (read from
<DocyrusTenantProvider>context automatically), and a shared users list when supplied. - Built-in inline change tracking + save banner (
trackChanges,onSaveChanges) plus optional inline add-row (onRowAdd). - Built-in selection-bar bulk actions (
bulkActions:update,delete,export) withBulkUpdateDialog+RecordDeleteConfirmDialog, extendable viaextraBulkActions. - Built-in server-side export menu (
enableServerExportMenu,exportColumns,exportFileName,serverExportLimit). - Built-in pivot filter strips (
pivotFilters) and an optional side-panel filter rail (enableSideFilters+sideFiltersConfig). - Relation-cell navigation (
getRelationHref/onOpenRelation/relationIconFields), conditional row/cell color rules (rowColorRules/cellColorRules), and aexcludeFieldSlugsescape hatch for stale backend metadata. - A companion
formViewPropspayload to spread straight intouseDocyrusFormViewfor the active view's bound record form. - Read
references/hook-pages.mdfor the core surface andreferences/advanced-grid-features.mdfor pivot/side filters, relation navigation, color rules, inline add-row, and the escape hatch.
Custom layout or custom row-query lifecycle → use
useDocyrusDataViewSelect+useDataGrid.- Best when you need a custom toolbar arrangement, local/demo data, or a non-standard fetch cycle.
- Read
references/manual-pages.md.
No backend saved views → use
useDataGridwith localSavedDataGridView[]orDataGridViewMenu.- Also covered in
references/manual-pages.md.
- Also covered in
Complex Docyrus query payloads → also load the
docyrus-api-devskill.Advanced saved-view persistence or manual view-driven queries → read
references/advanced-saved-view-query-patterns.md.Advanced grid features (pivot filters, side filters, relation navigation, color rules, inline add, companion form) → read
references/advanced-grid-features.md.Tenant-aware formatters and shared users list → read
references/tenant-and-users-providers.md.
Default page workflow
- Confirm the
appSlug,dataSourceSlug, and whether a generated collection already exists. - Pick hook mode or manual mode.
- App-level: mount
<DocyrusTenantProvider client={...} enabled={authReady} userTimezone={tz}>once near the root so date/datetime/number cells format with the tenant's regional settings automatically — the grid hook readsuseDateFormat()/useNumberFormat()from that context with no per-page formatter props. Also wire aUsersProvider(/v1/userscache) and passusersinto the grid hook for instant avatar + label rendering on user cells. - Add reserved columns in this order: select first, actions second. They are pinned left automatically by
useDocyrusDataGrid. - Keep the page in a flex column layout with the grid body wrapped in
min-h-0 flex-1. - Add create/edit/view/delete dialogs around row actions (e.g.
RecordFormDialog+RecordDeleteConfirmDialog), and an import flow viauseDocyrusDataImportWizardwhen needed. - Verify initial saved view, search, filters, grouping, sorting, paging, and reload behavior.
Non-negotiables
- Render page-sized grids with the toolbar in a shrink-0 row and the grid inside
min-h-0 flex-1. - Prefer
<DataGrid table={table} {...gridProps} height="auto" />for full-page layouts. - Pass the TanStack
tableinstance to every grid menu and toDataGridViewSelect. useDocyrusDataViewSelectmanages view metadata only. It does not fetch rows and does not accepttable.- Manual Docyrus item queries must always send
columns. Reference fields (field-userSelect,field-userMultiSelect,field-relation,field-relatedField,field-select,field-radioGroup,field-enum,field-systemEnum,field-multiSelect,field-tagSelect,field-status,field-approvalStatus) must also be added to theexpandarray so the API returns{ id, name, ... }payloads instead of bare IDs. - Backend saved-view filters need enum options;
useDocyrusDataViewSelectalready fetches the data source withexpand=enums. - Manual pages must apply the initial active view with
applyViewToTable(table, activeView)after views and columns are ready. User-triggered view switches throughDataGridViewSelectare applied automatically. - Prefer
useDocyrusDataGridunless you truly need custom row fetching or custom toolbar composition. The hook handles auto-expand, async filter options, formatters, and reserved-column pinning for you. - When you wire manual view CRUD into
DataGridViewSelect, passisSavingandisLoadingso the editor UX stays correct during saves and background fetches. - For tenant-aware date/datetime/number formatting, mount
<DocyrusTenantProvider>once near the app root. The grid hook auto-reads the formatters fromuseDateFormat()/useNumberFormat()context — do not hand-wireformatDate/formatDateTime/formatNumberprops per page unless you need to override the provider for one grid. (The legacy manualgetTenantPreferences+ per-page formatter props still work and remain a valid fallback for apps that haven't adopted the provider.) - For instant avatar + label rendering on user-typed cells, fetch
/v1/usersonce at app boot and pass the resultingCellUserOption[]intouseDocyrusDataGridvia theusersoption. - When the backend metadata advertises a field the underlying DB no longer has (items endpoint 500s with
column "X" does not exist), drop it viaexcludeFieldSlugsas a temporary escape hatch — prefer fixing the backend metadata.
References
references/hook-pages.md— one-call Docyrus grid pages with direct API mode, collection mode, extension points, formatters, and shared-users wiring.references/advanced-grid-features.md— pivot filter strips, side-panel filter rail, relation-cell navigation + relation icons, conditional row/cell color rules, inline add-row, theexcludeFieldSlugsescape hatch, the companionformViewProps, reactive selection, and the import-wizard + record-dialog page pattern.references/manual-pages.md— local/manual grid composition, local views, backend view-select wiring, and initial-view handling.references/advanced-saved-view-query-patterns.md— saved-view persistence, system views, hidden views, paging ownership, and translating active views into manual server queries.references/tenant-and-users-providers.md— app-level providers for tenant preferences (<DocyrusTenantProvider>) and the shared users list, plus how they auto-wire intouseDocyrusDataGrid.