playbook_ui 14.11.1 → 14.12.0.pre.alpha.PBNTR456fixedconftoastrailsautoclose5673

Sign up to get free protection for your applications and to get access to all the features.
Files changed (172) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +2 -0
  3. data/app/pb_kits/playbook/pb_advanced_table/Components/CustomCell.tsx +18 -2
  4. data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +27 -5
  5. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableBody.tsx +17 -2
  6. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableHeader.tsx +23 -1
  7. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +29 -0
  8. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +61 -4
  9. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.html.erb +13 -8
  10. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +3 -1
  11. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_no_subrows.jsx +50 -0
  12. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pagination.jsx +1 -0
  13. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pagination_with_props.jsx +1 -0
  14. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_responsive.html.erb +38 -0
  15. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows.jsx +60 -0
  16. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows.md +5 -0
  17. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions.jsx +78 -0
  18. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions.md +1 -0
  19. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_header.jsx +53 -0
  20. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_header.md +1 -0
  21. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows.jsx +52 -0
  22. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows.md +1 -0
  23. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_sort_control.md +2 -2
  24. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props.html.erb +33 -0
  25. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_rails.md +1 -0
  26. data/app/pb_kits/playbook/pb_advanced_table/docs/advanced_table_mock_data_no_subrows.json +42 -0
  27. data/app/pb_kits/playbook/pb_advanced_table/docs/advanced_table_mock_data_with_id.json +299 -0
  28. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +7 -0
  29. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +6 -1
  30. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +15 -3
  31. data/app/pb_kits/playbook/pb_advanced_table/table_header.html.erb +11 -11
  32. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +12 -3
  33. data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +1 -1
  34. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +7 -1
  35. data/app/pb_kits/playbook/pb_advanced_table/table_subrow_header.html.erb +1 -1
  36. data/app/pb_kits/playbook/pb_advanced_table/table_subrow_header.rb +9 -0
  37. data/app/pb_kits/playbook/pb_button/button.html.erb +2 -3
  38. data/app/pb_kits/playbook/pb_card/card.html.erb +21 -2
  39. data/app/pb_kits/playbook/pb_card/card.rb +7 -0
  40. data/app/pb_kits/playbook/pb_checkbox/checkbox.html.erb +1 -6
  41. data/app/pb_kits/playbook/pb_collapsible/collapsible.html.erb +3 -1
  42. data/app/pb_kits/playbook/pb_collapsible/collapsible.rb +3 -0
  43. data/app/pb_kits/playbook/pb_date_picker/date_picker.html.erb +24 -16
  44. data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +2 -0
  45. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default_date.md +1 -1
  46. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_turbo_frames.html.erb +13 -0
  47. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_turbo_frames_rails.md +3 -0
  48. data/app/pb_kits/playbook/pb_date_picker/docs/example.yml +1 -0
  49. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_cards_rails.html.erb +1 -3
  50. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_cards_rails.md +7 -0
  51. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_list_rails.html.erb +3 -9
  52. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_list_rails.md +5 -0
  53. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_selectable_list_rails.html.erb +38 -0
  54. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_selectable_list_rails.md +3 -0
  55. data/app/pb_kits/playbook/pb_draggable/docs/example.yml +1 -0
  56. data/app/pb_kits/playbook/pb_drawer/_drawer.scss +145 -183
  57. data/app/pb_kits/playbook/pb_drawer/_drawer.tsx +158 -268
  58. data/app/pb_kits/playbook/pb_drawer/context.ts +11 -0
  59. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_behavior.jsx +38 -0
  60. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_borders.jsx +3 -45
  61. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_breakpoints.jsx +0 -1
  62. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_default.jsx +9 -16
  63. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.jsx +44 -19
  64. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.md +21 -3
  65. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.jsx +16 -21
  66. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_sizes.jsx +2 -19
  67. data/app/pb_kits/playbook/pb_drawer/docs/example.yml +2 -1
  68. data/app/pb_kits/playbook/pb_drawer/docs/index.js +1 -0
  69. data/app/pb_kits/playbook/pb_drawer/drawer.test.jsx +5 -5
  70. data/app/pb_kits/playbook/pb_drawer/hooks/useBreakpoint.tsx +60 -0
  71. data/app/pb_kits/playbook/pb_drawer/hooks/useDrawerAnimation.tsx +21 -0
  72. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_subtle_variant.md +1 -1
  73. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +7 -12
  74. data/app/pb_kits/playbook/pb_dropdown/dropdown_container.html.erb +9 -14
  75. data/app/pb_kits/playbook/pb_dropdown/dropdown_option.html.erb +6 -11
  76. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.html.erb +8 -14
  77. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_auto_close.html.erb +74 -0
  78. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_auto_close_rails.md +3 -0
  79. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/example.yml +1 -0
  80. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/index.js +48 -14
  81. data/app/pb_kits/playbook/pb_icon_button/_icon_button.scss +78 -0
  82. data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_default.html.erb +3 -0
  83. data/app/pb_kits/playbook/pb_icon_button/docs/example.yml +7 -0
  84. data/app/pb_kits/playbook/pb_icon_button/icon_button.html.erb +16 -0
  85. data/app/pb_kits/playbook/pb_icon_button/icon_button.rb +22 -0
  86. data/app/pb_kits/playbook/pb_list/item.html.erb +30 -8
  87. data/app/pb_kits/playbook/pb_list/item.rb +7 -0
  88. data/app/pb_kits/playbook/pb_list/list.html.erb +31 -11
  89. data/app/pb_kits/playbook/pb_list/list.rb +4 -0
  90. data/app/pb_kits/playbook/pb_loading_inline/_loading_inline.tsx +6 -1
  91. data/app/pb_kits/playbook/pb_multiple_users/_multiple_users.scss +4 -0
  92. data/app/pb_kits/playbook/pb_multiple_users/_multiple_users.tsx +1 -0
  93. data/app/pb_kits/playbook/pb_multiple_users/multiple_users.html.erb +1 -1
  94. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +30 -12
  95. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_format.html.erb +15 -0
  96. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_format.jsx +24 -0
  97. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_format.md +1 -0
  98. data/app/pb_kits/playbook/pb_phone_number_input/docs/example.yml +3 -1
  99. data/app/pb_kits/playbook/pb_phone_number_input/docs/index.js +1 -0
  100. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.rb +3 -0
  101. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.test.js +20 -1
  102. data/app/pb_kits/playbook/pb_radio/_radio.scss +12 -8
  103. data/app/pb_kits/playbook/pb_radio/docs/_radio_custom_children.jsx +8 -3
  104. data/app/pb_kits/playbook/pb_select/_select.scss +3 -5
  105. data/app/pb_kits/playbook/pb_select/_select.tsx +5 -1
  106. data/app/pb_kits/playbook/pb_select/select.html.erb +2 -2
  107. data/app/pb_kits/playbook/pb_selectable_icon/_selectable_icon.tsx +9 -1
  108. data/app/pb_kits/playbook/pb_selectable_icon/docs/_selectable_icon_default.jsx +4 -1
  109. data/app/pb_kits/playbook/pb_selectable_icon/docs/_selectable_icon_single_select.jsx +4 -1
  110. data/app/pb_kits/playbook/pb_selectable_list/selectable_list.html.erb +17 -3
  111. data/app/pb_kits/playbook/pb_selectable_list/selectable_list.rb +3 -0
  112. data/app/pb_kits/playbook/pb_selectable_list/selectable_list_item.html.erb +11 -4
  113. data/app/pb_kits/playbook/pb_selectable_list/selectable_list_item.rb +3 -0
  114. data/app/pb_kits/playbook/pb_table/_table.tsx +2 -3
  115. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns.html.erb +74 -0
  116. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns_rails.md +3 -0
  117. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_left_columns_rails.md +2 -2
  118. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns.html.erb +74 -0
  119. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns_rails.md +3 -0
  120. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible.html.erb +47 -0
  121. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_rails.md +2 -0
  122. data/app/pb_kits/playbook/pb_table/docs/example.yml +3 -0
  123. data/app/pb_kits/playbook/pb_table/index.ts +187 -88
  124. data/app/pb_kits/playbook/pb_table/styles/_collapsible.scss +12 -0
  125. data/app/pb_kits/playbook/pb_table/styles/_scroll.scss +6 -5
  126. data/app/pb_kits/playbook/pb_table/table.html.erb +1 -1
  127. data/app/pb_kits/playbook/pb_table/table.rb +17 -2
  128. data/app/pb_kits/playbook/pb_table/table_row.html.erb +20 -1
  129. data/app/pb_kits/playbook/pb_table/table_row.rb +5 -0
  130. data/app/pb_kits/playbook/pb_table/utilities/addDataTitle.ts +22 -0
  131. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_mask.html.erb +46 -0
  132. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_mask_rails.md +3 -0
  133. data/app/pb_kits/playbook/pb_text_input/docs/example.yml +2 -1
  134. data/app/pb_kits/playbook/pb_text_input/index.js +103 -0
  135. data/app/pb_kits/playbook/pb_text_input/text_input.html.erb +4 -0
  136. data/app/pb_kits/playbook/pb_text_input/text_input.rb +33 -3
  137. data/app/pb_kits/playbook/pb_timeline/_timeline.scss +30 -30
  138. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +3 -2
  139. data/app/pb_kits/playbook/pb_typeahead/components/ClearIndicator.tsx +12 -4
  140. data/app/pb_kits/playbook/pb_typeahead/components/Control.tsx +5 -1
  141. data/app/pb_kits/playbook/pb_typeahead/components/IndicatorsContainer.tsx +8 -3
  142. data/app/pb_kits/playbook/pb_typeahead/components/MenuList.tsx +6 -1
  143. data/app/pb_kits/playbook/pb_typeahead/components/Option.tsx +21 -6
  144. data/app/pb_kits/playbook/pb_typeahead/components/Placeholder.tsx +13 -6
  145. data/app/pb_kits/playbook/pb_typeahead/components/ValueContainer.tsx +7 -3
  146. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_custom_menu_list.jsx +2 -0
  147. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_truncated_text.html.erb +19 -0
  148. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_truncated_text.jsx +27 -0
  149. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_truncated_text.md +1 -0
  150. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_async.jsx +4 -2
  151. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_async_custom_options.jsx +5 -5
  152. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +2 -0
  153. data/app/pb_kits/playbook/pb_typeahead/docs/index.js +1 -0
  154. data/dist/chunks/_typeahead-BWwaAo_0.js +36 -0
  155. data/dist/chunks/_weekday_stacked-zyBCd1s8.js +45 -0
  156. data/dist/chunks/lazysizes-B7xYodB-.js +1 -0
  157. data/dist/chunks/{lib-B7sgJtGS.js → lib-kMuhBuU7.js} +2 -2
  158. data/dist/chunks/{pb_form_validation-C5Cc0-1v.js → pb_form_validation-DBJ0wZuS.js} +1 -1
  159. data/dist/chunks/vendor.js +1 -1
  160. data/dist/menu.yml +6 -0
  161. data/dist/playbook-doc.js +1 -1
  162. data/dist/playbook-rails-react-bindings.js +1 -1
  163. data/dist/playbook-rails.js +1 -1
  164. data/dist/playbook.css +1 -1
  165. data/lib/playbook/version.rb +2 -2
  166. metadata +70 -10
  167. data/dist/chunks/_typeahead-C2iCBqxQ.js +0 -36
  168. data/dist/chunks/_weekday_stacked-E-5KcEkc.js +0 -45
  169. data/dist/chunks/lazysizes-DHz07jlL.js +0 -1
  170. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_table_props.md → _advanced_table_table_props_react.md} +0 -0
  171. /data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/{_fixed_confirmation_toast_auto_close.md → _fixed_confirmation_toast_auto_close_react.md} +0 -0
  172. /data/app/pb_kits/playbook/pb_table/docs/{_table_with_collapsible.md → _table_with_collapsible_react.md} +0 -0
