playbook_ui 14.14.0.pre.rc.5 → 14.15.0.pre.alpha.play1854reacthookmultilvlselect6572

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 (180) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +127 -0
  3. data/app/pb_kits/playbook/pb_advanced_table/Components/TableActionBar.tsx +55 -0
  4. data/app/pb_kits/playbook/pb_advanced_table/Components/TablePagination.tsx +33 -0
  5. data/app/pb_kits/playbook/pb_advanced_table/Components/VirtualizedTableView.tsx +275 -0
  6. data/app/pb_kits/playbook/pb_advanced_table/Context/AdvancedTableContext.tsx +143 -3
  7. data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableActions.ts +66 -0
  8. data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableState.ts +195 -0
  9. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableBody.tsx +45 -99
  10. data/app/pb_kits/playbook/pb_advanced_table/Utilities/CellRendererUtils.tsx +73 -0
  11. data/app/pb_kits/playbook/pb_advanced_table/Utilities/RowUtils.ts +52 -0
  12. data/app/pb_kits/playbook/pb_advanced_table/Utilities/TableContainerStyles.ts +80 -0
  13. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +126 -7
  14. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +153 -298
  15. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +8 -1
  16. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_headers_custom_cell.jsx +75 -0
  17. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_infinite_scroll.jsx +50 -0
  18. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props.html.erb +1 -1
  19. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_rails.md +3 -1
  20. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_react.md +1 -1
  21. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header.html.erb +33 -0
  22. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header_rails.md +3 -0
  23. data/app/pb_kits/playbook/pb_advanced_table/docs/advanced_table_mock_data_infinite_scroll.json +152002 -0
  24. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +2 -0
  25. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +2 -1
  26. data/app/pb_kits/playbook/pb_card/_card.tsx +2 -1
  27. data/app/pb_kits/playbook/pb_checkbox/_checkbox.tsx +17 -8
  28. data/app/pb_kits/playbook/pb_checkbox/checkbox.test.js +16 -0
  29. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_react_hook.jsx +69 -0
  30. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_react_hook.md +1 -0
  31. data/app/pb_kits/playbook/pb_checkbox/docs/example.yml +2 -1
  32. data/app/pb_kits/playbook/pb_checkbox/docs/index.js +1 -0
  33. data/app/pb_kits/playbook/pb_currency/_currency.tsx +46 -31
  34. data/app/pb_kits/playbook/pb_currency/currency.html.erb +15 -8
  35. data/app/pb_kits/playbook/pb_currency/currency.rb +17 -2
  36. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display.html.erb +22 -0
  37. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display.jsx +34 -0
  38. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display_rails.md +1 -0
  39. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display_react.md +1 -0
  40. data/app/pb_kits/playbook/pb_currency/docs/example.yml +2 -0
  41. data/app/pb_kits/playbook/pb_currency/docs/index.js +2 -1
  42. data/app/pb_kits/playbook/pb_date_picker/date_picker.html.erb +4 -1
  43. data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +2 -0
  44. data/app/pb_kits/playbook/pb_date_picker/index.ts +38 -0
  45. data/app/pb_kits/playbook/pb_dialog/dialog.html.erb +5 -6
  46. data/app/pb_kits/playbook/pb_dialog/dialogHelper.js +2 -0
  47. data/app/pb_kits/playbook/pb_dialog/index.js +75 -0
  48. data/app/pb_kits/playbook/pb_drawer/_drawer.scss +43 -3
  49. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_behavior.html.erb +8 -0
  50. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_borders.html.erb +33 -0
  51. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_borders.jsx +3 -3
  52. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_breakpoints.html.erb +0 -0
  53. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_breakpoints.jsx +20 -37
  54. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_default.html.erb +20 -1
  55. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.html.erb +24 -0
  56. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.jsx +6 -6
  57. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.html.erb +21 -0
  58. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.jsx +1 -0
  59. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.md +1 -0
  60. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_sizes.html.erb +49 -0
  61. data/app/pb_kits/playbook/pb_drawer/docs/example.yml +6 -0
  62. data/app/pb_kits/playbook/pb_drawer/drawer.html.erb +20 -12
  63. data/app/pb_kits/playbook/pb_drawer/drawer.rb +49 -1
  64. data/app/pb_kits/playbook/pb_drawer/index.js +257 -0
  65. data/app/pb_kits/playbook/pb_filter/Filter/CurrentFilters.tsx +5 -4
  66. data/app/pb_kits/playbook/pb_filter/Filter/FilterSingle.tsx +2 -2
  67. data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +1 -0
  68. data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +3 -2
  69. data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +9 -2
  70. data/app/pb_kits/playbook/pb_form_pill/_form_pill.tsx +4 -0
  71. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_wrapped.html.erb +40 -0
  72. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_wrapped.jsx +50 -0
  73. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_wrapped.md +3 -0
  74. data/app/pb_kits/playbook/pb_form_pill/docs/example.yml +2 -0
  75. data/app/pb_kits/playbook/pb_form_pill/docs/index.js +1 -0
  76. data/app/pb_kits/playbook/pb_form_pill/form_pill.rb +7 -1
  77. data/app/pb_kits/playbook/pb_icon_button/_icon_button.tsx +71 -0
  78. data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_default.jsx +17 -0
  79. data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_sizes.jsx +61 -0
  80. data/app/pb_kits/playbook/pb_icon_button/docs/example.yml +4 -0
  81. data/app/pb_kits/playbook/pb_icon_button/docs/index.js +2 -0
  82. data/app/pb_kits/playbook/pb_icon_button/icon_button.test.jsx +39 -0
  83. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.scss +7 -0
  84. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +33 -8
  85. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.html.erb +72 -0
  86. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.jsx +91 -0
  87. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_react_hook.jsx +91 -0
  88. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_react_hook.md +1 -0
  89. data/app/pb_kits/playbook/pb_multi_level_select/docs/example.yml +3 -1
  90. data/app/pb_kits/playbook/pb_multi_level_select/docs/index.js +2 -0
  91. data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.rb +6 -0
  92. data/app/pb_kits/playbook/pb_overlay/_overlay.scss +13 -0
  93. data/app/pb_kits/playbook/pb_overlay/_overlay.tsx +11 -1
  94. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_hide_scroll_bar.html.erb +11 -0
  95. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_hide_scroll_bar.jsx +37 -0
  96. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_hide_scroll_bar_rails.md +1 -0
  97. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_hide_scroll_bar_react.md +1 -0
  98. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.html.erb +11 -0
  99. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.jsx +37 -0
  100. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.md +1 -0
  101. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional_react.md +1 -0
  102. data/app/pb_kits/playbook/pb_overlay/docs/example.yml +4 -0
  103. data/app/pb_kits/playbook/pb_overlay/docs/index.js +2 -0
  104. data/app/pb_kits/playbook/pb_overlay/index.js +61 -0
  105. data/app/pb_kits/playbook/pb_overlay/overlay.html.erb +5 -3
  106. data/app/pb_kits/playbook/pb_overlay/overlay.rb +16 -1
  107. data/app/pb_kits/playbook/pb_overlay/overlay.test.jsx +12 -0
  108. data/app/pb_kits/playbook/pb_overlay/subcomponents/_overlay_token.tsx +48 -10
  109. data/app/pb_kits/playbook/pb_popover/_popover.tsx +1 -1
  110. data/app/pb_kits/playbook/pb_progress_pills/progress_pills.html.erb +1 -6
  111. data/app/pb_kits/playbook/pb_progress_simple/progress_simple.html.erb +1 -5
  112. data/app/pb_kits/playbook/pb_progress_step/progress_step.html.erb +1 -5
  113. data/app/pb_kits/playbook/pb_progress_step/progress_step_item.html.erb +3 -7
  114. data/app/pb_kits/playbook/pb_radio/_radio.tsx +85 -74
  115. data/app/pb_kits/playbook/pb_radio/docs/_radio_react_hook.jsx +60 -0
  116. data/app/pb_kits/playbook/pb_radio/docs/_radio_react_hook.md +1 -0
  117. data/app/pb_kits/playbook/pb_radio/docs/example.yml +2 -1
  118. data/app/pb_kits/playbook/pb_radio/docs/index.js +1 -0
  119. data/app/pb_kits/playbook/pb_radio/radio.html.erb +6 -11
  120. data/app/pb_kits/playbook/pb_radio/radio.test.js +16 -0
  121. data/app/pb_kits/playbook/pb_select/docs/_select_react_hook.jsx +58 -0
  122. data/app/pb_kits/playbook/pb_select/docs/_select_react_hook.md +1 -0
  123. data/app/pb_kits/playbook/pb_select/docs/example.yml +1 -0
  124. data/app/pb_kits/playbook/pb_select/docs/index.js +1 -0
  125. data/app/pb_kits/playbook/pb_select/index.js +38 -0
  126. data/app/pb_kits/playbook/pb_select/select.html.erb +3 -5
  127. data/app/pb_kits/playbook/pb_select/select.rb +8 -0
  128. data/app/pb_kits/playbook/pb_selectable_card/selectable_card.html.erb +1 -5
  129. data/app/pb_kits/playbook/pb_selectable_card_icon/selectable_card_icon.html.erb +1 -4
  130. data/app/pb_kits/playbook/pb_selectable_icon/selectable_icon.html.erb +1 -5
  131. data/app/pb_kits/playbook/pb_timeline/_timeline.scss +2 -2
  132. data/app/pb_kits/playbook/pb_title/_title.scss +32 -0
  133. data/app/pb_kits/playbook/pb_title/_title.tsx +10 -1
  134. data/app/pb_kits/playbook/pb_title/docs/_title_default.html.erb +1 -2
  135. data/app/pb_kits/playbook/pb_title/docs/_title_default.jsx +1 -1
  136. data/app/pb_kits/playbook/pb_title/docs/_title_display_size.html.erb +7 -0
  137. data/app/pb_kits/playbook/pb_title/docs/_title_display_size.jsx +54 -0
  138. data/app/pb_kits/playbook/pb_title/docs/_title_display_size.md +1 -0
  139. data/app/pb_kits/playbook/pb_title/docs/example.yml +2 -0
  140. data/app/pb_kits/playbook/pb_title/docs/index.js +1 -0
  141. data/app/pb_kits/playbook/pb_title/title.rb +10 -1
  142. data/app/pb_kits/playbook/pb_tooltip/_tooltip.scss +0 -3
  143. data/app/pb_kits/playbook/pb_tooltip/_tooltip.tsx +25 -0
  144. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_delay_rails.html.erb +39 -0
  145. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_delay_rails.md +3 -0
  146. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_interaction.html.erb +26 -0
  147. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_sizing.jsx +69 -0
  148. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_sizing.md +3 -0
  149. data/app/pb_kits/playbook/pb_tooltip/docs/example.yml +3 -1
  150. data/app/pb_kits/playbook/pb_tooltip/docs/index.js +1 -0
  151. data/app/pb_kits/playbook/pb_tooltip/floating_ui.js +282 -0
  152. data/app/pb_kits/playbook/pb_tooltip/index.js +2 -2
  153. data/app/pb_kits/playbook/pb_tooltip/tooltip.rb +10 -2
  154. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +36 -2
  155. data/app/pb_kits/playbook/pb_typeahead/components/MultiValue.tsx +5 -1
  156. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options.html.erb +45 -0
  157. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options.md +5 -0
  158. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options_pure_rails.html.erb +33 -0
  159. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options_pure_rails.md +3 -0
  160. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +2 -0
  161. data/app/pb_kits/playbook/pb_typeahead/index.ts +61 -8
  162. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +17 -2
  163. data/app/pb_kits/playbook/utilities/object.test.js +99 -0
  164. data/app/pb_kits/playbook/utilities/object.ts +29 -1
  165. data/dist/chunks/_typeahead-DKSD8vAY.js +36 -0
  166. data/dist/chunks/_weekday_stacked-C-GXG8yh.js +45 -0
  167. data/dist/chunks/{lib-D3us1bGD.js → lib-5OzNgeeu.js} +2 -2
  168. data/dist/chunks/{pb_form_validation-BpihMSOQ.js → pb_form_validation-DGhKbZtO.js} +1 -1
  169. data/dist/chunks/vendor.js +1 -1
  170. data/dist/menu.yml +3 -3
  171. data/dist/playbook-doc.js +1 -1
  172. data/dist/playbook-rails-react-bindings.js +1 -1
  173. data/dist/playbook-rails.js +1 -1
  174. data/dist/playbook.css +1 -1
  175. data/lib/playbook/forms/builder/time_zone_select_field.rb +19 -0
  176. data/lib/playbook/forms/builder.rb +1 -0
  177. data/lib/playbook/version.rb +2 -2
  178. metadata +77 -6
  179. data/dist/chunks/_typeahead-CAIQfP7X.js +0 -36
  180. data/dist/chunks/_weekday_stacked-DstwbGUv.js +0 -45
