@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/utils/anchoredPosition.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Placement maths for every portal-rendered dropdown in the grid.\n *\n * Extracted because three of them (`ColumnFilterPopover`, `SelectMenu`,\n * `PerspectiveTabMenu`) had each hand-rolled it, and two of the three got the\n * flip wrong in the same way:\n *\n * top: flipAbove ? Math.max(8, rect.top - 4) : rect.bottom + 4\n * ...\n * transform: flipAbove ? 'translateY(-100%)' : undefined\n *\n * The `Math.max(8, \u2026)` reads like a clamp against the top edge, but the\n * `translateY(-100%)` is applied AFTERWARDS and shifts the panel up by its own\n * full height \u2014 so the clamp protects nothing. Measured on the real transport\n * list at a 560px-tall viewport, the column-filter popover landed at\n * `top: -156`, hiding its search box, \"Select all\" and first two options above\n * the top of the window. A filter you cannot search or select-all in.\n *\n * The fix is not a bigger clamp, it is capping the HEIGHT. `maxHeight` is\n * bounded by the space actually available on the chosen side, which makes\n * `translateY(-100%)` exact and safe: a panel that can never be taller than the\n * gap above the anchor can never be pushed past the top of the viewport. The\n * transform stays because it is self-measuring \u2014 it needs no second render pass\n * to learn the panel's real height.\n *\n * Horizontal clamping is unconditional. `SelectMenu` sets `minWidth` (not\n * `width`), so a long option label grows the menu past the trigger; in the\n * Configure View drawer the triggers already sit near the right edge, so the\n * overflow direction is the one that goes off-screen.\n */\n\nexport interface AnchoredPlacement {\n /** Viewport coordinate for `position: fixed`. */\n top: number;\n left: number;\n /**\n * Hard cap. Apply it \u2014 it is what makes `flipAbove` safe. Panels that would\n * rather scroll than be cut off should pair it with `overflow: auto`.\n */\n maxHeight: number;\n /** True \u21D2 the caller must apply `transform: translateY(-100%)`. */\n flipAbove: boolean;\n}\n\nexport interface AnchoredPositionOptions {\n /** Rendered width of the panel, used for the horizontal clamp. */\n width: number;\n /** Height the panel wants when nothing is in its way. */\n preferredHeight: number;\n /** Which anchor edge the panel's left edge lines up with. */\n align?: 'start' | 'end';\n /** Gap between anchor and panel. */\n gap?: number;\n /** Keep-out band at every viewport edge. */\n margin?: number;\n /**\n * Never shrink below this, even in a very short viewport. A 40px-tall\n * dropdown is not a usable dropdown; better to overlap the anchor slightly\n * and stay operable than to collapse into a sliver.\n */\n minHeight?: number;\n}\n\n/**\n * Place a panel against an anchor rect, flipping and clamping so it is always\n * fully inside the viewport.\n *\n * Flips above only when that genuinely buys room: if there is no space either\n * way it stays below, where the clamp still keeps it on screen. Comparing the\n * two sides (rather than \"does it fit below? no \u21D2 flip\") is what stops a menu\n * near the top of the window flipping into the space it hasn't got.\n */\nexport function computeAnchoredPosition(\n anchor: { top: number; bottom: number; left: number; right: number },\n viewport: { width: number; height: number },\n options: AnchoredPositionOptions,\n): AnchoredPlacement {\n const { width, preferredHeight, align = 'start', gap = 4, margin = 8, minHeight = 120 } = options;\n\n const spaceBelow = viewport.height - anchor.bottom - gap - margin;\n const spaceAbove = anchor.top - gap - margin;\n\n // Only flip when above is genuinely roomier. `spaceBelow < preferredHeight`\n // alone would flip a panel anchored near the TOP of the window into an even\n // smaller gap \u2014 which is exactly how the popover ended up at top: -156.\n const flipAbove = spaceBelow < preferredHeight && spaceAbove > spaceBelow;\n\n const available = flipAbove ? spaceAbove : spaceBelow;\n // `minHeight` wins over `available` on purpose: in a viewport too short for\n // either side we accept a little overlap rather than an unusable sliver. The\n // horizontal clamp and `overflow: auto` keep it reachable.\n const maxHeight = Math.max(minHeight, Math.min(preferredHeight, available));\n\n const preferredLeft = align === 'end' ? anchor.right - width : anchor.left;\n const maxLeft = viewport.width - width - margin;\n // `Math.max(margin, \u2026)` last so a panel wider than the viewport pins to the\n // left edge rather than hanging off it on the right.\n const left = Math.max(margin, Math.min(preferredLeft, maxLeft));\n\n return {\n top: flipAbove ? anchor.top - gap : anchor.bottom + gap,\n left,\n maxHeight,\n flipAbove,\n };\n}\n"],
|
|
5
|
+
"mappings": "AAwEO,SAAS,wBACd,QACA,UACA,SACmB;AACnB,QAAM,EAAE,OAAO,iBAAiB,QAAQ,SAAS,MAAM,GAAG,SAAS,GAAG,YAAY,IAAI,IAAI;AAE1F,QAAM,aAAa,SAAS,SAAS,OAAO,SAAS,MAAM;AAC3D,QAAM,aAAa,OAAO,MAAM,MAAM;AAKtC,QAAM,YAAY,aAAa,mBAAmB,aAAa;AAE/D,QAAM,YAAY,YAAY,aAAa;AAI3C,QAAM,YAAY,KAAK,IAAI,WAAW,KAAK,IAAI,iBAAiB,SAAS,CAAC;AAE1E,QAAM,gBAAgB,UAAU,QAAQ,OAAO,QAAQ,QAAQ,OAAO;AACtE,QAAM,UAAU,SAAS,QAAQ,QAAQ;AAGzC,QAAM,OAAO,KAAK,IAAI,QAAQ,KAAK,IAAI,eAAe,OAAO,CAAC;AAE9D,SAAO;AAAA,IACL,KAAK,YAAY,OAAO,MAAM,MAAM,OAAO,SAAS;AAAA,IACpD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
const BADGE_FIT_MAX_WIDTH = 360;
|
|
2
|
+
const BADGE_FIT_PADDING = 16;
|
|
3
|
+
const BADGE_FIT_PADDING_WITH_COMMENT = 36;
|
|
4
|
+
function badgeFitWidth(contentWidth, hasComment) {
|
|
5
|
+
const pad = hasComment ? BADGE_FIT_PADDING_WITH_COMMENT : BADGE_FIT_PADDING;
|
|
6
|
+
return Math.min(Math.ceil(contentWidth) + pad + 2, BADGE_FIT_MAX_WIDTH);
|
|
7
|
+
}
|
|
8
|
+
function recordBadgeFit(cache, columnKey, width) {
|
|
9
|
+
if (!Number.isFinite(width) || width <= 0) return false;
|
|
10
|
+
const current = cache.get(columnKey);
|
|
11
|
+
if (current != null && current >= width) return false;
|
|
12
|
+
cache.set(columnKey, width);
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
function planBadgeWidths(cache, cols, getColumnWidth, isUserResized) {
|
|
16
|
+
if (cache.size === 0) return [];
|
|
17
|
+
const writes = [];
|
|
18
|
+
for (let col = 0; col < cols.length; col++) {
|
|
19
|
+
const fit = cache.get(cols[col].data);
|
|
20
|
+
if (fit == null) continue;
|
|
21
|
+
if (isUserResized(col)) continue;
|
|
22
|
+
if (getColumnWidth(col) >= fit) continue;
|
|
23
|
+
writes.push({ col, width: fit });
|
|
24
|
+
}
|
|
25
|
+
return writes;
|
|
26
|
+
}
|
|
27
|
+
export {
|
|
28
|
+
BADGE_FIT_MAX_WIDTH,
|
|
29
|
+
BADGE_FIT_PADDING,
|
|
30
|
+
BADGE_FIT_PADDING_WITH_COMMENT,
|
|
31
|
+
badgeFitWidth,
|
|
32
|
+
planBadgeWidths,
|
|
33
|
+
recordBadgeFit
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=badgeAutoFit.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/backend/dynamic-table/utils/badgeAutoFit.ts"],
|
|
4
|
+
"sourcesContent": ["import type { ColumnDef } from '../types/index';\n\n/**\n * Badge auto-fit \u2014 the MODEL half.\n *\n * Status/type pills must never be clipped (unlike text, which ellipses), so a\n * badge column grows to fit its widest pill. The measurement itself has to\n * touch the DOM \u2014 a consumer's custom renderer can emit any label it likes, so\n * there is no string in the model to measure \u2014 but the *decision* must not.\n *\n * Why this module exists (anchor Defect 6 / range-operation contract rule 6):\n * the original effect compared `badge.scrollWidth` against `td.clientWidth` and\n * wrote `store.setColumnWidth` for whatever happened to be mounted. Two things\n * are wrong with that under column virtualization:\n *\n * 1. It is *geometry-coupled*: the answer depended on how wide the cell\n * currently is, so widening a column could change what the next pass\n * decided \u2014 a column widening as it scrolls into view shifts every later\n * offset, changes the mounted window, and mounts another badge column.\n * That is a scroll-coupled layout feedback loop, and it visibly jitters.\n * 2. It was *index-keyed and mount-scoped*: a column that was not mounted had\n * no fit at all, and a perspective reorder moved a fitted width onto a\n * different column.\n *\n * The fix, in two halves:\n *\n * - Measurement is INTRINSIC and one-shot per pill: `badge.scrollWidth` is the\n * pill's own content width, which does not depend on the cell's width, the\n * scroll position or the mounted window. It is never re-derived from the\n * column's current width.\n * - The result is cached by the STABLE `col.data` key (never the index, same\n * rule as `frozenColumns` and width persistence) and re-applied to whatever\n * index that key currently occupies. So `store.getColumnWidth(i)` answers\n * for every `i`, mounted or not, and survives reorder/hide/show.\n *\n * The cache is grow-only, which makes the whole thing idempotent: a column that\n * is already wide enough produces no write, so no write can trigger another\n * measurement pass.\n */\n\n/** Hard cap so one freak value cannot blow out the layout. */\nexport const BADGE_FIT_MAX_WIDTH = 360;\n\n/**\n * Horizontal padding to reserve around a pill. A commented cell keeps 28px on\n * the right for the comment indicator; without counting that the column fits\n * the pill alone and the pill ends up sitting under the icon.\n */\nexport const BADGE_FIT_PADDING = 16;\nexport const BADGE_FIT_PADDING_WITH_COMMENT = 36;\n\n/**\n * Stored width that shows a pill of `contentWidth` in full: intrinsic content\n * + padding + a 2px buffer, capped. Depends on nothing but the pill itself \u2014\n * no cell width, no scroll offset, no mounted window.\n */\nexport function badgeFitWidth(contentWidth: number, hasComment: boolean): number {\n const pad = hasComment ? BADGE_FIT_PADDING_WITH_COMMENT : BADGE_FIT_PADDING;\n return Math.min(Math.ceil(contentWidth) + pad + 2, BADGE_FIT_MAX_WIDTH);\n}\n\n/**\n * Record a measurement against the stable column key, grow-only.\n * Returns true when the cache actually changed.\n */\nexport function recordBadgeFit(\n cache: Map<string, number>,\n columnKey: string,\n width: number,\n): boolean {\n if (!Number.isFinite(width) || width <= 0) return false;\n const current = cache.get(columnKey);\n if (current != null && current >= width) return false;\n cache.set(columnKey, width);\n return true;\n}\n\nexport interface BadgeWidthWrite {\n /** Index into the CURRENT view-order column array. */\n col: number;\n width: number;\n}\n\n/**\n * Turn the key-keyed cache into the set of width writes to apply, for the\n * column order as it stands now. Every cached key is considered \u2014 including\n * columns that are not mounted \u2014 so a fitted width follows its column through\n * a reorder and is already correct when the column scrolls back into view.\n *\n * Grow-only, and never fights a width the user set by hand.\n */\nexport function planBadgeWidths(\n cache: Map<string, number>,\n cols: ColumnDef[],\n getColumnWidth: (col: number) => number,\n isUserResized: (col: number) => boolean,\n): BadgeWidthWrite[] {\n if (cache.size === 0) return [];\n const writes: BadgeWidthWrite[] = [];\n for (let col = 0; col < cols.length; col++) {\n const fit = cache.get(cols[col].data);\n if (fit == null) continue;\n if (isUserResized(col)) continue;\n if (getColumnWidth(col) >= fit) continue;\n writes.push({ col, width: fit });\n }\n return writes;\n}\n"],
|
|
5
|
+
"mappings": "AAyCO,MAAM,sBAAsB;AAO5B,MAAM,oBAAoB;AAC1B,MAAM,iCAAiC;AAOvC,SAAS,cAAc,cAAsB,YAA6B;AAC/E,QAAM,MAAM,aAAa,iCAAiC;AAC1D,SAAO,KAAK,IAAI,KAAK,KAAK,YAAY,IAAI,MAAM,GAAG,mBAAmB;AACxE;AAMO,SAAS,eACd,OACA,WACA,OACS;AACT,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,EAAG,QAAO;AAClD,QAAM,UAAU,MAAM,IAAI,SAAS;AACnC,MAAI,WAAW,QAAQ,WAAW,MAAO,QAAO;AAChD,QAAM,IAAI,WAAW,KAAK;AAC1B,SAAO;AACT;AAgBO,SAAS,gBACd,OACA,MACA,gBACA,eACmB;AACnB,MAAI,MAAM,SAAS,EAAG,QAAO,CAAC;AAC9B,QAAM,SAA4B,CAAC;AACnC,WAAS,MAAM,GAAG,MAAM,KAAK,QAAQ,OAAO;AAC1C,UAAM,MAAM,MAAM,IAAI,KAAK,GAAG,EAAE,IAAI;AACpC,QAAI,OAAO,KAAM;AACjB,QAAI,cAAc,GAAG,EAAG;AACxB,QAAI,eAAe,GAAG,KAAK,IAAK;AAChC,WAAO,KAAK,EAAE,KAAK,OAAO,IAAI,CAAC;AAAA,EACjC;AACA,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
const EMPTY_GRID = { rows: [], rowCount: 0, colCount: 0, source: "empty" };
|
|
2
|
+
function parseTsv(text) {
|
|
3
|
+
if (!text) return [];
|
|
4
|
+
const rows = [];
|
|
5
|
+
let row = [];
|
|
6
|
+
let field = "";
|
|
7
|
+
let inQuotes = false;
|
|
8
|
+
let fieldWasQuoted = false;
|
|
9
|
+
const endField = () => {
|
|
10
|
+
row.push(field);
|
|
11
|
+
field = "";
|
|
12
|
+
fieldWasQuoted = false;
|
|
13
|
+
};
|
|
14
|
+
const endRow = () => {
|
|
15
|
+
endField();
|
|
16
|
+
rows.push(row);
|
|
17
|
+
row = [];
|
|
18
|
+
};
|
|
19
|
+
for (let i = 0; i < text.length; i++) {
|
|
20
|
+
const ch = text[i];
|
|
21
|
+
if (inQuotes) {
|
|
22
|
+
if (ch === '"') {
|
|
23
|
+
if (text[i + 1] === '"') {
|
|
24
|
+
field += '"';
|
|
25
|
+
i++;
|
|
26
|
+
} else {
|
|
27
|
+
inQuotes = false;
|
|
28
|
+
}
|
|
29
|
+
} else {
|
|
30
|
+
field += ch;
|
|
31
|
+
}
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (ch === '"' && field === "" && !fieldWasQuoted) {
|
|
35
|
+
inQuotes = true;
|
|
36
|
+
fieldWasQuoted = true;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (ch === " ") {
|
|
40
|
+
endField();
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (ch === "\r") {
|
|
44
|
+
if (text[i + 1] === "\n") i++;
|
|
45
|
+
endRow();
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (ch === "\n") {
|
|
49
|
+
endRow();
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
field += ch;
|
|
53
|
+
}
|
|
54
|
+
if (field !== "" || fieldWasQuoted || row.length > 0) endRow();
|
|
55
|
+
return padGrid(rows);
|
|
56
|
+
}
|
|
57
|
+
function serialiseTsv(rows) {
|
|
58
|
+
return rows.map(
|
|
59
|
+
(row) => row.map((cell) => {
|
|
60
|
+
const value = cell === null || cell === void 0 ? "" : String(cell);
|
|
61
|
+
if (/[\t\r\n"]/.test(value)) return `"${value.replace(/"/g, '""')}"`;
|
|
62
|
+
return value;
|
|
63
|
+
}).join(" ")
|
|
64
|
+
).join("\n");
|
|
65
|
+
}
|
|
66
|
+
function selectionToTsv(cells, bounds) {
|
|
67
|
+
const rowCount = bounds.endRow - bounds.startRow + 1;
|
|
68
|
+
const colCount = bounds.endCol - bounds.startCol + 1;
|
|
69
|
+
if (rowCount <= 0 || colCount <= 0) return "";
|
|
70
|
+
const grid = Array.from(
|
|
71
|
+
{ length: rowCount },
|
|
72
|
+
() => Array.from({ length: colCount }, () => "")
|
|
73
|
+
);
|
|
74
|
+
for (const cell of cells) {
|
|
75
|
+
const r = cell.row - bounds.startRow;
|
|
76
|
+
const c = cell.col - bounds.startCol;
|
|
77
|
+
if (r < 0 || r >= rowCount || c < 0 || c >= colCount) continue;
|
|
78
|
+
grid[r][c] = cell.value ?? "";
|
|
79
|
+
}
|
|
80
|
+
return serialiseTsv(grid);
|
|
81
|
+
}
|
|
82
|
+
function parseClipboardHtml(html) {
|
|
83
|
+
if (!html || !html.trim()) return null;
|
|
84
|
+
if (typeof DOMParser === "undefined") return null;
|
|
85
|
+
let doc;
|
|
86
|
+
try {
|
|
87
|
+
doc = new DOMParser().parseFromString(html, "text/html");
|
|
88
|
+
} catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
const table = doc.querySelector("table");
|
|
92
|
+
if (!table) return null;
|
|
93
|
+
const trs = Array.from(
|
|
94
|
+
table.querySelectorAll(":scope > tr, :scope > thead > tr, :scope > tbody > tr, :scope > tfoot > tr")
|
|
95
|
+
);
|
|
96
|
+
if (trs.length === 0) return null;
|
|
97
|
+
const grid = [];
|
|
98
|
+
const spanned = /* @__PURE__ */ new Map();
|
|
99
|
+
trs.forEach((tr, r) => {
|
|
100
|
+
const out = grid[r] ?? (grid[r] = []);
|
|
101
|
+
const cells = Array.from(tr.querySelectorAll(":scope > td, :scope > th"));
|
|
102
|
+
let c = 0;
|
|
103
|
+
for (const cell of cells) {
|
|
104
|
+
while (spanned.has(`${r}:${c}`)) {
|
|
105
|
+
out[c] = spanned.get(`${r}:${c}`) ?? "";
|
|
106
|
+
spanned.delete(`${r}:${c}`);
|
|
107
|
+
c++;
|
|
108
|
+
}
|
|
109
|
+
const text = cellText(cell);
|
|
110
|
+
const colSpan = spanCount(cell.getAttribute("colspan"));
|
|
111
|
+
const rowSpan = spanCount(cell.getAttribute("rowspan"));
|
|
112
|
+
for (let dc = 0; dc < colSpan; dc++) {
|
|
113
|
+
out[c + dc] = dc === 0 ? text : "";
|
|
114
|
+
for (let dr = 1; dr < rowSpan; dr++) {
|
|
115
|
+
spanned.set(`${r + dr}:${c + dc}`, "");
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
c += colSpan;
|
|
119
|
+
}
|
|
120
|
+
while (spanned.has(`${r}:${c}`)) {
|
|
121
|
+
out[c] = spanned.get(`${r}:${c}`) ?? "";
|
|
122
|
+
spanned.delete(`${r}:${c}`);
|
|
123
|
+
c++;
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
const filled = grid.map((row) => Array.from(row, (cell) => cell ?? ""));
|
|
127
|
+
if (filled.length === 0) return null;
|
|
128
|
+
return padGrid(filled);
|
|
129
|
+
}
|
|
130
|
+
function spanCount(raw) {
|
|
131
|
+
const n = raw ? parseInt(raw, 10) : 1;
|
|
132
|
+
if (!Number.isFinite(n) || n < 1) return 1;
|
|
133
|
+
return Math.min(n, 1e3);
|
|
134
|
+
}
|
|
135
|
+
function cellText(cell) {
|
|
136
|
+
const clone = cell.cloneNode(true);
|
|
137
|
+
clone.querySelectorAll("br").forEach((br) => {
|
|
138
|
+
br.replaceWith(clone.ownerDocument.createTextNode("\n"));
|
|
139
|
+
});
|
|
140
|
+
return (clone.textContent ?? "").replace(/[\u00a0\u202f]/g, " ").replace(/^[ \t\r\n]+|[ \t\r\n]+$/g, "");
|
|
141
|
+
}
|
|
142
|
+
function parseClipboardGrid(payload) {
|
|
143
|
+
const fromHtml = parseClipboardHtml(payload.html);
|
|
144
|
+
if (fromHtml && !isBlankGrid(fromHtml)) return toGrid(fromHtml, "html");
|
|
145
|
+
const fromText = payload.text ? parseTsv(payload.text) : [];
|
|
146
|
+
if (fromText.length > 0 && !isBlankGrid(fromText)) return toGrid(fromText, "text");
|
|
147
|
+
return EMPTY_GRID;
|
|
148
|
+
}
|
|
149
|
+
function toGrid(rows, source) {
|
|
150
|
+
return { rows, rowCount: rows.length, colCount: rows[0]?.length ?? 0, source };
|
|
151
|
+
}
|
|
152
|
+
function isBlankGrid(rows) {
|
|
153
|
+
return rows.length === 0 || rows.every((row) => row.every((cell) => cell === ""));
|
|
154
|
+
}
|
|
155
|
+
function padGrid(rows) {
|
|
156
|
+
const width = rows.reduce((max, row) => Math.max(max, row.length), 0);
|
|
157
|
+
return rows.map((row) => {
|
|
158
|
+
if (row.length === width) return row;
|
|
159
|
+
const padded = row.slice();
|
|
160
|
+
while (padded.length < width) padded.push("");
|
|
161
|
+
return padded;
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
export {
|
|
165
|
+
padGrid,
|
|
166
|
+
parseClipboardGrid,
|
|
167
|
+
parseClipboardHtml,
|
|
168
|
+
parseTsv,
|
|
169
|
+
selectionToTsv,
|
|
170
|
+
serialiseTsv
|
|
171
|
+
};
|
|
172
|
+
//# sourceMappingURL=clipboard.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/backend/dynamic-table/utils/clipboard.ts"],
|
|
4
|
+
"sourcesContent": ["// utils/clipboard.ts\n//\n// Clipboard payload <-> rectangular grid. PURE: no `ClipboardEvent`, no store,\n// no React. The caller reads `text/html` and `text/plain` off the event and\n// hands the strings in; everything below is testable without a browser.\n//\n// Why HTML first: Excel, Google Sheets and LibreOffice all put a real\n// `text/html` `<table>` on the clipboard AND a `text/plain` TSV. The HTML\n// preserves cell boundaries unambiguously \u2014 a cell containing a tab or a\n// newline is still one `<td>`, where the TSV has to quote it and hope the\n// reader unquotes the same way. TSV stays as the fallback because plenty of\n// sources (a text editor, a terminal, our own copy handler) emit only that.\n\n/** Which clipboard flavour produced the grid. `'empty'` means nothing usable. */\nexport type ClipboardGridSource = 'html' | 'text' | 'empty';\n\nexport interface ClipboardGrid {\n /** Rectangular: every row has `colCount` entries, short rows padded with ''. */\n rows: string[][];\n rowCount: number;\n colCount: number;\n source: ClipboardGridSource;\n}\n\nexport interface ClipboardPayload {\n html?: string | null;\n text?: string | null;\n}\n\nconst EMPTY_GRID: ClipboardGrid = { rows: [], rowCount: 0, colCount: 0, source: 'empty' };\n\n// ============================================\n// TSV\n// ============================================\n\n/**\n * Parse a TSV block into a rectangular grid.\n *\n * Handles the three line endings (`\\r\\n`, `\\n`, `\\r`), one trailing newline\n * (Excel appends one), and RFC4180-style quoting \u2014 which Excel uses on the\n * `text/plain` flavour whenever a cell contains a tab, a newline or a quote:\n * the cell is wrapped in `\"` and internal `\"` are doubled.\n */\nexport function parseTsv(text: string): string[][] {\n if (!text) return [];\n\n const rows: string[][] = [];\n let row: string[] = [];\n let field = '';\n let inQuotes = false;\n let fieldWasQuoted = false;\n\n const endField = () => {\n row.push(field);\n field = '';\n fieldWasQuoted = false;\n };\n const endRow = () => {\n endField();\n rows.push(row);\n row = [];\n };\n\n for (let i = 0; i < text.length; i++) {\n const ch = text[i];\n\n if (inQuotes) {\n if (ch === '\"') {\n if (text[i + 1] === '\"') {\n field += '\"';\n i++;\n } else {\n inQuotes = false;\n }\n } else {\n field += ch;\n }\n continue;\n }\n\n if (ch === '\"' && field === '' && !fieldWasQuoted) {\n inQuotes = true;\n fieldWasQuoted = true;\n continue;\n }\n if (ch === '\\t') {\n endField();\n continue;\n }\n if (ch === '\\r') {\n // `\\r\\n` counts once; a lone `\\r` is an old-Mac line ending.\n if (text[i + 1] === '\\n') i++;\n endRow();\n continue;\n }\n if (ch === '\\n') {\n endRow();\n continue;\n }\n field += ch;\n }\n\n // Anything still buffered is the last row; a payload ending in a newline has\n // nothing buffered and must NOT gain a phantom empty row.\n if (field !== '' || fieldWasQuoted || row.length > 0) endRow();\n\n return padGrid(rows);\n}\n\n/**\n * Serialise a grid to TSV, quoting exactly the cells that need it. Round-trips\n * through `parseTsv`.\n */\nexport function serialiseTsv(rows: readonly (readonly unknown[])[]): string {\n return rows\n .map((row) =>\n row\n .map((cell) => {\n const value = cell === null || cell === undefined ? '' : String(cell);\n if (/[\\t\\r\\n\"]/.test(value)) return `\"${value.replace(/\"/g, '\"\"')}\"`;\n return value;\n })\n .join('\\t'),\n )\n .join('\\n');\n}\n\n/**\n * Lay a flat list of selected cells back out as a rectangle and serialise it.\n *\n * THE serializer for everything that puts the grid's own selection on the\n * clipboard \u2014 `Ctrl+C`, the context-menu Copy and `Ctrl+X`. Cut must place\n * byte-identical text to Copy (a user who cuts, panics and pastes back has to\n * get exactly what was there), which is only guaranteed while there is one of\n * these.\n *\n * `cells` is `store.getCellsInSelection()`: already index-addressed and already\n * tolerant of unmounted columns. Missing cells stay empty rather than shifting\n * their neighbours left.\n */\nexport function selectionToTsv(\n cells: readonly { row: number; col: number; value: unknown }[],\n bounds: { startRow: number; endRow: number; startCol: number; endCol: number },\n): string {\n const rowCount = bounds.endRow - bounds.startRow + 1;\n const colCount = bounds.endCol - bounds.startCol + 1;\n if (rowCount <= 0 || colCount <= 0) return '';\n const grid: unknown[][] = Array.from({ length: rowCount }, () =>\n Array.from({ length: colCount }, () => ''),\n );\n for (const cell of cells) {\n const r = cell.row - bounds.startRow;\n const c = cell.col - bounds.startCol;\n if (r < 0 || r >= rowCount || c < 0 || c >= colCount) continue;\n grid[r][c] = cell.value ?? '';\n }\n return serialiseTsv(grid);\n}\n\n// ============================================\n// HTML TABLE\n// ============================================\n\n/**\n * Parse the `text/html` flavour Excel/Sheets put on the clipboard.\n *\n * Returns `null` \u2014 never an empty grid \u2014 when there is no usable table, so the\n * caller can fall through to TSV rather than pasting nothing.\n *\n * Merged cells: a `colspan`/`rowspan` cell contributes its text to its\n * top-left position and empty strings to the rest of the span, which is what\n * Excel itself pastes out of a merged block.\n */\nexport function parseClipboardHtml(html: string | null | undefined): string[][] | null {\n if (!html || !html.trim()) return null;\n // Server-side rendering and non-DOM test environments have no parser; the\n // TSV fallback covers them.\n if (typeof DOMParser === 'undefined') return null;\n\n let doc: Document;\n try {\n doc = new DOMParser().parseFromString(html, 'text/html');\n } catch {\n return null;\n }\n\n const table = doc.querySelector('table');\n if (!table) return null;\n\n const trs = Array.from(\n table.querySelectorAll(':scope > tr, :scope > thead > tr, :scope > tbody > tr, :scope > tfoot > tr'),\n );\n if (trs.length === 0) return null;\n\n const grid: string[][] = [];\n // Cells claimed by a rowspan from an earlier row, keyed `row:col`.\n const spanned = new Map<string, string>();\n\n trs.forEach((tr, r) => {\n const out: string[] = grid[r] ?? (grid[r] = []);\n const cells = Array.from(tr.querySelectorAll(':scope > td, :scope > th'));\n let c = 0;\n for (const cell of cells) {\n while (spanned.has(`${r}:${c}`)) {\n out[c] = spanned.get(`${r}:${c}`) ?? '';\n spanned.delete(`${r}:${c}`);\n c++;\n }\n const text = cellText(cell);\n const colSpan = spanCount(cell.getAttribute('colspan'));\n const rowSpan = spanCount(cell.getAttribute('rowspan'));\n for (let dc = 0; dc < colSpan; dc++) {\n out[c + dc] = dc === 0 ? text : '';\n for (let dr = 1; dr < rowSpan; dr++) {\n spanned.set(`${r + dr}:${c + dc}`, '');\n }\n }\n c += colSpan;\n }\n // Trailing cells claimed by a rowspan with no `td` after them.\n while (spanned.has(`${r}:${c}`)) {\n out[c] = spanned.get(`${r}:${c}`) ?? '';\n spanned.delete(`${r}:${c}`);\n c++;\n }\n });\n\n const filled = grid.map((row) => Array.from(row, (cell) => cell ?? ''));\n if (filled.length === 0) return null;\n return padGrid(filled);\n}\n\nfunction spanCount(raw: string | null): number {\n const n = raw ? parseInt(raw, 10) : 1;\n if (!Number.isFinite(n) || n < 1) return 1;\n // Excel writes real spans; anything absurd is a malformed payload, and\n // allocating for it would be a denial-of-service on a paste.\n return Math.min(n, 1000);\n}\n\n/**\n * A cell's text as a spreadsheet sees it: `<br>` becomes a newline, non-breaking\n * spaces become ordinary ones (Excel fills empty cells with ` `), and the\n * source's pretty-printing whitespace is trimmed off the ends.\n */\nfunction cellText(cell: Element): string {\n const clone = cell.cloneNode(true) as Element;\n clone.querySelectorAll('br').forEach((br) => {\n br.replaceWith(clone.ownerDocument!.createTextNode('\\n'));\n });\n return (clone.textContent ?? '')\n .replace(/[\\u00a0\\u202f]/g, ' ')\n .replace(/^[ \\t\\r\\n]+|[ \\t\\r\\n]+$/g, '');\n}\n\n// ============================================\n// ENTRY POINT\n// ============================================\n\n/**\n * Turn a clipboard payload into a rectangular grid: HTML table first, TSV\n * fallback, `source: 'empty'` when neither yields anything.\n *\n * A grid of exactly one empty cell counts as empty \u2014 pasting it would clear a\n * cell the user did not ask to clear.\n */\nexport function parseClipboardGrid(payload: ClipboardPayload): ClipboardGrid {\n const fromHtml = parseClipboardHtml(payload.html);\n if (fromHtml && !isBlankGrid(fromHtml)) return toGrid(fromHtml, 'html');\n\n const fromText = payload.text ? parseTsv(payload.text) : [];\n if (fromText.length > 0 && !isBlankGrid(fromText)) return toGrid(fromText, 'text');\n\n return EMPTY_GRID;\n}\n\nfunction toGrid(rows: string[][], source: ClipboardGridSource): ClipboardGrid {\n return { rows, rowCount: rows.length, colCount: rows[0]?.length ?? 0, source };\n}\n\nfunction isBlankGrid(rows: string[][]): boolean {\n return rows.length === 0 || rows.every((row) => row.every((cell) => cell === ''));\n}\n\n/** Pad every row out to the widest, so callers can index without holes. */\nexport function padGrid(rows: string[][]): string[][] {\n const width = rows.reduce((max, row) => Math.max(max, row.length), 0);\n return rows.map((row) => {\n if (row.length === width) return row;\n const padded = row.slice();\n while (padded.length < width) padded.push('');\n return padded;\n });\n}\n"],
|
|
5
|
+
"mappings": "AA6BA,MAAM,aAA4B,EAAE,MAAM,CAAC,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,QAAQ;AAcjF,SAAS,SAAS,MAA0B;AACjD,MAAI,CAAC,KAAM,QAAO,CAAC;AAEnB,QAAM,OAAmB,CAAC;AAC1B,MAAI,MAAgB,CAAC;AACrB,MAAI,QAAQ;AACZ,MAAI,WAAW;AACf,MAAI,iBAAiB;AAErB,QAAM,WAAW,MAAM;AACrB,QAAI,KAAK,KAAK;AACd,YAAQ;AACR,qBAAiB;AAAA,EACnB;AACA,QAAM,SAAS,MAAM;AACnB,aAAS;AACT,SAAK,KAAK,GAAG;AACb,UAAM,CAAC;AAAA,EACT;AAEA,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,KAAK,KAAK,CAAC;AAEjB,QAAI,UAAU;AACZ,UAAI,OAAO,KAAK;AACd,YAAI,KAAK,IAAI,CAAC,MAAM,KAAK;AACvB,mBAAS;AACT;AAAA,QACF,OAAO;AACL,qBAAW;AAAA,QACb;AAAA,MACF,OAAO;AACL,iBAAS;AAAA,MACX;AACA;AAAA,IACF;AAEA,QAAI,OAAO,OAAO,UAAU,MAAM,CAAC,gBAAgB;AACjD,iBAAW;AACX,uBAAiB;AACjB;AAAA,IACF;AACA,QAAI,OAAO,KAAM;AACf,eAAS;AACT;AAAA,IACF;AACA,QAAI,OAAO,MAAM;AAEf,UAAI,KAAK,IAAI,CAAC,MAAM,KAAM;AAC1B,aAAO;AACP;AAAA,IACF;AACA,QAAI,OAAO,MAAM;AACf,aAAO;AACP;AAAA,IACF;AACA,aAAS;AAAA,EACX;AAIA,MAAI,UAAU,MAAM,kBAAkB,IAAI,SAAS,EAAG,QAAO;AAE7D,SAAO,QAAQ,IAAI;AACrB;AAMO,SAAS,aAAa,MAA+C;AAC1E,SAAO,KACJ;AAAA,IAAI,CAAC,QACJ,IACG,IAAI,CAAC,SAAS;AACb,YAAM,QAAQ,SAAS,QAAQ,SAAS,SAAY,KAAK,OAAO,IAAI;AACpE,UAAI,YAAY,KAAK,KAAK,EAAG,QAAO,IAAI,MAAM,QAAQ,MAAM,IAAI,CAAC;AACjE,aAAO;AAAA,IACT,CAAC,EACA,KAAK,GAAI;AAAA,EACd,EACC,KAAK,IAAI;AACd;AAeO,SAAS,eACd,OACA,QACQ;AACR,QAAM,WAAW,OAAO,SAAS,OAAO,WAAW;AACnD,QAAM,WAAW,OAAO,SAAS,OAAO,WAAW;AACnD,MAAI,YAAY,KAAK,YAAY,EAAG,QAAO;AAC3C,QAAM,OAAoB,MAAM;AAAA,IAAK,EAAE,QAAQ,SAAS;AAAA,IAAG,MACzD,MAAM,KAAK,EAAE,QAAQ,SAAS,GAAG,MAAM,EAAE;AAAA,EAC3C;AACA,aAAW,QAAQ,OAAO;AACxB,UAAM,IAAI,KAAK,MAAM,OAAO;AAC5B,UAAM,IAAI,KAAK,MAAM,OAAO;AAC5B,QAAI,IAAI,KAAK,KAAK,YAAY,IAAI,KAAK,KAAK,SAAU;AACtD,SAAK,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS;AAAA,EAC7B;AACA,SAAO,aAAa,IAAI;AAC1B;AAgBO,SAAS,mBAAmB,MAAoD;AACrF,MAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,EAAG,QAAO;AAGlC,MAAI,OAAO,cAAc,YAAa,QAAO;AAE7C,MAAI;AACJ,MAAI;AACF,UAAM,IAAI,UAAU,EAAE,gBAAgB,MAAM,WAAW;AAAA,EACzD,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,IAAI,cAAc,OAAO;AACvC,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,MAAM,MAAM;AAAA,IAChB,MAAM,iBAAiB,4EAA4E;AAAA,EACrG;AACA,MAAI,IAAI,WAAW,EAAG,QAAO;AAE7B,QAAM,OAAmB,CAAC;AAE1B,QAAM,UAAU,oBAAI,IAAoB;AAExC,MAAI,QAAQ,CAAC,IAAI,MAAM;AACrB,UAAM,MAAgB,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC;AAC7C,UAAM,QAAQ,MAAM,KAAK,GAAG,iBAAiB,0BAA0B,CAAC;AACxE,QAAI,IAAI;AACR,eAAW,QAAQ,OAAO;AACxB,aAAO,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG;AAC/B,YAAI,CAAC,IAAI,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK;AACrC,gBAAQ,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE;AAC1B;AAAA,MACF;AACA,YAAM,OAAO,SAAS,IAAI;AAC1B,YAAM,UAAU,UAAU,KAAK,aAAa,SAAS,CAAC;AACtD,YAAM,UAAU,UAAU,KAAK,aAAa,SAAS,CAAC;AACtD,eAAS,KAAK,GAAG,KAAK,SAAS,MAAM;AACnC,YAAI,IAAI,EAAE,IAAI,OAAO,IAAI,OAAO;AAChC,iBAAS,KAAK,GAAG,KAAK,SAAS,MAAM;AACnC,kBAAQ,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE;AAAA,QACvC;AAAA,MACF;AACA,WAAK;AAAA,IACP;AAEA,WAAO,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG;AAC/B,UAAI,CAAC,IAAI,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK;AACrC,cAAQ,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE;AAC1B;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,SAAS,KAAK,IAAI,CAAC,QAAQ,MAAM,KAAK,KAAK,CAAC,SAAS,QAAQ,EAAE,CAAC;AACtE,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,SAAO,QAAQ,MAAM;AACvB;AAEA,SAAS,UAAU,KAA4B;AAC7C,QAAM,IAAI,MAAM,SAAS,KAAK,EAAE,IAAI;AACpC,MAAI,CAAC,OAAO,SAAS,CAAC,KAAK,IAAI,EAAG,QAAO;AAGzC,SAAO,KAAK,IAAI,GAAG,GAAI;AACzB;AAOA,SAAS,SAAS,MAAuB;AACvC,QAAM,QAAQ,KAAK,UAAU,IAAI;AACjC,QAAM,iBAAiB,IAAI,EAAE,QAAQ,CAAC,OAAO;AAC3C,OAAG,YAAY,MAAM,cAAe,eAAe,IAAI,CAAC;AAAA,EAC1D,CAAC;AACD,UAAQ,MAAM,eAAe,IAC1B,QAAQ,mBAAmB,GAAG,EAC9B,QAAQ,4BAA4B,EAAE;AAC3C;AAaO,SAAS,mBAAmB,SAA0C;AAC3E,QAAM,WAAW,mBAAmB,QAAQ,IAAI;AAChD,MAAI,YAAY,CAAC,YAAY,QAAQ,EAAG,QAAO,OAAO,UAAU,MAAM;AAEtE,QAAM,WAAW,QAAQ,OAAO,SAAS,QAAQ,IAAI,IAAI,CAAC;AAC1D,MAAI,SAAS,SAAS,KAAK,CAAC,YAAY,QAAQ,EAAG,QAAO,OAAO,UAAU,MAAM;AAEjF,SAAO;AACT;AAEA,SAAS,OAAO,MAAkB,QAA4C;AAC5E,SAAO,EAAE,MAAM,UAAU,KAAK,QAAQ,UAAU,KAAK,CAAC,GAAG,UAAU,GAAG,OAAO;AAC/E;AAEA,SAAS,YAAY,MAA2B;AAC9C,SAAO,KAAK,WAAW,KAAK,KAAK,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,SAAS,SAAS,EAAE,CAAC;AAClF;AAGO,SAAS,QAAQ,MAA8B;AACpD,QAAM,QAAQ,KAAK,OAAO,CAAC,KAAK,QAAQ,KAAK,IAAI,KAAK,IAAI,MAAM,GAAG,CAAC;AACpE,SAAO,KAAK,IAAI,CAAC,QAAQ;AACvB,QAAI,IAAI,WAAW,MAAO,QAAO;AACjC,UAAM,SAAS,IAAI,MAAM;AACzB,WAAO,OAAO,SAAS,MAAO,QAAO,KAAK,EAAE;AAC5C,WAAO;AAAA,EACT,CAAC;AACH;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
function isEmptyInput(value) {
|
|
2
|
+
return value === "" || value === null || value === void 0;
|
|
3
|
+
}
|
|
4
|
+
function sourceValues(col) {
|
|
5
|
+
const src = col.source;
|
|
6
|
+
if (!Array.isArray(src) || src.length === 0) return null;
|
|
7
|
+
return src.map(
|
|
8
|
+
(o) => o && typeof o === "object" ? String(o.value ?? o.id ?? "") : String(o)
|
|
9
|
+
);
|
|
10
|
+
}
|
|
11
|
+
function coerceCellValue(value, column) {
|
|
12
|
+
if (column.readOnly) return { ok: false, reason: "readOnly" };
|
|
13
|
+
if (!column.type) return { ok: true, value };
|
|
14
|
+
if (isEmptyInput(value)) return { ok: true, value: null };
|
|
15
|
+
switch (column.type) {
|
|
16
|
+
case "numeric": {
|
|
17
|
+
const raw = typeof value === "number" ? value : String(value).trim().replace(",", ".");
|
|
18
|
+
const parsed = typeof raw === "number" ? raw : parseFloat(raw);
|
|
19
|
+
if (!Number.isFinite(parsed)) return { ok: false, reason: "notCoercible" };
|
|
20
|
+
return { ok: true, value: parsed };
|
|
21
|
+
}
|
|
22
|
+
case "date": {
|
|
23
|
+
const date = value instanceof Date ? value : new Date(value);
|
|
24
|
+
if (Number.isNaN(date.getTime())) return { ok: false, reason: "notCoercible" };
|
|
25
|
+
const year = date.getFullYear();
|
|
26
|
+
const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
27
|
+
const day = String(date.getDate()).padStart(2, "0");
|
|
28
|
+
return { ok: true, value: `${year}-${month}-${day}` };
|
|
29
|
+
}
|
|
30
|
+
case "boolean": {
|
|
31
|
+
if (typeof value === "boolean") return { ok: true, value };
|
|
32
|
+
const s = String(value).trim().toLowerCase();
|
|
33
|
+
if (s === "true" || s === "1" || s === "yes" || s === "tak") return { ok: true, value: true };
|
|
34
|
+
if (s === "false" || s === "0" || s === "no" || s === "nie") return { ok: true, value: false };
|
|
35
|
+
return { ok: false, reason: "notCoercible" };
|
|
36
|
+
}
|
|
37
|
+
case "dropdown":
|
|
38
|
+
case "multiselect": {
|
|
39
|
+
const allowed = sourceValues(column);
|
|
40
|
+
if (!allowed) return { ok: true, value };
|
|
41
|
+
const wanted = Array.isArray(value) ? value.map(String) : [String(value)];
|
|
42
|
+
if (wanted.some((v) => !allowed.includes(v))) return { ok: false, reason: "notInSource" };
|
|
43
|
+
return { ok: true, value };
|
|
44
|
+
}
|
|
45
|
+
default:
|
|
46
|
+
return { ok: true, value };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export {
|
|
50
|
+
coerceCellValue
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=coerceCellValue.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/backend/dynamic-table/utils/coerceCellValue.ts"],
|
|
4
|
+
"sourcesContent": ["// utils/coerceCellValue.ts\n//\n// THE coercion table: \"can this raw value become this column's type, and if so\n// what exactly gets stored?\"\n//\n// It used to be `parseValueByType`, a private function inside\n// `handlers/index.ts` reachable only from the inline-edit path. Paste, fill,\n// find-&-replace and import all need the same answer, and a second table is how\n// a pasted date ends up stored differently from a typed one. So it moved here,\n// and it now RETURNS A VERDICT rather than a value: a multi-cell write must be\n// able to say \"3 cells were not numbers\" instead of silently blanking them.\n//\n// Pure: no store, no React, no DOM.\n\nimport type { ColumnDef } from '../types/index';\nimport type { CoerceResult } from '../handlers/cellWrites';\n\n/** Empty in the \"user cleared the cell\" sense. Clearing is always allowed. */\nfunction isEmptyInput(value: unknown): boolean {\n return value === '' || value === null || value === undefined;\n}\n\n/** `col.source` entries may be plain scalars or `{ value | id }` objects. */\nfunction sourceValues(col: ColumnDef): string[] | null {\n const src = col.source;\n if (!Array.isArray(src) || src.length === 0) return null;\n return src.map((o) =>\n o && typeof o === 'object'\n ? String((o as Record<string, unknown>).value ?? (o as Record<string, unknown>).id ?? '')\n : String(o),\n );\n}\n\n/**\n * Coerce one raw value for one column.\n *\n * Structurally identical to `CellValueCoercer`, so it can be handed straight to\n * `applyCellWrites({ coerce: coerceCellValue, ... })`.\n *\n * Verdicts:\n * - `readOnly` the column refuses writes outright;\n * - `notCoercible` a non-empty value that cannot become the column's type\n * (`'abc'` into a numeric column, `'32/13'` into a date);\n * - `notInSource` a `dropdown` / `multiselect` value outside `col.source`.\n *\n * Emptying is never a rejection here \u2014 `ColumnDef.required` is enforced one\n * level up, in `applyCellWrites`, where the row is known.\n */\nexport function coerceCellValue(value: unknown, column: ColumnDef): CoerceResult {\n if (column.readOnly) return { ok: false, reason: 'readOnly' };\n if (!column.type) return { ok: true, value };\n if (isEmptyInput(value)) return { ok: true, value: null };\n\n switch (column.type) {\n case 'numeric': {\n // Accept the Polish decimal comma users actually type; `parseFloat` alone\n // reads \"1,5\" as 1.\n const raw = typeof value === 'number' ? value : String(value).trim().replace(',', '.');\n const parsed = typeof raw === 'number' ? raw : parseFloat(raw);\n if (!Number.isFinite(parsed)) return { ok: false, reason: 'notCoercible' };\n return { ok: true, value: parsed };\n }\n\n case 'date': {\n const date = value instanceof Date ? value : new Date(value as string);\n if (Number.isNaN(date.getTime())) return { ok: false, reason: 'notCoercible' };\n // ISO date string (YYYY-MM-DD) so a Date round-tripped through a string\n // stays the same day. LOCAL parts, not UTC: `toISOString()` would shift a\n // Warsaw midnight back to the previous day.\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return { ok: true, value: `${year}-${month}-${day}` };\n }\n\n case 'boolean': {\n if (typeof value === 'boolean') return { ok: true, value };\n const s = String(value).trim().toLowerCase();\n if (s === 'true' || s === '1' || s === 'yes' || s === 'tak') return { ok: true, value: true };\n if (s === 'false' || s === '0' || s === 'no' || s === 'nie') return { ok: true, value: false };\n return { ok: false, reason: 'notCoercible' };\n }\n\n case 'dropdown':\n case 'multiselect': {\n const allowed = sourceValues(column);\n if (!allowed) return { ok: true, value };\n const wanted = Array.isArray(value) ? value.map(String) : [String(value)];\n if (wanted.some((v) => !allowed.includes(v))) return { ok: false, reason: 'notInSource' };\n return { ok: true, value };\n }\n\n default:\n return { ok: true, value };\n }\n}\n"],
|
|
5
|
+
"mappings": "AAkBA,SAAS,aAAa,OAAyB;AAC7C,SAAO,UAAU,MAAM,UAAU,QAAQ,UAAU;AACrD;AAGA,SAAS,aAAa,KAAiC;AACrD,QAAM,MAAM,IAAI;AAChB,MAAI,CAAC,MAAM,QAAQ,GAAG,KAAK,IAAI,WAAW,EAAG,QAAO;AACpD,SAAO,IAAI;AAAA,IAAI,CAAC,MACd,KAAK,OAAO,MAAM,WACd,OAAQ,EAA8B,SAAU,EAA8B,MAAM,EAAE,IACtF,OAAO,CAAC;AAAA,EACd;AACF;AAiBO,SAAS,gBAAgB,OAAgB,QAAiC;AAC/E,MAAI,OAAO,SAAU,QAAO,EAAE,IAAI,OAAO,QAAQ,WAAW;AAC5D,MAAI,CAAC,OAAO,KAAM,QAAO,EAAE,IAAI,MAAM,MAAM;AAC3C,MAAI,aAAa,KAAK,EAAG,QAAO,EAAE,IAAI,MAAM,OAAO,KAAK;AAExD,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK,WAAW;AAGd,YAAM,MAAM,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,KAAK,GAAG;AACrF,YAAM,SAAS,OAAO,QAAQ,WAAW,MAAM,WAAW,GAAG;AAC7D,UAAI,CAAC,OAAO,SAAS,MAAM,EAAG,QAAO,EAAE,IAAI,OAAO,QAAQ,eAAe;AACzE,aAAO,EAAE,IAAI,MAAM,OAAO,OAAO;AAAA,IACnC;AAAA,IAEA,KAAK,QAAQ;AACX,YAAM,OAAO,iBAAiB,OAAO,QAAQ,IAAI,KAAK,KAAe;AACrE,UAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO,EAAE,IAAI,OAAO,QAAQ,eAAe;AAI7E,YAAM,OAAO,KAAK,YAAY;AAC9B,YAAM,QAAQ,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACzD,YAAM,MAAM,OAAO,KAAK,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAClD,aAAO,EAAE,IAAI,MAAM,OAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,GAAG;AAAA,IACtD;AAAA,IAEA,KAAK,WAAW;AACd,UAAI,OAAO,UAAU,UAAW,QAAO,EAAE,IAAI,MAAM,MAAM;AACzD,YAAM,IAAI,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY;AAC3C,UAAI,MAAM,UAAU,MAAM,OAAO,MAAM,SAAS,MAAM,MAAO,QAAO,EAAE,IAAI,MAAM,OAAO,KAAK;AAC5F,UAAI,MAAM,WAAW,MAAM,OAAO,MAAM,QAAQ,MAAM,MAAO,QAAO,EAAE,IAAI,MAAM,OAAO,MAAM;AAC7F,aAAO,EAAE,IAAI,OAAO,QAAQ,eAAe;AAAA,IAC7C;AAAA,IAEA,KAAK;AAAA,IACL,KAAK,eAAe;AAClB,YAAM,UAAU,aAAa,MAAM;AACnC,UAAI,CAAC,QAAS,QAAO,EAAE,IAAI,MAAM,MAAM;AACvC,YAAM,SAAS,MAAM,QAAQ,KAAK,IAAI,MAAM,IAAI,MAAM,IAAI,CAAC,OAAO,KAAK,CAAC;AACxE,UAAI,OAAO,KAAK,CAAC,MAAM,CAAC,QAAQ,SAAS,CAAC,CAAC,EAAG,QAAO,EAAE,IAAI,OAAO,QAAQ,cAAc;AACxF,aAAO,EAAE,IAAI,MAAM,MAAM;AAAA,IAC3B;AAAA,IAEA;AACE,aAAO,EAAE,IAAI,MAAM,MAAM;AAAA,EAC7B;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const NO_COLOR_ADJACENCY = {
|
|
2
|
+
above: false,
|
|
3
|
+
below: false,
|
|
4
|
+
left: false,
|
|
5
|
+
right: false
|
|
6
|
+
};
|
|
7
|
+
function computeColorAdjacency(color, row, col, cols, annotations, keyAt) {
|
|
8
|
+
if (!color || !annotations || annotations.size === 0) return NO_COLOR_ADJACENCY;
|
|
9
|
+
const sameColorAt = (r, c) => {
|
|
10
|
+
const column = cols[c];
|
|
11
|
+
if (!column) return false;
|
|
12
|
+
const key = keyAt(r, column);
|
|
13
|
+
if (key == null) return false;
|
|
14
|
+
return annotations.get(key)?.color === color;
|
|
15
|
+
};
|
|
16
|
+
return {
|
|
17
|
+
above: sameColorAt(row - 1, col),
|
|
18
|
+
below: sameColorAt(row + 1, col),
|
|
19
|
+
left: sameColorAt(row, col - 1),
|
|
20
|
+
right: sameColorAt(row, col + 1)
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export {
|
|
24
|
+
NO_COLOR_ADJACENCY,
|
|
25
|
+
computeColorAdjacency
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=colorAdjacency.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/backend/dynamic-table/utils/colorAdjacency.ts"],
|
|
4
|
+
"sourcesContent": ["import type { ColumnDef } from '../types/index';\nimport type { AnnotationMap } from '../hooks/useAnnotations';\n\n/**\n * Colour-block adjacency \u2014 the MODEL replacement for anchor Defect 7.\n *\n * A 2-D block of same-coloured annotated cells must read as ONE shape: rounded\n * only on its outer corners, with the inter-row gap painted through. CSS cannot\n * see across `<tr>`s, so each cell is told about its four neighbours via\n * `data-cb-{above,below,left,right}`.\n *\n * The old implementation discovered those neighbours by running\n * `querySelectorAll('td.hot-cell[...][class*=\"cell-color-\"]')` over the grid on\n * every scroll event and comparing `data-row` / `data-col`. That is wrong twice:\n *\n * 1. It can only see MOUNTED cells. The row virtualizer already made the top\n * and bottom rows of the window falsely report \"no neighbour\"; column\n * virtualization adds the same lie on the left/right edges, mid-block, where\n * users see it \u2014 a painted gap and a rounded corner in the middle of a\n * colour run, moving as you scroll.\n * 2. It ran a full-grid DOM query inside the scroll handler, at the moment the\n * browser is already committing a frame.\n *\n * Throttling would fix neither. Adjacency is a fact about the DATA, so it is\n * computed here from the annotation map, the row order and the column order,\n * and passed down as props (range-operation contract rule 7: an unmounted\n * neighbour is still a neighbour).\n *\n * Vertical adjacency is by DATA row index (`row \u00B1 1`), which is what the DOM\n * scan compared too \u2014 a group header rendered between two data rows does not\n * break a colour block.\n */\n\nexport interface ColorAdjacency {\n above: boolean;\n below: boolean;\n left: boolean;\n right: boolean;\n}\n\nexport const NO_COLOR_ADJACENCY: ColorAdjacency = {\n above: false,\n below: false,\n left: false,\n right: false,\n};\n\n/**\n * @param color This cell's annotation colour (`null`/`undefined` = uncoloured).\n * @param row Data row index.\n * @param col Index into the FULL view-order column array.\n * @param cols The full view-order column array \u2014 never a virtualization window.\n * @param annotations Map keyed `\"<entityType>:<rowId>:<columnKey>\"`.\n * @param keyAt Builds that key for a (data row index, column). Returns\n * `null` when the cell has no annotation target \u2014 a row that\n * does not exist, or a column outside the scope. Supplied by\n * the grid so adjacency uses the SAME target resolver the\n * fetch and the dialog use (workshop B8a).\n */\nexport function computeColorAdjacency(\n color: string | null | undefined,\n row: number,\n col: number,\n cols: ColumnDef[],\n annotations: AnnotationMap | undefined,\n keyAt: (row: number, column: ColumnDef) => string | null,\n): ColorAdjacency {\n // An uncoloured cell has no block to join, so it never needs the four\n // attributes. Bailing here keeps the whole thing free for the overwhelming\n // majority of cells.\n if (!color || !annotations || annotations.size === 0) return NO_COLOR_ADJACENCY;\n\n const sameColorAt = (r: number, c: number): boolean => {\n const column = cols[c];\n if (!column) return false;\n const key = keyAt(r, column);\n if (key == null) return false;\n return annotations.get(key)?.color === color;\n };\n\n return {\n above: sameColorAt(row - 1, col),\n below: sameColorAt(row + 1, col),\n left: sameColorAt(row, col - 1),\n right: sameColorAt(row, col + 1),\n };\n}\n"],
|
|
5
|
+
"mappings": "AAwCO,MAAM,qBAAqC;AAAA,EAChD,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AACT;AAcO,SAAS,sBACd,OACA,KACA,KACA,MACA,aACA,OACgB;AAIhB,MAAI,CAAC,SAAS,CAAC,eAAe,YAAY,SAAS,EAAG,QAAO;AAE7D,QAAM,cAAc,CAAC,GAAW,MAAuB;AACrD,UAAM,SAAS,KAAK,CAAC;AACrB,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,MAAM,MAAM,GAAG,MAAM;AAC3B,QAAI,OAAO,KAAM,QAAO;AACxB,WAAO,YAAY,IAAI,GAAG,GAAG,UAAU;AAAA,EACzC;AAEA,SAAO;AAAA,IACL,OAAO,YAAY,MAAM,GAAG,GAAG;AAAA,IAC/B,OAAO,YAAY,MAAM,GAAG,GAAG;AAAA,IAC/B,MAAM,YAAY,KAAK,MAAM,CAAC;AAAA,IAC9B,OAAO,YAAY,KAAK,MAAM,CAAC;AAAA,EACjC;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
function computeColumnFill({
|
|
2
|
+
widths,
|
|
3
|
+
rigid,
|
|
4
|
+
furnitureWidth,
|
|
5
|
+
containerWidth
|
|
6
|
+
}) {
|
|
7
|
+
const result = /* @__PURE__ */ new Map();
|
|
8
|
+
if (!(containerWidth > 0) || widths.length === 0) return result;
|
|
9
|
+
let declaredTotal = furnitureWidth;
|
|
10
|
+
for (const w of widths) declaredTotal += w;
|
|
11
|
+
const surplus = Math.floor(containerWidth) - declaredTotal;
|
|
12
|
+
if (surplus < 1) return result;
|
|
13
|
+
const flexible = [];
|
|
14
|
+
let flexibleTotal = 0;
|
|
15
|
+
for (let i = 0; i < widths.length; i++) {
|
|
16
|
+
if (rigid.has(i)) continue;
|
|
17
|
+
flexible.push(i);
|
|
18
|
+
flexibleTotal += widths[i];
|
|
19
|
+
}
|
|
20
|
+
if (flexible.length === 0 || flexibleTotal <= 0) return result;
|
|
21
|
+
let assigned = 0;
|
|
22
|
+
for (let n = 0; n < flexible.length - 1; n++) {
|
|
23
|
+
const idx = flexible[n];
|
|
24
|
+
const extra = Math.floor(surplus * widths[idx] / flexibleTotal);
|
|
25
|
+
if (extra > 0) result.set(idx, extra);
|
|
26
|
+
assigned += extra;
|
|
27
|
+
}
|
|
28
|
+
const last = flexible[flexible.length - 1];
|
|
29
|
+
const remainder = surplus - assigned;
|
|
30
|
+
if (remainder > 0) result.set(last, remainder);
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
export {
|
|
34
|
+
computeColumnFill
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=columnFill.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/backend/dynamic-table/utils/columnFill.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * FILL THE CONTAINER \u2014 the arithmetic behind \"a narrow table has no dead strip\n * to its right\".\n *\n * Two regimes, and only two:\n *\n * declared total < container \u2192 EXPAND the flexible columns until the row\n * ends exactly at the container's right edge.\n * declared total >= container \u2192 nothing to do; the grid scrolls horizontally\n * at its declared widths.\n *\n * WHY THIS IS ARITHMETIC AND NOT `width: 100%`.\n *\n * Handing the row to the layout engine (`table { width: 100% }` + `flex-grow`)\n * fills the strip, but a stretched column's PAINTED width stops being its\n * DECLARED width \u2014 and column virtualization is built on declared widths: the\n * spacer that stands in for a run of unmounted columns has to be exactly as\n * wide as they would have been, or every mounted column lands at the wrong x.\n * That is why stretching used to force virtualization off, which made \"fills\n * the width\" and \"virtualized\" mutually exclusive on the widest lists \u2014 the\n * precise complaint this module answers.\n *\n * Resolving the surplus to PIXELS keeps every column's declared width honest,\n * so the spacers stay correct and both properties hold at once.\n *\n * WHAT IS RIGID (never touched):\n * \u2022 pinned / frozen columns and the sticky checkbox + Actions columns \u2014 their\n * widths are load-bearing for `position: sticky` offsets;\n * \u2022 any column the user has resized by hand. Their number is their answer;\n * growing it would silently overrule them.\n */\n\nexport interface ColumnFillInput {\n /** DECLARED width of every column, in view order. Never a painted width. */\n widths: readonly number[];\n /** Indices that must keep their declared width exactly. */\n rigid: ReadonlySet<number>;\n /** Row furniture outside `widths`: the row-header gutter + Actions column. */\n furnitureWidth: number;\n /** The scroll container's inner width (`clientWidth`). */\n containerWidth: number;\n}\n\n/**\n * Surplus pixels per column index. Only positive entries appear; an empty map\n * means \"declared widths already fill (or overflow) the container\".\n */\nexport function computeColumnFill({\n widths,\n rigid,\n furnitureWidth,\n containerWidth,\n}: ColumnFillInput): Map<number, number> {\n const result = new Map<number, number>();\n if (!(containerWidth > 0) || widths.length === 0) return result;\n\n let declaredTotal = furnitureWidth;\n for (const w of widths) declaredTotal += w;\n\n // Floor the container: a fractional target would leave a sub-pixel sliver of\n // dead strip or provoke a 1px horizontal scrollbar, and both read as a bug.\n const surplus = Math.floor(containerWidth) - declaredTotal;\n if (surplus < 1) return result;\n\n const flexible: number[] = [];\n let flexibleTotal = 0;\n for (let i = 0; i < widths.length; i++) {\n if (rigid.has(i)) continue;\n flexible.push(i);\n flexibleTotal += widths[i];\n }\n // Every column is pinned or hand-sized: there is nothing we are allowed to\n // grow, so the strip stays. Deliberate \u2014 the alternative is overruling the\n // user's own widths to win back some pixels.\n if (flexible.length === 0 || flexibleTotal <= 0) return result;\n\n // Proportional to declared width, so a wide description column takes more of\n // the surplus than a narrow date one and the row keeps its rhythm.\n let assigned = 0;\n for (let n = 0; n < flexible.length - 1; n++) {\n const idx = flexible[n];\n const extra = Math.floor((surplus * widths[idx]) / flexibleTotal);\n if (extra > 0) result.set(idx, extra);\n assigned += extra;\n }\n // The last flexible column absorbs the rounding remainder, so the row lands\n // on the container's edge to the pixel rather than 1\u20133px short of it.\n const last = flexible[flexible.length - 1];\n const remainder = surplus - assigned;\n if (remainder > 0) result.set(last, remainder);\n\n return result;\n}\n"],
|
|
5
|
+
"mappings": "AA+CO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,QAAM,SAAS,oBAAI,IAAoB;AACvC,MAAI,EAAE,iBAAiB,MAAM,OAAO,WAAW,EAAG,QAAO;AAEzD,MAAI,gBAAgB;AACpB,aAAW,KAAK,OAAQ,kBAAiB;AAIzC,QAAM,UAAU,KAAK,MAAM,cAAc,IAAI;AAC7C,MAAI,UAAU,EAAG,QAAO;AAExB,QAAM,WAAqB,CAAC;AAC5B,MAAI,gBAAgB;AACpB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,QAAI,MAAM,IAAI,CAAC,EAAG;AAClB,aAAS,KAAK,CAAC;AACf,qBAAiB,OAAO,CAAC;AAAA,EAC3B;AAIA,MAAI,SAAS,WAAW,KAAK,iBAAiB,EAAG,QAAO;AAIxD,MAAI,WAAW;AACf,WAAS,IAAI,GAAG,IAAI,SAAS,SAAS,GAAG,KAAK;AAC5C,UAAM,MAAM,SAAS,CAAC;AACtB,UAAM,QAAQ,KAAK,MAAO,UAAU,OAAO,GAAG,IAAK,aAAa;AAChE,QAAI,QAAQ,EAAG,QAAO,IAAI,KAAK,KAAK;AACpC,gBAAY;AAAA,EACd;AAGA,QAAM,OAAO,SAAS,SAAS,SAAS,CAAC;AACzC,QAAM,YAAY,UAAU;AAC5B,MAAI,YAAY,EAAG,QAAO,IAAI,MAAM,SAAS;AAE7C,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
function columnSpacerStyle(width) {
|
|
2
|
+
return {
|
|
3
|
+
width,
|
|
4
|
+
flexBasis: width,
|
|
5
|
+
minWidth: width,
|
|
6
|
+
maxWidth: width,
|
|
7
|
+
flexShrink: 0,
|
|
8
|
+
flexGrow: 0,
|
|
9
|
+
padding: 0,
|
|
10
|
+
border: 0,
|
|
11
|
+
pointerEvents: "none"
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function columnSpacerKey(fromIndex, toIndex) {
|
|
15
|
+
return `__spacer_${fromIndex}_${toIndex}`;
|
|
16
|
+
}
|
|
17
|
+
export {
|
|
18
|
+
columnSpacerKey,
|
|
19
|
+
columnSpacerStyle
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=columnSpacerStyle.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/backend/dynamic-table/utils/columnSpacerStyle.ts"],
|
|
4
|
+
"sourcesContent": ["import type * as React from 'react';\n\n/**\n * Geometry for the placeholder box that stands in for a run of unmounted\n * columns under horizontal virtualization.\n *\n * One function, four render sites (`ColumnHeaders`, `VirtualRow`,\n * `GroupSummaryRow`, `FooterTotalsRow`). If header spacers and body spacers can\n * drift by a pixel, sticky offsets and column alignment drift with them, so the\n * numbers are stated exactly once.\n *\n * HARD RULES, all of which are about correctness rather than looks:\n *\n * 1. `flexShrink: 0` / `flexGrow: 0` ALWAYS \u2014 a spacer that stretched would\n * make the mounted columns land at the wrong x. Nothing in this grid\n * stretches any more (`utils/columnFill.ts` resolves the fill-to-container\n * surplus to PIXELS precisely so that spacer widths stay honest), and this\n * is the belt to that braces.\n * 2. `pointerEvents: 'none'` \u2014 nothing may hit-test onto a spacer.\n * 3. NEVER `position: sticky`. A spacer that stuck would occlude real cells.\n * 4. No padding, no border. NOTE what is deliberately ABSENT: `background`.\n * A striped, checkbox-selected or range-selected row paints its fill on the\n * CELLS (`td.hot-cell`), not on the `<tr>`, so an inline `transparent` here\n * would punch a visible hole through the middle of a highlighted row. The\n * fill is handed to spacers by `styles/DynamicTable.v2.css` instead, which\n * is the only place that knows what each row state is painted with.\n *\n * The two rules a style object cannot carry are stated here because they belong\n * with the same decision, and every call site obeys them:\n *\n * 5. A spacer element must NEVER carry `data-row` or `data-col`. Every pointer\n * hit-test does `closest('td[data-row][data-col]')`, so a matching spacer\n * would silently retarget writes to a column the user never clicked.\n * 6. It must be `aria-hidden` so it is not counted as a cell.\n */\nexport function columnSpacerStyle(width: number): React.CSSProperties {\n return {\n width,\n flexBasis: width,\n minWidth: width,\n maxWidth: width,\n flexShrink: 0,\n flexGrow: 0,\n padding: 0,\n border: 0,\n pointerEvents: 'none',\n };\n}\n\n/** Stable React key for a spacer, derived from the run it covers. */\nexport function columnSpacerKey(fromIndex: number, toIndex: number): string {\n return `__spacer_${fromIndex}_${toIndex}`;\n}\n"],
|
|
5
|
+
"mappings": "AAmCO,SAAS,kBAAkB,OAAoC;AACpE,SAAO;AAAA,IACL;AAAA,IACA,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,eAAe;AAAA,EACjB;AACF;AAGO,SAAS,gBAAgB,WAAmB,SAAyB;AAC1E,SAAO,YAAY,SAAS,IAAI,OAAO;AACzC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|