@@ -16,6 +16,9 @@ module Playbook
16
16
  default: []
17
17
  prop :collapsible_trail, type: Playbook::Props::Boolean,
18
18
  default: true
19
+ prop :responsive, type: Playbook::Props::Enum,
20
+ values: %w[none scroll],
21
+ default: "scroll"
19
22
 
20
23
  def flatten_columns(columns)
21
24
  columns.flat_map do |col|
@@ -46,12 +49,12 @@ module Playbook
46
49
  row_parent: "#{id}_#{ancestor_ids.last}",
47
50
  }
48
51
  # Subrow header if applicable
49
- 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", subrow_data_attributes: subrow_data_attributes }) if is_first_child_of_subrow && enable_toggle_expansion == "all"
52
+ 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"
50
53
 
51
54
  current_data_attributes = current_depth.zero? ? { row_depth: 0 } : table_data_attributes
52
55
 
53
56
  # Additional class and data attributes needed for toggle logic
54
- 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 })
57
+ 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 })
55
58
 
56
59
  if row[:children].present?
57
60
  row[:children].each do |child_row|
@@ -74,7 +77,16 @@ module Playbook
74
77
  end
75
78
 
76
79
  def classname
77
- generate_classname("pb_advanced_table_body", separator: " ")
80
+ additional_classes = []
81
+ additional_classes << "advanced-table-responsive-#{responsive} pinned-left" if responsive == "scroll"
82
+
83
+ generate_classname("pb_advanced_table_body", *additional_classes, separator: " ")
84
+ end
85
+
86
+ def pinned_cell_class(index)
87
+ return "pinned-left" if index.zero? && responsive == "scroll"
88
+
89
+ ""
78
90
  end
