playbook_ui 14.10.0.pre.alpha.play1465attempt25272 → 14.10.0.pre.alpha.play1662cssbargraph5193

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 (83) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +16 -11
  3. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.html.erb +1 -1
  4. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +1 -8
  5. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta_sort.html.erb +3 -1
  6. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +1 -4
  7. data/app/pb_kits/playbook/pb_advanced_table/index.js +95 -143
  8. data/app/pb_kits/playbook/pb_advanced_table/table_body.html.erb +1 -1
  9. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +8 -50
  10. data/app/pb_kits/playbook/pb_advanced_table/table_header.html.erb +14 -17
  11. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +0 -78
  12. data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +3 -4
  13. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +2 -7
  14. data/app/pb_kits/playbook/pb_advanced_table/table_subrow_header.html.erb +6 -2
  15. data/app/pb_kits/playbook/pb_card/_card.scss +3 -21
  16. data/app/pb_kits/playbook/pb_card/docs/_card_header.html.erb +0 -18
  17. data/app/pb_kits/playbook/pb_card/docs/_card_header.jsx +0 -40
  18. data/app/pb_kits/playbook/pb_dashboard/BarGraphStyles.scss +53 -0
  19. data/app/pb_kits/playbook/pb_icon_circle/_icon_circle.scss +13 -1
  20. data/app/pb_kits/playbook/pb_section_separator/_section_separator.scss +1 -64
  21. data/app/pb_kits/playbook/pb_section_separator/_section_separator.tsx +1 -3
  22. data/app/pb_kits/playbook/pb_section_separator/docs/example.yml +0 -2
  23. data/app/pb_kits/playbook/pb_section_separator/docs/index.js +0 -1
  24. data/app/pb_kits/playbook/pb_section_separator/section_separator.rb +1 -4
  25. data/app/pb_kits/playbook/pb_skeleton_loading/_skeleton_loading.scss +2 -2
  26. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_default.html.erb +1 -1
  27. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_filter.jsx +2 -10
  28. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_height_width.jsx +2 -6
  29. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_user.jsx +3 -11
  30. data/app/pb_kits/playbook/pb_skeleton_loading/docs/example.yml +2 -7
  31. data/app/pb_kits/playbook/pb_skeleton_loading/skeleton_loading.html.erb +12 -8
  32. data/app/pb_kits/playbook/pb_skeleton_loading/skeleton_loading.rb +1 -48
  33. data/app/pb_kits/playbook/pb_table/_table.tsx +18 -67
  34. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_left_columns.jsx +1 -1
  35. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_left_columns_rails.md +0 -2
  36. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_left_columns_react.md +1 -4
  37. data/app/pb_kits/playbook/pb_table/index.ts +17 -17
  38. data/app/pb_kits/playbook/pb_table/styles/_scroll.scss +2 -38
  39. data/app/pb_kits/playbook/pb_table/styles/_sticky_columns.scss +3 -17
  40. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +2 -3
  41. data/app/pb_kits/playbook/pb_typeahead/components/ClearIndicator.tsx +4 -12
  42. data/app/pb_kits/playbook/pb_typeahead/components/Control.tsx +1 -5
  43. data/app/pb_kits/playbook/pb_typeahead/components/IndicatorsContainer.tsx +3 -8
  44. data/app/pb_kits/playbook/pb_typeahead/components/MenuList.tsx +1 -6
  45. data/app/pb_kits/playbook/pb_typeahead/components/Option.tsx +6 -21
  46. data/app/pb_kits/playbook/pb_typeahead/components/Placeholder.tsx +6 -13
  47. data/app/pb_kits/playbook/pb_typeahead/components/ValueContainer.tsx +3 -7
  48. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_custom_menu_list.jsx +0 -2
  49. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_async.jsx +2 -4
  50. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_async_custom_options.jsx +5 -5
  51. data/dist/chunks/{_typeahead-BhT5aXCY.js → _typeahead-BXXEtXbz.js} +3 -3
  52. data/dist/chunks/_weekday_stacked-D0yBvHBb.js +45 -0
  53. data/dist/chunks/{lib-B7sgJtGS.js → lib-sMFo2JZy.js} +1 -1
  54. data/dist/chunks/{pb_form_validation-C5Cc0-1v.js → pb_form_validation-CgvjWbOK.js} +1 -1
  55. data/dist/chunks/vendor.js +1 -1
  56. data/dist/menu.yml +1 -1
  57. data/dist/playbook-doc.js +1 -1
  58. data/dist/playbook-rails-react-bindings.js +1 -1
  59. data/dist/playbook-rails.js +1 -1
  60. data/dist/playbook.css +1 -1
  61. data/lib/playbook/version.rb +1 -1
  62. metadata +9 -26
  63. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_headers.html.erb +0 -43
  64. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_headers_multiple.html.erb +0 -58
  65. data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_color.html.erb +0 -10
  66. data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_color.jsx +0 -42
  67. data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_color.md +0 -3
  68. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_description.md +0 -3
  69. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_border_radius.html.erb +0 -9
  70. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_border_radius_rails.md +0 -1
  71. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_color.html.erb +0 -7
  72. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_filter.html.erb +0 -119
  73. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_height_width.html.erb +0 -15
  74. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_height_width_rails.md +0 -3
  75. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_layout.html.erb +0 -3
  76. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_user.html.erb +0 -63
  77. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns.jsx +0 -88
  78. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns_react.md +0 -3
  79. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns.jsx +0 -87
  80. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns_react.md +0 -5
  81. data/dist/chunks/_weekday_stacked-DJOTNDSY.js +0 -45
  82. /data/app/pb_kits/playbook/pb_skeleton_loading/docs/{_skeleton_loading_border_radius_react.md → _skeleton_loading_border_radius.md} +0 -0
  83. /data/app/pb_kits/playbook/pb_skeleton_loading/docs/{_skeleton_loading_height_width_react.md → _skeleton_loading_height_width.md} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c93b9ff47768d50c0d18d31f265545696ab20026a354c4ce1902bf708a97e276
