@umodeapporg/ui 0.0.0-canary.ca10e69
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/README.md +78 -0
- package/dist/assets/images/common-pngs/sparkles.png.js +5 -0
- package/dist/assets/images/common-pngs/sparkles.png.js.map +1 -0
- package/dist/assets/umode-ui.css +467 -0
- package/dist/components/DateTime/DatePicker.d.ts +21 -0
- package/dist/components/DateTime/DatePicker.js +124 -0
- package/dist/components/DateTime/DatePicker.js.map +1 -0
- package/dist/components/DateTime/DateRangePicker.d.ts +21 -0
- package/dist/components/DateTime/DateRangePicker.js +208 -0
- package/dist/components/DateTime/DateRangePicker.js.map +1 -0
- package/dist/components/Form/ControlledButton.d.ts +25 -0
- package/dist/components/Form/ControlledButton.js +73 -0
- package/dist/components/Form/ControlledButton.js.map +1 -0
- package/dist/components/Form/ControlledCheckbox.d.ts +16 -0
- package/dist/components/Form/ControlledCheckbox.js +115 -0
- package/dist/components/Form/ControlledCheckbox.js.map +1 -0
- package/dist/components/Form/ControlledDialog.d.ts +51 -0
- package/dist/components/Form/ControlledDialog.js +191 -0
- package/dist/components/Form/ControlledDialog.js.map +1 -0
- package/dist/components/Form/ControlledDialogPrimitives.d.ts +53 -0
- package/dist/components/Form/ControlledDialogPrimitives.js +245 -0
- package/dist/components/Form/ControlledDialogPrimitives.js.map +1 -0
- package/dist/components/Form/ControlledDrawer.d.ts +37 -0
- package/dist/components/Form/ControlledDrawer.js +241 -0
- package/dist/components/Form/ControlledDrawer.js.map +1 -0
- package/dist/components/Form/ControlledForm/InputField.d.ts +11 -0
- package/dist/components/Form/ControlledForm/InputField.js +75 -0
- package/dist/components/Form/ControlledForm/InputField.js.map +1 -0
- package/dist/components/Form/ControlledForm/index.d.ts +27 -0
- package/dist/components/Form/ControlledForm/index.js +113 -0
- package/dist/components/Form/ControlledForm/index.js.map +1 -0
- package/dist/components/Form/ControlledImage/Img.d.ts +11 -0
- package/dist/components/Form/ControlledImage/Img.js +29 -0
- package/dist/components/Form/ControlledImage/Img.js.map +1 -0
- package/dist/components/Form/ControlledImage/index.d.ts +33 -0
- package/dist/components/Form/ControlledImage/index.js +110 -0
- package/dist/components/Form/ControlledImage/index.js.map +1 -0
- package/dist/components/Form/ControlledImage/useImage.d.ts +9 -0
- package/dist/components/Form/ControlledImage/useImage.js +110 -0
- package/dist/components/Form/ControlledImage/useImage.js.map +1 -0
- package/dist/components/Form/ControlledInput.d.ts +23 -0
- package/dist/components/Form/ControlledInput.js +52 -0
- package/dist/components/Form/ControlledInput.js.map +1 -0
- package/dist/components/Form/ControlledRadio.d.ts +15 -0
- package/dist/components/Form/ControlledRadio.js +91 -0
- package/dist/components/Form/ControlledRadio.js.map +1 -0
- package/dist/components/Form/ControlledSelect.d.ts +53 -0
- package/dist/components/Form/ControlledSelect.js +797 -0
- package/dist/components/Form/ControlledSelect.js.map +1 -0
- package/dist/components/Form/ControlledSwitch.d.ts +21 -0
- package/dist/components/Form/ControlledSwitch.js +107 -0
- package/dist/components/Form/ControlledSwitch.js.map +1 -0
- package/dist/components/Form/ControlledTabs.d.ts +75 -0
- package/dist/components/Form/ControlledTabs.js +515 -0
- package/dist/components/Form/ControlledTabs.js.map +1 -0
- package/dist/components/Form/ControlledTabsPrimitives.d.ts +43 -0
- package/dist/components/Form/ControlledTabsPrimitives.js +48 -0
- package/dist/components/Form/ControlledTabsPrimitives.js.map +1 -0
- package/dist/components/Form/ControlledTextarea.d.ts +22 -0
- package/dist/components/Form/ControlledTextarea.js +46 -0
- package/dist/components/Form/ControlledTextarea.js.map +1 -0
- package/dist/components/Form/ControlledTimeline.d.ts +26 -0
- package/dist/components/Form/ControlledTimeline.js +60 -0
- package/dist/components/Form/ControlledTimeline.js.map +1 -0
- package/dist/components/Form/ControlledViewToggle.d.ts +74 -0
- package/dist/components/Form/ControlledViewToggle.js +157 -0
- package/dist/components/Form/ControlledViewToggle.js.map +1 -0
- package/dist/components/Form/ControlledVoiceTextarea.d.ts +13 -0
- package/dist/components/Form/ControlledVoiceTextarea.js +99 -0
- package/dist/components/Form/ControlledVoiceTextarea.js.map +1 -0
- package/dist/components/Form/CurrencyInput.d.ts +8 -0
- package/dist/components/Form/CurrencyInput.js +17 -0
- package/dist/components/Form/CurrencyInput.js.map +1 -0
- package/dist/components/Form/FieldLabel.d.ts +16 -0
- package/dist/components/Form/FieldLabel.js +7 -0
- package/dist/components/Form/FieldLabel.js.map +1 -0
- package/dist/components/Form/RichTextEditor.d.ts +86 -0
- package/dist/components/Form/RichTextEditor.js +581 -0
- package/dist/components/Form/RichTextEditor.js.map +1 -0
- package/dist/components/Form/attachments/AttachmentPreviewList.d.ts +22 -0
- package/dist/components/Form/attachments/AttachmentPreviewList.js +95 -0
- package/dist/components/Form/attachments/AttachmentPreviewList.js.map +1 -0
- package/dist/components/Form/attachments/FileDropzone.d.ts +12 -0
- package/dist/components/Form/attachments/FileDropzone.js +84 -0
- package/dist/components/Form/attachments/FileDropzone.js.map +1 -0
- package/dist/components/Navigation/ControlledBreadcrumb.d.ts +13 -0
- package/dist/components/Navigation/ControlledBreadcrumb.js +24 -0
- package/dist/components/Navigation/ControlledBreadcrumb.js.map +1 -0
- package/dist/components/Navigation/ErrorPage.d.ts +2 -0
- package/dist/components/Navigation/ErrorPage.js +27 -0
- package/dist/components/Navigation/ErrorPage.js.map +1 -0
- package/dist/components/Navigation/LinkButton.d.ts +26 -0
- package/dist/components/Navigation/LinkButton.js +82 -0
- package/dist/components/Navigation/LinkButton.js.map +1 -0
- package/dist/components/Navigation/PageTitle.d.ts +95 -0
- package/dist/components/Navigation/PageTitle.js +241 -0
- package/dist/components/Navigation/PageTitle.js.map +1 -0
- package/dist/components/Navigation/PageTitleCollapseContext.d.ts +13 -0
- package/dist/components/Navigation/PageTitleCollapseContext.js +9 -0
- package/dist/components/Navigation/PageTitleCollapseContext.js.map +1 -0
- package/dist/components/Navigation/PageTitleNavigationContext.d.ts +21 -0
- package/dist/components/Navigation/PageTitleNavigationContext.js +17 -0
- package/dist/components/Navigation/PageTitleNavigationContext.js.map +1 -0
- package/dist/components/Navigation/ReactRouterNavigationAdapter.d.ts +7 -0
- package/dist/components/Navigation/ReactRouterNavigationAdapter.js +27 -0
- package/dist/components/Navigation/ReactRouterNavigationAdapter.js.map +1 -0
- package/dist/components/Navigation/UiNavigationContext.d.ts +38 -0
- package/dist/components/Navigation/UiNavigationContext.js +44 -0
- package/dist/components/Navigation/UiNavigationContext.js.map +1 -0
- package/dist/components/Search/UnifiedSearchBar.d.ts +31 -0
- package/dist/components/Search/UnifiedSearchBar.js +167 -0
- package/dist/components/Search/UnifiedSearchBar.js.map +1 -0
- package/dist/components/Search/filters/ActiveFiltersBar.d.ts +15 -0
- package/dist/components/Search/filters/ActiveFiltersBar.js +48 -0
- package/dist/components/Search/filters/ActiveFiltersBar.js.map +1 -0
- package/dist/components/Search/filters/FilterChipsRow.d.ts +17 -0
- package/dist/components/Search/filters/FilterChipsRow.js +113 -0
- package/dist/components/Search/filters/FilterChipsRow.js.map +1 -0
- package/dist/components/Search/filters/FilterFieldControl.d.ts +19 -0
- package/dist/components/Search/filters/FilterFieldControl.js +390 -0
- package/dist/components/Search/filters/FilterFieldControl.js.map +1 -0
- package/dist/components/Search/filters/FiltersButton.d.ts +24 -0
- package/dist/components/Search/filters/FiltersButton.js +52 -0
- package/dist/components/Search/filters/FiltersButton.js.map +1 -0
- package/dist/components/Search/filters/FiltersForm.d.ts +18 -0
- package/dist/components/Search/filters/FiltersForm.js +112 -0
- package/dist/components/Search/filters/FiltersForm.js.map +1 -0
- package/dist/components/Search/filters/FiltersPanel.d.ts +32 -0
- package/dist/components/Search/filters/FiltersPanel.js +266 -0
- package/dist/components/Search/filters/FiltersPanel.js.map +1 -0
- package/dist/components/Search/filters/FiltersSummaryTooltip.d.ts +20 -0
- package/dist/components/Search/filters/FiltersSummaryTooltip.js +26 -0
- package/dist/components/Search/filters/FiltersSummaryTooltip.js.map +1 -0
- package/dist/components/Search/filters/filterTypes.d.ts +162 -0
- package/dist/components/Search/filters/filterTypes.js +2 -0
- package/dist/components/Search/filters/filterTypes.js.map +1 -0
- package/dist/components/Search/filters/filterValues.d.ts +22 -0
- package/dist/components/Search/filters/filterValues.js +91 -0
- package/dist/components/Search/filters/filterValues.js.map +1 -0
- package/dist/components/Search/filters/filtersLayout.d.ts +4 -0
- package/dist/components/Search/filters/filtersLayout.js +18 -0
- package/dist/components/Search/filters/filtersLayout.js.map +1 -0
- package/dist/components/Search/filters/index.d.ts +11 -0
- package/dist/components/Search/filters/index.js +32 -0
- package/dist/components/Search/filters/index.js.map +1 -0
- package/dist/components/Search/filters/useFilters.d.ts +33 -0
- package/dist/components/Search/filters/useFilters.js +162 -0
- package/dist/components/Search/filters/useFilters.js.map +1 -0
- package/dist/components/Search/index.d.ts +2 -0
- package/dist/components/Search/index.js +34 -0
- package/dist/components/Search/index.js.map +1 -0
- package/dist/components/Shell/AppHeader.d.ts +25 -0
- package/dist/components/Shell/AppHeader.js +69 -0
- package/dist/components/Shell/AppHeader.js.map +1 -0
- package/dist/components/Shell/AppShell.d.ts +22 -0
- package/dist/components/Shell/AppShell.js +146 -0
- package/dist/components/Shell/AppShell.js.map +1 -0
- package/dist/components/Shell/AppSidebar.d.ts +20 -0
- package/dist/components/Shell/AppSidebar.js +93 -0
- package/dist/components/Shell/AppSidebar.js.map +1 -0
- package/dist/components/Shell/LanguageToggle.d.ts +8 -0
- package/dist/components/Shell/LanguageToggle.js +59 -0
- package/dist/components/Shell/LanguageToggle.js.map +1 -0
- package/dist/components/Shell/PumpkinGlyph.d.ts +13 -0
- package/dist/components/Shell/PumpkinGlyph.js +29 -0
- package/dist/components/Shell/PumpkinGlyph.js.map +1 -0
- package/dist/components/Shell/SidebarMenu.d.ts +29 -0
- package/dist/components/Shell/SidebarMenu.js +254 -0
- package/dist/components/Shell/SidebarMenu.js.map +1 -0
- package/dist/components/Shell/ThemeToggle.d.ts +18 -0
- package/dist/components/Shell/ThemeToggle.js +68 -0
- package/dist/components/Shell/ThemeToggle.js.map +1 -0
- package/dist/components/Shell/headerControlStyles.d.ts +10 -0
- package/dist/components/Shell/headerControlStyles.js +11 -0
- package/dist/components/Shell/headerControlStyles.js.map +1 -0
- package/dist/components/Shell/sidebarFavorites.d.ts +21 -0
- package/dist/components/Shell/sidebarFavorites.js +69 -0
- package/dist/components/Shell/sidebarFavorites.js.map +1 -0
- package/dist/components/Shell/useSidebarState.d.ts +14 -0
- package/dist/components/Shell/useSidebarState.js +106 -0
- package/dist/components/Shell/useSidebarState.js.map +1 -0
- package/dist/components/UI/AccordionIcon.d.ts +10 -0
- package/dist/components/UI/AccordionIcon.js +22 -0
- package/dist/components/UI/AccordionIcon.js.map +1 -0
- package/dist/components/UI/AlertInfo/dismissedAlertsStore.d.ts +2 -0
- package/dist/components/UI/AlertInfo/dismissedAlertsStore.js +22 -0
- package/dist/components/UI/AlertInfo/dismissedAlertsStore.js.map +1 -0
- package/dist/components/UI/AlertInfo/index.d.ts +30 -0
- package/dist/components/UI/AlertInfo/index.js +78 -0
- package/dist/components/UI/AlertInfo/index.js.map +1 -0
- package/dist/components/UI/BaseDataCard.d.ts +27 -0
- package/dist/components/UI/BaseDataCard.js +170 -0
- package/dist/components/UI/BaseDataCard.js.map +1 -0
- package/dist/components/UI/BulkActionBar.d.ts +35 -0
- package/dist/components/UI/BulkActionBar.js +127 -0
- package/dist/components/UI/BulkActionBar.js.map +1 -0
- package/dist/components/UI/Chips/OutlinedChip.d.ts +42 -0
- package/dist/components/UI/Chips/OutlinedChip.js +190 -0
- package/dist/components/UI/Chips/OutlinedChip.js.map +1 -0
- package/dist/components/UI/Chips/StatusChip.d.ts +8 -0
- package/dist/components/UI/Chips/StatusChip.js +33 -0
- package/dist/components/UI/Chips/StatusChip.js.map +1 -0
- package/dist/components/UI/Chips/chipTones.d.ts +6 -0
- package/dist/components/UI/Chips/chipTones.js +53 -0
- package/dist/components/UI/Chips/chipTones.js.map +1 -0
- package/dist/components/UI/ColorSwatch.d.ts +30 -0
- package/dist/components/UI/ColorSwatch.js +53 -0
- package/dist/components/UI/ColorSwatch.js.map +1 -0
- package/dist/components/UI/Colors.d.ts +10 -0
- package/dist/components/UI/Colors.js +41 -0
- package/dist/components/UI/Colors.js.map +1 -0
- package/dist/components/UI/ControlledAccordion.d.ts +38 -0
- package/dist/components/UI/ControlledAccordion.js +95 -0
- package/dist/components/UI/ControlledAccordion.js.map +1 -0
- package/dist/components/UI/ControlledCollapse.d.ts +18 -0
- package/dist/components/UI/ControlledCollapse.js +40 -0
- package/dist/components/UI/ControlledCollapse.js.map +1 -0
- package/dist/components/UI/ControlledMenu.d.ts +79 -0
- package/dist/components/UI/ControlledMenu.js +234 -0
- package/dist/components/UI/ControlledMenu.js.map +1 -0
- package/dist/components/UI/ControlledPopover.d.ts +59 -0
- package/dist/components/UI/ControlledPopover.js +189 -0
- package/dist/components/UI/ControlledPopover.js.map +1 -0
- package/dist/components/UI/ControlledProgress.d.ts +13 -0
- package/dist/components/UI/ControlledProgress.js +46 -0
- package/dist/components/UI/ControlledProgress.js.map +1 -0
- package/dist/components/UI/ControlledSlider.d.ts +15 -0
- package/dist/components/UI/ControlledSlider.js +34 -0
- package/dist/components/UI/ControlledSlider.js.map +1 -0
- package/dist/components/UI/ControlledTooltip.d.ts +21 -0
- package/dist/components/UI/ControlledTooltip.js +146 -0
- package/dist/components/UI/ControlledTooltip.js.map +1 -0
- package/dist/components/UI/CustomBadge.d.ts +15 -0
- package/dist/components/UI/CustomBadge.js +34 -0
- package/dist/components/UI/CustomBadge.js.map +1 -0
- package/dist/components/UI/CustomCard.d.ts +13 -0
- package/dist/components/UI/CustomCard.js +36 -0
- package/dist/components/UI/CustomCard.js.map +1 -0
- package/dist/components/UI/CustomChart.d.ts +21 -0
- package/dist/components/UI/CustomChart.js +108 -0
- package/dist/components/UI/CustomChart.js.map +1 -0
- package/dist/components/UI/DataTable/DataTable.d.ts +108 -0
- package/dist/components/UI/DataTable/DataTable.js +606 -0
- package/dist/components/UI/DataTable/DataTable.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableAutoCard.d.ts +20 -0
- package/dist/components/UI/DataTable/DataTableAutoCard.js +39 -0
- package/dist/components/UI/DataTable/DataTableAutoCard.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableBody.d.ts +33 -0
- package/dist/components/UI/DataTable/DataTableBody.js +260 -0
- package/dist/components/UI/DataTable/DataTableBody.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableBodyCell.d.ts +21 -0
- package/dist/components/UI/DataTable/DataTableBodyCell.js +88 -0
- package/dist/components/UI/DataTable/DataTableBodyCell.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableBulkEditButton.d.ts +11 -0
- package/dist/components/UI/DataTable/DataTableBulkEditButton.js +24 -0
- package/dist/components/UI/DataTable/DataTableBulkEditButton.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableBulkEditDialog.d.ts +25 -0
- package/dist/components/UI/DataTable/DataTableBulkEditDialog.js +282 -0
- package/dist/components/UI/DataTable/DataTableBulkEditDialog.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableBulkEditRowsPicker.d.ts +13 -0
- package/dist/components/UI/DataTable/DataTableBulkEditRowsPicker.js +95 -0
- package/dist/components/UI/DataTable/DataTableBulkEditRowsPicker.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableBulkEditValueEditor.d.ts +20 -0
- package/dist/components/UI/DataTable/DataTableBulkEditValueEditor.js +94 -0
- package/dist/components/UI/DataTable/DataTableBulkEditValueEditor.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableColumnToggle.d.ts +34 -0
- package/dist/components/UI/DataTable/DataTableColumnToggle.js +170 -0
- package/dist/components/UI/DataTable/DataTableColumnToggle.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableDetailModal.d.ts +17 -0
- package/dist/components/UI/DataTable/DataTableDetailModal.js +109 -0
- package/dist/components/UI/DataTable/DataTableDetailModal.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableDetailPanel.d.ts +21 -0
- package/dist/components/UI/DataTable/DataTableDetailPanel.js +51 -0
- package/dist/components/UI/DataTable/DataTableDetailPanel.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableDetailTable.d.ts +35 -0
- package/dist/components/UI/DataTable/DataTableDetailTable.js +129 -0
- package/dist/components/UI/DataTable/DataTableDetailTable.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableEditModeButton.d.ts +12 -0
- package/dist/components/UI/DataTable/DataTableEditModeButton.js +29 -0
- package/dist/components/UI/DataTable/DataTableEditModeButton.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableFilters.d.ts +20 -0
- package/dist/components/UI/DataTable/DataTableFilters.js +65 -0
- package/dist/components/UI/DataTable/DataTableFilters.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableHead.d.ts +27 -0
- package/dist/components/UI/DataTable/DataTableHead.js +198 -0
- package/dist/components/UI/DataTable/DataTableHead.js.map +1 -0
- package/dist/components/UI/DataTable/DataTablePagination.d.ts +15 -0
- package/dist/components/UI/DataTable/DataTablePagination.js +149 -0
- package/dist/components/UI/DataTable/DataTablePagination.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableSaveButton.d.ts +13 -0
- package/dist/components/UI/DataTable/DataTableSaveButton.js +21 -0
- package/dist/components/UI/DataTable/DataTableSaveButton.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableSegmentedTabs.d.ts +8 -0
- package/dist/components/UI/DataTable/DataTableSegmentedTabs.js +35 -0
- package/dist/components/UI/DataTable/DataTableSegmentedTabs.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableStates.d.ts +17 -0
- package/dist/components/UI/DataTable/DataTableStates.js +59 -0
- package/dist/components/UI/DataTable/DataTableStates.js.map +1 -0
- package/dist/components/UI/DataTable/DataTableToolbar.d.ts +28 -0
- package/dist/components/UI/DataTable/DataTableToolbar.js +110 -0
- package/dist/components/UI/DataTable/DataTableToolbar.js.map +1 -0
- package/dist/components/UI/DataTable/applyDataTableFilters.d.ts +16 -0
- package/dist/components/UI/DataTable/applyDataTableFilters.js +54 -0
- package/dist/components/UI/DataTable/applyDataTableFilters.js.map +1 -0
- package/dist/components/UI/DataTable/bulkEditValues.d.ts +8 -0
- package/dist/components/UI/DataTable/bulkEditValues.js +13 -0
- package/dist/components/UI/DataTable/bulkEditValues.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableActionsCell.d.ts +7 -0
- package/dist/components/UI/DataTable/cells/DataTableActionsCell.js +55 -0
- package/dist/components/UI/DataTable/cells/DataTableActionsCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableCell.d.ts +15 -0
- package/dist/components/UI/DataTable/cells/DataTableCell.js +63 -0
- package/dist/components/UI/DataTable/cells/DataTableCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableCodeCell.d.ts +6 -0
- package/dist/components/UI/DataTable/cells/DataTableCodeCell.js +7 -0
- package/dist/components/UI/DataTable/cells/DataTableCodeCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableColorCell.d.ts +7 -0
- package/dist/components/UI/DataTable/cells/DataTableColorCell.js +10 -0
- package/dist/components/UI/DataTable/cells/DataTableColorCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableCountCell.d.ts +5 -0
- package/dist/components/UI/DataTable/cells/DataTableCountCell.js +7 -0
- package/dist/components/UI/DataTable/cells/DataTableCountCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableDateCell.d.ts +5 -0
- package/dist/components/UI/DataTable/cells/DataTableDateCell.js +12 -0
- package/dist/components/UI/DataTable/cells/DataTableDateCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableEditableCell.d.ts +23 -0
- package/dist/components/UI/DataTable/cells/DataTableEditableCell.js +242 -0
- package/dist/components/UI/DataTable/cells/DataTableEditableCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableEmpenhoCell.d.ts +10 -0
- package/dist/components/UI/DataTable/cells/DataTableEmpenhoCell.js +7 -0
- package/dist/components/UI/DataTable/cells/DataTableEmpenhoCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableOriginCell.d.ts +6 -0
- package/dist/components/UI/DataTable/cells/DataTableOriginCell.js +25 -0
- package/dist/components/UI/DataTable/cells/DataTableOriginCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableStatusCell.d.ts +6 -0
- package/dist/components/UI/DataTable/cells/DataTableStatusCell.js +24 -0
- package/dist/components/UI/DataTable/cells/DataTableStatusCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableTagCell.d.ts +6 -0
- package/dist/components/UI/DataTable/cells/DataTableTagCell.js +25 -0
- package/dist/components/UI/DataTable/cells/DataTableTagCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableTextCell.d.ts +6 -0
- package/dist/components/UI/DataTable/cells/DataTableTextCell.js +7 -0
- package/dist/components/UI/DataTable/cells/DataTableTextCell.js.map +1 -0
- package/dist/components/UI/DataTable/cells/DataTableThumbnailCell.d.ts +6 -0
- package/dist/components/UI/DataTable/cells/DataTableThumbnailCell.js +10 -0
- package/dist/components/UI/DataTable/cells/DataTableThumbnailCell.js.map +1 -0
- package/dist/components/UI/DataTable/dataTableClasses.d.ts +12 -0
- package/dist/components/UI/DataTable/dataTableClasses.js +29 -0
- package/dist/components/UI/DataTable/dataTableClasses.js.map +1 -0
- package/dist/components/UI/DataTable/dataTableColumnWidths.d.ts +15 -0
- package/dist/components/UI/DataTable/dataTableColumnWidths.js +153 -0
- package/dist/components/UI/DataTable/dataTableColumnWidths.js.map +1 -0
- package/dist/components/UI/DataTable/dataTableColumnsStore.d.ts +12 -0
- package/dist/components/UI/DataTable/dataTableColumnsStore.js +68 -0
- package/dist/components/UI/DataTable/dataTableColumnsStore.js.map +1 -0
- package/dist/components/UI/DataTable/dataTableMotion.d.ts +6 -0
- package/dist/components/UI/DataTable/dataTableMotion.js +15 -0
- package/dist/components/UI/DataTable/dataTableMotion.js.map +1 -0
- package/dist/components/UI/DataTable/grid/GridFillHandle.d.ts +8 -0
- package/dist/components/UI/DataTable/grid/GridFillHandle.js +70 -0
- package/dist/components/UI/DataTable/grid/GridFillHandle.js.map +1 -0
- package/dist/components/UI/DataTable/grid/GridProvider.d.ts +36 -0
- package/dist/components/UI/DataTable/grid/GridProvider.js +128 -0
- package/dist/components/UI/DataTable/grid/GridProvider.js.map +1 -0
- package/dist/components/UI/DataTable/grid/fill/fillStrategies.d.ts +19 -0
- package/dist/components/UI/DataTable/grid/fill/fillStrategies.js +73 -0
- package/dist/components/UI/DataTable/grid/fill/fillStrategies.js.map +1 -0
- package/dist/components/UI/DataTable/grid/gridStore.d.ts +82 -0
- package/dist/components/UI/DataTable/grid/gridStore.js +259 -0
- package/dist/components/UI/DataTable/grid/gridStore.js.map +1 -0
- package/dist/components/UI/DataTable/grid/gridTypes.d.ts +59 -0
- package/dist/components/UI/DataTable/grid/gridTypes.js +27 -0
- package/dist/components/UI/DataTable/grid/gridTypes.js.map +1 -0
- package/dist/components/UI/DataTable/grid/useGridFillApply.d.ts +18 -0
- package/dist/components/UI/DataTable/grid/useGridFillApply.js +74 -0
- package/dist/components/UI/DataTable/grid/useGridFillApply.js.map +1 -0
- package/dist/components/UI/DataTable/grid/useGridInstance.d.ts +27 -0
- package/dist/components/UI/DataTable/grid/useGridInstance.js +41 -0
- package/dist/components/UI/DataTable/grid/useGridInstance.js.map +1 -0
- package/dist/components/UI/DataTable/grid/useGridKeyboard.d.ts +25 -0
- package/dist/components/UI/DataTable/grid/useGridKeyboard.js +135 -0
- package/dist/components/UI/DataTable/grid/useGridKeyboard.js.map +1 -0
- package/dist/components/UI/DataTable/index.d.ts +19 -0
- package/dist/components/UI/DataTable/index.js +34 -0
- package/dist/components/UI/DataTable/index.js.map +1 -0
- package/dist/components/UI/DataTable/types.d.ts +535 -0
- package/dist/components/UI/DataTable/types.js +13 -0
- package/dist/components/UI/DataTable/types.js.map +1 -0
- package/dist/components/UI/DataTable/useCellEditingState.d.ts +20 -0
- package/dist/components/UI/DataTable/useCellEditingState.js +33 -0
- package/dist/components/UI/DataTable/useCellEditingState.js.map +1 -0
- package/dist/components/UI/DataTable/useColumnOrder.d.ts +25 -0
- package/dist/components/UI/DataTable/useColumnOrder.js +94 -0
- package/dist/components/UI/DataTable/useColumnOrder.js.map +1 -0
- package/dist/components/UI/DataTable/useColumnSizing.d.ts +9 -0
- package/dist/components/UI/DataTable/useColumnSizing.js +21 -0
- package/dist/components/UI/DataTable/useColumnSizing.js.map +1 -0
- package/dist/components/UI/DataTable/useColumnVisibility.d.ts +19 -0
- package/dist/components/UI/DataTable/useColumnVisibility.js +47 -0
- package/dist/components/UI/DataTable/useColumnVisibility.js.map +1 -0
- package/dist/components/UI/DataTable/useDataTableCommitQueue.d.ts +69 -0
- package/dist/components/UI/DataTable/useDataTableCommitQueue.js +220 -0
- package/dist/components/UI/DataTable/useDataTableCommitQueue.js.map +1 -0
- package/dist/components/UI/DataTable/useDataTableEditBuffer.d.ts +36 -0
- package/dist/components/UI/DataTable/useDataTableEditBuffer.js +29 -0
- package/dist/components/UI/DataTable/useDataTableEditBuffer.js.map +1 -0
- package/dist/components/UI/DataTable/useDataTableInstance.d.ts +65 -0
- package/dist/components/UI/DataTable/useDataTableInstance.js +336 -0
- package/dist/components/UI/DataTable/useDataTableInstance.js.map +1 -0
- package/dist/components/UI/DataTable/useDataTableSource.d.ts +85 -0
- package/dist/components/UI/DataTable/useDataTableSource.js +199 -0
- package/dist/components/UI/DataTable/useDataTableSource.js.map +1 -0
- package/dist/components/UI/DataTable/useDataTableUndoHistory.d.ts +30 -0
- package/dist/components/UI/DataTable/useDataTableUndoHistory.js +130 -0
- package/dist/components/UI/DataTable/useDataTableUndoHistory.js.map +1 -0
- package/dist/components/UI/DataTable/useFlipRows.d.ts +22 -0
- package/dist/components/UI/DataTable/useFlipRows.js +90 -0
- package/dist/components/UI/DataTable/useFlipRows.js.map +1 -0
- package/dist/components/UI/ErrorBoundary.d.ts +20 -0
- package/dist/components/UI/ErrorBoundary.js +36 -0
- package/dist/components/UI/ErrorBoundary.js.map +1 -0
- package/dist/components/UI/Flow/FlowAnnotationDraftPreview.d.ts +6 -0
- package/dist/components/UI/Flow/FlowAnnotationDraftPreview.js +65 -0
- package/dist/components/UI/Flow/FlowAnnotationDraftPreview.js.map +1 -0
- package/dist/components/UI/Flow/FlowAnnotationNode.d.ts +34 -0
- package/dist/components/UI/Flow/FlowAnnotationNode.js +231 -0
- package/dist/components/UI/Flow/FlowAnnotationNode.js.map +1 -0
- package/dist/components/UI/Flow/FlowAnnotationToolbar.d.ts +32 -0
- package/dist/components/UI/Flow/FlowAnnotationToolbar.js +298 -0
- package/dist/components/UI/Flow/FlowAnnotationToolbar.js.map +1 -0
- package/dist/components/UI/Flow/FlowBlockNode.d.ts +35 -0
- package/dist/components/UI/Flow/FlowBlockNode.js +91 -0
- package/dist/components/UI/Flow/FlowBlockNode.js.map +1 -0
- package/dist/components/UI/Flow/FlowCanvas.d.ts +23 -0
- package/dist/components/UI/Flow/FlowCanvas.js +559 -0
- package/dist/components/UI/Flow/FlowCanvas.js.map +1 -0
- package/dist/components/UI/Flow/FlowConnectionEdge.d.ts +18 -0
- package/dist/components/UI/Flow/FlowConnectionEdge.js +116 -0
- package/dist/components/UI/Flow/FlowConnectionEdge.js.map +1 -0
- package/dist/components/UI/Flow/FlowEditorProvider.d.ts +17 -0
- package/dist/components/UI/Flow/FlowEditorProvider.js +27 -0
- package/dist/components/UI/Flow/FlowEditorProvider.js.map +1 -0
- package/dist/components/UI/Flow/FlowInspector.d.ts +11 -0
- package/dist/components/UI/Flow/FlowInspector.js +131 -0
- package/dist/components/UI/Flow/FlowInspector.js.map +1 -0
- package/dist/components/UI/Flow/FlowIssueList.d.ts +8 -0
- package/dist/components/UI/Flow/FlowIssueList.js +55 -0
- package/dist/components/UI/Flow/FlowIssueList.js.map +1 -0
- package/dist/components/UI/Flow/FlowLaneMap.d.ts +30 -0
- package/dist/components/UI/Flow/FlowLaneMap.js +206 -0
- package/dist/components/UI/Flow/FlowLaneMap.js.map +1 -0
- package/dist/components/UI/Flow/FlowNodeShell.d.ts +20 -0
- package/dist/components/UI/Flow/FlowNodeShell.js +81 -0
- package/dist/components/UI/Flow/FlowNodeShell.js.map +1 -0
- package/dist/components/UI/Flow/FlowResizablePanel.d.ts +20 -0
- package/dist/components/UI/Flow/FlowResizablePanel.js +118 -0
- package/dist/components/UI/Flow/FlowResizablePanel.js.map +1 -0
- package/dist/components/UI/Flow/FlowSelectionBar.d.ts +10 -0
- package/dist/components/UI/Flow/FlowSelectionBar.js +56 -0
- package/dist/components/UI/Flow/FlowSelectionBar.js.map +1 -0
- package/dist/components/UI/Flow/FlowZoomControls.d.ts +12 -0
- package/dist/components/UI/Flow/FlowZoomControls.js +54 -0
- package/dist/components/UI/Flow/FlowZoomControls.js.map +1 -0
- package/dist/components/UI/Flow/flowAnnotations.d.ts +38 -0
- package/dist/components/UI/Flow/flowAnnotations.js +123 -0
- package/dist/components/UI/Flow/flowAnnotations.js.map +1 -0
- package/dist/components/UI/Flow/flowBlockRegistry.d.ts +12 -0
- package/dist/components/UI/Flow/flowBlockRegistry.js +20 -0
- package/dist/components/UI/Flow/flowBlockRegistry.js.map +1 -0
- package/dist/components/UI/Flow/flowEditorStore.d.ts +73 -0
- package/dist/components/UI/Flow/flowEditorStore.js +402 -0
- package/dist/components/UI/Flow/flowEditorStore.js.map +1 -0
- package/dist/components/UI/Flow/flowGraph.d.ts +32 -0
- package/dist/components/UI/Flow/flowGraph.js +157 -0
- package/dist/components/UI/Flow/flowGraph.js.map +1 -0
- package/dist/components/UI/Flow/flowTypes.d.ts +104 -0
- package/dist/components/UI/Flow/flowTypes.js +2 -0
- package/dist/components/UI/Flow/flowTypes.js.map +1 -0
- package/dist/components/UI/Flow/flowViewport.d.ts +25 -0
- package/dist/components/UI/Flow/flowViewport.js +31 -0
- package/dist/components/UI/Flow/flowViewport.js.map +1 -0
- package/dist/components/UI/Flow/index.d.ts +13 -0
- package/dist/components/UI/Flow/index.js +44 -0
- package/dist/components/UI/Flow/index.js.map +1 -0
- package/dist/components/UI/Flow/useFlowAnnotationDrawing.d.ts +25 -0
- package/dist/components/UI/Flow/useFlowAnnotationDrawing.js +117 -0
- package/dist/components/UI/Flow/useFlowAnnotationDrawing.js.map +1 -0
- package/dist/components/UI/Flow/useFlowLabels.d.ts +10 -0
- package/dist/components/UI/Flow/useFlowLabels.js +51 -0
- package/dist/components/UI/Flow/useFlowLabels.js.map +1 -0
- package/dist/components/UI/GeneratedByAI.d.ts +2 -0
- package/dist/components/UI/GeneratedByAI.js +12 -0
- package/dist/components/UI/GeneratedByAI.js.map +1 -0
- package/dist/components/UI/HorizontalScrollArea.d.ts +22 -0
- package/dist/components/UI/HorizontalScrollArea.js +74 -0
- package/dist/components/UI/HorizontalScrollArea.js.map +1 -0
- package/dist/components/UI/ImageAiAdjust/ImageAiAdjustDialog.d.ts +21 -0
- package/dist/components/UI/ImageAiAdjust/ImageAiAdjustDialog.js +235 -0
- package/dist/components/UI/ImageAiAdjust/ImageAiAdjustDialog.js.map +1 -0
- package/dist/components/UI/ImageAiAdjust/ImageAiDiscardReasonDialog.d.ts +8 -0
- package/dist/components/UI/ImageAiAdjust/ImageAiDiscardReasonDialog.js +67 -0
- package/dist/components/UI/ImageAiAdjust/ImageAiDiscardReasonDialog.js.map +1 -0
- package/dist/components/UI/ImageAiAdjust/ImageAiVerificationNotice.d.ts +8 -0
- package/dist/components/UI/ImageAiAdjust/ImageAiVerificationNotice.js +39 -0
- package/dist/components/UI/ImageAiAdjust/ImageAiVerificationNotice.js.map +1 -0
- package/dist/components/UI/ImageAiAdjust/imageAiReview.d.ts +22 -0
- package/dist/components/UI/ImageAiAdjust/imageAiReview.js +37 -0
- package/dist/components/UI/ImageAiAdjust/imageAiReview.js.map +1 -0
- package/dist/components/UI/ImageAiAdjust/imageAiVerification.d.ts +19 -0
- package/dist/components/UI/ImageAiAdjust/imageAiVerification.js +25 -0
- package/dist/components/UI/ImageAiAdjust/imageAiVerification.js.map +1 -0
- package/dist/components/UI/ImageAiAdjust/useImageAiAdjust.d.ts +52 -0
- package/dist/components/UI/ImageAiAdjust/useImageAiAdjust.js +109 -0
- package/dist/components/UI/ImageAiAdjust/useImageAiAdjust.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/AnnotationEditor.d.ts +13 -0
- package/dist/components/UI/ImageAnnotator/AnnotationEditor.js +362 -0
- package/dist/components/UI/ImageAnnotator/AnnotationEditor.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/ImageAnnotationDialog.d.ts +15 -0
- package/dist/components/UI/ImageAnnotator/ImageAnnotationDialog.js +61 -0
- package/dist/components/UI/ImageAnnotator/ImageAnnotationDialog.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/annotationStyle.d.ts +28 -0
- package/dist/components/UI/ImageAnnotator/annotationStyle.js +56 -0
- package/dist/components/UI/ImageAnnotator/annotationStyle.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationCropFrame.d.ts +16 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationCropFrame.js +156 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationCropFrame.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationElementNode.d.ts +17 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationElementNode.js +329 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationElementNode.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationSelection.d.ts +10 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationSelection.js +127 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationSelection.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationStage.d.ts +26 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationStage.js +241 -0
- package/dist/components/UI/ImageAnnotator/canvas/AnnotationStage.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationActionBar.d.ts +15 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationActionBar.js +77 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationActionBar.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationColorPopover.d.ts +11 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationColorPopover.js +70 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationColorPopover.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationCropBar.d.ts +12 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationCropBar.js +89 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationCropBar.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationElementActions.d.ts +8 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationElementActions.js +58 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationElementActions.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationStyleBar.d.ts +13 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationStyleBar.js +183 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationStyleBar.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationTextOverlay.d.ts +17 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationTextOverlay.js +79 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationTextOverlay.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationToolButton.d.ts +15 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationToolButton.js +46 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationToolButton.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationToolbar.d.ts +10 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationToolbar.js +91 -0
- package/dist/components/UI/ImageAnnotator/components/AnnotationToolbar.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/helpers/annotationCanvas.d.ts +21 -0
- package/dist/components/UI/ImageAnnotator/helpers/annotationCanvas.js +45 -0
- package/dist/components/UI/ImageAnnotator/helpers/annotationCanvas.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/helpers/annotationCrop.d.ts +12 -0
- package/dist/components/UI/ImageAnnotator/helpers/annotationCrop.js +64 -0
- package/dist/components/UI/ImageAnnotator/helpers/annotationCrop.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/helpers/annotationElements.d.ts +15 -0
- package/dist/components/UI/ImageAnnotator/helpers/annotationElements.js +165 -0
- package/dist/components/UI/ImageAnnotator/helpers/annotationElements.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/helpers/annotationExport.d.ts +15 -0
- package/dist/components/UI/ImageAnnotator/helpers/annotationExport.js +23 -0
- package/dist/components/UI/ImageAnnotator/helpers/annotationExport.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/helpers/konvaFullBuild.d.ts +8 -0
- package/dist/components/UI/ImageAnnotator/helpers/konvaFullBuild.js +10 -0
- package/dist/components/UI/ImageAnnotator/helpers/konvaFullBuild.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/hooks/useAnnotationBaseImage.d.ts +9 -0
- package/dist/components/UI/ImageAnnotator/hooks/useAnnotationBaseImage.js +56 -0
- package/dist/components/UI/ImageAnnotator/hooks/useAnnotationBaseImage.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/hooks/useAnnotationDocument.d.ts +29 -0
- package/dist/components/UI/ImageAnnotator/hooks/useAnnotationDocument.js +160 -0
- package/dist/components/UI/ImageAnnotator/hooks/useAnnotationDocument.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/hooks/useAnnotationShortcuts.d.ts +14 -0
- package/dist/components/UI/ImageAnnotator/hooks/useAnnotationShortcuts.js +80 -0
- package/dist/components/UI/ImageAnnotator/hooks/useAnnotationShortcuts.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/hooks/useCoarsePointer.d.ts +5 -0
- package/dist/components/UI/ImageAnnotator/hooks/useCoarsePointer.js +23 -0
- package/dist/components/UI/ImageAnnotator/hooks/useCoarsePointer.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/hooks/useHtmlImage.d.ts +2 -0
- package/dist/components/UI/ImageAnnotator/hooks/useHtmlImage.js +27 -0
- package/dist/components/UI/ImageAnnotator/hooks/useHtmlImage.js.map +1 -0
- package/dist/components/UI/ImageAnnotator/interfaces/annotationDocument.d.ts +98 -0
- package/dist/components/UI/ImageAnnotator/interfaces/annotationDocument.js +13 -0
- package/dist/components/UI/ImageAnnotator/interfaces/annotationDocument.js.map +1 -0
- package/dist/components/UI/ImageMaskPainter/index.d.ts +24 -0
- package/dist/components/UI/ImageMaskPainter/index.js +284 -0
- package/dist/components/UI/ImageMaskPainter/index.js.map +1 -0
- package/dist/components/UI/ImageMaskPainter/maskStrokes.d.ts +19 -0
- package/dist/components/UI/ImageMaskPainter/maskStrokes.js +71 -0
- package/dist/components/UI/ImageMaskPainter/maskStrokes.js.map +1 -0
- package/dist/components/UI/ImagePlaceholder.d.ts +24 -0
- package/dist/components/UI/ImagePlaceholder.js +29 -0
- package/dist/components/UI/ImagePlaceholder.js.map +1 -0
- package/dist/components/UI/ImageZoomOverlay.d.ts +7 -0
- package/dist/components/UI/ImageZoomOverlay.js +53 -0
- package/dist/components/UI/ImageZoomOverlay.js.map +1 -0
- package/dist/components/UI/InformationCard.d.ts +26 -0
- package/dist/components/UI/InformationCard.js +89 -0
- package/dist/components/UI/InformationCard.js.map +1 -0
- package/dist/components/UI/Kanban/KanbanBoard.d.ts +26 -0
- package/dist/components/UI/Kanban/KanbanBoard.js +91 -0
- package/dist/components/UI/Kanban/KanbanBoard.js.map +1 -0
- package/dist/components/UI/Kanban/KanbanCard.d.ts +22 -0
- package/dist/components/UI/Kanban/KanbanCard.js +47 -0
- package/dist/components/UI/Kanban/KanbanCard.js.map +1 -0
- package/dist/components/UI/Kanban/KanbanLane.d.ts +37 -0
- package/dist/components/UI/Kanban/KanbanLane.js +77 -0
- package/dist/components/UI/Kanban/KanbanLane.js.map +1 -0
- package/dist/components/UI/Kanban/index.d.ts +4 -0
- package/dist/components/UI/Kanban/index.js +11 -0
- package/dist/components/UI/Kanban/index.js.map +1 -0
- package/dist/components/UI/Kanban/kanbanBoardContext.d.ts +13 -0
- package/dist/components/UI/Kanban/kanbanBoardContext.js +13 -0
- package/dist/components/UI/Kanban/kanbanBoardContext.js.map +1 -0
- package/dist/components/UI/LazyMarkdown.d.ts +5 -0
- package/dist/components/UI/LazyMarkdown.js +8 -0
- package/dist/components/UI/LazyMarkdown.js.map +1 -0
- package/dist/components/UI/LoadingPage.d.ts +2 -0
- package/dist/components/UI/LoadingPage.js +13 -0
- package/dist/components/UI/LoadingPage.js.map +1 -0
- package/dist/components/UI/LoadingSpinner.d.ts +14 -0
- package/dist/components/UI/LoadingSpinner.js +32 -0
- package/dist/components/UI/LoadingSpinner.js.map +1 -0
- package/dist/components/UI/MaterialSymbol/consts.d.ts +2 -0
- package/dist/components/UI/MaterialSymbol/consts.js +3472 -0
- package/dist/components/UI/MaterialSymbol/consts.js.map +1 -0
- package/dist/components/UI/MaterialSymbol/index.d.ts +18 -0
- package/dist/components/UI/MaterialSymbol/index.js +51 -0
- package/dist/components/UI/MaterialSymbol/index.js.map +1 -0
- package/dist/components/UI/MaterialSymbol/types.d.ts +37 -0
- package/dist/components/UI/MaterialSymbol/types.js +2 -0
- package/dist/components/UI/MaterialSymbol/types.js.map +1 -0
- package/dist/components/UI/NoDataFound/index.d.ts +31 -0
- package/dist/components/UI/NoDataFound/index.js +215 -0
- package/dist/components/UI/NoDataFound/index.js.map +1 -0
- package/dist/components/UI/NoDataFound/noDataFoundPresets.d.ts +31 -0
- package/dist/components/UI/NoDataFound/noDataFoundPresets.js +99 -0
- package/dist/components/UI/NoDataFound/noDataFoundPresets.js.map +1 -0
- package/dist/components/UI/ReferenceCard.d.ts +16 -0
- package/dist/components/UI/ReferenceCard.js +59 -0
- package/dist/components/UI/ReferenceCard.js.map +1 -0
- package/dist/components/UI/RichTextContent.d.ts +14 -0
- package/dist/components/UI/RichTextContent.js +30 -0
- package/dist/components/UI/RichTextContent.js.map +1 -0
- package/dist/components/UI/SkeletonLoading.d.ts +9 -0
- package/dist/components/UI/SkeletonLoading.js +20 -0
- package/dist/components/UI/SkeletonLoading.js.map +1 -0
- package/dist/components/UI/ThreeDots.d.ts +11 -0
- package/dist/components/UI/ThreeDots.js +22 -0
- package/dist/components/UI/ThreeDots.js.map +1 -0
- package/dist/components/UI/Toast.d.ts +16 -0
- package/dist/components/UI/Toast.js +81 -0
- package/dist/components/UI/Toast.js.map +1 -0
- package/dist/components/UI/ToastHost.d.ts +2 -0
- package/dist/components/UI/ToastHost.js +25 -0
- package/dist/components/UI/ToastHost.js.map +1 -0
- package/dist/components/UI/TypingEffect.d.ts +10 -0
- package/dist/components/UI/TypingEffect.js +31 -0
- package/dist/components/UI/TypingEffect.js.map +1 -0
- package/dist/components/UI/UmodeLogo.d.ts +10 -0
- package/dist/components/UI/UmodeLogo.js +128 -0
- package/dist/components/UI/UmodeLogo.js.map +1 -0
- package/dist/components/UI/UserMenu.d.ts +50 -0
- package/dist/components/UI/UserMenu.js +212 -0
- package/dist/components/UI/UserMenu.js.map +1 -0
- package/dist/components/UI/UsersAvatar.d.ts +7 -0
- package/dist/components/UI/UsersAvatar.js +29 -0
- package/dist/components/UI/UsersAvatar.js.map +1 -0
- package/dist/components/UI/access/UiAccessContext.d.ts +21 -0
- package/dist/components/UI/access/UiAccessContext.js +14 -0
- package/dist/components/UI/access/UiAccessContext.js.map +1 -0
- package/dist/components/UI/cells/ArrayCell.d.ts +5 -0
- package/dist/components/UI/cells/ArrayCell.js +25 -0
- package/dist/components/UI/cells/ArrayCell.js.map +1 -0
- package/dist/components/UI/cells/BooleanCell.d.ts +5 -0
- package/dist/components/UI/cells/BooleanCell.js +22 -0
- package/dist/components/UI/cells/BooleanCell.js.map +1 -0
- package/dist/components/UI/cells/DetailsTableCell.d.ts +7 -0
- package/dist/components/UI/cells/DetailsTableCell.js +30 -0
- package/dist/components/UI/cells/DetailsTableCell.js.map +1 -0
- package/dist/components/UI/cells/ProductImageCell.d.ts +5 -0
- package/dist/components/UI/cells/ProductImageCell.js +21 -0
- package/dist/components/UI/cells/ProductImageCell.js.map +1 -0
- package/dist/components/UI/cells/UrlLinkCell.d.ts +6 -0
- package/dist/components/UI/cells/UrlLinkCell.js +19 -0
- package/dist/components/UI/cells/UrlLinkCell.js.map +1 -0
- package/dist/components/Upload/SimpleUploaderComponent.d.ts +9 -0
- package/dist/components/Upload/SimpleUploaderComponent.js +72 -0
- package/dist/components/Upload/SimpleUploaderComponent.js.map +1 -0
- package/dist/components/Upload/UploaderComponent.d.ts +29 -0
- package/dist/components/Upload/UploaderComponent.js +241 -0
- package/dist/components/Upload/UploaderComponent.js.map +1 -0
- package/dist/components/Upload/XlsExportButton.d.ts +13 -0
- package/dist/components/Upload/XlsExportButton.js +47 -0
- package/dist/components/Upload/XlsExportButton.js.map +1 -0
- package/dist/helpers/composeRefs.d.ts +7 -0
- package/dist/helpers/composeRefs.js +14 -0
- package/dist/helpers/composeRefs.js.map +1 -0
- package/dist/helpers/dateHelpers.d.ts +47 -0
- package/dist/helpers/dateHelpers.js +69 -0
- package/dist/helpers/dateHelpers.js.map +1 -0
- package/dist/helpers/fileAttachments.d.ts +3 -0
- package/dist/helpers/fileAttachments.js +17 -0
- package/dist/helpers/fileAttachments.js.map +1 -0
- package/dist/helpers/formatHelpers.d.ts +36 -0
- package/dist/helpers/formatHelpers.js +65 -0
- package/dist/helpers/formatHelpers.js.map +1 -0
- package/dist/helpers/iconFont.d.ts +9 -0
- package/dist/helpers/iconFont.js +37 -0
- package/dist/helpers/iconFont.js.map +1 -0
- package/dist/helpers/imageCompression.d.ts +5 -0
- package/dist/helpers/imageCompression.js +49 -0
- package/dist/helpers/imageCompression.js.map +1 -0
- package/dist/helpers/imageFile.d.ts +32 -0
- package/dist/helpers/imageFile.js +108 -0
- package/dist/helpers/imageFile.js.map +1 -0
- package/dist/helpers/layeredSurfaces.d.ts +28 -0
- package/dist/helpers/layeredSurfaces.js +19 -0
- package/dist/helpers/layeredSurfaces.js.map +1 -0
- package/dist/helpers/mathHelpers.d.ts +14 -0
- package/dist/helpers/mathHelpers.js +13 -0
- package/dist/helpers/mathHelpers.js.map +1 -0
- package/dist/helpers/mergeClasses.d.ts +10 -0
- package/dist/helpers/mergeClasses.js +34 -0
- package/dist/helpers/mergeClasses.js.map +1 -0
- package/dist/helpers/moduleLoadErrorHelpers.d.ts +1 -0
- package/dist/helpers/moduleLoadErrorHelpers.js +25 -0
- package/dist/helpers/moduleLoadErrorHelpers.js.map +1 -0
- package/dist/helpers/objectHelpers.d.ts +13 -0
- package/dist/helpers/objectHelpers.js +59 -0
- package/dist/helpers/objectHelpers.js.map +1 -0
- package/dist/helpers/portalHost.d.ts +10 -0
- package/dist/helpers/portalHost.js +7 -0
- package/dist/helpers/portalHost.js.map +1 -0
- package/dist/helpers/richText.d.ts +46 -0
- package/dist/helpers/richText.js +197 -0
- package/dist/helpers/richText.js.map +1 -0
- package/dist/helpers/stringHelpers.d.ts +45 -0
- package/dist/helpers/stringHelpers.js +57 -0
- package/dist/helpers/stringHelpers.js.map +1 -0
- package/dist/helpers/themeSkins.d.ts +12 -0
- package/dist/helpers/themeSkins.js +13 -0
- package/dist/helpers/themeSkins.js.map +1 -0
- package/dist/helpers/themeTokens.d.ts +28 -0
- package/dist/helpers/themeTokens.js +35 -0
- package/dist/helpers/themeTokens.js.map +1 -0
- package/dist/helpers/uiErrorPresenter.d.ts +21 -0
- package/dist/helpers/uiErrorPresenter.js +10 -0
- package/dist/helpers/uiErrorPresenter.js.map +1 -0
- package/dist/helpers/uiLogger.d.ts +8 -0
- package/dist/helpers/uiLogger.js +16 -0
- package/dist/helpers/uiLogger.js.map +1 -0
- package/dist/helpers/uiPreferences.d.ts +13 -0
- package/dist/helpers/uiPreferences.js +35 -0
- package/dist/helpers/uiPreferences.js.map +1 -0
- package/dist/helpers/urlParamSync.d.ts +19 -0
- package/dist/helpers/urlParamSync.js +54 -0
- package/dist/helpers/urlParamSync.js.map +1 -0
- package/dist/helpers/utilityHelpers.d.ts +81 -0
- package/dist/helpers/utilityHelpers.js +133 -0
- package/dist/helpers/utilityHelpers.js.map +1 -0
- package/dist/helpers/validationHelpers.d.ts +36 -0
- package/dist/helpers/validationHelpers.js +44 -0
- package/dist/helpers/validationHelpers.js.map +1 -0
- package/dist/hooks/useAnchoredFloating.d.ts +22 -0
- package/dist/hooks/useAnchoredFloating.js +59 -0
- package/dist/hooks/useAnchoredFloating.js.map +1 -0
- package/dist/hooks/useBreakpoint.d.ts +16 -0
- package/dist/hooks/useBreakpoint.js +47 -0
- package/dist/hooks/useBreakpoint.js.map +1 -0
- package/dist/hooks/useDebounce.d.ts +8 -0
- package/dist/hooks/useDebounce.js +36 -0
- package/dist/hooks/useDebounce.js.map +1 -0
- package/dist/hooks/useFileAttachments.d.ts +43 -0
- package/dist/hooks/useFileAttachments.js +158 -0
- package/dist/hooks/useFileAttachments.js.map +1 -0
- package/dist/hooks/useHoverCapable.d.ts +6 -0
- package/dist/hooks/useHoverCapable.js +28 -0
- package/dist/hooks/useHoverCapable.js.map +1 -0
- package/dist/hooks/useInlineEditor.d.ts +5 -0
- package/dist/hooks/useInlineEditor.js +42 -0
- package/dist/hooks/useInlineEditor.js.map +1 -0
- package/dist/hooks/useMobile.d.ts +7 -0
- package/dist/hooks/useMobile.js +8 -0
- package/dist/hooks/useMobile.js.map +1 -0
- package/dist/hooks/useNotification.d.ts +38 -0
- package/dist/hooks/useNotification.js +39 -0
- package/dist/hooks/useNotification.js.map +1 -0
- package/dist/hooks/useResolvedTheme.d.ts +7 -0
- package/dist/hooks/useResolvedTheme.js +15 -0
- package/dist/hooks/useResolvedTheme.js.map +1 -0
- package/dist/hooks/useThemeSkin.d.ts +7 -0
- package/dist/hooks/useThemeSkin.js +19 -0
- package/dist/hooks/useThemeSkin.js.map +1 -0
- package/dist/hooks/useVoiceTranscription.d.ts +29 -0
- package/dist/hooks/useVoiceTranscription.js +208 -0
- package/dist/hooks/useVoiceTranscription.js.map +1 -0
- package/dist/index.d.ts +63 -0
- package/dist/index.js +157 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/IFileAttachment.d.ts +18 -0
- package/dist/interfaces/IFileAttachment.js +2 -0
- package/dist/interfaces/IFileAttachment.js.map +1 -0
- package/dist/interfaces/IFilterOption.d.ts +12 -0
- package/dist/interfaces/IFilterOption.js +2 -0
- package/dist/interfaces/IFilterOption.js.map +1 -0
- package/dist/locales/en/ui.json.d.ts +682 -0
- package/dist/locales/en/ui.json.js +120 -0
- package/dist/locales/en/ui.json.js.map +1 -0
- package/dist/locales/index.d.ts +1362 -0
- package/dist/locales/index.js +7 -0
- package/dist/locales/index.js.map +1 -0
- package/dist/locales/pt/ui.json.d.ts +682 -0
- package/dist/locales/pt/ui.json.js +120 -0
- package/dist/locales/pt/ui.json.js.map +1 -0
- package/dist/motion/index.d.ts +2 -0
- package/dist/motion/index.js +17 -0
- package/dist/motion/index.js.map +1 -0
- package/dist/motion/motionPresets.d.ts +44 -0
- package/dist/motion/motionPresets.js +67 -0
- package/dist/motion/motionPresets.js.map +1 -0
- package/dist/motion/motionTokens.d.ts +40 -0
- package/dist/motion/motionTokens.js +29 -0
- package/dist/motion/motionTokens.js.map +1 -0
- package/package.json +245 -0
- package/src/assets/fonts/LICENSE-Inter.txt +92 -0
- package/src/assets/fonts/LICENSE-MaterialSymbols.txt +202 -0
- package/src/assets/fonts/LICENSE-Virgil.txt +45 -0
- package/src/assets/fonts/inter-latin-ext.woff2 +0 -0
- package/src/assets/fonts/inter-latin.woff2 +0 -0
- package/src/assets/fonts/material-symbols-outlined.woff2 +0 -0
- package/src/assets/fonts/virgil.woff2 +0 -0
- package/src/assets/styles/base.css +585 -0
- package/src/assets/styles/index.css +1 -0
- package/src/assets/styles/theme.css +453 -0
- package/tailwind-plugins/glass.js +162 -0
- package/tailwind.preset.js +392 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { IDataTableFiltersConfig, IDataTableRow, IDataTableSortState, TDataTableDataMode, TDataTableFilterValues, TDataTableViewMode } from './types';
|
|
2
|
+
import { IDataTablePagination } from './useDataTableInstance';
|
|
3
|
+
export interface IDataTableFetchParams {
|
|
4
|
+
page: number;
|
|
5
|
+
size: number;
|
|
6
|
+
/** Server mode only. */
|
|
7
|
+
search?: string;
|
|
8
|
+
/** Server mode only. */
|
|
9
|
+
sort?: IDataTableSortState | null;
|
|
10
|
+
/** Server mode only: built from the active filters' `toServerParams`. */
|
|
11
|
+
filterParams: Record<string, unknown>;
|
|
12
|
+
/**
|
|
13
|
+
* Server mode only. Aborted when this load is superseded (params changed) or the
|
|
14
|
+
* table unmounts. Pass it to the HTTP layer (axios `signal`) so stale requests are
|
|
15
|
+
* cancelled instead of left pending.
|
|
16
|
+
*/
|
|
17
|
+
signal?: AbortSignal;
|
|
18
|
+
}
|
|
19
|
+
export interface IDataTableFetchResult<T> {
|
|
20
|
+
data: Array<T>;
|
|
21
|
+
total: number;
|
|
22
|
+
}
|
|
23
|
+
export type TDataTableFetchPage<T> = (params: IDataTableFetchParams) => Promise<IDataTableFetchResult<T>>;
|
|
24
|
+
interface IUseDataTableSourceParams<T extends IDataTableRow> {
|
|
25
|
+
/** The single switch: mirror `config.dataMode`. `client` = bulk + in-memory; `server` = paginated. */
|
|
26
|
+
dataMode: TDataTableDataMode | undefined;
|
|
27
|
+
/** The table's filter config: drives in-memory (client) or server params. */
|
|
28
|
+
filters?: IDataTableFiltersConfig<T>;
|
|
29
|
+
/** Fetches one page of ALREADY ROW-SHAPED data. Same function feeds both modes. */
|
|
30
|
+
fetchPage: TDataTableFetchPage<T>;
|
|
31
|
+
/** Drawer filter values (applied in memory in client mode, sent as params in server mode). */
|
|
32
|
+
filterValues?: TDataTableFilterValues;
|
|
33
|
+
/**
|
|
34
|
+
* Server mode only: page-level backend params outside the drawer filters (time
|
|
35
|
+
* window, partner scope). Merged into `filterParams` and into the reload key, so
|
|
36
|
+
* changing them refetches from page 1 — closures inside `fetchPage` do NOT
|
|
37
|
+
* retrigger loads (the fetch runs through a ref) and silently go stale.
|
|
38
|
+
* MUST be reference-stable per value (useMemo); an inline object literal here
|
|
39
|
+
* recreates the params every render and re-fires the load effect.
|
|
40
|
+
*/
|
|
41
|
+
serverParams?: Record<string, unknown>;
|
|
42
|
+
/** Bump to force a reload (e.g. after a mutation). */
|
|
43
|
+
reloadToken?: number;
|
|
44
|
+
bulkPageSize?: number;
|
|
45
|
+
serverPageSize?: number;
|
|
46
|
+
/**
|
|
47
|
+
* Current view mode (server mode only). When `cards`, server pages are appended
|
|
48
|
+
* for infinite scroll (`cardsInfinite`); when `list`, they replace, page by page.
|
|
49
|
+
*/
|
|
50
|
+
viewMode?: TDataTableViewMode;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Everything a `DataTable` consumer needs, decided by `dataMode` alone. Spread the
|
|
54
|
+
* server-mode props (`onSearch`/`sort`/`onSortChange`/`pagination`) into the table;
|
|
55
|
+
* in client mode they are `undefined` and the table does search/sort/pagination
|
|
56
|
+
* itself. Read `filteredCount`/`totalCount` for the "Showing X of Y" headline.
|
|
57
|
+
*/
|
|
58
|
+
export interface IDataTableSource<T extends IDataTableRow> {
|
|
59
|
+
rows: Array<T>;
|
|
60
|
+
loading: boolean;
|
|
61
|
+
error: boolean;
|
|
62
|
+
/** The caught error itself, for the surface to say WHY the load failed. */
|
|
63
|
+
errorCause: unknown;
|
|
64
|
+
onRetry: () => void;
|
|
65
|
+
reload: () => void;
|
|
66
|
+
filteredCount: number;
|
|
67
|
+
totalCount: number;
|
|
68
|
+
onFilteredCountChange: (count: number) => void;
|
|
69
|
+
onSearch?: (value: string) => void;
|
|
70
|
+
sort?: IDataTableSortState | null;
|
|
71
|
+
onSortChange?: (sort: IDataTableSortState | null) => void;
|
|
72
|
+
pagination?: IDataTablePagination;
|
|
73
|
+
/**
|
|
74
|
+
* Server mode + Cards view only. Drives the cards infinite scroll: the table
|
|
75
|
+
* observes the bottom sentinel and calls `loadMore` while `hasMore`. Undefined
|
|
76
|
+
* in list view or client mode (both keep their existing paging behaviour).
|
|
77
|
+
*/
|
|
78
|
+
cardsInfinite?: {
|
|
79
|
+
hasMore: boolean;
|
|
80
|
+
loadingMore: boolean;
|
|
81
|
+
loadMore: () => void;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export declare const useDataTableSource: <T extends IDataTableRow>({ dataMode, filters, fetchPage, filterValues, serverParams, reloadToken, bulkPageSize, serverPageSize, viewMode, }: IUseDataTableSourceParams<T>) => IDataTableSource<T>;
|
|
85
|
+
export {};
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { useState, useRef, useEffect, useCallback, useMemo } from "react";
|
|
2
|
+
import { uiLogger } from "../../../helpers/uiLogger.js";
|
|
3
|
+
import { buildDataTableFilterParams, applyDataTableFilters } from "./applyDataTableFilters.js";
|
|
4
|
+
const BULK_PAGE_SIZE = 2e3;
|
|
5
|
+
const SERVER_PAGE_SIZE = 20;
|
|
6
|
+
const EMPTY_FILTER_VALUES = {};
|
|
7
|
+
const useDataTableSource = ({
|
|
8
|
+
dataMode,
|
|
9
|
+
filters,
|
|
10
|
+
fetchPage,
|
|
11
|
+
filterValues = EMPTY_FILTER_VALUES,
|
|
12
|
+
serverParams,
|
|
13
|
+
reloadToken = 0,
|
|
14
|
+
bulkPageSize = BULK_PAGE_SIZE,
|
|
15
|
+
serverPageSize = SERVER_PAGE_SIZE,
|
|
16
|
+
viewMode
|
|
17
|
+
}) => {
|
|
18
|
+
const isClient = dataMode === "client";
|
|
19
|
+
const [loadedRows, setLoadedRows] = useState([]);
|
|
20
|
+
const [loading, setLoading] = useState(true);
|
|
21
|
+
const [loadingMore, setLoadingMore] = useState(false);
|
|
22
|
+
const [error, setError] = useState(false);
|
|
23
|
+
const [errorCause, setErrorCause] = useState(null);
|
|
24
|
+
const [total, setTotal] = useState(0);
|
|
25
|
+
const [reachedEnd, setReachedEnd] = useState(false);
|
|
26
|
+
const appendNextRef = useRef(false);
|
|
27
|
+
const [page, setPage] = useState(1);
|
|
28
|
+
const [pageSize, setPageSize] = useState(serverPageSize);
|
|
29
|
+
const [search, setSearch] = useState("");
|
|
30
|
+
const [sort, setSort] = useState(null);
|
|
31
|
+
const [clientFilteredCount, setClientFilteredCount] = useState(0);
|
|
32
|
+
const fetchPageRef = useRef(fetchPage);
|
|
33
|
+
fetchPageRef.current = fetchPage;
|
|
34
|
+
const inFlightRef = useRef(null);
|
|
35
|
+
const reloadTokenRef = useRef(reloadToken);
|
|
36
|
+
reloadTokenRef.current = reloadToken;
|
|
37
|
+
useEffect(
|
|
38
|
+
() => () => {
|
|
39
|
+
inFlightRef.current?.controller.abort();
|
|
40
|
+
},
|
|
41
|
+
[]
|
|
42
|
+
);
|
|
43
|
+
const runClientLoad = useCallback(async () => {
|
|
44
|
+
setLoading(true);
|
|
45
|
+
setError(false);
|
|
46
|
+
setErrorCause(null);
|
|
47
|
+
try {
|
|
48
|
+
const first = await fetchPageRef.current({ page: 1, size: bulkPageSize, filterParams: {} });
|
|
49
|
+
const accumulated = [...first.data];
|
|
50
|
+
const lastPage = Math.max(1, Math.ceil((first.total || accumulated.length) / bulkPageSize));
|
|
51
|
+
if (lastPage > 1) {
|
|
52
|
+
const rest = await Promise.all(
|
|
53
|
+
Array.from(
|
|
54
|
+
{ length: lastPage - 1 },
|
|
55
|
+
(_, index) => fetchPageRef.current({ page: index + 2, size: bulkPageSize, filterParams: {} })
|
|
56
|
+
)
|
|
57
|
+
);
|
|
58
|
+
rest.forEach((result) => accumulated.push(...result.data));
|
|
59
|
+
}
|
|
60
|
+
setLoadedRows(accumulated);
|
|
61
|
+
setTotal(accumulated.length);
|
|
62
|
+
} catch (loadError) {
|
|
63
|
+
uiLogger.error("DataTable client load failed", loadError);
|
|
64
|
+
setError(true);
|
|
65
|
+
setErrorCause(loadError);
|
|
66
|
+
setLoadedRows([]);
|
|
67
|
+
} finally {
|
|
68
|
+
setLoading(false);
|
|
69
|
+
}
|
|
70
|
+
}, [bulkPageSize]);
|
|
71
|
+
const nextServerFilterParams = { ...serverParams, ...buildDataTableFilterParams(filters, filterValues) };
|
|
72
|
+
const serverFilterParamsKey = JSON.stringify(nextServerFilterParams);
|
|
73
|
+
const serverFilterParams = useMemo(() => nextServerFilterParams, [serverFilterParamsKey]);
|
|
74
|
+
const runServerLoad = useCallback(async () => {
|
|
75
|
+
const isAppend = appendNextRef.current;
|
|
76
|
+
appendNextRef.current = false;
|
|
77
|
+
const requestKey = JSON.stringify({
|
|
78
|
+
page,
|
|
79
|
+
pageSize,
|
|
80
|
+
search,
|
|
81
|
+
sort,
|
|
82
|
+
filters: serverFilterParams,
|
|
83
|
+
reloadToken: reloadTokenRef.current,
|
|
84
|
+
isAppend
|
|
85
|
+
});
|
|
86
|
+
const liveLoad = inFlightRef.current;
|
|
87
|
+
if (liveLoad && liveLoad.key === requestKey && !liveLoad.controller.signal.aborted) return;
|
|
88
|
+
liveLoad?.controller.abort();
|
|
89
|
+
const controller = new AbortController();
|
|
90
|
+
inFlightRef.current = { key: requestKey, controller };
|
|
91
|
+
if (isAppend) setLoadingMore(true);
|
|
92
|
+
else setLoading(true);
|
|
93
|
+
setError(false);
|
|
94
|
+
setErrorCause(null);
|
|
95
|
+
try {
|
|
96
|
+
const result = await fetchPageRef.current({
|
|
97
|
+
page,
|
|
98
|
+
size: pageSize,
|
|
99
|
+
search: search || void 0,
|
|
100
|
+
sort,
|
|
101
|
+
filterParams: serverFilterParams,
|
|
102
|
+
signal: controller.signal
|
|
103
|
+
});
|
|
104
|
+
if (controller.signal.aborted) return;
|
|
105
|
+
setLoadedRows((previous) => isAppend ? [...previous, ...result.data] : result.data);
|
|
106
|
+
setTotal(result.total);
|
|
107
|
+
if (isAppend && result.data.length === 0) setReachedEnd(true);
|
|
108
|
+
else if (!isAppend) setReachedEnd(false);
|
|
109
|
+
} catch (loadError) {
|
|
110
|
+
if (controller.signal.aborted) return;
|
|
111
|
+
uiLogger.error("DataTable server load failed", loadError);
|
|
112
|
+
setError(true);
|
|
113
|
+
setErrorCause(loadError);
|
|
114
|
+
if (!isAppend) setLoadedRows([]);
|
|
115
|
+
} finally {
|
|
116
|
+
if (inFlightRef.current?.controller === controller) inFlightRef.current = null;
|
|
117
|
+
if (!controller.signal.aborted) {
|
|
118
|
+
if (isAppend) setLoadingMore(false);
|
|
119
|
+
else setLoading(false);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}, [page, pageSize, search, sort, serverFilterParams]);
|
|
123
|
+
useEffect(() => {
|
|
124
|
+
if (isClient) void runClientLoad();
|
|
125
|
+
}, [isClient, reloadToken, runClientLoad]);
|
|
126
|
+
useEffect(() => {
|
|
127
|
+
if (!isClient) void runServerLoad();
|
|
128
|
+
}, [isClient, reloadToken, runServerLoad]);
|
|
129
|
+
const isInitialQueryRef = useRef(true);
|
|
130
|
+
useEffect(() => {
|
|
131
|
+
if (isInitialQueryRef.current) {
|
|
132
|
+
isInitialQueryRef.current = false;
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
appendNextRef.current = false;
|
|
136
|
+
setPage(1);
|
|
137
|
+
}, [viewMode, serverFilterParams]);
|
|
138
|
+
const isInitialReloadRef = useRef(true);
|
|
139
|
+
useEffect(() => {
|
|
140
|
+
if (isInitialReloadRef.current) {
|
|
141
|
+
isInitialReloadRef.current = false;
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (isClient || viewMode !== "cards") return;
|
|
145
|
+
appendNextRef.current = false;
|
|
146
|
+
setPage(1);
|
|
147
|
+
}, [reloadToken]);
|
|
148
|
+
const rows = useMemo(
|
|
149
|
+
() => isClient ? applyDataTableFilters(loadedRows, filters, filterValues) : loadedRows,
|
|
150
|
+
[isClient, loadedRows, filters, filterValues]
|
|
151
|
+
);
|
|
152
|
+
const loadMoreStateRef = useRef({ loading, loadingMore, loaded: 0, total, reachedEnd });
|
|
153
|
+
loadMoreStateRef.current = { loading, loadingMore, loaded: loadedRows.length, total, reachedEnd };
|
|
154
|
+
const loadMoreCards = useCallback(() => {
|
|
155
|
+
const current = loadMoreStateRef.current;
|
|
156
|
+
if (current.loading || current.loadingMore || current.reachedEnd) return;
|
|
157
|
+
if (current.loaded >= current.total) return;
|
|
158
|
+
appendNextRef.current = true;
|
|
159
|
+
setPage((previous) => previous + 1);
|
|
160
|
+
}, []);
|
|
161
|
+
const pagination = isClient ? void 0 : {
|
|
162
|
+
pageSize,
|
|
163
|
+
numberOfPages: Math.max(1, Math.ceil(total / pageSize)),
|
|
164
|
+
currentPage: page,
|
|
165
|
+
totalItems: total,
|
|
166
|
+
setCurrentPage: setPage,
|
|
167
|
+
onPageSizeChange: (size) => {
|
|
168
|
+
setPageSize(size);
|
|
169
|
+
setPage(1);
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
const reload = isClient ? runClientLoad : runServerLoad;
|
|
173
|
+
return {
|
|
174
|
+
rows,
|
|
175
|
+
loading,
|
|
176
|
+
error,
|
|
177
|
+
errorCause,
|
|
178
|
+
onRetry: reload,
|
|
179
|
+
reload,
|
|
180
|
+
filteredCount: isClient ? clientFilteredCount : total,
|
|
181
|
+
totalCount: total,
|
|
182
|
+
onFilteredCountChange: setClientFilteredCount,
|
|
183
|
+
onSearch: isClient ? void 0 : (value) => {
|
|
184
|
+
setSearch(value);
|
|
185
|
+
setPage(1);
|
|
186
|
+
},
|
|
187
|
+
sort: isClient ? void 0 : sort,
|
|
188
|
+
onSortChange: isClient ? void 0 : (next) => {
|
|
189
|
+
setSort(next);
|
|
190
|
+
setPage(1);
|
|
191
|
+
},
|
|
192
|
+
pagination,
|
|
193
|
+
cardsInfinite: !isClient && viewMode === "cards" ? { hasMore: !reachedEnd && loadedRows.length < total, loadingMore, loadMore: loadMoreCards } : void 0
|
|
194
|
+
};
|
|
195
|
+
};
|
|
196
|
+
export {
|
|
197
|
+
useDataTableSource
|
|
198
|
+
};
|
|
199
|
+
//# sourceMappingURL=useDataTableSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDataTableSource.js","sources":["../../../../src/components/UI/DataTable/useDataTableSource.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { uiLogger } from '@/helpers/uiLogger';\n\nimport { applyDataTableFilters, buildDataTableFilterParams } from './applyDataTableFilters';\nimport type {\n IDataTableFiltersConfig,\n IDataTableRow,\n IDataTableSortState,\n TDataTableDataMode,\n TDataTableFilterValues,\n TDataTableViewMode,\n} from './types';\nimport type { IDataTablePagination } from './useDataTableInstance';\n\nconst BULK_PAGE_SIZE = 2000;\nconst SERVER_PAGE_SIZE = 20;\n\n// Stable reference for the \"no drawer filters\" case. A `= {}` default would be a\n// fresh object every render, invalidating serverFilterParams -> runServerLoad ->\n// the server-load effect, firing a refetch on every render (flicker + request\n// storm) for consumers that do not pass `filterValues`.\nconst EMPTY_FILTER_VALUES: TDataTableFilterValues = {};\n\nexport interface IDataTableFetchParams {\n page: number;\n size: number;\n /** Server mode only. */\n search?: string;\n /** Server mode only. */\n sort?: IDataTableSortState | null;\n /** Server mode only: built from the active filters' `toServerParams`. */\n filterParams: Record<string, unknown>;\n /**\n * Server mode only. Aborted when this load is superseded (params changed) or the\n * table unmounts. Pass it to the HTTP layer (axios `signal`) so stale requests are\n * cancelled instead of left pending.\n */\n signal?: AbortSignal;\n}\n\nexport interface IDataTableFetchResult<T> {\n data: Array<T>;\n total: number;\n}\n\nexport type TDataTableFetchPage<T> = (params: IDataTableFetchParams) => Promise<IDataTableFetchResult<T>>;\n\ninterface IUseDataTableSourceParams<T extends IDataTableRow> {\n /** The single switch: mirror `config.dataMode`. `client` = bulk + in-memory; `server` = paginated. */\n dataMode: TDataTableDataMode | undefined;\n /** The table's filter config: drives in-memory (client) or server params. */\n filters?: IDataTableFiltersConfig<T>;\n /** Fetches one page of ALREADY ROW-SHAPED data. Same function feeds both modes. */\n fetchPage: TDataTableFetchPage<T>;\n /** Drawer filter values (applied in memory in client mode, sent as params in server mode). */\n filterValues?: TDataTableFilterValues;\n /**\n * Server mode only: page-level backend params outside the drawer filters (time\n * window, partner scope). Merged into `filterParams` and into the reload key, so\n * changing them refetches from page 1 — closures inside `fetchPage` do NOT\n * retrigger loads (the fetch runs through a ref) and silently go stale.\n * MUST be reference-stable per value (useMemo); an inline object literal here\n * recreates the params every render and re-fires the load effect.\n */\n serverParams?: Record<string, unknown>;\n /** Bump to force a reload (e.g. after a mutation). */\n reloadToken?: number;\n bulkPageSize?: number;\n serverPageSize?: number;\n /**\n * Current view mode (server mode only). When `cards`, server pages are appended\n * for infinite scroll (`cardsInfinite`); when `list`, they replace, page by page.\n */\n viewMode?: TDataTableViewMode;\n}\n\n/**\n * Everything a `DataTable` consumer needs, decided by `dataMode` alone. Spread the\n * server-mode props (`onSearch`/`sort`/`onSortChange`/`pagination`) into the table;\n * in client mode they are `undefined` and the table does search/sort/pagination\n * itself. Read `filteredCount`/`totalCount` for the \"Showing X of Y\" headline.\n */\nexport interface IDataTableSource<T extends IDataTableRow> {\n rows: Array<T>;\n loading: boolean;\n error: boolean;\n /** The caught error itself, for the surface to say WHY the load failed. */\n errorCause: unknown;\n onRetry: () => void;\n reload: () => void;\n filteredCount: number;\n totalCount: number;\n onFilteredCountChange: (count: number) => void;\n onSearch?: (value: string) => void;\n sort?: IDataTableSortState | null;\n onSortChange?: (sort: IDataTableSortState | null) => void;\n pagination?: IDataTablePagination;\n /**\n * Server mode + Cards view only. Drives the cards infinite scroll: the table\n * observes the bottom sentinel and calls `loadMore` while `hasMore`. Undefined\n * in list view or client mode (both keep their existing paging behaviour).\n */\n cardsInfinite?: {\n hasMore: boolean;\n loadingMore: boolean;\n loadMore: () => void;\n };\n}\n\nexport const useDataTableSource = <T extends IDataTableRow>({\n dataMode,\n filters,\n fetchPage,\n filterValues = EMPTY_FILTER_VALUES,\n serverParams,\n reloadToken = 0,\n bulkPageSize = BULK_PAGE_SIZE,\n serverPageSize = SERVER_PAGE_SIZE,\n viewMode,\n}: IUseDataTableSourceParams<T>): IDataTableSource<T> => {\n const isClient = dataMode === 'client';\n\n // Client: the full set. Server list: the current page. Server cards: pages are\n // appended (infinite scroll), so this accumulates.\n const [loadedRows, setLoadedRows] = useState<Array<T>>([]);\n const [loading, setLoading] = useState(true);\n // Appending the next cards page keeps the loaded rows visible (no skeleton/dim):\n // a separate flag drives the bottom \"loading more\" spinner only.\n const [loadingMore, setLoadingMore] = useState(false);\n const [error, setError] = useState(false);\n const [errorCause, setErrorCause] = useState<unknown>(null);\n const [total, setTotal] = useState(0);\n // Guards the cards infinite scroll against a backend that reports more rows than\n // it returns: once an appended page comes back empty, stop asking for more.\n const [reachedEnd, setReachedEnd] = useState(false);\n\n // Set right before a page bump when the next server load must append (cards\n // infinite scroll) instead of replacing. Read and reset inside the load.\n const appendNextRef = useRef(false);\n\n // Server-mode round-trip state.\n const [page, setPage] = useState(1);\n const [pageSize, setPageSize] = useState(serverPageSize);\n const [search, setSearch] = useState('');\n const [sort, setSort] = useState<IDataTableSortState | null>(null);\n\n // Client-mode post-search count reported by the table (for the headline).\n const [clientFilteredCount, setClientFilteredCount] = useState(0);\n\n // The consumer passes an inline `fetchPage`; a ref keeps the load callbacks\n // stable while always calling the latest closure.\n const fetchPageRef = useRef(fetchPage);\n fetchPageRef.current = fetchPage;\n\n // Circuit breaker + cancelamento: refuses to start a server load identical\n // (same page/search/sort/filters/token) to one already LIVE in flight — without\n // it, any consumer that destabilizes the load deps re-fires the effect every\n // render and floods the backend with thousands of parallel duplicates until the\n // tab freezes (the admin sessions 401 storm). A DIFFERENT load aborts the\n // previous one (params changed mid-flight) and takes ownership of the state;\n // unmount aborts whatever is pending. A retry after settle passes normally.\n const inFlightRef = useRef<{ key: string; controller: AbortController } | null>(null);\n const reloadTokenRef = useRef(reloadToken);\n reloadTokenRef.current = reloadToken;\n\n useEffect(\n () => () => {\n inFlightRef.current?.controller.abort();\n },\n [],\n );\n\n // Client: first (large) page to learn the total, then any remaining pages in\n // parallel. No filter/search/sort params, everything is applied in memory.\n const runClientLoad = useCallback(async () => {\n setLoading(true);\n setError(false);\n setErrorCause(null);\n\n try {\n const first = await fetchPageRef.current({ page: 1, size: bulkPageSize, filterParams: {} });\n const accumulated = [...first.data];\n const lastPage = Math.max(1, Math.ceil((first.total || accumulated.length) / bulkPageSize));\n\n if (lastPage > 1) {\n const rest = await Promise.all(\n Array.from({ length: lastPage - 1 }, (_, index) =>\n fetchPageRef.current({ page: index + 2, size: bulkPageSize, filterParams: {} }),\n ),\n );\n rest.forEach((result) => accumulated.push(...result.data));\n }\n\n setLoadedRows(accumulated);\n setTotal(accumulated.length);\n } catch (loadError) {\n uiLogger.error('DataTable client load failed', loadError);\n setError(true);\n setErrorCause(loadError);\n setLoadedRows([]);\n } finally {\n setLoading(false);\n }\n }, [bulkPageSize]);\n\n // Stabilize by VALUE, not by reference: a parent re-render can hand us a new\n // `filters`/`filterValues`/`serverParams` object that produces identical params.\n // Keying the memo on the serialized params keeps the same reference across such\n // re-renders, so `runServerLoad` (and its effect) does not refire and issue a\n // duplicate request. Drawer filters win over page-level serverParams on key clash.\n const nextServerFilterParams = { ...serverParams, ...buildDataTableFilterParams(filters, filterValues) };\n const serverFilterParamsKey = JSON.stringify(nextServerFilterParams);\n const serverFilterParams = useMemo(() => nextServerFilterParams, [serverFilterParamsKey]);\n\n // Server: one page, with search/sort/filters as backend params. In cards view\n // the next page is appended (infinite scroll); otherwise it replaces.\n const runServerLoad = useCallback(async () => {\n const isAppend = appendNextRef.current;\n appendNextRef.current = false;\n\n const requestKey = JSON.stringify({\n page,\n pageSize,\n search,\n sort,\n filters: serverFilterParams,\n reloadToken: reloadTokenRef.current,\n isAppend,\n });\n const liveLoad = inFlightRef.current;\n if (liveLoad && liveLoad.key === requestKey && !liveLoad.controller.signal.aborted) return;\n liveLoad?.controller.abort();\n\n const controller = new AbortController();\n inFlightRef.current = { key: requestKey, controller };\n\n if (isAppend) setLoadingMore(true);\n else setLoading(true);\n setError(false);\n setErrorCause(null);\n\n try {\n const result = await fetchPageRef.current({\n page,\n size: pageSize,\n search: search || undefined,\n sort,\n filterParams: serverFilterParams,\n signal: controller.signal,\n });\n if (controller.signal.aborted) return;\n setLoadedRows((previous) => (isAppend ? [...previous, ...result.data] : result.data));\n setTotal(result.total);\n if (isAppend && result.data.length === 0) setReachedEnd(true);\n else if (!isAppend) setReachedEnd(false);\n } catch (loadError) {\n // Um load abortado foi substituído por outro (ou o componente saiu de cena):\n // o estado pertence ao load mais novo; não é erro.\n if (controller.signal.aborted) return;\n uiLogger.error('DataTable server load failed', loadError);\n setError(true);\n setErrorCause(loadError);\n if (!isAppend) setLoadedRows([]);\n } finally {\n if (inFlightRef.current?.controller === controller) inFlightRef.current = null;\n if (!controller.signal.aborted) {\n if (isAppend) setLoadingMore(false);\n else setLoading(false);\n }\n }\n }, [page, pageSize, search, sort, serverFilterParams]);\n\n // Client reloads only on mount / reloadToken (filters are in-memory). Server\n // reloads whenever page/size/search/sort/filters change, or on reloadToken.\n useEffect(() => {\n if (isClient) void runClientLoad();\n }, [isClient, reloadToken, runClientLoad]);\n\n useEffect(() => {\n if (!isClient) void runServerLoad();\n }, [isClient, reloadToken, runServerLoad]);\n\n // A drawer-filter change or a Cards<->Lista switch restarts paging at page 1 so\n // the next server load replaces (never appends onto a stale filter/mode). Skips\n // the mount run so the first page is not loaded twice.\n const isInitialQueryRef = useRef(true);\n useEffect(() => {\n if (isInitialQueryRef.current) {\n isInitialQueryRef.current = false;\n return;\n }\n appendNextRef.current = false;\n setPage(1);\n }, [viewMode, serverFilterParams]);\n\n // Cards view accumulates pages, so a post-mutation reload must restart at page 1\n // (otherwise it would replace the accumulated cards with just the current page).\n // List mode reloads its current page unchanged.\n const isInitialReloadRef = useRef(true);\n useEffect(() => {\n if (isInitialReloadRef.current) {\n isInitialReloadRef.current = false;\n return;\n }\n if (isClient || viewMode !== 'cards') return;\n appendNextRef.current = false;\n setPage(1);\n }, [reloadToken]);\n\n // Client applies drawer filters in memory; server rows are already filtered.\n const rows = useMemo(\n () => (isClient ? applyDataTableFilters(loadedRows, filters, filterValues) : loadedRows),\n [isClient, loadedRows, filters, filterValues],\n );\n\n // Stable across renders (reads live state via a ref) so the table's\n // IntersectionObserver effect is not re-created on every data change.\n const loadMoreStateRef = useRef({ loading, loadingMore, loaded: 0, total, reachedEnd });\n loadMoreStateRef.current = { loading, loadingMore, loaded: loadedRows.length, total, reachedEnd };\n\n const loadMoreCards = useCallback(() => {\n const current = loadMoreStateRef.current;\n if (current.loading || current.loadingMore || current.reachedEnd) return;\n if (current.loaded >= current.total) return;\n appendNextRef.current = true;\n setPage((previous) => previous + 1);\n }, []);\n\n const pagination: IDataTablePagination | undefined = isClient\n ? undefined\n : {\n pageSize,\n numberOfPages: Math.max(1, Math.ceil(total / pageSize)),\n currentPage: page,\n totalItems: total,\n setCurrentPage: setPage,\n onPageSizeChange: (size) => {\n setPageSize(size);\n setPage(1);\n },\n };\n\n const reload = isClient ? runClientLoad : runServerLoad;\n\n return {\n rows,\n loading,\n error,\n errorCause,\n onRetry: reload,\n reload,\n filteredCount: isClient ? clientFilteredCount : total,\n totalCount: total,\n onFilteredCountChange: setClientFilteredCount,\n onSearch: isClient\n ? undefined\n : (value) => {\n setSearch(value);\n setPage(1);\n },\n sort: isClient ? undefined : sort,\n onSortChange: isClient\n ? undefined\n : (next) => {\n setSort(next);\n setPage(1);\n },\n pagination,\n cardsInfinite:\n !isClient && viewMode === 'cards'\n ? { hasMore: !reachedEnd && loadedRows.length < total, loadingMore, loadMore: loadMoreCards }\n : undefined,\n };\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { KeyboardEvent } from 'react';
|
|
2
|
+
import { IDataTableColumnConfig, IDataTableFillChange, IDataTableRow } from './types';
|
|
3
|
+
export interface IDataTableRestoredCell<T extends IDataTableRow> {
|
|
4
|
+
row: T;
|
|
5
|
+
columnId: string;
|
|
6
|
+
}
|
|
7
|
+
interface IUseDataTableUndoHistoryParams<T extends IDataTableRow> {
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
rows: Array<T>;
|
|
10
|
+
columns: Array<IDataTableColumnConfig<T>>;
|
|
11
|
+
onCellChange?: (row: T, columnId: string, value: unknown) => void;
|
|
12
|
+
onFillCells?: (changes: Array<IDataTableFillChange<T>>) => void;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Undo/redo of the edits made through the table. Every write already goes through
|
|
16
|
+
* `editing.onCellChange` or `spreadsheet.fill.onFillCells`, and the column knows the
|
|
17
|
+
* value the cell held (`editable.getValue`), so undoing is writing that value back
|
|
18
|
+
* through the same handler: the host persists it like any other edit.
|
|
19
|
+
*
|
|
20
|
+
* - keystrokes on the same cell within a short window become one step;
|
|
21
|
+
* - a fill, a bulk edit or any writes fired in the same tick become one step;
|
|
22
|
+
* - a write that brings a cell back to the value before its last step (Escape on
|
|
23
|
+
* an editor) removes that step instead of stacking a second one.
|
|
24
|
+
*/
|
|
25
|
+
export declare function useDataTableUndoHistory<T extends IDataTableRow>({ enabled, rows, columns, onCellChange, onFillCells, }: IUseDataTableUndoHistoryParams<T>): {
|
|
26
|
+
recordedOnCellChange: (row: T, columnId: string, value: unknown) => void;
|
|
27
|
+
recordedOnFillCells: (changes: Array<IDataTableFillChange<T>>) => void;
|
|
28
|
+
handleUndoShortcut: (event: KeyboardEvent<HTMLElement>) => IDataTableRestoredCell<T> | null;
|
|
29
|
+
};
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { useRef, useCallback } from "react";
|
|
2
|
+
import { isTextEntryTarget } from "./grid/useGridKeyboard.js";
|
|
3
|
+
const TYPING_MERGE_WINDOW_MS = 1e3;
|
|
4
|
+
const resolveUndoDirection = (event) => {
|
|
5
|
+
if (!(event.ctrlKey || event.metaKey) || event.altKey) return null;
|
|
6
|
+
const pressedKey = event.key.toLowerCase();
|
|
7
|
+
if (pressedKey === "z") return event.shiftKey ? "redo" : "undo";
|
|
8
|
+
if (pressedKey === "y" && event.ctrlKey && !event.shiftKey) return "redo";
|
|
9
|
+
return null;
|
|
10
|
+
};
|
|
11
|
+
const areCellValuesEqual = (left, right) => JSON.stringify(left ?? null) === JSON.stringify(right ?? null);
|
|
12
|
+
function useDataTableUndoHistory({
|
|
13
|
+
enabled,
|
|
14
|
+
rows,
|
|
15
|
+
columns,
|
|
16
|
+
onCellChange,
|
|
17
|
+
onFillCells
|
|
18
|
+
}) {
|
|
19
|
+
const enabledRef = useRef(enabled);
|
|
20
|
+
enabledRef.current = enabled;
|
|
21
|
+
const rowsRef = useRef(rows);
|
|
22
|
+
rowsRef.current = rows;
|
|
23
|
+
const columnsRef = useRef(columns);
|
|
24
|
+
columnsRef.current = columns;
|
|
25
|
+
const onCellChangeRef = useRef(onCellChange);
|
|
26
|
+
onCellChangeRef.current = onCellChange;
|
|
27
|
+
const onFillCellsRef = useRef(onFillCells);
|
|
28
|
+
onFillCellsRef.current = onFillCells;
|
|
29
|
+
const undoStackRef = useRef([]);
|
|
30
|
+
const redoStackRef = useRef([]);
|
|
31
|
+
const sameTickEntryRef = useRef(null);
|
|
32
|
+
const readCellValue = useCallback(
|
|
33
|
+
(row, columnId) => (columnsRef.current ?? []).find((column) => column.id === columnId)?.editable?.getValue(row) ?? null,
|
|
34
|
+
[]
|
|
35
|
+
);
|
|
36
|
+
const recordCellChanges = useCallback(
|
|
37
|
+
(changes) => {
|
|
38
|
+
if (!enabledRef.current) return;
|
|
39
|
+
const changedCells = (changes ?? []).map(({ row, columnId, value }) => ({
|
|
40
|
+
row,
|
|
41
|
+
columnId,
|
|
42
|
+
previousValue: readCellValue(row, columnId),
|
|
43
|
+
nextValue: value
|
|
44
|
+
})).filter((cell) => !areCellValuesEqual(cell.previousValue, cell.nextValue));
|
|
45
|
+
if (changedCells.length === 0) return;
|
|
46
|
+
redoStackRef.current = [];
|
|
47
|
+
const now = Date.now();
|
|
48
|
+
const sameTickEntry = sameTickEntryRef.current;
|
|
49
|
+
if (sameTickEntry) {
|
|
50
|
+
sameTickEntry.cells.push(...changedCells);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const lastEntry = undoStackRef.current[undoStackRef.current.length - 1];
|
|
54
|
+
const lastCell = lastEntry?.cells.length === 1 ? lastEntry.cells[0] : void 0;
|
|
55
|
+
const onlyChangedCell = changedCells.length === 1 ? changedCells[0] : void 0;
|
|
56
|
+
if (lastEntry && lastCell && onlyChangedCell && lastCell.row.id === onlyChangedCell.row.id && lastCell.columnId === onlyChangedCell.columnId) {
|
|
57
|
+
if (areCellValuesEqual(onlyChangedCell.nextValue, lastCell.previousValue)) {
|
|
58
|
+
undoStackRef.current = undoStackRef.current.slice(0, -1);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (now - lastEntry.recordedAt < TYPING_MERGE_WINDOW_MS) {
|
|
62
|
+
lastCell.nextValue = onlyChangedCell.nextValue;
|
|
63
|
+
lastEntry.recordedAt = now;
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const entry = { cells: changedCells, recordedAt: now };
|
|
68
|
+
undoStackRef.current = [...undoStackRef.current, entry].slice(-100);
|
|
69
|
+
sameTickEntryRef.current = entry;
|
|
70
|
+
queueMicrotask(() => {
|
|
71
|
+
sameTickEntryRef.current = null;
|
|
72
|
+
});
|
|
73
|
+
},
|
|
74
|
+
[readCellValue]
|
|
75
|
+
);
|
|
76
|
+
const recordedOnCellChange = useCallback(
|
|
77
|
+
(row, columnId, value) => {
|
|
78
|
+
recordCellChanges([{ row, columnId, value }]);
|
|
79
|
+
onCellChangeRef.current?.(row, columnId, value);
|
|
80
|
+
},
|
|
81
|
+
[recordCellChanges]
|
|
82
|
+
);
|
|
83
|
+
const recordedOnFillCells = useCallback(
|
|
84
|
+
(changes) => {
|
|
85
|
+
recordCellChanges(changes);
|
|
86
|
+
onFillCellsRef.current?.(changes);
|
|
87
|
+
},
|
|
88
|
+
[recordCellChanges]
|
|
89
|
+
);
|
|
90
|
+
const replayLastEntry = useCallback((direction) => {
|
|
91
|
+
const sourceStackRef = direction === "undo" ? undoStackRef : redoStackRef;
|
|
92
|
+
const targetStackRef = direction === "undo" ? redoStackRef : undoStackRef;
|
|
93
|
+
const entry = sourceStackRef.current[sourceStackRef.current.length - 1];
|
|
94
|
+
if (!entry) return null;
|
|
95
|
+
const cellWrites = entry.cells.map((cell) => ({
|
|
96
|
+
row: (rowsRef.current ?? []).find((candidate) => candidate.id === cell.row.id) ?? cell.row,
|
|
97
|
+
columnId: cell.columnId,
|
|
98
|
+
value: direction === "undo" ? cell.previousValue : cell.nextValue
|
|
99
|
+
}));
|
|
100
|
+
if (cellWrites.length > 1 && onFillCellsRef.current) {
|
|
101
|
+
onFillCellsRef.current(cellWrites);
|
|
102
|
+
} else {
|
|
103
|
+
cellWrites.forEach((write) => onCellChangeRef.current?.(write.row, write.columnId, write.value));
|
|
104
|
+
}
|
|
105
|
+
sourceStackRef.current = sourceStackRef.current.slice(0, -1);
|
|
106
|
+
targetStackRef.current = [...targetStackRef.current, entry].slice(-100);
|
|
107
|
+
sameTickEntryRef.current = null;
|
|
108
|
+
const firstWrite = cellWrites[0];
|
|
109
|
+
return firstWrite ? { row: firstWrite.row, columnId: firstWrite.columnId } : null;
|
|
110
|
+
}, []);
|
|
111
|
+
const handleUndoShortcut = useCallback(
|
|
112
|
+
(event) => {
|
|
113
|
+
if (!enabledRef.current || event.defaultPrevented) return null;
|
|
114
|
+
if (!(event.target instanceof Node) || !event.currentTarget.contains(event.target)) return null;
|
|
115
|
+
const direction = resolveUndoDirection(event);
|
|
116
|
+
if (!direction || isTextEntryTarget(event.target)) return null;
|
|
117
|
+
const restoredCell = replayLastEntry(direction);
|
|
118
|
+
if (!restoredCell) return null;
|
|
119
|
+
event.preventDefault();
|
|
120
|
+
event.stopPropagation();
|
|
121
|
+
return restoredCell;
|
|
122
|
+
},
|
|
123
|
+
[replayLastEntry]
|
|
124
|
+
);
|
|
125
|
+
return { recordedOnCellChange, recordedOnFillCells, handleUndoShortcut };
|
|
126
|
+
}
|
|
127
|
+
export {
|
|
128
|
+
useDataTableUndoHistory
|
|
129
|
+
};
|
|
130
|
+
//# sourceMappingURL=useDataTableUndoHistory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDataTableUndoHistory.js","sources":["../../../../src/components/UI/DataTable/useDataTableUndoHistory.ts"],"sourcesContent":["import { type KeyboardEvent, useCallback, useRef } from 'react';\n\nimport { isTextEntryTarget } from './grid/useGridKeyboard';\nimport type { IDataTableColumnConfig, IDataTableFillChange, IDataTableRow } from './types';\n\nconst MAX_UNDO_ENTRIES = 100;\nconst TYPING_MERGE_WINDOW_MS = 1000;\n\ntype TDataTableUndoDirection = 'undo' | 'redo';\n\ninterface IDataTableUndoCell<T extends IDataTableRow> {\n row: T;\n columnId: string;\n previousValue: unknown;\n nextValue: unknown;\n}\n\ninterface IDataTableUndoEntry<T extends IDataTableRow> {\n cells: Array<IDataTableUndoCell<T>>;\n recordedAt: number;\n}\n\nexport interface IDataTableRestoredCell<T extends IDataTableRow> {\n row: T;\n columnId: string;\n}\n\ninterface IUseDataTableUndoHistoryParams<T extends IDataTableRow> {\n enabled: boolean;\n rows: Array<T>;\n columns: Array<IDataTableColumnConfig<T>>;\n onCellChange?: (row: T, columnId: string, value: unknown) => void;\n onFillCells?: (changes: Array<IDataTableFillChange<T>>) => void;\n}\n\nconst resolveUndoDirection = (event: KeyboardEvent): TDataTableUndoDirection | null => {\n if (!(event.ctrlKey || event.metaKey) || event.altKey) return null;\n const pressedKey = event.key.toLowerCase();\n if (pressedKey === 'z') return event.shiftKey ? 'redo' : 'undo';\n if (pressedKey === 'y' && event.ctrlKey && !event.shiftKey) return 'redo';\n return null;\n};\n\nconst areCellValuesEqual = (left: unknown, right: unknown): boolean =>\n JSON.stringify(left ?? null) === JSON.stringify(right ?? null);\n\n/**\n * Undo/redo of the edits made through the table. Every write already goes through\n * `editing.onCellChange` or `spreadsheet.fill.onFillCells`, and the column knows the\n * value the cell held (`editable.getValue`), so undoing is writing that value back\n * through the same handler: the host persists it like any other edit.\n *\n * - keystrokes on the same cell within a short window become one step;\n * - a fill, a bulk edit or any writes fired in the same tick become one step;\n * - a write that brings a cell back to the value before its last step (Escape on\n * an editor) removes that step instead of stacking a second one.\n */\nexport function useDataTableUndoHistory<T extends IDataTableRow>({\n enabled,\n rows,\n columns,\n onCellChange,\n onFillCells,\n}: IUseDataTableUndoHistoryParams<T>) {\n const enabledRef = useRef(enabled);\n enabledRef.current = enabled;\n const rowsRef = useRef(rows);\n rowsRef.current = rows;\n const columnsRef = useRef(columns);\n columnsRef.current = columns;\n const onCellChangeRef = useRef(onCellChange);\n onCellChangeRef.current = onCellChange;\n const onFillCellsRef = useRef(onFillCells);\n onFillCellsRef.current = onFillCells;\n\n const undoStackRef = useRef<Array<IDataTableUndoEntry<T>>>([]);\n const redoStackRef = useRef<Array<IDataTableUndoEntry<T>>>([]);\n const sameTickEntryRef = useRef<IDataTableUndoEntry<T> | null>(null);\n\n const readCellValue = useCallback(\n (row: T, columnId: string): unknown =>\n (columnsRef.current ?? []).find((column) => column.id === columnId)?.editable?.getValue(row) ?? null,\n [],\n );\n\n const recordCellChanges = useCallback(\n (changes: Array<IDataTableFillChange<T>>) => {\n if (!enabledRef.current) return;\n\n const changedCells = (changes ?? [])\n .map<IDataTableUndoCell<T>>(({ row, columnId, value }) => ({\n row,\n columnId,\n previousValue: readCellValue(row, columnId),\n nextValue: value,\n }))\n .filter((cell) => !areCellValuesEqual(cell.previousValue, cell.nextValue));\n if (changedCells.length === 0) return;\n\n redoStackRef.current = [];\n const now = Date.now();\n\n const sameTickEntry = sameTickEntryRef.current;\n if (sameTickEntry) {\n sameTickEntry.cells.push(...changedCells);\n return;\n }\n\n const lastEntry = undoStackRef.current[undoStackRef.current.length - 1];\n const lastCell = lastEntry?.cells.length === 1 ? lastEntry.cells[0] : undefined;\n const onlyChangedCell = changedCells.length === 1 ? changedCells[0] : undefined;\n\n if (\n lastEntry &&\n lastCell &&\n onlyChangedCell &&\n lastCell.row.id === onlyChangedCell.row.id &&\n lastCell.columnId === onlyChangedCell.columnId\n ) {\n if (areCellValuesEqual(onlyChangedCell.nextValue, lastCell.previousValue)) {\n undoStackRef.current = undoStackRef.current.slice(0, -1);\n return;\n }\n if (now - lastEntry.recordedAt < TYPING_MERGE_WINDOW_MS) {\n lastCell.nextValue = onlyChangedCell.nextValue;\n lastEntry.recordedAt = now;\n return;\n }\n }\n\n const entry: IDataTableUndoEntry<T> = { cells: changedCells, recordedAt: now };\n undoStackRef.current = [...undoStackRef.current, entry].slice(-MAX_UNDO_ENTRIES);\n sameTickEntryRef.current = entry;\n queueMicrotask(() => {\n sameTickEntryRef.current = null;\n });\n },\n [readCellValue],\n );\n\n const recordedOnCellChange = useCallback(\n (row: T, columnId: string, value: unknown) => {\n recordCellChanges([{ row, columnId, value }]);\n onCellChangeRef.current?.(row, columnId, value);\n },\n [recordCellChanges],\n );\n\n const recordedOnFillCells = useCallback(\n (changes: Array<IDataTableFillChange<T>>) => {\n recordCellChanges(changes);\n onFillCellsRef.current?.(changes);\n },\n [recordCellChanges],\n );\n\n const replayLastEntry = useCallback((direction: TDataTableUndoDirection): IDataTableRestoredCell<T> | null => {\n const sourceStackRef = direction === 'undo' ? undoStackRef : redoStackRef;\n const targetStackRef = direction === 'undo' ? redoStackRef : undoStackRef;\n const entry = sourceStackRef.current[sourceStackRef.current.length - 1];\n if (!entry) return null;\n\n const cellWrites = entry.cells.map<IDataTableFillChange<T>>((cell) => ({\n row: (rowsRef.current ?? []).find((candidate) => candidate.id === cell.row.id) ?? cell.row,\n columnId: cell.columnId,\n value: direction === 'undo' ? cell.previousValue : cell.nextValue,\n }));\n\n if (cellWrites.length > 1 && onFillCellsRef.current) {\n onFillCellsRef.current(cellWrites);\n } else {\n cellWrites.forEach((write) => onCellChangeRef.current?.(write.row, write.columnId, write.value));\n }\n\n sourceStackRef.current = sourceStackRef.current.slice(0, -1);\n targetStackRef.current = [...targetStackRef.current, entry].slice(-MAX_UNDO_ENTRIES);\n sameTickEntryRef.current = null;\n\n const firstWrite = cellWrites[0];\n return firstWrite ? { row: firstWrite.row, columnId: firstWrite.columnId } : null;\n }, []);\n\n /**\n * Handles Ctrl/Cmd+Z and Ctrl/Cmd+Shift+Z (or Ctrl+Y) pressed inside the table.\n * A focused text control keeps its own native undo, and with nothing to replay the\n * event is left untouched so an outer surface can still handle it.\n */\n const handleUndoShortcut = useCallback(\n (event: KeyboardEvent<HTMLElement>): IDataTableRestoredCell<T> | null => {\n if (!enabledRef.current || event.defaultPrevented) return null;\n if (!(event.target instanceof Node) || !event.currentTarget.contains(event.target)) return null;\n\n const direction = resolveUndoDirection(event);\n if (!direction || isTextEntryTarget(event.target)) return null;\n\n const restoredCell = replayLastEntry(direction);\n if (!restoredCell) return null;\n\n event.preventDefault();\n event.stopPropagation();\n return restoredCell;\n },\n [replayLastEntry],\n );\n\n return { recordedOnCellChange, recordedOnFillCells, handleUndoShortcut };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight FLIP animation (Web Animations API, no dependency).
|
|
3
|
+
*
|
|
4
|
+
* `registerRow` returns a stable ref-setter to attach to each animated row,
|
|
5
|
+
* keyed by row id. Rows that change position animate from their previous spot
|
|
6
|
+
* to the new one (First-Last-Invert-Play). Rows that just appeared are shown in
|
|
7
|
+
* place with NO opacity fade (a fade at the top of the list reads as a first-row
|
|
8
|
+
* "blink").
|
|
9
|
+
*
|
|
10
|
+
* `beginExit(ids)` supports animated REMOVAL (e.g. collapsing a group): React
|
|
11
|
+
* unmounts rows instantly, which FLIP alone cannot animate: the items would
|
|
12
|
+
* vanish and only then the gap would slide shut. Call it right before the
|
|
13
|
+
* removal commits: it clones the departing rows while they are still in the
|
|
14
|
+
* DOM, and on the next layout pass the clones are overlaid at their exact old
|
|
15
|
+
* position, fading/sliding up while the rows below FLIP into place. The two
|
|
16
|
+
* motions together read as a genuine close animation. Respects
|
|
17
|
+
* `prefers-reduced-motion`.
|
|
18
|
+
*/
|
|
19
|
+
export declare const useFlipRows: (orderedRowIds: Array<string>, durationMs?: number) => {
|
|
20
|
+
registerRow: (id: string) => (element: HTMLElement | null) => void;
|
|
21
|
+
beginExit: (ids: Array<string>) => void;
|
|
22
|
+
};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { useRef, useLayoutEffect } from "react";
|
|
2
|
+
import { prefersReducedMotion } from "./dataTableMotion.js";
|
|
3
|
+
const FLIP_DURATION_MS = 220;
|
|
4
|
+
const useFlipRows = (orderedRowIds, durationMs = FLIP_DURATION_MS) => {
|
|
5
|
+
const rowElements = useRef(/* @__PURE__ */ new Map());
|
|
6
|
+
const previousRects = useRef(/* @__PURE__ */ new Map());
|
|
7
|
+
const rowCallbacks = useRef(/* @__PURE__ */ new Map());
|
|
8
|
+
const pendingExits = useRef([]);
|
|
9
|
+
const registerRow = (id) => {
|
|
10
|
+
const existing = rowCallbacks.current.get(id);
|
|
11
|
+
if (existing) return existing;
|
|
12
|
+
const callback = (element) => {
|
|
13
|
+
if (element) rowElements.current.set(id, element);
|
|
14
|
+
else rowElements.current.delete(id);
|
|
15
|
+
};
|
|
16
|
+
rowCallbacks.current.set(id, callback);
|
|
17
|
+
return callback;
|
|
18
|
+
};
|
|
19
|
+
const beginExit = (ids) => {
|
|
20
|
+
if (prefersReducedMotion()) return;
|
|
21
|
+
const exits = [];
|
|
22
|
+
ids.forEach((id) => {
|
|
23
|
+
const element = rowElements.current.get(id);
|
|
24
|
+
if (!element) return;
|
|
25
|
+
exits.push({
|
|
26
|
+
clone: element.cloneNode(true),
|
|
27
|
+
rect: element.getBoundingClientRect(),
|
|
28
|
+
cellWidths: Array.from(element.children).map((cell) => cell.getBoundingClientRect().width)
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
pendingExits.current = exits;
|
|
32
|
+
};
|
|
33
|
+
const playExitGhosts = () => {
|
|
34
|
+
const exits = pendingExits.current;
|
|
35
|
+
pendingExits.current = [];
|
|
36
|
+
exits.forEach(({ clone, rect, cellWidths }) => {
|
|
37
|
+
const overlay = document.createElement("div");
|
|
38
|
+
overlay.style.cssText = `position:fixed;top:${rect.top}px;left:${rect.left}px;width:${rect.width}px;height:${rect.height}px;overflow:hidden;pointer-events:none;z-index:10;`;
|
|
39
|
+
const ghostTable = document.createElement("table");
|
|
40
|
+
ghostTable.style.cssText = `width:${rect.width}px;table-layout:fixed;border-collapse:separate;border-spacing:0;`;
|
|
41
|
+
Array.from(clone.children).forEach((cell, index) => {
|
|
42
|
+
cell.style.width = `${cellWidths[index]}px`;
|
|
43
|
+
});
|
|
44
|
+
const ghostBody = document.createElement("tbody");
|
|
45
|
+
ghostBody.appendChild(clone);
|
|
46
|
+
ghostTable.appendChild(ghostBody);
|
|
47
|
+
overlay.appendChild(ghostTable);
|
|
48
|
+
document.body.appendChild(overlay);
|
|
49
|
+
const animation = overlay.animate(
|
|
50
|
+
[
|
|
51
|
+
{ opacity: 1, transform: "none" },
|
|
52
|
+
{ opacity: 0, transform: `translateY(-${Math.min(rect.height, 24)}px)` }
|
|
53
|
+
],
|
|
54
|
+
{ duration: durationMs, easing: "ease" }
|
|
55
|
+
);
|
|
56
|
+
animation.onfinish = () => overlay.remove();
|
|
57
|
+
animation.oncancel = () => overlay.remove();
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
useLayoutEffect(() => {
|
|
61
|
+
if (prefersReducedMotion()) {
|
|
62
|
+
previousRects.current = /* @__PURE__ */ new Map();
|
|
63
|
+
rowElements.current.forEach((element, id) => previousRects.current.set(id, element.getBoundingClientRect()));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
playExitGhosts();
|
|
67
|
+
const nextRects = /* @__PURE__ */ new Map();
|
|
68
|
+
rowElements.current.forEach((element, id) => {
|
|
69
|
+
const lastRect = element.getBoundingClientRect();
|
|
70
|
+
nextRects.set(id, lastRect);
|
|
71
|
+
const firstRect = previousRects.current.get(id);
|
|
72
|
+
if (!firstRect) return;
|
|
73
|
+
const deltaY = firstRect.top - lastRect.top;
|
|
74
|
+
if (deltaY === 0) return;
|
|
75
|
+
element.animate([{ transform: `translateY(${deltaY}px)` }, { transform: "none" }], {
|
|
76
|
+
duration: durationMs,
|
|
77
|
+
easing: "ease"
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
previousRects.current = nextRects;
|
|
81
|
+
rowCallbacks.current.forEach((_, id) => {
|
|
82
|
+
if (!rowElements.current.has(id)) rowCallbacks.current.delete(id);
|
|
83
|
+
});
|
|
84
|
+
}, [orderedRowIds, durationMs]);
|
|
85
|
+
return { registerRow, beginExit };
|
|
86
|
+
};
|
|
87
|
+
export {
|
|
88
|
+
useFlipRows
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=useFlipRows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFlipRows.js","sources":["../../../../src/components/UI/DataTable/useFlipRows.ts"],"sourcesContent":["import { useLayoutEffect, useRef } from 'react';\n\nimport { prefersReducedMotion } from './dataTableMotion';\n\nconst FLIP_DURATION_MS = 220;\n\ninterface IPendingRowExit {\n clone: HTMLElement;\n rect: DOMRect;\n cellWidths: Array<number>;\n}\n\n/**\n * Lightweight FLIP animation (Web Animations API, no dependency).\n *\n * `registerRow` returns a stable ref-setter to attach to each animated row,\n * keyed by row id. Rows that change position animate from their previous spot\n * to the new one (First-Last-Invert-Play). Rows that just appeared are shown in\n * place with NO opacity fade (a fade at the top of the list reads as a first-row\n * \"blink\").\n *\n * `beginExit(ids)` supports animated REMOVAL (e.g. collapsing a group): React\n * unmounts rows instantly, which FLIP alone cannot animate: the items would\n * vanish and only then the gap would slide shut. Call it right before the\n * removal commits: it clones the departing rows while they are still in the\n * DOM, and on the next layout pass the clones are overlaid at their exact old\n * position, fading/sliding up while the rows below FLIP into place. The two\n * motions together read as a genuine close animation. Respects\n * `prefers-reduced-motion`.\n */\nexport const useFlipRows = (orderedRowIds: Array<string>, durationMs: number = FLIP_DURATION_MS) => {\n const rowElements = useRef(new Map<string, HTMLElement>());\n const previousRects = useRef(new Map<string, DOMRect>());\n const rowCallbacks = useRef(new Map<string, (element: HTMLElement | null) => void>());\n const pendingExits = useRef<Array<IPendingRowExit>>([]);\n\n // Stable per-id callback so React does not detach/attach every row's ref on\n // each render (which would thrash the element map).\n const registerRow = (id: string) => {\n const existing = rowCallbacks.current.get(id);\n if (existing) return existing;\n\n const callback = (element: HTMLElement | null) => {\n if (element) rowElements.current.set(id, element);\n else rowElements.current.delete(id);\n };\n rowCallbacks.current.set(id, callback);\n\n return callback;\n };\n\n // Clone the departing rows BEFORE React unmounts them (call in the same event\n // that triggers the removal). The clones play on the next layout pass.\n const beginExit = (ids: Array<string>) => {\n if (prefersReducedMotion()) return;\n\n const exits: Array<IPendingRowExit> = [];\n ids.forEach((id) => {\n const element = rowElements.current.get(id);\n if (!element) return;\n\n exits.push({\n clone: element.cloneNode(true) as HTMLElement,\n rect: element.getBoundingClientRect(),\n cellWidths: Array.from(element.children).map((cell) => cell.getBoundingClientRect().width),\n });\n });\n pendingExits.current = exits;\n };\n\n const playExitGhosts = () => {\n const exits = pendingExits.current;\n pendingExits.current = [];\n\n exits.forEach(({ clone, rect, cellWidths }) => {\n // A bare <tr> only renders inside a table; rebuild a minimal fixed-layout\n // table at the row's exact old viewport position, with the original cell\n // widths so the ghost is pixel-identical to the row it replaces.\n const overlay = document.createElement('div');\n overlay.style.cssText = `position:fixed;top:${rect.top}px;left:${rect.left}px;width:${rect.width}px;height:${rect.height}px;overflow:hidden;pointer-events:none;z-index:10;`;\n\n const ghostTable = document.createElement('table');\n ghostTable.style.cssText = `width:${rect.width}px;table-layout:fixed;border-collapse:separate;border-spacing:0;`;\n\n Array.from(clone.children).forEach((cell, index) => {\n (cell as HTMLElement).style.width = `${cellWidths[index]}px`;\n });\n\n const ghostBody = document.createElement('tbody');\n ghostBody.appendChild(clone);\n ghostTable.appendChild(ghostBody);\n overlay.appendChild(ghostTable);\n document.body.appendChild(overlay);\n\n const animation = overlay.animate(\n [\n { opacity: 1, transform: 'none' },\n { opacity: 0, transform: `translateY(-${Math.min(rect.height, 24)}px)` },\n ],\n { duration: durationMs, easing: 'ease' },\n );\n animation.onfinish = () => overlay.remove();\n animation.oncancel = () => overlay.remove();\n });\n };\n\n useLayoutEffect(() => {\n if (prefersReducedMotion()) {\n previousRects.current = new Map();\n rowElements.current.forEach((element, id) => previousRects.current.set(id, element.getBoundingClientRect()));\n return;\n }\n\n playExitGhosts();\n\n const nextRects = new Map<string, DOMRect>();\n\n rowElements.current.forEach((element, id) => {\n const lastRect = element.getBoundingClientRect();\n nextRects.set(id, lastRect);\n\n const firstRect = previousRects.current.get(id);\n // No recorded previous position → the row just appeared. Show it in place,\n // no fade (a fade at the top of the list is the first-row blink).\n if (!firstRect) return;\n\n const deltaY = firstRect.top - lastRect.top;\n if (deltaY === 0) return;\n\n element.animate([{ transform: `translateY(${deltaY}px)` }, { transform: 'none' }], {\n duration: durationMs,\n easing: 'ease',\n });\n });\n\n previousRects.current = nextRects;\n\n // Drop callbacks for rows no longer visible so the map can't grow unbounded.\n rowCallbacks.current.forEach((_, id) => {\n if (!rowElements.current.has(id)) rowCallbacks.current.delete(id);\n });\n // orderedRowIds is the join of ids in order. Re-run whenever it changes.\n }, [orderedRowIds, durationMs]);\n\n return { registerRow, beginExit };\n};\n"],"names":[],"mappings":"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"}
|