@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,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/backend/dynamic-table/split-view/SplitViewHost.tsx"],
|
|
4
|
+
"sourcesContent": ["'use client'\n\n/**\n * Split view \u2014 renders a TREE of registered tables in one screen.\n *\n * A table page renders this instead of its table component, naming itself as\n * the only pane. With one pane it looks exactly like the page did before this\n * feature existed; pane headers and dividers appear only once a second table is\n * opened. That is what makes it ambient \u2014 you split from where you already are.\n *\n * The layout is a tree so nested arrangements are expressible \u2014 notably \"two\n * side by side with a third full-width beneath\", which the earlier flat model\n * could not represent at all. Rendering is recursive: a split node lays its\n * children along its own axis and drops a divider between each pair.\n *\n * The grid needs no changes to work here: its event bus is per-element, copy\n * and paste are both target-guarded, `height: 'fill'` measures against the\n * nearest scroll ancestor (each pane is one), and the cell store \u2014 including\n * its undo stack \u2014 is created per instance.\n *\n * Spec: .ai/specs/2026-08-04-dynamic-table-split-view.md\n */\n\nimport * as React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Columns2, Rows2, X, ExternalLink, Save, ChevronDown, Trash2, LayoutGrid, Grid2x2, PanelLeft, PanelRight, PanelTop, PanelBottom, MoreHorizontal, Check, SlidersHorizontal } from 'lucide-react'\nimport { useTableById, useTableRegistry } from '../registry/TableRegistryContext'\nimport { useToolbarOverflowClose, ToolbarOverflowCloseProvider } from '../components/ToolbarOverflow'\nimport { computeAnchoredPosition } from '../utils/anchoredPosition'\nimport { ContentPicker } from './ContentPicker'\nimport { WidgetPane } from './WidgetPane'\nimport { EmptySlot } from './EmptySlot'\nimport { WorkspaceFilterBar, type UnmappedPaneReport } from './WorkspaceFilterBar'\nimport {\n mapCriteriaForTable,\n mapCriteriaForWidget,\n type SharedCriteria,\n} from './sharedCriteria'\nimport type { FilterRow } from '../types/index'\nimport { useSplitViewLayouts } from './useSplitViewLayouts'\nimport { readStoredLayout, writeStoredLayout } from './layoutPersistence'\nimport {\n ARRANGE_PRESETS,\n GRID_TEMPLATE_LIST,\n PANE_MIN_HEIGHT_PX,\n PANE_MIN_WIDTH_PX,\n SPLIT_LAYOUT_VERSION,\n applyGridTemplate,\n applyPreset,\n countPanes,\n countSlots,\n evenAll,\n fillSlot,\n listPanes,\n listSlots,\n makePaneId,\n removePane,\n resizeAt,\n setPaneChrome,\n setPaneContentSettings,\n splitPane,\n tableContent,\n type GridTemplateId,\n type LayoutNode,\n type NodePath,\n type PaneChrome,\n type PaneContentRef,\n type PresetId,\n type SplitDirection,\n type SplitLayout,\n} from './types'\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Material 3 chrome, shared by every menu the split view draws.\n *\n * The row string below was duplicated verbatim in five places, which is how\n * three of them drifted onto raw pixel type. One const, one look.\n *\n * `h-7` (28px) is kept DELIBERATELY: M3 specifies a 48dp menu item, and this is\n * a dense operations tool where six 48dp rows are most of a pane. Shape, colour,\n * state layers and motion are adopted from M3; its touch geometry is not \u2014 the\n * same trade `m3.css` documents at the top of the file.\n */\nexport const M3_MENU_ROW =\n 'flex h-7 w-full items-center gap-2 rounded-m3-xs px-1.5 text-left text-body-regular-xs text-[var(--m3-on-surface)] transition-colors duration-[var(--m3-duration-short2)] ease-m3-standard hover:bg-[var(--m3-state-layer-hover)] active:bg-[var(--m3-state-layer-pressed)]'\n\n/**\n * The SELECTED form of a menu row. M3 marks selection by swapping the\n * container, never by an icon alone \u2014 the same `secondary-container` role the\n * grid uses for a selected row, so selection reads identically everywhere.\n */\nexport const M3_MENU_ROW_ON =\n `${M3_MENU_ROW} bg-[var(--m3-secondary-container)] text-[var(--m3-on-secondary-container)]`\n\n/**\n * A section caption inside a menu (\"Add table\", \"Show\"). 10px chrome uses the\n * 10px token: routing it through a 12/16 token would grow every menu by 20%.\n */\nexport const M3_MENU_CAPTION =\n 'text-label-semibold-2xs uppercase text-[var(--m3-on-surface-variant)]'\n\n/**\n * A portalled menu panel \u2014 an M3 elevated surface: a `md` (12px) corner, the\n * softer `outline-variant` hairline, a container step for the fill, and the\n * two-shadow elevation rather than Tailwind's `shadow-*`.\n *\n * `WidgetPane` imports this. The resulting import cycle is safe: the binding is\n * read at RENDER time, long after both module bodies have initialised.\n */\nexport const M3_MENU_PANEL =\n 'fixed z-[1000] overflow-y-auto rounded-m3-md border border-[var(--m3-outline-variant)] bg-[var(--m3-surface-container)] py-1 shadow-m3-2'\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction PaneBody({\n content,\n paneId,\n isPrimary,\n multiview,\n overflowExtras,\n chrome,\n onWidgetSettingsChange,\n sharedFilters,\n sharedSearch,\n}: {\n content: PaneContentRef\n paneId: string\n isPrimary: boolean\n multiview: boolean\n overflowExtras?: React.ReactNode\n chrome?: PaneChrome\n onWidgetSettingsChange?: (next: unknown) => void\n sharedFilters?: FilterRow[]\n sharedSearch?: string\n}) {\n if (content.kind === 'widget') {\n return (\n <WidgetPane\n content={content}\n slotId={paneId}\n onSettingsChange={onWidgetSettingsChange}\n overflowExtras={overflowExtras}\n hideToolbar={chrome?.toolbar === false}\n />\n )\n }\n return (\n <TablePaneBody\n tableId={content.tableId}\n paneId={paneId}\n isPrimary={isPrimary}\n multiview={multiview}\n overflowExtras={overflowExtras}\n chrome={chrome}\n sharedFilters={sharedFilters}\n sharedSearch={sharedSearch}\n />\n )\n}\n\nfunction TablePaneBody({\n tableId,\n paneId,\n isPrimary,\n multiview,\n overflowExtras,\n chrome,\n sharedFilters,\n sharedSearch,\n}: {\n tableId: string\n paneId: string\n isPrimary: boolean\n multiview: boolean\n overflowExtras?: React.ReactNode\n chrome?: PaneChrome\n sharedFilters?: FilterRow[]\n sharedSearch?: string\n}) {\n const { definition, status } = useTableById(tableId)\n\n if (status === 'unknown') {\n return (\n <PaneMessage data-pane-status=\"unknown\">\n This table is no longer available.\n </PaneMessage>\n )\n }\n if (status === 'denied') {\n return (\n <PaneMessage data-pane-status=\"denied\">\n You don\u2019t have access to {definition?.metadata.title ?? 'this table'}.\n </PaneMessage>\n )\n }\n // `loading` = the grant check (a POST to /api/auth/feature-check) has not\n // answered yet. Falling through to the grid here meant a revoked table\n // mounted, fired its list request, and only then swapped to \"no access\" \u2014\n // which contradicts the ACL-re-checked-at-render contract this file states.\n //\n // But holding EVERY pane would put a placeholder on the first load of every\n // list page in the app, because that check is a real round-trip on first\n // paint (react-query serves it from cache thereafter). That trades a visible\n // slowdown on the common path against a flash on a rare one.\n //\n // So it is split by provenance. The PRIMARY pane is the page's own table and\n // the server already authorised this route to render it at all, so it is\n // drawn optimistically and the common path is unchanged. SECONDARY panes come\n // out of a SAVED LAYOUT, which can name a table whose grant was revoked since\n // it was saved \u2014 that is the case worth waiting for.\n if (status === 'loading' && !isPrimary) {\n return <PaneMessage data-pane-status=\"loading\">Checking access\u2026</PaneMessage>\n }\n if (!definition) return null\n\n const Table = definition.Table\n // The PRIMARY pane is the page's own table, so it keeps the unscoped keys \u2014\n // byte-identical to before split view existed. Anything else would break\n // persistence outright: pane ids are minted per mount, so scoping the primary\n // pane would hand every page load a fresh key and silently discard the user's\n // saved column widths on every navigation. (Caught in the browser, not by\n // typecheck \u2014 the code was \"correct\" and the behaviour was wrong.)\n //\n // Secondary panes DO get a per-pane scope, which is what stops two panes of\n // the same table overwriting each other. A saved layout persists its pane\n // ids, so reopening one restores the same scopes and the same widths.\n const storageScope = isPrimary ? '' : `pane:${paneId}:`\n return (\n <Table\n storageScope={storageScope}\n embedded\n // The primary pane IS the page \u2014 its table is what the route exists to\n // show, so opening a row is the page doing its job, not a click tearing\n // a host down. `embedded` alone said \"do not navigate\" to every pane, and\n // the Files list (whose only affordance to open a file is its row links\n // and row click) was left with no way in at all. See\n // `ownsPageNavigation` in registry/types.ts.\n ownsPageNavigation={isPrimary}\n multiview={multiview}\n overflowExtras={overflowExtras}\n hideToolbar={chrome?.toolbar === false}\n // The workspace bar REPLACES each pane's search row while it is on, so\n // the density cost of the bar is paid back by the rows it reclaims.\n hideSearch={chrome?.search === false || sharedSearch !== undefined}\n hideViews={chrome?.viewsBar === false}\n hidePagination={chrome?.viewsBar === false}\n sharedFilters={sharedFilters}\n sharedSearch={sharedSearch}\n />\n )\n}\n\nfunction PaneMessage({ children, ...rest }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div className=\"flex h-full items-center justify-center p-6 text-center text-body-regular-sm text-[var(--m3-on-surface-variant)]\" {...rest}>\n {children}\n </div>\n )\n}\n\n\n/**\n * Everything a pane can do, in ONE overflow menu inside the table's own\n * toolbar.\n *\n * Replaces a dedicated pane-header row that carried six icon buttons AND\n * repeated the table title the toolbar already showed. That row cost ~32px per\n * pane and bought nothing the toolbar could not hold.\n */\n/**\n * The pane's own items, as ROWS \u2014 no button, no panel of its own.\n *\n * These are injected into the table's single overflow menu via\n * `uiConfig.toolbarOverflowExtras`. An earlier build rendered them behind a\n * second button sitting right next to the table's overflow, which left two\n * near-identical menus in one toolbar.\n */\nfunction PaneMenuRows({\n href,\n chrome,\n canClose,\n extras,\n onSplit,\n onToggleChrome,\n onClose,\n}: {\n href?: string\n chrome?: PaneChrome\n canClose: boolean\n extras?: React.ReactNode\n onSplit: (direction: SplitDirection, before: boolean, anchor: DOMRect) => void\n onToggleChrome: (patch: Partial<PaneChrome>) => void\n onClose: () => void\n}) {\n // Terminal actions dismiss the menu; the Show toggles deliberately do not,\n // so several can be flipped in one visit.\n const closeMenu = useToolbarOverflowClose()\n\n const shows: Array<{ key: keyof PaneChrome; label: string }> = [\n { key: 'toolbar', label: 'Toolbar' },\n { key: 'search', label: 'Search' },\n { key: 'viewsBar', label: 'Views bar' },\n ]\n\n const ADD_TABLE: Array<{ dir: SplitDirection; before: boolean; label: string; Icon: typeof PanelLeft; attr: string }> = [\n { dir: 'row', before: true, label: 'Left', Icon: PanelLeft, attr: 'data-pane-split-left' },\n { dir: 'row', before: false, label: 'Right', Icon: PanelRight, attr: 'data-pane-split-right' },\n { dir: 'column', before: true, label: 'Above', Icon: PanelTop, attr: 'data-pane-split-up' },\n { dir: 'column', before: false, label: 'Below', Icon: PanelBottom, attr: 'data-pane-split-down' },\n ]\n\n const row = M3_MENU_ROW\n const gutter = 'flex w-4 shrink-0 justify-center'\n\n return (\n <div data-pane-menu-rows=\"\">\n <div className={`px-2 pb-1 pt-1 ${M3_MENU_CAPTION}`}>\n Add table\n </div>\n <div className=\"px-2 pb-2\">\n {/* An M3 connected button group: one pill, hairline-divided. The\n container's `overflow-hidden` is what gives the first and last\n segment their end caps. */}\n <div className=\"flex overflow-hidden rounded-m3-full border border-[var(--m3-outline)]\">\n {ADD_TABLE.map((item, index) => (\n <button\n key={item.label}\n type=\"button\"\n title={item.label}\n aria-label={`Add table ${item.label.toLowerCase()}`}\n onClick={(event) => { onSplit(item.dir, item.before, event.currentTarget.getBoundingClientRect()); closeMenu() }}\n className={`flex flex-1 flex-col items-center gap-0.5 py-1.5 text-[var(--m3-on-surface-variant)] transition-colors duration-[var(--m3-duration-short2)] ease-m3-standard hover:bg-[var(--m3-state-layer-hover)] hover:text-[var(--m3-on-surface)] active:bg-[var(--m3-state-layer-pressed)] ${\n index > 0 ? 'border-l border-[var(--m3-outline)]' : ''\n }`}\n {...{ [item.attr]: '' }}\n >\n <item.Icon className=\"h-3.5 w-3.5\" />\n <span className=\"text-label-semibold-2xs\">{item.label}</span>\n </button>\n ))}\n </div>\n </div>\n\n <div className={`px-2 pb-0.5 ${M3_MENU_CAPTION}`}>Show</div>\n <div className=\"px-1\">\n {shows.map((item) => {\n const on = chrome?.[item.key] !== false\n return (\n <button\n key={item.key}\n type=\"button\"\n onClick={(event) => { event.stopPropagation(); onToggleChrome({ [item.key]: !on } as Partial<PaneChrome>) }}\n className={on ? M3_MENU_ROW_ON : M3_MENU_ROW}\n data-pane-chrome={item.key}\n data-pane-chrome-on={on ? 'true' : 'false'}\n >\n <span className={gutter}>{on && <Check className=\"h-3.5 w-3.5\" />}</span>\n <span className={on ? '' : 'text-[var(--m3-on-surface-variant)]'}>{item.label}</span>\n </button>\n )\n })}\n </div>\n\n {extras && <div className=\"mt-1 border-t border-[var(--m3-outline-variant)] px-1 pt-1\">{extras}</div>}\n\n <div className=\"mt-1 border-t border-[var(--m3-outline-variant)] px-1 pt-1\">\n {href && (\n <a href={href} className={row} data-pane-open-full=\"\" onClick={closeMenu}>\n <span className={gutter}><ExternalLink className=\"h-3.5 w-3.5 text-[var(--m3-on-surface-variant)]\" /></span>\n Open full page\n </a>\n )}\n {canClose && (\n <button type=\"button\" onClick={() => { onClose(); closeMenu() }} className={row} data-pane-close=\"\">\n <span className={gutter}><X className=\"h-3.5 w-3.5 text-[var(--m3-on-surface-variant)]\" /></span>\n Close pane\n </button>\n )}\n </div>\n </div>\n )\n}\n\n/**\n * The way back when a pane's toolbar is hidden \u2014 hiding it also hides the\n * overflow menu that turned it off.\n *\n * Portalled to `document.body`, like every other menu in the grid. As a plain\n * `absolute` panel it sat at `z-40` INSIDE a pane that clips its overflow, so\n * the grid's sticky columns painted over it and clicks landed on `td.hot-cell`\n * instead \u2014 the handle opened a menu that could not be used.\n */\nfunction PaneRestoreMenu({ children }: { children: React.ReactNode }) {\n const [open, setOpen] = React.useState(false)\n const triggerRef = React.useRef<HTMLButtonElement>(null)\n const panelRef = React.useRef<HTMLDivElement>(null)\n const [placement, setPlacement] = React.useState({ top: 0, left: 0, maxHeight: 720 })\n\n const reposition = React.useCallback(() => {\n const trigger = triggerRef.current\n if (!trigger) return\n const next = computeAnchoredPosition(\n trigger.getBoundingClientRect(),\n { width: window.innerWidth, height: window.innerHeight },\n // Clamped to what fits \u2014 see ToolbarOverflow's MENU_MAX_HEIGHT note.\n { width: 216, preferredHeight: 720, align: 'end', minHeight: 180 },\n )\n setPlacement({ top: next.top, left: next.left, maxHeight: next.maxHeight })\n }, [])\n\n React.useLayoutEffect(() => { if (open) reposition() }, [open, reposition])\n\n React.useEffect(() => {\n if (!open) return\n const onDown = (event: MouseEvent) => {\n const target = event.target as Node\n if (!panelRef.current?.contains(target) && !triggerRef.current?.contains(target)) setOpen(false)\n }\n const onKey = (event: KeyboardEvent) => { if (event.key === 'Escape') setOpen(false) }\n const onScroll = () => reposition()\n document.addEventListener('mousedown', onDown)\n document.addEventListener('keydown', onKey)\n window.addEventListener('scroll', onScroll, true)\n window.addEventListener('resize', onScroll)\n return () => {\n document.removeEventListener('mousedown', onDown)\n document.removeEventListener('keydown', onKey)\n window.removeEventListener('scroll', onScroll, true)\n window.removeEventListener('resize', onScroll)\n }\n }, [open, reposition])\n\n const close = React.useCallback(() => setOpen(false), [])\n\n return (\n <div className=\"absolute right-2 top-1.5 z-30\" data-pane-restore=\"\">\n <button\n ref={triggerRef}\n type=\"button\"\n onClick={() => setOpen((value) => !value)}\n aria-label=\"Pane options\"\n aria-expanded={open}\n className=\"flex h-6 w-6 cursor-pointer items-center justify-center rounded-m3-full border border-[var(--m3-outline-variant)] bg-[var(--m3-surface-container-high)] text-[var(--m3-on-surface-variant)] shadow-m3-1 transition-colors duration-[var(--m3-duration-short2)] ease-m3-standard hover:bg-[var(--m3-surface-container-highest)] hover:text-[var(--m3-on-surface)]\"\n data-pane-restore-btn=\"\"\n >\n <SlidersHorizontal className=\"h-3.5 w-3.5\" />\n </button>\n {open && typeof document !== 'undefined' && ReactDOM.createPortal(\n <div\n ref={panelRef}\n className={M3_MENU_PANEL}\n style={{ top: placement.top, left: placement.left, width: 216, maxHeight: placement.maxHeight }}\n data-pane-restore-menu=\"\"\n >\n <ToolbarOverflowCloseProvider value={close}>{children}</ToolbarOverflowCloseProvider>\n </div>,\n document.body,\n )}\n </div>\n )\n}\n\n/** Pick an arrangement. Presets that need more panes than exist are disabled\n * rather than hidden, so the shape you want is discoverable before you have\n * enough tables open to use it. */\n/**\n * One row that turns the workspace search/filter bar on and off.\n *\n * A plain toggle rather than a submenu: it has exactly two states, and the bar\n * it reveals IS the rest of the interface. Deliberately does NOT dismiss the\n * overflow menu \u2014 the neighbouring \"Show\" toggles behave the same way, so\n * several settings can be flipped in one visit.\n */\nfunction SharedFilterToggle({\n enabled,\n onToggle,\n}: {\n enabled: boolean\n onToggle: () => void\n}) {\n return (\n <button\n type=\"button\"\n onClick={onToggle}\n role=\"menuitemcheckbox\"\n aria-checked={enabled}\n title={\n enabled\n ? 'Each pane goes back to its own search and filters'\n : 'Drive every pane from one search and filter bar'\n }\n className={enabled ? M3_MENU_ROW_ON : M3_MENU_ROW}\n data-split-shared-filters={enabled ? 'on' : 'off'}\n >\n <span className=\"flex w-4 shrink-0 justify-center\">\n {enabled ? <Check className=\"h-3.5 w-3.5\" /> : <SlidersHorizontal className=\"h-3.5 w-3.5 text-[var(--m3-on-surface-variant)]\" />}\n </span>\n <span className=\"flex-1\">Shared search & filters</span>\n </button>\n )\n}\n\nfunction ArrangeMenu({\n layout,\n onApply,\n}: {\n layout: SplitLayout\n onApply: (next: SplitLayout) => void\n}) {\n const [open, setOpen] = React.useState(false)\n const closeMenu = useToolbarOverflowClose()\n const paneCount = countPanes(layout.root)\n\n const pick = (preset: PresetId) => {\n onApply(applyPreset(layout, preset))\n setOpen(false)\n closeMenu()\n }\n\n return (\n <div data-split-arrange-section=\"\">\n <button\n type=\"button\"\n onClick={() => setOpen((value) => !value)}\n title=\"Arrange panes\"\n aria-expanded={open}\n className={M3_MENU_ROW}\n data-split-arrange=\"\"\n >\n <span className=\"flex w-4 shrink-0 justify-center\"><LayoutGrid className=\"h-3.5 w-3.5 text-[var(--m3-on-surface-variant)]\" /></span>\n <span className=\"flex-1\">Arrange</span>\n <ChevronDown className={`h-3 w-3 text-[var(--m3-on-surface-variant)] transition-transform duration-[var(--m3-duration-short2)] ease-m3-standard ${open ? 'rotate-180' : ''}`} />\n </button>\n\n {/* Expands IN PLACE. A flyout here was `absolute` inside the overflow\n panel, which scrolls \u2014 so it was clipped by its own container and\n read as a dead control. */}\n {open && (\n <div className=\"mb-1 ml-1.5 border-l border-[var(--m3-outline-variant)] pl-1.5\" data-split-arrange-menu=\"\">\n {ARRANGE_PRESETS.map((preset) => {\n const enabled = paneCount >= preset.minPanes\n return (\n <button\n key={preset.id}\n type=\"button\"\n disabled={!enabled}\n onClick={() => pick(preset.id)}\n className={`flex w-full items-start gap-2 rounded-m3-sm px-2 py-1.5 text-left transition-colors duration-[var(--m3-duration-short2)] ease-m3-standard ${\n enabled\n ? 'hover:bg-[var(--m3-state-layer-hover)] active:bg-[var(--m3-state-layer-pressed)]'\n : 'cursor-not-allowed text-[var(--m3-on-surface-variant)] opacity-[var(--m3-disabled-content-opacity)]'\n }`}\n data-split-arrange-preset={preset.id}\n title={enabled ? preset.hint : `Needs at least ${preset.minPanes} tables`}\n >\n {preset.id === 'rows'\n ? <Rows2 className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-[var(--m3-on-surface-variant)]\" />\n : preset.id === 'columns'\n ? <Columns2 className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-[var(--m3-on-surface-variant)]\" />\n : <LayoutGrid className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-[var(--m3-on-surface-variant)]\" />}\n <span className=\"min-w-0\">\n <span className=\"block text-body-regular-xs\">{preset.label}</span>\n <span className=\"block text-body-regular-xs text-[var(--m3-on-surface-variant)]\">{preset.hint}</span>\n </span>\n </button>\n )\n })}\n <button\n type=\"button\"\n onClick={() => { onApply({ ...layout, root: evenAll(layout.root) }); setOpen(false); closeMenu() }}\n className=\"w-full rounded-m3-sm px-2 py-1.5 text-left text-body-regular-xs transition-colors duration-[var(--m3-duration-short2)] ease-m3-standard hover:bg-[var(--m3-state-layer-hover)] active:bg-[var(--m3-state-layer-pressed)]\"\n data-split-arrange-even=\"\"\n >\n Reset sizes\n </button>\n </div>\n )}\n </div>\n )\n}\n\n/**\n * A template's shape, drawn from the tree itself.\n *\n * Deriving the thumbnail from `build()` rather than hand-drawing six icons\n * means a template can never advertise a shape it does not produce.\n */\nfunction TemplatePreview({ node, selected }: { node: LayoutNode; selected?: boolean }) {\n if (node.kind !== 'split') {\n return (\n <div\n className={`flex-1 rounded-m3-xs ${\n selected\n ? 'bg-[color-mix(in_srgb,var(--m3-on-secondary-container)_60%,transparent)]'\n : 'bg-[var(--m3-outline)]'\n }`}\n />\n )\n }\n return (\n <div className={`flex flex-1 gap-[2px] ${node.direction === 'row' ? 'flex-row' : 'flex-col'}`}>\n {node.children.map((child, index) => (\n <TemplatePreview key={index} node={child} selected={selected} />\n ))}\n </div>\n )\n}\n\n/**\n * A layout's SHAPE, ignoring what fills it \u2014 `p`, `r(p,p)`, `c(p,r(p,p))`.\n *\n * Two layouts with the same signature occupy the same grid, which is exactly\n * what makes a template \"the one you are currently in\". The gallery had no\n * selected state at all before this.\n */\nfunction shapeSignature(node: LayoutNode): string {\n if (node.kind !== 'split') return 'p'\n return `${node.direction === 'row' ? 'r' : 'c'}(${node.children.map(shapeSignature).join(',')})`\n}\n\n/**\n * Pick a SHAPE, fill it afterwards \u2014 the layout-first flow.\n *\n * Sits beside `ArrangeMenu` in the same overflow menu, and the two are labelled\n * apart because they answer different questions: a template says how many cells\n * there are, a preset says where the cells you already filled should go.\n * Existing panes are poured into the new shape, so choosing one never closes\n * the table you are looking at.\n */\nfunction TemplatesMenu({\n layout,\n onApply,\n}: {\n layout: SplitLayout\n onApply: (next: SplitLayout) => void\n}) {\n const [open, setOpen] = React.useState(false)\n const closeMenu = useToolbarOverflowClose()\n const currentShape = shapeSignature(layout.root)\n\n const pick = (id: GridTemplateId) => {\n onApply(applyGridTemplate(layout, id))\n setOpen(false)\n closeMenu()\n }\n\n return (\n <div data-split-templates-section=\"\">\n <button\n type=\"button\"\n onClick={() => setOpen((value) => !value)}\n title=\"Choose a grid\"\n aria-expanded={open}\n className={M3_MENU_ROW}\n data-split-templates=\"\"\n >\n <span className=\"flex w-4 shrink-0 justify-center\"><Grid2x2 className=\"h-3.5 w-3.5 text-[var(--m3-on-surface-variant)]\" /></span>\n <span className=\"flex-1\">Grid template</span>\n <ChevronDown className={`h-3 w-3 text-[var(--m3-on-surface-variant)] transition-transform duration-[var(--m3-duration-short2)] ease-m3-standard ${open ? 'rotate-180' : ''}`} />\n </button>\n\n {/* Expands IN PLACE for the same reason ArrangeMenu does \u2014 a flyout is\n clipped by the scrolling overflow panel it lives in. */}\n {open && (\n <div className=\"mb-1 ml-1.5 grid grid-cols-3 gap-1 border-l border-[var(--m3-outline-variant)] py-1 pl-1.5\" data-split-templates-menu=\"\">\n {GRID_TEMPLATE_LIST.map((template) => {\n const shape = template.build()\n // The template whose SHAPE the workspace is already in. Marked with\n // the same `secondary-container` swap selection uses everywhere.\n const isCurrent = shapeSignature(shape) === currentShape\n return (\n <button\n key={template.id}\n type=\"button\"\n onClick={() => pick(template.id)}\n title={`${template.label} \u2014 ${template.hint}`}\n aria-label={template.label}\n aria-pressed={isCurrent}\n className={`flex flex-col items-center gap-1 rounded-m3-sm p-1 transition-colors duration-[var(--m3-duration-short2)] ease-m3-standard ${\n isCurrent\n ? 'bg-[var(--m3-secondary-container)] text-[var(--m3-on-secondary-container)]'\n : 'text-[var(--m3-on-surface-variant)] hover:bg-[var(--m3-state-layer-hover)] active:bg-[var(--m3-state-layer-pressed)]'\n }`}\n data-split-template={template.id}\n >\n <span className=\"flex h-8 w-full gap-[2px] rounded-m3-xs border border-[var(--m3-outline-variant)] p-[2px]\">\n <TemplatePreview node={shape} selected={isCurrent} />\n </span>\n <span className=\"text-body-regular-xs\">{template.slots}</span>\n </button>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\n/** Save / reopen named layouts. Personal-only in v1. */\nfunction LayoutsMenu({\n anchorTableId,\n layout,\n onApply,\n}: {\n anchorTableId: string\n layout: SplitLayout\n onApply: (layout: SplitLayout) => void\n}) {\n const { layouts, save, remove } = useSplitViewLayouts(anchorTableId)\n const [open, setOpen] = React.useState(false)\n const [name, setName] = React.useState('')\n const closeMenu = useToolbarOverflowClose()\n\n const commit = async () => {\n const trimmed = name.trim()\n if (!trimmed) return\n await save(trimmed, layout)\n setName('')\n setOpen(false)\n closeMenu()\n }\n\n return (\n <div data-split-layouts-section=\"\">\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n aria-expanded={open}\n className={M3_MENU_ROW}\n data-split-layouts=\"\"\n >\n <span className=\"flex w-4 shrink-0 justify-center\"><Save className=\"h-3.5 w-3.5 text-[var(--m3-on-surface-variant)]\" /></span>\n <span className=\"flex-1\">Layouts</span>\n <ChevronDown className={`h-3 w-3 text-[var(--m3-on-surface-variant)] transition-transform duration-[var(--m3-duration-short2)] ease-m3-standard ${open ? 'rotate-180' : ''}`} />\n </button>\n\n {open && (\n <div className=\"mb-1 ml-1.5 border-l border-[var(--m3-outline-variant)] pl-1.5\" data-split-layouts-menu=\"\">\n <div className=\"flex items-center gap-1 pb-1\">\n <input\n value={name}\n onChange={(e) => setName(e.target.value)}\n onKeyDown={(e) => {\n // Cmd/Ctrl+Enter submits, Escape cancels \u2014 the dialog contract.\n if (e.key === 'Enter') { e.preventDefault(); void commit() }\n if (e.key === 'Escape') { e.preventDefault(); setOpen(false) }\n }}\n placeholder=\"Save current as\u2026\"\n // Was `outline-none` with no field affordance whatsoever \u2014 an\n // a11y defect. A field now looks like a field, and focus is the\n // teal interaction-affirmative signal, not the blue selection one.\n className=\"min-w-0 flex-1 rounded-m3-xs border border-[var(--m3-outline)] bg-[var(--m3-surface-container-lowest)] px-1.5 py-1 text-body-regular-xs text-[var(--m3-on-surface)] transition-[color,background-color,border-color,box-shadow] duration-[var(--m3-duration-short2)] ease-m3-standard placeholder:text-[var(--m3-on-surface-variant)] focus-visible:border-[var(--m3-focus-ring-color)] focus-visible:shadow-[var(--m3-focus-halo)] focus-visible:outline-none\"\n data-split-layout-name=\"\"\n />\n <button\n type=\"button\"\n onClick={() => void commit()}\n className=\"shrink-0 rounded-m3-full px-2 py-1 text-body-regular-xs text-[var(--m3-on-surface)] transition-colors duration-[var(--m3-duration-short2)] ease-m3-standard hover:bg-[var(--m3-state-layer-hover)] active:bg-[var(--m3-state-layer-pressed)]\"\n data-split-layout-save=\"\"\n >\n Save\n </button>\n </div>\n\n {layouts.length === 0 && (\n <div className=\"px-2 py-3 text-center text-body-regular-xs text-[var(--m3-on-surface-variant)]\" data-split-layouts-empty=\"\">\n No saved layouts yet.\n </div>\n )}\n {layouts.map((saved) => (\n <div key={saved.id} className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => { onApply(saved.layout); setOpen(false); closeMenu() }}\n className=\"flex-1 truncate rounded-m3-xs px-2 py-1 text-left text-body-regular-xs text-[var(--m3-on-surface)] transition-colors duration-[var(--m3-duration-short2)] ease-m3-standard hover:bg-[var(--m3-state-layer-hover)] active:bg-[var(--m3-state-layer-pressed)]\"\n data-split-layout-open={saved.name}\n >\n {saved.name}\n </button>\n <button\n type=\"button\"\n onClick={() => void remove(saved.id)}\n aria-label={`Delete ${saved.name}`}\n className=\"rounded-m3-full p-1 text-[var(--m3-on-surface-variant)] transition-colors duration-[var(--m3-duration-short2)] ease-m3-standard hover:bg-[var(--m3-state-layer-error-hover)] hover:text-[var(--m3-error)]\"\n data-split-layout-delete={saved.name}\n >\n <Trash2 className=\"h-3 w-3\" />\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type SplitViewHostProps = {\n /** The table this page is for \u2014 the initial, and always first, pane. */\n tableId: string\n}\n\n/**\n * Fill the available height.\n *\n * `h-full` cannot chain here: the AppShell's `<main>` has a real flex height,\n * but the page wrappers between it and us are block-level with `height: auto`,\n * so a percentage height resolves against `auto` and collapses to content.\n * Panes then sit at their minimum and the layout looks broken at any pane\n * count > 1.\n *\n * Measure the nearest SCROLL ancestor's client bottom and set an explicit\n * height \u2014 the same technique `DynamicTable` already uses for `height: 'fill'`\n * (DynamicTable.tsx), so the two agree instead of fighting.\n */\nfunction useFilledHeight(enabled: boolean) {\n const ref = React.useRef<HTMLDivElement>(null)\n const [height, setHeight] = React.useState<number | null>(null)\n\n React.useLayoutEffect(() => {\n if (!enabled) {\n setHeight(null)\n return\n }\n const element = ref.current\n if (!element) return\n\n let scrollPane: HTMLElement | null = element.parentElement\n while (scrollPane && scrollPane !== document.body) {\n const overflowY = getComputedStyle(scrollPane).overflowY\n if (overflowY === 'auto' || overflowY === 'scroll') break\n scrollPane = scrollPane.parentElement\n }\n\n const measure = () => {\n const rect = element.getBoundingClientRect()\n const bottom =\n scrollPane && scrollPane !== document.body\n ? Math.min(\n window.innerHeight,\n Math.round(scrollPane.getBoundingClientRect().top) + scrollPane.clientHeight,\n )\n : window.innerHeight\n setHeight(Math.max(Math.floor(bottom - rect.top), 320))\n }\n\n measure()\n window.addEventListener('resize', measure)\n const observer = new ResizeObserver(measure)\n if (scrollPane && scrollPane !== document.body) observer.observe(scrollPane)\n return () => {\n window.removeEventListener('resize', measure)\n observer.disconnect()\n }\n }, [enabled])\n\n return { ref, height }\n}\n\n/**\n * The \"no shared criteria\" value, frozen at module scope.\n *\n * Identity matters: `criteria` is read off the layout and feeds the memo that\n * projects criteria onto every pane. A fresh `{ rules: [] }` per render would\n * change identity each time and re-project on every render of the host \u2014 the\n * same reason `sharedCriteria.ts` freezes its own `NOTHING`.\n */\nconst EMPTY_CRITERIA: SharedCriteria = Object.freeze({\n rules: Object.freeze([]) as unknown as SharedCriteria['rules'],\n})\n\nexport function SplitViewHost({ tableId }: SplitViewHostProps) {\n const registry = useTableRegistry()\n\n // Restored SYNCHRONOUSLY in the initializer, not in an effect: an effect\n // would paint one default pane first and then swap in the real arrangement,\n // which reads as a flash and remounts every grid it restores.\n //\n // `registry.tables` is the accessible set, so a pane whose table the user\n // may no longer open is dropped rather than mounted as an empty box.\n const [layout, setLayout] = React.useState<SplitLayout>(() => {\n const known = new Set(registry.tables.map((table) => table.metadata.id))\n // Tables are pruned against the registry, which is available synchronously.\n //\n // Widgets are NOT pruned here, deliberately. The widget catalogue is\n // fetched (react-query), so at this first synchronous paint it is still\n // empty \u2014 pruning against it would drop every widget pane on every reload,\n // which is exactly the defect TC-APP-604 caught: widgets rendered fine in\n // session and silently vanished on refresh.\n //\n // Nothing is lost by keeping them: `WidgetPane` resolves its own content\n // through `useContentById` and already renders the same 'unknown' /\n // 'denied' messages a table pane does, so a widget the user can no longer\n // open degrades in THAT PANE ALONE rather than being deleted from their\n // saved arrangement behind their back.\n const stored = readStoredLayout(tableId, (content) =>\n content.kind === 'table' ? known.has(content.tableId) : true,\n )\n return (\n stored ?? {\n root: { kind: 'pane', id: makePaneId(), content: tableContent(tableId) },\n version: SPLIT_LAYOUT_VERSION,\n }\n )\n })\n\n // Every mutation funnels through `setLayout`, so one effect covers splits,\n // closes, divider drags, arrange presets, chrome toggles and named-layout\n // opens \u2014 there is no path that changes the layout without being saved.\n //\n // Coalesced on an animation frame because ONE of those paths is continuous:\n // a divider drag calls `setLayout` per `mousemove`, and each write does a\n // `getItem` for scope resolution, a `JSON.stringify` of the whole tree, a\n // `setItem` and up to two `removeItem`s \u2014 ~60 synchronous storage round-trips\n // a second, on the same thread that is re-rendering every grid in the layout.\n // The frame callback keeps discrete mutations effectively immediate (next\n // paint) while collapsing a drag to one write per frame, and the cleanup\n // flushes synchronously so nothing is lost on unmount or a tableId change.\n React.useEffect(() => {\n let frame: number | null = requestAnimationFrame(() => {\n frame = null\n writeStoredLayout(tableId, layout)\n })\n return () => {\n if (frame === null) return\n cancelAnimationFrame(frame)\n writeStoredLayout(tableId, layout)\n }\n }, [tableId, layout])\n /**\n * What the picker will do with the table you choose: split an existing pane\n * along an axis, or fill an empty slot in place.\n */\n const [pending, setPending] = React.useState<\n | { mode: 'split'; slotId: string; direction: SplitDirection; before: boolean; anchor: DOMRect | null }\n | { mode: 'fill'; slotId: string; anchor: DOMRect | null }\n | null\n >(null)\n const containerRef = React.useRef<HTMLDivElement>(null)\n const fill = useFilledHeight(true)\n\n // \u2500\u2500 Workspace-shared search and filtering \u2500\u2500\n //\n // Held HERE, at the host, because it is a property of the workspace rather\n // than of any pane. Each pane receives only the projection of it that that\n // pane can actually honour, translated into its own field names.\n //\n // Off by default: a workspace only starts driving its panes once the user\n // asks it to, so a single-pane page behaves exactly as it always did.\n //\n // These live ON THE LAYOUT, not in component state beside it.\n //\n // `SplitLayout` has carried `sharedCriteria` / `sharedFiltersEnabled` since v3\n // and `normalizeLayout` deliberately preserves both, but the host used to hold\n // them in `useState` and never read or wrote the layout fields \u2014 so enabling\n // the bar, adding a rule and reloading lost all of it. (The persistence test\n // passes either way: it drives the storage layer directly, never the host.)\n //\n // Deriving rather than mirroring is what makes opening a SAVED NAMED LAYOUT\n // work: its criteria arrive through `setLayout` like any other change, and are\n // simply read. A `useState` seeded once at mount would have been overwritten by\n // the stale component value the moment the named layout landed.\n //\n // Reads go through the layout; writes go through `setLayout`, so they ride the\n // same persistence funnel as every other mutation \u2014 no second save path.\n const sharedEnabled = layout.sharedFiltersEnabled ?? false\n // `sharedCriteria` is typed `unknown` on the layout ON PURPOSE \u2014 the persistence\n // layer carries it through a write/read cycle without knowing the vocabulary\n // (types.ts:117-122). Narrowing happens here, at the one place that does know,\n // and anything that is not a well-formed criteria object degrades to empty\n // rather than throwing on a hand-edited or older stored layout.\n const criteria = React.useMemo<SharedCriteria>(() => {\n const stored = layout.sharedCriteria\n if (!stored || typeof stored !== 'object') return EMPTY_CRITERIA\n const candidate = stored as Partial<SharedCriteria>\n return Array.isArray(candidate.rules) ? (stored as SharedCriteria) : EMPTY_CRITERIA\n }, [layout.sharedCriteria])\n const setSharedEnabled = React.useCallback(\n (next: boolean | ((on: boolean) => boolean)) => {\n setLayout((current) => {\n const was = current.sharedFiltersEnabled ?? false\n const value = typeof next === 'function' ? next(was) : next\n return value === was ? current : { ...current, sharedFiltersEnabled: value }\n })\n },\n [],\n )\n const setCriteria = React.useCallback((next: SharedCriteria) => {\n setLayout((current) =>\n current.sharedCriteria === next ? current : { ...current, sharedCriteria: next },\n )\n }, [])\n const liveCriteria = sharedEnabled ? criteria : null\n const hrefFor = React.useCallback(\n (id: string) => registry.tables.find((table) => table.metadata.id === id)?.metadata.href,\n [registry.tables],\n )\n\n const panes = React.useMemo(() => listPanes(layout.root), [layout])\n const slotCount = React.useMemo(() => countSlots(layout.root), [layout])\n const isSplit = slotCount > 1\n /**\n * The primary pane is the one holding THIS PAGE'S table \u2014 matched by identity,\n * never by position.\n *\n * This used to be `panes[0]`, i.e. document order. But `splitPane(..., before)`\n * inserts the new pane FIRST (`types.ts:436`), and the \"Left\" and \"Above\"\n * actions both pass `before: true` \u2014 so adding a table to the left of the page's\n * own table handed pane[0], and with it the UNSCOPED storage keys, to the newly\n * added table. Two things broke at once: the new pane wrote its column widths\n * over the standalone page's keys for that table, and the page's own table was\n * demoted to a `pane:<id>:` scope, silently discarding the widths and last-used\n * view the user had saved. Closing the pane flipped it back mid-session.\n * `applyPreset` / `applyGridTemplate` pour panes into slots in document order\n * too, so they inverted it the same way.\n *\n * Falls back to the first pane only when this page's table is not in the layout\n * at all (every pane replaced), which keeps a single pane unscoped as before.\n */\n const primaryPaneId = React.useMemo(() => {\n const own = panes.find(\n (pane) => pane.content.kind === 'table' && pane.content.tableId === tableId,\n )\n return (own ?? panes[0])?.id\n }, [panes, tableId])\n\n /**\n * Project the workspace criteria onto each pane, in that pane's own field\n * names \u2014 plus the list of criteria it could NOT honour.\n *\n * Computed here rather than inside each pane because the unmapped report is a\n * WORKSPACE-level statement (\"2 panes are not filtered by customer\"), and a\n * pane reporting upward during its own render would be a write during render.\n */\n const perPane = React.useMemo(() => {\n const filters = new Map<string, FilterRow[]>()\n const unmapped: UnmappedPaneReport[] = []\n for (const pane of panes) {\n const isTable = pane.content.kind === 'table'\n const definition = isTable\n ? registry.tables.find((t) => t.metadata.id === (pane.content as { tableId: string }).tableId)\n : undefined\n const result = isTable\n ? mapCriteriaForTable(liveCriteria, definition?.metadata)\n : mapCriteriaForWidget(liveCriteria, (pane.content as { widgetId: string }).widgetId)\n filters.set(pane.id, result.filters)\n if (result.unmapped.length > 0) {\n unmapped.push({\n paneId: pane.id,\n title: definition?.metadata.title ?? 'This pane',\n unmapped: result.unmapped,\n })\n }\n }\n return { filters, unmapped }\n }, [panes, registry.tables, liveCriteria])\n\n // `''` (bar on, box empty) must reach the panes so their hidden search boxes\n // stop filtering; `undefined` (bar off) must NOT, so each pane keeps its own.\n const sharedSearch = liveCriteria ? (liveCriteria.search ?? '') : undefined\n\n // Read `pending` from state, never from inside a `setPending` updater: React\n // treats updaters as pure and calls them twice under StrictMode, so a\n // setLayout side-effect in there is dropped or duplicated. That bug made\n // every split silently do nothing.\n const handlePick = React.useCallback(\n // Takes a full `PaneContentRef` rather than a table id, because the picker\n // now offers widgets too and only it knows which kind was chosen.\n (content: PaneContentRef) => {\n if (!pending) return\n setLayout((current) =>\n pending.mode === 'fill'\n ? fillSlot(current, pending.slotId, content)\n : splitPane(current, pending.slotId, content, pending.direction, pending.before),\n )\n setPending(null)\n },\n [pending],\n )\n\n const handleClose = React.useCallback((paneId: string) => {\n setLayout((current) => removePane(current, paneId))\n }, [])\n\n /**\n * Divider drag. The delta is converted to a fraction of the SPLIT NODE's own\n * extent along its own axis, so a drag means the same proportion wherever the\n * node sits in the tree and whichever way it runs.\n */\n const startDrag = React.useCallback(\n (splitPath: NodePath, index: number, start: number, axis: SplitDirection, element: HTMLElement) => {\n const container = element.parentElement\n if (!container) return\n const rect = container.getBoundingClientRect()\n const extent = axis === 'row' ? rect.width : rect.height\n if (extent <= 0) return\n let last = start\n\n const onMove = (event: MouseEvent) => {\n const position = axis === 'row' ? event.clientX : event.clientY\n const delta = position - last\n if (delta === 0) return\n last = position\n setLayout((current) => resizeAt(current, splitPath, index, delta / extent))\n }\n const onUp = () => {\n document.removeEventListener('mousemove', onMove, true)\n document.removeEventListener('mouseup', onUp, true)\n document.body.style.userSelect = ''\n document.body.style.cursor = ''\n }\n // Suppress selection for the drag \u2014 without it a drag across a grid\n // selects cell text and the pointer flickers.\n document.body.style.userSelect = 'none'\n document.body.style.cursor = axis === 'row' ? 'col-resize' : 'row-resize'\n document.addEventListener('mousemove', onMove, true)\n document.addEventListener('mouseup', onUp, true)\n },\n [],\n )\n\n /** Recursive renderer: a slot (filled or not), or a split laying children along its axis. */\n const renderNode = (node: LayoutNode, path: NodePath): React.ReactNode => {\n if (node.kind === 'empty') {\n return (\n <EmptySlot\n slotId={node.id}\n canRemove={slotCount > 1}\n onAdd={(anchor) => setPending({ mode: 'fill', slotId: node.id, anchor })}\n onRemove={() => handleClose(node.id)}\n />\n )\n }\n\n if (node.kind === 'pane') {\n const isPrimary = node.id === primaryPaneId\n const definitionHref = node.content.kind === 'table' ? hrefFor(node.content.tableId) : undefined\n // The pane's items are ROWS injected into the table's ONE overflow menu \u2014\n // not a second button beside it.\n const paneRows = (\n <PaneMenuRows\n href={definitionHref}\n chrome={node.chrome}\n canClose={isSplit}\n // On EVERY pane, not just the primary one. Arrange and Layouts act on\n // the whole layout, so gating them behind one privileged pane meant\n // the controls appeared or vanished depending on which table's menu\n // you happened to open \u2014 with nothing on screen saying which pane was\n // the special one. Arrange also shows when unsplit: its presets\n // disable themselves with a \"needs at least N tables\" hint, which is\n // the discoverability this menu was designed for.\n extras={\n <>\n <TemplatesMenu layout={layout} onApply={setLayout} />\n <ArrangeMenu layout={layout} onApply={setLayout} />\n <SharedFilterToggle\n enabled={sharedEnabled}\n onToggle={() => setSharedEnabled((on) => !on)}\n />\n <LayoutsMenu anchorTableId={tableId} layout={layout} onApply={setLayout} />\n </>\n }\n onSplit={(direction, before, anchor) =>\n setPending({ mode: 'split', slotId: node.id, direction, before, anchor })\n }\n onToggleChrome={(patch) => setLayout((current) => setPaneChrome(current, node.id, patch))}\n onClose={() => handleClose(node.id)}\n />\n )\n const toolbarHidden = node.chrome?.toolbar === false\n return (\n <div\n // `flex-1` matters: without it a pane sizes to its CONTENT inside a\n // wrapper that has already been given a share, so after a height drag\n // the wrapper grows and the pane does not \u2014 leaving a visible gap.\n // The pane is an M3 OUTLINED card: a 16px corner, the softer\n // `outline-variant` hairline, elevation 0. Card chrome is applied\n // only when split \u2014 unsplit, `.hot-card` still draws its own frame\n // and a second one here would read as a concentric double hairline.\n // `overflow-hidden` is what clips the grid's square header to the\n // card radius, so it stays whatever else changes.\n className={`relative flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden${\n isSplit\n ? ' rounded-m3-lg border border-[var(--m3-outline-variant)] bg-[var(--m3-surface-container-lowest)]'\n : ''\n }`}\n data-pane-id={node.id}\n data-pane-table={node.content.kind === 'table' ? node.content.tableId : undefined}\n data-pane-widget={node.content.kind === 'widget' ? node.content.widgetId : undefined}\n data-pane-toolbar={toolbarHidden ? 'hidden' : undefined}\n >\n {/* Toolbar hidden means the overflow menu is hidden with it, so a user\n who hid it would have no way back. Float the same rows behind one\n small handle in the corner. */}\n {toolbarHidden && <PaneRestoreMenu>{paneRows}</PaneRestoreMenu>}\n <div className=\"min-h-0 flex-1 overflow-auto\">\n <PaneBody\n content={node.content}\n paneId={node.id}\n isPrimary={isPrimary}\n multiview={isSplit}\n overflowExtras={paneRows}\n chrome={node.chrome}\n onWidgetSettingsChange={(next) =>\n setLayout((current) => setPaneContentSettings(current, node.id, next))\n }\n sharedFilters={perPane.filters.get(node.id)}\n sharedSearch={sharedSearch}\n />\n </div>\n </div>\n )\n }\n\n const isRow = node.direction === 'row'\n return (\n <div\n key={`split-${path.join('-')}`}\n className={`flex min-h-0 min-w-0 flex-1 ${isRow ? 'flex-row' : 'flex-col'}`}\n data-split-node={path.join('-') || 'root'}\n data-split-direction={node.direction}\n >\n {/* A nested split has no id of its own, so the key used to fall back to\n the array INDEX \u2014 and an index shifts when an earlier sibling is\n removed. Closing the first of `[paneA, split(B,C), paneD]` moved the\n nested split's key from `s1` to `s0`, so React unmounted and remounted\n that whole subtree: B and C lost scroll position, cell selection, any\n in-progress inline edit and any unsaved add-row draft, and each\n CellStore was recreated with its undo stack. Keying on the subtree's\n first SLOT id is stable across sibling removal, because slot ids are\n preserved by every tree op. */}\n {node.children.map((child, index) => (\n <React.Fragment\n key={child.kind === 'split' ? `s:${listSlots(child)[0]?.id ?? index}` : child.id}\n >\n <div\n className=\"flex min-h-0 min-w-0 flex-col\"\n style={{\n flexGrow: node.sizes[index] ?? 1,\n flexShrink: 1,\n flexBasis: 0,\n minWidth: isRow ? PANE_MIN_WIDTH_PX : undefined,\n minHeight: !isRow ? PANE_MIN_HEIGHT_PX : undefined,\n }}\n >\n {renderNode(child, [...path, index])}\n </div>\n {index < node.children.length - 1 && (\n <div\n role=\"separator\"\n aria-orientation={isRow ? 'vertical' : 'horizontal'}\n title=\"Drag to resize\"\n onMouseDown={(event) => {\n event.preventDefault()\n startDrag(path, index, isRow ? event.clientX : event.clientY, node.direction, event.currentTarget)\n }}\n onDoubleClick={() => setLayout((current) => ({ ...current, root: evenAll(current.root) }))}\n // Stays 4px of LAYOUT. Widening it to a \"real\" 8px gutter\n // would take 4px of grid height off every horizontal split,\n // and density is the product \u2014 so the bigger pointer target is\n // bought for free by an OVERLAY (`::after`, -2px on each side)\n // that costs no space at all.\n //\n // At rest the gutter is EMPTY: the two pane cards already draw\n // their own outlines, so a hairline down the middle would put\n // three lines inside 4px. `::before` is the drag handle and\n // only colours in on hover \u2014 an accent pill, eased in.\n //\n // It must also stay a DIRECT sibling of the size wrappers:\n // `startDrag` measures `element.parentElement` for the drag\n // extent, so no wrapper, no `gap`, no padding on the split node.\n className={`relative z-10 shrink-0 bg-transparent before:absolute before:rounded-m3-full before:bg-transparent before:transition-colors before:duration-[var(--m3-duration-short2)] before:ease-m3-standard before:content-[''] hover:before:bg-[var(--m3-accent)] after:absolute after:content-[''] ${\n isRow\n ? \"w-1 cursor-col-resize before:inset-y-0 before:left-1/2 before:w-0.5 before:-translate-x-1/2 after:inset-y-0 after:-left-0.5 after:-right-0.5\"\n : \"h-1 cursor-row-resize before:inset-x-0 before:top-1/2 before:h-0.5 before:-translate-y-1/2 after:inset-x-0 after:-top-0.5 after:-bottom-0.5\"\n }`}\n data-split-divider={`${path.join('-') || 'root'}:${index}`}\n />\n )}\n </React.Fragment>\n ))}\n </div>\n )\n }\n\n return (\n <div\n ref={fill.ref}\n className=\"flex h-full min-h-0 flex-col bg-[var(--m3-surface)]\"\n style={fill.height ? { height: fill.height } : undefined}\n data-split-view={isSplit ? 'true' : 'false'}\n data-shared-filters={sharedEnabled ? 'on' : 'off'}\n >\n {/* One row, and only while it is on. It replaces each pane's search row\n rather than adding to it, so N panes give back N rows for this one. */}\n {sharedEnabled && (\n <WorkspaceFilterBar\n criteria={criteria}\n onChange={setCriteria}\n unmappedByPane={perPane.unmapped}\n onToggleOff={() => setSharedEnabled(false)}\n />\n )}\n <div\n ref={containerRef}\n // `px-2` and NEVER `p-2`: horizontal breathing room for the outermost\n // cards is free, but vertical padding would cost 16px of grid height on\n // every list page. Only while split, so an unsplit page is unchanged.\n className={`flex min-h-0 flex-1${isSplit ? ' px-2' : ''}`}\n // When the panes' minimums exceed the container, scroll rather than\n // crushing every pane below legibility.\n style={isSplit ? { overflow: 'auto' } : undefined}\n data-split-root=\"\"\n >\n {renderNode(layout.root, [])}\n </div>\n\n {pending && (\n <ContentPicker\n anchorRect={pending.anchor}\n // Tables AND widgets, both marked when already on screen rather than\n // hidden \u2014 a user looking for what they just opened should find it\n // where they expect, greyed, not absent.\n openContent={panes.map((pane) => pane.content)}\n onPick={handlePick}\n onClose={() => setPending(null)}\n />\n )}\n </div>\n )\n}\n\nexport default SplitViewHost\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import ReactDOM from "react-dom";
|
|
5
|
+
import { Loader2, MoreHorizontal, RefreshCw } from "lucide-react";
|
|
6
|
+
import { loadDashboardWidgetModule } from "../../dashboard/widgetRegistry.js";
|
|
7
|
+
import { ToolbarOverflowCloseProvider } from "../components/ToolbarOverflow.js";
|
|
8
|
+
import { M3_MENU_PANEL } from "./SplitViewHost.js";
|
|
9
|
+
import { computeAnchoredPosition } from "../utils/anchoredPosition.js";
|
|
10
|
+
import {
|
|
11
|
+
useContentById,
|
|
12
|
+
useWidgetRenderContext
|
|
13
|
+
} from "../registry/ContentRegistryContext.js";
|
|
14
|
+
const ANONYMOUS_CONTEXT = {
|
|
15
|
+
userId: "",
|
|
16
|
+
tenantId: null,
|
|
17
|
+
organizationId: null,
|
|
18
|
+
userName: null,
|
|
19
|
+
userEmail: null,
|
|
20
|
+
userLabel: null
|
|
21
|
+
};
|
|
22
|
+
function PaneMessage({ children, ...rest }) {
|
|
23
|
+
return /* @__PURE__ */ jsx(
|
|
24
|
+
"div",
|
|
25
|
+
{
|
|
26
|
+
className: "flex h-full items-center justify-center p-6 text-center text-body-regular-sm text-[var(--m3-on-surface-variant)]",
|
|
27
|
+
...rest,
|
|
28
|
+
children
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
function WidgetPane({
|
|
33
|
+
content,
|
|
34
|
+
slotId,
|
|
35
|
+
onSettingsChange,
|
|
36
|
+
overflowExtras,
|
|
37
|
+
hideToolbar
|
|
38
|
+
}) {
|
|
39
|
+
const { item, status } = useContentById(content);
|
|
40
|
+
if (status === "loading") {
|
|
41
|
+
return /* @__PURE__ */ jsx("div", { className: "flex h-full items-center justify-center", "data-pane-status": "loading", children: /* @__PURE__ */ jsx(Loader2, { className: "h-4 w-4 animate-spin text-[var(--m3-on-surface-variant)]", "aria-hidden": "true" }) });
|
|
42
|
+
}
|
|
43
|
+
if (status === "unknown") {
|
|
44
|
+
return /* @__PURE__ */ jsx(PaneMessage, { "data-pane-status": "unknown", children: "This widget is no longer available." });
|
|
45
|
+
}
|
|
46
|
+
if (status === "denied" || !item || item.kind !== "widget") {
|
|
47
|
+
return /* @__PURE__ */ jsxs(PaneMessage, { "data-pane-status": "denied", children: [
|
|
48
|
+
"You don\u2019t have access to ",
|
|
49
|
+
item?.title ?? "this widget",
|
|
50
|
+
"."
|
|
51
|
+
] });
|
|
52
|
+
}
|
|
53
|
+
return /* @__PURE__ */ jsx(
|
|
54
|
+
WidgetPaneBody,
|
|
55
|
+
{
|
|
56
|
+
item,
|
|
57
|
+
content,
|
|
58
|
+
slotId,
|
|
59
|
+
onSettingsChange,
|
|
60
|
+
overflowExtras,
|
|
61
|
+
hideToolbar
|
|
62
|
+
}
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
function WidgetPaneBody({
|
|
66
|
+
item,
|
|
67
|
+
content,
|
|
68
|
+
slotId,
|
|
69
|
+
onSettingsChange,
|
|
70
|
+
overflowExtras,
|
|
71
|
+
hideToolbar
|
|
72
|
+
}) {
|
|
73
|
+
const renderContext = useWidgetRenderContext();
|
|
74
|
+
const [module, setModule] = React.useState(null);
|
|
75
|
+
const [loading, setLoading] = React.useState(true);
|
|
76
|
+
const [loadFailed, setLoadFailed] = React.useState(false);
|
|
77
|
+
const [refreshToken, setRefreshToken] = React.useState(0);
|
|
78
|
+
const [refreshing, setRefreshing] = React.useState(false);
|
|
79
|
+
const loaderKey = item.loaderKey;
|
|
80
|
+
React.useEffect(() => {
|
|
81
|
+
let cancelled = false;
|
|
82
|
+
setLoading(true);
|
|
83
|
+
setLoadFailed(false);
|
|
84
|
+
loadDashboardWidgetModule(loaderKey).then((loaded) => {
|
|
85
|
+
if (cancelled) return;
|
|
86
|
+
setModule(loaded);
|
|
87
|
+
setLoadFailed(!loaded);
|
|
88
|
+
setLoading(false);
|
|
89
|
+
}).catch((err) => {
|
|
90
|
+
if (cancelled) return;
|
|
91
|
+
try {
|
|
92
|
+
console.error("Failed to load widget module", err);
|
|
93
|
+
} catch {
|
|
94
|
+
}
|
|
95
|
+
setLoadFailed(true);
|
|
96
|
+
setLoading(false);
|
|
97
|
+
});
|
|
98
|
+
return () => {
|
|
99
|
+
cancelled = true;
|
|
100
|
+
};
|
|
101
|
+
}, [loaderKey]);
|
|
102
|
+
React.useEffect(() => {
|
|
103
|
+
if (loadFailed) setRefreshing(false);
|
|
104
|
+
}, [loadFailed]);
|
|
105
|
+
const hydratedSettings = React.useMemo(() => {
|
|
106
|
+
const raw = content.settings ?? item.defaultSettings ?? null;
|
|
107
|
+
if (module?.hydrateSettings) {
|
|
108
|
+
try {
|
|
109
|
+
return module.hydrateSettings(raw);
|
|
110
|
+
} catch (err) {
|
|
111
|
+
try {
|
|
112
|
+
console.warn("Failed to hydrate widget settings", err);
|
|
113
|
+
} catch {
|
|
114
|
+
}
|
|
115
|
+
return raw;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return raw;
|
|
119
|
+
}, [content.settings, item.defaultSettings, module]);
|
|
120
|
+
const handleSettingsChange = React.useCallback(
|
|
121
|
+
(next) => {
|
|
122
|
+
let raw = next;
|
|
123
|
+
if (module?.dehydrateSettings) {
|
|
124
|
+
try {
|
|
125
|
+
raw = module.dehydrateSettings(next);
|
|
126
|
+
} catch (err) {
|
|
127
|
+
try {
|
|
128
|
+
console.warn("Failed to dehydrate widget settings", err);
|
|
129
|
+
} catch {
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
onSettingsChange?.(raw);
|
|
134
|
+
},
|
|
135
|
+
[module, onSettingsChange]
|
|
136
|
+
);
|
|
137
|
+
const layout = React.useMemo(
|
|
138
|
+
() => ({ id: slotId, widgetId: content.widgetId, order: 0, settings: content.settings }),
|
|
139
|
+
[slotId, content.widgetId, content.settings]
|
|
140
|
+
);
|
|
141
|
+
const supportsRefresh = item.supportsRefresh ?? false;
|
|
142
|
+
const triggerRefresh = React.useCallback(() => {
|
|
143
|
+
if (loading || loadFailed) return;
|
|
144
|
+
setRefreshing(true);
|
|
145
|
+
setRefreshToken((value) => value + 1);
|
|
146
|
+
}, [loading, loadFailed]);
|
|
147
|
+
const Widget = module?.Widget ?? null;
|
|
148
|
+
return /* @__PURE__ */ jsxs(
|
|
149
|
+
"div",
|
|
150
|
+
{
|
|
151
|
+
className: "flex h-full min-h-0 min-w-0 flex-1 flex-col",
|
|
152
|
+
"data-pane-widget-body": content.widgetId,
|
|
153
|
+
children: [
|
|
154
|
+
!hideToolbar && /* @__PURE__ */ jsxs(
|
|
155
|
+
"div",
|
|
156
|
+
{
|
|
157
|
+
className: "flex h-7 shrink-0 items-center gap-1 bg-[var(--m3-surface-container-low)] px-2 text-[var(--m3-on-surface)]",
|
|
158
|
+
"data-pane-widget-header": "",
|
|
159
|
+
children: [
|
|
160
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-label-semibold-xs", title: item.title, children: item.title }),
|
|
161
|
+
supportsRefresh && /* @__PURE__ */ jsx(
|
|
162
|
+
"button",
|
|
163
|
+
{
|
|
164
|
+
type: "button",
|
|
165
|
+
onClick: triggerRefresh,
|
|
166
|
+
disabled: loading || loadFailed,
|
|
167
|
+
"aria-label": "Refresh",
|
|
168
|
+
title: "Refresh",
|
|
169
|
+
className: "flex h-5 w-5 shrink-0 items-center justify-center rounded-m3-full text-[var(--m3-on-surface-variant)] transition-colors duration-[var(--m3-duration-short2)] ease-m3-standard hover:bg-[var(--m3-state-layer-hover)] hover:text-[var(--m3-on-surface)] active:bg-[var(--m3-state-layer-pressed)] disabled:opacity-[var(--m3-disabled-content-opacity)]",
|
|
170
|
+
"data-pane-widget-refresh": "",
|
|
171
|
+
children: refreshing ? /* @__PURE__ */ jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" }) : /* @__PURE__ */ jsx(RefreshCw, { className: "h-3.5 w-3.5" })
|
|
172
|
+
}
|
|
173
|
+
),
|
|
174
|
+
overflowExtras ? /* @__PURE__ */ jsx(WidgetPaneMenu, { children: overflowExtras }) : null
|
|
175
|
+
]
|
|
176
|
+
}
|
|
177
|
+
),
|
|
178
|
+
/* @__PURE__ */ jsxs("div", { className: "min-h-0 flex-1 overflow-auto p-2", "data-pane-widget-content": "", children: [
|
|
179
|
+
loading && /* @__PURE__ */ jsx("div", { className: "flex h-full items-center justify-center", "data-pane-widget-loading": "", children: /* @__PURE__ */ jsx(Loader2, { className: "h-4 w-4 animate-spin text-[var(--m3-on-surface-variant)]", "aria-hidden": "true" }) }),
|
|
180
|
+
!loading && loadFailed && /* @__PURE__ */ jsx(
|
|
181
|
+
"div",
|
|
182
|
+
{
|
|
183
|
+
className: "p-4 text-body-regular-sm text-[var(--m3-on-surface-variant)]",
|
|
184
|
+
role: "alert",
|
|
185
|
+
"data-pane-widget-error": "",
|
|
186
|
+
children: "This widget could not be loaded."
|
|
187
|
+
}
|
|
188
|
+
),
|
|
189
|
+
!loading && !loadFailed && Widget && /* @__PURE__ */ jsx(
|
|
190
|
+
Widget,
|
|
191
|
+
{
|
|
192
|
+
mode: "view",
|
|
193
|
+
layout,
|
|
194
|
+
settings: hydratedSettings,
|
|
195
|
+
context: renderContext ?? ANONYMOUS_CONTEXT,
|
|
196
|
+
onSettingsChange: handleSettingsChange,
|
|
197
|
+
refreshToken,
|
|
198
|
+
onRefreshStateChange: setRefreshing
|
|
199
|
+
}
|
|
200
|
+
)
|
|
201
|
+
] })
|
|
202
|
+
]
|
|
203
|
+
}
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
function WidgetPaneMenu({ children }) {
|
|
207
|
+
const [open, setOpen] = React.useState(false);
|
|
208
|
+
const triggerRef = React.useRef(null);
|
|
209
|
+
const panelRef = React.useRef(null);
|
|
210
|
+
const [placement, setPlacement] = React.useState({ top: 0, left: 0, maxHeight: 720 });
|
|
211
|
+
const reposition = React.useCallback(() => {
|
|
212
|
+
const trigger = triggerRef.current;
|
|
213
|
+
if (!trigger) return;
|
|
214
|
+
const next = computeAnchoredPosition(
|
|
215
|
+
trigger.getBoundingClientRect(),
|
|
216
|
+
{ width: window.innerWidth, height: window.innerHeight },
|
|
217
|
+
{ width: 216, preferredHeight: 720, align: "end", minHeight: 180 }
|
|
218
|
+
);
|
|
219
|
+
setPlacement({ top: next.top, left: next.left, maxHeight: next.maxHeight });
|
|
220
|
+
}, []);
|
|
221
|
+
React.useLayoutEffect(() => {
|
|
222
|
+
if (open) reposition();
|
|
223
|
+
}, [open, reposition]);
|
|
224
|
+
React.useEffect(() => {
|
|
225
|
+
if (!open) return;
|
|
226
|
+
const onDown = (event) => {
|
|
227
|
+
const target = event.target;
|
|
228
|
+
if (!panelRef.current?.contains(target) && !triggerRef.current?.contains(target)) setOpen(false);
|
|
229
|
+
};
|
|
230
|
+
const onKey = (event) => {
|
|
231
|
+
if (event.key === "Escape") setOpen(false);
|
|
232
|
+
};
|
|
233
|
+
const onScroll = () => reposition();
|
|
234
|
+
document.addEventListener("mousedown", onDown);
|
|
235
|
+
document.addEventListener("keydown", onKey);
|
|
236
|
+
window.addEventListener("scroll", onScroll, true);
|
|
237
|
+
window.addEventListener("resize", onScroll);
|
|
238
|
+
return () => {
|
|
239
|
+
document.removeEventListener("mousedown", onDown);
|
|
240
|
+
document.removeEventListener("keydown", onKey);
|
|
241
|
+
window.removeEventListener("scroll", onScroll, true);
|
|
242
|
+
window.removeEventListener("resize", onScroll);
|
|
243
|
+
};
|
|
244
|
+
}, [open, reposition]);
|
|
245
|
+
const close = React.useCallback(() => setOpen(false), []);
|
|
246
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
247
|
+
/* @__PURE__ */ jsx(
|
|
248
|
+
"button",
|
|
249
|
+
{
|
|
250
|
+
ref: triggerRef,
|
|
251
|
+
type: "button",
|
|
252
|
+
onClick: () => setOpen((value) => !value),
|
|
253
|
+
"aria-label": "Pane options",
|
|
254
|
+
"aria-expanded": open,
|
|
255
|
+
className: "flex h-5 w-5 shrink-0 items-center justify-center rounded-m3-full text-[var(--m3-on-surface-variant)] transition-colors duration-[var(--m3-duration-short2)] ease-m3-standard hover:bg-[var(--m3-state-layer-hover)] hover:text-[var(--m3-on-surface)] active:bg-[var(--m3-state-layer-pressed)]",
|
|
256
|
+
"data-pane-widget-menu-btn": "",
|
|
257
|
+
children: /* @__PURE__ */ jsx(MoreHorizontal, { className: "h-3.5 w-3.5" })
|
|
258
|
+
}
|
|
259
|
+
),
|
|
260
|
+
open && typeof document !== "undefined" && ReactDOM.createPortal(
|
|
261
|
+
/* @__PURE__ */ jsx(
|
|
262
|
+
"div",
|
|
263
|
+
{
|
|
264
|
+
ref: panelRef,
|
|
265
|
+
className: M3_MENU_PANEL,
|
|
266
|
+
style: { top: placement.top, left: placement.left, width: 216, maxHeight: placement.maxHeight },
|
|
267
|
+
"data-pane-widget-menu": "",
|
|
268
|
+
children: /* @__PURE__ */ jsx(ToolbarOverflowCloseProvider, { value: close, children })
|
|
269
|
+
}
|
|
270
|
+
),
|
|
271
|
+
document.body
|
|
272
|
+
)
|
|
273
|
+
] });
|
|
274
|
+
}
|
|
275
|
+
var WidgetPane_default = WidgetPane;
|
|
276
|
+
export {
|
|
277
|
+
WidgetPane,
|
|
278
|
+
WidgetPane_default as default
|
|
279
|
+
};
|
|
280
|
+
//# sourceMappingURL=WidgetPane.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/backend/dynamic-table/split-view/WidgetPane.tsx"],
|
|
4
|
+
"sourcesContent": ["'use client'\n\n// A dashboard widget rendered as split-view pane content.\n//\n// This constructs the props object the widget ALREADY declares\n// (`DashboardWidgetComponentProps`, a public upstream type) and hands it to the\n// component `loadDashboardWidgetModule` returns \u2014 the same two steps\n// `DashboardScreen` takes at DashboardScreen.tsx:521-701. Nothing upstream is\n// changed, shimmed or adapted; a widget cannot tell it is in a pane rather than\n// a dashboard card.\n//\n// Three differences from the dashboard card, each forced by the pane:\n//\n// * `layout` is synthesized from the SLOT (`{ id: slot.id, widgetId, order: 0 }`)\n// rather than read from a dashboard layout row. A pane is not a dashboard\n// item and has no order among siblings; the slot id is the stable identity,\n// and it is what makes two panes of the same widget independent.\n// * `settings` live on the slot, so `onSettingsChange` bubbles to the host to\n// persist rather than PUTting the dashboard layout.\n// * Chrome is one 28px row. A table pane's controls live in the toolbar the\n// table already draws; a widget draws none, so the pane must supply the\n// minimum \u2014 title, refresh, overflow \u2014 and no more. Vertical space is the\n// scarce resource here.\n//\n// Degradation matches a table pane exactly: unknown and denied each render one\n// clear line and nothing else, and a failed chunk load renders an ERROR, never a\n// skeleton that waits forever (the mistake `lazyTable.tsx` documents).\n//\n// Spec: .ai/specs/2026-08-17-split-view-workspace-composition.md (Phase 2)\n\nimport * as React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Loader2, MoreHorizontal, RefreshCw } from 'lucide-react'\nimport type {\n DashboardLayoutItem,\n DashboardWidgetModule,\n DashboardWidgetRenderContext,\n} from '@open-mercato/shared/modules/dashboard/widgets'\nimport { loadDashboardWidgetModule } from '../../dashboard/widgetRegistry'\nimport { ToolbarOverflowCloseProvider } from '../components/ToolbarOverflow'\n// The one piece of chrome this file shares with its host. Importing it back\n// from `SplitViewHost` is a cycle, and a safe one: the binding is read at\n// RENDER time, long after both module bodies have initialised.\nimport { M3_MENU_PANEL } from './SplitViewHost'\nimport { computeAnchoredPosition } from '../utils/anchoredPosition'\nimport {\n useContentById,\n useWidgetRenderContext,\n type WidgetContentItem,\n} from '../registry/ContentRegistryContext'\nimport type { PaneContentRef } from './types'\n\ntype WidgetRef = Extract<PaneContentRef, { kind: 'widget' }>\ntype LoadedModule = DashboardWidgetModule<any>\n\n/** A context is required by the prop type but may not have arrived. Empty, never fabricated. */\nconst ANONYMOUS_CONTEXT: DashboardWidgetRenderContext = {\n userId: '',\n tenantId: null,\n organizationId: null,\n userName: null,\n userEmail: null,\n userLabel: null,\n}\n\nexport type WidgetPaneProps = {\n /** The slot's content ref. `settings` on it are the user's; absent means defaults. */\n content: WidgetRef\n /** The owning slot's id \u2014 becomes `layout.id`, so two panes of one widget stay independent. */\n slotId: string\n /**\n * Persist the widget's new settings ON THE SLOT. The pane deliberately does\n * not write them itself: the host owns the layout tree and its persistence,\n * and a pane writing through it would be a second, racing writer.\n */\n onSettingsChange?: (next: unknown) => void\n /** Host rows for the pane's overflow menu (split / close / open full page). */\n overflowExtras?: React.ReactNode\n /** Mirrors a table pane's `hideToolbar` chrome toggle \u2014 hides the header row. */\n hideToolbar?: boolean\n}\n\nfunction PaneMessage({ children, ...rest }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className=\"flex h-full items-center justify-center p-6 text-center text-body-regular-sm text-[var(--m3-on-surface-variant)]\"\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nexport function WidgetPane({\n content,\n slotId,\n onSettingsChange,\n overflowExtras,\n hideToolbar,\n}: WidgetPaneProps) {\n const { item, status } = useContentById(content)\n\n if (status === 'loading') {\n return (\n <div className=\"flex h-full items-center justify-center\" data-pane-status=\"loading\">\n <Loader2 className=\"h-4 w-4 animate-spin text-[var(--m3-on-surface-variant)]\" aria-hidden=\"true\" />\n </div>\n )\n }\n if (status === 'unknown') {\n return (\n <PaneMessage data-pane-status=\"unknown\">This widget is no longer available.</PaneMessage>\n )\n }\n if (status === 'denied' || !item || item.kind !== 'widget') {\n return (\n <PaneMessage data-pane-status=\"denied\">\n You don\u2019t have access to {item?.title ?? 'this widget'}.\n </PaneMessage>\n )\n }\n\n return (\n <WidgetPaneBody\n item={item}\n content={content}\n slotId={slotId}\n onSettingsChange={onSettingsChange}\n overflowExtras={overflowExtras}\n hideToolbar={hideToolbar}\n />\n )\n}\n\nfunction WidgetPaneBody({\n item,\n content,\n slotId,\n onSettingsChange,\n overflowExtras,\n hideToolbar,\n}: {\n item: WidgetContentItem\n content: WidgetRef\n slotId: string\n onSettingsChange?: (next: unknown) => void\n overflowExtras?: React.ReactNode\n hideToolbar?: boolean\n}) {\n const renderContext = useWidgetRenderContext()\n const [module, setModule] = React.useState<LoadedModule | null>(null)\n const [loading, setLoading] = React.useState(true)\n const [loadFailed, setLoadFailed] = React.useState(false)\n const [refreshToken, setRefreshToken] = React.useState(0)\n const [refreshing, setRefreshing] = React.useState(false)\n\n const loaderKey = item.loaderKey\n\n React.useEffect(() => {\n let cancelled = false\n setLoading(true)\n setLoadFailed(false)\n loadDashboardWidgetModule(loaderKey)\n .then((loaded) => {\n if (cancelled) return\n // A null module means the loader key resolved to nothing \u2014 same outcome\n // as a thrown chunk error, and it must LOOK like one.\n setModule(loaded)\n setLoadFailed(!loaded)\n setLoading(false)\n })\n .catch((err) => {\n if (cancelled) return\n try {\n console.error('Failed to load widget module', err)\n } catch {}\n setLoadFailed(true)\n setLoading(false)\n })\n return () => {\n cancelled = true\n }\n }, [loaderKey])\n\n React.useEffect(() => {\n if (loadFailed) setRefreshing(false)\n }, [loadFailed])\n\n const hydratedSettings = React.useMemo(() => {\n const raw = content.settings ?? item.defaultSettings ?? null\n if (module?.hydrateSettings) {\n try {\n return module.hydrateSettings(raw)\n } catch (err) {\n try {\n console.warn('Failed to hydrate widget settings', err)\n } catch {}\n return raw\n }\n }\n return raw\n }, [content.settings, item.defaultSettings, module])\n\n const handleSettingsChange = React.useCallback(\n (next: unknown) => {\n let raw = next\n if (module?.dehydrateSettings) {\n try {\n raw = module.dehydrateSettings(next as never)\n } catch (err) {\n try {\n console.warn('Failed to dehydrate widget settings', err)\n } catch {}\n }\n }\n onSettingsChange?.(raw)\n },\n [module, onSettingsChange],\n )\n\n // The slot IS the layout item. `order: 0` because a pane has no siblings to\n // order against \u2014 the tree owns arrangement, not this number.\n const layout = React.useMemo<DashboardLayoutItem>(\n () => ({ id: slotId, widgetId: content.widgetId, order: 0, settings: content.settings }),\n [slotId, content.widgetId, content.settings],\n )\n\n const supportsRefresh = item.supportsRefresh ?? false\n const triggerRefresh = React.useCallback(() => {\n if (loading || loadFailed) return\n setRefreshing(true)\n setRefreshToken((value) => value + 1)\n }, [loading, loadFailed])\n\n const Widget = module?.Widget ?? null\n\n return (\n <div\n className=\"flex h-full min-h-0 min-w-0 flex-1 flex-col\"\n data-pane-widget-body={content.widgetId}\n >\n {!hideToolbar && (\n <div\n // A tinted container step instead of a hairline: M3 separates by\n // surface role wherever both would read, and this band is the card's\n // own top edge \u2014 the pane's `overflow-hidden` clips it to the radius.\n className=\"flex h-7 shrink-0 items-center gap-1 bg-[var(--m3-surface-container-low)] px-2 text-[var(--m3-on-surface)]\"\n data-pane-widget-header=\"\"\n >\n <span className=\"min-w-0 flex-1 truncate text-label-semibold-xs\" title={item.title}>\n {item.title}\n </span>\n {supportsRefresh && (\n <button\n type=\"button\"\n onClick={triggerRefresh}\n disabled={loading || loadFailed}\n aria-label=\"Refresh\"\n title=\"Refresh\"\n className=\"flex h-5 w-5 shrink-0 items-center justify-center rounded-m3-full text-[var(--m3-on-surface-variant)] transition-colors duration-[var(--m3-duration-short2)] ease-m3-standard hover:bg-[var(--m3-state-layer-hover)] hover:text-[var(--m3-on-surface)] active:bg-[var(--m3-state-layer-pressed)] disabled:opacity-[var(--m3-disabled-content-opacity)]\"\n data-pane-widget-refresh=\"\"\n >\n {refreshing ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <RefreshCw className=\"h-3.5 w-3.5\" />\n )}\n </button>\n )}\n {overflowExtras ? <WidgetPaneMenu>{overflowExtras}</WidgetPaneMenu> : null}\n </div>\n )}\n\n <div className=\"min-h-0 flex-1 overflow-auto p-2\" data-pane-widget-content=\"\">\n {loading && (\n <div className=\"flex h-full items-center justify-center\" data-pane-widget-loading=\"\">\n <Loader2 className=\"h-4 w-4 animate-spin text-[var(--m3-on-surface-variant)]\" aria-hidden=\"true\" />\n </div>\n )}\n {!loading && loadFailed && (\n <div\n className=\"p-4 text-body-regular-sm text-[var(--m3-on-surface-variant)]\"\n role=\"alert\"\n data-pane-widget-error=\"\"\n >\n This widget could not be loaded.\n </div>\n )}\n {!loading && !loadFailed && Widget && (\n <Widget\n mode=\"view\"\n layout={layout}\n settings={hydratedSettings}\n context={renderContext ?? ANONYMOUS_CONTEXT}\n onSettingsChange={handleSettingsChange}\n refreshToken={refreshToken}\n onRefreshStateChange={setRefreshing}\n />\n )}\n </div>\n </div>\n )\n}\n\n/**\n * The pane's overflow menu.\n *\n * Portalled to `document.body` and positioned with `computeAnchoredPosition`,\n * like every other menu in the grid \u2014 a pane clips its overflow, so an\n * absolutely-positioned panel would be painted over and unclickable (the bug\n * `PaneRestoreMenu` documents). `ToolbarOverflowCloseProvider` is what lets the\n * host's rows close the menu after acting, so they behave identically to the\n * rows a table pane puts in its own toolbar overflow.\n */\nfunction WidgetPaneMenu({ children }: { children: React.ReactNode }) {\n const [open, setOpen] = React.useState(false)\n const triggerRef = React.useRef<HTMLButtonElement>(null)\n const panelRef = React.useRef<HTMLDivElement>(null)\n const [placement, setPlacement] = React.useState({ top: 0, left: 0, maxHeight: 720 })\n\n const reposition = React.useCallback(() => {\n const trigger = triggerRef.current\n if (!trigger) return\n const next = computeAnchoredPosition(\n trigger.getBoundingClientRect(),\n { width: window.innerWidth, height: window.innerHeight },\n { width: 216, preferredHeight: 720, align: 'end', minHeight: 180 },\n )\n setPlacement({ top: next.top, left: next.left, maxHeight: next.maxHeight })\n }, [])\n\n React.useLayoutEffect(() => {\n if (open) reposition()\n }, [open, reposition])\n\n React.useEffect(() => {\n if (!open) return\n const onDown = (event: MouseEvent) => {\n const target = event.target as Node\n if (!panelRef.current?.contains(target) && !triggerRef.current?.contains(target)) setOpen(false)\n }\n const onKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setOpen(false)\n }\n const onScroll = () => reposition()\n document.addEventListener('mousedown', onDown)\n document.addEventListener('keydown', onKey)\n window.addEventListener('scroll', onScroll, true)\n window.addEventListener('resize', onScroll)\n return () => {\n document.removeEventListener('mousedown', onDown)\n document.removeEventListener('keydown', onKey)\n window.removeEventListener('scroll', onScroll, true)\n window.removeEventListener('resize', onScroll)\n }\n }, [open, reposition])\n\n const close = React.useCallback(() => setOpen(false), [])\n\n return (\n <>\n <button\n ref={triggerRef}\n type=\"button\"\n onClick={() => setOpen((value) => !value)}\n aria-label=\"Pane options\"\n aria-expanded={open}\n className=\"flex h-5 w-5 shrink-0 items-center justify-center rounded-m3-full text-[var(--m3-on-surface-variant)] transition-colors duration-[var(--m3-duration-short2)] ease-m3-standard hover:bg-[var(--m3-state-layer-hover)] hover:text-[var(--m3-on-surface)] active:bg-[var(--m3-state-layer-pressed)]\"\n data-pane-widget-menu-btn=\"\"\n >\n <MoreHorizontal className=\"h-3.5 w-3.5\" />\n </button>\n {open &&\n typeof document !== 'undefined' &&\n ReactDOM.createPortal(\n <div\n ref={panelRef}\n className={M3_MENU_PANEL}\n style={{ top: placement.top, left: placement.left, width: 216, maxHeight: placement.maxHeight }}\n data-pane-widget-menu=\"\"\n >\n <ToolbarOverflowCloseProvider value={close}>{children}</ToolbarOverflowCloseProvider>\n </div>,\n document.body,\n )}\n </>\n )\n}\n\nexport default WidgetPane\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|