79
91
 
80
92
  private
@@ -3,17 +3,17 @@
3
3
  <%= pb_rails("table/table_row") do %>
4
4
  <% header_row.each_with_index do |cell, cell_index| %>
5
5
  <% header_id = cell[:accessor].present? ? cell[:accessor] : "header_#{row_index}_#{cell_index}" %>
6
- <%= pb_rails("table/table_header", props: { id: header_id, colspan: cell[:colspan], classname: [object.th_classname, ('last-header-cell' if cell[:is_last_in_group] && cell_index != 0)].compact.join(' '), sort_menu: cell[:accessor] ? cell[:sort_menu] : nil }) do %>
7
- <%= pb_rails("flex", props:{ align: "center", justify: cell_index.zero? ? "start" : row_index === header_rows.size - 1 ? "end" : "center", text_align: "end" }) do %>
8
- <% if cell_index.zero? && (object.enable_toggle_expansion == "header" || object.enable_toggle_expansion == "all") && row_index === header_rows.size - 1 %>
9
- <button
10
- class="gray-icon toggle-all-icon"
11
- onclick="expandAllRows(this); event.preventDefault();">
12
- <%= pb_rails("icon", props: { icon: "arrows-from-line", cursor: "pointer", fixed_width: true, padding_right: "xs" }) %>
13
- </button>
14
- <% end %>
15
- <%= cell[:label] %>
16
- <% end %>
6
+ <%= pb_rails("table/table_header", props: { id: header_id, colspan: cell[:colspan], classname: [object.th_classname(is_first_column: cell_index.zero?), ('last-header-cell' if cell[:is_last_in_group] && cell_index != 0)].compact.join(' '), sort_menu: cell[:accessor] ? cell[:sort_menu] : nil }) do %>
7
+ <%= pb_rails("flex", props: { align: "center", justify: cell_index.zero? ? "start" : row_index === header_rows.size - 1 ? "end" : "center", text_align: "end" }) do %>
8
+ <% if cell_index.zero? && (object.enable_toggle_expansion == "header" || object.enable_toggle_expansion == "all") && row_index === header_rows.size - 1 %>
9
+ <button
10
+ class="gray-icon toggle-all-icon"
11
+ onclick="expandAllRows(this); event.preventDefault();">
12
+ <%= pb_rails("icon", props: { icon: "arrows-from-line", cursor: "pointer", fixed_width: true, padding_right: "xs" }) %>
13
+ </button>
14
+ <% end %>
15
+ <%= cell[:label] %>
16
+ <% end %>
17
17
  <% end %>
