@vuu-ui/vuu-ui-controls 0.13.2 → 0.13.4
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/cjs/column-picker/ColumnPicker.js +2 -2
- package/cjs/column-picker/ColumnPicker.js.map +1 -1
- package/cjs/column-picker/ColumnSearch.js +4 -24
- package/cjs/column-picker/ColumnSearch.js.map +1 -1
- package/cjs/context-panel-provider/ContextPanelProvider.js +55 -0
- package/cjs/context-panel-provider/ContextPanelProvider.js.map +1 -0
- package/cjs/index.js +6 -80
- package/cjs/index.js.map +1 -1
- package/cjs/sortable-list/SortableList.js +38 -0
- package/cjs/sortable-list/SortableList.js.map +1 -0
- package/cjs/toolbar/Toolbar.js.map +1 -1
- package/cjs/toolbar/useSelection.js +0 -1
- package/cjs/toolbar/useSelection.js.map +1 -1
- package/esm/column-picker/ColumnPicker.js +2 -2
- package/esm/column-picker/ColumnPicker.js.map +1 -1
- package/esm/column-picker/ColumnSearch.js +5 -25
- package/esm/column-picker/ColumnSearch.js.map +1 -1
- package/esm/context-panel-provider/ContextPanelProvider.js +51 -0
- package/esm/context-panel-provider/ContextPanelProvider.js.map +1 -0
- package/esm/index.js +2 -21
- package/esm/index.js.map +1 -1
- package/esm/sortable-list/SortableList.js +35 -0
- package/esm/sortable-list/SortableList.js.map +1 -0
- package/esm/toolbar/Toolbar.js.map +1 -1
- package/esm/toolbar/useSelection.js +0 -1
- package/esm/toolbar/useSelection.js.map +1 -1
- package/package.json +15 -17
- package/cjs/common-hooks/collectionProvider.js +0 -24
- package/cjs/common-hooks/collectionProvider.js.map +0 -1
- package/cjs/common-hooks/isPlainObject.js +0 -6
- package/cjs/common-hooks/isPlainObject.js.map +0 -1
- package/cjs/common-hooks/itemToString.js +0 -24
- package/cjs/common-hooks/itemToString.js.map +0 -1
- package/cjs/common-hooks/useCollectionItems.js +0 -309
- package/cjs/common-hooks/useCollectionItems.js.map +0 -1
- package/cjs/common-hooks/useSelection.js +0 -212
- package/cjs/common-hooks/useSelection.js.map +0 -1
- package/cjs/list/Highlighter.css.js +0 -6
- package/cjs/list/Highlighter.css.js.map +0 -1
- package/cjs/list/Highlighter.js +0 -36
- package/cjs/list/Highlighter.js.map +0 -1
- package/cjs/list/List.css.js +0 -6
- package/cjs/list/List.css.js.map +0 -1
- package/cjs/list/List.js +0 -317
- package/cjs/list/List.js.map +0 -1
- package/cjs/list/ListItem.css.js +0 -6
- package/cjs/list/ListItem.css.js.map +0 -1
- package/cjs/list/ListItem.js +0 -84
- package/cjs/list/ListItem.js.map +0 -1
- package/cjs/list/ListItemGroup.js +0 -6
- package/cjs/list/ListItemGroup.js.map +0 -1
- package/cjs/list/ListItemHeader.js +0 -6
- package/cjs/list/ListItemHeader.js.map +0 -1
- package/cjs/list/RadioIcon.css.js +0 -6
- package/cjs/list/RadioIcon.css.js.map +0 -1
- package/cjs/list/RadioIcon.js +0 -27
- package/cjs/list/RadioIcon.js.map +0 -1
- package/cjs/list/common-hooks/keyUtils.js +0 -78
- package/cjs/list/common-hooks/keyUtils.js.map +0 -1
- package/cjs/list/common-hooks/list-dom-utils.js +0 -25
- package/cjs/list/common-hooks/list-dom-utils.js.map +0 -1
- package/cjs/list/common-hooks/useCollapsibleGroups.js +0 -72
- package/cjs/list/common-hooks/useCollapsibleGroups.js.map +0 -1
- package/cjs/list/common-hooks/useImperativeScrollingAPI.js +0 -52
- package/cjs/list/common-hooks/useImperativeScrollingAPI.js.map +0 -1
- package/cjs/list/common-hooks/useKeyboardNavigation.js +0 -289
- package/cjs/list/common-hooks/useKeyboardNavigation.js.map +0 -1
- package/cjs/list/common-hooks/useTypeahead.js +0 -74
- package/cjs/list/common-hooks/useTypeahead.js.map +0 -1
- package/cjs/list/common-hooks/useViewportTracking.js +0 -133
- package/cjs/list/common-hooks/useViewportTracking.js.map +0 -1
- package/cjs/list/common-hooks/utils/collection-item-utils.js +0 -182
- package/cjs/list/common-hooks/utils/collection-item-utils.js.map +0 -1
- package/cjs/list/common-hooks/utils/filter-utils.js +0 -11
- package/cjs/list/common-hooks/utils/filter-utils.js.map +0 -1
- package/cjs/list/common-hooks/utils/isSelected.js +0 -9
- package/cjs/list/common-hooks/utils/isSelected.js.map +0 -1
- package/cjs/list/useList.js +0 -278
- package/cjs/list/useList.js.map +0 -1
- package/cjs/list/useListDrop.js +0 -92
- package/cjs/list/useListDrop.js.map +0 -1
- package/cjs/list/useListHeight.js +0 -77
- package/cjs/list/useListHeight.js.map +0 -1
- package/cjs/list/useScrollPosition.js +0 -74
- package/cjs/list/useScrollPosition.js.map +0 -1
- package/esm/common-hooks/collectionProvider.js +0 -20
- package/esm/common-hooks/collectionProvider.js.map +0 -1
- package/esm/common-hooks/isPlainObject.js +0 -4
- package/esm/common-hooks/isPlainObject.js.map +0 -1
- package/esm/common-hooks/itemToString.js +0 -22
- package/esm/common-hooks/itemToString.js.map +0 -1
- package/esm/common-hooks/useCollectionItems.js +0 -307
- package/esm/common-hooks/useCollectionItems.js.map +0 -1
- package/esm/common-hooks/useSelection.js +0 -205
- package/esm/common-hooks/useSelection.js.map +0 -1
- package/esm/list/Highlighter.css.js +0 -4
- package/esm/list/Highlighter.css.js.map +0 -1
- package/esm/list/Highlighter.js +0 -34
- package/esm/list/Highlighter.js.map +0 -1
- package/esm/list/List.css.js +0 -4
- package/esm/list/List.css.js.map +0 -1
- package/esm/list/List.js +0 -315
- package/esm/list/List.js.map +0 -1
- package/esm/list/ListItem.css.js +0 -4
- package/esm/list/ListItem.css.js.map +0 -1
- package/esm/list/ListItem.js +0 -81
- package/esm/list/ListItem.js.map +0 -1
- package/esm/list/ListItemGroup.js +0 -4
- package/esm/list/ListItemGroup.js.map +0 -1
- package/esm/list/ListItemHeader.js +0 -4
- package/esm/list/ListItemHeader.js.map +0 -1
- package/esm/list/RadioIcon.css.js +0 -4
- package/esm/list/RadioIcon.css.js.map +0 -1
- package/esm/list/RadioIcon.js +0 -25
- package/esm/list/RadioIcon.js.map +0 -1
- package/esm/list/common-hooks/keyUtils.js +0 -64
- package/esm/list/common-hooks/keyUtils.js.map +0 -1
- package/esm/list/common-hooks/list-dom-utils.js +0 -19
- package/esm/list/common-hooks/list-dom-utils.js.map +0 -1
- package/esm/list/common-hooks/useCollapsibleGroups.js +0 -70
- package/esm/list/common-hooks/useCollapsibleGroups.js.map +0 -1
- package/esm/list/common-hooks/useImperativeScrollingAPI.js +0 -50
- package/esm/list/common-hooks/useImperativeScrollingAPI.js.map +0 -1
- package/esm/list/common-hooks/useKeyboardNavigation.js +0 -286
- package/esm/list/common-hooks/useKeyboardNavigation.js.map +0 -1
- package/esm/list/common-hooks/useTypeahead.js +0 -72
- package/esm/list/common-hooks/useTypeahead.js.map +0 -1
- package/esm/list/common-hooks/useViewportTracking.js +0 -131
- package/esm/list/common-hooks/useViewportTracking.js.map +0 -1
- package/esm/list/common-hooks/utils/collection-item-utils.js +0 -168
- package/esm/list/common-hooks/utils/collection-item-utils.js.map +0 -1
- package/esm/list/common-hooks/utils/filter-utils.js +0 -8
- package/esm/list/common-hooks/utils/filter-utils.js.map +0 -1
- package/esm/list/common-hooks/utils/isSelected.js +0 -7
- package/esm/list/common-hooks/utils/isSelected.js.map +0 -1
- package/esm/list/useList.js +0 -276
- package/esm/list/useList.js.map +0 -1
- package/esm/list/useListDrop.js +0 -90
- package/esm/list/useListDrop.js.map +0 -1
- package/esm/list/useListHeight.js +0 -75
- package/esm/list/useListHeight.js.map +0 -1
- package/esm/list/useScrollPosition.js +0 -72
- package/esm/list/useScrollPosition.js.map +0 -1
- package/types/calendar/Calendar.d.ts +0 -13
- package/types/calendar/index.d.ts +0 -4
- package/types/calendar/internal/CalendarCarousel.d.ts +0 -3
- package/types/calendar/internal/CalendarContext.d.ts +0 -8
- package/types/calendar/internal/CalendarDay.d.ts +0 -14
- package/types/calendar/internal/CalendarMonth.d.ts +0 -10
- package/types/calendar/internal/CalendarNavigation.d.ts +0 -16
- package/types/calendar/internal/CalendarWeekHeader.d.ts +0 -3
- package/types/calendar/internal/useFocusManagement.d.ts +0 -9
- package/types/calendar/internal/utils.d.ts +0 -15
- package/types/calendar/useCalendar.d.ts +0 -54
- package/types/calendar/useCalendarDay.d.ts +0 -22
- package/types/calendar/useSelection.d.ts +0 -78
- package/types/column-picker/ColumnPicker.d.ts +0 -7
- package/types/column-picker/ColumnSearch.d.ts +0 -6
- package/types/column-picker/index.d.ts +0 -2
- package/types/column-picker/moving-window.d.ts +0 -14
- package/types/common-hooks/collectionProvider.d.ts +0 -13
- package/types/common-hooks/collectionTypes.d.ts +0 -58
- package/types/common-hooks/index.d.ts +0 -8
- package/types/common-hooks/isPlainObject.d.ts +0 -1
- package/types/common-hooks/itemToString.d.ts +0 -2
- package/types/common-hooks/navigationTypes.d.ts +0 -36
- package/types/common-hooks/selectionTypes.d.ts +0 -70
- package/types/common-hooks/use-resize-observer.d.ts +0 -16
- package/types/common-hooks/useCollectionItems.d.ts +0 -2
- package/types/common-hooks/useControlled.d.ts +0 -24
- package/types/common-hooks/useSelection.d.ts +0 -8
- package/types/cycle-state-button/CycleStateButton.d.ts +0 -11
- package/types/cycle-state-button/index.d.ts +0 -1
- package/types/date-input/DateInput.d.ts +0 -60
- package/types/date-input/index.d.ts +0 -1
- package/types/date-picker/DatePicker.d.ts +0 -66
- package/types/date-picker/DatePickerContext.d.ts +0 -19
- package/types/date-picker/DatePickerPanel.d.ts +0 -10
- package/types/date-picker/index.d.ts +0 -1
- package/types/drag-drop/DragDropProvider.d.ts +0 -38
- package/types/drag-drop/DragDropState.d.ts +0 -15
- package/types/drag-drop/Draggable.d.ts +0 -13
- package/types/drag-drop/DropIndicator.d.ts +0 -5
- package/types/drag-drop/dragDropTypes.d.ts +0 -100
- package/types/drag-drop/drop-target-utils.d.ts +0 -82
- package/types/drag-drop/index.d.ts +0 -6
- package/types/drag-drop/useAutoScroll.d.ts +0 -11
- package/types/drag-drop/useDragDisplacers.d.ts +0 -17
- package/types/drag-drop/useDragDrop.d.ts +0 -2
- package/types/drag-drop/useDragDropCopy.d.ts +0 -6
- package/types/drag-drop/useDragDropIndicator.d.ts +0 -2
- package/types/drag-drop/useDragDropNaturalMovement.d.ts +0 -2
- package/types/drag-drop/useDropIndicator.d.ts +0 -8
- package/types/drag-drop/useGlobalDragDrop.d.ts +0 -11
- package/types/drag-drop/useTransition.d.ts +0 -3
- package/types/editable/index.d.ts +0 -1
- package/types/editable/useEditableText.d.ts +0 -19
- package/types/editable-label/EditableLabel.d.ts +0 -19
- package/types/editable-label/index.d.ts +0 -1
- package/types/expando-input/ExpandoInput.d.ts +0 -6
- package/types/expando-input/index.d.ts +0 -1
- package/types/icon-button/Icon.d.ts +0 -6
- package/types/icon-button/IconButton.d.ts +0 -6
- package/types/icon-button/ToggleIconButton.d.ts +0 -5
- package/types/icon-button/index.d.ts +0 -3
- package/types/index.d.ts +0 -27
- package/types/instrument-picker/SearchCell.d.ts +0 -2
- package/types/instrument-picker/TablePicker.d.ts +0 -10
- package/types/instrument-picker/index.d.ts +0 -1
- package/types/instrument-picker/moving-window.d.ts +0 -14
- package/types/instrument-picker/useDataSource.d.ts +0 -6
- package/types/instrument-picker/useTablePicker.d.ts +0 -47
- package/types/list/ChevronIcon.d.ts +0 -7
- package/types/list/Highlighter.d.ts +0 -6
- package/types/list/List.d.ts +0 -6
- package/types/list/ListItem.d.ts +0 -6
- package/types/list/ListItemGroup.d.ts +0 -6
- package/types/list/ListItemHeader.d.ts +0 -5
- package/types/list/RadioIcon.d.ts +0 -4
- package/types/list/common-hooks/index.d.ts +0 -10
- package/types/list/common-hooks/keyUtils.d.ts +0 -14
- package/types/list/common-hooks/list-dom-utils.d.ts +0 -5
- package/types/list/common-hooks/useCollapsibleGroups.d.ts +0 -14
- package/types/list/common-hooks/useImperativeScrollingAPI.d.ts +0 -14
- package/types/list/common-hooks/useKeyboardNavigation.d.ts +0 -3
- package/types/list/common-hooks/useTypeahead.d.ts +0 -14
- package/types/list/common-hooks/useViewportTracking.d.ts +0 -14
- package/types/list/common-hooks/utils/collection-item-utils.d.ts +0 -21
- package/types/list/common-hooks/utils/filter-utils.d.ts +0 -4
- package/types/list/common-hooks/utils/index.d.ts +0 -4
- package/types/list/common-hooks/utils/isSelected.d.ts +0 -2
- package/types/list/index.d.ts +0 -9
- package/types/list/keyset.d.ts +0 -9
- package/types/list/listTypes.d.ts +0 -200
- package/types/list/useList.d.ts +0 -3
- package/types/list/useListDrop.d.ts +0 -15
- package/types/list/useListHeight.d.ts +0 -19
- package/types/list/useScrollPosition.d.ts +0 -19
- package/types/measured-container/MeasuredContainer.d.ts +0 -14
- package/types/measured-container/index.d.ts +0 -2
- package/types/measured-container/useMeasuredContainer.d.ts +0 -23
- package/types/measured-container/useResizeObserver.d.ts +0 -15
- package/types/overflow-container/OverflowContainer.d.ts +0 -15
- package/types/overflow-container/index.d.ts +0 -2
- package/types/overflow-container/overflow-utils.d.ts +0 -48
- package/types/overflow-container/useOverflowContainer.d.ts +0 -19
- package/types/price-ticker/PriceTicker.d.ts +0 -7
- package/types/price-ticker/index.d.ts +0 -1
- package/types/split-button/SplitButton.d.ts +0 -11
- package/types/split-button/SplitStateButton.d.ts +0 -5
- package/types/split-button/index.d.ts +0 -2
- package/types/split-button/useSplitButton.d.ts +0 -311
- package/types/table-search/SearchCell.d.ts +0 -2
- package/types/table-search/TableSearch.d.ts +0 -9
- package/types/table-search/index.d.ts +0 -1
- package/types/table-search/moving-window.d.ts +0 -14
- package/types/table-search/useTableSearch.d.ts +0 -15
- package/types/tabs-next/TabBar.d.ts +0 -12
- package/types/tabs-next/TabListNext.d.ts +0 -12
- package/types/tabs-next/TabNext.d.ts +0 -12
- package/types/tabs-next/TabNextAction.d.ts +0 -5
- package/types/tabs-next/TabNextContext.d.ts +0 -12
- package/types/tabs-next/TabNextPanel.d.ts +0 -8
- package/types/tabs-next/TabNextTrigger.d.ts +0 -5
- package/types/tabs-next/TabOverflowList.d.ts +0 -11
- package/types/tabs-next/TabsNext.d.ts +0 -17
- package/types/tabs-next/TabsNextContext.d.ts +0 -21
- package/types/tabs-next/hooks/useCollection.d.ts +0 -18
- package/types/tabs-next/hooks/useFocusOutside.d.ts +0 -2
- package/types/tabs-next/hooks/useOverflow.d.ts +0 -11
- package/types/tabs-next/index.d.ts +0 -7
- package/types/tabstrip/Tab.d.ts +0 -27
- package/types/tabstrip/TabMenu.d.ts +0 -23
- package/types/tabstrip/TabMenuOptions.d.ts +0 -10
- package/types/tabstrip/TabsTypes.d.ts +0 -127
- package/types/tabstrip/Tabstrip.d.ts +0 -2
- package/types/tabstrip/index.d.ts +0 -5
- package/types/tabstrip/tabstrip-dom-utils.d.ts +0 -2
- package/types/tabstrip/useAnimatedSelectionThumb.d.ts +0 -7
- package/types/tabstrip/useKeyboardNavigation.d.ts +0 -29
- package/types/tabstrip/useSelection.d.ts +0 -13
- package/types/tabstrip/useTabstrip.d.ts +0 -55
- package/types/toolbar/Toolbar.d.ts +0 -19
- package/types/toolbar/index.d.ts +0 -1
- package/types/toolbar/toolbar-dom-utils.d.ts +0 -3
- package/types/toolbar/useKeyboardNavigation.d.ts +0 -32
- package/types/toolbar/useSelection.d.ts +0 -22
- package/types/toolbar/useToolbar.d.ts +0 -28
- package/types/utils/deprecated-types.d.ts +0 -2
- package/types/utils/escapeRegExp.d.ts +0 -1
- package/types/utils/forwardCallbackProps.d.ts +0 -3
- package/types/utils/index.d.ts +0 -5
- package/types/utils/isOverflowElement.d.ts +0 -1
- package/types/utils/isPlainObject.d.ts +0 -1
- package/types/vuu-date-picker/VuuDatePicker.d.ts +0 -7
- package/types/vuu-date-picker/index.d.ts +0 -1
- package/types/vuu-input/VuuInput.d.ts +0 -17
- package/types/vuu-input/index.d.ts +0 -1
- package/types/vuu-typeahead-input/VuuTypeaheadInput.d.ts +0 -29
- package/types/vuu-typeahead-input/index.d.ts +0 -1
- package/types/vuu-typeahead-input/useVuuTypeaheadInput.d.ts +0 -15
package/cjs/list/useList.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useList.js","sources":["../../src/list/useList.ts"],"sourcesContent":["import { useLayoutEffectSkipFirst } from \"@vuu-ui/vuu-utils\";\nimport {\n KeyboardEvent,\n MouseEvent,\n RefCallback,\n useCallback,\n useRef,\n} from \"react\";\nimport {\n hasSelection,\n isMultiSelection,\n isSingleSelection,\n ListHandlers,\n MultiSelectionHandler,\n SelectHandler,\n SelectionStrategy,\n SingleSelectionHandler,\n} from \"../common-hooks\";\nimport { DragStartHandler, useDragDrop } from \"../drag-drop\";\nimport {\n closestListItemIndex,\n useCollapsibleGroups,\n useKeyboardNavigation,\n useSelection,\n useTypeahead,\n useViewportTracking,\n} from \"./common-hooks\";\n\nimport { ListControlProps, ListHookProps, ListHookResult } from \"./listTypes\";\nimport { useListDrop } from \"./useListDrop\";\n\nexport const useList = <Item, S extends SelectionStrategy>({\n allowDragDrop = false,\n collapsibleHeaders,\n collectionHook: dataHook,\n contentRef,\n defaultHighlightedIndex,\n defaultSelected,\n disabled,\n disableAriaActiveDescendant,\n disableHighlightOnFocus,\n disableTypeToSelect,\n highlightedIndex: highlightedIndexProp,\n id,\n label = \"\",\n listHandlers: listHandlersProp,\n onClick: onClickProp,\n onDragStart,\n onDrop,\n onHighlight,\n onKeyboardNavigation,\n onKeyDown,\n onMoveListItem,\n onSelect,\n onSelectionChange,\n restoreLastFocus,\n selected,\n selectionStrategy,\n selectionKeys,\n stickyHeaders,\n tabToSelect,\n viewportRange,\n}: ListHookProps<Item, S>): ListHookResult<Item> => {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const scrollContainerRef = useRef<HTMLDivElement | null>(null);\n\n const lastSelection = useRef<string[] | undefined>(\n selected || defaultSelected,\n );\n const handleKeyboardNavigation = (evt: KeyboardEvent, nextIndex: number) => {\n selectionHook.listHandlers.onKeyboardNavigation?.(evt, nextIndex);\n onKeyboardNavigation?.(evt, nextIndex);\n };\n\n // TODO where do these belong ?\n const handleSelect = useCallback<SelectHandler>(\n (evt, selectedId) => {\n if (onSelect) {\n if (selectedId !== null) {\n onSelect(evt, dataHook.itemById(selectedId));\n }\n }\n },\n [dataHook, onSelect],\n );\n\n const setContainerRef = useCallback<RefCallback<HTMLDivElement>>((el) => {\n if (el) {\n containerRef.current = el;\n scrollContainerRef.current = el.querySelector(\".vuuList-viewport\");\n }\n }, []);\n\n const handleSelectionChange = useCallback<MultiSelectionHandler>(\n (evt, selected) => {\n // TODO what about empty selection\n if (onSelectionChange) {\n if (isSingleSelection(selectionStrategy)) {\n const [selectedItem] = selected;\n (onSelectionChange as SingleSelectionHandler<Item>)(\n evt,\n dataHook.itemById(selectedItem),\n );\n } else if (isMultiSelection(selectionStrategy)) {\n const selectedItems = selected.map((id) => dataHook.itemById(id));\n (onSelectionChange as MultiSelectionHandler<Item>)(\n evt,\n selectedItems,\n );\n }\n }\n },\n [dataHook, onSelectionChange, selectionStrategy],\n );\n\n const {\n highlightedIndex,\n containerProps: {\n onKeyDown: navigationKeyDown,\n onMouseMove: navigationMouseMove,\n ...navigationControlProps\n },\n setHighlightedIndex,\n ...keyboardHook\n } = useKeyboardNavigation({\n containerRef: scrollContainerRef,\n defaultHighlightedIndex,\n disableHighlightOnFocus,\n highlightedIndex: highlightedIndexProp,\n itemCount: dataHook.data.length,\n label,\n onHighlight,\n onKeyboardNavigation: handleKeyboardNavigation,\n restoreLastFocus,\n selected: lastSelection.current,\n viewportItemCount: 10,\n });\n\n const collapsibleHook = useCollapsibleGroups({\n collapsibleHeaders,\n highlightedIdx: highlightedIndex,\n collectionHook: dataHook,\n });\n\n const handleDragStart = useCallback<DragStartHandler>(\n (dragDropState) => {\n setHighlightedIndex(-1);\n onDragStart?.(dragDropState);\n },\n [onDragStart, setHighlightedIndex],\n );\n\n const selectionHook = useSelection({\n containerRef,\n defaultSelected,\n highlightedIndex: highlightedIndex,\n itemQuery: \".vuuListItem\",\n label: `${label}:useList`,\n onClick: onClickProp,\n onSelect: handleSelect,\n onSelectionChange: handleSelectionChange,\n selected,\n selectionStrategy,\n selectionKeys,\n tabToSelect,\n });\n\n const { handleDrop, onDropSettle } = useListDrop<Item>({\n dataHook,\n onDrop,\n onMoveListItem,\n selected: selectionHook.selected,\n setHighlightedIndex,\n setSelected: selectionHook.setSelected,\n });\n\n const { setSelected } = selectionHook;\n useLayoutEffectSkipFirst(() => {\n if (hasSelection(lastSelection.current)) {\n setSelected([]);\n }\n }, [selected, dataHook.data, setSelected]);\n\n const {\n onMouseDown,\n isDragging,\n isScrolling: isDragDropScrolling,\n ...dragDropHook\n } = useDragDrop({\n allowDragDrop,\n draggableClassName: \"list-item\",\n orientation: \"vertical\",\n containerRef,\n id,\n itemQuery: \".vuuListItem\",\n onDragStart: handleDragStart,\n onDrop: handleDrop,\n onDropSettle,\n viewportRange,\n });\n\n const { onKeyDown: typeaheadOnKeyDown } = useTypeahead<Item>({\n disableTypeToSelect,\n highlightedIdx: highlightedIndex,\n highlightItemAtIndex: setHighlightedIndex,\n typeToNavigate: true,\n items: dataHook.data,\n });\n\n const handleKeyDown = useCallback(\n (evt: KeyboardEvent<HTMLElement>) => {\n if (!evt.defaultPrevented) {\n typeaheadOnKeyDown?.(evt);\n }\n // We still let the keyboard navigation hook process the event even\n // if it has been handled by the typeahead hook. That is so it can\n // correctly manage the focusVisible state.\n navigationKeyDown(evt);\n if (!evt.defaultPrevented) {\n selectionHook.listHandlers.onKeyDown?.(evt);\n }\n if (!evt.defaultPrevented) {\n collapsibleHook?.onKeyDown?.(evt);\n }\n\n if (!evt.defaultPrevented) {\n onKeyDown?.(evt);\n }\n },\n [\n collapsibleHook,\n navigationKeyDown,\n onKeyDown,\n selectionHook.listHandlers,\n typeaheadOnKeyDown,\n ],\n );\n\n // This is only appropriate when we are directly controlling a List,\n // not when a control is manipulating the list\n const { isScrolling: isViewportScrolling, scrollIntoView } =\n useViewportTracking({\n containerRef: scrollContainerRef,\n contentRef,\n highlightedIdx: highlightedIndex,\n indexPositions: dataHook.data,\n stickyHeaders,\n });\n\n const isScrolling =\n isViewportScrolling.current || isDragDropScrolling.current;\n\n const handleMouseMove = useCallback(\n (evt: MouseEvent) => {\n if (!isScrolling && !disabled && !isDragging) {\n navigationMouseMove();\n const idx = closestListItemIndex(evt.target as HTMLElement);\n if (idx !== -1 && idx !== highlightedIndex) {\n const item = dataHook.data[idx];\n if (!item || item.disabled) {\n setHighlightedIndex(-1);\n } else {\n setHighlightedIndex(idx);\n }\n }\n }\n },\n [\n isDragging,\n isScrolling,\n disabled,\n setHighlightedIndex,\n navigationMouseMove,\n highlightedIndex,\n dataHook.data,\n ],\n );\n\n const getActiveDescendant = () =>\n highlightedIndex === undefined ||\n highlightedIndex === -1 ||\n disableAriaActiveDescendant\n ? undefined\n : dataHook.data[highlightedIndex]?.id;\n\n // We need this on reEntry for navigation hook to handle focus\n lastSelection.current = selectionHook.selected;\n\n // controlProps ?\n const listControlProps: ListControlProps = {\n \"aria-activedescendant\": getActiveDescendant(),\n onBlur: navigationControlProps.onBlur,\n onFocus: navigationControlProps.onFocus,\n onKeyDown: handleKeyDown,\n onMouseDown: onMouseDown,\n onMouseDownCapture: navigationControlProps.onMouseDownCapture,\n onMouseLeave: navigationControlProps.onMouseLeave,\n };\n\n const listHandlers: ListHandlers = listHandlersProp || {\n onClick: selectionHook.listHandlers.onClick,\n // MouseEnter would be much better for this. There is a bug in Cypress\n // wheby it emits spurious MouseEnter (and MouseOver) events around\n // keypress events, which break many tests.\n onMouseMove: handleMouseMove,\n };\n\n return {\n containerRef,\n setContainerRef,\n focusVisible: keyboardHook.focusVisible,\n controlledHighlighting: keyboardHook.controlledHighlighting,\n highlightedIndex,\n keyboardNavigation: keyboardHook.keyboardNavigation,\n listHandlers,\n listItemHeaderHandlers: collapsibleHook,\n listControlProps,\n scrollIntoView,\n //TODO given that we firs onSelect and onSelectionCHange with Item(s), should we return Item(s) here ?\n selected: selectionHook.selected,\n setHighlightedIndex,\n setIgnoreFocus: keyboardHook.setIgnoreFocus,\n setSelected: selectionHook.setSelected,\n ...dragDropHook,\n };\n};\n"],"names":["useRef","useCallback","selected","isSingleSelection","isMultiSelection","id","useKeyboardNavigation","useCollapsibleGroups","useSelection","useListDrop","useLayoutEffectSkipFirst","hasSelection","useDragDrop","useTypeahead","useViewportTracking","closestListItemIndex"],"mappings":"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"}
|
package/cjs/list/useListDrop.js
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var React = require('react');
|
|
4
|
-
require('../common-hooks/collectionProvider.js');
|
|
5
|
-
require('../common-hooks/use-resize-observer.js');
|
|
6
|
-
var selectionTypes = require('../common-hooks/selectionTypes.js');
|
|
7
|
-
|
|
8
|
-
const useListDrop = ({
|
|
9
|
-
dataHook,
|
|
10
|
-
onDrop,
|
|
11
|
-
onMoveListItem,
|
|
12
|
-
selected,
|
|
13
|
-
setHighlightedIndex,
|
|
14
|
-
setSelected
|
|
15
|
-
}) => {
|
|
16
|
-
const selectedByIndexRef = React.useRef([]);
|
|
17
|
-
const dataHookRef = React.useRef(dataHook);
|
|
18
|
-
dataHookRef.current = dataHook;
|
|
19
|
-
const adjustIndex = React.useCallback(
|
|
20
|
-
(index, fromIndex, toIndex) => {
|
|
21
|
-
if (index === fromIndex) {
|
|
22
|
-
return toIndex;
|
|
23
|
-
} else if (index < Math.min(fromIndex, toIndex) || index > Math.max(fromIndex, toIndex)) {
|
|
24
|
-
return index;
|
|
25
|
-
}
|
|
26
|
-
if (fromIndex < index) {
|
|
27
|
-
return index - 1;
|
|
28
|
-
} else {
|
|
29
|
-
return index + 1;
|
|
30
|
-
}
|
|
31
|
-
},
|
|
32
|
-
[]
|
|
33
|
-
);
|
|
34
|
-
const reorderSelectedIndices = React.useCallback(
|
|
35
|
-
(selected2, fromIndex, toIndex) => {
|
|
36
|
-
const selectedIndices = selected2.map(
|
|
37
|
-
(id) => dataHookRef.current.indexOfItemById(id)
|
|
38
|
-
);
|
|
39
|
-
return selectedIndices.map(
|
|
40
|
-
(item) => adjustIndex(item, fromIndex, toIndex)
|
|
41
|
-
);
|
|
42
|
-
},
|
|
43
|
-
[adjustIndex]
|
|
44
|
-
);
|
|
45
|
-
const handleDrop = React.useCallback(
|
|
46
|
-
(options) => {
|
|
47
|
-
const { fromIndex, toIndex } = options;
|
|
48
|
-
if (selectionTypes.hasSelection(selected)) {
|
|
49
|
-
selectedByIndexRef.current = reorderSelectedIndices(
|
|
50
|
-
selected,
|
|
51
|
-
fromIndex,
|
|
52
|
-
toIndex
|
|
53
|
-
);
|
|
54
|
-
}
|
|
55
|
-
if (options.isExternal) {
|
|
56
|
-
onDrop?.(options);
|
|
57
|
-
} else {
|
|
58
|
-
onMoveListItem?.(fromIndex, toIndex);
|
|
59
|
-
}
|
|
60
|
-
setHighlightedIndex(-1);
|
|
61
|
-
},
|
|
62
|
-
[
|
|
63
|
-
selected,
|
|
64
|
-
setHighlightedIndex,
|
|
65
|
-
reorderSelectedIndices,
|
|
66
|
-
onDrop,
|
|
67
|
-
onMoveListItem
|
|
68
|
-
]
|
|
69
|
-
);
|
|
70
|
-
const handleDropSettle = React.useCallback(
|
|
71
|
-
(toIndex) => {
|
|
72
|
-
setHighlightedIndex(toIndex);
|
|
73
|
-
},
|
|
74
|
-
[setHighlightedIndex]
|
|
75
|
-
);
|
|
76
|
-
React.useEffect(() => {
|
|
77
|
-
const { current: selectedByIndex } = selectedByIndexRef;
|
|
78
|
-
if (selectionTypes.hasSelection(selectedByIndex)) {
|
|
79
|
-
selectedByIndexRef.current = [];
|
|
80
|
-
const postDropSelected = Array.isArray(selectedByIndex) ? selectedByIndex.map((i) => dataHook.data[i].id) : dataHook.data[selectedByIndex].id;
|
|
81
|
-
selectedByIndexRef.current = [];
|
|
82
|
-
setSelected(postDropSelected);
|
|
83
|
-
}
|
|
84
|
-
}, [dataHook.data, setSelected]);
|
|
85
|
-
return {
|
|
86
|
-
handleDrop,
|
|
87
|
-
onDropSettle: handleDropSettle
|
|
88
|
-
};
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
exports.useListDrop = useListDrop;
|
|
92
|
-
//# sourceMappingURL=useListDrop.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useListDrop.js","sources":["../../src/list/useListDrop.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from \"react\";\nimport { CollectionHookResult, hasSelection } from \"../common-hooks\";\nimport { DropHandler } from \"../drag-drop\";\nimport { MoveItemHandler } from \"./listTypes\";\n\nexport interface ListDropProps<Item = string> {\n dataHook: CollectionHookResult<Item>;\n onDrop?: DropHandler;\n onMoveListItem?: MoveItemHandler;\n selected: string[];\n setHighlightedIndex: (idx: number) => void;\n setSelected: (selected: string[]) => void;\n}\n\nexport const useListDrop = <Item>({\n dataHook,\n onDrop,\n onMoveListItem,\n selected,\n setHighlightedIndex,\n setSelected,\n}: ListDropProps<Item>) => {\n // Used to preserve selection across a drop event.\n const selectedByIndexRef = useRef<number[]>([]);\n\n /** prevent recreating reorderSelectedIndices when dataHook changes */\n const dataHookRef = useRef(dataHook);\n dataHookRef.current = dataHook;\n\n const adjustIndex = useCallback(\n (index: number, fromIndex: number, toIndex: number) => {\n if (index === fromIndex) {\n return toIndex;\n } else if (\n index < Math.min(fromIndex, toIndex) ||\n index > Math.max(fromIndex, toIndex)\n ) {\n return index;\n }\n if (fromIndex < index) {\n return index - 1;\n } else {\n return index + 1;\n }\n },\n []\n );\n\n // Used after a drop event, to calculate wht the new selected indices will be\n const reorderSelectedIndices = useCallback(\n (selected: string[], fromIndex: number, toIndex: number) => {\n const selectedIndices = selected.map((id) =>\n dataHookRef.current.indexOfItemById(id)\n );\n return selectedIndices.map((item) =>\n adjustIndex(item, fromIndex, toIndex)\n );\n },\n [adjustIndex]\n );\n\n const handleDrop = useCallback<DropHandler>(\n (options) => {\n const { fromIndex, toIndex } = options;\n if (hasSelection(selected)) {\n selectedByIndexRef.current = reorderSelectedIndices(\n selected,\n fromIndex,\n toIndex\n );\n }\n\n if (options.isExternal) {\n onDrop?.(options);\n } else {\n onMoveListItem?.(fromIndex, toIndex);\n }\n setHighlightedIndex(-1);\n },\n [\n selected,\n setHighlightedIndex,\n reorderSelectedIndices,\n onDrop,\n onMoveListItem,\n ]\n );\n\n const handleDropSettle = useCallback(\n (toIndex: number) => {\n setHighlightedIndex(toIndex);\n },\n [setHighlightedIndex]\n );\n\n useEffect(() => {\n const { current: selectedByIndex } = selectedByIndexRef;\n if (hasSelection(selectedByIndex)) {\n selectedByIndexRef.current = [];\n const postDropSelected = Array.isArray(selectedByIndex)\n ? selectedByIndex.map((i) => dataHook.data[i].id)\n : dataHook.data[selectedByIndex].id;\n\n selectedByIndexRef.current = [];\n // TODO gave up trying to figure out how to type this correctly\n setSelected(postDropSelected as any);\n }\n }, [dataHook.data, setSelected]);\n\n return {\n handleDrop,\n onDropSettle: handleDropSettle,\n };\n};\n"],"names":["useRef","useCallback","selected","hasSelection","useEffect"],"mappings":"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"}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var React = require('react');
|
|
4
|
-
require('../common-hooks/collectionProvider.js');
|
|
5
|
-
var useResizeObserver = require('../common-hooks/use-resize-observer.js');
|
|
6
|
-
|
|
7
|
-
const getContentHeight = (itemCount, itemHeight, itemGapSize = 0) => {
|
|
8
|
-
if (itemCount === 0) {
|
|
9
|
-
return 0;
|
|
10
|
-
} else if (itemGapSize === 0) {
|
|
11
|
-
return itemCount * itemHeight;
|
|
12
|
-
} else {
|
|
13
|
-
return itemCount - 1 * (itemHeight + itemGapSize) + itemHeight;
|
|
14
|
-
}
|
|
15
|
-
};
|
|
16
|
-
const useListHeight = ({
|
|
17
|
-
displayedItemCount,
|
|
18
|
-
getItemHeight,
|
|
19
|
-
// TODO no need to incur the cost of a resizeObserver if height is explicit
|
|
20
|
-
height,
|
|
21
|
-
itemCount,
|
|
22
|
-
itemGapSize,
|
|
23
|
-
itemHeight: itemHeightProp = 36,
|
|
24
|
-
size
|
|
25
|
-
}) => {
|
|
26
|
-
const [measuredItemHeight, setMeasuredItemHeight] = React.useState(itemHeightProp);
|
|
27
|
-
const [, forceUpdate] = React.useState({});
|
|
28
|
-
const proxyItemRef = React.useRef(null);
|
|
29
|
-
const [contentHeight, computedListHeight] = React.useMemo(() => {
|
|
30
|
-
let result = 0;
|
|
31
|
-
const itemHeight = measuredItemHeight ?? itemHeightProp;
|
|
32
|
-
const contentHeight2 = getContentHeight(itemCount, itemHeight, itemGapSize);
|
|
33
|
-
if (height !== void 0) {
|
|
34
|
-
return [contentHeight2, void 0];
|
|
35
|
-
}
|
|
36
|
-
const preferredItemCount = Math.min(displayedItemCount, itemCount) || displayedItemCount;
|
|
37
|
-
if (typeof getItemHeight === "function") {
|
|
38
|
-
result += Array(preferredItemCount).fill(0).reduce(
|
|
39
|
-
(total, _, index) => total + getItemHeight(index) + itemGapSize,
|
|
40
|
-
0
|
|
41
|
-
) - // We don't want gap after the last item
|
|
42
|
-
itemGapSize;
|
|
43
|
-
} else {
|
|
44
|
-
result += preferredItemCount * Number(itemHeight) + (preferredItemCount - 1) * itemGapSize;
|
|
45
|
-
}
|
|
46
|
-
const listHeight = result;
|
|
47
|
-
return [contentHeight2, listHeight];
|
|
48
|
-
}, [
|
|
49
|
-
displayedItemCount,
|
|
50
|
-
getItemHeight,
|
|
51
|
-
height,
|
|
52
|
-
itemCount,
|
|
53
|
-
itemGapSize,
|
|
54
|
-
itemHeightProp,
|
|
55
|
-
measuredItemHeight
|
|
56
|
-
]);
|
|
57
|
-
const handleRowHeight = React.useCallback(({ height: height2 }) => {
|
|
58
|
-
if (typeof height2 === "number") {
|
|
59
|
-
setMeasuredItemHeight(height2);
|
|
60
|
-
}
|
|
61
|
-
}, []);
|
|
62
|
-
const rowHeightProxyRef = React.useCallback((el) => {
|
|
63
|
-
proxyItemRef.current = el;
|
|
64
|
-
forceUpdate({});
|
|
65
|
-
}, []);
|
|
66
|
-
useResizeObserver.useResizeObserver(proxyItemRef, useResizeObserver.HeightOnly, handleRowHeight, true);
|
|
67
|
-
return {
|
|
68
|
-
computedListHeight,
|
|
69
|
-
contentHeight,
|
|
70
|
-
listClientHeight: size?.height,
|
|
71
|
-
listItemHeight: measuredItemHeight,
|
|
72
|
-
rowHeightProxyRef
|
|
73
|
-
};
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
exports.useListHeight = useListHeight;
|
|
77
|
-
//# sourceMappingURL=useListHeight.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useListHeight.js","sources":["../../src/list/useListHeight.ts"],"sourcesContent":["import { RefCallback, useCallback, useMemo, useRef, useState } from \"react\";\nimport { HeightOnly, ResizeHandler, useResizeObserver } from \"../common-hooks\";\nimport { MeasuredSize } from \"../measured-container\";\n\nexport interface ListHeightHookProps {\n displayedItemCount: number;\n getItemHeight?: (index: number) => number;\n height?: number | string;\n itemCount: number;\n itemGapSize: number;\n itemHeight?: number;\n size: MeasuredSize | undefined;\n}\n\nexport interface HeightHookResult {\n computedListHeight: number | undefined;\n contentHeight: number;\n listClientHeight?: number;\n listItemHeight: number;\n rowHeightProxyRef: RefCallback<HTMLDivElement>;\n}\n\nconst getContentHeight = (\n itemCount: number,\n itemHeight: number,\n itemGapSize = 0,\n) => {\n if (itemCount === 0) {\n return 0;\n } else if (itemGapSize === 0) {\n return itemCount * itemHeight;\n } else {\n return itemCount - 1 * (itemHeight + itemGapSize) + itemHeight;\n }\n};\n\nexport const useListHeight = ({\n displayedItemCount,\n getItemHeight,\n // TODO no need to incur the cost of a resizeObserver if height is explicit\n height,\n itemCount,\n itemGapSize,\n itemHeight: itemHeightProp = 36,\n size,\n}: ListHeightHookProps): HeightHookResult => {\n // TODO default by density\n const [measuredItemHeight, setMeasuredItemHeight] =\n useState<number>(itemHeightProp);\n // Not 100% sure why we need this forceUpdate\n const [, forceUpdate] = useState({});\n // This is a ref to the 'item proxy' a hiden list item used to detect css driven\n // size changes (e.g. runtime density switch)\n const proxyItemRef = useRef<HTMLDivElement | null>(null);\n\n const [contentHeight, computedListHeight] = useMemo(() => {\n let result = 0;\n const itemHeight = measuredItemHeight ?? itemHeightProp;\n const contentHeight = getContentHeight(itemCount, itemHeight, itemGapSize);\n if (height !== undefined) {\n // TODO if this is a percentage, convert to number\n return [contentHeight, undefined];\n }\n\n // if there are 0 items we render with the preferred count\n const preferredItemCount =\n Math.min(displayedItemCount, itemCount) || displayedItemCount;\n\n if (typeof getItemHeight === \"function\") {\n result +=\n Array(preferredItemCount)\n .fill(0)\n .reduce<number>(\n (total, _, index) => total + getItemHeight(index) + itemGapSize,\n 0,\n ) -\n // We don't want gap after the last item\n itemGapSize;\n } else {\n result +=\n preferredItemCount * Number(itemHeight) +\n (preferredItemCount - 1) * itemGapSize;\n }\n\n const listHeight = result;\n\n return [contentHeight, listHeight];\n }, [\n displayedItemCount,\n getItemHeight,\n height,\n itemCount,\n itemGapSize,\n itemHeightProp,\n measuredItemHeight,\n ]);\n\n const handleRowHeight: ResizeHandler = useCallback(({ height }) => {\n if (typeof height === \"number\") {\n setMeasuredItemHeight(height);\n }\n }, []);\n\n const rowHeightProxyRef = useCallback<RefCallback<HTMLDivElement>>((el) => {\n proxyItemRef.current = el;\n forceUpdate({});\n }, []);\n\n useResizeObserver(proxyItemRef, HeightOnly, handleRowHeight, true);\n\n return {\n computedListHeight,\n contentHeight,\n listClientHeight: size?.height,\n listItemHeight: measuredItemHeight,\n rowHeightProxyRef,\n };\n};\n"],"names":["useState","useRef","useMemo","contentHeight","useCallback","height","useResizeObserver","HeightOnly"],"mappings":"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"}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var core = require('@salt-ds/core');
|
|
4
|
-
var React = require('react');
|
|
5
|
-
|
|
6
|
-
const getRange = (scrollPos, height, itemCount, itemHeight) => {
|
|
7
|
-
const viewportRowCount = Math.ceil(height / itemHeight);
|
|
8
|
-
const from = Math.floor(scrollPos / itemHeight);
|
|
9
|
-
const to = Math.ceil(from + viewportRowCount - 1);
|
|
10
|
-
return {
|
|
11
|
-
atStart: from === 0,
|
|
12
|
-
atEnd: to === itemCount - 1,
|
|
13
|
-
from,
|
|
14
|
-
to
|
|
15
|
-
};
|
|
16
|
-
};
|
|
17
|
-
const useScrollPosition = ({
|
|
18
|
-
containerSize: listHeight,
|
|
19
|
-
itemCount: listItemCount,
|
|
20
|
-
itemGapSize: listItemGapSize = 0,
|
|
21
|
-
itemSize: listItemHeight,
|
|
22
|
-
onViewportScroll
|
|
23
|
-
}) => {
|
|
24
|
-
const firstVisibleRowRef = React.useRef(0);
|
|
25
|
-
const lastVisibleRowRef = React.useRef(0);
|
|
26
|
-
const scrollPosRef = React.useRef(0);
|
|
27
|
-
const range = React.useMemo(() => {
|
|
28
|
-
return getRange(
|
|
29
|
-
scrollPosRef.current,
|
|
30
|
-
listHeight,
|
|
31
|
-
listItemCount,
|
|
32
|
-
listItemHeight + listItemGapSize
|
|
33
|
-
);
|
|
34
|
-
}, [listHeight, listItemCount, listItemHeight, listItemGapSize]);
|
|
35
|
-
const [viewportRange, setViewportRange] = React.useState(range);
|
|
36
|
-
core.useIsomorphicLayoutEffect(() => {
|
|
37
|
-
setViewportRange(range);
|
|
38
|
-
}, [range]);
|
|
39
|
-
const handleVerticalScroll = React.useCallback(
|
|
40
|
-
(e) => {
|
|
41
|
-
const scrollTop = e.target.scrollTop;
|
|
42
|
-
if (scrollTop !== scrollPosRef.current) {
|
|
43
|
-
scrollPosRef.current = scrollTop;
|
|
44
|
-
const itemHeight = listItemHeight + listItemGapSize;
|
|
45
|
-
const range2 = getRange(
|
|
46
|
-
scrollTop,
|
|
47
|
-
listHeight,
|
|
48
|
-
listItemCount,
|
|
49
|
-
itemHeight
|
|
50
|
-
);
|
|
51
|
-
if (range2.from !== firstVisibleRowRef.current || range2.to !== lastVisibleRowRef.current) {
|
|
52
|
-
firstVisibleRowRef.current = range2.from;
|
|
53
|
-
lastVisibleRowRef.current = range2.to;
|
|
54
|
-
onViewportScroll?.(range2.from, range2.to);
|
|
55
|
-
setViewportRange(range2);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
},
|
|
59
|
-
[
|
|
60
|
-
listItemHeight,
|
|
61
|
-
listItemGapSize,
|
|
62
|
-
listHeight,
|
|
63
|
-
listItemCount,
|
|
64
|
-
onViewportScroll
|
|
65
|
-
]
|
|
66
|
-
);
|
|
67
|
-
return {
|
|
68
|
-
onVerticalScroll: handleVerticalScroll,
|
|
69
|
-
viewportRange
|
|
70
|
-
};
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
exports.useScrollPosition = useScrollPosition;
|
|
74
|
-
//# sourceMappingURL=useScrollPosition.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useScrollPosition.js","sources":["../../src/list/useScrollPosition.ts"],"sourcesContent":["import { useIsomorphicLayoutEffect } from \"@salt-ds/core\";\nimport { UIEvent, useCallback, useMemo, useRef, useState } from \"react\";\n\nexport type ViewportRange = {\n atEnd: boolean;\n atStart: boolean;\n from: number;\n to: number;\n};\n\ninterface ScrollPositionHookProps {\n containerSize: number;\n itemCount: number;\n itemGapSize?: number;\n itemSize: number;\n onViewportScroll?: (\n firstVisibleItemIndex: number,\n lastVisibleitemIndex: number\n ) => void;\n}\n\nconst getRange = (\n scrollPos: number,\n height: number,\n itemCount: number,\n itemHeight: number\n): ViewportRange => {\n const viewportRowCount = Math.ceil(height / itemHeight);\n const from = Math.floor(scrollPos / itemHeight);\n const to = Math.ceil(from + viewportRowCount - 1);\n return {\n atStart: from === 0,\n atEnd: to === itemCount - 1,\n from,\n to,\n };\n};\n\nexport const useScrollPosition = ({\n containerSize: listHeight,\n itemCount: listItemCount,\n itemGapSize: listItemGapSize = 0,\n itemSize: listItemHeight,\n onViewportScroll,\n}: ScrollPositionHookProps) => {\n const firstVisibleRowRef = useRef(0);\n const lastVisibleRowRef = useRef(0);\n const scrollPosRef = useRef(0);\n\n const range = useMemo(() => {\n return getRange(\n scrollPosRef.current,\n listHeight,\n listItemCount,\n listItemHeight + listItemGapSize\n );\n }, [listHeight, listItemCount, listItemHeight, listItemGapSize]);\n\n const [viewportRange, setViewportRange] = useState<ViewportRange>(range);\n\n useIsomorphicLayoutEffect(() => {\n setViewportRange(range);\n }, [range]);\n\n const handleVerticalScroll = useCallback(\n (e: UIEvent<HTMLElement>) => {\n const scrollTop = (e.target as HTMLElement).scrollTop;\n if (scrollTop !== scrollPosRef.current) {\n scrollPosRef.current = scrollTop;\n const itemHeight = listItemHeight + listItemGapSize;\n const range = getRange(\n scrollTop,\n listHeight,\n listItemCount,\n itemHeight\n );\n if (\n range.from !== firstVisibleRowRef.current ||\n range.to !== lastVisibleRowRef.current\n ) {\n firstVisibleRowRef.current = range.from;\n lastVisibleRowRef.current = range.to;\n onViewportScroll?.(range.from, range.to);\n setViewportRange(range);\n }\n }\n },\n [\n listItemHeight,\n listItemGapSize,\n listHeight,\n listItemCount,\n onViewportScroll,\n ]\n );\n\n return {\n onVerticalScroll: handleVerticalScroll,\n viewportRange,\n };\n};\n"],"names":["useRef","useMemo","useState","useIsomorphicLayoutEffect","useCallback","range"],"mappings":";;;;;AAqBA,MAAM,QAAW,GAAA,CACf,SACA,EAAA,MAAA,EACA,WACA,UACkB,KAAA;AAClB,EAAA,MAAM,gBAAmB,GAAA,IAAA,CAAK,IAAK,CAAA,MAAA,GAAS,UAAU,CAAA;AACtD,EAAA,MAAM,IAAO,GAAA,IAAA,CAAK,KAAM,CAAA,SAAA,GAAY,UAAU,CAAA;AAC9C,EAAA,MAAM,EAAK,GAAA,IAAA,CAAK,IAAK,CAAA,IAAA,GAAO,mBAAmB,CAAC,CAAA;AAChD,EAAO,OAAA;AAAA,IACL,SAAS,IAAS,KAAA,CAAA;AAAA,IAClB,KAAA,EAAO,OAAO,SAAY,GAAA,CAAA;AAAA,IAC1B,IAAA;AAAA,IACA;AAAA,GACF;AACF,CAAA;AAEO,MAAM,oBAAoB,CAAC;AAAA,EAChC,aAAe,EAAA,UAAA;AAAA,EACf,SAAW,EAAA,aAAA;AAAA,EACX,aAAa,eAAkB,GAAA,CAAA;AAAA,EAC/B,QAAU,EAAA,cAAA;AAAA,EACV;AACF,CAA+B,KAAA;AAC7B,EAAM,MAAA,kBAAA,GAAqBA,aAAO,CAAC,CAAA;AACnC,EAAM,MAAA,iBAAA,GAAoBA,aAAO,CAAC,CAAA;AAClC,EAAM,MAAA,YAAA,GAAeA,aAAO,CAAC,CAAA;AAE7B,EAAM,MAAA,KAAA,GAAQC,cAAQ,MAAM;AAC1B,IAAO,OAAA,QAAA;AAAA,MACL,YAAa,CAAA,OAAA;AAAA,MACb,UAAA;AAAA,MACA,aAAA;AAAA,MACA,cAAiB,GAAA;AAAA,KACnB;AAAA,KACC,CAAC,UAAA,EAAY,aAAe,EAAA,cAAA,EAAgB,eAAe,CAAC,CAAA;AAE/D,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIC,eAAwB,KAAK,CAAA;AAEvE,EAAAC,8BAAA,CAA0B,MAAM;AAC9B,IAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,GACxB,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,oBAAuB,GAAAC,iBAAA;AAAA,IAC3B,CAAC,CAA4B,KAAA;AAC3B,MAAM,MAAA,SAAA,GAAa,EAAE,MAAuB,CAAA,SAAA;AAC5C,MAAI,IAAA,SAAA,KAAc,aAAa,OAAS,EAAA;AACtC,QAAA,YAAA,CAAa,OAAU,GAAA,SAAA;AACvB,QAAA,MAAM,aAAa,cAAiB,GAAA,eAAA;AACpC,QAAA,MAAMC,MAAQ,GAAA,QAAA;AAAA,UACZ,SAAA;AAAA,UACA,UAAA;AAAA,UACA,aAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IACEA,OAAM,IAAS,KAAA,kBAAA,CAAmB,WAClCA,MAAM,CAAA,EAAA,KAAO,kBAAkB,OAC/B,EAAA;AACA,UAAA,kBAAA,CAAmB,UAAUA,MAAM,CAAA,IAAA;AACnC,UAAA,iBAAA,CAAkB,UAAUA,MAAM,CAAA,EAAA;AAClC,UAAmBA,gBAAAA,GAAAA,MAAAA,CAAM,IAAMA,EAAAA,MAAAA,CAAM,EAAE,CAAA;AACvC,UAAA,gBAAA,CAAiBA,MAAK,CAAA;AAAA;AACxB;AACF,KACF;AAAA,IACA;AAAA,MACE,cAAA;AAAA,MACA,eAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAO,OAAA;AAAA,IACL,gBAAkB,EAAA,oBAAA;AAAA,IAClB;AAAA,GACF;AACF;;;;"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { createContext, cloneElement, useContext } from 'react';
|
|
3
|
-
|
|
4
|
-
const CollectionContext = createContext(void 0);
|
|
5
|
-
function CollectionProvider({
|
|
6
|
-
children,
|
|
7
|
-
collectionHook,
|
|
8
|
-
...props
|
|
9
|
-
}) {
|
|
10
|
-
return /* @__PURE__ */ jsx(CollectionContext.Provider, { value: collectionHook, children: Object.keys(props).length > 0 ? cloneElement(children, props) : children });
|
|
11
|
-
}
|
|
12
|
-
function useCollection() {
|
|
13
|
-
const collection = useContext(CollectionContext);
|
|
14
|
-
if (collection) {
|
|
15
|
-
return collection;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export { CollectionContext, CollectionProvider, useCollection };
|
|
20
|
-
//# sourceMappingURL=collectionProvider.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"collectionProvider.js","sources":["../../src/common-hooks/collectionProvider.tsx"],"sourcesContent":["import { cloneElement, createContext, ReactElement, useContext } from \"react\";\nimport { CollectionHookResult } from \"./collectionTypes\";\n\nexport interface collectionContext<T> {\n collection: CollectionHookResult<T>;\n}\n\nexport const CollectionContext = createContext<\n CollectionHookResult<any> | undefined\n>(undefined);\n\ninterface ContextProviderProps<Item> {\n children: ReactElement;\n collectionHook: CollectionHookResult<Item>;\n}\n\nexport function CollectionProvider<Item>({\n children,\n collectionHook,\n ...props\n}: ContextProviderProps<Item>) {\n return (\n <CollectionContext.Provider value={collectionHook}>\n {Object.keys(props).length > 0 ? cloneElement(children, props) : children}\n </CollectionContext.Provider>\n );\n}\n\nexport function useCollection<Item>(): CollectionHookResult<Item> | undefined {\n const collection = useContext(CollectionContext);\n if (collection) {\n return collection as CollectionHookResult<Item>;\n }\n}\n"],"names":[],"mappings":";;;AAOa,MAAA,iBAAA,GAAoB,cAE/B,KAAS,CAAA;AAOJ,SAAS,kBAAyB,CAAA;AAAA,EACvC,QAAA;AAAA,EACA,cAAA;AAAA,EACA,GAAG;AACL,CAA+B,EAAA;AAC7B,EAAA,2BACG,iBAAkB,CAAA,QAAA,EAAlB,EAA2B,KAAA,EAAO,gBAChC,QAAO,EAAA,MAAA,CAAA,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,CAAI,GAAA,YAAA,CAAa,QAAU,EAAA,KAAK,IAAI,QACnE,EAAA,CAAA;AAEJ;AAEO,SAAS,aAA8D,GAAA;AAC5E,EAAM,MAAA,UAAA,GAAa,WAAW,iBAAiB,CAAA;AAC/C,EAAA,IAAI,UAAY,EAAA;AACd,IAAO,OAAA,UAAA;AAAA;AAEX;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"isPlainObject.js","sources":["../../src/common-hooks/isPlainObject.ts"],"sourcesContent":["export const isPlainObject = (obj: unknown) =>\n Object.prototype.toString.call(obj) === \"[object Object]\";\n"],"names":[],"mappings":"AAAa,MAAA,aAAA,GAAgB,CAAC,GAC5B,KAAA,MAAA,CAAO,UAAU,QAAS,CAAA,IAAA,CAAK,GAAG,CAAM,KAAA;;;;"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { isPlainObject } from './isPlainObject.js';
|
|
2
|
-
|
|
3
|
-
function itemToString(item) {
|
|
4
|
-
if (typeof item === "string") {
|
|
5
|
-
return item;
|
|
6
|
-
} else if (!isPlainObject(item)) {
|
|
7
|
-
return String(item);
|
|
8
|
-
}
|
|
9
|
-
if (Object.prototype.hasOwnProperty.call(item, "label")) {
|
|
10
|
-
return String(item.label);
|
|
11
|
-
}
|
|
12
|
-
console.warn(
|
|
13
|
-
[
|
|
14
|
-
"itemToString: you've likely forgotten to set the label prop on the item object.",
|
|
15
|
-
"You can also provide your own `itemToString` implementation."
|
|
16
|
-
].join("\n")
|
|
17
|
-
);
|
|
18
|
-
return "";
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export { itemToString };
|
|
22
|
-
//# sourceMappingURL=itemToString.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"itemToString.js","sources":["../../src/common-hooks/itemToString.ts"],"sourcesContent":["import { isPlainObject } from \"./isPlainObject\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ItemToStringFunction = (item: any) => string;\n\nexport function itemToString(item: unknown): string {\n if (typeof item === \"string\") {\n return item;\n } else if (!isPlainObject(item)) {\n return String(item);\n }\n\n if (Object.prototype.hasOwnProperty.call(item, \"label\")) {\n return String((item as { label?: string }).label);\n }\n\n console.warn(\n [\n \"itemToString: you've likely forgotten to set the label prop on the item object.\",\n \"You can also provide your own `itemToString` implementation.\",\n ].join(\"\\n\")\n );\n\n return \"\";\n}\n"],"names":[],"mappings":";;AAKO,SAAS,aAAa,IAAuB,EAAA;AAClD,EAAI,IAAA,OAAO,SAAS,QAAU,EAAA;AAC5B,IAAO,OAAA,IAAA;AAAA,GACE,MAAA,IAAA,CAAC,aAAc,CAAA,IAAI,CAAG,EAAA;AAC/B,IAAA,OAAO,OAAO,IAAI,CAAA;AAAA;AAGpB,EAAA,IAAI,OAAO,SAAU,CAAA,cAAA,CAAe,IAAK,CAAA,IAAA,EAAM,OAAO,CAAG,EAAA;AACvD,IAAO,OAAA,MAAA,CAAQ,KAA4B,KAAK,CAAA;AAAA;AAGlD,EAAQ,OAAA,CAAA,IAAA;AAAA,IACN;AAAA,MACE,iFAAA;AAAA,MACA;AAAA,KACF,CAAE,KAAK,IAAI;AAAA,GACb;AAEA,EAAO,OAAA,EAAA;AACT;;;;"}
|