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

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 (206) 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 +133 -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_inline_editing.jsx +102 -0
  19. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_inline_editing.md +4 -0
  20. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props.html.erb +1 -1
  21. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_rails.md +3 -1
  22. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_react.md +1 -1
  23. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header.html.erb +33 -0
  24. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header_rails.md +3 -0
  25. data/app/pb_kits/playbook/pb_advanced_table/docs/advanced_table_mock_data_infinite_scroll.json +152002 -0
  26. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +4 -1
  27. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +3 -1
  28. data/app/pb_kits/playbook/pb_card/_card.tsx +2 -1
  29. data/app/pb_kits/playbook/pb_checkbox/_checkbox.tsx +17 -8
  30. data/app/pb_kits/playbook/pb_checkbox/checkbox.test.js +16 -0
  31. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_react_hook.jsx +69 -0
  32. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_react_hook.md +1 -0
  33. data/app/pb_kits/playbook/pb_checkbox/docs/example.yml +2 -1
  34. data/app/pb_kits/playbook/pb_checkbox/docs/index.js +1 -0
  35. data/app/pb_kits/playbook/pb_currency/_currency.tsx +46 -31
  36. data/app/pb_kits/playbook/pb_currency/currency.html.erb +15 -8
  37. data/app/pb_kits/playbook/pb_currency/currency.rb +17 -2
  38. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display.html.erb +22 -0
  39. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display.jsx +34 -0
  40. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display_rails.md +1 -0
  41. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display_react.md +1 -0
  42. data/app/pb_kits/playbook/pb_currency/docs/example.yml +2 -0
  43. data/app/pb_kits/playbook/pb_currency/docs/index.js +2 -1
  44. data/app/pb_kits/playbook/pb_date_picker/date_picker.html.erb +4 -1
  45. data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +2 -0
  46. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_hooks.md +3 -1
  47. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_on_change.html.erb +39 -0
  48. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_on_close.html.erb +39 -0
  49. data/app/pb_kits/playbook/pb_date_picker/docs/example.yml +2 -0
  50. data/app/pb_kits/playbook/pb_date_picker/index.ts +38 -0
  51. data/app/pb_kits/playbook/pb_dialog/dialog.html.erb +5 -6
  52. data/app/pb_kits/playbook/pb_dialog/dialogHelper.js +2 -0
  53. data/app/pb_kits/playbook/pb_dialog/index.js +75 -0
  54. data/app/pb_kits/playbook/pb_drawer/_drawer.scss +43 -3
  55. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_behavior.html.erb +8 -0
  56. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_borders.html.erb +33 -0
  57. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_borders.jsx +3 -3
  58. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_breakpoints.html.erb +0 -0
  59. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_breakpoints.jsx +20 -37
  60. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_default.html.erb +20 -1
  61. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.html.erb +24 -0
  62. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.jsx +6 -6
  63. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.html.erb +21 -0
  64. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.jsx +1 -0
  65. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.md +1 -0
  66. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_sizes.html.erb +49 -0
  67. data/app/pb_kits/playbook/pb_drawer/docs/example.yml +6 -0
  68. data/app/pb_kits/playbook/pb_drawer/drawer.html.erb +20 -12
  69. data/app/pb_kits/playbook/pb_drawer/drawer.rb +49 -1
  70. data/app/pb_kits/playbook/pb_drawer/index.js +257 -0
  71. data/app/pb_kits/playbook/pb_filter/Filter/CurrentFilters.tsx +5 -4
  72. data/app/pb_kits/playbook/pb_filter/Filter/FilterSingle.tsx +2 -2
  73. data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +2 -1
  74. data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +4 -3
  75. data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +9 -2
  76. data/app/pb_kits/playbook/pb_form_pill/_form_pill.tsx +4 -0
  77. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_wrapped.html.erb +40 -0
  78. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_wrapped.jsx +50 -0
  79. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_wrapped.md +3 -0
  80. data/app/pb_kits/playbook/pb_form_pill/docs/example.yml +2 -0
  81. data/app/pb_kits/playbook/pb_form_pill/docs/index.js +1 -0
  82. data/app/pb_kits/playbook/pb_form_pill/form_pill.rb +7 -1
  83. data/app/pb_kits/playbook/pb_icon_button/_icon_button.tsx +71 -0
  84. data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_default.jsx +17 -0
  85. data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_sizes.jsx +61 -0
  86. data/app/pb_kits/playbook/pb_icon_button/docs/example.yml +4 -0
  87. data/app/pb_kits/playbook/pb_icon_button/docs/index.js +2 -0
  88. data/app/pb_kits/playbook/pb_icon_button/icon_button.html.erb +1 -1
  89. data/app/pb_kits/playbook/pb_icon_button/icon_button.test.jsx +39 -0
  90. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.scss +7 -0
  91. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +45 -8
  92. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.html.erb +72 -0
  93. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.jsx +91 -0
  94. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_react_hook.jsx +91 -0
  95. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_react_hook.md +1 -0
  96. data/app/pb_kits/playbook/pb_multi_level_select/docs/example.yml +3 -1
  97. data/app/pb_kits/playbook/pb_multi_level_select/docs/index.js +2 -0
  98. data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.rb +7 -1
  99. data/app/pb_kits/playbook/pb_overlay/_overlay.scss +13 -0
  100. data/app/pb_kits/playbook/pb_overlay/_overlay.tsx +11 -1
  101. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_hide_scroll_bar.html.erb +11 -0
  102. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_hide_scroll_bar.jsx +37 -0
  103. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_hide_scroll_bar_rails.md +1 -0
  104. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_hide_scroll_bar_react.md +1 -0
  105. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.html.erb +11 -0
  106. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.jsx +37 -0
  107. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.md +1 -0
  108. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional_react.md +1 -0
  109. data/app/pb_kits/playbook/pb_overlay/docs/example.yml +4 -0
  110. data/app/pb_kits/playbook/pb_overlay/docs/index.js +2 -0
  111. data/app/pb_kits/playbook/pb_overlay/index.js +61 -0
  112. data/app/pb_kits/playbook/pb_overlay/overlay.html.erb +5 -3
  113. data/app/pb_kits/playbook/pb_overlay/overlay.rb +16 -1
  114. data/app/pb_kits/playbook/pb_overlay/overlay.test.jsx +12 -0
  115. data/app/pb_kits/playbook/pb_overlay/subcomponents/_overlay_token.tsx +48 -10
  116. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +6 -0
  117. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_default.html.erb +1 -1
  118. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_hidden_inputs.html.erb +5 -0
  119. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_hidden_inputs.md +1 -0
  120. data/app/pb_kits/playbook/pb_phone_number_input/docs/example.yml +3 -1
  121. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.rb +3 -0
  122. data/app/pb_kits/playbook/pb_popover/_popover.tsx +2 -2
  123. data/app/pb_kits/playbook/pb_popover/popover.test.js +1 -1
  124. data/app/pb_kits/playbook/pb_progress_pills/progress_pills.html.erb +1 -6
  125. data/app/pb_kits/playbook/pb_progress_simple/progress_simple.html.erb +1 -5
  126. data/app/pb_kits/playbook/pb_progress_step/progress_step.html.erb +1 -5
  127. data/app/pb_kits/playbook/pb_progress_step/progress_step_item.html.erb +3 -7
  128. data/app/pb_kits/playbook/pb_radio/_radio.tsx +85 -74
  129. data/app/pb_kits/playbook/pb_radio/docs/_radio_react_hook.jsx +60 -0
  130. data/app/pb_kits/playbook/pb_radio/docs/_radio_react_hook.md +1 -0
  131. data/app/pb_kits/playbook/pb_radio/docs/example.yml +2 -1
  132. data/app/pb_kits/playbook/pb_radio/docs/index.js +1 -0
  133. data/app/pb_kits/playbook/pb_radio/radio.html.erb +6 -11
  134. data/app/pb_kits/playbook/pb_radio/radio.test.js +16 -0
  135. data/app/pb_kits/playbook/pb_select/docs/_select_react_hook.jsx +58 -0
  136. data/app/pb_kits/playbook/pb_select/docs/_select_react_hook.md +1 -0
  137. data/app/pb_kits/playbook/pb_select/docs/example.yml +1 -0
  138. data/app/pb_kits/playbook/pb_select/docs/index.js +1 -0
  139. data/app/pb_kits/playbook/pb_select/index.js +38 -0
  140. data/app/pb_kits/playbook/pb_select/select.html.erb +3 -5
  141. data/app/pb_kits/playbook/pb_select/select.rb +8 -0
  142. data/app/pb_kits/playbook/pb_selectable_card/selectable_card.html.erb +1 -5
  143. data/app/pb_kits/playbook/pb_selectable_card_icon/selectable_card_icon.html.erb +1 -4
  144. data/app/pb_kits/playbook/pb_selectable_icon/selectable_icon.html.erb +1 -5
  145. data/app/pb_kits/playbook/pb_text_input/inputMask.ts +2 -3
  146. data/app/pb_kits/playbook/pb_timeline/_timeline.scss +2 -2
  147. data/app/pb_kits/playbook/pb_title/_title.scss +32 -0
  148. data/app/pb_kits/playbook/pb_title/_title.tsx +10 -1
  149. data/app/pb_kits/playbook/pb_title/docs/_title_default.html.erb +1 -2
  150. data/app/pb_kits/playbook/pb_title/docs/_title_default.jsx +1 -1
  151. data/app/pb_kits/playbook/pb_title/docs/_title_display_size.html.erb +7 -0
  152. data/app/pb_kits/playbook/pb_title/docs/_title_display_size.jsx +54 -0
  153. data/app/pb_kits/playbook/pb_title/docs/_title_display_size.md +1 -0
  154. data/app/pb_kits/playbook/pb_title/docs/example.yml +2 -0
  155. data/app/pb_kits/playbook/pb_title/docs/index.js +1 -0
  156. data/app/pb_kits/playbook/pb_title/title.rb +10 -1
  157. data/app/pb_kits/playbook/pb_tooltip/_tooltip.scss +0 -3
  158. data/app/pb_kits/playbook/pb_tooltip/_tooltip.tsx +25 -0
  159. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_delay_rails.html.erb +39 -0
  160. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_delay_rails.md +3 -0
  161. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_icon_rails.html.erb +22 -0
  162. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_interaction.html.erb +26 -0
  163. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_sizing.jsx +69 -0
  164. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_sizing.md +3 -0
  165. data/app/pb_kits/playbook/pb_tooltip/docs/example.yml +4 -1
  166. data/app/pb_kits/playbook/pb_tooltip/docs/index.js +1 -0
  167. data/app/pb_kits/playbook/pb_tooltip/floating_ui.js +282 -0
  168. data/app/pb_kits/playbook/pb_tooltip/index.js +2 -2
  169. data/app/pb_kits/playbook/pb_tooltip/tooltip.rb +10 -2
  170. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +51 -5
  171. data/app/pb_kits/playbook/pb_typeahead/components/MultiValue.tsx +5 -1
  172. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options.html.erb +45 -0
  173. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options.md +5 -0
  174. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options_pure_rails.html.erb +33 -0
  175. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options_pure_rails.md +3 -0
  176. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_react_hook.jsx +66 -0
  177. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_react_hook.md +1 -0
  178. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_async_custom_options.jsx +1 -1
  179. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_async_users.jsx +1 -1
  180. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +3 -0
  181. data/app/pb_kits/playbook/pb_typeahead/docs/index.js +1 -0
  182. data/app/pb_kits/playbook/pb_typeahead/index.ts +61 -8
  183. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +17 -2
  184. data/app/pb_kits/playbook/tokens/_display.scss +3 -1
  185. data/app/pb_kits/playbook/utilities/_display.scss +6 -1
  186. data/app/pb_kits/playbook/utilities/object.test.js +99 -0
  187. data/app/pb_kits/playbook/utilities/object.ts +29 -1
  188. data/app/pb_kits/playbook/utilities/test/globalProps/display.test.js +1 -1
  189. data/dist/chunks/_typeahead-B8f4HM8I.js +36 -0
  190. data/dist/chunks/_weekday_stacked-BVO5G6au.js +45 -0
  191. data/dist/chunks/{lib-D3us1bGD.js → lib-5OzNgeeu.js} +2 -2
  192. data/dist/chunks/{pb_form_validation-BpihMSOQ.js → pb_form_validation-DGhKbZtO.js} +1 -1
  193. data/dist/chunks/vendor.js +1 -1
  194. data/dist/menu.yml +4 -4
  195. data/dist/playbook-doc.js +1 -1
  196. data/dist/playbook-rails-react-bindings.js +1 -1
  197. data/dist/playbook-rails.js +1 -1
  198. data/dist/playbook.css +1 -1
  199. data/lib/playbook/display.rb +2 -2
  200. data/lib/playbook/forms/builder/time_zone_select_field.rb +19 -0
  201. data/lib/playbook/forms/builder.rb +1 -0
  202. data/lib/playbook/version.rb +2 -2
  203. metadata +86 -7
  204. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_icon.erb +0 -10
  205. data/dist/chunks/_typeahead-CAIQfP7X.js +0 -36
  206. 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'
