playbook_ui 14.14.0 → 14.15.0.pre.alpha.PBNTR902multilevelselecthiddeninputbug6580

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 (158) 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 +25 -3
  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/example.yml +2 -1
  73. data/app/pb_kits/playbook/pb_multi_level_select/docs/index.js +1 -0
  74. data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.rb +7 -1
  75. data/app/pb_kits/playbook/pb_overlay/_overlay.scss +13 -0
  76. data/app/pb_kits/playbook/pb_overlay/_overlay.tsx +7 -1
  77. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_hide_scroll_bar.html.erb +11 -0
  78. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_hide_scroll_bar.jsx +37 -0
  79. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_hide_scroll_bar_rails.md +1 -0
  80. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_hide_scroll_bar_react.md +1 -0
  81. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.html.erb +11 -0
  82. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.md +1 -0
  83. data/app/pb_kits/playbook/pb_overlay/docs/example.yml +3 -0
  84. data/app/pb_kits/playbook/pb_overlay/docs/index.js +1 -0
  85. data/app/pb_kits/playbook/pb_overlay/index.js +61 -0
  86. data/app/pb_kits/playbook/pb_overlay/overlay.html.erb +5 -3
  87. data/app/pb_kits/playbook/pb_overlay/overlay.rb +16 -1
  88. data/app/pb_kits/playbook/pb_overlay/overlay.test.jsx +12 -0
  89. data/app/pb_kits/playbook/pb_popover/_popover.tsx +1 -1
  90. data/app/pb_kits/playbook/pb_progress_step/progress_step_item.html.erb +2 -2
  91. data/app/pb_kits/playbook/pb_radio/_radio.tsx +85 -74
  92. data/app/pb_kits/playbook/pb_radio/docs/_radio_react_hook.jsx +60 -0
  93. data/app/pb_kits/playbook/pb_radio/docs/_radio_react_hook.md +1 -0
  94. data/app/pb_kits/playbook/pb_radio/docs/example.yml +2 -1
  95. data/app/pb_kits/playbook/pb_radio/docs/index.js +1 -0
  96. data/app/pb_kits/playbook/pb_radio/radio.test.js +16 -0
  97. data/app/pb_kits/playbook/pb_select/docs/_select_react_hook.jsx +58 -0
  98. data/app/pb_kits/playbook/pb_select/docs/_select_react_hook.md +1 -0
  99. data/app/pb_kits/playbook/pb_select/docs/example.yml +1 -0
  100. data/app/pb_kits/playbook/pb_select/docs/index.js +1 -0
  101. data/app/pb_kits/playbook/pb_select/index.js +38 -0
  102. data/app/pb_kits/playbook/pb_select/select.html.erb +3 -5
  103. data/app/pb_kits/playbook/pb_select/select.rb +8 -0
  104. data/app/pb_kits/playbook/pb_selectable_card/selectable_card.html.erb +1 -5
  105. data/app/pb_kits/playbook/pb_selectable_card_icon/selectable_card_icon.html.erb +1 -4
  106. data/app/pb_kits/playbook/pb_selectable_icon/selectable_icon.html.erb +1 -5
  107. data/app/pb_kits/playbook/pb_timeline/_timeline.scss +2 -2
  108. data/app/pb_kits/playbook/pb_title/_title.scss +32 -0
  109. data/app/pb_kits/playbook/pb_title/_title.tsx +10 -1
  110. data/app/pb_kits/playbook/pb_title/docs/_title_default.html.erb +1 -2
  111. data/app/pb_kits/playbook/pb_title/docs/_title_default.jsx +1 -1
  112. data/app/pb_kits/playbook/pb_title/docs/_title_display_size.html.erb +7 -0
  113. data/app/pb_kits/playbook/pb_title/docs/_title_display_size.jsx +54 -0
  114. data/app/pb_kits/playbook/pb_title/docs/_title_display_size.md +1 -0
  115. data/app/pb_kits/playbook/pb_title/docs/example.yml +2 -0
  116. data/app/pb_kits/playbook/pb_title/docs/index.js +1 -0
  117. data/app/pb_kits/playbook/pb_title/title.rb +10 -1
  118. data/app/pb_kits/playbook/pb_tooltip/_tooltip.scss +0 -3
  119. data/app/pb_kits/playbook/pb_tooltip/_tooltip.tsx +25 -0
  120. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_delay_rails.html.erb +39 -0
  121. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_delay_rails.md +3 -0
  122. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_interaction.html.erb +26 -0
  123. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_sizing.jsx +69 -0
  124. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_sizing.md +3 -0
  125. data/app/pb_kits/playbook/pb_tooltip/docs/example.yml +3 -1
  126. data/app/pb_kits/playbook/pb_tooltip/docs/index.js +1 -0
  127. data/app/pb_kits/playbook/pb_tooltip/floating_ui.js +282 -0
  128. data/app/pb_kits/playbook/pb_tooltip/index.js +2 -2
  129. data/app/pb_kits/playbook/pb_tooltip/tooltip.rb +10 -2
  130. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +36 -2
  131. data/app/pb_kits/playbook/pb_typeahead/components/MultiValue.tsx +5 -1
  132. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options.html.erb +45 -0
  133. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options.md +5 -0
  134. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options_pure_rails.html.erb +33 -0
  135. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options_pure_rails.md +3 -0
  136. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +2 -0
  137. data/app/pb_kits/playbook/pb_typeahead/index.ts +61 -8
  138. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +17 -2
  139. data/app/pb_kits/playbook/utilities/object.test.js +99 -0
  140. data/app/pb_kits/playbook/utilities/object.ts +29 -1
  141. data/dist/chunks/_typeahead-CaXmU2Fm.js +36 -0
  142. data/dist/chunks/_weekday_stacked-C7auj4WH.js +45 -0
  143. data/dist/chunks/lazysizes-B7xYodB-.js +1 -0
  144. data/dist/chunks/{lib-D3us1bGD.js → lib-5OzNgeeu.js} +2 -2
  145. data/dist/chunks/{pb_form_validation-BpihMSOQ.js → pb_form_validation-DGhKbZtO.js} +1 -1
  146. data/dist/chunks/vendor.js +1 -1
  147. data/dist/menu.yml +3 -3
  148. data/dist/playbook-doc.js +1 -1
  149. data/dist/playbook-rails-react-bindings.js +1 -1
  150. data/dist/playbook-rails.js +1 -1
  151. data/dist/playbook.css +1 -1
  152. data/lib/playbook/forms/builder/time_zone_select_field.rb +19 -0
  153. data/lib/playbook/forms/builder.rb +1 -0
  154. data/lib/playbook/version.rb +2 -2
  155. metadata +69 -7
  156. data/dist/chunks/_typeahead-PqkcDf1H.js +0 -36
  157. data/dist/chunks/_weekday_stacked-B_pw5Znc.js +0 -45
  158. data/dist/chunks/lazysizes-DHz07jlL.js +0 -1
