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

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 (231) 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/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_date_picker/docs/_date_picker_error.html.erb +2 -2
  51. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones.html.erb +22 -1
  52. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_line.html.erb +55 -0
  53. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_line_rails.md +5 -0
  54. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_rails.md +5 -0
  55. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_event_listeners.jsx +59 -0
  56. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_event_listeners_react.md +1 -0
  57. data/app/pb_kits/playbook/pb_draggable/docs/example.yml +2 -0
  58. data/app/pb_kits/playbook/pb_draggable/docs/index.js +2 -1
  59. data/app/pb_kits/playbook/pb_draggable/draggable_container.rb +11 -1
  60. data/app/pb_kits/playbook/pb_draggable/draggable_item.rb +11 -1
  61. data/app/pb_kits/playbook/pb_draggable/index.js +4 -2
  62. data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableItem.tsx +33 -5
  63. data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +6 -1
  64. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +82 -35
  65. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.html.erb +31 -0
  66. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.md +5 -0
  67. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_error.html.erb +5 -2
  68. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select.jsx +56 -0
  69. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select.md +3 -0
  70. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display.jsx +58 -0
  71. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display.md +3 -0
  72. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display_rails.html.erb +20 -0
  73. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display_rails.md +1 -0
  74. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_rails.html.erb +19 -0
  75. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_rails.md +3 -0
  76. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.html.erb +20 -0
  77. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.jsx +57 -0
  78. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.md +1 -0
  79. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.html.erb +50 -0
  80. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.jsx +105 -0
  81. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.html.erb +22 -0
  82. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.jsx +67 -0
  83. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.html.erb +28 -0
  84. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.jsx +17 -64
  85. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.html.erb +58 -0
  86. data/app/pb_kits/playbook/pb_dropdown/docs/{_dropdown_with_autocomplete_and_custom_display.jsx → _dropdown_with_autocomplete_with_subcomponents.jsx} +11 -25
  87. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.md +1 -0
  88. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.jsx +11 -0
  89. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.md +1 -1
  90. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.html.erb +33 -2
  91. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.md +3 -1
  92. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_external_control.md +1 -0
  93. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.jsx +61 -0
  94. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.md +2 -0
  95. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.html.erb +52 -0
  96. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.md +2 -0
  97. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +18 -5
  98. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +7 -2
  99. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +3 -3
  100. data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +20 -2
  101. data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +45 -1
  102. data/app/pb_kits/playbook/pb_dropdown/dropdown_container.html.erb +10 -0
  103. data/app/pb_kits/playbook/pb_dropdown/dropdown_container.rb +3 -0
  104. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.html.erb +37 -6
  105. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.rb +5 -1
  106. data/app/pb_kits/playbook/pb_dropdown/hooks/useHandleOnKeydown.tsx +0 -6
  107. data/app/pb_kits/playbook/pb_dropdown/index.js +380 -17
  108. data/app/pb_kits/playbook/pb_dropdown/keyboard_accessibility.js +64 -11
  109. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownContainer.tsx +3 -4
  110. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownOption.tsx +16 -12
  111. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +83 -17
  112. data/app/pb_kits/playbook/pb_dropdown/subcomponents/MultiSelectTriggerDisplay.tsx +58 -0
  113. data/app/pb_kits/playbook/pb_empty_state/_empty_state.scss +8 -1
  114. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_alignment.html.erb +27 -0
  115. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_default.html.erb +7 -0
  116. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_orientation.html.erb +12 -0
  117. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_size.html.erb +23 -0
  118. data/app/pb_kits/playbook/pb_empty_state/docs/example.yml +5 -1
  119. data/app/pb_kits/playbook/pb_empty_state/empty_state.html.erb +19 -0
  120. data/app/pb_kits/playbook/pb_empty_state/empty_state.rb +123 -0
  121. data/app/pb_kits/playbook/pb_file_upload/_file_upload.scss +13 -0
  122. data/app/pb_kits/playbook/pb_file_upload/_file_upload.tsx +11 -1
  123. data/app/pb_kits/playbook/pb_file_upload/docs/_file_upload_error.html.erb +1 -0
  124. data/app/pb_kits/playbook/pb_file_upload/docs/_file_upload_error.jsx +41 -0
  125. data/app/pb_kits/playbook/pb_file_upload/docs/example.yml +2 -0
  126. data/app/pb_kits/playbook/pb_file_upload/docs/index.js +1 -0
  127. data/app/pb_kits/playbook/pb_file_upload/file_upload.html.erb +1 -0
  128. data/app/pb_kits/playbook/pb_file_upload/file_upload.rb +7 -1
  129. data/app/pb_kits/playbook/pb_file_upload/fileupload.test.js +18 -0
  130. data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +1 -0
  131. data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +1 -0
  132. data/app/pb_kits/playbook/pb_form_group/_error_state_mixin.scss +2 -2
  133. data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +19 -12
  134. data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.tsx +13 -7
  135. data/app/pb_kits/playbook/pb_message/_message.tsx +3 -0
  136. data/app/pb_kits/playbook/pb_message/docs/_message_grayscale.html.erb +9 -0
  137. data/app/pb_kits/playbook/pb_message/docs/_message_grayscale.jsx +21 -0
  138. data/app/pb_kits/playbook/pb_message/docs/example.yml +2 -0
  139. data/app/pb_kits/playbook/pb_message/docs/index.js +1 -0
  140. data/app/pb_kits/playbook/pb_message/message.html.erb +2 -1
  141. data/app/pb_kits/playbook/pb_message/message.rb +1 -0
  142. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +2 -2
  143. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.html.erb +11 -11
  144. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.jsx +11 -11
  145. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_default.html.erb +11 -11
  146. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_default.jsx +11 -11
  147. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.html.erb +11 -11
  148. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.jsx +11 -11
  149. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options.html.erb +11 -11
  150. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options.jsx +11 -11
  151. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_default.html.erb +11 -11
  152. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_default.jsx +11 -11
  153. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent.html.erb +11 -11
  154. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent.jsx +11 -11
  155. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent_default.html.erb +11 -11
  156. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent_default.jsx +11 -11
  157. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.html.erb +11 -11
  158. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.jsx +11 -11
  159. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.html.erb +11 -11
  160. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.jsx +11 -11
  161. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_react_hook.jsx +11 -11
  162. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_reset.html.erb +11 -11
  163. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_return_all_selected.html.erb +11 -11
  164. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_return_all_selected.jsx +11 -11
  165. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.html.erb +11 -11
  166. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.md +2 -0
  167. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids_react.jsx +11 -11
  168. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids_react.md +3 -1
  169. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single.html.erb +22 -22
  170. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single.jsx +22 -22
  171. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single_children_only.html.erb +22 -22
  172. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single_children_only.jsx +22 -22
  173. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_children.jsx +11 -11
  174. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_children_with_radios.jsx +11 -11
  175. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_form.html.erb +11 -11
  176. data/app/pb_kits/playbook/pb_overlay/_overlay.scss +2 -1
  177. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.jsx +1 -1
  178. data/app/pb_kits/playbook/pb_overlay/subcomponents/_overlay_token.tsx +5 -4
  179. data/app/pb_kits/playbook/pb_person/_person.tsx +12 -2
  180. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss +9 -9
  181. data/app/pb_kits/playbook/pb_section_separator/_section_separator.tsx +2 -2
  182. data/app/pb_kits/playbook/pb_select/_select.scss +10 -0
  183. data/app/pb_kits/playbook/pb_select/docs/_select_error.html.erb +1 -1
  184. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click.jsx +7 -7
  185. data/app/pb_kits/playbook/pb_table/subcomponents/_table_row.tsx +5 -5
  186. data/app/pb_kits/playbook/pb_text_input/_text_input.scss +4 -2
  187. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_error.html.erb +1 -1
  188. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_error.html.erb +5 -1
  189. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +73 -3
  190. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_error_state.html.erb +8 -1
  191. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_preserve_input.jsx +23 -0
  192. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_preserve_input.md +1 -0
  193. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +1 -0
  194. data/app/pb_kits/playbook/pb_typeahead/docs/index.js +1 -0
  195. data/app/pb_kits/playbook/pb_user/_user.tsx +3 -0
  196. data/app/pb_kits/playbook/pb_user/docs/_user_grayscale.html.erb +6 -0
  197. data/app/pb_kits/playbook/pb_user/docs/_user_grayscale.jsx +16 -0
  198. data/app/pb_kits/playbook/pb_user/docs/example.yml +2 -0
  199. data/app/pb_kits/playbook/pb_user/docs/index.js +1 -0
  200. data/app/pb_kits/playbook/pb_user/user.html.erb +2 -1
  201. data/app/pb_kits/playbook/pb_user/user.rb +1 -0
  202. data/dist/chunks/_typeahead-BmOWdDtp.js +22 -0
  203. data/dist/chunks/_weekday_stacked-CvcuQyr9.js +45 -0
  204. data/dist/chunks/lib-D5R1BjUn.js +29 -0
  205. data/dist/chunks/{pb_form_validation-BWjy4bFn.js → pb_form_validation-BZ2AVAi_.js} +1 -1
  206. data/dist/chunks/vendor.js +1 -1
  207. data/dist/menu.yml +6 -14
  208. data/dist/playbook-doc.js +2 -2
  209. data/dist/playbook-rails-react-bindings.js +1 -1
  210. data/dist/playbook-rails.js +1 -1
  211. data/dist/playbook.css +1 -1
  212. data/lib/playbook/kit_base.rb +3 -3
  213. data/lib/playbook/version.rb +2 -2
  214. metadata +76 -22
  215. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default.html.erb +0 -10
  216. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_and_custom_display.md +0 -1
  217. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_hook.jsx +0 -79
  218. data/app/pb_kits/playbook/pb_gantt_chart/_gantt_chart.scss +0 -3
  219. data/app/pb_kits/playbook/pb_gantt_chart/_gantt_chart.tsx +0 -72
  220. data/app/pb_kits/playbook/pb_gantt_chart/docs/_gantt_chart_default.jsx +0 -53
  221. data/app/pb_kits/playbook/pb_gantt_chart/docs/example.yml +0 -7
  222. data/app/pb_kits/playbook/pb_gantt_chart/docs/index.js +0 -1
  223. data/app/pb_kits/playbook/pb_gantt_chart/gantt_chart.test.jsx +0 -19
  224. data/dist/chunks/_typeahead-D8CsVBZO.js +0 -22
  225. data/dist/chunks/_weekday_stacked-D3oLTSkH.js +0 -45
  226. data/dist/chunks/lib-BmTAc7Nc.js +0 -29
  227. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_react.md → _advanced_table_selectable_rows.md} +0 -0
  228. /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
  229. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows.html.erb → _advanced_table_selectable_rows_rails.html.erb} +0 -0
  230. /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_drop_zones_line.md → _draggable_drop_zones_line_react.md} +0 -0
  231. /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_event_listeners.md → _draggable_event_listeners_rails.md} +0 -0
