@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,118 @@
|
|
|
1
|
+
function normalizeHeader(header) {
|
|
2
|
+
return header.normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/ł/gi, "l").toLowerCase().replace(/[^a-z0-9]+/g, "");
|
|
3
|
+
}
|
|
4
|
+
function fieldKeys(field) {
|
|
5
|
+
const raw = [field.field, field.label, ...field.labels ?? []];
|
|
6
|
+
const keys = /* @__PURE__ */ new Set();
|
|
7
|
+
for (const value of raw) {
|
|
8
|
+
const key = normalizeHeader(value);
|
|
9
|
+
if (key) keys.add(key);
|
|
10
|
+
}
|
|
11
|
+
return [...keys];
|
|
12
|
+
}
|
|
13
|
+
function buildDefaultMapping(headers, fields) {
|
|
14
|
+
const index = /* @__PURE__ */ new Map();
|
|
15
|
+
for (const field of fields) {
|
|
16
|
+
for (const key of fieldKeys(field)) {
|
|
17
|
+
if (!index.has(key)) index.set(key, field.field);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const mapping = {};
|
|
21
|
+
const claimed = /* @__PURE__ */ new Set();
|
|
22
|
+
for (const header of headers) {
|
|
23
|
+
const target = index.get(normalizeHeader(header));
|
|
24
|
+
if (!target || claimed.has(target)) continue;
|
|
25
|
+
mapping[header] = target;
|
|
26
|
+
claimed.add(target);
|
|
27
|
+
}
|
|
28
|
+
return mapping;
|
|
29
|
+
}
|
|
30
|
+
function validateMapping(mapping, headers, fields, options = {}) {
|
|
31
|
+
const byField = new Map(fields.map((f) => [f.field, f]));
|
|
32
|
+
const headerSet = new Set(headers);
|
|
33
|
+
const issues = [];
|
|
34
|
+
const usedFields = /* @__PURE__ */ new Map();
|
|
35
|
+
for (const [header, target] of Object.entries(mapping)) {
|
|
36
|
+
if (!headerSet.has(header)) continue;
|
|
37
|
+
const field = byField.get(target);
|
|
38
|
+
if (!field) {
|
|
39
|
+
issues.push({ code: "unknown_field", header, field: target, label: header });
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (field.relation) {
|
|
43
|
+
issues.push({
|
|
44
|
+
code: "relation_unsupported",
|
|
45
|
+
header,
|
|
46
|
+
field: field.field,
|
|
47
|
+
label: header
|
|
48
|
+
});
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
usedFields.set(target, (usedFields.get(target) ?? 0) + 1);
|
|
52
|
+
}
|
|
53
|
+
for (const [target, count] of usedFields) {
|
|
54
|
+
if (count > 1) {
|
|
55
|
+
const field = byField.get(target);
|
|
56
|
+
issues.push({
|
|
57
|
+
code: "duplicate_field",
|
|
58
|
+
field: target,
|
|
59
|
+
label: field?.label ?? target
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (options.requireRequired !== false) {
|
|
64
|
+
for (const field of fields) {
|
|
65
|
+
if (!field.required || field.relation) continue;
|
|
66
|
+
if (!usedFields.has(field.field)) {
|
|
67
|
+
issues.push({ code: "missing_required", field: field.field, label: field.label });
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return issues;
|
|
72
|
+
}
|
|
73
|
+
function pruneMapping(mapping, issues) {
|
|
74
|
+
const badHeaders = new Set(
|
|
75
|
+
issues.filter((i) => i.header && i.code !== "missing_required").map((i) => i.header)
|
|
76
|
+
);
|
|
77
|
+
const pruned = {};
|
|
78
|
+
for (const [header, target] of Object.entries(mapping)) {
|
|
79
|
+
if (badHeaders.has(header)) continue;
|
|
80
|
+
pruned[header] = target;
|
|
81
|
+
}
|
|
82
|
+
return pruned;
|
|
83
|
+
}
|
|
84
|
+
function applyMapping(values, mapping) {
|
|
85
|
+
const out = {};
|
|
86
|
+
for (const [header, target] of Object.entries(mapping)) {
|
|
87
|
+
if (!(header in values)) continue;
|
|
88
|
+
const raw = values[header];
|
|
89
|
+
out[target] = raw === "" ? null : raw;
|
|
90
|
+
}
|
|
91
|
+
return out;
|
|
92
|
+
}
|
|
93
|
+
function fieldsFromColumns(columns, options = {}) {
|
|
94
|
+
const idColumn = options.idColumn ?? "id";
|
|
95
|
+
const fields = [];
|
|
96
|
+
for (const col of columns) {
|
|
97
|
+
const label = col.title ?? col.data;
|
|
98
|
+
const type = col.type === "numeric" ? "numeric" : col.type === "date" ? "date" : col.type === "boolean" ? "boolean" : "text";
|
|
99
|
+
fields.push({
|
|
100
|
+
field: col.data,
|
|
101
|
+
label,
|
|
102
|
+
labels: label === col.data ? void 0 : [col.data],
|
|
103
|
+
type,
|
|
104
|
+
relation: Boolean(col.exportValue),
|
|
105
|
+
matchKey: col.data === idColumn
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
return fields;
|
|
109
|
+
}
|
|
110
|
+
export {
|
|
111
|
+
applyMapping,
|
|
112
|
+
buildDefaultMapping,
|
|
113
|
+
fieldsFromColumns,
|
|
114
|
+
normalizeHeader,
|
|
115
|
+
pruneMapping,
|
|
116
|
+
validateMapping
|
|
117
|
+
};
|
|
118
|
+
//# sourceMappingURL=importMapping.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/backend/dynamic-table/utils/importMapping.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Headers \u2192 fields. Pure, dependency-free, shared by the server (which builds\n * the default mapping) and the panel (which lets a user override it).\n *\n * The default mapping is what makes **export \u2192 edit \u2192 re-import** work with\n * zero configuration: `utils/exportTable.ts` writes `col.title ?? col.data` as\n * the header, so a field whose `labels` include that title round-trips without\n * the user touching the mapping UI.\n */\nimport type {\n ImportFieldDef,\n ImportMapping,\n ImportMappingIssue,\n} from '../types/import';\nimport type { ColumnDef } from '../types/index';\n\n/**\n * Fold a header down to a comparison key: lowercase, diacritics stripped,\n * punctuation and whitespace collapsed. \"Numer faktury\", \"numer_faktury\" and\n * \"Numer Faktury \" all land on `numerfaktury`, which is the tolerance a user\n * pasting a colleague's spreadsheet actually needs.\n */\nexport function normalizeHeader(header: string): string {\n return header\n .normalize('NFD')\n // Combining marks \u2014 \u0142 has no decomposition, so it is handled below.\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/\u0142/gi, 'l')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '');\n}\n\n/** Every accepted spelling of a field, normalized. */\nfunction fieldKeys(field: ImportFieldDef): string[] {\n const raw = [field.field, field.label, ...(field.labels ?? [])];\n const keys = new Set<string>();\n for (const value of raw) {\n const key = normalizeHeader(value);\n if (key) keys.add(key);\n }\n return [...keys];\n}\n\n/**\n * Auto-map file headers onto target fields by normalized label.\n *\n * First match wins per field: a file with both \"Net amount\" and \"netAmount\"\n * maps the first and leaves the second unmapped rather than silently letting\n * the later column overwrite the earlier one.\n */\nexport function buildDefaultMapping(\n headers: string[],\n fields: ImportFieldDef[],\n): ImportMapping {\n const index = new Map<string, string>();\n for (const field of fields) {\n for (const key of fieldKeys(field)) {\n if (!index.has(key)) index.set(key, field.field);\n }\n }\n\n const mapping: ImportMapping = {};\n const claimed = new Set<string>();\n for (const header of headers) {\n const target = index.get(normalizeHeader(header));\n if (!target || claimed.has(target)) continue;\n mapping[header] = target;\n claimed.add(target);\n }\n return mapping;\n}\n\n/**\n * Check a mapping against the file's headers and the module's fields.\n *\n * Relation fields are reported as `relation_unsupported` rather than resolved:\n * the generic path cannot know whether \"Maersk\" is contractor `a1b2\u2026` and a\n * wrong guess writes the wrong record (spec A1).\n */\nexport function validateMapping(\n mapping: ImportMapping,\n headers: string[],\n fields: ImportFieldDef[],\n options: { requireRequired?: boolean } = {},\n): ImportMappingIssue[] {\n const byField = new Map(fields.map((f) => [f.field, f]));\n const headerSet = new Set(headers);\n const issues: ImportMappingIssue[] = [];\n const usedFields = new Map<string, number>();\n\n for (const [header, target] of Object.entries(mapping)) {\n if (!headerSet.has(header)) continue;\n const field = byField.get(target);\n if (!field) {\n issues.push({ code: 'unknown_field', header, field: target, label: header });\n continue;\n }\n if (field.relation) {\n issues.push({\n code: 'relation_unsupported',\n header,\n field: field.field,\n label: header,\n });\n continue;\n }\n usedFields.set(target, (usedFields.get(target) ?? 0) + 1);\n }\n\n for (const [target, count] of usedFields) {\n if (count > 1) {\n const field = byField.get(target);\n issues.push({\n code: 'duplicate_field',\n field: target,\n label: field?.label ?? target,\n });\n }\n }\n\n if (options.requireRequired !== false) {\n for (const field of fields) {\n if (!field.required || field.relation) continue;\n if (!usedFields.has(field.field)) {\n issues.push({ code: 'missing_required', field: field.field, label: field.label });\n }\n }\n }\n\n return issues;\n}\n\n/**\n * Drop mappings that `validateMapping` rejected, so a preview can still run on\n * the columns that ARE sound. A relation column being refused must not take the\n * other forty columns down with it.\n */\nexport function pruneMapping(\n mapping: ImportMapping,\n issues: ImportMappingIssue[],\n): ImportMapping {\n const badHeaders = new Set(\n issues.filter((i) => i.header && i.code !== 'missing_required').map((i) => i.header as string),\n );\n const pruned: ImportMapping = {};\n for (const [header, target] of Object.entries(mapping)) {\n if (badHeaders.has(header)) continue;\n pruned[header] = target;\n }\n return pruned;\n}\n\n/**\n * Apply a mapping to one parsed row. Unmapped headers are dropped; an empty\n * cell yields `null` so \"the user cleared this\" is distinguishable from \"the\n * column was not in the file at all\" (absent key).\n */\nexport function applyMapping(\n values: Record<string, string>,\n mapping: ImportMapping,\n): Record<string, string | null> {\n const out: Record<string, string | null> = {};\n for (const [header, target] of Object.entries(mapping)) {\n if (!(header in values)) continue;\n const raw = values[header];\n out[target] = raw === '' ? null : raw;\n }\n return out;\n}\n\n/**\n * Derive importable field defs from a table's own `ColumnDef`s.\n *\n * This is the generic path's default: whatever the grid shows and exports is\n * what it can read back. Columns that carry an `exportValue` hook are treated\n * as relation-shaped \u2014 a column whose stored cell value needs a projection to\n * become text cannot be reversed by parsing that text back (spec A1).\n */\nexport function fieldsFromColumns(\n columns: ColumnDef[],\n options: { idColumn?: string } = {},\n): ImportFieldDef[] {\n const idColumn = options.idColumn ?? 'id';\n const fields: ImportFieldDef[] = [];\n for (const col of columns) {\n const label = col.title ?? col.data;\n const type: ImportFieldDef['type'] =\n col.type === 'numeric' ? 'numeric'\n : col.type === 'date' ? 'date'\n : col.type === 'boolean' ? 'boolean'\n : 'text';\n fields.push({\n field: col.data,\n label,\n labels: label === col.data ? undefined : [col.data],\n type,\n relation: Boolean(col.exportValue),\n matchKey: col.data === idColumn,\n });\n }\n return fields;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import * as XLSX from "xlsx";
|
|
2
|
+
import { IMPORT_MAX_FILE_BYTES, IMPORT_MAX_ROWS } from "../types/import.js";
|
|
3
|
+
class ImportParseError extends Error {
|
|
4
|
+
constructor(code, message, details = {}) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = "ImportParseError";
|
|
7
|
+
this.code = code;
|
|
8
|
+
this.details = details;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function byteLength(input) {
|
|
12
|
+
if (typeof input === "string") {
|
|
13
|
+
return input.length * 2;
|
|
14
|
+
}
|
|
15
|
+
if (input instanceof Uint8Array) return input.byteLength;
|
|
16
|
+
return input.byteLength;
|
|
17
|
+
}
|
|
18
|
+
function cellToString(value) {
|
|
19
|
+
if (value === null || value === void 0) return "";
|
|
20
|
+
if (value instanceof Date) {
|
|
21
|
+
const iso = value.toISOString();
|
|
22
|
+
return Number.isNaN(value.getTime()) ? "" : iso.slice(0, 10);
|
|
23
|
+
}
|
|
24
|
+
if (typeof value === "boolean") return value ? "true" : "false";
|
|
25
|
+
return String(value).trim();
|
|
26
|
+
}
|
|
27
|
+
function normalizeHeaders(raw) {
|
|
28
|
+
const trimmed = raw.map((h) => cellToString(h));
|
|
29
|
+
let end = trimmed.length;
|
|
30
|
+
while (end > 0 && trimmed[end - 1] === "") end -= 1;
|
|
31
|
+
const seen = /* @__PURE__ */ new Map();
|
|
32
|
+
const headers = [];
|
|
33
|
+
for (let i = 0; i < end; i++) {
|
|
34
|
+
const base = trimmed[i] || `Column ${i + 1}`;
|
|
35
|
+
const count = (seen.get(base) ?? 0) + 1;
|
|
36
|
+
seen.set(base, count);
|
|
37
|
+
headers.push(count === 1 ? base : `${base} (${count})`);
|
|
38
|
+
}
|
|
39
|
+
return headers;
|
|
40
|
+
}
|
|
41
|
+
function parseImportFile(input, options = {}) {
|
|
42
|
+
const maxRows = options.maxRows ?? IMPORT_MAX_ROWS;
|
|
43
|
+
const maxBytes = options.maxBytes ?? IMPORT_MAX_FILE_BYTES;
|
|
44
|
+
const sheetIndex = options.sheetIndex ?? 0;
|
|
45
|
+
const size = byteLength(input);
|
|
46
|
+
if (size > maxBytes) {
|
|
47
|
+
throw new ImportParseError("file_too_large", "File exceeds the size limit", {
|
|
48
|
+
bytes: size,
|
|
49
|
+
limit: maxBytes
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
if (size === 0) {
|
|
53
|
+
throw new ImportParseError("empty_file", "File is empty");
|
|
54
|
+
}
|
|
55
|
+
let workbook;
|
|
56
|
+
try {
|
|
57
|
+
if (typeof input === "string") {
|
|
58
|
+
const text = input.charCodeAt(0) === 65279 ? input.slice(1) : input;
|
|
59
|
+
workbook = XLSX.read(text, { type: "string", raw: true });
|
|
60
|
+
} else {
|
|
61
|
+
const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);
|
|
62
|
+
workbook = XLSX.read(bytes, { type: "array", cellDates: true });
|
|
63
|
+
}
|
|
64
|
+
} catch (err) {
|
|
65
|
+
throw new ImportParseError("unreadable", "File could not be read as CSV or Excel", {
|
|
66
|
+
cause: err instanceof Error ? err.message : String(err)
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
const sheetName = workbook.SheetNames[sheetIndex];
|
|
70
|
+
const sheet = sheetName ? workbook.Sheets[sheetName] : void 0;
|
|
71
|
+
if (!sheet) {
|
|
72
|
+
throw new ImportParseError("empty_file", "Workbook contains no readable sheet");
|
|
73
|
+
}
|
|
74
|
+
const matrix = XLSX.utils.sheet_to_json(sheet, {
|
|
75
|
+
header: 1,
|
|
76
|
+
blankrows: false,
|
|
77
|
+
defval: "",
|
|
78
|
+
// Raw values, NOT the display text: a date cell must reach us as a `Date`
|
|
79
|
+
// (so it becomes `2026-08-03`) rather than as whatever `8/3/26` format the
|
|
80
|
+
// author happened to apply.
|
|
81
|
+
raw: true
|
|
82
|
+
});
|
|
83
|
+
if (!matrix.length) {
|
|
84
|
+
throw new ImportParseError("empty_file", "Sheet contains no rows");
|
|
85
|
+
}
|
|
86
|
+
const headers = normalizeHeaders(matrix[0] ?? []);
|
|
87
|
+
if (!headers.length) {
|
|
88
|
+
throw new ImportParseError("no_headers", "First row carries no column headers");
|
|
89
|
+
}
|
|
90
|
+
const body = matrix.slice(1);
|
|
91
|
+
const rows = [];
|
|
92
|
+
for (const line of body) {
|
|
93
|
+
const values = {};
|
|
94
|
+
let hasData = false;
|
|
95
|
+
for (let c = 0; c < headers.length; c++) {
|
|
96
|
+
const cell = cellToString(line[c]);
|
|
97
|
+
values[headers[c]] = cell;
|
|
98
|
+
if (cell !== "") hasData = true;
|
|
99
|
+
}
|
|
100
|
+
if (!hasData) continue;
|
|
101
|
+
rows.push({ sourceRowNumber: rows.length + 1, values });
|
|
102
|
+
if (rows.length > maxRows) {
|
|
103
|
+
throw new ImportParseError("too_many_rows", "File exceeds the row limit", {
|
|
104
|
+
// Report what the file actually holds so "split it in parts" is actionable.
|
|
105
|
+
count: body.filter(
|
|
106
|
+
(l) => l.some((v) => cellToString(v) !== "")
|
|
107
|
+
).length,
|
|
108
|
+
limit: maxRows
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (!rows.length) {
|
|
113
|
+
throw new ImportParseError("empty_file", "File has headers but no data rows");
|
|
114
|
+
}
|
|
115
|
+
return { headers, rows, sheetName };
|
|
116
|
+
}
|
|
117
|
+
export {
|
|
118
|
+
ImportParseError,
|
|
119
|
+
parseImportFile
|
|
120
|
+
};
|
|
121
|
+
//# sourceMappingURL=importParse.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/backend/dynamic-table/utils/importParse.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * File \u2192 rows. **SERVER-SIDE ONLY.**\n *\n * The browser uploads bytes; this runs in the route handler. Parsing in both\n * places is how a preview and its commit drift apart, so there is deliberately\n * no client entry point \u2014 `components/ImportPanel.tsx` does not import this\n * file, and a test asserts that it never starts to.\n *\n * `xlsx` (vendored as `@freighttech/xlsx@0.20.3`) reads BOTH formats: `XLSX.read`\n * sniffs a CSV buffer just as happily as a ZIP workbook, and `sheet_to_json`\n * flattens either into rows. No second CSV parser is needed.\n *\n * Precedent: `packages/facilities/.../services/excel-parse.service.ts`.\n */\nimport * as XLSX from 'xlsx';\nimport { IMPORT_MAX_FILE_BYTES, IMPORT_MAX_ROWS } from '../types/import';\n\nexport type ImportParseErrorCode =\n | 'file_too_large'\n | 'too_many_rows'\n | 'empty_file'\n | 'no_headers'\n | 'unreadable';\n\n/**\n * A parse failure the user can act on. Route handlers map `code` onto a\n * message; nothing here is localized, because `packages/ui` server code has no\n * request locale.\n */\nexport class ImportParseError extends Error {\n readonly code: ImportParseErrorCode;\n /** Interpolation values for the caller's i18n string (e.g. `{ count, limit }`). */\n readonly details: Record<string, unknown>;\n\n constructor(code: ImportParseErrorCode, message: string, details: Record<string, unknown> = {}) {\n super(message);\n this.name = 'ImportParseError';\n this.code = code;\n this.details = details;\n }\n}\n\nexport interface ParsedImportFile {\n /** Header labels in file order, blanks dropped, duplicates suffixed. */\n headers: string[];\n /** Data rows keyed by header. `sourceRowNumber` is the 1-based data row. */\n rows: Array<{ sourceRowNumber: number; values: Record<string, string> }>;\n sheetName: string;\n}\n\nexport interface ParseImportFileOptions {\n /** Max data rows accepted. Defaults to `IMPORT_MAX_ROWS` (1,000). */\n maxRows?: number;\n /** Max byte length accepted. Defaults to `IMPORT_MAX_FILE_BYTES` (10 MB). */\n maxBytes?: number;\n /** Sheet to read. Defaults to the first. */\n sheetIndex?: number;\n}\n\ntype ParseInput = ArrayBuffer | Uint8Array | string;\n\nfunction byteLength(input: ParseInput): number {\n if (typeof input === 'string') {\n // A rough upper bound is fine \u2014 the cap exists to stop pathological files,\n // not to be byte-exact on a string that was already fully materialized.\n return input.length * 2;\n }\n if (input instanceof Uint8Array) return input.byteLength;\n return input.byteLength;\n}\n\n/**\n * Turn a SheetJS cell value into the string the mapper works with.\n *\n * Everything downstream is string-shaped because that is what a spreadsheet\n * cell *is* to the user, and because the module's own zod validators already\n * own coercion. Dates are the one exception worth normalizing here: SheetJS\n * hands back a `Date` for a real date cell, and `String(date)` would produce a\n * locale-dependent blob that no validator accepts.\n */\nfunction cellToString(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (value instanceof Date) {\n // ISO date (no time) \u2014 the shape every date validator in the codebase takes.\n const iso = value.toISOString();\n return Number.isNaN(value.getTime()) ? '' : iso.slice(0, 10);\n }\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n return String(value).trim();\n}\n\n/**\n * Normalize the header row: trim, drop trailing blanks, and suffix duplicates\n * so `{ header: field }` mapping stays a total function. Two columns both\n * called \"Amount\" become \"Amount\" and \"Amount (2)\".\n */\nfunction normalizeHeaders(raw: unknown[]): string[] {\n const trimmed = raw.map((h) => cellToString(h));\n // Drop trailing empties \u2014 spreadsheets routinely carry phantom columns.\n let end = trimmed.length;\n while (end > 0 && trimmed[end - 1] === '') end -= 1;\n\n const seen = new Map<string, number>();\n const headers: string[] = [];\n for (let i = 0; i < end; i++) {\n const base = trimmed[i] || `Column ${i + 1}`;\n const count = (seen.get(base) ?? 0) + 1;\n seen.set(base, count);\n headers.push(count === 1 ? base : `${base} (${count})`);\n }\n return headers;\n}\n\n/**\n * Parse an uploaded `.xlsx` or `.csv` into headers + string-valued rows.\n *\n * Caps are checked BEFORE and immediately AFTER the read: the byte cap stops a\n * 50 MB workbook from expanding into 400 MB of heap, and the row cap is\n * enforced on the parsed sheet because a small file can still declare a huge\n * range.\n *\n * @throws {ImportParseError}\n */\nexport function parseImportFile(\n input: ParseInput,\n options: ParseImportFileOptions = {},\n): ParsedImportFile {\n const maxRows = options.maxRows ?? IMPORT_MAX_ROWS;\n const maxBytes = options.maxBytes ?? IMPORT_MAX_FILE_BYTES;\n const sheetIndex = options.sheetIndex ?? 0;\n\n const size = byteLength(input);\n if (size > maxBytes) {\n throw new ImportParseError('file_too_large', 'File exceeds the size limit', {\n bytes: size,\n limit: maxBytes,\n });\n }\n if (size === 0) {\n throw new ImportParseError('empty_file', 'File is empty');\n }\n\n let workbook: XLSX.WorkBook;\n try {\n if (typeof input === 'string') {\n // Strip a UTF-8 BOM \u2014 our own CSV export writes one so Excel picks the\n // encoding up, and SheetJS would otherwise fold it into header one.\n const text = input.charCodeAt(0) === 0xfeff ? input.slice(1) : input;\n // `raw: true` on a CSV read stops SheetJS type-sniffing every cell:\n // without it an invoice number like `FV/1/2026` is helpfully turned into\n // a date. Everything arrives as a string, which is what a CSV cell is.\n workbook = XLSX.read(text, { type: 'string', raw: true });\n } else {\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);\n // A real XLSX carries typed cells, so `cellDates` gives us `Date`\n // objects rather than serial numbers; `cellToString` renders them ISO.\n workbook = XLSX.read(bytes, { type: 'array', cellDates: true });\n }\n } catch (err) {\n throw new ImportParseError('unreadable', 'File could not be read as CSV or Excel', {\n cause: err instanceof Error ? err.message : String(err),\n });\n }\n\n const sheetName = workbook.SheetNames[sheetIndex];\n const sheet = sheetName ? workbook.Sheets[sheetName] : undefined;\n if (!sheet) {\n throw new ImportParseError('empty_file', 'Workbook contains no readable sheet');\n }\n\n const matrix = XLSX.utils.sheet_to_json<unknown[]>(sheet, {\n header: 1,\n blankrows: false,\n defval: '',\n // Raw values, NOT the display text: a date cell must reach us as a `Date`\n // (so it becomes `2026-08-03`) rather than as whatever `8/3/26` format the\n // author happened to apply.\n raw: true,\n });\n\n if (!matrix.length) {\n throw new ImportParseError('empty_file', 'Sheet contains no rows');\n }\n\n const headers = normalizeHeaders(matrix[0] ?? []);\n if (!headers.length) {\n throw new ImportParseError('no_headers', 'First row carries no column headers');\n }\n\n const body = matrix.slice(1);\n const rows: ParsedImportFile['rows'] = [];\n for (const line of body) {\n const values: Record<string, string> = {};\n let hasData = false;\n for (let c = 0; c < headers.length; c++) {\n const cell = cellToString((line as unknown[])[c]);\n values[headers[c]] = cell;\n if (cell !== '') hasData = true;\n }\n // A wholly blank line is spreadsheet padding, not a record.\n if (!hasData) continue;\n rows.push({ sourceRowNumber: rows.length + 1, values });\n\n if (rows.length > maxRows) {\n throw new ImportParseError('too_many_rows', 'File exceeds the row limit', {\n // Report what the file actually holds so \"split it in parts\" is actionable.\n count: body.filter((l) =>\n (l as unknown[]).some((v) => cellToString(v) !== ''),\n ).length,\n limit: maxRows,\n });\n }\n }\n\n if (!rows.length) {\n throw new ImportParseError('empty_file', 'File has headers but no data rows');\n }\n\n return { headers, rows, sheetName: sheetName as string };\n}\n"],
|
|
5
|
+
"mappings": "AAcA,YAAY,UAAU;AACtB,SAAS,uBAAuB,uBAAuB;AAchD,MAAM,yBAAyB,MAAM;AAAA,EAK1C,YAAY,MAA4B,SAAiB,UAAmC,CAAC,GAAG;AAC9F,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,EACjB;AACF;AAqBA,SAAS,WAAW,OAA2B;AAC7C,MAAI,OAAO,UAAU,UAAU;AAG7B,WAAO,MAAM,SAAS;AAAA,EACxB;AACA,MAAI,iBAAiB,WAAY,QAAO,MAAM;AAC9C,SAAO,MAAM;AACf;AAWA,SAAS,aAAa,OAAwB;AAC5C,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,MAAI,iBAAiB,MAAM;AAEzB,UAAM,MAAM,MAAM,YAAY;AAC9B,WAAO,OAAO,MAAM,MAAM,QAAQ,CAAC,IAAI,KAAK,IAAI,MAAM,GAAG,EAAE;AAAA,EAC7D;AACA,MAAI,OAAO,UAAU,UAAW,QAAO,QAAQ,SAAS;AACxD,SAAO,OAAO,KAAK,EAAE,KAAK;AAC5B;AAOA,SAAS,iBAAiB,KAA0B;AAClD,QAAM,UAAU,IAAI,IAAI,CAAC,MAAM,aAAa,CAAC,CAAC;AAE9C,MAAI,MAAM,QAAQ;AAClB,SAAO,MAAM,KAAK,QAAQ,MAAM,CAAC,MAAM,GAAI,QAAO;AAElD,QAAM,OAAO,oBAAI,IAAoB;AACrC,QAAM,UAAoB,CAAC;AAC3B,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,UAAM,OAAO,QAAQ,CAAC,KAAK,UAAU,IAAI,CAAC;AAC1C,UAAM,SAAS,KAAK,IAAI,IAAI,KAAK,KAAK;AACtC,SAAK,IAAI,MAAM,KAAK;AACpB,YAAQ,KAAK,UAAU,IAAI,OAAO,GAAG,IAAI,KAAK,KAAK,GAAG;AAAA,EACxD;AACA,SAAO;AACT;AAYO,SAAS,gBACd,OACA,UAAkC,CAAC,GACjB;AAClB,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,aAAa,QAAQ,cAAc;AAEzC,QAAM,OAAO,WAAW,KAAK;AAC7B,MAAI,OAAO,UAAU;AACnB,UAAM,IAAI,iBAAiB,kBAAkB,+BAA+B;AAAA,MAC1E,OAAO;AAAA,MACP,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,MAAI,SAAS,GAAG;AACd,UAAM,IAAI,iBAAiB,cAAc,eAAe;AAAA,EAC1D;AAEA,MAAI;AACJ,MAAI;AACF,QAAI,OAAO,UAAU,UAAU;AAG7B,YAAM,OAAO,MAAM,WAAW,CAAC,MAAM,QAAS,MAAM,MAAM,CAAC,IAAI;AAI/D,iBAAW,KAAK,KAAK,MAAM,EAAE,MAAM,UAAU,KAAK,KAAK,CAAC;AAAA,IAC1D,OAAO;AACL,YAAM,QAAQ,iBAAiB,aAAa,QAAQ,IAAI,WAAW,KAAK;AAGxE,iBAAW,KAAK,KAAK,OAAO,EAAE,MAAM,SAAS,WAAW,KAAK,CAAC;AAAA,IAChE;AAAA,EACF,SAAS,KAAK;AACZ,UAAM,IAAI,iBAAiB,cAAc,0CAA0C;AAAA,MACjF,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IACxD,CAAC;AAAA,EACH;AAEA,QAAM,YAAY,SAAS,WAAW,UAAU;AAChD,QAAM,QAAQ,YAAY,SAAS,OAAO,SAAS,IAAI;AACvD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,iBAAiB,cAAc,qCAAqC;AAAA,EAChF;AAEA,QAAM,SAAS,KAAK,MAAM,cAAyB,OAAO;AAAA,IACxD,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,QAAQ;AAAA;AAAA;AAAA;AAAA,IAIR,KAAK;AAAA,EACP,CAAC;AAED,MAAI,CAAC,OAAO,QAAQ;AAClB,UAAM,IAAI,iBAAiB,cAAc,wBAAwB;AAAA,EACnE;AAEA,QAAM,UAAU,iBAAiB,OAAO,CAAC,KAAK,CAAC,CAAC;AAChD,MAAI,CAAC,QAAQ,QAAQ;AACnB,UAAM,IAAI,iBAAiB,cAAc,qCAAqC;AAAA,EAChF;AAEA,QAAM,OAAO,OAAO,MAAM,CAAC;AAC3B,QAAM,OAAiC,CAAC;AACxC,aAAW,QAAQ,MAAM;AACvB,UAAM,SAAiC,CAAC;AACxC,QAAI,UAAU;AACd,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAM,OAAO,aAAc,KAAmB,CAAC,CAAC;AAChD,aAAO,QAAQ,CAAC,CAAC,IAAI;AACrB,UAAI,SAAS,GAAI,WAAU;AAAA,IAC7B;AAEA,QAAI,CAAC,QAAS;AACd,SAAK,KAAK,EAAE,iBAAiB,KAAK,SAAS,GAAG,OAAO,CAAC;AAEtD,QAAI,KAAK,SAAS,SAAS;AACzB,YAAM,IAAI,iBAAiB,iBAAiB,8BAA8B;AAAA;AAAA,QAExE,OAAO,KAAK;AAAA,UAAO,CAAC,MACjB,EAAgB,KAAK,CAAC,MAAM,aAAa,CAAC,MAAM,EAAE;AAAA,QACrD,EAAE;AAAA,QACF,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,CAAC,KAAK,QAAQ;AAChB,UAAM,IAAI,iBAAiB,cAAc,mCAAmC;AAAA,EAC9E;AAEA,SAAO,EAAE,SAAS,MAAM,UAA+B;AACzD;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
function lookupColumnDataKey(ref) {
|
|
3
|
+
return `lookup__${ref.source}__${ref.field}`;
|
|
4
|
+
}
|
|
5
|
+
function isLookupColumnKey(key) {
|
|
6
|
+
return key.startsWith("lookup__");
|
|
7
|
+
}
|
|
8
|
+
function buildLookupColumnDefs(refs) {
|
|
9
|
+
return refs.map((r) => ({
|
|
10
|
+
data: lookupColumnDataKey(r),
|
|
11
|
+
title: r.label,
|
|
12
|
+
readOnly: true,
|
|
13
|
+
renderer: (value) => {
|
|
14
|
+
const isEmpty = value == null || value === "";
|
|
15
|
+
return /* @__PURE__ */ jsx("span", { className: isEmpty ? "text-m3-on-surface-variant" : void 0, children: isEmpty ? "\u2014" : String(value) });
|
|
16
|
+
}
|
|
17
|
+
}));
|
|
18
|
+
}
|
|
19
|
+
function lookupColumnsToParam(refs) {
|
|
20
|
+
return refs.map((r) => `${r.source}:${r.field}`).join(",");
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
buildLookupColumnDefs,
|
|
24
|
+
isLookupColumnKey,
|
|
25
|
+
lookupColumnDataKey,
|
|
26
|
+
lookupColumnsToParam
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=lookupColumns.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/backend/dynamic-table/utils/lookupColumns.tsx"],
|
|
4
|
+
"sourcesContent": ["import * as React from 'react'\nimport type { ColumnDef } from '../types/index'\nimport type { LookupColumnRef } from '../types/perspective'\n\n/**\n * Row field / column data key for a linked (lookup) column. The server enriches\n * each row with this key (see `@freighttech/table-lookups` resolver), and the\n * grid renders a read-only column for it. Keeping the `lookup__` prefix matches\n * the shipped convention; the `<source>__<field>` tail makes the key derivable on\n * both client and server with no stored column key.\n */\nexport function lookupColumnDataKey(ref: { source: string; field: string }): string {\n return `lookup__${ref.source}__${ref.field}`\n}\n\n/** True when a column data key belongs to a linked (lookup) column. */\nexport function isLookupColumnKey(key: string): boolean {\n return key.startsWith('lookup__')\n}\n\n/**\n * Build read-only DynamicTable column defs for a perspective's linked columns.\n * The cell value lives at `row[lookup__<source>__<field>]`, attached server-side.\n * Linked columns are never editable (editing would write back to the source,\n * breaking the unidirectional rule), so every column is `readOnly`.\n */\nexport function buildLookupColumnDefs(refs: LookupColumnRef[]): ColumnDef[] {\n return refs.map((r) => ({\n data: lookupColumnDataKey(r),\n title: r.label,\n readOnly: true,\n renderer: (value: unknown) => {\n const isEmpty = value == null || value === ''\n return (\n <span className={isEmpty ? 'text-m3-on-surface-variant' : undefined}>\n {isEmpty ? '\u2014' : String(value)}\n </span>\n )\n },\n }))\n}\n\n/** Serialize a perspective's linked columns into the `lookups` query param value\n * (`source:field,source:field`). Empty when there are no linked columns. */\nexport function lookupColumnsToParam(refs: LookupColumnRef[]): string {\n return refs.map((r) => `${r.source}:${r.field}`).join(',')\n}\n"],
|
|
5
|
+
"mappings": "AAkCQ;AAvBD,SAAS,oBAAoB,KAAgD;AAClF,SAAO,WAAW,IAAI,MAAM,KAAK,IAAI,KAAK;AAC5C;AAGO,SAAS,kBAAkB,KAAsB;AACtD,SAAO,IAAI,WAAW,UAAU;AAClC;AAQO,SAAS,sBAAsB,MAAsC;AAC1E,SAAO,KAAK,IAAI,CAAC,OAAO;AAAA,IACtB,MAAM,oBAAoB,CAAC;AAAA,IAC3B,OAAO,EAAE;AAAA,IACT,UAAU;AAAA,IACV,UAAU,CAAC,UAAmB;AAC5B,YAAM,UAAU,SAAS,QAAQ,UAAU;AAC3C,aACE,oBAAC,UAAK,WAAW,UAAU,+BAA+B,QACvD,oBAAU,WAAM,OAAO,KAAK,GAC/B;AAAA,IAEJ;AAAA,EACF,EAAE;AACJ;AAIO,SAAS,qBAAqB,MAAiC;AACpE,SAAO,KAAK,IAAI,CAAC,MAAM,GAAG,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,GAAG;AAC3D;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { BASE_VIEW_PERSPECTIVE_NAME, isTableViewMode } from "../types/perspective.js";
|
|
2
|
+
import { isAggregationFn } from "../types/grouping.js";
|
|
3
|
+
import { parseConditionalFormats } from "./conditionalFormat.js";
|
|
4
|
+
import { parseFormulaColumns } from "./formulaColumns.js";
|
|
5
|
+
import { parseRollupColumns } from "./rollupColumns.js";
|
|
6
|
+
function parseLookupColumns(raw) {
|
|
7
|
+
if (!Array.isArray(raw)) return [];
|
|
8
|
+
const out = [];
|
|
9
|
+
for (const entry of raw) {
|
|
10
|
+
if (!entry || typeof entry !== "object") continue;
|
|
11
|
+
const { source, field, label } = entry;
|
|
12
|
+
if (typeof source !== "string" || !source) continue;
|
|
13
|
+
if (typeof field !== "string" || !field) continue;
|
|
14
|
+
out.push({ source, field, label: typeof label === "string" && label ? label : field });
|
|
15
|
+
}
|
|
16
|
+
return out;
|
|
17
|
+
}
|
|
18
|
+
function parseAggregations(raw) {
|
|
19
|
+
if (!Array.isArray(raw)) return [];
|
|
20
|
+
const out = [];
|
|
21
|
+
for (const entry of raw) {
|
|
22
|
+
if (!entry || typeof entry !== "object") continue;
|
|
23
|
+
const { id, field, fn, dimension } = entry;
|
|
24
|
+
if (typeof field !== "string" || !field) continue;
|
|
25
|
+
if (!isAggregationFn(fn)) continue;
|
|
26
|
+
const rule = {
|
|
27
|
+
id: typeof id === "string" && id ? id : `agg-${field}`,
|
|
28
|
+
field,
|
|
29
|
+
fn
|
|
30
|
+
};
|
|
31
|
+
if (typeof dimension === "string" && dimension) rule.dimension = dimension;
|
|
32
|
+
out.push(rule);
|
|
33
|
+
}
|
|
34
|
+
return out;
|
|
35
|
+
}
|
|
36
|
+
function parseViewMode(raw) {
|
|
37
|
+
if (raw === void 0 || raw === null) return void 0;
|
|
38
|
+
return isTableViewMode(raw) ? raw : "table";
|
|
39
|
+
}
|
|
40
|
+
function parsePerspectiveOrigin(raw) {
|
|
41
|
+
if (!raw || typeof raw !== "object") return void 0;
|
|
42
|
+
const { templateId, version, name, copiedAt } = raw;
|
|
43
|
+
if (typeof templateId !== "string" || !templateId) return void 0;
|
|
44
|
+
if (typeof version !== "string" || !version) return void 0;
|
|
45
|
+
return {
|
|
46
|
+
templateId,
|
|
47
|
+
version,
|
|
48
|
+
name: typeof name === "string" ? name : "",
|
|
49
|
+
copiedAt: typeof copiedAt === "string" ? copiedAt : ""
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function parsePerspectivePublication(raw) {
|
|
53
|
+
if (!raw || typeof raw !== "object") return void 0;
|
|
54
|
+
const { roleIds, publishedAt } = raw;
|
|
55
|
+
if (!Array.isArray(roleIds)) return void 0;
|
|
56
|
+
const ids = roleIds.filter((id) => typeof id === "string" && id.length > 0);
|
|
57
|
+
if (!ids.length) return void 0;
|
|
58
|
+
return { roleIds: ids, publishedAt: typeof publishedAt === "string" ? publishedAt : "" };
|
|
59
|
+
}
|
|
60
|
+
function templateVersionOf(dto) {
|
|
61
|
+
return dto.updatedAt || dto.createdAt;
|
|
62
|
+
}
|
|
63
|
+
function apiTemplateToDynamicTable(dto, allColumns, defaultHiddenColumns = []) {
|
|
64
|
+
const base = apiToDynamicTable(dto, allColumns, defaultHiddenColumns);
|
|
65
|
+
return {
|
|
66
|
+
...base,
|
|
67
|
+
// A template is a thing to copy, never a thing that is your default or your
|
|
68
|
+
// base view — drop both flags rather than carrying them into someone's space.
|
|
69
|
+
isDefault: false,
|
|
70
|
+
isBaseView: false,
|
|
71
|
+
publication: void 0,
|
|
72
|
+
roleId: dto.roleId,
|
|
73
|
+
roleName: dto.roleName ?? null,
|
|
74
|
+
version: templateVersionOf(dto)
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function apiToDynamicTable(dto, allColumns, defaultHiddenColumns = []) {
|
|
78
|
+
const { columnOrder = [], columnVisibility = {} } = dto.settings;
|
|
79
|
+
const visible = columnOrder.length > 0 ? columnOrder.filter((col) => columnVisibility[col] !== false) : allColumns.filter((col) => !defaultHiddenColumns.includes(col));
|
|
80
|
+
const hidden = allColumns.filter((col) => !visible.includes(col));
|
|
81
|
+
const unseenColumns = columnOrder.length > 0 ? allColumns.filter(
|
|
82
|
+
(col) => !columnOrder.includes(col) && !(col in columnVisibility)
|
|
83
|
+
) : [];
|
|
84
|
+
const apiFilters = dto.settings.filters;
|
|
85
|
+
const filters = Array.isArray(apiFilters) ? apiFilters : apiFilters?.rows ?? [];
|
|
86
|
+
const color = apiFilters?._color;
|
|
87
|
+
const sorting = (dto.settings.sorting ?? []).map((s) => ({
|
|
88
|
+
id: s.id,
|
|
89
|
+
field: s.id,
|
|
90
|
+
direction: s.desc ? "desc" : "asc"
|
|
91
|
+
}));
|
|
92
|
+
const grouping = (dto.settings.grouping ?? []).map((g) => ({
|
|
93
|
+
id: g.id,
|
|
94
|
+
field: g.field,
|
|
95
|
+
direction: g.desc ? "desc" : "asc"
|
|
96
|
+
}));
|
|
97
|
+
const aggregations = parseAggregations(apiFilters?._aggregations);
|
|
98
|
+
const lookupColumns = parseLookupColumns(apiFilters?._lookups);
|
|
99
|
+
const rollupColumns = parseRollupColumns(apiFilters?._rollups);
|
|
100
|
+
const rawDateFormat = apiFilters?._dateFormat;
|
|
101
|
+
const dateFormat = typeof rawDateFormat === "string" && rawDateFormat ? rawDateFormat : void 0;
|
|
102
|
+
const conditionalFormats = parseConditionalFormats(apiFilters?._conditionalFormats);
|
|
103
|
+
const frozenColumns = Array.isArray(apiFilters?._frozenColumns) ? apiFilters._frozenColumns.filter(
|
|
104
|
+
(k) => typeof k === "string" && k.length > 0
|
|
105
|
+
) : void 0;
|
|
106
|
+
const formulas = parseFormulaColumns(apiFilters?._formulas);
|
|
107
|
+
const viewMode = parseViewMode(apiFilters?._viewMode);
|
|
108
|
+
const origin = parsePerspectiveOrigin(apiFilters?._origin);
|
|
109
|
+
const publication = parsePerspectivePublication(apiFilters?._published);
|
|
110
|
+
const isBaseView = apiFilters?._baseView === true && dto.name === BASE_VIEW_PERSPECTIVE_NAME;
|
|
111
|
+
return {
|
|
112
|
+
id: dto.id,
|
|
113
|
+
name: dto.name,
|
|
114
|
+
color,
|
|
115
|
+
columns: { visible, hidden },
|
|
116
|
+
unseenColumns,
|
|
117
|
+
filters,
|
|
118
|
+
sorting,
|
|
119
|
+
grouping,
|
|
120
|
+
aggregations,
|
|
121
|
+
lookupColumns,
|
|
122
|
+
rollupColumns,
|
|
123
|
+
formulas,
|
|
124
|
+
dateFormat,
|
|
125
|
+
conditionalFormats,
|
|
126
|
+
frozenColumns,
|
|
127
|
+
viewMode,
|
|
128
|
+
isDefault: dto.isDefault,
|
|
129
|
+
isBaseView,
|
|
130
|
+
origin,
|
|
131
|
+
publication
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function dynamicTableToApi(config) {
|
|
135
|
+
const columnVisibility = {};
|
|
136
|
+
config.columns.visible.forEach((col) => columnVisibility[col] = true);
|
|
137
|
+
config.columns.hidden.forEach((col) => columnVisibility[col] = false);
|
|
138
|
+
return {
|
|
139
|
+
columnOrder: config.columns.visible,
|
|
140
|
+
columnVisibility,
|
|
141
|
+
// `v: 2` marks the current filter shape. The upstream perspectives service
|
|
142
|
+
// (`maybeMigrateLegacyFilterValues`) DROPS any `filters` object that lacks
|
|
143
|
+
// either `v === 2` or a `root` key, treating it as a legacy value it can't
|
|
144
|
+
// migrate — so without this marker the saved filters silently vanish on load.
|
|
145
|
+
// `_aggregations` rides here too (passthrough record), since the settings
|
|
146
|
+
// schema would strip it as an unknown top-level key.
|
|
147
|
+
filters: {
|
|
148
|
+
v: 2,
|
|
149
|
+
rows: config.filters,
|
|
150
|
+
_color: config.color,
|
|
151
|
+
_aggregations: config.aggregations ?? [],
|
|
152
|
+
_lookups: config.lookupColumns ?? [],
|
|
153
|
+
_rollups: config.rollupColumns ?? [],
|
|
154
|
+
_dateFormat: config.dateFormat,
|
|
155
|
+
_conditionalFormats: config.conditionalFormats ?? [],
|
|
156
|
+
_formulas: config.formulas ?? [],
|
|
157
|
+
// Written only when the view actually pins something, so a view that has
|
|
158
|
+
// never used the feature does not grow an empty key — same rule as
|
|
159
|
+
// `_viewMode` below.
|
|
160
|
+
...config.frozenColumns && config.frozenColumns.length > 0 ? { _frozenColumns: config.frozenColumns } : {},
|
|
161
|
+
// Written only when the view has a mode, so a table-only view does not
|
|
162
|
+
// grow a key. `parseViewMode` treats absent and 'table' identically.
|
|
163
|
+
...config.viewMode ? { _viewMode: config.viewMode } : {},
|
|
164
|
+
// Personalization metadata — see `apiToDynamicTable` for why it cannot
|
|
165
|
+
// live at the top level. Written only when set, so a plain personal view
|
|
166
|
+
// does not grow three null keys.
|
|
167
|
+
...config.origin ? { _origin: config.origin } : {},
|
|
168
|
+
...config.publication ? { _published: config.publication } : {},
|
|
169
|
+
...config.isBaseView ? { _baseView: true } : {}
|
|
170
|
+
},
|
|
171
|
+
sorting: config.sorting.map((s) => ({
|
|
172
|
+
id: s.field,
|
|
173
|
+
desc: s.direction === "desc"
|
|
174
|
+
})),
|
|
175
|
+
grouping: (config.grouping ?? []).map((g) => ({
|
|
176
|
+
id: g.id,
|
|
177
|
+
field: g.field,
|
|
178
|
+
desc: g.direction === "desc"
|
|
179
|
+
}))
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
export {
|
|
183
|
+
apiTemplateToDynamicTable,
|
|
184
|
+
apiToDynamicTable,
|
|
185
|
+
dynamicTableToApi,
|
|
186
|
+
parsePerspectiveOrigin,
|
|
187
|
+
parsePerspectivePublication,
|
|
188
|
+
parseViewMode,
|
|
189
|
+
templateVersionOf
|
|
190
|
+
};
|
|
191
|
+
//# sourceMappingURL=perspectiveTransforms.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/backend/dynamic-table/utils/perspectiveTransforms.ts"],
|
|
4
|
+
"sourcesContent": ["import type { PerspectiveConfig, FilterRow, SortRule, LookupColumnRef } from '../types/index'\nimport type {\n PerspectiveOrigin,\n PerspectivePublication,\n PerspectiveTemplate,\n} from '../types/perspective'\nimport { BASE_VIEW_PERSPECTIVE_NAME, isTableViewMode } from '../types/perspective'\nimport type { TableViewMode } from '../types/perspective'\nimport type { GroupRule, AggregationRule, AggregationFn } from '../types/grouping'\nimport { isAggregationFn } from '../types/grouping'\nimport { parseConditionalFormats } from './conditionalFormat'\nimport { parseFormulaColumns } from './formulaColumns'\nimport { parseRollupColumns } from './rollupColumns'\nimport type {\n PerspectiveDto,\n PerspectiveSettings,\n RolePerspectiveDto,\n} from '@open-mercato/shared/modules/perspectives/types'\n\n/**\n * @deprecated Collapsed: `PerspectiveConfig` now carries `conditionalFormats`\n * itself, so this is a plain alias. Use `PerspectiveConfig`.\n */\nexport type DynamicTablePerspectiveConfig = PerspectiveConfig\n\n/**\n * Defensively parse the `_lookups` smuggled inside `settings.filters`. Drops\n * anything that isn't a well-formed `{ source, field, label }` so a malformed or\n * legacy value can never crash the table.\n */\nfunction parseLookupColumns(raw: unknown): LookupColumnRef[] {\n if (!Array.isArray(raw)) return []\n const out: LookupColumnRef[] = []\n for (const entry of raw) {\n if (!entry || typeof entry !== 'object') continue\n const { source, field, label } = entry as Record<string, unknown>\n if (typeof source !== 'string' || !source) continue\n if (typeof field !== 'string' || !field) continue\n out.push({ source, field, label: typeof label === 'string' && label ? label : field })\n }\n return out\n}\n\n/**\n * Defensively parse the `_aggregations` smuggled inside `settings.filters`.\n * Drops anything that isn't a well-formed rule so a malformed/legacy value\n * can never crash the table.\n *\n * The function whitelist is `isAggregationFn` \u2014 i.e. `AGGREGATION_FNS` in\n * `types/grouping.ts`, the single source of truth. It used to be a local\n * `['sum']` literal, which meant a view saved with any other function silently\n * lost its rules on reload. That is also the forward-compatibility contract:\n * a view saved by a NEWER client carrying an unknown `fn` degrades to dropping\n * that one rule instead of throwing.\n */\nfunction parseAggregations(raw: unknown): AggregationRule[] {\n if (!Array.isArray(raw)) return []\n const out: AggregationRule[] = []\n for (const entry of raw) {\n if (!entry || typeof entry !== 'object') continue\n const { id, field, fn, dimension } = entry as Record<string, unknown>\n if (typeof field !== 'string' || !field) continue\n if (!isAggregationFn(fn)) continue\n const rule: AggregationRule = {\n id: typeof id === 'string' && id ? id : `agg-${field}`,\n field,\n fn: fn as AggregationFn,\n }\n // Carry the partition column through the round-trip. Dropping it would\n // turn a saved per-currency breakdown back into a single cross-currency\n // number on the next page load \u2014 silently, and looking correct.\n if (typeof dimension === 'string' && dimension) rule.dimension = dimension\n out.push(rule)\n }\n return out\n}\n\n/**\n * Defensively parse the `_viewMode` smuggled inside `settings.filters`.\n *\n * Same forward-compatibility contract as `parseAggregations`: a value written\n * by a NEWER client that we do not recognise degrades to `'table'` rather than\n * throwing. A saved view is data a user relies on; it must never be able to\n * break the page that reads it.\n *\n * `undefined` in \u21D2 `undefined` out, so \"never chosen\" survives a round-trip and\n * a host's own default (if it has one) still applies.\n */\nexport function parseViewMode(raw: unknown): TableViewMode | undefined {\n if (raw === undefined || raw === null) return undefined;\n return isTableViewMode(raw) ? raw : 'table';\n}\n\n/**\n * Defensively parse `_origin` \u2014 the record of which shared template a view was\n * copied from, and at which version. A malformed or partial value is dropped\n * rather than half-trusted: a wrong `version` would later claim \"the template\n * changed\" (or hide that it did), which is worse than not knowing.\n */\nexport function parsePerspectiveOrigin(raw: unknown): PerspectiveOrigin | undefined {\n if (!raw || typeof raw !== 'object') return undefined\n const { templateId, version, name, copiedAt } = raw as Record<string, unknown>\n if (typeof templateId !== 'string' || !templateId) return undefined\n if (typeof version !== 'string' || !version) return undefined\n return {\n templateId,\n version,\n name: typeof name === 'string' ? name : '',\n copiedAt: typeof copiedAt === 'string' ? copiedAt : '',\n }\n}\n\n/** Defensively parse `_published` \u2014 which roles this view is shared with. */\nexport function parsePerspectivePublication(raw: unknown): PerspectivePublication | undefined {\n if (!raw || typeof raw !== 'object') return undefined\n const { roleIds, publishedAt } = raw as Record<string, unknown>\n if (!Array.isArray(roleIds)) return undefined\n const ids = roleIds.filter((id): id is string => typeof id === 'string' && id.length > 0)\n if (!ids.length) return undefined\n return { roleIds: ids, publishedAt: typeof publishedAt === 'string' ? publishedAt : '' }\n}\n\n/**\n * The version stamp a copy records. `updatedAt` when the template has been\n * re-published, else `createdAt` \u2014 never empty, so \"has it changed since I\n * copied it?\" is always answerable.\n */\nexport function templateVersionOf(dto: { updatedAt?: string | null; createdAt: string }): string {\n return dto.updatedAt || dto.createdAt\n}\n\n/**\n * Convert a ROLE-scoped perspective DTO into a shared template.\n *\n * Same settings shape as a personal view \u2014 a template IS a view someone\n * published \u2014 plus the role it is published to and the version stamp a copy\n * records. Deliberately reuses `apiToDynamicTable` so a template can never\n * decode differently from the view it was made from.\n */\nexport function apiTemplateToDynamicTable(\n dto: RolePerspectiveDto,\n allColumns: string[],\n defaultHiddenColumns: string[] = [],\n): PerspectiveTemplate {\n const base = apiToDynamicTable(dto, allColumns, defaultHiddenColumns)\n return {\n ...base,\n // A template is a thing to copy, never a thing that is your default or your\n // base view \u2014 drop both flags rather than carrying them into someone's space.\n isDefault: false,\n isBaseView: false,\n publication: undefined,\n roleId: dto.roleId,\n roleName: dto.roleName ?? null,\n version: templateVersionOf(dto),\n }\n}\n\n/**\n * Convert a perspective DTO from the API into a DynamicTable PerspectiveConfig.\n * Handles the mapping between API format (columnOrder, columnVisibility, etc.)\n * and DynamicTable format (visible/hidden arrays, FilterRow[], SortRule[]).\n */\nexport function apiToDynamicTable(\n dto: PerspectiveDto,\n allColumns: string[],\n defaultHiddenColumns: string[] = [],\n): DynamicTablePerspectiveConfig {\n const { columnOrder = [], columnVisibility = {} } = dto.settings\n\n // A perspective saved before column config was persisted (or migrated from a\n // legacy shape) has an empty `columnOrder`. Falling back to `allColumns` there\n // would reveal every column the table declares hidden by default \u2014 the\n // \"phantom fields in my saved view\" report. Honour the table's defaults\n // instead; an explicit `columnOrder` still wins outright.\n const visible =\n columnOrder.length > 0\n ? columnOrder.filter((col) => columnVisibility[col] !== false)\n : allColumns.filter((col) => !defaultHiddenColumns.includes(col))\n const hidden = allColumns.filter((col) => !visible.includes(col))\n\n /**\n * Columns this saved view has NEVER EXPRESSED AN OPINION ABOUT.\n *\n * `hidden` above cannot answer that question \u2014 it is DERIVED, \"everything the\n * table declares that is not visible\", so a column added to the table config\n * after this row was written is indistinguishable from one the user hid on\n * purpose. The only place the difference survives is the raw stored maps: a\n * key absent from BOTH `columnOrder` and `columnVisibility` was never decided,\n * because saving writes an entry for every column either way\n * (`dynamicTableToApi` below).\n *\n * Computed here rather than in `resolvePerspectiveState` for exactly that\n * reason: by the time the config reaches the resolver the raw maps are gone.\n * An empty `columnOrder` (a legacy row) means the view has no column opinions\n * at all, and its defaults are already being honoured above \u2014 so nothing is\n * \"unseen\" there either.\n */\n const unseenColumns =\n columnOrder.length > 0\n ? allColumns.filter(\n (col) => !columnOrder.includes(col) && !(col in columnVisibility),\n )\n : []\n\n const apiFilters = dto.settings.filters as Record<string, unknown> | undefined\n const filters: FilterRow[] = Array.isArray(apiFilters)\n ? (apiFilters as FilterRow[])\n : ((apiFilters?.rows as FilterRow[]) ?? [])\n const color = apiFilters?._color as PerspectiveConfig['color']\n\n const sorting: SortRule[] = (dto.settings.sorting ?? []).map((s) => ({\n id: s.id,\n field: s.id,\n direction: (s.desc ? 'desc' : 'asc') as 'asc' | 'desc',\n }))\n\n const grouping: GroupRule[] = (dto.settings.grouping ?? []).map((g) => ({\n id: g.id,\n field: g.field,\n direction: (g.desc ? 'desc' : 'asc') as 'asc' | 'desc',\n }))\n\n // Aggregations ride inside `filters._aggregations` \u2014 the upstream settings\n // schema strips unknown top-level keys, but `filters` is a passthrough record\n // (same channel as `_color`).\n const aggregations = parseAggregations(apiFilters?._aggregations)\n\n // Linked (lookup) columns ride the same `filters` passthrough channel as\n // `_aggregations`/`_color`.\n const lookupColumns = parseLookupColumns(apiFilters?._lookups)\n\n // Rollup (\"summarised\") columns \u2014 the one-to-many direction \u2014 ride the same\n // channel. A top-level `rollups` key would be stripped by the settings schema\n // and the columns would vanish on the first reload.\n const rollupColumns = parseRollupColumns(apiFilters?._rollups)\n\n // View-scoped date/time format rides the same passthrough channel. Opaque to\n // the table; only a well-formed string survives (anything else \u2192 undefined,\n // so renderers keep their default).\n const rawDateFormat = apiFilters?._dateFormat\n const dateFormat = typeof rawDateFormat === 'string' && rawDateFormat ? rawDateFormat : undefined\n\n // View-scoped conditional formatting (\"Highlighting\") rides the same\n // passthrough channel. Same trap as `_aggregations`: a top-level key would be\n // stripped by the settings schema and the rules would vanish on reload.\n const conditionalFormats = parseConditionalFormats(apiFilters?._conditionalFormats)\n\n // Frozen (pinned sticky-left) columns ride the same passthrough channel, and\n // for the same reason \u2014 measured, not assumed: saving a TOP-LEVEL\n // `frozenColumns` against the running API returns 200 OK and the key never\n // reaches the database, because the upstream settings schema is a bare\n // `z.object` whose vocabulary is columnOrder/columnVisibility/filters/\n // sorting/grouping/pageSize/searchValue, and Zod strips the rest (HEDGE-102).\n //\n // Defensive by construction, like the parsers around it: a legacy or\n // hand-edited view that stored a non-array, or an array with non-string\n // entries, loses the malformed parts rather than pinning `undefined` and\n // wedging the sticky-offset maths.\n const frozenColumns = Array.isArray(apiFilters?._frozenColumns)\n ? (apiFilters._frozenColumns as unknown[]).filter(\n (k): k is string => typeof k === 'string' && k.length > 0,\n )\n : undefined\n\n // Calculated (\"formula\") columns ride the same passthrough channel. The\n // parser is defensive by construction \u2014 a legacy or hand-edited view drops\n // the malformed entries rather than crashing the table. Do not hand-roll a\n // second one.\n const formulas = parseFormulaColumns(apiFilters?._formulas)\n\n // Personalization metadata rides the same passthrough channel, for the same\n // reason: the upstream settings schema strips unknown TOP-LEVEL keys, so a\n // `origin`/`published` field alongside `columnOrder` would be silently\n // dropped on the way to the database and the view would forget where it came\n // from on the very first reload.\n // How this view draws its rows. Same passthrough channel, same trap: a\n // top-level `viewMode` would be stripped by the settings schema and the view\n // would open as a table every time.\n const viewMode = parseViewMode(apiFilters?._viewMode)\n\n const origin = parsePerspectiveOrigin(apiFilters?._origin)\n const publication = parsePerspectivePublication(apiFilters?._published)\n // Two independent signals for the base row, and BOTH must hold. The flag is\n // authoritative; the reserved name is the belt-and-braces guard so a\n // hand-edited settings blob cannot make an ordinary named view disappear from\n // the tab strip.\n const isBaseView = apiFilters?._baseView === true && dto.name === BASE_VIEW_PERSPECTIVE_NAME\n\n return {\n id: dto.id,\n name: dto.name,\n color,\n columns: { visible, hidden },\n unseenColumns,\n filters,\n sorting,\n grouping,\n aggregations,\n lookupColumns,\n rollupColumns,\n formulas,\n dateFormat,\n conditionalFormats,\n frozenColumns,\n viewMode,\n isDefault: dto.isDefault,\n isBaseView,\n origin,\n publication,\n }\n}\n\n/**\n * Convert a DynamicTable PerspectiveConfig into the API format (PerspectiveSettings).\n * Used when saving perspectives via the API.\n */\nexport function dynamicTableToApi(config: DynamicTablePerspectiveConfig): PerspectiveSettings {\n const columnVisibility: Record<string, boolean> = {}\n config.columns.visible.forEach((col) => (columnVisibility[col] = true))\n config.columns.hidden.forEach((col) => (columnVisibility[col] = false))\n\n return {\n columnOrder: config.columns.visible,\n columnVisibility,\n // `v: 2` marks the current filter shape. The upstream perspectives service\n // (`maybeMigrateLegacyFilterValues`) DROPS any `filters` object that lacks\n // either `v === 2` or a `root` key, treating it as a legacy value it can't\n // migrate \u2014 so without this marker the saved filters silently vanish on load.\n // `_aggregations` rides here too (passthrough record), since the settings\n // schema would strip it as an unknown top-level key.\n filters: {\n v: 2,\n rows: config.filters,\n _color: config.color,\n _aggregations: config.aggregations ?? [],\n _lookups: config.lookupColumns ?? [],\n _rollups: config.rollupColumns ?? [],\n _dateFormat: config.dateFormat,\n _conditionalFormats: config.conditionalFormats ?? [],\n _formulas: config.formulas ?? [],\n // Written only when the view actually pins something, so a view that has\n // never used the feature does not grow an empty key \u2014 same rule as\n // `_viewMode` below.\n ...(config.frozenColumns && config.frozenColumns.length > 0\n ? { _frozenColumns: config.frozenColumns }\n : {}),\n // Written only when the view has a mode, so a table-only view does not\n // grow a key. `parseViewMode` treats absent and 'table' identically.\n ...(config.viewMode ? { _viewMode: config.viewMode } : {}),\n // Personalization metadata \u2014 see `apiToDynamicTable` for why it cannot\n // live at the top level. Written only when set, so a plain personal view\n // does not grow three null keys.\n ...(config.origin ? { _origin: config.origin } : {}),\n ...(config.publication ? { _published: config.publication } : {}),\n ...(config.isBaseView ? { _baseView: true } : {}),\n },\n sorting: config.sorting.map((s) => ({\n id: s.field,\n desc: s.direction === 'desc',\n })),\n grouping: (config.grouping ?? []).map((g) => ({\n id: g.id,\n field: g.field,\n desc: g.direction === 'desc',\n })),\n }\n}\n"],
|
|
5
|
+
"mappings": "AAMA,SAAS,4BAA4B,uBAAuB;AAG5D,SAAS,uBAAuB;AAChC,SAAS,+BAA+B;AACxC,SAAS,2BAA2B;AACpC,SAAS,0BAA0B;AAkBnC,SAAS,mBAAmB,KAAiC;AAC3D,MAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO,CAAC;AACjC,QAAM,MAAyB,CAAC;AAChC,aAAW,SAAS,KAAK;AACvB,QAAI,CAAC,SAAS,OAAO,UAAU,SAAU;AACzC,UAAM,EAAE,QAAQ,OAAO,MAAM,IAAI;AACjC,QAAI,OAAO,WAAW,YAAY,CAAC,OAAQ;AAC3C,QAAI,OAAO,UAAU,YAAY,CAAC,MAAO;AACzC,QAAI,KAAK,EAAE,QAAQ,OAAO,OAAO,OAAO,UAAU,YAAY,QAAQ,QAAQ,MAAM,CAAC;AAAA,EACvF;AACA,SAAO;AACT;AAcA,SAAS,kBAAkB,KAAiC;AAC1D,MAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO,CAAC;AACjC,QAAM,MAAyB,CAAC;AAChC,aAAW,SAAS,KAAK;AACvB,QAAI,CAAC,SAAS,OAAO,UAAU,SAAU;AACzC,UAAM,EAAE,IAAI,OAAO,IAAI,UAAU,IAAI;AACrC,QAAI,OAAO,UAAU,YAAY,CAAC,MAAO;AACzC,QAAI,CAAC,gBAAgB,EAAE,EAAG;AAC1B,UAAM,OAAwB;AAAA,MAC5B,IAAI,OAAO,OAAO,YAAY,KAAK,KAAK,OAAO,KAAK;AAAA,MACpD;AAAA,MACA;AAAA,IACF;AAIA,QAAI,OAAO,cAAc,YAAY,UAAW,MAAK,YAAY;AACjE,QAAI,KAAK,IAAI;AAAA,EACf;AACA,SAAO;AACT;AAaO,SAAS,cAAc,KAAyC;AACrE,MAAI,QAAQ,UAAa,QAAQ,KAAM,QAAO;AAC9C,SAAO,gBAAgB,GAAG,IAAI,MAAM;AACtC;AAQO,SAAS,uBAAuB,KAA6C;AAClF,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,QAAM,EAAE,YAAY,SAAS,MAAM,SAAS,IAAI;AAChD,MAAI,OAAO,eAAe,YAAY,CAAC,WAAY,QAAO;AAC1D,MAAI,OAAO,YAAY,YAAY,CAAC,QAAS,QAAO;AACpD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM,OAAO,SAAS,WAAW,OAAO;AAAA,IACxC,UAAU,OAAO,aAAa,WAAW,WAAW;AAAA,EACtD;AACF;AAGO,SAAS,4BAA4B,KAAkD;AAC5F,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,QAAM,EAAE,SAAS,YAAY,IAAI;AACjC,MAAI,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO;AACpC,QAAM,MAAM,QAAQ,OAAO,CAAC,OAAqB,OAAO,OAAO,YAAY,GAAG,SAAS,CAAC;AACxF,MAAI,CAAC,IAAI,OAAQ,QAAO;AACxB,SAAO,EAAE,SAAS,KAAK,aAAa,OAAO,gBAAgB,WAAW,cAAc,GAAG;AACzF;AAOO,SAAS,kBAAkB,KAA+D;AAC/F,SAAO,IAAI,aAAa,IAAI;AAC9B;AAUO,SAAS,0BACd,KACA,YACA,uBAAiC,CAAC,GACb;AACrB,QAAM,OAAO,kBAAkB,KAAK,YAAY,oBAAoB;AACpE,SAAO;AAAA,IACL,GAAG;AAAA;AAAA;AAAA,IAGH,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,QAAQ,IAAI;AAAA,IACZ,UAAU,IAAI,YAAY;AAAA,IAC1B,SAAS,kBAAkB,GAAG;AAAA,EAChC;AACF;AAOO,SAAS,kBACd,KACA,YACA,uBAAiC,CAAC,GACH;AAC/B,QAAM,EAAE,cAAc,CAAC,GAAG,mBAAmB,CAAC,EAAE,IAAI,IAAI;AAOxD,QAAM,UACJ,YAAY,SAAS,IACjB,YAAY,OAAO,CAAC,QAAQ,iBAAiB,GAAG,MAAM,KAAK,IAC3D,WAAW,OAAO,CAAC,QAAQ,CAAC,qBAAqB,SAAS,GAAG,CAAC;AACpE,QAAM,SAAS,WAAW,OAAO,CAAC,QAAQ,CAAC,QAAQ,SAAS,GAAG,CAAC;AAmBhE,QAAM,gBACJ,YAAY,SAAS,IACjB,WAAW;AAAA,IACT,CAAC,QAAQ,CAAC,YAAY,SAAS,GAAG,KAAK,EAAE,OAAO;AAAA,EAClD,IACA,CAAC;AAEP,QAAM,aAAa,IAAI,SAAS;AAChC,QAAM,UAAuB,MAAM,QAAQ,UAAU,IAChD,aACC,YAAY,QAAwB,CAAC;AAC3C,QAAM,QAAQ,YAAY;AAE1B,QAAM,WAAuB,IAAI,SAAS,WAAW,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,IACnE,IAAI,EAAE;AAAA,IACN,OAAO,EAAE;AAAA,IACT,WAAY,EAAE,OAAO,SAAS;AAAA,EAChC,EAAE;AAEF,QAAM,YAAyB,IAAI,SAAS,YAAY,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,IACtE,IAAI,EAAE;AAAA,IACN,OAAO,EAAE;AAAA,IACT,WAAY,EAAE,OAAO,SAAS;AAAA,EAChC,EAAE;AAKF,QAAM,eAAe,kBAAkB,YAAY,aAAa;AAIhE,QAAM,gBAAgB,mBAAmB,YAAY,QAAQ;AAK7D,QAAM,gBAAgB,mBAAmB,YAAY,QAAQ;AAK7D,QAAM,gBAAgB,YAAY;AAClC,QAAM,aAAa,OAAO,kBAAkB,YAAY,gBAAgB,gBAAgB;AAKxF,QAAM,qBAAqB,wBAAwB,YAAY,mBAAmB;AAalF,QAAM,gBAAgB,MAAM,QAAQ,YAAY,cAAc,IACzD,WAAW,eAA6B;AAAA,IACvC,CAAC,MAAmB,OAAO,MAAM,YAAY,EAAE,SAAS;AAAA,EAC1D,IACA;AAMJ,QAAM,WAAW,oBAAoB,YAAY,SAAS;AAU1D,QAAM,WAAW,cAAc,YAAY,SAAS;AAEpD,QAAM,SAAS,uBAAuB,YAAY,OAAO;AACzD,QAAM,cAAc,4BAA4B,YAAY,UAAU;AAKtE,QAAM,aAAa,YAAY,cAAc,QAAQ,IAAI,SAAS;AAElE,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV;AAAA,IACA,SAAS,EAAE,SAAS,OAAO;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,IAAI;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAMO,SAAS,kBAAkB,QAA4D;AAC5F,QAAM,mBAA4C,CAAC;AACnD,SAAO,QAAQ,QAAQ,QAAQ,CAAC,QAAS,iBAAiB,GAAG,IAAI,IAAK;AACtE,SAAO,QAAQ,OAAO,QAAQ,CAAC,QAAS,iBAAiB,GAAG,IAAI,KAAM;AAEtE,SAAO;AAAA,IACL,aAAa,OAAO,QAAQ;AAAA,IAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,SAAS;AAAA,MACP,GAAG;AAAA,MACH,MAAM,OAAO;AAAA,MACb,QAAQ,OAAO;AAAA,MACf,eAAe,OAAO,gBAAgB,CAAC;AAAA,MACvC,UAAU,OAAO,iBAAiB,CAAC;AAAA,MACnC,UAAU,OAAO,iBAAiB,CAAC;AAAA,MACnC,aAAa,OAAO;AAAA,MACpB,qBAAqB,OAAO,sBAAsB,CAAC;AAAA,MACnD,WAAW,OAAO,YAAY,CAAC;AAAA;AAAA;AAAA;AAAA,MAI/B,GAAI,OAAO,iBAAiB,OAAO,cAAc,SAAS,IACtD,EAAE,gBAAgB,OAAO,cAAc,IACvC,CAAC;AAAA;AAAA;AAAA,MAGL,GAAI,OAAO,WAAW,EAAE,WAAW,OAAO,SAAS,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,MAIxD,GAAI,OAAO,SAAS,EAAE,SAAS,OAAO,OAAO,IAAI,CAAC;AAAA,MAClD,GAAI,OAAO,cAAc,EAAE,YAAY,OAAO,YAAY,IAAI,CAAC;AAAA,MAC/D,GAAI,OAAO,aAAa,EAAE,WAAW,KAAK,IAAI,CAAC;AAAA,IACjD;AAAA,IACA,SAAS,OAAO,QAAQ,IAAI,CAAC,OAAO;AAAA,MAClC,IAAI,EAAE;AAAA,MACN,MAAM,EAAE,cAAc;AAAA,IACxB,EAAE;AAAA,IACF,WAAW,OAAO,YAAY,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MAC5C,IAAI,EAAE;AAAA,MACN,OAAO,EAAE;AAAA,MACT,MAAM,EAAE,cAAc;AAAA,IACxB,EAAE;AAAA,EACJ;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|