playbook_ui 14.12.0.pre.rc.7 → 14.12.0.pre.rc.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fbb3bb09ce2cb5adfe6021117dfc7f94c9ff26aa30f9c775f65266892fd34f70
4
- data.tar.gz: d05ecfa187943ae9320fe32fd460a1cb8895ed7d055aa79a28c378ab2d708c94
3
+ metadata.gz: b48da16cdc4f23668a076a6694631cbe8940e2b4c026aaa234d85a4c0bdeacf3
4
+ data.tar.gz: 738247f1ad99b56cceae7984ff00f49cd940dd8b054fbb3612494b1e75d15d58
5
5
  SHA512:
6
- metadata.gz: 9fbb9f00d3724699dc6441b979a4925b88bc5e7f968d9177586e845d3be818a50658d1679e1ba99fb03fb5173b53fa51911dd8b9ad9cc63c5046decbc3ab58e3
7
- data.tar.gz: c19e0a21180bd59178227d2a91310b23897fb7b5333fbe2a697783506b0ce03c20d864c1c861e0deac487e69586cf7980835ace5a7e977661c4102493a2c429c
6
+ metadata.gz: 864d8ae23e38e77a43773ac014f4c2da66039cb5b61ecb952bdb66db622f92d42ccbc6cc8ca9dbd0c4c9a291124705e1042fb2db2f3dd563cf3b58a813898cdf
7
+ data.tar.gz: f70b0254cd247f952dd9ddf651cc8a3262554b95dc6a3891771685c16dc51d72a5b5c57c3e536378afbc1720c5095abc822ad8c8b59062544fbe2567ec4111f6
@@ -2,7 +2,6 @@ import React, { useEffect } from 'react'
2
2
  import classnames from 'classnames'
3
3
  import { buildAriaProps, buildDataProps, buildHtmlProps } from '../utilities/props'
4
4
  import { globalProps, GlobalProps, globalInlineProps } from '../utilities/globalProps'
