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

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 (252) 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 +14 -10
  9. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +7 -2
  10. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.html.erb +16 -8
  11. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +9 -0
  12. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta.md +5 -7
  13. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility.jsx +57 -0
  14. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility.md +4 -0
  15. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_custom.jsx +62 -0
  16. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_custom.md +1 -0
  17. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_multi.jsx +82 -0
  18. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_multi.md +1 -0
  19. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_with_state.jsx +66 -0
  20. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_with_state.md +3 -0
  21. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_default.md +1 -1
  22. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions_rails.html.erb +137 -0
  23. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions_rails.md +3 -0
  24. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_header_rails.html.erb +40 -0
  25. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_header_rails.md +1 -0
  26. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows_rails.md +5 -1
  27. 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
  28. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_rails.md +3 -2
  29. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +9 -3
  30. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +6 -2
  31. data/app/pb_kits/playbook/pb_advanced_table/flat_advanced_table.js +106 -0
  32. data/app/pb_kits/playbook/pb_advanced_table/index.js +370 -10
  33. data/app/pb_kits/playbook/pb_advanced_table/scss_partials/advanced_table_sticky_mixin.scss +1 -0
  34. data/app/pb_kits/playbook/pb_advanced_table/table_action_bar.html.erb +23 -0
  35. data/app/pb_kits/playbook/pb_advanced_table/table_action_bar.rb +19 -0
  36. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +9 -1
  37. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +4 -3
  38. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +1 -2
  39. data/app/pb_kits/playbook/pb_avatar/_avatar.scss +4 -0
  40. data/app/pb_kits/playbook/pb_avatar/_avatar.tsx +3 -0
  41. data/app/pb_kits/playbook/pb_avatar/avatar.html.erb +3 -3
  42. data/app/pb_kits/playbook/pb_avatar/avatar.rb +2 -0
  43. data/app/pb_kits/playbook/pb_avatar/avatar.test.js +18 -0
  44. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_grayscale.html.erb +5 -0
  45. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_grayscale.jsx +16 -0
  46. data/app/pb_kits/playbook/pb_avatar/docs/example.yml +2 -0
  47. data/app/pb_kits/playbook/pb_avatar/docs/index.js +1 -0
  48. data/app/pb_kits/playbook/pb_card/card.html.erb +1 -1
  49. data/app/pb_kits/playbook/pb_card/card.rb +12 -0
  50. data/app/pb_kits/playbook/pb_checkbox/checkbox.html.erb +4 -11
  51. data/app/pb_kits/playbook/pb_checkbox/checkbox.rb +10 -6
  52. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_indeterminate.html.erb +2 -48
  53. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_indeterminate_rails.md +1 -0
  54. data/app/pb_kits/playbook/pb_checkbox/index.js +56 -0
  55. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_error.html.erb +2 -2
  56. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones.html.erb +22 -1
  57. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_line.html.erb +55 -0
  58. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_line_rails.md +5 -0
  59. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_rails.md +5 -0
  60. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_event_listeners.jsx +59 -0
  61. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_event_listeners_react.md +1 -0
  62. data/app/pb_kits/playbook/pb_draggable/docs/example.yml +2 -0
  63. data/app/pb_kits/playbook/pb_draggable/docs/index.js +2 -1
  64. data/app/pb_kits/playbook/pb_draggable/draggable_container.rb +11 -1
  65. data/app/pb_kits/playbook/pb_draggable/draggable_item.rb +11 -1
  66. data/app/pb_kits/playbook/pb_draggable/index.js +4 -2
  67. data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableItem.tsx +33 -5
  68. data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +6 -1
  69. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +91 -35
  70. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_close_on_select.jsx +42 -0
  71. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_close_on_select.md +1 -0
  72. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.html.erb +31 -0
  73. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.md +5 -0
  74. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_error.html.erb +5 -2
  75. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select.jsx +56 -0
  76. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select.md +3 -0
  77. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display.jsx +58 -0
  78. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display.md +3 -0
  79. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display_rails.html.erb +20 -0
  80. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display_rails.md +1 -0
  81. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_rails.html.erb +19 -0
  82. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_rails.md +3 -0
  83. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.html.erb +20 -0
  84. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.jsx +57 -0
  85. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.md +1 -0
  86. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.html.erb +50 -0
  87. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.jsx +105 -0
  88. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.html.erb +22 -0
  89. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.jsx +67 -0
  90. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.html.erb +28 -0
  91. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.jsx +17 -64
  92. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.html.erb +58 -0
  93. data/app/pb_kits/playbook/pb_dropdown/docs/{_dropdown_with_autocomplete_and_custom_display.jsx → _dropdown_with_autocomplete_with_subcomponents.jsx} +11 -25
  94. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.md +1 -0
  95. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.jsx +11 -0
  96. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.md +1 -1
  97. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.html.erb +33 -2
  98. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.md +3 -1
  99. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_external_control.md +1 -0
  100. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.jsx +61 -0
  101. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.md +2 -0
  102. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.html.erb +52 -0
  103. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.md +2 -0
  104. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +20 -5
  105. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +8 -2
  106. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +3 -3
  107. data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +20 -2
  108. data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +153 -3
  109. data/app/pb_kits/playbook/pb_dropdown/dropdown_container.html.erb +10 -0
  110. data/app/pb_kits/playbook/pb_dropdown/dropdown_container.rb +3 -0
  111. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.html.erb +37 -6
  112. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.rb +5 -1
  113. data/app/pb_kits/playbook/pb_dropdown/hooks/useHandleOnKeydown.tsx +0 -6
  114. data/app/pb_kits/playbook/pb_dropdown/index.js +404 -17
  115. data/app/pb_kits/playbook/pb_dropdown/keyboard_accessibility.js +64 -11
  116. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownContainer.tsx +3 -4
  117. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownOption.tsx +26 -18
  118. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +97 -20
  119. data/app/pb_kits/playbook/pb_dropdown/subcomponents/MultiSelectTriggerDisplay.tsx +58 -0
  120. data/app/pb_kits/playbook/pb_empty_state/_empty_state.scss +8 -1
  121. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_alignment.html.erb +27 -0
  122. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_default.html.erb +7 -0
  123. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_orientation.html.erb +12 -0
  124. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_size.html.erb +23 -0
  125. data/app/pb_kits/playbook/pb_empty_state/docs/example.yml +5 -1
  126. data/app/pb_kits/playbook/pb_empty_state/empty_state.html.erb +19 -0
  127. data/app/pb_kits/playbook/pb_empty_state/empty_state.rb +123 -0
  128. data/app/pb_kits/playbook/pb_file_upload/_file_upload.scss +13 -0
  129. data/app/pb_kits/playbook/pb_file_upload/_file_upload.tsx +11 -1
  130. data/app/pb_kits/playbook/pb_file_upload/docs/_file_upload_error.html.erb +1 -0
  131. data/app/pb_kits/playbook/pb_file_upload/docs/_file_upload_error.jsx +41 -0
  132. data/app/pb_kits/playbook/pb_file_upload/docs/example.yml +2 -0
  133. data/app/pb_kits/playbook/pb_file_upload/docs/index.js +1 -0
  134. data/app/pb_kits/playbook/pb_file_upload/file_upload.html.erb +1 -0
  135. data/app/pb_kits/playbook/pb_file_upload/file_upload.rb +7 -1
  136. data/app/pb_kits/playbook/pb_file_upload/fileupload.test.js +18 -0
  137. data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +1 -0
  138. data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +1 -0
  139. data/app/pb_kits/playbook/pb_form_group/_error_state_mixin.scss +2 -2
  140. data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +19 -12
  141. data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.tsx +13 -7
  142. data/app/pb_kits/playbook/pb_message/_message.tsx +3 -0
  143. data/app/pb_kits/playbook/pb_message/docs/_message_grayscale.html.erb +9 -0
  144. data/app/pb_kits/playbook/pb_message/docs/_message_grayscale.jsx +21 -0
  145. data/app/pb_kits/playbook/pb_message/docs/example.yml +2 -0
  146. data/app/pb_kits/playbook/pb_message/docs/index.js +1 -0
  147. data/app/pb_kits/playbook/pb_message/message.html.erb +2 -1
  148. data/app/pb_kits/playbook/pb_message/message.rb +1 -0
  149. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +2 -2
  150. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.html.erb +11 -11
  151. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.jsx +11 -11
  152. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_default.html.erb +11 -11
  153. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_default.jsx +11 -11
  154. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.html.erb +11 -11
  155. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.jsx +11 -11
  156. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options.html.erb +11 -11
  157. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options.jsx +11 -11
  158. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_default.html.erb +11 -11
  159. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_default.jsx +11 -11
  160. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent.html.erb +11 -11
  161. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent.jsx +11 -11
  162. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent_default.html.erb +11 -11
  163. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent_default.jsx +11 -11
  164. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.html.erb +11 -11
  165. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.jsx +11 -11
  166. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.html.erb +11 -11
  167. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.jsx +11 -11
  168. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_react_hook.jsx +11 -11
  169. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_reset.html.erb +11 -11
  170. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_return_all_selected.html.erb +11 -11
  171. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_return_all_selected.jsx +11 -11
  172. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.html.erb +11 -11
  173. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.md +2 -0
  174. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids_react.jsx +11 -11
  175. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids_react.md +3 -1
  176. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single.html.erb +22 -22
  177. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single.jsx +22 -22
  178. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single_children_only.html.erb +22 -22
  179. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single_children_only.jsx +22 -22
  180. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_children.jsx +11 -11
  181. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_children_with_radios.jsx +11 -11
  182. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_form.html.erb +11 -11
  183. data/app/pb_kits/playbook/pb_overlay/_overlay.scss +2 -1
  184. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.jsx +1 -1
  185. data/app/pb_kits/playbook/pb_overlay/subcomponents/_overlay_token.tsx +5 -4
  186. data/app/pb_kits/playbook/pb_person/_person.tsx +12 -2
  187. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss +9 -9
  188. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +4 -0
  189. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_exclude_countries.html.erb +4 -0
  190. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_exclude_countries.jsx +15 -0
  191. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_exclude_countries.md +1 -0
  192. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_only_countries.jsx +1 -1
  193. data/app/pb_kits/playbook/pb_phone_number_input/docs/example.yml +4 -3
  194. data/app/pb_kits/playbook/pb_phone_number_input/docs/index.js +1 -0
  195. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.rb +3 -0
  196. data/app/pb_kits/playbook/pb_section_separator/_section_separator.tsx +2 -2
  197. data/app/pb_kits/playbook/pb_select/_select.scss +10 -0
  198. data/app/pb_kits/playbook/pb_select/docs/_select_custom_select_subheaders.html.erb +12 -0
  199. data/app/pb_kits/playbook/pb_select/docs/_select_custom_select_subheaders.jsx +31 -0
  200. data/app/pb_kits/playbook/pb_select/docs/_select_custom_select_subheaders.md +1 -0
  201. data/app/pb_kits/playbook/pb_select/docs/_select_error.html.erb +1 -1
  202. data/app/pb_kits/playbook/pb_select/docs/example.yml +2 -0
  203. data/app/pb_kits/playbook/pb_select/docs/index.js +1 -0
  204. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click.jsx +7 -7
  205. data/app/pb_kits/playbook/pb_table/docs/_table_with_selectable_rows.html.erb +3 -51
  206. data/app/pb_kits/playbook/pb_table/subcomponents/_table_row.tsx +5 -5
  207. data/app/pb_kits/playbook/pb_text_input/_text_input.scss +4 -2
  208. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_error.html.erb +1 -1
  209. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_error.html.erb +5 -1
  210. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +73 -3
  211. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_error_state.html.erb +8 -1
  212. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_preserve_input.jsx +23 -0
  213. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_preserve_input.md +1 -0
  214. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +1 -0
  215. data/app/pb_kits/playbook/pb_typeahead/docs/index.js +1 -0
  216. data/app/pb_kits/playbook/pb_user/_user.tsx +3 -0
  217. data/app/pb_kits/playbook/pb_user/docs/_user_grayscale.html.erb +6 -0
  218. data/app/pb_kits/playbook/pb_user/docs/_user_grayscale.jsx +16 -0
  219. data/app/pb_kits/playbook/pb_user/docs/example.yml +2 -0
  220. data/app/pb_kits/playbook/pb_user/docs/index.js +1 -0
  221. data/app/pb_kits/playbook/pb_user/user.html.erb +2 -1
  222. data/app/pb_kits/playbook/pb_user/user.rb +1 -0
  223. data/dist/chunks/_typeahead-CRW6dJbW.js +22 -0
  224. data/dist/chunks/_weekday_stacked-fRmhq4xQ.js +45 -0
  225. data/dist/chunks/lib-D5R1BjUn.js +29 -0
  226. data/dist/chunks/{pb_form_validation-BWjy4bFn.js → pb_form_validation-BZ2AVAi_.js} +1 -1
  227. data/dist/chunks/vendor.js +1 -1
  228. data/dist/menu.yml +7 -15
  229. data/dist/playbook-doc.js +2 -2
  230. data/dist/playbook-rails-react-bindings.js +1 -1
  231. data/dist/playbook-rails.js +1 -1
  232. data/dist/playbook.css +1 -1
  233. data/lib/playbook/kit_base.rb +3 -3
  234. data/lib/playbook/version.rb +2 -2
  235. metadata +86 -22
  236. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default.html.erb +0 -10
  237. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_and_custom_display.md +0 -1
  238. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_hook.jsx +0 -79
  239. data/app/pb_kits/playbook/pb_gantt_chart/_gantt_chart.scss +0 -3
  240. data/app/pb_kits/playbook/pb_gantt_chart/_gantt_chart.tsx +0 -72
  241. data/app/pb_kits/playbook/pb_gantt_chart/docs/_gantt_chart_default.jsx +0 -53
  242. data/app/pb_kits/playbook/pb_gantt_chart/docs/example.yml +0 -7
  243. data/app/pb_kits/playbook/pb_gantt_chart/docs/index.js +0 -1
  244. data/app/pb_kits/playbook/pb_gantt_chart/gantt_chart.test.jsx +0 -19
  245. data/dist/chunks/_typeahead-D8CsVBZO.js +0 -22
  246. data/dist/chunks/_weekday_stacked-D3oLTSkH.js +0 -45
  247. data/dist/chunks/lib-BmTAc7Nc.js +0 -29
  248. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_react.md → _advanced_table_selectable_rows.md} +0 -0
  249. /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
  250. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows.html.erb → _advanced_table_selectable_rows_rails.html.erb} +0 -0
  251. /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_drop_zones_line.md → _draggable_drop_zones_line_react.md} +0 -0
  252. /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_event_listeners.md → _draggable_event_listeners_rails.md} +0 -0
