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
@@ -9,12 +9,182 @@ export default class PbAdvancedTable extends PbEnhancedElement {
9
9
  return ADVANCED_TABLE_SELECTOR;
10
10
  }
11
11
 
12
+ updateTableSelectedRowsAttribute() {
13
+ const mainTable = this.element.closest(".pb_advanced_table");
14
+ mainTable.dataset.selectedRows = JSON.stringify(Array.from(PbAdvancedTable.selectedRows));
15
+ }
16
+
17
+ // Check if the row is expanded or collapsed
18
+ // This is used to determine the background color of the row
19
+ // when the checkbox is checked or unchecked
20
+ isRowExpanded(rowEl) {
21
+ const closeIcon = rowEl.querySelector(UP_ARROW_SELECTOR);
22
+ return closeIcon?.style.display === "none" || !closeIcon;
23
+ }
24
+
25
+ updateParentCheckboxes(checkbox) {
26
+ const rowEl = checkbox.closest("tr");
27
+ if (!rowEl) return;
28
+
29
+ const table = rowEl.closest("table");
30
+ if (!table) return;
31
+
32
+ const contentTrail = rowEl.dataset.advancedTableContent;
33
+ if (!contentTrail) return;
34
+
35
+ const ancestorIds = contentTrail.split("-").slice(0, -1);
36
+
37
+ ancestorIds.reverse();
38
+ ancestorIds.forEach((ancestorId) => {
39
+ const parentRowSelector = `[data-advanced-table-content$="${ancestorId}"]`;
40
+ const parentRow = table.querySelector(parentRowSelector);
41
+ if (!parentRow) return;
42
+
43
+ const parentLabel = parentRow.querySelector("label[data-row-id]");
44
+ if (!parentLabel) return;
45
+
46
+ const parentCheckbox = parentLabel.querySelector(
47
+ "input[type='checkbox']"
48
+ );
49
+ if (!parentCheckbox) return;
50
+
51
+ // Find all immediate children of parent linked to ancestor Id, filter our subrow headers
52
+ const children = Array.from(
53
+ table.querySelectorAll(`tr[data-row-parent$="_${ancestorId}"]`)
54
+ ).filter((child) => {
55
+ const content = child.dataset.advancedTableContent;
56
+ return !(content && content.endsWith("sr"));
57
+ });
58
+
59
+ const allChildrenChecked = Array.from(children).every((child) => {
60
+ const childLabel = child.querySelector("label[data-row-id]");
61
+ if (!childLabel) return false;
62
+ const childCheckbox = childLabel.querySelector(
63
+ "input[type='checkbox']"
64
+ );
65
+ if (!childCheckbox) return false;
66
+ return childCheckbox.checked;
67
+ });
68
+
69
+ // Update parent checkbox
70
+ parentCheckbox.checked = allChildrenChecked;
71
+
72
+ const parentCheckboxId = parentCheckbox.id;
73
+ if (allChildrenChecked) {
74
+ PbAdvancedTable.selectedRows.add(parentCheckboxId);
75
+ parentRow.classList.add("bg-row-selection");
76
+ parentRow.classList.remove("bg-white", "bg-silver");
77
+ } else {
78
+ PbAdvancedTable.selectedRows.delete(parentCheckboxId);
79
+ }
80
+ if (!allChildrenChecked) {
81
+ parentRow.classList.remove("bg-row-selection");
82
+
83
+ if (this.isRowExpanded(parentRow)) {
84
+ parentRow.classList.remove("bg-silver");
85
+ parentRow.classList.add("bg-white");
86
+ } else {
87
+ parentRow.classList.remove("bg-white");
88
+ parentRow.classList.add("bg-silver");
89
+ }
90
+ }
91
+ });
92
+ }
93
+
94
+ handleCheckboxClick(event) {
95
+ const checkbox = event.currentTarget;
96
+ const rowId = checkbox.id;
97
+ const isChecked = checkbox.checked;
98
+ const rowEl = checkbox.closest("tr");
99
+
100
+ if (isChecked) {
101
+ PbAdvancedTable.selectedRows.add(rowId);
102
+ rowEl.classList.add("bg-row-selection");
103
+ rowEl.classList.remove("bg-white", "bg-silver");
104
+ } else {
105
+ PbAdvancedTable.selectedRows.delete(rowId);
106
+ }
107
+ // Update background color on row
108
+ if (!isChecked) {
109
+ rowEl.classList.remove("bg-row-selection");
110
+
111
+ if (this.isRowExpanded(rowEl)) {
112
+ rowEl.classList.remove("bg-silver");
113
+ rowEl.classList.add("bg-white");
114
+ } else {
115
+ rowEl.classList.remove("bg-white");
116
+ rowEl.classList.add("bg-silver");
117
+ }
118
+ }
119
+ if (rowEl) {
120
+ const table = rowEl.closest("table");
121
+ const rowContent = rowEl.dataset.advancedTableContent;
122
+
123
+ if (rowContent) {
124
+ const childRows = table.querySelectorAll(
125
+ `[data-advanced-table-content^="${rowContent}-"]`
126
+ );
127
+
128
+ childRows.forEach((childRow) => {
129
+ const label = childRow.querySelector("label[data-row-id]");
130
+ if (!label) return;
131
+
132
+ const childCheckbox = label.querySelector("input[type='checkbox']");
133
+ if (!childCheckbox) return;
134
+
135
+ childCheckbox.checked = isChecked;
136
+
137
+ const childRowId = childCheckbox.id;
138
+ const childRowEl = childCheckbox.closest("tr");
139
+ if (isChecked) {
140
+ PbAdvancedTable.selectedRows.add(childRowId);
141
+ childRowEl?.classList.add("bg-row-selection");
142
+ childRowEl?.classList.remove("bg-white", "bg-silver");
143
+ } else {
144
+ PbAdvancedTable.selectedRows.delete(childRowId);
145
+ }
146
+ if (!isChecked) {
147
+ childRowEl?.classList.remove("bg-row-selection");
148
+
149
+ if (this.isRowExpanded(childRowEl)) {
150
+ childRowEl?.classList.remove("bg-silver");
151
+ childRowEl?.classList.add("bg-white");
152
+ } else {
153
+ childRowEl?.classList.remove("bg-white");
154
+ childRowEl?.classList.add("bg-silver");
155
+ }
156
+ }
157
+ });
158
+ }
159
+ }
160
+
161
+ this.updateParentCheckboxes(checkbox);
162
+
163
+ this.updateTableSelectedRowsAttribute();
164
+
165
+ const table = checkbox.closest("table");
166
+ const selectAllCheckbox = table.querySelector("#select-all-rows");
167
+
168
+ if (selectAllCheckbox) {
169
+ const allCheckboxes = table.querySelectorAll(
170
+ "label[data-row-id] input[type='checkbox']"
171
+ );
172
+ const allChecked = Array.from(allCheckboxes).every((cb) => cb.checked);
173
+
174
+ const selectAllInput = selectAllCheckbox.querySelector(
175
+ 'input[type="checkbox"]'
176
+ );
177
+ selectAllInput.checked = allChecked;
178
+ }
179
+ }
180
+
12
181
  get target() {
13
182
  const table = this.element.closest("table");
14
183
  return table.querySelectorAll(`[data-row-parent="${this.element.id}"]`);
15
184
  }
