@freighttech/ui 0.13.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +31 -0
- package/dist/backend/AppShell.js +1289 -0
- package/dist/backend/AppShell.js.map +7 -0
- package/dist/backend/BackendChromeProvider.js +83 -0
- package/dist/backend/BackendChromeProvider.js.map +7 -0
- package/dist/backend/BackendPageSurface.js +19 -0
- package/dist/backend/BackendPageSurface.js.map +7 -0
- package/dist/backend/CollapsibleNavSection.js +149 -0
- package/dist/backend/CollapsibleNavSection.js.map +7 -0
- package/dist/backend/ContextHelp.js +33 -0
- package/dist/backend/ContextHelp.js.map +7 -0
- package/dist/backend/CrudForm.js +3163 -0
- package/dist/backend/CrudForm.js.map +7 -0
- package/dist/backend/DataTable.js +2091 -0
- package/dist/backend/DataTable.js.map +7 -0
- package/dist/backend/EmptyState.js +52 -0
- package/dist/backend/EmptyState.js.map +7 -0
- package/dist/backend/FilterBar.js +147 -0
- package/dist/backend/FilterBar.js.map +7 -0
- package/dist/backend/FilterOverlay.js +337 -0
- package/dist/backend/FilterOverlay.js.map +7 -0
- package/dist/backend/FlashMessages.js +158 -0
- package/dist/backend/FlashMessages.js.map +7 -0
- package/dist/backend/HtmlRichTextEditor.js +129 -0
- package/dist/backend/HtmlRichTextEditor.js.map +7 -0
- package/dist/backend/IntegrationsButton.js +25 -0
- package/dist/backend/IntegrationsButton.js.map +7 -0
- package/dist/backend/JsonBuilder.js +323 -0
- package/dist/backend/JsonBuilder.js.map +7 -0
- package/dist/backend/JsonDisplay.js +207 -0
- package/dist/backend/JsonDisplay.js.map +7 -0
- package/dist/backend/NextStepCallout.js +79 -0
- package/dist/backend/NextStepCallout.js.map +7 -0
- package/dist/backend/Page.js +27 -0
- package/dist/backend/Page.js.map +7 -0
- package/dist/backend/PerspectiveSidebar.js +456 -0
- package/dist/backend/PerspectiveSidebar.js.map +7 -0
- package/dist/backend/ProfileDropdown.js +341 -0
- package/dist/backend/ProfileDropdown.js.map +7 -0
- package/dist/backend/RowActions.js +155 -0
- package/dist/backend/RowActions.js.map +7 -0
- package/dist/backend/SectionHeader.js +74 -0
- package/dist/backend/SectionHeader.js.map +7 -0
- package/dist/backend/SettingsButton.js +25 -0
- package/dist/backend/SettingsButton.js.map +7 -0
- package/dist/backend/Sidebar.js +510 -0
- package/dist/backend/Sidebar.js.map +7 -0
- package/dist/backend/Sidebar.stories.js +166 -0
- package/dist/backend/Sidebar.stories.js.map +7 -0
- package/dist/backend/TruncatedCell.js +92 -0
- package/dist/backend/TruncatedCell.js.map +7 -0
- package/dist/backend/UserMenu.js +146 -0
- package/dist/backend/UserMenu.js.map +7 -0
- package/dist/backend/ValueIcons.js +34 -0
- package/dist/backend/ValueIcons.js.map +7 -0
- package/dist/backend/WebhookSetupGuide.js +79 -0
- package/dist/backend/WebhookSetupGuide.js.map +7 -0
- package/dist/backend/charts/BarChart.js +154 -0
- package/dist/backend/charts/BarChart.js.map +7 -0
- package/dist/backend/charts/ChartUtils.js +141 -0
- package/dist/backend/charts/ChartUtils.js.map +7 -0
- package/dist/backend/charts/ComboChart.js +261 -0
- package/dist/backend/charts/ComboChart.js.map +7 -0
- package/dist/backend/charts/ComboChart.stories.js +88 -0
- package/dist/backend/charts/ComboChart.stories.js.map +7 -0
- package/dist/backend/charts/KpiCard.js +96 -0
- package/dist/backend/charts/KpiCard.js.map +7 -0
- package/dist/backend/charts/LineChart.js +165 -0
- package/dist/backend/charts/LineChart.js.map +7 -0
- package/dist/backend/charts/PieChart.js +121 -0
- package/dist/backend/charts/PieChart.js.map +7 -0
- package/dist/backend/charts/ScatterChart.js +320 -0
- package/dist/backend/charts/ScatterChart.js.map +7 -0
- package/dist/backend/charts/TopNTable.js +91 -0
- package/dist/backend/charts/TopNTable.js.map +7 -0
- package/dist/backend/charts/WaterfallChart.js +136 -0
- package/dist/backend/charts/WaterfallChart.js.map +7 -0
- package/dist/backend/charts/index.js +30 -0
- package/dist/backend/charts/index.js.map +7 -0
- package/dist/backend/columns/ColumnChooserPanel.js +244 -0
- package/dist/backend/columns/ColumnChooserPanel.js.map +7 -0
- package/dist/backend/confirm-dialog/ConfirmDialog.js +214 -0
- package/dist/backend/confirm-dialog/ConfirmDialog.js.map +7 -0
- package/dist/backend/confirm-dialog/index.js +7 -0
- package/dist/backend/confirm-dialog/index.js.map +7 -0
- package/dist/backend/confirm-dialog/useConfirmDialog.js +113 -0
- package/dist/backend/confirm-dialog/useConfirmDialog.js.map +7 -0
- package/dist/backend/custom-fields/FieldDefinitionsEditor.js +1352 -0
- package/dist/backend/custom-fields/FieldDefinitionsEditor.js.map +7 -0
- package/dist/backend/custom-fields/FieldDefinitionsManager.js +332 -0
- package/dist/backend/custom-fields/FieldDefinitionsManager.js.map +7 -0
- package/dist/backend/dashboard/DashboardScreen.js +598 -0
- package/dist/backend/dashboard/DashboardScreen.js.map +7 -0
- package/dist/backend/dashboard/index.js +5 -0
- package/dist/backend/dashboard/index.js.map +7 -0
- package/dist/backend/dashboard/widgetRegistry.js +55 -0
- package/dist/backend/dashboard/widgetRegistry.js.map +7 -0
- package/dist/backend/date-range/DateRangeSelect.js +39 -0
- package/dist/backend/date-range/DateRangeSelect.js.map +7 -0
- package/dist/backend/date-range/InlineDateRangeSelect.js +42 -0
- package/dist/backend/date-range/InlineDateRangeSelect.js.map +7 -0
- package/dist/backend/date-range/InlineGranularitySelect.js +40 -0
- package/dist/backend/date-range/InlineGranularitySelect.js.map +7 -0
- package/dist/backend/date-range/dateRanges.js +176 -0
- package/dist/backend/date-range/dateRanges.js.map +7 -0
- package/dist/backend/date-range/index.js +25 -0
- package/dist/backend/date-range/index.js.map +7 -0
- package/dist/backend/detail/AccessDeniedMessage.js +28 -0
- package/dist/backend/detail/AccessDeniedMessage.js.map +7 -0
- package/dist/backend/detail/ActivitiesSection.js +947 -0
- package/dist/backend/detail/ActivitiesSection.js.map +7 -0
- package/dist/backend/detail/AddressEditor.js +417 -0
- package/dist/backend/detail/AddressEditor.js.map +7 -0
- package/dist/backend/detail/AddressTiles.js +441 -0
- package/dist/backend/detail/AddressTiles.js.map +7 -0
- package/dist/backend/detail/AddressesSection.js +274 -0
- package/dist/backend/detail/AddressesSection.js.map +7 -0
- package/dist/backend/detail/AttachmentDeleteDialog.js +41 -0
- package/dist/backend/detail/AttachmentDeleteDialog.js.map +7 -0
- package/dist/backend/detail/AttachmentMetadataDialog.js +519 -0
- package/dist/backend/detail/AttachmentMetadataDialog.js.map +7 -0
- package/dist/backend/detail/AttachmentVisualPreview.js +132 -0
- package/dist/backend/detail/AttachmentVisualPreview.js.map +7 -0
- package/dist/backend/detail/AttachmentsSection.js +281 -0
- package/dist/backend/detail/AttachmentsSection.js.map +7 -0
- package/dist/backend/detail/CustomDataSection.js +575 -0
- package/dist/backend/detail/CustomDataSection.js.map +7 -0
- package/dist/backend/detail/DetailFieldsSection.js +85 -0
- package/dist/backend/detail/DetailFieldsSection.js.map +7 -0
- package/dist/backend/detail/ErrorMessage.js +28 -0
- package/dist/backend/detail/ErrorMessage.js.map +7 -0
- package/dist/backend/detail/InlineEditors.js +697 -0
- package/dist/backend/detail/InlineEditors.js.map +7 -0
- package/dist/backend/detail/LoadingMessage.js +14 -0
- package/dist/backend/detail/LoadingMessage.js.map +7 -0
- package/dist/backend/detail/NotesSection.js +1022 -0
- package/dist/backend/detail/NotesSection.js.map +7 -0
- package/dist/backend/detail/TabEmptyState.js +25 -0
- package/dist/backend/detail/TabEmptyState.js.map +7 -0
- package/dist/backend/detail/TagsSection.js +375 -0
- package/dist/backend/detail/TagsSection.js.map +7 -0
- package/dist/backend/detail/addressFormat.js +77 -0
- package/dist/backend/detail/addressFormat.js.map +7 -0
- package/dist/backend/detail/index.js +36 -0
- package/dist/backend/detail/index.js.map +7 -0
- package/dist/backend/devtools/UmesDevToolsPanel.js +109 -0
- package/dist/backend/devtools/UmesDevToolsPanel.js.map +7 -0
- package/dist/backend/devtools/components/ConflictWarnings.js +32 -0
- package/dist/backend/devtools/components/ConflictWarnings.js.map +7 -0
- package/dist/backend/devtools/components/EnricherTiming.js +46 -0
- package/dist/backend/devtools/components/EnricherTiming.js.map +7 -0
- package/dist/backend/devtools/components/EventFlow.js +34 -0
- package/dist/backend/devtools/components/EventFlow.js.map +7 -0
- package/dist/backend/devtools/components/ExtensionPointList.js +58 -0
- package/dist/backend/devtools/components/ExtensionPointList.js.map +7 -0
- package/dist/backend/devtools/components/InterceptorActivity.js +36 -0
- package/dist/backend/devtools/components/InterceptorActivity.js.map +7 -0
- package/dist/backend/devtools/index.js +7 -0
- package/dist/backend/devtools/index.js.map +7 -0
- package/dist/backend/devtools/useUmesDevTools.js +125 -0
- package/dist/backend/devtools/useUmesDevTools.js.map +7 -0
- package/dist/backend/document-viewer/RegionOverlay.js +92 -0
- package/dist/backend/document-viewer/RegionOverlay.js.map +7 -0
- package/dist/backend/document-viewer/index.js +6 -0
- package/dist/backend/document-viewer/index.js.map +7 -0
- package/dist/backend/dynamic-grid/DynamicGrid.js +130 -0
- package/dist/backend/dynamic-grid/DynamicGrid.js.map +7 -0
- package/dist/backend/dynamic-grid/adapters.js +34 -0
- package/dist/backend/dynamic-grid/adapters.js.map +7 -0
- package/dist/backend/dynamic-grid/components/GridCell.js +149 -0
- package/dist/backend/dynamic-grid/components/GridCell.js.map +7 -0
- package/dist/backend/dynamic-grid/components/GridRow.js +32 -0
- package/dist/backend/dynamic-grid/components/GridRow.js.map +7 -0
- package/dist/backend/dynamic-grid/hooks/useGridKeyboardNav.js +115 -0
- package/dist/backend/dynamic-grid/hooks/useGridKeyboardNav.js.map +7 -0
- package/dist/backend/dynamic-grid/index.js +9 -0
- package/dist/backend/dynamic-grid/index.js.map +7 -0
- package/dist/backend/dynamic-grid/types.js +1 -0
- package/dist/backend/dynamic-grid/types.js.map +7 -0
- package/dist/backend/dynamic-table/DynamicTable.js +2607 -0
- package/dist/backend/dynamic-table/DynamicTable.js.map +7 -0
- package/dist/backend/dynamic-table/DynamicTable.stories.js +233 -0
- package/dist/backend/dynamic-table/DynamicTable.stories.js.map +7 -0
- package/dist/backend/dynamic-table/components/ActiveFilterChips.js +60 -0
- package/dist/backend/dynamic-table/components/ActiveFilterChips.js.map +7 -0
- package/dist/backend/dynamic-table/components/BulkActionsBar.js +58 -0
- package/dist/backend/dynamic-table/components/BulkActionsBar.js.map +7 -0
- package/dist/backend/dynamic-table/components/Cell.js +155 -0
- package/dist/backend/dynamic-table/components/Cell.js.map +7 -0
- package/dist/backend/dynamic-table/components/CellCommentDialog.js +726 -0
- package/dist/backend/dynamic-table/components/CellCommentDialog.js.map +7 -0
- package/dist/backend/dynamic-table/components/CellCommentHoverPopup.js +77 -0
- package/dist/backend/dynamic-table/components/CellCommentHoverPopup.js.map +7 -0
- package/dist/backend/dynamic-table/components/ColumnFilterPopover.js +485 -0
- package/dist/backend/dynamic-table/components/ColumnFilterPopover.js.map +7 -0
- package/dist/backend/dynamic-table/components/ColumnHeaderMenu.js +173 -0
- package/dist/backend/dynamic-table/components/ColumnHeaderMenu.js.map +7 -0
- package/dist/backend/dynamic-table/components/ColumnHeaders.js +528 -0
- package/dist/backend/dynamic-table/components/ColumnHeaders.js.map +7 -0
- package/dist/backend/dynamic-table/components/CompactLabelCell.js +64 -0
- package/dist/backend/dynamic-table/components/CompactLabelCell.js.map +7 -0
- package/dist/backend/dynamic-table/components/ConfigureViewFields.js +139 -0
- package/dist/backend/dynamic-table/components/ConfigureViewFields.js.map +7 -0
- package/dist/backend/dynamic-table/components/ConfigureViewFilters.js +305 -0
- package/dist/backend/dynamic-table/components/ConfigureViewFilters.js.map +7 -0
- package/dist/backend/dynamic-table/components/ConfigureViewFormatting.js +169 -0
- package/dist/backend/dynamic-table/components/ConfigureViewFormatting.js.map +7 -0
- package/dist/backend/dynamic-table/components/ConfigureViewFormulas.js +298 -0
- package/dist/backend/dynamic-table/components/ConfigureViewFormulas.js.map +7 -0
- package/dist/backend/dynamic-table/components/ConfigureViewGrouping.js +224 -0
- package/dist/backend/dynamic-table/components/ConfigureViewGrouping.js.map +7 -0
- package/dist/backend/dynamic-table/components/ConfigureViewLinkedColumns.js +167 -0
- package/dist/backend/dynamic-table/components/ConfigureViewLinkedColumns.js.map +7 -0
- package/dist/backend/dynamic-table/components/ConfigureViewPanel.js +592 -0
- package/dist/backend/dynamic-table/components/ConfigureViewPanel.js.map +7 -0
- package/dist/backend/dynamic-table/components/ConfigureViewRollups.js +269 -0
- package/dist/backend/dynamic-table/components/ConfigureViewRollups.js.map +7 -0
- package/dist/backend/dynamic-table/components/ConfigureViewSorting.js +107 -0
- package/dist/backend/dynamic-table/components/ConfigureViewSorting.js.map +7 -0
- package/dist/backend/dynamic-table/components/ContextMenu.js +91 -0
- package/dist/backend/dynamic-table/components/ContextMenu.js.map +7 -0
- package/dist/backend/dynamic-table/components/DateCell.js +80 -0
- package/dist/backend/dynamic-table/components/DateCell.js.map +7 -0
- package/dist/backend/dynamic-table/components/Debugger.js +311 -0
- package/dist/backend/dynamic-table/components/Debugger.js.map +7 -0
- package/dist/backend/dynamic-table/components/DensityControl.js +289 -0
- package/dist/backend/dynamic-table/components/DensityControl.js.map +7 -0
- package/dist/backend/dynamic-table/components/EmptyState.js +42 -0
- package/dist/backend/dynamic-table/components/EmptyState.js.map +7 -0
- package/dist/backend/dynamic-table/components/EntitySearchEditor.js +369 -0
- package/dist/backend/dynamic-table/components/EntitySearchEditor.js.map +7 -0
- package/dist/backend/dynamic-table/components/ExportMenu.js +63 -0
- package/dist/backend/dynamic-table/components/ExportMenu.js.map +7 -0
- package/dist/backend/dynamic-table/components/FilterDatePicker.js +165 -0
- package/dist/backend/dynamic-table/components/FilterDatePicker.js.map +7 -0
- package/dist/backend/dynamic-table/components/FilterValueInput.js +200 -0
- package/dist/backend/dynamic-table/components/FilterValueInput.js.map +7 -0
- package/dist/backend/dynamic-table/components/FooterTotalsRow.js +165 -0
- package/dist/backend/dynamic-table/components/FooterTotalsRow.js.map +7 -0
- package/dist/backend/dynamic-table/components/FullscreenOverlay.js +51 -0
- package/dist/backend/dynamic-table/components/FullscreenOverlay.js.map +7 -0
- package/dist/backend/dynamic-table/components/GroupHeaderRow.js +108 -0
- package/dist/backend/dynamic-table/components/GroupHeaderRow.js.map +7 -0
- package/dist/backend/dynamic-table/components/GroupSummaryRow.js +134 -0
- package/dist/backend/dynamic-table/components/GroupSummaryRow.js.map +7 -0
- package/dist/backend/dynamic-table/components/ImportPanel.js +341 -0
- package/dist/backend/dynamic-table/components/ImportPanel.js.map +7 -0
- package/dist/backend/dynamic-table/components/ImportPreviewGrid.js +114 -0
- package/dist/backend/dynamic-table/components/ImportPreviewGrid.js.map +7 -0
- package/dist/backend/dynamic-table/components/LoadErrorState.js +23 -0
- package/dist/backend/dynamic-table/components/LoadErrorState.js.map +7 -0
- package/dist/backend/dynamic-table/components/MentionPopup.js +149 -0
- package/dist/backend/dynamic-table/components/MentionPopup.js.map +7 -0
- package/dist/backend/dynamic-table/components/PerspectiveDeleteDialog.js +57 -0
- package/dist/backend/dynamic-table/components/PerspectiveDeleteDialog.js.map +7 -0
- package/dist/backend/dynamic-table/components/PerspectivePublishDialog.js +100 -0
- package/dist/backend/dynamic-table/components/PerspectivePublishDialog.js.map +7 -0
- package/dist/backend/dynamic-table/components/PerspectiveTabMenu.js +159 -0
- package/dist/backend/dynamic-table/components/PerspectiveTabMenu.js.map +7 -0
- package/dist/backend/dynamic-table/components/PerspectiveTabs.js +319 -0
- package/dist/backend/dynamic-table/components/PerspectiveTabs.js.map +7 -0
- package/dist/backend/dynamic-table/components/PerspectiveTemplateMenu.js +90 -0
- package/dist/backend/dynamic-table/components/PerspectiveTemplateMenu.js.map +7 -0
- package/dist/backend/dynamic-table/components/RowHeaderCell.js +58 -0
- package/dist/backend/dynamic-table/components/RowHeaderCell.js.map +7 -0
- package/dist/backend/dynamic-table/components/SearchBar.js +221 -0
- package/dist/backend/dynamic-table/components/SearchBar.js.map +7 -0
- package/dist/backend/dynamic-table/components/SelectMenu.js +186 -0
- package/dist/backend/dynamic-table/components/SelectMenu.js.map +7 -0
- package/dist/backend/dynamic-table/components/StaleDataBar.js +26 -0
- package/dist/backend/dynamic-table/components/StaleDataBar.js.map +7 -0
- package/dist/backend/dynamic-table/components/TableDeleteDialog.js +48 -0
- package/dist/backend/dynamic-table/components/TableDeleteDialog.js.map +7 -0
- package/dist/backend/dynamic-table/components/TablePagination.js +69 -0
- package/dist/backend/dynamic-table/components/TablePagination.js.map +7 -0
- package/dist/backend/dynamic-table/components/TableSkeleton.js +43 -0
- package/dist/backend/dynamic-table/components/TableSkeleton.js.map +7 -0
- package/dist/backend/dynamic-table/components/ToolbarOverflow.js +204 -0
- package/dist/backend/dynamic-table/components/ToolbarOverflow.js.map +7 -0
- package/dist/backend/dynamic-table/components/ViewModeSwitch.js +50 -0
- package/dist/backend/dynamic-table/components/ViewModeSwitch.js.map +7 -0
- package/dist/backend/dynamic-table/components/VirtualRow.js +214 -0
- package/dist/backend/dynamic-table/components/VirtualRow.js.map +7 -0
- package/dist/backend/dynamic-table/components/editors.js +1483 -0
- package/dist/backend/dynamic-table/components/editors.js.map +7 -0
- package/dist/backend/dynamic-table/components/renderers.js +131 -0
- package/dist/backend/dynamic-table/components/renderers.js.map +7 -0
- package/dist/backend/dynamic-table/events/events.js +73 -0
- package/dist/backend/dynamic-table/events/events.js.map +7 -0
- package/dist/backend/dynamic-table/formula/check.js +243 -0
- package/dist/backend/dynamic-table/formula/check.js.map +7 -0
- package/dist/backend/dynamic-table/formula/evaluate.js +302 -0
- package/dist/backend/dynamic-table/formula/evaluate.js.map +7 -0
- package/dist/backend/dynamic-table/formula/functions.js +602 -0
- package/dist/backend/dynamic-table/formula/functions.js.map +7 -0
- package/dist/backend/dynamic-table/formula/index.js +47 -0
- package/dist/backend/dynamic-table/formula/index.js.map +7 -0
- package/dist/backend/dynamic-table/formula/parse.js +293 -0
- package/dist/backend/dynamic-table/formula/parse.js.map +7 -0
- package/dist/backend/dynamic-table/formula/types.js +24 -0
- package/dist/backend/dynamic-table/formula/types.js.map +7 -0
- package/dist/backend/dynamic-table/handlers/cellWrites.js +143 -0
- package/dist/backend/dynamic-table/handlers/cellWrites.js.map +7 -0
- package/dist/backend/dynamic-table/handlers/index.js +504 -0
- package/dist/backend/dynamic-table/handlers/index.js.map +7 -0
- package/dist/backend/dynamic-table/handlers/perspectiveHandlers.js +377 -0
- package/dist/backend/dynamic-table/handlers/perspectiveHandlers.js.map +7 -0
- package/dist/backend/dynamic-table/hooks/index.js +524 -0
- package/dist/backend/dynamic-table/hooks/index.js.map +7 -0
- package/dist/backend/dynamic-table/hooks/useAbbreviations.js +19 -0
- package/dist/backend/dynamic-table/hooks/useAbbreviations.js.map +7 -0
- package/dist/backend/dynamic-table/hooks/useAnnotations.js +115 -0
- package/dist/backend/dynamic-table/hooks/useAnnotations.js.map +7 -0
- package/dist/backend/dynamic-table/hooks/useColumnVirtualizer.js +155 -0
- package/dist/backend/dynamic-table/hooks/useColumnVirtualizer.js.map +7 -0
- package/dist/backend/dynamic-table/hooks/useColumnWidthPersistence.js +135 -0
- package/dist/backend/dynamic-table/hooks/useColumnWidthPersistence.js.map +7 -0
- package/dist/backend/dynamic-table/hooks/useDensityPreference.js +203 -0
- package/dist/backend/dynamic-table/hooks/useDensityPreference.js.map +7 -0
- package/dist/backend/dynamic-table/hooks/useDynamicTablePage.js +1005 -0
- package/dist/backend/dynamic-table/hooks/useDynamicTablePage.js.map +7 -0
- package/dist/backend/dynamic-table/hooks/useEscapeLayer.js +32 -0
- package/dist/backend/dynamic-table/hooks/useEscapeLayer.js.map +7 -0
- package/dist/backend/dynamic-table/hooks/useGrouping.js +256 -0
- package/dist/backend/dynamic-table/hooks/useGrouping.js.map +7 -0
- package/dist/backend/dynamic-table/hooks/useSuggestionFetch.js +63 -0
- package/dist/backend/dynamic-table/hooks/useSuggestionFetch.js.map +7 -0
- package/dist/backend/dynamic-table/hooks/useTableDateFormat.js +11 -0
- package/dist/backend/dynamic-table/hooks/useTableDateFormat.js.map +7 -0
- package/dist/backend/dynamic-table/index.js +476 -0
- package/dist/backend/dynamic-table/index.js.map +7 -0
- package/dist/backend/dynamic-table/registry/ContentRegistryContext.js +126 -0
- package/dist/backend/dynamic-table/registry/ContentRegistryContext.js.map +7 -0
- package/dist/backend/dynamic-table/registry/TableRegistryContext.js +43 -0
- package/dist/backend/dynamic-table/registry/TableRegistryContext.js.map +7 -0
- package/dist/backend/dynamic-table/registry/filterAccessibleTables.js +13 -0
- package/dist/backend/dynamic-table/registry/filterAccessibleTables.js.map +7 -0
- package/dist/backend/dynamic-table/registry/index.js +44 -0
- package/dist/backend/dynamic-table/registry/index.js.map +7 -0
- package/dist/backend/dynamic-table/registry/lazyTable.js +55 -0
- package/dist/backend/dynamic-table/registry/lazyTable.js.map +7 -0
- package/dist/backend/dynamic-table/registry/types.js +1 -0
- package/dist/backend/dynamic-table/registry/types.js.map +7 -0
- package/dist/backend/dynamic-table/registry/widgetCatalog.js +96 -0
- package/dist/backend/dynamic-table/registry/widgetCatalog.js.map +7 -0
- package/dist/backend/dynamic-table/server/aggregate.js +261 -0
- package/dist/backend/dynamic-table/server/aggregate.js.map +7 -0
- package/dist/backend/dynamic-table/server/dateWindows.js +105 -0
- package/dist/backend/dynamic-table/server/dateWindows.js.map +7 -0
- package/dist/backend/dynamic-table/server/filterParser.js +97 -0
- package/dist/backend/dynamic-table/server/filterParser.js.map +7 -0
- package/dist/backend/dynamic-table/server/filterSuggestions.js +70 -0
- package/dist/backend/dynamic-table/server/filterSuggestions.js.map +7 -0
- package/dist/backend/dynamic-table/server/index.js +47 -0
- package/dist/backend/dynamic-table/server/index.js.map +7 -0
- package/dist/backend/dynamic-table/server/makeDynamicTableRoute.js +270 -0
- package/dist/backend/dynamic-table/server/makeDynamicTableRoute.js.map +7 -0
- package/dist/backend/dynamic-table/split-view/ContentPicker.js +171 -0
- package/dist/backend/dynamic-table/split-view/ContentPicker.js.map +7 -0
- package/dist/backend/dynamic-table/split-view/EmptySlot.js +47 -0
- package/dist/backend/dynamic-table/split-view/EmptySlot.js.map +7 -0
- package/dist/backend/dynamic-table/split-view/SplitViewHost.js +863 -0
- package/dist/backend/dynamic-table/split-view/SplitViewHost.js.map +7 -0
- package/dist/backend/dynamic-table/split-view/WidgetPane.js +280 -0
- package/dist/backend/dynamic-table/split-view/WidgetPane.js.map +7 -0
- package/dist/backend/dynamic-table/split-view/WorkspaceFilterBar.js +524 -0
- package/dist/backend/dynamic-table/split-view/WorkspaceFilterBar.js.map +7 -0
- package/dist/backend/dynamic-table/split-view/index.js +61 -0
- package/dist/backend/dynamic-table/split-view/index.js.map +7 -0
- package/dist/backend/dynamic-table/split-view/layoutPersistence.js +91 -0
- package/dist/backend/dynamic-table/split-view/layoutPersistence.js.map +7 -0
- package/dist/backend/dynamic-table/split-view/sharedCriteria.js +62 -0
- package/dist/backend/dynamic-table/split-view/sharedCriteria.js.map +7 -0
- package/dist/backend/dynamic-table/split-view/types.js +426 -0
- package/dist/backend/dynamic-table/split-view/types.js.map +7 -0
- package/dist/backend/dynamic-table/split-view/useSplitViewLayouts.js +79 -0
- package/dist/backend/dynamic-table/split-view/useSplitViewLayouts.js.map +7 -0
- package/dist/backend/dynamic-table/store/index.js +611 -0
- package/dist/backend/dynamic-table/store/index.js.map +7 -0
- package/dist/backend/dynamic-table/styles/ContextMenu.css.js +2 -0
- package/dist/backend/dynamic-table/styles/DynamicTable.css.js +2 -0
- package/dist/backend/dynamic-table/styles/DynamicTable.v2.css.js +2 -0
- package/dist/backend/dynamic-table/styles/SearchBar.css.js +2 -0
- package/dist/backend/dynamic-table/styles/dateCell.css.js +2 -0
- package/dist/backend/dynamic-table/styles/density.css.js +2 -0
- package/dist/backend/dynamic-table/types/density.js +29 -0
- package/dist/backend/dynamic-table/types/density.js.map +7 -0
- package/dist/backend/dynamic-table/types/filters.js +124 -0
- package/dist/backend/dynamic-table/types/filters.js.map +7 -0
- package/dist/backend/dynamic-table/types/grouping.js +34 -0
- package/dist/backend/dynamic-table/types/grouping.js.map +7 -0
- package/dist/backend/dynamic-table/types/import.js +7 -0
- package/dist/backend/dynamic-table/types/import.js.map +7 -0
- package/dist/backend/dynamic-table/types/index.js +46 -0
- package/dist/backend/dynamic-table/types/index.js.map +7 -0
- package/dist/backend/dynamic-table/types/perspective.js +79 -0
- package/dist/backend/dynamic-table/types/perspective.js.map +7 -0
- package/dist/backend/dynamic-table/types/rollup.js +13 -0
- package/dist/backend/dynamic-table/types/rollup.js.map +7 -0
- package/dist/backend/dynamic-table/utils/abbreviations.js +228 -0
- package/dist/backend/dynamic-table/utils/abbreviations.js.map +7 -0
- package/dist/backend/dynamic-table/utils/anchoredPosition.js +21 -0
- package/dist/backend/dynamic-table/utils/anchoredPosition.js.map +7 -0
- package/dist/backend/dynamic-table/utils/badgeAutoFit.js +35 -0
- package/dist/backend/dynamic-table/utils/badgeAutoFit.js.map +7 -0
- package/dist/backend/dynamic-table/utils/clipboard.js +172 -0
- package/dist/backend/dynamic-table/utils/clipboard.js.map +7 -0
- package/dist/backend/dynamic-table/utils/coerceCellValue.js +52 -0
- package/dist/backend/dynamic-table/utils/coerceCellValue.js.map +7 -0
- package/dist/backend/dynamic-table/utils/colorAdjacency.js +27 -0
- package/dist/backend/dynamic-table/utils/colorAdjacency.js.map +7 -0
- package/dist/backend/dynamic-table/utils/columnFill.js +36 -0
- package/dist/backend/dynamic-table/utils/columnFill.js.map +7 -0
- package/dist/backend/dynamic-table/utils/columnSpacerStyle.js +21 -0
- package/dist/backend/dynamic-table/utils/columnSpacerStyle.js.map +7 -0
- package/dist/backend/dynamic-table/utils/columnWindow.js +293 -0
- package/dist/backend/dynamic-table/utils/columnWindow.js.map +7 -0
- package/dist/backend/dynamic-table/utils/conditionalFormat.js +188 -0
- package/dist/backend/dynamic-table/utils/conditionalFormat.js.map +7 -0
- package/dist/backend/dynamic-table/utils/exportTable.js +82 -0
- package/dist/backend/dynamic-table/utils/exportTable.js.map +7 -0
- package/dist/backend/dynamic-table/utils/fillGeometry.js +92 -0
- package/dist/backend/dynamic-table/utils/fillGeometry.js.map +7 -0
- package/dist/backend/dynamic-table/utils/fillPatterns.js +241 -0
- package/dist/backend/dynamic-table/utils/fillPatterns.js.map +7 -0
- package/dist/backend/dynamic-table/utils/formatAggregate.js +82 -0
- package/dist/backend/dynamic-table/utils/formatAggregate.js.map +7 -0
- package/dist/backend/dynamic-table/utils/formatDateCompact.js +508 -0
- package/dist/backend/dynamic-table/utils/formatDateCompact.js.map +7 -0
- package/dist/backend/dynamic-table/utils/formatLabelCompact.js +312 -0
- package/dist/backend/dynamic-table/utils/formatLabelCompact.js.map +7 -0
- package/dist/backend/dynamic-table/utils/formulaColumns.js +158 -0
- package/dist/backend/dynamic-table/utils/formulaColumns.js.map +7 -0
- package/dist/backend/dynamic-table/utils/importMapping.js +118 -0
- package/dist/backend/dynamic-table/utils/importMapping.js.map +7 -0
- package/dist/backend/dynamic-table/utils/importParse.js +121 -0
- package/dist/backend/dynamic-table/utils/importParse.js.map +7 -0
- package/dist/backend/dynamic-table/utils/lookupColumns.js +28 -0
- package/dist/backend/dynamic-table/utils/lookupColumns.js.map +7 -0
- package/dist/backend/dynamic-table/utils/perspectiveTransforms.js +191 -0
- package/dist/backend/dynamic-table/utils/perspectiveTransforms.js.map +7 -0
- package/dist/backend/dynamic-table/utils/rollupColumns.js +81 -0
- package/dist/backend/dynamic-table/utils/rollupColumns.js.map +7 -0
- package/dist/backend/dynamic-table/validators/index.js +36 -0
- package/dist/backend/dynamic-table/validators/index.js.map +7 -0
- package/dist/backend/fields/registry.generated.js +8 -0
- package/dist/backend/fields/registry.generated.js.map +7 -0
- package/dist/backend/fields/registry.js +29 -0
- package/dist/backend/fields/registry.js.map +7 -0
- package/dist/backend/filters/AdvancedFilterBuilder.js +280 -0
- package/dist/backend/filters/AdvancedFilterBuilder.js.map +7 -0
- package/dist/backend/forms/ActionsDropdown.js +160 -0
- package/dist/backend/forms/ActionsDropdown.js.map +7 -0
- package/dist/backend/forms/FormActionButtons.js +59 -0
- package/dist/backend/forms/FormActionButtons.js.map +7 -0
- package/dist/backend/forms/FormFooter.js +18 -0
- package/dist/backend/forms/FormFooter.js.map +7 -0
- package/dist/backend/forms/FormHeader.js +125 -0
- package/dist/backend/forms/FormHeader.js.map +7 -0
- package/dist/backend/forms/index.js +11 -0
- package/dist/backend/forms/index.js.map +7 -0
- package/dist/backend/hooks/useAdvancedFilter.js +64 -0
- package/dist/backend/hooks/useAdvancedFilter.js.map +7 -0
- package/dist/backend/indexes/PartialIndexBanner.js +74 -0
- package/dist/backend/indexes/PartialIndexBanner.js.map +7 -0
- package/dist/backend/indexes/store.js +62 -0
- package/dist/backend/indexes/store.js.map +7 -0
- package/dist/backend/injection/ComponentOverrideProvider.js +55 -0
- package/dist/backend/injection/ComponentOverrideProvider.js.map +7 -0
- package/dist/backend/injection/InjectedField.js +166 -0
- package/dist/backend/injection/InjectedField.js.map +7 -0
- package/dist/backend/injection/InjectionSpot.js +323 -0
- package/dist/backend/injection/InjectionSpot.js.map +7 -0
- package/dist/backend/injection/InjectionWizard.js +256 -0
- package/dist/backend/injection/InjectionWizard.js.map +7 -0
- package/dist/backend/injection/PageInjectionBoundary.js +26 -0
- package/dist/backend/injection/PageInjectionBoundary.js.map +7 -0
- package/dist/backend/injection/SseEventIndicator.js +8 -0
- package/dist/backend/injection/SseEventIndicator.js.map +7 -0
- package/dist/backend/injection/StatusBadgeInjectionSpot.js +34 -0
- package/dist/backend/injection/StatusBadgeInjectionSpot.js.map +7 -0
- package/dist/backend/injection/StatusBadgeRenderer.js +58 -0
- package/dist/backend/injection/StatusBadgeRenderer.js.map +7 -0
- package/dist/backend/injection/WidgetSharedState.js +49 -0
- package/dist/backend/injection/WidgetSharedState.js.map +7 -0
- package/dist/backend/injection/WizardInjectionSpot.js +30 -0
- package/dist/backend/injection/WizardInjectionSpot.js.map +7 -0
- package/dist/backend/injection/eventBridge.js +129 -0
- package/dist/backend/injection/eventBridge.js.map +7 -0
- package/dist/backend/injection/helpers.js +26 -0
- package/dist/backend/injection/helpers.js.map +7 -0
- package/dist/backend/injection/mergeMenuItems.js +49 -0
- package/dist/backend/injection/mergeMenuItems.js.map +7 -0
- package/dist/backend/injection/mutationEvents.js +20 -0
- package/dist/backend/injection/mutationEvents.js.map +7 -0
- package/dist/backend/injection/resolveInjectedIcon.js +23 -0
- package/dist/backend/injection/resolveInjectedIcon.js.map +7 -0
- package/dist/backend/injection/spotIds.js +72 -0
- package/dist/backend/injection/spotIds.js.map +7 -0
- package/dist/backend/injection/useAppEvent.js +35 -0
- package/dist/backend/injection/useAppEvent.js.map +7 -0
- package/dist/backend/injection/useGuardedMutation.js +71 -0
- package/dist/backend/injection/useGuardedMutation.js.map +7 -0
- package/dist/backend/injection/useInjectedMenuItems.js +49 -0
- package/dist/backend/injection/useInjectedMenuItems.js.map +7 -0
- package/dist/backend/injection/useInjectionDataWidgets.js +36 -0
- package/dist/backend/injection/useInjectionDataWidgets.js.map +7 -0
- package/dist/backend/injection/useOperationProgress.js +64 -0
- package/dist/backend/injection/useOperationProgress.js.map +7 -0
- package/dist/backend/injection/useRegisteredComponent.js +89 -0
- package/dist/backend/injection/useRegisteredComponent.js.map +7 -0
- package/dist/backend/injection/useWidgetSharedState.js +26 -0
- package/dist/backend/injection/useWidgetSharedState.js.map +7 -0
- package/dist/backend/injection/visibility-utils.js +29 -0
- package/dist/backend/injection/visibility-utils.js.map +7 -0
- package/dist/backend/injection/widgetRegistry.js +55 -0
- package/dist/backend/injection/widgetRegistry.js.map +7 -0
- package/dist/backend/inputs/ComboboxInput.js +228 -0
- package/dist/backend/inputs/ComboboxInput.js.map +7 -0
- package/dist/backend/inputs/DatePicker.js +148 -0
- package/dist/backend/inputs/DatePicker.js.map +7 -0
- package/dist/backend/inputs/DateTimePicker.js +188 -0
- package/dist/backend/inputs/DateTimePicker.js.map +7 -0
- package/dist/backend/inputs/EventPatternInput.js +38 -0
- package/dist/backend/inputs/EventPatternInput.js.map +7 -0
- package/dist/backend/inputs/EventSelect.js +115 -0
- package/dist/backend/inputs/EventSelect.js.map +7 -0
- package/dist/backend/inputs/LookupSelect.js +197 -0
- package/dist/backend/inputs/LookupSelect.js.map +7 -0
- package/dist/backend/inputs/PhoneNumberField.js +133 -0
- package/dist/backend/inputs/PhoneNumberField.js.map +7 -0
- package/dist/backend/inputs/SwitchableMarkdownInput.js +73 -0
- package/dist/backend/inputs/SwitchableMarkdownInput.js.map +7 -0
- package/dist/backend/inputs/TagsInput.js +258 -0
- package/dist/backend/inputs/TagsInput.js.map +7 -0
- package/dist/backend/inputs/TimeInput.js +132 -0
- package/dist/backend/inputs/TimeInput.js.map +7 -0
- package/dist/backend/inputs/TimePicker.js +105 -0
- package/dist/backend/inputs/TimePicker.js.map +7 -0
- package/dist/backend/inputs/index.js +12 -0
- package/dist/backend/inputs/index.js.map +7 -0
- package/dist/backend/markdown/MarkdownContent.js +20 -0
- package/dist/backend/markdown/MarkdownContent.js.map +7 -0
- package/dist/backend/markdown/index.js +3 -0
- package/dist/backend/markdown/index.js.map +7 -0
- package/dist/backend/markdown/useMarkdownRemarkPlugins.js +33 -0
- package/dist/backend/markdown/useMarkdownRemarkPlugins.js.map +7 -0
- package/dist/backend/messages/MessageComposer.js +158 -0
- package/dist/backend/messages/MessageComposer.js.map +7 -0
- package/dist/backend/messages/MessageObjectDetail.js +81 -0
- package/dist/backend/messages/MessageObjectDetail.js.map +7 -0
- package/dist/backend/messages/MessageObjectPreview.js +48 -0
- package/dist/backend/messages/MessageObjectPreview.js.map +7 -0
- package/dist/backend/messages/MessageObjectRecordPicker.js +89 -0
- package/dist/backend/messages/MessageObjectRecordPicker.js.map +7 -0
- package/dist/backend/messages/MessagePrioritySelector.js +74 -0
- package/dist/backend/messages/MessagePrioritySelector.js.map +7 -0
- package/dist/backend/messages/MessagesIcon.js +22 -0
- package/dist/backend/messages/MessagesIcon.js.map +7 -0
- package/dist/backend/messages/SendObjectMessageDialog.js +65 -0
- package/dist/backend/messages/SendObjectMessageDialog.js.map +7 -0
- package/dist/backend/messages/index.js +17 -0
- package/dist/backend/messages/index.js.map +7 -0
- package/dist/backend/messages/message-compose-form-groups.js +333 -0
- package/dist/backend/messages/message-compose-form-groups.js.map +7 -0
- package/dist/backend/messages/message-composer.types.js +1 -0
- package/dist/backend/messages/message-composer.types.js.map +7 -0
- package/dist/backend/messages/message-priority.js +40 -0
- package/dist/backend/messages/message-priority.js.map +7 -0
- package/dist/backend/messages/useMessageCompose.js +488 -0
- package/dist/backend/messages/useMessageCompose.js.map +7 -0
- package/dist/backend/messages/useMessageComposeOperations.js +163 -0
- package/dist/backend/messages/useMessageComposeOperations.js.map +7 -0
- package/dist/backend/messages/useMessagesPoll.js +79 -0
- package/dist/backend/messages/useMessagesPoll.js.map +7 -0
- package/dist/backend/notifications/NotificationBell.js +83 -0
- package/dist/backend/notifications/NotificationBell.js.map +7 -0
- package/dist/backend/notifications/NotificationCountBadge.js +9 -0
- package/dist/backend/notifications/NotificationCountBadge.js.map +7 -0
- package/dist/backend/notifications/NotificationDispatcher.js +165 -0
- package/dist/backend/notifications/NotificationDispatcher.js.map +7 -0
- package/dist/backend/notifications/NotificationItem.js +187 -0
- package/dist/backend/notifications/NotificationItem.js.map +7 -0
- package/dist/backend/notifications/NotificationPanel.js +146 -0
- package/dist/backend/notifications/NotificationPanel.js.map +7 -0
- package/dist/backend/notifications/index.js +19 -0
- package/dist/backend/notifications/index.js.map +7 -0
- package/dist/backend/notifications/useNotificationActions.js +124 -0
- package/dist/backend/notifications/useNotificationActions.js.map +7 -0
- package/dist/backend/notifications/useNotificationEffect.js +13 -0
- package/dist/backend/notifications/useNotificationEffect.js.map +7 -0
- package/dist/backend/notifications/useNotifications.js +11 -0
- package/dist/backend/notifications/useNotifications.js.map +7 -0
- package/dist/backend/notifications/useNotificationsPoll.js +135 -0
- package/dist/backend/notifications/useNotificationsPoll.js.map +7 -0
- package/dist/backend/notifications/useNotificationsSse.js +173 -0
- package/dist/backend/notifications/useNotificationsSse.js.map +7 -0
- package/dist/backend/operations/LastOperationBanner.js +80 -0
- package/dist/backend/operations/LastOperationBanner.js.map +7 -0
- package/dist/backend/operations/store.js +183 -0
- package/dist/backend/operations/store.js.map +7 -0
- package/dist/backend/progress/ProgressTopBar.js +129 -0
- package/dist/backend/progress/ProgressTopBar.js.map +7 -0
- package/dist/backend/progress/useProgress.js +11 -0
- package/dist/backend/progress/useProgress.js.map +7 -0
- package/dist/backend/progress/useProgressPoll.js +69 -0
- package/dist/backend/progress/useProgressPoll.js.map +7 -0
- package/dist/backend/progress/useProgressSse.js +104 -0
- package/dist/backend/progress/useProgressSse.js.map +7 -0
- package/dist/backend/schedule/ScheduleAgenda.js +107 -0
- package/dist/backend/schedule/ScheduleAgenda.js.map +7 -0
- package/dist/backend/schedule/ScheduleGrid.js +107 -0
- package/dist/backend/schedule/ScheduleGrid.js.map +7 -0
- package/dist/backend/schedule/ScheduleToolbar.js +166 -0
- package/dist/backend/schedule/ScheduleToolbar.js.map +7 -0
- package/dist/backend/schedule/ScheduleView.js +168 -0
- package/dist/backend/schedule/ScheduleView.js.map +7 -0
- package/dist/backend/schedule/index.js +6 -0
- package/dist/backend/schedule/index.js.map +7 -0
- package/dist/backend/schedule/recurrence.js +83 -0
- package/dist/backend/schedule/recurrence.js.map +7 -0
- package/dist/backend/schedule/types.js +1 -0
- package/dist/backend/schedule/types.js.map +7 -0
- package/dist/backend/section-page/SectionNav.js +104 -0
- package/dist/backend/section-page/SectionNav.js.map +7 -0
- package/dist/backend/section-page/SectionPage.js +33 -0
- package/dist/backend/section-page/SectionPage.js.map +7 -0
- package/dist/backend/section-page/index.js +7 -0
- package/dist/backend/section-page/index.js.map +7 -0
- package/dist/backend/section-page/types.js +1 -0
- package/dist/backend/section-page/types.js.map +7 -0
- package/dist/backend/settings/SettingsNavigation.js +43 -0
- package/dist/backend/settings/SettingsNavigation.js.map +7 -0
- package/dist/backend/settings/SettingsPageWrapper.js +66 -0
- package/dist/backend/settings/SettingsPageWrapper.js.map +7 -0
- package/dist/backend/settings/index.js +6 -0
- package/dist/backend/settings/index.js.map +7 -0
- package/dist/backend/upgrades/UpgradeActionBanner.js +91 -0
- package/dist/backend/upgrades/UpgradeActionBanner.js.map +7 -0
- package/dist/backend/utils/api.js +178 -0
- package/dist/backend/utils/api.js.map +7 -0
- package/dist/backend/utils/apiCall.js +68 -0
- package/dist/backend/utils/apiCall.js.map +7 -0
- package/dist/backend/utils/crud.js +126 -0
- package/dist/backend/utils/crud.js.map +7 -0
- package/dist/backend/utils/customFieldColumns.js +100 -0
- package/dist/backend/utils/customFieldColumns.js.map +7 -0
- package/dist/backend/utils/customFieldDefs.js +143 -0
- package/dist/backend/utils/customFieldDefs.js.map +7 -0
- package/dist/backend/utils/customFieldFilters.js +151 -0
- package/dist/backend/utils/customFieldFilters.js.map +7 -0
- package/dist/backend/utils/customFieldForms.js +169 -0
- package/dist/backend/utils/customFieldForms.js.map +7 -0
- package/dist/backend/utils/customFieldRelationDisplay.js +239 -0
- package/dist/backend/utils/customFieldRelationDisplay.js.map +7 -0
- package/dist/backend/utils/customFieldValues.js +26 -0
- package/dist/backend/utils/customFieldValues.js.map +7 -0
- package/dist/backend/utils/flash.js +16 -0
- package/dist/backend/utils/flash.js.map +7 -0
- package/dist/backend/utils/nav.js +280 -0
- package/dist/backend/utils/nav.js.map +7 -0
- package/dist/backend/utils/richTextSanitizer.js +11 -0
- package/dist/backend/utils/richTextSanitizer.js.map +7 -0
- package/dist/backend/utils/scopedHeaderStack.js +44 -0
- package/dist/backend/utils/scopedHeaderStack.js.map +7 -0
- package/dist/backend/utils/serverErrors.js +237 -0
- package/dist/backend/utils/serverErrors.js.map +7 -0
- package/dist/backend/utils/useAutoDiscoveredFields.js +96 -0
- package/dist/backend/utils/useAutoDiscoveredFields.js.map +7 -0
- package/dist/backend/version-history/VersionHistoryAction.js +67 -0
- package/dist/backend/version-history/VersionHistoryAction.js.map +7 -0
- package/dist/backend/version-history/VersionHistoryDetail.js +57 -0
- package/dist/backend/version-history/VersionHistoryDetail.js.map +7 -0
- package/dist/backend/version-history/VersionHistoryPanel.js +270 -0
- package/dist/backend/version-history/VersionHistoryPanel.js.map +7 -0
- package/dist/backend/version-history/index.js +13 -0
- package/dist/backend/version-history/index.js.map +7 -0
- package/dist/backend/version-history/labels.js +52 -0
- package/dist/backend/version-history/labels.js.map +7 -0
- package/dist/backend/version-history/types.js +1 -0
- package/dist/backend/version-history/types.js.map +7 -0
- package/dist/backend/version-history/useAuditPermissions.js +72 -0
- package/dist/backend/version-history/useAuditPermissions.js.map +7 -0
- package/dist/backend/version-history/useVersionHistory.js +141 -0
- package/dist/backend/version-history/useVersionHistory.js.map +7 -0
- package/dist/backend/views/NewViewForm.js +56 -0
- package/dist/backend/views/NewViewForm.js.map +7 -0
- package/dist/backend/views/ShareForm.js +49 -0
- package/dist/backend/views/ShareForm.js.map +7 -0
- package/dist/backend/views/ViewChip.js +112 -0
- package/dist/backend/views/ViewChip.js.map +7 -0
- package/dist/backend/views/ViewChipMenu.js +89 -0
- package/dist/backend/views/ViewChipMenu.js.map +7 -0
- package/dist/backend/views/types.js +1 -0
- package/dist/backend/views/types.js.map +7 -0
- package/dist/frontend/AuthFooter.js +23 -0
- package/dist/frontend/AuthFooter.js.map +7 -0
- package/dist/frontend/LanguageSwitcher.js +57 -0
- package/dist/frontend/LanguageSwitcher.js.map +7 -0
- package/dist/frontend/Layout.js +14 -0
- package/dist/frontend/Layout.js.map +7 -0
- package/dist/hooks/useIsMobile.js +21 -0
- package/dist/hooks/useIsMobile.js.map +7 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +7 -0
- package/dist/portal/PortalContext.js +113 -0
- package/dist/portal/PortalContext.js.map +7 -0
- package/dist/portal/PortalLayoutProvider.js +5 -0
- package/dist/portal/PortalLayoutProvider.js.map +7 -0
- package/dist/portal/PortalLayoutShell.js +44 -0
- package/dist/portal/PortalLayoutShell.js.map +7 -0
- package/dist/portal/PortalShell.js +229 -0
- package/dist/portal/PortalShell.js.map +7 -0
- package/dist/portal/components/PortalCard.js +31 -0
- package/dist/portal/components/PortalCard.js.map +7 -0
- package/dist/portal/components/PortalEmptyState.js +16 -0
- package/dist/portal/components/PortalEmptyState.js.map +7 -0
- package/dist/portal/components/PortalFeatureCard.js +21 -0
- package/dist/portal/components/PortalFeatureCard.js.map +7 -0
- package/dist/portal/components/PortalNotificationBell.js +67 -0
- package/dist/portal/components/PortalNotificationBell.js.map +7 -0
- package/dist/portal/components/PortalNotificationPanel.js +158 -0
- package/dist/portal/components/PortalNotificationPanel.js.map +7 -0
- package/dist/portal/components/PortalPageHeader.js +16 -0
- package/dist/portal/components/PortalPageHeader.js.map +7 -0
- package/dist/portal/components/index.js +18 -0
- package/dist/portal/components/index.js.map +7 -0
- package/dist/portal/hooks/useCustomerAuth.js +69 -0
- package/dist/portal/hooks/useCustomerAuth.js.map +7 -0
- package/dist/portal/hooks/usePortalAppEvent.js +26 -0
- package/dist/portal/hooks/usePortalAppEvent.js.map +7 -0
- package/dist/portal/hooks/usePortalDashboardWidgets.js +37 -0
- package/dist/portal/hooks/usePortalDashboardWidgets.js.map +7 -0
- package/dist/portal/hooks/usePortalEventBridge.js +129 -0
- package/dist/portal/hooks/usePortalEventBridge.js.map +7 -0
- package/dist/portal/hooks/usePortalInjectedMenuItems.js +88 -0
- package/dist/portal/hooks/usePortalInjectedMenuItems.js.map +7 -0
- package/dist/portal/hooks/usePortalNotifications.js +85 -0
- package/dist/portal/hooks/usePortalNotifications.js.map +7 -0
- package/dist/portal/hooks/useTenantContext.js +53 -0
- package/dist/portal/hooks/useTenantContext.js.map +7 -0
- package/dist/primitives/DataLoader.js +68 -0
- package/dist/primitives/DataLoader.js.map +7 -0
- package/dist/primitives/ErrorNotice.js +14 -0
- package/dist/primitives/ErrorNotice.js.map +7 -0
- package/dist/primitives/Notice.js +55 -0
- package/dist/primitives/Notice.js.map +7 -0
- package/dist/primitives/alert.js +38 -0
- package/dist/primitives/alert.js.map +7 -0
- package/dist/primitives/badge.js +33 -0
- package/dist/primitives/badge.js.map +7 -0
- package/dist/primitives/button.js +45 -0
- package/dist/primitives/button.js.map +7 -0
- package/dist/primitives/calendar.js +62 -0
- package/dist/primitives/calendar.js.map +7 -0
- package/dist/primitives/card.js +91 -0
- package/dist/primitives/card.js.map +7 -0
- package/dist/primitives/checkbox.js +28 -0
- package/dist/primitives/checkbox.js.map +7 -0
- package/dist/primitives/dialog.js +101 -0
- package/dist/primitives/dialog.js.map +7 -0
- package/dist/primitives/form-field.js +78 -0
- package/dist/primitives/form-field.js.map +7 -0
- package/dist/primitives/icon-button.js +40 -0
- package/dist/primitives/icon-button.js.map +7 -0
- package/dist/primitives/input.js +22 -0
- package/dist/primitives/input.js.map +7 -0
- package/dist/primitives/label.js +21 -0
- package/dist/primitives/label.js.map +7 -0
- package/dist/primitives/popover.js +36 -0
- package/dist/primitives/popover.js.map +7 -0
- package/dist/primitives/primitives.stories.js +187 -0
- package/dist/primitives/primitives.stories.js.map +7 -0
- package/dist/primitives/progress.js +28 -0
- package/dist/primitives/progress.js.map +7 -0
- package/dist/primitives/separator.js +9 -0
- package/dist/primitives/separator.js.map +7 -0
- package/dist/primitives/sheet.js +103 -0
- package/dist/primitives/sheet.js.map +7 -0
- package/dist/primitives/spinner.js +24 -0
- package/dist/primitives/spinner.js.map +7 -0
- package/dist/primitives/status-badge.js +38 -0
- package/dist/primitives/status-badge.js.map +7 -0
- package/dist/primitives/switch.js +80 -0
- package/dist/primitives/switch.js.map +7 -0
- package/dist/primitives/table.js +29 -0
- package/dist/primitives/table.js.map +7 -0
- package/dist/primitives/tabs.js +90 -0
- package/dist/primitives/tabs.js.map +7 -0
- package/dist/primitives/textarea.js +21 -0
- package/dist/primitives/textarea.js.map +7 -0
- package/dist/primitives/tooltip.js +60 -0
- package/dist/primitives/tooltip.js.map +7 -0
- package/dist/primitives-v2/Alert.js +69 -0
- package/dist/primitives-v2/Alert.js.map +7 -0
- package/dist/primitives-v2/Alert.stories.js +42 -0
- package/dist/primitives-v2/Alert.stories.js.map +7 -0
- package/dist/primitives-v2/Avatar.js +93 -0
- package/dist/primitives-v2/Avatar.js.map +7 -0
- package/dist/primitives-v2/Avatar.stories.js +57 -0
- package/dist/primitives-v2/Avatar.stories.js.map +7 -0
- package/dist/primitives-v2/Badge.js +50 -0
- package/dist/primitives-v2/Badge.js.map +7 -0
- package/dist/primitives-v2/Badge.stories.js +66 -0
- package/dist/primitives-v2/Badge.stories.js.map +7 -0
- package/dist/primitives-v2/Breadcrumb.js +53 -0
- package/dist/primitives-v2/Breadcrumb.js.map +7 -0
- package/dist/primitives-v2/Breadcrumb.stories.js +70 -0
- package/dist/primitives-v2/Breadcrumb.stories.js.map +7 -0
- package/dist/primitives-v2/Button.js +85 -0
- package/dist/primitives-v2/Button.js.map +7 -0
- package/dist/primitives-v2/Button.stories.js +48 -0
- package/dist/primitives-v2/Button.stories.js.map +7 -0
- package/dist/primitives-v2/Checkbox.js +65 -0
- package/dist/primitives-v2/Checkbox.js.map +7 -0
- package/dist/primitives-v2/Checkbox.stories.js +31 -0
- package/dist/primitives-v2/Checkbox.stories.js.map +7 -0
- package/dist/primitives-v2/IconButton.js +13 -0
- package/dist/primitives-v2/IconButton.js.map +7 -0
- package/dist/primitives-v2/IconButton.stories.js +37 -0
- package/dist/primitives-v2/IconButton.stories.js.map +7 -0
- package/dist/primitives-v2/Input.js +74 -0
- package/dist/primitives-v2/Input.js.map +7 -0
- package/dist/primitives-v2/Input.stories.js +56 -0
- package/dist/primitives-v2/Input.stories.js.map +7 -0
- package/dist/primitives-v2/NavGroup.js +54 -0
- package/dist/primitives-v2/NavGroup.js.map +7 -0
- package/dist/primitives-v2/NavGroup.stories.js +39 -0
- package/dist/primitives-v2/NavGroup.stories.js.map +7 -0
- package/dist/primitives-v2/NavItem.js +61 -0
- package/dist/primitives-v2/NavItem.js.map +7 -0
- package/dist/primitives-v2/NavItem.stories.js +56 -0
- package/dist/primitives-v2/NavItem.stories.js.map +7 -0
- package/dist/primitives-v2/SearchInput.js +93 -0
- package/dist/primitives-v2/SearchInput.js.map +7 -0
- package/dist/primitives-v2/SearchInput.stories.js +41 -0
- package/dist/primitives-v2/SearchInput.stories.js.map +7 -0
- package/dist/primitives-v2/Sidebar.js +48 -0
- package/dist/primitives-v2/Sidebar.js.map +7 -0
- package/dist/primitives-v2/Sidebar.stories.js +76 -0
- package/dist/primitives-v2/Sidebar.stories.js.map +7 -0
- package/dist/primitives-v2/Tab.js +78 -0
- package/dist/primitives-v2/Tab.js.map +7 -0
- package/dist/primitives-v2/Tab.stories.js +51 -0
- package/dist/primitives-v2/Tab.stories.js.map +7 -0
- package/dist/primitives-v2/Tag.js +61 -0
- package/dist/primitives-v2/Tag.js.map +7 -0
- package/dist/primitives-v2/Tag.stories.js +121 -0
- package/dist/primitives-v2/Tag.stories.js.map +7 -0
- package/dist/primitives-v2/Toggle.js +72 -0
- package/dist/primitives-v2/Toggle.js.map +7 -0
- package/dist/primitives-v2/Toggle.stories.js +34 -0
- package/dist/primitives-v2/Toggle.stories.js.map +7 -0
- package/dist/primitives-v2/Topbar.js +24 -0
- package/dist/primitives-v2/Topbar.js.map +7 -0
- package/dist/primitives-v2/Topbar.stories.js +58 -0
- package/dist/primitives-v2/Topbar.stories.js.map +7 -0
- package/dist/primitives-v2/index.js +41 -0
- package/dist/primitives-v2/index.js.map +7 -0
- package/dist/primitives-v2/utils.js +7 -0
- package/dist/primitives-v2/utils.js.map +7 -0
- package/dist/theme/BrandThemeProvider.js +49 -0
- package/dist/theme/BrandThemeProvider.js.map +7 -0
- package/dist/theme/QueryProvider.js +44 -0
- package/dist/theme/QueryProvider.js.map +7 -0
- package/dist/theme/ThemeProvider.js +96 -0
- package/dist/theme/ThemeProvider.js.map +7 -0
- package/dist/theme/ThemeToggle.js +88 -0
- package/dist/theme/ThemeToggle.js.map +7 -0
- package/dist/theme/index.js +12 -0
- package/dist/theme/index.js.map +7 -0
- package/dist/theme/m3.css.js +2 -0
- package/dist/theme/tokens.v2.css.js +2 -0
- package/dist/theme/typography.css.js +2 -0
- package/dist/theme/typography.stories.js +123 -0
- package/dist/theme/typography.stories.js.map +7 -0
- package/dist/theme/typography.tokens.js +281 -0
- package/dist/theme/typography.tokens.js.map +7 -0
- package/dist/types/react-big-calendar.d.js +1 -0
- package/dist/types/react-big-calendar.d.js.map +7 -0
- package/package.json +411 -0
- package/src/backend/AppShell.tsx +1606 -0
- package/src/backend/BackendChromeProvider.tsx +99 -0
- package/src/backend/BackendPageSurface.tsx +57 -0
- package/src/backend/CollapsibleNavSection.tsx +201 -0
- package/src/backend/ContextHelp.tsx +40 -0
- package/src/backend/CrudForm.tsx +3796 -0
- package/src/backend/DataTable.tsx +2584 -0
- package/src/backend/EmptyState.tsx +65 -0
- package/src/backend/FilterBar.tsx +171 -0
- package/src/backend/FilterOverlay.tsx +388 -0
- package/src/backend/FlashMessages.tsx +189 -0
- package/src/backend/HtmlRichTextEditor.tsx +124 -0
- package/src/backend/IntegrationsButton.tsx +29 -0
- package/src/backend/JsonBuilder.tsx +359 -0
- package/src/backend/JsonDisplay.tsx +258 -0
- package/src/backend/NextStepCallout.tsx +134 -0
- package/src/backend/Page.tsx +30 -0
- package/src/backend/PerspectiveSidebar.tsx +506 -0
- package/src/backend/ProfileDropdown.tsx +369 -0
- package/src/backend/RowActions.tsx +158 -0
- package/src/backend/SectionHeader.tsx +119 -0
- package/src/backend/SettingsButton.tsx +28 -0
- package/src/backend/Sidebar.stories.tsx +183 -0
- package/src/backend/Sidebar.tsx +737 -0
- package/src/backend/TruncatedCell.tsx +133 -0
- package/src/backend/UserMenu.tsx +153 -0
- package/src/backend/ValueIcons.tsx +48 -0
- package/src/backend/WebhookSetupGuide.tsx +127 -0
- package/src/backend/__tests__/AppShell.test.tsx +392 -0
- package/src/backend/__tests__/CrudForm.custom-fields.test.tsx +180 -0
- package/src/backend/__tests__/CrudForm.datetime.test.tsx +95 -0
- package/src/backend/__tests__/CrudForm.defaults.test.tsx +195 -0
- package/src/backend/__tests__/CrudForm.navigation.test.tsx +156 -0
- package/src/backend/__tests__/CrudForm.render.test.tsx +146 -0
- package/src/backend/__tests__/CrudForm.transformData.test.tsx +231 -0
- package/src/backend/__tests__/CrudForm.unsavedNavigation.test.tsx +145 -0
- package/src/backend/__tests__/CrudForm.validation.test.tsx +178 -0
- package/src/backend/__tests__/CustomDataSection.test.tsx +465 -0
- package/src/backend/__tests__/DataTable.extensions.test.tsx +339 -0
- package/src/backend/__tests__/DataTable.namespaces.test.ts +32 -0
- package/src/backend/__tests__/DataTable.render.test.tsx +48 -0
- package/src/backend/__tests__/FieldDefinitionsEditor.test.tsx +64 -0
- package/src/backend/__tests__/FlashMessages.test.tsx +105 -0
- package/src/backend/__tests__/FormHeader.test.tsx +81 -0
- package/src/backend/__tests__/NotificationDispatcher.test.ts +172 -0
- package/src/backend/__tests__/VersionHistoryPanel.test.tsx +109 -0
- package/src/backend/__tests__/component-replacement.test.tsx +270 -0
- package/src/backend/__tests__/custom-field-filters.test.ts +72 -0
- package/src/backend/__tests__/custom-field-forms.test.ts +54 -0
- package/src/backend/__tests__/nav-utils.test.ts +175 -0
- package/src/backend/__tests__/serverErrors.test.ts +83 -0
- package/src/backend/__tests__/useAuditPermissions.test.tsx +51 -0
- package/src/backend/__tests__/useNotifications.strategy.test.ts +58 -0
- package/src/backend/__tests__/useProgress.strategy.test.ts +62 -0
- package/src/backend/charts/BarChart.tsx +208 -0
- package/src/backend/charts/ChartUtils.tsx +196 -0
- package/src/backend/charts/ComboChart.stories.tsx +103 -0
- package/src/backend/charts/ComboChart.tsx +350 -0
- package/src/backend/charts/KpiCard.tsx +155 -0
- package/src/backend/charts/LineChart.tsx +207 -0
- package/src/backend/charts/PieChart.tsx +157 -0
- package/src/backend/charts/ScatterChart.tsx +498 -0
- package/src/backend/charts/TopNTable.tsx +141 -0
- package/src/backend/charts/WaterfallChart.tsx +213 -0
- package/src/backend/charts/index.ts +21 -0
- package/src/backend/columns/ColumnChooserPanel.tsx +293 -0
- package/src/backend/confirm-dialog/ConfirmDialog.tsx +275 -0
- package/src/backend/confirm-dialog/index.ts +7 -0
- package/src/backend/confirm-dialog/useConfirmDialog.tsx +146 -0
- package/src/backend/custom-fields/FieldDefinitionsEditor.tsx +1413 -0
- package/src/backend/custom-fields/FieldDefinitionsManager.tsx +381 -0
- package/src/backend/dashboard/DashboardScreen.tsx +706 -0
- package/src/backend/dashboard/__tests__/DashboardScreen.test.tsx +114 -0
- package/src/backend/dashboard/index.ts +1 -0
- package/src/backend/dashboard/widgetRegistry.ts +68 -0
- package/src/backend/date-range/DateRangeSelect.tsx +50 -0
- package/src/backend/date-range/InlineDateRangeSelect.tsx +52 -0
- package/src/backend/date-range/InlineGranularitySelect.tsx +63 -0
- package/src/backend/date-range/__tests__/dateRanges.test.ts +224 -0
- package/src/backend/date-range/dateRanges.ts +218 -0
- package/src/backend/date-range/index.ts +15 -0
- package/src/backend/detail/AccessDeniedMessage.tsx +32 -0
- package/src/backend/detail/ActivitiesSection.tsx +1261 -0
- package/src/backend/detail/AddressEditor.tsx +479 -0
- package/src/backend/detail/AddressTiles.tsx +591 -0
- package/src/backend/detail/AddressesSection.tsx +362 -0
- package/src/backend/detail/AttachmentDeleteDialog.tsx +56 -0
- package/src/backend/detail/AttachmentMetadataDialog.tsx +674 -0
- package/src/backend/detail/AttachmentVisualPreview.tsx +155 -0
- package/src/backend/detail/AttachmentsSection.tsx +327 -0
- package/src/backend/detail/CustomDataSection.tsx +700 -0
- package/src/backend/detail/DetailFieldsSection.tsx +163 -0
- package/src/backend/detail/ErrorMessage.tsx +32 -0
- package/src/backend/detail/InlineEditors.tsx +894 -0
- package/src/backend/detail/LoadingMessage.tsx +14 -0
- package/src/backend/detail/NotesSection.tsx +1266 -0
- package/src/backend/detail/TabEmptyState.tsx +48 -0
- package/src/backend/detail/TagsSection.tsx +470 -0
- package/src/backend/detail/__tests__/InlineEditors.test.tsx +59 -0
- package/src/backend/detail/addressFormat.tsx +121 -0
- package/src/backend/detail/index.ts +46 -0
- package/src/backend/devtools/UmesDevToolsPanel.tsx +122 -0
- package/src/backend/devtools/components/ConflictWarnings.tsx +36 -0
- package/src/backend/devtools/components/EnricherTiming.tsx +50 -0
- package/src/backend/devtools/components/EventFlow.tsx +45 -0
- package/src/backend/devtools/components/ExtensionPointList.tsx +59 -0
- package/src/backend/devtools/components/InterceptorActivity.tsx +48 -0
- package/src/backend/devtools/index.ts +2 -0
- package/src/backend/devtools/useUmesDevTools.ts +188 -0
- package/src/backend/document-viewer/RegionOverlay.tsx +150 -0
- package/src/backend/document-viewer/index.ts +2 -0
- package/src/backend/dynamic-grid/DynamicGrid.tsx +161 -0
- package/src/backend/dynamic-grid/adapters.ts +57 -0
- package/src/backend/dynamic-grid/components/GridCell.tsx +194 -0
- package/src/backend/dynamic-grid/components/GridRow.tsx +40 -0
- package/src/backend/dynamic-grid/hooks/useGridKeyboardNav.ts +134 -0
- package/src/backend/dynamic-grid/index.ts +4 -0
- package/src/backend/dynamic-grid/types.ts +55 -0
- package/src/backend/dynamic-table/DynamicTable.stories.tsx +274 -0
- package/src/backend/dynamic-table/DynamicTable.tsx +4419 -0
- package/src/backend/dynamic-table/README.md +1199 -0
- package/src/backend/dynamic-table/URL_FILTERING.md +217 -0
- package/src/backend/dynamic-table/__e2e__/GridHarness.ts +1155 -0
- package/src/backend/dynamic-table/__e2e__/SplitViewHarness.ts +366 -0
- package/src/backend/dynamic-table/__tests__/BulkActionsBar.test.tsx +143 -0
- package/src/backend/dynamic-table/__tests__/ColumnQuickFilter.test.tsx +607 -0
- package/src/backend/dynamic-table/__tests__/ConfigureViewFilters.suggestions.test.tsx +177 -0
- package/src/backend/dynamic-table/__tests__/ConfigureViewFormatting.test.tsx +125 -0
- package/src/backend/dynamic-table/__tests__/ConfigureViewFormulas.test.tsx +228 -0
- package/src/backend/dynamic-table/__tests__/ConfigureViewGrouping.aggregations.test.tsx +131 -0
- package/src/backend/dynamic-table/__tests__/ConfigureViewPanel.baseView.test.tsx +162 -0
- package/src/backend/dynamic-table/__tests__/ConfigureViewPanel.focus.test.tsx +54 -0
- package/src/backend/dynamic-table/__tests__/ConfigureViewPanel.sections.test.tsx +142 -0
- package/src/backend/dynamic-table/__tests__/ConfigureViewRollups.test.tsx +228 -0
- package/src/backend/dynamic-table/__tests__/ContextMenu.test.tsx +89 -0
- package/src/backend/dynamic-table/__tests__/DynamicTable.density.test.tsx +299 -0
- package/src/backend/dynamic-table/__tests__/DynamicTable.exportTruncation.test.tsx +145 -0
- package/src/backend/dynamic-table/__tests__/DynamicTable.loadError.test.tsx +173 -0
- package/src/backend/dynamic-table/__tests__/DynamicTable.wiring.test.tsx +357 -0
- package/src/backend/dynamic-table/__tests__/EmptyState.test.tsx +70 -0
- package/src/backend/dynamic-table/__tests__/ExportMenu.test.tsx +82 -0
- package/src/backend/dynamic-table/__tests__/FooterTotalsRow.test.tsx +154 -0
- package/src/backend/dynamic-table/__tests__/GroupSummaryRow.render.test.tsx +131 -0
- package/src/backend/dynamic-table/__tests__/LoadErrorState.test.tsx +74 -0
- package/src/backend/dynamic-table/__tests__/MentionPopup.search.test.tsx +127 -0
- package/src/backend/dynamic-table/__tests__/PerspectiveTabs.test.tsx +170 -0
- package/src/backend/dynamic-table/__tests__/RowHeaderCell.selection.test.tsx +80 -0
- package/src/backend/dynamic-table/__tests__/abbreviationsSubscription.test.ts +171 -0
- package/src/backend/dynamic-table/__tests__/aggregate.spec.test.ts +224 -0
- package/src/backend/dynamic-table/__tests__/aggregateDimension.test.tsx +191 -0
- package/src/backend/dynamic-table/__tests__/anchoredPosition.test.ts +88 -0
- package/src/backend/dynamic-table/__tests__/badgeAutoFit.test.ts +121 -0
- package/src/backend/dynamic-table/__tests__/cellHandlers.save.test.ts +282 -0
- package/src/backend/dynamic-table/__tests__/cellWrites.test.ts +274 -0
- package/src/backend/dynamic-table/__tests__/clipboard.test.ts +230 -0
- package/src/backend/dynamic-table/__tests__/coerceCellValue.test.ts +117 -0
- package/src/backend/dynamic-table/__tests__/colorAdjacency.test.ts +151 -0
- package/src/backend/dynamic-table/__tests__/columnFill.test.ts +66 -0
- package/src/backend/dynamic-table/__tests__/columnHeaderHandlers.sort.test.ts +100 -0
- package/src/backend/dynamic-table/__tests__/columnHeaderReorder.test.tsx +209 -0
- package/src/backend/dynamic-table/__tests__/columnReorderPersistence.test.tsx +127 -0
- package/src/backend/dynamic-table/__tests__/columnVirtualization.render.test.tsx +420 -0
- package/src/backend/dynamic-table/__tests__/columnVisibilityPersistence.test.tsx +136 -0
- package/src/backend/dynamic-table/__tests__/columnWindow.test.ts +643 -0
- package/src/backend/dynamic-table/__tests__/commentAudience.test.tsx +137 -0
- package/src/backend/dynamic-table/__tests__/commentScope.test.tsx +214 -0
- package/src/backend/dynamic-table/__tests__/conditionalFormat.test.ts +175 -0
- package/src/backend/dynamic-table/__tests__/contentRegistry.test.ts +267 -0
- package/src/backend/dynamic-table/__tests__/dateWindows.test.ts +149 -0
- package/src/backend/dynamic-table/__tests__/density.test.ts +204 -0
- package/src/backend/dynamic-table/__tests__/exportTable.test.ts +146 -0
- package/src/backend/dynamic-table/__tests__/fillGeometry.test.ts +201 -0
- package/src/backend/dynamic-table/__tests__/fillPatterns.test.ts +272 -0
- package/src/backend/dynamic-table/__tests__/filterParser.presets.test.ts +64 -0
- package/src/backend/dynamic-table/__tests__/filterParser.relative.test.ts +109 -0
- package/src/backend/dynamic-table/__tests__/filterSuggestions.test.ts +152 -0
- package/src/backend/dynamic-table/__tests__/formatAggregate.test.ts +99 -0
- package/src/backend/dynamic-table/__tests__/formatDateCompact.test.ts +489 -0
- package/src/backend/dynamic-table/__tests__/formatLabelCompact.test.ts +717 -0
- package/src/backend/dynamic-table/__tests__/formula.check.test.ts +257 -0
- package/src/backend/dynamic-table/__tests__/formula.evaluate.test.ts +274 -0
- package/src/backend/dynamic-table/__tests__/formula.functions.test.ts +226 -0
- package/src/backend/dynamic-table/__tests__/formula.noEval.test.ts +92 -0
- package/src/backend/dynamic-table/__tests__/formula.parse.test.ts +233 -0
- package/src/backend/dynamic-table/__tests__/formulaColumns.test.tsx +213 -0
- package/src/backend/dynamic-table/__tests__/handlerIdentity.test.ts +77 -0
- package/src/backend/dynamic-table/__tests__/importMapping.test.ts +174 -0
- package/src/backend/dynamic-table/__tests__/importParse.test.ts +130 -0
- package/src/backend/dynamic-table/__tests__/importServerOnly.test.ts +37 -0
- package/src/backend/dynamic-table/__tests__/layoutPersistence.test.ts +372 -0
- package/src/backend/dynamic-table/__tests__/mouseHandlers.doubleClick.test.ts +155 -0
- package/src/backend/dynamic-table/__tests__/perspectivePersonalization.test.ts +188 -0
- package/src/backend/dynamic-table/__tests__/perspectiveResolver.test.ts +133 -0
- package/src/backend/dynamic-table/__tests__/perspectiveState.defaultGrouping.test.ts +306 -0
- package/src/backend/dynamic-table/__tests__/perspectiveState.defaults.test.ts +107 -0
- package/src/backend/dynamic-table/__tests__/perspectiveTemplates.test.tsx +269 -0
- package/src/backend/dynamic-table/__tests__/perspectiveTransforms.aggregations.test.ts +105 -0
- package/src/backend/dynamic-table/__tests__/perspectiveTransforms.conditionalFormats.test.ts +107 -0
- package/src/backend/dynamic-table/__tests__/perspectiveTransforms.dateFormat.test.ts +61 -0
- package/src/backend/dynamic-table/__tests__/perspectiveTransforms.formulas.test.ts +85 -0
- package/src/backend/dynamic-table/__tests__/perspectiveTransforms.frozenColumns.test.ts +124 -0
- package/src/backend/dynamic-table/__tests__/rollupColumns.test.ts +149 -0
- package/src/backend/dynamic-table/__tests__/sharedCriteria.test.ts +255 -0
- package/src/backend/dynamic-table/__tests__/splitViewTree.test.ts +324 -0
- package/src/backend/dynamic-table/__tests__/store.clipboardMarker.test.ts +143 -0
- package/src/backend/dynamic-table/__tests__/store.fillPreview.test.ts +168 -0
- package/src/backend/dynamic-table/__tests__/store.mutations.test.ts +345 -0
- package/src/backend/dynamic-table/__tests__/store.selection.test.ts +157 -0
- package/src/backend/dynamic-table/__tests__/store.undo.test.ts +225 -0
- package/src/backend/dynamic-table/__tests__/store.valueSource.test.tsx +204 -0
- package/src/backend/dynamic-table/__tests__/useAnnotations.legacyOptions.test.tsx +58 -0
- package/src/backend/dynamic-table/__tests__/useColumnVirtualizer.test.ts +290 -0
- package/src/backend/dynamic-table/__tests__/useDensityPreference.test.ts +435 -0
- package/src/backend/dynamic-table/__tests__/useDynamicTablePage.duplicate.test.tsx +99 -0
- package/src/backend/dynamic-table/__tests__/useDynamicTablePage.export.test.tsx +281 -0
- package/src/backend/dynamic-table/__tests__/useDynamicTablePage.personalization.test.tsx +313 -0
- package/src/backend/dynamic-table/__tests__/useDynamicTablePage.perspectiveRestore.test.tsx +126 -0
- package/src/backend/dynamic-table/__tests__/useGrouping.aggregations.test.ts +158 -0
- package/src/backend/dynamic-table/__tests__/useGrouping.groupKey.test.ts +58 -0
- package/src/backend/dynamic-table/__tests__/useKeyboardNavigation.test.ts +594 -0
- package/src/backend/dynamic-table/__tests__/useStickyOffsets.memo.test.tsx +75 -0
- package/src/backend/dynamic-table/__tests__/useStickyOffsets.test.ts +106 -0
- package/src/backend/dynamic-table/__tests__/widgetPane.test.tsx +338 -0
- package/src/backend/dynamic-table/components/ActiveFilterChips.tsx +109 -0
- package/src/backend/dynamic-table/components/BulkActionsBar.tsx +89 -0
- package/src/backend/dynamic-table/components/Cell.tsx +292 -0
- package/src/backend/dynamic-table/components/CellCommentDialog.tsx +887 -0
- package/src/backend/dynamic-table/components/CellCommentHoverPopup.tsx +94 -0
- package/src/backend/dynamic-table/components/ColumnFilterPopover.tsx +775 -0
- package/src/backend/dynamic-table/components/ColumnHeaderMenu.tsx +189 -0
- package/src/backend/dynamic-table/components/ColumnHeaders.tsx +867 -0
- package/src/backend/dynamic-table/components/CompactLabelCell.tsx +293 -0
- package/src/backend/dynamic-table/components/ConfigureViewFields.tsx +173 -0
- package/src/backend/dynamic-table/components/ConfigureViewFilters.tsx +346 -0
- package/src/backend/dynamic-table/components/ConfigureViewFormatting.tsx +205 -0
- package/src/backend/dynamic-table/components/ConfigureViewFormulas.tsx +423 -0
- package/src/backend/dynamic-table/components/ConfigureViewGrouping.tsx +264 -0
- package/src/backend/dynamic-table/components/ConfigureViewLinkedColumns.tsx +249 -0
- package/src/backend/dynamic-table/components/ConfigureViewPanel.tsx +857 -0
- package/src/backend/dynamic-table/components/ConfigureViewRollups.tsx +364 -0
- package/src/backend/dynamic-table/components/ConfigureViewSorting.tsx +121 -0
- package/src/backend/dynamic-table/components/ContextMenu.tsx +140 -0
- package/src/backend/dynamic-table/components/DateCell.tsx +205 -0
- package/src/backend/dynamic-table/components/Debugger.tsx +340 -0
- package/src/backend/dynamic-table/components/DensityControl.tsx +441 -0
- package/src/backend/dynamic-table/components/EmptyState.tsx +103 -0
- package/src/backend/dynamic-table/components/EntitySearchEditor.tsx +528 -0
- package/src/backend/dynamic-table/components/ExportMenu.tsx +90 -0
- package/src/backend/dynamic-table/components/FilterDatePicker.tsx +194 -0
- package/src/backend/dynamic-table/components/FilterValueInput.tsx +294 -0
- package/src/backend/dynamic-table/components/FooterTotalsRow.tsx +291 -0
- package/src/backend/dynamic-table/components/FullscreenOverlay.tsx +66 -0
- package/src/backend/dynamic-table/components/GroupHeaderRow.tsx +136 -0
- package/src/backend/dynamic-table/components/GroupSummaryRow.tsx +184 -0
- package/src/backend/dynamic-table/components/ImportPanel.tsx +445 -0
- package/src/backend/dynamic-table/components/ImportPreviewGrid.tsx +155 -0
- package/src/backend/dynamic-table/components/LoadErrorState.tsx +70 -0
- package/src/backend/dynamic-table/components/MentionPopup.tsx +224 -0
- package/src/backend/dynamic-table/components/PerspectiveDeleteDialog.tsx +96 -0
- package/src/backend/dynamic-table/components/PerspectivePublishDialog.tsx +152 -0
- package/src/backend/dynamic-table/components/PerspectiveTabMenu.tsx +215 -0
- package/src/backend/dynamic-table/components/PerspectiveTabs.tsx +426 -0
- package/src/backend/dynamic-table/components/PerspectiveTemplateMenu.tsx +135 -0
- package/src/backend/dynamic-table/components/RowHeaderCell.tsx +73 -0
- package/src/backend/dynamic-table/components/SearchBar.tsx +309 -0
- package/src/backend/dynamic-table/components/SelectMenu.tsx +237 -0
- package/src/backend/dynamic-table/components/StaleDataBar.tsx +74 -0
- package/src/backend/dynamic-table/components/TableDeleteDialog.tsx +74 -0
- package/src/backend/dynamic-table/components/TablePagination.tsx +96 -0
- package/src/backend/dynamic-table/components/TableSkeleton.tsx +123 -0
- package/src/backend/dynamic-table/components/ToolbarOverflow.tsx +284 -0
- package/src/backend/dynamic-table/components/ViewModeSwitch.tsx +92 -0
- package/src/backend/dynamic-table/components/VirtualRow.tsx +346 -0
- package/src/backend/dynamic-table/components/editors.tsx +1727 -0
- package/src/backend/dynamic-table/components/renderers.tsx +162 -0
- package/src/backend/dynamic-table/events/events.ts +107 -0
- package/src/backend/dynamic-table/formula/check.ts +359 -0
- package/src/backend/dynamic-table/formula/evaluate.ts +473 -0
- package/src/backend/dynamic-table/formula/functions.ts +737 -0
- package/src/backend/dynamic-table/formula/index.ts +57 -0
- package/src/backend/dynamic-table/formula/parse.ts +414 -0
- package/src/backend/dynamic-table/formula/types.ts +151 -0
- package/src/backend/dynamic-table/handlers/cellWrites.ts +362 -0
- package/src/backend/dynamic-table/handlers/index.ts +789 -0
- package/src/backend/dynamic-table/handlers/perspectiveHandlers.ts +684 -0
- package/src/backend/dynamic-table/hooks/index.ts +888 -0
- package/src/backend/dynamic-table/hooks/useAbbreviations.ts +67 -0
- package/src/backend/dynamic-table/hooks/useAnnotations.ts +215 -0
- package/src/backend/dynamic-table/hooks/useColumnVirtualizer.ts +303 -0
- package/src/backend/dynamic-table/hooks/useColumnWidthPersistence.ts +214 -0
- package/src/backend/dynamic-table/hooks/useDensityPreference.ts +451 -0
- package/src/backend/dynamic-table/hooks/useDynamicTablePage.tsx +1681 -0
- package/src/backend/dynamic-table/hooks/useEscapeLayer.ts +72 -0
- package/src/backend/dynamic-table/hooks/useGrouping.ts +428 -0
- package/src/backend/dynamic-table/hooks/useSuggestionFetch.ts +109 -0
- package/src/backend/dynamic-table/hooks/useTableDateFormat.tsx +19 -0
- package/src/backend/dynamic-table/index.ts +497 -0
- package/src/backend/dynamic-table/registry/ContentRegistryContext.tsx +244 -0
- package/src/backend/dynamic-table/registry/TableRegistryContext.tsx +84 -0
- package/src/backend/dynamic-table/registry/filterAccessibleTables.ts +36 -0
- package/src/backend/dynamic-table/registry/index.ts +38 -0
- package/src/backend/dynamic-table/registry/lazyTable.tsx +80 -0
- package/src/backend/dynamic-table/registry/types.ts +181 -0
- package/src/backend/dynamic-table/registry/widgetCatalog.ts +226 -0
- package/src/backend/dynamic-table/server/aggregate.ts +474 -0
- package/src/backend/dynamic-table/server/dateWindows.ts +201 -0
- package/src/backend/dynamic-table/server/filterParser.ts +132 -0
- package/src/backend/dynamic-table/server/filterSuggestions.ts +150 -0
- package/src/backend/dynamic-table/server/index.ts +47 -0
- package/src/backend/dynamic-table/server/makeDynamicTableRoute.ts +426 -0
- package/src/backend/dynamic-table/split-view/ContentPicker.tsx +251 -0
- package/src/backend/dynamic-table/split-view/EmptySlot.tsx +69 -0
- package/src/backend/dynamic-table/split-view/SplitViewHost.tsx +1336 -0
- package/src/backend/dynamic-table/split-view/WidgetPane.tsx +390 -0
- package/src/backend/dynamic-table/split-view/WorkspaceFilterBar.tsx +728 -0
- package/src/backend/dynamic-table/split-view/index.ts +48 -0
- package/src/backend/dynamic-table/split-view/layoutPersistence.ts +185 -0
- package/src/backend/dynamic-table/split-view/sharedCriteria.ts +196 -0
- package/src/backend/dynamic-table/split-view/types.ts +778 -0
- package/src/backend/dynamic-table/split-view/useSplitViewLayouts.ts +97 -0
- package/src/backend/dynamic-table/store/index.ts +1011 -0
- package/src/backend/dynamic-table/styles/ContextMenu.css +387 -0
- package/src/backend/dynamic-table/styles/DynamicTable.css +3659 -0
- package/src/backend/dynamic-table/styles/DynamicTable.v2.css +2651 -0
- package/src/backend/dynamic-table/styles/SearchBar.css +426 -0
- package/src/backend/dynamic-table/styles/dateCell.css +146 -0
- package/src/backend/dynamic-table/styles/density.css +690 -0
- package/src/backend/dynamic-table/types/density.ts +179 -0
- package/src/backend/dynamic-table/types/filters.ts +156 -0
- package/src/backend/dynamic-table/types/grouping.ts +189 -0
- package/src/backend/dynamic-table/types/import.ts +132 -0
- package/src/backend/dynamic-table/types/index.ts +1198 -0
- package/src/backend/dynamic-table/types/perspective.ts +436 -0
- package/src/backend/dynamic-table/types/rollup.ts +111 -0
- package/src/backend/dynamic-table/utils/abbreviations.ts +556 -0
- package/src/backend/dynamic-table/utils/anchoredPosition.ts +106 -0
- package/src/backend/dynamic-table/utils/badgeAutoFit.ts +108 -0
- package/src/backend/dynamic-table/utils/clipboard.ts +294 -0
- package/src/backend/dynamic-table/utils/coerceCellValue.ts +96 -0
- package/src/backend/dynamic-table/utils/colorAdjacency.ts +87 -0
- package/src/backend/dynamic-table/utils/columnFill.ts +93 -0
- package/src/backend/dynamic-table/utils/columnSpacerStyle.ts +53 -0
- package/src/backend/dynamic-table/utils/columnWindow.ts +668 -0
- package/src/backend/dynamic-table/utils/conditionalFormat.ts +300 -0
- package/src/backend/dynamic-table/utils/exportTable.ts +140 -0
- package/src/backend/dynamic-table/utils/fillGeometry.ts +187 -0
- package/src/backend/dynamic-table/utils/fillPatterns.ts +422 -0
- package/src/backend/dynamic-table/utils/formatAggregate.ts +145 -0
- package/src/backend/dynamic-table/utils/formatDateCompact.ts +879 -0
- package/src/backend/dynamic-table/utils/formatLabelCompact.ts +640 -0
- package/src/backend/dynamic-table/utils/formulaColumns.tsx +237 -0
- package/src/backend/dynamic-table/utils/importMapping.ts +202 -0
- package/src/backend/dynamic-table/utils/importParse.ts +220 -0
- package/src/backend/dynamic-table/utils/lookupColumns.tsx +47 -0
- package/src/backend/dynamic-table/utils/perspectiveTransforms.ts +368 -0
- package/src/backend/dynamic-table/utils/rollupColumns.ts +162 -0
- package/src/backend/dynamic-table/validators/index.ts +40 -0
- package/src/backend/fields/registry.generated.ts +8 -0
- package/src/backend/fields/registry.ts +38 -0
- package/src/backend/filters/AdvancedFilterBuilder.tsx +339 -0
- package/src/backend/forms/ActionsDropdown.tsx +198 -0
- package/src/backend/forms/FormActionButtons.tsx +98 -0
- package/src/backend/forms/FormFooter.tsx +27 -0
- package/src/backend/forms/FormHeader.tsx +204 -0
- package/src/backend/forms/index.ts +4 -0
- package/src/backend/hooks/useAdvancedFilter.ts +77 -0
- package/src/backend/indexes/PartialIndexBanner.tsx +86 -0
- package/src/backend/indexes/store.ts +88 -0
- package/src/backend/injection/ComponentOverrideProvider.tsx +66 -0
- package/src/backend/injection/InjectedField.tsx +196 -0
- package/src/backend/injection/InjectionSpot.tsx +457 -0
- package/src/backend/injection/InjectionWizard.tsx +335 -0
- package/src/backend/injection/PageInjectionBoundary.tsx +31 -0
- package/src/backend/injection/SseEventIndicator.tsx +11 -0
- package/src/backend/injection/StatusBadgeInjectionSpot.tsx +50 -0
- package/src/backend/injection/StatusBadgeRenderer.tsx +100 -0
- package/src/backend/injection/WidgetSharedState.ts +58 -0
- package/src/backend/injection/WizardInjectionSpot.tsx +46 -0
- package/src/backend/injection/eventBridge.ts +158 -0
- package/src/backend/injection/helpers.ts +35 -0
- package/src/backend/injection/mergeMenuItems.ts +80 -0
- package/src/backend/injection/mutationEvents.ts +22 -0
- package/src/backend/injection/resolveInjectedIcon.tsx +30 -0
- package/src/backend/injection/spotIds.ts +64 -0
- package/src/backend/injection/useAppEvent.ts +76 -0
- package/src/backend/injection/useGuardedMutation.ts +101 -0
- package/src/backend/injection/useInjectedMenuItems.ts +67 -0
- package/src/backend/injection/useInjectionDataWidgets.ts +41 -0
- package/src/backend/injection/useOperationProgress.ts +105 -0
- package/src/backend/injection/useRegisteredComponent.tsx +106 -0
- package/src/backend/injection/useWidgetSharedState.ts +28 -0
- package/src/backend/injection/visibility-utils.ts +31 -0
- package/src/backend/injection/widgetRegistry.ts +68 -0
- package/src/backend/inputs/ComboboxInput.tsx +272 -0
- package/src/backend/inputs/DatePicker.tsx +162 -0
- package/src/backend/inputs/DateTimePicker.tsx +199 -0
- package/src/backend/inputs/EventPatternInput.tsx +46 -0
- package/src/backend/inputs/EventSelect.tsx +183 -0
- package/src/backend/inputs/LookupSelect.tsx +253 -0
- package/src/backend/inputs/PhoneNumberField.tsx +166 -0
- package/src/backend/inputs/SwitchableMarkdownInput.tsx +106 -0
- package/src/backend/inputs/TagsInput.tsx +297 -0
- package/src/backend/inputs/TimeInput.tsx +146 -0
- package/src/backend/inputs/TimePicker.tsx +120 -0
- package/src/backend/inputs/__tests__/DatePicker.test.tsx +76 -0
- package/src/backend/inputs/__tests__/DateTimePicker.logic.test.ts +126 -0
- package/src/backend/inputs/__tests__/PhoneNumberField.test.tsx +73 -0
- package/src/backend/inputs/__tests__/TagsInput.test.tsx +78 -0
- package/src/backend/inputs/__tests__/TimeInput.test.tsx +134 -0
- package/src/backend/inputs/__tests__/TimePicker.test.tsx +50 -0
- package/src/backend/inputs/index.ts +11 -0
- package/src/backend/markdown/MarkdownContent.tsx +33 -0
- package/src/backend/markdown/index.ts +2 -0
- package/src/backend/markdown/useMarkdownRemarkPlugins.ts +39 -0
- package/src/backend/messages/MessageComposer.tsx +197 -0
- package/src/backend/messages/MessageObjectDetail.tsx +95 -0
- package/src/backend/messages/MessageObjectPreview.tsx +64 -0
- package/src/backend/messages/MessageObjectRecordPicker.tsx +149 -0
- package/src/backend/messages/MessagePrioritySelector.tsx +78 -0
- package/src/backend/messages/MessagesIcon.tsx +32 -0
- package/src/backend/messages/SendObjectMessageDialog.tsx +74 -0
- package/src/backend/messages/__tests__/MessageComposer.test.tsx +350 -0
- package/src/backend/messages/__tests__/SendObjectMessageDialog.test.tsx +77 -0
- package/src/backend/messages/index.ts +22 -0
- package/src/backend/messages/message-compose-form-groups.tsx +383 -0
- package/src/backend/messages/message-composer.types.ts +82 -0
- package/src/backend/messages/message-priority.ts +53 -0
- package/src/backend/messages/useMessageCompose.ts +666 -0
- package/src/backend/messages/useMessageComposeOperations.ts +259 -0
- package/src/backend/messages/useMessagesPoll.ts +118 -0
- package/src/backend/notifications/NotificationBell.tsx +91 -0
- package/src/backend/notifications/NotificationCountBadge.tsx +14 -0
- package/src/backend/notifications/NotificationDispatcher.ts +213 -0
- package/src/backend/notifications/NotificationItem.tsx +262 -0
- package/src/backend/notifications/NotificationPanel.tsx +225 -0
- package/src/backend/notifications/__tests__/NotificationCountBadge.test.tsx +34 -0
- package/src/backend/notifications/index.ts +20 -0
- package/src/backend/notifications/useNotificationActions.ts +161 -0
- package/src/backend/notifications/useNotificationEffect.ts +17 -0
- package/src/backend/notifications/useNotifications.ts +12 -0
- package/src/backend/notifications/useNotificationsPoll.ts +167 -0
- package/src/backend/notifications/useNotificationsSse.ts +220 -0
- package/src/backend/operations/LastOperationBanner.tsx +85 -0
- package/src/backend/operations/__tests__/LastOperationBanner.test.tsx +101 -0
- package/src/backend/operations/store.ts +230 -0
- package/src/backend/progress/ProgressTopBar.tsx +189 -0
- package/src/backend/progress/useProgress.ts +12 -0
- package/src/backend/progress/useProgressPoll.ts +100 -0
- package/src/backend/progress/useProgressSse.ts +118 -0
- package/src/backend/schedule/ScheduleAgenda.tsx +136 -0
- package/src/backend/schedule/ScheduleGrid.tsx +136 -0
- package/src/backend/schedule/ScheduleToolbar.tsx +178 -0
- package/src/backend/schedule/ScheduleView.tsx +201 -0
- package/src/backend/schedule/index.ts +5 -0
- package/src/backend/schedule/recurrence.ts +99 -0
- package/src/backend/schedule/types.ts +26 -0
- package/src/backend/section-page/SectionNav.tsx +140 -0
- package/src/backend/section-page/SectionPage.tsx +34 -0
- package/src/backend/section-page/index.ts +3 -0
- package/src/backend/section-page/types.ts +30 -0
- package/src/backend/settings/SettingsNavigation.tsx +74 -0
- package/src/backend/settings/SettingsPageWrapper.tsx +78 -0
- package/src/backend/settings/index.ts +3 -0
- package/src/backend/upgrades/UpgradeActionBanner.tsx +128 -0
- package/src/backend/utils/__tests__/api.scoped-headers.test.ts +58 -0
- package/src/backend/utils/__tests__/api.test.ts +148 -0
- package/src/backend/utils/__tests__/apiCall.scoped-request-headers.test.ts +58 -0
- package/src/backend/utils/__tests__/apiCall.test.ts +109 -0
- package/src/backend/utils/__tests__/crud.test.ts +87 -0
- package/src/backend/utils/__tests__/customFieldDefs.test.ts +25 -0
- package/src/backend/utils/__tests__/customFieldValues.test.ts +35 -0
- package/src/backend/utils/__tests__/richTextSanitizer.test.ts +57 -0
- package/src/backend/utils/api.ts +214 -0
- package/src/backend/utils/apiCall.ts +123 -0
- package/src/backend/utils/crud.ts +174 -0
- package/src/backend/utils/customFieldColumns.ts +118 -0
- package/src/backend/utils/customFieldDefs.ts +247 -0
- package/src/backend/utils/customFieldFilters.ts +174 -0
- package/src/backend/utils/customFieldForms.ts +203 -0
- package/src/backend/utils/customFieldRelationDisplay.ts +302 -0
- package/src/backend/utils/customFieldValues.ts +41 -0
- package/src/backend/utils/flash.ts +17 -0
- package/src/backend/utils/nav.ts +402 -0
- package/src/backend/utils/richTextSanitizer.ts +7 -0
- package/src/backend/utils/scopedHeaderStack.ts +49 -0
- package/src/backend/utils/serverErrors.ts +313 -0
- package/src/backend/utils/useAutoDiscoveredFields.ts +138 -0
- package/src/backend/version-history/VersionHistoryAction.tsx +76 -0
- package/src/backend/version-history/VersionHistoryDetail.tsx +87 -0
- package/src/backend/version-history/VersionHistoryPanel.tsx +331 -0
- package/src/backend/version-history/index.ts +9 -0
- package/src/backend/version-history/labels.ts +56 -0
- package/src/backend/version-history/types.ts +27 -0
- package/src/backend/version-history/useAuditPermissions.ts +94 -0
- package/src/backend/version-history/useVersionHistory.ts +173 -0
- package/src/backend/views/NewViewForm.tsx +54 -0
- package/src/backend/views/ShareForm.tsx +62 -0
- package/src/backend/views/ViewChip.tsx +123 -0
- package/src/backend/views/ViewChipMenu.tsx +94 -0
- package/src/backend/views/types.ts +4 -0
- package/src/frontend/AuthFooter.tsx +29 -0
- package/src/frontend/LanguageSwitcher.tsx +66 -0
- package/src/frontend/Layout.tsx +13 -0
- package/src/hooks/useIsMobile.ts +27 -0
- package/src/index.ts +40 -0
- package/src/portal/PortalContext.tsx +180 -0
- package/src/portal/PortalLayoutProvider.tsx +5 -0
- package/src/portal/PortalLayoutShell.tsx +64 -0
- package/src/portal/PortalShell.tsx +370 -0
- package/src/portal/components/PortalCard.tsx +77 -0
- package/src/portal/components/PortalEmptyState.tsx +32 -0
- package/src/portal/components/PortalFeatureCard.tsx +41 -0
- package/src/portal/components/PortalNotificationBell.tsx +81 -0
- package/src/portal/components/PortalNotificationPanel.tsx +230 -0
- package/src/portal/components/PortalPageHeader.tsx +33 -0
- package/src/portal/components/index.ts +6 -0
- package/src/portal/hooks/useCustomerAuth.ts +97 -0
- package/src/portal/hooks/usePortalAppEvent.ts +56 -0
- package/src/portal/hooks/usePortalDashboardWidgets.ts +50 -0
- package/src/portal/hooks/usePortalEventBridge.ts +162 -0
- package/src/portal/hooks/usePortalInjectedMenuItems.ts +130 -0
- package/src/portal/hooks/usePortalNotifications.ts +116 -0
- package/src/portal/hooks/useTenantContext.ts +83 -0
- package/src/primitives/DataLoader.tsx +93 -0
- package/src/primitives/ErrorNotice.tsx +17 -0
- package/src/primitives/Notice.tsx +83 -0
- package/src/primitives/alert.tsx +59 -0
- package/src/primitives/badge.tsx +43 -0
- package/src/primitives/button.tsx +60 -0
- package/src/primitives/calendar.tsx +69 -0
- package/src/primitives/card.tsx +92 -0
- package/src/primitives/checkbox.tsx +34 -0
- package/src/primitives/dialog.tsx +122 -0
- package/src/primitives/form-field.tsx +106 -0
- package/src/primitives/icon-button.tsx +48 -0
- package/src/primitives/input.tsx +26 -0
- package/src/primitives/label.tsx +18 -0
- package/src/primitives/popover.tsx +37 -0
- package/src/primitives/primitives.stories.tsx +223 -0
- package/src/primitives/progress.tsx +28 -0
- package/src/primitives/separator.tsx +7 -0
- package/src/primitives/sheet.tsx +137 -0
- package/src/primitives/spinner.tsx +27 -0
- package/src/primitives/status-badge.tsx +62 -0
- package/src/primitives/switch.tsx +92 -0
- package/src/primitives/table.tsx +27 -0
- package/src/primitives/tabs.tsx +131 -0
- package/src/primitives/textarea.tsx +20 -0
- package/src/primitives/tooltip.tsx +85 -0
- package/src/primitives-v2/AGENTS.md +66 -0
- package/src/primitives-v2/Alert.stories.tsx +56 -0
- package/src/primitives-v2/Alert.tsx +108 -0
- package/src/primitives-v2/Avatar.stories.tsx +60 -0
- package/src/primitives-v2/Avatar.tsx +139 -0
- package/src/primitives-v2/Badge.stories.tsx +80 -0
- package/src/primitives-v2/Badge.tsx +99 -0
- package/src/primitives-v2/Breadcrumb.stories.tsx +61 -0
- package/src/primitives-v2/Breadcrumb.tsx +96 -0
- package/src/primitives-v2/Button.stories.tsx +72 -0
- package/src/primitives-v2/Button.tsx +178 -0
- package/src/primitives-v2/Checkbox.stories.tsx +34 -0
- package/src/primitives-v2/Checkbox.tsx +103 -0
- package/src/primitives-v2/IconButton.stories.tsx +40 -0
- package/src/primitives-v2/IconButton.tsx +40 -0
- package/src/primitives-v2/Input.stories.tsx +60 -0
- package/src/primitives-v2/Input.tsx +113 -0
- package/src/primitives-v2/NavGroup.stories.tsx +50 -0
- package/src/primitives-v2/NavGroup.tsx +76 -0
- package/src/primitives-v2/NavItem.stories.tsx +68 -0
- package/src/primitives-v2/NavItem.tsx +105 -0
- package/src/primitives-v2/SearchInput.stories.tsx +44 -0
- package/src/primitives-v2/SearchInput.tsx +123 -0
- package/src/primitives-v2/Sidebar.stories.tsx +91 -0
- package/src/primitives-v2/Sidebar.tsx +92 -0
- package/src/primitives-v2/Tab.stories.tsx +62 -0
- package/src/primitives-v2/Tab.tsx +148 -0
- package/src/primitives-v2/Tag.stories.tsx +123 -0
- package/src/primitives-v2/Tag.tsx +115 -0
- package/src/primitives-v2/Toggle.stories.tsx +37 -0
- package/src/primitives-v2/Toggle.tsx +93 -0
- package/src/primitives-v2/Topbar.stories.tsx +65 -0
- package/src/primitives-v2/Topbar.tsx +37 -0
- package/src/primitives-v2/index.ts +31 -0
- package/src/primitives-v2/utils.ts +9 -0
- package/src/theme/BrandThemeProvider.tsx +122 -0
- package/src/theme/QueryProvider.tsx +46 -0
- package/src/theme/ThemeProvider.tsx +120 -0
- package/src/theme/ThemeToggle.tsx +88 -0
- package/src/theme/index.ts +4 -0
- package/src/theme/m3.css +622 -0
- package/src/theme/tokens.v2.css +559 -0
- package/src/theme/typography.css +163 -0
- package/src/theme/typography.stories.tsx +157 -0
- package/src/theme/typography.tokens.ts +326 -0
- package/src/types/react-big-calendar.d.ts +16 -0
|
@@ -0,0 +1,1198 @@
|
|
|
1
|
+
// types/index.ts
|
|
2
|
+
|
|
3
|
+
import type { PerspectiveConfig } from './perspective';
|
|
4
|
+
// The batch-save event strings are DEFINED in `handlers/cellWrites` (the module
|
|
5
|
+
// that emits them) and imported here so there is exactly one spelling of each.
|
|
6
|
+
// Do not retype them below.
|
|
7
|
+
import {
|
|
8
|
+
CELL_BATCH_SAVE_EVENT,
|
|
9
|
+
CELL_BATCH_SAVE_RESULT_EVENT,
|
|
10
|
+
} from '../handlers/cellWrites';
|
|
11
|
+
import type {
|
|
12
|
+
CellWrite,
|
|
13
|
+
CellWriteOrigin,
|
|
14
|
+
CellWriteReport,
|
|
15
|
+
CellWriteResult,
|
|
16
|
+
CellWriteRejectReason,
|
|
17
|
+
CellWriteRejectionCounts,
|
|
18
|
+
CellValueCoercer,
|
|
19
|
+
CoerceReason,
|
|
20
|
+
CoerceResult,
|
|
21
|
+
} from '../handlers/cellWrites';
|
|
22
|
+
import type {
|
|
23
|
+
FillDetector,
|
|
24
|
+
FillMode,
|
|
25
|
+
FillPattern,
|
|
26
|
+
FillSeed,
|
|
27
|
+
} from '../utils/fillPatterns';
|
|
28
|
+
import type { DensityLevel } from './density';
|
|
29
|
+
|
|
30
|
+
// Multi-cell write vocabulary. RE-EXPORTED, never redeclared — a second
|
|
31
|
+
// declaration of `FillMode` is exactly the drift this barrel exists to prevent.
|
|
32
|
+
export type {
|
|
33
|
+
CellWrite,
|
|
34
|
+
CellWriteOrigin,
|
|
35
|
+
CellWriteReport,
|
|
36
|
+
CellWriteResult,
|
|
37
|
+
CellWriteRejectReason,
|
|
38
|
+
CellWriteRejectionCounts,
|
|
39
|
+
CellValueCoercer,
|
|
40
|
+
CoerceReason,
|
|
41
|
+
CoerceResult,
|
|
42
|
+
FillDetector,
|
|
43
|
+
FillMode,
|
|
44
|
+
FillPattern,
|
|
45
|
+
FillSeed,
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export type CellId = `${number}:${number}`;
|
|
49
|
+
|
|
50
|
+
export interface SelectionState {
|
|
51
|
+
type: 'cell' | 'range' | 'row' | 'column' | 'rowRange' | 'colRange' | null;
|
|
52
|
+
anchor: { row: number; col: number } | null;
|
|
53
|
+
focus: { row: number; col: number } | null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface SelectionBounds {
|
|
57
|
+
startRow: number;
|
|
58
|
+
endRow: number;
|
|
59
|
+
startCol: number;
|
|
60
|
+
endCol: number;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface RangeEdges {
|
|
64
|
+
top?: boolean;
|
|
65
|
+
bottom?: boolean;
|
|
66
|
+
left?: boolean;
|
|
67
|
+
right?: boolean;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Which way a fill drag runs. Excel locks to ONE axis; so does this. */
|
|
71
|
+
export type FillAxis = 'vertical' | 'horizontal';
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Active drag-to-fill ("fill handle") preview — a RECTANGLE, exactly as Excel
|
|
75
|
+
* draws it. Built on `SelectionBounds` so there is one rectangle type in the
|
|
76
|
+
* grid, not two.
|
|
77
|
+
*
|
|
78
|
+
* `source` is the block the drag started from (the selection at mousedown);
|
|
79
|
+
* `bounds` is the union of source + extension, i.e. the outline the user sees.
|
|
80
|
+
* When the handle is dragged BACK INTO the source, `bounds === source`,
|
|
81
|
+
* `clearing` is true and `cleared` names the sub-rect that will be EMPTIED.
|
|
82
|
+
*/
|
|
83
|
+
export interface FillPreview {
|
|
84
|
+
/** The block the drag started from (the selection at mousedown). */
|
|
85
|
+
source: SelectionBounds;
|
|
86
|
+
/** Union of source + extension — the outline Excel draws. */
|
|
87
|
+
bounds: SelectionBounds;
|
|
88
|
+
axis: FillAxis;
|
|
89
|
+
/** True when the extension runs up/left, so the series extrapolates backwards. */
|
|
90
|
+
backwards: boolean;
|
|
91
|
+
/** True when the handle was dragged back into the source: `bounds === source`. */
|
|
92
|
+
clearing: boolean;
|
|
93
|
+
/** Only set while `clearing`. Always a sub-rect of `source`. */
|
|
94
|
+
cleared: SelectionBounds | null;
|
|
95
|
+
mode: FillMode;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Excel's MARCHING ANTS: the animated dashed outline that marks what is on the
|
|
100
|
+
* clipboard, from `Ctrl+C`/`Ctrl+X` until it is dismissed.
|
|
101
|
+
*
|
|
102
|
+
* It is a SEPARATE rectangle from the selection on purpose — the whole point is
|
|
103
|
+
* that it survives you moving the cursor somewhere else, which is exactly when
|
|
104
|
+
* a user needs to be told what a `Ctrl+V` is about to paste.
|
|
105
|
+
*
|
|
106
|
+
* Addressed by INDEX into the full view-order column array and the loaded row
|
|
107
|
+
* list, like every other rectangle in this grid, so a marked column that is
|
|
108
|
+
* outside the virtualization window is still marked.
|
|
109
|
+
*/
|
|
110
|
+
export interface ClipboardMarker {
|
|
111
|
+
/** Which gesture produced it. Both draw the same outline (Excel does too). */
|
|
112
|
+
mode: 'copy' | 'cut';
|
|
113
|
+
bounds: SelectionBounds;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export interface CellState {
|
|
117
|
+
value: any;
|
|
118
|
+
isSelected: boolean;
|
|
119
|
+
isInRange: boolean;
|
|
120
|
+
rangeEdges: RangeEdges;
|
|
121
|
+
isEditing: boolean;
|
|
122
|
+
saveState: SaveStateType;
|
|
123
|
+
isNewRow: boolean;
|
|
124
|
+
/** True while a fill-handle drag is previewing this cell (source OR extension). */
|
|
125
|
+
isFillPreview: boolean;
|
|
126
|
+
/** In the extension only — this cell will be WRITTEN on release. */
|
|
127
|
+
isFillTarget: boolean;
|
|
128
|
+
/** In `cleared` — this cell will be EMPTIED on release (back-drag). */
|
|
129
|
+
isFillClearing: boolean;
|
|
130
|
+
/**
|
|
131
|
+
* Carries the drag nub: the bottom-right corner of a selection with at least
|
|
132
|
+
* one fillable column. Computed in the STORE (it needs the whole selection
|
|
133
|
+
* and the column defs) so `Cell` holds no column knowledge.
|
|
134
|
+
*/
|
|
135
|
+
isFillOrigin: boolean;
|
|
136
|
+
/** Outer edges of the fill-preview rectangle, for the dashed border. */
|
|
137
|
+
fillEdges: RangeEdges;
|
|
138
|
+
/** Inside the clipboard marker — carries the marching-ants outline. */
|
|
139
|
+
isClipboardSource: boolean;
|
|
140
|
+
/** Outer edges of the clipboard rectangle. Only these are painted. */
|
|
141
|
+
clipboardEdges: RangeEdges;
|
|
142
|
+
/** `null` when this cell is not in the marker. */
|
|
143
|
+
clipboardMode: 'copy' | 'cut' | null;
|
|
144
|
+
/**
|
|
145
|
+
* The one cell the pointer is currently over. Lives in the STORE, not in
|
|
146
|
+
* React state: a `useState` on DynamicTable would re-render every mounted row
|
|
147
|
+
* on every pointer move, whereas `setHoveredCell` repaints exactly the cell
|
|
148
|
+
* left and the cell entered — the same two-cell cost `setEditingCell` pays.
|
|
149
|
+
* Used by the hover comment affordance (ledger 8.1).
|
|
150
|
+
*/
|
|
151
|
+
isHovered: boolean;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export type SaveStateType = 'saving' | 'success' | 'error' | null;
|
|
155
|
+
|
|
156
|
+
/** One cell mutation captured for undo/redo, keyed by stable row id + column. */
|
|
157
|
+
export interface UndoCellChange {
|
|
158
|
+
rowId: any;
|
|
159
|
+
colKey: string;
|
|
160
|
+
oldValue: any;
|
|
161
|
+
newValue: any;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** A single undoable action — one inline edit (1 change) or one fill (N changes). */
|
|
165
|
+
export interface UndoEntry {
|
|
166
|
+
changes: UndoCellChange[];
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// ============================================
|
|
170
|
+
// IN-GRID FIND & REPLACE
|
|
171
|
+
// ============================================
|
|
172
|
+
// Not persisted, and deliberately NOT part of `PerspectiveConfig` — a saved view
|
|
173
|
+
// must not carry a stale search.
|
|
174
|
+
|
|
175
|
+
export interface FindOptions {
|
|
176
|
+
query: string;
|
|
177
|
+
matchCase: boolean;
|
|
178
|
+
/** Match the whole cell rather than a substring (Excel's "Match entire cell"). */
|
|
179
|
+
wholeCell: boolean;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
export type ReplaceRejectReason = 'readOnly' | 'unsupportedColumn' | 'uncoercible' | 'rowGone';
|
|
185
|
+
|
|
186
|
+
export interface ReplaceResult {
|
|
187
|
+
replaced: number;
|
|
188
|
+
rejected: Array<{ row: number; col: number; reason: ReplaceRejectReason }>;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export type CellSubscriber = () => void;
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Status-palette variant for `type: 'badge'` cells. Maps 1:1 onto the
|
|
195
|
+
* `--status-v2-*` token triplets (bg / border / text). v2 design system.
|
|
196
|
+
*/
|
|
197
|
+
export type DynamicTableBadgeVariant =
|
|
198
|
+
| 'neutral' | 'primary' | 'outline' | 'success' | 'error' | 'warning'
|
|
199
|
+
| 'info' | 'purple' | 'teal' | 'orange' | 'sky' | 'rose';
|
|
200
|
+
|
|
201
|
+
export interface ColumnDef {
|
|
202
|
+
data: string;
|
|
203
|
+
title?: string;
|
|
204
|
+
/** Tooltip text shown on hover over the column header */
|
|
205
|
+
headerTooltip?: string;
|
|
206
|
+
width?: number;
|
|
207
|
+
type?: 'text' | 'numeric' | 'date' | 'dropdown' | 'boolean' | 'multiselect';
|
|
208
|
+
/** Horizontal alignment of cell content. v2 design (right-align numbers, centre checkboxes). */
|
|
209
|
+
align?: 'left' | 'center' | 'right';
|
|
210
|
+
/** Render the cell text in the monospace (Geist Mono) face — refs, codes, dates, amounts. v2 design. */
|
|
211
|
+
mono?: boolean;
|
|
212
|
+
/**
|
|
213
|
+
* Render the cell value as a status pill (v2 design). Presentation-only —
|
|
214
|
+
* the column's `type` still governs sort/filter/edit behaviour, so a status
|
|
215
|
+
* column stays `type: 'dropdown'`/`'text'` and just *displays* as a badge.
|
|
216
|
+
*/
|
|
217
|
+
badge?: boolean;
|
|
218
|
+
/**
|
|
219
|
+
* With `badge`: resolve a cell value to a status-palette variant.
|
|
220
|
+
* A function wins over `badgeMap`; both fall back to `'neutral'`.
|
|
221
|
+
*/
|
|
222
|
+
badgeVariant?: DynamicTableBadgeVariant | ((value: any, rowData: any) => DynamicTableBadgeVariant);
|
|
223
|
+
/** With `badge`: static value → variant lookup (e.g. `{ Active: 'success' }`). */
|
|
224
|
+
badgeMap?: Record<string, DynamicTableBadgeVariant>;
|
|
225
|
+
readOnly?: boolean;
|
|
226
|
+
/**
|
|
227
|
+
* The module refuses an empty value for this field (its create/update
|
|
228
|
+
* validator would 400). Multi-cell writes reject an emptying write on a
|
|
229
|
+
* required column up front with reason `'required'`, rather than firing N
|
|
230
|
+
* doomed PATCHes and leaving the grid showing values the server never took.
|
|
231
|
+
*/
|
|
232
|
+
required?: boolean;
|
|
233
|
+
/**
|
|
234
|
+
* Fill-series behaviour for the drag handle. `'auto'` (default) runs the
|
|
235
|
+
* pattern chain — numeric step, date step, weekday step, `REF-001` suffix —
|
|
236
|
+
* and falls back to copying. `'copy'` forces plain tiling for a column whose
|
|
237
|
+
* values only *look* like a series (a postcode, a phone number).
|
|
238
|
+
*/
|
|
239
|
+
fillSeries?: 'auto' | 'copy';
|
|
240
|
+
/**
|
|
241
|
+
* Exclude this column from the drag-to-fill handle while still allowing normal
|
|
242
|
+
* inline edits. Use for unique / identity fields (e.g. an invoice number)
|
|
243
|
+
* where copying one value down would create duplicates. Default: false.
|
|
244
|
+
*/
|
|
245
|
+
disableFill?: boolean;
|
|
246
|
+
sticky?: 'left' | 'right';
|
|
247
|
+
source?: any[];
|
|
248
|
+
renderer?: (value: any, rowData: any, col: any, rowIndex: number, colIndex: number) => React.ReactNode;
|
|
249
|
+
/**
|
|
250
|
+
* Optional formatter for this column's value in a group-summary (subtotal)
|
|
251
|
+
* row. When omitted, the table uses a dedicated locale number formatter.
|
|
252
|
+
* Use this for columns that need bespoke summary formatting (e.g. currency).
|
|
253
|
+
*/
|
|
254
|
+
summaryRenderer?: (value: number, col: any) => React.ReactNode;
|
|
255
|
+
editor?: (
|
|
256
|
+
value: any,
|
|
257
|
+
onChange: (v: any) => void,
|
|
258
|
+
onSave: () => void,
|
|
259
|
+
onCancel: () => void,
|
|
260
|
+
rowData: any,
|
|
261
|
+
col: any,
|
|
262
|
+
rowIndex: number,
|
|
263
|
+
colIndex: number
|
|
264
|
+
) => React.ReactNode;
|
|
265
|
+
/** Returns CSS class name(s) for conditional cell styling based on value/row data */
|
|
266
|
+
cellClassName?: (value: any, rowData: any, rowIndex: number, colIndex: number) => string | undefined;
|
|
267
|
+
/**
|
|
268
|
+
* Optional formatter for this column's value when the row is exported to
|
|
269
|
+
* CSV/Excel. Use it for columns whose stored cell value is not human-readable
|
|
270
|
+
* (e.g. a relation column that stores `JSON.stringify({ id, name })`).
|
|
271
|
+
* When omitted, the raw cell value is stringified — matching the Copy button.
|
|
272
|
+
*/
|
|
273
|
+
exportValue?: (value: any, rowData: any) => string | number | null | undefined;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
export interface DragState {
|
|
277
|
+
isDragging: boolean;
|
|
278
|
+
type: 'cell' | 'row' | 'column' | null;
|
|
279
|
+
start: { row: number; col: number } | null;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
export interface SortState {
|
|
283
|
+
columnIndex: number | null;
|
|
284
|
+
direction: 'asc' | 'desc' | null;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
export interface ContextMenuState {
|
|
288
|
+
isOpen: boolean;
|
|
289
|
+
position: { x: number; y: number };
|
|
290
|
+
actions: ContextMenuAction[];
|
|
291
|
+
type: 'column' | 'row' | 'cell' | null;
|
|
292
|
+
index: number | null;
|
|
293
|
+
colIndex?: number | null;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export interface ContextMenuAction {
|
|
297
|
+
id: string;
|
|
298
|
+
label: string;
|
|
299
|
+
icon?: string;
|
|
300
|
+
disabled?: boolean;
|
|
301
|
+
separator?: boolean;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
export interface FilterRow {
|
|
305
|
+
id: string;
|
|
306
|
+
field: string;
|
|
307
|
+
operator: string;
|
|
308
|
+
values: any[];
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
export type FilterColor = 'blue' | 'green' | 'purple' | 'orange' | 'pink' | 'teal' | 'yellow' | 'red';
|
|
312
|
+
|
|
313
|
+
export interface SavedFilter {
|
|
314
|
+
id: string;
|
|
315
|
+
name: string;
|
|
316
|
+
rows: FilterRow[];
|
|
317
|
+
color?: FilterColor;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// Event types
|
|
321
|
+
export interface CellEditSaveEvent {
|
|
322
|
+
rowIndex: number;
|
|
323
|
+
colIndex: number;
|
|
324
|
+
oldValue: any;
|
|
325
|
+
newValue: any;
|
|
326
|
+
prop: string;
|
|
327
|
+
rowData: any;
|
|
328
|
+
id?: string;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/** One cell inside a {@link CellBatchSaveEvent}. Mirrors `CellEditSaveEvent`. */
|
|
332
|
+
export interface CellBatchSaveEntry {
|
|
333
|
+
rowIndex: number;
|
|
334
|
+
colIndex: number;
|
|
335
|
+
prop: string;
|
|
336
|
+
oldValue: any;
|
|
337
|
+
newValue: any;
|
|
338
|
+
rowData: any;
|
|
339
|
+
id?: string;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Emitted ONCE per multi-cell write, alongside the per-cell `CELL_EDIT_SAVE`s.
|
|
344
|
+
* Additive: a consumer that ignores it keeps working exactly as before.
|
|
345
|
+
*/
|
|
346
|
+
export interface CellBatchSaveEvent {
|
|
347
|
+
origin: CellWriteOrigin;
|
|
348
|
+
writes: CellBatchSaveEntry[];
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/** The applied/rejected tally for one multi-cell write. */
|
|
352
|
+
export interface CellBatchSaveResultEvent {
|
|
353
|
+
applied: number;
|
|
354
|
+
rejected: { rowIndex: number; colIndex: number; reason?: CellWriteRejectReason }[];
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
export interface CellSaveStartEvent {
|
|
358
|
+
rowIndex: number;
|
|
359
|
+
colIndex: number;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
export interface CellSaveSuccessEvent {
|
|
363
|
+
rowIndex: number;
|
|
364
|
+
colIndex: number;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
export interface CellSaveErrorEvent {
|
|
368
|
+
rowIndex: number;
|
|
369
|
+
colIndex: number;
|
|
370
|
+
error?: string;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
export interface NewRowSaveEvent {
|
|
374
|
+
rowIndex: number;
|
|
375
|
+
rowData: any;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
export interface NewRowSaveStartEvent {
|
|
379
|
+
rowIndex: number;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
export interface NewRowSaveSuccessEvent {
|
|
383
|
+
rowIndex: number;
|
|
384
|
+
savedRowData: any;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
export interface NewRowSaveErrorEvent {
|
|
388
|
+
rowIndex: number;
|
|
389
|
+
error?: string;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
export interface ColumnSortEvent {
|
|
393
|
+
columnIndex: number;
|
|
394
|
+
columnName: string;
|
|
395
|
+
direction: 'asc' | 'desc' | null;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
export interface SearchEvent {
|
|
399
|
+
query: string;
|
|
400
|
+
timestamp: number;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
export interface FilterChangeEvent {
|
|
404
|
+
filters: FilterRow[];
|
|
405
|
+
savedFilterId?: string | null;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
export interface FilterSaveEvent {
|
|
409
|
+
filter: SavedFilter;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
export interface FilterSelectEvent {
|
|
413
|
+
id: string | null;
|
|
414
|
+
filterRows: FilterRow[];
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
export interface FilterRenameEvent {
|
|
418
|
+
id: string;
|
|
419
|
+
newName: string;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
export interface FilterDeleteEvent {
|
|
423
|
+
id: string;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
export interface ColumnContextMenuEvent {
|
|
427
|
+
columnIndex: number;
|
|
428
|
+
columnName: string;
|
|
429
|
+
actionId: string;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
export interface RowContextMenuEvent {
|
|
433
|
+
rowIndex: number;
|
|
434
|
+
rowData: any;
|
|
435
|
+
actionId: string;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
export interface CellContextMenuEvent {
|
|
439
|
+
rowIndex: number;
|
|
440
|
+
colIndex: number;
|
|
441
|
+
rowData: any;
|
|
442
|
+
col: ColumnDef;
|
|
443
|
+
actionId: string;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
export const TableEvents = {
|
|
447
|
+
CELL_EDIT_SAVE: 'table:cell:edit:save',
|
|
448
|
+
CELL_SAVE_START: 'table:cell:save:start',
|
|
449
|
+
CELL_SAVE_SUCCESS: 'table:cell:save:success',
|
|
450
|
+
CELL_SAVE_ERROR: 'table:cell:save:error',
|
|
451
|
+
/** One multi-cell write (paste / cut / clear / fill / replace / import). */
|
|
452
|
+
CELL_BATCH_SAVE: CELL_BATCH_SAVE_EVENT,
|
|
453
|
+
/** The applied/rejected tally for that same write. */
|
|
454
|
+
CELL_BATCH_SAVE_RESULT: CELL_BATCH_SAVE_RESULT_EVENT,
|
|
455
|
+
NEW_ROW_SAVE: 'table:new:row:save',
|
|
456
|
+
NEW_ROW_SAVE_START: 'table:new:row:save:start',
|
|
457
|
+
NEW_ROW_SAVE_SUCCESS: 'table:new:row:save:success',
|
|
458
|
+
NEW_ROW_SAVE_ERROR: 'table:new:row:save:error',
|
|
459
|
+
FILTER_CHANGE: 'table:filter:change',
|
|
460
|
+
FILTER_SAVE: 'table:filter:save',
|
|
461
|
+
FILTER_SELECT: 'table:filter:select',
|
|
462
|
+
FILTER_RENAME: 'table:filter:rename',
|
|
463
|
+
FILTER_DELETE: 'table:filter:delete',
|
|
464
|
+
COLUMN_SORT: 'table:column:sort',
|
|
465
|
+
SEARCH: 'table:search',
|
|
466
|
+
COLUMN_CONTEXT_MENU_ACTION: 'table:column:context:action',
|
|
467
|
+
ROW_CONTEXT_MENU_ACTION: 'table:row:context:action',
|
|
468
|
+
CELL_CONTEXT_MENU_ACTION: 'table:cell:context:action',
|
|
469
|
+
// Perspective events
|
|
470
|
+
PERSPECTIVE_SAVE: 'table:perspective:save',
|
|
471
|
+
PERSPECTIVE_SELECT: 'table:perspective:select',
|
|
472
|
+
PERSPECTIVE_RENAME: 'table:perspective:rename',
|
|
473
|
+
PERSPECTIVE_DELETE: 'table:perspective:delete',
|
|
474
|
+
PERSPECTIVE_CHANGE: 'table:perspective:change',
|
|
475
|
+
PERSPECTIVE_DUPLICATE: 'table:perspective:duplicate',
|
|
476
|
+
PERSPECTIVE_SET_DEFAULT: 'table:perspective:setDefault',
|
|
477
|
+
PERSPECTIVE_PUBLISH: 'table:perspective:publish',
|
|
478
|
+
PERSPECTIVE_TEMPLATE_COPY: 'table:perspective:templateCopy',
|
|
479
|
+
} as const;
|
|
480
|
+
|
|
481
|
+
// Type mapping for event payloads - maps event names to their payload types
|
|
482
|
+
export type TableEventPayloads = {
|
|
483
|
+
[TableEvents.CELL_EDIT_SAVE]: CellEditSaveEvent;
|
|
484
|
+
[TableEvents.CELL_SAVE_START]: CellSaveStartEvent;
|
|
485
|
+
[TableEvents.CELL_SAVE_SUCCESS]: CellSaveSuccessEvent;
|
|
486
|
+
[TableEvents.CELL_SAVE_ERROR]: CellSaveErrorEvent;
|
|
487
|
+
[TableEvents.CELL_BATCH_SAVE]: CellBatchSaveEvent;
|
|
488
|
+
[TableEvents.CELL_BATCH_SAVE_RESULT]: CellBatchSaveResultEvent;
|
|
489
|
+
[TableEvents.NEW_ROW_SAVE]: NewRowSaveEvent;
|
|
490
|
+
[TableEvents.NEW_ROW_SAVE_START]: NewRowSaveStartEvent;
|
|
491
|
+
[TableEvents.NEW_ROW_SAVE_SUCCESS]: NewRowSaveSuccessEvent;
|
|
492
|
+
[TableEvents.NEW_ROW_SAVE_ERROR]: NewRowSaveErrorEvent;
|
|
493
|
+
[TableEvents.FILTER_CHANGE]: FilterChangeEvent;
|
|
494
|
+
[TableEvents.FILTER_SAVE]: FilterSaveEvent;
|
|
495
|
+
[TableEvents.FILTER_SELECT]: FilterSelectEvent;
|
|
496
|
+
[TableEvents.FILTER_RENAME]: FilterRenameEvent;
|
|
497
|
+
[TableEvents.FILTER_DELETE]: FilterDeleteEvent;
|
|
498
|
+
[TableEvents.COLUMN_SORT]: ColumnSortEvent;
|
|
499
|
+
[TableEvents.SEARCH]: SearchEvent;
|
|
500
|
+
[TableEvents.COLUMN_CONTEXT_MENU_ACTION]: ColumnContextMenuEvent;
|
|
501
|
+
[TableEvents.ROW_CONTEXT_MENU_ACTION]: RowContextMenuEvent;
|
|
502
|
+
[TableEvents.CELL_CONTEXT_MENU_ACTION]: CellContextMenuEvent;
|
|
503
|
+
// Perspective event payloads (types imported from ./perspective)
|
|
504
|
+
[TableEvents.PERSPECTIVE_SAVE]: import('./perspective').PerspectiveSaveEvent;
|
|
505
|
+
[TableEvents.PERSPECTIVE_SELECT]: import('./perspective').PerspectiveSelectEvent;
|
|
506
|
+
[TableEvents.PERSPECTIVE_RENAME]: import('./perspective').PerspectiveRenameEvent;
|
|
507
|
+
[TableEvents.PERSPECTIVE_DELETE]: import('./perspective').PerspectiveDeleteEvent;
|
|
508
|
+
[TableEvents.PERSPECTIVE_CHANGE]: import('./perspective').PerspectiveChangeEvent;
|
|
509
|
+
[TableEvents.PERSPECTIVE_DUPLICATE]: import('./perspective').PerspectiveDuplicateEvent;
|
|
510
|
+
[TableEvents.PERSPECTIVE_SET_DEFAULT]: import('./perspective').PerspectiveSetDefaultEvent;
|
|
511
|
+
[TableEvents.PERSPECTIVE_PUBLISH]: import('./perspective').PerspectivePublishEvent;
|
|
512
|
+
[TableEvents.PERSPECTIVE_TEMPLATE_COPY]: import('./perspective').PerspectiveTemplateCopyEvent;
|
|
513
|
+
};
|
|
514
|
+
|
|
515
|
+
// Type for event handler map - each key is an event name, value is handler function
|
|
516
|
+
export type EventHandlers = {
|
|
517
|
+
[K in keyof TableEventPayloads]?: (payload: TableEventPayloads[K], event?: Event) => void;
|
|
518
|
+
};
|
|
519
|
+
|
|
520
|
+
export interface PaginationProps {
|
|
521
|
+
currentPage: number;
|
|
522
|
+
totalPages: number;
|
|
523
|
+
limit: number;
|
|
524
|
+
/** Total record count across all pages — drives the v2 footer's "X–Y of Z" text. */
|
|
525
|
+
total?: number;
|
|
526
|
+
limitOptions?: number[];
|
|
527
|
+
onPageChange: (page: number) => void;
|
|
528
|
+
onLimitChange: (limit: number) => void;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
/**
|
|
532
|
+
* Style preset for read-only cells.
|
|
533
|
+
* - 'muted': Gray background (default) - indicates cells are not editable
|
|
534
|
+
* - 'normal': Same as editable cells - white/transparent background
|
|
535
|
+
* - 'subtle': Very subtle background tint - minimal visual difference
|
|
536
|
+
*/
|
|
537
|
+
export type ReadOnlyStyle = 'muted' | 'normal' | 'subtle';
|
|
538
|
+
|
|
539
|
+
/**
|
|
540
|
+
* Style preset for row hover in clickable row mode.
|
|
541
|
+
* - 'default': Light blue background (same as selection)
|
|
542
|
+
* - 'subtle': Very light gray background
|
|
543
|
+
* - 'accent': Uses theme accent color
|
|
544
|
+
*/
|
|
545
|
+
export type RowHoverStyle = 'default' | 'subtle' | 'accent';
|
|
546
|
+
|
|
547
|
+
/**
|
|
548
|
+
* A custom batch action shown in the grouped-actions (bulk) bar that appears
|
|
549
|
+
* when ≥1 row is selected. Configured per-table via `uiConfig.bulkActions`;
|
|
550
|
+
* rendered after the built-in Copy (and optional Delete) buttons.
|
|
551
|
+
*/
|
|
552
|
+
export interface BulkActionConfig {
|
|
553
|
+
/** Stable identifier (used as the React key). */
|
|
554
|
+
id: string;
|
|
555
|
+
/** Button label. */
|
|
556
|
+
label: string;
|
|
557
|
+
/** Optional leading icon (e.g. a lucide-react element). */
|
|
558
|
+
icon?: React.ReactNode;
|
|
559
|
+
/** Invoked with the currently-selected row ids when the button is clicked. */
|
|
560
|
+
onClick: (selectedIds: string[]) => void | Promise<void>;
|
|
561
|
+
/** Optionally disable the action for the current selection. */
|
|
562
|
+
disabled?: (selectedIds: string[]) => boolean;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
/**
|
|
566
|
+
* What `TableUIConfig.searchSuggestions` receives.
|
|
567
|
+
*
|
|
568
|
+
* `inputRef` is handed over so the panel can attach its OWN `keydown` listener
|
|
569
|
+
* to the input: arrow-key navigation of a list has to be driven from the control
|
|
570
|
+
* that holds focus, and focus never leaves the box. `submit` puts a query into
|
|
571
|
+
* the box AND into the dataset in one move — what clicking a hint does.
|
|
572
|
+
*/
|
|
573
|
+
export type SearchSuggestionsContext = {
|
|
574
|
+
/** What the box holds right now, undebounced. */
|
|
575
|
+
query: string;
|
|
576
|
+
inputRef: React.RefObject<HTMLInputElement | null>;
|
|
577
|
+
/** Close the panel and leave the query alone. */
|
|
578
|
+
close: () => void;
|
|
579
|
+
/** Set the query and search for it immediately. */
|
|
580
|
+
submit: (query: string) => void;
|
|
581
|
+
};
|
|
582
|
+
|
|
583
|
+
export type SearchSuggestionsRenderer = (ctx: SearchSuggestionsContext) => React.ReactNode;
|
|
584
|
+
|
|
585
|
+
/**
|
|
586
|
+
* What `searchBarStart` is handed when it is a function.
|
|
587
|
+
*
|
|
588
|
+
* Deliberately small: the rows currently loaded and the filter pair. A header
|
|
589
|
+
* is not a body renderer and must not be given selection, grouping toggles or
|
|
590
|
+
* paging — those belong to the table's own chrome, and handing them out is how
|
|
591
|
+
* two controls end up disagreeing about one piece of state.
|
|
592
|
+
*/
|
|
593
|
+
export interface SearchBarRenderContext {
|
|
594
|
+
/** The rows on this page, after search and filters. */
|
|
595
|
+
data: any[];
|
|
596
|
+
filters: FilterRow[];
|
|
597
|
+
setFilters: (filters: FilterRow[]) => void;
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
export interface TableUIConfig {
|
|
601
|
+
/** Hide the entire toolbar (header with title, search, buttons) */
|
|
602
|
+
hideToolbar?: boolean;
|
|
603
|
+
/** Hide just the title in the toolbar */
|
|
604
|
+
hideTitle?: boolean;
|
|
605
|
+
/** Hide just the search bar */
|
|
606
|
+
hideSearch?: boolean;
|
|
607
|
+
/** Hide the "Add Row" button */
|
|
608
|
+
hideAddRowButton?: boolean;
|
|
609
|
+
/** Hide the perspective tabs row (All, Base, +) */
|
|
610
|
+
hidePerspectiveTabs?: boolean;
|
|
611
|
+
/**
|
|
612
|
+
* Offer a view switcher in the toolbar's icon cluster.
|
|
613
|
+
*
|
|
614
|
+
* Two or more entries render an M3 segmented button; fewer render nothing,
|
|
615
|
+
* so a table with one way to draw itself is byte-identical to today. The
|
|
616
|
+
* chosen mode is a property of the SAVED VIEW (`PerspectiveConfig.viewMode`),
|
|
617
|
+
* not of the session — see that type for why.
|
|
618
|
+
*
|
|
619
|
+
* A mode other than `'table'` needs `renderBody`; without it the switcher
|
|
620
|
+
* would offer a mode that draws nothing.
|
|
621
|
+
*/
|
|
622
|
+
viewModes?: TableViewModeOption[];
|
|
623
|
+
/**
|
|
624
|
+
* Fired when the view switcher changes mode, and once on mount with the
|
|
625
|
+
* initial mode.
|
|
626
|
+
*
|
|
627
|
+
* The table owns `viewMode` internally, which is right — it decides whether
|
|
628
|
+
* to call `renderBody`. But a host often has chrome that belongs to only one
|
|
629
|
+
* of the two renderers: the documents list draws folders as a row of tiles
|
|
630
|
+
* INSIDE its grid body, so the folder chips it puts in `searchBarStart` are
|
|
631
|
+
* a duplicate there and the only thing that can reach a folder in the list.
|
|
632
|
+
* Without this the host cannot tell which it is looking at, and the same
|
|
633
|
+
* folders appear twice in two different shapes.
|
|
634
|
+
*/
|
|
635
|
+
onViewModeChange?: (mode: import('./perspective').TableViewMode) => void;
|
|
636
|
+
/** Hide the pagination controls */
|
|
637
|
+
hidePagination?: boolean;
|
|
638
|
+
/** Hide the Actions column */
|
|
639
|
+
hideActionsColumn?: boolean;
|
|
640
|
+
/**
|
|
641
|
+
* Hide the toolbar Export button (CSV/Excel download of the selected rows,
|
|
642
|
+
* or the current page when nothing is selected). Default: false (shown).
|
|
643
|
+
*/
|
|
644
|
+
hideExportButton?: boolean;
|
|
645
|
+
/**
|
|
646
|
+
* Base file name (without extension) for exported CSV/Excel files. When
|
|
647
|
+
* omitted, the table name is slugified. Example: 'invoices' → 'invoices.csv'.
|
|
648
|
+
*/
|
|
649
|
+
exportFileName?: string;
|
|
650
|
+
/** Custom content rendered at the start of the top bar (before title) */
|
|
651
|
+
topBarStart?: React.ReactNode;
|
|
652
|
+
/** Custom content rendered at the end of the top bar (after add button) */
|
|
653
|
+
topBarEnd?: React.ReactNode;
|
|
654
|
+
/** v2 only: content rendered at the right end of the search row (e.g. a
|
|
655
|
+
* primary action button placed on the same line as the search input). */
|
|
656
|
+
searchBarEnd?: React.ReactNode;
|
|
657
|
+
/**
|
|
658
|
+
* v2 only: content rendered FIRST in the search-row actions (before the add
|
|
659
|
+
* button / searchBarEnd / export), e.g. a leading toolbar action.
|
|
660
|
+
*
|
|
661
|
+
* MAY BE A RENDER FUNCTION, and that is what makes chrome shared between the
|
|
662
|
+
* two renderers possible. `renderBody` is called only when the view mode is
|
|
663
|
+
* not `table`, so anything needing `filters` / `setFilters` could previously
|
|
664
|
+
* only exist in the GRID — the documents module drew its folder row there and
|
|
665
|
+
* the list view saw no change at all, which is precisely the bug that
|
|
666
|
+
* prompted this. A header that narrows the table has to be reachable from
|
|
667
|
+
* both, and this slot is the one both render.
|
|
668
|
+
*/
|
|
669
|
+
searchBarStart?: React.ReactNode | ((ctx: SearchBarRenderContext) => React.ReactNode);
|
|
670
|
+
|
|
671
|
+
/**
|
|
672
|
+
* Full-width content between the toolbar and the table body, in BOTH view
|
|
673
|
+
* modes.
|
|
674
|
+
*
|
|
675
|
+
* `searchBarStart` puts its content INSIDE the search row, squeezed beside
|
|
676
|
+
* the title and the search box. That is right for a leading toolbar action
|
|
677
|
+
* and wrong for a band: the documents module's folder row landed there and
|
|
678
|
+
* came out as a cramped strip to the right of the heading, nothing like the
|
|
679
|
+
* row of folders it is meant to be.
|
|
680
|
+
*
|
|
681
|
+
* A function receives the same small context, so a band can narrow the
|
|
682
|
+
* table from a place both renderers paint.
|
|
683
|
+
*/
|
|
684
|
+
beforeBody?: React.ReactNode | ((ctx: SearchBarRenderContext) => React.ReactNode);
|
|
685
|
+
/**
|
|
686
|
+
* A suggestions panel under the search box — the Drive-style "hits as you
|
|
687
|
+
* type" affordance.
|
|
688
|
+
*
|
|
689
|
+
* NOT a `ReactNode` like the slots above, and not anywhere near them: those
|
|
690
|
+
* render into `.hot-toolbar-actions`, which sits AFTER the toolbar spacer, on
|
|
691
|
+
* the far right of the row. A hint panel has to be under the input it
|
|
692
|
+
* belongs to, so `SearchBar` owns the anchoring (measured + portalled, because
|
|
693
|
+
* `.hot-card` clips) and this hands back only the contents.
|
|
694
|
+
*
|
|
695
|
+
* A render prop because relevance is domain knowledge: what a good hint shows,
|
|
696
|
+
* where it comes from and what it means to click one is the host's business.
|
|
697
|
+
*/
|
|
698
|
+
searchSuggestions?: SearchSuggestionsRenderer;
|
|
699
|
+
/** Debounce before the search box publishes a query. Default 300ms; a table
|
|
700
|
+
* with `searchSuggestions` usually wants less, so the panel feels live. */
|
|
701
|
+
searchDebounceMs?: number;
|
|
702
|
+
/** Placeholder for the search box. Default: "Search…". */
|
|
703
|
+
searchPlaceholder?: string;
|
|
704
|
+
/**
|
|
705
|
+
* Rename a group heading — given the field, the raw value and the row count.
|
|
706
|
+
*
|
|
707
|
+
* The grouping engine has one word for a group with no value, `(Empty)`
|
|
708
|
+
* (`EMPTY_GROUP_VALUE`), and it names the TABLE'S INTERNALS rather than the
|
|
709
|
+
* data. Grouped by case, that pile is "No case" — the documents nobody has
|
|
710
|
+
* filed — and only the host knows that. Without this hook a host can rename
|
|
711
|
+
* the sections in its own body renderer and not in the table, which is how one
|
|
712
|
+
* list ends up calling the same pile two different things.
|
|
713
|
+
*
|
|
714
|
+
* Return `undefined` to keep the default.
|
|
715
|
+
*/
|
|
716
|
+
formatGroupValue?: (ctx: { field: string; value: string; count: number }) => string | undefined;
|
|
717
|
+
/** Enable fullscreen toggle button. Default: false */
|
|
718
|
+
enableFullscreen?: boolean;
|
|
719
|
+
/** Callback when fullscreen state changes */
|
|
720
|
+
onFullscreenChange?: (isFullscreen: boolean) => void;
|
|
721
|
+
/**
|
|
722
|
+
* Enable the Excel/Airtable-style fill handle: a grab-nub on the single
|
|
723
|
+
* active editable cell that drag-fills its value up/down the column.
|
|
724
|
+
* Default: false (opt-in per table).
|
|
725
|
+
*/
|
|
726
|
+
enableFillHandle?: boolean;
|
|
727
|
+
/**
|
|
728
|
+
* Above this many target cells, a fill drag asks for confirmation before
|
|
729
|
+
* writing (each filled cell fires a save → a persist request). Default: 100.
|
|
730
|
+
*/
|
|
731
|
+
fillConfirmThreshold?: number;
|
|
732
|
+
/**
|
|
733
|
+
* Visual style for read-only cells. Default: 'muted'
|
|
734
|
+
* - 'muted': Gray background - indicates cells are not editable
|
|
735
|
+
* - 'normal': Same as editable cells - no visual difference
|
|
736
|
+
* - 'subtle': Very subtle background - minimal visual indication
|
|
737
|
+
*/
|
|
738
|
+
readOnlyStyle?: ReadOnlyStyle;
|
|
739
|
+
/**
|
|
740
|
+
* Hover style for clickable rows. Only applies when onRowClick is set.
|
|
741
|
+
* - 'default': Light blue (selection color)
|
|
742
|
+
* - 'subtle': Light gray
|
|
743
|
+
* - 'accent': Theme accent color
|
|
744
|
+
* @default 'default'
|
|
745
|
+
*/
|
|
746
|
+
rowHoverStyle?: RowHoverStyle;
|
|
747
|
+
/**
|
|
748
|
+
* Disable the built-in column header context menu (modern layout).
|
|
749
|
+
* When true, reverts to classic double-click behavior for column actions.
|
|
750
|
+
* @default false
|
|
751
|
+
*/
|
|
752
|
+
disableBuiltinColumnMenu?: boolean;
|
|
753
|
+
/**
|
|
754
|
+
* Remove the outer border and border-radius from the table container.
|
|
755
|
+
* Use when the table fills the full page and should blend with the layout.
|
|
756
|
+
* @default false
|
|
757
|
+
*/
|
|
758
|
+
borderless?: boolean;
|
|
759
|
+
/**
|
|
760
|
+
* Custom batch actions appended to the grouped-actions (bulk) bar shown when
|
|
761
|
+
* ≥1 row is selected. Each is rendered after the built-in Copy / Delete
|
|
762
|
+
* buttons and receives the selected row ids on click.
|
|
763
|
+
*/
|
|
764
|
+
bulkActions?: BulkActionConfig[];
|
|
765
|
+
/**
|
|
766
|
+
* Virtualize COLUMNS in addition to rows.
|
|
767
|
+
*
|
|
768
|
+
* Default FALSE — opt-in per table, because it changes rendering for 56
|
|
769
|
+
* consumer files. With it off the grid mounts every column exactly as it does
|
|
770
|
+
* today (the window "fails open" to the full set), so switching the flag off
|
|
771
|
+
* is a byte-identical render, not a fallback path.
|
|
772
|
+
*
|
|
773
|
+
* THE NAME IS LOAD-BEARING: `apps/web/src/app/dev/dynamic-table-stress/`
|
|
774
|
+
* spreads this literal key when `?colvirt=1`. Any other spelling and the
|
|
775
|
+
* measurement toggle silently no-ops.
|
|
776
|
+
*
|
|
777
|
+
* @default false
|
|
778
|
+
*/
|
|
779
|
+
enableColumnVirtualization?: boolean;
|
|
780
|
+
/**
|
|
781
|
+
* Horizontal overscan in columns, i.e. how many unseen columns are mounted
|
|
782
|
+
* either side of the viewport. Raising it spends the density budget this
|
|
783
|
+
* feature exists to buy — diagnose blank columns as a commit-latency problem
|
|
784
|
+
* before reaching for this.
|
|
785
|
+
*
|
|
786
|
+
* @default 3 (DEFAULT_COLUMN_OVERSCAN)
|
|
787
|
+
*/
|
|
788
|
+
columnOverscan?: number;
|
|
789
|
+
/**
|
|
790
|
+
* Hide the row-density picker in the toolbar. Density is a PER-USER
|
|
791
|
+
* preference (see `hooks/useDensityPreference`), so hiding the control does
|
|
792
|
+
* not pin the level — a user who set `dense` elsewhere still gets `dense`
|
|
793
|
+
* here. Use `densityLevel` for that.
|
|
794
|
+
*
|
|
795
|
+
* @default false
|
|
796
|
+
*/
|
|
797
|
+
hideDensityControl?: boolean;
|
|
798
|
+
/**
|
|
799
|
+
* Keep Export / Row height / Fullscreen as separate toolbar buttons.
|
|
800
|
+
*
|
|
801
|
+
* Default is CONDENSED — one overflow button — because those three are
|
|
802
|
+
* secondary controls that were each spending toolbar width on every table in
|
|
803
|
+
* the app, crowding out the primary action a page actually cares about
|
|
804
|
+
* ("Create Offer", "Add Location"). Set this when a table genuinely wants
|
|
805
|
+
* them one click away.
|
|
806
|
+
*/
|
|
807
|
+
expandToolbarActions?: boolean;
|
|
808
|
+
/**
|
|
809
|
+
* Rows a HOST appends inside the toolbar's overflow menu.
|
|
810
|
+
*
|
|
811
|
+
* Exists so a host adds items to the table's one menu instead of rendering a
|
|
812
|
+
* second button next to it — which is what an earlier build did, leaving two
|
|
813
|
+
* near-identical overflow buttons side by side.
|
|
814
|
+
*/
|
|
815
|
+
toolbarOverflowExtras?: React.ReactNode;
|
|
816
|
+
/**
|
|
817
|
+
* DEVELOPER override for tables whose structure demands a fixed density (a
|
|
818
|
+
* two-row summary strip, a fixed-height drawer sub-table). Read-only: it wins
|
|
819
|
+
* for THIS table and is never persisted, so it cannot silently become the
|
|
820
|
+
* user's setting everywhere. Omit for the normal case.
|
|
821
|
+
*/
|
|
822
|
+
densityLevel?: DensityLevel;
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
/**
|
|
826
|
+
* Function type for loading filter suggestions from a server.
|
|
827
|
+
* When provided, the filter popover will use this instead of extracting values from loaded data.
|
|
828
|
+
* This is recommended for large datasets (1000+ rows) to avoid client-side performance issues.
|
|
829
|
+
*
|
|
830
|
+
* @param field - The field/column name to get suggestions for
|
|
831
|
+
* @param query - The current search query typed by the user (for filtering suggestions server-side)
|
|
832
|
+
* @returns Promise resolving to an array of suggestion strings
|
|
833
|
+
*/
|
|
834
|
+
export type LoadFilterSuggestions = (field: string, query: string) => Promise<string[]>;
|
|
835
|
+
|
|
836
|
+
/**
|
|
837
|
+
* A whitelisted field a linked (lookup) column can surface from a related record.
|
|
838
|
+
*/
|
|
839
|
+
export interface LookupSourceFieldOption {
|
|
840
|
+
/** Target field key, e.g. `'tax_id'`. */
|
|
841
|
+
key: string;
|
|
842
|
+
/** Translated, user-facing field label. */
|
|
843
|
+
label: string;
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
/**
|
|
847
|
+
* A foreign-key relationship the current table can attach linked columns to.
|
|
848
|
+
* Supplied by the host (which knows its `tableId`) via {@link LoadLookupSources}
|
|
849
|
+
* so `packages/ui` never imports the host's lookup module.
|
|
850
|
+
*/
|
|
851
|
+
export interface LookupSourceOption {
|
|
852
|
+
/** Registered lookup source key (an FK relationship), e.g. `'contractor'`. */
|
|
853
|
+
key: string;
|
|
854
|
+
/** Translated, user-facing relationship label, e.g. `'Contractor'`. */
|
|
855
|
+
label: string;
|
|
856
|
+
/** Whitelisted fields that may be surfaced as linked columns. */
|
|
857
|
+
fields: LookupSourceFieldOption[];
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
/**
|
|
861
|
+
* Loads the foreign-key lookup sources available for this table. When provided,
|
|
862
|
+
* the Configure View drawer shows a "Linked columns" section. Called lazily when
|
|
863
|
+
* the drawer opens.
|
|
864
|
+
*/
|
|
865
|
+
export type LoadLookupSources = () => Promise<LookupSourceOption[]>;
|
|
866
|
+
|
|
867
|
+
// ============================================
|
|
868
|
+
// KEYBOARD SHORTCUTS
|
|
869
|
+
// ============================================
|
|
870
|
+
|
|
871
|
+
/**
|
|
872
|
+
* Defines a keyboard shortcut for a row action.
|
|
873
|
+
* Shortcuts only fire when a single cell is selected (not editing, not multi-select).
|
|
874
|
+
*/
|
|
875
|
+
export interface RowActionShortcut {
|
|
876
|
+
/** Unique identifier for this shortcut (e.g., 'view', 'delete') */
|
|
877
|
+
id: string;
|
|
878
|
+
/** Display label for documentation/tooltips (e.g., 'Open detail') */
|
|
879
|
+
label: string;
|
|
880
|
+
/** The key to match (e.g., 'Enter', 'd', 'Backspace') — uses KeyboardEvent.key */
|
|
881
|
+
key: string;
|
|
882
|
+
/** Whether Shift must be held. Default: false */
|
|
883
|
+
shift?: boolean;
|
|
884
|
+
/** Whether Ctrl/Cmd must be held. Default: false */
|
|
885
|
+
ctrlOrCmd?: boolean;
|
|
886
|
+
/** Whether Alt must be held. Default: false */
|
|
887
|
+
alt?: boolean;
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
/**
|
|
891
|
+
* Configuration for DynamicTable keyboard shortcuts.
|
|
892
|
+
*/
|
|
893
|
+
export interface KeyboardShortcutsConfig {
|
|
894
|
+
/** Row-level action shortcuts (fire when a single row is selected) */
|
|
895
|
+
rowActions?: RowActionShortcut[];
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
/**
|
|
899
|
+
* Callback fired when a keyboard shortcut triggers a row action.
|
|
900
|
+
* @param actionId - The `id` of the matched RowActionShortcut
|
|
901
|
+
* @param rowData - The data object for the currently selected row
|
|
902
|
+
* @param rowIndex - The index of the currently selected row
|
|
903
|
+
*/
|
|
904
|
+
export type OnRowAction = (actionId: string, rowData: any, rowIndex: number) => void;
|
|
905
|
+
|
|
906
|
+
export interface DynamicTableProps {
|
|
907
|
+
data?: any[];
|
|
908
|
+
columns?: ColumnDef[];
|
|
909
|
+
colHeaders?: boolean;
|
|
910
|
+
rowHeaders?: boolean;
|
|
911
|
+
height?: string | number;
|
|
912
|
+
width?: string | number;
|
|
913
|
+
idColumnName?: string;
|
|
914
|
+
tableName?: string;
|
|
915
|
+
/**
|
|
916
|
+
* Stable identifier for this table, used to persist per-user column widths in
|
|
917
|
+
* localStorage across reloads. Scoped to the signed-in user (falling back to
|
|
918
|
+
* the active organization). When omitted, manual column resizes are not
|
|
919
|
+
* remembered. Pass the same id you use for `perspectives` so widths track the
|
|
920
|
+
* table, not the page instance.
|
|
921
|
+
*/
|
|
922
|
+
tableId?: string;
|
|
923
|
+
tableRef: React.RefObject<HTMLDivElement | null>;
|
|
924
|
+
columnActions?: (column: ColumnDef, colIndex: number) => ContextMenuAction[];
|
|
925
|
+
rowActions?: (rowData: any, rowIndex: number) => ContextMenuAction[];
|
|
926
|
+
actionsRenderer?: (rowData: any, rowIndex: number) => React.ReactNode;
|
|
927
|
+
pagination?: PaginationProps;
|
|
928
|
+
/**
|
|
929
|
+
* The dataset-wide search term currently narrowing `data` (the `SearchBar`'s
|
|
930
|
+
* query). Read-only, and used for ONE thing: find-and-replace's scope label
|
|
931
|
+
* says "…in 100 loaded rows (filtered by "abc")" so a loaded-page match count
|
|
932
|
+
* can never be mistaken for a dataset count. Omitted → the clause is omitted.
|
|
933
|
+
*/
|
|
934
|
+
searchQuery?: string;
|
|
935
|
+
|
|
936
|
+
|
|
937
|
+
|
|
938
|
+
// DEPRECATED - Keep for backward compatibility (converts to perspectives internally)
|
|
939
|
+
savedFilters?: SavedFilter[];
|
|
940
|
+
activeFilterId?: string | null;
|
|
941
|
+
hiddenColumns?: string[];
|
|
942
|
+
|
|
943
|
+
// Debug mode - shows floating event log panel
|
|
944
|
+
debug?: boolean;
|
|
945
|
+
|
|
946
|
+
// UI visibility configuration
|
|
947
|
+
uiConfig?: TableUIConfig;
|
|
948
|
+
|
|
949
|
+
|
|
950
|
+
/**
|
|
951
|
+
* Refs to adjacent DynamicTable containers for cross-table navigation.
|
|
952
|
+
* ArrowDown at the last row / ArrowUp at the first row moves focus to
|
|
953
|
+
* `next` / `prev`. Tab past the last editable cell also moves to `next`,
|
|
954
|
+
* and Shift+Tab before the first editable cell moves to `prev`.
|
|
955
|
+
*/
|
|
956
|
+
/** When true, automatically selects the first cell when table receives focus */
|
|
957
|
+
autoSelectOnFocus?: boolean;
|
|
958
|
+
/** When true, Tab navigation enters edit mode on the target cell. @default true */
|
|
959
|
+
autoEditOnTab?: boolean;
|
|
960
|
+
/** Function to load filter suggestions from the server */
|
|
961
|
+
loadFilterSuggestions?: LoadFilterSuggestions;
|
|
962
|
+
/** Function to load the table's FK lookup sources. When set, the Configure
|
|
963
|
+
* View drawer shows a "Linked columns" section. */
|
|
964
|
+
loadLookupSources?: LoadLookupSources;
|
|
965
|
+
/** Keyboard shortcuts for row-level actions */
|
|
966
|
+
keyboardShortcuts?: KeyboardShortcutsConfig;
|
|
967
|
+
/** Callback fired when a keyboard shortcut triggers a row action */
|
|
968
|
+
onRowAction?: OnRowAction;
|
|
969
|
+
/** Refs to adjacent DynamicTable containers for cross-table navigation */
|
|
970
|
+
siblingTableRefs?: {
|
|
971
|
+
prev?: React.RefObject<HTMLDivElement | null>;
|
|
972
|
+
next?: React.RefObject<HTMLDivElement | null>;
|
|
973
|
+
};
|
|
974
|
+
/** Callback when a row is clicked. Enables clickable row mode with hover highlighting. */
|
|
975
|
+
onRowClick?: (rowIndex: number, rowData: any, event: React.MouseEvent) => void;
|
|
976
|
+
/** Callback when a row is double-clicked */
|
|
977
|
+
onRowDoubleClick?: (rowIndex: number, rowData: any, event: React.MouseEvent) => void;
|
|
978
|
+
/** ID of the row to highlight (same style as hover) */
|
|
979
|
+
highlightedRowId?: string | null;
|
|
980
|
+
/** Width in pixels for the actions column. @default 80 */
|
|
981
|
+
actionsColumnWidth?: number;
|
|
982
|
+
/** Enable cell comments and color annotations */
|
|
983
|
+
enableComments?: boolean;
|
|
984
|
+
/** Entity type for annotations. String or function that resolves per-row. */
|
|
985
|
+
commentsEntityType?: string | ((row: any) => string);
|
|
986
|
+
/**
|
|
987
|
+
* B8a — resolve the annotation target for ONE CELL, so a row that is not one
|
|
988
|
+
* record can scope each column to the record its value actually belongs to.
|
|
989
|
+
* Defaults to `{ entityType: commentsEntityType, rowId: row[idColumnName] }`.
|
|
990
|
+
* See the same prop on `DynamicTable` for the full rationale.
|
|
991
|
+
*/
|
|
992
|
+
commentsCellTarget?: (row: Record<string, any>, col: ColumnDef) => { entityType: string; rowId: string };
|
|
993
|
+
/** Optional view context label stored as metadata (e.g., "project_sea_containers"). */
|
|
994
|
+
commentsViewContext?: string;
|
|
995
|
+
/** Called after any annotation or comment change (create, update, delete). */
|
|
996
|
+
onAnnotationChange?: () => void;
|
|
997
|
+
/** Message to display when table has no data */
|
|
998
|
+
emptyMessage?: string;
|
|
999
|
+
/** Saved perspective configurations */
|
|
1000
|
+
savedPerspectives?: PerspectiveConfig[];
|
|
1001
|
+
/** Currently active perspective ID */
|
|
1002
|
+
activePerspectiveId?: string | null;
|
|
1003
|
+
/**
|
|
1004
|
+
* The view that opens by default FOR THIS USER (workshop A4). Drives the star
|
|
1005
|
+
* on the tab and the enabled state of "Set as my default". Per-user: upstream
|
|
1006
|
+
* scopes `isDefault` by `userId`.
|
|
1007
|
+
*/
|
|
1008
|
+
defaultPerspectiveId?: string | null;
|
|
1009
|
+
/**
|
|
1010
|
+
* Views colleagues published as SHARED TEMPLATES. Offered for copying only —
|
|
1011
|
+
* never applied to anyone automatically, which is what keeps every saved
|
|
1012
|
+
* setting per-user after sharing exists.
|
|
1013
|
+
*/
|
|
1014
|
+
sharedTemplates?: import('./perspective').PerspectiveTemplate[];
|
|
1015
|
+
/** Whether this user may publish a view (server's `perspectives.role_defaults` answer). */
|
|
1016
|
+
canPublishTemplates?: boolean;
|
|
1017
|
+
/** Roles a template can be published to. Empty unless `canPublishTemplates`. */
|
|
1018
|
+
publishableRoles?: Array<{ id: string; name: string }>;
|
|
1019
|
+
/** Columns hidden by default */
|
|
1020
|
+
defaultHiddenColumns?: string[];
|
|
1021
|
+
/** Density of row padding (v2 design). */
|
|
1022
|
+
density?: 'sm' | 'md';
|
|
1023
|
+
/** Zebra-stripe alternate rows with the secondary surface (v2 design). */
|
|
1024
|
+
striped?: boolean;
|
|
1025
|
+
/** Called with the selected row IDs whenever the v2 checkbox-column
|
|
1026
|
+
* selection changes. Drives bulk actions (e.g. mark-paid). */
|
|
1027
|
+
onSelectionChange?: (selectedIds: string[]) => void;
|
|
1028
|
+
/**
|
|
1029
|
+
* Fetch the entire dataset (all pages, ignoring the active perspective's
|
|
1030
|
+
* filters) for a whole-table export. Supplied by `useDynamicTablePage`. When
|
|
1031
|
+
* present, the toolbar Export button exports every row across all columns;
|
|
1032
|
+
* when absent it falls back to the currently-loaded page.
|
|
1033
|
+
*
|
|
1034
|
+
* MAY REJECT, and the caller must let it (HEDGE-123). A page that fails
|
|
1035
|
+
* mid-pagination must abort the export, never shorten it — a short CSV looks
|
|
1036
|
+
* exactly like a complete one and goes into a reconciliation unnoticed.
|
|
1037
|
+
*
|
|
1038
|
+
* May also resolve to an {@link ExportAllResult} instead of a bare array, to
|
|
1039
|
+
* report a result it could not prove complete. A bare array still means
|
|
1040
|
+
* "complete", so existing implementations are unaffected.
|
|
1041
|
+
*/
|
|
1042
|
+
onExportAll?: () => Promise<any[] | ExportAllResult>;
|
|
1043
|
+
/**
|
|
1044
|
+
* Server-computed aggregate over the whole filtered dataset, from
|
|
1045
|
+
* `useDynamicTablePage`. Absent/null → the pinned totals row folds the loaded
|
|
1046
|
+
* page instead and says so.
|
|
1047
|
+
*/
|
|
1048
|
+
aggregateResult?: import('./grouping').AggregateResult | null;
|
|
1049
|
+
aggregateLoading?: boolean;
|
|
1050
|
+
aggregateError?: boolean;
|
|
1051
|
+
/**
|
|
1052
|
+
* The LIST request itself failed (HEDGE-119) — not "the table is empty".
|
|
1053
|
+
*
|
|
1054
|
+
* Supplied by `useDynamicTablePage` from the dataset query's error state.
|
|
1055
|
+
* When true the zero-row region renders `LoadErrorState` instead of
|
|
1056
|
+
* `EmptyState`, because a rejected query and a genuinely empty table both
|
|
1057
|
+
* arrive as `data: []` and were previously indistinguishable on screen.
|
|
1058
|
+
* Defaults false, so every existing host keeps its current behaviour.
|
|
1059
|
+
*/
|
|
1060
|
+
loadError: boolean;
|
|
1061
|
+
/** Re-runs the failed list request from the error state's retry button. */
|
|
1062
|
+
onRetryLoad?: () => void;
|
|
1063
|
+
/**
|
|
1064
|
+
* Draw the table's BODY as something other than rows.
|
|
1065
|
+
*
|
|
1066
|
+
* THE POINT OF THIS PROP is that the alternative renderer cannot own state
|
|
1067
|
+
* the table also owns. `DynamicTable` stays mounted and keeps everything it
|
|
1068
|
+
* already keeps — the toolbar, the search box, the filters, the perspective
|
|
1069
|
+
* tabs, the grouping, the selection, the pagination and the bulk-action bar.
|
|
1070
|
+
* Only the region between the toolbar and the footer changes. So a second
|
|
1071
|
+
* view cannot diverge from the table by construction, rather than by anyone
|
|
1072
|
+
* remembering to keep them in step.
|
|
1073
|
+
*
|
|
1074
|
+
* Called only while `viewMode` is not `'table'`. When it is absent the mode
|
|
1075
|
+
* has nothing to switch to and the switcher is not rendered.
|
|
1076
|
+
*/
|
|
1077
|
+
renderBody?: (ctx: TableBodyRenderContext) => React.ReactNode;
|
|
1078
|
+
|
|
1079
|
+
/**
|
|
1080
|
+
* ⚠ `DynamicTableProps` IS DECLARED TWICE — here and in `DynamicTable.tsx`.
|
|
1081
|
+
*
|
|
1082
|
+
* They have drifted in BOTH directions, which is how FMS's production build
|
|
1083
|
+
* broke: this copy carried `defaultGrouping` and not `renderBody`, the other
|
|
1084
|
+
* carried `renderBody` and not `defaultGrouping`, and the component and its
|
|
1085
|
+
* consumers each resolved a different one. `tsc` reported a prop that is
|
|
1086
|
+
* plainly used as not existing.
|
|
1087
|
+
*
|
|
1088
|
+
* Reconciled rather than merged: collapsing two ~150-member interfaces is a
|
|
1089
|
+
* change worth doing on its own, not while unblocking a deploy. Anything
|
|
1090
|
+
* added to one MUST be added to the other until then.
|
|
1091
|
+
*/
|
|
1092
|
+
/** Grouping applied when a perspective declares none. See the fuller note on
|
|
1093
|
+
* the sibling declaration. */
|
|
1094
|
+
defaultGrouping?: import('./grouping').GroupRule[];
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
/**
|
|
1098
|
+
* Everything an alternative body renderer is given. It is READ-MOSTLY on
|
|
1099
|
+
* purpose: the callbacks mutate the table's own state, so a renderer changes
|
|
1100
|
+
* the same thing the table would have changed.
|
|
1101
|
+
*/
|
|
1102
|
+
export interface TableBodyRenderContext {
|
|
1103
|
+
/** The current page of rows, exactly as the table has them. */
|
|
1104
|
+
data: any[];
|
|
1105
|
+
/** The resolved, visible columns in display order. */
|
|
1106
|
+
columns: ColumnDef[];
|
|
1107
|
+
/**
|
|
1108
|
+
* The grouped layout when a `GroupRule[]` is active, else `null`. Section
|
|
1109
|
+
* headers carry `memberDataIndices`, which is what makes a group's
|
|
1110
|
+
* select-all select rows a collapsed section is hiding.
|
|
1111
|
+
*/
|
|
1112
|
+
visualRows: import('./grouping').VisualRow[] | null;
|
|
1113
|
+
/** The active grouping. Empty ⇒ the body renders one flat run of rows. */
|
|
1114
|
+
groupRules: import('./grouping').GroupRule[];
|
|
1115
|
+
collapsedGroups: ReadonlySet<string>;
|
|
1116
|
+
toggleGroup: (groupKey: string) => void;
|
|
1117
|
+
/** Row-key values of the selected rows. Same set the bulk bar counts. */
|
|
1118
|
+
selectedRowIds: ReadonlySet<string>;
|
|
1119
|
+
/** The column whose value identifies a row for selection. */
|
|
1120
|
+
rowKeyColumn: string;
|
|
1121
|
+
selectable: boolean;
|
|
1122
|
+
toggleRowSelect: (rowId: string, opts?: { shiftKey?: boolean }) => void;
|
|
1123
|
+
toggleGroupSelect: (rowIds: string[]) => void;
|
|
1124
|
+
clearSelection: () => void;
|
|
1125
|
+
/** The needle currently narrowing the rows, for an honest empty state. */
|
|
1126
|
+
searchQuery?: string;
|
|
1127
|
+
/**
|
|
1128
|
+
* The live filter rules — the SAME array the Configure View drawer and the
|
|
1129
|
+
* header quick filters edit.
|
|
1130
|
+
*
|
|
1131
|
+
* A body renderer that offers its own quick filter (a chip row, a facet
|
|
1132
|
+
* list) writes through `setFilters` rather than holding a selection of its
|
|
1133
|
+
* own. That is what makes such a control visible to the table view, to the
|
|
1134
|
+
* active-filter chips and to a saved view; a private selection would be a
|
|
1135
|
+
* second filter model that can disagree with the list.
|
|
1136
|
+
*/
|
|
1137
|
+
filters: FilterRow[];
|
|
1138
|
+
setFilters: (filters: FilterRow[]) => void;
|
|
1139
|
+
/** How many filter rules are active, for an honest empty state. */
|
|
1140
|
+
filterCount: number;
|
|
1141
|
+
/** Drop the search / the filters — the two ways out of an empty result. */
|
|
1142
|
+
clearSearch: () => void;
|
|
1143
|
+
clearFilters?: () => void;
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
/** One segment of the view switcher. */
|
|
1147
|
+
export interface TableViewModeOption {
|
|
1148
|
+
mode: import('./perspective').TableViewMode;
|
|
1149
|
+
/** Accessible label. Also the tooltip. */
|
|
1150
|
+
label: string;
|
|
1151
|
+
icon: React.ReactNode;
|
|
1152
|
+
}
|
|
1153
|
+
|
|
1154
|
+
// Re-export filter types
|
|
1155
|
+
export * from './filters';
|
|
1156
|
+
|
|
1157
|
+
// Re-export perspective types
|
|
1158
|
+
export * from './perspective';
|
|
1159
|
+
|
|
1160
|
+
// Re-export grouping types
|
|
1161
|
+
export * from './grouping';
|
|
1162
|
+
|
|
1163
|
+
// Re-export rollup ("summarised column") types. Single export site — see the
|
|
1164
|
+
// header of ./rollup for why nothing else may re-export these names.
|
|
1165
|
+
export * from './rollup';
|
|
1166
|
+
|
|
1167
|
+
/**
|
|
1168
|
+
* The outcome of a whole-table export fetch (HEDGE-123).
|
|
1169
|
+
*
|
|
1170
|
+
* Exists so a partial result can never be mistaken for a complete one. The
|
|
1171
|
+
* defect this replaces returned a bare `any[]` whichever happened: a page that
|
|
1172
|
+
* 500'd, a page that came back as `200` with an unparseable body, and a walk
|
|
1173
|
+
* that hit an internal iteration cap all produced the same value as a clean
|
|
1174
|
+
* finish — a shorter array, with nothing to distinguish it.
|
|
1175
|
+
*
|
|
1176
|
+
* That is the CSV mirror of the empty-list defect in HEDGE-119. There the user
|
|
1177
|
+
* read a failed fetch as "no rows"; here they read a truncated file as "these
|
|
1178
|
+
* are all the rows". The second is worse, because a file looks like an answer:
|
|
1179
|
+
* a failure is visible and can be retried, a short export goes into a
|
|
1180
|
+
* reconciliation and is never questioned.
|
|
1181
|
+
*
|
|
1182
|
+
* Hard failures REJECT rather than resolving to this. This type is only for
|
|
1183
|
+
* the case where rows were genuinely fetched but completeness cannot be proven.
|
|
1184
|
+
*/
|
|
1185
|
+
export interface ExportAllResult {
|
|
1186
|
+
/** The rows actually collected. */
|
|
1187
|
+
rows: any[];
|
|
1188
|
+
/** How many rows the server said exist, when it reported a total. */
|
|
1189
|
+
expected: number | null;
|
|
1190
|
+
/**
|
|
1191
|
+
* False when the walk stopped without proving it had everything. The caller
|
|
1192
|
+
* must NOT hand the user a file in that case — it must say how many of how
|
|
1193
|
+
* many it got.
|
|
1194
|
+
*/
|
|
1195
|
+
complete: boolean;
|
|
1196
|
+
/** Why completeness could not be proven. Present only when `complete` is false. */
|
|
1197
|
+
reason?: string;
|
|
1198
|
+
}
|