@@ -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,8 @@ type DropdownProps = {
25
25
  blankSelection?: string;
26
26
  children?: React.ReactChild[] | React.ReactChild | React.ReactElement[];
27
27
  className?: string;
28
+ closeOnSelection?: boolean;
29
+ formPillProps?: GenericObject;
28
30
  dark?: boolean;
29
31
  data?: { [key: string]: string };
30
32
  defaultValue?: GenericObject;
@@ -33,10 +35,10 @@ type DropdownProps = {
33
35
  id?: string;
34
36
  isClosed?: boolean;
35
37
  label?: string;
38
+ multiSelect?: boolean;
36
39
  onSelect?: (arg: GenericObject) => null;
37
40
  options: GenericObject;
38
41
  separators?: boolean;
39
- triggerRef?: any;
40
42
  variant?: "default" | "subtle";
41
43
  };
42
44
 
@@ -54,6 +56,7 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
54
56
  blankSelection = '',
55
57
  children,
56
58
  className,
59
+ closeOnSelection = true,
57
60
  dark = false,
58
61
  data = {},
59
62
  defaultValue = {},
@@ -62,10 +65,11 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
62
65
  id,
63
66
  isClosed = true,
64
67
  label,
68
+ multiSelect = false,
69
+ formPillProps,
65
70
  onSelect,
66
71
  options,
67
72
  separators = true,
68
- triggerRef,
69
73
  variant = "default",
70
74
  } = props;
