playbook_ui 14.19.0.pre.rc.2 → 14.20.0.pre.alpha.revert4453PBNTR933reactdraggablebugdragbtwnexamples7854

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 (223) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +0 -1
  3. data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +11 -1
  4. data/app/pb_kits/playbook/pb_advanced_table/Components/TableActionBar.tsx +175 -16
  5. data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +56 -25
  6. data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableState.ts +23 -13
  7. data/app/pb_kits/playbook/pb_advanced_table/Utilities/VisibilityTree.ts +47 -0
  8. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +6 -10
  9. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +7 -2
  10. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta.md +0 -6
  11. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility.jsx +57 -0
  12. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility.md +4 -0
  13. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_custom.jsx +62 -0
  14. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_custom.md +1 -0
  15. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_multi.jsx +82 -0
  16. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_multi.md +1 -0
  17. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_with_state.jsx +66 -0
  18. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_with_state.md +3 -0
  19. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows_rails.md +5 -1
  20. data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_no_subrows.jsx → _advanced_table_selectable_rows_no_subrows_react.jsx} +2 -2
  21. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_rails.md +3 -2
  22. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +7 -3
  23. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +6 -2
  24. data/app/pb_kits/playbook/pb_advanced_table/flat_advanced_table.js +106 -0
  25. data/app/pb_kits/playbook/pb_advanced_table/index.js +228 -11
  26. data/app/pb_kits/playbook/pb_advanced_table/scss_partials/advanced_table_sticky_mixin.scss +1 -0
  27. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +9 -1
  28. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +0 -3
  29. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +1 -2
  30. data/app/pb_kits/playbook/pb_avatar/_avatar.scss +4 -0
  31. data/app/pb_kits/playbook/pb_avatar/_avatar.tsx +3 -0
  32. data/app/pb_kits/playbook/pb_avatar/avatar.html.erb +3 -3
  33. data/app/pb_kits/playbook/pb_avatar/avatar.rb +2 -0
  34. data/app/pb_kits/playbook/pb_avatar/avatar.test.js +18 -0
  35. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_grayscale.html.erb +5 -0
  36. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_grayscale.jsx +16 -0
  37. data/app/pb_kits/playbook/pb_avatar/docs/example.yml +2 -0
  38. data/app/pb_kits/playbook/pb_avatar/docs/index.js +1 -0
  39. data/app/pb_kits/playbook/pb_card/card.html.erb +1 -1
  40. data/app/pb_kits/playbook/pb_card/card.rb +12 -0
  41. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_error.html.erb +2 -2
  42. data/app/pb_kits/playbook/pb_draggable/context/index.tsx +17 -58
  43. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones.html.erb +22 -1
  44. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_line.html.erb +55 -0
  45. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_line_rails.md +5 -0
  46. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_rails.md +5 -0
  47. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_event_listeners.jsx +59 -0
  48. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_event_listeners_react.md +1 -0
  49. data/app/pb_kits/playbook/pb_draggable/docs/example.yml +2 -0
  50. data/app/pb_kits/playbook/pb_draggable/docs/index.js +2 -1
  51. data/app/pb_kits/playbook/pb_draggable/draggable_container.rb +11 -1
  52. data/app/pb_kits/playbook/pb_draggable/draggable_item.rb +11 -1
  53. data/app/pb_kits/playbook/pb_draggable/index.js +4 -2
  54. data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableItem.tsx +33 -5
  55. data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +6 -1
  56. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +82 -35
  57. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.html.erb +31 -0
  58. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.md +5 -0
  59. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_error.html.erb +5 -2
  60. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select.jsx +56 -0
  61. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select.md +3 -0
  62. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display.jsx +58 -0
  63. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display.md +3 -0
  64. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display_rails.html.erb +20 -0
  65. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display_rails.md +1 -0
  66. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_rails.html.erb +19 -0
  67. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_rails.md +3 -0
  68. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.html.erb +20 -0
  69. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.jsx +57 -0
  70. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.md +1 -0
  71. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.html.erb +50 -0
  72. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.jsx +105 -0
  73. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.html.erb +22 -0
  74. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.jsx +67 -0
  75. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.html.erb +28 -0
  76. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.jsx +17 -64
  77. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.html.erb +58 -0
  78. data/app/pb_kits/playbook/pb_dropdown/docs/{_dropdown_with_autocomplete_and_custom_display.jsx → _dropdown_with_autocomplete_with_subcomponents.jsx} +11 -25
  79. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.md +1 -0
  80. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.jsx +11 -0
  81. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.md +1 -1
  82. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.html.erb +33 -2
  83. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.md +3 -1
  84. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_external_control.md +1 -0
  85. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.jsx +61 -0
  86. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.md +2 -0
  87. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.html.erb +52 -0
  88. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.md +2 -0
  89. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +18 -5
  90. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +7 -2
  91. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +3 -3
  92. data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +20 -2
  93. data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +45 -1
  94. data/app/pb_kits/playbook/pb_dropdown/dropdown_container.html.erb +10 -0
  95. data/app/pb_kits/playbook/pb_dropdown/dropdown_container.rb +3 -0
  96. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.html.erb +37 -6
  97. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.rb +5 -1
  98. data/app/pb_kits/playbook/pb_dropdown/hooks/useHandleOnKeydown.tsx +0 -6
  99. data/app/pb_kits/playbook/pb_dropdown/index.js +380 -17
  100. data/app/pb_kits/playbook/pb_dropdown/keyboard_accessibility.js +64 -11
  101. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownContainer.tsx +3 -4
  102. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownOption.tsx +16 -12
  103. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +83 -17
  104. data/app/pb_kits/playbook/pb_dropdown/subcomponents/MultiSelectTriggerDisplay.tsx +58 -0
  105. data/app/pb_kits/playbook/pb_empty_state/_empty_state.scss +8 -1
  106. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_alignment.html.erb +27 -0
  107. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_default.html.erb +7 -0
  108. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_orientation.html.erb +12 -0
  109. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_size.html.erb +23 -0
  110. data/app/pb_kits/playbook/pb_empty_state/docs/example.yml +5 -1
  111. data/app/pb_kits/playbook/pb_empty_state/empty_state.html.erb +19 -0
  112. data/app/pb_kits/playbook/pb_empty_state/empty_state.rb +123 -0
  113. data/app/pb_kits/playbook/pb_file_upload/_file_upload.scss +13 -0
  114. data/app/pb_kits/playbook/pb_file_upload/_file_upload.tsx +11 -1
  115. data/app/pb_kits/playbook/pb_file_upload/docs/_file_upload_error.html.erb +1 -0
  116. data/app/pb_kits/playbook/pb_file_upload/docs/_file_upload_error.jsx +41 -0
  117. data/app/pb_kits/playbook/pb_file_upload/docs/example.yml +2 -0
  118. data/app/pb_kits/playbook/pb_file_upload/docs/index.js +1 -0
  119. data/app/pb_kits/playbook/pb_file_upload/file_upload.html.erb +1 -0
  120. data/app/pb_kits/playbook/pb_file_upload/file_upload.rb +7 -1
  121. data/app/pb_kits/playbook/pb_file_upload/fileupload.test.js +18 -0
  122. data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +1 -0
  123. data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +1 -0
  124. data/app/pb_kits/playbook/pb_form_group/_error_state_mixin.scss +2 -2
  125. data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +19 -12
  126. data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.tsx +13 -7
  127. data/app/pb_kits/playbook/pb_message/_message.tsx +3 -0
  128. data/app/pb_kits/playbook/pb_message/docs/_message_grayscale.html.erb +9 -0
  129. data/app/pb_kits/playbook/pb_message/docs/_message_grayscale.jsx +21 -0
  130. data/app/pb_kits/playbook/pb_message/docs/example.yml +2 -0
  131. data/app/pb_kits/playbook/pb_message/docs/index.js +1 -0
  132. data/app/pb_kits/playbook/pb_message/message.html.erb +2 -1
  133. data/app/pb_kits/playbook/pb_message/message.rb +1 -0
  134. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +2 -2
  135. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.html.erb +11 -11
  136. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.jsx +11 -11
  137. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_default.html.erb +11 -11
  138. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_default.jsx +11 -11
  139. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.html.erb +11 -11
  140. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.jsx +11 -11
  141. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options.html.erb +11 -11
  142. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options.jsx +11 -11
  143. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_default.html.erb +11 -11
  144. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_default.jsx +11 -11
  145. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent.html.erb +11 -11
  146. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent.jsx +11 -11
  147. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent_default.html.erb +11 -11
  148. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent_default.jsx +11 -11
  149. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.html.erb +11 -11
  150. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.jsx +11 -11
  151. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.html.erb +11 -11
  152. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.jsx +11 -11
  153. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_react_hook.jsx +11 -11
  154. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_reset.html.erb +11 -11
  155. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_return_all_selected.html.erb +11 -11
  156. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_return_all_selected.jsx +11 -11
  157. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.html.erb +11 -11
  158. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.md +2 -0
  159. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids_react.jsx +11 -11
  160. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids_react.md +3 -1
  161. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single.html.erb +22 -22
  162. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single.jsx +22 -22
  163. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single_children_only.html.erb +22 -22
  164. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single_children_only.jsx +22 -22
  165. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_children.jsx +11 -11
  166. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_children_with_radios.jsx +11 -11
  167. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_form.html.erb +11 -11
  168. data/app/pb_kits/playbook/pb_overlay/_overlay.scss +2 -1
  169. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.jsx +1 -1
  170. data/app/pb_kits/playbook/pb_overlay/subcomponents/_overlay_token.tsx +5 -4
  171. data/app/pb_kits/playbook/pb_person/_person.tsx +12 -2
  172. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss +9 -9
  173. data/app/pb_kits/playbook/pb_section_separator/_section_separator.tsx +2 -2
  174. data/app/pb_kits/playbook/pb_select/_select.scss +10 -0
  175. data/app/pb_kits/playbook/pb_select/docs/_select_error.html.erb +1 -1
  176. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click.jsx +7 -7
  177. data/app/pb_kits/playbook/pb_table/subcomponents/_table_row.tsx +5 -5
  178. data/app/pb_kits/playbook/pb_text_input/_text_input.scss +4 -2
  179. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_error.html.erb +1 -1
  180. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_error.html.erb +5 -1
  181. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +73 -3
  182. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_error_state.html.erb +8 -1
  183. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_preserve_input.jsx +23 -0
  184. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_preserve_input.md +1 -0
  185. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +1 -0
  186. data/app/pb_kits/playbook/pb_typeahead/docs/index.js +1 -0
  187. data/app/pb_kits/playbook/pb_user/_user.tsx +3 -0
  188. data/app/pb_kits/playbook/pb_user/docs/_user_grayscale.html.erb +6 -0
  189. data/app/pb_kits/playbook/pb_user/docs/_user_grayscale.jsx +16 -0
  190. data/app/pb_kits/playbook/pb_user/docs/example.yml +2 -0
  191. data/app/pb_kits/playbook/pb_user/docs/index.js +1 -0
  192. data/app/pb_kits/playbook/pb_user/user.html.erb +2 -1
  193. data/app/pb_kits/playbook/pb_user/user.rb +1 -0
  194. data/dist/chunks/_typeahead-C-CI5Vgw.js +22 -0
  195. data/dist/chunks/_weekday_stacked-BCiM3zWM.js +45 -0
  196. data/dist/chunks/lib-D5R1BjUn.js +29 -0
  197. data/dist/chunks/{pb_form_validation-BWjy4bFn.js → pb_form_validation-BZ2AVAi_.js} +1 -1
  198. data/dist/chunks/vendor.js +1 -1
  199. data/dist/menu.yml +6 -14
  200. data/dist/playbook-doc.js +2 -2
  201. data/dist/playbook-rails-react-bindings.js +1 -1
  202. data/dist/playbook-rails.js +1 -1
  203. data/dist/playbook.css +1 -1
  204. data/lib/playbook/kit_base.rb +3 -3
  205. data/lib/playbook/version.rb +2 -2
  206. metadata +70 -22
  207. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default.html.erb +0 -10
  208. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_and_custom_display.md +0 -1
  209. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_hook.jsx +0 -79
  210. data/app/pb_kits/playbook/pb_gantt_chart/_gantt_chart.scss +0 -3
  211. data/app/pb_kits/playbook/pb_gantt_chart/_gantt_chart.tsx +0 -72
  212. data/app/pb_kits/playbook/pb_gantt_chart/docs/_gantt_chart_default.jsx +0 -53
  213. data/app/pb_kits/playbook/pb_gantt_chart/docs/example.yml +0 -7
  214. data/app/pb_kits/playbook/pb_gantt_chart/docs/index.js +0 -1
  215. data/app/pb_kits/playbook/pb_gantt_chart/gantt_chart.test.jsx +0 -19
  216. data/dist/chunks/_typeahead-D8CsVBZO.js +0 -22
  217. data/dist/chunks/_weekday_stacked-D3oLTSkH.js +0 -45
  218. data/dist/chunks/lib-BmTAc7Nc.js +0 -29
  219. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_react.md → _advanced_table_selectable_rows.md} +0 -0
  220. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_no_subrows.html.erb → _advanced_table_selectable_rows_no_subrows_rails.html.erb} +0 -0
  221. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows.html.erb → _advanced_table_selectable_rows_rails.html.erb} +0 -0
  222. /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_drop_zones_line.md → _draggable_drop_zones_line_react.md} +0 -0
  223. /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_event_listeners.md → _draggable_event_listeners_rails.md} +0 -0