@@ -1 +1,20 @@
1
- <%= pb_rails("drawer") %>
1
+ <%= pb_rails("flex") do %>
2
+ <%= pb_rails("button", props: { text: "Left Drawer", margin_right: "sm", data: {"open-drawer": "drawer-1"} }) %>
3
+
4
+ <%= pb_rails("drawer", props: {
5
+ id:"drawer-1",
6
+ }) do %>
7
+ Test me (Left Drawer)
8
+ <% end %>
9
+
10
+
11
+ <%= pb_rails("button", props: { text: "Right Drawer", data: {"open-drawer": "drawer-2"} }) %>
12
+
13
+ <%= pb_rails("drawer", props: {
14
+ id:"drawer-2",
15
+ placement: "right"
16
+ }) do %>
17
+ Test me (Right Drawer)
18
+ <% end %>
19
+ <% end %>
20
+
@@ -0,0 +1,24 @@
1
+ <%= pb_rails("button", props: { padding: "xs", margin_right: "sm", data: {"open-drawer": "drawer-4"} }) do %>
2
+ <%= pb_rails("icon", props: { icon: "bars", size: "2x" }) %>
3
+ <% end %>
4
+
5
+ <%= pb_rails("drawer", props: {
6
+ id:"drawer-4",
7
+ within_element: true,
8
+ placement: "bottom",
9
+ breakpoint: "md",
10
+ size: "full"
11
+ }) do %>
12
+ <%= pb_rails("nav", props: { display: {xl: "none", lg: "none", md: "none", sm: "block" } }) do %>
13
+ <%= pb_rails("nav/item", props: { text: "Photos", link: "#" }) %>
14
+ <%= pb_rails("nav/item", props: { text: "Music", link: "#" }) %>
15
+ <%= pb_rails("nav/item", props: { text: "Video", link: "#", active: true }) %>
16
+ <%= pb_rails("nav/item", props: { text: "Files", link: "#" }) %>
17
+ <% end %>
18
+ <%= pb_rails("nav", props: { display: {md: "block", sm: "none", xs: "none" }, orientation: "horizontal" }) do %>
19
+ <%= pb_rails("nav/item", props: { text: "About", link: "#" }) %>
20
+ <%= pb_rails("nav/item", props: { text: "Case Studies", link: "#", active: true }) %>
21
+ <%= pb_rails("nav/item", props: { text: "Service ", link: "#" }) %>
22
+ <%= pb_rails("nav/item", props: { text: "Contacts", link: "#" }) %>
23
+ <% end %>
24
+ <% end %>
@@ -8,8 +8,8 @@ const DrawerMenu = () => {
8
8
  const mediaQuery = window.matchMedia("(max-width: 600px)")
9
9
  setIsSmallScreen(mediaQuery.matches)
10
10
  const handler = (e) => setIsSmallScreen(e.matches)
11
- mediaQuery.addEventListener('change', handler)
12
- return () => mediaQuery.removeEventListener('change', handler)
11
+ mediaQuery.addEventListener("change", handler)
12
+ return () => mediaQuery.removeEventListener("change", handler)
13
13
  }, [])