71
75
 
@@ -82,7 +86,20 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
82
86
  const [isDropDownClosed, setIsDropDownClosed, toggleDropdown] = useDropdown(isClosed);
83
87
 
84
88
  const [filterItem, setFilterItem] = useState("");
85
- const [selected, setSelected] = useState<GenericObject>(defaultValue);
89
+ const initialSelected = useMemo(() => {
90
+ if (multiSelect) {
91
+ if (Array.isArray(defaultValue)) return defaultValue;
92
+ return defaultValue && Object.keys(defaultValue).length
93
+ ? [defaultValue]
94
+ : [];
95
+ }
96
+ return defaultValue || {};
97
+ }, [multiSelect, defaultValue]);
98
+
99
+ const [selected, setSelected] = useState<GenericObject | GenericObject[]>(
100
+ initialSelected
101
+ );
102
+
86
103
  const [isInputFocused, setIsInputFocused] = useState(false);
87
104
  const [hasTriggerSubcomponent, setHasTriggerSubcomponent] = useState(true);
88
105
  const [hasContainerSubcomponent, setHasContainerSubcomponent] =
@@ -91,23 +108,21 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
91
108
  const [focusedOptionIndex, setFocusedOptionIndex] = useState(-1);
92
109
 
93
110
  const dropdownRef = useRef(null);
