playbook_ui 13.21.0.pre.alpha.PBNTR225advancedtablefeedback2438 → 13.21.0.pre.alpha.PBNTR243globalpositioningpropinset2504

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 (163) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/README.md +2 -2
  3. data/app/pb_kits/playbook/pb_advanced_table/Utilities/ExpansionControlHelpers.tsx +20 -35
  4. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +7 -2
  5. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +6 -7
  6. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.html.erb +14 -0
  7. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +19 -0
  8. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +16 -10
  9. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +2 -0
  10. data/app/pb_kits/playbook/pb_advanced_table/table_body.html.erb +9 -0
  11. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +30 -0
  12. data/app/pb_kits/playbook/pb_advanced_table/table_header.html.erb +20 -0
  13. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +21 -0
  14. data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +37 -0
  15. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +32 -0
  16. data/app/pb_kits/playbook/pb_avatar/avatar.html.erb +2 -1
  17. data/app/pb_kits/playbook/pb_avatar_action_button/avatar_action_button.html.erb +2 -1
  18. data/app/pb_kits/playbook/pb_background/background.html.erb +2 -1
  19. data/app/pb_kits/playbook/pb_badge/badge.html.erb +2 -1
  20. data/app/pb_kits/playbook/pb_body/body.html.erb +2 -1
  21. data/app/pb_kits/playbook/pb_bread_crumbs/_bread_crumbs.scss +0 -7
  22. data/app/pb_kits/playbook/pb_bread_crumbs/bread_crumb_item.html.erb +2 -1
  23. data/app/pb_kits/playbook/pb_bread_crumbs/bread_crumbs.html.erb +2 -1
  24. data/app/pb_kits/playbook/pb_button/button.html.erb +2 -1
  25. data/app/pb_kits/playbook/pb_button/button.rb +2 -3
  26. data/app/pb_kits/playbook/pb_button_toolbar/button_toolbar.html.erb +2 -1
  27. data/app/pb_kits/playbook/pb_caption/caption.html.erb +2 -1
  28. data/app/pb_kits/playbook/pb_card/card.html.erb +2 -1
  29. data/app/pb_kits/playbook/pb_card/card_body.html.erb +2 -1
  30. data/app/pb_kits/playbook/pb_card/card_header.html.erb +2 -1
  31. data/app/pb_kits/playbook/pb_checkbox/checkbox.html.erb +3 -1
  32. data/app/pb_kits/playbook/pb_circle_icon_button/circle_icon_button.html.erb +2 -1
  33. data/app/pb_kits/playbook/pb_collapsible/collapsible.html.erb +2 -1
  34. data/app/pb_kits/playbook/pb_collapsible/collapsible_content.html.erb +2 -1
  35. data/app/pb_kits/playbook/pb_collapsible/collapsible_main.html.erb +2 -1
  36. data/app/pb_kits/playbook/pb_contact/contact.html.erb +2 -1
  37. data/app/pb_kits/playbook/pb_currency/currency.html.erb +2 -1
  38. data/app/pb_kits/playbook/pb_dashboard_value/dashboard_value.html.erb +2 -1
  39. data/app/pb_kits/playbook/pb_date/date.html.erb +2 -1
  40. data/app/pb_kits/playbook/pb_date_picker/_date_picker.scss +1 -2
  41. data/app/pb_kits/playbook/pb_date_picker/_date_picker.tsx +3 -0
  42. data/app/pb_kits/playbook/pb_date_picker/date_picker.html.erb +4 -2
  43. data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +2 -1
  44. data/app/pb_kits/playbook/pb_date_picker/date_picker.test.js +1 -1
  45. data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.ts +9 -7
  46. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_margin_bottom.html.erb +7 -0
  47. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_margin_bottom.jsx +41 -0
  48. data/app/pb_kits/playbook/pb_date_picker/docs/example.yml +2 -0
  49. data/app/pb_kits/playbook/pb_date_picker/docs/index.js +1 -0
  50. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_input_styles.scss +1 -2
  51. data/app/pb_kits/playbook/pb_date_range_inline/date_range_inline.html.erb +2 -1
  52. data/app/pb_kits/playbook/pb_date_range_stacked/date_range_stacked.html.erb +2 -1
  53. data/app/pb_kits/playbook/pb_date_stacked/date_stacked.html.erb +2 -1
  54. data/app/pb_kits/playbook/pb_date_time/date_time.html.erb +2 -1
  55. data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.html.erb +3 -2
  56. data/app/pb_kits/playbook/pb_date_year_stacked/date_year_stacked.html.erb +2 -1
  57. data/app/pb_kits/playbook/pb_detail/detail.html.erb +2 -1
  58. data/app/pb_kits/playbook/pb_dialog/dialog.html.erb +2 -1
  59. data/app/pb_kits/playbook/pb_dialog/dialog_body.html.erb +3 -2
  60. data/app/pb_kits/playbook/pb_dialog/dialog_footer.html.erb +2 -1
  61. data/app/pb_kits/playbook/pb_dialog/dialog_header.html.erb +3 -2
  62. data/app/pb_kits/playbook/pb_file_upload/file_upload.html.erb +2 -1
  63. data/app/pb_kits/playbook/pb_filter/filter.html.erb +2 -1
  64. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/_fixed_confirmation_toast.scss +8 -3
  65. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/_fixed_confirmation_toast.tsx +1 -0
  66. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_multi_line.html.erb +51 -1
  67. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_multi_line.jsx +62 -11
  68. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_positions.html.erb +7 -2
  69. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/fixed_confirmation_toast.html.erb +4 -3
  70. data/app/pb_kits/playbook/pb_flex/docs/_flex_spacing.html.erb +0 -4
  71. data/app/pb_kits/playbook/pb_flex/flex.html.erb +2 -1
  72. data/app/pb_kits/playbook/pb_flex/flex_item.html.erb +2 -1
  73. data/app/pb_kits/playbook/pb_form_group/form_group.html.erb +2 -1
  74. data/app/pb_kits/playbook/pb_form_pill/form_pill.html.erb +2 -2
  75. data/app/pb_kits/playbook/pb_hashtag/hashtag.html.erb +2 -1
  76. data/app/pb_kits/playbook/pb_highlight/highlight.html.erb +2 -1
  77. data/app/pb_kits/playbook/pb_home_address_street/home_address_street.html.erb +2 -1
  78. data/app/pb_kits/playbook/pb_icon/_icon.tsx +1 -0
  79. data/app/pb_kits/playbook/pb_icon/icon.html.erb +2 -1
  80. data/app/pb_kits/playbook/pb_icon/icon.rb +3 -3
  81. data/app/pb_kits/playbook/pb_icon_circle/icon_circle.html.erb +2 -1
  82. data/app/pb_kits/playbook/pb_icon_stat_value/icon_stat_value.html.erb +2 -1
  83. data/app/pb_kits/playbook/pb_icon_value/icon_value.html.erb +2 -1
  84. data/app/pb_kits/playbook/pb_image/image.html.erb +2 -1
  85. data/app/pb_kits/playbook/pb_label_pill/label_pill.html.erb +2 -1
  86. data/app/pb_kits/playbook/pb_label_value/label_value.html.erb +3 -2
  87. data/app/pb_kits/playbook/pb_layout/body.html.erb +2 -1
  88. data/app/pb_kits/playbook/pb_layout/footer.html.erb +2 -1
  89. data/app/pb_kits/playbook/pb_layout/header.html.erb +2 -1
  90. data/app/pb_kits/playbook/pb_layout/item.html.erb +2 -1
  91. data/app/pb_kits/playbook/pb_layout/layout.html.erb +2 -1
  92. data/app/pb_kits/playbook/pb_layout/sidebar.html.erb +2 -1
  93. data/app/pb_kits/playbook/pb_legend/legend.html.erb +2 -1
  94. data/app/pb_kits/playbook/pb_list/item.html.erb +2 -1
  95. data/app/pb_kits/playbook/pb_list/list.html.erb +2 -1
  96. data/app/pb_kits/playbook/pb_loading_inline/loading_inline.html.erb +2 -1
  97. data/app/pb_kits/playbook/pb_message/message.html.erb +2 -1
  98. data/app/pb_kits/playbook/pb_message/message_mention.html.erb +3 -2
  99. data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.html.erb +2 -1
  100. data/app/pb_kits/playbook/pb_multiple_users/multiple_users.html.erb +2 -1
  101. data/app/pb_kits/playbook/pb_multiple_users_stacked/multiple_users_stacked.html.erb +2 -1
  102. data/app/pb_kits/playbook/pb_nav/item.html.erb +4 -2
  103. data/app/pb_kits/playbook/pb_nav/nav.html.erb +2 -1
  104. data/app/pb_kits/playbook/pb_online_status/online_status.html.erb +2 -1
  105. data/app/pb_kits/playbook/pb_pagination/pagination.html.erb +2 -1
  106. data/app/pb_kits/playbook/pb_passphrase/passphrase.html.erb +1 -1
  107. data/app/pb_kits/playbook/pb_person/person.html.erb +2 -1
  108. data/app/pb_kits/playbook/pb_person_contact/person_contact.html.erb +2 -1
  109. data/app/pb_kits/playbook/pb_pill/pill.html.erb +2 -1
  110. data/app/pb_kits/playbook/pb_popover/popover.html.erb +2 -1
  111. data/app/pb_kits/playbook/pb_progress_pills/progress_pills.html.erb +2 -1
  112. data/app/pb_kits/playbook/pb_progress_simple/progress_simple.html.erb +2 -1
  113. data/app/pb_kits/playbook/pb_progress_step/progress_step.html.erb +2 -1
  114. data/app/pb_kits/playbook/pb_progress_step/progress_step_item.html.erb +2 -1
  115. data/app/pb_kits/playbook/pb_radio/radio.html.erb +2 -1
  116. data/app/pb_kits/playbook/pb_section_separator/section_separator.html.erb +2 -1
  117. data/app/pb_kits/playbook/pb_select/select.html.erb +2 -1
  118. data/app/pb_kits/playbook/pb_selectable_card/selectable_card.html.erb +2 -1
  119. data/app/pb_kits/playbook/pb_selectable_card_icon/selectable_card_icon.html.erb +2 -1
  120. data/app/pb_kits/playbook/pb_selectable_icon/selectable_icon.html.erb +2 -1
  121. data/app/pb_kits/playbook/pb_selectable_list/selectable_list.html.erb +2 -1
  122. data/app/pb_kits/playbook/pb_selectable_list/selectable_list_item.html.erb +2 -1
  123. data/app/pb_kits/playbook/pb_source/source.html.erb +2 -1
  124. data/app/pb_kits/playbook/pb_star_rating/star_rating.html.erb +2 -1
  125. data/app/pb_kits/playbook/pb_stat_change/stat_change.html.erb +2 -1
  126. data/app/pb_kits/playbook/pb_stat_value/stat_value.html.erb +2 -1
  127. data/app/pb_kits/playbook/pb_table/table.html.erb +4 -2
  128. data/app/pb_kits/playbook/pb_table/table_body.html.erb +5 -3
  129. data/app/pb_kits/playbook/pb_table/table_cell.html.erb +5 -3
  130. data/app/pb_kits/playbook/pb_table/table_head.html.erb +5 -3
  131. data/app/pb_kits/playbook/pb_table/table_header.html.erb +5 -3
  132. data/app/pb_kits/playbook/pb_table/table_row.html.erb +5 -3
  133. data/app/pb_kits/playbook/pb_text_input/_text_input.scss +0 -1
  134. data/app/pb_kits/playbook/pb_text_input/_text_input.tsx +5 -1
  135. data/app/pb_kits/playbook/pb_text_input/text_input.html.erb +2 -1
  136. data/app/pb_kits/playbook/pb_text_input/text_input.rb +2 -1
  137. data/app/pb_kits/playbook/pb_text_input/text_input.test.js +1 -1
  138. data/app/pb_kits/playbook/pb_textarea/textarea.html.erb +2 -1
  139. data/app/pb_kits/playbook/pb_time/time.html.erb +2 -1
  140. data/app/pb_kits/playbook/pb_time_range_inline/time_range_inline.html.erb +3 -2
  141. data/app/pb_kits/playbook/pb_time_stacked/time_stacked.html.erb +2 -1
  142. data/app/pb_kits/playbook/pb_timeline/item.html.erb +2 -1
  143. data/app/pb_kits/playbook/pb_timeline/timeline.html.erb +2 -1
  144. data/app/pb_kits/playbook/pb_timestamp/timestamp.html.erb +2 -1
  145. data/app/pb_kits/playbook/pb_title/title.html.erb +3 -2
  146. data/app/pb_kits/playbook/pb_title_count/title_count.html.erb +2 -1
  147. data/app/pb_kits/playbook/pb_title_detail/title_detail.html.erb +2 -1
  148. data/app/pb_kits/playbook/pb_toggle/toggle.html.erb +2 -1
  149. data/app/pb_kits/playbook/pb_tooltip/tooltip.html.erb +2 -1
  150. data/app/pb_kits/playbook/pb_typeahead/typeahead.html.erb +2 -1
  151. data/app/pb_kits/playbook/pb_user/user.html.erb +2 -1
  152. data/app/pb_kits/playbook/pb_user_badge/user_badge.html.erb +2 -1
  153. data/app/pb_kits/playbook/pb_weekday_stacked/weekday_stacked.html.erb +2 -1
  154. data/app/pb_kits/playbook/utilities/_positioning.scss +23 -10
  155. data/app/pb_kits/playbook/utilities/globalProps.ts +52 -9
  156. data/dist/playbook-rails.js +4 -4
  157. data/lib/playbook/bottom.rb +6 -3
  158. data/lib/playbook/kit_base.rb +18 -0
  159. data/lib/playbook/left.rb +6 -3
  160. data/lib/playbook/right.rb +6 -3
  161. data/lib/playbook/top.rb +6 -3
  162. data/lib/playbook/version.rb +1 -1
  163. metadata +15 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f7cfb7021f51c07eb77a7166393965f50d634939c88a3d7b2a72890fc8f76aea