@@ -0,0 +1,61 @@
1
+ import React from 'react'
2
+ import { IconButton, Flex } from 'playbook-ui'
3
+
4
+ const IconButtonSizes = (props) => (
5
+ <div>
6
+ <Flex align="center">
7
+ <IconButton
8
+ {...props}
9
+ size="lg"
10
+ />
11
+ <span>Large</span>
12
+ </Flex>
13
+ <Flex align="center">
14
+ <IconButton
15
+ {...props}
16
+ size="sm"
17
+ />
18
+ <span>Small</span>
19
+ </Flex>
20
+ <Flex align="center">
21
+ <IconButton
22
+ {...props}
23
+ size="xs"
24
+ />
25
+ <span>XSmall</span>
26
+ </Flex>
27
+ <Flex
28
+ align="center"
29
+ marginTop="md"
30
+ >
31
+ <IconButton
32
+ {...props}
33
+ size="1x"
34
+ />
35
+ <span>1x</span>
36
+ </Flex>
37
+ <Flex align="center">
38
+ <IconButton
39
+ {...props}
40
+ size="2x"
41
+ />
42
+ <span>2x</span>
43
+ </Flex>
44
+ <Flex align="center">
45
+ <IconButton
46
+ {...props}
47
+ size="3x"
48
+ />
49
+ <span>3x</span>
50
+ </Flex>
51
+ <Flex align="center">
52
+ <IconButton
53
+ {...props}
54
+ size="4x"
55
+ />
56
+ <span>4x</span>
57
+ </Flex>
58
+ </div>
59
+ )
60
+
61
+ export default IconButtonSizes
@@ -3,3 +3,7 @@ examples:
3
3
  rails:
4
4
  - icon_button_default: Default
5
5
  - icon_button_sizes: Sizes
6
+
7
+ react:
8
+ - icon_button_default: Default
9
+ - icon_button_sizes: Sizes
@@ -0,0 +1,2 @@
1
+ export { default as IconButtonDefault } from './_icon_button_default.jsx'
2
+ export { default as IconButtonSizes } from './_icon_button_sizes.jsx'
@@ -0,0 +1,39 @@
1
+ import { ensureAccessible, renderKit } from '../utilities/test-utils'
2
+
3
+ import { IconButton } from 'playbook-ui'
4
+
5
+ const props = {
6
+ data: { testid: 'default', icon: 'plus' }
7
+ }
8
+
9
+ test('default test', () => {
10
+ const kit = renderKit(IconButton, props)
11
+
12
+ expect(kit).toBeInTheDocument()
13
+ expect(kit).toHaveClass('pb_icon_button_kit_default')
14
+
15
+ const iconElement = kit.querySelector('.icon_button_icon')
16
+ expect(iconElement).toBeInTheDocument()
17
+ })
18
+
19
+ it("should be accessible", async () => {
20
+ ensureAccessible(IconButton, props)
21
+ })
22
+
23
+ test('passes link variant prop', () => {
24
+ const kit = renderKit(IconButton, { ...props, variant: "link" })
25
+ expect(kit).toBeInTheDocument()
26
+ expect(kit).toHaveClass('pb_icon_button_kit_link')
27
+ })
28
+
29
+ test('should set button type to "submit" when htmlType prop is passed', () => {
30
+ const kit = renderKit(IconButton, { ...props, htmlType: 'submit' })
31
+ const buttonElement = kit.querySelector('button')
32
+ expect(buttonElement).toHaveAttribute('type', 'submit')
33
+ })
34
+
35
+ test('passes custom classname', () => {
36
+ const kit = renderKit(IconButton, { ...props, className: "extra_class" })
37
+ expect(kit).toBeInTheDocument()
38
+ expect(kit).toHaveClass('pb_icon_button_kit_default extra_class')
39
+ })
@@ -42,6 +42,13 @@
42
42
  outline: none;