@@ -1,4 +1,6 @@
1
1
  const OPTION_SELECTOR = "[data-dropdown-option-label]";
2
+ const SEARCH_INPUT_SELECTOR = "[data-dropdown-autocomplete]";
3
+
2
4
  export class PbDropdownKeyboard {
3
5
  constructor(dropdown) {
4
6
  this.dropdown = dropdown;
@@ -7,6 +9,9 @@ export class PbDropdownKeyboard {
7
9
  this.dropdownElement.querySelectorAll(OPTION_SELECTOR)
8
10
  );
9
11
  this.focusedOptionIndex = -1;
12
+ this.searchInput = this.dropdownElement.querySelector(
13
+ SEARCH_INPUT_SELECTOR
14
+ );
10
15
  this.init();
11
16
  }
12
17
 
@@ -15,6 +20,25 @@ export class PbDropdownKeyboard {
15
20
  "keydown",
16
21
  this.handleKeyDown.bind(this)
17
22
  );
23
+ if (this.searchInput) {
24
+ this.searchInput.addEventListener("input", () =>
25
+ this.openDropdownIfClosed()
26
+ );
27
+ }
28
+ }
29
+
30
+ getVisibleOptions() {
31
+ // We only want to return the options that are visible
32
+ return Array.from(
33
+ this.dropdownElement.querySelectorAll(OPTION_SELECTOR)
34
+ ).filter((opt) => opt.style.display !== "none");
35
+ }
36
+
37
+ openDropdownIfClosed() {
38
+ if (!this.dropdown.target.classList.contains("open")) {
39
+ this.dropdown.showElement(this.dropdown.target);
40
+ this.dropdown.updateArrowDisplay(true);
41
+ }
18
42
  }
