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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +0 -1
  3. data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +11 -1
  4. data/app/pb_kits/playbook/pb_advanced_table/Components/TableActionBar.tsx +175 -16
  5. data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +56 -25
  6. data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableState.ts +23 -13
  7. data/app/pb_kits/playbook/pb_advanced_table/Utilities/VisibilityTree.ts +47 -0
  8. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +6 -10
  9. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +7 -2
  10. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta.md +0 -6
  11. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility.jsx +57 -0
  12. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility.md +4 -0
  13. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_custom.jsx +62 -0
  14. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_custom.md +1 -0
  15. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_multi.jsx +82 -0
  16. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_multi.md +1 -0
  17. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_with_state.jsx +66 -0
  18. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_with_state.md +3 -0
  19. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows_rails.md +5 -1
  20. data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_no_subrows.jsx → _advanced_table_selectable_rows_no_subrows_react.jsx} +2 -2
  21. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_rails.md +3 -2
  22. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +7 -3
  23. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +6 -2
  24. data/app/pb_kits/playbook/pb_advanced_table/flat_advanced_table.js +106 -0
  25. data/app/pb_kits/playbook/pb_advanced_table/index.js +228 -11
  26. data/app/pb_kits/playbook/pb_advanced_table/scss_partials/advanced_table_sticky_mixin.scss +1 -0
  27. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +9 -1
  28. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +0 -3
  29. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +1 -2
  30. data/app/pb_kits/playbook/pb_avatar/_avatar.scss +4 -0
  31. data/app/pb_kits/playbook/pb_avatar/_avatar.tsx +3 -0
  32. data/app/pb_kits/playbook/pb_avatar/avatar.html.erb +3 -3
  33. data/app/pb_kits/playbook/pb_avatar/avatar.rb +2 -0
  34. data/app/pb_kits/playbook/pb_avatar/avatar.test.js +18 -0
  35. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_grayscale.html.erb +5 -0
  36. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_grayscale.jsx +16 -0
  37. data/app/pb_kits/playbook/pb_avatar/docs/example.yml +2 -0
  38. data/app/pb_kits/playbook/pb_avatar/docs/index.js +1 -0
  39. data/app/pb_kits/playbook/pb_card/card.html.erb +1 -1
  40. data/app/pb_kits/playbook/pb_card/card.rb +12 -0
  41. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_error.html.erb +2 -2
  42. data/app/pb_kits/playbook/pb_draggable/context/index.tsx +17 -58
  43. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones.html.erb +22 -1
  44. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_line.html.erb +55 -0
  45. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_line_rails.md +5 -0
  46. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_rails.md +5 -0
  47. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_event_listeners.jsx +59 -0
  48. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_event_listeners_react.md +1 -0
  49. data/app/pb_kits/playbook/pb_draggable/docs/example.yml +2 -0
  50. data/app/pb_kits/playbook/pb_draggable/docs/index.js +2 -1
  51. data/app/pb_kits/playbook/pb_draggable/draggable_container.rb +11 -1
  52. data/app/pb_kits/playbook/pb_draggable/draggable_item.rb +11 -1
  53. data/app/pb_kits/playbook/pb_draggable/index.js +4 -2
  54. data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableItem.tsx +33 -5
  55. data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +6 -1
  56. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +82 -35
  57. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.html.erb +31 -0
  58. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.md +5 -0
  59. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_error.html.erb +5 -2
  60. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select.jsx +56 -0
  61. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select.md +3 -0
  62. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display.jsx +58 -0
  63. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display.md +3 -0
  64. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display_rails.html.erb +20 -0
  65. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display_rails.md +1 -0
  66. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_rails.html.erb +19 -0
  67. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_rails.md +3 -0
  68. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.html.erb +20 -0
  69. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.jsx +57 -0
  70. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.md +1 -0
  71. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.html.erb +50 -0
  72. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.jsx +105 -0
  73. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.html.erb +22 -0
  74. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.jsx +67 -0
  75. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.html.erb +28 -0
  76. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.jsx +17 -64
  77. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.html.erb +58 -0
  78. data/app/pb_kits/playbook/pb_dropdown/docs/{_dropdown_with_autocomplete_and_custom_display.jsx → _dropdown_with_autocomplete_with_subcomponents.jsx} +11 -25
  79. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.md +1 -0
  80. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.jsx +11 -0
  81. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.md +1 -1
  82. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.html.erb +33 -2
  83. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.md +3 -1
  84. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_external_control.md +1 -0
  85. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.jsx +61 -0
  86. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.md +2 -0
  87. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.html.erb +52 -0
  88. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.md +2 -0
  89. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +18 -5
  90. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +7 -2
  91. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +3 -3
  92. data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +20 -2
  93. data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +45 -1
  94. data/app/pb_kits/playbook/pb_dropdown/dropdown_container.html.erb +10 -0
  95. data/app/pb_kits/playbook/pb_dropdown/dropdown_container.rb +3 -0
  96. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.html.erb +37 -6
  97. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.rb +5 -1
  98. data/app/pb_kits/playbook/pb_dropdown/hooks/useHandleOnKeydown.tsx +0 -6
  99. data/app/pb_kits/playbook/pb_dropdown/index.js +380 -17
  100. data/app/pb_kits/playbook/pb_dropdown/keyboard_accessibility.js +64 -11
  101. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownContainer.tsx +3 -4
  102. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownOption.tsx +16 -12
  103. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +83 -17
  104. data/app/pb_kits/playbook/pb_dropdown/subcomponents/MultiSelectTriggerDisplay.tsx +58 -0
  105. data/app/pb_kits/playbook/pb_empty_state/_empty_state.scss +8 -1
  106. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_alignment.html.erb +27 -0
  107. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_default.html.erb +7 -0
  108. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_orientation.html.erb +12 -0
  109. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_size.html.erb +23 -0
  110. data/app/pb_kits/playbook/pb_empty_state/docs/example.yml +5 -1
  111. data/app/pb_kits/playbook/pb_empty_state/empty_state.html.erb +19 -0
  112. data/app/pb_kits/playbook/pb_empty_state/empty_state.rb +123 -0
  113. data/app/pb_kits/playbook/pb_file_upload/_file_upload.scss +13 -0
  114. data/app/pb_kits/playbook/pb_file_upload/_file_upload.tsx +11 -1
  115. data/app/pb_kits/playbook/pb_file_upload/docs/_file_upload_error.html.erb +1 -0
  116. data/app/pb_kits/playbook/pb_file_upload/docs/_file_upload_error.jsx +41 -0
  117. data/app/pb_kits/playbook/pb_file_upload/docs/example.yml +2 -0
  118. data/app/pb_kits/playbook/pb_file_upload/docs/index.js +1 -0
  119. data/app/pb_kits/playbook/pb_file_upload/file_upload.html.erb +1 -0
  120. data/app/pb_kits/playbook/pb_file_upload/file_upload.rb +7 -1
  121. data/app/pb_kits/playbook/pb_file_upload/fileupload.test.js +18 -0
  122. data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +1 -0
  123. data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +1 -0
  124. data/app/pb_kits/playbook/pb_form_group/_error_state_mixin.scss +2 -2
  125. data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +19 -12
  126. data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.tsx +13 -7
  127. data/app/pb_kits/playbook/pb_message/_message.tsx +3 -0
  128. data/app/pb_kits/playbook/pb_message/docs/_message_grayscale.html.erb +9 -0
  129. data/app/pb_kits/playbook/pb_message/docs/_message_grayscale.jsx +21 -0
  130. data/app/pb_kits/playbook/pb_message/docs/example.yml +2 -0
  131. data/app/pb_kits/playbook/pb_message/docs/index.js +1 -0
  132. data/app/pb_kits/playbook/pb_message/message.html.erb +2 -1
  133. data/app/pb_kits/playbook/pb_message/message.rb +1 -0
  134. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +2 -2
  135. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.html.erb +11 -11
  136. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.jsx +11 -11
  137. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_default.html.erb +11 -11
  138. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_default.jsx +11 -11
  139. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.html.erb +11 -11
  140. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.jsx +11 -11
  141. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options.html.erb +11 -11
  142. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options.jsx +11 -11
  143. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_default.html.erb +11 -11
  144. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_default.jsx +11 -11
  145. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent.html.erb +11 -11
  146. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent.jsx +11 -11
  147. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent_default.html.erb +11 -11
  148. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent_default.jsx +11 -11
  149. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.html.erb +11 -11
  150. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.jsx +11 -11
  151. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.html.erb +11 -11
  152. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.jsx +11 -11
  153. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_react_hook.jsx +11 -11
  154. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_reset.html.erb +11 -11
  155. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_return_all_selected.html.erb +11 -11
  156. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_return_all_selected.jsx +11 -11
  157. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.html.erb +11 -11
  158. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.md +2 -0
  159. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids_react.jsx +11 -11
  160. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids_react.md +3 -1
  161. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single.html.erb +22 -22
  162. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single.jsx +22 -22
  163. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single_children_only.html.erb +22 -22
  164. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single_children_only.jsx +22 -22
  165. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_children.jsx +11 -11
  166. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_children_with_radios.jsx +11 -11
  167. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_form.html.erb +11 -11
  168. data/app/pb_kits/playbook/pb_overlay/_overlay.scss +2 -1
  169. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.jsx +1 -1
  170. data/app/pb_kits/playbook/pb_overlay/subcomponents/_overlay_token.tsx +5 -4
  171. data/app/pb_kits/playbook/pb_person/_person.tsx +12 -2
  172. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss +9 -9
  173. data/app/pb_kits/playbook/pb_section_separator/_section_separator.tsx +2 -2
  174. data/app/pb_kits/playbook/pb_select/_select.scss +10 -0
  175. data/app/pb_kits/playbook/pb_select/docs/_select_error.html.erb +1 -1
  176. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click.jsx +7 -7
  177. data/app/pb_kits/playbook/pb_table/subcomponents/_table_row.tsx +5 -5
  178. data/app/pb_kits/playbook/pb_text_input/_text_input.scss +4 -2
  179. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_error.html.erb +1 -1
  180. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_error.html.erb +5 -1
  181. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +73 -3
  182. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_error_state.html.erb +8 -1
  183. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_preserve_input.jsx +23 -0
  184. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_preserve_input.md +1 -0
  185. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +1 -0
  186. data/app/pb_kits/playbook/pb_typeahead/docs/index.js +1 -0
  187. data/app/pb_kits/playbook/pb_user/_user.tsx +3 -0
  188. data/app/pb_kits/playbook/pb_user/docs/_user_grayscale.html.erb +6 -0
  189. data/app/pb_kits/playbook/pb_user/docs/_user_grayscale.jsx +16 -0
  190. data/app/pb_kits/playbook/pb_user/docs/example.yml +2 -0
  191. data/app/pb_kits/playbook/pb_user/docs/index.js +1 -0
  192. data/app/pb_kits/playbook/pb_user/user.html.erb +2 -1
  193. data/app/pb_kits/playbook/pb_user/user.rb +1 -0
  194. data/dist/chunks/_typeahead-C-CI5Vgw.js +22 -0
  195. data/dist/chunks/_weekday_stacked-BCiM3zWM.js +45 -0
  196. data/dist/chunks/lib-D5R1BjUn.js +29 -0
  197. data/dist/chunks/{pb_form_validation-BWjy4bFn.js → pb_form_validation-BZ2AVAi_.js} +1 -1
  198. data/dist/chunks/vendor.js +1 -1
  199. data/dist/menu.yml +6 -14
  200. data/dist/playbook-doc.js +2 -2
  201. data/dist/playbook-rails-react-bindings.js +1 -1
  202. data/dist/playbook-rails.js +1 -1
  203. data/dist/playbook.css +1 -1
  204. data/lib/playbook/kit_base.rb +3 -3
  205. data/lib/playbook/version.rb +2 -2
  206. metadata +70 -22
  207. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default.html.erb +0 -10
  208. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_and_custom_display.md +0 -1
  209. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_hook.jsx +0 -79
  210. data/app/pb_kits/playbook/pb_gantt_chart/_gantt_chart.scss +0 -3
  211. data/app/pb_kits/playbook/pb_gantt_chart/_gantt_chart.tsx +0 -72
  212. data/app/pb_kits/playbook/pb_gantt_chart/docs/_gantt_chart_default.jsx +0 -53
  213. data/app/pb_kits/playbook/pb_gantt_chart/docs/example.yml +0 -7
  214. data/app/pb_kits/playbook/pb_gantt_chart/docs/index.js +0 -1
  215. data/app/pb_kits/playbook/pb_gantt_chart/gantt_chart.test.jsx +0 -19
  216. data/dist/chunks/_typeahead-D8CsVBZO.js +0 -22
  217. data/dist/chunks/_weekday_stacked-D3oLTSkH.js +0 -45
  218. data/dist/chunks/lib-BmTAc7Nc.js +0 -29
  219. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_react.md → _advanced_table_selectable_rows.md} +0 -0
  220. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_no_subrows.html.erb → _advanced_table_selectable_rows_no_subrows_rails.html.erb} +0 -0
  221. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows.html.erb → _advanced_table_selectable_rows_rails.html.erb} +0 -0
  222. /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_drop_zones_line.md → _draggable_drop_zones_line_react.md} +0 -0
  223. /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_event_listeners.md → _draggable_event_listeners_rails.md} +0 -0
