@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,243 @@
|
|
|
1
|
+
import { formulaIssue } from "./types.js";
|
|
2
|
+
import { collectFieldRefs, parseFormula } from "./parse.js";
|
|
3
|
+
import { declaredArgType, lookupFormulaFunction, resolveResultType, unifyTypes } from "./functions.js";
|
|
4
|
+
const ORDERABLE = ["number", "date", "text", "unknown"];
|
|
5
|
+
function describeNode(node, fields) {
|
|
6
|
+
switch (node.k) {
|
|
7
|
+
case "field":
|
|
8
|
+
return fields.get(node.name)?.label ?? node.name;
|
|
9
|
+
case "call":
|
|
10
|
+
return `${node.fn}()`;
|
|
11
|
+
case "lit":
|
|
12
|
+
return node.v === null ? "empty" : JSON.stringify(node.v);
|
|
13
|
+
default:
|
|
14
|
+
return "the expression";
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function typeAccepts(expected, actual) {
|
|
18
|
+
if (expected === "unknown" || actual === "unknown") return true;
|
|
19
|
+
return expected === actual;
|
|
20
|
+
}
|
|
21
|
+
function checkAst(ast, ctx) {
|
|
22
|
+
const fields = new Map(ctx.fields.map((f) => [f.key, f]));
|
|
23
|
+
const issues = [];
|
|
24
|
+
const walk = (node) => {
|
|
25
|
+
switch (node.k) {
|
|
26
|
+
case "lit": {
|
|
27
|
+
if (node.v === null) return "unknown";
|
|
28
|
+
if (typeof node.v === "number") return "number";
|
|
29
|
+
if (typeof node.v === "boolean") return "boolean";
|
|
30
|
+
return "text";
|
|
31
|
+
}
|
|
32
|
+
case "field": {
|
|
33
|
+
const meta = fields.get(node.name);
|
|
34
|
+
if (!meta) {
|
|
35
|
+
issues.push(
|
|
36
|
+
formulaIssue("unknown_field", `Unknown column: ${node.name}`, { name: node.name })
|
|
37
|
+
);
|
|
38
|
+
return "unknown";
|
|
39
|
+
}
|
|
40
|
+
return meta.type;
|
|
41
|
+
}
|
|
42
|
+
case "neg": {
|
|
43
|
+
const inner = walk(node.e);
|
|
44
|
+
if (!typeAccepts("number", inner)) {
|
|
45
|
+
const name = describeNode(node.e, fields);
|
|
46
|
+
issues.push(formulaIssue("type_mismatch", `${name} is not a number`, { name }));
|
|
47
|
+
}
|
|
48
|
+
return "number";
|
|
49
|
+
}
|
|
50
|
+
case "call": {
|
|
51
|
+
const def = lookupFormulaFunction(node.fn);
|
|
52
|
+
if (!def) {
|
|
53
|
+
issues.push(
|
|
54
|
+
formulaIssue("unknown_function", `Unknown function: ${node.fn}`, { name: node.fn })
|
|
55
|
+
);
|
|
56
|
+
node.args.forEach(walk);
|
|
57
|
+
return "unknown";
|
|
58
|
+
}
|
|
59
|
+
const argTypes = node.args.map(walk);
|
|
60
|
+
if (node.args.length < def.minArgs || node.args.length > def.maxArgs) {
|
|
61
|
+
issues.push(
|
|
62
|
+
formulaIssue("arity", `${def.name} takes ${def.signature}`, {
|
|
63
|
+
name: def.name,
|
|
64
|
+
signature: def.signature
|
|
65
|
+
})
|
|
66
|
+
);
|
|
67
|
+
return resolveResultType(def, argTypes);
|
|
68
|
+
}
|
|
69
|
+
node.args.forEach((arg, index) => {
|
|
70
|
+
const expected = declaredArgType(def, index);
|
|
71
|
+
if (!typeAccepts(expected, argTypes[index])) {
|
|
72
|
+
const name = describeNode(arg, fields);
|
|
73
|
+
issues.push(
|
|
74
|
+
formulaIssue("type_mismatch", `${name} is not a ${expected}`, {
|
|
75
|
+
name,
|
|
76
|
+
expected
|
|
77
|
+
})
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
return resolveResultType(def, argTypes);
|
|
82
|
+
}
|
|
83
|
+
case "bin": {
|
|
84
|
+
const left = walk(node.l);
|
|
85
|
+
const right = walk(node.r);
|
|
86
|
+
const requireNumber = (side, type2) => {
|
|
87
|
+
if (typeAccepts("number", type2)) return;
|
|
88
|
+
const name = describeNode(side, fields);
|
|
89
|
+
issues.push(formulaIssue("type_mismatch", `${name} is not a number`, { name }));
|
|
90
|
+
};
|
|
91
|
+
const requireBoolean = (side, type2) => {
|
|
92
|
+
if (typeAccepts("boolean", type2)) return;
|
|
93
|
+
const name = describeNode(side, fields);
|
|
94
|
+
issues.push(
|
|
95
|
+
formulaIssue("type_mismatch", `${name} is not a true/false value`, {
|
|
96
|
+
name,
|
|
97
|
+
expected: "boolean"
|
|
98
|
+
})
|
|
99
|
+
);
|
|
100
|
+
};
|
|
101
|
+
switch (node.op) {
|
|
102
|
+
case "+":
|
|
103
|
+
case "-":
|
|
104
|
+
case "*":
|
|
105
|
+
case "/":
|
|
106
|
+
requireNumber(node.l, left);
|
|
107
|
+
requireNumber(node.r, right);
|
|
108
|
+
if (node.op === "/" && node.r.k === "lit" && node.r.v === 0) {
|
|
109
|
+
issues.push(formulaIssue("divide_by_zero", "Cannot divide by zero"));
|
|
110
|
+
}
|
|
111
|
+
return "number";
|
|
112
|
+
case "&&":
|
|
113
|
+
case "||":
|
|
114
|
+
requireBoolean(node.l, left);
|
|
115
|
+
requireBoolean(node.r, right);
|
|
116
|
+
return "boolean";
|
|
117
|
+
case "concat":
|
|
118
|
+
return "text";
|
|
119
|
+
case "=":
|
|
120
|
+
case "!=":
|
|
121
|
+
return "boolean";
|
|
122
|
+
case ">":
|
|
123
|
+
case ">=":
|
|
124
|
+
case "<":
|
|
125
|
+
case "<=": {
|
|
126
|
+
for (const [side, type2] of [
|
|
127
|
+
[node.l, left],
|
|
128
|
+
[node.r, right]
|
|
129
|
+
]) {
|
|
130
|
+
if (!ORDERABLE.includes(type2)) {
|
|
131
|
+
const name = describeNode(side, fields);
|
|
132
|
+
issues.push(formulaIssue("type_mismatch", `${name} cannot be compared`, { name }));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (unifyTypes(left, right) === "unknown" && left !== "unknown" && right !== "unknown") {
|
|
136
|
+
const name = describeNode(node.r, fields);
|
|
137
|
+
issues.push(
|
|
138
|
+
formulaIssue("type_mismatch", `${name} is not a ${left}`, { name, expected: left })
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
return "boolean";
|
|
142
|
+
}
|
|
143
|
+
default:
|
|
144
|
+
return "unknown";
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
default:
|
|
148
|
+
return "unknown";
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
const type = walk(ast);
|
|
152
|
+
return issues.length > 0 ? { ok: false, issues } : { ok: true, type };
|
|
153
|
+
}
|
|
154
|
+
function detectFormulaCycles(refs) {
|
|
155
|
+
const keys = new Set(refs.map((r) => r.key));
|
|
156
|
+
const edges = /* @__PURE__ */ new Map();
|
|
157
|
+
for (const ref of refs) {
|
|
158
|
+
const parsed = parseFormula(ref.expression);
|
|
159
|
+
const deps = parsed.ok ? collectFieldRefs(parsed.ast).filter((d) => keys.has(d)) : [];
|
|
160
|
+
edges.set(ref.key, deps);
|
|
161
|
+
}
|
|
162
|
+
const cycles = /* @__PURE__ */ new Map();
|
|
163
|
+
const state = /* @__PURE__ */ new Map();
|
|
164
|
+
const stack = [];
|
|
165
|
+
const visit = (key) => {
|
|
166
|
+
const mark = state.get(key);
|
|
167
|
+
if (mark === "done") return;
|
|
168
|
+
if (mark === "visiting") {
|
|
169
|
+
const from = stack.indexOf(key);
|
|
170
|
+
const path = [...stack.slice(from), key];
|
|
171
|
+
for (const member of path) cycles.set(member, path);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
state.set(key, "visiting");
|
|
175
|
+
stack.push(key);
|
|
176
|
+
for (const dep of edges.get(key) ?? []) visit(dep);
|
|
177
|
+
stack.pop();
|
|
178
|
+
state.set(key, "done");
|
|
179
|
+
};
|
|
180
|
+
for (const ref of refs) visit(ref.key);
|
|
181
|
+
return cycles;
|
|
182
|
+
}
|
|
183
|
+
function checkFormulaColumn(input) {
|
|
184
|
+
const { ref, fields } = input;
|
|
185
|
+
const existing = (input.existing ?? []).filter((r) => r.key !== ref.key);
|
|
186
|
+
const parsed = parseFormula(ref.expression);
|
|
187
|
+
if (!parsed.ok) return { ok: false, issues: [parsed.issue] };
|
|
188
|
+
const cycles = detectFormulaCycles([...existing, ref]);
|
|
189
|
+
const cycle = cycles.get(ref.key);
|
|
190
|
+
if (cycle) {
|
|
191
|
+
const isSelf = cycle.length <= 2;
|
|
192
|
+
return {
|
|
193
|
+
ok: false,
|
|
194
|
+
issues: [
|
|
195
|
+
formulaIssue(
|
|
196
|
+
"cycle",
|
|
197
|
+
isSelf ? "This formula refers to itself" : `Circular reference: ${cycle.join(" \u2192 ")}`,
|
|
198
|
+
{ path: cycle.join(" \u2192 ") }
|
|
199
|
+
)
|
|
200
|
+
]
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
const formulaFields = existing.map((r) => ({
|
|
204
|
+
key: r.key,
|
|
205
|
+
label: r.label,
|
|
206
|
+
type: r.resultType
|
|
207
|
+
}));
|
|
208
|
+
return mapCheck(checkAst(parsed.ast, { fields: [...fields, ...formulaFields] }), parsed.ast);
|
|
209
|
+
}
|
|
210
|
+
function mapCheck(result, ast) {
|
|
211
|
+
return result.ok ? { ok: true, ast, type: result.type } : { ok: false, issues: result.issues };
|
|
212
|
+
}
|
|
213
|
+
function fieldMetaFromColumns(columns) {
|
|
214
|
+
return columns.map((col) => ({
|
|
215
|
+
key: col.data,
|
|
216
|
+
label: col.title,
|
|
217
|
+
type: columnTypeToFormulaType(col.type)
|
|
218
|
+
}));
|
|
219
|
+
}
|
|
220
|
+
function columnTypeToFormulaType(type) {
|
|
221
|
+
switch (type) {
|
|
222
|
+
case "numeric":
|
|
223
|
+
return "number";
|
|
224
|
+
case "date":
|
|
225
|
+
return "date";
|
|
226
|
+
case "boolean":
|
|
227
|
+
return "boolean";
|
|
228
|
+
case "text":
|
|
229
|
+
case "dropdown":
|
|
230
|
+
case "multiselect":
|
|
231
|
+
return "text";
|
|
232
|
+
default:
|
|
233
|
+
return "unknown";
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
export {
|
|
237
|
+
checkAst,
|
|
238
|
+
checkFormulaColumn,
|
|
239
|
+
columnTypeToFormulaType,
|
|
240
|
+
detectFormulaCycles,
|
|
241
|
+
fieldMetaFromColumns
|
|
242
|
+
};
|
|
243
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/backend/dynamic-table/formula/check.ts"],
|
|
4
|
+
"sourcesContent": ["// formula/check.ts\n//\n// Definition-time validation. Everything that can be known without data is\n// decided HERE, when the user saves the formula \u2014 not discovered per cell at\n// render time. That is the whole point: an unknown column reference and a\n// self-referencing formula are refused by the editor, so a saved view can never\n// contain one.\n//\n// What survives to evaluation time is only what genuinely depends on the data:\n// a `type_mismatch` on an undeclared column, and `divide_by_zero`.\n\nimport type {\n FormulaAst,\n FormulaColumnRef,\n FormulaFieldMeta,\n FormulaIssue,\n FormulaValueType,\n} from './types';\nimport { formulaIssue } from './types';\nimport { collectFieldRefs, parseFormula } from './parse';\nimport { declaredArgType, lookupFormulaFunction, resolveResultType, unifyTypes } from './functions';\n\n// ============================================\n// TYPE + REFERENCE CHECKING\n// ============================================\n\nexport interface FormulaCheckContext {\n /** Every column the formula may reference, native or synthesised. */\n fields: readonly FormulaFieldMeta[];\n}\n\nexport type CheckResult =\n | { ok: true; type: FormulaValueType }\n | { ok: false; issues: FormulaIssue[] };\n\n/** Types that can be compared with `<`, `>`, `<=`, `>=`. */\nconst ORDERABLE: FormulaValueType[] = ['number', 'date', 'text', 'unknown'];\n\n/**\n * A human name for a node, used in `{name} is not a number`. A field reference\n * names the column; anything else is described by shape, because quoting the\n * user's own sub-expression back at them is noise.\n */\nfunction describeNode(node: FormulaAst, fields: Map<string, FormulaFieldMeta>): string {\n switch (node.k) {\n case 'field':\n return fields.get(node.name)?.label ?? node.name;\n case 'call':\n return `${node.fn}()`;\n case 'lit':\n return node.v === null ? 'empty' : JSON.stringify(node.v);\n default:\n return 'the expression';\n }\n}\n\n/** True when `actual` is acceptable where `expected` is declared. */\nfunction typeAccepts(expected: FormulaValueType, actual: FormulaValueType): boolean {\n if (expected === 'unknown' || actual === 'unknown') return true;\n return expected === actual;\n}\n\n/**\n * Walk the AST assigning types and collecting every problem \u2014 not just the\n * first, because a user fixing one error at a time is a user who stops using\n * the feature.\n */\nexport function checkAst(ast: FormulaAst, ctx: FormulaCheckContext): CheckResult {\n const fields = new Map<string, FormulaFieldMeta>(ctx.fields.map((f) => [f.key, f]));\n const issues: FormulaIssue[] = [];\n\n const walk = (node: FormulaAst): FormulaValueType => {\n switch (node.k) {\n case 'lit': {\n if (node.v === null) return 'unknown';\n if (typeof node.v === 'number') return 'number';\n if (typeof node.v === 'boolean') return 'boolean';\n return 'text';\n }\n\n case 'field': {\n const meta = fields.get(node.name);\n if (!meta) {\n issues.push(\n formulaIssue('unknown_field', `Unknown column: ${node.name}`, { name: node.name }),\n );\n return 'unknown';\n }\n return meta.type;\n }\n\n case 'neg': {\n const inner = walk(node.e);\n if (!typeAccepts('number', inner)) {\n const name = describeNode(node.e, fields);\n issues.push(formulaIssue('type_mismatch', `${name} is not a number`, { name }));\n }\n return 'number';\n }\n\n case 'call': {\n const def = lookupFormulaFunction(node.fn);\n if (!def) {\n issues.push(\n formulaIssue('unknown_function', `Unknown function: ${node.fn}`, { name: node.fn }),\n );\n node.args.forEach(walk);\n return 'unknown';\n }\n const argTypes = node.args.map(walk);\n if (node.args.length < def.minArgs || node.args.length > def.maxArgs) {\n issues.push(\n formulaIssue('arity', `${def.name} takes ${def.signature}`, {\n name: def.name,\n signature: def.signature,\n }),\n );\n return resolveResultType(def, argTypes);\n }\n node.args.forEach((arg, index) => {\n const expected = declaredArgType(def, index);\n if (!typeAccepts(expected, argTypes[index])) {\n const name = describeNode(arg, fields);\n issues.push(\n formulaIssue('type_mismatch', `${name} is not a ${expected}`, {\n name,\n expected,\n }),\n );\n }\n });\n return resolveResultType(def, argTypes);\n }\n\n case 'bin': {\n const left = walk(node.l);\n const right = walk(node.r);\n\n const requireNumber = (side: FormulaAst, type: FormulaValueType) => {\n if (typeAccepts('number', type)) return;\n const name = describeNode(side, fields);\n issues.push(formulaIssue('type_mismatch', `${name} is not a number`, { name }));\n };\n const requireBoolean = (side: FormulaAst, type: FormulaValueType) => {\n if (typeAccepts('boolean', type)) return;\n const name = describeNode(side, fields);\n issues.push(\n formulaIssue('type_mismatch', `${name} is not a true/false value`, {\n name,\n expected: 'boolean',\n }),\n );\n };\n\n switch (node.op) {\n case '+':\n case '-':\n case '*':\n case '/':\n requireNumber(node.l, left);\n requireNumber(node.r, right);\n // A literal zero divisor is provable now, so prove it now.\n if (node.op === '/' && node.r.k === 'lit' && node.r.v === 0) {\n issues.push(formulaIssue('divide_by_zero', 'Cannot divide by zero'));\n }\n return 'number';\n\n case '&&':\n case '||':\n requireBoolean(node.l, left);\n requireBoolean(node.r, right);\n return 'boolean';\n\n case 'concat':\n return 'text';\n\n case '=':\n case '!=':\n return 'boolean';\n\n case '>':\n case '>=':\n case '<':\n case '<=': {\n for (const [side, type] of [\n [node.l, left],\n [node.r, right],\n ] as [FormulaAst, FormulaValueType][]) {\n if (!ORDERABLE.includes(type)) {\n const name = describeNode(side, fields);\n issues.push(formulaIssue('type_mismatch', `${name} cannot be compared`, { name }));\n }\n }\n if (unifyTypes(left, right) === 'unknown' && left !== 'unknown' && right !== 'unknown') {\n const name = describeNode(node.r, fields);\n issues.push(\n formulaIssue('type_mismatch', `${name} is not a ${left}`, { name, expected: left }),\n );\n }\n return 'boolean';\n }\n\n default:\n return 'unknown';\n }\n }\n\n default:\n return 'unknown';\n }\n };\n\n const type = walk(ast);\n return issues.length > 0 ? { ok: false, issues } : { ok: true, type };\n}\n\n// ============================================\n// CYCLE DETECTION\n// ============================================\n\n/**\n * Cycles among formula columns, keyed by the formula key that participates.\n * Same-row references (A3) keep the graph tiny \u2014 one node per formula column \u2014\n * so this is exhaustive rather than heuristic, and it runs at DEFINITION time.\n *\n * A formula that fails to parse contributes no edges; its syntax error is\n * reported separately and it cannot be saved anyway.\n */\nexport function detectFormulaCycles(refs: readonly FormulaColumnRef[]): Map<string, string[]> {\n const keys = new Set(refs.map((r) => r.key));\n const edges = new Map<string, string[]>();\n\n for (const ref of refs) {\n const parsed = parseFormula(ref.expression);\n const deps = parsed.ok ? collectFieldRefs(parsed.ast).filter((d) => keys.has(d)) : [];\n edges.set(ref.key, deps);\n }\n\n const cycles = new Map<string, string[]>();\n const state = new Map<string, 'visiting' | 'done'>();\n const stack: string[] = [];\n\n const visit = (key: string): void => {\n const mark = state.get(key);\n if (mark === 'done') return;\n if (mark === 'visiting') {\n // Found a back-edge: everything from `key` to the top of the stack is the\n // cycle, and every member of it is refused.\n const from = stack.indexOf(key);\n const path = [...stack.slice(from), key];\n for (const member of path) cycles.set(member, path);\n return;\n }\n state.set(key, 'visiting');\n stack.push(key);\n for (const dep of edges.get(key) ?? []) visit(dep);\n stack.pop();\n state.set(key, 'done');\n };\n\n for (const ref of refs) visit(ref.key);\n return cycles;\n}\n\n// ============================================\n// THE EDITOR'S ENTRY POINT\n// ============================================\n\nexport interface CheckFormulaColumnInput {\n /** The definition being saved (new or edited). */\n ref: FormulaColumnRef;\n /** Native + lookup columns the formula may reference. */\n fields: readonly FormulaFieldMeta[];\n /**\n * Every other formula column already on the view. The one being edited is\n * matched by key and replaced, so re-saving an existing formula is not\n * mistaken for a cycle with its own previous version.\n */\n existing?: readonly FormulaColumnRef[];\n}\n\nexport type CheckFormulaColumnResult =\n | { ok: true; ast: FormulaAst; type: FormulaValueType }\n | { ok: false; issues: FormulaIssue[] };\n\n/**\n * Validate one formula definition end to end: syntax \u2192 cycles \u2192 references and\n * types. Returns EVERY issue so the editor can list them.\n */\nexport function checkFormulaColumn(input: CheckFormulaColumnInput): CheckFormulaColumnResult {\n const { ref, fields } = input;\n const existing = (input.existing ?? []).filter((r) => r.key !== ref.key);\n\n const parsed = parseFormula(ref.expression);\n if (!parsed.ok) return { ok: false, issues: [parsed.issue] };\n\n // Cycles first: a self-reference makes the type check meaningless.\n const cycles = detectFormulaCycles([...existing, ref]);\n const cycle = cycles.get(ref.key);\n if (cycle) {\n const isSelf = cycle.length <= 2;\n return {\n ok: false,\n issues: [\n formulaIssue(\n 'cycle',\n isSelf ? 'This formula refers to itself' : `Circular reference: ${cycle.join(' \u2192 ')}`,\n { path: cycle.join(' \u2192 ') },\n ),\n ],\n };\n }\n\n // Other formula columns are referenceable, typed by their declared result.\n const formulaFields: FormulaFieldMeta[] = existing.map((r) => ({\n key: r.key,\n label: r.label,\n type: r.resultType,\n }));\n\n return mapCheck(checkAst(parsed.ast, { fields: [...fields, ...formulaFields] }), parsed.ast);\n}\n\nfunction mapCheck(result: CheckResult, ast: FormulaAst): CheckFormulaColumnResult {\n return result.ok ? { ok: true, ast, type: result.type } : { ok: false, issues: result.issues };\n}\n\n/**\n * Column metadata in the shape the checker wants, derived from `ColumnDef`s.\n * `ColumnDef.type` is the grid's vocabulary (`numeric`, `dropdown`, \u2026); this is\n * the single place that translation lives.\n */\nexport function fieldMetaFromColumns(\n columns: readonly { data: string; title?: string; type?: string }[],\n): FormulaFieldMeta[] {\n return columns.map((col) => ({\n key: col.data,\n label: col.title,\n type: columnTypeToFormulaType(col.type),\n }));\n}\n\n/** `ColumnDef.type` \u2192 checker type. Undeclared columns are `unknown`. */\nexport function columnTypeToFormulaType(type: string | undefined): FormulaValueType {\n switch (type) {\n case 'numeric':\n return 'number';\n case 'date':\n return 'date';\n case 'boolean':\n return 'boolean';\n case 'text':\n case 'dropdown':\n case 'multiselect':\n return 'text';\n default:\n return 'unknown';\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["type"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import { collectFieldRefs, parseFormula } from "./parse.js";
|
|
2
|
+
import {
|
|
3
|
+
EMPTY,
|
|
4
|
+
fail,
|
|
5
|
+
lookupFormulaFunction,
|
|
6
|
+
ok,
|
|
7
|
+
toBoolean,
|
|
8
|
+
toDate,
|
|
9
|
+
toNumber,
|
|
10
|
+
toText
|
|
11
|
+
} from "./functions.js";
|
|
12
|
+
import { checkFormulaColumn } from "./check.js";
|
|
13
|
+
function normalise(raw) {
|
|
14
|
+
if (raw === null || raw === void 0) return null;
|
|
15
|
+
if (raw instanceof Date) return raw;
|
|
16
|
+
const type = typeof raw;
|
|
17
|
+
if (type === "number" || type === "string" || type === "boolean") return raw;
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
function evaluateAst(ast, row, options = {}) {
|
|
21
|
+
const nowFn = options.now ?? (() => /* @__PURE__ */ new Date());
|
|
22
|
+
const fields = options.fields;
|
|
23
|
+
const computed = options.computed;
|
|
24
|
+
const runtime = {
|
|
25
|
+
evaluateNode: (node) => walk(node),
|
|
26
|
+
now: nowFn
|
|
27
|
+
};
|
|
28
|
+
const nameOf = (node) => {
|
|
29
|
+
if (node.k === "field") return fields?.get(node.name)?.label ?? node.name;
|
|
30
|
+
if (node.k === "call") return `${node.fn}()`;
|
|
31
|
+
return "value";
|
|
32
|
+
};
|
|
33
|
+
function walk(node) {
|
|
34
|
+
switch (node.k) {
|
|
35
|
+
case "lit":
|
|
36
|
+
return ok(node.v);
|
|
37
|
+
case "field": {
|
|
38
|
+
const upstream = computed?.get(node.name);
|
|
39
|
+
if (upstream) {
|
|
40
|
+
if (upstream.state === "error") return { ok: false, issue: upstream.issue };
|
|
41
|
+
return ok(upstream.value);
|
|
42
|
+
}
|
|
43
|
+
return ok(normalise(row[node.name]));
|
|
44
|
+
}
|
|
45
|
+
case "neg": {
|
|
46
|
+
const inner = walk(node.e);
|
|
47
|
+
if (!inner.ok) return inner;
|
|
48
|
+
const n = toNumber(inner.value, nameOf(node.e));
|
|
49
|
+
if (!n.ok || n.value === null) return n;
|
|
50
|
+
return ok(-n.value);
|
|
51
|
+
}
|
|
52
|
+
case "call": {
|
|
53
|
+
const def = lookupFormulaFunction(node.fn);
|
|
54
|
+
if (!def) {
|
|
55
|
+
return fail("unknown_function", `Unknown function: ${node.fn}`, { name: node.fn });
|
|
56
|
+
}
|
|
57
|
+
if (node.args.length < def.minArgs || node.args.length > def.maxArgs) {
|
|
58
|
+
return fail("arity", `${def.name} takes ${def.signature}`, {
|
|
59
|
+
name: def.name,
|
|
60
|
+
signature: def.signature
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
if (def.lazy && def.callLazy) return def.callLazy(node.args, runtime);
|
|
64
|
+
const values = [];
|
|
65
|
+
for (const arg of node.args) {
|
|
66
|
+
const result = walk(arg);
|
|
67
|
+
if (!result.ok) return result;
|
|
68
|
+
if (result.value === null && def.nullPolicy !== "accept") return EMPTY;
|
|
69
|
+
values.push(result.value);
|
|
70
|
+
}
|
|
71
|
+
if (!def.call) return EMPTY;
|
|
72
|
+
return def.call(values, runtime);
|
|
73
|
+
}
|
|
74
|
+
case "bin":
|
|
75
|
+
return walkBinary(node);
|
|
76
|
+
default:
|
|
77
|
+
return EMPTY;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function walkBinary(node) {
|
|
81
|
+
const { op } = node;
|
|
82
|
+
if (op === "&&" || op === "||") {
|
|
83
|
+
const left2 = walk(node.l);
|
|
84
|
+
if (!left2.ok) return left2;
|
|
85
|
+
const lb = toBoolean(left2.value, nameOf(node.l));
|
|
86
|
+
if (!lb.ok) return lb;
|
|
87
|
+
if (lb.value === null) return EMPTY;
|
|
88
|
+
if (op === "&&" && lb.value === false) return ok(false);
|
|
89
|
+
if (op === "||" && lb.value === true) return ok(true);
|
|
90
|
+
const right2 = walk(node.r);
|
|
91
|
+
if (!right2.ok) return right2;
|
|
92
|
+
const rb = toBoolean(right2.value, nameOf(node.r));
|
|
93
|
+
if (!rb.ok || rb.value === null) return rb;
|
|
94
|
+
return ok(rb.value);
|
|
95
|
+
}
|
|
96
|
+
const left = walk(node.l);
|
|
97
|
+
if (!left.ok) return left;
|
|
98
|
+
const right = walk(node.r);
|
|
99
|
+
if (!right.ok) return right;
|
|
100
|
+
if (op === "concat") {
|
|
101
|
+
const l2 = toText(left.value);
|
|
102
|
+
if (!l2.ok) return l2;
|
|
103
|
+
const r2 = toText(right.value);
|
|
104
|
+
if (!r2.ok) return r2;
|
|
105
|
+
const ls = l2.value === null ? "" : l2.value;
|
|
106
|
+
const rs = r2.value === null ? "" : r2.value;
|
|
107
|
+
if (left.value === null && right.value === null) return EMPTY;
|
|
108
|
+
return ok(ls + rs);
|
|
109
|
+
}
|
|
110
|
+
if (op === "=" || op === "!=") {
|
|
111
|
+
const equal = looseEquals(left.value, right.value);
|
|
112
|
+
return ok(op === "=" ? equal : !equal);
|
|
113
|
+
}
|
|
114
|
+
if (op === ">" || op === ">=" || op === "<" || op === "<=") {
|
|
115
|
+
if (left.value === null || right.value === null) return EMPTY;
|
|
116
|
+
const cmp = compare(left.value, right.value, nameOf(node.r));
|
|
117
|
+
if (!cmp.ok) return cmp;
|
|
118
|
+
const c = cmp.value;
|
|
119
|
+
switch (op) {
|
|
120
|
+
case ">":
|
|
121
|
+
return ok(c > 0);
|
|
122
|
+
case ">=":
|
|
123
|
+
return ok(c >= 0);
|
|
124
|
+
case "<":
|
|
125
|
+
return ok(c < 0);
|
|
126
|
+
default:
|
|
127
|
+
return ok(c <= 0);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const l = toNumber(left.value, nameOf(node.l));
|
|
131
|
+
if (!l.ok) return l;
|
|
132
|
+
const r = toNumber(right.value, nameOf(node.r));
|
|
133
|
+
if (!r.ok) return r;
|
|
134
|
+
if (l.value === null || r.value === null) return EMPTY;
|
|
135
|
+
const a = l.value;
|
|
136
|
+
const b = r.value;
|
|
137
|
+
switch (op) {
|
|
138
|
+
case "+":
|
|
139
|
+
return ok(a + b);
|
|
140
|
+
case "-":
|
|
141
|
+
return ok(a - b);
|
|
142
|
+
case "*":
|
|
143
|
+
return ok(a * b);
|
|
144
|
+
case "/":
|
|
145
|
+
if (b === 0) return fail("divide_by_zero", "Cannot divide by zero");
|
|
146
|
+
return ok(a / b);
|
|
147
|
+
default:
|
|
148
|
+
return EMPTY;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function looseEquals(a, b) {
|
|
152
|
+
if (a === null || b === null) return a === b;
|
|
153
|
+
if (a instanceof Date || b instanceof Date) {
|
|
154
|
+
const da = toDate(a);
|
|
155
|
+
const db = toDate(b);
|
|
156
|
+
if (!da.ok || !db.ok || da.value === null || db.value === null) return false;
|
|
157
|
+
return da.value.getTime() === db.value.getTime();
|
|
158
|
+
}
|
|
159
|
+
if (typeof a === "number" || typeof b === "number") {
|
|
160
|
+
const na = toNumber(a);
|
|
161
|
+
const nb = toNumber(b);
|
|
162
|
+
if (na.ok && nb.ok && na.value !== null && nb.value !== null) return na.value === nb.value;
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
return a === b;
|
|
166
|
+
}
|
|
167
|
+
function compare(a, b, rightName) {
|
|
168
|
+
if (a instanceof Date || b instanceof Date) {
|
|
169
|
+
const da = toDate(a, rightName);
|
|
170
|
+
if (!da.ok) return da;
|
|
171
|
+
const db = toDate(b, rightName);
|
|
172
|
+
if (!db.ok) return db;
|
|
173
|
+
if (da.value === null || db.value === null) return EMPTY;
|
|
174
|
+
return ok(Math.sign(da.value.getTime() - db.value.getTime()));
|
|
175
|
+
}
|
|
176
|
+
if (typeof a === "string" && typeof b === "string") {
|
|
177
|
+
const na2 = Number(a.trim());
|
|
178
|
+
const nb2 = Number(b.trim());
|
|
179
|
+
if (a.trim() && b.trim() && !Number.isNaN(na2) && !Number.isNaN(nb2)) {
|
|
180
|
+
return ok(Math.sign(na2 - nb2));
|
|
181
|
+
}
|
|
182
|
+
return ok(Math.sign(a.localeCompare(b)));
|
|
183
|
+
}
|
|
184
|
+
const na = toNumber(a, rightName);
|
|
185
|
+
if (!na.ok) return na;
|
|
186
|
+
const nb = toNumber(b, rightName);
|
|
187
|
+
if (!nb.ok) return nb;
|
|
188
|
+
if (na.value === null || nb.value === null) return EMPTY;
|
|
189
|
+
return ok(Math.sign(na.value - nb.value));
|
|
190
|
+
}
|
|
191
|
+
return walk(ast);
|
|
192
|
+
}
|
|
193
|
+
function coerceToResultType(outcome, resultType, label) {
|
|
194
|
+
if (!outcome.ok) return { state: "error", value: null, issue: outcome.issue };
|
|
195
|
+
if (outcome.value === null) return { state: "empty", value: null };
|
|
196
|
+
let coerced;
|
|
197
|
+
switch (resultType) {
|
|
198
|
+
case "number":
|
|
199
|
+
coerced = toNumber(outcome.value, label);
|
|
200
|
+
break;
|
|
201
|
+
case "text":
|
|
202
|
+
coerced = toText(outcome.value);
|
|
203
|
+
break;
|
|
204
|
+
case "boolean":
|
|
205
|
+
coerced = toBoolean(outcome.value, label);
|
|
206
|
+
break;
|
|
207
|
+
default:
|
|
208
|
+
coerced = toDate(outcome.value, label);
|
|
209
|
+
}
|
|
210
|
+
if (!coerced.ok) return { state: "error", value: null, issue: coerced.issue };
|
|
211
|
+
if (coerced.value === null) return { state: "empty", value: null };
|
|
212
|
+
return { state: "ok", value: coerced.value };
|
|
213
|
+
}
|
|
214
|
+
function compileFormulaColumns(refs, fields) {
|
|
215
|
+
const fieldMap = new Map(fields.map((f) => [f.key, f]));
|
|
216
|
+
const invalid = /* @__PURE__ */ new Map();
|
|
217
|
+
const compiled = /* @__PURE__ */ new Map();
|
|
218
|
+
for (const ref of refs) {
|
|
219
|
+
const checked = checkFormulaColumn({ ref, fields, existing: refs });
|
|
220
|
+
if (!checked.ok) {
|
|
221
|
+
invalid.set(ref.key, checked.issues[0]);
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
compiled.set(ref.key, { ref, ast: checked.ast, deps: collectFieldRefs(checked.ast) });
|
|
225
|
+
}
|
|
226
|
+
const order = [];
|
|
227
|
+
const placed = /* @__PURE__ */ new Set();
|
|
228
|
+
const place = (key, seen) => {
|
|
229
|
+
if (placed.has(key) || seen.has(key)) return;
|
|
230
|
+
const entry = compiled.get(key);
|
|
231
|
+
if (!entry) return;
|
|
232
|
+
seen.add(key);
|
|
233
|
+
for (const dep of entry.deps) {
|
|
234
|
+
if (compiled.has(dep)) place(dep, seen);
|
|
235
|
+
}
|
|
236
|
+
seen.delete(key);
|
|
237
|
+
placed.add(key);
|
|
238
|
+
order.push(entry);
|
|
239
|
+
};
|
|
240
|
+
for (const ref of refs) place(ref.key, /* @__PURE__ */ new Set());
|
|
241
|
+
const inputKeys = /* @__PURE__ */ new Set();
|
|
242
|
+
for (const entry of order) {
|
|
243
|
+
for (const dep of entry.deps) {
|
|
244
|
+
if (!compiled.has(dep)) inputKeys.add(dep);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return { order, invalid, fields: fieldMap, inputKeys: [...inputKeys] };
|
|
248
|
+
}
|
|
249
|
+
function evaluateFormulaRow(set, row, options = {}) {
|
|
250
|
+
const computed = /* @__PURE__ */ new Map();
|
|
251
|
+
for (const [key, issue] of set.invalid) {
|
|
252
|
+
computed.set(key, { state: "error", value: null, issue });
|
|
253
|
+
}
|
|
254
|
+
for (const entry of set.order) {
|
|
255
|
+
const outcome = evaluateAst(entry.ast, row, {
|
|
256
|
+
fields: set.fields,
|
|
257
|
+
now: options.now,
|
|
258
|
+
computed
|
|
259
|
+
});
|
|
260
|
+
computed.set(
|
|
261
|
+
entry.ref.key,
|
|
262
|
+
coerceToResultType(outcome, entry.ref.resultType, entry.ref.label)
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
return computed;
|
|
266
|
+
}
|
|
267
|
+
function createFormulaRowEvaluator(set, options = {}) {
|
|
268
|
+
const cache = /* @__PURE__ */ new WeakMap();
|
|
269
|
+
const signatureOf = (row) => set.inputKeys.map((key) => {
|
|
270
|
+
const value = row[key];
|
|
271
|
+
if (value === null || value === void 0) return "\0";
|
|
272
|
+
if (value instanceof Date) return String(value.getTime());
|
|
273
|
+
return String(value);
|
|
274
|
+
}).join("");
|
|
275
|
+
return (row) => {
|
|
276
|
+
if (!row || typeof row !== "object") return /* @__PURE__ */ new Map();
|
|
277
|
+
const signature = signatureOf(row);
|
|
278
|
+
const hit = cache.get(row);
|
|
279
|
+
if (hit && hit.signature === signature) return hit.results;
|
|
280
|
+
const results = evaluateFormulaRow(set, row, options);
|
|
281
|
+
cache.set(row, { signature, results });
|
|
282
|
+
return results;
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
function evaluateExpression(expression, row, fields, resultType = "number", options = {}) {
|
|
286
|
+
const parsed = parseFormula(expression);
|
|
287
|
+
if (!parsed.ok) return { state: "error", value: null, issue: parsed.issue };
|
|
288
|
+
const outcome = evaluateAst(parsed.ast, row, {
|
|
289
|
+
fields: new Map(fields.map((f) => [f.key, f])),
|
|
290
|
+
now: options.now
|
|
291
|
+
});
|
|
292
|
+
return coerceToResultType(outcome, resultType, expression);
|
|
293
|
+
}
|
|
294
|
+
export {
|
|
295
|
+
coerceToResultType,
|
|
296
|
+
compileFormulaColumns,
|
|
297
|
+
createFormulaRowEvaluator,
|
|
298
|
+
evaluateAst,
|
|
299
|
+
evaluateExpression,
|
|
300
|
+
evaluateFormulaRow
|
|
301
|
+
};
|
|
302
|
+
//# sourceMappingURL=evaluate.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/backend/dynamic-table/formula/evaluate.ts"],
|
|
4
|
+
"sourcesContent": ["// formula/evaluate.ts\n//\n// The AST walker. It is a plain recursive function over five node kinds.\n//\n// There is no `eval`, no `new Function`, no template interpolation into SQL and\n// no dynamic property access into host objects \u2014 a formula can read the row it\n// is handed and nothing else. That is enforced structurally (the language has\n// no syntax for anything else) and asserted mechanically by\n// `__tests__/formula.noEval.test.ts`.\n//\n// Null propagates: an arithmetic operand that is empty makes the whole result\n// empty. It never becomes `0` and it never becomes `NaN`.\n\nimport type {\n FormulaAst,\n FormulaCellResult,\n FormulaColumnRef,\n FormulaFieldMeta,\n FormulaIssue,\n FormulaResultType,\n FormulaValue,\n} from './types';\nimport { collectFieldRefs, parseFormula } from './parse';\nimport {\n EMPTY,\n fail,\n lookupFormulaFunction,\n ok,\n toBoolean,\n toDate,\n toNumber,\n toText,\n type EvalOutcome,\n type FormulaRuntime,\n} from './functions';\nimport { checkFormulaColumn } from './check';\n\nexport interface EvaluateOptions {\n /** Column metadata, used to name a column in a `type_mismatch` message. */\n fields?: ReadonlyMap<string, FormulaFieldMeta>;\n /** Injectable clock so `TODAY()` is deterministic under test. */\n now?: () => Date;\n /**\n * Results of formula columns already evaluated for this row. A field\n * reference resolves here first, which is how one formula reads another.\n */\n computed?: ReadonlyMap<string, FormulaCellResult>;\n}\n\n// ============================================\n// CORE WALKER\n// ============================================\n\n/** Normalise a raw row value into the evaluator's value domain. */\nfunction normalise(raw: unknown): FormulaValue {\n if (raw === null || raw === undefined) return null;\n if (raw instanceof Date) return raw;\n const type = typeof raw;\n if (type === 'number' || type === 'string' || type === 'boolean') return raw as FormulaValue;\n // Objects and arrays have no meaning in a same-row language; treating them as\n // empty is safer than stringifying `[object Object]` into a total.\n return null;\n}\n\n/**\n * Evaluate one AST against one row. Never throws \u2014 every failure is an\n * `EvalOutcome` carrying the issue that will be shown in that cell.\n */\nexport function evaluateAst(\n ast: FormulaAst,\n row: Record<string, unknown>,\n options: EvaluateOptions = {},\n): EvalOutcome {\n const nowFn = options.now ?? (() => new Date());\n const fields = options.fields;\n const computed = options.computed;\n\n const runtime: FormulaRuntime = {\n evaluateNode: (node) => walk(node),\n now: nowFn,\n };\n\n const nameOf = (node: FormulaAst): string => {\n if (node.k === 'field') return fields?.get(node.name)?.label ?? node.name;\n if (node.k === 'call') return `${node.fn}()`;\n return 'value';\n };\n\n function walk(node: FormulaAst): EvalOutcome {\n switch (node.k) {\n case 'lit':\n return ok(node.v);\n\n case 'field': {\n const upstream = computed?.get(node.name);\n if (upstream) {\n // A formula reading another formula inherits its error rather than\n // inventing a fresh one \u2014 the user needs to fix the upstream cell.\n if (upstream.state === 'error') return { ok: false, issue: upstream.issue };\n return ok(upstream.value);\n }\n return ok(normalise(row[node.name]));\n }\n\n case 'neg': {\n const inner = walk(node.e);\n if (!inner.ok) return inner;\n const n = toNumber(inner.value, nameOf(node.e));\n if (!n.ok || n.value === null) return n;\n return ok(-(n.value as number));\n }\n\n case 'call': {\n const def = lookupFormulaFunction(node.fn);\n if (!def) {\n return fail('unknown_function', `Unknown function: ${node.fn}`, { name: node.fn });\n }\n if (node.args.length < def.minArgs || node.args.length > def.maxArgs) {\n return fail('arity', `${def.name} takes ${def.signature}`, {\n name: def.name,\n signature: def.signature,\n });\n }\n if (def.lazy && def.callLazy) return def.callLazy(node.args, runtime);\n\n const values: FormulaValue[] = [];\n for (const arg of node.args) {\n const result = walk(arg);\n if (!result.ok) return result;\n if (result.value === null && def.nullPolicy !== 'accept') return EMPTY;\n values.push(result.value);\n }\n if (!def.call) return EMPTY;\n return def.call(values, runtime);\n }\n\n case 'bin':\n return walkBinary(node);\n\n default:\n return EMPTY;\n }\n }\n\n function walkBinary(node: Extract<FormulaAst, { k: 'bin' }>): EvalOutcome {\n const { op } = node;\n\n // `&&` / `||` short-circuit, so the right operand is not evaluated at all\n // when the left decides the answer.\n if (op === '&&' || op === '||') {\n const left = walk(node.l);\n if (!left.ok) return left;\n const lb = toBoolean(left.value, nameOf(node.l));\n if (!lb.ok) return lb;\n if (lb.value === null) return EMPTY;\n if (op === '&&' && lb.value === false) return ok(false);\n if (op === '||' && lb.value === true) return ok(true);\n const right = walk(node.r);\n if (!right.ok) return right;\n const rb = toBoolean(right.value, nameOf(node.r));\n if (!rb.ok || rb.value === null) return rb;\n return ok(rb.value);\n }\n\n const left = walk(node.l);\n if (!left.ok) return left;\n const right = walk(node.r);\n if (!right.ok) return right;\n\n if (op === 'concat') {\n const l = toText(left.value);\n if (!l.ok) return l;\n const r = toText(right.value);\n if (!r.ok) return r;\n // Concatenation treats empty as the empty string; `'A' & null` is `'A'`,\n // not empty \u2014 otherwise every optional suffix would blank the column.\n const ls = l.value === null ? '' : (l.value as string);\n const rs = r.value === null ? '' : (r.value as string);\n if (left.value === null && right.value === null) return EMPTY;\n return ok(ls + rs);\n }\n\n if (op === '=' || op === '!=') {\n const equal = looseEquals(left.value, right.value);\n return ok(op === '=' ? equal : !equal);\n }\n\n if (op === '>' || op === '>=' || op === '<' || op === '<=') {\n if (left.value === null || right.value === null) return EMPTY;\n const cmp = compare(left.value, right.value, nameOf(node.r));\n if (!cmp.ok) return cmp;\n const c = cmp.value as number;\n switch (op) {\n case '>':\n return ok(c > 0);\n case '>=':\n return ok(c >= 0);\n case '<':\n return ok(c < 0);\n default:\n return ok(c <= 0);\n }\n }\n\n // Arithmetic.\n const l = toNumber(left.value, nameOf(node.l));\n if (!l.ok) return l;\n const r = toNumber(right.value, nameOf(node.r));\n if (!r.ok) return r;\n if (l.value === null || r.value === null) return EMPTY;\n\n const a = l.value as number;\n const b = r.value as number;\n switch (op) {\n case '+':\n return ok(a + b);\n case '-':\n return ok(a - b);\n case '*':\n return ok(a * b);\n case '/':\n if (b === 0) return fail('divide_by_zero', 'Cannot divide by zero');\n return ok(a / b);\n default:\n return EMPTY;\n }\n }\n\n /**\n * Equality across the value domain. Two empties are equal (as in Excel, where\n * blank equals blank); a date equals a date with the same instant; numbers\n * and numeric strings compare as numbers so `'10' = 10` is true.\n */\n function looseEquals(a: FormulaValue, b: FormulaValue): boolean {\n if (a === null || b === null) return a === b;\n if (a instanceof Date || b instanceof Date) {\n const da = toDate(a);\n const db = toDate(b);\n if (!da.ok || !db.ok || da.value === null || db.value === null) return false;\n return (da.value as Date).getTime() === (db.value as Date).getTime();\n }\n if (typeof a === 'number' || typeof b === 'number') {\n const na = toNumber(a);\n const nb = toNumber(b);\n if (na.ok && nb.ok && na.value !== null && nb.value !== null) return na.value === nb.value;\n return false;\n }\n return a === b;\n }\n\n /** Three-way comparison for ordering operators. */\n function compare(a: FormulaValue, b: FormulaValue, rightName: string): EvalOutcome {\n if (a instanceof Date || b instanceof Date) {\n const da = toDate(a, rightName);\n if (!da.ok) return da;\n const db = toDate(b, rightName);\n if (!db.ok) return db;\n if (da.value === null || db.value === null) return EMPTY;\n return ok(Math.sign((da.value as Date).getTime() - (db.value as Date).getTime()));\n }\n if (typeof a === 'string' && typeof b === 'string') {\n const na = Number(a.trim());\n const nb = Number(b.trim());\n if (a.trim() && b.trim() && !Number.isNaN(na) && !Number.isNaN(nb)) {\n return ok(Math.sign(na - nb));\n }\n return ok(Math.sign(a.localeCompare(b)));\n }\n const na = toNumber(a, rightName);\n if (!na.ok) return na;\n const nb = toNumber(b, rightName);\n if (!nb.ok) return nb;\n if (na.value === null || nb.value === null) return EMPTY;\n return ok(Math.sign((na.value as number) - (nb.value as number)));\n }\n\n return walk(ast);\n}\n\n// ============================================\n// RESULT SHAPING\n// ============================================\n\n/** Coerce an evaluated value into the column's declared result type. */\nexport function coerceToResultType(\n outcome: EvalOutcome,\n resultType: FormulaResultType,\n label: string,\n): FormulaCellResult {\n if (!outcome.ok) return { state: 'error', value: null, issue: outcome.issue };\n if (outcome.value === null) return { state: 'empty', value: null };\n\n let coerced: EvalOutcome;\n switch (resultType) {\n case 'number':\n coerced = toNumber(outcome.value, label);\n break;\n case 'text':\n coerced = toText(outcome.value);\n break;\n case 'boolean':\n coerced = toBoolean(outcome.value, label);\n break;\n default:\n coerced = toDate(outcome.value, label);\n }\n\n if (!coerced.ok) return { state: 'error', value: null, issue: coerced.issue };\n if (coerced.value === null) return { state: 'empty', value: null };\n return { state: 'ok', value: coerced.value };\n}\n\n// ============================================\n// COLUMN SETS\n// ============================================\n\nexport interface CompiledFormula {\n ref: FormulaColumnRef;\n ast: FormulaAst;\n /** Every field key the expression reads, formula keys included. */\n deps: string[];\n}\n\nexport interface CompiledFormulaSet {\n /** Valid formulas in dependency order \u2014 an upstream formula evaluates first. */\n order: CompiledFormula[];\n /** Definition-time failures, keyed by formula column key. */\n invalid: Map<string, FormulaIssue>;\n fields: Map<string, FormulaFieldMeta>;\n /**\n * Union of every NON-formula field the set reads. The evaluator's cache\n * signature is built from exactly these, so a cache entry is invalidated when\n * an input changes and by nothing else.\n */\n inputKeys: string[];\n}\n\n/**\n * Validate and order a view's formula columns once, so per-row evaluation is a\n * walk and nothing more. Definition failures (syntax, unknown field, cycle) are\n * captured per key: one broken formula shows an error in its own column and\n * leaves every other column working.\n */\nexport function compileFormulaColumns(\n refs: readonly FormulaColumnRef[],\n fields: readonly FormulaFieldMeta[],\n): CompiledFormulaSet {\n const fieldMap = new Map<string, FormulaFieldMeta>(fields.map((f) => [f.key, f]));\n const invalid = new Map<string, FormulaIssue>();\n const compiled = new Map<string, CompiledFormula>();\n\n for (const ref of refs) {\n const checked = checkFormulaColumn({ ref, fields, existing: refs });\n if (!checked.ok) {\n invalid.set(ref.key, checked.issues[0]);\n continue;\n }\n compiled.set(ref.key, { ref, ast: checked.ast, deps: collectFieldRefs(checked.ast) });\n }\n\n // Dependency order. Cycles are already refused above, so this terminates.\n const order: CompiledFormula[] = [];\n const placed = new Set<string>();\n const place = (key: string, seen: Set<string>): void => {\n if (placed.has(key) || seen.has(key)) return;\n const entry = compiled.get(key);\n if (!entry) return;\n seen.add(key);\n for (const dep of entry.deps) {\n if (compiled.has(dep)) place(dep, seen);\n }\n seen.delete(key);\n placed.add(key);\n order.push(entry);\n };\n for (const ref of refs) place(ref.key, new Set());\n\n const inputKeys = new Set<string>();\n for (const entry of order) {\n for (const dep of entry.deps) {\n if (!compiled.has(dep)) inputKeys.add(dep);\n }\n }\n\n return { order, invalid, fields: fieldMap, inputKeys: [...inputKeys] };\n}\n\n/**\n * Evaluate every formula column for one row, in dependency order.\n * Returns a result for EVERY declared key \u2014 including the invalid ones, whose\n * definition error is what that cell shows.\n */\nexport function evaluateFormulaRow(\n set: CompiledFormulaSet,\n row: Record<string, unknown>,\n options: { now?: () => Date } = {},\n): Map<string, FormulaCellResult> {\n const computed = new Map<string, FormulaCellResult>();\n\n for (const [key, issue] of set.invalid) {\n computed.set(key, { state: 'error', value: null, issue });\n }\n\n for (const entry of set.order) {\n const outcome = evaluateAst(entry.ast, row, {\n fields: set.fields,\n now: options.now,\n computed,\n });\n computed.set(\n entry.ref.key,\n coerceToResultType(outcome, entry.ref.resultType, entry.ref.label),\n );\n }\n\n return computed;\n}\n\n/**\n * A row evaluator that computes each row at most once per change to its inputs.\n *\n * The cache is keyed on the row object AND a signature over just the fields the\n * formulas read. Object identity alone is not enough: the cell store mutates\n * `rowData` in place on an inline edit, so an identity-only cache would serve a\n * stale margin after the user changed the cost. The signature is over two or\n * three values, so it is far cheaper than re-walking the ASTs.\n */\nexport function createFormulaRowEvaluator(\n set: CompiledFormulaSet,\n options: { now?: () => Date } = {},\n): (row: Record<string, unknown>) => Map<string, FormulaCellResult> {\n const cache = new WeakMap<object, { signature: string; results: Map<string, FormulaCellResult> }>();\n\n const signatureOf = (row: Record<string, unknown>): string =>\n set.inputKeys\n .map((key) => {\n const value = row[key];\n if (value === null || value === undefined) return '\u0000';\n if (value instanceof Date) return String(value.getTime());\n return String(value);\n })\n .join('\u0001');\n\n return (row) => {\n if (!row || typeof row !== 'object') return new Map();\n const signature = signatureOf(row);\n const hit = cache.get(row);\n if (hit && hit.signature === signature) return hit.results;\n const results = evaluateFormulaRow(set, row, options);\n cache.set(row, { signature, results });\n return results;\n };\n}\n\n/**\n * One-shot convenience: parse, check and evaluate a single expression against a\n * row. Used by the editor's live preview, where there is no compiled set yet.\n */\nexport function evaluateExpression(\n expression: string,\n row: Record<string, unknown>,\n fields: readonly FormulaFieldMeta[],\n resultType: FormulaResultType = 'number',\n options: { now?: () => Date } = {},\n): FormulaCellResult {\n const parsed = parseFormula(expression);\n if (!parsed.ok) return { state: 'error', value: null, issue: parsed.issue };\n const outcome = evaluateAst(parsed.ast, row, {\n fields: new Map(fields.map((f) => [f.key, f])),\n now: options.now,\n });\n return coerceToResultType(outcome, resultType, expression);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["left", "right", "l", "r", "na", "nb"]
|
|
7
|
+
}
|