@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,82 @@
|
|
|
1
|
+
function cellToString(value) {
|
|
2
|
+
if (value === null || value === void 0) return "";
|
|
3
|
+
return String(value);
|
|
4
|
+
}
|
|
5
|
+
function extractExportRows(store, cols, selectedRowIds, selectionColumnName) {
|
|
6
|
+
const headers = cols.map((c) => c.title ?? c.data);
|
|
7
|
+
const rows = [];
|
|
8
|
+
const rowCount = store.getRowCount();
|
|
9
|
+
const exportSelectionOnly = selectedRowIds.size > 0;
|
|
10
|
+
for (let r = 0; r < rowCount; r++) {
|
|
11
|
+
const rowData = store.getRowData(r);
|
|
12
|
+
if (!rowData) continue;
|
|
13
|
+
if (exportSelectionOnly) {
|
|
14
|
+
const id = String(rowData[selectionColumnName] ?? "");
|
|
15
|
+
if (!id || !selectedRowIds.has(id)) continue;
|
|
16
|
+
}
|
|
17
|
+
rows.push(
|
|
18
|
+
cols.map((col, c) => {
|
|
19
|
+
const raw = store.getCellValue(r, c);
|
|
20
|
+
if (col.exportValue) return cellToString(col.exportValue(raw, rowData));
|
|
21
|
+
return cellToString(raw);
|
|
22
|
+
})
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
return { headers, rows };
|
|
26
|
+
}
|
|
27
|
+
function extractExportRowsFromData(data, cols) {
|
|
28
|
+
const headers = cols.map((c) => c.title ?? c.data);
|
|
29
|
+
const rows = data.map(
|
|
30
|
+
(row) => cols.map((col) => {
|
|
31
|
+
const raw = row?.[col.data];
|
|
32
|
+
if (col.exportValue) return cellToString(col.exportValue(raw, row));
|
|
33
|
+
if (raw !== null && typeof raw === "object") return "";
|
|
34
|
+
return cellToString(raw);
|
|
35
|
+
})
|
|
36
|
+
);
|
|
37
|
+
return { headers, rows };
|
|
38
|
+
}
|
|
39
|
+
function escapeCsvField(field) {
|
|
40
|
+
if (/[",\r\n]/.test(field)) {
|
|
41
|
+
return `"${field.replace(/"/g, '""')}"`;
|
|
42
|
+
}
|
|
43
|
+
return field;
|
|
44
|
+
}
|
|
45
|
+
function toCsv({ headers, rows }) {
|
|
46
|
+
const lines = [headers, ...rows].map((row) => row.map(escapeCsvField).join(","));
|
|
47
|
+
return "\uFEFF" + lines.join("\r\n");
|
|
48
|
+
}
|
|
49
|
+
function toXlsxBlob(table, XLSX) {
|
|
50
|
+
const aoa = [table.headers, ...table.rows];
|
|
51
|
+
const sheet = XLSX.utils.aoa_to_sheet(aoa);
|
|
52
|
+
const book = XLSX.utils.book_new();
|
|
53
|
+
XLSX.utils.book_append_sheet(book, sheet, "Export");
|
|
54
|
+
const out = XLSX.write(book, { type: "array", bookType: "xlsx" });
|
|
55
|
+
return new Blob([out], {
|
|
56
|
+
type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
function slugifyFileName(name) {
|
|
60
|
+
const slug = name.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
61
|
+
return slug || "export";
|
|
62
|
+
}
|
|
63
|
+
function downloadBlob(blob, filename) {
|
|
64
|
+
if (typeof document === "undefined") return;
|
|
65
|
+
const url = URL.createObjectURL(blob);
|
|
66
|
+
const a = document.createElement("a");
|
|
67
|
+
a.href = url;
|
|
68
|
+
a.download = filename;
|
|
69
|
+
document.body.appendChild(a);
|
|
70
|
+
a.click();
|
|
71
|
+
a.remove();
|
|
72
|
+
setTimeout(() => URL.revokeObjectURL(url), 0);
|
|
73
|
+
}
|
|
74
|
+
export {
|
|
75
|
+
downloadBlob,
|
|
76
|
+
extractExportRows,
|
|
77
|
+
extractExportRowsFromData,
|
|
78
|
+
slugifyFileName,
|
|
79
|
+
toCsv,
|
|
80
|
+
toXlsxBlob
|
|
81
|
+
};
|
|
82
|
+
//# sourceMappingURL=exportTable.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/backend/dynamic-table/utils/exportTable.ts"],
|
|
4
|
+
"sourcesContent": ["import type { ColumnDef } from '../types/index';\nimport type { CellStore } from '../store/index';\n\nexport type ExportFormat = 'csv' | 'xlsx';\n\nexport interface ExtractedTable {\n /** Column header labels, in view order. */\n headers: string[];\n /** Body rows; each is an array of cell strings aligned to `headers`. */\n rows: string[][];\n}\n\nfunction cellToString(value: unknown): string {\n if (value === null || value === undefined) return '';\n return String(value);\n}\n\n/**\n * Pull the visible columns for the chosen rows out of the cell store \u2014 the same\n * extraction the Copy button uses (`store.getCellValue` over `cols` in view\n * order, which projects `rowData[col.data]`, the one value source the grid also\n * renders from). When `selectedRowIds` is non-empty, only those rows are\n * exported; otherwise every loaded (current-page) row is included.\n *\n * Columns may declare `exportValue(value, row)` to override the stringified raw\n * cell value (e.g. relation columns that store JSON in the cell).\n */\nexport function extractExportRows(\n store: CellStore,\n cols: ColumnDef[],\n selectedRowIds: Set<string>,\n selectionColumnName: string,\n): ExtractedTable {\n const headers = cols.map((c) => c.title ?? c.data);\n const rows: string[][] = [];\n const rowCount = store.getRowCount();\n const exportSelectionOnly = selectedRowIds.size > 0;\n\n for (let r = 0; r < rowCount; r++) {\n const rowData = store.getRowData(r);\n if (!rowData) continue;\n if (exportSelectionOnly) {\n const id = String(rowData[selectionColumnName] ?? '');\n if (!id || !selectedRowIds.has(id)) continue;\n }\n rows.push(\n cols.map((col, c) => {\n const raw = store.getCellValue(r, c);\n if (col.exportValue) return cellToString(col.exportValue(raw, rowData));\n return cellToString(raw);\n }),\n );\n }\n\n return { headers, rows };\n}\n\n/**\n * Build an export table directly from plain row objects (not the cell store).\n * Used for the whole-table export, where rows are re-fetched from the server\n * across all pages and every column is included regardless of perspective\n * visibility. Reads `row[col.data]`, applying `col.exportValue` when present.\n */\nexport function extractExportRowsFromData(\n data: any[],\n cols: ColumnDef[],\n): ExtractedTable {\n const headers = cols.map((c) => c.title ?? c.data);\n const rows = data.map((row) =>\n cols.map((col) => {\n const raw = row?.[col.data];\n if (col.exportValue) return cellToString(col.exportValue(raw, row));\n // Objects/arrays have no useful default string form \u2014 leave blank rather\n // than emit \"[object Object]\". Columns that store them must use exportValue.\n if (raw !== null && typeof raw === 'object') return '';\n return cellToString(raw);\n }),\n );\n return { headers, rows };\n}\n\nfunction escapeCsvField(field: string): string {\n // RFC 4180: quote fields containing comma, quote, CR or LF; double interior quotes.\n if (/[\",\\r\\n]/.test(field)) {\n return `\"${field.replace(/\"/g, '\"\"')}\"`;\n }\n return field;\n}\n\n/**\n * Serialize an extracted table to a CSV string. Prepends a UTF-8 BOM so Excel\n * opens it with the correct encoding (Polish characters survive).\n */\nexport function toCsv({ headers, rows }: ExtractedTable): string {\n const lines = [headers, ...rows].map((row) => row.map(escapeCsvField).join(','));\n return '\uFEFF' + lines.join('\\r\\n');\n}\n\n/**\n * Serialize an extracted table to an .xlsx Blob via SheetJS. The `xlsx`\n * dependency is imported lazily by the caller and passed in, so CSV-only paths\n * never load it.\n */\nexport function toXlsxBlob(\n table: ExtractedTable,\n XLSX: typeof import('xlsx'),\n): Blob {\n const aoa = [table.headers, ...table.rows];\n const sheet = XLSX.utils.aoa_to_sheet(aoa);\n const book = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(book, sheet, 'Export');\n const out = XLSX.write(book, { type: 'array', bookType: 'xlsx' }) as ArrayBuffer;\n return new Blob([out], {\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n });\n}\n\n/** Slugify a table/file name into a safe file-name stem. */\nexport function slugifyFileName(name: string): string {\n const slug = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return slug || 'export';\n}\n\n/** Trigger a browser download of `blob` as `filename` (no-op when no document). */\nexport function downloadBlob(blob: Blob, filename: string): void {\n if (typeof document === 'undefined') return;\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n // Revoke on the next tick so the click has consumed the URL.\n setTimeout(() => URL.revokeObjectURL(url), 0);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { invertFillMode } from "./fillPatterns.js";
|
|
2
|
+
function rectSize(bounds) {
|
|
3
|
+
return (bounds.endRow - bounds.startRow + 1) * (bounds.endCol - bounds.startCol + 1);
|
|
4
|
+
}
|
|
5
|
+
function isCellInRect(row, col, bounds) {
|
|
6
|
+
return row >= bounds.startRow && row <= bounds.endRow && col >= bounds.startCol && col <= bounds.endCol;
|
|
7
|
+
}
|
|
8
|
+
function overshoot(value, lo, hi) {
|
|
9
|
+
if (value < lo) return lo - value;
|
|
10
|
+
if (value > hi) return value - hi;
|
|
11
|
+
return 0;
|
|
12
|
+
}
|
|
13
|
+
function computeFillPreview(source, pointer, opts) {
|
|
14
|
+
const mode = opts.modifier ? invertFillMode(opts.defaultMode) : opts.defaultMode;
|
|
15
|
+
const dRow = overshoot(pointer.row, source.startRow, source.endRow);
|
|
16
|
+
const dCol = overshoot(pointer.col, source.startCol, source.endCol);
|
|
17
|
+
if (dRow > 0 || dCol > 0) {
|
|
18
|
+
const axis2 = dRow >= dCol ? "vertical" : "horizontal";
|
|
19
|
+
const backwards = axis2 === "vertical" ? pointer.row < source.startRow : pointer.col < source.startCol;
|
|
20
|
+
const bounds = axis2 === "vertical" ? {
|
|
21
|
+
startRow: Math.min(source.startRow, pointer.row),
|
|
22
|
+
endRow: Math.max(source.endRow, pointer.row),
|
|
23
|
+
startCol: source.startCol,
|
|
24
|
+
endCol: source.endCol
|
|
25
|
+
} : {
|
|
26
|
+
startRow: source.startRow,
|
|
27
|
+
endRow: source.endRow,
|
|
28
|
+
startCol: Math.min(source.startCol, pointer.col),
|
|
29
|
+
endCol: Math.max(source.endCol, pointer.col)
|
|
30
|
+
};
|
|
31
|
+
return { source, bounds, axis: axis2, backwards, clearing: false, cleared: null, mode };
|
|
32
|
+
}
|
|
33
|
+
const shrinkRows = source.endRow - pointer.row;
|
|
34
|
+
const shrinkCols = source.endCol - pointer.col;
|
|
35
|
+
const axis = shrinkRows >= shrinkCols ? "vertical" : "horizontal";
|
|
36
|
+
const cleared = axis === "vertical" ? { ...source, startRow: pointer.row + 1 } : { ...source, startCol: pointer.col + 1 };
|
|
37
|
+
const clearing = axis === "vertical" ? cleared.startRow <= cleared.endRow : cleared.startCol <= cleared.endCol;
|
|
38
|
+
return {
|
|
39
|
+
source,
|
|
40
|
+
bounds: source,
|
|
41
|
+
axis,
|
|
42
|
+
backwards: false,
|
|
43
|
+
clearing,
|
|
44
|
+
cleared: clearing ? cleared : null,
|
|
45
|
+
mode
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function buildFillLines(preview) {
|
|
49
|
+
const { source, bounds, axis, backwards } = preview;
|
|
50
|
+
const lines = [];
|
|
51
|
+
if (axis === "vertical") {
|
|
52
|
+
for (let col = source.startCol; col <= source.endCol; col++) {
|
|
53
|
+
const seedCells = [];
|
|
54
|
+
for (let row = source.startRow; row <= source.endRow; row++) seedCells.push({ row, col });
|
|
55
|
+
const targets = [];
|
|
56
|
+
if (backwards) {
|
|
57
|
+
for (let row = source.startRow - 1; row >= bounds.startRow; row--) targets.push({ row, col });
|
|
58
|
+
} else {
|
|
59
|
+
for (let row = source.endRow + 1; row <= bounds.endRow; row++) targets.push({ row, col });
|
|
60
|
+
}
|
|
61
|
+
lines.push({ seedCells, targets, seedCol: col });
|
|
62
|
+
}
|
|
63
|
+
return lines;
|
|
64
|
+
}
|
|
65
|
+
for (let row = source.startRow; row <= source.endRow; row++) {
|
|
66
|
+
const seedCells = [];
|
|
67
|
+
for (let col = source.startCol; col <= source.endCol; col++) seedCells.push({ row, col });
|
|
68
|
+
const targets = [];
|
|
69
|
+
if (backwards) {
|
|
70
|
+
for (let col = source.startCol - 1; col >= bounds.startCol; col--) targets.push({ row, col });
|
|
71
|
+
} else {
|
|
72
|
+
for (let col = source.endCol + 1; col <= bounds.endCol; col++) targets.push({ row, col });
|
|
73
|
+
}
|
|
74
|
+
lines.push({ seedCells, targets, seedCol: source.startCol });
|
|
75
|
+
}
|
|
76
|
+
return lines;
|
|
77
|
+
}
|
|
78
|
+
function cellsInRect(bounds) {
|
|
79
|
+
const cells = [];
|
|
80
|
+
for (let row = bounds.startRow; row <= bounds.endRow; row++) {
|
|
81
|
+
for (let col = bounds.startCol; col <= bounds.endCol; col++) cells.push({ row, col });
|
|
82
|
+
}
|
|
83
|
+
return cells;
|
|
84
|
+
}
|
|
85
|
+
export {
|
|
86
|
+
buildFillLines,
|
|
87
|
+
cellsInRect,
|
|
88
|
+
computeFillPreview,
|
|
89
|
+
isCellInRect,
|
|
90
|
+
rectSize
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=fillGeometry.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/backend/dynamic-table/utils/fillGeometry.ts"],
|
|
4
|
+
"sourcesContent": ["// utils/fillGeometry.ts\n//\n// Where a fill drag is pointing. PURE: no DOM, no store, no React.\n//\n// This is the single most important testability move in the rectangle-fill\n// work: axis lock and back-drag are the two rules users notice, and neither can\n// be proven inside a `mousemove` callback. Both live here instead, so a jest\n// test can assert \"a diagonal drag picks the dominant axis\" without a browser.\n//\n// Excel's fill is SINGLE-AXIS. The axis is chosen by the larger overshoot from\n// the source block's edge; the other axis is clamped to the source's extent.\n// Dragging back INSIDE the source clears the part you dragged back over.\n\nimport type { FillAxis, FillPreview, SelectionBounds } from '../types/index';\nimport type { FillMode } from './fillPatterns';\nimport { invertFillMode } from './fillPatterns';\n\nexport interface FillPointer {\n row: number;\n col: number;\n}\n\nexport interface ComputeFillPreviewOptions {\n /** `Ctrl`/`Alt` held. Inverts the pattern's default copy <-> series. */\n modifier: boolean;\n /** The mode the detected pattern would use with no modifier held. */\n defaultMode: FillMode;\n}\n\n/** Inclusive cell count of a rectangle. */\nexport function rectSize(bounds: SelectionBounds): number {\n return (\n (bounds.endRow - bounds.startRow + 1) * (bounds.endCol - bounds.startCol + 1)\n );\n}\n\nexport function isCellInRect(row: number, col: number, bounds: SelectionBounds): boolean {\n return (\n row >= bounds.startRow &&\n row <= bounds.endRow &&\n col >= bounds.startCol &&\n col <= bounds.endCol\n );\n}\n\n/** How far outside `[lo, hi]` a coordinate sits. 0 when inside. */\nfunction overshoot(value: number, lo: number, hi: number): number {\n if (value < lo) return lo - value;\n if (value > hi) return value - hi;\n return 0;\n}\n\n/**\n * The whole fill gesture, as data.\n *\n * Extending (pointer outside the source):\n * axis = the larger overshoot wins; a tie goes VERTICAL, because a fill\n * drag is overwhelmingly a \"drag down\" and a 1px sideways wobble\n * must not flip it;\n * backwards = the pointer is above / left of the source;\n * bounds = source stretched along `axis` to the pointer, the other axis\n * clamped to the source's own extent.\n *\n * Clearing (pointer inside the source): Excel empties everything past the\n * pointer along the shrink axis. A 1-row source has `shrinkRows === 0` and falls\n * to the horizontal branch on its own \u2014 there is no special case for it.\n */\nexport function computeFillPreview(\n source: SelectionBounds,\n pointer: FillPointer,\n opts: ComputeFillPreviewOptions,\n): FillPreview {\n const mode = opts.modifier ? invertFillMode(opts.defaultMode) : opts.defaultMode;\n\n const dRow = overshoot(pointer.row, source.startRow, source.endRow);\n const dCol = overshoot(pointer.col, source.startCol, source.endCol);\n\n if (dRow > 0 || dCol > 0) {\n const axis: FillAxis = dRow >= dCol ? 'vertical' : 'horizontal';\n const backwards =\n axis === 'vertical' ? pointer.row < source.startRow : pointer.col < source.startCol;\n const bounds: SelectionBounds =\n axis === 'vertical'\n ? {\n startRow: Math.min(source.startRow, pointer.row),\n endRow: Math.max(source.endRow, pointer.row),\n startCol: source.startCol,\n endCol: source.endCol,\n }\n : {\n startRow: source.startRow,\n endRow: source.endRow,\n startCol: Math.min(source.startCol, pointer.col),\n endCol: Math.max(source.endCol, pointer.col),\n };\n return { source, bounds, axis, backwards, clearing: false, cleared: null, mode };\n }\n\n // Pointer is inside the source \u2192 back-drag. Everything BEYOND the pointer\n // along the dominant shrink axis is about to be emptied.\n const shrinkRows = source.endRow - pointer.row;\n const shrinkCols = source.endCol - pointer.col;\n const axis: FillAxis = shrinkRows >= shrinkCols ? 'vertical' : 'horizontal';\n const cleared: SelectionBounds =\n axis === 'vertical'\n ? { ...source, startRow: pointer.row + 1 }\n : { ...source, startCol: pointer.col + 1 };\n const clearing =\n axis === 'vertical' ? cleared.startRow <= cleared.endRow : cleared.startCol <= cleared.endCol;\n\n return {\n source,\n bounds: source,\n axis,\n backwards: false,\n clearing,\n cleared: clearing ? cleared : null,\n mode,\n };\n}\n\n/**\n * The cells a fill will WRITE, grouped into the independent series lines Excel\n * fills them with.\n *\n * Vertical fill: one line per source COLUMN, seeded by that column's rows in\n * row order. Horizontal fill: one line per source ROW, seeded by that row's\n * columns in column order. That is the rule that makes a multi-column drag\n * continue each column's own series instead of smearing one series sideways.\n *\n * Every line's `targets` are ordered ADJACENT-TO-SOURCE FIRST, which is exactly\n * the order `generateFill` returns values in \u2014 so the caller zips the two\n * without ever reversing an array.\n */\nexport interface FillLine {\n /** Cells of the SOURCE block for this line, in fill order. */\n seedCells: Array<{ row: number; col: number }>;\n /** Cells to write, nearest the source first. */\n targets: Array<{ row: number; col: number }>;\n /** The column whose `type` / `source` / `fillSeries` governs this line. */\n seedCol: number;\n}\n\nexport function buildFillLines(preview: FillPreview): FillLine[] {\n const { source, bounds, axis, backwards } = preview;\n const lines: FillLine[] = [];\n\n if (axis === 'vertical') {\n for (let col = source.startCol; col <= source.endCol; col++) {\n const seedCells: Array<{ row: number; col: number }> = [];\n for (let row = source.startRow; row <= source.endRow; row++) seedCells.push({ row, col });\n const targets: Array<{ row: number; col: number }> = [];\n if (backwards) {\n for (let row = source.startRow - 1; row >= bounds.startRow; row--) targets.push({ row, col });\n } else {\n for (let row = source.endRow + 1; row <= bounds.endRow; row++) targets.push({ row, col });\n }\n lines.push({ seedCells, targets, seedCol: col });\n }\n return lines;\n }\n\n for (let row = source.startRow; row <= source.endRow; row++) {\n const seedCells: Array<{ row: number; col: number }> = [];\n for (let col = source.startCol; col <= source.endCol; col++) seedCells.push({ row, col });\n const targets: Array<{ row: number; col: number }> = [];\n if (backwards) {\n for (let col = source.startCol - 1; col >= bounds.startCol; col--) targets.push({ row, col });\n } else {\n for (let col = source.endCol + 1; col <= bounds.endCol; col++) targets.push({ row, col });\n }\n // Horizontal fill crosses columns, so no single column governs the line.\n // The SEED's own column supplies the pattern rules; the TARGET column\n // decides whether the value is acceptable (see coerceCellValue).\n lines.push({ seedCells, targets, seedCol: source.startCol });\n }\n return lines;\n}\n\n/** Every cell of a rectangle, row-major. Shared by the preview repaint and the commit. */\nexport function cellsInRect(bounds: SelectionBounds): Array<{ row: number; col: number }> {\n const cells: Array<{ row: number; col: number }> = [];\n for (let row = bounds.startRow; row <= bounds.endRow; row++) {\n for (let col = bounds.startCol; col <= bounds.endCol; col++) cells.push({ row, col });\n }\n return cells;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["axis"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
function isBlank(value) {
|
|
2
|
+
return value === null || value === void 0 || typeof value === "string" && value.trim() === "";
|
|
3
|
+
}
|
|
4
|
+
function cyclic(values, i) {
|
|
5
|
+
const k = values.length;
|
|
6
|
+
return values[(i % k + k) % k];
|
|
7
|
+
}
|
|
8
|
+
function copyPattern(seed) {
|
|
9
|
+
const values = seed.values.length > 0 ? seed.values : [void 0];
|
|
10
|
+
return { kind: "copy", defaultMode: "copy", at: (i) => cyclic(values, i) };
|
|
11
|
+
}
|
|
12
|
+
function constantDelta(nums, epsilon = 1e-9) {
|
|
13
|
+
if (nums.length < 2) return null;
|
|
14
|
+
const step = nums[1] - nums[0];
|
|
15
|
+
for (let i = 2; i < nums.length; i++) {
|
|
16
|
+
if (Math.abs(nums[i] - nums[i - 1] - step) > epsilon) return null;
|
|
17
|
+
}
|
|
18
|
+
return step;
|
|
19
|
+
}
|
|
20
|
+
function parseNumeric(value) {
|
|
21
|
+
if (typeof value === "number") return Number.isFinite(value) ? value : null;
|
|
22
|
+
if (typeof value !== "string") return null;
|
|
23
|
+
const raw = value.trim();
|
|
24
|
+
if (raw === "") return null;
|
|
25
|
+
if (/^[+-]?0\d/.test(raw)) return null;
|
|
26
|
+
const normalised = raw.replace(/[\s\u00a0\u202f]/g, "").replace(",", ".");
|
|
27
|
+
if (!/^[+-]?(\d+(\.\d*)?|\.\d+)$/.test(normalised)) return null;
|
|
28
|
+
const n = Number(normalised);
|
|
29
|
+
return Number.isFinite(n) ? n : null;
|
|
30
|
+
}
|
|
31
|
+
function decimalsOf(value) {
|
|
32
|
+
const text = typeof value === "number" ? String(value) : String(value ?? "");
|
|
33
|
+
const match = /[.,](\d+)$/.exec(text.trim());
|
|
34
|
+
return match ? match[1].length : 0;
|
|
35
|
+
}
|
|
36
|
+
function roundTo(value, decimals) {
|
|
37
|
+
if (decimals <= 0) return Math.round(value);
|
|
38
|
+
const factor = 10 ** decimals;
|
|
39
|
+
return Math.round(value * factor) / factor;
|
|
40
|
+
}
|
|
41
|
+
const MS_PER_DAY = 864e5;
|
|
42
|
+
function parseYmd(value) {
|
|
43
|
+
if (value instanceof Date) {
|
|
44
|
+
if (Number.isNaN(value.getTime())) return null;
|
|
45
|
+
return { y: value.getFullYear(), m: value.getMonth() + 1, d: value.getDate() };
|
|
46
|
+
}
|
|
47
|
+
if (typeof value !== "string") return null;
|
|
48
|
+
const raw = value.trim();
|
|
49
|
+
if (raw === "") return null;
|
|
50
|
+
const iso = /^(\d{4})-(\d{2})-(\d{2})/.exec(raw);
|
|
51
|
+
if (iso) return { y: Number(iso[1]), m: Number(iso[2]), d: Number(iso[3]) };
|
|
52
|
+
const parsed = new Date(raw);
|
|
53
|
+
if (Number.isNaN(parsed.getTime())) return null;
|
|
54
|
+
return { y: parsed.getFullYear(), m: parsed.getMonth() + 1, d: parsed.getDate() };
|
|
55
|
+
}
|
|
56
|
+
function formatYmd({ y, m, d }) {
|
|
57
|
+
return `${String(y).padStart(4, "0")}-${String(m).padStart(2, "0")}-${String(d).padStart(2, "0")}`;
|
|
58
|
+
}
|
|
59
|
+
function ymdToDays({ y, m, d }) {
|
|
60
|
+
return Math.round(Date.UTC(y, m - 1, d) / MS_PER_DAY);
|
|
61
|
+
}
|
|
62
|
+
function daysToYmd(days) {
|
|
63
|
+
const date = new Date(days * MS_PER_DAY);
|
|
64
|
+
return { y: date.getUTCFullYear(), m: date.getUTCMonth() + 1, d: date.getUTCDate() };
|
|
65
|
+
}
|
|
66
|
+
function dayOfWeek(days) {
|
|
67
|
+
return (days % 7 + 7 + 4) % 7;
|
|
68
|
+
}
|
|
69
|
+
function isWeekday(days) {
|
|
70
|
+
const dow = dayOfWeek(days);
|
|
71
|
+
return dow >= 1 && dow <= 5;
|
|
72
|
+
}
|
|
73
|
+
function weekdayIndex(days) {
|
|
74
|
+
const dow = dayOfWeek(days);
|
|
75
|
+
const week = Math.floor((days + 3) / 7);
|
|
76
|
+
return week * 5 + (dow - 1);
|
|
77
|
+
}
|
|
78
|
+
function weekdayIndexToDays(index) {
|
|
79
|
+
const week = Math.floor(index / 5);
|
|
80
|
+
const rest = (index % 5 + 5) % 5;
|
|
81
|
+
return week * 7 - 3 + rest;
|
|
82
|
+
}
|
|
83
|
+
function monthIndex({ y, m }) {
|
|
84
|
+
return y * 12 + (m - 1);
|
|
85
|
+
}
|
|
86
|
+
function daysInMonth(y, m) {
|
|
87
|
+
return new Date(Date.UTC(y, m, 0)).getUTCDate();
|
|
88
|
+
}
|
|
89
|
+
function fromMonthIndex(index, day) {
|
|
90
|
+
const y = Math.floor(index / 12);
|
|
91
|
+
const m = (index % 12 + 12) % 12 + 1;
|
|
92
|
+
return { y, m, d: Math.min(day, daysInMonth(y, m)) };
|
|
93
|
+
}
|
|
94
|
+
const weekdayStep = (seed) => {
|
|
95
|
+
if (seed.column.type !== "date") return null;
|
|
96
|
+
if (seed.values.length < 2) return null;
|
|
97
|
+
const days = [];
|
|
98
|
+
for (const value of seed.values) {
|
|
99
|
+
const ymd = parseYmd(value);
|
|
100
|
+
if (!ymd) return null;
|
|
101
|
+
const d = ymdToDays(ymd);
|
|
102
|
+
if (!isWeekday(d)) return null;
|
|
103
|
+
days.push(d);
|
|
104
|
+
}
|
|
105
|
+
const indices = days.map(weekdayIndex);
|
|
106
|
+
const step = constantDelta(indices);
|
|
107
|
+
if (step === null || Math.abs(step) !== 1) return null;
|
|
108
|
+
const base = indices[0];
|
|
109
|
+
return {
|
|
110
|
+
kind: "weekday",
|
|
111
|
+
defaultMode: "series",
|
|
112
|
+
at: (i) => formatYmd(daysToYmd(weekdayIndexToDays(base + step * i)))
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
const dateStep = (seed) => {
|
|
116
|
+
if (seed.column.type !== "date") return null;
|
|
117
|
+
const parsed = [];
|
|
118
|
+
for (const value of seed.values) {
|
|
119
|
+
const ymd = parseYmd(value);
|
|
120
|
+
if (!ymd) return null;
|
|
121
|
+
parsed.push(ymd);
|
|
122
|
+
}
|
|
123
|
+
if (parsed.length === 0) return null;
|
|
124
|
+
if (parsed.length === 1) {
|
|
125
|
+
const base = ymdToDays(parsed[0]);
|
|
126
|
+
return { kind: "date", defaultMode: "series", at: (i) => formatYmd(daysToYmd(base + i)) };
|
|
127
|
+
}
|
|
128
|
+
const sameDayOfMonth = parsed.every((p) => p.d === parsed[0].d);
|
|
129
|
+
if (sameDayOfMonth) {
|
|
130
|
+
const months = parsed.map(monthIndex);
|
|
131
|
+
const monthStep = constantDelta(months);
|
|
132
|
+
if (monthStep !== null && monthStep !== 0) {
|
|
133
|
+
const base = months[0];
|
|
134
|
+
const day = parsed[0].d;
|
|
135
|
+
return {
|
|
136
|
+
kind: "date",
|
|
137
|
+
defaultMode: "series",
|
|
138
|
+
at: (i) => formatYmd(fromMonthIndex(base + monthStep * i, day))
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const days = parsed.map(ymdToDays);
|
|
143
|
+
const dayStep = constantDelta(days);
|
|
144
|
+
if (dayStep !== null && dayStep !== 0) {
|
|
145
|
+
const base = days[0];
|
|
146
|
+
return { kind: "date", defaultMode: "series", at: (i) => formatYmd(daysToYmd(base + dayStep * i)) };
|
|
147
|
+
}
|
|
148
|
+
return null;
|
|
149
|
+
};
|
|
150
|
+
const numericStep = (seed) => {
|
|
151
|
+
const nums = [];
|
|
152
|
+
for (const value of seed.values) {
|
|
153
|
+
const n = parseNumeric(value);
|
|
154
|
+
if (n === null) return null;
|
|
155
|
+
nums.push(n);
|
|
156
|
+
}
|
|
157
|
+
if (nums.length === 0) return null;
|
|
158
|
+
const decimals = seed.values.reduce((max, v) => Math.max(max, decimalsOf(v)), 0);
|
|
159
|
+
if (nums.length === 1) {
|
|
160
|
+
const base2 = nums[0];
|
|
161
|
+
return { kind: "numeric", defaultMode: "copy", at: (i) => roundTo(base2 + i, decimals) };
|
|
162
|
+
}
|
|
163
|
+
const step = constantDelta(nums, 10 ** -(decimals + 6));
|
|
164
|
+
if (step === null) return null;
|
|
165
|
+
const base = nums[0];
|
|
166
|
+
return { kind: "numeric", defaultMode: "series", at: (i) => roundTo(base + step * i, decimals) };
|
|
167
|
+
};
|
|
168
|
+
const SUFFIX_RE = /^(.*?)(\d+)(\D*)$/;
|
|
169
|
+
const suffixStep = (seed) => {
|
|
170
|
+
let prefix = null;
|
|
171
|
+
let tail = null;
|
|
172
|
+
let width = 0;
|
|
173
|
+
const nums = [];
|
|
174
|
+
for (const value of seed.values) {
|
|
175
|
+
if (typeof value !== "string") return null;
|
|
176
|
+
const match = SUFFIX_RE.exec(value);
|
|
177
|
+
if (!match) return null;
|
|
178
|
+
const [, p, digits, t] = match;
|
|
179
|
+
if (prefix === null) {
|
|
180
|
+
prefix = p;
|
|
181
|
+
tail = t;
|
|
182
|
+
width = digits.length;
|
|
183
|
+
} else if (p !== prefix || t !== tail) {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
nums.push(Number(digits));
|
|
187
|
+
}
|
|
188
|
+
if (prefix === null || nums.length === 0) return null;
|
|
189
|
+
const step = nums.length === 1 ? 1 : constantDelta(nums);
|
|
190
|
+
if (step === null) return null;
|
|
191
|
+
const base = nums[0];
|
|
192
|
+
const head = prefix;
|
|
193
|
+
const foot = tail ?? "";
|
|
194
|
+
return {
|
|
195
|
+
kind: "suffix",
|
|
196
|
+
defaultMode: "series",
|
|
197
|
+
at: (i) => {
|
|
198
|
+
const n = base + step * i;
|
|
199
|
+
const sign = n < 0 ? "-" : "";
|
|
200
|
+
return `${head}${sign}${String(Math.abs(n)).padStart(width, "0")}${foot}`;
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
};
|
|
204
|
+
const fillDetectors = [weekdayStep, dateStep, numericStep, suffixStep];
|
|
205
|
+
function detectFillPattern(seed) {
|
|
206
|
+
const column = seed.column;
|
|
207
|
+
if (column.fillSeries === "copy") return copyPattern(seed);
|
|
208
|
+
if (column.type === "dropdown" || column.type === "multiselect" || column.type === "boolean") {
|
|
209
|
+
return copyPattern(seed);
|
|
210
|
+
}
|
|
211
|
+
if (seed.values.length === 0 || seed.values.every(isBlank)) return copyPattern(seed);
|
|
212
|
+
for (const detect of fillDetectors) {
|
|
213
|
+
const pattern = detect(seed);
|
|
214
|
+
if (pattern) return pattern;
|
|
215
|
+
}
|
|
216
|
+
return copyPattern(seed);
|
|
217
|
+
}
|
|
218
|
+
function invertFillMode(mode) {
|
|
219
|
+
return mode === "series" ? "copy" : "series";
|
|
220
|
+
}
|
|
221
|
+
function generateFill(seed, count, direction, mode) {
|
|
222
|
+
if (count <= 0) return [];
|
|
223
|
+
const pattern = mode === "copy" ? copyPattern(seed) : detectFillPattern(seed);
|
|
224
|
+
const k = Math.max(seed.values.length, 1);
|
|
225
|
+
const out = [];
|
|
226
|
+
for (let n = 0; n < count; n++) {
|
|
227
|
+
out.push(pattern.at(direction === 1 ? k + n : -1 - n));
|
|
228
|
+
}
|
|
229
|
+
return out;
|
|
230
|
+
}
|
|
231
|
+
export {
|
|
232
|
+
dateStep,
|
|
233
|
+
detectFillPattern,
|
|
234
|
+
fillDetectors,
|
|
235
|
+
generateFill,
|
|
236
|
+
invertFillMode,
|
|
237
|
+
numericStep,
|
|
238
|
+
suffixStep,
|
|
239
|
+
weekdayStep
|
|
240
|
+
};
|
|
241
|
+
//# sourceMappingURL=fillPatterns.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/backend/dynamic-table/utils/fillPatterns.ts"],
|
|
4
|
+
"sourcesContent": ["// utils/fillPatterns.ts\n//\n// Fill-series pattern detection and extrapolation. PURE: no store, no React,\n// no DOM. Where Excel has an established behaviour, that behaviour is the\n// specification \u2014 nothing here is invented UX.\n//\n// The chain is ordered and `copy` is terminal, so today's shipped behaviour\n// (drag a value down, get that value repeated) is the floor: a seed that\n// matches no series still fills, it just fills by copying.\n//\n// 1. weekdayStep Mon-Fri dates whose delta is a whole number of WEEKDAYS\n// 2. dateStep day / month / year steps on a `type: 'date'` column\n// 3. numericStep finite numbers with an exact constant delta\n// 4. suffixStep `REF-001` -> `REF-002`, zero-padding preserved\n// 5. copy cyclic tiling of the seed \u2014 always matches\n//\n// `at(i)` takes a SIGNED index: `at(0)..at(k-1)` reproduce the seed, `at(k)`\n// and up extend forwards, `at(-1)` and down extend backwards. That single\n// signed accessor is why up/left fill needs no separate code path.\n\nimport type { ColumnDef } from '../types/index';\n\n// ============================================\n// TYPES\n// ============================================\n// These belong in `types/index.ts` alongside `FillPreview` once Wave 3 rewrites\n// it; they live here so this module ships without touching the shared type file.\n\n/** Continue the series, or tile the seed. `Ctrl`/`Alt` inverts the default. */\nexport type FillMode = 'series' | 'copy';\n\n/** One line of the fill source: a source column (vertical) or row (horizontal). */\nexport interface FillSeed {\n /** Seed values in fill order: top-to-bottom vertically, left-to-right horizontally. */\n values: unknown[];\n /** The column the seed came from \u2014 supplies `type`, `source` and `fillSeries`. */\n column: ColumnDef;\n}\n\nexport interface FillPattern {\n kind: 'numeric' | 'date' | 'weekday' | 'suffix' | 'copy';\n /** Mode used when no modifier is held. Excel differs per pattern. */\n defaultMode: FillMode;\n /** Value at signed seed index `i`. */\n at(i: number): unknown;\n}\n\nexport type FillDetector = (seed: FillSeed) => FillPattern | null;\n\n// ============================================\n// SHARED HELPERS\n// ============================================\n\nfunction isBlank(value: unknown): boolean {\n return value === null || value === undefined || (typeof value === 'string' && value.trim() === '');\n}\n\n/** Cyclic tiling, correct for negative indices: `at(-1)` is the LAST seed value. */\nfunction cyclic<T>(values: readonly T[], i: number): T {\n const k = values.length;\n return values[((i % k) + k) % k];\n}\n\nfunction copyPattern(seed: FillSeed): FillPattern {\n const values = seed.values.length > 0 ? seed.values : [undefined];\n return { kind: 'copy', defaultMode: 'copy', at: (i) => cyclic(values, i) };\n}\n\n/** Every delta between consecutive entries is the same value. */\nfunction constantDelta(nums: number[], epsilon = 1e-9): number | null {\n if (nums.length < 2) return null;\n const step = nums[1] - nums[0];\n for (let i = 2; i < nums.length; i++) {\n if (Math.abs(nums[i] - nums[i - 1] - step) > epsilon) return null;\n }\n return step;\n}\n\n// --- numbers -------------------------------------------------------------\n\n/**\n * Parse a stored cell value as a number. Accepts the `pl` decimal comma and\n * space/NBSP thousands separators, because that is what a Polish Excel puts in\n * a cell. Rejects zero-padded digit strings (`007`) \u2014 those are identifiers and\n * belong to `suffixStep`, which preserves the padding.\n */\nfunction parseNumeric(value: unknown): number | null {\n if (typeof value === 'number') return Number.isFinite(value) ? value : null;\n if (typeof value !== 'string') return null;\n const raw = value.trim();\n if (raw === '') return null;\n if (/^[+-]?0\\d/.test(raw)) return null;\n const normalised = raw.replace(/[\\s\\u00a0\\u202f]/g, '').replace(',', '.');\n if (!/^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)$/.test(normalised)) return null;\n const n = Number(normalised);\n return Number.isFinite(n) ? n : null;\n}\n\nfunction decimalsOf(value: unknown): number {\n const text = typeof value === 'number' ? String(value) : String(value ?? '');\n const match = /[.,](\\d+)$/.exec(text.trim());\n return match ? match[1].length : 0;\n}\n\nfunction roundTo(value: number, decimals: number): number {\n if (decimals <= 0) return Math.round(value);\n const factor = 10 ** decimals;\n return Math.round(value * factor) / factor;\n}\n\n// --- dates ---------------------------------------------------------------\n\nconst MS_PER_DAY = 86_400_000;\n\ninterface Ymd {\n y: number;\n m: number;\n d: number;\n}\n\n/**\n * Parse a date cell. `YYYY-MM-DD` (what the grid stores) and `Date` instances\n * only, plus a last-resort `Date` parse \u2014 deliberately narrow, because the\n * caller must never date-parse a column that is not `type: 'date'`.\n */\nfunction parseYmd(value: unknown): Ymd | null {\n if (value instanceof Date) {\n if (Number.isNaN(value.getTime())) return null;\n return { y: value.getFullYear(), m: value.getMonth() + 1, d: value.getDate() };\n }\n if (typeof value !== 'string') return null;\n const raw = value.trim();\n if (raw === '') return null;\n const iso = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(raw);\n if (iso) return { y: Number(iso[1]), m: Number(iso[2]), d: Number(iso[3]) };\n const parsed = new Date(raw);\n if (Number.isNaN(parsed.getTime())) return null;\n return { y: parsed.getFullYear(), m: parsed.getMonth() + 1, d: parsed.getDate() };\n}\n\nfunction formatYmd({ y, m, d }: Ymd): string {\n return `${String(y).padStart(4, '0')}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')}`;\n}\n\n/** Days since 1970-01-01, computed in UTC so no timezone can shift a date. */\nfunction ymdToDays({ y, m, d }: Ymd): number {\n return Math.round(Date.UTC(y, m - 1, d) / MS_PER_DAY);\n}\n\nfunction daysToYmd(days: number): Ymd {\n const date = new Date(days * MS_PER_DAY);\n return { y: date.getUTCFullYear(), m: date.getUTCMonth() + 1, d: date.getUTCDate() };\n}\n\n/** 0 = Sunday \u2026 6 = Saturday. 1970-01-01 (day 0) was a Thursday. */\nfunction dayOfWeek(days: number): number {\n return ((days % 7) + 7 + 4) % 7;\n}\n\nfunction isWeekday(days: number): boolean {\n const dow = dayOfWeek(days);\n return dow >= 1 && dow <= 5;\n}\n\n/**\n * Monotonic index over Mon-Fri days only: consecutive weekdays differ by 1, so\n * Friday -> Monday is +1 and the \"skip the weekend\" rule needs no special case.\n */\nfunction weekdayIndex(days: number): number {\n const dow = dayOfWeek(days);\n const week = Math.floor((days + 3) / 7);\n return week * 5 + (dow - 1);\n}\n\nfunction weekdayIndexToDays(index: number): number {\n const week = Math.floor(index / 5);\n const rest = ((index % 5) + 5) % 5;\n return week * 7 - 3 + rest;\n}\n\nfunction monthIndex({ y, m }: Ymd): number {\n return y * 12 + (m - 1);\n}\n\nfunction daysInMonth(y: number, m: number): number {\n return new Date(Date.UTC(y, m, 0)).getUTCDate();\n}\n\nfunction fromMonthIndex(index: number, day: number): Ymd {\n const y = Math.floor(index / 12);\n const m = (((index % 12) + 12) % 12) + 1;\n // Excel clamps: 31 Jan + 1 month = 28/29 Feb.\n return { y, m, d: Math.min(day, daysInMonth(y, m)) };\n}\n\n// ============================================\n// DETECTORS\n// ============================================\n\n/**\n * 1. Weekday step. Runs BEFORE `dateStep`: `Fri, Mon, Tue` has day deltas\n * 3,1 and would die there, while as weekdays it is an unambiguous +1. A\n * Fri->Mon seed admits no other reading, so inferring it is not inventing UX.\n *\n * CONSECUTIVE WEEKDAYS ONLY (`|step| === 1`). \"Both seeds happen to fall on a\n * weekday\" is NOT the signal \u2014 that reading hijacked every wide date step whose\n * endpoints missed the weekend: `01.02.2027` + `11.02.2027` are ten CALENDAR\n * days apart but eight WEEKDAYS apart, and the series came out 23.02, 05.03,\n * 17.03 where Excel gives 21.02, 03.03, 13.03 (ledger row 1.16). A step of one\n * weekday is the only delta a user cannot have meant as anything else; every\n * other delta belongs to `dateStep`, which reads it as plain days.\n */\nexport const weekdayStep: FillDetector = (seed) => {\n if (seed.column.type !== 'date') return null;\n if (seed.values.length < 2) return null;\n const days: number[] = [];\n for (const value of seed.values) {\n const ymd = parseYmd(value);\n if (!ymd) return null;\n const d = ymdToDays(ymd);\n if (!isWeekday(d)) return null;\n days.push(d);\n }\n const indices = days.map(weekdayIndex);\n const step = constantDelta(indices);\n if (step === null || Math.abs(step) !== 1) return null;\n const base = indices[0];\n return {\n kind: 'weekday',\n defaultMode: 'series',\n at: (i) => formatYmd(daysToYmd(weekdayIndexToDays(base + step * i))),\n };\n};\n\n/**\n * 2. Date step \u2014 Excel's own ladder: constant day delta, else a whole-month\n * step on the same day-of-month (which covers whole years as a x12 month\n * step), else no match. A single date seeds +1 day.\n */\nexport const dateStep: FillDetector = (seed) => {\n if (seed.column.type !== 'date') return null;\n const parsed: Ymd[] = [];\n for (const value of seed.values) {\n const ymd = parseYmd(value);\n if (!ymd) return null;\n parsed.push(ymd);\n }\n if (parsed.length === 0) return null;\n\n if (parsed.length === 1) {\n const base = ymdToDays(parsed[0]);\n return { kind: 'date', defaultMode: 'series', at: (i) => formatYmd(daysToYmd(base + i)) };\n }\n\n // Month step is tested FIRST. Two dates always have a constant day delta, so\n // testing days first would read 31 Dec -> 31 Jan as \"every 31 days\" and land\n // on 3 March. Sharing a day-of-month is the unambiguous signal that the user\n // meant months \u2014 Excel reads it the same way.\n const sameDayOfMonth = parsed.every((p) => p.d === parsed[0].d);\n if (sameDayOfMonth) {\n const months = parsed.map(monthIndex);\n const monthStep = constantDelta(months);\n if (monthStep !== null && monthStep !== 0) {\n const base = months[0];\n const day = parsed[0].d;\n return {\n kind: 'date',\n defaultMode: 'series',\n at: (i) => formatYmd(fromMonthIndex(base + monthStep * i, day)),\n };\n }\n }\n\n const days = parsed.map(ymdToDays);\n const dayStep = constantDelta(days);\n if (dayStep !== null && dayStep !== 0) {\n const base = days[0];\n return { kind: 'date', defaultMode: 'series', at: (i) => formatYmd(daysToYmd(base + dayStep * i)) };\n }\n\n return null;\n};\n\n/**\n * 3. Numeric step. A single number DEFAULTS TO COPY \u2014 Excel's asymmetry with\n * dates, kept \u2014 and `Ctrl` turns it into +1. Two or more require an EXACT\n * constant delta: `1, 2, 4` falls through to copy rather than regressing to\n * 5.5, because a freight user reads a regression result as a bug.\n */\nexport const numericStep: FillDetector = (seed) => {\n const nums: number[] = [];\n for (const value of seed.values) {\n const n = parseNumeric(value);\n if (n === null) return null;\n nums.push(n);\n }\n if (nums.length === 0) return null;\n\n const decimals = seed.values.reduce<number>((max, v) => Math.max(max, decimalsOf(v)), 0);\n\n if (nums.length === 1) {\n const base = nums[0];\n return { kind: 'numeric', defaultMode: 'copy', at: (i) => roundTo(base + i, decimals) };\n }\n\n const step = constantDelta(nums, 10 ** -(decimals + 6));\n if (step === null) return null;\n const base = nums[0];\n return { kind: 'numeric', defaultMode: 'series', at: (i) => roundTo(base + step * i, decimals) };\n};\n\nconst SUFFIX_RE = /^(.*?)(\\d+)(\\D*)$/;\n\n/**\n * 4. Text with a trailing number: `REF-001` -> `REF-002`. Prefix and trailing\n * part must be identical across the seed. Zero-padding comes from the first\n * seed value and widens on overflow (`REF-999` -> `REF-1000`).\n */\nexport const suffixStep: FillDetector = (seed) => {\n let prefix: string | null = null;\n let tail: string | null = null;\n let width = 0;\n const nums: number[] = [];\n\n for (const value of seed.values) {\n if (typeof value !== 'string') return null;\n const match = SUFFIX_RE.exec(value);\n if (!match) return null;\n const [, p, digits, t] = match;\n if (prefix === null) {\n prefix = p;\n tail = t;\n width = digits.length;\n } else if (p !== prefix || t !== tail) {\n return null;\n }\n nums.push(Number(digits));\n }\n if (prefix === null || nums.length === 0) return null;\n\n const step = nums.length === 1 ? 1 : constantDelta(nums);\n if (step === null) return null;\n const base = nums[0];\n const head = prefix;\n const foot = tail ?? '';\n return {\n kind: 'suffix',\n defaultMode: 'series',\n at: (i) => {\n const n = base + step * i;\n const sign = n < 0 ? '-' : '';\n return `${head}${sign}${String(Math.abs(n)).padStart(width, '0')}${foot}`;\n },\n };\n};\n\n/** The ordered chain. First match wins; `copy` is applied after it. */\nexport const fillDetectors: readonly FillDetector[] = [weekdayStep, dateStep, numericStep, suffixStep];\n\n// ============================================\n// ENTRY POINTS\n// ============================================\n\n/**\n * Never returns null \u2014 `copy` is terminal, so an unrecognised seed still fills.\n *\n * Hard gates, before the chain runs:\n * - `column.fillSeries === 'copy'` \u2014 a per-column opt-out for identity fields;\n * - `dropdown` / `multiselect` / `boolean` \u2014 a `source` array is a presentation\n * order, not a semantic sequence; cycling Draft -> Sent -> Paid -> Draft is\n * not something a dispatcher asked for;\n * - an all-blank seed has nothing to continue.\n */\nexport function detectFillPattern(seed: FillSeed): FillPattern {\n const column = seed.column;\n if (column.fillSeries === 'copy') return copyPattern(seed);\n if (column.type === 'dropdown' || column.type === 'multiselect' || column.type === 'boolean') {\n return copyPattern(seed);\n }\n if (seed.values.length === 0 || seed.values.every(isBlank)) return copyPattern(seed);\n\n for (const detect of fillDetectors) {\n const pattern = detect(seed);\n if (pattern) return pattern;\n }\n return copyPattern(seed);\n}\n\n/** `Ctrl`/`Alt` inverts copy <-> series. Applied by the CALLER, not a detector. */\nexport function invertFillMode(mode: FillMode): FillMode {\n return mode === 'series' ? 'copy' : 'series';\n}\n\n/**\n * Values for `count` cells beyond one seed line.\n *\n * `direction: 1` extends past the END of the seed (down / right);\n * `direction: -1` extends past its START (up / left).\n *\n * **Ordering**: the returned values are always ADJACENT-TO-SOURCE FIRST. For a\n * backwards fill, `result[0]` belongs in the cell immediately above/left of the\n * source and `result[n-1]` in the furthest one. The caller walks its target\n * cells outwards from the source in both directions, so it never has to reverse\n * this array.\n */\nexport function generateFill(\n seed: FillSeed,\n count: number,\n direction: 1 | -1,\n mode: FillMode,\n): unknown[] {\n if (count <= 0) return [];\n const pattern = mode === 'copy' ? copyPattern(seed) : detectFillPattern(seed);\n const k = Math.max(seed.values.length, 1);\n const out: unknown[] = [];\n for (let n = 0; n < count; n++) {\n // Forwards continues at k, k+1, \u2026; backwards at -1, -2, \u2026 \u2014 both walking\n // away from the source one step at a time.\n out.push(pattern.at(direction === 1 ? k + n : -1 - n));\n }\n return out;\n}\n"],
|
|
5
|
+
"mappings": "AAqDA,SAAS,QAAQ,OAAyB;AACxC,SAAO,UAAU,QAAQ,UAAU,UAAc,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM;AACjG;AAGA,SAAS,OAAU,QAAsB,GAAc;AACrD,QAAM,IAAI,OAAO;AACjB,SAAO,QAAS,IAAI,IAAK,KAAK,CAAC;AACjC;AAEA,SAAS,YAAY,MAA6B;AAChD,QAAM,SAAS,KAAK,OAAO,SAAS,IAAI,KAAK,SAAS,CAAC,MAAS;AAChE,SAAO,EAAE,MAAM,QAAQ,aAAa,QAAQ,IAAI,CAAC,MAAM,OAAO,QAAQ,CAAC,EAAE;AAC3E;AAGA,SAAS,cAAc,MAAgB,UAAU,MAAqB;AACpE,MAAI,KAAK,SAAS,EAAG,QAAO;AAC5B,QAAM,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC;AAC7B,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,QAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,QAAS,QAAO;AAAA,EAC/D;AACA,SAAO;AACT;AAUA,SAAS,aAAa,OAA+B;AACnD,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AACvE,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,MAAM,MAAM,KAAK;AACvB,MAAI,QAAQ,GAAI,QAAO;AACvB,MAAI,YAAY,KAAK,GAAG,EAAG,QAAO;AAClC,QAAM,aAAa,IAAI,QAAQ,qBAAqB,EAAE,EAAE,QAAQ,KAAK,GAAG;AACxE,MAAI,CAAC,6BAA6B,KAAK,UAAU,EAAG,QAAO;AAC3D,QAAM,IAAI,OAAO,UAAU;AAC3B,SAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAClC;AAEA,SAAS,WAAW,OAAwB;AAC1C,QAAM,OAAO,OAAO,UAAU,WAAW,OAAO,KAAK,IAAI,OAAO,SAAS,EAAE;AAC3E,QAAM,QAAQ,aAAa,KAAK,KAAK,KAAK,CAAC;AAC3C,SAAO,QAAQ,MAAM,CAAC,EAAE,SAAS;AACnC;AAEA,SAAS,QAAQ,OAAe,UAA0B;AACxD,MAAI,YAAY,EAAG,QAAO,KAAK,MAAM,KAAK;AAC1C,QAAM,SAAS,MAAM;AACrB,SAAO,KAAK,MAAM,QAAQ,MAAM,IAAI;AACtC;AAIA,MAAM,aAAa;AAanB,SAAS,SAAS,OAA4B;AAC5C,MAAI,iBAAiB,MAAM;AACzB,QAAI,OAAO,MAAM,MAAM,QAAQ,CAAC,EAAG,QAAO;AAC1C,WAAO,EAAE,GAAG,MAAM,YAAY,GAAG,GAAG,MAAM,SAAS,IAAI,GAAG,GAAG,MAAM,QAAQ,EAAE;AAAA,EAC/E;AACA,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,MAAM,MAAM,KAAK;AACvB,MAAI,QAAQ,GAAI,QAAO;AACvB,QAAM,MAAM,2BAA2B,KAAK,GAAG;AAC/C,MAAI,IAAK,QAAO,EAAE,GAAG,OAAO,IAAI,CAAC,CAAC,GAAG,GAAG,OAAO,IAAI,CAAC,CAAC,GAAG,GAAG,OAAO,IAAI,CAAC,CAAC,EAAE;AAC1E,QAAM,SAAS,IAAI,KAAK,GAAG;AAC3B,MAAI,OAAO,MAAM,OAAO,QAAQ,CAAC,EAAG,QAAO;AAC3C,SAAO,EAAE,GAAG,OAAO,YAAY,GAAG,GAAG,OAAO,SAAS,IAAI,GAAG,GAAG,OAAO,QAAQ,EAAE;AAClF;AAEA,SAAS,UAAU,EAAE,GAAG,GAAG,EAAE,GAAgB;AAC3C,SAAO,GAAG,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAClG;AAGA,SAAS,UAAU,EAAE,GAAG,GAAG,EAAE,GAAgB;AAC3C,SAAO,KAAK,MAAM,KAAK,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,UAAU;AACtD;AAEA,SAAS,UAAU,MAAmB;AACpC,QAAM,OAAO,IAAI,KAAK,OAAO,UAAU;AACvC,SAAO,EAAE,GAAG,KAAK,eAAe,GAAG,GAAG,KAAK,YAAY,IAAI,GAAG,GAAG,KAAK,WAAW,EAAE;AACrF;AAGA,SAAS,UAAU,MAAsB;AACvC,UAAS,OAAO,IAAK,IAAI,KAAK;AAChC;AAEA,SAAS,UAAU,MAAuB;AACxC,QAAM,MAAM,UAAU,IAAI;AAC1B,SAAO,OAAO,KAAK,OAAO;AAC5B;AAMA,SAAS,aAAa,MAAsB;AAC1C,QAAM,MAAM,UAAU,IAAI;AAC1B,QAAM,OAAO,KAAK,OAAO,OAAO,KAAK,CAAC;AACtC,SAAO,OAAO,KAAK,MAAM;AAC3B;AAEA,SAAS,mBAAmB,OAAuB;AACjD,QAAM,OAAO,KAAK,MAAM,QAAQ,CAAC;AACjC,QAAM,QAAS,QAAQ,IAAK,KAAK;AACjC,SAAO,OAAO,IAAI,IAAI;AACxB;AAEA,SAAS,WAAW,EAAE,GAAG,EAAE,GAAgB;AACzC,SAAO,IAAI,MAAM,IAAI;AACvB;AAEA,SAAS,YAAY,GAAW,GAAmB;AACjD,SAAO,IAAI,KAAK,KAAK,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,WAAW;AAChD;AAEA,SAAS,eAAe,OAAe,KAAkB;AACvD,QAAM,IAAI,KAAK,MAAM,QAAQ,EAAE;AAC/B,QAAM,KAAO,QAAQ,KAAM,MAAM,KAAM;AAEvC,SAAO,EAAE,GAAG,GAAG,GAAG,KAAK,IAAI,KAAK,YAAY,GAAG,CAAC,CAAC,EAAE;AACrD;AAmBO,MAAM,cAA4B,CAAC,SAAS;AACjD,MAAI,KAAK,OAAO,SAAS,OAAQ,QAAO;AACxC,MAAI,KAAK,OAAO,SAAS,EAAG,QAAO;AACnC,QAAM,OAAiB,CAAC;AACxB,aAAW,SAAS,KAAK,QAAQ;AAC/B,UAAM,MAAM,SAAS,KAAK;AAC1B,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,IAAI,UAAU,GAAG;AACvB,QAAI,CAAC,UAAU,CAAC,EAAG,QAAO;AAC1B,SAAK,KAAK,CAAC;AAAA,EACb;AACA,QAAM,UAAU,KAAK,IAAI,YAAY;AACrC,QAAM,OAAO,cAAc,OAAO;AAClC,MAAI,SAAS,QAAQ,KAAK,IAAI,IAAI,MAAM,EAAG,QAAO;AAClD,QAAM,OAAO,QAAQ,CAAC;AACtB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,IACb,IAAI,CAAC,MAAM,UAAU,UAAU,mBAAmB,OAAO,OAAO,CAAC,CAAC,CAAC;AAAA,EACrE;AACF;AAOO,MAAM,WAAyB,CAAC,SAAS;AAC9C,MAAI,KAAK,OAAO,SAAS,OAAQ,QAAO;AACxC,QAAM,SAAgB,CAAC;AACvB,aAAW,SAAS,KAAK,QAAQ;AAC/B,UAAM,MAAM,SAAS,KAAK;AAC1B,QAAI,CAAC,IAAK,QAAO;AACjB,WAAO,KAAK,GAAG;AAAA,EACjB;AACA,MAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,OAAO,UAAU,OAAO,CAAC,CAAC;AAChC,WAAO,EAAE,MAAM,QAAQ,aAAa,UAAU,IAAI,CAAC,MAAM,UAAU,UAAU,OAAO,CAAC,CAAC,EAAE;AAAA,EAC1F;AAMA,QAAM,iBAAiB,OAAO,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,EAAE,CAAC;AAC9D,MAAI,gBAAgB;AAClB,UAAM,SAAS,OAAO,IAAI,UAAU;AACpC,UAAM,YAAY,cAAc,MAAM;AACtC,QAAI,cAAc,QAAQ,cAAc,GAAG;AACzC,YAAM,OAAO,OAAO,CAAC;AACrB,YAAM,MAAM,OAAO,CAAC,EAAE;AACtB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,QACb,IAAI,CAAC,MAAM,UAAU,eAAe,OAAO,YAAY,GAAG,GAAG,CAAC;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,OAAO,IAAI,SAAS;AACjC,QAAM,UAAU,cAAc,IAAI;AAClC,MAAI,YAAY,QAAQ,YAAY,GAAG;AACrC,UAAM,OAAO,KAAK,CAAC;AACnB,WAAO,EAAE,MAAM,QAAQ,aAAa,UAAU,IAAI,CAAC,MAAM,UAAU,UAAU,OAAO,UAAU,CAAC,CAAC,EAAE;AAAA,EACpG;AAEA,SAAO;AACT;AAQO,MAAM,cAA4B,CAAC,SAAS;AACjD,QAAM,OAAiB,CAAC;AACxB,aAAW,SAAS,KAAK,QAAQ;AAC/B,UAAM,IAAI,aAAa,KAAK;AAC5B,QAAI,MAAM,KAAM,QAAO;AACvB,SAAK,KAAK,CAAC;AAAA,EACb;AACA,MAAI,KAAK,WAAW,EAAG,QAAO;AAE9B,QAAM,WAAW,KAAK,OAAO,OAAe,CAAC,KAAK,MAAM,KAAK,IAAI,KAAK,WAAW,CAAC,CAAC,GAAG,CAAC;AAEvF,MAAI,KAAK,WAAW,GAAG;AACrB,UAAMA,QAAO,KAAK,CAAC;AACnB,WAAO,EAAE,MAAM,WAAW,aAAa,QAAQ,IAAI,CAAC,MAAM,QAAQA,QAAO,GAAG,QAAQ,EAAE;AAAA,EACxF;AAEA,QAAM,OAAO,cAAc,MAAM,MAAM,EAAE,WAAW,EAAE;AACtD,MAAI,SAAS,KAAM,QAAO;AAC1B,QAAM,OAAO,KAAK,CAAC;AACnB,SAAO,EAAE,MAAM,WAAW,aAAa,UAAU,IAAI,CAAC,MAAM,QAAQ,OAAO,OAAO,GAAG,QAAQ,EAAE;AACjG;AAEA,MAAM,YAAY;AAOX,MAAM,aAA2B,CAAC,SAAS;AAChD,MAAI,SAAwB;AAC5B,MAAI,OAAsB;AAC1B,MAAI,QAAQ;AACZ,QAAM,OAAiB,CAAC;AAExB,aAAW,SAAS,KAAK,QAAQ;AAC/B,QAAI,OAAO,UAAU,SAAU,QAAO;AACtC,UAAM,QAAQ,UAAU,KAAK,KAAK;AAClC,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,CAAC,EAAE,GAAG,QAAQ,CAAC,IAAI;AACzB,QAAI,WAAW,MAAM;AACnB,eAAS;AACT,aAAO;AACP,cAAQ,OAAO;AAAA,IACjB,WAAW,MAAM,UAAU,MAAM,MAAM;AACrC,aAAO;AAAA,IACT;AACA,SAAK,KAAK,OAAO,MAAM,CAAC;AAAA,EAC1B;AACA,MAAI,WAAW,QAAQ,KAAK,WAAW,EAAG,QAAO;AAEjD,QAAM,OAAO,KAAK,WAAW,IAAI,IAAI,cAAc,IAAI;AACvD,MAAI,SAAS,KAAM,QAAO;AAC1B,QAAM,OAAO,KAAK,CAAC;AACnB,QAAM,OAAO;AACb,QAAM,OAAO,QAAQ;AACrB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,IACb,IAAI,CAAC,MAAM;AACT,YAAM,IAAI,OAAO,OAAO;AACxB,YAAM,OAAO,IAAI,IAAI,MAAM;AAC3B,aAAO,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,EAAE,SAAS,OAAO,GAAG,CAAC,GAAG,IAAI;AAAA,IACzE;AAAA,EACF;AACF;AAGO,MAAM,gBAAyC,CAAC,aAAa,UAAU,aAAa,UAAU;AAgB9F,SAAS,kBAAkB,MAA6B;AAC7D,QAAM,SAAS,KAAK;AACpB,MAAI,OAAO,eAAe,OAAQ,QAAO,YAAY,IAAI;AACzD,MAAI,OAAO,SAAS,cAAc,OAAO,SAAS,iBAAiB,OAAO,SAAS,WAAW;AAC5F,WAAO,YAAY,IAAI;AAAA,EACzB;AACA,MAAI,KAAK,OAAO,WAAW,KAAK,KAAK,OAAO,MAAM,OAAO,EAAG,QAAO,YAAY,IAAI;AAEnF,aAAW,UAAU,eAAe;AAClC,UAAM,UAAU,OAAO,IAAI;AAC3B,QAAI,QAAS,QAAO;AAAA,EACtB;AACA,SAAO,YAAY,IAAI;AACzB;AAGO,SAAS,eAAe,MAA0B;AACvD,SAAO,SAAS,WAAW,SAAS;AACtC;AAcO,SAAS,aACd,MACA,OACA,WACA,MACW;AACX,MAAI,SAAS,EAAG,QAAO,CAAC;AACxB,QAAM,UAAU,SAAS,SAAS,YAAY,IAAI,IAAI,kBAAkB,IAAI;AAC5E,QAAM,IAAI,KAAK,IAAI,KAAK,OAAO,QAAQ,CAAC;AACxC,QAAM,MAAiB,CAAC;AACxB,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAG9B,QAAI,KAAK,QAAQ,GAAG,cAAc,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC;AAAA,EACvD;AACA,SAAO;AACT;",
|
|
6
|
+
"names": ["base"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
const AGGREGATE_EMPTY_PLACEHOLDER = "\u2014";
|
|
3
|
+
const AGGREGATE_UNLABELLED_DIMENSION = "(none)";
|
|
4
|
+
function coerceAggregateValue(value) {
|
|
5
|
+
if (value === null || value === void 0) return null;
|
|
6
|
+
if (typeof value === "number") return Number.isFinite(value) ? value : 0;
|
|
7
|
+
if (typeof value === "bigint") return Number(value);
|
|
8
|
+
if (typeof value === "boolean") return value ? 1 : 0;
|
|
9
|
+
if (typeof value === "string") {
|
|
10
|
+
const s = value.trim();
|
|
11
|
+
if (!s) return null;
|
|
12
|
+
const n = Number(s);
|
|
13
|
+
return Number.isFinite(n) ? n : 0;
|
|
14
|
+
}
|
|
15
|
+
if (value instanceof Date) {
|
|
16
|
+
const t = value.getTime();
|
|
17
|
+
return Number.isFinite(t) ? t : null;
|
|
18
|
+
}
|
|
19
|
+
return 0;
|
|
20
|
+
}
|
|
21
|
+
function fractionDigitsFor(fn) {
|
|
22
|
+
if (fn === "count" || fn === "countDistinct") return { min: 0, max: 0 };
|
|
23
|
+
return { min: 2, max: 2 };
|
|
24
|
+
}
|
|
25
|
+
function formatAggregateNumber(num, locale, fn) {
|
|
26
|
+
const digits = fractionDigitsFor(fn);
|
|
27
|
+
return new Intl.NumberFormat(locale || "pl-PL", {
|
|
28
|
+
minimumFractionDigits: digits.min,
|
|
29
|
+
maximumFractionDigits: digits.max
|
|
30
|
+
}).format(num);
|
|
31
|
+
}
|
|
32
|
+
function formatAggregateBreakdown(entries, column, locale, fn = "sum") {
|
|
33
|
+
const rendered = entries.map((entry) => {
|
|
34
|
+
const num = coerceAggregateValue(entry.value);
|
|
35
|
+
return {
|
|
36
|
+
key: entry.key,
|
|
37
|
+
label: entry.key || AGGREGATE_UNLABELLED_DIMENSION,
|
|
38
|
+
text: num === null ? AGGREGATE_EMPTY_PLACEHOLDER : formatAggregateNumber(num, locale, fn),
|
|
39
|
+
magnitude: num === null ? -Infinity : Math.abs(num)
|
|
40
|
+
};
|
|
41
|
+
}).sort((a, b) => b.magnitude - a.magnitude);
|
|
42
|
+
return React.createElement(
|
|
43
|
+
"span",
|
|
44
|
+
{
|
|
45
|
+
className: "hot-aggregate-breakdown",
|
|
46
|
+
// The stacked lines can outgrow a 140px money column; the flat string is
|
|
47
|
+
// always available on hover and to assistive tech.
|
|
48
|
+
title: rendered.map((r) => `${r.text} ${r.label}`).join(" \xB7 "),
|
|
49
|
+
"data-aggregate-breakdown": String(rendered.length)
|
|
50
|
+
},
|
|
51
|
+
rendered.map(
|
|
52
|
+
(r) => React.createElement(
|
|
53
|
+
"span",
|
|
54
|
+
{ key: r.key, className: "hot-aggregate-breakdown-line" },
|
|
55
|
+
React.createElement("span", { className: "hot-aggregate-breakdown-value" }, r.text),
|
|
56
|
+
" ",
|
|
57
|
+
React.createElement("span", { className: "hot-aggregate-breakdown-key" }, r.label)
|
|
58
|
+
)
|
|
59
|
+
)
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
function formatAggregate(value, column, locale, fn = "sum", breakdown) {
|
|
63
|
+
if (breakdown && breakdown.length > 0) {
|
|
64
|
+
return formatAggregateBreakdown(breakdown, column, locale, fn);
|
|
65
|
+
}
|
|
66
|
+
const num = coerceAggregateValue(value);
|
|
67
|
+
if (column.summaryRenderer) return column.summaryRenderer(num ?? 0, column);
|
|
68
|
+
if (num === null) return AGGREGATE_EMPTY_PLACEHOLDER;
|
|
69
|
+
if (column.type === "date" && (fn === "min" || fn === "max")) {
|
|
70
|
+
const d = new Date(num);
|
|
71
|
+
if (!Number.isNaN(d.getTime())) return d.toLocaleDateString(locale || "pl-PL");
|
|
72
|
+
}
|
|
73
|
+
return formatAggregateNumber(num, locale, fn);
|
|
74
|
+
}
|
|
75
|
+
export {
|
|
76
|
+
AGGREGATE_EMPTY_PLACEHOLDER,
|
|
77
|
+
AGGREGATE_UNLABELLED_DIMENSION,
|
|
78
|
+
coerceAggregateValue,
|
|
79
|
+
formatAggregate,
|
|
80
|
+
formatAggregateBreakdown
|
|
81
|
+
};
|
|
82
|
+
//# sourceMappingURL=formatAggregate.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/backend/dynamic-table/utils/formatAggregate.ts"],
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nimport type { ColumnDef } from '../types/index';\nimport type { AggregationFn, AggregateBreakdownEntry } from '../types/grouping';\n\n/** Rendered when a function had nothing to work with (MIN over no numbers, \u2026). */\nexport const AGGREGATE_EMPTY_PLACEHOLDER = '\u2014';\n\n/** Label for a breakdown slice whose dimension cell was empty. */\nexport const AGGREGATE_UNLABELLED_DIMENSION = '(none)';\n\n/**\n * Coerce a raw aggregate value to a finite number, or `null` when there is\n * genuinely no value.\n *\n * **This is the boundary that used to be wrong.** `formatAggregate` was typed\n * `value: number` and did `Number.isFinite(value) ? value : 0` \u2014 but server\n * aggregates arrive over JSON as *strings*: Postgres returns `COUNT` as `int8`\n * (`\"7\"`) and `SUM` over `numeric` as `\"18400.0000\"`. Both are non-finite as\n * far as `Number.isFinite` is concerned, so every server-side total rendered\n * as `0,00`. Coerce here, once, and everything downstream sees a number.\n */\nexport function coerceAggregateValue(value: unknown): number | null {\n if (value === null || value === undefined) return null;\n if (typeof value === 'number') return Number.isFinite(value) ? value : 0;\n if (typeof value === 'bigint') return Number(value);\n if (typeof value === 'boolean') return value ? 1 : 0;\n if (typeof value === 'string') {\n const s = value.trim();\n if (!s) return null;\n const n = Number(s);\n return Number.isFinite(n) ? n : 0;\n }\n if (value instanceof Date) {\n const t = value.getTime();\n return Number.isFinite(t) ? t : null;\n }\n return 0;\n}\n\n/** Counts are whole things; money and averages carry two decimals. */\nfunction fractionDigitsFor(fn: AggregationFn): { min: number; max: number } {\n if (fn === 'count' || fn === 'countDistinct') return { min: 0, max: 0 };\n return { min: 2, max: 2 };\n}\n\n/** The bare number, with no dimension label. Shared by both paths. */\nfunction formatAggregateNumber(num: number, locale: string | undefined, fn: AggregationFn): string {\n const digits = fractionDigitsFor(fn);\n return new Intl.NumberFormat(locale || 'pl-PL', {\n minimumFractionDigits: digits.min,\n maximumFractionDigits: digits.max,\n }).format(num);\n}\n\n/**\n * Render a dimensioned aggregate as ONE LABELLED LINE PER SLICE.\n *\n * Slices are sorted by descending magnitude so the figure that dominates the\n * total reads first, with empty-dimension rows last.\n *\n * Every line carries its dimension key. That is the whole point: a summary line\n * without one is the defect (HEDGE-147). A single-slice breakdown therefore\n * still prints its label \u2014 `6 150,00 PLN`, not `6 150,00` \u2014 because \"there\n * happens to be one currency in this group right now\" is not something the\n * reader can tell from an unlabelled number.\n */\nexport function formatAggregateBreakdown(\n entries: AggregateBreakdownEntry[],\n column: ColumnDef,\n locale?: string,\n fn: AggregationFn = 'sum',\n): React.ReactNode {\n const rendered = entries\n .map((entry) => {\n const num = coerceAggregateValue(entry.value);\n return {\n key: entry.key,\n label: entry.key || AGGREGATE_UNLABELLED_DIMENSION,\n text: num === null ? AGGREGATE_EMPTY_PLACEHOLDER : formatAggregateNumber(num, locale, fn),\n magnitude: num === null ? -Infinity : Math.abs(num),\n };\n })\n .sort((a, b) => b.magnitude - a.magnitude);\n\n return React.createElement(\n 'span',\n {\n className: 'hot-aggregate-breakdown',\n // The stacked lines can outgrow a 140px money column; the flat string is\n // always available on hover and to assistive tech.\n title: rendered.map((r) => `${r.text} ${r.label}`).join(' \u00B7 '),\n 'data-aggregate-breakdown': String(rendered.length),\n },\n rendered.map((r) =>\n React.createElement(\n 'span',\n { key: r.key, className: 'hot-aggregate-breakdown-line' },\n React.createElement('span', { className: 'hot-aggregate-breakdown-value' }, r.text),\n ' ',\n React.createElement('span', { className: 'hot-aggregate-breakdown-key' }, r.label),\n ),\n ),\n );\n}\n\n/**\n * Format an aggregated value for a group-summary or footer-totals row.\n *\n * Uses a dedicated locale number formatter so the summary reads as its own\n * special row rather than mimicking the per-row cell renderer (which often\n * carries currency badges / row-specific chrome). A column may override this\n * with `summaryRenderer` when it needs bespoke formatting.\n *\n * `fn` governs presentation: a `count` renders as an integer, and `min`/`max`\n * on a date column render as a date (the value is epoch milliseconds).\n */\nexport function formatAggregate(\n value: unknown,\n column: ColumnDef,\n locale?: string,\n fn: AggregationFn = 'sum',\n breakdown?: AggregateBreakdownEntry[] | null,\n): React.ReactNode {\n // A dimensioned rule wins over everything below, INCLUDING the scalar and the\n // column's own `summaryRenderer`. For such a rule the scalar is precisely the\n // number that must not be shown: `SUM(grossAmount)` across PLN + EUR + USD is\n // arithmetic on incommensurable quantities, and it renders as a plausible\n // month-end figure (HEDGE-147). One labelled line per slice instead.\n if (breakdown && breakdown.length > 0) {\n return formatAggregateBreakdown(breakdown, column, locale, fn);\n }\n\n const num = coerceAggregateValue(value);\n if (column.summaryRenderer) return column.summaryRenderer(num ?? 0, column);\n if (num === null) return AGGREGATE_EMPTY_PLACEHOLDER;\n\n // MIN/MAX over a date column are epoch milliseconds \u2014 show them as dates,\n // not as a 13-digit number.\n if (column.type === 'date' && (fn === 'min' || fn === 'max')) {\n const d = new Date(num);\n if (!Number.isNaN(d.getTime())) return d.toLocaleDateString(locale || 'pl-PL');\n }\n\n return formatAggregateNumber(num, locale, fn);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|