playbook_ui 18.2.0 → 18.3.0.pre.alpha.PLAY3342advancedtablereactmulticolumnselectablerow21082

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 (466) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/Components/CollapsibleTrail.tsx +8 -1
  3. data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +39 -8
  4. data/app/pb_kits/playbook/pb_advanced_table/Components/TableActionBar.tsx +62 -2
  5. data/app/pb_kits/playbook/pb_advanced_table/Components/VirtualizedTableView.tsx +24 -4
  6. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableHeader.tsx +105 -66
  7. data/app/pb_kits/playbook/pb_advanced_table/Utilities/RowUtils.ts +29 -0
  8. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +83 -5
  9. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +3 -0
  10. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.html.erb +1 -1
  11. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +8 -0
  12. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +1100 -1
  13. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility.jsx +1 -1
  14. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility.md +5 -2
  15. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_custom.md +3 -1
  16. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_multi_select_all.jsx +82 -0
  17. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_multi_select_all.md +3 -0
  18. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_with_state.md +3 -1
  19. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_group_separators.jsx +67 -0
  20. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_group_separators.md +7 -0
  21. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_group_separators_rails.html.erb +78 -0
  22. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_group_separators_rails.md +3 -0
  23. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows.jsx +177 -58
  24. data/app/pb_kits/playbook/pb_advanced_table/docs/_playground.json +17 -2
  25. data/app/pb_kits/playbook/pb_advanced_table/docs/_playground.overrides.json +8 -1
  26. data/app/pb_kits/playbook/pb_advanced_table/docs/advanced_table_mock_data_group_separators.json +328 -0
  27. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +3 -0
  28. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +2 -0
  29. data/app/pb_kits/playbook/pb_advanced_table/index.js +39 -2
  30. data/app/pb_kits/playbook/pb_advanced_table/kit.schema.json +44 -16
  31. data/app/pb_kits/playbook/pb_advanced_table/table_body.html.erb +2 -2
  32. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +53 -23
  33. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +1 -1
  34. data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +1 -1
  35. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +2 -0
  36. data/app/pb_kits/playbook/pb_avatar/_avatar.tsx +3 -1
  37. data/app/pb_kits/playbook/pb_avatar/kit.schema.json +23 -10
  38. data/app/pb_kits/playbook/pb_background/docs/_playground.json +1 -0
  39. data/app/pb_kits/playbook/pb_background/kit.schema.json +10 -3
  40. data/app/pb_kits/playbook/pb_badge/docs/_playground.json +2 -0
  41. data/app/pb_kits/playbook/pb_badge/kit.schema.json +27 -13
  42. data/app/pb_kits/playbook/pb_body/docs/_playground.json +3 -3
  43. data/app/pb_kits/playbook/pb_body/kit.schema.json +14 -5
  44. data/app/pb_kits/playbook/pb_button/_button.tsx +3 -1
  45. data/app/pb_kits/playbook/pb_button/button.rb +3 -0
  46. data/app/pb_kits/playbook/pb_button/button.test.js +154 -0
  47. data/app/pb_kits/playbook/pb_button/docs/_button_options_rails.md +5 -0
  48. data/app/pb_kits/playbook/pb_button/docs/_button_options_react.md +9 -0
  49. data/app/pb_kits/playbook/pb_button/docs/_playground.json +4 -2
  50. data/app/pb_kits/playbook/pb_button/docs/_playground.overrides.json +1 -1
  51. data/app/pb_kits/playbook/pb_button/docs/example.yml +1 -1
  52. data/app/pb_kits/playbook/pb_button/kit.schema.json +31 -27
  53. data/app/pb_kits/playbook/pb_caption/kit.schema.json +17 -7
  54. data/app/pb_kits/playbook/pb_card/docs/_playground.json +1 -0
  55. data/app/pb_kits/playbook/pb_card/kit.schema.json +2 -1
  56. data/app/pb_kits/playbook/pb_checkbox/docs/_playground.json +6 -1
  57. data/app/pb_kits/playbook/pb_checkbox/kit.schema.json +10 -5
  58. data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleMain.tsx +4 -4
  59. data/app/pb_kits/playbook/pb_collapsible/collapsible.test.js +81 -2
  60. data/app/pb_kits/playbook/pb_contact/_contact.tsx +4 -1
  61. data/app/pb_kits/playbook/pb_contact/docs/_playground.json +1 -0
  62. data/app/pb_kits/playbook/pb_contact/kit.schema.json +3 -1
  63. data/app/pb_kits/playbook/pb_copy_button/docs/_playground.json +5 -1
  64. data/app/pb_kits/playbook/pb_copy_button/kit.schema.json +10 -5
  65. data/app/pb_kits/playbook/pb_currency/docs/_playground.json +1 -1
  66. data/app/pb_kits/playbook/pb_currency/kit.schema.json +6 -2
  67. data/app/pb_kits/playbook/pb_dashboard_value/docs/_playground.json +2 -2
  68. data/app/pb_kits/playbook/pb_dashboard_value/kit.schema.json +4 -2
  69. data/app/pb_kits/playbook/pb_date/_date.tsx +3 -1
  70. data/app/pb_kits/playbook/pb_date/date.test.js +1 -1
  71. data/app/pb_kits/playbook/pb_date/docs/_playground.json +1 -0
  72. data/app/pb_kits/playbook/pb_date/kit.schema.json +17 -7
  73. data/app/pb_kits/playbook/pb_date_picker/date_picker.test.js +4 -0
  74. data/app/pb_kits/playbook/pb_date_picker/docs/_playground.json +4 -1
  75. data/app/pb_kits/playbook/pb_date_picker/kit.schema.json +32 -14
  76. data/app/pb_kits/playbook/pb_date_range_inline/_date_range_inline.tsx +3 -1
  77. data/app/pb_kits/playbook/pb_date_range_inline/docs/_playground.json +1 -0
  78. data/app/pb_kits/playbook/pb_date_range_inline/kit.schema.json +3 -1
  79. data/app/pb_kits/playbook/pb_date_range_stacked/_date_range_stacked.tsx +3 -1
  80. data/app/pb_kits/playbook/pb_date_range_stacked/kit.schema.json +1 -0
  81. data/app/pb_kits/playbook/pb_date_stacked/_date_stacked.tsx +4 -1
  82. data/app/pb_kits/playbook/pb_date_stacked/date_stacked.test.js +1 -0
  83. data/app/pb_kits/playbook/pb_date_stacked/kit.schema.json +1 -0
  84. data/app/pb_kits/playbook/pb_date_time/_date_time.tsx +3 -1
  85. data/app/pb_kits/playbook/pb_date_time/dateTime.test.js +1 -0
  86. data/app/pb_kits/playbook/pb_date_time/docs/_playground.json +2 -1
  87. data/app/pb_kits/playbook/pb_date_time/kit.schema.json +3 -1
  88. data/app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.tsx +2 -1
  89. data/app/pb_kits/playbook/pb_date_time_stacked/docs/_playground.json +1 -0
  90. data/app/pb_kits/playbook/pb_date_time_stacked/kit.schema.json +3 -1
  91. data/app/pb_kits/playbook/pb_date_year_stacked/_date_year_stacked.tsx +3 -1
  92. data/app/pb_kits/playbook/pb_date_year_stacked/date_year_stacked.test.js +1 -0
  93. data/app/pb_kits/playbook/pb_date_year_stacked/kit.schema.json +1 -0
  94. data/app/pb_kits/playbook/pb_detail/docs/_playground.json +2 -1
  95. data/app/pb_kits/playbook/pb_detail/kit.schema.json +2 -1
  96. data/app/pb_kits/playbook/pb_dialog/docs/_playground.json +1 -1
  97. data/app/pb_kits/playbook/pb_dialog/kit.schema.json +22 -9
  98. data/app/pb_kits/playbook/pb_distribution_bar/docs/_playground.json +2 -2
  99. data/app/pb_kits/playbook/pb_distribution_bar/kit.schema.json +2 -1
  100. data/app/pb_kits/playbook/pb_draggable/utilities/touchDrag.ts +10 -0
  101. data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +112 -0
  102. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +121 -15
  103. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_draggable_pills.html.erb +51 -0
  104. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_draggable_pills.jsx +62 -0
  105. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_draggable_pills_rails.md +9 -0
  106. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_draggable_pills_react.md +9 -0
  107. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_form.jsx +50 -0
  108. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_form_react.md +9 -0
  109. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_option_creation.html.erb +16 -0
  110. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_option_creation.jsx +27 -0
  111. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_option_creation_rails.md +9 -0
  112. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_option_creation_react.md +9 -0
  113. data/app/pb_kits/playbook/pb_dropdown/docs/_playground.json +39 -3
  114. data/app/pb_kits/playbook/pb_dropdown/docs/_playground.overrides.json +13 -2
  115. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +5 -0
  116. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +4 -1
  117. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +2 -2
  118. data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +24 -1
  119. data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +235 -1
  120. data/app/pb_kits/playbook/pb_dropdown/dropdown_creation.test.jsx +414 -0
  121. data/app/pb_kits/playbook/pb_dropdown/dropdown_form.test.jsx +173 -0
  122. data/app/pb_kits/playbook/pb_dropdown/dropdown_index.test.js +545 -0
  123. data/app/pb_kits/playbook/pb_dropdown/hooks/useHandleOnKeydown.tsx +22 -5
  124. data/app/pb_kits/playbook/pb_dropdown/index.js +260 -37
  125. data/app/pb_kits/playbook/pb_dropdown/keyboard_accessibility.js +3 -1
  126. data/app/pb_kits/playbook/pb_dropdown/kit.schema.json +59 -9
  127. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownContainer.tsx +43 -25
  128. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownFormFields.tsx +83 -0
  129. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownOption.tsx +13 -5
  130. data/app/pb_kits/playbook/pb_dropdown/subcomponents/MultiSelectTriggerDisplay.tsx +336 -31
  131. data/app/pb_kits/playbook/pb_dropdown/utilities/optionCreation.ts +21 -0
  132. data/app/pb_kits/playbook/pb_dropdown/utilities/pillReorder.js +281 -0
  133. data/app/pb_kits/playbook/pb_dropdown/utilities/quickpickDateSync.test.ts +24 -0
  134. data/app/pb_kits/playbook/pb_dropdown/utilities/usePillDropIndicator.ts +144 -0
  135. data/app/pb_kits/playbook/pb_empty_state/docs/_playground.json +1 -1
  136. data/app/pb_kits/playbook/pb_empty_state/kit.schema.json +2 -1
  137. data/app/pb_kits/playbook/pb_file_upload/docs/_playground.json +3 -2
  138. data/app/pb_kits/playbook/pb_file_upload/kit.schema.json +8 -3
  139. data/app/pb_kits/playbook/pb_filter/Filter/SortMenu.tsx +8 -1
  140. data/app/pb_kits/playbook/pb_filter/docs/_filter_one_click.html.erb +38 -0
  141. data/app/pb_kits/playbook/pb_filter/docs/_filter_one_click.jsx +69 -0
  142. data/app/pb_kits/playbook/pb_filter/docs/_filter_one_click.md +1 -0
  143. data/app/pb_kits/playbook/pb_filter/docs/example.yml +2 -0
  144. data/app/pb_kits/playbook/pb_filter/docs/index.js +2 -1
  145. data/app/pb_kits/playbook/pb_filter/filter.html.erb +4 -4
  146. data/app/pb_kits/playbook/pb_filter/filter.rb +28 -0
  147. data/app/pb_kits/playbook/pb_filter/filter.test.js +41 -0
  148. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_playground.json +4 -4
  149. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/fixed_confirmation_toast.test.js +1 -2
  150. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/kit.schema.json +6 -3
  151. data/app/pb_kits/playbook/pb_flex/docs/_playground.json +3 -0
  152. data/app/pb_kits/playbook/pb_flex/kit.schema.json +27 -12
  153. data/app/pb_kits/playbook/pb_form/docs/_description_react.md +3 -0
  154. data/app/pb_kits/playbook/pb_form/docs/_form_default_values.jsx +898 -0
  155. data/app/pb_kits/playbook/pb_form/docs/_form_default_values_react.md +3 -0
  156. data/app/pb_kits/playbook/pb_form/docs/_form_defaults.jsx +879 -0
  157. data/app/pb_kits/playbook/pb_form/docs/_form_defaults_react.md +29 -0
  158. data/app/pb_kits/playbook/pb_form/docs/_form_loading.jsx +75 -0
  159. data/app/pb_kits/playbook/pb_form/docs/{_form_loading.md → _form_loading_rails.md} +1 -0
  160. data/app/pb_kits/playbook/pb_form/docs/_form_loading_react.md +1 -0
  161. data/app/pb_kits/playbook/pb_form/docs/_form_model_values.jsx +147 -0
  162. data/app/pb_kits/playbook/pb_form/docs/_form_model_values_react.md +16 -0
  163. data/app/pb_kits/playbook/pb_form/docs/_form_multi_column.jsx +164 -0
  164. data/app/pb_kits/playbook/pb_form/docs/_form_multi_column_react.md +3 -0
  165. data/app/pb_kits/playbook/pb_form/docs/_form_validation.jsx +1057 -0
  166. data/app/pb_kits/playbook/pb_form/docs/_form_validation_react.md +26 -0
  167. data/app/pb_kits/playbook/pb_form/docs/example.yml +7 -0
  168. data/app/pb_kits/playbook/pb_form/form.rb +1 -1
  169. data/app/pb_kits/playbook/pb_form/kit.schema.json +1 -6
  170. data/app/pb_kits/playbook/pb_form/pb_form_validation.js +1 -0
  171. data/app/pb_kits/playbook/pb_form_group/_form_group.scss +1 -4
  172. data/app/pb_kits/playbook/pb_form_pill/docs/_playground.json +3 -0
  173. data/app/pb_kits/playbook/pb_form_pill/kit.schema.json +6 -3
  174. data/app/pb_kits/playbook/pb_full_screen/_full_screen.scss +6 -0
  175. data/app/pb_kits/playbook/pb_full_screen/_full_screen.tsx +11 -2
  176. data/app/pb_kits/playbook/pb_full_screen/docs/_full_screen_advanced_table_sticky_header.jsx +73 -0
  177. data/app/pb_kits/playbook/pb_full_screen/docs/_full_screen_advanced_table_sticky_header.md +1 -0
  178. data/app/pb_kits/playbook/pb_full_screen/docs/_playground.json +3 -3
  179. data/app/pb_kits/playbook/pb_full_screen/docs/example.yml +1 -0
  180. data/app/pb_kits/playbook/pb_full_screen/docs/index.js +1 -0
  181. data/app/pb_kits/playbook/pb_full_screen/full_screen.test.jsx +4 -2
  182. data/app/pb_kits/playbook/pb_full_screen/kit.schema.json +8 -4
  183. data/app/pb_kits/playbook/pb_hashtag/docs/_playground.json +2 -2
  184. data/app/pb_kits/playbook/pb_hashtag/kit.schema.json +2 -1
  185. data/app/pb_kits/playbook/pb_highlight/kit.schema.json +2 -1
  186. data/app/pb_kits/playbook/pb_icon/_icon.tsx +6 -1
  187. data/app/pb_kits/playbook/pb_icon/docs/_playground.json +2 -2
  188. data/app/pb_kits/playbook/pb_icon/kit.schema.json +31 -13
  189. data/app/pb_kits/playbook/pb_icon_circle/_icon_circle.tsx +3 -1
  190. data/app/pb_kits/playbook/pb_icon_circle/docs/_playground.json +2 -2
  191. data/app/pb_kits/playbook/pb_icon_circle/kit.schema.json +3 -1
  192. data/app/pb_kits/playbook/pb_icon_stat_value/docs/_playground.json +3 -2
  193. data/app/pb_kits/playbook/pb_icon_stat_value/kit.schema.json +4 -2
  194. data/app/pb_kits/playbook/pb_image/_image.tsx +5 -3
  195. data/app/pb_kits/playbook/pb_image/docs/_playground.json +27 -27
  196. data/app/pb_kits/playbook/pb_image/kit.schema.json +57 -24
  197. data/app/pb_kits/playbook/pb_label_pill/_label_pill.tsx +3 -1
  198. data/app/pb_kits/playbook/pb_label_pill/kit.schema.json +1 -0
  199. data/app/pb_kits/playbook/pb_label_value/docs/_playground.json +2 -2
  200. data/app/pb_kits/playbook/pb_label_value/kit.schema.json +2 -1
  201. data/app/pb_kits/playbook/pb_layout/docs/_playground.json +2 -2
  202. data/app/pb_kits/playbook/pb_layout/kit.schema.json +43 -20
  203. data/app/pb_kits/playbook/pb_legend/_legend.tsx +3 -1
  204. data/app/pb_kits/playbook/pb_legend/docs/_playground.json +2 -2
  205. data/app/pb_kits/playbook/pb_legend/kit.schema.json +3 -1
  206. data/app/pb_kits/playbook/pb_lightbox/_lightbox.tsx +2 -2
  207. data/app/pb_kits/playbook/pb_lightbox/kit.schema.json +84 -0
  208. data/app/pb_kits/playbook/pb_link/docs/_playground.json +6 -3
  209. data/app/pb_kits/playbook/pb_link/kit.schema.json +14 -6
  210. data/app/pb_kits/playbook/pb_list/_list_item.tsx +6 -3
  211. data/app/pb_kits/playbook/pb_list/docs/_playground.json +2 -2
  212. data/app/pb_kits/playbook/pb_list/kit.schema.json +2 -1
  213. data/app/pb_kits/playbook/pb_loading_inline/docs/_playground.json +0 -1
  214. data/app/pb_kits/playbook/pb_loading_inline/kit.schema.json +4 -1
  215. data/app/pb_kits/playbook/pb_map/docs/_map_default.md +22 -3
  216. data/app/pb_kits/playbook/pb_map/kit.schema.json +4 -6
  217. data/app/pb_kits/playbook/pb_message/kit.schema.json +2 -1
  218. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +4 -1
  219. data/app/pb_kits/playbook/pb_multiple_users/docs/_playground.json +2 -1
  220. data/app/pb_kits/playbook/pb_multiple_users/kit.schema.json +19 -11
  221. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/_playground.json +1 -0
  222. data/app/pb_kits/playbook/pb_multiple_users_stacked/kit.schema.json +2 -1
  223. data/app/pb_kits/playbook/pb_nav/_nav_item.test.js +17 -0
  224. data/app/pb_kits/playbook/pb_nav/docs/_playground.json +2 -0
  225. data/app/pb_kits/playbook/pb_nav/kit.schema.json +4 -2
  226. data/app/pb_kits/playbook/pb_online_status/_online_status.tsx +3 -1
  227. data/app/pb_kits/playbook/pb_online_status/kit.schema.json +1 -0
  228. data/app/pb_kits/playbook/pb_overlay/docs/_playground.json +3 -3
  229. data/app/pb_kits/playbook/pb_overlay/kit.schema.json +22 -12
  230. data/app/pb_kits/playbook/pb_pagination/kit.schema.json +6 -3
  231. data/app/pb_kits/playbook/pb_passphrase/docs/_playground.json +6 -4
  232. data/app/pb_kits/playbook/pb_passphrase/kit.schema.json +10 -5
  233. data/app/pb_kits/playbook/pb_pb_bar_graph/pbbargraph.test.jsx +1 -2
  234. data/app/pb_kits/playbook/pb_pb_circle_chart/pb_circle_chart.test.jsx +1 -2
  235. data/app/pb_kits/playbook/pb_pb_gauge_chart/kit.schema.json +2 -1
  236. data/app/pb_kits/playbook/pb_pb_gauge_chart/pb_gauge_chart.test.jsx +1 -2
  237. data/app/pb_kits/playbook/pb_pb_line_graph/pb_line_graph.test.jsx +1 -2
  238. data/app/pb_kits/playbook/pb_person/_person.tsx +3 -1
  239. data/app/pb_kits/playbook/pb_person/kit.schema.json +1 -0
  240. data/app/pb_kits/playbook/pb_person_contact/docs/_playground.json +3 -3
  241. data/app/pb_kits/playbook/pb_person_contact/kit.schema.json +2 -1
  242. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss +3 -7
  243. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_validation.html.erb +1 -1
  244. data/app/pb_kits/playbook/pb_phone_number_input/docs/_playground.json +3 -0
  245. data/app/pb_kits/playbook/pb_phone_number_input/img/flags.webp +0 -0
  246. data/app/pb_kits/playbook/pb_phone_number_input/img/flags@2x.webp +0 -0
  247. data/app/pb_kits/playbook/pb_phone_number_input/img/globe.webp +0 -0
  248. data/app/pb_kits/playbook/pb_phone_number_input/img/globe@2x.webp +0 -0
  249. data/app/pb_kits/playbook/pb_phone_number_input/intlTelInput.scss +13 -6
  250. data/app/pb_kits/playbook/pb_phone_number_input/kit.schema.json +6 -3
  251. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input_assets.test.js +61 -0
  252. data/app/pb_kits/playbook/pb_pill/_pill.tsx +3 -1
  253. data/app/pb_kits/playbook/pb_pill/kit.schema.json +1 -0
  254. data/app/pb_kits/playbook/pb_popover/docs/_playground.json +1 -2
  255. data/app/pb_kits/playbook/pb_popover/index.ts +47 -8
  256. data/app/pb_kits/playbook/pb_popover/kit.schema.json +18 -9
  257. data/app/pb_kits/playbook/pb_popover/popover_index.test.js +456 -0
  258. data/app/pb_kits/playbook/pb_progress_pills/docs/_playground.json +1 -0
  259. data/app/pb_kits/playbook/pb_progress_pills/kit.schema.json +2 -1
  260. data/app/pb_kits/playbook/pb_progress_simple/docs/_playground.json +3 -2
  261. data/app/pb_kits/playbook/pb_progress_simple/kit.schema.json +4 -2
  262. data/app/pb_kits/playbook/pb_progress_step/_progress_step_item.tsx +3 -1
  263. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_playground.json +10 -3
  264. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_playground.overrides.json +1 -1
  265. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_advanced_required_indicator.md +2 -2
  266. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_rails_default.md +3 -4
  267. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_rails_extensions.md +1 -1
  268. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_rails_markdown_support.md +1 -1
  269. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_rails_required_indicator.html.erb +9 -0
  270. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_rails_required_indicator.md +3 -0
  271. data/app/pb_kits/playbook/pb_rich_text_editor/docs/example.yml +1 -0
  272. data/app/pb_kits/playbook/pb_rich_text_editor/kit.schema.json +18 -9
  273. data/app/pb_kits/playbook/pb_rich_text_editor/rich_text_editor.html.erb +3 -7
  274. data/app/pb_kits/playbook/pb_rich_text_editor/rich_text_editor_rails.js +26 -21
  275. data/app/pb_kits/playbook/pb_rich_text_editor/rich_text_editor_rails.test.js +85 -1
  276. data/app/pb_kits/playbook/pb_selectable_card/docs/_playground.json +1 -0
  277. data/app/pb_kits/playbook/pb_selectable_card/kit.schema.json +4 -2
  278. data/app/pb_kits/playbook/pb_selectable_card_icon/_selectable_card_icon.scss +0 -9
  279. data/app/pb_kits/playbook/pb_selectable_card_icon/docs/_playground.json +1 -0
  280. data/app/pb_kits/playbook/pb_selectable_card_icon/docs/_selectable_card_icon_custom.jsx +1 -1
  281. data/app/pb_kits/playbook/pb_selectable_card_icon/kit.schema.json +2 -1
  282. data/app/pb_kits/playbook/pb_selectable_icon/_selectable_icon.scss +0 -7
  283. data/app/pb_kits/playbook/pb_source/_source.tsx +3 -1
  284. data/app/pb_kits/playbook/pb_source/docs/_playground.json +1 -0
  285. data/app/pb_kits/playbook/pb_source/kit.schema.json +3 -1
  286. data/app/pb_kits/playbook/pb_source/source.rb +1 -1
  287. data/app/pb_kits/playbook/pb_star_rating/docs/_playground.json +1 -0
  288. data/app/pb_kits/playbook/pb_star_rating/kit.schema.json +15 -7
  289. data/app/pb_kits/playbook/pb_stat_change/_stat_change.tsx +3 -1
  290. data/app/pb_kits/playbook/pb_stat_change/docs/_playground.json +1 -0
  291. data/app/pb_kits/playbook/pb_stat_change/kit.schema.json +3 -1
  292. data/app/pb_kits/playbook/pb_stat_value/docs/_playground.json +3 -1
  293. data/app/pb_kits/playbook/pb_stat_value/kit.schema.json +2 -1
  294. data/app/pb_kits/playbook/pb_table/docs/_playground.json +5 -1
  295. data/app/pb_kits/playbook/pb_table/kit.schema.json +28 -11
  296. data/app/pb_kits/playbook/pb_text_input/docs/_playground.json +3 -0
  297. data/app/pb_kits/playbook/pb_text_input/kit.schema.json +22 -9
  298. data/app/pb_kits/playbook/pb_textarea/_textarea.tsx +4 -1
  299. data/app/pb_kits/playbook/pb_time/kit.schema.json +13 -5
  300. data/app/pb_kits/playbook/pb_time_picker/docs/_playground.json +1 -0
  301. data/app/pb_kits/playbook/pb_time_picker/kit.schema.json +2 -1
  302. data/app/pb_kits/playbook/pb_time_range_inline/_time_range_inline.tsx +3 -1
  303. data/app/pb_kits/playbook/pb_time_range_inline/kit.schema.json +13 -5
  304. data/app/pb_kits/playbook/pb_time_stacked/_time_stacked.tsx +3 -1
  305. data/app/pb_kits/playbook/pb_time_stacked/kit.schema.json +1 -0
  306. data/app/pb_kits/playbook/pb_timeline/_item.tsx +3 -1
  307. data/app/pb_kits/playbook/pb_timestamp/_timestamp.tsx +3 -1
  308. data/app/pb_kits/playbook/pb_timestamp/kit.schema.json +1 -0
  309. data/app/pb_kits/playbook/pb_timestamp/timestamp.test.js +1 -0
  310. data/app/pb_kits/playbook/pb_title/kit.schema.json +23 -10
  311. data/app/pb_kits/playbook/pb_title_count/docs/_playground.json +1 -0
  312. data/app/pb_kits/playbook/pb_title_count/kit.schema.json +2 -1
  313. data/app/pb_kits/playbook/pb_tooltip/docs/_playground.json +5 -1
  314. data/app/pb_kits/playbook/pb_tooltip/kit.schema.json +10 -5
  315. data/app/pb_kits/playbook/pb_typeahead/_typeahead.scss +73 -0
  316. data/app/pb_kits/playbook/pb_typeahead/_typeahead.test.jsx +285 -12
  317. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +22 -14
  318. data/app/pb_kits/playbook/pb_typeahead/components/PillRenderer.tsx +15 -11
  319. data/app/pb_kits/playbook/pb_typeahead/components/ValueContainer.tsx +29 -30
  320. data/app/pb_kits/playbook/pb_typeahead/components/usePillDropIndicator.ts +155 -0
  321. data/app/pb_kits/playbook/pb_typeahead/docs/_playground.json +5 -5
  322. data/app/pb_kits/playbook/pb_typeahead/docs/_playground.overrides.json +2 -2
  323. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_draggable_pills.html.erb +0 -1
  324. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_draggable_pills.jsx +0 -1
  325. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_draggable_pills_rails.md +3 -3
  326. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_draggable_pills_react.md +7 -0
  327. data/app/pb_kits/playbook/pb_typeahead/kit.schema.json +3 -3
  328. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +3 -3
  329. data/app/pb_kits/playbook/pb_user/_user.tsx +3 -1
  330. data/app/pb_kits/playbook/pb_user/docs/_playground.json +3 -1
  331. data/app/pb_kits/playbook/pb_user/kit.schema.json +20 -9
  332. data/app/pb_kits/playbook/pb_user_badge/_user_badge.tsx +3 -1
  333. data/app/pb_kits/playbook/pb_user_badge/kit.schema.json +1 -0
  334. data/app/pb_kits/playbook/pb_weekday_stacked/_weekday_stacked.tsx +3 -1
  335. data/app/pb_kits/playbook/pb_weekday_stacked/docs/_playground.json +1 -0
  336. data/app/pb_kits/playbook/pb_weekday_stacked/kit.schema.json +3 -1
  337. data/app/pb_kits/playbook/pb_weekday_stacked/weekday_stacked.test.jsx +1 -0
  338. data/app/pb_kits/playbook/utilities/test/globalProps/onClick.test.js +471 -0
  339. data/app/pb_kits/playbook/utilities/test-utils.js +0 -1
  340. data/dist/ai/all-schemas.json +986 -388
  341. data/dist/ai/external-dependencies.json +1 -1
  342. data/dist/ai/forms.json +2 -2
  343. data/dist/ai/index.json +11 -3
  344. data/dist/ai/kits/advanced_table.schema.json +44 -16
  345. data/dist/ai/kits/avatar.schema.json +22 -9
  346. data/dist/ai/kits/background.schema.json +10 -3
  347. data/dist/ai/kits/badge.schema.json +26 -12
  348. data/dist/ai/kits/body.schema.json +14 -5
  349. data/dist/ai/kits/button.schema.json +29 -25
  350. data/dist/ai/kits/caption.schema.json +17 -7
  351. data/dist/ai/kits/card.schema.json +2 -1
  352. data/dist/ai/kits/checkbox.schema.json +10 -5
  353. data/dist/ai/kits/contact.schema.json +3 -1
  354. data/dist/ai/kits/copy_button.schema.json +10 -5
  355. data/dist/ai/kits/currency.schema.json +6 -2
  356. data/dist/ai/kits/dashboard_value.schema.json +4 -2
  357. data/dist/ai/kits/date.schema.json +16 -6
  358. data/dist/ai/kits/date_picker.schema.json +31 -13
  359. data/dist/ai/kits/date_range_inline.schema.json +3 -1
  360. data/dist/ai/kits/date_range_stacked.schema.json +1 -0
  361. data/dist/ai/kits/date_stacked.schema.json +1 -0
  362. data/dist/ai/kits/date_time.schema.json +3 -1
  363. data/dist/ai/kits/date_time_stacked.schema.json +3 -1
  364. data/dist/ai/kits/date_year_stacked.schema.json +1 -0
  365. data/dist/ai/kits/detail.schema.json +2 -1
  366. data/dist/ai/kits/dialog.schema.json +22 -9
  367. data/dist/ai/kits/distribution_bar.schema.json +2 -1
  368. data/dist/ai/kits/dropdown.schema.json +98 -18
  369. data/dist/ai/kits/empty_state.schema.json +2 -1
  370. data/dist/ai/kits/file_upload.schema.json +8 -3
  371. data/dist/ai/kits/fixed_confirmation_toast.schema.json +6 -3
  372. data/dist/ai/kits/flex.schema.json +27 -12
  373. data/dist/ai/kits/form.schema.json +1 -6
  374. data/dist/ai/kits/form_pill.schema.json +6 -3
  375. data/dist/ai/kits/full_screen.schema.json +8 -4
  376. data/dist/ai/kits/hashtag.schema.json +2 -1
  377. data/dist/ai/kits/highlight.schema.json +2 -1
  378. data/dist/ai/kits/icon.schema.json +31 -13
  379. data/dist/ai/kits/icon_circle.schema.json +3 -1
  380. data/dist/ai/kits/icon_stat_value.schema.json +4 -2
  381. data/dist/ai/kits/image.schema.json +57 -24
  382. data/dist/ai/kits/label_pill.schema.json +1 -0
  383. data/dist/ai/kits/label_value.schema.json +2 -1
  384. data/dist/ai/kits/layout.schema.json +43 -20
  385. data/dist/ai/kits/legend.schema.json +3 -1
  386. data/dist/ai/kits/lightbox.schema.json +86 -0
  387. data/dist/ai/kits/link.schema.json +14 -6
  388. data/dist/ai/kits/list.schema.json +2 -1
  389. data/dist/ai/kits/loading_inline.schema.json +4 -1
  390. data/dist/ai/kits/map.schema.json +4 -7
  391. data/dist/ai/kits/message.schema.json +2 -1
  392. data/dist/ai/kits/multiple_users.schema.json +19 -11
  393. data/dist/ai/kits/multiple_users_stacked.schema.json +2 -1
  394. data/dist/ai/kits/nav.schema.json +4 -2
  395. data/dist/ai/kits/online_status.schema.json +1 -0
  396. data/dist/ai/kits/overlay.schema.json +22 -12
  397. data/dist/ai/kits/pagination.schema.json +6 -3
  398. data/dist/ai/kits/passphrase.schema.json +10 -5
  399. data/dist/ai/kits/pb_gauge_chart.schema.json +2 -1
  400. data/dist/ai/kits/person.schema.json +1 -0
  401. data/dist/ai/kits/person_contact.schema.json +2 -1
  402. data/dist/ai/kits/phone_number_input.schema.json +6 -3
  403. data/dist/ai/kits/pill.schema.json +1 -0
  404. data/dist/ai/kits/popover.schema.json +17 -8
  405. data/dist/ai/kits/progress_pills.schema.json +2 -1
  406. data/dist/ai/kits/progress_simple.schema.json +4 -2
  407. data/dist/ai/kits/rich_text_editor.schema.json +19 -10
  408. data/dist/ai/kits/selectable_card.schema.json +4 -2
  409. data/dist/ai/kits/selectable_card_icon.schema.json +2 -1
  410. data/dist/ai/kits/source.schema.json +3 -1
  411. data/dist/ai/kits/star_rating.schema.json +15 -7
  412. data/dist/ai/kits/stat_change.schema.json +3 -1
  413. data/dist/ai/kits/stat_value.schema.json +2 -1
  414. data/dist/ai/kits/table.schema.json +28 -11
  415. data/dist/ai/kits/text_input.schema.json +22 -9
  416. data/dist/ai/kits/time.schema.json +12 -4
  417. data/dist/ai/kits/time_picker.schema.json +2 -1
  418. data/dist/ai/kits/time_range_inline.schema.json +13 -5
  419. data/dist/ai/kits/time_stacked.schema.json +1 -0
  420. data/dist/ai/kits/timestamp.schema.json +1 -0
  421. data/dist/ai/kits/title.schema.json +23 -10
  422. data/dist/ai/kits/title_count.schema.json +2 -1
  423. data/dist/ai/kits/tooltip.schema.json +10 -5
  424. data/dist/ai/kits/typeahead.schema.json +3 -3
  425. data/dist/ai/kits/user.schema.json +20 -9
  426. data/dist/ai/kits/user_badge.schema.json +1 -0
  427. data/dist/ai/kits/weekday_stacked.schema.json +3 -1
  428. data/dist/ai/playgrounds/advanced_table.json +1 -1
  429. data/dist/ai/playgrounds/dropdown.json +1 -1
  430. data/dist/ai/playgrounds/index.json +1 -1
  431. data/dist/ai/playgrounds/rich_text_editor.json +1 -1
  432. data/dist/ai/playgrounds/typeahead.json +1 -1
  433. data/dist/ai/visual-index.json +1 -1
  434. data/dist/chunks/_pagination-DZ0eQuH2.js +1 -0
  435. data/dist/chunks/{_pb_line_graph-Du7xE9vl.js → _pb_line_graph-DyvH5Zj1.js} +1 -1
  436. data/dist/chunks/{_detail-Bsvl694i.js → _tooltip-CFbtqu-E.js} +2 -2
  437. data/dist/chunks/_typeahead-CkiAf8zx.js +1 -0
  438. data/dist/chunks/{globalProps-B120NbSJ.js → globalProps-xfGTpdLP.js} +1 -1
  439. data/dist/chunks/index-4jrZjexD.js +1 -0
  440. data/dist/chunks/index-BAy61y8S.js +1 -0
  441. data/dist/chunks/index-Cb_SDipk.js +1 -0
  442. data/dist/chunks/index-D3RdsDp7.js +1 -0
  443. data/dist/chunks/index-D8PZIesy.js +1 -0
  444. data/dist/chunks/index-DIoc-aua.js +1 -0
  445. data/dist/chunks/index-qex65UMn.js +1 -0
  446. data/dist/chunks/lib-Cu_i0y0k.js +29 -0
  447. data/dist/chunks/{time_picker_helper-CYGg0UQ0.js → time_picker_helper-B82MORju.js} +1 -1
  448. data/dist/chunks/vendor.js +2 -2
  449. data/dist/menu.yml +3 -3
  450. data/dist/playbook-rails-react-bindings.js +1 -1
  451. data/dist/playbook-rails.js +1 -1
  452. data/dist/playbook.css +1 -1
  453. data/lib/playbook/changelog_generator.rb +47 -21
  454. data/lib/playbook/connect_message_generator.rb +15 -2
  455. data/lib/playbook/version.rb +2 -2
  456. metadata +99 -23
  457. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_draggable_pills.md +0 -7
  458. data/dist/chunks/_table-Bf6LGyL9.js +0 -1
  459. data/dist/chunks/_typeahead-w6S5Vx4b.js +0 -1
  460. data/dist/chunks/lib-Buo6zHEw.js +0 -29
  461. /data/app/pb_kits/playbook/pb_form/docs/{_description.md → _description_rails.md} +0 -0
  462. /data/app/pb_kits/playbook/pb_form/docs/{_form_default_values.md → _form_default_values_rails.md} +0 -0
  463. /data/app/pb_kits/playbook/pb_form/docs/{_form_defaults.md → _form_defaults_rails.md} +0 -0
  464. /data/app/pb_kits/playbook/pb_form/docs/{_form_model_values.md → _form_model_values_rails.md} +0 -0
  465. /data/app/pb_kits/playbook/pb_form/docs/{_form_multi_column.md → _form_multi_column_rails.md} +0 -0
  466. /data/app/pb_kits/playbook/pb_form/docs/{_form_validation.md → _form_validation_rails.md} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b5ac75f8f899c8e692ebc15d9e4c233540f1b055707c362099ca5f6bd23da085