18
18
  <% end %>
19
19
  <% end %>
@@ -8,13 +8,22 @@ module Playbook
8
8
  prop :enable_toggle_expansion, type: Playbook::Props::Enum,
9
9
  values: %w[all header none],
10
10
  default: "header"
11
+ prop :responsive, type: Playbook::Props::Enum,
12
+ values: %w[none scroll],
13
+ default: "scroll"
11
14
 
12
15
  def classname
13
- generate_classname("pb_advanced_table_header", "pb_table_thead", separator: " ")
16
+ additional_classes = []
17
+ additional_classes << "advanced-table-responsive-#{responsive} pinned-left" if responsive == "scroll"
18
+
19
+ generate_classname("pb_advanced_table_header", "pb_table_thead", *additional_classes, separator: " ")
14
20
  end
15
21
 
16
- def th_classname
17
- generate_classname("table-header-cells", separator: " ")
22
+ def th_classname(is_first_column: false)
23
+ additional_classes = []
24
+ additional_classes << "pinned-left" if is_first_column && responsive == "scroll"
25
+
26
+ generate_classname("table-header-cells", *additional_classes, separator: " ")
18
27
  end
19
28
 
20
29
  def header_rows
@@ -1,7 +1,7 @@
1
1
  <%= pb_content_tag(:tr) do %>
