@economic/taco 8.1.0-EC-80345-test-release.0 → 8.1.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/dist/components/Select2/Select2.cjs +1 -1
- package/dist/components/Select2/Select2.cjs.map +1 -1
- package/dist/components/Select2/Select2.js +1 -1
- package/dist/components/Select2/Select2.js.map +1 -1
- package/dist/primitives/Table/Core/features/useTableRenderer.cjs +1 -1
- package/dist/primitives/Table/Core/features/useTableRenderer.cjs.map +1 -1
- package/dist/primitives/Table/Core/features/useTableRenderer.js +1 -1
- package/dist/primitives/Table/Core/features/useTableRenderer.js.map +1 -1
- package/package.json +7 -7
|
@@ -310,7 +310,7 @@ const Select2 = React.forwardRef(function Select22(props, ref) {
|
|
|
310
310
|
"!h-5 !w-5": fontSize === types.FontSizes.large
|
|
311
311
|
})
|
|
312
312
|
}
|
|
313
|
-
)), /* @__PURE__ */ React.createElement("span", null, texts.listbox.loading)) : flattenedChildren.length <= 0 ? /* @__PURE__ */ React.createElement("div", { className: "-mt-0.5 flex h-8 items-center px-2 text-gray-700", role: "presentation" }, texts.listbox.empty) : /* @__PURE__ */ React.createElement(
|
|
313
|
+
)), /* @__PURE__ */ React.createElement("span", null, texts.listbox.loading)) : flattenedChildren.length <= 0 && !onCreate ? /* @__PURE__ */ React.createElement("div", { className: "-mt-0.5 flex h-8 items-center px-2 text-gray-700", role: "presentation" }, texts.listbox.empty) : /* @__PURE__ */ React.createElement(
|
|
314
314
|
Root.Root,
|
|
315
315
|
{
|
|
316
316
|
className: "flex flex-col gap-0.5 focus-visible:outline-none",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select2.cjs","sources":["../../../src/components/Select2/Select2.tsx"],"sourcesContent":["import React from 'react';\nimport cn from 'clsx';\nimport { Popover as PopoverPrimitive } from '@base-ui/react/popover';\nimport * as ListboxPrimitive from '../../primitives/Listbox2/Listbox2';\nimport {\n Select2Children,\n Select2CreateHandler,\n Select2CreateDialogRenderer,\n Select2DeleteHandler,\n Select2EditHandler,\n Select2OptionValue,\n Select2Value,\n} from './types';\nimport { Option, Select2OptionProps } from './components/Option';\nimport { Group, Select2GroupProps } from './components/Group';\nimport { Select2TitleProps, Title } from './components/Title';\nimport { Select2Context } from './components/Context';\nimport { createCollectionClassName, filterOption, getFontSize } from './utilities';\nimport { useMergedRef } from '../../hooks/useMergedRef';\nimport { useBoundingClientRectListener } from '../../hooks/useBoundingClientRectListener';\nimport { createCustomKeyboardEvent } from '../../utils/input';\nimport { Trigger } from './components/Trigger';\nimport { useIsFormControl } from '../../hooks/useIsFormControl';\nimport { BubbleSelect } from '../../primitives/BubbleSelect';\nimport { Search } from './components/Search';\nimport { isGroup, useChildren } from './hooks/useChildren';\n\nimport { Create } from './components/Create';\nimport { Collection } from './components/Collection';\nimport { CollectionRef } from '../../primitives/Collection/Collection';\nimport { useLocalization } from '../Provider/Localization';\nimport { useIsHoverStatePaused } from '../../hooks/useIsHoverStatePaused';\nimport { isAriaDirectionKey } from '../../utils/aria';\nimport { getNextFocussableElement, isElementInsideTable3OrReport } from '../../utils/dom';\nimport { FontSize, FontSizes } from '../../types';\nimport { Button } from '../Button/Button';\nimport { Spinner } from '../Spinner/Spinner';\nimport { debounce } from '../../utils/debounce';\nimport { useControlled } from '../../hooks/useControlled';\n\ntype Select2Texts = {\n allSelect: string;\n allDeselect: string;\n cancel: string;\n chooseColor: string;\n create: string;\n delete: string;\n save: string;\n search: string;\n searchOrCreate: string;\n selectAll: string;\n selectAllResults: string;\n deselectAll: string;\n deselectAllResults: string;\n};\n\ntype Select2Props = Omit<React.HTMLAttributes<HTMLButtonElement>, 'children' | 'defaultValue' | 'onChange' | 'value'> & {\n /** Autofocus Select2 when loaded **/\n autoFocus?: boolean;\n /** Array of options in Select2 */\n children: Select2Children;\n /** Initial value of the input in Select2 */\n defaultValue?: Select2Value;\n /** Set what value should have an empty option in Select2 */\n emptyValue?: Select2OptionValue;\n /** Whether the Select2 is in a disabled state **/\n disabled?: boolean;\n /** Font size of text in Select2 **/\n fontSize?: FontSize;\n /** Draws attention to the Select2 by changing its style and making it visually prominent */\n highlighted?: boolean;\n /** Whether the Select2 is in an invalid state **/\n invalid?: boolean;\n /** Whether the Select2 is loading the data **/\n loading?: boolean;\n /** Whether the Select2 allows selecting multiple values **/\n multiple?: boolean;\n /** Whether the Select2 is in an invalid state **/\n name?: string;\n /** Handler called when user chooses an option from the provided options **/\n onChange?: (value: Select2Value) => void;\n /** Handler called when user creates a new option **/\n onCreate?: Select2CreateHandler;\n /** Handler called when user deletes an option **/\n onDelete?: Select2DeleteHandler;\n /** Handler called when user edits an option **/\n onEdit?: Select2EditHandler;\n /** Placeholder showed when nothing is selected **/\n placeholder?: string;\n /** Whether the Select2 is in a readonly state **/\n readOnly?: boolean;\n required?: boolean;\n /** Renders select options as tags **/\n tags?: boolean;\n /** Value of the input in select2 */\n value?: Select2Value;\n /** Create dialog component, if specified, then create button will become always visible in the bottom of options dropdown,\n * when clicked, it will open create dialog and wait for 'onCreate' handler to be triggered from the dialog */\n createDialog?: Select2CreateDialogRenderer;\n /** Create button text */\n createTriggerText?: string;\n};\ntype Select2PropsWithStatics = React.ForwardRefExoticComponent<Select2Props & React.RefAttributes<HTMLButtonElement>> & {\n Option: React.ForwardRefExoticComponent<Select2OptionProps>;\n Group: React.ForwardRefExoticComponent<Select2GroupProps>;\n Title: React.ForwardRefExoticComponent<Select2TitleProps>;\n};\n\nconst Select2 = React.forwardRef<HTMLButtonElement, Select2Props>(function Select2(props, ref) {\n const {\n children: initChildren,\n defaultValue,\n disabled = false,\n emptyValue = undefined,\n fontSize,\n highlighted = false,\n invalid = false,\n loading,\n multiple = false,\n name,\n onChange,\n onCreate,\n onDelete,\n onEdit,\n placeholder,\n readOnly = false,\n tags = false,\n value: prop,\n createDialog,\n createTriggerText,\n ...otherProps\n } = props;\n\n const emptyOption: React.ReactElement<Select2OptionProps> | undefined = React.useMemo(() => {\n if (emptyValue !== undefined && !multiple) {\n // Empty option has 0px height, because it's empty, so need to apply height manually\n return <Option key=\"__empty\" children=\"\" value={emptyValue} className=\"h-8\" />;\n }\n return;\n }, [emptyValue, multiple]);\n\n const initialChildren = React.useMemo(() => {\n if (emptyOption) {\n return [emptyOption, ...initChildren] as Select2Children;\n }\n return initChildren;\n }, [emptyOption, initChildren]);\n\n // refs\n const internalRef = useMergedRef<HTMLButtonElement>(ref);\n const listboxRef = React.useRef<CollectionRef>(null);\n const searchRef = React.useRef<HTMLInputElement>(null);\n const { texts } = useLocalization();\n // align the listbox min width with the width of the input - it should never be smaller\n const dimensions = useBoundingClientRectListener(internalRef);\n\n // state\n const [open, setOpen] = React.useState(false);\n const [value, _setValue] = useControlled<Select2Value>({\n // uncontrolled\n defaultValue,\n // controlled\n onChange,\n value: prop,\n });\n const setValue = ListboxPrimitive.createListboxValueSetter(\n multiple,\n _setValue as React.Dispatch<React.SetStateAction<Select2Value | undefined>>\n );\n const [validationError, setValidationError] = React.useState<Error | undefined>();\n const [shouldPauseHoverState, setShouldPauseHoverState] = useIsHoverStatePaused();\n\n const { flattenedChildren, filteredChildren, searchQuery, setSearchQuery } = useChildren({\n children: initialChildren,\n emptyValue,\n multiple,\n open,\n setValue,\n value,\n });\n\n // context\n const context = {\n disabled,\n highlighted,\n invalid,\n listboxRef,\n multiple,\n onCreate,\n onDelete,\n onEdit,\n open,\n readOnly,\n ref: internalRef,\n searchQuery,\n searchRef,\n setOpen,\n setSearchQuery,\n setValidationError,\n setValue,\n shouldPauseHoverState,\n setShouldPauseHoverState,\n tags,\n fontSize,\n validationError,\n value,\n createDialog,\n createTriggerText,\n };\n\n const hasInlineCreation = onCreate && !createDialog;\n const hasSearch = flattenedChildren.length > 5 || hasInlineCreation;\n const visibleChildren = searchQuery === '' ? initialChildren : filteredChildren;\n const selectOptions =\n searchQuery === ''\n ? flattenedChildren.map(child => child.props.value)\n : filteredChildren.flatMap(child =>\n isGroup(child)\n ? Array.isArray(child.props.children) && child.props.children.map(subChild => subChild.props.value)\n : child.props.value\n ) || [];\n\n // support typeahead functionality when search isn't available\n const queryTimeoutRef = React.useRef('');\n\n const typeahead = debounce(function () {\n if (!queryTimeoutRef.current) {\n return;\n }\n\n const matchedValueIndex = visibleChildren.findIndex(child =>\n filterOption(child as React.ReactElement<Select2OptionProps>, queryTimeoutRef.current)\n );\n\n if (matchedValueIndex > -1 && selectOptions[matchedValueIndex] !== undefined) {\n setValue(selectOptions[matchedValueIndex]);\n }\n\n queryTimeoutRef.current = '';\n }, 200);\n\n const setValueIfMatched = (query: string) => {\n queryTimeoutRef.current = queryTimeoutRef.current + query;\n typeahead();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n if (open) {\n event.preventDefault();\n } else if (isElementInsideTable3OrReport(event.currentTarget) && isAriaDirectionKey(event)) {\n return;\n } else if (!event.ctrlKey && !event.metaKey && (event.key === 'ArrowDown' || /^[a-z0-9]$/i.test(event.key))) {\n setOpen(true);\n\n if (!hasSearch) {\n setValueIfMatched(event.key);\n }\n }\n\n // Collect the first character when opening with keyboard (when user starts typing while focused on a trigger)\n if (hasSearch && /^[a-z0-9]$/i.test(event.key)) {\n setSearchQuery(prev => prev + event.key);\n }\n\n // the focus should always remain on the input, so we forward events on to the listbox\n listboxRef.current?.dispatchEvent(createCustomKeyboardEvent(event as React.KeyboardEvent<HTMLInputElement>));\n };\n\n const shouldFocusNextRef = React.useRef<number | undefined>(undefined);\n\n const handleHorizontalNavigation = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isElementInsideTable3OrReport(internalRef.current)) {\n const isTriggeredFromPopover = event.currentTarget.contains?.(event.target as Node);\n\n if ((event.key === 'ArrowLeft' || event.key === 'ArrowRight') && isTriggeredFromPopover) {\n event.preventDefault(); // prevents scrolling horizontally in the table on arrow left/right.\n event.stopPropagation();\n\n shouldFocusNextRef.current = event.key === 'ArrowLeft' ? -1 : +1;\n setOpen(false);\n }\n }\n };\n\n const handleListboxKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n if (isAriaDirectionKey(event)) {\n setShouldPauseHoverState(true);\n return;\n }\n\n if (event.key === 'Tab') {\n shouldFocusNextRef.current = event.shiftKey ? -1 : +1;\n setOpen(false);\n return;\n }\n\n // Handle Escape key to close the select without closing the parent dialog\n if (!hasSearch && event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n return;\n }\n\n // support typeahead to set the value by typing its text\n if (!hasSearch && /^[a-z0-9]$/i.test(event.key)) {\n setValueIfMatched(event.key);\n return;\n }\n };\n\n const handleOpenChange = (open: boolean, details: { reason: string; event: Event }) => {\n if (!open && (details.reason === 'outside-press' || details.reason === 'focus-out')) {\n otherProps.onBlur?.(details.event as unknown as React.FocusEvent<HTMLButtonElement>);\n }\n setOpen(open);\n };\n\n const handleFinalFocus = (closeType: 'mouse' | 'touch' | 'keyboard' | 'pen' | '') => {\n if (shouldFocusNextRef.current !== undefined) {\n const el = getNextFocussableElement(internalRef.current, shouldFocusNextRef.current);\n shouldFocusNextRef.current = undefined;\n return el || false;\n }\n if (closeType === 'mouse' || closeType === 'touch') {\n // Don't steal focus — the clicked element receives it naturally.\n return false;\n }\n return true;\n };\n const areAllSelected = Array.isArray(value) && selectOptions.every(option => value.includes(option as string));\n\n const selectAllText = React.useMemo(() => {\n if (searchQuery === '') {\n if (areAllSelected) {\n return texts.select2.deselectAll;\n }\n return texts.select2.selectAll;\n }\n\n if (areAllSelected) {\n return texts.select2.deselectAllResults;\n }\n\n return texts.select2.selectAllResults;\n }, [areAllSelected, searchQuery]);\n\n const selectAll = () => {\n if (!Array.isArray(value) || value.length === 0) {\n setValue(selectOptions);\n } else {\n // array of all available options which are not selected\n const preselectedValues = selectOptions.filter(option => !value.includes(option));\n setValue([...value, ...preselectedValues]);\n }\n };\n\n const deselectAll = () => {\n if (searchQuery === '') {\n setValue([]);\n } else {\n const nextValue = Array.isArray(value) && value.filter(subValue => !selectOptions.includes(subValue as string));\n setValue(nextValue);\n }\n };\n\n const className = cn(\n 'border-gray-300 rounded border bg-white py-1.5 shadow-md ',\n {\n 'focus-within:yt-focus': !hasSearch,\n 'outline-none': hasSearch,\n },\n createCollectionClassName()\n );\n\n return (\n <Select2Context.Provider value={context}>\n <PopoverPrimitive.Root open={open} onOpenChange={handleOpenChange}>\n <PopoverPrimitive.Trigger\n render={\n <Trigger\n {...otherProps}\n aria-haspopup=\"listbox\"\n aria-multiselectable={multiple}\n data-taco=\"Select2\"\n emptyValue={emptyValue}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n ref={internalRef}>\n {flattenedChildren}\n </Trigger>\n }\n />\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Positioner\n align=\"start\"\n sideOffset={4}\n collisionAvoidance={{\n side: 'flip',\n fallbackAxisSide: 'none',\n }}>\n <PopoverPrimitive.Popup\n className={className}\n style={{ minWidth: dimensions?.width ? `${dimensions.width}px` : undefined }}\n initialFocus={hasSearch ? searchRef : true}\n finalFocus={handleFinalFocus}\n onKeyDown={handleHorizontalNavigation}\n tabIndex={-1}>\n {hasSearch ? (\n <>\n <Search\n placeholder={hasInlineCreation ? texts.select2.searchOrCreate : texts.select2.search}\n ref={searchRef}\n />\n {multiple && selectOptions.length > 1 && (\n <>\n <Button\n className=\"!justify-start\"\n appearance=\"discrete\"\n onClick={areAllSelected ? deselectAll : selectAll}>\n {selectAllText}\n </Button>\n <div className=\"mx-3 rounded border-t border-gray-300\" />\n </>\n )}\n </>\n ) : null}\n {loading ? (\n <span className={cn('flex items-center italic text-gray-700', fontSize && getFontSize(fontSize))}>\n <span>\n <Spinner\n delay={0}\n className={cn('ml-3 mr-2 mt-1.5 h-5 w-5', {\n '!mt-1 !h-3.5 !w-3.5': fontSize === FontSizes.small,\n '!h-4 !w-4': fontSize === FontSizes.medium,\n '!h-5 !w-5': fontSize === FontSizes.large,\n })}\n />\n </span>\n <span>{texts.listbox.loading}</span>\n </span>\n ) : flattenedChildren.length <= 0 ? (\n <div className=\"-mt-0.5 flex h-8 items-center px-2 text-gray-700\" role=\"presentation\">\n {texts.listbox.empty}\n </div>\n ) : (\n <ListboxPrimitive.Root\n className=\"flex flex-col gap-0.5 focus-visible:outline-none\"\n customSelector=\":scope > button\"\n disabled={disabled}\n multiple={multiple}\n onKeyDown={handleListboxKeyDown}\n readOnly={readOnly}\n ref={listboxRef}\n setValue={setValue}\n value={value}>\n <Collection>{visibleChildren}</Collection>\n {onCreate ? <Create onCreate={onCreate} options={flattenedChildren} /> : null}\n </ListboxPrimitive.Root>\n )}\n </PopoverPrimitive.Popup>\n </PopoverPrimitive.Positioner>\n </PopoverPrimitive.Portal>\n <ControlledHiddenField\n emptyValue={emptyValue}\n multiple={multiple || tags}\n name={name}\n options={flattenedChildren.map(child => child.props.value)}\n parentRef={internalRef}\n setValue={setValue}\n value={value}\n />\n </PopoverPrimitive.Root>\n </Select2Context.Provider>\n );\n}) as Select2PropsWithStatics;\nSelect2.Option = Option;\nSelect2.Group = Group;\nSelect2.Title = Title;\n\ntype ControlledHiddenFieldProps = {\n emptyValue: ListboxPrimitive.Listbox2OptionValue | undefined;\n multiple: boolean;\n name: string | undefined;\n options: Array<any>;\n parentRef: React.RefObject<HTMLButtonElement>;\n setValue: (nextValue: any) => void;\n value: Select2Value | undefined;\n};\n\nconst ControlledHiddenField = (props: ControlledHiddenFieldProps) => {\n const { emptyValue, multiple, name, options, parentRef, value, setValue } = props;\n const isFormControl = useIsFormControl(parentRef, () => setValue(multiple ? [] : undefined));\n\n let bubbleValue;\n\n if (isFormControl) {\n if (value !== undefined) {\n if (multiple) {\n bubbleValue = Array.isArray(value) ? value.map(String) : [value === null ? '' : String(value)];\n } else {\n bubbleValue = value === null ? '' : String(value);\n }\n }\n\n return (\n <BubbleSelect aria-hidden key={String(bubbleValue)} multiple={multiple} name={name} tabIndex={-1} value={bubbleValue}>\n {emptyValue === undefined ? null : <option value={emptyValue as string} />}\n {options.map(option => (\n <option key={String(option)} value={String(option)} />\n ))}\n </BubbleSelect>\n );\n }\n\n return null;\n};\nSelect2.displayName = 'Select2';\n\nexport { Select2 };\n\nexport type {\n Select2Texts,\n Select2GroupProps,\n Select2OptionProps,\n Select2OptionValue,\n Select2Value,\n Select2Props,\n Select2TitleProps,\n Select2Children,\n};\n"],"names":["Select2","Option","useMergedRef","useLocalization","useBoundingClientRectListener","useControlled","ListboxPrimitive.createListboxValueSetter","useIsHoverStatePaused","useChildren","isGroup","debounce","filterOption","isElementInsideTable3OrReport","isAriaDirectionKey","createCustomKeyboardEvent","open","getNextFocussableElement","createCollectionClassName","Select2Context","PopoverPrimitive","Trigger","Search","Button","getFontSize","Spinner","FontSizes","ListboxPrimitive.Root","Collection","Create","Group","Title","useIsFormControl","BubbleSelect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Select2.cjs","sources":["../../../src/components/Select2/Select2.tsx"],"sourcesContent":["import React from 'react';\nimport cn from 'clsx';\nimport { Popover as PopoverPrimitive } from '@base-ui/react/popover';\nimport * as ListboxPrimitive from '../../primitives/Listbox2/Listbox2';\nimport {\n Select2Children,\n Select2CreateHandler,\n Select2CreateDialogRenderer,\n Select2DeleteHandler,\n Select2EditHandler,\n Select2OptionValue,\n Select2Value,\n} from './types';\nimport { Option, Select2OptionProps } from './components/Option';\nimport { Group, Select2GroupProps } from './components/Group';\nimport { Select2TitleProps, Title } from './components/Title';\nimport { Select2Context } from './components/Context';\nimport { createCollectionClassName, filterOption, getFontSize } from './utilities';\nimport { useMergedRef } from '../../hooks/useMergedRef';\nimport { useBoundingClientRectListener } from '../../hooks/useBoundingClientRectListener';\nimport { createCustomKeyboardEvent } from '../../utils/input';\nimport { Trigger } from './components/Trigger';\nimport { useIsFormControl } from '../../hooks/useIsFormControl';\nimport { BubbleSelect } from '../../primitives/BubbleSelect';\nimport { Search } from './components/Search';\nimport { isGroup, useChildren } from './hooks/useChildren';\n\nimport { Create } from './components/Create';\nimport { Collection } from './components/Collection';\nimport { CollectionRef } from '../../primitives/Collection/Collection';\nimport { useLocalization } from '../Provider/Localization';\nimport { useIsHoverStatePaused } from '../../hooks/useIsHoverStatePaused';\nimport { isAriaDirectionKey } from '../../utils/aria';\nimport { getNextFocussableElement, isElementInsideTable3OrReport } from '../../utils/dom';\nimport { FontSize, FontSizes } from '../../types';\nimport { Button } from '../Button/Button';\nimport { Spinner } from '../Spinner/Spinner';\nimport { debounce } from '../../utils/debounce';\nimport { useControlled } from '../../hooks/useControlled';\n\ntype Select2Texts = {\n allSelect: string;\n allDeselect: string;\n cancel: string;\n chooseColor: string;\n create: string;\n delete: string;\n save: string;\n search: string;\n searchOrCreate: string;\n selectAll: string;\n selectAllResults: string;\n deselectAll: string;\n deselectAllResults: string;\n};\n\ntype Select2Props = Omit<React.HTMLAttributes<HTMLButtonElement>, 'children' | 'defaultValue' | 'onChange' | 'value'> & {\n /** Autofocus Select2 when loaded **/\n autoFocus?: boolean;\n /** Array of options in Select2 */\n children: Select2Children;\n /** Initial value of the input in Select2 */\n defaultValue?: Select2Value;\n /** Set what value should have an empty option in Select2 */\n emptyValue?: Select2OptionValue;\n /** Whether the Select2 is in a disabled state **/\n disabled?: boolean;\n /** Font size of text in Select2 **/\n fontSize?: FontSize;\n /** Draws attention to the Select2 by changing its style and making it visually prominent */\n highlighted?: boolean;\n /** Whether the Select2 is in an invalid state **/\n invalid?: boolean;\n /** Whether the Select2 is loading the data **/\n loading?: boolean;\n /** Whether the Select2 allows selecting multiple values **/\n multiple?: boolean;\n /** Whether the Select2 is in an invalid state **/\n name?: string;\n /** Handler called when user chooses an option from the provided options **/\n onChange?: (value: Select2Value) => void;\n /** Handler called when user creates a new option **/\n onCreate?: Select2CreateHandler;\n /** Handler called when user deletes an option **/\n onDelete?: Select2DeleteHandler;\n /** Handler called when user edits an option **/\n onEdit?: Select2EditHandler;\n /** Placeholder showed when nothing is selected **/\n placeholder?: string;\n /** Whether the Select2 is in a readonly state **/\n readOnly?: boolean;\n required?: boolean;\n /** Renders select options as tags **/\n tags?: boolean;\n /** Value of the input in select2 */\n value?: Select2Value;\n /** Create dialog component, if specified, then create button will become always visible in the bottom of options dropdown,\n * when clicked, it will open create dialog and wait for 'onCreate' handler to be triggered from the dialog */\n createDialog?: Select2CreateDialogRenderer;\n /** Create button text */\n createTriggerText?: string;\n};\ntype Select2PropsWithStatics = React.ForwardRefExoticComponent<Select2Props & React.RefAttributes<HTMLButtonElement>> & {\n Option: React.ForwardRefExoticComponent<Select2OptionProps>;\n Group: React.ForwardRefExoticComponent<Select2GroupProps>;\n Title: React.ForwardRefExoticComponent<Select2TitleProps>;\n};\n\nconst Select2 = React.forwardRef<HTMLButtonElement, Select2Props>(function Select2(props, ref) {\n const {\n children: initChildren,\n defaultValue,\n disabled = false,\n emptyValue = undefined,\n fontSize,\n highlighted = false,\n invalid = false,\n loading,\n multiple = false,\n name,\n onChange,\n onCreate,\n onDelete,\n onEdit,\n placeholder,\n readOnly = false,\n tags = false,\n value: prop,\n createDialog,\n createTriggerText,\n ...otherProps\n } = props;\n\n const emptyOption: React.ReactElement<Select2OptionProps> | undefined = React.useMemo(() => {\n if (emptyValue !== undefined && !multiple) {\n // Empty option has 0px height, because it's empty, so need to apply height manually\n return <Option key=\"__empty\" children=\"\" value={emptyValue} className=\"h-8\" />;\n }\n return;\n }, [emptyValue, multiple]);\n\n const initialChildren = React.useMemo(() => {\n if (emptyOption) {\n return [emptyOption, ...initChildren] as Select2Children;\n }\n return initChildren;\n }, [emptyOption, initChildren]);\n\n // refs\n const internalRef = useMergedRef<HTMLButtonElement>(ref);\n const listboxRef = React.useRef<CollectionRef>(null);\n const searchRef = React.useRef<HTMLInputElement>(null);\n const { texts } = useLocalization();\n // align the listbox min width with the width of the input - it should never be smaller\n const dimensions = useBoundingClientRectListener(internalRef);\n\n // state\n const [open, setOpen] = React.useState(false);\n const [value, _setValue] = useControlled<Select2Value>({\n // uncontrolled\n defaultValue,\n // controlled\n onChange,\n value: prop,\n });\n const setValue = ListboxPrimitive.createListboxValueSetter(\n multiple,\n _setValue as React.Dispatch<React.SetStateAction<Select2Value | undefined>>\n );\n const [validationError, setValidationError] = React.useState<Error | undefined>();\n const [shouldPauseHoverState, setShouldPauseHoverState] = useIsHoverStatePaused();\n\n const { flattenedChildren, filteredChildren, searchQuery, setSearchQuery } = useChildren({\n children: initialChildren,\n emptyValue,\n multiple,\n open,\n setValue,\n value,\n });\n\n // context\n const context = {\n disabled,\n highlighted,\n invalid,\n listboxRef,\n multiple,\n onCreate,\n onDelete,\n onEdit,\n open,\n readOnly,\n ref: internalRef,\n searchQuery,\n searchRef,\n setOpen,\n setSearchQuery,\n setValidationError,\n setValue,\n shouldPauseHoverState,\n setShouldPauseHoverState,\n tags,\n fontSize,\n validationError,\n value,\n createDialog,\n createTriggerText,\n };\n\n const hasInlineCreation = onCreate && !createDialog;\n const hasSearch = flattenedChildren.length > 5 || hasInlineCreation;\n const visibleChildren = searchQuery === '' ? initialChildren : filteredChildren;\n const selectOptions =\n searchQuery === ''\n ? flattenedChildren.map(child => child.props.value)\n : filteredChildren.flatMap(child =>\n isGroup(child)\n ? Array.isArray(child.props.children) && child.props.children.map(subChild => subChild.props.value)\n : child.props.value\n ) || [];\n\n // support typeahead functionality when search isn't available\n const queryTimeoutRef = React.useRef('');\n\n const typeahead = debounce(function () {\n if (!queryTimeoutRef.current) {\n return;\n }\n\n const matchedValueIndex = visibleChildren.findIndex(child =>\n filterOption(child as React.ReactElement<Select2OptionProps>, queryTimeoutRef.current)\n );\n\n if (matchedValueIndex > -1 && selectOptions[matchedValueIndex] !== undefined) {\n setValue(selectOptions[matchedValueIndex]);\n }\n\n queryTimeoutRef.current = '';\n }, 200);\n\n const setValueIfMatched = (query: string) => {\n queryTimeoutRef.current = queryTimeoutRef.current + query;\n typeahead();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n if (open) {\n event.preventDefault();\n } else if (isElementInsideTable3OrReport(event.currentTarget) && isAriaDirectionKey(event)) {\n return;\n } else if (!event.ctrlKey && !event.metaKey && (event.key === 'ArrowDown' || /^[a-z0-9]$/i.test(event.key))) {\n setOpen(true);\n\n if (!hasSearch) {\n setValueIfMatched(event.key);\n }\n }\n\n // Collect the first character when opening with keyboard (when user starts typing while focused on a trigger)\n if (hasSearch && /^[a-z0-9]$/i.test(event.key)) {\n setSearchQuery(prev => prev + event.key);\n }\n\n // the focus should always remain on the input, so we forward events on to the listbox\n listboxRef.current?.dispatchEvent(createCustomKeyboardEvent(event as React.KeyboardEvent<HTMLInputElement>));\n };\n\n const shouldFocusNextRef = React.useRef<number | undefined>(undefined);\n\n const handleHorizontalNavigation = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isElementInsideTable3OrReport(internalRef.current)) {\n const isTriggeredFromPopover = event.currentTarget.contains?.(event.target as Node);\n\n if ((event.key === 'ArrowLeft' || event.key === 'ArrowRight') && isTriggeredFromPopover) {\n event.preventDefault(); // prevents scrolling horizontally in the table on arrow left/right.\n event.stopPropagation();\n\n shouldFocusNextRef.current = event.key === 'ArrowLeft' ? -1 : +1;\n setOpen(false);\n }\n }\n };\n\n const handleListboxKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n if (isAriaDirectionKey(event)) {\n setShouldPauseHoverState(true);\n return;\n }\n\n if (event.key === 'Tab') {\n shouldFocusNextRef.current = event.shiftKey ? -1 : +1;\n setOpen(false);\n return;\n }\n\n // Handle Escape key to close the select without closing the parent dialog\n if (!hasSearch && event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n return;\n }\n\n // support typeahead to set the value by typing its text\n if (!hasSearch && /^[a-z0-9]$/i.test(event.key)) {\n setValueIfMatched(event.key);\n return;\n }\n };\n\n const handleOpenChange = (open: boolean, details: { reason: string; event: Event }) => {\n if (!open && (details.reason === 'outside-press' || details.reason === 'focus-out')) {\n otherProps.onBlur?.(details.event as unknown as React.FocusEvent<HTMLButtonElement>);\n }\n setOpen(open);\n };\n\n const handleFinalFocus = (closeType: 'mouse' | 'touch' | 'keyboard' | 'pen' | '') => {\n if (shouldFocusNextRef.current !== undefined) {\n const el = getNextFocussableElement(internalRef.current, shouldFocusNextRef.current);\n shouldFocusNextRef.current = undefined;\n return el || false;\n }\n if (closeType === 'mouse' || closeType === 'touch') {\n // Don't steal focus — the clicked element receives it naturally.\n return false;\n }\n return true;\n };\n const areAllSelected = Array.isArray(value) && selectOptions.every(option => value.includes(option as string));\n\n const selectAllText = React.useMemo(() => {\n if (searchQuery === '') {\n if (areAllSelected) {\n return texts.select2.deselectAll;\n }\n return texts.select2.selectAll;\n }\n\n if (areAllSelected) {\n return texts.select2.deselectAllResults;\n }\n\n return texts.select2.selectAllResults;\n }, [areAllSelected, searchQuery]);\n\n const selectAll = () => {\n if (!Array.isArray(value) || value.length === 0) {\n setValue(selectOptions);\n } else {\n // array of all available options which are not selected\n const preselectedValues = selectOptions.filter(option => !value.includes(option));\n setValue([...value, ...preselectedValues]);\n }\n };\n\n const deselectAll = () => {\n if (searchQuery === '') {\n setValue([]);\n } else {\n const nextValue = Array.isArray(value) && value.filter(subValue => !selectOptions.includes(subValue as string));\n setValue(nextValue);\n }\n };\n\n const className = cn(\n 'border-gray-300 rounded border bg-white py-1.5 shadow-md ',\n {\n 'focus-within:yt-focus': !hasSearch,\n 'outline-none': hasSearch,\n },\n createCollectionClassName()\n );\n\n return (\n <Select2Context.Provider value={context}>\n <PopoverPrimitive.Root open={open} onOpenChange={handleOpenChange}>\n <PopoverPrimitive.Trigger\n render={\n <Trigger\n {...otherProps}\n aria-haspopup=\"listbox\"\n aria-multiselectable={multiple}\n data-taco=\"Select2\"\n emptyValue={emptyValue}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n ref={internalRef}>\n {flattenedChildren}\n </Trigger>\n }\n />\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Positioner\n align=\"start\"\n sideOffset={4}\n collisionAvoidance={{\n side: 'flip',\n fallbackAxisSide: 'none',\n }}>\n <PopoverPrimitive.Popup\n className={className}\n style={{ minWidth: dimensions?.width ? `${dimensions.width}px` : undefined }}\n initialFocus={hasSearch ? searchRef : true}\n finalFocus={handleFinalFocus}\n onKeyDown={handleHorizontalNavigation}\n tabIndex={-1}>\n {hasSearch ? (\n <>\n <Search\n placeholder={hasInlineCreation ? texts.select2.searchOrCreate : texts.select2.search}\n ref={searchRef}\n />\n {multiple && selectOptions.length > 1 && (\n <>\n <Button\n className=\"!justify-start\"\n appearance=\"discrete\"\n onClick={areAllSelected ? deselectAll : selectAll}>\n {selectAllText}\n </Button>\n <div className=\"mx-3 rounded border-t border-gray-300\" />\n </>\n )}\n </>\n ) : null}\n {loading ? (\n <span className={cn('flex items-center italic text-gray-700', fontSize && getFontSize(fontSize))}>\n <span>\n <Spinner\n delay={0}\n className={cn('ml-3 mr-2 mt-1.5 h-5 w-5', {\n '!mt-1 !h-3.5 !w-3.5': fontSize === FontSizes.small,\n '!h-4 !w-4': fontSize === FontSizes.medium,\n '!h-5 !w-5': fontSize === FontSizes.large,\n })}\n />\n </span>\n <span>{texts.listbox.loading}</span>\n </span>\n ) : flattenedChildren.length <= 0 && !onCreate ? (\n <div className=\"-mt-0.5 flex h-8 items-center px-2 text-gray-700\" role=\"presentation\">\n {texts.listbox.empty}\n </div>\n ) : (\n <ListboxPrimitive.Root\n className=\"flex flex-col gap-0.5 focus-visible:outline-none\"\n customSelector=\":scope > button\"\n disabled={disabled}\n multiple={multiple}\n onKeyDown={handleListboxKeyDown}\n readOnly={readOnly}\n ref={listboxRef}\n setValue={setValue}\n value={value}>\n <Collection>{visibleChildren}</Collection>\n {onCreate ? <Create onCreate={onCreate} options={flattenedChildren} /> : null}\n </ListboxPrimitive.Root>\n )}\n </PopoverPrimitive.Popup>\n </PopoverPrimitive.Positioner>\n </PopoverPrimitive.Portal>\n <ControlledHiddenField\n emptyValue={emptyValue}\n multiple={multiple || tags}\n name={name}\n options={flattenedChildren.map(child => child.props.value)}\n parentRef={internalRef}\n setValue={setValue}\n value={value}\n />\n </PopoverPrimitive.Root>\n </Select2Context.Provider>\n );\n}) as Select2PropsWithStatics;\nSelect2.Option = Option;\nSelect2.Group = Group;\nSelect2.Title = Title;\n\ntype ControlledHiddenFieldProps = {\n emptyValue: ListboxPrimitive.Listbox2OptionValue | undefined;\n multiple: boolean;\n name: string | undefined;\n options: Array<any>;\n parentRef: React.RefObject<HTMLButtonElement>;\n setValue: (nextValue: any) => void;\n value: Select2Value | undefined;\n};\n\nconst ControlledHiddenField = (props: ControlledHiddenFieldProps) => {\n const { emptyValue, multiple, name, options, parentRef, value, setValue } = props;\n const isFormControl = useIsFormControl(parentRef, () => setValue(multiple ? [] : undefined));\n\n let bubbleValue;\n\n if (isFormControl) {\n if (value !== undefined) {\n if (multiple) {\n bubbleValue = Array.isArray(value) ? value.map(String) : [value === null ? '' : String(value)];\n } else {\n bubbleValue = value === null ? '' : String(value);\n }\n }\n\n return (\n <BubbleSelect aria-hidden key={String(bubbleValue)} multiple={multiple} name={name} tabIndex={-1} value={bubbleValue}>\n {emptyValue === undefined ? null : <option value={emptyValue as string} />}\n {options.map(option => (\n <option key={String(option)} value={String(option)} />\n ))}\n </BubbleSelect>\n );\n }\n\n return null;\n};\nSelect2.displayName = 'Select2';\n\nexport { Select2 };\n\nexport type {\n Select2Texts,\n Select2GroupProps,\n Select2OptionProps,\n Select2OptionValue,\n Select2Value,\n Select2Props,\n Select2TitleProps,\n Select2Children,\n};\n"],"names":["Select2","Option","useMergedRef","useLocalization","useBoundingClientRectListener","useControlled","ListboxPrimitive.createListboxValueSetter","useIsHoverStatePaused","useChildren","isGroup","debounce","filterOption","isElementInsideTable3OrReport","isAriaDirectionKey","createCustomKeyboardEvent","open","getNextFocussableElement","createCollectionClassName","Select2Context","PopoverPrimitive","Trigger","Search","Button","getFontSize","Spinner","FontSizes","ListboxPrimitive.Root","Collection","Create","Group","Title","useIsFormControl","BubbleSelect"],"mappings":"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"}
|
|
@@ -308,7 +308,7 @@ const Select2 = React__default.forwardRef(function Select22(props, ref) {
|
|
|
308
308
|
"!h-5 !w-5": fontSize === FontSizes.large
|
|
309
309
|
})
|
|
310
310
|
}
|
|
311
|
-
)), /* @__PURE__ */ React__default.createElement("span", null, texts.listbox.loading)) : flattenedChildren.length <= 0 ? /* @__PURE__ */ React__default.createElement("div", { className: "-mt-0.5 flex h-8 items-center px-2 text-gray-700", role: "presentation" }, texts.listbox.empty) : /* @__PURE__ */ React__default.createElement(
|
|
311
|
+
)), /* @__PURE__ */ React__default.createElement("span", null, texts.listbox.loading)) : flattenedChildren.length <= 0 && !onCreate ? /* @__PURE__ */ React__default.createElement("div", { className: "-mt-0.5 flex h-8 items-center px-2 text-gray-700", role: "presentation" }, texts.listbox.empty) : /* @__PURE__ */ React__default.createElement(
|
|
312
312
|
Root,
|
|
313
313
|
{
|
|
314
314
|
className: "flex flex-col gap-0.5 focus-visible:outline-none",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select2.js","sources":["../../../src/components/Select2/Select2.tsx"],"sourcesContent":["import React from 'react';\nimport cn from 'clsx';\nimport { Popover as PopoverPrimitive } from '@base-ui/react/popover';\nimport * as ListboxPrimitive from '../../primitives/Listbox2/Listbox2';\nimport {\n Select2Children,\n Select2CreateHandler,\n Select2CreateDialogRenderer,\n Select2DeleteHandler,\n Select2EditHandler,\n Select2OptionValue,\n Select2Value,\n} from './types';\nimport { Option, Select2OptionProps } from './components/Option';\nimport { Group, Select2GroupProps } from './components/Group';\nimport { Select2TitleProps, Title } from './components/Title';\nimport { Select2Context } from './components/Context';\nimport { createCollectionClassName, filterOption, getFontSize } from './utilities';\nimport { useMergedRef } from '../../hooks/useMergedRef';\nimport { useBoundingClientRectListener } from '../../hooks/useBoundingClientRectListener';\nimport { createCustomKeyboardEvent } from '../../utils/input';\nimport { Trigger } from './components/Trigger';\nimport { useIsFormControl } from '../../hooks/useIsFormControl';\nimport { BubbleSelect } from '../../primitives/BubbleSelect';\nimport { Search } from './components/Search';\nimport { isGroup, useChildren } from './hooks/useChildren';\n\nimport { Create } from './components/Create';\nimport { Collection } from './components/Collection';\nimport { CollectionRef } from '../../primitives/Collection/Collection';\nimport { useLocalization } from '../Provider/Localization';\nimport { useIsHoverStatePaused } from '../../hooks/useIsHoverStatePaused';\nimport { isAriaDirectionKey } from '../../utils/aria';\nimport { getNextFocussableElement, isElementInsideTable3OrReport } from '../../utils/dom';\nimport { FontSize, FontSizes } from '../../types';\nimport { Button } from '../Button/Button';\nimport { Spinner } from '../Spinner/Spinner';\nimport { debounce } from '../../utils/debounce';\nimport { useControlled } from '../../hooks/useControlled';\n\ntype Select2Texts = {\n allSelect: string;\n allDeselect: string;\n cancel: string;\n chooseColor: string;\n create: string;\n delete: string;\n save: string;\n search: string;\n searchOrCreate: string;\n selectAll: string;\n selectAllResults: string;\n deselectAll: string;\n deselectAllResults: string;\n};\n\ntype Select2Props = Omit<React.HTMLAttributes<HTMLButtonElement>, 'children' | 'defaultValue' | 'onChange' | 'value'> & {\n /** Autofocus Select2 when loaded **/\n autoFocus?: boolean;\n /** Array of options in Select2 */\n children: Select2Children;\n /** Initial value of the input in Select2 */\n defaultValue?: Select2Value;\n /** Set what value should have an empty option in Select2 */\n emptyValue?: Select2OptionValue;\n /** Whether the Select2 is in a disabled state **/\n disabled?: boolean;\n /** Font size of text in Select2 **/\n fontSize?: FontSize;\n /** Draws attention to the Select2 by changing its style and making it visually prominent */\n highlighted?: boolean;\n /** Whether the Select2 is in an invalid state **/\n invalid?: boolean;\n /** Whether the Select2 is loading the data **/\n loading?: boolean;\n /** Whether the Select2 allows selecting multiple values **/\n multiple?: boolean;\n /** Whether the Select2 is in an invalid state **/\n name?: string;\n /** Handler called when user chooses an option from the provided options **/\n onChange?: (value: Select2Value) => void;\n /** Handler called when user creates a new option **/\n onCreate?: Select2CreateHandler;\n /** Handler called when user deletes an option **/\n onDelete?: Select2DeleteHandler;\n /** Handler called when user edits an option **/\n onEdit?: Select2EditHandler;\n /** Placeholder showed when nothing is selected **/\n placeholder?: string;\n /** Whether the Select2 is in a readonly state **/\n readOnly?: boolean;\n required?: boolean;\n /** Renders select options as tags **/\n tags?: boolean;\n /** Value of the input in select2 */\n value?: Select2Value;\n /** Create dialog component, if specified, then create button will become always visible in the bottom of options dropdown,\n * when clicked, it will open create dialog and wait for 'onCreate' handler to be triggered from the dialog */\n createDialog?: Select2CreateDialogRenderer;\n /** Create button text */\n createTriggerText?: string;\n};\ntype Select2PropsWithStatics = React.ForwardRefExoticComponent<Select2Props & React.RefAttributes<HTMLButtonElement>> & {\n Option: React.ForwardRefExoticComponent<Select2OptionProps>;\n Group: React.ForwardRefExoticComponent<Select2GroupProps>;\n Title: React.ForwardRefExoticComponent<Select2TitleProps>;\n};\n\nconst Select2 = React.forwardRef<HTMLButtonElement, Select2Props>(function Select2(props, ref) {\n const {\n children: initChildren,\n defaultValue,\n disabled = false,\n emptyValue = undefined,\n fontSize,\n highlighted = false,\n invalid = false,\n loading,\n multiple = false,\n name,\n onChange,\n onCreate,\n onDelete,\n onEdit,\n placeholder,\n readOnly = false,\n tags = false,\n value: prop,\n createDialog,\n createTriggerText,\n ...otherProps\n } = props;\n\n const emptyOption: React.ReactElement<Select2OptionProps> | undefined = React.useMemo(() => {\n if (emptyValue !== undefined && !multiple) {\n // Empty option has 0px height, because it's empty, so need to apply height manually\n return <Option key=\"__empty\" children=\"\" value={emptyValue} className=\"h-8\" />;\n }\n return;\n }, [emptyValue, multiple]);\n\n const initialChildren = React.useMemo(() => {\n if (emptyOption) {\n return [emptyOption, ...initChildren] as Select2Children;\n }\n return initChildren;\n }, [emptyOption, initChildren]);\n\n // refs\n const internalRef = useMergedRef<HTMLButtonElement>(ref);\n const listboxRef = React.useRef<CollectionRef>(null);\n const searchRef = React.useRef<HTMLInputElement>(null);\n const { texts } = useLocalization();\n // align the listbox min width with the width of the input - it should never be smaller\n const dimensions = useBoundingClientRectListener(internalRef);\n\n // state\n const [open, setOpen] = React.useState(false);\n const [value, _setValue] = useControlled<Select2Value>({\n // uncontrolled\n defaultValue,\n // controlled\n onChange,\n value: prop,\n });\n const setValue = ListboxPrimitive.createListboxValueSetter(\n multiple,\n _setValue as React.Dispatch<React.SetStateAction<Select2Value | undefined>>\n );\n const [validationError, setValidationError] = React.useState<Error | undefined>();\n const [shouldPauseHoverState, setShouldPauseHoverState] = useIsHoverStatePaused();\n\n const { flattenedChildren, filteredChildren, searchQuery, setSearchQuery } = useChildren({\n children: initialChildren,\n emptyValue,\n multiple,\n open,\n setValue,\n value,\n });\n\n // context\n const context = {\n disabled,\n highlighted,\n invalid,\n listboxRef,\n multiple,\n onCreate,\n onDelete,\n onEdit,\n open,\n readOnly,\n ref: internalRef,\n searchQuery,\n searchRef,\n setOpen,\n setSearchQuery,\n setValidationError,\n setValue,\n shouldPauseHoverState,\n setShouldPauseHoverState,\n tags,\n fontSize,\n validationError,\n value,\n createDialog,\n createTriggerText,\n };\n\n const hasInlineCreation = onCreate && !createDialog;\n const hasSearch = flattenedChildren.length > 5 || hasInlineCreation;\n const visibleChildren = searchQuery === '' ? initialChildren : filteredChildren;\n const selectOptions =\n searchQuery === ''\n ? flattenedChildren.map(child => child.props.value)\n : filteredChildren.flatMap(child =>\n isGroup(child)\n ? Array.isArray(child.props.children) && child.props.children.map(subChild => subChild.props.value)\n : child.props.value\n ) || [];\n\n // support typeahead functionality when search isn't available\n const queryTimeoutRef = React.useRef('');\n\n const typeahead = debounce(function () {\n if (!queryTimeoutRef.current) {\n return;\n }\n\n const matchedValueIndex = visibleChildren.findIndex(child =>\n filterOption(child as React.ReactElement<Select2OptionProps>, queryTimeoutRef.current)\n );\n\n if (matchedValueIndex > -1 && selectOptions[matchedValueIndex] !== undefined) {\n setValue(selectOptions[matchedValueIndex]);\n }\n\n queryTimeoutRef.current = '';\n }, 200);\n\n const setValueIfMatched = (query: string) => {\n queryTimeoutRef.current = queryTimeoutRef.current + query;\n typeahead();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n if (open) {\n event.preventDefault();\n } else if (isElementInsideTable3OrReport(event.currentTarget) && isAriaDirectionKey(event)) {\n return;\n } else if (!event.ctrlKey && !event.metaKey && (event.key === 'ArrowDown' || /^[a-z0-9]$/i.test(event.key))) {\n setOpen(true);\n\n if (!hasSearch) {\n setValueIfMatched(event.key);\n }\n }\n\n // Collect the first character when opening with keyboard (when user starts typing while focused on a trigger)\n if (hasSearch && /^[a-z0-9]$/i.test(event.key)) {\n setSearchQuery(prev => prev + event.key);\n }\n\n // the focus should always remain on the input, so we forward events on to the listbox\n listboxRef.current?.dispatchEvent(createCustomKeyboardEvent(event as React.KeyboardEvent<HTMLInputElement>));\n };\n\n const shouldFocusNextRef = React.useRef<number | undefined>(undefined);\n\n const handleHorizontalNavigation = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isElementInsideTable3OrReport(internalRef.current)) {\n const isTriggeredFromPopover = event.currentTarget.contains?.(event.target as Node);\n\n if ((event.key === 'ArrowLeft' || event.key === 'ArrowRight') && isTriggeredFromPopover) {\n event.preventDefault(); // prevents scrolling horizontally in the table on arrow left/right.\n event.stopPropagation();\n\n shouldFocusNextRef.current = event.key === 'ArrowLeft' ? -1 : +1;\n setOpen(false);\n }\n }\n };\n\n const handleListboxKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n if (isAriaDirectionKey(event)) {\n setShouldPauseHoverState(true);\n return;\n }\n\n if (event.key === 'Tab') {\n shouldFocusNextRef.current = event.shiftKey ? -1 : +1;\n setOpen(false);\n return;\n }\n\n // Handle Escape key to close the select without closing the parent dialog\n if (!hasSearch && event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n return;\n }\n\n // support typeahead to set the value by typing its text\n if (!hasSearch && /^[a-z0-9]$/i.test(event.key)) {\n setValueIfMatched(event.key);\n return;\n }\n };\n\n const handleOpenChange = (open: boolean, details: { reason: string; event: Event }) => {\n if (!open && (details.reason === 'outside-press' || details.reason === 'focus-out')) {\n otherProps.onBlur?.(details.event as unknown as React.FocusEvent<HTMLButtonElement>);\n }\n setOpen(open);\n };\n\n const handleFinalFocus = (closeType: 'mouse' | 'touch' | 'keyboard' | 'pen' | '') => {\n if (shouldFocusNextRef.current !== undefined) {\n const el = getNextFocussableElement(internalRef.current, shouldFocusNextRef.current);\n shouldFocusNextRef.current = undefined;\n return el || false;\n }\n if (closeType === 'mouse' || closeType === 'touch') {\n // Don't steal focus — the clicked element receives it naturally.\n return false;\n }\n return true;\n };\n const areAllSelected = Array.isArray(value) && selectOptions.every(option => value.includes(option as string));\n\n const selectAllText = React.useMemo(() => {\n if (searchQuery === '') {\n if (areAllSelected) {\n return texts.select2.deselectAll;\n }\n return texts.select2.selectAll;\n }\n\n if (areAllSelected) {\n return texts.select2.deselectAllResults;\n }\n\n return texts.select2.selectAllResults;\n }, [areAllSelected, searchQuery]);\n\n const selectAll = () => {\n if (!Array.isArray(value) || value.length === 0) {\n setValue(selectOptions);\n } else {\n // array of all available options which are not selected\n const preselectedValues = selectOptions.filter(option => !value.includes(option));\n setValue([...value, ...preselectedValues]);\n }\n };\n\n const deselectAll = () => {\n if (searchQuery === '') {\n setValue([]);\n } else {\n const nextValue = Array.isArray(value) && value.filter(subValue => !selectOptions.includes(subValue as string));\n setValue(nextValue);\n }\n };\n\n const className = cn(\n 'border-gray-300 rounded border bg-white py-1.5 shadow-md ',\n {\n 'focus-within:yt-focus': !hasSearch,\n 'outline-none': hasSearch,\n },\n createCollectionClassName()\n );\n\n return (\n <Select2Context.Provider value={context}>\n <PopoverPrimitive.Root open={open} onOpenChange={handleOpenChange}>\n <PopoverPrimitive.Trigger\n render={\n <Trigger\n {...otherProps}\n aria-haspopup=\"listbox\"\n aria-multiselectable={multiple}\n data-taco=\"Select2\"\n emptyValue={emptyValue}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n ref={internalRef}>\n {flattenedChildren}\n </Trigger>\n }\n />\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Positioner\n align=\"start\"\n sideOffset={4}\n collisionAvoidance={{\n side: 'flip',\n fallbackAxisSide: 'none',\n }}>\n <PopoverPrimitive.Popup\n className={className}\n style={{ minWidth: dimensions?.width ? `${dimensions.width}px` : undefined }}\n initialFocus={hasSearch ? searchRef : true}\n finalFocus={handleFinalFocus}\n onKeyDown={handleHorizontalNavigation}\n tabIndex={-1}>\n {hasSearch ? (\n <>\n <Search\n placeholder={hasInlineCreation ? texts.select2.searchOrCreate : texts.select2.search}\n ref={searchRef}\n />\n {multiple && selectOptions.length > 1 && (\n <>\n <Button\n className=\"!justify-start\"\n appearance=\"discrete\"\n onClick={areAllSelected ? deselectAll : selectAll}>\n {selectAllText}\n </Button>\n <div className=\"mx-3 rounded border-t border-gray-300\" />\n </>\n )}\n </>\n ) : null}\n {loading ? (\n <span className={cn('flex items-center italic text-gray-700', fontSize && getFontSize(fontSize))}>\n <span>\n <Spinner\n delay={0}\n className={cn('ml-3 mr-2 mt-1.5 h-5 w-5', {\n '!mt-1 !h-3.5 !w-3.5': fontSize === FontSizes.small,\n '!h-4 !w-4': fontSize === FontSizes.medium,\n '!h-5 !w-5': fontSize === FontSizes.large,\n })}\n />\n </span>\n <span>{texts.listbox.loading}</span>\n </span>\n ) : flattenedChildren.length <= 0 ? (\n <div className=\"-mt-0.5 flex h-8 items-center px-2 text-gray-700\" role=\"presentation\">\n {texts.listbox.empty}\n </div>\n ) : (\n <ListboxPrimitive.Root\n className=\"flex flex-col gap-0.5 focus-visible:outline-none\"\n customSelector=\":scope > button\"\n disabled={disabled}\n multiple={multiple}\n onKeyDown={handleListboxKeyDown}\n readOnly={readOnly}\n ref={listboxRef}\n setValue={setValue}\n value={value}>\n <Collection>{visibleChildren}</Collection>\n {onCreate ? <Create onCreate={onCreate} options={flattenedChildren} /> : null}\n </ListboxPrimitive.Root>\n )}\n </PopoverPrimitive.Popup>\n </PopoverPrimitive.Positioner>\n </PopoverPrimitive.Portal>\n <ControlledHiddenField\n emptyValue={emptyValue}\n multiple={multiple || tags}\n name={name}\n options={flattenedChildren.map(child => child.props.value)}\n parentRef={internalRef}\n setValue={setValue}\n value={value}\n />\n </PopoverPrimitive.Root>\n </Select2Context.Provider>\n );\n}) as Select2PropsWithStatics;\nSelect2.Option = Option;\nSelect2.Group = Group;\nSelect2.Title = Title;\n\ntype ControlledHiddenFieldProps = {\n emptyValue: ListboxPrimitive.Listbox2OptionValue | undefined;\n multiple: boolean;\n name: string | undefined;\n options: Array<any>;\n parentRef: React.RefObject<HTMLButtonElement>;\n setValue: (nextValue: any) => void;\n value: Select2Value | undefined;\n};\n\nconst ControlledHiddenField = (props: ControlledHiddenFieldProps) => {\n const { emptyValue, multiple, name, options, parentRef, value, setValue } = props;\n const isFormControl = useIsFormControl(parentRef, () => setValue(multiple ? [] : undefined));\n\n let bubbleValue;\n\n if (isFormControl) {\n if (value !== undefined) {\n if (multiple) {\n bubbleValue = Array.isArray(value) ? value.map(String) : [value === null ? '' : String(value)];\n } else {\n bubbleValue = value === null ? '' : String(value);\n }\n }\n\n return (\n <BubbleSelect aria-hidden key={String(bubbleValue)} multiple={multiple} name={name} tabIndex={-1} value={bubbleValue}>\n {emptyValue === undefined ? null : <option value={emptyValue as string} />}\n {options.map(option => (\n <option key={String(option)} value={String(option)} />\n ))}\n </BubbleSelect>\n );\n }\n\n return null;\n};\nSelect2.displayName = 'Select2';\n\nexport { Select2 };\n\nexport type {\n Select2Texts,\n Select2GroupProps,\n Select2OptionProps,\n Select2OptionValue,\n Select2Value,\n Select2Props,\n Select2TitleProps,\n Select2Children,\n};\n"],"names":["React","Select2","ListboxPrimitive.createListboxValueSetter","open","PopoverPrimitive","ListboxPrimitive.Root"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Select2.js","sources":["../../../src/components/Select2/Select2.tsx"],"sourcesContent":["import React from 'react';\nimport cn from 'clsx';\nimport { Popover as PopoverPrimitive } from '@base-ui/react/popover';\nimport * as ListboxPrimitive from '../../primitives/Listbox2/Listbox2';\nimport {\n Select2Children,\n Select2CreateHandler,\n Select2CreateDialogRenderer,\n Select2DeleteHandler,\n Select2EditHandler,\n Select2OptionValue,\n Select2Value,\n} from './types';\nimport { Option, Select2OptionProps } from './components/Option';\nimport { Group, Select2GroupProps } from './components/Group';\nimport { Select2TitleProps, Title } from './components/Title';\nimport { Select2Context } from './components/Context';\nimport { createCollectionClassName, filterOption, getFontSize } from './utilities';\nimport { useMergedRef } from '../../hooks/useMergedRef';\nimport { useBoundingClientRectListener } from '../../hooks/useBoundingClientRectListener';\nimport { createCustomKeyboardEvent } from '../../utils/input';\nimport { Trigger } from './components/Trigger';\nimport { useIsFormControl } from '../../hooks/useIsFormControl';\nimport { BubbleSelect } from '../../primitives/BubbleSelect';\nimport { Search } from './components/Search';\nimport { isGroup, useChildren } from './hooks/useChildren';\n\nimport { Create } from './components/Create';\nimport { Collection } from './components/Collection';\nimport { CollectionRef } from '../../primitives/Collection/Collection';\nimport { useLocalization } from '../Provider/Localization';\nimport { useIsHoverStatePaused } from '../../hooks/useIsHoverStatePaused';\nimport { isAriaDirectionKey } from '../../utils/aria';\nimport { getNextFocussableElement, isElementInsideTable3OrReport } from '../../utils/dom';\nimport { FontSize, FontSizes } from '../../types';\nimport { Button } from '../Button/Button';\nimport { Spinner } from '../Spinner/Spinner';\nimport { debounce } from '../../utils/debounce';\nimport { useControlled } from '../../hooks/useControlled';\n\ntype Select2Texts = {\n allSelect: string;\n allDeselect: string;\n cancel: string;\n chooseColor: string;\n create: string;\n delete: string;\n save: string;\n search: string;\n searchOrCreate: string;\n selectAll: string;\n selectAllResults: string;\n deselectAll: string;\n deselectAllResults: string;\n};\n\ntype Select2Props = Omit<React.HTMLAttributes<HTMLButtonElement>, 'children' | 'defaultValue' | 'onChange' | 'value'> & {\n /** Autofocus Select2 when loaded **/\n autoFocus?: boolean;\n /** Array of options in Select2 */\n children: Select2Children;\n /** Initial value of the input in Select2 */\n defaultValue?: Select2Value;\n /** Set what value should have an empty option in Select2 */\n emptyValue?: Select2OptionValue;\n /** Whether the Select2 is in a disabled state **/\n disabled?: boolean;\n /** Font size of text in Select2 **/\n fontSize?: FontSize;\n /** Draws attention to the Select2 by changing its style and making it visually prominent */\n highlighted?: boolean;\n /** Whether the Select2 is in an invalid state **/\n invalid?: boolean;\n /** Whether the Select2 is loading the data **/\n loading?: boolean;\n /** Whether the Select2 allows selecting multiple values **/\n multiple?: boolean;\n /** Whether the Select2 is in an invalid state **/\n name?: string;\n /** Handler called when user chooses an option from the provided options **/\n onChange?: (value: Select2Value) => void;\n /** Handler called when user creates a new option **/\n onCreate?: Select2CreateHandler;\n /** Handler called when user deletes an option **/\n onDelete?: Select2DeleteHandler;\n /** Handler called when user edits an option **/\n onEdit?: Select2EditHandler;\n /** Placeholder showed when nothing is selected **/\n placeholder?: string;\n /** Whether the Select2 is in a readonly state **/\n readOnly?: boolean;\n required?: boolean;\n /** Renders select options as tags **/\n tags?: boolean;\n /** Value of the input in select2 */\n value?: Select2Value;\n /** Create dialog component, if specified, then create button will become always visible in the bottom of options dropdown,\n * when clicked, it will open create dialog and wait for 'onCreate' handler to be triggered from the dialog */\n createDialog?: Select2CreateDialogRenderer;\n /** Create button text */\n createTriggerText?: string;\n};\ntype Select2PropsWithStatics = React.ForwardRefExoticComponent<Select2Props & React.RefAttributes<HTMLButtonElement>> & {\n Option: React.ForwardRefExoticComponent<Select2OptionProps>;\n Group: React.ForwardRefExoticComponent<Select2GroupProps>;\n Title: React.ForwardRefExoticComponent<Select2TitleProps>;\n};\n\nconst Select2 = React.forwardRef<HTMLButtonElement, Select2Props>(function Select2(props, ref) {\n const {\n children: initChildren,\n defaultValue,\n disabled = false,\n emptyValue = undefined,\n fontSize,\n highlighted = false,\n invalid = false,\n loading,\n multiple = false,\n name,\n onChange,\n onCreate,\n onDelete,\n onEdit,\n placeholder,\n readOnly = false,\n tags = false,\n value: prop,\n createDialog,\n createTriggerText,\n ...otherProps\n } = props;\n\n const emptyOption: React.ReactElement<Select2OptionProps> | undefined = React.useMemo(() => {\n if (emptyValue !== undefined && !multiple) {\n // Empty option has 0px height, because it's empty, so need to apply height manually\n return <Option key=\"__empty\" children=\"\" value={emptyValue} className=\"h-8\" />;\n }\n return;\n }, [emptyValue, multiple]);\n\n const initialChildren = React.useMemo(() => {\n if (emptyOption) {\n return [emptyOption, ...initChildren] as Select2Children;\n }\n return initChildren;\n }, [emptyOption, initChildren]);\n\n // refs\n const internalRef = useMergedRef<HTMLButtonElement>(ref);\n const listboxRef = React.useRef<CollectionRef>(null);\n const searchRef = React.useRef<HTMLInputElement>(null);\n const { texts } = useLocalization();\n // align the listbox min width with the width of the input - it should never be smaller\n const dimensions = useBoundingClientRectListener(internalRef);\n\n // state\n const [open, setOpen] = React.useState(false);\n const [value, _setValue] = useControlled<Select2Value>({\n // uncontrolled\n defaultValue,\n // controlled\n onChange,\n value: prop,\n });\n const setValue = ListboxPrimitive.createListboxValueSetter(\n multiple,\n _setValue as React.Dispatch<React.SetStateAction<Select2Value | undefined>>\n );\n const [validationError, setValidationError] = React.useState<Error | undefined>();\n const [shouldPauseHoverState, setShouldPauseHoverState] = useIsHoverStatePaused();\n\n const { flattenedChildren, filteredChildren, searchQuery, setSearchQuery } = useChildren({\n children: initialChildren,\n emptyValue,\n multiple,\n open,\n setValue,\n value,\n });\n\n // context\n const context = {\n disabled,\n highlighted,\n invalid,\n listboxRef,\n multiple,\n onCreate,\n onDelete,\n onEdit,\n open,\n readOnly,\n ref: internalRef,\n searchQuery,\n searchRef,\n setOpen,\n setSearchQuery,\n setValidationError,\n setValue,\n shouldPauseHoverState,\n setShouldPauseHoverState,\n tags,\n fontSize,\n validationError,\n value,\n createDialog,\n createTriggerText,\n };\n\n const hasInlineCreation = onCreate && !createDialog;\n const hasSearch = flattenedChildren.length > 5 || hasInlineCreation;\n const visibleChildren = searchQuery === '' ? initialChildren : filteredChildren;\n const selectOptions =\n searchQuery === ''\n ? flattenedChildren.map(child => child.props.value)\n : filteredChildren.flatMap(child =>\n isGroup(child)\n ? Array.isArray(child.props.children) && child.props.children.map(subChild => subChild.props.value)\n : child.props.value\n ) || [];\n\n // support typeahead functionality when search isn't available\n const queryTimeoutRef = React.useRef('');\n\n const typeahead = debounce(function () {\n if (!queryTimeoutRef.current) {\n return;\n }\n\n const matchedValueIndex = visibleChildren.findIndex(child =>\n filterOption(child as React.ReactElement<Select2OptionProps>, queryTimeoutRef.current)\n );\n\n if (matchedValueIndex > -1 && selectOptions[matchedValueIndex] !== undefined) {\n setValue(selectOptions[matchedValueIndex]);\n }\n\n queryTimeoutRef.current = '';\n }, 200);\n\n const setValueIfMatched = (query: string) => {\n queryTimeoutRef.current = queryTimeoutRef.current + query;\n typeahead();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n if (open) {\n event.preventDefault();\n } else if (isElementInsideTable3OrReport(event.currentTarget) && isAriaDirectionKey(event)) {\n return;\n } else if (!event.ctrlKey && !event.metaKey && (event.key === 'ArrowDown' || /^[a-z0-9]$/i.test(event.key))) {\n setOpen(true);\n\n if (!hasSearch) {\n setValueIfMatched(event.key);\n }\n }\n\n // Collect the first character when opening with keyboard (when user starts typing while focused on a trigger)\n if (hasSearch && /^[a-z0-9]$/i.test(event.key)) {\n setSearchQuery(prev => prev + event.key);\n }\n\n // the focus should always remain on the input, so we forward events on to the listbox\n listboxRef.current?.dispatchEvent(createCustomKeyboardEvent(event as React.KeyboardEvent<HTMLInputElement>));\n };\n\n const shouldFocusNextRef = React.useRef<number | undefined>(undefined);\n\n const handleHorizontalNavigation = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isElementInsideTable3OrReport(internalRef.current)) {\n const isTriggeredFromPopover = event.currentTarget.contains?.(event.target as Node);\n\n if ((event.key === 'ArrowLeft' || event.key === 'ArrowRight') && isTriggeredFromPopover) {\n event.preventDefault(); // prevents scrolling horizontally in the table on arrow left/right.\n event.stopPropagation();\n\n shouldFocusNextRef.current = event.key === 'ArrowLeft' ? -1 : +1;\n setOpen(false);\n }\n }\n };\n\n const handleListboxKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n if (isAriaDirectionKey(event)) {\n setShouldPauseHoverState(true);\n return;\n }\n\n if (event.key === 'Tab') {\n shouldFocusNextRef.current = event.shiftKey ? -1 : +1;\n setOpen(false);\n return;\n }\n\n // Handle Escape key to close the select without closing the parent dialog\n if (!hasSearch && event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n return;\n }\n\n // support typeahead to set the value by typing its text\n if (!hasSearch && /^[a-z0-9]$/i.test(event.key)) {\n setValueIfMatched(event.key);\n return;\n }\n };\n\n const handleOpenChange = (open: boolean, details: { reason: string; event: Event }) => {\n if (!open && (details.reason === 'outside-press' || details.reason === 'focus-out')) {\n otherProps.onBlur?.(details.event as unknown as React.FocusEvent<HTMLButtonElement>);\n }\n setOpen(open);\n };\n\n const handleFinalFocus = (closeType: 'mouse' | 'touch' | 'keyboard' | 'pen' | '') => {\n if (shouldFocusNextRef.current !== undefined) {\n const el = getNextFocussableElement(internalRef.current, shouldFocusNextRef.current);\n shouldFocusNextRef.current = undefined;\n return el || false;\n }\n if (closeType === 'mouse' || closeType === 'touch') {\n // Don't steal focus — the clicked element receives it naturally.\n return false;\n }\n return true;\n };\n const areAllSelected = Array.isArray(value) && selectOptions.every(option => value.includes(option as string));\n\n const selectAllText = React.useMemo(() => {\n if (searchQuery === '') {\n if (areAllSelected) {\n return texts.select2.deselectAll;\n }\n return texts.select2.selectAll;\n }\n\n if (areAllSelected) {\n return texts.select2.deselectAllResults;\n }\n\n return texts.select2.selectAllResults;\n }, [areAllSelected, searchQuery]);\n\n const selectAll = () => {\n if (!Array.isArray(value) || value.length === 0) {\n setValue(selectOptions);\n } else {\n // array of all available options which are not selected\n const preselectedValues = selectOptions.filter(option => !value.includes(option));\n setValue([...value, ...preselectedValues]);\n }\n };\n\n const deselectAll = () => {\n if (searchQuery === '') {\n setValue([]);\n } else {\n const nextValue = Array.isArray(value) && value.filter(subValue => !selectOptions.includes(subValue as string));\n setValue(nextValue);\n }\n };\n\n const className = cn(\n 'border-gray-300 rounded border bg-white py-1.5 shadow-md ',\n {\n 'focus-within:yt-focus': !hasSearch,\n 'outline-none': hasSearch,\n },\n createCollectionClassName()\n );\n\n return (\n <Select2Context.Provider value={context}>\n <PopoverPrimitive.Root open={open} onOpenChange={handleOpenChange}>\n <PopoverPrimitive.Trigger\n render={\n <Trigger\n {...otherProps}\n aria-haspopup=\"listbox\"\n aria-multiselectable={multiple}\n data-taco=\"Select2\"\n emptyValue={emptyValue}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n ref={internalRef}>\n {flattenedChildren}\n </Trigger>\n }\n />\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Positioner\n align=\"start\"\n sideOffset={4}\n collisionAvoidance={{\n side: 'flip',\n fallbackAxisSide: 'none',\n }}>\n <PopoverPrimitive.Popup\n className={className}\n style={{ minWidth: dimensions?.width ? `${dimensions.width}px` : undefined }}\n initialFocus={hasSearch ? searchRef : true}\n finalFocus={handleFinalFocus}\n onKeyDown={handleHorizontalNavigation}\n tabIndex={-1}>\n {hasSearch ? (\n <>\n <Search\n placeholder={hasInlineCreation ? texts.select2.searchOrCreate : texts.select2.search}\n ref={searchRef}\n />\n {multiple && selectOptions.length > 1 && (\n <>\n <Button\n className=\"!justify-start\"\n appearance=\"discrete\"\n onClick={areAllSelected ? deselectAll : selectAll}>\n {selectAllText}\n </Button>\n <div className=\"mx-3 rounded border-t border-gray-300\" />\n </>\n )}\n </>\n ) : null}\n {loading ? (\n <span className={cn('flex items-center italic text-gray-700', fontSize && getFontSize(fontSize))}>\n <span>\n <Spinner\n delay={0}\n className={cn('ml-3 mr-2 mt-1.5 h-5 w-5', {\n '!mt-1 !h-3.5 !w-3.5': fontSize === FontSizes.small,\n '!h-4 !w-4': fontSize === FontSizes.medium,\n '!h-5 !w-5': fontSize === FontSizes.large,\n })}\n />\n </span>\n <span>{texts.listbox.loading}</span>\n </span>\n ) : flattenedChildren.length <= 0 && !onCreate ? (\n <div className=\"-mt-0.5 flex h-8 items-center px-2 text-gray-700\" role=\"presentation\">\n {texts.listbox.empty}\n </div>\n ) : (\n <ListboxPrimitive.Root\n className=\"flex flex-col gap-0.5 focus-visible:outline-none\"\n customSelector=\":scope > button\"\n disabled={disabled}\n multiple={multiple}\n onKeyDown={handleListboxKeyDown}\n readOnly={readOnly}\n ref={listboxRef}\n setValue={setValue}\n value={value}>\n <Collection>{visibleChildren}</Collection>\n {onCreate ? <Create onCreate={onCreate} options={flattenedChildren} /> : null}\n </ListboxPrimitive.Root>\n )}\n </PopoverPrimitive.Popup>\n </PopoverPrimitive.Positioner>\n </PopoverPrimitive.Portal>\n <ControlledHiddenField\n emptyValue={emptyValue}\n multiple={multiple || tags}\n name={name}\n options={flattenedChildren.map(child => child.props.value)}\n parentRef={internalRef}\n setValue={setValue}\n value={value}\n />\n </PopoverPrimitive.Root>\n </Select2Context.Provider>\n );\n}) as Select2PropsWithStatics;\nSelect2.Option = Option;\nSelect2.Group = Group;\nSelect2.Title = Title;\n\ntype ControlledHiddenFieldProps = {\n emptyValue: ListboxPrimitive.Listbox2OptionValue | undefined;\n multiple: boolean;\n name: string | undefined;\n options: Array<any>;\n parentRef: React.RefObject<HTMLButtonElement>;\n setValue: (nextValue: any) => void;\n value: Select2Value | undefined;\n};\n\nconst ControlledHiddenField = (props: ControlledHiddenFieldProps) => {\n const { emptyValue, multiple, name, options, parentRef, value, setValue } = props;\n const isFormControl = useIsFormControl(parentRef, () => setValue(multiple ? [] : undefined));\n\n let bubbleValue;\n\n if (isFormControl) {\n if (value !== undefined) {\n if (multiple) {\n bubbleValue = Array.isArray(value) ? value.map(String) : [value === null ? '' : String(value)];\n } else {\n bubbleValue = value === null ? '' : String(value);\n }\n }\n\n return (\n <BubbleSelect aria-hidden key={String(bubbleValue)} multiple={multiple} name={name} tabIndex={-1} value={bubbleValue}>\n {emptyValue === undefined ? null : <option value={emptyValue as string} />}\n {options.map(option => (\n <option key={String(option)} value={String(option)} />\n ))}\n </BubbleSelect>\n );\n }\n\n return null;\n};\nSelect2.displayName = 'Select2';\n\nexport { Select2 };\n\nexport type {\n Select2Texts,\n Select2GroupProps,\n Select2OptionProps,\n Select2OptionValue,\n Select2Value,\n Select2Props,\n Select2TitleProps,\n Select2Children,\n};\n"],"names":["React","Select2","ListboxPrimitive.createListboxValueSetter","open","PopoverPrimitive","ListboxPrimitive.Root"],"mappings":"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"}
|
|
@@ -114,7 +114,7 @@ function useTableRenderer(renderers, table, tableRef, length, defaultRowActiveIn
|
|
|
114
114
|
return /* @__PURE__ */ React.createElement(SkeletonRow.SkeletonRow, { key: skeletonKey, index: virtualRow.index, table });
|
|
115
115
|
}
|
|
116
116
|
const measureRow = (rowHeight) => {
|
|
117
|
-
virtualiser.resizeItem(virtualRow, rowHeight);
|
|
117
|
+
virtualiser.resizeItem(virtualRow.index, rowHeight);
|
|
118
118
|
};
|
|
119
119
|
return /* @__PURE__ */ React.createElement(
|
|
120
120
|
Row.Row,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTableRenderer.cjs","sources":["../../../../../src/primitives/Table/Core/features/useTableRenderer.tsx"],"sourcesContent":["import React, { CSSProperties } from 'react';\nimport { Table as ReactTable, TableMeta as ReactTableMeta, Row as ReactTableRow } from '@tanstack/react-table';\nimport {\n useVirtualizer,\n defaultRangeExtractor,\n ScrollToOptions as ReactVirtualScrollToOptions,\n Range,\n} from '@tanstack/react-virtual';\nimport sortBy from 'lodash/sortBy';\nimport without from 'lodash/without';\n\nimport { ROW_HEIGHT_ESTIMATES } from '../util/rows';\nimport { Row } from '../components/Row/Row';\nimport { useTableRenderers } from '../types';\nimport { TableRef } from '../../types';\nimport { SkeletonRow } from '../components/Row/BuiltIns/SkeletonRow';\n\n// scroll padding end is designed to always show half of the next row\nfunction getScrollPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n let offset = 2;\n\n if (tableMeta.footer.isEnabled) {\n offset += 1;\n }\n\n if (table.getHeaderGroups().length > 1) {\n offset += table.getHeaderGroups().length - 1;\n }\n\n let height = ROW_HEIGHT_ESTIMATES.medium * offset;\n\n const bottomRows = table.getBottomRows();\n\n if (bottomRows.length) {\n // 1.4 offsets for half rows and also accounts for increased row heights (which is likely in pinned rows)\n height += ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] * 1.4 * bottomRows.length;\n }\n\n return height;\n}\n\n// scroll padding end is designed to always show half of the next row\nfunction getPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const bottomRows = table.getBottomRows() ?? [];\n return ROW_HEIGHT_ESTIMATES.medium * 1 * bottomRows.length;\n}\n\n// A higher number ensure less scroll jumping for dynamic row heights, but too high can reduce performance. 8 worked well\nconst OVERSCAN_ROW_COUNT = 8;\n\nexport function useTableRenderer<TType = unknown>(\n renderers: useTableRenderers<TType>,\n table: ReactTable<TType>,\n tableRef: React.RefObject<TableRef>,\n length: number,\n defaultRowActiveIndex?: number | undefined\n) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const isTableRowGrouped = !!table.getState().grouping?.length;\n const rows = table.getCenterRows() ?? [];\n\n // row groups\n const rangeExtractor = useRowGroupVirtualisation<TType>(table);\n\n // account for thead and tfoot in the scroll area - both are always medium row height\n const scrollPaddingStart = ROW_HEIGHT_ESTIMATES.medium;\n\n const count = tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2 ? length : rows.length;\n\n const virtualiser = useVirtualizer({\n count,\n estimateSize: () => {\n return tableMeta.rowHeight.height ? ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] : ROW_HEIGHT_ESTIMATES.medium;\n },\n getScrollElement: () => tableRef.current,\n overscan: tableMeta.printing.isPrinting ? count : OVERSCAN_ROW_COUNT,\n rangeExtractor,\n // correctly sets the scroll padding offset, e.g. when keyboard navigating rows in the list\n scrollPaddingStart,\n scrollPaddingEnd: getScrollPaddingEndOffset(table),\n paddingEnd: getPaddingEndOffset(table),\n });\n\n const expandedState = table.getState().expanded;\n const previousExpandedStateRef = React.useRef(false);\n\n React.useEffect(() => {\n // only remeasure when transitioning between expand all and not expand all\n const isEmpty = JSON.stringify(expandedState) === '{}';\n\n if (expandedState === true || (isEmpty && previousExpandedStateRef.current === true)) {\n previousExpandedStateRef.current = expandedState === true;\n virtualiser.measure();\n }\n }, [expandedState]);\n\n const totalSize = virtualiser.getTotalSize();\n const virtualItems = virtualiser.getVirtualItems();\n\n const scrollToIndex = React.useCallback(\n (index: number, options: ReactVirtualScrollToOptions = { align: 'auto', behavior: 'smooth' }) => {\n const notSmooth: ReactVirtualScrollToOptions = { ...options, behavior: 'auto' };\n\n if (tableRef.current) {\n if (index === 0) {\n virtualiser.scrollToOffset(0, notSmooth);\n } else if (index === count - 1) {\n // sometimes the last row doesn't fully show, so we just force scroll to the bottom\n tableRef.current.scrollTop = tableRef.current.scrollHeight;\n } else {\n virtualiser.scrollToIndex(index, options);\n }\n }\n },\n [virtualItems.length, tableRef.current, totalSize, count]\n );\n\n // use row 1 not 0, because 0 might be sticky in grouped tables and it's start value will always be 0\n const paddingStartIndex = isTableRowGrouped && count > 1 ? 1 : 0;\n\n const startValue = isTableRowGrouped\n ? (virtualItems[paddingStartIndex]?.start ?? 0) - (virtualItems[paddingStartIndex]?.size ?? 0)\n : virtualItems[paddingStartIndex]?.start;\n\n // styling for offsetting rows - this \"is\" the virtualisation\n const [paddingTop, paddingBottom] =\n virtualItems.length > 0\n ? [Math.max(0, startValue ?? 0), Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0))]\n : [0, 0];\n\n // ensure default active rows are scrolled to\n React.useEffect(() => {\n if (defaultRowActiveIndex) {\n scrollToIndex(defaultRowActiveIndex, { align: 'center', behavior: 'auto' });\n }\n }, []);\n\n // rendered output\n let style: CSSProperties = {};\n let content: (JSX.Element | null)[] | null = null;\n\n // bottom rows aren't virtualised (they're sticky) but we need to set the height\n if (count || table.getBottomRows().length) {\n style = {\n height: totalSize,\n paddingBottom: Number.isNaN(paddingBottom) ? 0 : paddingBottom,\n paddingTop: Number.isNaN(paddingTop) ? 0 : paddingTop,\n };\n }\n\n // only render non sticky rows\n if (count) {\n content = virtualItems.map(virtualRow => {\n // there appears to be a react-virtual bug where it inserts a single `undefined` item at the end of the row, which crashes here\n if (!virtualRow) {\n return null;\n }\n\n let row: ReactTableRow<TType> | undefined;\n\n if (tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2) {\n const currentPageIndex =\n (Math.floor(virtualRow.index / tableMeta.server.pageSize) * tableMeta.server.pageSize) /\n tableMeta.server.pageSize;\n const pagePosition = tableMeta.server.pages?.indexOf(currentPageIndex) ?? -1;\n\n if (pagePosition > -1) {\n // \"flatten\" row indexes down into the dataloader2 dataset size\n // for example, with a page size of 100...\n // row index 14267 is actually one of index 67, 167, 267 etc within the dataset (depending on number of pages stored)\n const fakeIndex = pagePosition * tableMeta.server.pageSize + (virtualRow.index % tableMeta.server.pageSize);\n row = rows[fakeIndex];\n }\n } else {\n row = rows[virtualRow.index];\n }\n\n if (!row?.original) {\n // Prefix skeleton keys to prevent collision with real data row keys\n const skeletonKey = `skeleton-${virtualRow.index}`;\n return <SkeletonRow key={skeletonKey} index={virtualRow.index} table={table} />;\n }\n\n const measureRow = (rowHeight: number) => {\n virtualiser.resizeItem(virtualRow, rowHeight);\n };\n\n return (\n <Row\n key={row.id}\n row={row}\n index={virtualRow.index}\n table={table}\n measureRow={measureRow}\n renderer={renderers.row}\n cellRenderer={renderers.cell}\n />\n );\n });\n }\n\n return {\n rows: content,\n style,\n scrollToIndex,\n };\n}\n\n// support virtualised row groups (where the row group headers are sticky)\nfunction useRowGroupVirtualisation<TType = unknown>(table: ReactTable<TType>) {\n const rows = table.getRowModel().rows;\n const isTableGrouped = !!table.getState().grouping.length;\n\n const rowGroupIndexes = React.useMemo(() => {\n const indexes: number[] = [];\n\n if (isTableGrouped) {\n rows.forEach((row, index) => {\n if (row.getIsGrouped()) {\n indexes.push(index);\n }\n });\n }\n\n return indexes;\n }, [rows]);\n\n // this is taken from the react-virtual docs/examples\n const rangeExtractor = React.useCallback(\n (range: Range) => {\n const activeRowGroupIndex =\n [...rowGroupIndexes].reverse().find(index => range.startIndex >= index) ?? rowGroupIndexes[0];\n\n return activeRowGroupIndex === undefined\n ? defaultRangeExtractor(range)\n : sortBy([activeRowGroupIndex, ...without(defaultRangeExtractor(range), activeRowGroupIndex)], a => a);\n },\n [rowGroupIndexes]\n );\n\n return isTableGrouped ? rangeExtractor : undefined;\n}\n"],"names":["ROW_HEIGHT_ESTIMATES","rows","useVirtualizer","_a","SkeletonRow","Row","defaultRangeExtractor"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useTableRenderer.cjs","sources":["../../../../../src/primitives/Table/Core/features/useTableRenderer.tsx"],"sourcesContent":["import React, { CSSProperties } from 'react';\nimport { Table as ReactTable, TableMeta as ReactTableMeta, Row as ReactTableRow } from '@tanstack/react-table';\nimport {\n useVirtualizer,\n defaultRangeExtractor,\n ScrollToOptions as ReactVirtualScrollToOptions,\n Range,\n} from '@tanstack/react-virtual';\nimport sortBy from 'lodash/sortBy';\nimport without from 'lodash/without';\n\nimport { ROW_HEIGHT_ESTIMATES } from '../util/rows';\nimport { Row } from '../components/Row/Row';\nimport { useTableRenderers } from '../types';\nimport { TableRef } from '../../types';\nimport { SkeletonRow } from '../components/Row/BuiltIns/SkeletonRow';\n\n// scroll padding end is designed to always show half of the next row\nfunction getScrollPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n let offset = 2;\n\n if (tableMeta.footer.isEnabled) {\n offset += 1;\n }\n\n if (table.getHeaderGroups().length > 1) {\n offset += table.getHeaderGroups().length - 1;\n }\n\n let height = ROW_HEIGHT_ESTIMATES.medium * offset;\n\n const bottomRows = table.getBottomRows();\n\n if (bottomRows.length) {\n // 1.4 offsets for half rows and also accounts for increased row heights (which is likely in pinned rows)\n height += ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] * 1.4 * bottomRows.length;\n }\n\n return height;\n}\n\n// scroll padding end is designed to always show half of the next row\nfunction getPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const bottomRows = table.getBottomRows() ?? [];\n return ROW_HEIGHT_ESTIMATES.medium * 1 * bottomRows.length;\n}\n\n// A higher number ensure less scroll jumping for dynamic row heights, but too high can reduce performance. 8 worked well\nconst OVERSCAN_ROW_COUNT = 8;\n\nexport function useTableRenderer<TType = unknown>(\n renderers: useTableRenderers<TType>,\n table: ReactTable<TType>,\n tableRef: React.RefObject<TableRef>,\n length: number,\n defaultRowActiveIndex?: number | undefined\n) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const isTableRowGrouped = !!table.getState().grouping?.length;\n const rows = table.getCenterRows() ?? [];\n\n // row groups\n const rangeExtractor = useRowGroupVirtualisation<TType>(table);\n\n // account for thead and tfoot in the scroll area - both are always medium row height\n const scrollPaddingStart = ROW_HEIGHT_ESTIMATES.medium;\n\n const count = tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2 ? length : rows.length;\n\n const virtualiser = useVirtualizer({\n count,\n estimateSize: () => {\n return tableMeta.rowHeight.height ? ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] : ROW_HEIGHT_ESTIMATES.medium;\n },\n getScrollElement: () => tableRef.current,\n overscan: tableMeta.printing.isPrinting ? count : OVERSCAN_ROW_COUNT,\n rangeExtractor,\n // correctly sets the scroll padding offset, e.g. when keyboard navigating rows in the list\n scrollPaddingStart,\n scrollPaddingEnd: getScrollPaddingEndOffset(table),\n paddingEnd: getPaddingEndOffset(table),\n });\n\n const expandedState = table.getState().expanded;\n const previousExpandedStateRef = React.useRef(false);\n\n React.useEffect(() => {\n // only remeasure when transitioning between expand all and not expand all\n const isEmpty = JSON.stringify(expandedState) === '{}';\n\n if (expandedState === true || (isEmpty && previousExpandedStateRef.current === true)) {\n previousExpandedStateRef.current = expandedState === true;\n virtualiser.measure();\n }\n }, [expandedState]);\n\n const totalSize = virtualiser.getTotalSize();\n const virtualItems = virtualiser.getVirtualItems();\n\n const scrollToIndex = React.useCallback(\n (index: number, options: ReactVirtualScrollToOptions = { align: 'auto', behavior: 'smooth' }) => {\n const notSmooth: ReactVirtualScrollToOptions = { ...options, behavior: 'auto' };\n\n if (tableRef.current) {\n if (index === 0) {\n virtualiser.scrollToOffset(0, notSmooth);\n } else if (index === count - 1) {\n // sometimes the last row doesn't fully show, so we just force scroll to the bottom\n tableRef.current.scrollTop = tableRef.current.scrollHeight;\n } else {\n virtualiser.scrollToIndex(index, options);\n }\n }\n },\n [virtualItems.length, tableRef.current, totalSize, count]\n );\n\n // use row 1 not 0, because 0 might be sticky in grouped tables and it's start value will always be 0\n const paddingStartIndex = isTableRowGrouped && count > 1 ? 1 : 0;\n\n const startValue = isTableRowGrouped\n ? (virtualItems[paddingStartIndex]?.start ?? 0) - (virtualItems[paddingStartIndex]?.size ?? 0)\n : virtualItems[paddingStartIndex]?.start;\n\n // styling for offsetting rows - this \"is\" the virtualisation\n const [paddingTop, paddingBottom] =\n virtualItems.length > 0\n ? [Math.max(0, startValue ?? 0), Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0))]\n : [0, 0];\n\n // ensure default active rows are scrolled to\n React.useEffect(() => {\n if (defaultRowActiveIndex) {\n scrollToIndex(defaultRowActiveIndex, { align: 'center', behavior: 'auto' });\n }\n }, []);\n\n // rendered output\n let style: CSSProperties = {};\n let content: (JSX.Element | null)[] | null = null;\n\n // bottom rows aren't virtualised (they're sticky) but we need to set the height\n if (count || table.getBottomRows().length) {\n style = {\n height: totalSize,\n paddingBottom: Number.isNaN(paddingBottom) ? 0 : paddingBottom,\n paddingTop: Number.isNaN(paddingTop) ? 0 : paddingTop,\n };\n }\n\n // only render non sticky rows\n if (count) {\n content = virtualItems.map(virtualRow => {\n // there appears to be a react-virtual bug where it inserts a single `undefined` item at the end of the row, which crashes here\n if (!virtualRow) {\n return null;\n }\n\n let row: ReactTableRow<TType> | undefined;\n\n if (tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2) {\n const currentPageIndex =\n (Math.floor(virtualRow.index / tableMeta.server.pageSize) * tableMeta.server.pageSize) /\n tableMeta.server.pageSize;\n const pagePosition = tableMeta.server.pages?.indexOf(currentPageIndex) ?? -1;\n\n if (pagePosition > -1) {\n // \"flatten\" row indexes down into the dataloader2 dataset size\n // for example, with a page size of 100...\n // row index 14267 is actually one of index 67, 167, 267 etc within the dataset (depending on number of pages stored)\n const fakeIndex = pagePosition * tableMeta.server.pageSize + (virtualRow.index % tableMeta.server.pageSize);\n row = rows[fakeIndex];\n }\n } else {\n row = rows[virtualRow.index];\n }\n\n if (!row?.original) {\n // Prefix skeleton keys to prevent collision with real data row keys\n const skeletonKey = `skeleton-${virtualRow.index}`;\n return <SkeletonRow key={skeletonKey} index={virtualRow.index} table={table} />;\n }\n\n const measureRow = (rowHeight: number) => {\n virtualiser.resizeItem(virtualRow.index, rowHeight);\n };\n\n return (\n <Row\n key={row.id}\n row={row}\n index={virtualRow.index}\n table={table}\n measureRow={measureRow}\n renderer={renderers.row}\n cellRenderer={renderers.cell}\n />\n );\n });\n }\n\n return {\n rows: content,\n style,\n scrollToIndex,\n };\n}\n\n// support virtualised row groups (where the row group headers are sticky)\nfunction useRowGroupVirtualisation<TType = unknown>(table: ReactTable<TType>) {\n const rows = table.getRowModel().rows;\n const isTableGrouped = !!table.getState().grouping.length;\n\n const rowGroupIndexes = React.useMemo(() => {\n const indexes: number[] = [];\n\n if (isTableGrouped) {\n rows.forEach((row, index) => {\n if (row.getIsGrouped()) {\n indexes.push(index);\n }\n });\n }\n\n return indexes;\n }, [rows]);\n\n // this is taken from the react-virtual docs/examples\n const rangeExtractor = React.useCallback(\n (range: Range) => {\n const activeRowGroupIndex =\n [...rowGroupIndexes].reverse().find(index => range.startIndex >= index) ?? rowGroupIndexes[0];\n\n return activeRowGroupIndex === undefined\n ? defaultRangeExtractor(range)\n : sortBy([activeRowGroupIndex, ...without(defaultRangeExtractor(range), activeRowGroupIndex)], a => a);\n },\n [rowGroupIndexes]\n );\n\n return isTableGrouped ? rangeExtractor : undefined;\n}\n"],"names":["ROW_HEIGHT_ESTIMATES","rows","useVirtualizer","_a","SkeletonRow","Row","defaultRangeExtractor"],"mappings":"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"}
|
|
@@ -112,7 +112,7 @@ function useTableRenderer(renderers, table, tableRef, length, defaultRowActiveIn
|
|
|
112
112
|
return /* @__PURE__ */ React__default.createElement(SkeletonRow, { key: skeletonKey, index: virtualRow.index, table });
|
|
113
113
|
}
|
|
114
114
|
const measureRow = (rowHeight) => {
|
|
115
|
-
virtualiser.resizeItem(virtualRow, rowHeight);
|
|
115
|
+
virtualiser.resizeItem(virtualRow.index, rowHeight);
|
|
116
116
|
};
|
|
117
117
|
return /* @__PURE__ */ React__default.createElement(
|
|
118
118
|
Row,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTableRenderer.js","sources":["../../../../../src/primitives/Table/Core/features/useTableRenderer.tsx"],"sourcesContent":["import React, { CSSProperties } from 'react';\nimport { Table as ReactTable, TableMeta as ReactTableMeta, Row as ReactTableRow } from '@tanstack/react-table';\nimport {\n useVirtualizer,\n defaultRangeExtractor,\n ScrollToOptions as ReactVirtualScrollToOptions,\n Range,\n} from '@tanstack/react-virtual';\nimport sortBy from 'lodash/sortBy';\nimport without from 'lodash/without';\n\nimport { ROW_HEIGHT_ESTIMATES } from '../util/rows';\nimport { Row } from '../components/Row/Row';\nimport { useTableRenderers } from '../types';\nimport { TableRef } from '../../types';\nimport { SkeletonRow } from '../components/Row/BuiltIns/SkeletonRow';\n\n// scroll padding end is designed to always show half of the next row\nfunction getScrollPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n let offset = 2;\n\n if (tableMeta.footer.isEnabled) {\n offset += 1;\n }\n\n if (table.getHeaderGroups().length > 1) {\n offset += table.getHeaderGroups().length - 1;\n }\n\n let height = ROW_HEIGHT_ESTIMATES.medium * offset;\n\n const bottomRows = table.getBottomRows();\n\n if (bottomRows.length) {\n // 1.4 offsets for half rows and also accounts for increased row heights (which is likely in pinned rows)\n height += ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] * 1.4 * bottomRows.length;\n }\n\n return height;\n}\n\n// scroll padding end is designed to always show half of the next row\nfunction getPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const bottomRows = table.getBottomRows() ?? [];\n return ROW_HEIGHT_ESTIMATES.medium * 1 * bottomRows.length;\n}\n\n// A higher number ensure less scroll jumping for dynamic row heights, but too high can reduce performance. 8 worked well\nconst OVERSCAN_ROW_COUNT = 8;\n\nexport function useTableRenderer<TType = unknown>(\n renderers: useTableRenderers<TType>,\n table: ReactTable<TType>,\n tableRef: React.RefObject<TableRef>,\n length: number,\n defaultRowActiveIndex?: number | undefined\n) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const isTableRowGrouped = !!table.getState().grouping?.length;\n const rows = table.getCenterRows() ?? [];\n\n // row groups\n const rangeExtractor = useRowGroupVirtualisation<TType>(table);\n\n // account for thead and tfoot in the scroll area - both are always medium row height\n const scrollPaddingStart = ROW_HEIGHT_ESTIMATES.medium;\n\n const count = tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2 ? length : rows.length;\n\n const virtualiser = useVirtualizer({\n count,\n estimateSize: () => {\n return tableMeta.rowHeight.height ? ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] : ROW_HEIGHT_ESTIMATES.medium;\n },\n getScrollElement: () => tableRef.current,\n overscan: tableMeta.printing.isPrinting ? count : OVERSCAN_ROW_COUNT,\n rangeExtractor,\n // correctly sets the scroll padding offset, e.g. when keyboard navigating rows in the list\n scrollPaddingStart,\n scrollPaddingEnd: getScrollPaddingEndOffset(table),\n paddingEnd: getPaddingEndOffset(table),\n });\n\n const expandedState = table.getState().expanded;\n const previousExpandedStateRef = React.useRef(false);\n\n React.useEffect(() => {\n // only remeasure when transitioning between expand all and not expand all\n const isEmpty = JSON.stringify(expandedState) === '{}';\n\n if (expandedState === true || (isEmpty && previousExpandedStateRef.current === true)) {\n previousExpandedStateRef.current = expandedState === true;\n virtualiser.measure();\n }\n }, [expandedState]);\n\n const totalSize = virtualiser.getTotalSize();\n const virtualItems = virtualiser.getVirtualItems();\n\n const scrollToIndex = React.useCallback(\n (index: number, options: ReactVirtualScrollToOptions = { align: 'auto', behavior: 'smooth' }) => {\n const notSmooth: ReactVirtualScrollToOptions = { ...options, behavior: 'auto' };\n\n if (tableRef.current) {\n if (index === 0) {\n virtualiser.scrollToOffset(0, notSmooth);\n } else if (index === count - 1) {\n // sometimes the last row doesn't fully show, so we just force scroll to the bottom\n tableRef.current.scrollTop = tableRef.current.scrollHeight;\n } else {\n virtualiser.scrollToIndex(index, options);\n }\n }\n },\n [virtualItems.length, tableRef.current, totalSize, count]\n );\n\n // use row 1 not 0, because 0 might be sticky in grouped tables and it's start value will always be 0\n const paddingStartIndex = isTableRowGrouped && count > 1 ? 1 : 0;\n\n const startValue = isTableRowGrouped\n ? (virtualItems[paddingStartIndex]?.start ?? 0) - (virtualItems[paddingStartIndex]?.size ?? 0)\n : virtualItems[paddingStartIndex]?.start;\n\n // styling for offsetting rows - this \"is\" the virtualisation\n const [paddingTop, paddingBottom] =\n virtualItems.length > 0\n ? [Math.max(0, startValue ?? 0), Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0))]\n : [0, 0];\n\n // ensure default active rows are scrolled to\n React.useEffect(() => {\n if (defaultRowActiveIndex) {\n scrollToIndex(defaultRowActiveIndex, { align: 'center', behavior: 'auto' });\n }\n }, []);\n\n // rendered output\n let style: CSSProperties = {};\n let content: (JSX.Element | null)[] | null = null;\n\n // bottom rows aren't virtualised (they're sticky) but we need to set the height\n if (count || table.getBottomRows().length) {\n style = {\n height: totalSize,\n paddingBottom: Number.isNaN(paddingBottom) ? 0 : paddingBottom,\n paddingTop: Number.isNaN(paddingTop) ? 0 : paddingTop,\n };\n }\n\n // only render non sticky rows\n if (count) {\n content = virtualItems.map(virtualRow => {\n // there appears to be a react-virtual bug where it inserts a single `undefined` item at the end of the row, which crashes here\n if (!virtualRow) {\n return null;\n }\n\n let row: ReactTableRow<TType> | undefined;\n\n if (tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2) {\n const currentPageIndex =\n (Math.floor(virtualRow.index / tableMeta.server.pageSize) * tableMeta.server.pageSize) /\n tableMeta.server.pageSize;\n const pagePosition = tableMeta.server.pages?.indexOf(currentPageIndex) ?? -1;\n\n if (pagePosition > -1) {\n // \"flatten\" row indexes down into the dataloader2 dataset size\n // for example, with a page size of 100...\n // row index 14267 is actually one of index 67, 167, 267 etc within the dataset (depending on number of pages stored)\n const fakeIndex = pagePosition * tableMeta.server.pageSize + (virtualRow.index % tableMeta.server.pageSize);\n row = rows[fakeIndex];\n }\n } else {\n row = rows[virtualRow.index];\n }\n\n if (!row?.original) {\n // Prefix skeleton keys to prevent collision with real data row keys\n const skeletonKey = `skeleton-${virtualRow.index}`;\n return <SkeletonRow key={skeletonKey} index={virtualRow.index} table={table} />;\n }\n\n const measureRow = (rowHeight: number) => {\n virtualiser.resizeItem(virtualRow, rowHeight);\n };\n\n return (\n <Row\n key={row.id}\n row={row}\n index={virtualRow.index}\n table={table}\n measureRow={measureRow}\n renderer={renderers.row}\n cellRenderer={renderers.cell}\n />\n );\n });\n }\n\n return {\n rows: content,\n style,\n scrollToIndex,\n };\n}\n\n// support virtualised row groups (where the row group headers are sticky)\nfunction useRowGroupVirtualisation<TType = unknown>(table: ReactTable<TType>) {\n const rows = table.getRowModel().rows;\n const isTableGrouped = !!table.getState().grouping.length;\n\n const rowGroupIndexes = React.useMemo(() => {\n const indexes: number[] = [];\n\n if (isTableGrouped) {\n rows.forEach((row, index) => {\n if (row.getIsGrouped()) {\n indexes.push(index);\n }\n });\n }\n\n return indexes;\n }, [rows]);\n\n // this is taken from the react-virtual docs/examples\n const rangeExtractor = React.useCallback(\n (range: Range) => {\n const activeRowGroupIndex =\n [...rowGroupIndexes].reverse().find(index => range.startIndex >= index) ?? rowGroupIndexes[0];\n\n return activeRowGroupIndex === undefined\n ? defaultRangeExtractor(range)\n : sortBy([activeRowGroupIndex, ...without(defaultRangeExtractor(range), activeRowGroupIndex)], a => a);\n },\n [rowGroupIndexes]\n );\n\n return isTableGrouped ? rangeExtractor : undefined;\n}\n"],"names":["React","_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useTableRenderer.js","sources":["../../../../../src/primitives/Table/Core/features/useTableRenderer.tsx"],"sourcesContent":["import React, { CSSProperties } from 'react';\nimport { Table as ReactTable, TableMeta as ReactTableMeta, Row as ReactTableRow } from '@tanstack/react-table';\nimport {\n useVirtualizer,\n defaultRangeExtractor,\n ScrollToOptions as ReactVirtualScrollToOptions,\n Range,\n} from '@tanstack/react-virtual';\nimport sortBy from 'lodash/sortBy';\nimport without from 'lodash/without';\n\nimport { ROW_HEIGHT_ESTIMATES } from '../util/rows';\nimport { Row } from '../components/Row/Row';\nimport { useTableRenderers } from '../types';\nimport { TableRef } from '../../types';\nimport { SkeletonRow } from '../components/Row/BuiltIns/SkeletonRow';\n\n// scroll padding end is designed to always show half of the next row\nfunction getScrollPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n let offset = 2;\n\n if (tableMeta.footer.isEnabled) {\n offset += 1;\n }\n\n if (table.getHeaderGroups().length > 1) {\n offset += table.getHeaderGroups().length - 1;\n }\n\n let height = ROW_HEIGHT_ESTIMATES.medium * offset;\n\n const bottomRows = table.getBottomRows();\n\n if (bottomRows.length) {\n // 1.4 offsets for half rows and also accounts for increased row heights (which is likely in pinned rows)\n height += ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] * 1.4 * bottomRows.length;\n }\n\n return height;\n}\n\n// scroll padding end is designed to always show half of the next row\nfunction getPaddingEndOffset<TType = unknown>(table: ReactTable<TType>) {\n const bottomRows = table.getBottomRows() ?? [];\n return ROW_HEIGHT_ESTIMATES.medium * 1 * bottomRows.length;\n}\n\n// A higher number ensure less scroll jumping for dynamic row heights, but too high can reduce performance. 8 worked well\nconst OVERSCAN_ROW_COUNT = 8;\n\nexport function useTableRenderer<TType = unknown>(\n renderers: useTableRenderers<TType>,\n table: ReactTable<TType>,\n tableRef: React.RefObject<TableRef>,\n length: number,\n defaultRowActiveIndex?: number | undefined\n) {\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const isTableRowGrouped = !!table.getState().grouping?.length;\n const rows = table.getCenterRows() ?? [];\n\n // row groups\n const rangeExtractor = useRowGroupVirtualisation<TType>(table);\n\n // account for thead and tfoot in the scroll area - both are always medium row height\n const scrollPaddingStart = ROW_HEIGHT_ESTIMATES.medium;\n\n const count = tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2 ? length : rows.length;\n\n const virtualiser = useVirtualizer({\n count,\n estimateSize: () => {\n return tableMeta.rowHeight.height ? ROW_HEIGHT_ESTIMATES[tableMeta.rowHeight.height] : ROW_HEIGHT_ESTIMATES.medium;\n },\n getScrollElement: () => tableRef.current,\n overscan: tableMeta.printing.isPrinting ? count : OVERSCAN_ROW_COUNT,\n rangeExtractor,\n // correctly sets the scroll padding offset, e.g. when keyboard navigating rows in the list\n scrollPaddingStart,\n scrollPaddingEnd: getScrollPaddingEndOffset(table),\n paddingEnd: getPaddingEndOffset(table),\n });\n\n const expandedState = table.getState().expanded;\n const previousExpandedStateRef = React.useRef(false);\n\n React.useEffect(() => {\n // only remeasure when transitioning between expand all and not expand all\n const isEmpty = JSON.stringify(expandedState) === '{}';\n\n if (expandedState === true || (isEmpty && previousExpandedStateRef.current === true)) {\n previousExpandedStateRef.current = expandedState === true;\n virtualiser.measure();\n }\n }, [expandedState]);\n\n const totalSize = virtualiser.getTotalSize();\n const virtualItems = virtualiser.getVirtualItems();\n\n const scrollToIndex = React.useCallback(\n (index: number, options: ReactVirtualScrollToOptions = { align: 'auto', behavior: 'smooth' }) => {\n const notSmooth: ReactVirtualScrollToOptions = { ...options, behavior: 'auto' };\n\n if (tableRef.current) {\n if (index === 0) {\n virtualiser.scrollToOffset(0, notSmooth);\n } else if (index === count - 1) {\n // sometimes the last row doesn't fully show, so we just force scroll to the bottom\n tableRef.current.scrollTop = tableRef.current.scrollHeight;\n } else {\n virtualiser.scrollToIndex(index, options);\n }\n }\n },\n [virtualItems.length, tableRef.current, totalSize, count]\n );\n\n // use row 1 not 0, because 0 might be sticky in grouped tables and it's start value will always be 0\n const paddingStartIndex = isTableRowGrouped && count > 1 ? 1 : 0;\n\n const startValue = isTableRowGrouped\n ? (virtualItems[paddingStartIndex]?.start ?? 0) - (virtualItems[paddingStartIndex]?.size ?? 0)\n : virtualItems[paddingStartIndex]?.start;\n\n // styling for offsetting rows - this \"is\" the virtualisation\n const [paddingTop, paddingBottom] =\n virtualItems.length > 0\n ? [Math.max(0, startValue ?? 0), Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0))]\n : [0, 0];\n\n // ensure default active rows are scrolled to\n React.useEffect(() => {\n if (defaultRowActiveIndex) {\n scrollToIndex(defaultRowActiveIndex, { align: 'center', behavior: 'auto' });\n }\n }, []);\n\n // rendered output\n let style: CSSProperties = {};\n let content: (JSX.Element | null)[] | null = null;\n\n // bottom rows aren't virtualised (they're sticky) but we need to set the height\n if (count || table.getBottomRows().length) {\n style = {\n height: totalSize,\n paddingBottom: Number.isNaN(paddingBottom) ? 0 : paddingBottom,\n paddingTop: Number.isNaN(paddingTop) ? 0 : paddingTop,\n };\n }\n\n // only render non sticky rows\n if (count) {\n content = virtualItems.map(virtualRow => {\n // there appears to be a react-virtual bug where it inserts a single `undefined` item at the end of the row, which crashes here\n if (!virtualRow) {\n return null;\n }\n\n let row: ReactTableRow<TType> | undefined;\n\n if (tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2) {\n const currentPageIndex =\n (Math.floor(virtualRow.index / tableMeta.server.pageSize) * tableMeta.server.pageSize) /\n tableMeta.server.pageSize;\n const pagePosition = tableMeta.server.pages?.indexOf(currentPageIndex) ?? -1;\n\n if (pagePosition > -1) {\n // \"flatten\" row indexes down into the dataloader2 dataset size\n // for example, with a page size of 100...\n // row index 14267 is actually one of index 67, 167, 267 etc within the dataset (depending on number of pages stored)\n const fakeIndex = pagePosition * tableMeta.server.pageSize + (virtualRow.index % tableMeta.server.pageSize);\n row = rows[fakeIndex];\n }\n } else {\n row = rows[virtualRow.index];\n }\n\n if (!row?.original) {\n // Prefix skeleton keys to prevent collision with real data row keys\n const skeletonKey = `skeleton-${virtualRow.index}`;\n return <SkeletonRow key={skeletonKey} index={virtualRow.index} table={table} />;\n }\n\n const measureRow = (rowHeight: number) => {\n virtualiser.resizeItem(virtualRow.index, rowHeight);\n };\n\n return (\n <Row\n key={row.id}\n row={row}\n index={virtualRow.index}\n table={table}\n measureRow={measureRow}\n renderer={renderers.row}\n cellRenderer={renderers.cell}\n />\n );\n });\n }\n\n return {\n rows: content,\n style,\n scrollToIndex,\n };\n}\n\n// support virtualised row groups (where the row group headers are sticky)\nfunction useRowGroupVirtualisation<TType = unknown>(table: ReactTable<TType>) {\n const rows = table.getRowModel().rows;\n const isTableGrouped = !!table.getState().grouping.length;\n\n const rowGroupIndexes = React.useMemo(() => {\n const indexes: number[] = [];\n\n if (isTableGrouped) {\n rows.forEach((row, index) => {\n if (row.getIsGrouped()) {\n indexes.push(index);\n }\n });\n }\n\n return indexes;\n }, [rows]);\n\n // this is taken from the react-virtual docs/examples\n const rangeExtractor = React.useCallback(\n (range: Range) => {\n const activeRowGroupIndex =\n [...rowGroupIndexes].reverse().find(index => range.startIndex >= index) ?? rowGroupIndexes[0];\n\n return activeRowGroupIndex === undefined\n ? defaultRangeExtractor(range)\n : sortBy([activeRowGroupIndex, ...without(defaultRangeExtractor(range), activeRowGroupIndex)], a => a);\n },\n [rowGroupIndexes]\n );\n\n return isTableGrouped ? rangeExtractor : undefined;\n}\n"],"names":["React","_a"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@economic/taco",
|
|
3
|
-
"version": "8.1.0
|
|
3
|
+
"version": "8.1.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -38,18 +38,18 @@
|
|
|
38
38
|
"generate-icons": "node scripts/generate-icons.cjs"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@base-ui/react": "1.
|
|
41
|
+
"@base-ui/react": "1.5.0",
|
|
42
42
|
"@dnd-kit/core": "^6.3.1",
|
|
43
43
|
"@dnd-kit/modifiers": "^7.0.0",
|
|
44
44
|
"@dnd-kit/sortable": "^7.0.2",
|
|
45
45
|
"@dnd-kit/utilities": "^3.2.2",
|
|
46
|
-
"@economic/taco-tokens": "^2.2.4
|
|
46
|
+
"@economic/taco-tokens": "^2.2.4",
|
|
47
47
|
"@radix-ui/react-popover": "1.0.2",
|
|
48
48
|
"@radix-ui/react-scroll-area": "1.2.10",
|
|
49
49
|
"@react-aria/focus": "^3.19.0",
|
|
50
50
|
"@react-aria/interactions": "^3.12.0",
|
|
51
51
|
"@tanstack/react-table": "^8.21.3",
|
|
52
|
-
"@tanstack/react-virtual": "3.
|
|
52
|
+
"@tanstack/react-virtual": "3.13.23",
|
|
53
53
|
"clsx": "^2.1.1",
|
|
54
54
|
"date-fns": "^3.6.0",
|
|
55
55
|
"framer-motion": "12.38.0",
|
|
@@ -71,14 +71,14 @@
|
|
|
71
71
|
"tailwindcss": ">=3.4.19"
|
|
72
72
|
},
|
|
73
73
|
"devDependencies": {
|
|
74
|
-
"@oxlint/plugins": "^1.
|
|
74
|
+
"@oxlint/plugins": "^1.67.0",
|
|
75
75
|
"@svgr/cli": "^5.5.0",
|
|
76
76
|
"@testing-library/jest-dom": "6.9.1",
|
|
77
77
|
"@testing-library/react": "16.3.2",
|
|
78
78
|
"@testing-library/user-event": "14.6.1",
|
|
79
79
|
"@types/lodash": "^4.17.24",
|
|
80
80
|
"@types/node": "^22.19.19",
|
|
81
|
-
"@types/react": "18.3.
|
|
81
|
+
"@types/react": "18.3.29",
|
|
82
82
|
"@types/react-dom": "18.3.7",
|
|
83
83
|
"@types/react-table": "^7.7.20",
|
|
84
84
|
"@types/react-window": "^1.8.8",
|
|
@@ -99,5 +99,5 @@
|
|
|
99
99
|
"optionalDependencies": {
|
|
100
100
|
"@rollup/rollup-linux-x64-gnu": "^4.60.4"
|
|
101
101
|
},
|
|
102
|
-
"gitHead": "
|
|
102
|
+
"gitHead": "5d7f026827fc0f2ce4b41d7ac92c25e0aed8473b"
|
|
103
103
|
}
|