playbook_ui 14.11.1.pre.alpha.PLAY1750pbcontenttagkitbutton5341 → 14.11.1.pre.alpha.PLAY1751pbcontenttagpt25529

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_sort_control.md +2 -2
  3. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default_date.md +1 -1
  4. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_list_rails.html.erb +3 -9
  5. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_list_rails.md +5 -0
  6. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_selectable_list_rails.html.erb +38 -0
  7. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_selectable_list_rails.md +3 -0
  8. data/app/pb_kits/playbook/pb_draggable/docs/example.yml +1 -0
  9. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_subtle_variant.md +1 -1
  10. data/app/pb_kits/playbook/pb_file_upload/file_upload.html.erb +1 -6
  11. data/app/pb_kits/playbook/pb_filter/filter.html.erb +1 -5
  12. data/app/pb_kits/playbook/pb_form_group/form_group.html.erb +1 -6
  13. data/app/pb_kits/playbook/pb_form_pill/form_pill.html.erb +1 -1
  14. data/app/pb_kits/playbook/pb_list/item.html.erb +30 -8
  15. data/app/pb_kits/playbook/pb_list/item.rb +7 -0
  16. data/app/pb_kits/playbook/pb_list/list.html.erb +31 -11
  17. data/app/pb_kits/playbook/pb_list/list.rb +4 -0
  18. data/app/pb_kits/playbook/pb_loading_inline/_loading_inline.tsx +6 -1
  19. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +30 -12
  20. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_format.html.erb +15 -0
  21. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_format.jsx +24 -0
  22. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_format.md +1 -0
  23. data/app/pb_kits/playbook/pb_phone_number_input/docs/example.yml +3 -1
  24. data/app/pb_kits/playbook/pb_phone_number_input/docs/index.js +1 -0
  25. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.rb +3 -0
  26. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.test.js +20 -1
  27. data/app/pb_kits/playbook/pb_radio/_radio.scss +12 -8
  28. data/app/pb_kits/playbook/pb_radio/docs/_radio_custom_children.jsx +8 -3
  29. data/app/pb_kits/playbook/pb_selectable_list/selectable_list.html.erb +17 -3
  30. data/app/pb_kits/playbook/pb_selectable_list/selectable_list.rb +3 -0
  31. data/app/pb_kits/playbook/pb_selectable_list/selectable_list_item.html.erb +11 -4
  32. data/app/pb_kits/playbook/pb_selectable_list/selectable_list_item.rb +3 -0
  33. data/app/pb_kits/playbook/pb_table/_table.tsx +2 -3
  34. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns.html.erb +74 -0
  35. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns_rails.md +3 -0
  36. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_left_columns_rails.md +2 -2
  37. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns.html.erb +74 -0
  38. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns_rails.md +3 -0
  39. data/app/pb_kits/playbook/pb_table/docs/example.yml +2 -0
  40. data/app/pb_kits/playbook/pb_table/index.ts +93 -34
  41. data/app/pb_kits/playbook/pb_table/styles/_scroll.scss +6 -5
  42. data/app/pb_kits/playbook/pb_table/table.html.erb +1 -1
  43. data/app/pb_kits/playbook/pb_table/table.rb +17 -2
  44. data/app/pb_kits/playbook/pb_table/utilities/addDataTitle.ts +22 -0
  45. data/app/pb_kits/playbook/pb_timeline/_timeline.scss +30 -30
  46. data/dist/chunks/{_typeahead-BNULwihE.js → _typeahead-TN5aDUj9.js} +2 -2
  47. data/dist/chunks/_weekday_stacked-BcnpLG66.js +45 -0
  48. data/dist/chunks/{lib-B7sgJtGS.js → lib-OFT985dg.js} +2 -2
  49. data/dist/chunks/{pb_form_validation-C5Cc0-1v.js → pb_form_validation-CrsXd1-Y.js} +1 -1
  50. data/dist/chunks/vendor.js +1 -1
  51. data/dist/playbook-doc.js +1 -1
  52. data/dist/playbook-rails-react-bindings.js +1 -1
  53. data/dist/playbook-rails.js +1 -1
  54. data/dist/playbook.css +1 -1
  55. data/lib/playbook/version.rb +1 -1
  56. metadata +34 -9
  57. data/dist/chunks/_weekday_stacked-BKWemDAe.js +0 -45
@@ -14,6 +14,9 @@ module Playbook
14
14
  prop :items, type: Playbook::Props::Array,
15
15
  default: []
16
16
 
17
+ prop :enable_drag, type: Playbook::Props::Boolean,
18
+ default: false
19
+
17
20
  def classname
18
21
  generate_classname("pb_selectable_list_kit")
19
22
  end
@@ -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
- 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
  }
@@ -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
- border-radius: 4px;
31
- box-shadow: 1px 0 0 0px $border_light,
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
+ }