@@ -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
-
37
- const nestedButtons = this.element
38
- .closest("table")
39
- .querySelectorAll("[data-advanced-table]");
204
+
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
  }
270
+
53
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";
@@ -238,4 +455,4 @@ window.expandAllRows = (element) => {
238
455
 
239
456
  window.expandAllSubRows = (element, rowDepth) => {
240
457
  PbAdvancedTable.handleToggleAllSubRows(element, rowDepth);
241
- };
458
+ };
@@ -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 {
@@ -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 })
@@ -54,9 +54,6 @@ module Playbook
54
54
  pb_rails("checkbox", props: {
55
55
  id: "select-all-rows",
56
56
  name: "select-all-rows",
57
- data: {
58
- action: "click->pb-advanced-table#toggleAllRowSelection",
59
- },
60
57
  })
61
58
  end
62
59
  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
@@ -6,6 +6,7 @@ examples:
6
6
  - avatar_status: Status
7
7
  - avatar_circle_icon_component_overlay: Icon Circle Component Overlay
8
8
  - avatar_badge_component_overlay: Badge Component Overlay
9
+ - avatar_grayscale: Grayscale
9
10
  react:
10
11
  - avatar_default: Default
11
12
  - avatar_monogram: Monogram
@@ -13,6 +14,7 @@ examples:
13
14
  - avatar_status: Status