16
185
 
17
186
  static expandedRows = new Set();
187
+ static selectedRows = new Set();
18
188
  static isCollapsing = false;
19
189
 
20
190
  connect() {
@@ -31,17 +201,31 @@ export default class PbAdvancedTable extends PbEnhancedElement {
31
201
  this.toggleElement(this.target);
32
202
  }
33
203
  });
34
-
35
- this.hideCloseIcon()
36
204
 
37
- const nestedButtons = this.element
38
- .closest("table")
39
- .querySelectorAll("[data-advanced-table]");
205
+ this.hideCloseIcon();
206
+
207
+ const table = this.element.closest("table");
208
+
209
+ // Prevent duplicate initialization
210
+ if (table.dataset.pbAdvancedTableInitialized) return;
211
+ table.dataset.pbAdvancedTableInitialized = "true";
212
+
213
+ // Bind checkbox change handlers for all row checkboxes
214
+ const checkboxLabels = table.querySelectorAll("label[data-row-id]");
215
+ checkboxLabels.forEach((label) => {
216
+ const checkbox = label.querySelector("input[type='checkbox']");
217
+ if (!checkbox) return;
218
+ checkbox.addEventListener("change", (event) => {
219
+ this.handleCheckboxClick(event);
220
+ });
221
+ });
222
+
223
+ // Bind nested row expansion logic
224
+ const nestedButtons = table.querySelectorAll("[data-advanced-table]");
40
225
  nestedButtons.forEach((button) => {
41
226
  button.addEventListener("click", () => {
42
227
  const isExpanded =
43
- button.querySelector(UP_ARROW_SELECTOR).style.display ===
44
- "inline-block";
228
+ button.querySelector(UP_ARROW_SELECTOR).style.display === "inline-block";
45
229
  if (isExpanded) {
46
230
  PbAdvancedTable.expandedRows.add(button.id);
47
231
  } else {
@@ -49,12 +233,46 @@ export default class PbAdvancedTable extends PbEnhancedElement {
49
233
  }
50
234
  });
51
235
  });
236
+
237
+ // Bind select-all logic for this table
238
+ const selectAllCheckbox = table.querySelector("#select-all-rows");
239
+ if (selectAllCheckbox) {
240
+ selectAllCheckbox.addEventListener("change", () => {
241
+ const checkboxInput = selectAllCheckbox.querySelector('input[type="checkbox"]');
242
+ const checkAll = checkboxInput.checked;
243
+
244
+ const checkboxes = Array.from(
245
+ table.querySelectorAll("label[data-row-id] input[type='checkbox']")
246
+ );
247
+
248
+ checkboxes.forEach((cb) => {
249
+ cb.checked = checkAll;
250
+ const rowId = cb.id;
251
+ const rowEl = cb.closest("tr");
252
+
253
+ if (checkAll) {
254
+ PbAdvancedTable.selectedRows.add(rowId);
255
+ rowEl?.classList.add("bg-row-selection");
256
+ rowEl?.classList.remove("bg-white", "bg-silver");
257
+ } else {
258
+ PbAdvancedTable.selectedRows.delete(rowId);
259
+ rowEl?.classList.remove("bg-row-selection");
260
+ rowEl?.classList.add("bg-white");
261
+ }
262
+ });
263
+
264
+ checkboxes.forEach((cb) => this.updateParentCheckboxes(cb));
265
+
266
+ this.updateTableSelectedRowsAttribute();
267
+ });
268
+ }
52
269
  }