4
- data.tar.gz: ec50794f12461ba77cca8a805a20512ee641c0dc5c74168240ad79f071b87958
3
+ metadata.gz: f2e1aaf2cadccd158fb55ca05342e3dfefd6e2614dc37d220086b342e5df4340
4
+ data.tar.gz: fc03a93a9cc11765508190229426d34d507306ebf46aff0efe5ec23bb65ddb32
5
5
  SHA512:
6
- metadata.gz: 676259bf2c4b7eadd6ca71fad89f4182a2a4a297e3531d0390681353605ca5a07367114596288292d42c48ad0d45bc051c68fc3ade51fe22e8924c24b226ca48
7
- data.tar.gz: 0c40167b772c7e4125ef170e13bce0426751a658c8e987bce7fa1a89d0ddd7045f7848565560fe95f9c09c0347a5af19ab5f79d28a99e95078feee1fd1106e32
6
+ metadata.gz: 88632df2e8dd9a501cd6d97a0bc60213d11a1a4f3e3b063c9318a83267177403c02adb69e60c69344c07c91e7a1915f8a3954069c8682839d8787879b3208219
7
+ data.tar.gz: 03f3eec3ebd3da933b162a985c72fde36109c4f2e01ad4d732f73cf27a1eae8fb633823af6859f659470d0dca062b8f1dba1777e172a05be30af19b19cc063a4
@@ -36,29 +36,35 @@
36
36
  .last-header-cell {
37
37
  border-right: 1px solid $border_light !important;
38
38
  }
39
+
39
40
  th {
40
41
  border-radius: 0px !important;
41
42
  border-width: 0 0 1px 0 !important;
42
43
  }
43
44
  th:first-child {
44
45
  border-left-width: 1px !important;
46
+ @media only screen and (max-width: $screen-xl-min) {
47
+ border-left-width: 0 !important;
48
+ }
49
+ }
50
+ th:last-child {
51
+ border-right-width: 1px !important;
52
+ @media only screen and (max-width: $screen-xl-min) {
53
+ border-right-width: 0 !important;
54
+ }
45
55
  }
46
56
  }
47
57
  th[colspan]:not([colspan="1"]) {
48
- border-right: 1px solid $border_light !important;
58
+ border-right: 1px solid $border_light;
49
59
  }
60
+
61
+
50
62
  }
51
63
 
52
64
  .pb_advanced_table_body {
53
65
  .last-cell {
54
66
  border-right: 1px solid $border_light !important;
55
67
  }
56
- tr td:first-child {
57
- padding-left: 8px !important;
58
- }
59
- tr .pb_table_td:last-child {
60
- padding-right: 8px !important;
61
- }
62
68
  }
