playbook_ui 14.11.1.pre.alpha.PLAY1750pbcontenttagkitbutton5341 → 14.11.1.pre.alpha.PLAY1751pbcontenttagpt25529
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.
- checksums.yaml +4 -4
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_sort_control.md +2 -2
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default_date.md +1 -1
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_list_rails.html.erb +3 -9
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_list_rails.md +5 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_selectable_list_rails.html.erb +38 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_selectable_list_rails.md +3 -0
- data/app/pb_kits/playbook/pb_draggable/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_subtle_variant.md +1 -1
- data/app/pb_kits/playbook/pb_file_upload/file_upload.html.erb +1 -6
- data/app/pb_kits/playbook/pb_filter/filter.html.erb +1 -5
- data/app/pb_kits/playbook/pb_form_group/form_group.html.erb +1 -6
- data/app/pb_kits/playbook/pb_form_pill/form_pill.html.erb +1 -1
- data/app/pb_kits/playbook/pb_list/item.html.erb +30 -8
- data/app/pb_kits/playbook/pb_list/item.rb +7 -0
- data/app/pb_kits/playbook/pb_list/list.html.erb +31 -11
- data/app/pb_kits/playbook/pb_list/list.rb +4 -0
- data/app/pb_kits/playbook/pb_loading_inline/_loading_inline.tsx +6 -1
- data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +30 -12
- data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_format.html.erb +15 -0
- data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_format.jsx +24 -0
- data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_format.md +1 -0
- data/app/pb_kits/playbook/pb_phone_number_input/docs/example.yml +3 -1
- data/app/pb_kits/playbook/pb_phone_number_input/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.rb +3 -0
- data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.test.js +20 -1
- data/app/pb_kits/playbook/pb_radio/_radio.scss +12 -8
- data/app/pb_kits/playbook/pb_radio/docs/_radio_custom_children.jsx +8 -3
- data/app/pb_kits/playbook/pb_selectable_list/selectable_list.html.erb +17 -3
- data/app/pb_kits/playbook/pb_selectable_list/selectable_list.rb +3 -0
- data/app/pb_kits/playbook/pb_selectable_list/selectable_list_item.html.erb +11 -4
- data/app/pb_kits/playbook/pb_selectable_list/selectable_list_item.rb +3 -0
- data/app/pb_kits/playbook/pb_table/_table.tsx +2 -3
- data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns.html.erb +74 -0
- data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns_rails.md +3 -0
- data/app/pb_kits/playbook/pb_table/docs/_table_sticky_left_columns_rails.md +2 -2
- data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns.html.erb +74 -0
- data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns_rails.md +3 -0
- data/app/pb_kits/playbook/pb_table/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_table/index.ts +93 -34
- data/app/pb_kits/playbook/pb_table/styles/_scroll.scss +6 -5
- data/app/pb_kits/playbook/pb_table/table.html.erb +1 -1
- data/app/pb_kits/playbook/pb_table/table.rb +17 -2
- data/app/pb_kits/playbook/pb_table/utilities/addDataTitle.ts +22 -0
- data/app/pb_kits/playbook/pb_timeline/_timeline.scss +30 -30
- data/dist/chunks/{_typeahead-BNULwihE.js → _typeahead-TN5aDUj9.js} +2 -2
- data/dist/chunks/_weekday_stacked-BcnpLG66.js +45 -0
- data/dist/chunks/{lib-B7sgJtGS.js → lib-OFT985dg.js} +2 -2
- data/dist/chunks/{pb_form_validation-C5Cc0-1v.js → pb_form_validation-CrsXd1-Y.js} +1 -1
- data/dist/chunks/vendor.js +1 -1
- data/dist/playbook-doc.js +1 -1
- data/dist/playbook-rails-react-bindings.js +1 -1
- data/dist/playbook-rails.js +1 -1
- data/dist/playbook.css +1 -1
- data/lib/playbook/version.rb +1 -1
- metadata +34 -9
- data/dist/chunks/_weekday_stacked-BKWemDAe.js +0 -45
@@ -4,6 +4,13 @@
|
|
4
4
|
data: object.data,
|
5
5
|
id: object.id,
|
6
6
|
**combined_html_options) do %>
|
7
|
+
<% if object.drag_id && object.drag_handle %>
|
8
|
+
<span style="vertical-align: middle;">
|
9
|
+
<%= pb_rails("body") do %>
|
10
|
+
<svg width="auto" height="auto" viewBox="0 0 31 25" fill="none" xmlns="http://www.w3.org/2000/svg" color="currentColor" class="pb_custom_icon svg-inline--fa vertical_align_middle svg_fw"><path d="M12.904 6.355a1.48 1.48 0 01-1.5-1.5c0-.796.656-1.5 1.5-1.5.797 0 1.5.704 1.5 1.5 0 .844-.703 1.5-1.5 1.5zm0 7.5a1.48 1.48 0 01-1.5-1.5c0-.796.656-1.5 1.5-1.5.797 0 1.5.704 1.5 1.5 0 .844-.703 1.5-1.5 1.5zm1.5 6c0 .844-.703 1.5-1.5 1.5a1.48 1.48 0 01-1.5-1.5c0-.796.656-1.5 1.5-1.5.797 0 1.5.704 1.5 1.5zm4.5-13.5a1.48 1.48 0 01-1.5-1.5c0-.796.657-1.5 1.5-1.5.797 0 1.5.704 1.5 1.5 0 .844-.703 1.5-1.5 1.5zm1.5 6c0 .844-.703 1.5-1.5 1.5a1.48 1.48 0 01-1.5-1.5c0-.796.657-1.5 1.5-1.5.797 0 1.5.704 1.5 1.5zm-1.5 9a1.48 1.48 0 01-1.5-1.5c0-.796.657-1.5 1.5-1.5.797 0 1.5.704 1.5 1.5 0 .844-.703 1.5-1.5 1.5z" fill="#242B42"></path></svg>
|
11
|
+
<% end %>
|
12
|
+
</span>
|
13
|
+
<% end %>
|
7
14
|
<% if object.variant == "radio"%>
|
8
15
|
<%= pb_rails("radio", props: { text: object.text, checked: object.checked, input_options: object.input_options } ) %>
|
9
16
|
<% if content.present? %>
|
@@ -19,10 +26,10 @@
|
|
19
26
|
<% if object.variant == "checkbox"%>
|
20
27
|
<script>
|
21
28
|
var checkboxElement = document.querySelector("#<%=object.id%> input[type=checkbox]")
|
22
|
-
|
29
|
+
|
23
30
|
checkboxElement.addEventListener("change", (evt) => {
|
24
31
|
var listItemElement = document.querySelector("#<%=object.id%>")
|
25
|
-
|
32
|
+
|
26
33
|
if (evt.target.checked) {
|
27
34
|
listItemElement.classList.add("checked_item");
|
28
35
|
} else {
|
@@ -34,9 +41,9 @@
|
|
34
41
|
<script>
|
35
42
|
var radioElement = document.querySelector("#<%=object.id%> input[type=radio]")
|
36
43
|
|
37
|
-
radioElement.addEventListener("change", () => {
|
44
|
+
radioElement.addEventListener("change", () => {
|
38
45
|
var radios = radioElement.closest("ul").querySelectorAll("input[type=radio]")
|
39
|
-
|
46
|
+
|
40
47
|
radios.forEach((radio) => {
|
41
48
|
if (radio.checked) {
|
42
49
|
radio.closest("li").classList.add("checked_item");
|
@@ -6,6 +6,9 @@ module Playbook
|
|
6
6
|
prop :tabindex
|
7
7
|
prop :checked, type: Playbook::Props::Boolean,
|
8
8
|
default: false
|
9
|
+
prop :drag_handle, type: Playbook::Props::Boolean,
|
10
|
+
default: true
|
11
|
+
prop :drag_id, type: Playbook::Props::String
|
9
12
|
prop :name, type: Playbook::Props::String
|
10
13
|
prop :text, type: Playbook::Props::String
|
11
14
|
prop :value, type: Playbook::Props::String
|
@@ -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
|
-
|
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 %>
|
@@ -1,3 +1,3 @@
|
|
1
|
-
The `
|
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 `
|
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
|
-
|
5
|
-
|
6
|
+
stickyLeftColumns: string[] = [];
|
7
|
+
stickyRightColumns: string[] = [];
|
8
|
+
stickyRightColumnsReversed: string[] = [];
|
6
9
|
|
7
10
|
static get selector(): string {
|
8
|
-
return
|
11
|
+
return TABLE_WRAPPER_SELECTOR;
|
9
12
|
}
|
10
13
|
|
11
|
-
connect()
|
12
|
-
|
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
|
-
|
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
|
-
|
24
|
-
[].forEach.call(
|
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
|
-
|
38
|
-
|
39
|
-
const tables = document.querySelectorAll('.sticky-left-column');
|
36
|
+
initStickyLeftColumns() {
|
37
|
+
const table = this.element.querySelector('.sticky-left-column');
|
40
38
|
|
41
|
-
|
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
|
-
|
51
|
-
|
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.
|
51
|
+
window.addEventListener('resize', () => this.handleStickyLeftColumns());
|
58
52
|
}, 10);
|
59
53
|
}
|
60
54
|
}
|
61
|
-
}
|
55
|
+
}
|
62
56
|
}
|
63
57
|
|
64
|
-
|
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 =
|
70
|
-
const cells =
|
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()
|
104
|
-
if (this.
|
105
|
-
window.removeEventListener('resize', this.
|
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
|
}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
@import "../../tokens/screen_sizes";
|
2
|
+
@import "../../tokens/border_radius";
|
2
3
|
|
3
4
|
.table-responsive-scroll {
|
4
|
-
display: block;
|
5
5
|
overflow-x: scroll;
|
6
6
|
|
7
7
|
// hides duplicate scroll bar for those that see two (byproduct of repeated table-responsive-scroll class
|
@@ -27,11 +27,12 @@
|
|
27
27
|
// Responsive Styles
|
28
28
|
@media (max-width: 1600px) {
|
29
29
|
&[class*="table-responsive-scroll"] {
|
30
|
-
|
31
|
-
|
30
|
+
&:has(> table.table-card) {
|
31
|
+
border-radius: $border_rad_light;
|
32
|
+
box-shadow: 1px 0 0 0px $border_light,
|
32
33
|
-1px 0 0 0px $border_light
|
33
|
-
|
34
|
-
|
34
|
+
}
|
35
|
+
}
|
35
36
|
&[class^=pb_table].table-sm.table-card thead tr th:first-child,
|
36
37
|
&[class^=pb_table].table-sm:not(.no-hover).table-card tbody tr td:first-child {
|
37
38
|
border-left-width: 0px;
|
@@ -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
|
+
}
|