94
- const inputRef = useRef(null);
111
+ const inputRef = useRef<HTMLInputElement>(null);
95
112
  const inputWrapperRef = useRef(null);
96
113
  const dropdownContainerRef = useRef(null);
97
114
 
115
+ const selectedArray = Array.isArray(selected)
116
+ ? selected
117
+ : selected && Object.keys(selected).length
118
+ ? [selected]
119
+ : [];
120
+
98
121
  const { trigger, container, otherChildren } =
99
122
  separateChildComponents(children);
100
123
 
101
124
  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
125
+ // Handle clicks outside the dropdown
111
126
  const handleClick = handleClickOutside({
112
127
  inputWrapperRef,
113
128
  dropdownContainerRef,
@@ -134,16 +149,23 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
134
149
 
135
150
  const blankSelectionOption: GenericObject = blankSelection ? [{ label: blankSelection, value: "" }] : [];
136
151
  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
- });
152
+
153
+ const availableOptions = useMemo(()=> {
154
+ if (!multiSelect) return optionsWithBlankSelection;
155
+ return optionsWithBlankSelection.filter((option: GenericObject) => !selectedArray.some((sel) => sel.label === option.label));
156
+ }, [optionsWithBlankSelection, selectedArray, multiSelect]);
157
+
158
+ const filteredOptions = useMemo(() => {
159
+ return availableOptions.filter((opt: GenericObject) =>
160
+ String(opt.label).toLowerCase().includes(filterItem.toLowerCase())
161
+ );
162
+ }, [availableOptions, filterItem]);
141
163
 