4
- data.tar.gz: 4e0fd0437700056b9fcd95076dd5f700e89b616cf83f97ef9f96ae50c205352f
3
+ metadata.gz: 862f27be95870b310dd89d38cd466bca0175ffa286df0b80b62c581e604e9db4
4
+ data.tar.gz: 31c27ba009fba844f070688d282d59631f86091635854517ea3714c7fae6ad8c
5
5
  SHA512:
6
- metadata.gz: '09e5b5458d55ae87b2f8ccd44d3f8dc9a95391b8e8ae5493fa5f05408acfe0bd5f2db7c84343fa450bbc05299a597fc8bf6ca48d9976eeac0b1720d353b0cba7'
7
- data.tar.gz: e360ce6a4f2074667af1b2e8a9067fd28e8e7a6f30136d04a69c7f7e3f1dcda3835d4cf4663be4e816dd89909698b4c9b0ac8991ff779b3666e845239dd5afa8
6
+ metadata.gz: 67145d68c85367df0bf1c7bf5d409955e27a5e9c0a170dfa0139a215471cbd4b93ccf53b94a7f2d4448f0da4adcee9a3fa02a7ea6636df8b540bef34a19a027d
7
+ data.tar.gz: 819ba714430f9efd7109f822dbb20e01d7e00d004557522fe51a6290d024af97d23ba401365398192bce5f4f2f132db4526433093664e58091d9e27f749f7bf1
@@ -81,7 +81,7 @@ const MOCK_DATA = [
81
81
  graduatedStudents: "43",
82
82
  children: [
83
83
  {
84
- year: "2011",
84
+ year: "2021",
85
85
  quarter: "Q1",
86
86
  month: "February",
87
87
  day: "15",
@@ -173,7 +173,7 @@ const MOCK_DATA = [
173
173
  graduatedStudents: "43",
174
174
  children: [
175
175
  {
176
- year: "2011",
176
+ year: "2022",
177
177
  quarter: "Q1",
178
178
  month: "May",
179
179
  day: "2",
@@ -16,42 +16,27 @@ export const updateExpandAndCollapseState = (
16
16
  expanded: Record<string, boolean>,
17
17
  targetParent: string
18
18
  ) => {
19
- const updateExpandedRows: Record<string, boolean> = {}
20
- const rows = tableRows.flatRows
21
- // Variable checks if all rows in a section have same expansion state or not
22
- let isExpansionConsistent = true
23
- const areRowsExpanded = new Set<boolean>()
19
+ const updateExpandedRows: Record<string, boolean> = {};
20
+ const rows = tableRows.rows;
21
+
22
+ let isExpansionConsistent = true;
23
+ const areRowsExpanded = new Set<boolean>();
24
24
 
25
- // Update isExpansionConsistent variable
26
25
  for (const row of rows) {
27
- if (
28
- targetParent === undefined
29
- ? row.depth === 0
30
- : targetParent === row.parentId
31
- ) {
32
- areRowsExpanded.add(row.getIsExpanded())
33
- if (areRowsExpanded.size > 1) {
34
- isExpansionConsistent = false
35
- break
36
- }
37
- }
38
- }
26
+ const shouldBeUpdated = targetParent === undefined ? row.depth === 0 : targetParent === row.parentId;
27
+
28
+ if (shouldBeUpdated) {
29
+ const isExpanded = row.getIsExpanded();
30
+ areRowsExpanded.add(isExpanded);
39
31
 
40
- // The if statement runs only for row depth 0, the else statement for the rest
41
- if (targetParent === undefined) {
42
- rows.forEach(row => {
43
- if (row.depth === 0) {
44
- updateExpandedRows[row.id] = !isExpansionConsistent
45
- ? true
46
- : !row.getIsExpanded()
47
- }
48
- })
49
- } else {
50
- for (const row of rows) {
51
- if (targetParent === row.parentId) {
52
- updateExpandedRows[row.id] = !isExpansionConsistent
53
- ? true
54
- : !row.getIsExpanded()
32
+ updateExpandedRows[row.id] = !isExpansionConsistent ? true : !isExpanded;
33
+
34
+ if (areRowsExpanded.size > 1) {
35
+ isExpansionConsistent = false;
36
+ // If expansion inconsistent, ensure all target rows are set to expand
37
+ for (const key in updateExpandedRows) {
38
+ updateExpandedRows[key] = true;
39
+ }
55
40
  }
56
41
  }
57
42
  }
@@ -59,5 +44,5 @@ export const updateExpandAndCollapseState = (
59
44
  return filterExpandableRows({
60
45
  ...(expanded as ExpandedStateObject),
61
46
  ...updateExpandedRows,
62
- })
63
- }
47
+ });
48
+ };
@@ -83,12 +83,17 @@
83
83
 
84
84
  // Vertical separator
85
85
  .table-header-cells:first-child,
86
- td:first-child {
87
- box-shadow: 1px 0px 0px 0px #e4e8f0 !important;
86
+ td:first-child,
87
+ .pb_table_td:first-child {
88
+ box-shadow: 1px 0px 0px 0px $border_light !important;
88
89
  }
89
90
 
90
91
  @include chrome_styles($border-color);
91
92
 
93
+ tr:hover {
94
+ position: relative;
95
+ }
96
+
92
97
  &.dark {
93
98
  .bg-white {
94
99
  background: $bg_dark_card;
@@ -195,14 +195,13 @@ const AdvancedTable = (props: AdvancedTableProps) => {
195
195
  }
196
196
  }, [loading, updateLoadingStateRowCount])
197
197
 
198
- const handleExpandOrCollapse = (row: Row<GenericObject>) => {
198
+ const handleExpandOrCollapse = async (row: Row<GenericObject>) => {
199
199
  onToggleExpansionClick && onToggleExpansionClick(row)
200
-
201
- const expandedState = expanded
202
- const targetParent = row?.parentId
203
- return setExpanded(
204
- updateExpandAndCollapseState(tableRows, expandedState, targetParent)
205
- )
200
+
201
+ const expandedState = expanded;
202
+ const targetParent = row?.parentId;
203
+ const updatedRows = await updateExpandAndCollapseState(tableRows, expandedState, targetParent)
204
+ setExpanded(updatedRows)
206
205
  }
207
206
 
208
207
  const ariaProps = buildAriaProps(aria)
@@ -0,0 +1,14 @@
1
+ <%= content_tag(:div,
2
+ aria: object.aria,
3
+ class: object.classname,
4
+ data: object.data,
5
+ id: object.id) do %>
6
+ <%= pb_rails("table", props: { size: "sm", tag:"div", data_table: true, number_spacing:"tabular", responsive:"none" }) do %>
7
+ <% if content.present? %>
8
+ <% content.presence %>
9
+ <% else %>
10
+ <%= pb_rails("advanced_table/table_header", props: {column_definitions: object.column_definitions, enable_toggle_expansion: object.enable_toggle_expansion }) %>
11
+ <%= pb_rails("advanced_table/table_body", props: {table_data: object.table_data, column_definitions: object.column_definitions}) %>
12
+ <% end %>
13
+ <% end %>
14
+ <% end %>
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbAdvancedTable
5
+ class AdvancedTable < Playbook::KitBase
6
+ prop :table_data, type: Playbook::Props::Array,
7
+ default: []
8
+ prop :column_definitions, type: Playbook::Props::Array,
9
+ default: []
10
+ prop :enable_toggle_expansion, type: Playbook::Props::Enum,
11
+ values: %w[all header none],
12
+ default: "header"
13
+
14
+ def classname
15
+ generate_classname("pb_advanced_table")
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,5 +1,5 @@
1
1
  import React, {useState} from "react"
2
- import { render, screen } from "../utilities/test-utils"
2
+ import { render, screen, waitFor } from "../utilities/test-utils"
3
3
 
4
4
  import { AdvancedTable } from "../"
5
5
 
@@ -198,7 +198,7 @@ test("Row toggle button exists and toggles subrows open and closed", () => {
198
198
  expect(subRow).toBeInTheDocument()
199
199
  })
200
200
 
201
- test("toggleExpansionAll button exists and toggles subrows open and closed", () => {
201
+ test("toggleExpansionAll button exists and toggles subrows open and closed", async () => {
202
202
  render(
203
203
  <AdvancedTable
204
204
  columnDefinitions={columnDefinitions}
@@ -207,16 +207,22 @@ test("toggleExpansionAll button exists and toggles subrows open and closed", ()
207
207
  />
208
208
  )
209
209
 
210
- const kit = screen.getByTestId(testId)
211
- const toggleButton = kit.querySelector(".gray-icon.toggle-all-icon")
212
- expect(toggleButton).toBeInTheDocument()
213
- const subRow1 = kit.querySelector(".bg-white.depth-sub-row-1")
214
- expect(subRow1).not.toBeInTheDocument()
215
- toggleButton.click()
216
- const subRow = kit.querySelector(".bg-white.depth-sub-row-1")
217
- expect(subRow).toBeInTheDocument()
210
+ const kit = screen.getByTestId(testId);
211
+ const toggleButton = kit.querySelector(".gray-icon.toggle-all-icon");
212
+ expect(toggleButton).toBeInTheDocument();
213
+
214
+ const subRow1 = kit.querySelector(".bg-white.depth-sub-row-1");
215
+ expect(subRow1).not.toBeInTheDocument();
216
+
217
+ toggleButton.click();
218
+
219
+ await waitFor(() => {
220
+ const subRow = kit.querySelector(".bg-white.depth-sub-row-1");
221
+ expect(subRow).toBeInTheDocument();
222
+ })
218
223
  })
219
224
 
225
+
220
226
  test("loading state + initialLoadingRowCount prop", () => {
221
227
  render(
222
228
  <AdvancedTable
@@ -1,4 +1,6 @@
1
1
  examples:
2
+ # rails:
3
+ # - advanced_table_default: Default (Required Props)
2
4
  react:
3
5
  - advanced_table_default: Default (Required Props)
4
6
  - advanced_table_loading: Loading State
@@ -0,0 +1,9 @@
1
+ <%= content_tag(:div,
2
+ aria: object.aria,
3
+ class: object.classname,
4
+ data: object.data,
5
+ id: object.id) do %>
6
+ <% object.table_data.each do |row| %>
7
+ <%= render_row_and_children(row, object.column_definitions) %>
8
+ <% end %>
9
+ <% end %>
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbAdvancedTable
5
+ class TableBody < Playbook::KitBase
6
+ prop :table_data, type: Playbook::Props::Array,
7
+ default: []
8
+ prop :column_definitions, type: Playbook::Props::Array,
9
+ default: []
10
+
11
+ def render_row_and_children(row, column_definitions, current_depth = 0)
12
+ output = ActiveSupport::SafeBuffer.new
13
+
14
+ output << pb_rails("advanced_table/table_row", props: { row: row, column_definitions: column_definitions, depth: current_depth })
15
+
16
+ if row[:children].present?
17
+ row[:children].each do |child_row|
18
+ output << render_row_and_children(child_row, column_definitions, current_depth + 1)
19
+ end
20
+ end
21
+
22
+ output
23
+ end
24
+
25
+ def classname
26
+ generate_classname("pb_advanced_table_body", "pb_table_tbody", separator: " ")
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,20 @@
1
+ <%= content_tag(:div,
2
+ aria: object.aria,
3
+ class: object.classname,
4
+ data: object.data,
5
+ id: object.id) do %>
6
+ <%= pb_rails("table/table_row", props: {tag:"div"}) do %>
7
+ <% object.column_definitions.each_with_index do |item, index| %>
8
+ <%= pb_rails("table/table_header", props: { tag:"div", id:item[:accessor], classname:object.th_classname}) do %>
9
+ <%= pb_rails("flex", props:{ align: "center", justify: index.zero? ? "start" : "end", text_align:"end" }) do %>
10
+ <% if index.zero? && (object.enable_toggle_expansion == "header" || object.enable_toggle_expansion == "all") %>
11
+ <button class="gray-icon toggle-all-icon">
12
+ <%= pb_rails("icon", props: { icon: "arrows-from-line", cursor: "pointer", fixed_width: true, padding_right:"xs" }) %>
13
+ </button>
14
+ <% end %>
15
+ <%= item[:label] %>
16
+ <% end %>
17
+ <% end %>
18
+ <% end %>
19
+ <% end %>
20
+ <% end %>
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbAdvancedTable
5
+ class TableHeader < Playbook::KitBase
6
+ prop :column_definitions, type: Playbook::Props::Array,
7
+ default: []
8
+ prop :enable_toggle_expansion, type: Playbook::Props::Enum,
9
+ values: %w[all header none],
10
+ default: "header"
11
+
12
+ def classname
13
+ generate_classname("pb_advanced_table_header", "pb_table_thead", separator: " ")
14
+ end
15
+
16
+ def th_classname
17
+ generate_classname("table-header-cells", separator: " ")
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,37 @@
1
+ <%= content_tag(:div,
2
+ aria: object.aria,
3
+ class: object.classname,
4
+ data: object.data,
5
+ id: object.id) do %>
6
+ <% object.column_definitions.each_with_index do |column, index| %>
7
+ <%= pb_rails("table/table_cell", props: { tag:"div", classname:object.td_classname}) do %>
8
+ <%= pb_rails("flex", props:{ align: "center", justify: index.zero? ? "start" : "end" }) do %>
9
+ <div style="padding-left: <%= depth * 1.25 %>em">
10
+ <%= pb_rails("flex", props:{align: "center", column_gap: "xs"}) do %>
11
+ <% if index.zero? && object.row[:children].present? %>
12
+ <button class="gray-icon expand-toggle-icon">
13
+ <%= pb_rails("icon", props: { icon: "circle-play", cursor: "pointer" }) %>
14
+ </button>
15
+ <% end %>
16
+ <%= pb_rails("flex/flex_item", props:{padding_left: index.zero? && object.row[:children].present? ? "none" : "xs"}) do %>
17
+ <% if index.zero? %>
18
+ <% if object.depth.zero? %>
19
+ <%= object.row[column[:accessor].to_sym] %>
20
+ <% else %>
21
+ <% object.depth_accessors.each_with_index do |item, accessor_index| %>
22
+ <% if object.depth - 1 == accessor_index %>
23
+ <% key = item.to_sym %>
24
+ <%= object.row[key] %>
25
+ <% end %>
26
+ <% end %>
27
+ <% end %>
28
+ <% else %>
29
+ <%= object.row[column[:accessor].to_sym] %>
30
+ <% end %>
31
+ <% end %>
32
+ <% end %>
33
+ </div>
34
+ <% end %>
35
+ <% end %>
36
+ <% end %>
37
+ <% end %>
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbAdvancedTable
5
+ class TableRow < Playbook::KitBase
6
+ prop :column_definitions, type: Playbook::Props::Array,
7
+ default: []
8
+ prop :row
9
+ prop :depth
10
+
11
+ def classname
12
+ generate_classname("pb_table_tr", "bg-white", subrow_depth_classname, separator: " ")
13
+ end
14
+
15
+ def td_classname
16
+ generate_classname("id-cell", "chrome-styles", separator: " ")
17
+ end
18
+
19
+ def depth_accessors
20
+ column_definitions.flat_map do |column|
21
+ column[:cellAccessors] if column.key?(:cellAccessors)
22
+ end.compact
23
+ end
24
+
25
+ private
26
+
27
+ def subrow_depth_classname
28
+ depth.positive? ? "depth-sub-row-#{depth}" : ""
29
+ end
30
+ end
31
+ end
32
+ end
@@ -2,7 +2,8 @@
2
2
  id: object.id,
3
3
  data: object.data.merge(initials: object.initials),
4
4
  class: object.classname,
5
- aria: object.aria) do %>
5
+ aria: object.aria,
6
+ **combined_html_options) do %>
6
7
  <%= content_tag(:div, data: { initials: object.initials }, class: "avatar_wrapper") do %>
7
8
  <%= pb_rails("image", props: { alt: object.alt_text, url: object.image_url, on_error: object.handle_img_error }) if object.image_url.present? %>
8
9
  <% end %>
@@ -2,7 +2,8 @@
2
2
  aria: object.aria,
3
3
  id: object.id,
4
4
  data: object.data,
5
- class: object.classname) do %>
5
+ class: object.classname,
6
+ **combined_html_options) do %>
6
7
  <% if object.tooltip_text.present? %>
7
8
  <%= pb_rails("tooltip", props: {
8
9
  trigger_element_id: object.tooltip_id,
@@ -7,7 +7,8 @@
7
7
  style: "background-image: url('#{object.image_url}');
8
8
  background-repeat: #{object.background_repeat};
9
9
  background-size: #{object.background_size};
10
- background-position: #{object.background_position};"
10
+ background-position: #{object.background_position};",
11
+ **combined_html_options
11
12
  ) do %>
12
13
  <%= content.presence %>
13
14
  <% end %>
@@ -2,6 +2,7 @@
2
2
  aria: object.aria,
3
3
  id: object.id,
4
4
  data: object.data,
5
- class: object.classname) do %>
5
+ class: object.classname,
6
+ **combined_html_options) do %>
6
7
  <span><%= object.text %></span>
7
8
  <% end %>
@@ -2,6 +2,7 @@
2
2
  aria: object.aria,
3
3
  id: object.id,
4
4
  data: object.data,
5
- class: object.classname) do %>
5
+ class: object.classname,
6
+ **combined_html_options) do %>
6
7
  <%= object.content %>
7
8
  <% end %>
@@ -1,4 +1,3 @@
1
- @import "../tokens/border_radius";
2
1
  @import "../tokens/colors";
3
2
  @import "../tokens/opacity";
4
3
  @import "../tokens/spacing";
@@ -10,11 +9,7 @@
10
9
  display: inline-flex;
11
10
  align-items: center;
12
11
  justify-content: center;
13
- border-radius: $border_rad_light;
14
12
  padding: 0 $space_xs/2;
15
- border-width: 1px;
16
- border-style: solid;
17
- border-color: $card_light;
18
13
 
19
14
  svg {
20
15
  margin-right: 8px;
@@ -44,8 +39,6 @@
44
39
  }
45
40
 
46
41
  &.dark {
47
- border-width: 0;
48
-
49
42
  @each $color_name, $color_value in $status_colors {
50
43
  &[class*=_#{$color_name}] {
51
44
  background: rgba(mix($bg_dark, $color_value, 10%), $opacity_2);
@@ -2,7 +2,8 @@
2
2
  id: object.id,
3
3
  data: object.data,
4
4
  class: object.classname,
5
- aria: object.aria) do%>
5
+ aria: object.aria,
6
+ **combined_html_options) do%>
6
7
  <%= content_tag(object.link ? 'a' : 'span', class: 'bread_crumb_item', href: object.link) do %>
7
8
  <%= content.presence %>
8
9
  <% end %>
@@ -2,6 +2,7 @@
2
2
  aria: object.aria,
3
3
  id: object.id,
4
4
  data: object.data,
5
- class: object.classname) do %>
5
+ class: object.classname,
6
+ **combined_html_options) do %>
6
7
  <%= content.presence %>
7
8
  <% end %>
@@ -1,5 +1,6 @@
1
1
  <%= content_tag(object.tag,
2
- object.tag == "button" ? object.options : object.link_options) do %>
2
+ object.tag == "button" ? object.options : object.link_options,
3
+ **combined_html_options) do %>
3
4
  <% if object.variant === "reaction" %>
4
5
  <% if icon && object.valid_emoji(object.icon) %>
5
6
  <%= pb_rails("flex", props:{ align: "center" }) do %>
@@ -34,10 +34,8 @@ module Playbook
34
34
  default: "far"
35
35
 
36
36
  def options
37
- {
38
- aria: aria,
37
+ options = {
39
38
  class: classname,
40
- data: data,
41
39
  disabled: disabled,
42
40
  id: id,
43
41
  role: "button",
@@ -46,6 +44,7 @@ module Playbook
46
44
  value: value,
47
45
  form: form,
48
46
  }.compact
47
+ combined_html_options.merge!(options) if combined_html_options.present?
49
48
  end
50
49
 
51
50
  def target_attribute
@@ -2,6 +2,7 @@
2
2
  aria: object.aria,
3
3
  class: object.classname,
4
4
  data: object.data,
5
- id: object.id) do %>
5
+ id: object.id,
6
+ **combined_html_options) do %>
6
7
  <%= content.presence || object.text %>
7
8
  <% end %>
@@ -2,6 +2,7 @@
2
2
  aria: object.aria,
3
3
  id: object.id,
4
4
  data: object.data,
5
- class: object.classname) do %>
5
+ class: object.classname,
6
+ **combined_html_options) do %>
6
7
  <%= content.presence || object.text %>
7
8
  <% end %>
@@ -3,7 +3,8 @@
3
3
  data: object.data,
4
4
  class: object.classname,
5
5
  aria: object.aria,
6
- dark: object.dark) do %>
6
+ dark: object.dark,
7
+ **combined_html_options) do %>
7
8
  <%= content.presence %>
