playbook_ui 13.17.0.pre.alpha.nodealphaupgrade2157 → 13.18.0.pre.alpha.PBNTR191AdvancedTableFinalFixes2159
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/Components/CustomCell.tsx +5 -3
- data/app/pb_kits/playbook/pb_advanced_table/Components/SubRowHeaderRow.tsx +4 -3
- data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +17 -11
- data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableBody.tsx +26 -4
- data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableHeader.tsx +18 -4
- data/app/pb_kits/playbook/pb_advanced_table/Utilities/ExpansionControlHelpers.tsx +3 -4
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +14 -7
- data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +36 -0
- data/lib/playbook/version.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ed6b5c8bc5abff794a42552366bce14785ce52a52f77e4897a96c59279b6bab0
|
4
|
+
data.tar.gz: 0b1feee9f1e0abafb95db62e695a1c4df57a95f82e0acdf0e079a9febf22f52c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 73a5a055067a0942784bb05576cf3cfc1002be59a2a06a061ea130da7f2eb561d86f61db61704874231d209ad32ead88ae47775058d43e2a7aba2bf4f73942ac
|
7
|
+
data.tar.gz: 2bff7638226878a69f3c8b7d3eed25c0a794be24894f82164983b8829d46c9cf874ec880f18e396052b615cc58d824420058fff6a698d23848b43bec7e674481
|
@@ -23,20 +23,22 @@ export const CustomCell = ({
|
|
23
23
|
value,
|
24
24
|
}: CustomCellProps & GlobalProps) => {
|
25
25
|
const { setExpanded, expanded } = useContext(AdvancedTableContext);
|
26
|
-
const RowWithoutChildren = row.originalSubRows === undefined;
|
27
26
|
|
28
27
|
const handleOnExpand = (row: Row<DataType>) => {
|
29
28
|
onRowToggleClick && onRowToggleClick(row);
|
30
29
|
setExpanded({ ...expanded, [row.id]: !row.getIsExpanded() });
|
31
30
|
};
|
32
31
|
|
32
|
+
const RowHasChildren = row.original.children ? true : false
|
33
|
+
|
34
|
+
|
33
35
|
return (
|
34
36
|
<div style={{ paddingLeft: `${row.depth * 1.25}em` }}>
|
35
37
|
<Flex alignItems="center"
|
36
38
|
columnGap="xs"
|
37
39
|
orientation="row"
|
38
40
|
>
|
39
|
-
{
|
41
|
+
{RowHasChildren ? (
|
40
42
|
<button
|
41
43
|
className="gray-icon expand-toggle-icon"
|
42
44
|
onClick={() => handleOnExpand(row)}
|
@@ -53,7 +55,7 @@ export const CustomCell = ({
|
|
53
55
|
)}
|
54
56
|
</button>
|
55
57
|
) : null}
|
56
|
-
<FlexItem paddingLeft={
|
58
|
+
<FlexItem paddingLeft={RowHasChildren? "none" : "xs"}>
|
57
59
|
{row.depth === 0 ? getValue() : value}
|
58
60
|
</FlexItem>
|
59
61
|
</Flex>
|
@@ -12,7 +12,7 @@ import { GlobalProps } from "../../utilities/globalProps"
|
|
12
12
|
|
13
13
|
interface SubRowHeaderRowProps {
|
14
14
|
collapsibleTrail?: boolean
|
15
|
-
enableToggleExpansion?: "all" | "header"
|
15
|
+
enableToggleExpansion?: "all" | "header" | "none"
|
16
16
|
onClick: (row: Row<DataType>) => void
|
17
17
|
row: Row<DataType>
|
18
18
|
subRowHeaders?: string[]
|
@@ -28,6 +28,7 @@ export const SubRowHeaderRow = ({
|
|
28
28
|
table,
|
29
29
|
}: SubRowHeaderRowProps & GlobalProps) => {
|
30
30
|
const numberOfColumns = table.getAllFlatColumns().length
|
31
|
+
const canExpand = row.depth < subRowHeaders.length
|
31
32
|
|
32
33
|
return (
|
33
34
|
<tr className="custom-row bg-silver">
|
@@ -42,13 +43,13 @@ export const SubRowHeaderRow = ({
|
|
42
43
|
<Flex align="center"
|
43
44
|
columnGap="xs"
|
44
45
|
>
|
45
|
-
{enableToggleExpansion === "all" &&
|
46
|
+
{enableToggleExpansion === "all" && canExpand ? (
|
46
47
|
<ToggleIconButton onClick={onClick}
|
47
48
|
row={row}
|
48
49
|
/>
|
49
50
|
) : null}
|
50
51
|
<Caption
|
51
|
-
marginLeft={
|
52
|
+
marginLeft={canExpand ? "none" : "xs"}
|
52
53
|
text={subRowHeaders[row.depth - 1]}
|
53
54
|
/>
|
54
55
|
</Flex>
|
@@ -12,11 +12,10 @@ import { GlobalProps } from "../../utilities/globalProps"
|
|
12
12
|
|
13
13
|
type TableHeaderCellProps = {
|
14
14
|
enableSorting?: boolean
|
15
|
-
enableToggleExpansion?: "all" | "header"
|
15
|
+
enableToggleExpansion?: "all" | "header" | "none"
|
16
16
|
handleExpandOrCollapse?: () => void
|
17
17
|
header?: Header<DataType, unknown>
|
18
18
|
headerChildren?: React.ReactNode | React.ReactNode[]
|
19
|
-
headerId?: string
|
20
19
|
loading?: boolean
|
21
20
|
sortIcon?: string | string[]
|
22
21
|
} & GlobalProps
|
@@ -27,7 +26,6 @@ export const TableHeaderCell = ({
|
|
27
26
|
handleExpandOrCollapse,
|
28
27
|
header,
|
29
28
|
headerChildren,
|
30
|
-
headerId,
|
31
29
|
loading,
|
32
30
|
sortIcon,
|
33
31
|
}: TableHeaderCellProps) => {
|
@@ -50,10 +48,22 @@ const cellClassName = classnames("table-header-cells",
|
|
50
48
|
);
|
51
49
|
|
52
50
|
const cellId = `${loading ?
|
53
|
-
`loading-${header.id}
|
54
|
-
: `${header.id}
|
51
|
+
`loading-${header.id}`
|
52
|
+
: `${header.id}`
|
55
53
|
}`;
|
56
54
|
|
55
|
+
const isToggleExpansionEnabledLoading =
|
56
|
+
header.index === 0 &&
|
57
|
+
loading &&
|
58
|
+
(enableToggleExpansion === "all" || "header") &&
|
59
|
+
enableToggleExpansion !== "none";
|
60
|
+
|
61
|
+
const isToggleExpansionEnabled =
|
62
|
+
header.index === 0 &&
|
63
|
+
!loading &&
|
64
|
+
(enableToggleExpansion === "all" || "header") &&
|
65
|
+
enableToggleExpansion !== "none";
|
66
|
+
|
57
67
|
return (
|
58
68
|
<th
|
59
69
|
align="right"
|
@@ -73,15 +83,11 @@ const cellId = `${loading ?
|
|
73
83
|
alignItems="center"
|
74
84
|
justify={header.index === 0 && enableSorting ? "between" : header.index === 0 && !enableSorting ? "start" : "end"}
|
75
85
|
>
|
76
|
-
{
|
77
|
-
!loading &&
|
78
|
-
(enableToggleExpansion === "all" || "header") && (
|
86
|
+
{isToggleExpansionEnabled && (
|
79
87
|
<ToggleIconButton onClick={handleExpandOrCollapse} />
|
80
88
|
)}
|
81
89
|
|
82
|
-
{
|
83
|
-
loading &&
|
84
|
-
(enableToggleExpansion === "all" || "header") && (
|
90
|
+
{isToggleExpansionEnabledLoading &&(
|
85
91
|
<div className="loading-toggle-icon header-toggle-icon" />
|
86
92
|
)}
|
87
93
|
|
@@ -1,4 +1,7 @@
|
|
1
1
|
import React, { useContext } from "react"
|
2
|
+
import classnames from "classnames";
|
3
|
+
import { buildCss } from "../../utilities/props";
|
4
|
+
import { globalProps } from "../../utilities/globalProps";
|
2
5
|
import LoadingInline from "../../pb_loading_inline/_loading_inline"
|
3
6
|
import { flexRender, Row } from "@tanstack/react-table"
|
4
7
|
|
@@ -10,28 +13,45 @@ import { isChrome } from "../Utilities/BrowserCheck"
|
|
10
13
|
import { DataType } from "../Utilities/types"
|
11
14
|
|
12
15
|
type TableBodyProps = {
|
16
|
+
className?: string;
|
13
17
|
collapsibleTrail?: boolean
|
18
|
+
id?: string;
|
14
19
|
subRowHeaders?: string[]
|
15
20
|
}
|
16
21
|
|
17
22
|
export const TableBody = ({
|
23
|
+
className,
|
18
24
|
collapsibleTrail = true,
|
25
|
+
id,
|
19
26
|
subRowHeaders,
|
27
|
+
...props
|
20
28
|
}: TableBodyProps) => {
|
29
|
+
|
21
30
|
const {
|
31
|
+
columnDefinitions,
|
22
32
|
enableToggleExpansion,
|
23
33
|
handleExpandOrCollapse,
|
24
34
|
loading,
|
25
35
|
table,
|
26
36
|
} = useContext(AdvancedTableContext)
|
37
|
+
|
38
|
+
const classes = classnames(
|
39
|
+
buildCss("pb_advanced_table_body"),
|
40
|
+
globalProps(props),
|
41
|
+
className
|
42
|
+
);
|
43
|
+
|
27
44
|
return (
|
28
45
|
<>
|
29
|
-
<tbody
|
46
|
+
<tbody className={classes}
|
47
|
+
id={id}
|
48
|
+
>
|
30
49
|
{table.getRowModel().rows.map((row: Row<DataType>) => {
|
31
50
|
const isExpandable = row.getIsExpanded()
|
32
51
|
const isFirstChildofSubrow = row.depth > 0 && row.index === 0
|
33
|
-
const rowHasNoChildren = !row.original.children
|
52
|
+
const rowHasNoChildren = row.original.children && !row.original.children.length ? true : false
|
34
53
|
const numberOfColumns = table.getAllFlatColumns().length
|
54
|
+
const isDataLoading = isExpandable && rowHasNoChildren && (row.depth < columnDefinitions[0].cellAccessors?.length)
|
35
55
|
|
36
56
|
return (
|
37
57
|
<React.Fragment key={`${row.index}-${row.id}-${row.depth}-row`}>
|
@@ -79,9 +99,11 @@ export const TableBody = ({
|
|
79
99
|
</tr>
|
80
100
|
|
81
101
|
{/* Display LoadingInline if Row Data is querying and there are no children already */}
|
82
|
-
{
|
102
|
+
{isDataLoading ? (
|
83
103
|
<tr key={`${row.id}-row`}>
|
84
|
-
<td colSpan={numberOfColumns}
|
104
|
+
<td colSpan={numberOfColumns}
|
105
|
+
style={{ paddingLeft: `${row.depth === 0 ? 0.5 : (row.depth * 2)}em` }}
|
106
|
+
>
|
85
107
|
<LoadingInline />
|
86
108
|
</td>
|
87
109
|
</tr>
|
@@ -1,4 +1,7 @@
|
|
1
1
|
import React, { useContext } from "react"
|
2
|
+
import classnames from "classnames";
|
3
|
+
import { buildCss } from "../../utilities/props";
|
4
|
+
import { globalProps } from "../../utilities/globalProps";
|
2
5
|
import { HeaderGroup } from "@tanstack/react-table"
|
3
6
|
import AdvancedTableContext from "../Context/AdvancedTableContext"
|
4
7
|
import { TableHeaderCell } from "../Components/TableHeaderCell"
|
@@ -6,16 +9,19 @@ import { DataType } from "../Utilities/types"
|
|
6
9
|
|
7
10
|
type TableHeaderProps = {
|
8
11
|
children?: React.ReactNode | React.ReactNode[]
|
12
|
+
className?: string
|
9
13
|
enableSorting?: boolean
|
10
|
-
|
14
|
+
id?: string;
|
11
15
|
sortIcon?: string | string[]
|
12
16
|
}
|
13
17
|
|
14
18
|
export const TableHeader = ({
|
15
19
|
children,
|
20
|
+
className,
|
16
21
|
enableSorting = false,
|
17
|
-
|
22
|
+
id,
|
18
23
|
sortIcon = ["arrow-up-short-wide", "arrow-down-short-wide"],
|
24
|
+
...props
|
19
25
|
}: TableHeaderProps) => {
|
20
26
|
const {
|
21
27
|
enableToggleExpansion,
|
@@ -24,9 +30,18 @@ export const TableHeader = ({
|
|
24
30
|
table,
|
25
31
|
} = useContext(AdvancedTableContext)
|
26
32
|
|
33
|
+
const classes = classnames(
|
34
|
+
buildCss("pb_advanced_table_header"),
|
35
|
+
globalProps(props),
|
36
|
+
className
|
37
|
+
);
|
38
|
+
|
39
|
+
|
27
40
|
return (
|
28
41
|
<>
|
29
|
-
<thead
|
42
|
+
<thead className={classes}
|
43
|
+
id={id}
|
44
|
+
>
|
30
45
|
{/* Get the header groups (only one in this example) */}
|
31
46
|
{table.getHeaderGroups().map((headerGroup: HeaderGroup<DataType>) => (
|
32
47
|
<tr key={`${headerGroup.id}-headerGroup`}>
|
@@ -37,7 +52,6 @@ export const TableHeader = ({
|
|
37
52
|
handleExpandOrCollapse={handleExpandOrCollapse}
|
38
53
|
header={header}
|
39
54
|
headerChildren={children}
|
40
|
-
headerId={headerId}
|
41
55
|
key={`${header.id}-header`}
|
42
56
|
loading={loading}
|
43
57
|
sortIcon={sortIcon}
|
@@ -24,10 +24,9 @@ export const updateExpandAndCollapseState = (
|
|
24
24
|
// Update isExpansionConsistent variable
|
25
25
|
for (const row of rows) {
|
26
26
|
if (
|
27
|
-
|
28
|
-
(targetParent === undefined
|
27
|
+
targetParent === undefined
|
29
28
|
? row.depth === 0
|
30
|
-
: targetParent === row.parentId
|
29
|
+
: targetParent === row.parentId
|
31
30
|
) {
|
32
31
|
areRowsExpanded.add(row.getIsExpanded())
|
33
32
|
if (areRowsExpanded.size > 1) {
|
@@ -48,7 +47,7 @@ export const updateExpandAndCollapseState = (
|
|
48
47
|
})
|
49
48
|
} else {
|
50
49
|
for (const row of rows) {
|
51
|
-
if (
|
50
|
+
if (targetParent === row.parentId) {
|
52
51
|
updateExpandedRows[row.id] = !isExpansionConsistent
|
53
52
|
? true
|
54
53
|
: !row.getIsExpanded()
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import React, { useState, useEffect, useCallback } from "react";
|
2
2
|
import classnames from "classnames";
|
3
|
-
import { buildAriaProps, buildCss, buildDataProps } from "../utilities/props";
|
3
|
+
import { buildAriaProps, buildCss, buildDataProps, buildHtmlProps } from "../utilities/props";
|
4
4
|
import { globalProps, GlobalProps } from "../utilities/globalProps";
|
5
5
|
import Table from "../pb_table/_table";
|
6
6
|
import {
|
@@ -28,8 +28,9 @@ type AdvancedTableProps = {
|
|
28
28
|
className?: string;
|
29
29
|
columnDefinitions: DataType[];
|
30
30
|
data?: { [key: string]: string };
|
31
|
-
enableToggleExpansion?: "all" | "header";
|
31
|
+
enableToggleExpansion?: "all" | "header" | "none";
|
32
32
|
expandedControl?: DataType;
|
33
|
+
htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
|
33
34
|
id?: string;
|
34
35
|
initialLoadingRowsCount?: number;
|
35
36
|
loading?: boolean | string;
|
@@ -51,6 +52,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
51
52
|
data = {},
|
52
53
|
enableToggleExpansion = "header",
|
53
54
|
expandedControl,
|
55
|
+
htmlOptions = {},
|
54
56
|
id,
|
55
57
|
initialLoadingRowsCount = 10,
|
56
58
|
loading,
|
@@ -104,7 +106,9 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
104
106
|
const depthAccessor = cellAccessors[row.depth - 1]; // Adjust index for depth
|
105
107
|
const accessorValue = rowData[depthAccessor];
|
106
108
|
return accessorValue ? (
|
107
|
-
<CustomCell
|
109
|
+
<CustomCell
|
110
|
+
onRowToggleClick={onRowToggleClick}
|
111
|
+
row={row}
|
108
112
|
value={accessorValue}
|
109
113
|
/>
|
110
114
|
) : (
|
@@ -195,6 +199,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
195
199
|
|
196
200
|
const ariaProps = buildAriaProps(aria);
|
197
201
|
const dataProps = buildDataProps(data);
|
202
|
+
const htmlProps = buildHtmlProps(htmlOptions);
|
198
203
|
const classes = classnames(
|
199
204
|
buildCss("pb_advanced_table"),
|
200
205
|
globalProps(props),
|
@@ -204,19 +209,21 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
204
209
|
return (
|
205
210
|
<div {...ariaProps}
|
206
211
|
{...dataProps}
|
212
|
+
{...htmlProps}
|
207
213
|
className={classes}
|
208
214
|
id={id}
|
209
215
|
>
|
210
216
|
<AdvancedTableContext.Provider
|
211
217
|
value={{
|
212
|
-
|
218
|
+
columnDefinitions,
|
219
|
+
enableToggleExpansion,
|
220
|
+
expanded,
|
213
221
|
handleExpandOrCollapse,
|
214
222
|
loading,
|
215
|
-
enableToggleExpansion,
|
216
|
-
toggleExpansionIcon,
|
217
223
|
setExpanded,
|
218
|
-
expanded,
|
219
224
|
sortControl,
|
225
|
+
table,
|
226
|
+
toggleExpansionIcon,
|
220
227
|
}}
|
221
228
|
>
|
222
229
|
<Table
|
@@ -343,3 +343,39 @@ test("sort button exists and sorts column data", () => {
|
|
343
343
|
const row2 = kit.getElementsByTagName('tr')[2]
|
344
344
|
expect(row2.id).toBe("0-0-0-row")
|
345
345
|
});
|
346
|
+
|
347
|
+
test("Generates Table.Header default + custom classname", () => {
|
348
|
+
render(
|
349
|
+
<AdvancedTable
|
350
|
+
columnDefinitions={columnDefinitions}
|
351
|
+
data={{ testid: testId }}
|
352
|
+
tableData={MOCK_DATA}
|
353
|
+
>
|
354
|
+
<AdvancedTable.Header className="custom-header" />
|
355
|
+
<AdvancedTable.Body />
|
356
|
+
|
357
|
+
</AdvancedTable>
|
358
|
+
);
|
359
|
+
|
360
|
+
const kit = screen.getByTestId(testId);
|
361
|
+
const tableHeader = kit.querySelector('thead')
|
362
|
+
expect(tableHeader).toHaveClass('pb_advanced_table_header custom-header')
|
363
|
+
});
|
364
|
+
|
365
|
+
test("Generates Table.Body default + custom classname", () => {
|
366
|
+
render(
|
367
|
+
<AdvancedTable
|
368
|
+
columnDefinitions={columnDefinitions}
|
369
|
+
data={{ testid: testId }}
|
370
|
+
tableData={MOCK_DATA}
|
371
|
+
>
|
372
|
+
<AdvancedTable.Header />
|
373
|
+
<AdvancedTable.Body className="custom-body-classname"/>
|
374
|
+
|
375
|
+
</AdvancedTable>
|
376
|
+
);
|
377
|
+
|
378
|
+
const kit = screen.getByTestId(testId);
|
379
|
+
const tableHeader = kit.querySelector('tbody')
|
380
|
+
expect(tableHeader).toHaveClass('pb_advanced_table_body custom-body-classname')
|
381
|
+
});
|
data/lib/playbook/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: playbook_ui
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 13.
|
4
|
+
version: 13.18.0.pre.alpha.PBNTR191AdvancedTableFinalFixes2159
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Power UX
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2024-02-
|
12
|
+
date: 2024-02-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: actionpack
|