@danske/sapphire-react-lab 0.106.2 → 0.107.0
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/build/cjs/index.js +2557 -64
- package/build/cjs/index.js.map +1 -1
- package/build/esm/core/src/BreakpointProvider/useBreakpointContext.js +11 -0
- package/build/esm/core/src/BreakpointProvider/useBreakpointContext.js.map +1 -0
- package/build/esm/core/src/Flex/src/Flex.js +64 -0
- package/build/esm/core/src/Flex/src/Flex.js.map +1 -0
- package/build/esm/core/src/Grid/src/Grid.js +55 -0
- package/build/esm/core/src/Grid/src/Grid.js.map +1 -0
- package/build/esm/core/src/Icon/src/Icon.js +37 -0
- package/build/esm/core/src/Icon/src/Icon.js.map +1 -0
- package/build/esm/core/src/ListBox/i18n/da-DK.json.js +7 -0
- package/build/esm/core/src/ListBox/i18n/de-DE.json.js +7 -0
- package/build/esm/core/src/ListBox/i18n/en-US.json.js +7 -0
- package/build/esm/core/src/ListBox/i18n/fi-FI.json.js +7 -0
- package/build/esm/core/src/ListBox/i18n/index.js.map +1 -0
- package/build/esm/core/src/ListBox/i18n/nb-NO.json.js +7 -0
- package/build/esm/core/src/ListBox/i18n/pl-PL.json.js +7 -0
- package/build/esm/core/src/ListBox/i18n/sv-SE.json.js +7 -0
- package/build/esm/core/src/ListBox/src/ListBoxContext.js +8 -0
- package/build/esm/core/src/ListBox/src/ListBoxContext.js.map +1 -0
- package/build/esm/core/src/ListBox/src/ListBoxEmptyState.js +26 -0
- package/build/esm/core/src/ListBox/src/ListBoxEmptyState.js.map +1 -0
- package/build/esm/core/src/ListBox/src/ListBoxItemSkeleton.js +37 -0
- package/build/esm/core/src/ListBox/src/ListBoxItemSkeleton.js.map +1 -0
- package/build/esm/core/src/ListBox/src/ListBoxOption.js +105 -0
- package/build/esm/core/src/ListBox/src/ListBoxOption.js.map +1 -0
- package/build/esm/core/src/ListBox/src/ListBoxSection.js +86 -0
- package/build/esm/core/src/ListBox/src/ListBoxSection.js.map +1 -0
- package/build/esm/core/src/ListBox/src/StatelessListBox.js +162 -0
- package/build/esm/core/src/ListBox/src/StatelessListBox.js.map +1 -0
- package/build/esm/core/src/Pagination/src/usePaginationContext.js +8 -0
- package/build/esm/core/src/Pagination/src/usePaginationContext.js.map +1 -0
- package/build/esm/core/src/Popover/src/Popover.js +62 -0
- package/build/esm/core/src/Popover/src/Popover.js.map +1 -0
- package/build/esm/core/src/Radio/src/RadioBox.js +58 -0
- package/build/esm/core/src/Radio/src/RadioBox.js.map +1 -0
- package/build/esm/core/src/Separator/src/Separator.js +32 -0
- package/build/esm/core/src/Separator/src/Separator.js.map +1 -0
- package/build/esm/core/src/Skeleton/src/Skeleton.js +19 -0
- package/build/esm/core/src/Skeleton/src/Skeleton.js.map +1 -0
- package/build/esm/core/src/Skeleton/src/SkeletonCircle.js +39 -0
- package/build/esm/core/src/Skeleton/src/SkeletonCircle.js.map +1 -0
- package/build/esm/core/src/Skeleton/src/SkeletonText.js +59 -0
- package/build/esm/core/src/Skeleton/src/SkeletonText.js.map +1 -0
- package/build/esm/core/src/Skeleton/src/animation.js +4 -0
- package/build/esm/core/src/Skeleton/src/animation.js.map +1 -0
- package/build/esm/core/src/ThemeRoot/src/ThemeRoot.js +42 -0
- package/build/esm/core/src/ThemeRoot/src/ThemeRoot.js.map +1 -0
- package/build/esm/core/src/View/src/View.js +60 -0
- package/build/esm/core/src/View/src/View.js.map +1 -0
- package/build/esm/core/src/utils/SapphireStyleProps.js +48 -0
- package/build/esm/core/src/utils/SapphireStyleProps.js.map +1 -0
- package/build/esm/core/src/utils/useCollectionFocusProxy.js +53 -0
- package/build/esm/core/src/utils/useCollectionFocusProxy.js.map +1 -0
- package/build/esm/core/src/utils/usePreventTouchEnd.js +16 -0
- package/build/esm/core/src/utils/usePreventTouchEnd.js.map +1 -0
- package/build/esm/core/src/utils/useSapphireStyleProps.js +179 -0
- package/build/esm/core/src/utils/useSapphireStyleProps.js.map +1 -0
- package/build/esm/core/src/utils/useSapphireTextStyleProps.js +9 -0
- package/build/esm/core/src/utils/useSapphireTextStyleProps.js.map +1 -0
- package/build/esm/core/src/utils/useScrollCheck.js +38 -0
- package/build/esm/core/src/utils/useScrollCheck.js.map +1 -0
- package/build/esm/core/src/utils/useThemeCheck.js +14 -0
- package/build/esm/core/src/utils/useThemeCheck.js.map +1 -0
- package/build/esm/core/src/utils/virtualization/ListWithLoadingStateLayout.js +158 -0
- package/build/esm/core/src/utils/virtualization/ListWithLoadingStateLayout.js.map +1 -0
- package/build/esm/core/src/utils/virtualization/VariableWidthListLayout.js +69 -0
- package/build/esm/core/src/utils/virtualization/VariableWidthListLayout.js.map +1 -0
- package/build/esm/core/src/utils/virtualization/VirtualizerWithLoadingSkeleton.js +40 -0
- package/build/esm/core/src/utils/virtualization/VirtualizerWithLoadingSkeleton.js.map +1 -0
- package/build/esm/core/src/utils/virtualization/useListWithLoadingStateLayout.js +35 -0
- package/build/esm/core/src/utils/virtualization/useListWithLoadingStateLayout.js.map +1 -0
- package/build/esm/index.js +23 -20
- package/build/esm/index.js.map +1 -1
- package/build/esm/lab/src/Accordion/index.js.map +1 -0
- package/build/esm/lab/src/Accordion/src/Accordion.js.map +1 -0
- package/build/esm/lab/src/Accordion/src/AccordionContext.js.map +1 -0
- package/build/esm/lab/src/Accordion/src/AccordionHeading.js.map +1 -0
- package/build/esm/lab/src/Accordion/src/AccordionItem.js.map +1 -0
- package/build/esm/lab/src/Accordion/src/AccordionPanel.js.map +1 -0
- package/build/esm/lab/src/Accordion/src/utils.js.map +1 -0
- package/build/esm/lab/src/Alert/src/Alert.js.map +1 -0
- package/build/esm/lab/src/Amount/src/Amount.js.map +1 -0
- package/build/esm/lab/src/Amount/src/useGroupAmount.js.map +1 -0
- package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/da-DK.json.js +2 -2
- package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/de-DE.json.js +2 -2
- package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/en-US.json.js +2 -2
- package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/fi-FI.json.js +2 -2
- package/build/esm/lab/src/Autocomplete/i18n/index.js +20 -0
- package/build/esm/lab/src/Autocomplete/i18n/index.js.map +1 -0
- package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/nb-NO.json.js +2 -2
- package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/pl-PL.json.js +2 -2
- package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/sv-SE.json.js +2 -2
- package/build/esm/lab/src/Autocomplete/src/Autocomplete.js.map +1 -0
- package/build/esm/lab/src/Breadcrumbs/src/BreadcrumbItem.js.map +1 -0
- package/build/esm/lab/src/Breadcrumbs/src/BreadcrumbItemLink.js.map +1 -0
- package/build/esm/lab/src/Breadcrumbs/src/BreadcrumbItemStatic.js.map +1 -0
- package/build/esm/lab/src/Breadcrumbs/src/BreadcrumbOverflowMenu.js.map +1 -0
- package/build/esm/lab/src/Breadcrumbs/src/Breadcrumbs.js.map +1 -0
- package/build/esm/lab/src/Breadcrumbs/src/BreadcrumbsSeparator.js.map +1 -0
- package/build/esm/lab/src/Breadcrumbs/src/useBreadcrumbThreshold.js.map +1 -0
- package/build/esm/lab/src/DataGrid/index.js +9 -0
- package/build/esm/lab/src/DataGrid/index.js.map +1 -0
- package/build/esm/lab/src/DataGrid/src/DataGrid.js +463 -0
- package/build/esm/lab/src/DataGrid/src/DataGrid.js.map +1 -0
- package/build/esm/lab/src/DataGrid/src/DataGridCellContext.js +6 -0
- package/build/esm/lab/src/DataGrid/src/DataGridCellContext.js.map +1 -0
- package/build/esm/lab/src/DataGrid/src/EditableCellContent.js +125 -0
- package/build/esm/lab/src/DataGrid/src/EditableCellContent.js.map +1 -0
- package/build/esm/lab/src/DataGrid/src/createDataGridColumnHelper.js +15 -0
- package/build/esm/lab/src/DataGrid/src/createDataGridColumnHelper.js.map +1 -0
- package/build/esm/lab/src/DataGrid/src/useGridKeyboardNavigation.js +417 -0
- package/build/esm/lab/src/DataGrid/src/useGridKeyboardNavigation.js.map +1 -0
- package/build/esm/lab/src/DataGrid/src/useMeasureColumnWidths.js +55 -0
- package/build/esm/lab/src/DataGrid/src/useMeasureColumnWidths.js.map +1 -0
- package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/da-DK.json.js +2 -2
- package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/de-DE.json.js +2 -2
- package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/en-US.json.js +2 -2
- package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/fi-FI.json.js +2 -2
- package/build/esm/lab/src/FileDropzone/i18n/index.js.map +1 -0
- package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/nb-NO.json.js +2 -2
- package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/pl-PL.json.js +2 -2
- package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/sv-SE.json.js +2 -2
- package/build/esm/lab/src/FileDropzone/src/FileDropzone.js.map +1 -0
- package/build/esm/lab/src/FileDropzone/src/FileTrigger.js.map +1 -0
- package/build/esm/lab/src/FileDropzone/src/utils.js.map +1 -0
- package/build/esm/lab/src/Filtering/src/FilterDropdown.js.map +1 -0
- package/build/esm/{Filtering → lab/src/Filtering}/src/SearchableSelectFilter.js +2 -0
- package/build/esm/lab/src/Filtering/src/SearchableSelectFilter.js.map +1 -0
- package/build/esm/lab/src/Flag/src/Flag.js.map +1 -0
- package/build/esm/lab/src/LabeledValue/src/LabeledValue.js.map +1 -0
- package/build/esm/{NumberField → lab/src/NumberField}/i18n/da-DK.json.js +2 -2
- package/build/esm/{NumberField → lab/src/NumberField}/i18n/de-DE.json.js +2 -2
- package/build/esm/{NumberField → lab/src/NumberField}/i18n/en-US.json.js +2 -2
- package/build/esm/{NumberField → lab/src/NumberField}/i18n/fi-FI.json.js +2 -2
- package/build/esm/lab/src/NumberField/i18n/index.js.map +1 -0
- package/build/esm/{NumberField → lab/src/NumberField}/i18n/nb-NO.json.js +2 -2
- package/build/esm/{NumberField → lab/src/NumberField}/i18n/pl-PL.json.js +2 -2
- package/build/esm/{NumberField → lab/src/NumberField}/i18n/sv-SE.json.js +2 -2
- package/build/esm/lab/src/NumberField/src/NumberField.js.map +1 -0
- package/build/esm/lab/src/NumberField/src/StepperButton.js.map +1 -0
- package/build/esm/lab/src/NumberField/src/cursorHelpers.js.map +1 -0
- package/build/esm/lab/src/NumberField/src/formatHelpers.js.map +1 -0
- package/build/esm/lab/src/NumberField/src/keyboardHelpers.js.map +1 -0
- package/build/esm/lab/src/NumberField/src/useAutofillStyle.js.map +1 -0
- package/build/esm/lab/src/NumberField/src/useNumberFieldFormatting.js.map +1 -0
- package/build/esm/lab/src/NumberField/src/useSapphireNumberField.js.map +1 -0
- package/build/esm/lab/src/ProgressIndicator/src/ProgressIndicator.js.map +1 -0
- package/build/esm/lab/src/Sidebar/index.js.map +1 -0
- package/build/esm/lab/src/Sidebar/src/Body.js.map +1 -0
- package/build/esm/lab/src/Sidebar/src/ExpandableItem.js.map +1 -0
- package/build/esm/lab/src/Sidebar/src/Header.js.map +1 -0
- package/build/esm/lab/src/Sidebar/src/Item.js.map +1 -0
- package/build/esm/lab/src/Sidebar/src/List.js.map +1 -0
- package/build/esm/lab/src/Sidebar/src/Panel.js.map +1 -0
- package/build/esm/lab/src/Sidebar/src/ResponsiveSidebarContext.js.map +1 -0
- package/build/esm/lab/src/Sidebar/src/SecondarySidebarContext.js.map +1 -0
- package/build/esm/lab/src/Sidebar/src/Section.js.map +1 -0
- package/build/esm/lab/src/Sidebar/src/Sidebar.js.map +1 -0
- package/build/esm/lab/src/Sidebar/src/useSidebar.js.map +1 -0
- package/build/esm/lab/src/Slider/index.js.map +1 -0
- package/build/esm/lab/src/Slider/src/Slider.js.map +1 -0
- package/build/esm/lab/src/TagGroup/src/Tag.js.map +1 -0
- package/build/esm/lab/src/TagGroup/src/TagGroup.js.map +1 -0
- package/build/esm/lab/src/TagGroup/src/TagItem.js.map +1 -0
- package/build/esm/{TimeField → lab/src/TimeField}/i18n/da-DK.json.js +2 -2
- package/build/esm/lab/src/TimeField/i18n/da-DK.json.js.map +1 -0
- package/build/esm/{TimeField → lab/src/TimeField}/i18n/de-DE.json.js +2 -2
- package/build/esm/lab/src/TimeField/i18n/de-DE.json.js.map +1 -0
- package/build/esm/{TimeField → lab/src/TimeField}/i18n/en-US.json.js +2 -2
- package/build/esm/lab/src/TimeField/i18n/en-US.json.js.map +1 -0
- package/build/esm/{TimeField → lab/src/TimeField}/i18n/fi-FI.json.js +2 -2
- package/build/esm/lab/src/TimeField/i18n/fi-FI.json.js.map +1 -0
- package/build/esm/lab/src/TimeField/i18n/index.js.map +1 -0
- package/build/esm/{TimeField → lab/src/TimeField}/i18n/nb-NO.json.js +2 -2
- package/build/esm/lab/src/TimeField/i18n/nb-NO.json.js.map +1 -0
- package/build/esm/{TimeField → lab/src/TimeField}/i18n/pl-PL.json.js +2 -2
- package/build/esm/lab/src/TimeField/i18n/pl-PL.json.js.map +1 -0
- package/build/esm/{TimeField → lab/src/TimeField}/i18n/sv-SE.json.js +2 -2
- package/build/esm/lab/src/TimeField/i18n/sv-SE.json.js.map +1 -0
- package/build/esm/lab/src/TimeField/src/TimeField.js.map +1 -0
- package/build/esm/lab/src/TimeField/src/TimeFieldSegment.js.map +1 -0
- package/build/esm/lab/src/TruncateOverflow/src/TruncateOverflow.js +46 -0
- package/build/esm/lab/src/TruncateOverflow/src/TruncateOverflow.js.map +1 -0
- package/build/index.d.ts +553 -10
- package/package.json +8 -8
- package/build/esm/Accordion/index.js.map +0 -1
- package/build/esm/Accordion/src/Accordion.js.map +0 -1
- package/build/esm/Accordion/src/AccordionContext.js.map +0 -1
- package/build/esm/Accordion/src/AccordionHeading.js.map +0 -1
- package/build/esm/Accordion/src/AccordionItem.js.map +0 -1
- package/build/esm/Accordion/src/AccordionPanel.js.map +0 -1
- package/build/esm/Accordion/src/utils.js.map +0 -1
- package/build/esm/Alert/src/Alert.js.map +0 -1
- package/build/esm/Amount/src/Amount.js.map +0 -1
- package/build/esm/Amount/src/useGroupAmount.js.map +0 -1
- package/build/esm/Autocomplete/i18n/index.js.map +0 -1
- package/build/esm/Autocomplete/src/Autocomplete.js.map +0 -1
- package/build/esm/Breadcrumbs/src/BreadcrumbItem.js.map +0 -1
- package/build/esm/Breadcrumbs/src/BreadcrumbItemLink.js.map +0 -1
- package/build/esm/Breadcrumbs/src/BreadcrumbItemStatic.js.map +0 -1
- package/build/esm/Breadcrumbs/src/BreadcrumbOverflowMenu.js.map +0 -1
- package/build/esm/Breadcrumbs/src/Breadcrumbs.js.map +0 -1
- package/build/esm/Breadcrumbs/src/BreadcrumbsSeparator.js.map +0 -1
- package/build/esm/Breadcrumbs/src/useBreadcrumbThreshold.js.map +0 -1
- package/build/esm/FileDropzone/i18n/index.js.map +0 -1
- package/build/esm/FileDropzone/src/FileDropzone.js.map +0 -1
- package/build/esm/FileDropzone/src/FileTrigger.js.map +0 -1
- package/build/esm/FileDropzone/src/utils.js.map +0 -1
- package/build/esm/Filtering/src/FilterDropdown.js.map +0 -1
- package/build/esm/Filtering/src/SearchableSelectFilter.js.map +0 -1
- package/build/esm/Flag/src/Flag.js.map +0 -1
- package/build/esm/LabeledValue/src/LabeledValue.js.map +0 -1
- package/build/esm/NumberField/i18n/index.js.map +0 -1
- package/build/esm/NumberField/src/NumberField.js.map +0 -1
- package/build/esm/NumberField/src/StepperButton.js.map +0 -1
- package/build/esm/NumberField/src/cursorHelpers.js.map +0 -1
- package/build/esm/NumberField/src/formatHelpers.js.map +0 -1
- package/build/esm/NumberField/src/keyboardHelpers.js.map +0 -1
- package/build/esm/NumberField/src/useAutofillStyle.js.map +0 -1
- package/build/esm/NumberField/src/useNumberFieldFormatting.js.map +0 -1
- package/build/esm/NumberField/src/useSapphireNumberField.js.map +0 -1
- package/build/esm/ProgressIndicator/src/ProgressIndicator.js.map +0 -1
- package/build/esm/Sidebar/index.js.map +0 -1
- package/build/esm/Sidebar/src/Body.js.map +0 -1
- package/build/esm/Sidebar/src/ExpandableItem.js.map +0 -1
- package/build/esm/Sidebar/src/Header.js.map +0 -1
- package/build/esm/Sidebar/src/Item.js.map +0 -1
- package/build/esm/Sidebar/src/List.js.map +0 -1
- package/build/esm/Sidebar/src/Panel.js.map +0 -1
- package/build/esm/Sidebar/src/ResponsiveSidebarContext.js.map +0 -1
- package/build/esm/Sidebar/src/SecondarySidebarContext.js.map +0 -1
- package/build/esm/Sidebar/src/Section.js.map +0 -1
- package/build/esm/Sidebar/src/Sidebar.js.map +0 -1
- package/build/esm/Sidebar/src/useSidebar.js.map +0 -1
- package/build/esm/Slider/index.js.map +0 -1
- package/build/esm/Slider/src/Slider.js.map +0 -1
- package/build/esm/TagGroup/src/Tag.js.map +0 -1
- package/build/esm/TagGroup/src/TagGroup.js.map +0 -1
- package/build/esm/TagGroup/src/TagItem.js.map +0 -1
- package/build/esm/TimeField/i18n/index.js.map +0 -1
- package/build/esm/TimeField/src/TimeField.js.map +0 -1
- package/build/esm/TimeField/src/TimeFieldSegment.js.map +0 -1
- /package/build/esm/{TimeField → core/src/ListBox}/i18n/da-DK.json.js.map +0 -0
- /package/build/esm/{TimeField → core/src/ListBox}/i18n/de-DE.json.js.map +0 -0
- /package/build/esm/{TimeField → core/src/ListBox}/i18n/en-US.json.js.map +0 -0
- /package/build/esm/{TimeField → core/src/ListBox}/i18n/fi-FI.json.js.map +0 -0
- /package/build/esm/{TimeField → core/src/ListBox}/i18n/index.js +0 -0
- /package/build/esm/{TimeField → core/src/ListBox}/i18n/nb-NO.json.js.map +0 -0
- /package/build/esm/{TimeField → core/src/ListBox}/i18n/pl-PL.json.js.map +0 -0
- /package/build/esm/{TimeField → core/src/ListBox}/i18n/sv-SE.json.js.map +0 -0
- /package/build/esm/{Accordion → lab/src/Accordion}/index.js +0 -0
- /package/build/esm/{Accordion → lab/src/Accordion}/src/Accordion.js +0 -0
- /package/build/esm/{Accordion → lab/src/Accordion}/src/AccordionContext.js +0 -0
- /package/build/esm/{Accordion → lab/src/Accordion}/src/AccordionHeading.js +0 -0
- /package/build/esm/{Accordion → lab/src/Accordion}/src/AccordionItem.js +0 -0
- /package/build/esm/{Accordion → lab/src/Accordion}/src/AccordionPanel.js +0 -0
- /package/build/esm/{Accordion → lab/src/Accordion}/src/utils.js +0 -0
- /package/build/esm/{Alert → lab/src/Alert}/src/Alert.js +0 -0
- /package/build/esm/{Amount → lab/src/Amount}/src/Amount.js +0 -0
- /package/build/esm/{Amount → lab/src/Amount}/src/useGroupAmount.js +0 -0
- /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/da-DK.json.js.map +0 -0
- /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/de-DE.json.js.map +0 -0
- /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/en-US.json.js.map +0 -0
- /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/fi-FI.json.js.map +0 -0
- /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/nb-NO.json.js.map +0 -0
- /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/pl-PL.json.js.map +0 -0
- /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/sv-SE.json.js.map +0 -0
- /package/build/esm/{Autocomplete → lab/src/Autocomplete}/src/Autocomplete.js +0 -0
- /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/BreadcrumbItem.js +0 -0
- /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/BreadcrumbItemLink.js +0 -0
- /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/BreadcrumbItemStatic.js +0 -0
- /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/BreadcrumbOverflowMenu.js +0 -0
- /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/Breadcrumbs.js +0 -0
- /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/BreadcrumbsSeparator.js +0 -0
- /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/useBreadcrumbThreshold.js +0 -0
- /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/da-DK.json.js.map +0 -0
- /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/de-DE.json.js.map +0 -0
- /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/en-US.json.js.map +0 -0
- /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/fi-FI.json.js.map +0 -0
- /package/build/esm/{Autocomplete → lab/src/FileDropzone}/i18n/index.js +0 -0
- /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/nb-NO.json.js.map +0 -0
- /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/pl-PL.json.js.map +0 -0
- /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/sv-SE.json.js.map +0 -0
- /package/build/esm/{FileDropzone → lab/src/FileDropzone}/src/FileDropzone.js +0 -0
- /package/build/esm/{FileDropzone → lab/src/FileDropzone}/src/FileTrigger.js +0 -0
- /package/build/esm/{FileDropzone → lab/src/FileDropzone}/src/utils.js +0 -0
- /package/build/esm/{Filtering → lab/src/Filtering}/src/FilterDropdown.js +0 -0
- /package/build/esm/{Flag → lab/src/Flag}/src/Flag.js +0 -0
- /package/build/esm/{LabeledValue → lab/src/LabeledValue}/src/LabeledValue.js +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/i18n/da-DK.json.js.map +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/i18n/de-DE.json.js.map +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/i18n/en-US.json.js.map +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/i18n/fi-FI.json.js.map +0 -0
- /package/build/esm/{FileDropzone → lab/src/NumberField}/i18n/index.js +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/i18n/nb-NO.json.js.map +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/i18n/pl-PL.json.js.map +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/i18n/sv-SE.json.js.map +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/src/NumberField.js +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/src/StepperButton.js +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/src/cursorHelpers.js +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/src/formatHelpers.js +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/src/keyboardHelpers.js +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/src/useAutofillStyle.js +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/src/useNumberFieldFormatting.js +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/src/useSapphireNumberField.js +0 -0
- /package/build/esm/{ProgressIndicator → lab/src/ProgressIndicator}/src/ProgressIndicator.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/index.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Body.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/src/ExpandableItem.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Header.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Item.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/src/List.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Panel.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/src/ResponsiveSidebarContext.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/src/SecondarySidebarContext.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Section.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Sidebar.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/src/useSidebar.js +0 -0
- /package/build/esm/{Slider → lab/src/Slider}/index.js +0 -0
- /package/build/esm/{Slider → lab/src/Slider}/src/Slider.js +0 -0
- /package/build/esm/{TagGroup → lab/src/TagGroup}/src/Tag.js +0 -0
- /package/build/esm/{TagGroup → lab/src/TagGroup}/src/TagGroup.js +0 -0
- /package/build/esm/{TagGroup → lab/src/TagGroup}/src/TagItem.js +0 -0
- /package/build/esm/{NumberField → lab/src/TimeField}/i18n/index.js +0 -0
- /package/build/esm/{TimeField → lab/src/TimeField}/src/TimeField.js +0 -0
- /package/build/esm/{TimeField → lab/src/TimeField}/src/TimeFieldSegment.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataGrid.js","sources":["../../../../../../src/DataGrid/src/DataGrid.tsx"],"sourcesContent":["import React, { ReactNode, useMemo, useRef } from 'react';\nimport {\n type ColumnDef as TanStackColumnDef,\n type ExpandedState,\n flexRender,\n getCoreRowModel,\n getExpandedRowModel,\n getSortedRowModel,\n type Row as TanStackRow,\n type RowSelectionState,\n SortDirection as TanStackSortDirection,\n type SortingState,\n type Updater,\n useReactTable,\n} from '@tanstack/react-table';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport {\n type CellSpacing,\n Checkbox,\n ColumnAlignment,\n SapphireStyleProps,\n Skeleton,\n type StickyPosition,\n Table,\n TableCellProps,\n TableHeaderCellProps,\n useSapphireStyleProps,\n useThemeCheck,\n} from '@danske/sapphire-react';\nimport { useControlledState } from 'react-stately/useControlledState';\nimport { useLoadMore } from 'react-aria/private/utils/useLoadMore';\nimport { SortDirection } from '@react-types/shared/src/collections';\nimport { DisabledBehavior, DOMProps } from '@react-types/shared';\nimport { useMeasureColumnWidths } from './useMeasureColumnWidths';\nimport { useGridKeyboardNavigation } from './useGridKeyboardNavigation';\nimport { RadioBox } from '../../../../core/src/Radio/src/RadioBox';\nimport { PaginationContext } from '../../../../core/src/Pagination/src/usePaginationContext';\nimport { DataGridCellContext } from './DataGridCellContext';\n\n/**\n * The interaction that triggered an `onSelectionChange` callback.\n *\n * - `'select-all'` — the user clicked the \"Select all\" header checkbox.\n * - `'select'` — the user selected or deselected an individual row.\n */\ntype DataGridSelectionInteraction = 'select-all' | 'select';\n\n/**\n * Determines how column widths are calculated.\n *\n * - `'auto'` — uses the browser's native\n * [`table-layout: auto`](https://developer.mozilla.org/en-US/docs/Web/CSS/table-layout) algorithm.\n * - `'fixed'` — uses the browser's native\n * [`table-layout: fixed`](https://developer.mozilla.org/en-US/docs/Web/CSS/table-layout) algorithm.\n */\nexport type Layout = 'auto' | 'fixed';\n\n/**\n * Column sizing options when using `layout=\"fixed\"`.\n * Only `width` is effective in fixed table layout; `minWidth` and `maxWidth` have no effect.\n *\n * Note: this type is the *most restrictive* column sizing shape. A value of\n * this type is structurally assignable to both fixed- and auto-mode column\n * arrays, which is what lets column helpers return \"mode-agnostic\" columns\n * (and therefore reusable) whenever `minWidth`/`maxWidth` are not used.\n */\nexport interface FixedColumnSizing {\n /**\n * Width of the column. Accepts a pixel count (`number`) or any valid CSS `width` value\n * (`string`, e.g. `'50%'`). In fixed layout this is the exact column width.\n */\n width?: number | string;\n /** @internal Not available in fixed layout */\n minWidth?: never;\n /** @internal Not available in fixed layout */\n maxWidth?: never;\n}\n\n/**\n * Column sizing options when using `layout=\"auto\"`.\n * All three properties are treated as hints by the browser's sizing algorithm —\n * see the `\"auto\"` docs section for caveats.\n */\nexport interface AutoColumnSizing {\n /**\n * Preferred width hint. Accepts a pixel count (`number`) or any valid CSS `width` value\n * (`string`, e.g. `'50%'`, `'10rem'`). Pass `0` to make the column as narrow as its\n * content — useful for icon or action button columns.\n */\n width?: number | string;\n /**\n * Minimum width of the column. Accepts a pixel count (`number`) or any valid CSS\n * `min-width` value (`string`).\n */\n minWidth?: number | string;\n /**\n * Maximum width of the column. Accepts a pixel count (`number`) or any valid CSS\n * `max-width` value (`string`).\n */\n maxWidth?: number | string;\n}\n\n/**\n * Sizing shape available for a given {@link Layout}.\n */\nexport type ColumnSizingFor<TMode extends Layout> = TMode extends 'fixed'\n ? FixedColumnSizing\n : AutoColumnSizing;\n\n/**\n * Context passed to a column's `cell` renderer.\n *\n * - `row` — the plain row data (`TData`).\n * - `value` — the cell value, typed from `accessorKey` / `accessorFn`.\n * For display columns (no accessor) this is `undefined`.\n * - `rowIndex` — the zero-based index of the row within the current data.\n * - `context` — the `context` object passed to the DataGrid. Typed via the\n * `TContext` generic.\n */\nexport interface DataGridBodyCellRenderProps<TData, TValue, TContext>\n extends DataGridCellRendererProps<TContext> {\n /** The cell value (typed from `accessorKey`/`accessorFn`). */\n value: TValue;\n /** The row data. */\n rowData: TData;\n /** Zero-based row index in the current data. */\n rowIndex: number;\n}\n\ninterface DataGridCellRendererProps<TContext> {\n /** Custom context object passed via the DataGrid `context` prop. */\n context: TContext;\n}\n/**\n * Props shared by all DataGrid column definitions, regardless of column kind\n * (accessor / accessor function / display) and sizing mode.\n */\ninterface DataGridColumnShared<TMode extends Layout, TContext> {\n /** Stable id for the column. Required for display columns. */\n id?: string;\n /** Header rendered in the column's header cell. */\n header?:\n | ReactNode\n | (({ context }: DataGridCellRendererProps<TContext>) => ReactNode);\n /** Footer rendered in the column's footer cell. */\n footer?:\n | ReactNode\n | (({ context }: DataGridCellRendererProps<TContext>) => ReactNode);\n /** Whether sorting can be toggled on this column. */\n enableSorting?: boolean;\n /** Horizontal alignment of cell content. Defaults to `'left'`. */\n align?: ColumnAlignment;\n /** Whether this column is a [row header](https://www.w3.org/TR/wai-aria-1.1/#rowheader). */\n isRowHeader?: boolean;\n /**\n * Custom skeleton loading content for this column. Receives the skeleton row\n * index and returns a `ReactNode` to render inside the cell while the grid is\n * in a loading state. Defaults to `<Skeleton.Text>`.\n */\n renderLoadingSkeleton?: (rowIndex: number) => ReactNode;\n /** Column width/min/max (shape depends on sizing mode). */\n sizing?: ColumnSizingFor<TMode>;\n}\n\n/**\n * Accessor column — reads a value directly from a property of `TData` by key.\n * `value` in the cell renderer is typed as `TData[TKey]`.\n */\nexport interface DataGridAccessorKeyColumn<\n TData,\n TKey extends keyof TData,\n TContext,\n TMode extends Layout\n> extends DataGridColumnShared<TMode, TContext> {\n accessorKey: TKey;\n accessorFn?: never;\n cell?: (\n context: DataGridBodyCellRenderProps<TData, TData[TKey], TContext>\n ) => ReactNode;\n}\n\n/**\n * Accessor-function column — derives the value via a function of `TData`.\n * `value` in the cell renderer is typed as the function's return type.\n * `id` is required since there is no `accessorKey` to derive it from.\n */\nexport interface DataGridAccessorFnColumn<\n TData,\n TValue,\n TContext,\n TMode extends Layout\n> extends DataGridColumnShared<TMode, TContext> {\n id: string;\n accessorKey?: never;\n accessorFn: (row: TData) => TValue;\n cell?: (\n context: DataGridBodyCellRenderProps<TData, TValue, TContext>\n ) => ReactNode;\n}\n\n/**\n * Display column — no accessor. `value` in the cell renderer is `undefined`.\n * Typically used for action columns that render controls derived only from\n * row data / custom context.\n */\nexport interface DataGridDisplayColumn<TData, TContext, TMode extends Layout>\n extends DataGridColumnShared<TMode, TContext> {\n id: string;\n accessorKey?: never;\n accessorFn?: never;\n cell?: (\n context: DataGridBodyCellRenderProps<TData, undefined, TContext>\n ) => ReactNode;\n}\n\n/**\n * A column definition. Union of:\n * - {@link DataGridAccessorKeyColumn} — one per key of `TData`, with `value` typed as `TData[K]`\n * - {@link DataGridAccessorFnColumn} — `value` typed from the `accessorFn` return\n * - {@link DataGridDisplayColumn} — no accessor, `value` is `undefined`\n *\n * Generic order is `<TData, TMode, TContext>`: the sizing mode is the most\n * common \"second argument\" consumers need, and `TContext` defaults to\n * `undefined` so the single-arg form works.\n */\nexport type DataGridColumn<\n TData,\n TMode extends Layout = 'auto',\n TContext = undefined\n> =\n | {\n [K in keyof TData]: DataGridAccessorKeyColumn<TData, K, TContext, TMode>;\n }[keyof TData]\n | DataGridAccessorFnColumn<TData, unknown, TContext, TMode>\n | DataGridDisplayColumn<TData, TContext, TMode>;\n\nexport type DataGridSelectionMode = 'none' | 'single' | 'multiple';\n\nexport interface DataGridSortDescriptor {\n /** The id of the column to sort by. */\n column: string;\n /** The direction to sort by. */\n direction: SortDirection;\n}\n\n/**\n * Context-ergonomics helper: when `TContext` is `undefined` (consumer didn't\n * specify a context type), the `context` prop is optional. Otherwise it is\n * required, mirroring the shape of the column definitions.\n */\ntype ContextProp<TContext> = [TContext] extends [undefined]\n ? { context?: undefined }\n : {\n /**\n * Object passed to every cell renderer as `context`. Use it to share\n * table-level state or callbacks (e.g. editing handlers) with cells\n * without closing over ad-hoc references in every column `cell`.\n */\n context: TContext;\n };\n\nexport type DataGridProps<TData, TContext = undefined> = (\n | {\n layout?: 'auto';\n /** Column definitions */\n columns: DataGridColumn<TData, 'auto', TContext>[];\n }\n | {\n layout: 'fixed';\n /** Column definitions */\n columns: DataGridColumn<TData, 'fixed', TContext>[];\n }\n) &\n SapphireStyleProps &\n DOMProps &\n ContextProp<TContext> & {\n /** Accessibility label for the grid */\n 'aria-label': string;\n\n /** Row data */\n data: TData[];\n /**\n * The spacing inside table cells.\n * @default 'md'\n */\n cellSpacing?: CellSpacing;\n\n /**\n * Default sorting state. Used for initializing uncontrolled sorting.\n */\n defaultSortDescriptor?: DataGridSortDescriptor;\n /**\n * The current sort state. Used for controlled sorting.\n * If not provided, the component will manage its own sort state.\n */\n sortDescriptor?: DataGridSortDescriptor;\n /**\n * Called when the sort state changes.\n * Use together with `sortingDescriptor` for controlled sorting.\n */\n onSortChange?: (sorting: DataGridSortDescriptor | undefined) => void;\n\n /**\n * Function to derive a stable unique identifier for each row.\n * Defaults to the row's index. Provide this when using controlled selection\n * or when row order can change (e.g. after sorting).\n */\n getRowId?: (row: TData, index: number) => string;\n\n /**\n * Enables row selection. Pass `'single'` for single-row selection or\n * `'multiple'` for multi-row selection with a \"select all\" header checkbox.\n */\n selectionMode?: DataGridSelectionMode;\n /**\n * When `true`, no user interaction can result in an empty selection.\n * In single-selection mode, radio buttons are rendered instead of checkboxes\n * to communicate this to users.\n * Has no effect on the initial or controlled state.\n */\n disallowEmptySelection?: boolean;\n /**\n * The currently selected row ids (controlled).\n * Use together with `onSelectionChange`.\n */\n selectedRowIds?: string[];\n /**\n * Default selected row ids (uncontrolled).\n */\n defaultSelectedRowIds?: string[];\n /**\n * Called when the selection changes with the new array of selected row ids\n * and the interaction that triggered the change.\n *\n * - `'select-all'` — the user clicked the \"Select all\" header checkbox.\n * - `'select'` — the user selected or deselected an individual row.\n */\n onSelectionChange?: (\n selectedRowsIds: string[],\n interaction: DataGridSelectionInteraction\n ) => void;\n\n /**\n * Content to show when there are no rows to display. Can be used to\n * communicate empty, or error state. The value is typically a\n * {@link FeedbackMessage} element. For loading state, render skeleton\n * loading rows using {@link loadingState} prop.\n */\n emptyState?: ReactNode;\n\n /**\n * Whether the grid is currently loading data.\n * When set to `'loading'`, the grid will show loading skeleton rows instead of the actual content.\n * When set to `'loadingMore'`, the grid will show loading skeleton rows in addition to the actual content.\n * Use this for \"infinite scrolling\" scenarios when you want to indicate that more content is being loaded, but you\n * still have some content to show.\n **/\n loadingState?: 'loading' | 'loadingMore';\n /**\n * Number of loading skeleton rows to render when {@link loadingState} is set.\n * Use it to match amount of actual content rows being loaded as closely as possible.\n * @default 3\n */\n loadingSkeletonRowsCount?: number;\n /**\n * Whether to hide the divider after the last row.\n * @default false\n */\n hideLastDivider?: boolean;\n /**\n * When `true`, rows are virtualized — only the rows currently in the\n * viewport are rendered. The table must have a bounded scroll area for this\n * to work, either via {@link height} or by constraining the container through\n * parent layout.\n * @default false\n */\n enableRowVirtualization?: boolean;\n /**\n * Estimated height of each row in pixels, used to improve scroll accuracy\n * during virtualization. Defaults to the natural row height for the current\n * {@link cellSpacing}.\n */\n estimatedRowHeight?: number;\n /**\n * Called when the user scrolls near the bottom of the table.\n * Use this to append more rows for infinite scrolling.\n * Not called while {@link loadingState} is set.\n */\n onLoadMore?: () => void;\n\n /**\n * Element rendered in a sticky footer below the table.\n * Normally used to render a {@link Pagination} component.\n *\n * The DataGrid automatically provides the scroll container reference to\n * the `Pagination` component so that it scrolls back to the top of the\n * table when the page changes.\n */\n footer?: ReactNode;\n\n /**\n * Whether the table header should be sticky relative to the first\n * scrolling ancestor.\n *\n * - `'auto'` (default) — the header sticks when the component has a\n * set (or constrained) height.\n * - `true` — always sticky.\n * - `false` — never sticky.\n *\n * @default 'auto'\n */\n stickyHeader?: StickyPosition;\n\n /**\n * Whether the table footer (rendered via the [`footer`](#props:footer)\n * prop) should be sticky relative to the first scrolling ancestor.\n *\n * - `'auto'` (default) — the footer sticks when the component has a\n * set (or constrained) height.\n * - `true` — always sticky.\n * - `false` — never sticky.\n *\n * @default 'auto'\n */\n stickyFooter?: StickyPosition;\n\n // --- Row expansion ---\n\n /**\n * Configures row expansion.\n *\n * - `{ type: 'subRows', getSubRows }` — tree-grid structure. `getSubRows`\n * returns the child rows for a given parent row. Child rows are indented\n * to convey depth.\n * - `{ type: 'expandedView', getExpandedView }` — accordion-style panel.\n * `getExpandedView` returns the `ReactNode` to render below the row when\n * it is expanded.\n *\n * Use {@link defaultExpandedRowIds} to pre-expand rows, or control expansion\n * fully with {@link expandedRowIds} and {@link onExpandedRowsChange}.\n */\n rowExpansion?:\n | {\n type: 'subRows';\n getSubRows: (row: TData, index: number) => TData[] | undefined;\n }\n | {\n type: 'expandedView';\n // TODO: rename to expandedView and render as component to allow for hooks\n getExpandedView: (row: TData, index: number) => ReactNode;\n };\n\n /**\n * The currently expanded row ids (controlled).\n * Use together with {@link onExpandedRowsChange}.\n */\n expandedRowIds?: string[];\n\n /**\n * Default expanded row ids (uncontrolled).\n */\n defaultExpandedRowIds?: string[];\n\n /**\n * Called when the set of expanded rows changes.\n */\n onExpandedRowsChange?: (expandedRowIds: string[]) => void;\n\n /**\n * Called when a row is clicked. Passing it makes the rows interactive.\n */\n onRowAction?: (row: TData) => void;\n\n /**\n * Disables individual rows. Pass a function to evaluate the disabled state\n * per row, or a static `true` to disable all rows.\n * Use {@link disabledBehavior} to control whether disabled rows are fully\n * inert (`'all'`, the default) or only prevented from being selected\n * (`'selection'`).\n */\n isDisabled?: boolean | ((row: TData) => boolean);\n /**\n * Whether disabled state applies to all interactions, or only selection.\n * @default \"all\"\n */\n disabledBehavior?: DisabledBehavior;\n };\n\ntype RowItem<TData> =\n | {\n type: 'data';\n row: TanStackRow<TData>;\n hasExpandedView: boolean;\n disabled: boolean;\n }\n | {\n type: 'expandedView';\n row: TanStackRow<TData>;\n expandedView: ReactNode;\n }\n | { type: 'skeleton'; skeletonIndex: number };\n\nconst DEFAULT_ROW_HEIGHTS: Record<CellSpacing, number> = {\n sm: 40,\n md: 48,\n lg: 56,\n xl: 64,\n};\n\nconst SELECTION_COLUMN_ID = '__selection';\n\n/**\n * DataGrid columns are passed to TanStack as-is (cast to TanStack's type).\n * TanStack only consults `id`, `accessorKey`, `accessorFn`, and\n * `enableSorting`; the renderer fields (`header`, `cell`, `footer`) are never\n * invoked by TanStack — we render them ourselves. This alias is used purely\n * to cast back to our column type at render sites.\n *\n * Internally we widen `TMode` to `'auto'` so we can read all\n * possible sizing fields (`width`/`minWidth`/`maxWidth`) regardless of the\n * grid's active sizing mode. In fixed layout the min/max values — if any —\n * are simply ignored at render time (they have no effect in CSS).\n */\ntype AnyColumn<TData, TContext> = DataGridColumn<TData, 'auto', TContext>;\n\n/**\n * DataGrid renders an array of objects into a grid layout following Sapphire Table design.\n * It supports features such as sorting or row selection, typically required for data-heavy applications.\n */\nexport function DataGrid<TData, TContext = undefined>({\n 'aria-label': ariaLabel,\n columns,\n data,\n cellSpacing = 'md',\n sortDescriptor,\n onSortChange,\n defaultSortDescriptor,\n selectionMode = 'none',\n disallowEmptySelection,\n getRowId,\n selectedRowIds: selectedRowsProp,\n defaultSelectedRowIds,\n onSelectionChange,\n emptyState,\n loadingState,\n loadingSkeletonRowsCount = 3,\n hideLastDivider,\n enableRowVirtualization,\n estimatedRowHeight,\n rowExpansion,\n expandedRowIds,\n defaultExpandedRowIds,\n onExpandedRowsChange,\n onLoadMore,\n onRowAction,\n isDisabled,\n disabledBehavior = 'all',\n layout = 'auto',\n footer,\n stickyHeader = 'auto',\n stickyFooter = 'auto',\n context,\n ...otherProps\n}: DataGridProps<TData, TContext>): React.JSX.Element {\n useThemeCheck();\n const { styleProps, filteredProps } = useSapphireStyleProps(otherProps);\n\n const [sorting, setSorting] = useControlledState<SortingState>(\n toSortingState(sortDescriptor),\n toSortingState(defaultSortDescriptor) ?? [],\n (sortingState) => {\n onSortChange?.(fromSortingState(sortingState));\n }\n );\n\n const [rowSelection, setRowSelection] = useControlledState<RowSelectionState>(\n toBooleanMap(selectedRowsProp),\n toBooleanMap(defaultSelectedRowIds) ?? {},\n (state) => {\n onSelectionChange?.(\n fromBooleanMap(state),\n pendingSelectionInteraction.current\n );\n }\n );\n\n // fairly hacky way to support `interaction` in the `onSelectionChange` callback\n // while still using TanStack API for changing selection\n const pendingSelectionInteraction =\n useRef<DataGridSelectionInteraction>('select');\n\n const handleRowSelectionChange = (updater: Updater<RowSelectionState>) => {\n const newValue =\n typeof updater === 'function' ? updater(rowSelection) : updater;\n if (\n !disallowEmptySelection ||\n Object.values(newValue).filter(Boolean).length > 0\n ) {\n setRowSelection(newValue);\n pendingSelectionInteraction.current = 'select';\n }\n };\n\n const [expanded, setExpanded] = useControlledState<ExpandedState>(\n toBooleanMap(expandedRowIds),\n toBooleanMap(defaultExpandedRowIds) ?? {},\n (expandedState) => {\n onExpandedRowsChange?.(\n expandedState === true ? [] : fromBooleanMap(expandedState)\n );\n }\n );\n\n // Hold `context` in a ref so cell renderers always read the latest value\n // without needing to re-memoize columns on every context change.\n const contextRef = useRef(context);\n contextRef.current = context;\n\n // Build the full column list with internal columns prepended\n const allColumns = useMemo<TanStackColumnDef<TData>[]>(() => {\n const result: TanStackColumnDef<TData>[] = [];\n\n if (selectionMode !== 'none') {\n result.push({\n id: SELECTION_COLUMN_ID,\n header:\n selectionMode === 'multiple'\n ? ({ table }) => (\n <Checkbox\n aria-label=\"Select all\" // TODO(i18n)\n isSelected={table.getIsAllRowsSelected()}\n isIndeterminate={table.getIsSomeRowsSelected()}\n isDisabled={isDisabled === true}\n onChange={(isSelected: boolean) => {\n pendingSelectionInteraction.current = 'select-all';\n table.toggleAllRowsSelected(isSelected);\n }}\n />\n )\n : () => null,\n cell: ({ row }) => {\n const checkboxProps = {\n 'aria-label': 'Select', // TODO(i18n)\n isSelected: row.getIsSelected(),\n isDisabled: !row.getCanSelect(),\n onChange: (isSelected: boolean) => row.toggleSelected(isSelected),\n };\n return selectionMode === 'single' && disallowEmptySelection ? (\n <RadioBox role=\"checkbox\" {...checkboxProps} />\n ) : (\n <Checkbox {...checkboxProps} />\n );\n },\n renderLoadingSkeleton: (i: number) => (\n <Skeleton.From index={i} margin=\"auto\">\n <Checkbox />\n </Skeleton.From>\n ),\n } as TanStackColumnDef<TData>);\n }\n\n result.push(\n ...columns.map(({ header, cell, footer, ...column }) => {\n return {\n ...column,\n header:\n typeof header === 'function'\n ? () => header({ context: contextRef.current! })\n : header,\n footer:\n typeof footer === 'function'\n ? () => footer({ context: contextRef.current! })\n : footer,\n cell: ({ row, getValue }): ReactNode => {\n const value = getValue();\n if (!cell) {\n return value as ReactNode;\n }\n return cell({\n rowData: row.original,\n value: value as any,\n rowIndex: row.index,\n context: contextRef.current!,\n });\n },\n } as TanStackColumnDef<TData>;\n })\n );\n return result;\n }, [\n selectionMode,\n disallowEmptySelection,\n isDisabled,\n disabledBehavior,\n columns,\n ]);\n\n const table = useReactTable({\n data,\n columns: allColumns,\n state: { sorting, rowSelection, expanded },\n defaultColumn: {\n enableSorting: false, // TODO(decision): should sorting be enabled or disabled by default?\n size: undefined,\n },\n getRowId,\n getSubRows:\n rowExpansion?.type === 'subRows' ? rowExpansion.getSubRows : undefined,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n\n // sorting\n enableMultiSort: false,\n sortDescFirst: false, // TODO(decision): should it be an option?\n manualSorting: sortDescriptor !== undefined,\n onSortingChange: setSorting,\n\n // row selection\n enableRowSelection:\n selectionMode === 'none'\n ? false\n : isDisabled !== undefined\n ? (tanStackRow) => {\n const disabled =\n typeof isDisabled === 'function'\n ? isDisabled?.(tanStackRow.original)\n : isDisabled;\n return !disabled;\n }\n : true,\n enableMultiRowSelection: selectionMode === 'multiple',\n onRowSelectionChange: handleRowSelectionChange,\n\n // row expansion\n onExpandedChange: setExpanded,\n });\n\n const containerRef = useRef<HTMLDivElement>(null);\n const tableRef = useRef<HTMLTableElement>(null);\n\n const { measuredColumnWidths } = useMeasureColumnWidths({\n table,\n data,\n tableRef,\n enabled: Boolean(enableRowVirtualization && layout === 'auto'),\n });\n\n const rows = table.getRowModel().rows;\n const rowItems: RowItem<TData>[] = [];\n if (loadingState !== 'loading') {\n for (const row of rows) {\n const disabled =\n typeof isDisabled === 'function'\n ? isDisabled?.(row.original)\n : isDisabled ?? false;\n const expandedView =\n rowExpansion?.type === 'expandedView'\n ? rowExpansion.getExpandedView(row.original, row.index)\n : undefined;\n rowItems.push({\n type: 'data',\n row,\n hasExpandedView: Boolean(expandedView),\n disabled,\n });\n // Inject an expandedView row after the data row when the row is expanded\n // and this is an expandedView-type expansion (not sub-rows).\n if (expandedView && row.getIsExpanded()) {\n rowItems.push({\n type: 'expandedView',\n row,\n expandedView,\n });\n }\n }\n }\n if (loadingState) {\n for (\n let skeletonIndex = 0;\n skeletonIndex < loadingSkeletonRowsCount;\n skeletonIndex++\n ) {\n rowItems.push({ type: 'skeleton', skeletonIndex });\n }\n }\n\n const { gridKeyboardNavigationProps, rangeExtractor } =\n useGridKeyboardNavigation({\n tableRef,\n enabled: true,\n scrollContainerRef: containerRef,\n rowItemCount: rowItems.length,\n onScrollToRowIndex: enableRowVirtualization\n ? (...args) => {\n virtualizer.scrollToIndex(...args);\n }\n : undefined,\n });\n\n const virtualizer = useVirtualizer({\n count: rowItems.length,\n getScrollElement: () => containerRef.current,\n estimateSize: () => estimatedRowHeight ?? DEFAULT_ROW_HEIGHTS[cellSpacing],\n overscan: 5,\n enabled: enableRowVirtualization,\n rangeExtractor,\n });\n\n const virtualRows = enableRowVirtualization\n ? virtualizer.getVirtualItems()\n : null;\n\n // The focused row is always included in the rendered items.\n // So there might be a gap between the first two or the last two rendered rows that needs to be added to the paddings.\n const topGap = (virtualRows?.[1]?.start || 0) - (virtualRows?.[0]?.end || 0);\n const bottomGap =\n (virtualRows?.[virtualRows.length - 2]?.end || 0) -\n (virtualRows?.[virtualRows.length - 1]?.start || 0);\n const virtualPaddingTop = virtualRows?.length\n ? virtualRows[0].start + topGap\n : 0;\n const virtualPaddingBottom = virtualRows?.length\n ? virtualizer.getTotalSize() -\n virtualRows[virtualRows.length - 1].end +\n bottomGap\n : 0;\n\n const renderedRowItems = virtualRows\n ? virtualRows\n .map((vi) => ({ rowItem: rowItems[vi.index], index: vi.index }))\n .filter(({ rowItem }) => !!rowItem)\n : rowItems.map((rowItem, index) => ({ rowItem, index }));\n\n // Total visible column count (for colSpan on empty/skeleton/expandedView rows)\n const columnCount = table.getVisibleLeafColumns().length;\n\n // Only render a <tfoot> when at least one user-provided column has a footer.\n const hasFooterRow = columns.some((col) => col.footer != null);\n\n useLoadMore(\n { isLoading: !!loadingState, onLoadMore, items: data },\n containerRef\n );\n\n // Using CSS variables instead of inline style on individual elements\n // to pave the way for a performant column resizing implementation in the future, without causing React re-renders.\n const columnSizeVars = Object.fromEntries(\n table.getVisibleLeafColumns().flatMap((col) => {\n const columnDef = col.columnDef as AnyColumn<TData, TContext>;\n const width = measuredColumnWidths?.[col.id] ?? columnDef.sizing?.width;\n if (width === undefined) return [];\n const cssValue = typeof width === 'number' ? `${width}px` : width;\n return [[`--col-${col.id}-width`, cssValue]];\n })\n );\n\n return (\n <Table.Container\n ref={containerRef}\n hideLastDivider={hideLastDivider || (data.length === 0 && !loadingState)}\n stickyHeader={stickyHeader}\n stickyFooter={stickyFooter}\n UNSAFE_style={styleProps.style}\n UNSAFE_className={styleProps.className}\n footer={\n footer ? (\n <PaginationContext.Provider value={{ scrollableRef: containerRef }}>\n {footer}\n </PaginationContext.Provider>\n ) : undefined\n }\n {...filteredProps}\n >\n <Table\n ref={tableRef}\n role=\"grid\"\n aria-label={ariaLabel}\n cellSpacing={cellSpacing}\n aria-busy={Boolean(loadingState) || undefined}\n layout={\n layout === 'fixed' || measuredColumnWidths !== null ? 'fixed' : 'auto'\n }\n UNSAFE_style={columnSizeVars}\n {...gridKeyboardNavigationProps}\n >\n {/* colgroup ensures column size declarations reach the browser */}\n <colgroup>\n {table.getVisibleLeafColumns().map((col) => {\n const varName = `--col-${col.id}-width`;\n return (\n <col\n key={col.id}\n style={\n columnSizeVars[varName]\n ? { width: `var(${varName})` }\n : undefined\n }\n />\n );\n })}\n </colgroup>\n <Table.Header>\n {table.getHeaderGroups().map((headerGroup) => (\n <Table.HeaderRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => {\n const columnDef = header.column.columnDef as AnyColumn<\n TData,\n TContext\n >;\n return (\n <Table.HeaderCell\n key={header.id}\n allowsSorting={header.column.getCanSort()}\n sortDirection={mapSortDirection(\n header.column.getIsSorted()\n )}\n onPress={header.column.getToggleSortingHandler()}\n align={columnDef.align}\n variant={\n header.column.id === SELECTION_COLUMN_ID\n ? 'selection'\n : 'normal'\n }\n // min-width and max-width are intentionally set on <th>, not <col>.\n // The CSS spec only allows width, background, border, and visibility on\n // <col> elements — min-width/max-width are ignored by browsers there.\n minWidth={columnDef.sizing?.minWidth}\n maxWidth={columnDef.sizing?.maxWidth}\n >\n {header.isPlaceholder\n ? null\n : flexRender(columnDef.header, header.getContext())}\n </Table.HeaderCell>\n );\n })}\n </Table.HeaderRow>\n ))}\n </Table.Header>\n <Table.Body>\n {/* Top spacer for virtual items scrolled past */}\n {virtualPaddingTop > 0 && (\n <tr aria-hidden style={{ height: virtualPaddingTop }}>\n <td colSpan={columnCount} />\n </tr>\n )}\n\n {renderedRowItems.map(({ rowItem, index: itemIndex }) => {\n if (rowItem.type === 'skeleton') {\n const { skeletonIndex: i } = rowItem;\n return (\n <Table.Row key={`skeleton-${i}`} aria-hidden>\n {table.getVisibleLeafColumns().map((col) => {\n const columnDef = col.columnDef as AnyColumn<\n TData,\n TContext\n >;\n const renderLoadingSkeleton =\n columnDef.renderLoadingSkeleton ??\n ((i) => (\n <Skeleton.Text index={i} widthType=\"randomPct\" />\n ));\n return (\n <Table.Cell\n key={col.id}\n align={columnDef.align}\n overflow=\"none\"\n variant={\n col.id === SELECTION_COLUMN_ID\n ? 'selection'\n : 'normal'\n }\n >\n {renderLoadingSkeleton(i)}\n </Table.Cell>\n );\n })}\n </Table.Row>\n );\n }\n\n if (rowItem.type === 'expandedView') {\n const { row } = rowItem;\n return (\n <Table.Row\n key={`${row.id}-expanded-view`}\n data-index={itemIndex}\n // passing a new function on each render has a role here in\n // making sure the ref callback is called on each render and\n // not just on mount.\n ref={(element) => {\n virtualizer.measureElement(element);\n }}\n >\n <Table.Cell colSpan={columnCount} overflow=\"none\">\n {rowItem.expandedView}\n </Table.Cell>\n </Table.Row>\n );\n }\n\n const { row, disabled } = rowItem;\n const canExpand = row.getCanExpand() || rowItem.hasExpandedView;\n\n const toggleRowExpansion = canExpand\n ? () => row?.toggleExpanded()\n : undefined;\n const toggleRowSelection = row.getCanSelect()\n ? () => row?.toggleSelected()\n : undefined;\n const rowAction = onRowAction\n ? () => onRowAction(row.original)\n : undefined;\n\n const isRowActionDisabled =\n disabled && disabledBehavior !== 'selection';\n const onAction = !isRowActionDisabled\n ? rowAction ?? toggleRowExpansion ?? toggleRowSelection\n : undefined;\n\n // The first non-internal column gets the expand toggle + depth indent\n const firstUserColumnId = row\n .getVisibleCells()\n .find((c) => c.column.id !== SELECTION_COLUMN_ID)?.column.id;\n\n return (\n <Table.Row\n key={row.id}\n isDisabled={isRowActionDisabled}\n isSelected={\n selectionMode !== 'none' ? row.getIsSelected() : undefined\n }\n aria-selected={\n selectionMode !== 'none' ? row.getIsSelected() : undefined\n }\n onAction={\n onAction &&\n ((e) => {\n if (\n e.pointerType === 'keyboard' &&\n e.key === ' ' &&\n toggleRowSelection\n ) {\n toggleRowSelection();\n } else {\n onAction?.();\n }\n })\n }\n triggerActionOnPressStart={onAction === toggleRowSelection}\n isExpanded={\n row.getIsExpanded() && rowExpansion?.type === 'expandedView'\n }\n aria-level={rowExpansion != null ? row.depth + 1 : undefined}\n data-grid-row={isRowActionDisabled ? undefined : ''}\n data-index={itemIndex}\n // passing a new function on each render has a role here in\n // making sure the ref callback is called on each render and\n // not just on mount.\n ref={(element) => {\n virtualizer.measureElement(element);\n }}\n >\n {row.getVisibleCells().map((cell) => {\n const columnDef = cell.column.columnDef as AnyColumn<\n TData,\n TContext\n >;\n const isTreeColumn =\n rowExpansion != null &&\n cell.column.id === firstUserColumnId;\n\n return (\n <DataGridCell\n key={cell.id}\n align={columnDef.align}\n isRowHeader={columnDef.isRowHeader}\n variant={\n cell.column.id === SELECTION_COLUMN_ID\n ? 'selection'\n : isTreeColumn\n ? 'tree'\n : 'normal'\n }\n >\n {isTreeColumn && canExpand && (\n <Table.ToggleExpandButton\n isExpanded={row.getIsExpanded()}\n onPress={toggleRowExpansion}\n isDisabled={isRowActionDisabled}\n />\n )}\n {flexRender(columnDef.cell, cell.getContext())}\n </DataGridCell>\n );\n })}\n </Table.Row>\n );\n })}\n\n {/* Bottom spacer for virtual items not yet scrolled to */}\n {virtualPaddingBottom > 0 && (\n <tr aria-hidden style={{ height: virtualPaddingBottom }}>\n <td colSpan={columnCount} />\n </tr>\n )}\n\n {/* Empty state */}\n {!loadingState && data.length === 0 && emptyState != null && (\n <Table.Row>\n <Table.Cell colSpan={columnCount} overflow=\"none\">\n {emptyState}\n </Table.Cell>\n </Table.Row>\n )}\n </Table.Body>\n\n {hasFooterRow &&\n table.getFooterGroups().map((footerGroup) => (\n <Table.Footer key={footerGroup.id}>\n <Table.Row>\n {footerGroup.headers.map((footer) => {\n const columnDef = footer.column.columnDef as AnyColumn<\n TData,\n TContext\n >;\n return (\n <Table.Cell\n key={footer.id}\n role=\"gridcell\"\n align={columnDef.align}\n overflow=\"none\"\n >\n {footer.isPlaceholder\n ? null\n : flexRender(columnDef.footer, footer.getContext())}\n </Table.Cell>\n );\n })}\n </Table.Row>\n </Table.Footer>\n ))}\n </Table>\n </Table.Container>\n );\n}\n\nfunction DataGridCell({\n align,\n isRowHeader,\n children,\n variant,\n}: {\n align: ColumnAlignment | undefined;\n isRowHeader: boolean | undefined;\n children: ReactNode;\n variant: TableCellProps['variant'];\n}) {\n const ref = React.useRef<HTMLTableCellElement>(null);\n return (\n <DataGridCellContext.Provider value={{ ref }}>\n <Table.Cell\n ref={ref}\n role={isRowHeader ? 'rowheader' : 'gridcell'}\n align={align}\n overflow=\"none\"\n variant={variant}\n >\n {children}\n </Table.Cell>\n </DataGridCellContext.Provider>\n );\n}\n\nfunction fromBooleanMap(state: Record<string, boolean>): string[] {\n return Object.entries(state)\n .filter(([, isExpanded]) => isExpanded)\n .map(([id]) => id);\n}\n\nfunction toBooleanMap(\n ids: string[] | undefined\n): Record<string, boolean> | undefined {\n return ids?.reduce<Record<string, boolean>>((acc, id) => {\n acc[id] = true;\n return acc;\n }, {});\n}\n\nfunction toSortingState(\n sorting: DataGridSortDescriptor | undefined\n): SortingState | undefined {\n return sorting\n ? [\n {\n id: sorting.column,\n desc: sorting.direction === 'descending',\n },\n ]\n : undefined;\n}\n\nfunction fromSortingState(\n sorting: SortingState\n): DataGridSortDescriptor | undefined {\n return sorting[0]\n ? {\n column: sorting[0].id,\n direction: sorting[0].desc ? 'descending' : 'ascending',\n }\n : undefined;\n}\nfunction mapSortDirection(\n tanStackSortDirection: TanStackSortDirection | false\n): TableHeaderCellProps['sortDirection'] {\n if (tanStackSortDirection === 'asc') {\n return 'ascending';\n } else if (tanStackSortDirection === 'desc') {\n return 'descending';\n }\n return undefined;\n}\n"],"names":["table","footer","i","row"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataGridCellContext.js","sources":["../../../../../../src/DataGrid/src/DataGridCellContext.tsx"],"sourcesContent":["import { createContext, RefObject } from 'react';\n\nexport const DataGridCellContext = createContext<{\n ref: RefObject<HTMLTableCellElement>;\n} | null>(null);\n"],"names":[],"mappings":";;AAEO,MAAM,mBAAA,GAAsB,cAEzB,IAAI;;;;"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import React, { forwardRef, useState, useContext, useRef, useCallback, useLayoutEffect, useEffect } from 'react';
|
|
2
|
+
import { useOverlayTriggerState } from 'react-stately/useOverlayTriggerState';
|
|
3
|
+
import { IconButton, Popover } from '@danske/sapphire-react';
|
|
4
|
+
import { EditAlt, Checkmark } from '@danske/sapphire-icons/react';
|
|
5
|
+
import clsx from 'clsx';
|
|
6
|
+
import { DataGridCellContext } from './DataGridCellContext.js';
|
|
7
|
+
import styles from '@danske/sapphire-css/components/table/table.module.css';
|
|
8
|
+
|
|
9
|
+
const EditableCellContent = forwardRef(function EditableCellContent2(props, ref) {
|
|
10
|
+
const {
|
|
11
|
+
children,
|
|
12
|
+
renderEditor,
|
|
13
|
+
onSubmit,
|
|
14
|
+
onCancel,
|
|
15
|
+
editButtonLabel,
|
|
16
|
+
saveButtonLabel
|
|
17
|
+
} = props;
|
|
18
|
+
const [isEditing, setIsEditing] = useState(false);
|
|
19
|
+
const [cellPosition, setCellPosition] = useState({ width: 0, offset: 0 });
|
|
20
|
+
const cellContext = useContext(DataGridCellContext);
|
|
21
|
+
if (!cellContext) {
|
|
22
|
+
throw new Error(
|
|
23
|
+
"DataGrid.EditableCellContent is meant to be rendered inside DataGrid columns."
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
const cellRef = cellContext.ref;
|
|
27
|
+
const formRef = useRef(null);
|
|
28
|
+
const handleSubmit = useCallback(
|
|
29
|
+
(e) => {
|
|
30
|
+
e.preventDefault();
|
|
31
|
+
const result = onSubmit?.(e);
|
|
32
|
+
if (result !== false) {
|
|
33
|
+
setIsEditing(false);
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
[onSubmit, setIsEditing]
|
|
37
|
+
);
|
|
38
|
+
const cancel = useCallback(() => {
|
|
39
|
+
setIsEditing(false);
|
|
40
|
+
onCancel?.();
|
|
41
|
+
}, [setIsEditing, onCancel]);
|
|
42
|
+
const popoverState = useOverlayTriggerState({
|
|
43
|
+
isOpen: isEditing,
|
|
44
|
+
onOpenChange: (isOpen) => {
|
|
45
|
+
if (!isOpen) {
|
|
46
|
+
formRef.current?.requestSubmit();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
useLayoutEffect(() => {
|
|
51
|
+
if (isEditing && cellRef.current) {
|
|
52
|
+
const width = cellRef.current.clientWidth;
|
|
53
|
+
const offset = -cellRef.current.offsetHeight - 1;
|
|
54
|
+
setCellPosition({ width, offset });
|
|
55
|
+
}
|
|
56
|
+
}, [isEditing]);
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
if (isEditing) {
|
|
59
|
+
const onKeyDown = (e) => {
|
|
60
|
+
if (e.key === "Escape") {
|
|
61
|
+
e.stopPropagation();
|
|
62
|
+
e.preventDefault();
|
|
63
|
+
cancel();
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
window.addEventListener("keydown", onKeyDown);
|
|
67
|
+
return () => {
|
|
68
|
+
window.removeEventListener("keydown", onKeyDown);
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}, [isEditing, cancel]);
|
|
72
|
+
return /* @__PURE__ */ React.createElement(
|
|
73
|
+
"span",
|
|
74
|
+
{
|
|
75
|
+
ref,
|
|
76
|
+
className: clsx(styles["sapphire-table__cell-container--editable"])
|
|
77
|
+
},
|
|
78
|
+
children,
|
|
79
|
+
/* @__PURE__ */ React.createElement(
|
|
80
|
+
IconButton,
|
|
81
|
+
{
|
|
82
|
+
"aria-label": editButtonLabel ?? "Edit",
|
|
83
|
+
variant: "tertiary",
|
|
84
|
+
size: "sm",
|
|
85
|
+
onPress: () => setIsEditing(true),
|
|
86
|
+
UNSAFE_className: clsx(styles["sapphire-table__edit-button"])
|
|
87
|
+
},
|
|
88
|
+
/* @__PURE__ */ React.createElement(EditAlt, null)
|
|
89
|
+
),
|
|
90
|
+
/* @__PURE__ */ React.createElement(
|
|
91
|
+
Popover,
|
|
92
|
+
{
|
|
93
|
+
state: popoverState,
|
|
94
|
+
triggerRef: cellRef,
|
|
95
|
+
placement: "bottom start",
|
|
96
|
+
offset: cellPosition.offset,
|
|
97
|
+
isKeyboardDismissDisabled: true,
|
|
98
|
+
padded: true,
|
|
99
|
+
UNSAFE_style: { minWidth: `${cellPosition.width}px` }
|
|
100
|
+
},
|
|
101
|
+
/* @__PURE__ */ React.createElement(
|
|
102
|
+
"form",
|
|
103
|
+
{
|
|
104
|
+
ref: formRef,
|
|
105
|
+
onSubmit: handleSubmit,
|
|
106
|
+
className: clsx(styles["sapphire-table__edit-cell-popover"])
|
|
107
|
+
},
|
|
108
|
+
renderEditor(),
|
|
109
|
+
/* @__PURE__ */ React.createElement(
|
|
110
|
+
IconButton,
|
|
111
|
+
{
|
|
112
|
+
size: "md",
|
|
113
|
+
type: "submit",
|
|
114
|
+
variant: "tertiary",
|
|
115
|
+
"aria-label": saveButtonLabel ?? "Save"
|
|
116
|
+
},
|
|
117
|
+
/* @__PURE__ */ React.createElement(Checkmark, null)
|
|
118
|
+
)
|
|
119
|
+
)
|
|
120
|
+
)
|
|
121
|
+
);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
export { EditableCellContent };
|
|
125
|
+
//# sourceMappingURL=EditableCellContent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditableCellContent.js","sources":["../../../../../../src/DataGrid/src/EditableCellContent.tsx"],"sourcesContent":["import React, {\n FormEvent,\n ForwardedRef,\n forwardRef,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { useOverlayTriggerState } from 'react-stately/useOverlayTriggerState';\nimport { Popover, IconButton } from '@danske/sapphire-react';\n\nimport { Checkmark, EditAlt } from '@danske/sapphire-icons/react';\nimport clsx from 'clsx';\nimport { SapphireStyleProps } from '@danske/sapphire-react';\nimport { DataGridCellContext } from './DataGridCellContext';\n\nimport styles from '@danske/sapphire-css/components/table/table.module.css';\n\nexport interface EditableCellContentProps extends SapphireStyleProps {\n /**\n * The display value rendered when not editing.\n */\n children?: React.ReactNode;\n /**\n * A function that renders the editable form content.\n * This should typically contain form inputs like {@link TextField} or {@link Select}.\n */\n renderEditor: () => ReactNode;\n /**\n * Callback fired when the user submits the edit (via Enter key or checkmark button).\n * If this returns false, the editor popover is not closed. This is useful\n * when the field contains errors.\n */\n onSubmit?: (e: FormEvent<HTMLFormElement>) => boolean | void;\n /**\n * Callback fired when the user cancels the edit (via Escape key).\n */\n onCancel?: () => void;\n /**\n * aria-label of the edit button\n * @default: 'Edit'\n */\n editButtonLabel?: string;\n\n /**\n * aria-label of the save button\n * @default: 'Save'\n */\n saveButtonLabel?: string;\n}\n\n/**\n * Used inside DataGrid cells to provide inline editing functionality.\n * Displays a static value with an edit button that appears on row hover/focus.\n * When the edit button is clicked, a popover form opens allowing inline editing.\n */\nexport const EditableCellContent = forwardRef(function EditableCellContent(\n props: EditableCellContentProps,\n ref: ForwardedRef<HTMLSpanElement>\n) {\n const {\n children,\n renderEditor,\n onSubmit,\n onCancel,\n editButtonLabel,\n saveButtonLabel,\n } = props;\n\n const [isEditing, setIsEditing] = useState(false);\n const [cellPosition, setCellPosition] = useState({ width: 0, offset: 0 });\n const cellContext = useContext(DataGridCellContext);\n if (!cellContext) {\n throw new Error(\n 'DataGrid.EditableCellContent is meant to be rendered inside DataGrid columns.'\n );\n }\n const cellRef = cellContext.ref;\n const formRef = useRef<HTMLFormElement>(null);\n\n const handleSubmit = useCallback(\n (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n const result = onSubmit?.(e);\n if (result !== false) {\n setIsEditing(false);\n }\n },\n [onSubmit, setIsEditing]\n );\n\n const cancel = useCallback(() => {\n setIsEditing(false);\n onCancel?.();\n }, [setIsEditing, onCancel]);\n\n const popoverState = useOverlayTriggerState({\n isOpen: isEditing,\n onOpenChange: (isOpen) => {\n if (!isOpen) {\n formRef.current?.requestSubmit();\n }\n },\n });\n\n // Measure cell width when editing starts\n useLayoutEffect(() => {\n if (isEditing && cellRef.current) {\n const width = cellRef.current.clientWidth;\n const offset =\n -cellRef.current.offsetHeight -\n 1; /* to cross over the row separator nicely */\n setCellPosition({ width, offset });\n }\n }, [isEditing]);\n\n useEffect(() => {\n if (isEditing) {\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n e.preventDefault();\n cancel();\n }\n };\n window.addEventListener('keydown', onKeyDown);\n return () => {\n window.removeEventListener('keydown', onKeyDown);\n };\n }\n }, [isEditing, cancel]);\n\n return (\n <span\n ref={ref}\n className={clsx(styles['sapphire-table__cell-container--editable'])}\n >\n {children}\n <IconButton\n aria-label={editButtonLabel ?? 'Edit'}\n variant=\"tertiary\"\n size=\"sm\"\n onPress={() => setIsEditing(true)}\n UNSAFE_className={clsx(styles['sapphire-table__edit-button'])}\n >\n <EditAlt />\n </IconButton>\n <Popover\n state={popoverState}\n triggerRef={cellRef}\n placement=\"bottom start\"\n offset={cellPosition.offset}\n // We want to control the escape key manually\n isKeyboardDismissDisabled\n padded\n UNSAFE_style={{ minWidth: `${cellPosition.width}px` }}\n >\n <form\n ref={formRef}\n onSubmit={handleSubmit}\n className={clsx(styles['sapphire-table__edit-cell-popover'])}\n >\n {renderEditor()}\n <IconButton\n size=\"md\"\n type=\"submit\"\n variant=\"tertiary\"\n aria-label={saveButtonLabel ?? 'Save'}\n >\n <Checkmark />\n </IconButton>\n </form>\n </Popover>\n </span>\n );\n});\n"],"names":["EditableCellContent"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
function createDataGridColumnHelper(_options) {
|
|
2
|
+
const helper = {
|
|
3
|
+
accessor: (accessorKeyOrFn, column) => {
|
|
4
|
+
if (typeof accessorKeyOrFn === "function") {
|
|
5
|
+
return { ...column, accessorFn: accessorKeyOrFn };
|
|
6
|
+
}
|
|
7
|
+
return { ...column, accessorKey: accessorKeyOrFn };
|
|
8
|
+
},
|
|
9
|
+
display: (column) => column
|
|
10
|
+
};
|
|
11
|
+
return helper;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export { createDataGridColumnHelper };
|
|
15
|
+
//# sourceMappingURL=createDataGridColumnHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createDataGridColumnHelper.js","sources":["../../../../../../src/DataGrid/src/createDataGridColumnHelper.ts"],"sourcesContent":["import type {\n Layout,\n DataGridAccessorFnColumn,\n DataGridAccessorKeyColumn,\n DataGridDisplayColumn,\n} from './DataGrid';\n\n/**\n * Options accepted by {@link createDataGridColumnHelper}.\n */\nexport interface CreateDataGridColumnHelperOptions<\n TMode extends Layout = 'auto'\n> {\n /**\n * The column sizing mode the produced columns will be used with.\n * Determines the shape of the `sizing` option on each column.\n *\n * @default 'auto'\n */\n layout?: TMode;\n}\n\n/**\n * Column helper returned by {@link createDataGridColumnHelper}. Provides\n * type-safe builders for the three kinds of column definition:\n * accessor (by key), accessor (by function), and display.\n *\n * Each builder method is overloaded: the first overload covers the\n * \"mode-neutral\" case where `sizing` does not use `minWidth` / `maxWidth`,\n * returning a `'fixed'`-typed column. Because\n * {@link FixedColumnSizing} uses `never` for `minWidth` / `maxWidth` (and\n * `never` is assignable to any type), such a column is structurally\n * assignable to both fixed- and auto-layout column arrays — making it\n * reusable across grids with different `layout` settings regardless\n * of which helper created it.\n *\n * The second overload covers the remaining case and keeps the column\n * bound to the helper's declared mode (`TMode`). If the helper was created\n * for `'fixed'`, the call site still rejects `minWidth` /\n * `maxWidth` at the property level.\n */\nexport interface DataGridColumnHelper<TData, TContext, TMode extends Layout> {\n /**\n * Define an accessor column that reads a value directly from a property of\n * `TData` by key. The `value` received in the cell renderer is typed as\n * `TData[TKey]`.\n */\n accessor<TKey extends keyof TData>(\n accessorKey: TKey,\n column: Omit<\n DataGridAccessorKeyColumn<TData, TKey, TContext, 'fixed'>,\n 'accessorKey'\n >\n ): DataGridAccessorKeyColumn<TData, TKey, TContext, 'fixed'>;\n accessor<TKey extends keyof TData>(\n accessorKey: TKey,\n column: Omit<\n DataGridAccessorKeyColumn<TData, TKey, TContext, TMode>,\n 'accessorKey'\n >\n ): DataGridAccessorKeyColumn<TData, TKey, TContext, TMode>;\n\n /**\n * Define an accessor column that derives its value via a function. The\n * `value` received in the cell renderer is typed as the function's return\n * type. `id` is required since there is no `accessorKey` to derive it from.\n */\n accessor<TValue>(\n accessorFn: (row: TData) => TValue,\n column: Omit<\n DataGridAccessorFnColumn<TData, TValue, TContext, 'fixed'>,\n 'accessorFn'\n >\n ): DataGridAccessorFnColumn<TData, TValue, TContext, 'fixed'>;\n accessor<TValue>(\n accessorFn: (row: TData) => TValue,\n column: Omit<\n DataGridAccessorFnColumn<TData, TValue, TContext, TMode>,\n 'accessorFn'\n >\n ): DataGridAccessorFnColumn<TData, TValue, TContext, TMode>;\n\n /**\n * Define a display column — no accessor. The cell renderer receives a\n * `row` and `context` but `value` is `undefined`. Typically used for\n * action columns.\n */\n display(\n column: DataGridDisplayColumn<TData, TContext, 'fixed'>\n ): DataGridDisplayColumn<TData, TContext, 'fixed'>;\n display(\n column: DataGridDisplayColumn<TData, TContext, TMode>\n ): DataGridDisplayColumn<TData, TContext, TMode>;\n}\n\n/**\n * Create a typed column helper for a `DataGrid` with the given row data type\n * `TData` and cell rendering context type `TContext`. The helper's\n * `accessor` / `display` methods return correctly typed column definitions\n * that plug into the `columns` prop.\n *\n * @example\n * ```tsx\n * interface Person { id: string; name: string; age: number; }\n * interface Ctx { onEdit: (p: Person) => void; }\n *\n * const helper = createDataGridColumnHelper<Person, Ctx>();\n *\n * const columns = [\n * helper.accessor('name', {\n * header: 'Name',\n * cell: ({ value }) => value.toUpperCase(), // value: string\n * }),\n * helper.accessor((row) => row.age * 12, {\n * id: 'ageInMonths',\n * header: 'Age (months)',\n * cell: ({ value }) => value.toLocaleString(), // value: number\n * }),\n * helper.display({\n * id: 'actions',\n * header: 'Actions',\n * cell: ({ row, context }) => (\n * <button onClick={() => context.onEdit(row)}>Edit</button>\n * ),\n * }),\n * ];\n * ```\n *\n * Pass `{ layout: 'fixed' }` in the options to type the\n * column `sizing` property for fixed-layout grids. The sizing mode is\n * inferred from the options object — there is no need to pass it as an\n * explicit generic argument.\n *\n * Columns whose `sizing` does not use `minWidth` / `maxWidth` are returned\n * as mode-agnostic so that they can be reused across both fixed- and\n * auto-layout grids, regardless of which helper created them.\n */\nexport function createDataGridColumnHelper<\n TData,\n TContext = undefined\n>(options: { layout: 'fixed' }): DataGridColumnHelper<TData, TContext, 'fixed'>;\nexport function createDataGridColumnHelper<\n TData,\n TContext = undefined\n>(options?: { layout?: 'auto' }): DataGridColumnHelper<TData, TContext, 'auto'>;\nexport function createDataGridColumnHelper<TData, TContext = undefined>(\n _options?: CreateDataGridColumnHelperOptions<Layout>\n): DataGridColumnHelper<TData, TContext, Layout> {\n const helper = {\n accessor: (accessorKeyOrFn: unknown, column: Record<string, unknown>) => {\n if (typeof accessorKeyOrFn === 'function') {\n return { ...column, accessorFn: accessorKeyOrFn };\n }\n return { ...column, accessorKey: accessorKeyOrFn };\n },\n display: (column: unknown) => column,\n };\n return helper as unknown as DataGridColumnHelper<TData, TContext, Layout>;\n}\n"],"names":[],"mappings":"AAiJO,SAAS,2BACd,QAAA,EAC+C;AAC/C,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,QAAA,EAAU,CAAC,eAAA,EAA0B,MAAA,KAAoC;AACvE,MAAA,IAAI,OAAO,oBAAoB,UAAA,EAAY;AACzC,QAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,UAAA,EAAY,eAAA,EAAgB;AAAA,MAClD;AACA,MAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,WAAA,EAAa,eAAA,EAAgB;AAAA,IACnD,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,MAAA,KAAoB;AAAA,GAChC;AACA,EAAA,OAAO,MAAA;AACT;;;;"}
|