5
- import PbTable from '.'
6
5
  import {
7
6
  TableHead,
8
7
  TableHeader,
@@ -10,6 +9,7 @@ import {
10
9
  TableRow,
11
10
  TableCell,
12
11
  } from "./subcomponents";
12
+ import { addDataTitle } from './utilities/addDataTitle'
13
13
 
14
14
  type TableProps = {
15
15
  aria?: { [key: string]: string },
@@ -196,8 +196,7 @@ const Table = (props: TableProps): React.ReactElement => {
196
196
  }, [stickyRightColumn]);
197
197
 
198
198
  useEffect(() => {
199
- const instance = new PbTable()
200
- instance.connect()
199
+ addDataTitle()
201
200
  }, [])
202
201
 
203
202
  return (
@@ -0,0 +1,74 @@
1
+ <%= pb_rails("table", props: { size: "md", responsive: "scroll", sticky_left_column: ["a"], sticky_right_column: ["b"] }) do %>
2
+ <thead>
3
+ <tr>
4
+ <th id="a">Column 1</th>
5
+ <th>Column 2</th>
6
+ <th>Column 3</th>
7
+ <th>Column 4</th>
8
+ <th>Column 5</th>
9
+ <th>Column 6</th>
10
+ <th>Column 7</th>
11
+ <th>Column 8</th>
12
+ <th>Column 9</th>
13
+ <th>Column 10</th>
14
+ <th>Column 11</th>
15
+ <th>Column 12</th>
16
+ <th>Column 13</th>
17
+ <th>Column 14</th>
18
+ <th id="b">Column 15</th>
19
+ </tr>
20
+ </thead>
21
+ <tbody>
22
+ <tr>
23
+ <td id="a">Value 1</td>
24
+ <td>Value 2</td>
25
+ <td>Value 3</td>
26
+ <td>Value 4</td>
27
+ <td>Value 5</td>
28
+ <td>Value 6</td>
29
+ <td>Value 7</td>
30
+ <td>Value 8</td>
31
+ <td>Value 9</td>
32
+ <td>Value 10</td>
33
+ <td>Value 11</td>
34
+ <td>Value 12</td>
35
+ <td>Value 13</td>
36
+ <td>Value 14</td>
37
+ <td id="b">Value 15</td>
38
+ </tr>
39
+ <tr>
40
+ <td id="a">Value 1</td>
41
+ <td>Value 2</td>
42
+ <td>Value 3</td>
43
+ <td>Value 4</td>
44
+ <td>Value 5</td>
45
+ <td>Value 6</td>
46
+ <td>Value 7</td>
47
+ <td>Value 8</td>
48
+ <td>Value 9</td>
49
+ <td>Value 10</td>
50
+ <td>Value 11</td>
51
+ <td>Value 12</td>
52
+ <td>Value 13</td>
53
+ <td>Value 14</td>
54
+ <td id="b">Value 15</td>
55
+ </tr>
56
+ <tr>
57
+ <td id="a">Value 1</td>
58
+ <td>Value 2</td>
59
+ <td>Value 3</td>
60
+ <td>Value 4</td>
61
+ <td>Value 5</td>
62
+ <td>Value 6</td>
63
+ <td>Value 7</td>
64
+ <td>Value 8</td>
65
+ <td>Value 9</td>
66
+ <td>Value 10</td>
67
+ <td>Value 11</td>
68
+ <td>Value 12</td>
69
+ <td>Value 13</td>
70
+ <td>Value 14</td>
71
+ <td id="b">Value 15</td>
72
+ </tr>
73
+ </tbody>
74
+ <% end %>
@@ -0,0 +1,3 @@
1
+ The `sticky_left_column` and `sticky_right_column` props can be used together on the same table as needed.
2
+
3
+ Please ensure that unique ids are used for all columns across multiple tables. Using the same columns ids on multiple tables can lead to issues when using props.
@@ -1,3 +1,3 @@
1
- The `stickyLeftColumn` prop expects an array of the column ids you want to be sticky. Make sure to add the corresponding id to the `<th>` and `<td>`.
1
+ The `sticky_left_column` prop expects an array of the column ids you want to be sticky. Make sure to add the corresponding id to the `<th>` and `<td>`.
2
2
 
3
- Please ensure that unique ids are used for all columns across multiple tables. Using the same columns ids on multiple tables can lead to issues when using the `stickyLeftColumn`.
3
+ Please ensure that unique ids are used for all columns across multiple tables. Using the same columns ids on multiple tables can lead to issues when using the `sticky_left_column`.
@@ -0,0 +1,74 @@
1
+ <%= pb_rails("table", props: { size: "md", responsive: "scroll", sticky_right_column: ["13", "14", "15"] }) do %>
2
+ <thead>
3
+ <tr>
4
+ <th>Column 1</th>
5
+ <th>Column 2</th>
6
+ <th>Column 3</th>
7
+ <th>Column 4</th>
8
+ <th>Column 5</th>
9
+ <th>Column 6</th>
10
+ <th>Column 7</th>
11
+ <th>Column 8</th>
12
+ <th>Column 9</th>
13
+ <th>Column 10</th>
14
+ <th>Column 11</th>
15
+ <th>Column 12</th>
16
+ <th id="13">Column 13</th>
17
+ <th id="14">Column 14</th>
18
+ <th id="15">Column 15</th>
19
+ </tr>
20
+ </thead>
21
+ <tbody>
22
+ <tr>
23
+ <td>Value 1</td>
24
+ <td>Value 2</td>
25
+ <td>Value 3</td>
26
+ <td>Value 4</td>
27
+ <td>Value 5</td>
28
+ <td>Value 6</td>
29
+ <td>Value 7</td>
30
+ <td>Value 8</td>
31
+ <td>Value 9</td>
32
+ <td>Value 10</td>
33
+ <td>Value 11</td>
34
+ <td>Value 12</td>
35
+ <td id="13">Value 13</td>
36
+ <td id="14">Value 14</td>
37
+ <td id="15">Value 15</td>
38
+ </tr>
39
+ <tr>
40
+ <td>Value 1</td>
41
+ <td>Value 2</td>
42
+ <td>Value 3</td>
43
+ <td>Value 4</td>
44
+ <td>Value 5</td>
45
+ <td>Value 6</td>
46
+ <td>Value 7</td>
47
+ <td>Value 8</td>
48
+ <td>Value 9</td>
49
+ <td>Value 10</td>
50
+ <td>Value 11</td>
51
+ <td>Value 12</td>
52
+ <td id="13">Value 13</td>
53
+ <td id="14">Value 14</td>
54
+ <td id="15">Value 15</td>
55
+ </tr>
56
+ <tr>
57
+ <td>Value 1</td>
58
+ <td>Value 2</td>
59
+ <td>Value 3</td>
60
+ <td>Value 4</td>
61
+ <td>Value 5</td>
62
+ <td>Value 6</td>
63
+ <td>Value 7</td>
64
+ <td>Value 8</td>
65
+ <td>Value 9</td>
66
+ <td>Value 10</td>
67
+ <td>Value 11</td>
68
+ <td>Value 12</td>
69
+ <td id="13">Value 13</td>
70
+ <td id="14">Value 14</td>
71
+ <td id="15">Value 15</td>
72
+ </tr>
73
+ </tbody>
74
+ <% end %>
@@ -0,0 +1,3 @@
1
+ The `sticky_right_column` prop works in the same way as the above `sticky_left_column` prop. It expects an array of the column ids you want to be sticky. Make sure to add the corresponding id to the `<th>` and `<td>`.
2
+
3
+ Please ensure that unique ids are used for all columns across multiple tables. Using the same columns ids on multiple tables can lead to issues when using the `sticky_right_column` prop.
@@ -5,6 +5,8 @@ examples:
5
5
  - table_lg: Large
6
6
  - table_sticky: Sticky Header
7
7
  - table_sticky_left_columns: Sticky Left Column
8
+ - table_sticky_right_columns: Sticky Right Column
9
+ - table_sticky_columns: Sticky Left and Right Columns
8
10
  - table_header: Table Header
9
11
  - table_alignment_row_rails: Row Alignment
10
12
  - table_alignment_column_rails: Cell Alignment
@@ -1,73 +1,67 @@
1
1
  import PbEnhancedElement from '../pb_enhanced_element'
2
2
 
3
+ const TABLE_WRAPPER_SELECTOR = "[data-pb-table-wrapper]";
4
+
3
5
  export default class PbTable extends PbEnhancedElement {
4
- private stickyLeftColumns: string[] = [];
5
- private handleStickyLeftColumnsRef: () => void;
6
+ stickyLeftColumns: string[] = [];
7
+ stickyRightColumns: string[] = [];
8
+ stickyRightColumnsReversed: string[] = [];
6
9
 
7
10
  static get selector(): string {
8
- return '.table-responsive-collapse'
11
+ return TABLE_WRAPPER_SELECTOR;
9
12
  }
10
13
 
11
- connect(): void {
12
- const tables = document.querySelectorAll('.table-responsive-collapse');
13
- // Each Table
14
- [].forEach.call(tables, (table: HTMLTableElement) => {
15
- // Header Titles
14
+ connect() {
15
+ if (this.element.classList.contains('table-responsive-collapse')) {
16
16
  const headers: string[] = [];
17
- [].forEach.call(table.querySelectorAll('th'), (header: HTMLTableCellElement) => {
17
+
18
+ [].forEach.call(this.element.querySelectorAll('th'), (header: HTMLTableCellElement) => {
18
19
  const colSpan = header.colSpan
19
20
  for (let i = 0; i < colSpan; i++) {
20
21
  headers.push(header.textContent.replace(/\r?\n|\r/, ''));
21
22
  }
22
23
  });
23
- // for each row in tbody
24
- [].forEach.call(table.querySelectorAll('tbody tr'), (row: HTMLTableRowElement) => {
25
- // for each cell
24
+
25
+ [].forEach.call(this.element.querySelectorAll('tbody tr'), (row: HTMLTableRowElement) => {
26
26
  [].forEach.call(row.cells, (cell: HTMLTableCellElement, headerIndex: number) => {
27
- // apply the attribute
28
27
  cell.setAttribute('data-title', headers[headerIndex])
29
28
  })
30
29
  })
31
- });
30
+ }
32
31
 
33
- // New sticky columns logic
34
32
  this.initStickyLeftColumns();
33
+ this.initStickyRightColumns();
35
34
  }
36
35
 
37
- private initStickyLeftColumns(): void {
38
- // Find tables with sticky-left-column class
39
- const tables = document.querySelectorAll('.sticky-left-column');
36
+ initStickyLeftColumns() {
37
+ const table = this.element.querySelector('.sticky-left-column');
40
38
 
41
- tables.forEach((table) => {
42
- // Extract sticky left column IDs by looking at the component's class
39
+ if (table) {
43
40
  const classList = Array.from(table.classList);
41
+ const stickyColumnClass = classList.find(cls => cls.startsWith('sticky-left-columns-ids-'));
44
42
 
45
- // Look for classes in the format sticky-left-column-{ids}
46
- const stickyColumnClass = classList.find(cls => cls.startsWith('sticky-columns-'));
47
43
  if (stickyColumnClass) {
48
- // Extract the IDs from the class name
49
44
  this.stickyLeftColumns = stickyColumnClass
50
- .replace('sticky-columns-', '')
51
- .split('-');
45
+ .replace('sticky-left-columns-ids-', '')
46
+ .split('-');
52
47
 
53
48
  if (this.stickyLeftColumns.length > 0) {
54
49
  setTimeout(() => {
55
- this.handleStickyLeftColumnsRef = this.handleStickyLeftColumns.bind(this);
56
50
  this.handleStickyLeftColumns();
57
- window.addEventListener('resize', this.handleStickyLeftColumnsRef);
51
+ window.addEventListener('resize', () => this.handleStickyLeftColumns());
58
52
  }, 10);
59
53
  }
60
54
  }
61
- });
55
+ }
62
56
  }
63
57
 
64
- private handleStickyLeftColumns(): void {
58
+ handleStickyLeftColumns() {
65
59
  let accumulatedWidth = 0;
66
60
 
67
61
  this.stickyLeftColumns.forEach((colId, index) => {
68
62
  const isLastColumn = index === this.stickyLeftColumns.length - 1;
69
- const header = document.querySelector(`th[id="${colId}"]`);
70
- const cells = document.querySelectorAll(`td[id="${colId}"]`);
63
+ const header = this.element.querySelector(`th[id="${colId}"]`);
64
+ const cells = this.element.querySelectorAll(`td[id="${colId}"]`);
71
65
 
72
66
  if (header) {
73
67
  header.classList.add('sticky');
@@ -99,10 +93,75 @@ export default class PbTable extends PbEnhancedElement {
99
93
  });
100
94
  }
101
95
 
96
+ initStickyRightColumns() {
97
+ const table = this.element.querySelector('.sticky-right-column');
98
+
99
+ if (table) {
100
+ const classList = Array.from(table.classList);
101
+ const stickyColumnClass = classList.find(cls => cls.startsWith('sticky-right-columns-ids-'));
102
+
103
+ if (stickyColumnClass) {
104
+ this.stickyRightColumns = stickyColumnClass
105
+ .replace('sticky-right-columns-ids-', '')
106
+ .split('-');
107
+ this.stickyRightColumnsReversed = this.stickyRightColumns.reverse();
108
+
109
+ if (this.stickyRightColumns.length > 0) {
110
+ setTimeout(() => {
111
+ this.handleStickyRightColumns();
112
+ window.addEventListener('resize', () => this.handleStickyRightColumns());
113
+ }, 10);
114
+ }
115
+ }
116
+ }
117
+ }
118
+
119
+ handleStickyRightColumns() {
120
+ let accumulatedWidth = 0;
121
+
122
+ this.stickyRightColumnsReversed.forEach((colId, index) => {
123
+ const isLastColumn = index === this.stickyRightColumns.length - 1;
124
+ const header = this.element.querySelector(`th[id="${colId}"]`);
125
+ const cells = this.element.querySelectorAll(`td[id="${colId}"]`);
126
+
127
+ if (header) {
128
+ header.classList.add('sticky');
129
+ (header as HTMLElement).style.right = `${accumulatedWidth}px`;
130
+
131
+ if (!isLastColumn) {
132
+ header.classList.add('with-border-left');
133
+ header.classList.remove('sticky-right-shadow');
134
+ } else {
135
+ header.classList.remove('with-border-right');
136
+ header.classList.add('sticky-right-shadow');
137
+ }
138
+
139
+ accumulatedWidth += (header as HTMLElement).offsetWidth;
140
+ }
141
+
142
+ cells.forEach((cell) => {
143
+ cell.classList.add('sticky');
144
+ (cell as HTMLElement).style.right = `${accumulatedWidth - (header as HTMLElement).offsetWidth}px`;
145
+
146
+ if (!isLastColumn) {
147
+ cell.classList.add('with-border-left');
148
+ cell.classList.remove('sticky-right-shadow');
149
+ } else {
150
+ cell.classList.remove('with-border-left');
151
+ cell.classList.add('sticky-right-shadow');
152
+ }
153
+ });
154
+ });
155
+ }
156
+
102
157
  // Cleanup method to remove event listener
103
- disconnect(): void {
104
- if (this.handleStickyLeftColumnsRef) {
105
- window.removeEventListener('resize', this.handleStickyLeftColumnsRef);
158
+ disconnect() {
159
+ if (this.stickyLeftColumns.length > 0) {
160
+ window.removeEventListener('resize', () => this.handleStickyLeftColumns());
161
+ }
162
+
163
+ if (this.stickyRightColumns.length > 0) {
164
+ window.removeEventListener('resize', () => this.handleStickyRightColumns());
106
165
  }
107
166
  }
108
167
  }
@@ -4,7 +4,7 @@
4
4
  <% responsive_class = nil %>
5
5
  <% end %>
6
6
 
7
- <%= content_tag(:div, class: responsive_class) do %>
7
+ <%= content_tag(:div, class: responsive_class, 'data-pb-table-wrapper' => true) do %>
8
8
  <% if object.tag == "table" %>
9
9
  <%= content_tag(:table,
10
10
  aria: object.aria,
@@ -25,6 +25,8 @@ module Playbook
25
25
  default: false
26
26
  prop :sticky_left_column, type: Playbook::Props::Array,
27
27
  default: []
28
+ prop :sticky_right_column, type: Playbook::Props::Array,
29
+ default: []
28
30
  prop :vertical_border, type: Playbook::Props::Boolean,
29
31
  default: false
30
32
  prop :striped, type: Playbook::Props::Boolean,
@@ -40,7 +42,7 @@ module Playbook
40
42
  generate_classname(
41
43
  "pb_table", "table-#{size}", single_line_class, dark_class,
42
44
  disable_hover_class, container_class, data_table_class, sticky_class, sticky_left_column_class,
43
- collapse_class, vertical_border_class, striped_class, outer_padding_class,
45
+ sticky_right_column_class, collapse_class, vertical_border_class, striped_class, outer_padding_class,
44
46
  "table-responsive-#{responsive}", separator: " "
45
47
  )
46
48
  end
@@ -83,7 +85,7 @@ module Playbook
83
85
  if sticky_left_column.empty?
84
86
  nil
85
87
  else
86
- sticky_col_classname = "sticky-left-column sticky-columns"
88
+ sticky_col_classname = "sticky-left-column sticky-left-columns-ids"
87
89
  sticky_left_column.each do |id|
88
90
  sticky_col_classname += "-#{id}"
89
91
  end
@@ -92,6 +94,19 @@ module Playbook
92
94
  end
93
95
  end
94
96
 
97
+ def sticky_right_column_class
98
+ if sticky_right_column.empty?
99
+ nil
100
+ else
101
+ sticky_col_classname = "sticky-right-column sticky-right-columns-ids"
102
+ sticky_right_column.each do |id|
103
+ sticky_col_classname += "-#{id}"
104
+ end
105
+
106
+ sticky_col_classname
107
+ end
108
+ end
109
+
95
110
  def striped_class
96
111
  striped ? "striped" : nil
97
112
  end
@@ -0,0 +1,22 @@
1
+ export const addDataTitle = () => {
2
+ const tables = document.querySelectorAll('.table-responsive-collapse');
3
+ // Each Table
4
+ [].forEach.call(tables, (table: HTMLTableElement) => {
5
+ // Header Titles
6
+ const headers: string[] = [];
7
+ [].forEach.call(table.querySelectorAll('th'), (header: HTMLTableCellElement) => {
8
+ const colSpan = header.colSpan
9
+ for (let i = 0; i < colSpan; i++) {
10
+ headers.push(header.textContent.replace(/\r?\n|\r/, ''));
11
+ }
12
+ });
13
+ // for each row in tbody
14
+ [].forEach.call(table.querySelectorAll('tbody tr'), (row: HTMLTableRowElement) => {
15
+ // for each cell
16
+ [].forEach.call(row.cells, (cell: HTMLTableCellElement, headerIndex: number) => {
17
+ // apply the attribute
18
+ cell.setAttribute('data-title', headers[headerIndex])
19
+ })
20
+ })
21
+ });
22
+ }