14
15
  - avatar_circle_icon_component_overlay: Icon Circle Component Overlay
15
16
  - avatar_badge_component_overlay: Badge Component Overlay
17
+ - avatar_grayscale: Grayscale
16
18
  swift:
17
19
  - avatar_default_swift: Default
18
20
  - avatar_monogram_swift: Monogram
@@ -4,3 +4,4 @@ export { default as AvatarStatus } from './_avatar_status.jsx'
4
4
  export { default as AvatarNoImage } from './_avatar_no_image.jsx'
5
5
  export { default as AvatarCircleIconComponentOverlay } from './_avatar_circle_icon_component_overlay.jsx'
6
6
  export { default as AvatarBadgeComponentOverlay } from './_avatar_badge_component_overlay.jsx'
7
+ export { default as AvatarGrayscale } from './_avatar_grayscale.jsx'
@@ -1,5 +1,5 @@
1
1
  <% if object.draggable_item %>
2
- <%= pb_rails("draggable/draggable_item", props:{drag_id: object.drag_id}) do %>
2
+ <%= pb_rails("draggable/draggable_item", props:{drag_id: object.drag_id, classname: drop_zone_line_color ? line_color_class : nil}) do %>
3
3
  <%= pb_content_tag(object.tag) do %>
4
4
  <% if object.draggable_item %>
