playbook_ui 14.9.0.pre.alpha.PBNTR738collapsiblewithintablekit4855 → 14.9.0.pre.alpha.PBNTR746datepickerdefaultbug4898

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 (37) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_collapsible/_collapsible.tsx +4 -9
  3. data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleContent.tsx +2 -2
  4. data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleMain.tsx +2 -2
  5. data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.ts +5 -2
  6. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_left_columns.html.erb +95 -0
  7. data/app/pb_kits/playbook/pb_table/docs/example.yml +0 -5
  8. data/app/pb_kits/playbook/pb_table/docs/index.js +0 -5
  9. data/app/pb_kits/playbook/pb_table/index.ts +100 -26
  10. data/app/pb_kits/playbook/pb_table/styles/_all.scss +1 -2
  11. data/app/pb_kits/playbook/pb_table/subcomponents/_table_row.tsx +1 -106
  12. data/app/pb_kits/playbook/pb_table/table.html.erb +1 -1
  13. data/app/pb_kits/playbook/pb_table/table.rb +17 -2
  14. data/dist/chunks/{_typeahead-ClJHKLj6.js → _typeahead-DiPHsSwB.js} +3 -3
  15. data/dist/chunks/_weekday_stacked-DOJwX0Ne.js +45 -0
  16. data/dist/chunks/lib-2u4I44lR.js +29 -0
  17. data/dist/chunks/{pb_form_validation-C3vQKj7-.js → pb_form_validation-eDNxkkv7.js} +1 -1
  18. data/dist/chunks/vendor.js +1 -1
  19. data/dist/playbook-doc.js +1 -1
  20. data/dist/playbook-rails-react-bindings.js +1 -1
  21. data/dist/playbook-rails.js +1 -1
  22. data/dist/playbook.css +1 -1
  23. data/lib/playbook/version.rb +1 -1
  24. metadata +7 -17
  25. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible.jsx +0 -75
  26. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible.md +0 -1
  27. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click.jsx +0 -108
  28. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click.md +0 -2
  29. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_content.jsx +0 -94
  30. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_content.md +0 -0
  31. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_nested_rows.jsx +0 -83
  32. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_nested_rows.md +0 -3
  33. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_nested_table.jsx +0 -120
  34. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_nested_table.md +0 -1
  35. data/app/pb_kits/playbook/pb_table/styles/_collapsible.scss +0 -35
  36. data/dist/chunks/_weekday_stacked-DaVTrOfA.js +0 -45
  37. data/dist/chunks/lib-CtS0DLMo.js +0 -29
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7836406579285d2cbea8a738bb95e477a2f513f6243b4a59cfaef6985ee22a3a
4
- data.tar.gz: 0af1be0d7a9f685d063c68d09d7d441317bb99b6bd591eab66d738300ab49dd9
3
+ metadata.gz: a45301c5e3970d97316ccb25fb1022412d363d5e5d983edb26ba10980bf18ff6
4
+ data.tar.gz: 84bff53ad34804618f2be15c8c699a7392f7faf426dbb7be0b7ed192096fb12e
5
5
  SHA512:
6
- metadata.gz: cdb9e010f6a61b4b6a52ce0f317127c1f097607aa846b14887b0163625d1718eac6a93eff8e5bc1f7aab34f06eb3d69c56fea4667e513751c697f58ca221fe6a
7
- data.tar.gz: 99fb58c0a203ddc69ebf6fa643274582d5b96e32284d1817fbe6d9d9ebfd5fbe358816e674bbf02cdbb394490283db22e077c44a2116e23935a37852ba628354
6
+ metadata.gz: fc8e0073ddeff54d21530ff35dc0d04ef691cea742c1f658201f855394531ce7a17c1e0c5ba870e1fe9cfa31dc357f3c24e3ef5e818788df415c2ea453ede1e3
7
+ data.tar.gz: 621528c2b0ab44ad6f634604515a9fa7353a84e8a06f1214af892f0111916c81a340b4f8e51f4cf76009cde6f7061dfdf600cc3943b70100abc8bcac5c3ba0ce
@@ -2,7 +2,7 @@ import React, { useEffect, ReactElement } from 'react'
2
2
  import classnames from 'classnames'