2
2
  <% object.column_definitions.each_with_index do |column, index| %>
3
3
  <% next unless column[:accessor].present? %>
4
- <%= pb_rails("table/table_cell", props: { classname:object.td_classname(column)}) do %>
4
+ <%= pb_rails("table/table_cell", props: { classname:object.td_classname(column, index)}) do %>
5
5
  <%= pb_rails("flex", props:{ align: "center", justify: index.zero? ? "start" : "end" }) do %>
6
6
  <% if collapsible_trail && index.zero? %>
7
7
  <% (1..depth).each do |i| %>
@@ -13,6 +13,11 @@ module Playbook
13
13
  default: true
14
14
  prop :table_data_attributes, type: Playbook::Props::HashProp,
15
15
  default: {}
16
+ prop :responsive, type: Playbook::Props::Enum,
17
+ values: %w[none scroll],
18
+ default: "scroll"
19
+ prop :is_pinned_left, type: Playbook::Props::Boolean,
20
+ default: false
16
21
 
17
22
  def data
18
23
  Hash(prop(:data)).merge(table_data_attributes)
@@ -22,9 +27,10 @@ module Playbook
22
27
  generate_classname("pb_table_tr", "bg-white", subrow_depth_classname, separator: " ")
23
28
  end
24
29
 
25
- def td_classname(column)
30
+ def td_classname(column, index)
26
31
  classes = %w[id-cell chrome-styles]
27
32
  classes << "last-cell" if column[:is_last_in_group]
33
+ classes << "pinned-left" if index.zero? && is_pinned_left && responsive == "scroll"
28
34
  classes.join(" ")
29
35
  end
30
36
 
@@ -1,6 +1,6 @@
1
1
  <%= pb_content_tag(:tr) do %>
2
2
  <% object.column_definitions.each_with_index do |column, index| %>
3
- <%= pb_rails("table/table_cell", props: { classname: "id-cell chrome-styles"}) do %>
3
+ <%= pb_rails("table/table_cell", props: { classname: object.td_classname(index) }) do %>
4
4
  <%= pb_rails("flex", props:{ align: "center", justify: "start" }) do %>
5
5
  <% if collapsible_trail && index.zero? %>
6
6
  <% (1..depth).each do |i| %>
@@ -16,6 +16,9 @@ module Playbook
16
16
  default: true
17
17
  prop :subrow_data_attributes, type: Playbook::Props::HashProp,
18
18
  default: {}
19
+ prop :responsive, type: Playbook::Props::Enum,
20
+ values: %w[none scroll],
21
+ default: "scroll"
19
22
 
20
23
  def data
21
24
  Hash(prop(:data)).merge(subrow_data_attributes)
@@ -25,6 +28,12 @@ module Playbook
25
28
  generate_classname("pb_table_tr", "bg-silver", "pb_subrow_header", subrow_depth_classname, separator: " ")
26
29
  end
27
30
 
31
+ def td_classname(index)
32
+ classes = %w[id-cell chrome-styles]
33
+ classes << "pinned-left" if index.zero? && responsive == "scroll"
34
+ classes.join(" ")
35
+ end
36
+
28
37
  private
29
38
 
30
39
  def subrow_depth_classname
@@ -1,6 +1,5 @@
1
- <%= content_tag(object.tag,
2
- object.tag == "button" ? object.options : object.link_options,
3
- **combined_html_options) do %>
1
+ <%= pb_content_tag(object.tag,
2
+ object.tag == "button" ? object.options : object.link_options) do %>
4
3
  <% if object.variant === "reaction" %>
5
4
  <% if icon && object.valid_emoji(object.icon) %>
6
5
  <%= pb_rails("flex", props:{ align: "center" }) do %>
