playbook_ui 14.14.0 → 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 (160) 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 +123 -7
  14. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +153 -299
  15. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_infinite_scroll.jsx +50 -0
  16. data/app/pb_kits/playbook/pb_advanced_table/docs/advanced_table_mock_data_infinite_scroll.json +152002 -0
  17. data/app/pb_kits/playbook/pb_card/_card.tsx +2 -1
  18. data/app/pb_kits/playbook/pb_currency/_currency.tsx +46 -31
  19. data/app/pb_kits/playbook/pb_currency/currency.html.erb +15 -8
  20. data/app/pb_kits/playbook/pb_currency/currency.rb +17 -2
  21. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display.html.erb +22 -0
  22. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display.jsx +34 -0
  23. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display_rails.md +1 -0
  24. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display_react.md +1 -0
  25. data/app/pb_kits/playbook/pb_currency/docs/example.yml +2 -0
  26. data/app/pb_kits/playbook/pb_currency/docs/index.js +2 -1
  27. data/app/pb_kits/playbook/pb_date_picker/date_picker.html.erb +4 -1
  28. data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +2 -0
  29. data/app/pb_kits/playbook/pb_date_picker/index.ts +38 -0
  30. data/app/pb_kits/playbook/pb_dialog/dialog.html.erb +5 -6
  31. data/app/pb_kits/playbook/pb_dialog/dialogHelper.js +2 -0
  32. data/app/pb_kits/playbook/pb_dialog/index.js +75 -0
  33. data/app/pb_kits/playbook/pb_drawer/_drawer.scss +43 -3
  34. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_behavior.html.erb +8 -0
  35. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_borders.html.erb +33 -0
  36. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_borders.jsx +3 -3
  37. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_breakpoints.html.erb +0 -0
  38. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_breakpoints.jsx +20 -37
  39. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_default.html.erb +20 -1
  40. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.html.erb +24 -0
  41. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.jsx +6 -6
  42. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.html.erb +21 -0
  43. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.jsx +1 -0
  44. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.md +1 -0
  45. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_sizes.html.erb +49 -0
  46. data/app/pb_kits/playbook/pb_drawer/docs/example.yml +6 -0
  47. data/app/pb_kits/playbook/pb_drawer/drawer.html.erb +20 -12
  48. data/app/pb_kits/playbook/pb_drawer/drawer.rb +49 -1
  49. data/app/pb_kits/playbook/pb_drawer/index.js +257 -0
  50. data/app/pb_kits/playbook/pb_filter/Filter/CurrentFilters.tsx +5 -4
  51. data/app/pb_kits/playbook/pb_filter/Filter/FilterSingle.tsx +2 -2
  52. data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +1 -0
  53. data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +3 -2
  54. data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +9 -2
  55. data/app/pb_kits/playbook/pb_form_pill/_form_pill.tsx +4 -0
  56. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_wrapped.html.erb +40 -0
  57. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_wrapped.jsx +50 -0
  58. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_wrapped.md +3 -0
  59. data/app/pb_kits/playbook/pb_form_pill/docs/example.yml +2 -0
  60. data/app/pb_kits/playbook/pb_form_pill/docs/index.js +1 -0
  61. data/app/pb_kits/playbook/pb_form_pill/form_pill.rb +7 -1
  62. data/app/pb_kits/playbook/pb_icon_button/_icon_button.tsx +71 -0
  63. data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_default.jsx +17 -0
  64. data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_sizes.jsx +61 -0
  65. data/app/pb_kits/playbook/pb_icon_button/docs/example.yml +4 -0
  66. data/app/pb_kits/playbook/pb_icon_button/docs/index.js +2 -0
  67. data/app/pb_kits/playbook/pb_icon_button/icon_button.test.jsx +39 -0
  68. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.scss +7 -0
  69. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +33 -8
  70. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.html.erb +72 -0
  71. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.jsx +91 -0
  72. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_react_hook.jsx +91 -0
  73. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_react_hook.md +1 -0
  74. data/app/pb_kits/playbook/pb_multi_level_select/docs/example.yml +3 -1
  75. data/app/pb_kits/playbook/pb_multi_level_select/docs/index.js +2 -0
  76. data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.rb +6 -0
  77. data/app/pb_kits/playbook/pb_overlay/_overlay.scss +13 -0
  78. data/app/pb_kits/playbook/pb_overlay/_overlay.tsx +7 -1
  79. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_hide_scroll_bar.html.erb +11 -0
  80. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_hide_scroll_bar.jsx +37 -0
  81. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_hide_scroll_bar_rails.md +1 -0
  82. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_hide_scroll_bar_react.md +1 -0
  83. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.html.erb +11 -0
  84. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.md +1 -0
  85. data/app/pb_kits/playbook/pb_overlay/docs/example.yml +3 -0
  86. data/app/pb_kits/playbook/pb_overlay/docs/index.js +1 -0
  87. data/app/pb_kits/playbook/pb_overlay/index.js +61 -0
  88. data/app/pb_kits/playbook/pb_overlay/overlay.html.erb +5 -3
  89. data/app/pb_kits/playbook/pb_overlay/overlay.rb +16 -1
  90. data/app/pb_kits/playbook/pb_overlay/overlay.test.jsx +12 -0
  91. data/app/pb_kits/playbook/pb_popover/_popover.tsx +1 -1
  92. data/app/pb_kits/playbook/pb_progress_step/progress_step_item.html.erb +2 -2
  93. data/app/pb_kits/playbook/pb_radio/_radio.tsx +85 -74
  94. data/app/pb_kits/playbook/pb_radio/docs/_radio_react_hook.jsx +60 -0
  95. data/app/pb_kits/playbook/pb_radio/docs/_radio_react_hook.md +1 -0
  96. data/app/pb_kits/playbook/pb_radio/docs/example.yml +2 -1
  97. data/app/pb_kits/playbook/pb_radio/docs/index.js +1 -0
  98. data/app/pb_kits/playbook/pb_radio/radio.test.js +16 -0
  99. data/app/pb_kits/playbook/pb_select/docs/_select_react_hook.jsx +58 -0
  100. data/app/pb_kits/playbook/pb_select/docs/_select_react_hook.md +1 -0
  101. data/app/pb_kits/playbook/pb_select/docs/example.yml +1 -0
  102. data/app/pb_kits/playbook/pb_select/docs/index.js +1 -0
  103. data/app/pb_kits/playbook/pb_select/index.js +38 -0
  104. data/app/pb_kits/playbook/pb_select/select.html.erb +3 -5
  105. data/app/pb_kits/playbook/pb_select/select.rb +8 -0
  106. data/app/pb_kits/playbook/pb_selectable_card/selectable_card.html.erb +1 -5
  107. data/app/pb_kits/playbook/pb_selectable_card_icon/selectable_card_icon.html.erb +1 -4
  108. data/app/pb_kits/playbook/pb_selectable_icon/selectable_icon.html.erb +1 -5
  109. data/app/pb_kits/playbook/pb_timeline/_timeline.scss +2 -2
  110. data/app/pb_kits/playbook/pb_title/_title.scss +32 -0
  111. data/app/pb_kits/playbook/pb_title/_title.tsx +10 -1
  112. data/app/pb_kits/playbook/pb_title/docs/_title_default.html.erb +1 -2
  113. data/app/pb_kits/playbook/pb_title/docs/_title_default.jsx +1 -1
  114. data/app/pb_kits/playbook/pb_title/docs/_title_display_size.html.erb +7 -0
  115. data/app/pb_kits/playbook/pb_title/docs/_title_display_size.jsx +54 -0
  116. data/app/pb_kits/playbook/pb_title/docs/_title_display_size.md +1 -0
  117. data/app/pb_kits/playbook/pb_title/docs/example.yml +2 -0
  118. data/app/pb_kits/playbook/pb_title/docs/index.js +1 -0
  119. data/app/pb_kits/playbook/pb_title/title.rb +10 -1
  120. data/app/pb_kits/playbook/pb_tooltip/_tooltip.scss +0 -3
  121. data/app/pb_kits/playbook/pb_tooltip/_tooltip.tsx +25 -0
  122. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_delay_rails.html.erb +39 -0
  123. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_delay_rails.md +3 -0
  124. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_interaction.html.erb +26 -0
  125. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_sizing.jsx +69 -0
  126. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_sizing.md +3 -0
  127. data/app/pb_kits/playbook/pb_tooltip/docs/example.yml +3 -1
  128. data/app/pb_kits/playbook/pb_tooltip/docs/index.js +1 -0
  129. data/app/pb_kits/playbook/pb_tooltip/floating_ui.js +282 -0
  130. data/app/pb_kits/playbook/pb_tooltip/index.js +2 -2
  131. data/app/pb_kits/playbook/pb_tooltip/tooltip.rb +10 -2
  132. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +36 -2
  133. data/app/pb_kits/playbook/pb_typeahead/components/MultiValue.tsx +5 -1
  134. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options.html.erb +45 -0
  135. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options.md +5 -0
  136. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options_pure_rails.html.erb +33 -0
  137. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options_pure_rails.md +3 -0
  138. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +2 -0
  139. data/app/pb_kits/playbook/pb_typeahead/index.ts +61 -8
  140. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +17 -2
  141. data/app/pb_kits/playbook/utilities/object.test.js +99 -0
  142. data/app/pb_kits/playbook/utilities/object.ts +29 -1
  143. data/dist/chunks/_typeahead-DKSD8vAY.js +36 -0
  144. data/dist/chunks/_weekday_stacked-C-GXG8yh.js +45 -0
  145. data/dist/chunks/lazysizes-B7xYodB-.js +1 -0
  146. data/dist/chunks/{lib-D3us1bGD.js → lib-5OzNgeeu.js} +2 -2
  147. data/dist/chunks/{pb_form_validation-BpihMSOQ.js → pb_form_validation-DGhKbZtO.js} +1 -1
  148. data/dist/chunks/vendor.js +1 -1
  149. data/dist/menu.yml +3 -3
  150. data/dist/playbook-doc.js +1 -1
  151. data/dist/playbook-rails-react-bindings.js +1 -1
  152. data/dist/playbook-rails.js +1 -1
  153. data/dist/playbook.css +1 -1
  154. data/lib/playbook/forms/builder/time_zone_select_field.rb +19 -0
  155. data/lib/playbook/forms/builder.rb +1 -0
  156. data/lib/playbook/version.rb +2 -2
  157. metadata +71 -7
  158. data/dist/chunks/_typeahead-PqkcDf1H.js +0 -36
  159. data/dist/chunks/_weekday_stacked-B_pw5Znc.js +0 -45
  160. data/dist/chunks/lazysizes-DHz07jlL.js +0 -1