53
270
 
271
+
54
272
  hideCloseIcon() {
55
273
  const closeIcon = this.element.querySelector(UP_ARROW_SELECTOR);
56
274
  closeIcon.style.display = "none";
57
- }
275
+ }
58
276
 
59
277
  showElement(elements) {
60
278
  elements.forEach((elem) => {
@@ -151,7 +369,6 @@ export default class PbAdvancedTable extends PbEnhancedElement {
151
369
  }
152
370
  }
153
371
 
154
-
155
372
  displayDownArrow() {
156
373
  this.element.querySelector(DOWN_ARROW_SELECTOR).style.display =
157
374
  "inline-block";
@@ -232,10 +449,153 @@ export default class PbAdvancedTable extends PbEnhancedElement {
232
449
  }
233
450
  }
234
451
 
452
+ // Isolate action bar functionality so it doesn't mix with existing functionality
453
+ class PbAdvancedTableActionBar {
454
+ constructor() {
455
+ this.init();
456
+ }
457
+
458
+ init() {
459
+ // Initialize action bars for all advanced tables with action bars
460
+ document.addEventListener('DOMContentLoaded', () => {
461
+ this.setupActionBars();
462
+ });
463
+
464
+ // Also run immediately in case DOM is already loaded
465
+ if (document.readyState === 'loading') {
466
+ // DOM is still loading
467
+ } else {
468
+ // DOM is already loaded
469
+ this.setupActionBars();
470
+ }
471
+ }
472
+
473
+ setupActionBars() {
474
+ const advancedTables = document.querySelectorAll('.pb_advanced_table');
475
+
476
+ advancedTables.forEach(table => {
477
+ // Only proceed if this table has both selectable rows AND an action bar
478
+ if (!this.shouldEnableActionBar(table)) return;
479
+
480
+ const actionBar = table.querySelector('.row-selection-actions-card');
481
+ if (!actionBar) return; // Skip tables without action bars
482
+
483
+ // Initialize action bar styles
484
+ this.initializeActionBar(actionBar);
485
+
486
+ // Set up checkbox listeners for this table
487
+ this.setupCheckboxListeners(table, actionBar);
488
+ });
489
+ }
490
+
491
+ shouldEnableActionBar(table) {
492
+ // Check if the table has selectable rows
493
+ const hasSelectableRows = table.querySelector('input[type="checkbox"]') !== null;
494
+
495
+ // Check if the table has a row selection action bar (not other types of action bars)
496
+ const hasRowSelectionActionBar = table.querySelector('.row-selection-actions-card') !== null;
497
+
498
+ // Additional check: look for the presence of row checkboxes with data-row-id
499
+ const hasRowCheckboxes = table.querySelector('label[data-row-id] input[type="checkbox"]') !== null;
500
+
501
+ // Only enable if ALL conditions are met:
502
+ // 1. Has selectable checkboxes
503
+ // 2. Has the specific row selection action bar
504
+ // 3. Has row checkboxes (not just other types of checkboxes)
505
+ return hasSelectableRows && hasRowSelectionActionBar && hasRowCheckboxes;
506
+ }
507
+
508
+ initializeActionBar(actionBar) {
509
+ // Set initial hidden state
510
+ Object.assign(actionBar.style, {
511
+ height: '0px',
512
+ overflow: 'hidden',
513
+ display: 'block',
514
+ opacity: '0'
515
+ });
516
+
517
+ // Remove any visibility classes
518
+ actionBar.classList.remove("p_xs", "is-visible", "show-action-card");
519
+ actionBar.classList.add("p_none");
520
+ }
521
+
522
+ setupCheckboxListeners(table, actionBar) {
523
+ // Only listen to row checkboxes (those with data-row-id), not all checkboxes
524
+ const rowCheckboxes = table.querySelectorAll('label[data-row-id] input[type="checkbox"]');
525
+
526
+ rowCheckboxes.forEach(checkbox => {
527
+ checkbox.addEventListener('change', () => {
528
+ // Use setTimeout to ensure this runs after the main checkbox logic
529
+ setTimeout(() => {
530
+ this.updateActionBarVisibility(table, actionBar);
531
+ }, 0);
532
+ });
533
+ });
534
+
535
+ // Special handling for select-all checkbox (only if it exists)
536
+ const selectAllCheckbox = table.querySelector("#select-all-rows");
537
+ if (selectAllCheckbox) {
538
+ const selectAllInput = selectAllCheckbox.querySelector('input[type="checkbox"]');
539
+ if (selectAllInput) {
540
+ selectAllInput.addEventListener('change', () => {
541
+ // Use setTimeout to ensure this runs after the main select-all logic
542
+ setTimeout(() => {
543
+ this.updateActionBarVisibility(table, actionBar);
544
+ }, 10); // Slightly longer delay for select-all to ensure all row checkboxes are updated
545
+ });
546
+ }
547
+ }
548
+ }
549
+
550
+ updateActionBarVisibility(table, actionBar) {
551
+ // Only count row checkboxes (those with data-row-id), not all checkboxes
552
+ const rowCheckboxes = table.querySelectorAll('label[data-row-id] input[type="checkbox"]');
553
+
554
+ // Get all checked row checkboxes
555
+ const selectedRowCheckboxes = Array.from(rowCheckboxes).filter(cb => cb.checked);
556
+
557
+ // Get the selected count
558
+ const selectedCount = selectedRowCheckboxes.length;
559
+
560
+ if (selectedCount > 0) {
561
+ this.showActionBar(actionBar, selectedCount);
562
+ } else {
563
+ this.hideActionBar(actionBar);
564
+ }
565
+ }
566
+
567
+ showActionBar(actionBar, selectedCount) {
568
+ // Show action bar directly
569
+ actionBar.style.height = 'auto';
570
+ actionBar.style.overflow = 'visible';
571
+ actionBar.style.opacity = '1';
572
+ actionBar.classList.remove("p_none");
573
+ actionBar.classList.add("p_xs", "is-visible", "show-action-card");
574
+
575
+ // Update the count
576
+ const countElement = actionBar.querySelector(".selected-count");
577
+ if (countElement) {
578
+ countElement.textContent = `${selectedCount} Selected`;
579
+ }
580
+ }
581
+
582
+ hideActionBar(actionBar) {
583
+ // Hide action bar directly
584
+ actionBar.style.height = '0px';
585
+ actionBar.style.overflow = 'hidden';
586
+ actionBar.style.opacity = '0';
587
+ actionBar.classList.add("p_none");
588
+ actionBar.classList.remove("p_xs", "is-visible", "show-action-card");
589
+ }
590
+ }
591
+
592
+ // Initialize the isolated action bar functionality
593
+ new PbAdvancedTableActionBar();
594
+
235
595
  window.expandAllRows = (element) => {
236
596
  PbAdvancedTable.handleToggleAllHeaders(element);
237
597
  };
238
598
 
239
599
  window.expandAllSubRows = (element, rowDepth) => {
240
600
  PbAdvancedTable.handleToggleAllSubRows(element, rowDepth);
241
- };
601
+ };
@@ -77,6 +77,7 @@
77
77
  top: 0;
78
78
  left: 0;
79
79
  border-radius: unset;
80
+ z-index: 5;
80
81
  }