8
9
  <% end %>
9
10
 
@@ -2,6 +2,7 @@
2
2
  id: object.id,
3
3
  data: object.data,
4
4
  class: object.classname,
5
- aria: object.aria) do %>
5
+ aria: object.aria,
6
+ **combined_html_options) do %>
6
7
  <%= content.presence %>
7
8
  <% end %>
@@ -2,6 +2,7 @@
2
2
  id: object.id,
3
3
  data: object.data,
4
4
  class: object.classname,
5
- aria: object.aria) do %>
5
+ aria: object.aria,
6
+ **combined_html_options) do %>
6
7
  <%= content.presence %>
7
8
  <% end %>
@@ -1,7 +1,9 @@
1
1
  <%= content_tag(:label, aria: object.aria,
2
2
  id: object.id,
3
3
  data: object.data,
4
- class: object.classname) do %>
4
+ class: object.classname,
5
+ **combined_html_options
6
+ ) do %>
5
7
  <%= content.presence || object.input %>
6
8
  <% if object.indeterminate %>
7
9
  <span class="pb_checkbox_indeterminate">
@@ -2,7 +2,8 @@
2
2
  aria: object.aria,
3
3
  id: object.id,
4
4
  data: object.data,
5
- class: object.classname) do %>
5
+ class: object.classname,
6
+ **combined_html_options) do %>
6
7
  <%= pb_rails("button", props: {type: object.type, link: object.link, new_window:object.new_window, variant: object.variant, disabled: object.disabled, dark: object.dark}) do %>