4
- data.tar.gz: 96f74ff346de6735599cbd46bf9d8b81e541b7ad7b258275e4174a922fe637ac
3
+ metadata.gz: 106354f9d720a7693c85b275f1de67cb17a21e3e28f28f90a758ee9b19942367
4
+ data.tar.gz: 9a5fbcd069bdaf722663195395f810d351e72e322a527e0157d666609363cc60
5
5
  SHA512:
6
- metadata.gz: c8dc8cf0775094f3d738ff9fdb1bc5a7101d9f950c6503dd75c598da03e0a4353d9466a864947fbc905a42997a60f3e8ee29569179106b9c8fc796feb2fe6819
7
- data.tar.gz: 119a30f2687af34eb8bfbc1c942182d128838437cb8c15f71a061600892d9fe5498fe400db526ee306120e4b90f220d0f97bb1467e829191e6b5fe9c35a09eaf
6
+ metadata.gz: 8a13eb3272cf0c06bb2defa816ca14a48f2cb2fffd1185516f6ff40556fab6e9c9766d3929929680ea18511efc952ebefa5a1d836e554c99df384a1d9ef88ea4
7
+ data.tar.gz: d754688073c058e93739e273d4f6d8f54fa26f5a86869c7e764a3dddfb492f6c63efb86b914b6d9d45424f859e0996269f416b8ab38411268a8b89b23b17915c
@@ -1,10 +1,17 @@
1
- import React from "react"
1
+ import React, { useContext } from "react"
2
+
3
+ import AdvancedTableContext from "../Context/AdvancedTableContext"
2
4
 
