@deephaven/components 0.5.2-beta.0 → 0.6.1-demo.8

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.
Files changed (119) hide show
  1. package/dist/AutoCompleteInput.js +410 -448
  2. package/dist/AutoCompleteInput.js.map +1 -1
  3. package/dist/AutoResizeTextarea.js +17 -46
  4. package/dist/AutoResizeTextarea.js.map +1 -1
  5. package/dist/BasicModal.js +18 -19
  6. package/dist/BasicModal.js.map +1 -1
  7. package/dist/Button.js +30 -21
  8. package/dist/Button.js.map +1 -1
  9. package/dist/ButtonGroup.js +6 -4
  10. package/dist/ButtonGroup.js.map +1 -1
  11. package/dist/ButtonOld.js +10 -8
  12. package/dist/ButtonOld.js.map +1 -1
  13. package/dist/CardFlip.js +10 -8
  14. package/dist/CardFlip.js.map +1 -1
  15. package/dist/Checkbox.js +18 -31
  16. package/dist/Checkbox.js.map +1 -1
  17. package/dist/Collapse.js +65 -105
  18. package/dist/Collapse.js.map +1 -1
  19. package/dist/ComboBox.js +432 -460
  20. package/dist/ComboBox.js.map +1 -1
  21. package/dist/CustomTimeSelect.js +485 -517
  22. package/dist/CustomTimeSelect.js.map +1 -1
  23. package/dist/DebouncedSearchInput.js +61 -91
  24. package/dist/DebouncedSearchInput.js.map +1 -1
  25. package/dist/DeephavenSpinner.js +6 -6
  26. package/dist/DeephavenSpinner.js.map +1 -1
  27. package/dist/DragUtils.js +65 -113
  28. package/dist/DragUtils.js.map +1 -1
  29. package/dist/DraggableItemList.d.ts +1 -0
  30. package/dist/DraggableItemList.d.ts.map +1 -1
  31. package/dist/DraggableItemList.js +219 -257
  32. package/dist/DraggableItemList.js.map +1 -1
  33. package/dist/HierarchicalCheckboxMenu.js +160 -227
  34. package/dist/HierarchicalCheckboxMenu.js.map +1 -1
  35. package/dist/ItemList.d.ts +4 -2
  36. package/dist/ItemList.d.ts.map +1 -1
  37. package/dist/ItemList.js +595 -598
  38. package/dist/ItemList.js.map +1 -1
  39. package/dist/ItemListItem.js +194 -215
  40. package/dist/ItemListItem.js.map +1 -1
  41. package/dist/LoadingOverlay.js +9 -10
  42. package/dist/LoadingOverlay.js.map +1 -1
  43. package/dist/LoadingSpinner.js +4 -3
  44. package/dist/LoadingSpinner.js.map +1 -1
  45. package/dist/MaskedInput.js +59 -70
  46. package/dist/MaskedInput.js.map +1 -1
  47. package/dist/Option.js +5 -3
  48. package/dist/Option.js.map +1 -1
  49. package/dist/RadioGroup.js +16 -34
  50. package/dist/RadioGroup.js.map +1 -1
  51. package/dist/RadioItem.js +14 -33
  52. package/dist/RadioItem.js.map +1 -1
  53. package/dist/SearchInput.js +42 -75
  54. package/dist/SearchInput.js.map +1 -1
  55. package/dist/Select.js +10 -8
  56. package/dist/Select.js.map +1 -1
  57. package/dist/SelectValueList.js +97 -134
  58. package/dist/SelectValueList.js.map +1 -1
  59. package/dist/SocketedButton.js +13 -11
  60. package/dist/SocketedButton.js.map +1 -1
  61. package/dist/ThemeExport.js.map +1 -1
  62. package/dist/TimeInput.js +16 -53
  63. package/dist/TimeInput.js.map +1 -1
  64. package/dist/TimeSlider.js +62 -88
  65. package/dist/TimeSlider.js.map +1 -1
  66. package/dist/ToastNotification.js +14 -13
  67. package/dist/ToastNotification.js.map +1 -1
  68. package/dist/UISwitch.js +9 -8
  69. package/dist/UISwitch.js.map +1 -1
  70. package/dist/context-actions/ContextActionUtils.js +173 -231
  71. package/dist/context-actions/ContextActionUtils.js.map +1 -1
  72. package/dist/context-actions/ContextActions.js +135 -177
  73. package/dist/context-actions/ContextActions.js.map +1 -1
  74. package/dist/context-actions/ContextMenu.js +509 -543
  75. package/dist/context-actions/ContextMenu.js.map +1 -1
  76. package/dist/context-actions/ContextMenuItem.js +32 -22
  77. package/dist/context-actions/ContextMenuItem.js.map +1 -1
  78. package/dist/context-actions/ContextMenuRoot.js +112 -152
  79. package/dist/context-actions/ContextMenuRoot.js.map +1 -1
  80. package/dist/context-actions/GlobalContextAction.js +49 -84
  81. package/dist/context-actions/GlobalContextAction.js.map +1 -1
  82. package/dist/context-actions/GlobalContextActions.js +25 -57
  83. package/dist/context-actions/GlobalContextActions.js.map +1 -1
  84. package/dist/context-actions/index.js +4 -4
  85. package/dist/context-actions/index.js.map +1 -1
  86. package/dist/index.js +39 -39
  87. package/dist/index.js.map +1 -1
  88. package/dist/menu-actions/DropdownMenu.js +126 -159
  89. package/dist/menu-actions/DropdownMenu.js.map +1 -1
  90. package/dist/menu-actions/Menu.js +215 -245
  91. package/dist/menu-actions/Menu.js.map +1 -1
  92. package/dist/menu-actions/index.js +1 -1
  93. package/dist/menu-actions/index.js.map +1 -1
  94. package/dist/navigation/Menu.js +14 -18
  95. package/dist/navigation/Menu.js.map +1 -1
  96. package/dist/navigation/MenuItem.js +15 -14
  97. package/dist/navigation/MenuItem.js.map +1 -1
  98. package/dist/navigation/Page.js +7 -5
  99. package/dist/navigation/Page.js.map +1 -1
  100. package/dist/navigation/Stack.js +14 -39
  101. package/dist/navigation/Stack.js.map +1 -1
  102. package/dist/navigation/index.js +4 -4
  103. package/dist/navigation/index.js.map +1 -1
  104. package/dist/popper/Popper.js +209 -235
  105. package/dist/popper/Popper.js.map +1 -1
  106. package/dist/popper/Tooltip.js +227 -257
  107. package/dist/popper/Tooltip.js.map +1 -1
  108. package/dist/popper/index.js +2 -2
  109. package/dist/popper/index.js.map +1 -1
  110. package/dist/shortcuts/GlobalShortcuts.js +2 -2
  111. package/dist/shortcuts/GlobalShortcuts.js.map +1 -1
  112. package/dist/shortcuts/Shortcut.js +263 -291
  113. package/dist/shortcuts/Shortcut.js.map +1 -1
  114. package/dist/shortcuts/ShortcutRegistry.js +48 -71
  115. package/dist/shortcuts/ShortcutRegistry.js.map +1 -1
  116. package/dist/shortcuts/index.js +4 -4
  117. package/dist/shortcuts/index.js.map +1 -1
  118. package/dist/tsconfig.tsbuildinfo +1 -1
  119. package/package.json +30 -54
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/DraggableItemList.tsx"],"names":["React","PureComponent","classNames","memoize","Draggable","Droppable","FontAwesomeIcon","vsGripper","RangeUtils","ItemList","Tooltip","DraggableItemList","props","draggablePrefix","renderItem","item","itemIndex","isFocused","isSelected","isDragDisabled","style","getDraggableId","provided","innerRef","draggableProps","dragHandleProps","isClone","max","CACHE_SIZE","getCachedDraggableItem","draggingItemClassName","items","offset","snapshot","rubric","selectedCount","state","source","index","handleSelectionChange","bind","itemList","createRef","current","selectItem","focusItem","scrollToItem","selectedRanges","setState","count","onSelectionChange","className","droppableId","isDoubleClickSelect","isDropDisabled","isMultiSelect","isStickyBottom","itemCount","onFocusChange","onSelect","onViewportChange","rowHeight","getCachedRenderClone","draggingFromThisWith","isDraggingOver","draggingOverWith","droppableProps","getCachedRenderDraggableItem","text","badgeText","renderBadge","renderHandle","displayValue","value","renderTextItem","draggableId","parseInt","split","pop","DEFAULT_ROW_HEIGHT","disableSelect"],"mappings":"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","sourcesContent":["import React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport memoize from 'memoizee';\nimport { Draggable, Droppable, DraggableChildrenFn } from 'react-beautiful-dnd';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsGripper } from '@deephaven/icons';\nimport { RangeUtils, Range } from '@deephaven/utils';\nimport ItemList, {\n RenderItemProps,\n DefaultListItem,\n ItemListProps,\n} from './ItemList';\nimport { Tooltip } from './popper';\nimport './DraggableItemList.scss';\n\nexport type DraggableRenderItemProps<T> = RenderItemProps<T> & {\n isClone?: boolean;\n selectedCount?: number;\n};\n\ntype DraggableRenderItemFn<T> = (\n props: DraggableRenderItemProps<T>\n) => React.ReactNode;\n\ntype DraggableItemListProps<T> = Omit<\n ItemListProps<T>,\n 'overscanCount' | 'focusSelector' | 'isDragSelect'\n> & {\n className: string;\n draggingItemClassName: string;\n isDropDisabled: boolean;\n // Whether to allow dragging items from this list\n isDragDisabled: boolean;\n\n renderItem: DraggableRenderItemFn<T>;\n style: React.CSSProperties;\n\n // The prefix to add to all draggable item IDs\n draggablePrefix: string;\n // The ID to give the droppable list\n droppableId: string;\n};\n\ntype DraggableItemListState = {\n selectedCount: number;\n};\n\n/**\n * Show a draggable item list. It _must_ be used within a `DragDropContext`.\n * This implementation uses react-beautiful-dnd for handling dragging and dropping of items.\n * We use ItemList to handle selection for multi drag and drop (not built in to react-beautiful-dnd).\n * One caveat with the use of react-beautiful-dnd is that it doesn't allow a drag to be initiated while\n * using a modifier key: https://github.com/atlassian/react-beautiful-dnd/issues/1678\n */\nclass DraggableItemList<T> extends PureComponent<\n DraggableItemListProps<T>,\n DraggableItemListState\n> {\n static DEFAULT_ROW_HEIGHT = 30;\n\n static defaultProps = {\n className: '',\n draggingItemClassName: '',\n offset: 0,\n items: [],\n rowHeight: DraggableItemList.DEFAULT_ROW_HEIGHT,\n isDoubleClickSelect: true,\n isDropDisabled: false,\n isDragDisabled: false,\n isMultiSelect: false,\n isStickyBottom: false,\n disableSelect: false,\n style: null,\n onFocusChange(): void {\n // no-op\n },\n onSelect(): void {\n // no-op\n },\n onSelectionChange(): void {\n // no-op\n },\n onViewportChange(): void {\n // no-op\n },\n renderItem: DraggableItemList.renderItem,\n selectedRanges: [],\n draggablePrefix: 'draggable-item',\n droppableId: 'droppable-item-list',\n };\n\n static renderHandle(): JSX.Element {\n return (\n <div>\n <Tooltip>Drag to re-order</Tooltip>\n <FontAwesomeIcon icon={vsGripper} />\n </div>\n );\n }\n\n static renderBadge({ text }: { text?: string }): React.ReactNode {\n return text ? <span className=\"number-badge\">{text}</span> : null;\n }\n\n static renderTextItem({\n text,\n badgeText = '',\n className = '',\n }: {\n text: string;\n badgeText: string;\n className: string;\n }): JSX.Element {\n return (\n <div\n className={classNames(\n 'item-list-item-content',\n 'draggable-item-list-item-content',\n className\n )}\n >\n <span className=\"title\">{text}</span>\n {DraggableItemList.renderBadge({ text: badgeText })}\n {DraggableItemList.renderHandle()}\n </div>\n );\n }\n\n static renderItem<P extends DefaultListItem>({\n item,\n isClone,\n selectedCount,\n }: DraggableRenderItemProps<P>): JSX.Element {\n const text = item && (item.displayValue || item.value || `${item}`);\n const badgeText = isClone ? `${selectedCount}` : '';\n const className = isClone ? 'item-list-item-clone' : '';\n return DraggableItemList.renderTextItem({ text, badgeText, className });\n }\n\n static getDraggableId(draggablePrefix: string, itemIndex: number): string {\n return `${draggablePrefix}/${itemIndex}`;\n }\n\n static getDraggableIndex(draggableId: string): number {\n return parseInt(draggableId.split('/').pop() || '', 10);\n }\n\n constructor(props: DraggableItemListProps<T>) {\n super(props);\n\n this.handleSelectionChange = this.handleSelectionChange.bind(this);\n\n this.itemList = React.createRef();\n\n this.state = {\n selectedCount: 0,\n };\n }\n\n itemList: React.RefObject<ItemList<T>>;\n\n selectItem(itemIndex: number): void {\n this.itemList.current?.selectItem(itemIndex);\n }\n\n focusItem(itemIndex: number): void {\n this.itemList.current?.focusItem(itemIndex);\n }\n\n scrollToItem(itemIndex: number): void {\n this.itemList.current?.scrollToItem(itemIndex);\n }\n\n getCachedDraggableItem = memoize(\n (\n draggablePrefix: string,\n renderItem: DraggableRenderItemFn<T>,\n item: T,\n itemIndex: number,\n isFocused: boolean,\n isSelected: boolean,\n isDragDisabled: boolean,\n style: React.CSSProperties\n ) => (\n <Draggable\n key={itemIndex}\n draggableId={DraggableItemList.getDraggableId(\n draggablePrefix,\n itemIndex\n )}\n index={itemIndex}\n isDragDisabled={isDragDisabled}\n >\n {provided => (\n <div\n role=\"menuitem\"\n className=\"draggable-item-list-item\"\n ref={provided.innerRef}\n tabIndex={-1}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.draggableProps}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.dragHandleProps}\n >\n {renderItem({\n item,\n itemIndex,\n isFocused,\n isSelected,\n style,\n isClone: false,\n })}\n </div>\n )}\n </Draggable>\n ),\n { max: ItemList.CACHE_SIZE }\n );\n\n handleSelectionChange(selectedRanges: Range[]): void {\n this.setState({ selectedCount: RangeUtils.count(selectedRanges) });\n\n const { onSelectionChange } = this.props;\n onSelectionChange(selectedRanges);\n }\n\n getCachedRenderDraggableItem = memoize(\n (\n draggablePrefix: string,\n isDragDisabled: boolean,\n renderItem: DraggableRenderItemFn<T>\n ) => ({\n item,\n itemIndex,\n isFocused,\n isSelected,\n style,\n }: RenderItemProps<T>) =>\n this.getCachedDraggableItem(\n draggablePrefix,\n renderItem,\n item,\n itemIndex,\n isFocused,\n isSelected,\n isDragDisabled,\n style\n ),\n { max: 1 }\n );\n\n getCachedRenderClone = memoize(\n (\n draggingItemClassName: string,\n items: T[],\n offset: number,\n renderItem: DraggableRenderItemFn<T>\n ): DraggableChildrenFn => (provided, snapshot, rubric) => {\n const { selectedCount } = this.state;\n const { index: itemIndex } = rubric.source;\n const item = items[itemIndex - offset];\n return (\n <div\n className={classNames(\n 'draggable-item-list-dragging-item-container',\n draggingItemClassName\n )}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.draggableProps}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.dragHandleProps}\n ref={provided.innerRef}\n >\n <div\n className={classNames(\n 'draggable-item-list-dragging-item',\n { 'two-dragged': selectedCount === 2 },\n { 'multiple-dragged': selectedCount > 2 }\n )}\n >\n {renderItem({\n item,\n itemIndex,\n isFocused: false,\n isSelected: true,\n style: {},\n isClone: true,\n selectedCount,\n })}\n </div>\n </div>\n );\n },\n { max: 1 }\n );\n\n render(): JSX.Element {\n const {\n className,\n draggablePrefix,\n draggingItemClassName,\n droppableId,\n isDoubleClickSelect,\n isDragDisabled,\n isDropDisabled,\n isMultiSelect,\n isStickyBottom,\n itemCount,\n items,\n offset,\n onFocusChange,\n onSelect,\n onViewportChange,\n renderItem,\n rowHeight,\n selectedRanges,\n style,\n } = this.props;\n return (\n <Droppable\n isDropDisabled={isDropDisabled}\n droppableId={droppableId}\n mode=\"virtual\"\n renderClone={this.getCachedRenderClone(\n draggingItemClassName,\n items,\n offset,\n renderItem\n )}\n >\n {(provided, snapshot) => (\n <div\n role=\"menu\"\n className={classNames('draggable-item-list', className, {\n 'is-drop-disabled': isDropDisabled,\n 'is-drag-disabled': isDragDisabled,\n 'is-dragging-from-this': snapshot.draggingFromThisWith,\n 'is-dragging-over': snapshot.isDraggingOver,\n 'is-dropping': snapshot.draggingOverWith,\n })}\n style={style}\n ref={provided.innerRef}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.droppableProps}\n >\n <ItemList\n focusSelector=\".draggable-item-list-item\"\n isDoubleClickSelect={isDoubleClickSelect}\n isDragSelect={false}\n isMultiSelect={isMultiSelect}\n isStickyBottom={isStickyBottom}\n itemCount={itemCount}\n items={items}\n onFocusChange={onFocusChange}\n onSelect={onSelect}\n onSelectionChange={this.handleSelectionChange}\n onViewportChange={onViewportChange}\n offset={offset}\n ref={this.itemList}\n renderItem={this.getCachedRenderDraggableItem(\n draggablePrefix,\n isDragDisabled,\n renderItem\n )}\n rowHeight={rowHeight}\n selectedRanges={selectedRanges}\n />\n </div>\n )}\n </Droppable>\n );\n }\n}\n\nexport default DraggableItemList;\n"],"file":"DraggableItemList.js"}
1
+ {"version":3,"sources":["../src/DraggableItemList.tsx"],"names":["React","PureComponent","classNames","memoize","Draggable","Droppable","FontAwesomeIcon","vsGripper","RangeUtils","ItemList","Tooltip","DraggableItemList","renderHandle","renderBadge","text","renderTextItem","badgeText","className","renderItem","item","isClone","selectedCount","displayValue","value","getDraggableId","draggablePrefix","itemIndex","getDraggableIndex","draggableId","parseInt","split","pop","constructor","props","isFocused","isSelected","isDragDisabled","style","provided","innerRef","draggableProps","dragHandleProps","max","CACHE_SIZE","getCachedDraggableItem","draggingItemClassName","items","offset","snapshot","rubric","state","index","source","handleSelectionChange","bind","itemList","createRef","selectItem","current","focusItem","scrollToItem","selectedRanges","setState","count","onSelectionChange","render","droppableId","isDoubleClickSelect","isDropDisabled","isMultiSelect","isStickyBottom","itemCount","onFocusChange","onSelect","onViewportChange","rowHeight","getCachedRenderClone","draggingFromThisWith","isDraggingOver","draggingOverWith","droppableProps","getCachedRenderDraggableItem","DEFAULT_ROW_HEIGHT","isDeselectOnClick","disableSelect"],"mappings":"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","sourcesContent":["import React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport memoize from 'memoizee';\nimport { Draggable, Droppable, DraggableChildrenFn } from 'react-beautiful-dnd';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsGripper } from '@deephaven/icons';\nimport { RangeUtils, Range } from '@deephaven/utils';\nimport ItemList, {\n RenderItemProps,\n DefaultListItem,\n ItemListProps,\n} from './ItemList';\nimport { Tooltip } from './popper';\nimport './DraggableItemList.scss';\n\nexport type DraggableRenderItemProps<T> = RenderItemProps<T> & {\n isClone?: boolean;\n selectedCount?: number;\n};\n\ntype DraggableRenderItemFn<T> = (\n props: DraggableRenderItemProps<T>\n) => React.ReactNode;\n\ntype DraggableItemListProps<T> = Omit<\n ItemListProps<T>,\n 'overscanCount' | 'focusSelector' | 'isDragSelect'\n> & {\n className: string;\n draggingItemClassName: string;\n isDropDisabled: boolean;\n // Whether to allow dragging items from this list\n isDragDisabled: boolean;\n\n renderItem: DraggableRenderItemFn<T>;\n style: React.CSSProperties;\n\n // The prefix to add to all draggable item IDs\n draggablePrefix: string;\n // The ID to give the droppable list\n droppableId: string;\n};\n\ntype DraggableItemListState = {\n selectedCount: number;\n};\n\n/**\n * Show a draggable item list. It _must_ be used within a `DragDropContext`.\n * This implementation uses react-beautiful-dnd for handling dragging and dropping of items.\n * We use ItemList to handle selection for multi drag and drop (not built in to react-beautiful-dnd).\n * One caveat with the use of react-beautiful-dnd is that it doesn't allow a drag to be initiated while\n * using a modifier key: https://github.com/atlassian/react-beautiful-dnd/issues/1678\n */\nclass DraggableItemList<T> extends PureComponent<\n DraggableItemListProps<T>,\n DraggableItemListState\n> {\n static DEFAULT_ROW_HEIGHT = 30;\n\n static defaultProps = {\n className: '',\n draggingItemClassName: '',\n offset: 0,\n items: [],\n rowHeight: DraggableItemList.DEFAULT_ROW_HEIGHT,\n isDeselectOnClick: true,\n isDoubleClickSelect: true,\n isDropDisabled: false,\n isDragDisabled: false,\n isMultiSelect: false,\n isStickyBottom: false,\n disableSelect: false,\n style: null,\n onFocusChange(): void {\n // no-op\n },\n onSelect(): void {\n // no-op\n },\n onSelectionChange(): void {\n // no-op\n },\n onViewportChange(): void {\n // no-op\n },\n renderItem: DraggableItemList.renderItem,\n selectedRanges: [],\n draggablePrefix: 'draggable-item',\n droppableId: 'droppable-item-list',\n };\n\n static renderHandle(): JSX.Element {\n return (\n <div>\n <Tooltip>Drag to re-order</Tooltip>\n <FontAwesomeIcon icon={vsGripper} />\n </div>\n );\n }\n\n static renderBadge({ text }: { text?: string }): React.ReactNode {\n return text ? <span className=\"number-badge\">{text}</span> : null;\n }\n\n static renderTextItem({\n text,\n badgeText = '',\n className = '',\n }: {\n text: string;\n badgeText: string;\n className: string;\n }): JSX.Element {\n return (\n <div\n className={classNames(\n 'item-list-item-content',\n 'draggable-item-list-item-content',\n className\n )}\n >\n <span className=\"title\">{text}</span>\n {DraggableItemList.renderBadge({ text: badgeText })}\n {DraggableItemList.renderHandle()}\n </div>\n );\n }\n\n static renderItem<P extends DefaultListItem>({\n item,\n isClone,\n selectedCount,\n }: DraggableRenderItemProps<P>): JSX.Element {\n const text = item && (item.displayValue || item.value || `${item}`);\n const badgeText = isClone ? `${selectedCount}` : '';\n const className = isClone ? 'item-list-item-clone' : '';\n return DraggableItemList.renderTextItem({ text, badgeText, className });\n }\n\n static getDraggableId(draggablePrefix: string, itemIndex: number): string {\n return `${draggablePrefix}/${itemIndex}`;\n }\n\n static getDraggableIndex(draggableId: string): number {\n return parseInt(draggableId.split('/').pop() || '', 10);\n }\n\n constructor(props: DraggableItemListProps<T>) {\n super(props);\n\n this.handleSelectionChange = this.handleSelectionChange.bind(this);\n\n this.itemList = React.createRef();\n\n this.state = {\n selectedCount: 0,\n };\n }\n\n itemList: React.RefObject<ItemList<T>>;\n\n selectItem(itemIndex: number): void {\n this.itemList.current?.selectItem(itemIndex);\n }\n\n focusItem(itemIndex: number): void {\n this.itemList.current?.focusItem(itemIndex);\n }\n\n scrollToItem(itemIndex: number): void {\n this.itemList.current?.scrollToItem(itemIndex);\n }\n\n getCachedDraggableItem = memoize(\n (\n draggablePrefix: string,\n renderItem: DraggableRenderItemFn<T>,\n item: T,\n itemIndex: number,\n isFocused: boolean,\n isSelected: boolean,\n isDragDisabled: boolean,\n style: React.CSSProperties\n ) => (\n <Draggable\n key={itemIndex}\n draggableId={DraggableItemList.getDraggableId(\n draggablePrefix,\n itemIndex\n )}\n index={itemIndex}\n isDragDisabled={isDragDisabled}\n >\n {provided => (\n <div\n role=\"menuitem\"\n className=\"draggable-item-list-item\"\n ref={provided.innerRef}\n tabIndex={-1}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.draggableProps}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.dragHandleProps}\n >\n {renderItem({\n item,\n itemIndex,\n isFocused,\n isSelected,\n style,\n isClone: false,\n })}\n </div>\n )}\n </Draggable>\n ),\n { max: ItemList.CACHE_SIZE }\n );\n\n handleSelectionChange(selectedRanges: Range[]): void {\n this.setState({ selectedCount: RangeUtils.count(selectedRanges) });\n\n const { onSelectionChange } = this.props;\n onSelectionChange(selectedRanges);\n }\n\n getCachedRenderDraggableItem = memoize(\n (\n draggablePrefix: string,\n isDragDisabled: boolean,\n renderItem: DraggableRenderItemFn<T>\n ) => ({\n item,\n itemIndex,\n isFocused,\n isSelected,\n style,\n }: RenderItemProps<T>) =>\n this.getCachedDraggableItem(\n draggablePrefix,\n renderItem,\n item,\n itemIndex,\n isFocused,\n isSelected,\n isDragDisabled,\n style\n ),\n { max: 1 }\n );\n\n getCachedRenderClone = memoize(\n (\n draggingItemClassName: string,\n items: T[],\n offset: number,\n renderItem: DraggableRenderItemFn<T>\n ): DraggableChildrenFn => (provided, snapshot, rubric) => {\n const { selectedCount } = this.state;\n const { index: itemIndex } = rubric.source;\n const item = items[itemIndex - offset];\n return (\n <div\n className={classNames(\n 'draggable-item-list-dragging-item-container',\n draggingItemClassName\n )}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.draggableProps}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.dragHandleProps}\n ref={provided.innerRef}\n >\n <div\n className={classNames(\n 'draggable-item-list-dragging-item',\n { 'two-dragged': selectedCount === 2 },\n { 'multiple-dragged': selectedCount > 2 }\n )}\n >\n {renderItem({\n item,\n itemIndex,\n isFocused: false,\n isSelected: true,\n style: {},\n isClone: true,\n selectedCount,\n })}\n </div>\n </div>\n );\n },\n { max: 1 }\n );\n\n render(): JSX.Element {\n const {\n className,\n draggablePrefix,\n draggingItemClassName,\n droppableId,\n isDoubleClickSelect,\n isDragDisabled,\n isDropDisabled,\n isMultiSelect,\n isStickyBottom,\n itemCount,\n items,\n offset,\n onFocusChange,\n onSelect,\n onViewportChange,\n renderItem,\n rowHeight,\n selectedRanges,\n style,\n } = this.props;\n return (\n <Droppable\n isDropDisabled={isDropDisabled}\n droppableId={droppableId}\n mode=\"virtual\"\n renderClone={this.getCachedRenderClone(\n draggingItemClassName,\n items,\n offset,\n renderItem\n )}\n >\n {(provided, snapshot) => (\n <div\n role=\"menu\"\n className={classNames('draggable-item-list', className, {\n 'is-drop-disabled': isDropDisabled,\n 'is-drag-disabled': isDragDisabled,\n 'is-dragging-from-this': snapshot.draggingFromThisWith,\n 'is-dragging-over': snapshot.isDraggingOver,\n 'is-dropping': snapshot.draggingOverWith,\n })}\n style={style}\n ref={provided.innerRef}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.droppableProps}\n >\n <ItemList\n focusSelector=\".draggable-item-list-item\"\n isDoubleClickSelect={isDoubleClickSelect}\n isDragSelect={false}\n isMultiSelect={isMultiSelect}\n isStickyBottom={isStickyBottom}\n itemCount={itemCount}\n items={items}\n onFocusChange={onFocusChange}\n onSelect={onSelect}\n onSelectionChange={this.handleSelectionChange}\n onViewportChange={onViewportChange}\n offset={offset}\n ref={this.itemList}\n renderItem={this.getCachedRenderDraggableItem(\n draggablePrefix,\n isDragDisabled,\n renderItem\n )}\n rowHeight={rowHeight}\n selectedRanges={selectedRanges}\n />\n </div>\n )}\n </Droppable>\n );\n }\n}\n\nexport default DraggableItemList;\n"],"file":"DraggableItemList.js"}
@@ -1,45 +1,11 @@
1
- function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
2
-
3
- function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
4
-
5
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
6
-
7
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
8
-
9
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
10
-
11
- function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
12
-
13
- function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
14
-
15
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
16
-
17
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
18
-
19
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
20
-
21
- function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
22
-
23
- function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
24
-
25
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
26
-
27
- function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
28
-
29
- function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
30
-
31
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
32
-
33
- function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
34
-
35
1
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
36
2
 
37
3
  import React, { Component } from 'react';
38
4
  import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
39
5
  import { dhSort } from '@deephaven/icons';
40
6
  import classNames from 'classnames';
41
- import Checkbox from './Checkbox';
42
- import Popper from './popper/Popper';
7
+ import Checkbox from "./Checkbox.js";
8
+ import Popper from "./popper/Popper.js";
43
9
  import "./HierarchicalCheckboxMenu.css";
44
10
 
45
11
  /**
@@ -68,224 +34,191 @@ import "./HierarchicalCheckboxMenu.css";
68
34
  * with the appropriate booleans changed. It will then call onUpdateValueMap
69
35
  * with the new Map.
70
36
  */
71
- var HierarchicalCheckboxMenu = /*#__PURE__*/function (_Component) {
72
- _inherits(HierarchicalCheckboxMenu, _Component);
37
+ class HierarchicalCheckboxMenu extends Component {
38
+ static isParentSelected(parent, valueMap) {
39
+ var children = valueMap.get(parent);
40
+
41
+ if (children === undefined) {
42
+ return false;
43
+ }
73
44
 
74
- var _super = _createSuper(HierarchicalCheckboxMenu);
45
+ if (typeof children === 'boolean') {
46
+ // This parent has no children
47
+ return children;
48
+ }
49
+
50
+ var includesTrue = Array.from(children.values()).includes(true);
51
+ var includesFalse = Array.from(children.values()).includes(false);
75
52
 
76
- function HierarchicalCheckboxMenu(props) {
77
- var _this;
53
+ if (includesTrue && includesFalse) {
54
+ // Indeterminate
55
+ return null;
56
+ }
78
57
 
79
- _classCallCheck(this, HierarchicalCheckboxMenu);
58
+ return includesTrue;
59
+ }
80
60
 
81
- _this = _super.call(this, props);
82
- _this.toggleMenu = _this.toggleMenu.bind(_assertThisInitialized(_this));
83
- _this.toggleValueFor = _this.toggleValueFor.bind(_assertThisInitialized(_this));
84
- _this.selectAll = _this.selectAll.bind(_assertThisInitialized(_this));
85
- _this.clear = _this.clear.bind(_assertThisInitialized(_this));
86
- _this.state = {
61
+ constructor(props) {
62
+ super(props);
63
+ this.toggleMenu = this.toggleMenu.bind(this);
64
+ this.toggleValueFor = this.toggleValueFor.bind(this);
65
+ this.selectAll = this.selectAll.bind(this);
66
+ this.clear = this.clear.bind(this);
67
+ this.state = {
87
68
  menuIsOpen: false
88
69
  };
89
- return _this;
90
70
  }
91
71
 
92
- _createClass(HierarchicalCheckboxMenu, [{
93
- key: "toggleMenu",
94
- value: function toggleMenu(event) {
95
- event.stopPropagation();
96
- event.preventDefault();
97
- this.setState(function (state) {
98
- var menuIsOpen = state.menuIsOpen;
99
- return {
100
- menuIsOpen: !menuIsOpen
101
- };
102
- });
103
- }
104
- }, {
105
- key: "toggleValueFor",
106
- value: function toggleValueFor(parent, child) {
107
- var _this$props = this.props,
108
- valueMap = _this$props.valueMap,
109
- onUpdateValueMap = _this$props.onUpdateValueMap; // Make a deep copy of the Map and toggle the boolean for parent / child
72
+ toggleMenu(event) {
73
+ event.stopPropagation();
74
+ event.preventDefault();
75
+ this.setState(state => {
76
+ var {
77
+ menuIsOpen
78
+ } = state;
79
+ return {
80
+ menuIsOpen: !menuIsOpen
81
+ };
82
+ });
83
+ }
110
84
 
111
- var map = new Map(valueMap);
112
- var children = map.get(parent);
85
+ toggleValueFor(parent, child) {
86
+ var {
87
+ valueMap,
88
+ onUpdateValueMap
89
+ } = this.props; // Make a deep copy of the Map and toggle the boolean for parent / child
113
90
 
114
- if (children instanceof Map) {
115
- var newChildren = new Map(children);
91
+ var map = new Map(valueMap);
92
+ var children = map.get(parent);
116
93
 
117
- if (child != null) {
118
- newChildren.set(child, !children.get(child));
119
- } else {
120
- var newChildValue = !HierarchicalCheckboxMenu.isParentSelected(parent, map);
121
- children.forEach(function (_, key) {
122
- return newChildren.set(key, newChildValue);
123
- });
124
- }
94
+ if (children instanceof Map) {
95
+ var newChildren = new Map(children);
125
96
 
126
- map.set(parent, newChildren);
97
+ if (child != null) {
98
+ newChildren.set(child, !children.get(child));
127
99
  } else {
128
- map.set(parent, !children);
129
- } // The parent was clicked so all children must be toggled
130
-
131
-
132
- var currentChildren = map.get(parent);
133
-
134
- if (child === undefined && currentChildren !== undefined && typeof currentChildren !== 'boolean') {
135
- if (HierarchicalCheckboxMenu.isParentSelected(parent, valueMap)) {
136
- currentChildren.forEach(function (_, key) {
137
- return currentChildren.set(key, false);
138
- });
139
- } else {
140
- // for parent selection of false or null (indeterminate), select everything
141
- currentChildren.forEach(function (_, key) {
142
- return currentChildren.set(key, true);
143
- });
144
- }
100
+ var newChildValue = !HierarchicalCheckboxMenu.isParentSelected(parent, map);
101
+ children.forEach((_, key) => newChildren.set(key, newChildValue));
145
102
  }
146
103
 
147
- onUpdateValueMap(map);
148
- }
149
- }, {
150
- key: "setAllValues",
151
- value: function setAllValues(value) {
152
- var _this$props2 = this.props,
153
- valueMap = _this$props2.valueMap,
154
- onUpdateValueMap = _this$props2.onUpdateValueMap; // Make a deep copy of the Map and set everything
155
-
156
- var copy = new Map();
157
- valueMap.forEach(function (child, parent) {
158
- if (typeof child === 'boolean') {
159
- copy.set(parent, value);
160
- } else {
161
- var children = new Map();
162
- child.forEach(function (_, key) {
163
- return children.set(key, value);
164
- });
165
- copy.set(parent, children);
166
- }
167
- });
168
- onUpdateValueMap(copy);
169
- }
170
- }, {
171
- key: "selectAll",
172
- value: function selectAll() {
173
- this.setAllValues(true);
174
- }
175
- }, {
176
- key: "clear",
177
- value: function clear() {
178
- this.setAllValues(false);
179
- }
180
- }, {
181
- key: "renderMenuElement",
182
- value: function renderMenuElement() {
183
- var _this2 = this;
104
+ map.set(parent, newChildren);
105
+ } else {
106
+ map.set(parent, !children);
107
+ } // The parent was clicked so all children must be toggled
184
108
 
185
- var valueMap = this.props.valueMap;
186
- return /*#__PURE__*/React.createElement("div", {
187
- className: "hcm-menu-container"
188
- }, Array.from(valueMap.entries()).map(function (_ref) {
189
- var _ref2 = _slicedToArray(_ref, 2),
190
- parent = _ref2[0],
191
- children = _ref2[1];
192
109
 
193
- return /*#__PURE__*/React.createElement("div", {
194
- key: parent
195
- }, /*#__PURE__*/React.createElement(Checkbox, {
196
- className: "hcm-parent",
197
- checked: HierarchicalCheckboxMenu.isParentSelected(parent, valueMap),
198
- onChange: function onChange() {
199
- return _this2.toggleValueFor(parent);
200
- }
201
- }, parent), children !== undefined && typeof children !== 'boolean' && Array.from(children.entries()).map(function (_ref3) {
202
- var _ref4 = _slicedToArray(_ref3, 2),
203
- child = _ref4[0],
204
- value = _ref4[1];
110
+ var currentChildren = map.get(parent);
205
111
 
206
- return /*#__PURE__*/React.createElement(Checkbox, {
207
- className: "hcm-child",
208
- key: child,
209
- checked: value,
210
- onChange: function onChange() {
211
- return _this2.toggleValueFor(parent, child);
212
- }
213
- }, child);
214
- }));
215
- }), /*#__PURE__*/React.createElement("button", {
216
- type: "button",
217
- className: "btn btn-link",
218
- onClick: this.selectAll
219
- }, "Select All"), /*#__PURE__*/React.createElement("button", {
220
- type: "button",
221
- className: "btn btn-link",
222
- onClick: this.clear
223
- }, "Clear"));
112
+ if (child === undefined && currentChildren !== undefined && typeof currentChildren !== 'boolean') {
113
+ if (HierarchicalCheckboxMenu.isParentSelected(parent, valueMap)) {
114
+ currentChildren.forEach((_, key) => currentChildren.set(key, false));
115
+ } else {
116
+ // for parent selection of false or null (indeterminate), select everything
117
+ currentChildren.forEach((_, key) => currentChildren.set(key, true));
118
+ }
224
119
  }
225
- }, {
226
- key: "render",
227
- value: function render() {
228
- var _this3 = this;
229
120
 
230
- var _this$props3 = this.props,
231
- menuText = _this$props3.menuText,
232
- className = _this$props3.className,
233
- icon = _this$props3.icon,
234
- id = _this$props3.id;
235
- var menuIsOpen = this.state.menuIsOpen;
236
- return /*#__PURE__*/React.createElement("button", {
237
- type: "button",
238
- className: classNames('btn hcm-btn', className),
239
- onClick: this.toggleMenu,
240
- id: id
241
- }, /*#__PURE__*/React.createElement("span", null, icon && /*#__PURE__*/React.createElement(FontAwesomeIcon, {
242
- icon: icon,
243
- className: "hcm-icon mr-1"
244
- }), menuText), /*#__PURE__*/React.createElement(FontAwesomeIcon, {
245
- icon: dhSort,
246
- className: "hcm-icon ml-1"
247
- }), /*#__PURE__*/React.createElement(Popper, {
248
- options: {
249
- placement: 'bottom'
250
- },
251
- isShown: menuIsOpen,
252
- onExited: function onExited() {
253
- _this3.setState({
254
- menuIsOpen: false
255
- });
256
- },
257
- closeOnBlur: true,
258
- interactive: true
259
- }, this.renderMenuElement()));
260
- }
261
- }], [{
262
- key: "isParentSelected",
263
- value: function isParentSelected(parent, valueMap) {
264
- var children = valueMap.get(parent);
121
+ onUpdateValueMap(map);
122
+ }
265
123
 
266
- if (children === undefined) {
267
- return false;
268
- }
124
+ setAllValues(value) {
125
+ var {
126
+ valueMap,
127
+ onUpdateValueMap
128
+ } = this.props; // Make a deep copy of the Map and set everything
269
129
 
270
- if (typeof children === 'boolean') {
271
- // This parent has no children
272
- return children;
130
+ var copy = new Map();
131
+ valueMap.forEach((child, parent) => {
132
+ if (typeof child === 'boolean') {
133
+ copy.set(parent, value);
134
+ } else {
135
+ var children = new Map();
136
+ child.forEach((_, key) => children.set(key, value));
137
+ copy.set(parent, children);
273
138
  }
139
+ });
140
+ onUpdateValueMap(copy);
141
+ }
274
142
 
275
- var includesTrue = Array.from(children.values()).includes(true);
276
- var includesFalse = Array.from(children.values()).includes(false);
143
+ selectAll() {
144
+ this.setAllValues(true);
145
+ }
277
146
 
278
- if (includesTrue && includesFalse) {
279
- // Indeterminate
280
- return null;
281
- }
147
+ clear() {
148
+ this.setAllValues(false);
149
+ }
282
150
 
283
- return includesTrue;
284
- }
285
- }]);
151
+ renderMenuElement() {
152
+ var {
153
+ valueMap
154
+ } = this.props;
155
+ return /*#__PURE__*/React.createElement("div", {
156
+ className: "hcm-menu-container"
157
+ }, Array.from(valueMap.entries()).map((_ref) => {
158
+ var [parent, children] = _ref;
159
+ return /*#__PURE__*/React.createElement("div", {
160
+ key: parent
161
+ }, /*#__PURE__*/React.createElement(Checkbox, {
162
+ className: "hcm-parent",
163
+ checked: HierarchicalCheckboxMenu.isParentSelected(parent, valueMap),
164
+ onChange: () => this.toggleValueFor(parent)
165
+ }, parent), children !== undefined && typeof children !== 'boolean' && Array.from(children.entries()).map((_ref2) => {
166
+ var [child, value] = _ref2;
167
+ return /*#__PURE__*/React.createElement(Checkbox, {
168
+ className: "hcm-child",
169
+ key: child,
170
+ checked: value,
171
+ onChange: () => this.toggleValueFor(parent, child)
172
+ }, child);
173
+ }));
174
+ }), /*#__PURE__*/React.createElement("button", {
175
+ type: "button",
176
+ className: "btn btn-link",
177
+ onClick: this.selectAll
178
+ }, "Select All"), /*#__PURE__*/React.createElement("button", {
179
+ type: "button",
180
+ className: "btn btn-link",
181
+ onClick: this.clear
182
+ }, "Clear"));
183
+ }
184
+
185
+ render() {
186
+ var {
187
+ menuText,
188
+ className,
189
+ icon,
190
+ id
191
+ } = this.props;
192
+ var {
193
+ menuIsOpen
194
+ } = this.state;
195
+ return /*#__PURE__*/React.createElement("button", {
196
+ type: "button",
197
+ className: classNames('btn hcm-btn', className),
198
+ onClick: this.toggleMenu,
199
+ id: id
200
+ }, /*#__PURE__*/React.createElement("span", null, icon && /*#__PURE__*/React.createElement(FontAwesomeIcon, {
201
+ icon: icon,
202
+ className: "hcm-icon mr-1"
203
+ }), menuText), /*#__PURE__*/React.createElement(FontAwesomeIcon, {
204
+ icon: dhSort,
205
+ className: "hcm-icon ml-1"
206
+ }), /*#__PURE__*/React.createElement(Popper, {
207
+ options: {
208
+ placement: 'bottom'
209
+ },
210
+ isShown: menuIsOpen,
211
+ onExited: () => {
212
+ this.setState({
213
+ menuIsOpen: false
214
+ });
215
+ },
216
+ closeOnBlur: true,
217
+ interactive: true
218
+ }, this.renderMenuElement()));
219
+ }
286
220
 
287
- return HierarchicalCheckboxMenu;
288
- }(Component);
221
+ }
289
222
 
290
223
  _defineProperty(HierarchicalCheckboxMenu, "defaultProps", {
291
224
  className: '',
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/HierarchicalCheckboxMenu.tsx"],"names":["React","Component","FontAwesomeIcon","dhSort","classNames","Checkbox","Popper","HierarchicalCheckboxMenu","props","toggleMenu","bind","toggleValueFor","selectAll","clear","state","menuIsOpen","event","stopPropagation","preventDefault","setState","parent","child","valueMap","onUpdateValueMap","map","Map","children","get","newChildren","set","newChildValue","isParentSelected","forEach","_","key","currentChildren","undefined","value","copy","setAllValues","Array","from","entries","menuText","className","icon","id","placement","renderMenuElement","includesTrue","values","includes","includesFalse"],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { dhSort, IconDefinition } from '@deephaven/icons';\nimport classNames from 'classnames';\nimport Checkbox from './Checkbox';\nimport Popper from './popper/Popper';\nimport './HierarchicalCheckboxMenu.scss';\n\ntype HierarchicalCheckboxValueMap = Map<string, boolean | Map<string, boolean>>;\n\ntype HierarchicalCheckboxMenuProps = {\n className: string;\n menuText: string;\n valueMap: HierarchicalCheckboxValueMap;\n onUpdateValueMap(map: HierarchicalCheckboxValueMap): void;\n icon: IconDefinition | null;\n id: string;\n};\n\ntype HierarchicalCheckboxMenuState = {\n menuIsOpen: boolean;\n};\n\n/**\n * A pull down menu that displays a hierarchy of checkboxes.\n *\n * Currently supports only two levels of check boxes. The input should be a Map\n * where the keys are the parent names. The values can a boolean if the parent\n * has no children or another Map where keys are child names and values are booleans.\n *\n * Here is an example:\n * const INITIAL_TYPE_MAP = new Map([\n * ['Queries', new Map([['Live', true], ['Batch', true]])],\n * [\n * 'DBA Queries',\n * new Map([\n * ['Data Merge', true],\n * ['Data Validation', true],\n * ['Imports', true],\n * ['Data Services', true],\n * ]),\n * ],\n * ['Helper Queries', true],\n * ]);\n *\n * When a checkbox is changed, this component will make a deep copy of the Map\n * with the appropriate booleans changed. It will then call onUpdateValueMap\n * with the new Map.\n */\nclass HierarchicalCheckboxMenu extends Component<\n HierarchicalCheckboxMenuProps,\n HierarchicalCheckboxMenuState\n> {\n static defaultProps: Partial<HierarchicalCheckboxMenuProps> = {\n className: '',\n icon: null,\n id: '',\n };\n\n static isParentSelected(\n parent: string,\n valueMap: HierarchicalCheckboxValueMap\n ): boolean | null {\n const children = valueMap.get(parent);\n if (children === undefined) {\n return false;\n }\n if (typeof children === 'boolean') {\n // This parent has no children\n return children;\n }\n const includesTrue = Array.from(children.values()).includes(true);\n const includesFalse = Array.from(children.values()).includes(false);\n if (includesTrue && includesFalse) {\n // Indeterminate\n return null;\n }\n return includesTrue;\n }\n\n constructor(props: HierarchicalCheckboxMenuProps) {\n super(props);\n\n this.toggleMenu = this.toggleMenu.bind(this);\n this.toggleValueFor = this.toggleValueFor.bind(this);\n this.selectAll = this.selectAll.bind(this);\n this.clear = this.clear.bind(this);\n\n this.state = {\n menuIsOpen: false,\n };\n }\n\n toggleMenu(event: React.MouseEvent<HTMLButtonElement>): void {\n event.stopPropagation();\n event.preventDefault();\n this.setState(state => {\n const { menuIsOpen } = state;\n return { menuIsOpen: !menuIsOpen };\n });\n }\n\n toggleValueFor(parent: string, child?: string): void {\n const { valueMap, onUpdateValueMap } = this.props;\n\n // Make a deep copy of the Map and toggle the boolean for parent / child\n const map = new Map(valueMap);\n const children = map.get(parent);\n if (children instanceof Map) {\n const newChildren = new Map(children);\n if (child != null) {\n newChildren.set(child, !children.get(child));\n } else {\n const newChildValue = !HierarchicalCheckboxMenu.isParentSelected(\n parent,\n map\n );\n children.forEach((_, key) => newChildren.set(key, newChildValue));\n }\n map.set(parent, newChildren);\n } else {\n map.set(parent, !children);\n }\n\n // The parent was clicked so all children must be toggled\n const currentChildren = map.get(parent);\n if (\n child === undefined &&\n currentChildren !== undefined &&\n typeof currentChildren !== 'boolean'\n ) {\n if (HierarchicalCheckboxMenu.isParentSelected(parent, valueMap)) {\n currentChildren.forEach((_, key) => currentChildren.set(key, false));\n } else {\n // for parent selection of false or null (indeterminate), select everything\n currentChildren.forEach((_, key) => currentChildren.set(key, true));\n }\n }\n\n onUpdateValueMap(map);\n }\n\n setAllValues(value: boolean): void {\n const { valueMap, onUpdateValueMap } = this.props;\n\n // Make a deep copy of the Map and set everything\n const copy = new Map();\n valueMap.forEach((child, parent) => {\n if (typeof child === 'boolean') {\n copy.set(parent, value);\n } else {\n const children = new Map();\n child.forEach((_, key) => children.set(key, value));\n copy.set(parent, children);\n }\n });\n\n onUpdateValueMap(copy);\n }\n\n selectAll(): void {\n this.setAllValues(true);\n }\n\n clear(): void {\n this.setAllValues(false);\n }\n\n renderMenuElement(): React.ReactNode {\n const { valueMap } = this.props;\n return (\n <div className=\"hcm-menu-container\">\n {Array.from(valueMap.entries()).map(([parent, children]) => (\n <div key={parent}>\n <Checkbox\n className=\"hcm-parent\"\n checked={HierarchicalCheckboxMenu.isParentSelected(\n parent,\n valueMap\n )}\n onChange={() => this.toggleValueFor(parent)}\n >\n {parent}\n </Checkbox>\n {children !== undefined &&\n typeof children !== 'boolean' &&\n Array.from(children.entries()).map(([child, value]) => (\n <Checkbox\n className=\"hcm-child\"\n key={child}\n checked={value}\n onChange={() => this.toggleValueFor(parent, child)}\n >\n {child}\n </Checkbox>\n ))}\n </div>\n ))}\n <button type=\"button\" className=\"btn btn-link\" onClick={this.selectAll}>\n Select All\n </button>\n <button type=\"button\" className=\"btn btn-link\" onClick={this.clear}>\n Clear\n </button>\n </div>\n );\n }\n\n render(): JSX.Element {\n const { menuText, className, icon, id } = this.props;\n const { menuIsOpen } = this.state;\n\n return (\n <button\n type=\"button\"\n className={classNames('btn hcm-btn', className)}\n onClick={this.toggleMenu}\n id={id}\n >\n <span>\n {icon && <FontAwesomeIcon icon={icon} className=\"hcm-icon mr-1\" />}\n {menuText}\n </span>\n <FontAwesomeIcon icon={dhSort} className=\"hcm-icon ml-1\" />\n <Popper\n options={{ placement: 'bottom' }}\n isShown={menuIsOpen}\n onExited={() => {\n this.setState({ menuIsOpen: false });\n }}\n closeOnBlur\n interactive\n >\n {this.renderMenuElement()}\n </Popper>\n </button>\n );\n }\n}\n\nexport default HierarchicalCheckboxMenu;\n"],"file":"HierarchicalCheckboxMenu.js"}
1
+ {"version":3,"sources":["../src/HierarchicalCheckboxMenu.tsx"],"names":["React","Component","FontAwesomeIcon","dhSort","classNames","Checkbox","Popper","HierarchicalCheckboxMenu","isParentSelected","parent","valueMap","children","get","undefined","includesTrue","Array","from","values","includes","includesFalse","constructor","props","toggleMenu","bind","toggleValueFor","selectAll","clear","state","menuIsOpen","event","stopPropagation","preventDefault","setState","child","onUpdateValueMap","map","Map","newChildren","set","newChildValue","forEach","_","key","currentChildren","setAllValues","value","copy","renderMenuElement","entries","render","menuText","className","icon","id","placement"],"mappings":";;AAAA,OAAOA,KAAP,IAAgBC,SAAhB,QAAiC,OAAjC;AACA,SAASC,eAAT,QAAgC,gCAAhC;AACA,SAASC,MAAT,QAAuC,kBAAvC;AACA,OAAOC,UAAP,MAAuB,YAAvB;OACOC,Q;OACAC,M;;;AAkBP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,wBAAN,SAAuCN,SAAvC,CAGE;AAOuB,SAAhBO,gBAAgB,CACrBC,MADqB,EAErBC,QAFqB,EAGL;AAChB,QAAMC,QAAQ,GAAGD,QAAQ,CAACE,GAAT,CAAaH,MAAb,CAAjB;;AACA,QAAIE,QAAQ,KAAKE,SAAjB,EAA4B;AAC1B,aAAO,KAAP;AACD;;AACD,QAAI,OAAOF,QAAP,KAAoB,SAAxB,EAAmC;AACjC;AACA,aAAOA,QAAP;AACD;;AACD,QAAMG,YAAY,GAAGC,KAAK,CAACC,IAAN,CAAWL,QAAQ,CAACM,MAAT,EAAX,EAA8BC,QAA9B,CAAuC,IAAvC,CAArB;AACA,QAAMC,aAAa,GAAGJ,KAAK,CAACC,IAAN,CAAWL,QAAQ,CAACM,MAAT,EAAX,EAA8BC,QAA9B,CAAuC,KAAvC,CAAtB;;AACA,QAAIJ,YAAY,IAAIK,aAApB,EAAmC;AACjC;AACA,aAAO,IAAP;AACD;;AACD,WAAOL,YAAP;AACD;;AAEDM,EAAAA,WAAW,CAACC,KAAD,EAAuC;AAChD,UAAMA,KAAN;AAEA,SAAKC,UAAL,GAAkB,KAAKA,UAAL,CAAgBC,IAAhB,CAAqB,IAArB,CAAlB;AACA,SAAKC,cAAL,GAAsB,KAAKA,cAAL,CAAoBD,IAApB,CAAyB,IAAzB,CAAtB;AACA,SAAKE,SAAL,GAAiB,KAAKA,SAAL,CAAeF,IAAf,CAAoB,IAApB,CAAjB;AACA,SAAKG,KAAL,GAAa,KAAKA,KAAL,CAAWH,IAAX,CAAgB,IAAhB,CAAb;AAEA,SAAKI,KAAL,GAAa;AACXC,MAAAA,UAAU,EAAE;AADD,KAAb;AAGD;;AAEDN,EAAAA,UAAU,CAACO,KAAD,EAAmD;AAC3DA,IAAAA,KAAK,CAACC,eAAN;AACAD,IAAAA,KAAK,CAACE,cAAN;AACA,SAAKC,QAAL,CAAcL,KAAK,IAAI;AACrB,UAAM;AAAEC,QAAAA;AAAF,UAAiBD,KAAvB;AACA,aAAO;AAAEC,QAAAA,UAAU,EAAE,CAACA;AAAf,OAAP;AACD,KAHD;AAID;;AAEDJ,EAAAA,cAAc,CAACf,MAAD,EAAiBwB,KAAjB,EAAuC;AACnD,QAAM;AAAEvB,MAAAA,QAAF;AAAYwB,MAAAA;AAAZ,QAAiC,KAAKb,KAA5C,CADmD,CAGnD;;AACA,QAAMc,GAAG,GAAG,IAAIC,GAAJ,CAAQ1B,QAAR,CAAZ;AACA,QAAMC,QAAQ,GAAGwB,GAAG,CAACvB,GAAJ,CAAQH,MAAR,CAAjB;;AACA,QAAIE,QAAQ,YAAYyB,GAAxB,EAA6B;AAC3B,UAAMC,WAAW,GAAG,IAAID,GAAJ,CAAQzB,QAAR,CAApB;;AACA,UAAIsB,KAAK,IAAI,IAAb,EAAmB;AACjBI,QAAAA,WAAW,CAACC,GAAZ,CAAgBL,KAAhB,EAAuB,CAACtB,QAAQ,CAACC,GAAT,CAAaqB,KAAb,CAAxB;AACD,OAFD,MAEO;AACL,YAAMM,aAAa,GAAG,CAAChC,wBAAwB,CAACC,gBAAzB,CACrBC,MADqB,EAErB0B,GAFqB,CAAvB;AAIAxB,QAAAA,QAAQ,CAAC6B,OAAT,CAAiB,CAACC,CAAD,EAAIC,GAAJ,KAAYL,WAAW,CAACC,GAAZ,CAAgBI,GAAhB,EAAqBH,aAArB,CAA7B;AACD;;AACDJ,MAAAA,GAAG,CAACG,GAAJ,CAAQ7B,MAAR,EAAgB4B,WAAhB;AACD,KAZD,MAYO;AACLF,MAAAA,GAAG,CAACG,GAAJ,CAAQ7B,MAAR,EAAgB,CAACE,QAAjB;AACD,KApBkD,CAsBnD;;;AACA,QAAMgC,eAAe,GAAGR,GAAG,CAACvB,GAAJ,CAAQH,MAAR,CAAxB;;AACA,QACEwB,KAAK,KAAKpB,SAAV,IACA8B,eAAe,KAAK9B,SADpB,IAEA,OAAO8B,eAAP,KAA2B,SAH7B,EAIE;AACA,UAAIpC,wBAAwB,CAACC,gBAAzB,CAA0CC,MAA1C,EAAkDC,QAAlD,CAAJ,EAAiE;AAC/DiC,QAAAA,eAAe,CAACH,OAAhB,CAAwB,CAACC,CAAD,EAAIC,GAAJ,KAAYC,eAAe,CAACL,GAAhB,CAAoBI,GAApB,EAAyB,KAAzB,CAApC;AACD,OAFD,MAEO;AACL;AACAC,QAAAA,eAAe,CAACH,OAAhB,CAAwB,CAACC,CAAD,EAAIC,GAAJ,KAAYC,eAAe,CAACL,GAAhB,CAAoBI,GAApB,EAAyB,IAAzB,CAApC;AACD;AACF;;AAEDR,IAAAA,gBAAgB,CAACC,GAAD,CAAhB;AACD;;AAEDS,EAAAA,YAAY,CAACC,KAAD,EAAuB;AACjC,QAAM;AAAEnC,MAAAA,QAAF;AAAYwB,MAAAA;AAAZ,QAAiC,KAAKb,KAA5C,CADiC,CAGjC;;AACA,QAAMyB,IAAI,GAAG,IAAIV,GAAJ,EAAb;AACA1B,IAAAA,QAAQ,CAAC8B,OAAT,CAAiB,CAACP,KAAD,EAAQxB,MAAR,KAAmB;AAClC,UAAI,OAAOwB,KAAP,KAAiB,SAArB,EAAgC;AAC9Ba,QAAAA,IAAI,CAACR,GAAL,CAAS7B,MAAT,EAAiBoC,KAAjB;AACD,OAFD,MAEO;AACL,YAAMlC,QAAQ,GAAG,IAAIyB,GAAJ,EAAjB;AACAH,QAAAA,KAAK,CAACO,OAAN,CAAc,CAACC,CAAD,EAAIC,GAAJ,KAAY/B,QAAQ,CAAC2B,GAAT,CAAaI,GAAb,EAAkBG,KAAlB,CAA1B;AACAC,QAAAA,IAAI,CAACR,GAAL,CAAS7B,MAAT,EAAiBE,QAAjB;AACD;AACF,KARD;AAUAuB,IAAAA,gBAAgB,CAACY,IAAD,CAAhB;AACD;;AAEDrB,EAAAA,SAAS,GAAS;AAChB,SAAKmB,YAAL,CAAkB,IAAlB;AACD;;AAEDlB,EAAAA,KAAK,GAAS;AACZ,SAAKkB,YAAL,CAAkB,KAAlB;AACD;;AAEDG,EAAAA,iBAAiB,GAAoB;AACnC,QAAM;AAAErC,MAAAA;AAAF,QAAe,KAAKW,KAA1B;AACA,wBACE;AAAK,MAAA,SAAS,EAAC;AAAf,OACGN,KAAK,CAACC,IAAN,CAAWN,QAAQ,CAACsC,OAAT,EAAX,EAA+Bb,GAA/B,CAAmC;AAAA,UAAC,CAAC1B,MAAD,EAASE,QAAT,CAAD;AAAA,0BAClC;AAAK,QAAA,GAAG,EAAEF;AAAV,sBACE,oBAAC,QAAD;AACE,QAAA,SAAS,EAAC,YADZ;AAEE,QAAA,OAAO,EAAEF,wBAAwB,CAACC,gBAAzB,CACPC,MADO,EAEPC,QAFO,CAFX;AAME,QAAA,QAAQ,EAAE,MAAM,KAAKc,cAAL,CAAoBf,MAApB;AANlB,SAQGA,MARH,CADF,EAWGE,QAAQ,KAAKE,SAAb,IACC,OAAOF,QAAP,KAAoB,SADrB,IAECI,KAAK,CAACC,IAAN,CAAWL,QAAQ,CAACqC,OAAT,EAAX,EAA+Bb,GAA/B,CAAmC;AAAA,YAAC,CAACF,KAAD,EAAQY,KAAR,CAAD;AAAA,4BACjC,oBAAC,QAAD;AACE,UAAA,SAAS,EAAC,WADZ;AAEE,UAAA,GAAG,EAAEZ,KAFP;AAGE,UAAA,OAAO,EAAEY,KAHX;AAIE,UAAA,QAAQ,EAAE,MAAM,KAAKrB,cAAL,CAAoBf,MAApB,EAA4BwB,KAA5B;AAJlB,WAMGA,KANH,CADiC;AAAA,OAAnC,CAbJ,CADkC;AAAA,KAAnC,CADH,eA2BE;AAAQ,MAAA,IAAI,EAAC,QAAb;AAAsB,MAAA,SAAS,EAAC,cAAhC;AAA+C,MAAA,OAAO,EAAE,KAAKR;AAA7D,oBA3BF,eA8BE;AAAQ,MAAA,IAAI,EAAC,QAAb;AAAsB,MAAA,SAAS,EAAC,cAAhC;AAA+C,MAAA,OAAO,EAAE,KAAKC;AAA7D,eA9BF,CADF;AAoCD;;AAEDuB,EAAAA,MAAM,GAAgB;AACpB,QAAM;AAAEC,MAAAA,QAAF;AAAYC,MAAAA,SAAZ;AAAuBC,MAAAA,IAAvB;AAA6BC,MAAAA;AAA7B,QAAoC,KAAKhC,KAA/C;AACA,QAAM;AAAEO,MAAAA;AAAF,QAAiB,KAAKD,KAA5B;AAEA,wBACE;AACE,MAAA,IAAI,EAAC,QADP;AAEE,MAAA,SAAS,EAAEvB,UAAU,CAAC,aAAD,EAAgB+C,SAAhB,CAFvB;AAGE,MAAA,OAAO,EAAE,KAAK7B,UAHhB;AAIE,MAAA,EAAE,EAAE+B;AAJN,oBAME,kCACGD,IAAI,iBAAI,oBAAC,eAAD;AAAiB,MAAA,IAAI,EAAEA,IAAvB;AAA6B,MAAA,SAAS,EAAC;AAAvC,MADX,EAEGF,QAFH,CANF,eAUE,oBAAC,eAAD;AAAiB,MAAA,IAAI,EAAE/C,MAAvB;AAA+B,MAAA,SAAS,EAAC;AAAzC,MAVF,eAWE,oBAAC,MAAD;AACE,MAAA,OAAO,EAAE;AAAEmD,QAAAA,SAAS,EAAE;AAAb,OADX;AAEE,MAAA,OAAO,EAAE1B,UAFX;AAGE,MAAA,QAAQ,EAAE,MAAM;AACd,aAAKI,QAAL,CAAc;AAAEJ,UAAAA,UAAU,EAAE;AAAd,SAAd;AACD,OALH;AAME,MAAA,WAAW,MANb;AAOE,MAAA,WAAW;AAPb,OASG,KAAKmB,iBAAL,EATH,CAXF,CADF;AAyBD;;AAzLD;;gBAHIxC,wB,kBAI0D;AAC5D4C,EAAAA,SAAS,EAAE,EADiD;AAE5DC,EAAAA,IAAI,EAAE,IAFsD;AAG5DC,EAAAA,EAAE,EAAE;AAHwD,C;;AA2LhE,eAAe9C,wBAAf","sourcesContent":["import React, { Component } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { dhSort, IconDefinition } from '@deephaven/icons';\nimport classNames from 'classnames';\nimport Checkbox from './Checkbox';\nimport Popper from './popper/Popper';\nimport './HierarchicalCheckboxMenu.scss';\n\ntype HierarchicalCheckboxValueMap = Map<string, boolean | Map<string, boolean>>;\n\ntype HierarchicalCheckboxMenuProps = {\n className: string;\n menuText: string;\n valueMap: HierarchicalCheckboxValueMap;\n onUpdateValueMap(map: HierarchicalCheckboxValueMap): void;\n icon: IconDefinition | null;\n id: string;\n};\n\ntype HierarchicalCheckboxMenuState = {\n menuIsOpen: boolean;\n};\n\n/**\n * A pull down menu that displays a hierarchy of checkboxes.\n *\n * Currently supports only two levels of check boxes. The input should be a Map\n * where the keys are the parent names. The values can a boolean if the parent\n * has no children or another Map where keys are child names and values are booleans.\n *\n * Here is an example:\n * const INITIAL_TYPE_MAP = new Map([\n * ['Queries', new Map([['Live', true], ['Batch', true]])],\n * [\n * 'DBA Queries',\n * new Map([\n * ['Data Merge', true],\n * ['Data Validation', true],\n * ['Imports', true],\n * ['Data Services', true],\n * ]),\n * ],\n * ['Helper Queries', true],\n * ]);\n *\n * When a checkbox is changed, this component will make a deep copy of the Map\n * with the appropriate booleans changed. It will then call onUpdateValueMap\n * with the new Map.\n */\nclass HierarchicalCheckboxMenu extends Component<\n HierarchicalCheckboxMenuProps,\n HierarchicalCheckboxMenuState\n> {\n static defaultProps: Partial<HierarchicalCheckboxMenuProps> = {\n className: '',\n icon: null,\n id: '',\n };\n\n static isParentSelected(\n parent: string,\n valueMap: HierarchicalCheckboxValueMap\n ): boolean | null {\n const children = valueMap.get(parent);\n if (children === undefined) {\n return false;\n }\n if (typeof children === 'boolean') {\n // This parent has no children\n return children;\n }\n const includesTrue = Array.from(children.values()).includes(true);\n const includesFalse = Array.from(children.values()).includes(false);\n if (includesTrue && includesFalse) {\n // Indeterminate\n return null;\n }\n return includesTrue;\n }\n\n constructor(props: HierarchicalCheckboxMenuProps) {\n super(props);\n\n this.toggleMenu = this.toggleMenu.bind(this);\n this.toggleValueFor = this.toggleValueFor.bind(this);\n this.selectAll = this.selectAll.bind(this);\n this.clear = this.clear.bind(this);\n\n this.state = {\n menuIsOpen: false,\n };\n }\n\n toggleMenu(event: React.MouseEvent<HTMLButtonElement>): void {\n event.stopPropagation();\n event.preventDefault();\n this.setState(state => {\n const { menuIsOpen } = state;\n return { menuIsOpen: !menuIsOpen };\n });\n }\n\n toggleValueFor(parent: string, child?: string): void {\n const { valueMap, onUpdateValueMap } = this.props;\n\n // Make a deep copy of the Map and toggle the boolean for parent / child\n const map = new Map(valueMap);\n const children = map.get(parent);\n if (children instanceof Map) {\n const newChildren = new Map(children);\n if (child != null) {\n newChildren.set(child, !children.get(child));\n } else {\n const newChildValue = !HierarchicalCheckboxMenu.isParentSelected(\n parent,\n map\n );\n children.forEach((_, key) => newChildren.set(key, newChildValue));\n }\n map.set(parent, newChildren);\n } else {\n map.set(parent, !children);\n }\n\n // The parent was clicked so all children must be toggled\n const currentChildren = map.get(parent);\n if (\n child === undefined &&\n currentChildren !== undefined &&\n typeof currentChildren !== 'boolean'\n ) {\n if (HierarchicalCheckboxMenu.isParentSelected(parent, valueMap)) {\n currentChildren.forEach((_, key) => currentChildren.set(key, false));\n } else {\n // for parent selection of false or null (indeterminate), select everything\n currentChildren.forEach((_, key) => currentChildren.set(key, true));\n }\n }\n\n onUpdateValueMap(map);\n }\n\n setAllValues(value: boolean): void {\n const { valueMap, onUpdateValueMap } = this.props;\n\n // Make a deep copy of the Map and set everything\n const copy = new Map();\n valueMap.forEach((child, parent) => {\n if (typeof child === 'boolean') {\n copy.set(parent, value);\n } else {\n const children = new Map();\n child.forEach((_, key) => children.set(key, value));\n copy.set(parent, children);\n }\n });\n\n onUpdateValueMap(copy);\n }\n\n selectAll(): void {\n this.setAllValues(true);\n }\n\n clear(): void {\n this.setAllValues(false);\n }\n\n renderMenuElement(): React.ReactNode {\n const { valueMap } = this.props;\n return (\n <div className=\"hcm-menu-container\">\n {Array.from(valueMap.entries()).map(([parent, children]) => (\n <div key={parent}>\n <Checkbox\n className=\"hcm-parent\"\n checked={HierarchicalCheckboxMenu.isParentSelected(\n parent,\n valueMap\n )}\n onChange={() => this.toggleValueFor(parent)}\n >\n {parent}\n </Checkbox>\n {children !== undefined &&\n typeof children !== 'boolean' &&\n Array.from(children.entries()).map(([child, value]) => (\n <Checkbox\n className=\"hcm-child\"\n key={child}\n checked={value}\n onChange={() => this.toggleValueFor(parent, child)}\n >\n {child}\n </Checkbox>\n ))}\n </div>\n ))}\n <button type=\"button\" className=\"btn btn-link\" onClick={this.selectAll}>\n Select All\n </button>\n <button type=\"button\" className=\"btn btn-link\" onClick={this.clear}>\n Clear\n </button>\n </div>\n );\n }\n\n render(): JSX.Element {\n const { menuText, className, icon, id } = this.props;\n const { menuIsOpen } = this.state;\n\n return (\n <button\n type=\"button\"\n className={classNames('btn hcm-btn', className)}\n onClick={this.toggleMenu}\n id={id}\n >\n <span>\n {icon && <FontAwesomeIcon icon={icon} className=\"hcm-icon mr-1\" />}\n {menuText}\n </span>\n <FontAwesomeIcon icon={dhSort} className=\"hcm-icon ml-1\" />\n <Popper\n options={{ placement: 'bottom' }}\n isShown={menuIsOpen}\n onExited={() => {\n this.setState({ menuIsOpen: false });\n }}\n closeOnBlur\n interactive\n >\n {this.renderMenuElement()}\n </Popper>\n </button>\n );\n }\n}\n\nexport default HierarchicalCheckboxMenu;\n"],"file":"HierarchicalCheckboxMenu.js"}
@@ -22,12 +22,13 @@ export declare type ItemListProps<T> = {
22
22
  rowHeight: number;
23
23
  offset: number;
24
24
  items: T[];
25
+ isDeselectOnClick: boolean;
25
26
  isDoubleClickSelect: boolean;
26
27
  isDragSelect: boolean;
27
28
  isMultiSelect: boolean;
28
29
  isStickyBottom: boolean;
29
30
  onFocusChange(index: number | null): void;
30
- onSelect(index: number): void;
31
+ onSelect(index: number, event: React.SyntheticEvent): void;
31
32
  onSelectionChange(ranges: Range[]): void;
32
33
  onViewportChange(topRow: number, bottomRow: number): void;
33
34
  overscanCount: number;
@@ -58,6 +59,7 @@ export declare class ItemList<T> extends PureComponent<ItemListProps<T>, ItemLis
58
59
  offset: number;
59
60
  items: never[];
60
61
  rowHeight: number;
62
+ isDeselectOnClick: boolean;
61
63
  isDoubleClickSelect: boolean;
62
64
  isDragSelect: boolean;
63
65
  isMultiSelect: boolean;
@@ -97,7 +99,7 @@ export declare class ItemList<T> extends PureComponent<ItemListProps<T>, ItemLis
97
99
  focusItem(itemIndex: number): void;
98
100
  scrollToItem(itemIndex: number): void;
99
101
  handleItemContextMenu(itemIndex: number, e: React.MouseEvent<HTMLDivElement>): void;
100
- handleItemDoubleClick(itemIndex: number): void;
102
+ handleItemDoubleClick(itemIndex: number, e: React.MouseEvent): void;
101
103
  handleItemMouseDown(index: number, e: React.MouseEvent): void;
102
104
  handleItemBlur(itemIndex: number, e: React.FocusEvent): void;
103
105
  handleItemFocus(itemIndex: number, e: React.FocusEvent): void;