5
5
  <%= pb_rails("flex", props: { align: "center" }) do %>
@@ -24,6 +24,9 @@ module Playbook
24
24
  default: true
25
25
  prop :items, type: Playbook::Props::Array,
26
26
  default: []
27
+ prop :drop_zone_line_color, type: Playbook::Props::Enum,
28
+ values: ["primary", "purple", nil],
29
+ default: nil
27
30
 
28
31
  def classname
29
32
  generate_classname("pb_card_kit",
@@ -60,6 +63,15 @@ module Playbook
60
63
  def border_radius_class
61
64
  border_radius != "md" ? "border_radius_#{border_radius}" : nil
62
65
  end
66
+
67
+ def line_color_class
68
+ case drop_zone_line_color
69
+ when "primary"
70
+ "drop_zone_color_primary"
71
+ when "purple"
72
+ "drop_zone_color_purple"
73
+ end
74
+ end
63
75
  end
64
76
  end
65
77
  end
@@ -1,4 +1,4 @@
1
- <%= pb_rails("date_picker", props: {
2
- error: "Invalid date. Please pick a valid date.",
1
+ <%= pb_rails("date_picker", props: {
2
+ error: raw(pb_rails("icon", props: { icon: "warning" }) + " Invalid date. Please pick a valid date."),
3
3
  picker_id: "date-picker-error"
4
4
  }) %>
@@ -1,11 +1,11 @@
1
- import React, { createContext, useReducer, useContext, useEffect, useMemo, useRef, useState } from "react";
1
+ import React, { createContext, useReducer, useContext, useEffect, useMemo } from "react";
2
2
  import { InitialStateType, ActionType, DraggableProviderType } from "./types";
3
3
 
4
4
  const initialState: InitialStateType = {
5
5
  items: [],
6
6
  dragData: { id: "", initialGroup: "" },
7
7
  isDragging: "",
8
- activeContainer: "",
8
+ activeContainer: ""
9
9
  };
10
10
 
11
11
  const reducer = (state: InitialStateType, action: ActionType) => {
@@ -31,23 +31,9 @@ const reducer = (state: InitialStateType, action: ActionType) => {
31
31
  const { dragId, targetId } = action.payload;
32
32
  const newItems = [...state.items];
33
33
  const draggedItem = newItems.find(item => item.id === dragId);
34
- const targetItem = newItems.find(item => item.id === targetId);
35
-
36
- if (!draggedItem || !targetItem || draggedItem.container !== targetItem.container) {
37
- return state;
38
- }
39
-
40
- if (dragId === targetId) {
41
- return state;
42
- }
43
-
44
- const draggedIndex = newItems.findIndex(item => item.id === dragId);
34
+ const draggedIndex = newItems.indexOf(draggedItem);
45
35
  const targetIndex = newItems.findIndex(item => item.id === targetId);
46
36
 
47
- if (draggedIndex === -1 || targetIndex === -1) {
48
- return state;
49
- }
50
-
51
37
  newItems.splice(draggedIndex, 1);
52
38
  newItems.splice(targetIndex, 0, draggedItem);
53
39
 
@@ -62,11 +48,7 @@ const reducer = (state: InitialStateType, action: ActionType) => {
62
48
  const DragContext = createContext<any>({});
63
49
 
64
50
  export const DraggableContext = () => {
65
- const context = useContext(DragContext);
66
- if (context === undefined) {
67
- throw new Error('DraggableContext must be used within a DraggableProvider');
68
- }
69
- return context;
51
+ return useContext(DragContext);
70
52
  };
71
53
 
72
54
  export const DraggableProvider = ({
@@ -81,11 +63,7 @@ export const DraggableProvider = ({
81
63
  dropZone = { type: 'ghost', color: 'neutral', direction: 'vertical' }
82
64
  }: DraggableProviderType) => {
83
65
  const [state, dispatch] = useReducer(reducer, initialState);
84
-
85
- // Store initial items in a ref to use if needed (for consistency when needed in future updates)
86
- const initialItemsRef = useRef(initialItems);
87
- const [isDragging, setIsDragging] = useState(false);
88
-
66
+
89
67
  // Parse dropZone prop - handle both string format (backward compatibility) and object format
90
68
  let dropZoneType = 'ghost';
91
69
  let dropZoneColor = 'neutral';
@@ -108,64 +86,45 @@ export const DraggableProvider = ({
108
86
 
109
87
  useEffect(() => {
110
88
  dispatch({ type: 'SET_ITEMS', payload: initialItems });
111
- initialItemsRef.current = initialItems;
112
89
  }, [initialItems]);
113
90
 
114
91
  useEffect(() => {
115
- if (onReorder) {
116
- onReorder(state.items);
117
- }
118
- }, [state.items, onReorder]);
92
+ onReorder(state.items);
93
+ }, [state.items]);
119
94
 
120
95
  const handleDragStart = (id: string, container: string) => {
121
- setIsDragging(true);
122
- dispatch({ type: 'SET_DRAG_DATA', payload: { id, initialGroup: container } });
96
+ dispatch({ type: 'SET_DRAG_DATA', payload: { id: id, initialGroup: container } });
123
97
  dispatch({ type: 'SET_IS_DRAGGING', payload: id });
124
- dispatch({ type: 'SET_ACTIVE_CONTAINER', payload: container });
125
98
  if (onDragStart) onDragStart(id, container);
126
99
  };
127
100
 
128
101
  const handleDragEnter = (id: string, container: string) => {
129
- if (!isDragging || container !== state.activeContainer) return;
130
-
131
- if (state.dragData.id === id) return;
132
-
133
- const draggedItem = state.items.find(item => item.id === state.dragData.id);
134
- const targetItem = state.items.find(item => item.id === id);
135
-
136
- if (!draggedItem || !targetItem || draggedItem.container !== targetItem.container) {
137
- return;
102
+ if (state.dragData.id !== id) {
103
+ dispatch({ type: 'REORDER_ITEMS', payload: { dragId: state.dragData.id, targetId: id } });
104
+ dispatch({ type: 'SET_DRAG_DATA', payload: { id: state.dragData.id, initialGroup: container } });
138
105
  }
139
-
140
- dispatch({ type: 'REORDER_ITEMS', payload: { dragId: state.dragData.id, targetId: id } });
141
-
142
106
  if (onDragEnter) onDragEnter(id, container);
143
107
  };
144
108
 
145
109
  const handleDragEnd = () => {
146
- setIsDragging(false);
147
110
  dispatch({ type: 'SET_IS_DRAGGING', payload: "" });
148
111
  dispatch({ type: 'SET_ACTIVE_CONTAINER', payload: "" });
149
112
  if (onDragEnd) onDragEnd();
150
113
  };
151
114
 
152
- const handleDrop = (container: string) => {
153
- const draggedItem = state.items.find(item => item.id === state.dragData.id);
154
-
155
- if (draggedItem && draggedItem.container !== container) {
156
- dispatch({ type: 'CHANGE_CATEGORY', payload: { itemId: state.dragData.id, container } });
157
- }
115
+ const changeCategory = (itemId: string, container: string) => {
116
+ dispatch({ type: 'CHANGE_CATEGORY', payload: { itemId, container } });
117
+ };
158
118
 
119
+ const handleDrop = (container: string) => {
159
120
  dispatch({ type: 'SET_IS_DRAGGING', payload: "" });
160
121
  dispatch({ type: 'SET_ACTIVE_CONTAINER', payload: "" });
161
-
162
- setIsDragging(false);
122
+ changeCategory(state.dragData.id, container);
163
123
  if (onDrop) onDrop(container);
164
124
  };
165
125
 
166
126
  const handleDragOver = (e: Event, container: string) => {
167
127
  e.preventDefault();
168
- e.stopPropagation();
169
128
  dispatch({ type: 'SET_ACTIVE_CONTAINER', payload: container });
170
129
  if (onDragOver) onDragOver(e, container);
171
130
  };
@@ -185,7 +144,7 @@ export const DraggableProvider = ({
185
144
  handleDragEnd,
186
145
  handleDrop,
187
146
  handleDragOver
188
- }), [state, dropZoneType, dropZoneColor, dropZoneDirection, handleDragStart, handleDragEnter, handleDragEnd, handleDrop, handleDragOver]);
147
+ }), [state, dropZoneType, dropZoneColor, dropZoneDirection]);
189
148
 
190
149
  return (
191
150
  <DragContext.Provider value={contextValue}>{children}</DragContext.Provider>