3
3
  import useCollapsible from './useCollapsible'
4
4
 
5
- import { globalProps, globalInlineProps, GlobalProps } from '../utilities/globalProps'
5
+ import { globalProps, globalInlineProps } from '../utilities/globalProps'
6
6
  import { buildAriaProps, buildCss, buildDataProps, buildHtmlProps } from '../utilities/props'
7
7
 
8
8
  import CollapsibleContent from './child_kits/CollapsibleContent'
@@ -32,7 +32,6 @@ type CollapsibleProps = {
32
32
  onClick?: ()=> void,
33
33
  htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
34
34
  id?: string,
35
- tag?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span' | 'div' | 'tr' | 'th' | 'td' | 'thead' | 'col',
36
35
  }
37
36
 
38
37
  const Collapsible = ({
@@ -48,9 +47,8 @@ const Collapsible = ({
48
47
  onIconClick,
49
48
  onClick,
50
49
  id,
51
- tag = 'div',
52
50
  ...props
53
- }: CollapsibleProps & GlobalProps): React.ReactElement => {
51
+ }: CollapsibleProps): React.ReactElement => {
54
52
  const [isCollapsed, toggle, setIsCollapsed] = useCollapsible(collapsed)
55
53
 
56
54
  useEffect(()=> {
@@ -78,12 +76,9 @@ const Collapsible = ({
78
76
  className
79
77
  )
80
78
  const dynamicInlineProps = globalInlineProps(props)
81
-
82
- const Tag: React.ReactElement | any = `${tag}`;
83
-
84
79
  return (
85
80
  <CollapsibleContext.Provider value={{ collapsed: isCollapsed, toggle, icon, iconSize, iconColor, onIconClick, onClick }}>
86
- <Tag
81
+ <div
87
82
  {...ariaProps}
88
83
  {...dataProps}
89
84
  {...htmlProps}
@@ -101,7 +96,7 @@ const Collapsible = ({
101
96
  <CollapsibleContent {...contentProps}>
102
97
  {contentChildren}
103
98
  </CollapsibleContent>
104
- </Tag>
99
+ </div>
105
100
  </CollapsibleContext.Provider>
106
101
  )
107
102
  }
@@ -1,7 +1,7 @@
1
1
  import classnames from 'classnames'
2
2
  import React, { useContext, useRef, useEffect } from 'react'
3
3
  import { buildCss } from '../../utilities/props'
4
- import { globalProps, GlobalProps } from '../../utilities/globalProps'
4
+ import { globalProps } from '../../utilities/globalProps'
5
5
  import { hideElement, showElement } from '../_helper_functions'
6
6
 
7
7
  import CollapsibleContext from '../context'
@@ -15,7 +15,7 @@ const CollapsibleContent = ({
15
15
  children,
16
16
  className,
17
17
  ...props
18
- }: CollapsibleContentProps & GlobalProps): React.ReactElement => {
18
+ }: CollapsibleContentProps): React.ReactElement => {
19
19
  const context: {[key: string]: boolean | string} = useContext(CollapsibleContext)
20
20
  const contentCSS = buildCss('pb_collapsible_content_kit')
21
21
  const contentSpacing = globalProps(props)
@@ -3,7 +3,7 @@
3
3
  import classnames from 'classnames'
4
4
  import React, { useContext } from 'react'
5
5
  import { buildCss } from '../../utilities/props'
6
- import { globalProps, GlobalProps } from '../../utilities/globalProps'
6
+ import { globalProps } from '../../utilities/globalProps'
7
7
 
8
8
  import Flex from '../../pb_flex/_flex'
9
9
  import FlexItem from '../../pb_flex/_flex_item'
@@ -25,7 +25,7 @@ const CollapsibleMain = ({
25
25
  className,
26
26
  cursor = 'pointer',
27
27
  ...props
28
- }: CollapsibleMainProps & GlobalProps): React.ReactElement=> {
28
+ }: CollapsibleMainProps): React.ReactElement=> {
29
29
  const {collapsed, toggle, icon, iconSize, iconColor, onIconClick, onClick}: any = useContext(CollapsibleContext)
30
30
  const mainCSS = buildCss('pb_collapsible_main_kit')
31
31
  const mainSpacing = globalProps(props, { cursor })
@@ -68,7 +68,7 @@ const datePickerHelper = (config: DatePickerConfig, scrollContainer: string | HT
68
68
  timeFormat = 'at h:i K',
69
69
  yearRange,
70
70
  } = config
71
-
71
+ console.log("1 " + config);
72
72
  // ===========================================================
73
73
  // | Hook Definitions |
74
74
  // ===========================================================
@@ -148,7 +148,9 @@ const datePickerHelper = (config: DatePickerConfig, scrollContainer: string | HT
148
148
 
149
149
  // time selection
150
150
  if (enableTime) pluginList.push(timeSelectPlugin({ caption: timeCaption, showTimezone: showTimezone}))
151
-
151
+ console.log("2 " + thisRangesEndToday);
152
+ console.log("3 " + customQuickPickDates);
153
+ console.log("4 " + pluginList);
152
154
  return pluginList
153
155
  }
154
156
 
@@ -220,6 +222,7 @@ const datePickerHelper = (config: DatePickerConfig, scrollContainer: string | HT
220
222
  // Assign dynamically sourced flatpickr instance to variable
221
223
  const picker = document.querySelector<HTMLElement & { [x: string]: any }>(`#${pickerId}`)._flatpickr
222
224
  picker.innerContainer.parentElement.id = `cal-${pickerId}`
225
+ console.log("5 " + picker);
223
226
 
224
227
  // replace year selector with dropdown
225
228
  picker.yearElements[0].parentElement.innerHTML = `<select class="numInput cur-year" type="number" tabIndex="-1" aria-label="Year" id="year-${pickerId}"></select>`
@@ -0,0 +1,95 @@
1
+ <%= pb_rails("table", props: { size: "md", responsive: "scroll", sticky_left_column: ["1", "2", "3"] }) do %>
2
+ <thead>
3
+ <tr>
4
+ <th id="1">Column 1</th>
5
+ <th id="2">Column 2</th>
6
+ <th id="3">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>Column 15</th>
19
+ </tr>
20
+ </thead>
21
+ <tbody>
22
+ <tr>
23
+ <td id="1">Value 1</td>
24
+ <td id="2">Value 2</td>
25
+ <td id="3">Value 3</td>
26
+ <td>Value 4</td>
27
+ <td>Value 5</td>
28
+ <td>Column 6</td>
29
+ <td>Column 7</td>
30
+ <td>Column 8</td>
31
+ <td>Column 9</td>
32
+ <td>Column 10</td>
33
+ <td>Column 11</td>
34
+ <td>Column 12</td>
35
+ <td>Column 13</td>
36
+ <td>Column 14</td>
37
+ <td>Column 15</td>
38
+
39
+ </tr>
40
+ <tr>
41
+ <td id="1">Value 1</td>
42
+ <td id="2">Value 2</td>
43
+ <td id="3">Value 3</td>
44
+ <td>Value 4</td>
45
+ <td>Value 5</td>
46
+ <td>Column 6</td>
47
+ <td>Column 7</td>
48
+ <td>Column 8</td>
49
+ <td>Column 9</td>
50
+ <td>Column 10</td>
51
+ <td>Column 11</td>
52
+ <td>Column 12</td>
53
+ <td>Column 13</td>
54
+ <td>Column 14</td>
55
+ <td>Column 15</td>
56
+
57
+ </tr>
58
+ <tr>
59
+ <td id="1">Value 1</td>
60
+ <td id="2">Value 2</td>
61
+ <td id="3">Value 3</td>
62
+ <td>Value 4</td>
63
+ <td>Value 5</td>
64
+ <td>Column 6</td>
65
+ <td>Column 7</td>
66
+ <td>Column 8</td>
67
+ <td>Column 9</td>
68
+ <td>Column 10</td>
69
+ <td>Column 11</td>
70
+ <td>Column 12</td>
71
+ <td>Column 13</td>
72
+ <td>Column 14</td>
73
+ <td>Column 15</td>
74
+
75
+ </tr>
76
+ <tr>
77
+ <td id="1">Value 1</td>
78
+ <td id="2">Value 2</td>
79
+ <td id="3">Value 3</td>
80
+ <td>Value 4</td>
81
+ <td>Value 5</td>
82
+ <td>Column 6</td>
83
+ <td>Column 7</td>
84
+ <td>Column 8</td>
85
+ <td>Column 9</td>
86
+ <td>Column 10</td>
87
+ <td>Column 11</td>
88
+ <td>Column 12</td>
89
+ <td>Column 13</td>
90
+ <td>Column 14</td>
91
+ <td>Column 15</td>
92
+
93
+ </tr>
94
+ </tbody>
95
+ <% end %>
@@ -55,8 +55,3 @@ examples:
55
55
  - table_with_subcomponents: Table with Sub Components (Table Elements)
56
56
  - table_with_subcomponents_as_divs: Table with Sub Components (Divs)
57
57
  - table_outer_padding: Outer Padding
58
- - table_with_collapsible: Table with Collapsible
59
- - table_with_collapsible_with_custom_click: Table with Collapsible with Custom Click
60
- - table_with_collapsible_with_custom_content: Table with Collapsible with Custom Content
61
- - table_with_collapsible_with_nested_rows: Table with Collapsible with Nested Rows
62
- - table_with_collapsible_with_nested_table: Table with Collapsible with Nested Table
@@ -26,8 +26,3 @@ export { default as TableWithSubcomponents } from './_table_with_subcomponents.j
26
26
  export { default as TableWithSubcomponentsAsDivs } from './_table_with_subcomponents_as_divs.jsx'
27
27
  export { default as TableOuterPadding } from './_table_outer_padding.jsx'
28
28
  export { default as TableStickyLeftColumns } from './_table_sticky_left_columns.jsx'
29
- export { default as TableWithCollapsible } from './_table_with_collapsible.jsx'
30
- export { default as TableWithCollapsibleWithCustomContent } from './_table_with_collapsible_with_custom_content.jsx'
31
- export { default as TableWithCollapsibleWithNestedTable } from './_table_with_collapsible_with_nested_table.jsx'
32
- export { default as TableWithCollapsibleWithNestedRows } from './_table_with_collapsible_with_nested_rows.jsx'
33
- export { default as TableWithCollapsibleWithCustomClick } from './_table_with_collapsible_with_custom_click.jsx'
@@ -1,32 +1,106 @@
1
1
  import PbEnhancedElement from '../pb_enhanced_element'
2
2
 
3
3
  export default class PbTable extends PbEnhancedElement {
4
- static get selector(): string {
5
- return '.table-responsive-collapse'
6
- }
7
-
8
- connect(): void {
9
- const tables = document.querySelectorAll('.table-responsive-collapse');
10
-
11
- // Each Table
12
- [].forEach.call(tables, (table: HTMLTableElement) => {
13
- // Header Titles
14
- const headers: string[] = [];
15
- [].forEach.call(table.querySelectorAll('th'), (header: HTMLTableCellElement) => {
16
- const colSpan = header.colSpan
17
- for (let i = 0; i < colSpan; i++) {
18
- headers.push(header.textContent.replace(/\r?\n|\r/, ''));
4
+ private stickyLeftColumns: string[] = [];
5
+ private handleStickyColumnsRef: () => void;
6
+
7
+ static get selector(): string {
8
+ return '.table-responsive-collapse'
9
+ }
10
+
11
+ connect(): void {
12
+ const tables = document.querySelectorAll('.table-responsive-collapse');
13
+ // Each Table
14
+ [].forEach.call(tables, (table: HTMLTableElement) => {
15
+ // Header Titles
16
+ const headers: string[] = [];
17
+ [].forEach.call(table.querySelectorAll('th'), (header: HTMLTableCellElement) => {
18
+ const colSpan = header.colSpan
19
+ for (let i = 0; i < colSpan; i++) {
20
+ headers.push(header.textContent.replace(/\r?\n|\r/, ''));
21
+ }
22
+ });
23
+ // for each row in tbody
24
+ [].forEach.call(table.querySelectorAll('tbody tr'), (row: HTMLTableRowElement) => {
25
+ // for each cell
26
+ [].forEach.call(row.cells, (cell: HTMLTableCellElement, headerIndex: number) => {
27
+ // apply the attribute
28
+ cell.setAttribute('data-title', headers[headerIndex])
29
+ })
30
+ })
31
+ });
32
+
33
+ // New sticky columns logic
34
+ this.initStickyColumns();
35
+ }
36
+
37
+ private initStickyColumns(): void {
38
+ // Find tables with sticky-left-column class
39
+ const tables = document.querySelectorAll('.sticky-left-column');
40
+
41
+ tables.forEach((table) => {
42
+ // Extract sticky left column IDs by looking at the component's class
43
+ const classList = Array.from(table.classList);
44
+
45
+ // Look for classes in the format sticky-left-column-{ids}
46
+ const stickyColumnClass = classList.find(cls => cls.startsWith('sticky-columns-'));
47
+ if (stickyColumnClass) {
48
+ // Extract the IDs from the class name
49
+ this.stickyLeftColumns = stickyColumnClass
50
+ .replace('sticky-columns-', '')
51
+ .split('-');
52
+
53
+ if (this.stickyLeftColumns.length > 0) {
54
+ this.handleStickyColumnsRef = this.handleStickyColumns.bind(this);
55
+ this.handleStickyColumns();
56
+ window.addEventListener('resize', this.handleStickyColumnsRef);
57
+ }
19
58
  }
20
59
  });
60
+ }
21
61
 
22
- // for each row in tbody
23
- [].forEach.call(table.querySelectorAll('tbody tr'), (row: HTMLTableRowElement) => {
24
- // for each cell
25
- [].forEach.call(row.cells, (cell: HTMLTableCellElement, headerIndex: number) => {
26
- // apply the attribute
27
- cell.setAttribute('data-title', headers[headerIndex])
28
- })
29
- })
30
- })
31
- }
32
- }
62
+ private handleStickyColumns(): void {
63
+ let accumulatedWidth = 0;
64
+
65
+ this.stickyLeftColumns.forEach((colId, index) => {
66
+ const isLastColumn = index === this.stickyLeftColumns.length - 1;
67
+ const header = document.querySelector(`th[id="${colId}"]`);
68
+ const cells = document.querySelectorAll(`td[id="${colId}"]`);
69
+
70
+ if (header) {
71
+ header.classList.add('sticky');
72
+ (header as HTMLElement).style.left = `${accumulatedWidth}px`;
73
+
74
+ if (!isLastColumn) {
75
+ header.classList.add('with-border');
76
+ header.classList.remove('sticky-shadow');
77
+ } else {
78
+ header.classList.remove('with-border');
79
+ header.classList.add('sticky-shadow');
80
+ }
81
+
82
+ accumulatedWidth += (header as HTMLElement).offsetWidth;
83
+ }
84
+
85
+ cells.forEach((cell) => {
86
+ cell.classList.add('sticky');
87
+ (cell as HTMLElement).style.left = `${accumulatedWidth - (header as HTMLElement).offsetWidth}px`;
88
+
89
+ if (!isLastColumn) {
90
+ cell.classList.add('with-border');
91
+ cell.classList.remove('sticky-shadow');
92
+ } else {
93
+ cell.classList.remove('with-border');
94
+ cell.classList.add('sticky-shadow');
95
+ }
96
+ });
97
+ });
98
+ }
99
+
100
+ // Cleanup method to remove event listener
101
+ disconnect(): void {
102
+ if (this.handleStickyColumnsRef) {
103
+ window.removeEventListener('resize', this.handleStickyColumnsRef);
104
+ }
105
+ }
106
+ }
@@ -21,5 +21,4 @@
21
21
  @import "striped";
22
22
  @import "outer_padding";
23
23
  @import "sticky_columns";
24
- @import "scroll";
25
- @import "collapsible";
24
+ @import "scroll";
@@ -7,21 +7,14 @@ import {
7
7
  buildHtmlProps,
8
8
  } from "../../utilities/props";
9
9
  import { globalProps } from "../../utilities/globalProps";
10
- import Collapsible from "../../pb_collapsible/_collapsible";
11
- import useCollapsible from "../../pb_collapsible/useCollapsible";
12
10
 
13
11
  type TableRowPropTypes = {
14
12
  aria?: { [key: string]: string };
15
13
  children: React.ReactNode[] | React.ReactNode;
16
14
  className: string;
17
- collapsible?: boolean;
18
- collapsibleContent?: React.ReactNode[] | React.ReactNode;
19
- collapsibleSideHighlight?: boolean;
20
15
  data?: { [key: string]: string };
21
- dark?: boolean;
22
16
  htmlOptions?: { [key: string]: string | number | boolean | (() => void) };
23
17
  id?: string;
24
- toggleCellId?: string;
25
18
  sideHighlightColor: string;
26
19
  tag?: "table" | "div";
27
20
  };
@@ -30,15 +23,10 @@ const TableRow = (props: TableRowPropTypes): React.ReactElement => {
30
23
  const {
31
24
  aria = {},
32
25
  children,
33
- collapsible,
34
- collapsibleContent,
35
- collapsibleSideHighlight = true,
36
26
  className,
37
27
  data = {},
38
- dark = false,
39
28
  htmlOptions = {},
40
29
  id,
41
- toggleCellId,
42
30
  sideHighlightColor = "none",
43
31
  tag = "table",
44
32
  } = props;
@@ -48,110 +36,17 @@ const TableRow = (props: TableRowPropTypes): React.ReactElement => {
48
36
  const htmlProps = buildHtmlProps(htmlOptions);
49
37
  const sideHighlightClass =
50
38
  sideHighlightColor != "" ? `side_highlight_${sideHighlightColor}` : null;
51
-
52
- const [isCollapsed, setIsCollapsed] = useCollapsible(true);
53
-
54
- const collapsibleRow = collapsible && isCollapsed === true ? "collapsible_table_row" : null;
55
39
  const classes = classnames(
56
40
  buildCss("pb_table_row_kit", sideHighlightClass),
57
41
  "pb_table_tr",
58
- collapsibleRow,
59
42
  globalProps(props),
60
43
  className
61
44
  );
62
45
  const isTableTag = tag === "table";
63
46
 
64
- // const [isCollapsed, setIsCollapsed] = useCollapsible(true);
65
-
66
- const colSpan = React.Children.count(children);
67
-
68
- const handleRowClick = (event: React.MouseEvent) => {
69
- if (toggleCellId) {
70
- const target = event.target as HTMLElement;
71
- const clickedCell = target.closest(`#${toggleCellId}`);
72
- const isIconClick =
73
- target instanceof SVGElement &&
74
- (target.matches("svg.pb_custom_icon") || target.closest("svg.pb_custom_icon"));
75
-
76
- if (clickedCell || isIconClick) {
77
- setIsCollapsed(!isCollapsed);
78
- }
79
- } else {
80
- setIsCollapsed(!isCollapsed);
81
- }
82
- };
83
-
84
47
  return (
85
48
  <>
86
- {collapsible ? (
87
- isTableTag ? (
88
- <>
89
- <tr
90
- {...ariaProps}
91
- {...dataProps}
92
- {...htmlProps}
93
- className={classes}
94
- id={id}
95
- onClick={(e)=>handleRowClick(e)}
96
- style={{ cursor: toggleCellId ? "default" : "pointer" }}
97
- >
98
- {children}
99
- </tr>
100
- <tr>
101
- <Collapsible
102
- collapsed={isCollapsed}
103
- dark={dark}
104
- htmlOptions={{ colSpan: colSpan }}
105
- padding="none"
106
- tag="td"
107
- >
108
- <tr/>
109
- <Collapsible.Content
110
- className={collapsibleSideHighlight ? `table_collapsible_side_highlight` : ''}
111
- dark={dark}
112
- margin="none"
113
- padding="none"
114
- >
115
- {collapsibleContent}
116
- </Collapsible.Content>
117
- </Collapsible>
118
- </tr>
119
- </>
120
- ) : (
121
- <>
122
- <div
123
- {...ariaProps}
124
- {...dataProps}
125
- {...htmlProps}
126
- className={classes}
127
- id={id}
128
- onClick={handleRowClick}
129
- style={{ cursor: "pointer" }}
130
- >
131
- {children}
132
- </div>
133
- <tr>
134
- <Collapsible
135
- collapsed={isCollapsed}
136
- dark={dark}
137
- htmlOptions={{ colSpan: colSpan }}
138
- padding="none"
139
- tag="td"
140
- >
141
- <tr/>
142
- <Collapsible.Content
143
- className={collapsibleSideHighlight ? `table_collapsible_side_highlight` : ''}
144
- dark={dark}
145
- margin="none"
146
- padding="none"
147
- >
148
- {collapsibleContent}
149
- </Collapsible.Content>
150
- </Collapsible>
151
- </tr>
152
- </>
153
- )
154
- ) : isTableTag ? (
49
+ {isTableTag ? (
155
50
  <tr
156
51
  {...ariaProps}
157
52
  {...dataProps}
@@ -18,4 +18,4 @@
18
18
  <%= content.presence %>
19
19
  <% end %>
20
20
  <% end %>
21
- <% end %>
21
+ <% end %>
@@ -23,6 +23,8 @@ module Playbook
23
23
  prop :text
24
24
  prop :sticky, type: Playbook::Props::Boolean,
25
25
  default: false
26
+ prop :sticky_left_column, type: Playbook::Props::Array,
27
+ default: []
26
28
  prop :vertical_border, type: Playbook::Props::Boolean,
27
29
  default: false
28
30
  prop :striped, type: Playbook::Props::Boolean,
@@ -37,8 +39,8 @@ module Playbook
37
39
  def classname
38
40
  generate_classname(
39
41
  "pb_table", "table-#{size}", single_line_class, dark_class,
40
- disable_hover_class, container_class, data_table_class, sticky_class, collapse_class,
41
- vertical_border_class, striped_class, outer_padding_class,
42
+ 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,
42
44
  "table-responsive-#{responsive}", separator: " "
43
45
  )
44
46
  end
@@ -73,6 +75,19 @@ module Playbook
73
75
  sticky ? "sticky-header" : nil
74
76
  end
75
77
 
78
+ def sticky_left_column_class
79
+ if sticky_left_column.empty?
80
+ nil
81
+ else
82
+ sticky_col_classname = "sticky-left-column sticky-columns"
83
+ sticky_left_column.each do |id|
84
+ sticky_col_classname += "-#{id}"
85
+ end
86
+
87
+ sticky_col_classname
88
+ end
89
+ end
90
+
76
91
  def striped_class
77
92
  striped ? "striped" : nil
78
93
  end