63
69
 
64
70
 
@@ -128,7 +134,7 @@
128
134
  }
129
135
 
130
136
  .toggle-content {
131
- display: none !important;
137
+ display: none;
132
138
  height: 0;
133
139
  padding-bottom: 0 !important;
134
140
  padding-top: 0 !important;
@@ -137,7 +143,7 @@
137
143
  }
138
144
 
139
145
  .toggle-content.is-visible {
140
- display: table-row !important;
146
+ display: contents;
141
147
  height: auto;
142
148
  }
143
149
 
@@ -160,7 +166,7 @@
160
166
  width: 100%;
161
167
  [class^=pb_table].table-sm.table-card thead tr th:first-child,
162
168
  [class^=pb_table].table-sm:not(.no-hover).table-card tbody tr td:first-child {
163
- border-left-width: 0px !important;
169
+ border-left-width: 0px;
164
170
  }
165
171
  [class^=pb_table].table-sm.table-card thead tr th:last-child,
166
172
  [class^=pb_table].table-sm:not(.no-hover).table-card tbody tr td:last-child {
@@ -186,7 +192,6 @@
186
192
  .bg-white td:first-child {
187
193
  background-color: $white;
188
194
  }
189
-
190
195
  }
191
196
  }
192
197
  @media only screen and (min-width: $screen-xl-min) {
@@ -1,5 +1,5 @@
1
1
  <%= pb_content_tag do %>
2
- <%= pb_rails("table", props: { size: "sm", data_table: true, number_spacing:"tabular", responsive:"none", dark: dark }) do %>
2
+ <%= pb_rails("table", props: { size: "sm", tag:"div", data_table: true, number_spacing:"tabular", responsive:"none", dark: dark }) do %>
3
3
  <% if content.present? %>
4
4
  <% content.presence %>
5
5
  <% else %>
@@ -10,16 +10,9 @@ module Playbook
10
10
  prop :enable_toggle_expansion, type: Playbook::Props::Enum,
11
11
  values: %w[all header none],
12
12
  default: "header"
13
- prop :responsive, type: Playbook::Props::Enum,
14
- values: %w[none scroll],
15
- default: "none"
16
13
 
17
14
  def classname
18
- generate_classname("pb_advanced_table", responsive_classname, separator: " ")
19
- end
20
-
21
- def responsive_classname
22
- responsive == "scroll" ? "advanced-table-responsive-scroll" : "advanced-table-responsive-none"
15
+ generate_classname("pb_advanced_table")
23
16
  end
24
17
  end
25
18
  end
@@ -49,9 +49,11 @@
49
49
  label: "Graduated Students",
50
50
  }
51
51
  ]
52
+
53
+ subrow_headers = ["Quarter", "Month", "Day"]
52
54
  %>
53
55
 
54
56
  <%= pb_rails("advanced_table", props: { table_data: @table_data, column_definitions: column_definitions }) do %>
55
57
  <%= pb_rails("advanced_table/table_header", props: { column_definitions: column_definitions }) %>
56
- <%= pb_rails("advanced_table/table_body", props: { id: "beta_sort", table_data: @table_data, column_definitions: column_definitions, enable_toggle_expansion: "all" }) %>
58
+ <%= pb_rails("advanced_table/table_body", props: { id: "beta_sort", table_data: @table_data, column_definitions: column_definitions, subrow_headers: subrow_headers, enable_toggle_expansion: "all" }) %>
57
59
  <% end %>
@@ -1,13 +1,10 @@
1
1
  examples:
2
2
  rails:
3
3
  - advanced_table_beta: Default (Required Props)
4
- # - advanced_table_beta_subrow_headers: SubRow Headers
4
+ - advanced_table_beta_subrow_headers: SubRow Headers
5
5
  - advanced_table_collapsible_trail_rails: Collapsible Trail
6
6
  - advanced_table_beta_sort: Enable Sorting
7
7
  - advanced_table_custom_cell_rails: Custom Components for Cells
8
- - advanced_table_column_headers: Multi-Header Columns
9
- - advanced_table_column_headers_multiple: Multi-Header Columns (Multiple Levels)
10
-
11
8
 
12
9
  react:
13
10
  - advanced_table_default: Default (Required Props)