81
82
 
82
83
  .checkbox-cell {
@@ -0,0 +1,23 @@
1
+ <%= pb_rails("card", props: {
2
+ border_none: object.is_visible,
3
+ classname: object.classname,
4
+ padding: object.is_visible ? "xs" : "none",
5
+ data: {
6
+ action_bar: true
7
+ }
8
+ }) do %>
9
+ <%= pb_rails("flex", props: { align_items: "center", justify: "between" }) do %>
10
+ <%= pb_rails("caption", props: { color: "light", padding_left: "xs", size: "xs" }) do %>
11
+ <span class="selected-count"><%= object.selected_count %> Selected</span>
12
+ <% end %>
13
+ <%= pb_rails("flex/flex_item") do %>
14
+ <%= pb_rails("flex") do %>
15
+ <% if object.actions.present? %>
16
+ <% object.actions.each do |action| %>
17
+ <%= action %>
18
+ <% end %>
19
+ <% end %>
20
+ <% end %>
21
+ <% end %>
22
+ <% end %>
23
+ <% end %>
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbAdvancedTable
5
+ class TableActionBar < Playbook::KitBase
6
+ prop :actions, type: Playbook::Props::Array,
7
+ default: []
8
+ prop :is_visible, type: Playbook::Props::Boolean,
9
+ default: false
10
+ prop :selected_count, type: Playbook::Props::Number,
11
+ default: 0
12
+
13
+ def classname
14
+ # Just use row-selection-actions-card as the base class
15
+ generate_classname("row-selection-actions-card", separator: " ")
16
+ end
17
+ end
18
+ end
19
+ end
@@ -55,7 +55,15 @@ module Playbook
55
55
  # Subrow header if applicable
56
56
  output << pb_rails("advanced_table/table_subrow_header", props: { row: row, column_definitions: leaf_columns, depth: current_depth, subrow_header: subrow_headers[current_depth - 1], collapsible_trail: collapsible_trail, classname: "toggle-content", responsive: responsive, subrow_data_attributes: subrow_data_attributes }) if is_first_child_of_subrow && enable_toggle_expansion == "all"
57
57
 
58
- current_data_attributes = current_depth.zero? ? { row_depth: 0 } : table_data_attributes
58
+ current_data_attributes = if current_depth.zero?
59
+ {
60
+ row_depth: 0,
61
+ advanced_table_content: row.object_id.to_s,
62
+ row_parent: nil,
63
+ }
64
+ else
65
+ table_data_attributes
66
+ end
59
67
 
60
68
  # Additional class and data attributes needed for toggle logic
61
69
  output << pb_rails("advanced_table/table_row", props: { id: id, row: row, column_definitions: leaf_columns, depth: current_depth, collapsible_trail: collapsible_trail, classname: additional_classes, table_data_attributes: current_data_attributes, responsive: responsive, loading: loading, selectable_rows: selectable_rows, row_id: row[:id], enable_toggle_expansion: enable_toggle_expansion })
@@ -15,6 +15,8 @@ module Playbook
15
15
  default: "scroll"
16
16
  prop :selectable_rows, type: Playbook::Props::Boolean,
17
17
  default: false
18
+ prop :show_actions_bar, type: Playbook::Props::Boolean,
19
+ default: true
18
20
 
19
21
  def classname
20
22
  additional_classes = []
@@ -27,6 +29,7 @@ module Playbook
27
29
  def th_classname(is_first_column: false)
28
30
  additional_classes = []
29
31
  additional_classes << "pinned-left" if is_first_column && responsive == "scroll" && !selectable_rows
32
+ additional_classes << "header-cells-with-actions" if selectable_rows && show_actions_bar
30
33
 
31
34
  generate_classname("table-header-cells", *additional_classes, separator: " ")
32
35
  end
@@ -46,6 +49,7 @@ module Playbook
46
49
  if selectable_rows
47
50
  additional_classes = []
48
51
  additional_classes << "table-header-cells-custom"
52
+ additional_classes << "header-cells-with-actions" if show_actions_bar
49
53
  additional_classes << "checkbox-cell-header"
50
54
  additional_classes << "pinned-left" if responsive == "scroll"
51
55
  pb_rails("table/table_header", props: {
@@ -54,9 +58,6 @@ module Playbook
54
58
  pb_rails("checkbox", props: {
55
59
  id: "select-all-rows",
56
60
  name: "select-all-rows",
57
- data: {
58
- action: "click->pb-advanced-table#toggleAllRowSelection",
59
- },
60
61
  })
61
62
  end
62
63
  end
@@ -60,7 +60,7 @@ module Playbook
60
60
  name: "select-row-#{row_id || row.object_id}",
61
61
  data: {
62
62
  row_id: row_id || row.object_id.to_s,
63
- action: "click->pb-advanced-table#toggleRowSelection",
63
+ flat_advanced_table_select: true,
64
64
  },
65
65
  })
66
66
  end
@@ -75,7 +75,6 @@ module Playbook
75
75
  name: "select-row-#{row_id || row.object_id}",
76
76
  data: {
77
77
  row_id: row_id || row.object_id.to_s,
78
- action: "click->pb-advanced-table#toggleRowSelection",
79
78
  },
80
79
  })