19
43
 
20
44
  handleKeyDown(event) {
@@ -50,28 +74,57 @@ export class PbDropdownKeyboard {
50
74
  this.dropdown.updateArrowDisplay(false);
51
75
  this.resetFocus();
52
76
  break;
77
+ case "Backspace":
78
+ if (this.searchInput) {
79
+ setTimeout(() => {
80
+ if (this.searchInput.value.trim() === "") {
81
+ this.dropdown.handleBackspaceClear();
82
+ }
83
+ }, 0);
84
+ }
85
+ break;
53
86
  default:
54
87
  break;
55
88
  }
56
89
  }
57
90
 
58
- moveFocus(direction) {
91
+ moveFocus(direction) {
92
+ const allOptions = Array.from(
93
+ this.dropdownElement.querySelectorAll(OPTION_SELECTOR)
94
+ );
95
+ const visible = this.getVisibleOptions();
96
+ if (!visible.length) return;
97
+
59
98
  if (this.focusedOptionIndex !== -1) {
60
- this.options[this.focusedOptionIndex].classList.remove(
99
+ allOptions[this.focusedOptionIndex].classList.remove(
61
100
  "pb_dropdown_option_focused"
62
101
  );
63
102
  }
64
- this.focusedOptionIndex =
65
- (this.focusedOptionIndex + direction + this.options.length) %
66
- this.options.length;
67
- this.options[this.focusedOptionIndex].classList.add(
68
- "pb_dropdown_option_focused"
69
- );
103
+
104
+ const prevVisibleIndex =
105
+ this.focusedOptionIndex === -1
106
+ ? -1
107
+ : visible.indexOf(allOptions[this.focusedOptionIndex]);
108
+
109
+ const nextVisibleIndex =
110
+ (prevVisibleIndex + direction + visible.length) % visible.length;
111
+
112
+ const nextEl = visible[nextVisibleIndex];
113
+ nextEl.classList.add("pb_dropdown_option_focused");
114
+
115
+ this.focusedOptionIndex = allOptions.indexOf(nextEl);
70
116
  }
71
117
 
118
+
72
119
  selectOption() {
73
- const option = this.options[this.focusedOptionIndex];
74
- this.dropdown.onOptionSelected(option.dataset.dropdownOptionLabel, option);
75
- this.dropdown.hideElement(this.dropdown.target);
120
+ const allOptions = Array.from(
121
+ this.dropdownElement.querySelectorAll(OPTION_SELECTOR)
122
+ );
123
+ if (this.focusedOptionIndex < 0) return;
124
+
125
+ const optionEl = allOptions[this.focusedOptionIndex];
126
+ this.dropdown.handleOptionClick({ target: optionEl });
127
+ this.dropdown.toggleElement(this.dropdown.target);
128
+ this.dropdown.updateClearButton();
76
129
  }
77
130
  }
@@ -6,7 +6,7 @@ import {
6
6
  buildDataProps,
7
7
  buildHtmlProps
8
8
  } from "../../utilities/props";
9
- import { globalProps } from "../../utilities/globalProps";
9
+ import { globalProps, GlobalProps } from "../../utilities/globalProps";
10
10
 
11
11
  import DropdownContext from "../context";
12
12
 
@@ -24,7 +24,7 @@ type DropdownContainerProps = {
24
24
  htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
25
25
  id?: string;
26
26
  searchbar?: boolean;
27
- };
27
+ } & GlobalProps;
28
28
 