@@ -1,186 +1,138 @@
1
- import PbEnhancedElement from "../pb_enhanced_element";
1
+ import PbEnhancedElement from '../pb_enhanced_element'
2
2
 
3
- const ADVANCED_TABLE_SELECTOR = "[data-advanced-table]";
4
- const DOWN_ARROW_SELECTOR = "#advanced-table_open_icon";
5
- const UP_ARROW_SELECTOR = "#advanced-table_close_icon";
3
+ const ADVANCED_TABLE_SELECTOR = '[data-advanced-table]'
4
+ const CONTENT_SELECTOR = '[data-advanced-table-content="id"]'
5
+ const DOWN_ARROW_SELECTOR = '#advanced-table_open_icon'
6
+ const UP_ARROW_SELECTOR = '#advanced-table_close_icon'
6
7
 
7
8
  export default class PbAdvancedTable extends PbEnhancedElement {
8
9
  static get selector() {
9
- return ADVANCED_TABLE_SELECTOR;
10
+ return ADVANCED_TABLE_SELECTOR
10
11
  }
11
12
 
12
13
  get target() {
13
- const table = this.element.closest("table");
14
- return table.querySelectorAll(`[data-row-parent="${this.element.id}"]`);
14
+ return document.querySelector(CONTENT_SELECTOR.replace("id", this.element.id))
15
15
  }
16
-
17
- static expandedRows = new Set();
18
- static isCollapsing = false;
16
+
17
+ static expandedRows = new Set()
18
+ static isCollapsing = false
19
19
 
20
20
  connect() {
21
- this.element.addEventListener("click", () => {
21
+ this.element.addEventListener('click', () => {
22
22
  if (!PbAdvancedTable.isCollapsing) {
23
- const isExpanded =
24
- this.element.querySelector(UP_ARROW_SELECTOR).style.display ===
25
- "inline-block";
23
+ const isExpanded = this.element.querySelector(UP_ARROW_SELECTOR).style.display === 'inline-block'
26
24
  if (!isExpanded) {
27
- PbAdvancedTable.expandedRows.add(this.element.id);
25
+ PbAdvancedTable.expandedRows.add(this.element.id)
28
26
  } else {
29
- PbAdvancedTable.expandedRows.delete(this.element.id);
27
+ PbAdvancedTable.expandedRows.delete(this.element.id)
30
28
  }
31
- this.toggleElement(this.target);
32
29
  }
33
- });
34
-
35
- const nestedButtons = this.element
36
- .closest("table")
37
- .querySelectorAll("[data-advanced-table]");
38
- nestedButtons.forEach((button) => {
39
- button.addEventListener("click", () => {
40
- const isExpanded =
41
- button.querySelector(UP_ARROW_SELECTOR).style.display ===
42
- "inline-block";
43
- if (isExpanded) {
44
- PbAdvancedTable.expandedRows.add(button.id);
45
- } else {
46
- PbAdvancedTable.expandedRows.delete(button.id);
47
- }
48
- });
49
- });
30
+ this.toggleElement(this.target)
31
+ })
50
32
  }
51
33
 
52
- showElement(elements) {
53
- elements.forEach((elem) => {
54
- elem.style.display = "table-row";
55
- elem.classList.add("is-visible");
56
- const childRowsAll = this.element
57
- .closest("table")
58
- .querySelectorAll(
59
- `[data-advanced-table-content^="${elem.dataset.advancedTableContent}-"]`
60
- );
61
-
62
- childRowsAll.forEach((childRow) => {
63
- const dataContent = childRow.dataset.advancedTableContent;
64
-
65
- if (!dataContent) {
66
- return;
67
- }
68
-
69
- // Split the dataContent to get all ancestor IDs, check against simpleExpandedRows
70
- const ancestorIds = dataContent.split("-").slice(0, -1);
34
+ showElement(elem) {
35
+ const getHeight = () => {
36
+ elem.style.display = 'block'
37
+ const height = elem.scrollHeight + 'px'
38
+ elem.style.display = ''
39
+ return height
40
+ }
71
41
 
72
- const prefixedAncestorIds = ancestorIds.map(
73
- (id) => `${childRow.id}_${id}`
74
- );
75
- const allAncestorsExpanded = prefixedAncestorIds.every((id) =>
76
- PbAdvancedTable.expandedRows.has(id)
77
- );
42
+ const height = getHeight()
43
+ elem.classList.add('is-visible')
44
+ elem.style.height = height
45
+ elem.style.overflow = "hidden"
78
46
 
79
- if (allAncestorsExpanded) {
80
- childRow.style.display = "table-row";
81
- childRow.classList.add("is-visible");
82
- } else {
83
- childRow.style.display = "none";
84
- childRow.classList.remove("is-visible");
85
- }
86
- });
87
- });
47
+ window.setTimeout(() => {
48
+ elem.style.height = ''
49
+ elem.style.overflow = "visible"
50
+ }, 250)
88
51
  }
89
52
 
90
- hideElement(elements) {
91
- elements.forEach((elem) => {
92
- elem.style.display = "none";
93
- elem.classList.remove("is-visible");
53
+ hideElement(elem) {
54
+ elem.style.height = elem.scrollHeight + 'px'
94
55
 
95
- // Remove the row ID from expandedRows when this row is hidden
96
- if (PbAdvancedTable.expandedRows.has(elem.id)) {
97
- PbAdvancedTable.expandedRows.delete(elem.id);
98
- }
56
+ window.setTimeout(() => {
57
+ elem.style.height = '0'
58
+ elem.style.paddingTop = '0'
59
+ elem.style.paddingBottom = '0'
60
+ elem.style.overflow = "hidden"
61
+ }, 1)
99
62
 
100
- const childrenArray = elem.dataset.advancedTableContent.split("-");
101
- const currentDepth = parseInt(elem.dataset.rowDepth);
102
- if (childrenArray.length > currentDepth) {
103
- // Find the child rows corresponding to this parent row
104
- const childRows = this.element
105
- .closest("table")
106
- .querySelectorAll(
107
- `[data-advanced-table-content^="${elem.dataset.advancedTableContent}-"]`
108
- );
109
-
110
- childRows.forEach((childRow) => {
111
- childRow.style.display = "none";
112
- childRow.classList.remove("is-visible");
113
- });
114
- }
115
- });
63
+ window.setTimeout(() => {
64
+ elem.classList.remove('is-visible')
65
+ elem.style.overflow = ""
66
+ }, 200)
116
67
  }
117
68
 
118
- toggleElement(elements) {
119
- if (!elements.length) return;
120
-
121
- const isVisible = elements[0].classList.contains("is-visible");
122
- if (isVisible) {
123
- this.hideElement(elements);
124
- this.displayDownArrow();
125
- } else {
126
- this.showElement(elements);
127
- this.displayUpArrow();
69
+ toggleElement(elem) {
70
+ if (elem.classList.contains('is-visible')) {
71
+ this.hideElement(elem)
72
+ this.displayDownArrow()
73
+ return
128
74
  }
75
+
76
+ this.showElement(elem)
77
+ this.displayUpArrow()
129
78
  }
130
79
 
131
80
  displayDownArrow() {
132
- this.element.querySelector(DOWN_ARROW_SELECTOR).style.display =
133
- "inline-block";
134
- this.element.querySelector(UP_ARROW_SELECTOR).style.display = "none";
81
+ this.element.querySelector(DOWN_ARROW_SELECTOR).style.display = 'inline-block'
82
+ this.element.querySelector(UP_ARROW_SELECTOR).style.display = 'none'
135
83
  }
136
84
 
137
85
  displayUpArrow() {
138
- this.element.querySelector(UP_ARROW_SELECTOR).style.display =
139
- "inline-block";
140
- this.element.querySelector(DOWN_ARROW_SELECTOR).style.display = "none";
86
+ this.element.querySelector(UP_ARROW_SELECTOR).style.display = 'inline-block'
87
+ this.element.querySelector(DOWN_ARROW_SELECTOR).style.display = 'none'
141
88
  }
142
89
 
143
90
  static handleToggleAllHeaders(element) {
144
- const table = element.closest(".pb_table");
145
- const firstLevelButtons = table.querySelectorAll(
146
- ".pb_advanced_table_body > .pb_table_tr [data-advanced-table]"
147
- );
148
-
149
- const allExpanded = Array.from(firstLevelButtons).every(
150
- (button) =>
151
- button.querySelector(UP_ARROW_SELECTOR).style.display === "inline-block"
152
- );
153
-
154
- if (allExpanded) {
155
- firstLevelButtons.forEach((button) => {
156
- button.click();
157
- PbAdvancedTable.expandedRows.delete(button.id);
158
- });
91
+ const table = element.closest('.pb_table')
92
+ const firstLevelButtons = table.querySelectorAll('.pb_advanced_table_body > .pb_table_tr [data-advanced-table]')
93
+
94
+ const expandedRows = Array.from(firstLevelButtons).filter(button =>
95
+ button.querySelector(UP_ARROW_SELECTOR).style.display === 'inline-block'
96
+ )
97
+
98
+ if (expandedRows.length === firstLevelButtons.length) {
99
+ expandedRows.forEach(button => {
100
+ button.click()
101
+ })
102
+ this.expandedRows.clear()
159
103
  } else {
160
- firstLevelButtons.forEach((button) => {
161
- if (!PbAdvancedTable.expandedRows.has(button.id)) {
162
- button.click();
163
- PbAdvancedTable.expandedRows.add(button.id);
104
+ firstLevelButtons.forEach(button => {
105
+ if (!this.expandedRows.has(button.id)) {
106
+ button.click()
164
107
  }
165
- });
166
-
167
- PbAdvancedTable.expandedRows.forEach((rowId) => {
168
- const nestedButton = table.querySelector(
169
- `[data-advanced-table][id="${rowId}"]`
170
- );
171
- if (nestedButton && !firstLevelButtons.contains(nestedButton)) {
172
- nestedButton.click();
108
+ })
109
+ }
110
+ }
111
+ static handleToggleAllSubRows(element, rowDepth) {
112
+ const parentElement = element.closest(".toggle-content")
113
+ const subrowButtons = parentElement.querySelectorAll('.depth-sub-row-' + rowDepth + ' [data-advanced-table]')
114
+
115
+ const expandedSubRows = Array.from(subrowButtons).filter(button =>
116
+ button.querySelector(UP_ARROW_SELECTOR).style.display === 'inline-block'
117
+ )
118
+
119
+ if (expandedSubRows.length === subrowButtons.length) {
120
+ expandedSubRows.forEach(button => {
121
+ button.click()
122
+ })
123
+ } else {
124
+ subrowButtons.forEach(button => {
125
+ if (!this.expandedRows.has(button.id)) {
126
+ button.click()
173
127
  }
174
- });
128
+ })
175
129
  }
176
130
  }
177
-
178
- // static handleToggleAllSubRows(element, rowDepth) {}
179
131
  }
180
132
 
181
133
  window.expandAllRows = (element) => {
182
- PbAdvancedTable.handleToggleAllHeaders(element);
183
- };
184
- // window.expandAllSubRows = (element, rowDepth) => {
185
- // PbAdvancedTable.handleToggleAllSubRows(element, rowDepth);
186
- // };
134
+ PbAdvancedTable.handleToggleAllHeaders(element)
135
+ }
136
+ window.expandAllSubRows = (element, rowDepth) => {
137
+ PbAdvancedTable.handleToggleAllSubRows(element, rowDepth)
138
+ }
@@ -1,4 +1,4 @@
1
- <%= pb_content_tag(:tbody) do %>
1
+ <%= pb_content_tag do %>
2
2
  <% object.table_data.each do |row| %>
3
3
  <%= render_row_and_children(row, object.column_definitions, 0, false) %>
4
4
  <% end %>
@@ -17,69 +17,27 @@ module Playbook
17
17
  prop :collapsible_trail, type: Playbook::Props::Boolean,
18
18
  default: true
19
19
 
20
- def flatten_columns(columns)
21
- columns.flat_map do |col|
22
- if col[:columns]
23
- flatten_columns(col[:columns])
24
- elsif col[:accessor].present?
25
- if has_grouped_headers?
26
- col.merge(is_last_in_group: last_in_group?(columns, col))
27
- else
28
- col
29
- end
30
- end
31
- end.compact
32
- end
33
-
34
- def render_row_and_children(row, column_definitions, current_depth, first_parent_child, ancestor_ids = [], top_parent_id = nil)
35
- top_parent_id ||= row.object_id
36
- new_ancestor_ids = ancestor_ids + [row.object_id]
37
- leaf_columns = flatten_columns(column_definitions)
38
-
20
+ def render_row_and_children(row, column_definitions, current_depth, first_parent_child)
39
21
  output = ActiveSupport::SafeBuffer.new
40
22
  is_first_child_of_subrow = current_depth.positive? && first_parent_child && subrow_headers[current_depth - 1].present?
41
23
 
42
24
  output << pb_rails("advanced_table/table_subrow_header", props: { row: row, column_definitions: column_definitions, depth: current_depth, subrow_header: subrow_headers[current_depth - 1], collapsible_trail: collapsible_trail }) if is_first_child_of_subrow && enable_toggle_expansion == "all"
43
25
 
44
- # Pass only leaf_columns to table_row to account for multiple nested columns
45
- output << pb_rails("advanced_table/table_row", props: {
46
- id: id,
47
- row: row,
48
- column_definitions: leaf_columns,
49
- depth: current_depth,
50
- collapsible_trail: collapsible_trail,
51
- })
26
+ output << pb_rails("advanced_table/table_row", props: { id: id, row: row, column_definitions: column_definitions, depth: current_depth, collapsible_trail: collapsible_trail })
52
27
 
53
28
  if row[:children].present?
54
- output << row[:children].map do |child_row|
55
- is_first_child = row[:children].first == child_row
56
-
57
- child_output = render_row_and_children(child_row, column_definitions, current_depth + 1, is_first_child, new_ancestor_ids, top_parent_id)
58
-
59
- immediate_parent_id = row.object_id
60
- top_parent = top_parent_id
61
- # Combine ancestor_ids to build the content id
62
- data_content = new_ancestor_ids.join("-") + "-#{child_row.object_id}"
63
-
64
- child_output.to_str.sub("<tr", %(<tr class="toggle-content" data-top-parent="#{id}_#{top_parent}" data-row-depth="#{current_depth}" data-row-parent="#{id}_#{immediate_parent_id}" data-advanced-table-content="#{data_content}"))
65
- end.join.html_safe
29
+ output << content_tag(:div, class: "toggle-content", data: { advanced_table_content: row.object_id.to_s + id }) do
30
+ row[:children].map do |child_row|
31
+ render_row_and_children(child_row, column_definitions, current_depth + 1, row.children.first == child_row)
32
+ end.join.html_safe
33
+ end
66
34
  end
67
35
 
68
36
  output
69
37
  end
70
38
 
71
39
  def classname
72
- generate_classname("pb_advanced_table_body", separator: " ")
73
- end
74
-
75
- private
76
-
77
- def has_grouped_headers?
78
- column_definitions.any? { |col| col.key?(:columns) }
79
- end
80
-
81
- def last_in_group?(columns, current_col)
82
- columns.last[:accessor] == current_col[:accessor]
40
+ generate_classname("pb_advanced_table_body", "pb_table_tbody", separator: " ")
83
41
  end
84
42
  end
85
43
  end
@@ -1,21 +1,18 @@
1
- <%= pb_content_tag(:thead) do %>
2
- <% object.header_rows.each_with_index do |header_row, row_index| %>
3
- <%= pb_rails("table/table_row") do %>
4
- <% header_row.each_with_index do |cell, cell_index| %>
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>
1
+ <%= pb_content_tag do %>
2
+ <%= pb_rails("table/table_row", props: { tag: "div" }) do %>
3
+ <% object.column_definitions.each_with_index do |item, index| %>
4
+ <%= pb_rails("table/table_header", props: { tag: "div", id: item[:accessor], classname: object.th_classname, sort_menu: item[:sort_menu] }) do %>
5
+ <%= pb_rails("flex", props:{ align: "center", justify: index.zero? ? "start" : "end", text_align: "end" }) do %>
6
+ <% if index.zero? && (object.enable_toggle_expansion == "header" || object.enable_toggle_expansion == "all") %>
7
+ <button
8
+ class="gray-icon toggle-all-icon"
9
+ onclick="expandAllRows(this); event.preventDefault();">
10
+ <%= pb_rails("icon", props: { icon: "arrows-from-line", cursor: "pointer", fixed_width: true, padding_right: "xs" }) %>
11
+ </button>
12
+ <% end %>
13
+ <%= item[:label] %>
14
14
  <% end %>
15
- <%= cell[:label] %>
16
15
  <% end %>
16
+ <% end %>
17
17
  <% end %>
18
- <% end %>
19
- <% end %>
20
- <% end %>
21
18
  <% end %>
@@ -16,84 +16,6 @@ module Playbook
16
16
  def th_classname
17
17
  generate_classname("table-header-cells", separator: " ")
18
18
  end
19
-
20
- def header_rows
21
- wrapped_columns = wrap_leaf_columns(column_definitions)
22
-
23
- rows = []
24
- max_depth = compute_max_depth(wrapped_columns)
25
- max_depth.times { rows << [] }
26
- process_columns(wrapped_columns, rows, 0, max_depth)
27
- rows
28
- end
29
-
30
- private
31
-
32
- def compute_max_depth(columns)
33
- columns.map do |col|
34
- col[:columns] ? 1 + compute_max_depth(col[:columns]) : 1
35
- end.max || 1
36
- end
37
-
38
- def process_columns(columns, rows, current_depth, max_depth)
39
- total_columns = columns.size
40
- columns.each_with_index do |col, index|
41
- is_last = index == total_columns - 1
42
- if col[:columns]
43
- colspan = compute_leaf_columns(col[:columns])
44
- rows[current_depth] << {
45
- label: col[:label],
46
- colspan: colspan,
47
- is_last_in_group: is_last && current_depth.positive?,
48
- }
49
-
50
- process_columns(col[:columns], rows, current_depth + 1, max_depth)
51
- else
52
- colspan = 1
53
- rows[current_depth] << {
54
- label: col[:label],
55
- colspan: colspan,
56
- accessor: col[:accessor],
57
- sort_menu: col[:sort_menu],
58
- is_last_in_group: is_last && current_depth.positive?,
59
- }
60
- end
61
- end
62
- end
63
-
64
- def compute_leaf_columns(columns)
65
- columns.reduce(0) do |sum, col|
66
- col[:columns] ? sum + compute_leaf_columns(col[:columns]) : sum + 1
67
- end
68
- end
69
-
70
- def wrap_leaf_columns(column_definitions)
71
- max_depth = compute_max_depth(column_definitions)
72
-
73
- column_definitions.map do |col|
74
- if col.key?(:columns)
75
- {
76
- label: col[:label],
77
- columns: wrap_leaf_columns(col[:columns]),
78
- }
79
- else
80
- # For leaf columns, wrap with empty labels up to max depth to get proper structure
81
- wrap_leaf_column(col, max_depth)
82
- end
83
- end
84
- end
85
-
86
- def wrap_leaf_column(col, max_depth)
87
- wrapped = {
88
- accessor: col[:accessor],
89
- label: col[:label] || "",
90
- sort_menu: col[:sort_menu] || nil,
91
- }
92
- (max_depth - 1).times do
93
- wrapped = { label: "", columns: [wrapped] }
94
- end
95
- wrapped
96
- end
97
19
  end
98
20
  end
99
21
  end
@@ -1,7 +1,6 @@
1
- <%= pb_content_tag(:tr) do %>
1
+ <%= pb_content_tag do %>
2
2
  <% object.column_definitions.each_with_index do |column, index| %>
3
- <% next unless column[:accessor].present? %>
4
- <%= pb_rails("table/table_cell", props: { classname:object.td_classname(column)}) do %>
3
+ <%= pb_rails("table/table_cell", props: { tag:"div", classname:object.td_classname}) do %>
5
4
  <%= pb_rails("flex", props:{ align: "center", justify: index.zero? ? "start" : "end" }) do %>
6
5
  <% if collapsible_trail && index.zero? %>
7
6
  <% (1..depth).each do |i| %>
@@ -14,7 +13,7 @@
14
13
  <div style="padding-left: <%= depth * 1.25 %>em">
15
14
  <%= pb_rails("flex", props:{align: "center", column_gap: "xs"}) do %>
16
15
  <% if index.zero? && object.row[:children].present? %>
17
- <button id="<%= "#{object.id}_#{object.row.object_id}" %>" class="gray-icon expand-toggle-icon" data-advanced-table="true" >
16
+ <button id="<%= object.row.object_id.to_s + object.id %>" class="gray-icon expand-toggle-icon" data-advanced-table="true" >
18
17
  <%= pb_rails("icon", props: { id: "advanced-table_open_icon", icon: "circle-play", cursor: "pointer" }) %>
19
18
  <%= pb_rails("icon", props: { id: "advanced-table_close_icon", display: "none", icon: "circle-play", cursor: "pointer", rotation: 90 }) %>
20
19
  </button>