81
80
  end
@@ -82,6 +82,10 @@ $avatar-sizes: (
82
82
  object-fit: cover;
83
83
  display: block;
84
84
  }
85
+
86
+ .grayscale {
87
+ filter: grayscale(1);
88
+ }
85
89
  }
86
90
  }
87
91
  }
@@ -25,6 +25,7 @@ export type AvatarProps = {
25
25
  },
26
26
  dark?: boolean,
27
27
  data?: {[key: string]: string},
28
+ grayscale?: boolean,
28
29
  htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
29
30
  id?: string,
30
31
  imageAlt?: string,
@@ -47,6 +48,7 @@ const Avatar = (props: AvatarProps): React.ReactElement => {
47
48
  htmlOptions = {},
48
49
  name = undefined,
49
50
  componentOverlay,
51
+ grayscale = false,
50
52
  id = '',
51
53
  imageAlt = '',
52
54
  imageUrl,
@@ -155,6 +157,7 @@ const Avatar = (props: AvatarProps): React.ReactElement => {
155
157
  {canShowImage && (
156
158
  <Image
157
159
  alt={imageAlt ? imageAlt : name}
160
+ className={grayscale ? "grayscale" : ""}
158
161
  onError={handleError}
159
162
  url={imageUrl}
160
163
  />
@@ -3,7 +3,7 @@
3
3
  <% if object.component_overlay && object.component_overlay[:component] == "icon_circle" %>
4
4
  <%= pb_rails("flex", props: { display: "display_inline_block", position: "relative" }) do %>
5
5
  <%= content_tag(:div, data: { initials: object.initials }, class: "avatar_wrapper") do %>
6
- <%= pb_rails("image", props: { alt: object.alt_text, url: object.image_url, on_error: object.handle_img_error }) if object.image_url.present? %>
6
+ <%= pb_rails("image", props: { alt: object.alt_text, url: object.image_url, on_error: object.handle_img_error, classname: object.grayscale ? "grayscale" : "" }) if object.image_url.present? %>
7
7
  <% end %>
8
8
  <%= pb_rails("card", props: { border_none: true, border_radius: "rounded", dark: object.dark, position: "absolute" }.merge(specific_placement_style)) do %>
9
9
 
@@ -13,7 +13,7 @@
13
13
  <% elsif object.component_overlay && object.component_overlay[:component] == "badge" %>
14
14
  <%= pb_rails("flex", props: { display: "display_inline_block", position: "relative" }) do %>
15
15
  <%= content_tag(:div, data: { initials: object.initials }, class: "avatar_wrapper") do %>
16
- <%= pb_rails("image", props: { alt: object.alt_text, url: object.image_url, on_error: object.handle_img_error }) if object.image_url.present? %>
16
+ <%= pb_rails("image", props: { alt: object.alt_text, url: object.image_url, on_error: object.handle_img_error, classname: object.grayscale ? "grayscale" : "" }) if object.image_url.present? %>
17
17
  <% end %>
18
18
  <%= pb_rails("card", props: { border_none: true, border_radius: "rounded", dark: object.dark, padding: "none", position: "absolute" }.merge(specific_placement_style)) do %>
19
19
  <%= pb_rails("badge", props: { dark: object.dark, rounded: true, text: object.component_overlay[:text], variant: object.component_overlay[:variant] }) %>
@@ -21,7 +21,7 @@
21
21
  <% end %>
22
22
  <% else %>
23
23
  <%= content_tag(:div, data: { initials: object.initials }, class: "avatar_wrapper") do %>
24
- <%= pb_rails("image", props: { alt: object.alt_text, url: object.image_url, on_error: object.handle_img_error }) if object.image_url.present? %>
24
+ <%= pb_rails("image", props: { alt: object.alt_text, url: object.image_url, on_error: object.handle_img_error, classname: object.grayscale ? "grayscale" : "" }) if object.image_url.present? %>
25
25
  <% end %>
26
26
  <%= pb_rails("online_status", props: object.online_status_props) if object.status %>
27
27
  <% end %>
@@ -15,6 +15,8 @@ module Playbook
15
15
  values: %w[xxs xs sm md base lg xl],
16
16
  default: "md"
17
17
  prop :status
18
+ prop :grayscale, type: Playbook::Props::Boolean,
19
+ default: false
18
20
 
19
21
  def initials
20
22
  name.split.map(&:first).join.downcase
@@ -106,3 +106,21 @@ test('renders with online status', () => {
106
106
  const onlineStatus = onlineStatusAvatar.querySelector('.pb_online_status_kit_online_size_md')
107
107
  expect(onlineStatus).toBeInTheDocument();
108
108
  });
109
+
110
+ test('renders with grayscale filter', () => {
111
+ render(
112
+ <Avatar
113
+ data={{ testid: testId }}
114
+ grayscale
115
+ imageAlt={imageAlt}
116
+ imageUrl={imageUrl}
117
+ name={name}
118
+ />
119
+ );
120
+
121
+ const grayscaleAvatar = screen.getByTestId(testId);
122
+ expect(grayscaleAvatar).toBeInTheDocument();
123
+
124
+ const grayscaleImage = grayscaleAvatar.querySelector('.grayscale')
125
+ expect(grayscaleImage).toBeInTheDocument();
126
+ });
@@ -0,0 +1,5 @@
1
+ <%= pb_rails("avatar", props: {
2
+ name: "Terry Johnson",
3
+ image_url: "https://randomuser.me/api/portraits/men/44.jpg",
4
+ grayscale: true
5
+ }) %>
@@ -0,0 +1,16 @@
1
+ import React from 'react'
2
+ import Avatar from '../../pb_avatar/_avatar'
3
+
4
+ const AvatarGrayscale = (props) => {
5
+ return (
6
+ <Avatar
7
+ grayscale
8
+ imageAlt="Terry Johnson Standing"
9
+ imageUrl="https://randomuser.me/api/portraits/men/44.jpg"
10
+ name="Terry Johnson"
11
+ {...props}
12
+ />
13
+ )
14
+ }
15
+
16
+ export default AvatarGrayscale