7
8
  <%= pb_rails("icon", props: {icon: object.icon, fixed_width: true, dark: object.dark}) %>
8
9
  <% end %>
@@ -2,6 +2,7 @@
2
2
  aria: object.aria,
3
3
  class: object.classname,
4
4
  data: object.data,
5
- id: object.id) do %>
5
+ id: object.id,
6
+ **combined_html_options) do %>
6
7
  <%= content.presence %>
7
8
  <% end %>
@@ -2,6 +2,7 @@
2
2
  id: object.id,
3
3
  data: object.data,
4
4
  class: object.classname,
5
- aria: object.aria) do %>
5
+ aria: object.aria,
6
+ **combined_html_options) do %>
6
7
  <%= content.presence %>
7
8
  <% end %>
@@ -2,7 +2,8 @@
2
2
  id: object.id,
3
3
  data: object.data,
4
4
  class: object.classname,
5
- aria: object.aria) do %>
5
+ aria: object.aria,
6
+ **combined_html_options) do %>
6
7
 
7
8
  <%= pb_rails("flex", props: {vertical: "center", spacing: "between", cursor: "pointer"}) do %>
8
9
  <%= pb_rails("flex/flex_item") do %>
@@ -2,7 +2,8 @@
2
2
  aria: object.aria,
3
3
  id: object.id,
4
4
  data: object.data,
5
- class: object.classname) do %>
5
+ class: object.classname,
6
+ **combined_html_options) do %>
6
7
  <%= pb_rails("body", props: {
7
8
  tag: "span",
8
9
  classname: "pb_contact_kit",
@@ -2,7 +2,8 @@
2
2
  aria: object.aria,
3
3
  id: object.id,
4
4
  data: object.data,
5
- class: object.classname) do %>
5
+ class: object.classname,
6
+ **combined_html_options) do %>
6
7
  <%= pb_rails("caption", props: object.caption_props) %>
7
8
 
8
9
  <div class=<%= "pb_currency_wrapper#{object.variant_class || object.emphasized_class}" %>>