@@ -10,7 +10,13 @@
10
10
  { id: "63", text: "Task 3" }
11
11
  ] %>
12
12
 
13
- <%= pb_rails("flex", props: { justify: "around" }) do %>
13
+ <% data_line = [
14
+ { id: "71", text: "Task 1" },
15
+ { id: "72", text: "Task 2" },
16
+ { id: "73", text: "Task 3" }
17
+ ] %>
18
+
19
+ <%= pb_rails("flex", props: { justify: "between" }) do %>
14
20
  <%= pb_rails("flex/flex_item", props: { margin_right: "xl" }) do %>
15
21
  <%= pb_rails("draggable", props: { drop_zone_type: "shadow", initial_items: data_shadow }) do %>
16
22
  <%= pb_rails("caption", props: { margin_bottom: "xs", text: "Shadow", text_align: "center" }) %>
@@ -40,4 +46,19 @@
40
46
  <% end %>
41
47
  <% end %>
42
48
  <% end %>
49
+
50
+ <%= pb_rails("flex/flex_item", props: { margin_right: "xl" }) do %>
51
+ <%= pb_rails("draggable", props: { drop_zone_type: "line", initial_items: data_line }) do %>
52
+ <%= pb_rails("caption", props: { margin_bottom: "xs", text: "Line", text_align: "center" }) %>
53
+ <%= pb_rails("draggable/draggable_container", props: { drop_zone_direction: "vertical", html_options: { style: { width: "200px" } } }) do %>
54
+ <% data_line.each do |item| %>
55
+ <%= pb_rails("card", props: { drag_id: item[:id], draggable_item: true, margin_bottom: "xs", padding: "xs", padding_right: "xl", drop_zone_line_color: "primary" }) do %>
56
+ <%= pb_rails("flex", props: { align_items: "stretch", flex_direction: "column" }) do %>
57
+ <%= pb_rails("body", props: { text: item[:text] }) %>
58
+ <% end %>
59
+ <% end %>
60
+ <% end %>
61
+ <% end %>
62
+ <% end %>
63
+ <% end %>
43
64
  <% end %>