@@ -0,0 +1,40 @@
1
+ <%
2
+ names = [
3
+ { label: 'Alexander Nathaniel Montgomery', value: 'Alexander Nathaniel Montgomery' },
4
+ { label: 'Isabella Anastasia Wellington', value: 'Isabella Anastasia Wellington' },
5
+ { label: 'Christopher Maximilian Harrington', value: 'Christopher Maximilian Harrington' },
6
+ { label: 'Elizabeth Seraphina Kensington', value: 'Elizabeth Seraphina Kensington' },
7
+ { label: 'Theodore Jonathan Abernathy', value: 'Theodore Jonathan Abernathy' },
8
+ ]
9
+ %>
10
+
11
+ <%= pb_rails("typeahead", props: {
12
+ html_options: { style: { maxWidth: "240px" }},
13
+ id: "typeahead-form-pill",
14
+ is_multi: true,
15
+ options: names,
16
+ label: "Wrapped Within Typeahead",
17
+ pills: true,
18
+ wrapped: true,
19
+ }) %>
20
+
21
+ <%= pb_rails("caption", props: { text: "Form Pill Wrapped Text" }) %>
22
+ <%= pb_rails("card", props: { max_width: "xs" }) do %>
23
+ <%= pb_rails("form_pill", props: {
24
+ name: "Princess Amelia Mignonette Grimaldi Thermopolis Renaldo",
25
+ avatar_url: "https://randomuser.me/api/portraits/women/44.jpg",
26
+ tabindex: 0,
27
+ wrapped: true,
28
+ }) %>
29
+ <%= pb_rails("form_pill", props: {
30
+ icon: "badge-check",
31
+ text: "icon and a very long tag to show wrapped text",
32
+ tabindex: 0,
33
+ wrapped: true,
34
+ }) %>
35
+ <%= pb_rails("form_pill", props: {
36
+ text: "form pill long tag no tooltip show wrapped text",
37
+ tabindex: 0,
38
+ wrapped: true,
39
+ }) %>
40
+ <% end %>
@@ -0,0 +1,50 @@
1
+ import React from 'react'
2
+ import { Card, Caption, FormPill, Typeahead } from 'playbook-ui'
3
+
4
+ const names = [
5
+ { label: 'Alexander Nathaniel Montgomery', value: 'Alexander Nathaniel Montgomery' },
6
+ { label: 'Isabella Anastasia Wellington', value: 'Isabella Anastasia Wellington' },
7
+ { label: 'Christopher Maximilian Harrington', value: 'Christopher Maximilian Harrington' },
8
+ { label: 'Elizabeth Seraphina Kensington', value: 'Elizabeth Seraphina Kensington' },
9
+ { label: 'Theodore Jonathan Abernathy', value: 'Theodore Jonathan Abernathy' },
10
+ ]
11
+
12
+ const FormPillWrapped = (props) => {
13
+ return (
14
+ <>
15
+ <Typeahead
16
+ htmlOptions={{ style: { maxWidth: "240px" } }}
17
+ isMulti
18
+ label="Wrapped Within Typeahead"
19
+ options={names}
20
+ wrapped
21
+ {...props}
22
+ />
23
+ <Caption text="Form Pill Wrapped Text"/>
24
+ <Card maxWidth="xs">
25
+ <FormPill
26
+ avatarUrl="https://randomuser.me/api/portraits/women/44.jpg"
27
+ name="Princess Amelia Mignonette Grimaldi Thermopolis Renaldo"
28
+ onClick={() => alert('Click!')}
29
+ tabIndex={0}
30
+ wrapped
31
+ />
32
+ <FormPill
33
+ icon="badge-check"
34
+ onClick={() => {alert('Click!')}}
35
+ tabIndex={0}
36
+ text="icon and a very long tag to show wrapped text"
37
+ wrapped
38
+ />
39
+ <FormPill
40
+ onClick={() => {alert('Click!')}}
41
+ tabIndex={0}
42
+ text="form pill with a very long tag to show wrapped text"
43
+ wrapped
44
+ />
45
+ </Card>
46
+ </>
47
+ )
48
+ }
49
+
50
+ export default FormPillWrapped
@@ -0,0 +1,3 @@
1
+ For Form Pills with longer text, the `wrapped` prop can be used to wrap the label within each Form Pill.
2
+
3
+ **Note**: Avoid using the `wrapped` and `small` props together, as their styles conflict and may cause functionality issues.
@@ -4,6 +4,7 @@ examples:
4
4
  - form_pill_user: Form Pill User