@@ -1,5 +1,24 @@
1
- <%= pb_content_tag(object.tag) do %>
2
- <%= content.presence %>
1
+ <% if object.draggable_item %>
2
+ <%= pb_rails("draggable/draggable_item", props:{drag_id: object.drag_id}) do %>
3
+ <%= pb_content_tag(object.tag) do %>
4
+ <% if object.draggable_item %>
5
+ <%= pb_rails("flex", props: { align: "center" }) do %>
6
+ <% if object.drag_handle %>
7
+ <span classname="card_draggable_handle">
8
+ <%= pb_rails("icon", props: { icon: "grip-dots-vertical", padding_right: "xs" }) %>
9
+ </span>
10
+ <% end %>
11
+ <div style="width: 100%">
12
+ <%= content.presence %>
13
+ </div>
14
+ <% end %>
15
+ <% end %>
16
+ <% end %>
17
+ <% end %>
18
+ <% else %>
19
+ <%= pb_content_tag(object.tag) do %>
20
+ <%= content.presence %>
21
+ <% end %>
3
22
  <% end %>
4
23
 
5
24
 
@@ -17,6 +17,13 @@ module Playbook
17
17
  prop :background, type: Playbook::Props::Enum,
18
18
  values: %w[white light dark product_1_background product_1_highlight product_2_background product_2_highlight product_3_background product_3_highlight product_4_background product_4_highlight product_5_background product_5_highlight product_6_background product_6_highlight product_7_background product_7_highlight product_8_background product_8_highlight product_9_background product_9_highlight product_10_background product_10_highlight windows siding doors solar roofing gutters insulation none success_subtle warning_subtle error_subtle info_subtle neutral_subtle],
19
19
  default: "none"
20
+ prop :drag_id, type: Playbook::Props::String
21
+ prop :draggable_item, type: Playbook::Props::Boolean,
22
+ default: false
23
+ prop :drag_handle, type: Playbook::Props::Boolean,
24
+ default: true
25
+ prop :items, type: Playbook::Props::Array,
26
+ default: []
20
27
 
21
28
  def classname