29
29
  const DropdownContainer = (props: DropdownContainerProps) => {
30
30
  const {
@@ -46,7 +46,6 @@ const DropdownContainer = (props: DropdownContainerProps) => {
46
46
  inputRef,
47
47
  isDropDownClosed,
48
48
  setFocusedOptionIndex,
49
- triggerRef
50
49
  } = useContext(DropdownContext);
51
50
 
52
51
  const ariaProps = buildAriaProps(aria);
@@ -67,7 +66,7 @@ const DropdownContainer = (props: DropdownContainerProps) => {
67
66
  id={id}
68
67
  onMouseEnter={() => setFocusedOptionIndex(-1)}
69
68
  ref={dropdownContainerRef}
70
- style={triggerRef ? {} : { position: "absolute"}}
69
+ style={{ position: "absolute"}}
71
70
  >
72
71
  {searchbar && (
73
72
  <TextInput dark={dark}
@@ -45,27 +45,31 @@ const DropdownOption = (props: DropdownOptionProps) => {
45
45
  filterItem,
46
46
  focusedOptionIndex,
47
47
  handleOptionClick,
48
+ multiSelect,
48
49
  selected,
49
50
  } = useContext(DropdownContext);
50
51
 
51
- const isItemMatchingFilter = (option: GenericObject) => {
52
- const label = typeof option.label === 'string' ? option.label.toLowerCase() : option.label;
52
+ const isItemMatchingFilter = (option: GenericObject | undefined) => {
53
+ const label = typeof option?.label === 'string' ? option.label.toLowerCase() : option?.label;
53
54
  return String(label).toLowerCase().includes(filterItem.toLowerCase());
54
55
  }
55
56
 
56
- if (!isItemMatchingFilter(option)) {
57
+ // When multiSelect, then if an option is selected, remove from dropdown
58
+ const isSelected = Array.isArray(selected)
59
+ ? selected.some((item) => item.label === option?.label)
60
+ : (selected as GenericObject)?.label === option?.label;
61
+
62
+
63
+ if (!isItemMatchingFilter(option) || (multiSelect && isSelected)) {
57
64
  return null;
58
65
  }
59
66
  const isFocused =
60
67
  focusedOptionIndex >= 0 &&
61
- filteredOptions[focusedOptionIndex].label === option.label;
68
+ filteredOptions[focusedOptionIndex].label === option?.label;
62
69
  const focusedClass = isFocused && "focused";
63
70
 
64
- const selectedClass = `${
65
- selected?.label === option.label
66
- ? "selected"
67
- : "list"
68
- }`;
71
+ const selectedClass = isSelected ? "selected" : "list";
72
+
69
73
  const ariaProps = buildAriaProps(aria);
70
74
  const dataProps = buildDataProps(data);
71
75
  const htmlProps = buildHtmlProps(htmlOptions);
@@ -92,14 +96,14 @@ const DropdownOption = (props: DropdownOptionProps) => {
92
96
  <ListItem
93
97
  cursor="pointer"
94
98
  dark={dark}
95
- data-name={option.value}
96
- key={option.label}
99
+ data-name={option?.value}
100
+ key={option?.label}
97
101
  padding="none"
98
102
  >
99
103
  {children ?
100
104
  <div className="dropdown_option_wrapper">{children}</div> :
101
105
  <Body dark={dark}
102
- text={option.label}
106
+ text={option?.label}
103
107
  />
104
108
  }
105
109
  </ListItem>
@@ -10,6 +10,7 @@ import { globalProps } from "../../utilities/globalProps";
10
10
  import { useHandleOnKeyDown } from "../hooks/useHandleOnKeydown";
11
11
 
12
12
  import DropdownContext from "../context";
13
+ import MultiSelectTriggerDisplay from "./MultiSelectTriggerDisplay";
13
14
 
14
15
  import Body from "../../pb_body/_body";
15
16
  import Icon from "../../pb_icon/_icon";
@@ -44,16 +45,17 @@ const DropdownTrigger = (props: DropdownTriggerProps) => {
44
45
  const {
45
46
  autocomplete,
46
47
  filterItem,
48
+ handleBackspace,
47
49
  handleChange,
48
50
  handleWrapperClick,
49
51
  inputRef,
50
52
  inputWrapperRef,
51
53
  isDropDownClosed,
52
54
  isInputFocused,
55
+ multiSelect,
53
56
  selected,
54
57
  setIsInputFocused,
55
58
  toggleDropdown,
56
- triggerRef,
57
59
  } = useContext(DropdownContext);
58
60
 
59
61
  const handleKeyDown = useHandleOnKeyDown();
@@ -70,11 +72,21 @@ const DropdownTrigger = (props: DropdownTriggerProps) => {
70
72
  const triggerWrapperClasses = buildCss(
71
73
  "dropdown_trigger_wrapper",
72
74
  isInputFocused && "focus",
73
- !autocomplete && "select_only"
75
+ !autocomplete && !multiSelect && "select_only"
74
76
  );
75
77
 
78
+ const selectedArray = Array.isArray(selected)
79
+ ? selected
80
+ : selected && Object.keys(selected).length
81
+ ? [selected]
82
+ : [];
83
+
84
+ const joinedLabels = multiSelect
85
+ ? ""
86
+ : selectedArray.map((option) => option.label).join(", ");
87
+
76
88
  const customDisplayPlaceholder = selected?.label ? (
77
- <b>{selected.label}</b>
89
+ ""
78
90
  ) : autocomplete ? (
79
91
  ""
80
92
  ) : placeholder ? (
@@ -83,8 +95,8 @@ const DropdownTrigger = (props: DropdownTriggerProps) => {
83
95
  "Select..."
84
96
  );
85
97
 
86
- const defaultDisplayPlaceholder = selected?.label
87
- ? selected.label
98
+ const defaultDisplayPlaceholder = joinedLabels
99
+ ? joinedLabels
88
100
  : autocomplete
89
101
  ? ""
90
102
  : placeholder
@@ -99,7 +111,6 @@ const DropdownTrigger = (props: DropdownTriggerProps) => {
99
111
  id={id}
100
112
  >
101
113
  {
102
- !triggerRef && (
103
114
  children ? (
104
115
  <div
105
116
  onClick={() => toggleDropdown()}
@@ -127,31 +138,71 @@ const DropdownTrigger = (props: DropdownTriggerProps) => {
127
138
  paddingX="sm"
128
139
  paddingY="xs"
129
140
  >
130
- <FlexItem>
131
- <Flex align="center">
141
+ <FlexItem fixedSize={multiSelect ? "85%" : ""}>
142
+ <Flex align="center"
143
+ wrap
144
+ >
132
145
  {customDisplay ? (
133
146
  <Flex align="center">
134
147
  {customDisplay}
135
148
  <Body dark={dark}
136
- paddingLeft={`${selected.label ? "xs" : "none"}`}
149
+ paddingLeft={`${joinedLabels ? "xs" : "none"}`}
137
150
  >
138
151
  {customDisplayPlaceholder}
139
152
  </Body>
140
153
  </Flex>
141
154
  ) : (
142
- <Body dark={dark}
143
- text={defaultDisplayPlaceholder}
144
- />
155
+ multiSelect ? (
156
+ <>
157
+ <MultiSelectTriggerDisplay
158
+ autocomplete={autocomplete}
159
+ dark={dark}
160
+ placeholder={placeholder}
161
+ selected={selectedArray}
162
+ />
163
+ {autocomplete && (
164
+ <input
165
+ className="dropdown_input"
166
+ onChange={handleChange}
167
+ onClick={(e) => {
168
+ e.stopPropagation();// keep the wrapper’s handler from firing
169
+ toggleDropdown();
170
+ }}
171
+ onFocus={() => setIsInputFocused(true)}
172
+ onKeyDown={(e) => {
173
+ handleKeyDown(e);
174
+ e.stopPropagation(); //Fixes issue with keyboard accessibility
175
+ }}
176
+ placeholder={
177
+ joinedLabels
178
+ ? ""
179
+ : placeholder
180
+ ? placeholder
181
+ : "Select..."
182
+ }
183
+ ref={inputRef}
184
+ value={filterItem}
185
+ />
186
+ )}
187
+ </>
188
+ ) : (
189
+ <Body dark={dark}
190
+ text={defaultDisplayPlaceholder}
191
+ />
192
+ )
145
193
  )}
146
- {autocomplete && (
194
+ {autocomplete && !multiSelect && (
147
195
  <input
148
196
  className="dropdown_input"
149
197
  onChange={handleChange}
150
- onClick={() => toggleDropdown()}
198
+ onClick={(e) => {
199
+ e.stopPropagation();// keep the wrapper’s handler from firing
200
+ toggleDropdown();
201
+ }}
151
202
  onFocus={() => setIsInputFocused(true)}
152
203
  onKeyDown={handleKeyDown}
153
204
  placeholder={
154
- selected.label
205
+ joinedLabels
155
206
  ? ""
156
207
  : placeholder
157
208
  ? placeholder
@@ -163,14 +214,29 @@ const DropdownTrigger = (props: DropdownTriggerProps) => {
163
214
  )}
164
215
  </Flex>
165
216
  </FlexItem>
217
+ <FlexItem>
166
218
  <Body
219
+ alignItems="center"
167
220
  dark={dark}
168
221
  display="flex"
169
222
  htmlOptions={{
170
223
  onClick: (e: Event) => {e.stopPropagation();handleWrapperClick()}
171
224
  }}
172
225
  key={`${isDropDownClosed ? "chevron-down" : "chevron-up"}`}
173
- >
226
+ >
227
+ {
228
+ selectedArray.length > 0 && (
229
+ <div onClick={(e)=>{e.stopPropagation();handleBackspace()}}>
230
+ <Icon
231
+ cursor="pointer"
232
+ dark={dark}
233
+ icon="times"
234
+ paddingRight="xs"
235
+ size="sm"
236
+ />
237
+ </div>
238
+ )
239
+ }
174
240
  <Icon
175
241
  cursor="pointer"
176
242
  dark={dark}
@@ -178,10 +244,10 @@ const DropdownTrigger = (props: DropdownTriggerProps) => {
178
244
  size="sm"
179
245
  />
180
246
  </Body>
247
+ </FlexItem>
181
248
  </Flex>
182
249
  </>
183
250
  )
184
- )
185
251
  }
186
252
  </div>
187
253
  );
@@ -0,0 +1,58 @@
1
+ import React, { useContext } from "react";
2
+ import FormPill from "../../pb_form_pill/_form_pill";
3
+ import Flex from "../../pb_flex/_flex";
4
+ import Body from "../../pb_body/_body";
5
+ import { GenericObject } from "../../types";
6
+ import DropdownContext
7
+ from "../context";
8
+ type MultiSelectTriggerDisplayProps = {
9
+ autocomplete?: boolean;
10
+ selected: GenericObject[];
11
+ placeholder?: string;
12
+ dark?: boolean;
13
+ };
14
+
15
+ const MultiSelectTriggerDisplay = ({
16
+ autocomplete,
17
+ selected,
18
+ placeholder,
19
+ dark = false,
20
+ }: MultiSelectTriggerDisplayProps) => {
21
+
22
+ const { setSelected, onSelect, formPillProps } = useContext(DropdownContext);
23
+
24
+ if (selected.length === 0) {
25
+ if (autocomplete) return null;
26
+ return (
27
+ <Body dark={dark}
28
+ text={placeholder ? placeholder : "Select..."}
29
+ />
30
+ )
31
+ }
32
+
33
+ const handleRemoveIconClick = (option: GenericObject) => {
34
+ setSelected((prev: GenericObject[]) => {
35
+ const next = prev.filter((item) => item.label !== option.label);
36
+ onSelect && onSelect(next);
37
+ return next;
38
+ });
39
+ }
40
+
41
+ return (
42
+ <Flex wrap>
43
+ {selected.map((option, i) => (
44
+ <FormPill
45
+ dark={dark}
46
+ key={i}
47
+ marginRight="xs"
48
+ onClick={(e)=>{e.stopPropagation();handleRemoveIconClick(option)}}
49
+ tabIndex={0}
50
+ text={option.label}
51
+ {...formPillProps}
52
+ />
53
+ ))}
54
+ </Flex>
55
+ );
56
+ };
57
+
58
+ export default MultiSelectTriggerDisplay;
@@ -1,4 +1,5 @@
1
1
  .pb_empty_state_kit {
2
+ max-width: 100%;
2
3
 
3
4
  .sm-state-vertical {
4
5
  width: 150px;
@@ -35,4 +36,10 @@
35
36
  }
36
37
  }
37
38
 
38
- }
39
+ &.dark {
40
+ [class*="pb_title_kit"],
41
+ [class*="pb_body_kit"],
42
+ [class*="pb_detail_kit"],
43
+ [class*="pb_button_kit_link"]:hover { color: $white; }
44
+ }
45
+ }
@@ -0,0 +1,27 @@
1
+ <%= pb_rails("flex", props: {align: "center", spacing: "evenly", wrap: true}) do %>
2
+ <%= pb_rails("empty_state", props: {
3
+ description: "Body text goes into detail with possible steps for user to take",
4
+ header: "Title Explains",
5
+ image: "default",
6
+ primary_button: "Next Action",
7
+ primary_button_url: "#primary_button_url",
8
+ alignment: "left",
9
+ }) %>
10
+
11
+ <%= pb_rails("empty_state", props: {
12
+ description: "Body text goes into detail with possible steps for user to take",
13
+ header: "Title Explains",
14
+ image: "default",
15
+ primary_button: "Next Action",
16
+ primary_button_url: "#primary_button_url",
17
+ }) %>
18
+
19
+ <%= pb_rails("empty_state", props: {
20
+ description: "Body text goes into detail with possible steps for user to take",
21
+ header: "Title Explains",
22
+ image: "default",
23
+ primary_button: "Next Action",
24
+ primary_button_url: "#primary_button_url",
25
+ alignment: "right",
26
+ }) %>
27
+ <% end %>
@@ -0,0 +1,7 @@
1
+ <%= pb_rails("flex", props: {align: "center", justify: "center"}) do %>
2
+ <%= pb_rails("empty_state", props: {
3
+ description: "Body text goes into detail with possible steps for user to take",
4
+ header: "Title Explains",
5
+ image: "default",
6
+ }) %>
7
+ <% end %>
@@ -0,0 +1,12 @@
1
+ <%= pb_rails("flex", props: {align: "center", justify: "center", wrap: true}) do %>
2
+ <%= pb_rails("empty_state", props: {
3
+ description: "Body text goes into detail with possible steps for user to take",
4
+ header: "Title Explains",
5
+ image: "default",
6
+ orientation:"horizontal",
7
+ alignment: "left",
8
+ size: "lg",
9
+ primary_button: "Next Action",
10
+ primary_button_url: "#primary_button_url",
11
+ }) %>
12
+ <% end %>
@@ -0,0 +1,23 @@
1
+ <%= pb_rails("flex", props: {align: "center", spacing: "evenly", wrap: true}) do %>
2
+ <%= pb_rails("empty_state", props: {
3
+ description: "Body text goes into detail with possible steps for user to take",
4
+ header: "Title Explains",
5
+ image: "default",
6
+ primary_button: "Next Action",
7
+ primary_button_url: "#primary_button_url",
8
+ link_button: "Alt Action",
9
+ link_button_url: "#link_button_url",
10
+ size: "sm",
11
+ }) %>
12
+
13
+ <%= pb_rails("empty_state", props: {
14
+ description: "Body text goes into detail with possible steps for user to take",
15
+ header: "Title Explains",
16
+ image: "default",
17
+ primary_button: "Next Action",
18
+ primary_button_url: "#primary_button_url",
19
+ link_button: "Alt Action",
20
+ link_button_url: "#link_button_url",
21
+ size: "lg",
22
+ }) %>
23
+ <% end %>
@@ -1,5 +1,9 @@
1
1
  examples:
2
-
2
+ rails:
3
+ - empty_state_default: Default
4
+ - empty_state_size: Size
5
+ - empty_state_orientation: Orientation
6
+ - empty_state_alignment: Alignment
3
7
 
4
8
  react:
5
9
  - empty_state_default: Default
@@ -0,0 +1,19 @@
1
+ <%= pb_content_tag do %>
2
+ <%= pb_rails("flex", props: { align: flex_align, orientation: config[:flex_direction], padding_left: padding_size, padding_right: padding_size, vertical: "center", classname: config[:scss_class], max_width: "100%" }) do %>
3
+ <%= pb_rails("image", props: { url: image == "default" ? default_image_data_uri : image, alt: "Empty State Image", html_options: { width: config[:image_width], height: "auto", alignment: "start" } }) %>
4
+ <%= pb_rails("flex/flex_item") do %>
5
+ <%= pb_rails("title", props: { text: object.header, size: config[:title_size], padding_bottom: config[:title_padding], text_align: alignment }) %>
6
+ <% if size == "sm" %>
7
+ <%= pb_rails("detail", props: { text: object.description, padding_bottom: config[:description_pad], text_align: alignment }) %>
8
+ <% else %>
9
+ <%= pb_rails("body", props: { text: object.description, padding_bottom: config[:description_pad], text_align: alignment }) %>
10
+ <% end %>
11
+ <% if primary_button.present? %>
12
+ <%= pb_rails("button", props: { text: primary_button, variant: "primary", width: "100%", size: config[:button_size], link: primary_button_url, margin_bottom: config[:button_margin] }) %>
13
+ <% end %>
14
+ <% if link_button.present? %>
15
+ <%= pb_rails("button", props: { text: link_button, variant: "link", size: config[:button_size], link: link_button_url, width: "100%" }) %>
16
+ <% end %>
17
+ <% end %>
18
+ <% end %>
19
+ <% end %>