@@ -4,7 +4,7 @@
4
4
  new_window:object.new_window,
5
5
  target: object.target,
6
6
  dark: object.dark,
7
- border_radius: "lg" }) do %>
7
+ border_radius: "xs" }) do %>
8
8
  <%= pb_rails("icon", props: { icon: object.icon,
9
9
  fixed_width: true,
10
10
  dark: object.dark,
@@ -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"
@@ -452,6 +473,18 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
452
473
  ))
453
474
  : null}
454
475
 
476
+ {!returnAllSelected
477
+ ? defaultReturn.map((item) => (
478
+ <input
479
+ disabled={disabled}
480
+ key={item.id}
481
+ name={`${name}[]`}
482
+ type="hidden"
483
+ value={item.id}
484
+ />
485
+ ))
486
+ : null}
487
+
455
488
  {returnAllSelected &&
456
489
  returnedArray.length !== 0 &&
457
490
  inputDisplay === "pills"
@@ -461,6 +494,7 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
461
494
  key={index}
462
495
  onClick={(event: any) => handlePillClose(event, item)}
463
496
  text={item.label}
497
+ wrapped={wrapped}
464
498
  />
465
499
  ))
466
500
  : null}
@@ -474,6 +508,7 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
474
508
  key={index}
475
509
  onClick={(event: any) => handlePillClose(event, item)}
476
510
  text={item.label}
511
+ wrapped={wrapped}
477
512
  />
478
513
  ))
479
514
  : null}
@@ -489,6 +524,7 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
489
524
  )}
490
525
 
491
526
  <input
527
+ disabled={disabled}
492
528
  id="multiselect_input"
493
529
  onChange={(e) => {
494
530
  variant === "single"
@@ -537,8 +573,9 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
537
573
  </MultiLevelSelectContext.Provider>
538
574
  </div>
539
575
  );
540
- };
576
+ }) as MultiLevelSelectComponent;
541
577
 
578
+ MultiLevelSelect.displayName = "MultiLevelSelect";
542
579
  MultiLevelSelect.Options = MultiLevelSelectOptions;
543
580
 
544
581
  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 MultiLevelSelect 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,15 +33,17 @@ 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,
35
40
  treeData: tree_data,
36
41
  returnAllSelected: return_all_selected,
37
42
  selectedIds: selected_ids,
38
- input_name: input_name,
43
+ inputName: 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
  }