3
5
  //CollapsibleTrail component
4
6
  const CollapsibleTrail = ({ leftOffset }: { leftOffset: number }) => {
7
+ const { groupSeparators } = useContext(AdvancedTableContext)
5
8
  const style: { [key: string]: string | number } = {
6
9
  left: `${leftOffset}em`,
7
10
  }
11
+ // Read by groupSeparators CSS to decide which trails stop at the stroke
12
+ if (groupSeparators) {
13
+ style["--collapsible-trail-left"] = `${leftOffset}em`
14
+ }
8
15
 
9
16
  return (
10
17
  <div
@@ -1,4 +1,4 @@
1
- import React, { useContext, useEffect } from "react"
1
+ import React, { useContext, useEffect, useMemo } from "react"
2
2
  import classnames from "classnames"
3
3
  import { flexRender, Row, Cell } from "@tanstack/react-table"
4
4
 
@@ -6,7 +6,7 @@ import { GenericObject } from "../../types"
6
6
  import { isChrome } from "../Utilities/BrowserCheck"
7
7
  import { findColumnDefByAccessor } from "../Utilities/ColumnStylingHelper"
8
8
  import { playbookColumnLayoutStylesFromMeta } from "../Utilities/ColumnLayoutHelper"
9
- import { getFontWeight, getRowColorClass, getRowStyle, shouldShowLoadingIndicator } from "../Utilities/RowUtils"
9
+ import { buildGroupSeparatorInsets, getFontWeight, getRowColorClass, getRowStyle, shouldShowLoadingIndicator } from "../Utilities/RowUtils"
10
10
 
11
11
  import LoadingInline from "../../pb_loading_inline/_loading_inline"
12
12
  import Checkbox from "../../pb_checkbox/_checkbox"
@@ -125,6 +125,7 @@ export const RegularTableView = ({
125
125
  }: RegularTableViewProps) => {
126
126
  const {
127
127
  enableToggleExpansion,
128
+ groupSeparators,
128
129
  handleExpandOrCollapse,
129
130
  inlineRowLoading,
130
131
  loading,
@@ -158,14 +159,30 @@ export const RegularTableView = ({
158
159
  (obj: Record<string, unknown>) => "columns" in obj
159
160
  );
160
161
 
161
- // Row pinning
162
- function PinnedRow({ row, position }: { row: Row<any>; position: 'top' | 'bottom' }) {
162
+ // One map from the full row model so pinning a non-last sibling cannot
163
+ // invent a second separator just because that section only sees that row.
164
+ const rowModelRows = table.getRowModel().rows
165
+ const groupSeparatorInsets = useMemo(
166
+ () => (groupSeparators ? buildGroupSeparatorInsets(rowModelRows) : new Map<string, number>()),
167
+ [groupSeparators, rowModelRows]
168
+ )
169
+
170
+ function PinnedRow({
171
+ position,
172
+ row,
173
+ }: {
174
+ position: 'top' | 'bottom'
175
+ row: Row<any>
176
+ }) {
163
177
  const customRowStyle = getRowStyle(rowStyling, row);
164
178
  const bottomRowsCount = table.getBottomRows().length;
179
+ const groupSeparatorInsetEm = groupSeparatorInsets.get(row.id)
180
+ const showGroupSeparator = groupSeparatorInsetEm !== undefined
165
181
 
166
182
  return (
167
183
  <tr
168
184
  className={classnames('pinned-row', {
185
+ 'group-separator-row': showGroupSeparator,
169
186
  'pinned-row-bottom': position === 'bottom',
170
187
  })}
171
188
  style={{
@@ -182,6 +199,9 @@ export const RegularTableView = ({
182
199
  : undefined,
183
200
  zIndex: '3',
184
201
  fontWeight: getFontWeight(customRowStyle),
202
+ ...(showGroupSeparator && {
203
+ ["--group-separator-inset" as string]: `${groupSeparatorInsetEm}em`,
204
+ }),
185
205
  }}
186
206
  >
187
207
  <TableCellRenderer
@@ -198,11 +218,13 @@ export const RegularTableView = ({
198
218
  )
199
219
  }
200
220
 
201
- const totalRows = pinnedRows ? table.getCenterRows() : table.getRowModel().rows
221
+ const totalRows = pinnedRows ? table.getCenterRows() : rowModelRows
222
+ const topRows = pinnedRows ? table.getTopRows() : []
223
+ const bottomRows = pinnedRows ? table.getBottomRows() : []
202
224
 
203
225
  return (
204
226
  <>
205
- {pinnedRows && table.getTopRows().map((row: Row<GenericObject>) => (
227
+ {topRows.map((row: Row<GenericObject>) => (
206
228
  <PinnedRow key={row.id}
207
229
  position="top"
208
230
  row={row}
@@ -219,6 +241,8 @@ export const RegularTableView = ({
219
241
  // Use functions from RowUtils for consistent cell coloring
220
242
  const rowColor = getRowColorClass(row, inlineRowLoading || false);
221
243
  const isDataLoading = shouldShowLoadingIndicator(row, inlineRowLoading || false, columnDefinitions[0]?.cellAccessors?.length || 0);
244
+ const groupSeparatorInsetEm = groupSeparatorInsets.get(row.id)
245
+ const showGroupSeparator = groupSeparatorInsetEm !== undefined
222
246
 
223
247
  return (
224
248
  <React.Fragment key={`${row.index}-${row.id}-${row.depth}-row`}>
@@ -234,13 +258,20 @@ export const RegularTableView = ({
234
258
  )}
235
259
 
236
260
  <tr
237
- className={`${rowColor} ${row.depth > 0 ? `depth-sub-row-${row.depth}` : ""}`}
261
+ className={classnames(
262
+ rowColor,
263
+ row.depth > 0 && `depth-sub-row-${row.depth}`,
264
+ showGroupSeparator && "group-separator-row"
265
+ )}
238
266
  id={`${row.index}-${row.id}-${row.depth}-row`}
239
267
  ref={isFirstRegularRow ? sampleRowRef : null}
240
268
  style={{
241
269
  backgroundColor: customRowStyle?.backgroundColor,
242
270
  color: customRowStyle?.fontColor,
243
271
  fontWeight: getFontWeight(customRowStyle),
272
+ ...(showGroupSeparator && {
273
+ ["--group-separator-inset" as string]: `${groupSeparatorInsetEm}em`,
274
+ }),
244
275
  }}
245
276
  >
246
277
  {/* Render custom checkbox column when we want selectableRows for non-expanding tables */}
@@ -280,7 +311,7 @@ export const RegularTableView = ({
280
311
  </React.Fragment>
281
312
  );
282
313
  })}
283
- {pinnedRows && table.getBottomRows().map((row: Row<GenericObject>) => (
314
+ {bottomRows.map((row: Row<GenericObject>) => (
284
315
  <PinnedRow key={row.id}
285
316
  position="bottom"
286
317
  row={row}
@@ -105,7 +105,7 @@ const TableActionBar: React.FC<TableActionBarProps> = ({
105
105
  }
106
106
  };
107
107
  return (
108
- <>
108
+ <React.Fragment key={node.id}>
109
109
  <Checkbox
110
110
  checked={allOn}
111
111
  indeterminate={!allOn && someOn}
@@ -120,7 +120,7 @@ const TableActionBar: React.FC<TableActionBarProps> = ({
120
120
  child.children ? renderGroup(child) : renderLeaf(child.id, child.label),
121
121
  )}
122
122
  </Flex>
123
- </>
123
+ </React.Fragment>
124
124
  );
125
125
  };
126
126
  // ------------ End of column visibility logic --------
@@ -143,6 +143,47 @@ const TableActionBar: React.FC<TableActionBarProps> = ({
143
143
  const handleShouldClose = (shouldClose: boolean) =>
144
144
  setShowPopover(!shouldClose)
145
145
 
146
+ // Select All only changes columns listed in the popover that can be hidden.
147
+ // The first column and ids omitted by includeIds stay as they are.
148
+ // Skip the leaf walk unless the checkbox is enabled.
149
+ const selectAllRequested = columnVisibilityControl?.showSelectAll === true
150
+ const availableColumns = selectAllRequested
151
+ ? tree.flatMap(gatherLeafIds).flatMap((id) => {
152
+ const column = table.getColumn(id)
153
+ return column?.getCanHide() ? [column] : []
154
+ })
155
+ : []
156
+ const allAvailableVisible =
157
+ availableColumns.length > 0 &&
158
+ availableColumns.every((column) => column.getIsVisible())
159
+ const someAvailableVisible = availableColumns.some((column) => column.getIsVisible())
160
+ const showSelectAll = availableColumns.length > 0
161
+ const selectAllLabel = allAvailableVisible ? "Deselect All" : "Select All"
162
+
163
+ // Uses the same updater form as toggleVisibility, so onChange gets the same kind of value.
164
+ const handleSelectAllChange = () => {
165
+ const selectAllVisibility = Object.fromEntries(
166
+ availableColumns.map((column) => [column.id, !allAvailableVisible])
167
+ )
168
+ table.setColumnVisibility((previousVisibility: { [id: string]: boolean }) => ({
169
+ ...previousVisibility,
170
+ ...selectAllVisibility,
171
+ }))
172
+
173
+ if (columnVisibilityControl?.onColumnVisibilityChange) {
174
+ const nextVisibility = { ...table.getState().columnVisibility, ...selectAllVisibility }
175
+ // Same shape as the single toggles: root column ids, groups visible if any leaf is visible
176
+ const updatedVisibilityState = table.getAllColumns().reduce((
177
+ acc: { [id: string]: boolean },
178
+ column: { getLeafColumns: () => { id: string }[]; id: string }
179
+ ) => {
180
+ acc[column.id] = column.getLeafColumns().some((leaf) => nextVisibility[leaf.id] ?? true)
181
+ return acc
182
+ }, {})
183
+ columnVisibilityControl.onColumnVisibilityChange(updatedVisibilityState)
184
+ }
185
+ }
186
+
146
187
  const popoverReference = (
147
188
  <Tooltip
148
189
  placement="top"
@@ -197,6 +238,25 @@ const TableActionBar: React.FC<TableActionBarProps> = ({
197
238
  textAlign="center"
198
239
  />
199
240
  <SectionSeparator paddingBottom="xs" />
241
+ {showSelectAll && (
242
+ <>
243
+ <Flex
244
+ cursor="pointer"
245
+ flexDirection="column"
246
+ paddingX="xs"
247
+ >
248
+ <Checkbox
249
+ aria={{ label: selectAllLabel }}
250
+ checked={allAvailableVisible}
251
+ indeterminate={!allAvailableVisible && someAvailableVisible}
252
+ onChange={handleSelectAllChange}
253
+ paddingBottom="xs"
254
+ text={selectAllLabel}
255
+ />
256
+ </Flex>
257
+ <SectionSeparator paddingBottom="xs" />
258
+ </>
259
+ )}
200
260
  {tree.map((node: VisibilityNode) => (
201
261
  <Flex cursor="pointer"
202
262
  flexDirection="column"
@@ -1,4 +1,4 @@
1
- import React, { useContext, useLayoutEffect, useState, useEffect, useRef } from "react"
1
+ import React, { useContext, useEffect, useLayoutEffect, useMemo, useState } from "react"
2
2
  import classnames from "classnames"
3
3
  import { flexRender, Cell, Row } from "@tanstack/react-table"
4
4
  import { VirtualItem } from "@tanstack/react-virtual"
@@ -7,7 +7,7 @@ import { GenericObject } from "../../types"
7
7
 
8
8
  import { isChrome } from "../Utilities/BrowserCheck"
9
9
  import { getVirtualizedRowStyle } from "../Utilities/TableContainerStyles"
10
- import { getRowColorClass } from "../Utilities/RowUtils"
10
+ import { buildGroupSeparatorInsets, getRowColorClass } from "../Utilities/RowUtils"
11
11
 
12
12
  import LoadingInline from "../../pb_loading_inline/_loading_inline"
13
13
  import Checkbox from "../../pb_checkbox/_checkbox"
@@ -34,6 +34,7 @@ export const VirtualizedTableView = ({
34
34
  }: VirtualizedTableViewProps) => {
35
35
  const {
36
36
  enableToggleExpansion,
37
+ groupSeparators,
37
38
  handleExpandOrCollapse,
38
39
  inlineRowLoading,
39
40
  loading,
@@ -119,6 +120,13 @@ export const VirtualizedTableView = ({
119
120
  };
120
121
  }, [table, selectableRows, hasAnySubRows]);
121
122
 
123
+ // Memoize against scroll-driven re-renders; only rebuild when the row model changes.
124
+ const rowModelRows = table.getRowModel().rows
125
+ const groupSeparatorInsets = useMemo(
126
+ () => (groupSeparators ? buildGroupSeparatorInsets(rowModelRows) : new Map<string, number>()),
127
+ [groupSeparators, rowModelRows]
128
+ )
129
+
122
130
  // Safety check
123
131
  if (!virtualizer || !flattenedItems) {
124
132
  return (
@@ -180,10 +188,17 @@ export const VirtualizedTableView = ({
180
188
 
181
189
  // Use the utility function to get consistent row color
182
190
  const rowColor = getRowColorClass(row, inlineRowLoading || false);
191
+ const groupSeparatorInsetEm = groupSeparatorInsets.get(row.id)
192
+ const showGroupSeparator = groupSeparatorInsetEm !== undefined
183
193
 
184
194
  return (
185
195
  <tr
186
- className={`virtualized-table-row ${rowColor} ${row.depth > 0 ? `depth-sub-row-${row.depth}` : ""}`}
196
+ className={classnames(
197
+ "virtualized-table-row",
198
+ rowColor,
199
+ row.depth > 0 && `depth-sub-row-${row.depth}`,
200
+ showGroupSeparator && "group-separator-row"
201
+ )}
187
202
  data-index={virtualRow.index}
188
203
  key={`row-${item.id}-sort-${sortingState}`}
189
204
  ref={(node) => {
@@ -195,7 +210,12 @@ export const VirtualizedTableView = ({
195
210
  }
196
211
  }
197
212
  }}
198
- style={virtualItemStyle}
213
+ style={{
214
+ ...virtualItemStyle,
215
+ ...(showGroupSeparator && {
216
+ ["--group-separator-inset" as string]: `${groupSeparatorInsetEm}em`,
217
+ }),
218
+ }}
199
219
  >
200
220
  {/* Render custom checkbox column when we want selectableRows for non-expanding tables */}
201
221
  {selectableRows && !hasAnySubRows && (
@@ -32,6 +32,7 @@ export const TableHeader = ({
32
32
  ...props
33
33
  }: TableHeaderProps) => {
34
34
  const {
35
+ columnVisibilityControl,
35
36
  enableToggleExpansion,
36
37
  handleExpandOrCollapse,
37
38
  loading,
@@ -63,42 +64,83 @@ export const TableHeader = ({
63
64
  `${responsive === "scroll" && "pinned-left"}`,
64
65
  );
65
66
 
67
+ // TanStack drops header rows when every leaf in a group is hidden.
68
+ // Spacer rows keep that height only when Select All can hide a whole group.
69
+ const showSelectAll = columnVisibilityControl?.showSelectAll === true
70
+ let hiddenHeaderRowCount = 0
71
+ let spacerColSpan = 0
72
+ if (showSelectAll) {
73
+ const columnHeaderDepth = Math.max(
74
+ ...table.getAllFlatColumns().map((column: GenericObject) => column.depth + 1)
75
+ )
76
+ hiddenHeaderRowCount = columnHeaderDepth - table.getHeaderGroups().length
77
+ spacerColSpan = table.getVisibleLeafColumns().length + (!hasAnySubRows && selectableRows ? 1 : 0)
78
+ }
79
+
80
+ const renderSpacerRows = (rowClassName?: string) =>
81
+ Array.from({ length: Math.max(0, hiddenHeaderRowCount) }, (_, index) => (
82
+ <tr
83
+ aria-hidden="true"
84
+ className={classnames("header-spacer-row", rowClassName)}
85
+ key={`header-spacer-${index}`}
86
+ >
87
+ {/* header-spacer-cell stays off .table-header-cells so width measurement and sticky-left styles skip it. */}
88
+ <th
89
+ className="header-spacer-cell"
90
+ colSpan={spacerColSpan}
91
+ />
92
+ </tr>
93
+ ))
94
+
95
+ // Empty checkbox-column cell on upper multi-header rows; checkbox only on the lowest row.
96
+ const renderSelectableHeaderCell = (
97
+ isLowestHeaderRow: boolean,
98
+ extraClassName?: string
99
+ ) => (
100
+ <th className={classnames(customCellClassnames, "checkbox-cell-header", extraClassName)}>
101
+ {isLowestHeaderRow ? (
102
+ <Checkbox
103
+ checked={table?.getIsAllRowsSelected()}
104
+ indeterminate={table?.getIsSomeRowsSelected()}
105
+ onChange={table?.getToggleAllRowsSelectedHandler()}
106
+ />
107
+ ) : null}
108
+ </th>
109
+ )
110
+
66
111
  const renderRegularTableHeader = () => (
67
112
  <thead className={classes}
68
113
  id={id}
69
114
  ref={headerRef}
70
115
  >
71
- {table.getHeaderGroups().map((headerGroup: HeaderGroup<GenericObject>) => (
72
- <tr key={`${headerGroup.id}-headerGroup`}>
73
- {!hasAnySubRows && selectableRows && (
74
- <th className={customCellClassnames}>
75
- <Checkbox
76
- checked={table?.getIsAllRowsSelected()}
77
- indeterminate={table?.getIsSomeRowsSelected()}
78
- onChange={table?.getToggleAllRowsSelectedHandler()}
79
- />
80
- </th>
81
- )}
82
- {headerGroup.headers.map(header => {
83
- const isPinnedLeft = columnPinning.left.includes(header.id)
84
- return (
85
- <TableHeaderCell
86
- enableSorting={enableSorting}
87
- enableToggleExpansion={enableToggleExpansion}
88
- handleExpandOrCollapse={handleExpandOrCollapse}
89
- header={header}
90
- headerChildren={children}
91
- isPinnedLeft={isPinnedLeft}
92
- key={`${header.id}-header`}
93
- loading={loading}
94
- persistToggleExpansionButton={persistToggleExpansionButton}
95
- sortIcon={sortIcon}
96
- table={table}
97
- />
98
- )
99
- })}
100
- </tr>
101
- ))}
116
+ {renderSpacerRows()}
117
+ {table.getHeaderGroups().map((headerGroup: HeaderGroup<GenericObject>, headerGroupIndex: number, headerGroups: HeaderGroup<GenericObject>[]) => {
118
+ const isLowestHeaderRow = headerGroupIndex === headerGroups.length - 1
119
+
120
+ return (
121
+ <tr key={`${headerGroup.id}-headerGroup`}>
122
+ {!hasAnySubRows && selectableRows && renderSelectableHeaderCell(isLowestHeaderRow)}
123
+ {headerGroup.headers.map(header => {
124
+ const isPinnedLeft = columnPinning.left.includes(header.id)
125
+ return (
126
+ <TableHeaderCell
127
+ enableSorting={enableSorting}
128
+ enableToggleExpansion={enableToggleExpansion}
129
+ handleExpandOrCollapse={handleExpandOrCollapse}
130
+ header={header}
131
+ headerChildren={children}
132
+ isPinnedLeft={isPinnedLeft}
133
+ key={`${header.id}-header`}
134
+ loading={loading}
135
+ persistToggleExpansionButton={persistToggleExpansionButton}
136
+ sortIcon={sortIcon}
137
+ table={table}
138
+ />
139
+ )
140
+ })}
141
+ </tr>
142
+ )
143
+ })}
102
144
  </thead>
103
145
  );
104
146
 
@@ -109,41 +151,38 @@ export const TableHeader = ({
109
151
  id={id}
110
152
  ref={headerRef}
111
153
  >
112
- {table.getHeaderGroups().map((headerGroup: HeaderGroup<GenericObject>) => (
113
- <tr
114
- className="virtualized-header-row-header"
115
- key={`${headerGroup.id}-headerGroup-virtualized`}
116
- >
117
- {!hasAnySubRows && selectableRows && (
118
- <th className={classnames(customCellClassnames, "virtualized-header-cell")}>
119
- <Checkbox
120
- checked={table?.getIsAllRowsSelected()}
121
- indeterminate={table?.getIsSomeRowsSelected()}
122
- onChange={table?.getToggleAllRowsSelectedHandler()}
123
- />
124
- </th>
125
- )}
126
- {headerGroup.headers.map(header => {
127
- const isPinnedLeft = columnPinning.left.includes(header.id)
128
- return (
129
- <TableHeaderCell
130
- enableSorting={enableSorting}
131
- enableToggleExpansion={enableToggleExpansion}
132
- handleExpandOrCollapse={handleExpandOrCollapse}
133
- header={header}
134
- headerChildren={children}
135
- isPinnedLeft={isPinnedLeft}
136
- isVirtualized
137
- key={`${header.id}-header-virtualized`}
138
- loading={loading}
139
- persistToggleExpansionButton={persistToggleExpansionButton}
140
- sortIcon={sortIcon}
141
- table={table}
142
- />
143
- )
144
- })}
145
- </tr>
146
- ))}
154
+ {renderSpacerRows("virtualized-header-row-header")}
155
+ {table.getHeaderGroups().map((headerGroup: HeaderGroup<GenericObject>, headerGroupIndex: number, headerGroups: HeaderGroup<GenericObject>[]) => {
156
+ const isLowestHeaderRow = headerGroupIndex === headerGroups.length - 1
157
+
158
+ return (
159
+ <tr
160
+ className="virtualized-header-row-header"
161
+ key={`${headerGroup.id}-headerGroup-virtualized`}
162
+ >
163
+ {!hasAnySubRows && selectableRows && renderSelectableHeaderCell(isLowestHeaderRow, "virtualized-header-cell")}
164
+ {headerGroup.headers.map(header => {
165
+ const isPinnedLeft = columnPinning.left.includes(header.id)
166
+ return (
167
+ <TableHeaderCell
168
+ enableSorting={enableSorting}
169
+ enableToggleExpansion={enableToggleExpansion}
170
+ handleExpandOrCollapse={handleExpandOrCollapse}
171
+ header={header}
172
+ headerChildren={children}
173
+ isPinnedLeft={isPinnedLeft}
174
+ isVirtualized
175
+ key={`${header.id}-header-virtualized`}
176
+ loading={loading}
177
+ persistToggleExpansionButton={persistToggleExpansionButton}
178
+ sortIcon={sortIcon}
179
+ table={table}
180
+ />
181
+ )
182
+ })}
183
+ </tr>
184
+ )
185
+ })}
147
186
  </thead>
148
187
  );
149
188
  return (
@@ -53,6 +53,35 @@ export const getFontWeight = (rowStyle?: GenericObject) => {
53
53
  if (rowStyle?.fontWeight === "regular") return 400
54
54
  }
55
55
 
56
+ // Matches the `left` of the nth collapsible-trail (see CollapsibleTrail.tsx).
57
+ const getCollapsibleTrailLeftEm = (trailIndex: number): number =>
58
+ trailIndex * 1.0 + (trailIndex > 1 ? (trailIndex - 1) * 0.25 : 0)
59
+
60
+ /**
61
+ * One O(n) pass over the full visible row model → Map of row id to its
62
+ * `--group-separator-inset` (em). Call once (and memoize) for the whole table —
63
+ * do not rebuild per pinned section, or a pinned non-last sibling can look like
64
+ * a last sibling and invent a second separator.
65
+ *
66
+ * A row closes every group between its depth and the next visible row's depth
67
+ * (so expanded parents defer to their last visible descendant, and sort/filter
68
+ * is respected). One stroke is drawn, inset to the outermost closed group:
69
+ * year-level → 0 / full-bleed, otherwise that group's collapsible-trail.
70
+ */
71
+ export const buildGroupSeparatorInsets = (
72
+ visibleRows: Row<GenericObject>[]
73
+ ): Map<string, number> => {
74
+ const insets = new Map<string, number>()
75
+
76
+ visibleRows.forEach((row, index) => {
77
+ if (row.depth === 0) return
78
+ const nextDepth = visibleRows[index + 1]?.depth ?? 0
79
+ if (nextDepth >= row.depth) return
80
+ insets.set(row.id, nextDepth === 0 ? 0 : getCollapsibleTrailLeftEm(nextDepth + 1))
81
+ })
82
+ return insets
83
+ }
84
+
56
85
  /**
57
86
  * Creates a virtual item style object for virtualized rows
58
87
  */