14
14
 
15
15
  return (
@@ -22,17 +22,17 @@ const DrawerMenu = () => {
22
22
  />
23
23
  </Button>
24
24
  <Drawer
25
- breakpoint="md"
25
+ breakpoint='md'
26
26
  placement='bottom'
27
27
  size='full'
28
28
  triggerId='menuButton'
29
29
  withinElement
30
30
  >
31
- <Nav
31
+ <Nav
32
32
  highlight={false}
33
33
  link='#'
34
- orientation={isSmallScreen ? 'vertical' : 'horizontal'}
35
- padding={isSmallScreen ? 'none' : 'sm'}
34
+ orientation={isSmallScreen ? "vertical" : "horizontal"}
35
+ padding={isSmallScreen ? "none" : "sm"}
36
36
  >
37
37
  <NavItem link='#'
38
38
  text='About'
@@ -0,0 +1,21 @@
1
+ <%= pb_rails("flex") do %>
2
+ <%= pb_rails("button", props: { text: "No Overlay Drawer", margin_right: "sm", data: {"open-drawer": "drawer-10"} }) %>
3
+
4
+ <%= pb_rails("drawer", props: {
5
+ id:"drawer-10",
6
+ overlay: false
7
+ }) do %>
8
+ Test me (No Overlay)
9
+ <% end %>
10
+
11
+
12
+ <%= pb_rails("button", props: { text: "Overlay Drawer", data: {"open-drawer": "drawer-11"} }) %>
13
+
14
+ <%= pb_rails("drawer", props: {
15
+ id:"drawer-11",
16
+ placement: "right"
17
+ }) do %>
18
+ Test me (Has Overlay)
19
+ <% end %>
20
+ <% end %>
21
+
@@ -31,6 +31,7 @@ const DrawerSizes = () => {
31
31
  onClose={toggleNoOverlayDrawer}
32
32
  opened={openedNoOverlayDrawer}
33
33
  overlay={false}
34
+ placement='right'
34
35
  size='lg'
35
36
  >
36
37
  This is a Drawer with no overlay
@@ -0,0 +1 @@
1
+ Click the button to close the drawer when there is no overlay.
@@ -0,0 +1,49 @@
1
+ <%= pb_rails("flex") do %>
2
+ <%= pb_rails("button", props: { text: "XS Drawer", margin_right: "sm", data: {"open-drawer": "drawer-5"} }) %>
3
+
4
+ <%= pb_rails("drawer", props: {
5
+ id:"drawer-5",
6
+ size: "xs"
7
+ }) do %>
8
+ XS
9
+ <% end %>
10
+
11
+ <%= pb_rails("button", props: { text: "SM Drawer", margin_right: "sm", data: {"open-drawer": "drawer-6"} }) %>
12
+
13
+ <%= pb_rails("drawer", props: {
14
+ id:"drawer-6",
15
+ size: "sm",
16
+ placement: "right"
17
+ }) do %>
18
+ This is a small drawer
19
+ <% end %>
20
+
21
+ <%= pb_rails("button", props: { text: "MD Drawer", margin_right: "sm", data: {"open-drawer": "drawer-7"} }) %>
22
+
23
+ <%= pb_rails("drawer", props: {
24
+ id:"drawer-7",
25
+ size: "md"
26
+ }) do %>
27
+ This is a medium drawer
28
+ <% end %>
29
+
30
+ <%= pb_rails("button", props: { text: "LG Drawer", margin_right: "sm", data: {"open-drawer": "drawer-8"} }) %>
31
+
32
+ <%= pb_rails("drawer", props: {
33
+ id:"drawer-8",
34
+ size: "lg",
35
+ placement: "right"
36
+ }) do %>
37
+ This is a large drawer
38
+ <% end %>
39
+
40
+ <%= pb_rails("button", props: { text: "XL Drawer", margin_right: "sm", data: {"open-drawer": "drawer-9"} }) %>
41
+
42
+ <%= pb_rails("drawer", props: {
43
+ id:"drawer-9",
44
+ size: "xl"
45
+ }) do %>
46
+ This is an extra large drawer
47
+ <% end %>
48
+ <% end %>
49
+
@@ -2,6 +2,11 @@ examples:
2
2
 
3
3
  rails:
4
4
  - drawer_default: Default
5
+ - drawer_behavior: Push Behavior
6
+ - drawer_menu: Within Element
7
+ - drawer_sizes: Sizes
8
+ - drawer_overlay: Overlay
9
+ - drawer_borders: Borders
5
10
 
6
11
 
7
12
  react:
@@ -10,4 +15,5 @@ examples:
10
15
  - drawer_menu: Within Element
11
16
  - drawer_sizes: Sizes
12
17
  - drawer_overlay: Overlay
18
+ - drawer_breakpoints: Breakpoints
13
19
  - drawer_borders: Borders
@@ -1,12 +1,20 @@
1
- <!-- Go to pb_content_tag definition in kit_base.rb for usage information. Commented out options are default (showing the default shape), and each can be deleted if not customizing that param. -->
2
- <!-- If using nonstandard params please un-comment out and replace with your custom params. -->
3
- <%= pb_content_tag(
4
- # :div,
5
- # aria: object.aria,
6
- # class: object.classname,
7
- # data: object.data,
8
- # id: object.id,
9
- # **combined_html_options
10
- ) do %>
11
- <span>DRAWER CONTENT</span>
12
- <% end %>
1
+ <% if within_element %>
2
+ <%= pb_content_tag(:div, data: {breakpoint: object.breakpoint} ) do %>
3
+ <%= content %>
4
+ <% end %>
5
+ <% else %>
6
+ <div class="pb_drawer_wrapper"
7
+ id="drawer-wrapper-<%= object.id %>"
8
+ style="display:none;"
9
+ data-behavior="<%= object.behavior %>"
10
+ data-size="<%= object.size %>"
11
+ data-placement="<%= object.placement %>"
12
+ data-breakpoint="<%= object.breakpoint %>"
13
+ >
14
+ <div class="<%= overlay_classes %>" style="display:none;" id="drawer-overlay-<%= object.id %>">
15
+ <%= pb_content_tag do %>
16
+ <%= content %>
17
+ <% end %>
18
+ </div>
19
+ </div>
20
+ <% end %>
@@ -2,7 +2,55 @@
2
2
 
3
3
  module Playbook
4
4
  module PbDrawer
5
- class Drawer < ::Playbook::KitBase
5
+ class Drawer < Playbook::KitBase
6
+ prop :size, type: Playbook::Props::Enum,
7
+ values: %w[xs sm md lg xl full],
8
+ default: "md"
9
+ prop :placement, type: Playbook::Props::Enum,
10
+ values: %w[left right bottom],
11
+ default: "left"
12
+ prop :behavior, type: Playbook::Props::Enum,
13
+ values: %w[floating push],
14
+ default: "floating"
15
+ prop :overlay, type: Playbook::Props::Boolean,
16
+ default: true
17
+ prop :within_element, type: Playbook::Props::Boolean,
18
+ default: false
19
+ prop :border, type: Playbook::Props::Enum,
20
+ values: %w[full none right left],
21
+ default: "none"
22
+ prop :breakpoint, type: Playbook::Props::Enum,
23
+ values: %w[none xs sm md lg xl],
24
+ default: "none"
25
+
26
+ def classname
27
+ generate_classname("pb_drawer pb_drawer_#{size}_#{placement} #{within_class} #{border_classes}")
28
+ end
29
+
30
+ def border_classes
31
+ case border
32
+ when "full"
33
+ "drawer_border-full"
34
+ when "right"
35
+ "drawer_border-right"
36
+ when "left"
37
+ "drawer_border-left"
38
+ else
39
+ ""
40
+ end
41
+ end
42
+
43
+ def overlay_close
44
+ !should_close_on_overlay_click ? "overlay_close" : ""
45
+ end
46
+
47
+ def within_class
48
+ within_element ? "pb_drawer_within_element_rails" : ""
49
+ end
50
+
51
+ def overlay_classes
52
+ "pb_drawer_#{overlay ? '' : 'no_'}overlay drawer_content_#{placement} pb_drawer_overlay_after_open #{overlay ? '' : 'no-background'}"
53
+ end
6
54
  end
7
55
  end
8
56
  end
@@ -0,0 +1,257 @@
1
+ import PbEnhancedElement from "../pb_enhanced_element"
2
+
3
+ export default class PbDrawer extends PbEnhancedElement {
4
+ static get selector() {
5
+ return ".pb_drawer_wrapper"
6
+ }
7
+
8
+ connect() {
9
+ this.handleToggleClick = this.handleToggleClick.bind(this)
10
+ this.handleOutsideClick = this.handleOutsideClick.bind(this)
11
+ this.handleResize = this.handleResize.bind(this)
12
+
13
+ this._toggleTriggers = Array.from(document.querySelectorAll("[data-open-drawer]"))
14
+ this._toggleTriggers.forEach(el => {
15
+ el.addEventListener("click", this.handleToggleClick)
16
+ })
17
+
18
+ this._wrappers = Array.from(document.querySelectorAll(".pb_drawer_wrapper"))
19
+ this._wrappers.forEach(el => {
20
+ el.addEventListener("mousedown", this.handleOutsideClick)
21
+ })
22
+
23
+ this._withinElementDrawers = Array.from(
24
+ document.querySelectorAll(".pb_drawer_within_element_rails[data-breakpoint]")
25
+ )
26
+
27
+ window.addEventListener("resize", this.handleResize)
28
+ this.handleResize()
29
+ }
30
+
31
+ disconnect() {
32
+ this._toggleTriggers.forEach(el => {
33
+ el.removeEventListener("click", this.handleToggleClick)
34
+ })
35
+ this._wrappers.forEach(el => {
36
+ el.removeEventListener("mousedown", this.handleOutsideClick)
37
+ })
38
+ window.removeEventListener("resize", this.handleResize)
39
+ }
40
+
41
+ getOverlay(wrapper) {
42
+ if (wrapper.id && wrapper.id.startsWith("drawer-wrapper-")) {
43
+ const overlayId = wrapper.id.replace("drawer-wrapper-", "drawer-overlay-")
44
+ return document.getElementById(overlayId)
45
+ }
46
+ return wrapper.querySelector(".pb_drawer_overlay") || wrapper.querySelector(".pb_drawer_no_overlay")
47
+ }
48
+
49
+ handleToggleClick(event) {
50
+ const trigger = event.currentTarget
51
+ const drawerId = trigger.dataset.openDrawer
52
+ const dialog = document.getElementById(drawerId)
53
+ if (!dialog) return
54
+
55
+ if (dialog.classList.contains("pb_drawer_within_element_rails")) {
56
+ if (dialog.classList.contains("open")) {
57
+ this.closeWithinElementDrawer(dialog)
58
+ dialog.dataset.manualOpen = "false"
59
+ } else {
60
+ this.openWithinElementDrawer(dialog)
61
+ dialog.dataset.manualOpen = "true"
62
+ }
63
+ return
64
+ }
65
+
66
+ const wrapperId = `drawer-wrapper-${drawerId}`
67
+ const wrapper = document.getElementById(wrapperId)
68
+ if (!wrapper) return
69
+
70
+ if (wrapper !== this.element) return
71
+
72
+ if (wrapper.classList.contains("open")) {
73
+ this.closeDrawer(wrapper, dialog)
74
+ wrapper.dataset.manualOpen = "false"
75
+ } else {
76
+ this.openDrawer(wrapper, dialog)
77
+ wrapper.dataset.manualOpen = "true"
78
+ }
79
+ }
80
+
81
+ openWithinElementDrawer(dialog) {
82
+ if (dialog.classList.contains("open")) return
83
+ dialog.style.maxHeight = "0px"
84
+ dialog.offsetHeight
85
+ dialog.classList.add("open")
86
+ // Get trigger's height and add it to the final height
87
+ const trigger = document.querySelector(`[data-open-drawer="${dialog.id}"]`)
88
+ const triggerHeight = trigger ? trigger.offsetHeight : 0
89
+ const finalHeight = (dialog.scrollHeight + triggerHeight) + "px"
90
+ dialog.style.maxHeight = finalHeight
91
+ dialog.addEventListener("transitionend", function handleOpenEnd(e) {
92
+ if (e.propertyName === "max-height") {
93
+ dialog.style.maxHeight = "none"
94
+ dialog.removeEventListener("transitionend", handleOpenEnd)
95
+ }
96
+ })
97
+ }
98
+
99
+ closeWithinElementDrawer(dialog) {
100
+ if (!dialog.classList.contains("open")) return
101
+ const currentHeight = dialog.scrollHeight
102
+ dialog.style.maxHeight = currentHeight + "px"
103
+ dialog.offsetHeight
104
+ dialog.classList.remove("open")
105
+ dialog.style.maxHeight = "0px"
106
+ dialog.addEventListener("transitionend", function handleCloseEnd(e) {
107
+ if (e.propertyName === "max-height") {
108
+ dialog.removeEventListener("transitionend", handleCloseEnd)
109
+ dialog.style.maxHeight = "0px"
110
+ }
111
+ })
112
+ }
113
+
114
+ openDrawer(wrapper, dialog) {
115
+ const behavior = wrapper.dataset.behavior
116
+ const size = wrapper.dataset.size
117
+ const placement = wrapper.dataset.placement
118
+ this.handlePushOpen(behavior, size, placement)
119
+
120
+ wrapper.style.display = ""
121
+ const overlay = this.getOverlay(wrapper)
122
+ if (overlay) overlay.style.display = ""
123
+
124
+ wrapper.classList.add("open")
125
+ dialog.classList.add("open")
126
+ }
127
+
128
+ closeDrawer(wrapper, dialog) {
129
+ const behavior = wrapper.dataset.behavior
130
+ this.handlePushClose(behavior)
131
+
132
+ if (wrapper.className.includes("open")) wrapper.style.display = "none"
133
+ const overlay = this.getOverlay(wrapper)
134
+ if (overlay && wrapper.className.includes("open")) overlay.style.display = "none"
135
+
136
+ wrapper.classList.remove("open")
137
+ dialog.classList.remove("open")
138
+ }
139
+
140
+ handleOutsideClick(event) {
141
+ const wrapper = event.currentTarget
142
+ const dialog = wrapper.querySelector(".pb_drawer")
143
+ const overlay = this.getOverlay(wrapper)
144
+
145
+ if (dialog && dialog.classList.contains("pb_drawer_within_element_rails")) {
146
+ return
147
+ }
148
+
149
+ if (wrapper.dataset.overlayClick === "overlay_close" && event.target === overlay) {
150
+ this.closeDrawer(wrapper, dialog)
151
+ event.stopPropagation()
152
+ return
153
+ }
154
+
155
+ const dialogRect = dialog.getBoundingClientRect()
156
+ const clickedOutside =
157
+ event.clientX < dialogRect.left ||
158
+ event.clientX > dialogRect.right ||
159
+ event.clientY < dialogRect.top ||
160
+ event.clientY > dialogRect.bottom
161
+
162
+ if (clickedOutside) {
163
+ this.closeDrawer(wrapper, dialog)
164
+ event.stopPropagation()
165
+ }
166
+ }
167
+
168
+ handleResize() {
169
+ const breakpointValues = {
170
+ none: 0,
171
+ xs: 575,
172
+ sm: 768,
173
+ md: 992,
174
+ lg: 1200,
175
+ xl: 1400,
176
+ }
177
+
178
+ // Process wrappers
179
+ this._wrappers.forEach(wrapper => {
180
+ const bp = wrapper.dataset.breakpoint || "none"
181
+ if (bp === "none") return
182
+
183
+ const threshold = breakpointValues[bp] || 0
184
+ const dialog = wrapper.querySelector(".pb_drawer")
185
+ const trigger = dialog ? document.querySelector(`[data-open-drawer="${dialog.id}"]`) : null
186
+
187
+ if (window.innerWidth >= threshold) {
188
+ if (!wrapper.classList.contains("open")) {
189
+ this.openDrawer(wrapper, dialog)
190
+ }
191
+ if (trigger) trigger.style.display = "none"
192
+ } else {
193
+ if (trigger) trigger.style.display = ""
194
+ if (wrapper.classList.contains("open") && wrapper.dataset.manualOpen !== "true") {
195
+ this.closeDrawer(wrapper, dialog)
196
+ }
197
+ }
198
+ })
199
+
200
+ // Process within element drawers
201
+ this._withinElementDrawers.forEach(drawer => {
202
+ const bp = drawer.dataset.breakpoint || "none"
203
+ if (bp === "none") return
204
+
205
+ const threshold = breakpointValues[bp] || 0
206
+ const trigger = document.querySelector(`[data-open-drawer="${drawer.id}"]`)
207
+
208
+ if (window.innerWidth >= threshold) {
209
+ if (!drawer.classList.contains("open")) {
210
+ this.openWithinElementDrawer(drawer)
211
+ }
212
+ if (trigger) trigger.style.display = "none"
213
+ } else {
214
+ if (trigger) trigger.style.display = ""
215
+ if (drawer.classList.contains("open") && drawer.dataset.manualOpen !== "true") {
216
+ this.closeWithinElementDrawer(drawer)
217
+ }
218
+ }
219
+ })
220
+ }
221
+
222
+ handlePushOpen(behavior, size, placement) {
223
+ if (behavior !== "push") return
224
+
225
+ const sizeMap = {
226
+ xl: "365px",
227
+ lg: "300px",
228
+ md: "250px",
229
+ sm: "200px",
230
+ xs: "64px",
231
+ full: "100%",
232
+ }
233
+
234
+ const body = document.querySelector("body")
235
+ if (!body) return
236
+
237
+ if (placement === "left") {
238
+ body.style.cssText = `margin-left: ${sizeMap[size]} !important; margin-right: '' !important;`
239
+ } else if (placement === "right") {
240
+ body.style.cssText = `margin-right: ${sizeMap[size]} !important; margin-left: '' !important;`
241
+ }
242
+ body.classList.add("PBDrawer__Body--open")
243
+ }
244
+
245
+ handlePushClose(behavior) {
246
+ if (behavior !== "push") return
247
+
248
+ const body = document.querySelector("body")
249
+ if (!body) return
250
+
251
+ if (body.classList.contains("PBDrawer__Body--open")) {
252
+ body.classList.add("PBDrawer__Body--close")
253
+ }
254
+ body.style.cssText = ""
255
+ body.classList.remove("PBDrawer__Body--open")
256
+ }
257
+ }
@@ -1,5 +1,6 @@
1
1
  import React from 'react'
2
- import { isEmpty, map, omitBy } from 'lodash'
2
+ import { map } from 'lodash'
3
+ import { isEmpty, omitBy } from '../../utilities/object'
3
4
 
4
5
  import Body from '../../pb_body/_body'
5
6
  import Caption from '../../pb_caption/_caption'
@@ -40,13 +41,13 @@ const CurrentFilters = ({ dark, filters }: CurrentFiltersProps): React.ReactElem
40
41
  className="filter"
41
42
  key={`filter-${name}`}
42
43
  >
43
- { value === true ?
44
+ { value === true ?
44
45
  <Title
45
46
  dark={dark}
46
47
  size={4}
47
48
  tag="h4"
48
49
  text={name}
49
- /> :
50
+ /> :
50
51
  <div>
51
52
  <Caption
52
53
  dark={dark}
@@ -58,7 +59,7 @@ const CurrentFilters = ({ dark, filters }: CurrentFiltersProps): React.ReactElem
58
59
  tag="h4"
59
60
  text={value}
60
61
  />
61
- </div>
62
+ </div>
62
63
  }
63
64
  </div>
64
65
  ))}
@@ -1,5 +1,5 @@
1
1
  import React from 'react'
2
- import { isEmpty } from 'lodash'
2
+ import { isEmpty } from '../../utilities/object'
3
3
 
4
4
  import Flex from '../../pb_flex/_flex'
5
5
 
@@ -46,7 +46,7 @@ const FilterSingle = ({
46
46
  paddingRight="lg"
47
47
  vertical="center"
48
48
  >
49
- { children &&
49
+ { children &&
50
50
  <>
51
51
  <FiltersPopover
52
52
  dark={dark}
@@ -46,6 +46,7 @@
46
46
  %>
47
47
  <%= form.date_picker :example_date_picker_1, props: { label: true } %>
48
48
  <%= form.star_rating_field :example_star_rating, props: { variant: "interactive", label: true } %>
49
+ <%= form.time_zone_select_field :example_time_zone_select, ActiveSupport::TimeZone.us_zones, { default: "Eastern Time (US & Canada)" }, props: { label: true } %>
49
50
 
50
51
  <%= form.actions do |action| %>
51
52
  <%= action.submit %>
@@ -32,11 +32,12 @@
32
32
  <%= form.url_field :example_url_field_validation, props: { label: true, required: true } %>
33
33
  <%= form.text_area :example_text_area_validation, props: { label: true, required: true } %>
34
34
  <%= form.dropdown_field :example_dropdown_validation, props: { label: true, options: example_dropdown_options, required: true } %>
35
- <%= form.select :example_select_validation, [ ["Yes", 1], ["No", 2] ], props: { label: true, blank_selection: "Select One...", required: true } %>
35
+ <%= form.select :example_select_validation, [ ["Yes", 1], ["No", 2] ], props: { label: true, blank_selection: "Select One...", required: true, validation_message: "Please, select an option." } %>
36
36
  <%= form.collection_select :example_collection_select_validation, example_collection, :value, :name, props: { label: true, blank_selection: "Select One...", required: true } %>
37
37
  <%= form.check_box :example_checkbox, props: { text: "Example Checkbox", label: true, required: true } %>
38
- <%= form.date_picker :example_date_picker_2, props: { label: true, required: true } %>
38
+ <%= form.date_picker :example_date_picker_2, props: { label: true, required: true, validation_message: "Please, select a date.", allow_input: true } %>
39
39
  <%= form.star_rating_field :example_star_rating_validation, props: { variant: "interactive", label: true, required: true } %>
40
+ <%= form.time_zone_select_field :example_time_zone_select, ActiveSupport::TimeZone.us_zones, { default: "Eastern Time (US & Canada)" }, props: { label: true, blank_selection: "Select a Time Zone...", required: true } %>
40
41
 
41
42
  <%= form.actions do |action| %>
42
43
  <%= action.submit %>
@@ -23,6 +23,13 @@ $form_pill_colors: map-merge($status_color_text, map-merge($data_colors, $produc
23
23
  .pb_form_pill_text, .pb_form_pill_close, .pb_form_pill_tag{
24
24
  font-size: $font_small !important;
25
25
  }
26
+
27
+ &[class*=wrapped] {
28
+ height: max-content;
29
+ padding-top: $space-xxs;
30
+ padding-bottom: $space-xxs;
31
+ }
32
+
26
33
  @each $color_name, $color_value in $form_pill_colors {
27
34
  &[class*=_#{$color_name}] {
28
35
  background-color: mix($color_value, $card_light, 10%);
@@ -142,7 +149,7 @@ $form_pill_colors: map-merge($status_color_text, map-merge($data_colors, $produc
142
149
  height: 12px !important;
143
150
  width: 12px !important;
144
151
  padding-right: $space_xs;
145
- + .pb_form_pill_text, + .pb_form_pill_tag,
152
+ + .pb_form_pill_text, + .pb_form_pill_tag,
146
153
  + .pb_tooltip_kit .pb_form_pill_text, + .pb_tooltip_kit .pb_form_pill_tag,
147
154
  + div .pb_form_pill_text, + div .pb_form_pill_tag {
148
155
  padding-left: 0;
@@ -171,7 +178,7 @@ $form_pill_colors: map-merge($status_color_text, map-merge($data_colors, $produc
171
178
  }
172
179
  .pb_form_pill_icon {
173
180
  padding-right: $space_xxs;
174
- + .pb_form_pill_text, + .pb_form_pill_tag,
181
+ + .pb_form_pill_text, + .pb_form_pill_tag,
175
182
  + .pb_tooltip_kit .pb_form_pill_text, + .pb_tooltip_kit .pb_form_pill_tag,
176
183
  + div .pb_form_pill_text, + div .pb_form_pill_tag {
177
184
  padding-left: 0;
@@ -22,6 +22,7 @@ type FormPillProps = {
22
22
  data?: {[key: string]: string},
23
23
  tabIndex?: number,
24
24
  icon?: string,
25
+ wrapped?: boolean,
25
26
  closeProps?: {
26
27
  onClick?: React.MouseEventHandler<HTMLSpanElement>,
27
28
  onMouseDown?: React.MouseEventHandler<HTMLSpanElement>,
@@ -38,6 +39,7 @@ const FormPill = (props: FormPillProps): React.ReactElement => {
38
39
  onClick = () => undefined,
39
40
  avatarUrl,
40
41
  closeProps = {},
42
+ wrapped,
41
43
  size = '',
42
44
  textTransform = 'none',
43
45
  color = "primary",
@@ -48,6 +50,7 @@ const FormPill = (props: FormPillProps): React.ReactElement => {
48
50
 
49
51
  const iconClass = icon ? "_icon" : ""
50
52
  const closeIconSize = size === "small" ? "xs" : "sm"
53
+ const wrappedClass = wrapped ? "wrapped" : ""
51
54
 
52
55
  const filteredProps: FormPillProps = {...props}
53
56
  delete filteredProps.truncate
@@ -55,6 +58,7 @@ const FormPill = (props: FormPillProps): React.ReactElement => {
55
58
  const css = classnames(
56
59
  `pb_form_pill_kit_${color}${iconClass}`,
57
60
  globalProps(filteredProps),
61
+ wrappedClass,
58
62
  className,
59
63
  size === 'small' ? 'small' : null,
60
64
  textTransform,