22
29
  generate_classname("pb_card_kit",
@@ -1,9 +1,4 @@
1
- <%= content_tag(:label, aria: object.aria,
2
- id: object.id,
3
- data: object.data,
4
- class: object.classname,
5
- **combined_html_options
6
- ) do %>
1
+ <%= pb_content_tag(:label) do %>
7
2
  <%= content.presence || object.input %>
8
3
  <% if object.indeterminate %>
9
4
  <span data-pb-checkbox-icon-span="true" class="pb_checkbox_indeterminate">
@@ -1,3 +1,5 @@
1
- <%= pb_content_tag do %>
1
+ <%= pb_content_tag(
2
+ object.tag
3
+ ) do %>
2
4
  <%= content.presence %>
3
5
  <% end %>
@@ -3,6 +3,9 @@
3
3
  module Playbook
4
4
  module PbCollapsible
5
5
  class Collapsible < Playbook::KitBase
6
+ prop :tag, type: Playbook::Props::Enum,
7
+ values: %w[h1 h2 h3 h4 h5 h6 p div span tr th td thead col],
8
+ default: "div"
6
9
  def classname
7
10
  generate_classname("pb_collapsible_kit")
8
11
  end
@@ -1,9 +1,5 @@
1
- <%= content_tag(:div,
2
- aria: object.aria,
3
- class: object.classname + object.error_class,
4
- data: object.data,
5
- id: object.id,
6
- **combined_html_options) do %>
1
+ <%= pb_content_tag(:div,
2
+ class: object.classname + object.error_class) do %>
7
3
  <div class="input_wrapper">
8
4
  <% if content.present? %>
9
5
  <%= content %>
@@ -68,18 +64,30 @@
68
64
  </div>
69
65
 
70
66
  <%= javascript_tag do %>
71
- window.addEventListener("DOMContentLoaded", () => {
72
- datePickerHelper(<%= object.date_picker_config %>, "<%= object.scroll_container %>")
67
+ (function() {
68
+ const loadDatePicker = () => {
69
+ datePickerHelper(<%= object.date_picker_config %>, "<%= object.scroll_container %>")
73
70
 
74
- if (<%= object.selection_type == "quickpick" %>) {
75
- document.getElementById("<%= object.picker_id %>").addEventListener("change", ({ target }) => {
76
- const startDate = document.getElementById("<%= object.start_date_id %>")
77
- const endDate = document.getElementById("<%= object.end_date_id %>")
78
- const splittedValue = target.value.split(" to ")
79
- startDate.value = splittedValue[0]
80
- endDate.value = splittedValue[1] ? splittedValue[1] : splittedValue[0]
71
+ if (<%= object.selection_type == "quickpick" %>) {
72
+ document.getElementById("<%= object.picker_id %>").addEventListener("change", ({ target }) => {
73
+ const startDate = document.getElementById("<%= object.start_date_id %>")
74
+ const endDate = document.getElementById("<%= object.end_date_id %>")
75
+ const splittedValue = target.value.split(" to ")
76
+ startDate.value = splittedValue[0]
77
+ endDate.value = splittedValue[1] ? splittedValue[1] : splittedValue[0]
78
+ })
79
+ }
80
+ }
81
+
82
+ window.addEventListener("DOMContentLoaded", () => {
83
+ loadDatePicker()
84
+ })
85
+
86
+ if (<%= !object.custom_event_type.empty? %>) {
87
+ window.addEventListener("<%= object.custom_event_type %>", () => {
88
+ loadDatePicker()
81
89
  })
82
90
  }
83
- })
91
+ })()
84
92
  <% end %>
85
93
  <% end %>
@@ -73,6 +73,8 @@ module Playbook
73
73
  default: false
74
74
  prop :year_range, type: Playbook::Props::Array,
75
75
  default: [1900, 2100]
76
+ prop :custom_event_type, type: Playbook::Props::String,
77
+ default: ""
76
78
 
77
79
  def classname
78
80
  default_margin_bottom = margin_bottom.present? ? "" : " mb_sm"
@@ -2,4 +2,4 @@ The `defaultDate`/`default_date` prop has a null or empty string value by defaul
2
2
 
3
3
  If you use a Date object without UTC time standardization the Date Picker kit may misinterpret that date as yesterdays date (consequence of timezone differentials and the Javascript Date Object constructor). See [this GitHub issue for more information](https://github.com/powerhome/playbook/issues/1167) and the anti-pattern examples below.
4
4
 
5
-
5
+ You can leverage the `defaultDate`/`default_date` prop with custom logic in your filter or controller files where the determination of the default value changes based on user interaction. The page can load with an initial default date picker value or placeholder text, then after filter submission save the submitted values as the "new default" (via state or params).
@@ -0,0 +1,13 @@
1
+ <%= pb_rails("date_picker", props: { picker_id: "date-picker-turbo-frames", custom_event_type: "datePickerLoader" }) %>
2
+ <%= pb_rails("button", props: { id: "date-picker-loader", text: "Click Event Simulation" }) %>
3
+
4
+ <script>
5
+ document.getElementById("date-picker-loader").addEventListener("click", () => {
6
+ window.document.dispatchEvent(
7
+ new CustomEvent("datePickerLoader", {
8
+ bubbles: true,
9
+ })
10
+ )
11
+ console.log("Event 'datePickerLoader' dispatched - in a real implementation, this event would trigger the date picker's reinitialization through the custom_event_type prop connection")
12
+ })
13
+ </script>
@@ -0,0 +1,3 @@
1
+ The `custom_event_type` prop allows you to specify a custom event that will trigger the date picker's initialization, in addition to the default initialization on `DOMContentLoaded`. This is particularly useful in dynamic contexts like Turbo Frame updates where you need to reinitialize the date picker after new content loads. For Turbo integration, use `custom_event_type: "turbo:before-render"` to ensure the date picker properly reinitializes after Turbo navigation events.
2
+
3
+ In this example, we demonstrate the setup pattern by connecting a button to dispatch a "datePickerLoader" event - while the date picker's event listener is properly configured through the `custom_event_type` prop, this demo only logs the event dispatch to the console to illustrate the connection structure.
@@ -28,6 +28,7 @@ examples:
28
28
  - date_picker_time: Time Selection
29
29
  - date_picker_positions: Custom Positions
30
30
  - date_picker_positions_element: Custom Position (based on element)
31
+ - date_picker_turbo_frames: Within Turbo Frames
31
32
 
32
33
  react:
33
34
  - date_picker_default: Default
@@ -7,8 +7,7 @@
7
7
  <%= pb_rails("draggable", props: {initial_items: initial_items}) do %>
8
8
  <%= pb_rails("draggable/draggable_container") do %>
9
9
  <% initial_items.each do |item| %>
10
- <%= pb_rails("draggable/draggable_item", props:{drag_id: item[:id]}) do %>
11
- <%= pb_rails("card", props: {highlight: {position: "side", color:"primary"}, margin_bottom: "xs", padding: "xs"}) do %>
10
+ <%= pb_rails("card", props: {highlight: {position: "side", color:"primary"}, margin_bottom: "xs", padding: "xs", drag_id: item[:id], draggable_item: true }) do %>
12
11
  <%= pb_rails("flex", props:{align_items: "stretch", flex_direction:"column"}) do %>
13
12
  <%= pb_rails("flex", props:{gap: "xs"}) do %>
14
13
  <%= pb_rails("title", props: { text: item[:name], tag: "h4", size: 4 }) %>
@@ -32,7 +31,6 @@
32
31
  <% end %>
33
32
  <% end %>
34
33
  <% end %>
35
- <% end %>
36
34
  <% end %>
37
35
  <% end %>
38
36
  <% end %>
@@ -0,0 +1,7 @@
1
+ For a simplified version of the Draggable API for the Card kit, you can do the following:
2
+
3
+ Use the `draggable` kit and manage state as shown.
4
+
5
+ `draggable/draggable_container` kit creates the container within which the cards can be dragged and dropped.
6
+
7
+ The Card kit is optimized to work with the draggable kit. To enable drag, use the `draggable_item` and `drag_id` props on the Card kit as shown. An additional optional boolean prop (set to true by default) of `drag_handle` is also available to show the drag handle icon.
@@ -6,14 +6,8 @@
6
6
 
7
7
  ] %>
8
8
 
9
- <%= pb_rails("draggable", props: {initial_items: initial_items}) do %>
10
- <%= pb_rails("draggable/draggable_container") do %>
11
- <%= pb_rails("list", props: {ordered: false}) do %>
12
- <% initial_items.each do |item| %>
13
- <%= pb_rails("draggable/draggable_item", props:{drag_id: item[:id]}) do %>
14
- <%= pb_rails("list/item") do %><%= item[:name] %><% end %>
15
- <% end %>
16
- <% end %>
17
- <% end %>
9
+ <%= pb_rails("list", props: { enable_drag: true, items: initial_items }) do %>
10
+ <% initial_items.each do |item| %>
11
+ <%= pb_rails("list/item", props:{drag_id: item[:id]}) do %><%= item[:name] %><% end %>
18
12
  <% end %>
19
13
  <% end %>
@@ -0,0 +1,5 @@
1
+ For a simplified version of the Draggable API for the List kit, you can do the following:
2
+
3
+ The List kit is optimized to work with the draggable kit. To enable drag, use the `enable_drag` prop on List kit with an array of the included items AND `drag_id` prop on ListItems. You will also need to include the `items` prop containing your array of listed items for the Draggable API.
4
+
5
+ An additional optional boolean prop (set to true by default) of `drag_handle` is also available on ListItem kit to show the drag handle icon.
@@ -0,0 +1,38 @@
1
+ <%= pb_rails("selectable_list",
2
+ props: {
3
+ enable_drag: true,
4
+ variant: "radio",
5
+ items: [
6
+ { drag_id: "41",
7
+ text: "Task 1",
8
+ input_options: {
9
+ value: "1",
10
+ name: "radio-name",
11
+ }
12
+ },
13
+ { drag_id: "42",
14
+ text: "Task 2",
15
+ checked: true,
16
+ input_options: {
17
+ value: "2",
18
+ name: "radio-name",
19
+ }
20
+ },
21
+ { drag_id: "43",
22
+ text: "Task 3",
23
+ input_options: {
24
+ value: "3",
25
+ name: "radio-name",
26
+ }
27
+ },
28
+ { drag_id: "44",
29
+ text: "Task 4",
30
+ input_options: {
31
+ value: "4",
32
+ name: "radio-name",
33
+ }
34
+ }
35
+ ]
36
+ }
37
+ )
38
+ %>
@@ -0,0 +1,3 @@
1
+ For a simplified version of the Draggable API for the SelectableList kit, you can do the following:
2
+
3
+ The SelectableList kit is optimized to work with the draggable kit. To enable drag, use the `enable_drag` prop on SelectableList kit AND `drag_id` prop within the SelectableList kit prop. An additional optional boolean prop (set to true by default) of `drag_handle` is also available on SelectableList kit to show the drag handle icon.
@@ -11,6 +11,7 @@ examples:
11
11
  rails:
12
12
  - draggable_default_rails: Default
13
13
  - draggable_with_list_rails: Draggable with List Kit
14
+ - draggable_with_selectable_list_rails: Draggable with SelectableList Kit
14
15
  - draggable_with_cards_rails: Draggable with Cards
15
16
 
16
17