43
43
  }
44
44
  }
45
+
46
+ &:has(input:disabled) {
47
+ background-color: shade($white, 5%);
48
+ box-shadow: none;
49
+ cursor: default;
50
+ opacity: 0.5;
51
+ }
45
52
  }
46
53
  }
47
54
  .dropdown_menu {
@@ -1,4 +1,4 @@
1
- import React, { useState, useEffect, useRef } from "react";
1
+ import React, { useState, useEffect, useRef, forwardRef } from "react";
2
2
  import classnames from "classnames";
3
3
  import { globalProps, GlobalProps } from "../utilities/globalProps";
4
4
  import {
@@ -23,10 +23,18 @@ import {
23
23
  getExpandedItems,
24
24
  } from "./_helper_functions";
25
25
 
26
+ interface MultiLevelSelectComponent
27
+ extends React.ForwardRefExoticComponent<
28
+ MultiLevelSelectProps & React.RefAttributes<HTMLInputElement>
29
+ > {
30
+ Options: typeof MultiLevelSelectOptions;
31
+ }
32
+
26
33
  type MultiLevelSelectProps = {
27
34
  aria?: { [key: string]: string }
28
35
  className?: string
29
36
  data?: { [key: string]: string }
37
+ disabled?: boolean
30
38
  htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
31
39
  id?: string
32
40
  inputDisplay?: "pills" | "none"
@@ -34,17 +42,20 @@ type MultiLevelSelectProps = {
34
42
  name?: string
35
43
  returnAllSelected?: boolean
36
44
  treeData?: { [key: string]: string; }[] | any
45
+ onChange?: (event: { target: { name?: string; value: any } }) => void
37
46
  onSelect?: (prop: { [key: string]: any }) => void
38
47
  selectedIds?: string[] | any
39
48
  variant?: "multi" | "single"
49
+ wrapped?: boolean
40
50
  pillColor?: "primary" | "neutral" | "success" | "warning" | "error" | "info" | "data_1" | "data_2" | "data_3" | "data_4" | "data_5" | "data_6" | "data_7" | "data_8" | "windows" | "siding" | "roofing" | "doors" | "gutters" | "solar" | "insulation" | "accessories",
41
51
  } & GlobalProps
42
52
 
43
- const MultiLevelSelect = (props: MultiLevelSelectProps) => {
53
+ const MultiLevelSelect = forwardRef<HTMLInputElement, MultiLevelSelectProps>((props) => {
44
54
  const {
45
55
  aria = {},
46
56
  className,
47
57
  data = {},
58
+ disabled = false,
48
59
  htmlOptions = {},
49
60
  id,
50
61
  inputDisplay = "pills",
@@ -52,10 +63,12 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
52
63
  name,
53
64
  returnAllSelected = false,
54
65
  treeData,
66
+ onChange = () => null,
55
67
  onSelect = () => null,
56
68
  selectedIds,
57
69
  variant = "multi",
58
70
  children,
71
+ wrapped,
59
72
  pillColor = "primary"
60
73
  } = props
61
74
 
@@ -283,8 +296,10 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
283
296
  // Logic for removing items from returnArray or defaultReturn when pills clicked
284
297
  if (returnAllSelected) {
285
298
  onSelect(getCheckedItems(updatedTree));
299
+ onChange({ target: { name, value: getCheckedItems(updatedTree) } });
286
300
  } else {
287
301
  onSelect(getDefaultCheckedItems(updatedTree));
302
+ onChange({ target: { name, value: getDefaultCheckedItems(updatedTree) } });
288
303
  }
289
304
  };
290
305
 
@@ -292,7 +307,8 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
292
307
  const handleInputWrapperClick = (e: any) => {
293
308
  if (
294
309
  e.target.id === "multiselect_input" ||
295
- e.target.classList.contains("pb_form_pill_tag")
310
+ e.target.classList.contains("pb_form_pill_tag") ||
311
+ disabled
296
312
  ) {
297
313
  return;
298
314
  }
@@ -309,8 +325,10 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
309
325
  const updatedTree = changeItem(filtered[0], check);
310
326
  if (returnAllSelected) {
311
327
  onSelect(getCheckedItems(updatedTree));
328
+ onChange({ target: { name, value: getCheckedItems(updatedTree) } });
312
329
  } else {
313
330
  onSelect(getDefaultCheckedItems(updatedTree));
331
+ onChange({ target: { name, value: getDefaultCheckedItems(updatedTree) } });
314
332
  }
315
333
  };
316
334
 
@@ -343,6 +361,7 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
343
361
  setIsDropdownClosed(true);
344
362
 
345
363
  onSelect(selectedItem);
364
+ onChange({ target: { name, value: selectedItem } });
346
365
  };
347
366
 
348
367
  // Single select: reset the tree state upon typing
@@ -384,12 +403,12 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
384
403
  // Rendering formattedData to UI based on typeahead
385
404
  const renderNestedOptions = (items: { [key: string]: string; }[] | any ) => {
386
405
  const hasOptionsChild = React.Children.toArray(props.children).some(
387
- (child: any) => child.type === MultiLevelSelect.Options
406
+ (child) => React.isValidElement(child) && child.type === MultiLevelSelect.Options
388
407
  );
389
408
 
390
409
  if (hasOptionsChild) {
391
410
  return React.Children.map(props.children, (child) => {
392
- if (child.type === MultiLevelSelect.Options) {
411
+ if (React.isValidElement(child) && child.type === MultiLevelSelect.Options) {
393
412
  return React.cloneElement(child, { items });
394
413
  }
395
414
  return null;
@@ -421,16 +440,17 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
421
440
  handledropdownItemClick,
422
441
  filterItem,
423
442
  }}>
424
- <div className="wrapper"
443
+ <div className="wrapper"
425
444
  ref={dropdownRef}
426
445
  >
427
- <div className="input_wrapper"
446
+ <div className="input_wrapper"
428
447
  onClick={handleInputWrapperClick}
429
448
  >
430
449
  <div className="input_inner_container">
431
450
  {variant === "single" && defaultReturn.length !== 0
432
451
  ? defaultReturn.map((selectedItem) => (
433
452
  <input
453
+ disabled={disabled}
434
454
  key={selectedItem.id}
435
455
  name={`${name}[]`}
436
456
  type="hidden"
@@ -444,6 +464,7 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
444
464
  {returnAllSelected && returnedArray.length !== 0
445
465
  ? returnedArray.map((item) => (
446
466
  <input
467
+ disabled={disabled}
447
468
  key={item.id}
448
469
  name={`${name}[]`}
449
470
  type="hidden"
@@ -461,6 +482,7 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
461
482
  key={index}
462
483
  onClick={(event: any) => handlePillClose(event, item)}
463
484
  text={item.label}
485
+ wrapped={wrapped}
464
486
  />
465
487
  ))
466
488
  : null}
@@ -474,6 +496,7 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
474
496
  key={index}
475
497
  onClick={(event: any) => handlePillClose(event, item)}
476
498
  text={item.label}
499
+ wrapped={wrapped}
477
500
  />
478
501
  ))
479
502
  : null}
@@ -489,6 +512,7 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
489
512
  )}
490
513
 
491
514
  <input
515
+ disabled={disabled}
492
516
  id="multiselect_input"
493
517
  onChange={(e) => {
494
518
  variant === "single"
@@ -537,8 +561,9 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
537
561
  </MultiLevelSelectContext.Provider>
538
562
  </div>
539
563
  );
540
- };
564
+ }) as MultiLevelSelectComponent;
541
565
 
566
+ MultiLevelSelect.displayName = "MultiLevelSelect";
542
567
  MultiLevelSelect.Options = MultiLevelSelectOptions;
543
568
 
544
569
  export default MultiLevelSelect;
@@ -0,0 +1,72 @@
1
+ <% treeData = [{
2
+ label: "Power Home Remodeling",
3
+ value: "Power Home Remodeling",
4
+ id: "100",
5
+ expanded: true,
6
+ children: [
7
+ {
8
+ label: "People",
9
+ value: "People",
10
+ id: "101",
11
+ expanded: true,
12
+ children: [
13
+ {
14
+ label: "Talent Acquisition",
15
+ value: "Talent Acquisition",
16
+ id: "102",
17
+ },
18
+ {
19
+ label: "Business Affairs",
20
+ value: "Business Affairs",
21
+ id: "103",
22
+ children: [
23
+ {
24
+ label: "Initiatives",
25
+ value: "Initiatives",
26
+ id: "104",
27
+ },
28
+ {
29
+ label: "Learning & Development",
30
+ value: "Learning & Development",
31
+ id: "105",
32
+ },
33
+ ],
34
+ },
35
+ {
36
+ label: "People Experience",
37
+ value: "People Experience",
38
+ id: "106",
39
+ },
40
+ ],
41
+ },
42
+ {
43
+ label: "Contact Center",
44
+ value: "Contact Center",
45
+ id: "107",
46
+ children: [
47
+ {
48
+ label: "Appointment Management",
49
+ value: "Appointment Management",
50
+ id: "108",
51
+ },
52
+ {
53
+ label: "Customer Service",
54
+ value: "Customer Service",
55
+ id: "109",
56
+ },
57
+ {
58
+ label: "Energy",
59
+ value: "Energy",
60
+ id: "110",
61
+ },
62
+ ],
63
+ },
64
+ ],
65
+ }] %>
66
+
67
+ <%= pb_rails("multi_level_select", props: {
68
+ disabled: true,
69
+ id: "multi-level-select-default-rails",
70
+ name: "my_array",
71
+ tree_data: treeData
72
+ }) %>
@@ -0,0 +1,91 @@
1
+ import React from "react";
2
+ import MultiLevelSelect from "../_multi_level_select";
3
+
4
+ const treeData = [
5
+ {
6
+ label: "Power Home Remodeling",
7
+ value: "Power Home Remodeling",
8
+ id: "powerhome1",
9
+ expanded: true,
10
+ children: [
11
+ {
12
+ label: "People",
13
+ value: "People",
14
+ id: "people1",
15
+ expanded: true,
16
+ children: [
17
+ {
18
+ label: "Talent Acquisition",
19
+ value: "Talent Acquisition",
20
+ id: "talent1",
21
+ },
22
+ {
23
+ label: "Business Affairs",
24
+ value: "Business Affairs",
25
+ id: "business1",
26
+ children: [
27
+ {
28
+ label: "Initiatives",
29
+ value: "Initiatives",
30
+ id: "initiative1",
31
+ },
32
+ {
33
+ label: "Learning & Development",
34
+ value: "Learning & Development",
35
+ id: "development1",
36
+ },
37
+ ],
38
+ },
39
+ {
40
+ label: "People Experience",
41
+ value: "People Experience",
42
+ id: "experience1",
43
+ },
44
+ ],
45
+ },
46
+ {
47
+ label: "Contact Center",
48
+ value: "Contact Center",
49
+ id: "contact1",
50
+ children: [
51
+ {
52
+ label: "Appointment Management",
53
+ value: "Appointment Management",
54
+ id: "appointment1",
55
+ },
56
+ {
57
+ label: "Customer Service",
58
+ value: "Customer Service",
59
+ id: "customer1",
60
+ },
61
+ {
62
+ label: "Energy",
63
+ value: "Energy",
64
+ id: "energy1",
65
+ },
66
+ ],
67
+ },
68
+ ],
69
+ },
70
+ ];
71
+
72
+ const MultiLevelSelectDisabled = (props) => {
73
+ return (
74
+ <>
75
+ <MultiLevelSelect
76
+ disabled
77
+ id='multiselect-default'
78
+ onSelect={(selectedNodes) =>
79
+ console.log(
80
+ "Selected Items",
81
+ selectedNodes
82
+ )
83
+ }
84
+ treeData={treeData}
85
+ {...props}
86
+ />
87
+ </>
88
+ )
89
+ };
90
+
91
+ export default MultiLevelSelectDisabled
@@ -0,0 +1,91 @@
1
+ import React from "react"
2
+ import MultiLevelSelect from "../_multi_level_select"
3
+ import { useForm } from "react-hook-form"
4
+
5
+ const treeData = [
6
+ {
7
+ label: "Power Home Remodeling",
8
+ value: "Power Home Remodeling",
9
+ id: "powerhome1",
10
+ expanded: true,
11
+ children: [
12
+ {
13
+ label: "People",
14
+ value: "People",
15
+ id: "people1",
16
+ expanded: true,
17
+ children: [
18
+ {
19
+ label: "Talent Acquisition",
20
+ value: "Talent Acquisition",
21
+ id: "talent1",
22
+ },
23
+ {
24
+ label: "Business Affairs",
25
+ value: "Business Affairs",
26
+ id: "business1",
27
+ children: [
28
+ {
29
+ label: "Initiatives",
30
+ value: "Initiatives",
31
+ id: "initiative1",
32
+ },
33
+ {
34
+ label: "Learning & Development",
35
+ value: "Learning & Development",
36
+ id: "development1",
37
+ },
38
+ ],
39
+ },
40
+ {
41
+ label: "People Experience",
42
+ value: "People Experience",
43
+ id: "experience1",
44
+ },
45
+ ],
46
+ },
47
+ {
48
+ label: "Contact Center",
49
+ value: "Contact Center",
50
+ id: "contact1",
51
+ children: [
52
+ {
53
+ label: "Appointment Management",
54
+ value: "Appointment Management",
55
+ id: "appointment1",
56
+ },
57
+ {
58
+ label: "Customer Service",
59
+ value: "Customer Service",
60
+ id: "customer1",
61
+ },
62
+ {
63
+ label: "Energy",
64
+ value: "Energy",
65
+ id: "energy1",
66
+ },
67
+ ],
68
+ },
69
+ ],
70
+ },
71
+ ]
72
+
73
+ const MultiLevelSelectReactHook = (props) => {
74
+ const { register, watch } = useForm()
75
+ const selectedItems = watch("departments")
76
+ selectedItems && console.log("Selected Items", selectedItems)
77
+
78
+ return (
79
+ <div>
80
+ <MultiLevelSelect
81
+ id="multiselect-default"
82
+ marginBottom="md"
83
+ treeData={treeData}
84
+ {...register("departments")}
85
+ {...props}
86
+ />
87
+ </div>
88
+ )
89
+ }
90
+
91
+ export default MultiLevelSelectReactHook
@@ -0,0 +1 @@
1
+ You can pass `react-hook-form` props to the Typeahead kit. Check your console to see the full data selected from this example.
@@ -8,9 +8,11 @@ examples:
8
8
  - multi_level_select_with_form: With Form
9
9
  - multi_level_select_color: With Pills (Custom Color)
10
10
  - multi_level_select_reset: Reset Selection
11
+ - multi_level_select_disabled: Disabled
11
12
 
12
13
  react:
13
14
  - multi_level_select_default: Default
15
+ - multi_level_select_react_hook: React Hook
14
16
  - multi_level_select_single: Single Select
15
17
  - multi_level_select_single_children_only: Single Select w/ Hidden Radios
16
18
  - multi_level_select_return_all_selected: Return All Selected
@@ -18,4 +20,4 @@ examples:
18
20
  - multi_level_select_color: With Pills (Custom Color)
19
21
  - multi_level_select_with_children: Checkboxes With Children
20
22
  - multi_level_select_with_children_with_radios: Single Select With Children
21
-
23
+ - multi_level_select_disabled: Disabled
@@ -6,3 +6,5 @@ export { default as MultiLevelSelectSelectedIdsReact } from "./_multi_level_sele
6
6
  export { default as MultiLevelSelectColor } from './_multi_level_select_color.jsx'
7
7
  export { default as MultiLevelSelectWithChildren } from './_multi_level_select_with_children.jsx'
8
8
  export { default as MultiLevelSelectWithChildrenWithRadios } from './_multi_level_select_with_children_with_radios.jsx'
9
+ export { default as MultiLevelSelectDisabled } from './_multi_level_select_disabled.jsx'
10
+ export { default as MultiLevelSelectReactHook } from './_multi_level_select_react_hook.jsx'
@@ -22,6 +22,10 @@ module Playbook
22
22
  prop :pill_color, type: Playbook::Props::Enum,
23
23
  values: %w[primary neutral success warning error info data_1 data_2 data_3 data_4 data_5 data_6 data_7 data_8 windows siding roofing doors gutters solar insulation accessories],
24
24
  default: "primary"
25
+ prop :wrapped, type: Playbook::Props::Boolean,
26
+ default: false
27
+ prop :disabled, type: Playbook::Props::Boolean,
28
+ default: false
25
29
 
26
30
  def classname
27
31
  generate_classname("pb_multi_level_select")
@@ -29,6 +33,7 @@ module Playbook
29
33
 
30
34
  def multi_level_select_options
31
35
  {
36
+ disabled: disabled,
32
37
  id: id,
33
38
  inputDisplay: input_display,
34
39
  name: name,
@@ -38,6 +43,7 @@ module Playbook
38
43
  input_name: input_name,
39
44
  variant: variant,
40
45
  pillColor: pill_color,
46
+ wrapped: wrapped,
41
47
  }
42
48
  end
43
49
  end
@@ -69,4 +69,17 @@ $overlay_colors: (
69
69
  pointer-events: none;
70
70
  z-index: 1;
71
71
  }
72
+
73
+ &.overlay-hide-scrollbar {
74
+ & [class*="overflow_x_auto"],
75
+ & [class*="overflow_y_auto"],
76
+ & [class*="overflow_auto"] {
77
+ &::-webkit-scrollbar {
78
+ display: none !important;
79
+ }
80
+
81
+ -ms-overflow-style: none !important;
82
+ scrollbar-width: none !important;
83
+ }
84
+ }
72
85
  }
@@ -8,8 +8,10 @@ import OverlayToken from './subcomponents/_overlay_token'
8
8
  export type OverlayChildrenProps = {
9
9
  children: React.ReactNode[] | React.ReactNode,
10
10
  color: "card_light" | "bg_light" | "card_dark" | "bg_dark",
11
+ dynamic?: boolean,
11
12
  position: string,
12
13
  size: string,
14
+ scrollBarNone?: boolean,
13
15
  }
14
16
 
15
17
  type OverlayProps = {
@@ -18,9 +20,12 @@ type OverlayProps = {
18
20
  children: React.ReactNode[] | React.ReactNode,
19
21
  color: "card_light" | "bg_light" | "card_dark" | "bg_dark",
20
22
  data?: { [key: string]: string },
23
+ dynamic?: false,
21
24
  htmlOptions?: { [key: string]: string | number | boolean | (() => void) },
22
25
  id?: string,
23
26
  layout: { [key: string]: string },
27
+ scrollBarNone?: boolean,
28
+
24
29
  }
25
30
 
26
31
  const Overlay = (props: OverlayProps) => {
@@ -30,14 +35,16 @@ const Overlay = (props: OverlayProps) => {
30
35
  children,
31
36
  color = "card_light",
32
37
  data = {},
38
+ dynamic = false,
33
39
  htmlOptions = {},
34
40
  id,
35
41
  layout = { "bottom": "full" },
42
+ scrollBarNone = false,
36
43
  } = props
37
44
 
38
45
  const ariaProps = buildAriaProps(aria)
39
46
  const dataProps = buildDataProps(data)
40
- const classes = classnames(buildCss('pb_overlay'), globalProps(props), className)
47
+ const classes = classnames(buildCss('pb_overlay'), { 'overlay-hide-scrollbar': scrollBarNone }, globalProps(props), className )
41
48
  const htmlProps = buildHtmlProps(htmlOptions)
42
49
  const dynamicInlineProps = globalInlineProps(props)
43
50
 
@@ -65,11 +72,14 @@ const Overlay = (props: OverlayProps) => {
65
72
  children,
66
73
  color,
67
74
  position: getPosition(),
75
+ scrollBarNone,
68
76
  size: getSize()
69
77
  }) : OverlayToken({
70
78
  children,
71
79
  color,
80
+ dynamic: dynamic,
72
81
  position: getPosition(),
82
+ scrollBarNone,
73
83
  size: getSize()
74
84
  })
75
85
  }