5
5
  - form_pill_size: Form Pill Size
6
6
  - form_pill_truncated_text: Truncated Text
7
+ - form_pill_wrapped: Wrapped Text
7
8
  - form_pill_tag: Form Pill Tag
8
9
  - form_pill_example: Example
9
10
  - form_pill_icon: Form Pill Icon
@@ -13,6 +14,7 @@ examples:
13
14
  - form_pill_user: Form Pill User
14
15
  - form_pill_size: Form Pill Size
15
16
  - form_pill_truncated_text: Truncated Text
17
+ - form_pill_wrapped: Wrapped Text
16
18
  - form_pill_tag: Form Pill Tag
17
19
  - form_pill_example: Example
18
20
  - form_pill_icon: Form Pill Icon
@@ -5,3 +5,4 @@ export { default as FormPillExample } from './_form_pill_example.jsx'
5
5
  export { default as FormPillIcon } from './_form_pill_icon.jsx'
6
6
  export { default as FormPillColors } from './_form_pill_colors.jsx'
7
7
  export { default as FormPillTruncatedText } from './_form_pill_truncated_text.jsx'
8
+ export { default as FormPillWrapped } from './_form_pill_wrapped.jsx'
@@ -16,9 +16,11 @@ module Playbook
16
16
  default: "primary"
