playbook_ui 13.18.0.pre.alpha.PBNTR191AdvancedTableFinalFixes2159 → 13.18.0.pre.alpha.dependabotnpmandyarnpowerhomeplaybookicons001alpha52174
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/pb_kits/playbook/pb_advanced_table/Components/CustomCell.tsx +3 -5
- data/app/pb_kits/playbook/pb_advanced_table/Components/SubRowHeaderRow.tsx +3 -4
- data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +11 -17
- data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableBody.tsx +4 -26
- data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableHeader.tsx +4 -18
- data/app/pb_kits/playbook/pb_advanced_table/Utilities/ExpansionControlHelpers.tsx +4 -3
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +7 -14
- data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +0 -36
- data/lib/playbook/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 07df5a51ff6cc545fc766152e6b29c93c3dbb93490e376860bce3b7cd5ed29ac
|
4
|
+
data.tar.gz: 50b2552c1b512542cf7aa2731ac8a8da39fd3c80a429fb9dee7553ad80edd8e3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf46489def90ccc21c247e68e54e9864fb3d4bd2a53cd6fa7cf0be8a04019e46dcf7184677e1499b4ad16b9d415efde26784320e7ecb077d0f697480ae8a0877
|
7
|
+
data.tar.gz: bb93a071c1a739c0e47776b3ba4dcba3a53b3e9ba46e9c8bf8c090420429c2a7d9dfcfa5809392dbac7eae92c6025f263bb2685240ce9d305b2fec8f676bf843
|
@@ -23,22 +23,20 @@ export const CustomCell = ({
|
|
23
23
|
value,
|
24
24
|
}: CustomCellProps & GlobalProps) => {
|
25
25
|
const { setExpanded, expanded } = useContext(AdvancedTableContext);
|
26
|
+
const RowWithoutChildren = row.originalSubRows === undefined;
|
26
27
|
|
27
28
|
const handleOnExpand = (row: Row<DataType>) => {
|
28
29
|
onRowToggleClick && onRowToggleClick(row);
|
29
30
|
setExpanded({ ...expanded, [row.id]: !row.getIsExpanded() });
|
30
31
|
};
|
31
32
|
|
32
|
-
const RowHasChildren = row.original.children ? true : false
|
33
|
-
|
34
|
-
|
35
33
|
return (
|
36
34
|
<div style={{ paddingLeft: `${row.depth * 1.25}em` }}>
|
37
35
|
<Flex alignItems="center"
|
38
36
|
columnGap="xs"
|
39
37
|
orientation="row"
|
40
38
|
>
|
41
|
-
{
|
39
|
+
{!RowWithoutChildren ? (
|
42
40
|
<button
|
43
41
|
className="gray-icon expand-toggle-icon"
|
44
42
|
onClick={() => handleOnExpand(row)}
|
@@ -55,7 +53,7 @@ export const CustomCell = ({
|
|
55
53
|
)}
|
56
54
|
</button>
|
57
55
|
) : null}
|
58
|
-
<FlexItem paddingLeft={
|
56
|
+
<FlexItem paddingLeft={!RowWithoutChildren ? "none" : "xs"}>
|
59
57
|
{row.depth === 0 ? getValue() : value}
|
60
58
|
</FlexItem>
|
61
59
|
</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"
|
16
16
|
onClick: (row: Row<DataType>) => void
|
17
17
|
row: Row<DataType>
|
18
18
|
subRowHeaders?: string[]
|
@@ -28,7 +28,6 @@ export const SubRowHeaderRow = ({
|
|
28
28
|
table,
|
29
29
|
}: SubRowHeaderRowProps & GlobalProps) => {
|
30
30
|
const numberOfColumns = table.getAllFlatColumns().length
|
31
|
-
const canExpand = row.depth < subRowHeaders.length
|
32
31
|
|
33
32
|
return (
|
34
33
|
<tr className="custom-row bg-silver">
|
@@ -43,13 +42,13 @@ export const SubRowHeaderRow = ({
|
|
43
42
|
<Flex align="center"
|
44
43
|
columnGap="xs"
|
45
44
|
>
|
46
|
-
{enableToggleExpansion === "all" &&
|
45
|
+
{enableToggleExpansion === "all" && row.getCanExpand() ? (
|
47
46
|
<ToggleIconButton onClick={onClick}
|
48
47
|
row={row}
|
49
48
|
/>
|
50
49
|
) : null}
|
51
50
|
<Caption
|
52
|
-
marginLeft={
|
51
|
+
marginLeft={row.getCanExpand() ? "none" : "xs"}
|
53
52
|
text={subRowHeaders[row.depth - 1]}
|
54
53
|
/>
|
55
54
|
</Flex>
|
@@ -12,10 +12,11 @@ import { GlobalProps } from "../../utilities/globalProps"
|
|
12
12
|
|
13
13
|
type TableHeaderCellProps = {
|
14
14
|
enableSorting?: boolean
|
15
|
-
enableToggleExpansion?: "all" | "header"
|
15
|
+
enableToggleExpansion?: "all" | "header"
|
16
16
|
handleExpandOrCollapse?: () => void
|
17
17
|
header?: Header<DataType, unknown>
|
18
18
|
headerChildren?: React.ReactNode | React.ReactNode[]
|
19
|
+
headerId?: string
|
19
20
|
loading?: boolean
|
20
21
|
sortIcon?: string | string[]
|
21
22
|
} & GlobalProps
|
@@ -26,6 +27,7 @@ export const TableHeaderCell = ({
|
|
26
27
|
handleExpandOrCollapse,
|
27
28
|
header,
|
28
29
|
headerChildren,
|
30
|
+
headerId,
|
29
31
|
loading,
|
30
32
|
sortIcon,
|
31
33
|
}: TableHeaderCellProps) => {
|
@@ -48,22 +50,10 @@ const cellClassName = classnames("table-header-cells",
|
|
48
50
|
);
|
49
51
|
|
50
52
|
const cellId = `${loading ?
|
51
|
-
`loading-${header.id}`
|
52
|
-
: `${header.id}`
|
53
|
+
`loading-${header.id}${headerId ? `-${headerId}` : ""}`
|
54
|
+
: `${header.id}${headerId ? `-${headerId}` : ""}`
|
53
55
|
}`;
|
54
56
|
|
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
|
-
|
67
57
|
return (
|
68
58
|
<th
|
69
59
|
align="right"
|
@@ -83,11 +73,15 @@ const isToggleExpansionEnabled =
|
|
83
73
|
alignItems="center"
|
84
74
|
justify={header.index === 0 && enableSorting ? "between" : header.index === 0 && !enableSorting ? "start" : "end"}
|
85
75
|
>
|
86
|
-
{
|
76
|
+
{header.index === 0 &&
|
77
|
+
!loading &&
|
78
|
+
(enableToggleExpansion === "all" || "header") && (
|
87
79
|
<ToggleIconButton onClick={handleExpandOrCollapse} />
|
88
80
|
)}
|
89
81
|
|
90
|
-
{
|
82
|
+
{header.index === 0 &&
|
83
|
+
loading &&
|
84
|
+
(enableToggleExpansion === "all" || "header") && (
|
91
85
|
<div className="loading-toggle-icon header-toggle-icon" />
|
92
86
|
)}
|
93
87
|
|
@@ -1,7 +1,4 @@
|
|
1
1
|
import React, { useContext } from "react"
|
2
|
-
import classnames from "classnames";
|
3
|
-
import { buildCss } from "../../utilities/props";
|
4
|
-
import { globalProps } from "../../utilities/globalProps";
|
5
2
|
import LoadingInline from "../../pb_loading_inline/_loading_inline"
|
6
3
|
import { flexRender, Row } from "@tanstack/react-table"
|
7
4
|
|
@@ -13,45 +10,28 @@ import { isChrome } from "../Utilities/BrowserCheck"
|
|
13
10
|
import { DataType } from "../Utilities/types"
|
14
11
|
|
15
12
|
type TableBodyProps = {
|
16
|
-
className?: string;
|
17
13
|
collapsibleTrail?: boolean
|
18
|
-
id?: string;
|
19
14
|
subRowHeaders?: string[]
|
20
15
|
}
|
21
16
|
|
22
17
|
export const TableBody = ({
|
23
|
-
className,
|
24
18
|
collapsibleTrail = true,
|
25
|
-
id,
|
26
19
|
subRowHeaders,
|
27
|
-
...props
|
28
20
|
}: TableBodyProps) => {
|
29
|
-
|
30
21
|
const {
|
31
|
-
columnDefinitions,
|
32
22
|
enableToggleExpansion,
|
33
23
|
handleExpandOrCollapse,
|
34
24
|
loading,
|
35
25
|
table,
|
36
26
|
} = useContext(AdvancedTableContext)
|
37
|
-
|
38
|
-
const classes = classnames(
|
39
|
-
buildCss("pb_advanced_table_body"),
|
40
|
-
globalProps(props),
|
41
|
-
className
|
42
|
-
);
|
43
|
-
|
44
27
|
return (
|
45
28
|
<>
|
46
|
-
<tbody
|
47
|
-
id={id}
|
48
|
-
>
|
29
|
+
<tbody>
|
49
30
|
{table.getRowModel().rows.map((row: Row<DataType>) => {
|
50
31
|
const isExpandable = row.getIsExpanded()
|
51
32
|
const isFirstChildofSubrow = row.depth > 0 && row.index === 0
|
52
|
-
const rowHasNoChildren =
|
33
|
+
const rowHasNoChildren = !row.original.children?.length
|
53
34
|
const numberOfColumns = table.getAllFlatColumns().length
|
54
|
-
const isDataLoading = isExpandable && rowHasNoChildren && (row.depth < columnDefinitions[0].cellAccessors?.length)
|
55
35
|
|
56
36
|
return (
|
57
37
|
<React.Fragment key={`${row.index}-${row.id}-${row.depth}-row`}>
|
@@ -99,11 +79,9 @@ export const TableBody = ({
|
|
99
79
|
</tr>
|
100
80
|
|
101
81
|
{/* Display LoadingInline if Row Data is querying and there are no children already */}
|
102
|
-
{
|
82
|
+
{isExpandable && rowHasNoChildren && row.depth === 0 ? (
|
103
83
|
<tr key={`${row.id}-row`}>
|
104
|
-
<td colSpan={numberOfColumns}
|
105
|
-
style={{ paddingLeft: `${row.depth === 0 ? 0.5 : (row.depth * 2)}em` }}
|
106
|
-
>
|
84
|
+
<td colSpan={numberOfColumns}>
|
107
85
|
<LoadingInline />
|
108
86
|
</td>
|
109
87
|
</tr>
|
@@ -1,7 +1,4 @@
|
|
1
1
|
import React, { useContext } from "react"
|
2
|
-
import classnames from "classnames";
|
3
|
-
import { buildCss } from "../../utilities/props";
|
4
|
-
import { globalProps } from "../../utilities/globalProps";
|
5
2
|
import { HeaderGroup } from "@tanstack/react-table"
|
6
3
|
import AdvancedTableContext from "../Context/AdvancedTableContext"
|
7
4
|
import { TableHeaderCell } from "../Components/TableHeaderCell"
|
@@ -9,19 +6,16 @@ import { DataType } from "../Utilities/types"
|
|
9
6
|
|
10
7
|
type TableHeaderProps = {
|
11
8
|
children?: React.ReactNode | React.ReactNode[]
|
12
|
-
className?: string
|
13
9
|
enableSorting?: boolean
|
14
|
-
|
10
|
+
headerId?: string
|
15
11
|
sortIcon?: string | string[]
|
16
12
|
}
|
17
13
|
|
18
14
|
export const TableHeader = ({
|
19
15
|
children,
|
20
|
-
className,
|
21
16
|
enableSorting = false,
|
22
|
-
|
17
|
+
headerId,
|
23
18
|
sortIcon = ["arrow-up-short-wide", "arrow-down-short-wide"],
|
24
|
-
...props
|
25
19
|
}: TableHeaderProps) => {
|
26
20
|
const {
|
27
21
|
enableToggleExpansion,
|
@@ -30,18 +24,9 @@ export const TableHeader = ({
|
|
30
24
|
table,
|
31
25
|
} = useContext(AdvancedTableContext)
|
32
26
|
|
33
|
-
const classes = classnames(
|
34
|
-
buildCss("pb_advanced_table_header"),
|
35
|
-
globalProps(props),
|
36
|
-
className
|
37
|
-
);
|
38
|
-
|
39
|
-
|
40
27
|
return (
|
41
28
|
<>
|
42
|
-
<thead
|
43
|
-
id={id}
|
44
|
-
>
|
29
|
+
<thead>
|
45
30
|
{/* Get the header groups (only one in this example) */}
|
46
31
|
{table.getHeaderGroups().map((headerGroup: HeaderGroup<DataType>) => (
|
47
32
|
<tr key={`${headerGroup.id}-headerGroup`}>
|
@@ -52,6 +37,7 @@ export const TableHeader = ({
|
|
52
37
|
handleExpandOrCollapse={handleExpandOrCollapse}
|
53
38
|
header={header}
|
54
39
|
headerChildren={children}
|
40
|
+
headerId={headerId}
|
55
41
|
key={`${header.id}-header`}
|
56
42
|
loading={loading}
|
57
43
|
sortIcon={sortIcon}
|
@@ -24,9 +24,10 @@ export const updateExpandAndCollapseState = (
|
|
24
24
|
// Update isExpansionConsistent variable
|
25
25
|
for (const row of rows) {
|
26
26
|
if (
|
27
|
-
|
27
|
+
row.getCanExpand() &&
|
28
|
+
(targetParent === undefined
|
28
29
|
? row.depth === 0
|
29
|
-
: targetParent === row.parentId
|
30
|
+
: targetParent === row.parentId)
|
30
31
|
) {
|
31
32
|
areRowsExpanded.add(row.getIsExpanded())
|
32
33
|
if (areRowsExpanded.size > 1) {
|
@@ -47,7 +48,7 @@ export const updateExpandAndCollapseState = (
|
|
47
48
|
})
|
48
49
|
} else {
|
49
50
|
for (const row of rows) {
|
50
|
-
if (targetParent === row.parentId) {
|
51
|
+
if (row.getCanExpand() && targetParent === row.parentId) {
|
51
52
|
updateExpandedRows[row.id] = !isExpansionConsistent
|
52
53
|
? true
|
53
54
|
: !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
|
3
|
+
import { buildAriaProps, buildCss, buildDataProps } from "../utilities/props";
|
4
4
|
import { globalProps, GlobalProps } from "../utilities/globalProps";
|
5
5
|
import Table from "../pb_table/_table";
|
6
6
|
import {
|
@@ -28,9 +28,8 @@ type AdvancedTableProps = {
|
|
28
28
|
className?: string;
|
29
29
|
columnDefinitions: DataType[];
|
30
30
|
data?: { [key: string]: string };
|
31
|
-
enableToggleExpansion?: "all" | "header"
|
31
|
+
enableToggleExpansion?: "all" | "header";
|
32
32
|
expandedControl?: DataType;
|
33
|
-
htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
|
34
33
|
id?: string;
|
35
34
|
initialLoadingRowsCount?: number;
|
36
35
|
loading?: boolean | string;
|
@@ -52,7 +51,6 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
52
51
|
data = {},
|
53
52
|
enableToggleExpansion = "header",
|
54
53
|
expandedControl,
|
55
|
-
htmlOptions = {},
|
56
54
|
id,
|
57
55
|
initialLoadingRowsCount = 10,
|
58
56
|
loading,
|
@@ -106,9 +104,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
106
104
|
const depthAccessor = cellAccessors[row.depth - 1]; // Adjust index for depth
|
107
105
|
const accessorValue = rowData[depthAccessor];
|
108
106
|
return accessorValue ? (
|
109
|
-
<CustomCell
|
110
|
-
onRowToggleClick={onRowToggleClick}
|
111
|
-
row={row}
|
107
|
+
<CustomCell row={row}
|
112
108
|
value={accessorValue}
|
113
109
|
/>
|
114
110
|
) : (
|
@@ -199,7 +195,6 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
199
195
|
|
200
196
|
const ariaProps = buildAriaProps(aria);
|
201
197
|
const dataProps = buildDataProps(data);
|
202
|
-
const htmlProps = buildHtmlProps(htmlOptions);
|
203
198
|
const classes = classnames(
|
204
199
|
buildCss("pb_advanced_table"),
|
205
200
|
globalProps(props),
|
@@ -209,21 +204,19 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
209
204
|
return (
|
210
205
|
<div {...ariaProps}
|
211
206
|
{...dataProps}
|
212
|
-
{...htmlProps}
|
213
207
|
className={classes}
|
214
208
|
id={id}
|
215
209
|
>
|
216
210
|
<AdvancedTableContext.Provider
|
217
211
|
value={{
|
218
|
-
|
219
|
-
enableToggleExpansion,
|
220
|
-
expanded,
|
212
|
+
table,
|
221
213
|
handleExpandOrCollapse,
|
222
214
|
loading,
|
215
|
+
enableToggleExpansion,
|
216
|
+
toggleExpansionIcon,
|
223
217
|
setExpanded,
|
218
|
+
expanded,
|
224
219
|
sortControl,
|
225
|
-
table,
|
226
|
-
toggleExpansionIcon,
|
227
220
|
}}
|
228
221
|
>
|
229
222
|
<Table
|
@@ -343,39 +343,3 @@ 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.18.0.pre.alpha.
|
4
|
+
version: 13.18.0.pre.alpha.dependabotnpmandyarnpowerhomeplaybookicons001alpha52174
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Power UX
|