@@ -0,0 +1,55 @@
1
+ <% initial_items = [
2
+ {
3
+ id: "211",
4
+ url: "https://unsplash.it/500/400/?image=633",
5
+ },
6
+ {
7
+ id: "212",
8
+ url: "https://unsplash.it/500/400/?image=634",
9
+ },
10
+ {
11
+ id: "213",
12
+ url: "https://unsplash.it/500/400/?image=637",
13
+ },
14
+ ] %>
15
+
16
+ <% next_init_items = [
17
+ {
18
+ id: "2111",
19
+ url: "https://unsplash.it/500/400/?image=633",
20
+ },
21
+ {
22
+ id: "2112",
23
+ url: "https://unsplash.it/500/400/?image=634",
24
+ },
25
+ {
26
+ id: "2113",
27
+ url: "https://unsplash.it/500/400/?image=637",
28
+ },
29
+ ] %>
30
+
31
+ <%= pb_rails("draggable", props: {initial_items: initial_items, drop_zone_type: "line"}) do %>
32
+ <%= pb_rails("draggable/draggable_container", props: { drop_zone_direction: "vertical" }) do %>
33
+ <%= pb_rails("flex", props: { gap: "sm", orientation: "column", height: "367px" }) do %>
34
+ <% initial_items.each do |item| %>
35
+ <%= pb_rails("draggable/draggable_item", props:{drag_id: item[:id], drop_zone_line_color: "purple"}) do %>
36
+ <%= pb_rails("image", props: { alt: item[:id], size: "md", url: item[:url] }) %>
37
+ <% end %>
38
+ <% end %>
39
+ <% end %>
40
+ <% end %>
41
+ <% end %>
42
+
43
+ <br/>
44
+
45
+ <%= pb_rails("draggable", props: {initial_items: next_init_items, drop_zone_type: "line"}) do %>
46
+ <%= pb_rails("draggable/draggable_container", props: { drop_zone_direction: "horizontal" }) do %>
47
+ <%= pb_rails("flex", props: { gap: "sm", html_options: { style: "width: 332px;" } }) do %>
48
+ <% initial_items.each do |item| %>
49
+ <%= pb_rails("draggable/draggable_item", props:{drag_id: item[:id], drop_zone_line_color: "primary"}) do %>
50
+ <%= pb_rails("image", props: { alt: item[:id], size: "md", url: item[:url] }) %>
51
+ <% end %>
52
+ <% end %>
53
+ <% end %>
54
+ <% end %>
55
+ <% end %>
@@ -0,0 +1,5 @@
1
+ When using the "line" style, make sure to set the appropriate `direction` attribute within the `drop_zone_direction` prop on the `draggable/draggable_container` component based on the orientation of your draggable view: "vertical" or "horizontal." Note that the direction attribute only applies to the "line" style and does not affect other drop zone styles. Also, set the `drop_zone_line_color` prop on the `draggable/draggable_item` component to "primary" or "purple".
2
+
3
+ The length of the line is calculated based off of the width (for "vertical") or height (for "horizontal") of the parent container holding the draggable items.
4
+
5
+ Additionally, if the parent container of the `draggable`/`draggable/draggable_container` (or a subcontainer within) does not have a set height (for "vertical") or width (for "horizontal"), like the [Draggable Drop Zones doc example](https://playbook.powerapp.cloud/kits/draggable/rails#draggable-drop-zones) does, elements on the page may jump up (for "vertical") or to the left (for "horizontal") when an item is actively being dragged. To prevent this, give a parent element a fixed height (for "vertical") or width (for "horizontal") as demonstrated in this doc example.
@@ -0,0 +1,5 @@
1
+ The Draggable kit lets you customize the style of drop zones that appear when dragging an item.
2
+
3
+ By default, drop zones are in the "ghost" style, but you can also choose from "shadow," "outline," and "line."
4
+
5
+ When using the "line" type, make sure to set the appropriate `direction` attribute on the `draggable/draggable_container` component based on the orientation of your draggable view: "vertical" or "horizontal." Note that the direction attribute only applies to the "line" type and does not affect other drop zone styles. For more on the "line" style in particular, check out the [Draggable Drop Zones Line doc example](https://playbook.powerapp.cloud/kits/draggable/rails#draggable-drop-zones-line).
@@ -0,0 +1,59 @@
1
+ import React, { useState } from "react";
2
+
3
+ import Flex from '../../pb_flex/_flex'
4
+ import Image from '../../pb_image/_image'
5
+ import Draggable from '../../pb_draggable/_draggable'
6
+ import { DraggableProvider } from '../../pb_draggable/context'
7
+
8
+ const data = [
9
+ {
10
+ id: "100",
11
+ url: "https://unsplash.it/500/400/?image=638",
12
+ },
13
+ {
14
+ id: "200",
15
+ url: "https://unsplash.it/500/400/?image=639",
16
+ },
17
+ {
18
+ id: "300",
19
+ url: "https://unsplash.it/500/400/?image=640",
20
+ },
21
+ ];
22
+
23
+ const DraggableDefault = (props) => {
24
+ const [initialState, setInitialState] = useState(data);
25
+
26
+ return (
27
+ <>
28
+ <DraggableProvider initialItems={data}
29
+ onReorder={(items) => setInitialState(items)}
30
+ >
31
+ <Draggable.Container {...props}>
32
+ <Flex>
33
+ {initialState.map(({ id, url }) => (
34
+ <Draggable.Item dragId={id}
35
+ key={id}
36
+ onDrag={() => console.log(`${id} drag!`)}
37
+ onDragEnd={() => console.log(`${id} drag end!`)}
38
+ onDragEnter={() => console.log(`${id} drag enter!`)}
39
+ onDragLeave={() => console.log(`${id} drag leave!`)}
40
+ onDragOver={() => console.log(`${id} drag over!`)}
41
+ onDragStart={() => console.log(`${id} drag start!`)}
42
+ onDrop={() => console.log(`${id} drop!`)}
43
+ >
44
+ <Image alt={id}
45
+ margin="xs"
46
+ size="md"
47
+ url={url}
48
+ />
49
+ </Draggable.Item>
50
+ ))}
51
+ </Flex>
52
+ </Draggable.Container>
53
+ </DraggableProvider>
54
+ </>
55
+
56
+ );
57
+ };
58
+
59
+ export default DraggableDefault;
@@ -0,0 +1 @@
1
+ You can add drag event listeners for `onDrag`, `onDragEnd`, `onDragEnter`, `onDragLeave`, `onDragOver`, `onDragStart`, and `onDrop`.
@@ -9,6 +9,7 @@ examples:
9
9
  - draggable_drop_zones: Draggable Drop Zones
10
10
  - draggable_drop_zones_colors: Draggable Drop Zones Colors
11
11
  - draggable_drop_zones_line: Draggable Drop Zones Line
12
+ - draggable_event_listeners: Draggable Event Listeners
12
13
 
13
14
  rails:
14
15
  - draggable_default: Default
@@ -19,4 +20,5 @@ examples:
19
20
  - draggable_multiple_containers: Dragging Across Multiple Containers
20
21
  - draggable_drop_zones: Draggable Drop Zones
21
22
  - draggable_drop_zones_colors: Draggable Drop Zones Colors
23
+ - draggable_drop_zones_line: Draggable Drop Zones Line
22
24
  - draggable_event_listeners: Draggable Event Listeners
@@ -6,4 +6,5 @@ export { default as DraggableMultipleContainers } from './_draggable_multiple_co
6
6
  export { default as DraggableWithTable } from './_draggable_with_table.jsx'
7
7
  export { default as DraggableDropZones } from './_draggable_drop_zones.jsx'
8
8
  export { default as DraggableDropZonesColors } from './_draggable_drop_zones_colors.jsx'
9
- export { default as DraggableDropZonesLine } from './_draggable_drop_zones_line.jsx'
9
+ export { default as DraggableDropZonesLine } from './_draggable_drop_zones_line.jsx'
10
+ export { default as DraggableEventListeners } from './_draggable_event_listeners.jsx'
@@ -7,13 +7,23 @@ module Playbook
7
7
  default: "div"
8
8
  prop :container, type: Playbook::Props::String,
9
9
  default: ""
10
+ prop :drop_zone_direction, type: Playbook::Props::Enum,
11
+ values: ["horizontal", "vertical", nil],
12
+ default: nil
10
13
 
11
14
  def data
12
15
  Hash(prop(:data)).merge(pb_draggable_container: true)
13
16
  end
14
17
 
15
18
  def classname
16
- generate_classname("pb_draggable_container")
19
+ direction_class = case drop_zone_direction
20
+ when "horizontal"
21
+ "line_horizontal"
22
+ when "vertical"
23
+ "line_vertical"
24
+ end
25
+
26
+ generate_classname("pb_draggable_container", direction_class, separator: " ")
17
27
  end
18
28
  end
19
29
  end
@@ -9,13 +9,23 @@ module Playbook
9
9
  default: "div"
10
10
  prop :container, type: Playbook::Props::String,
11
11
  default: ""
12
+ prop :drop_zone_line_color, type: Playbook::Props::Enum,
13
+ values: ["primary", "purple", nil],
14
+ default: nil
12
15
 
13
16
  def data
14
17
  Hash(prop(:data)).merge(pb_draggable_item: true)
15
18
  end
16
19
 
17
20
  def classname
18
- generate_classname("pb_draggable_item")
21
+ line_color_class = case drop_zone_line_color
22
+ when "primary"
23
+ "drop_zone_color_primary"
24
+ when "purple"
25
+ "drop_zone_color_purple"
26
+ end
27
+
28
+ generate_classname("pb_draggable_item", line_color_class, separator: " ")
19
29
  end
20
30
  end
21
31
  end
@@ -2,7 +2,7 @@ import PbEnhancedElement from "../pb_enhanced_element";
2
2
 
3
3
  const DRAGGABLE_SELECTOR = "[data-pb-draggable]";
4
4
  const DRAGGABLE_CONTAINER = ".pb_draggable_container";
5
- const NEEDS_CLONE = ["shadow", "outline"]; // clone only for these types
5
+ const NEEDS_CLONE = ["shadow", "outline", "line"]; // clone only for these types
6
6
 
7
7
  export default class PbDraggable extends PbEnhancedElement {
8
8
  static get selector() { return DRAGGABLE_SELECTOR; }
@@ -116,7 +116,9 @@ export default class PbDraggable extends PbEnhancedElement {
116
116
  /* ---------------------------------------------------------------- */
117
117
  }
118
118
 
119
- requestAnimationFrame(() => (event.target.style.opacity = "0.5"));
119
+ if (this.dragZoneType !== "line") {
120
+ requestAnimationFrame(() => (event.target.style.opacity = "0.5"));
121
+ }
120
122
  }
121
123
 
122
124
  /* ---------------- DRAG ENTER ---------------- */
@@ -8,6 +8,7 @@ import {
8
8
  } from "../../utilities/props";
9
9
  import { globalProps } from "../../utilities/globalProps";
10
10
  import { DraggableContext } from "../context";
11
+ import { noop } from '../../utilities/object'
11
12
 
12
13
  type DraggableItemProps = {
13
14
  aria?: { [key: string]: string };
@@ -17,6 +18,13 @@ type DraggableItemProps = {
17
18
  data?: { [key: string]: string };
18
19
  htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
19
20
  id?: string;
21
+ onDrag?: () => void,
22
+ onDragEnd?: () => void,
23
+ onDragEnter?: () => void,
24
+ onDragLeave?: () => void,
25
+ onDragOver?: () => void,
26
+ onDragStart?: () => void,
27
+ onDrop?: () => void,
20
28
  dragId?: string;
21
29
  tag?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span' | 'div' | 'tr' | 'th' | 'td' | 'thead' | 'col' | 'tbody',
22
30
  };
@@ -31,7 +39,14 @@ const DraggableItem = (props: DraggableItemProps) => {
31
39
  htmlOptions = {},
32
40
  id,
33
41
  dragId,
34
- tag="div"
42
+ tag="div",
43
+ onDrag = noop,
44
+ onDragEnd = noop,
45
+ onDragEnter = noop,
46
+ onDragLeave = noop,
47
+ onDragOver = noop,
48
+ onDragStart = noop,
49
+ onDrop = noop,
35
50
  } = props;
36
51
 
37
52
  const {
@@ -61,7 +76,7 @@ const DraggableItem = (props: DraggableItemProps) => {
61
76
  );
62
77
 
63
78
  // Enhanced drag start handler that preserves dimensions
64
- const onDragStart = (e: React.DragEvent) => {
79
+ const handleDragStartWithCustom = (e: React.DragEvent) => {
65
80
  if (dropZone !== 'ghost' && itemRef.current) {
66
81
  // Create a clone for the drag image
67
82
  const clone = itemRef.current.cloneNode(true) as HTMLElement;
@@ -96,6 +111,9 @@ const DraggableItem = (props: DraggableItemProps) => {
96
111
 
97
112
  // Call the original handler
98
113
  handleDragStart(dragId, container);
114
+
115
+ // Custom event handler
116
+ onDragStart()
99
117
  };
100
118
 
101
119
  return (
@@ -107,9 +125,19 @@ const DraggableItem = (props: DraggableItemProps) => {
107
125
  draggable
108
126
  id={id}
109
127
  key={dragId}
110
- onDragEnd={() => handleDragEnd()}
111
- onDragEnter={() => handleDragEnter(dragId, container)}
112
- onDragStart={onDragStart}
128
+ onDrag={onDrag}
129
+ onDragEnd={() => {
130
+ handleDragEnd()
131
+ onDragEnd()
132
+ }}
133
+ onDragEnter={() => {
134
+ handleDragEnter(dragId, container)
135
+ onDragEnter()
136
+ }}
137
+ onDragLeave={onDragLeave}
138
+ onDragOver={onDragOver}
139
+ onDragStart={handleDragStartWithCustom}
140
+ onDrop={onDrop}
113
141
  ref={itemRef}
114
142
  >
115
143
  {children}
@@ -15,7 +15,7 @@
15
15
  @include pb_body;
16
16
  border: 1px solid $border_light;
17
17
  background-color: $white;
18
- height: 45px;
18
+ min-height: 45px;
19
19
  @media (hover: hover) {
20
20
  &:hover,
21
21
  &:active,
@@ -41,6 +41,11 @@
41
41
  outline: unset;
42
42
  transition: box-shadow 0.15s ease-in-out;
43
43
  }
44
+ &:focus-within {
45
+ box-shadow: 0px 0px 0 1px $primary !important;
46
+ outline: unset;
47
+ transition: box-shadow 0.15s ease-in-out;
48
+ }
44
49
 
45
50
  &[class*="_select_only"] {
46
51
  box-shadow: inset 0 -11px 20px rgba($primary, 0.05);
@@ -1,4 +1,4 @@
1
- import React, { useState, useRef, useEffect, forwardRef, useImperativeHandle } from "react";
1
+ import React, { useState, useRef, useEffect, forwardRef, useImperativeHandle, useMemo } from "react";
2
2
  import classnames from "classnames";
3
3
  import { buildAriaProps, buildCss, buildDataProps, buildHtmlProps } from "../utilities/props";
4
4
  import { globalProps } from "../utilities/globalProps";
@@ -25,6 +25,7 @@ type DropdownProps = {
25
25
  blankSelection?: string;
26
26
  children?: React.ReactChild[] | React.ReactChild | React.ReactElement[];
27
27
  className?: string;
28
+ formPillProps?: GenericObject;
28
29
  dark?: boolean;
29
30
  data?: { [key: string]: string };
30
31
  defaultValue?: GenericObject;
@@ -33,10 +34,10 @@ type DropdownProps = {
33
34
  id?: string;
34
35
  isClosed?: boolean;
35
36
  label?: string;
37
+ multiSelect?: boolean;
36
38
  onSelect?: (arg: GenericObject) => null;
37
39
  options: GenericObject;
38
40
  separators?: boolean;
39
- triggerRef?: any;
40
41
  variant?: "default" | "subtle";
41
42
  };
42
43
 
@@ -62,10 +63,11 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
62
63
  id,
63
64
  isClosed = true,
64
65
  label,
66
+ multiSelect = false,
67
+ formPillProps,
65
68
  onSelect,
66
69
  options,
67
70
  separators = true,
68
- triggerRef,
69
71
  variant = "default",
70
72
  } = props;
71
73
 
@@ -82,7 +84,20 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
82
84
  const [isDropDownClosed, setIsDropDownClosed, toggleDropdown] = useDropdown(isClosed);
83
85
 
84
86
  const [filterItem, setFilterItem] = useState("");
85
- const [selected, setSelected] = useState<GenericObject>(defaultValue);
87
+ const initialSelected = useMemo(() => {
88
+ if (multiSelect) {
89
+ if (Array.isArray(defaultValue)) return defaultValue;
90
+ return defaultValue && Object.keys(defaultValue).length
91
+ ? [defaultValue]
92
+ : [];
93
+ }
94
+ return defaultValue || {};
95
+ }, [multiSelect, defaultValue]);
96
+
97
+ const [selected, setSelected] = useState<GenericObject | GenericObject[]>(
98
+ initialSelected
99
+ );
100
+
86
101
  const [isInputFocused, setIsInputFocused] = useState(false);
87
102
  const [hasTriggerSubcomponent, setHasTriggerSubcomponent] = useState(true);
88
103
  const [hasContainerSubcomponent, setHasContainerSubcomponent] =
@@ -91,23 +106,21 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
91
106
  const [focusedOptionIndex, setFocusedOptionIndex] = useState(-1);
92
107
 
93
108
  const dropdownRef = useRef(null);
94
- const inputRef = useRef(null);
109
+ const inputRef = useRef<HTMLInputElement>(null);
95
110
  const inputWrapperRef = useRef(null);
96
111
  const dropdownContainerRef = useRef(null);
97
112
 
113
+ const selectedArray = Array.isArray(selected)
114
+ ? selected
115
+ : selected && Object.keys(selected).length
116
+ ? [selected]
117
+ : [];
118
+
98
119
  const { trigger, container, otherChildren } =
99
120
  separateChildComponents(children);
100
121
 
101
122
  useEffect(() => {
102
- // Set the parent element of the trigger to relative to allow for absolute positioning of the dropdown
103
- //Only needed for when useDropdown hook used with external trigger
104
- if (triggerRef?.current) {
105
- const parentElement = triggerRef.current.parentNode;
106
- if (parentElement) {
107
- parentElement.style.position = 'relative';
108
- }
109
- }
110
- // Handle clicks outside the dropdown
123
+ // Handle clicks outside the dropdown
111
124
  const handleClick = handleClickOutside({
112
125
  inputWrapperRef,
113
126
  dropdownContainerRef,
@@ -134,16 +147,23 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
134
147
 
135
148
  const blankSelectionOption: GenericObject = blankSelection ? [{ label: blankSelection, value: "" }] : [];
136
149
  const optionsWithBlankSelection = blankSelectionOption.concat(options);
137
- const filteredOptions = optionsWithBlankSelection?.filter((option: GenericObject) => {
138
- const label = typeof option.label === 'string' ? option.label.toLowerCase() : option.label;
139
- return String(label).toLowerCase().includes(filterItem.toLowerCase());
140
- });
150
+
151
+ const availableOptions = useMemo(()=> {
152
+ if (!multiSelect) return optionsWithBlankSelection;
153
+ return optionsWithBlankSelection.filter((option: GenericObject) => !selectedArray.some((sel) => sel.label === option.label));
154
+ }, [optionsWithBlankSelection, selectedArray, multiSelect]);
155
+
156
+ const filteredOptions = useMemo(() => {
157
+ return availableOptions.filter((opt: GenericObject) =>
158
+ String(opt.label).toLowerCase().includes(filterItem.toLowerCase())
159
+ );
160
+ }, [availableOptions, filterItem]);
141
161
 
142
162
  // For keyboard accessibility: Set focus within dropdown to selected item if it exists
143
163
  useEffect(() => {
144
164
  if (!isDropDownClosed) {
145
165
  let newIndex = 0;
146
- if (selected && selected?.label) {
166
+ if (selected && !Array.isArray(selected) && selected.label) {
147
167
  const selectedIndex = filteredOptions.findIndex((option: GenericObject) => option.label === selected.label);
148
168
  if (selectedIndex >= 0) {
149
169
  newIndex = selectedIndex;
@@ -159,22 +179,42 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
159
179
  setIsDropDownClosed(false);
160
180
  };
161
181
 
162
- const handleOptionClick = (selectedItem: GenericObject) => {
163
- setSelected(selectedItem);
164
- setFilterItem("");
165
- setIsDropDownClosed(true);
166
- onSelect && onSelect(selectedItem);
167
- };
182
+
183
+ const handleOptionClick = (clickedItem: GenericObject) => {
184
+ if (multiSelect) {
185
+ setSelected((prev) => {
186
+ const list = prev as GenericObject[];
187
+ const exists = list.find((option) => option.value === clickedItem.value);
188
+ const next = exists
189
+ ? list.filter((option) => option.value !== clickedItem.value)
190
+ : [...list, clickedItem];
191
+ onSelect && onSelect(next);
192
+ return next;
193
+ });
194
+ setFilterItem("");
195
+ setIsDropDownClosed(true);
196
+ } else {
197
+ setSelected(clickedItem);
198
+ setFilterItem("");
199
+ setIsDropDownClosed(true);
200
+ onSelect && onSelect(clickedItem);
201
+ }
202
+ };
168
203
 
169
204
  const handleWrapperClick = () => {
170
- autocomplete && inputRef.current.focus();
205
+ autocomplete && inputRef?.current?.focus();
171
206
  toggleDropdown();
172
207
  };
173
208
 
174
209
  const handleBackspace = () => {
210
+ if (multiSelect) {
211
+ setSelected([]);
212
+ onSelect && onSelect([]);
213
+ } else {
175
214
  setSelected({});
176
215
  onSelect && onSelect(null);
177
216
  setFocusedOptionIndex(-1);
217
+ }
178
218
  };
179
219
 
180
220
  const componentsToRender = prepareSubcomponents({
@@ -188,12 +228,17 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
188
228
  });
189
229
 
190
230
  useImperativeHandle(ref, () => ({
191
- clearSelected: () => {
192
- setSelected({});
193
- setFilterItem("");
194
- setIsDropDownClosed(true);
195
- onSelect && onSelect(null);
196
- },
231
+ clearSelected: () => {
232
+ if (multiSelect) {
233
+ setSelected([]);
234
+ onSelect && onSelect([]);
235
+ } else {
236
+ setSelected({});
237
+ onSelect && onSelect(null);
238
+ }
239
+ setFilterItem("");
240
+ setIsDropDownClosed(true);
241
+ },
197
242
  }));
198
243
 
199
244
  return (
@@ -202,7 +247,7 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
202
247
  {...htmlProps}
203
248
  className={classes}
204
249
  id={id}
205
- style={triggerRef ? { position: "absolute" } : { position: "relative" }}
250
+ style={{position: "relative"}}
206
251
  >
207
252
  <DropdownContext.Provider
208
253
  value={{
@@ -211,6 +256,7 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
211
256
  filteredOptions,
212
257
  filterItem,
213
258
  focusedOptionIndex,
259
+ formPillProps,
214
260
  handleBackspace,
215
261
  handleChange,
216
262
  handleOptionClick,
@@ -219,14 +265,15 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
219
265
  inputWrapperRef,
220
266
  isDropDownClosed,
221
267
  isInputFocused,
268
+ multiSelect,
269
+ onSelect,
222
270
  optionsWithBlankSelection,
223
271
  selected,
224
272
  setFocusedOptionIndex,
225
273
  setIsDropDownClosed,
226
274
  setIsInputFocused,
227
275
  setSelected,
228
- toggleDropdown,
229
- triggerRef
276
+ toggleDropdown
230
277
  }}
231
278
  >
232
279
  {label &&
@@ -0,0 +1,31 @@
1
+ <%
2
+ options = [
3
+ { label: 'United States', value: 'United States', id: 'us' },
4
+ { label: 'Canada', value: 'Canada', id: 'ca' },
5
+ { label: 'Pakistan', value: 'Pakistan', id: 'pk' },
6
+ ]
7
+
8
+ %>
9
+
10
+ <%
11
+ options2 = [
12
+ { label: 'India', value: 'India', id: 'in' },
13
+ { label: 'Mexico', value: 'Mexico', id: 'mx' },
14
+ { label: 'Brazil', value: 'Brazil', id: 'br' },
15
+ { label: 'Argentina', value: 'Argentina', id: 'ar' },
16
+ { label: 'Colombia', value: 'Colombia', id: 'co' },
17
+ { label: 'Chile', value: 'Chile', id: 'cl' },
18
+ { label: 'Peru', value: 'Peru', id: 'pe' },
19
+ ]
20
+
21
+ %>
22
+
23
+ <%= pb_rails("dropdown", props: {options: options}) %>
24
+
25
+ <script>
26
+ document.addEventListener("pb:dropdown:selected", (e) => {
27
+ const option = e.detail;
28
+ const dropdown = e.target;
29
+ console.log("Selected option:", option);
30
+ })
31
+ </script>
@@ -0,0 +1,5 @@
1
+ This kit's `options` prop requires an array of objects, each of which will be used as the selectable options within the dropdown. Each option object can support any number of key-value pairs, but each MUST contain `label`, `value` and `id`.
2
+
3
+ The kit also comes with a custom event called "pb:dropdown:selected" which updates dynamically with the selection as it changes. See code snippet to see this in action.
4
+
5
+ In addition, a data attribute called `data-option-selected` with the selection is also rendered on the parent dropdown div.
@@ -1,4 +1,4 @@
1
- <%
1
+ <%
2
2
  options = [
3
3
  { label: 'United States', value: 'United States', id: 'us' },
4
4
  { label: 'Canada', value: 'Canada', id: 'ca' },
@@ -6,4 +6,7 @@
6
6
  ]
7
7
  %>
8
8
 
9
- <%= pb_rails("dropdown", props: { error: "Please make a valid selection", options: options }) %>
9
+ <%= pb_rails("dropdown", props: {
10
+ error: raw(pb_rails("icon", props: { icon: "warning" }) + " Please make a valid selection"),
11
+ options: options
12
+ }) %>