142
164
  // For keyboard accessibility: Set focus within dropdown to selected item if it exists
143
165
  useEffect(() => {
144
166
  if (!isDropDownClosed) {
145
167
  let newIndex = 0;
146
- if (selected && selected?.label) {
168
+ if (selected && !Array.isArray(selected) && selected.label) {
147
169
  const selectedIndex = filteredOptions.findIndex((option: GenericObject) => option.label === selected.label);
148
170
  if (selectedIndex >= 0) {
149
171
  newIndex = selectedIndex;
@@ -159,22 +181,48 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
159
181
  setIsDropDownClosed(false);
160
182
  };
161
183
 
162
- const handleOptionClick = (selectedItem: GenericObject) => {
163
- setSelected(selectedItem);
164
- setFilterItem("");
165
- setIsDropDownClosed(true);
166
- onSelect && onSelect(selectedItem);
167
- };
184
+
185
+ const handleOptionClick = (clickedItem: GenericObject) => {
186
+ if (multiSelect) {
187
+ setSelected((prev) => {
188
+ const list = prev as GenericObject[];
189
+ const exists = list.find((option) => option.value === clickedItem.value);
190
+ const next = exists
191
+ ? list.filter((option) => option.value !== clickedItem.value)
192
+ : [...list, clickedItem];
193
+ onSelect && onSelect(next);
194
+ return next;
195
+ });
196
+ setFilterItem("");
197
+ // Only close dropdown if closeOnSelection is true
198
+ if (closeOnSelection) {
199
+ setIsDropDownClosed(true);
200
+ }
201
+ } else {
202
+ setSelected(clickedItem);
203
+ setFilterItem("");
204
+ onSelect && onSelect(clickedItem);
205
+ // Only close dropdown if closeOnSelection is true
206
+ if (closeOnSelection) {
207
+ setIsDropDownClosed(true);
208
+ }
209
+ }
210
+ };
168
211
 
169
212
  const handleWrapperClick = () => {
170
- autocomplete && inputRef.current.focus();
213
+ autocomplete && inputRef?.current?.focus();
171
214
  toggleDropdown();
172
215
  };
173
216
 
174
217
  const handleBackspace = () => {
218
+ if (multiSelect) {
219
+ setSelected([]);
220
+ onSelect && onSelect([]);
221
+ } else {
175
222
  setSelected({});
176
223
  onSelect && onSelect(null);
177
224
  setFocusedOptionIndex(-1);
225
+ }
178
226
  };
179
227
 
180
228
  const componentsToRender = prepareSubcomponents({
@@ -188,12 +236,17 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
188
236
  });
189
237
 
190
238
  useImperativeHandle(ref, () => ({
191
- clearSelected: () => {
192
- setSelected({});
193
- setFilterItem("");
194
- setIsDropDownClosed(true);
195
- onSelect && onSelect(null);
196
- },
239
+ clearSelected: () => {
240
+ if (multiSelect) {
241
+ setSelected([]);
242
+ onSelect && onSelect([]);
243
+ } else {
244
+ setSelected({});
245
+ onSelect && onSelect(null);
246
+ }
247
+ setFilterItem("");
248
+ setIsDropDownClosed(true);
249
+ },
197
250
  }));
198
251
 
199
252
  return (
@@ -202,15 +255,17 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
202
255
  {...htmlProps}
203
256
  className={classes}
204
257
  id={id}
205
- style={triggerRef ? { position: "absolute" } : { position: "relative" }}
258
+ style={{position: "relative"}}
206
259
  >
207
260
  <DropdownContext.Provider
208
261
  value={{
209
262
  autocomplete,
263
+ closeOnSelection,
210
264
  dropdownContainerRef,
211
265
  filteredOptions,
212
266
  filterItem,
213
267
  focusedOptionIndex,
268
+ formPillProps,
214
269
  handleBackspace,
215
270
  handleChange,
216
271
  handleOptionClick,
@@ -219,14 +274,15 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
219
274
  inputWrapperRef,
220
275
  isDropDownClosed,
221
276
  isInputFocused,
277
+ multiSelect,
278
+ onSelect,
222
279
  optionsWithBlankSelection,
223
280
  selected,
224
281
  setFocusedOptionIndex,
225
282
  setIsDropDownClosed,
226
283
  setIsInputFocused,
227
284
  setSelected,
228
- toggleDropdown,
229
- triggerRef
285
+ toggleDropdown
230
286
  }}
231
287
  >
232
288
  {label &&
@@ -0,0 +1,42 @@
1
+ import React from 'react'
2
+ import Dropdown from '../../pb_dropdown/_dropdown'
3
+
4
+ const DropdownCloseOnSelect = (props) => {
5
+
6
+ const options = [
7
+ {
8
+ label: "United States",
9
+ value: "United States",
10
+ },
11
+ {
12
+ label: "Canada",
13
+ value: "Canada",
14
+ },
15
+ {
16
+ label: "Pakistan",
17
+ value: "Pakistan",
18
+ }
19
+ ];
20
+
21
+
22
+ return (
23
+ <div>
24
+ <Dropdown
25
+ closeOnSelection={false}
26
+ label="Default"
27
+ options={options}
28
+ {...props}
29
+ />
30
+ <br />
31
+ <Dropdown
32
+ closeOnSelection={false}
33
+ label="Multi Select"
34
+ multiSelect
35
+ options={options}
36
+ {...props}
37
+ />
38
+ </div>
39
+ )
40
+ }
41
+
42
+ export default DropdownCloseOnSelect
@@ -0,0 +1 @@
1
+ By default, the dropdown menu will close when a selection is made. You can prevent this behavior by using the `closeOnSelection` prop, which will leave the menu open after a selection is made when set to 'false'.
@@ -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
+ }) %>
@@ -0,0 +1,56 @@
1
+ import React from 'react'
2
+ import Dropdown from '../../pb_dropdown/_dropdown'
3
+
4
+ const DropdownMultiSelect = (props) => {
5
+
6
+ const options = [
7
+ {
8
+ label: "United States",
9
+ value: "United States",
10
+ },
11
+ {
12
+ label: "United Kingdom",
13
+ value: "United Kingdom",
14
+ },
15
+ {
16
+ label: "Canada",
17
+ value: "Canada",
18
+ },
19
+ {
20
+ label: "Pakistan",
21
+ value: "Pakistan",
22
+ },
23
+ {
24
+ label: "India",
25
+ value: "India",
26
+ },
27
+ {
28
+ label: "Australia",
29
+ value: "Australia",
30
+ },
31
+ {
32
+ label: "New Zealand",
33
+ value: "New Zealand",
34
+ },
35
+ {
36
+ label: "Italy",
37
+ value: "Italy",
38
+ },
39
+ {
40
+ label: "Spain",
41
+ value: "Spain",
42
+ }
43
+ ];
44
+
45
+ return (
46
+ <div>
47
+ <Dropdown
48
+ multiSelect
49
+ options={options}
50
+ {...props}
51
+ />
52
+ </div>
53
+ )
54
+ }
55
+
56
+ export default DropdownMultiSelect
@@ -0,0 +1,3 @@
1
+ `multiSelect` is a boolean prop that if set to true will allow for multiple options to be selected from the Dropdown.
2
+
3
+ `multiSelect` is set to false by default.
@@ -0,0 +1,58 @@
1
+ import React from 'react'
2
+ import Dropdown from '../../pb_dropdown/_dropdown'
3
+
4
+ const DropdownMultiSelectDisplay = (props) => {
5
+
6
+ const options = [
7
+ {
8
+ label: "United States",
9
+ value: "United States",
10
+ },
11
+ {
12
+ label: "United Kingdom",
13
+ value: "United Kingdom",
14
+ },
15
+ {
16
+ label: "Canada",
17
+ value: "Canada",
18
+ },
19
+ {
20
+ label: "Pakistan",
21
+ value: "Pakistan",
22
+ },
23
+ {
24
+ label: "India",
25
+ value: "India",
26
+ },
27
+ {
28
+ label: "Australia",
29
+ value: "Australia",
30
+ },
31
+ {
32
+ label: "New Zealand",
33
+ value: "New Zealand",
34
+ },
35
+ {
36
+ label: "Italy",
37
+ value: "Italy",
38
+ },
39
+ {
40
+ label: "Spain",
41
+ value: "Spain",
42
+ }
43
+ ];
44
+
45
+
46
+ return (
47
+ <div>
48
+ <Dropdown
49
+ formPillProps={{size:"small", color:"neutral"}}
50
+ multiSelect
51
+ options={options}
52
+ {...props}
53
+ />
54
+ </div>
55
+ )
56
+ }
57
+
58
+ export default DropdownMultiSelectDisplay
@@ -0,0 +1,3 @@
1
+ By default, the `multiSelect` prop will render selected options as the default FormPill. `FormPillProps` however can be used to customize these Pills with any props that exist for the FormPill.
2
+
3
+ This prop must be an object that contains valid FormPill props. For a full list of FormPill props, see [here](https://playbook.powerapp.cloud/kits/form_pill/react).
@@ -0,0 +1,20 @@
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
+ { label: 'India', value: 'India', id: 'in' },
7
+ { label: 'United Kingdom', value: 'United Kingdom', id: 'uk' },
8
+ { label: 'Australia', value: 'Australia', id: 'au' },
9
+ { label: 'New Zealand', value: 'New Zealand', id: 'nz' },
10
+ { label: 'Germany', value: 'Germany', id: 'de' },
11
+ { label: 'France', value: 'France', id: 'fr' },
12
+ { label: 'Italy', value: 'Italy', id: 'it' },
13
+ ]
14
+ %>
15
+
16
+ <%= pb_rails("dropdown", props: {
17
+ options: options,
18
+ multi_select: true,
19
+ form_pill_props: { size:"small", color:"neutral" },
20
+ }) %>
@@ -0,0 +1 @@
1
+ By default, the `multi_select` prop will render selected options as the default form_pill. `form_pill_props` however can be used to customize these Pills with props that exist for the form_pill. Currently, only the '[color](https://playbook.powerapp.cloud/kits/form_pill/rails#form-pill-colors)' and '[size](https://playbook.powerapp.cloud/kits/form_pill/rails#form-pill-size)' props are supported as shown here.
@@ -0,0 +1,19 @@
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
+ { label: 'India', value: 'India', id: 'in' },
7
+ { label: 'United Kingdom', value: 'United Kingdom', id: 'uk' },
8
+ { label: 'Australia', value: 'Australia', id: 'au' },
9
+ { label: 'New Zealand', value: 'New Zealand', id: 'nz' },
10
+ { label: 'Germany', value: 'Germany', id: 'de' },
11
+ { label: 'France', value: 'France', id: 'fr' },
12
+ { label: 'Italy', value: 'Italy', id: 'it' },
13
+ ]
14
+ %>
15
+
16
+ <%= pb_rails("dropdown", props: {
17
+ options: options,
18
+ multi_select: true,
19
+ }) %>
@@ -0,0 +1,3 @@
1
+ `multi_select` is a boolean prop that if set to true will allow for multiple options to be selected from the Dropdown.
2
+
3
+ `multi_select` is set to false by default.
@@ -0,0 +1,20 @@
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
+ { label: 'India', value: 'India', id: 'in' },
7
+ { label: 'United Kingdom', value: 'United Kingdom', id: 'uk' },
8
+ { label: 'Australia', value: 'Australia', id: 'au' },
9
+ { label: 'New Zealand', value: 'New Zealand', id: 'nz' },
10
+ { label: 'Germany', value: 'Germany', id: 'de' },
11
+ { label: 'France', value: 'France', id: 'fr' },
12
+ { label: 'Italy', value: 'Italy', id: 'it' },
13
+ ]
14
+ %>
15
+
16
+ <%= pb_rails("dropdown", props: {
17
+ autocomplete: true,
18
+ options: options,
19
+ multi_select: true,
20
+ }) %>