17
17
  prop :tabindex
18
18
  prop :icon
19
+ prop :wrapped, type: Playbook::Props::Boolean,
20
+ default: false
19
21
 
20
22
  def classname
21
- generate_classname("pb_form_pill_kit", color, icon_class, name, text, text_transform)
23
+ generate_classname("pb_form_pill_kit", color, icon_class, name, text, text_transform, wrapped_class)
22
24
  end
23
25
 
24
26
  def display_text
@@ -36,6 +38,10 @@ module Playbook
36
38
  def close_icon_size
37
39
  size == "small" ? "xs" : "sm"
38
40
  end
41
+
42
+ def wrapped_class
43
+ wrapped ? "wrapped" : nil
44
+ end
39
45
  end
40
46
  end
41
47
  end
@@ -0,0 +1,71 @@
1
+
2
+ import React from 'react'
3
+ import classnames from 'classnames'
4
+ import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
5
+ import { globalProps } from '../utilities/globalProps'
6
+
7
+ import Button from '../pb_button/_button'
8
+ import Icon from '../pb_icon/_icon'
9
+ import { IconSizes } from "../pb_icon/_icon"
10
+
11
+ type IconButtonProps = {
12
+ aria?: { [key: string]: string },
13
+ className?: string,
14
+ data?: { [key: string]: string },
15
+ htmlType?: 'submit' | 'reset' | 'button' | undefined,
16
+ icon?: string,
17
+ id?: string,
18
+ link?: string,
19
+ newWindow?: boolean,
20
+ size?: IconSizes,
21
+ target?: string,
22
+ variant?: 'default' | 'link',
23
+ }
24
+
25
+ const IconButton = (props: IconButtonProps) => {
26
+ const {
27
+ aria = {},
28
+ className,
29
+ data = {},
30
+ htmlType = 'button',
31
+ icon = 'bars',
32
+ id,
33
+ link,
34
+ newWindow = false,
35
+ size = "2x",
36
+ target,
37
+ variant = "default",
38
+ } = props
39
+
40
+ const ariaProps = buildAriaProps(aria)
41
+ const dataProps = buildDataProps(data)
42
+ const classes = classnames(buildCss('pb_icon_button_kit', variant), globalProps(props), className)
43
+
44
+ return (
45
+ <div
46
+ {...ariaProps}
47
+ {...dataProps}
48
+ className={classes}
49
+ id={id}
50
+ >
51
+ <Button
52
+ borderRadius="lg"
53
+ htmlType={htmlType}
54
+ link={link}
55
+ newWindow={newWindow}
56
+ target={target}
57
+ >
58
+ <Icon
59
+ className="icon_button_icon"
60
+ fixedWidth
61
+ icon={icon}
62
+ paddingX="xxs"
63
+ paddingY="xs"
64
+ size={size}
65
+ />
66
+ </Button>
67
+ </div>
68
+ )
69
+ }
70
+
71
+ export default IconButton
@@ -0,0 +1,17 @@
1
+ import React from 'react'
2
+ import { IconButton } from 'playbook-ui'
3
+
4
+ const IconButtonDefault = (props) => (
5
+ <div>
6
+ <IconButton
7
+ {...props}
8
+ />
9
+ <IconButton
10
+ {...props}
11
+ marginTop="md"
12
+ variant="link"
13
+ />
14
+ </div>
15
+ )
16
+
17
+ export default IconButtonDefault
@@ -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
+ }) %>