@patternfly/react-table 6.0.0-alpha.5 → 6.0.0-alpha.51
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.
- package/CHANGELOG.md +812 -18
- package/components/package.json +1 -1
- package/deprecated/package.json +1 -1
- package/dist/dynamic/components/Table/package.json +1 -1
- package/dist/dynamic/components/Table/utils/decorators/package.json +1 -1
- package/dist/dynamic/components/Table/utils/package.json +1 -1
- package/dist/dynamic/deprecated/components/Table/base/package.json +1 -1
- package/dist/dynamic/deprecated/components/Table/package.json +1 -1
- package/dist/dynamic/deprecated/components/package.json +1 -1
- package/dist/esm/components/Table/ActionsColumn.d.ts +2 -0
- package/dist/esm/components/Table/ActionsColumn.d.ts.map +1 -1
- package/dist/esm/components/Table/ActionsColumn.js +4 -5
- package/dist/esm/components/Table/ActionsColumn.js.map +1 -1
- package/dist/esm/components/Table/EditableSelectInputCell.js +1 -1
- package/dist/esm/components/Table/EditableSelectInputCell.js.map +1 -1
- package/dist/esm/components/Table/EditableTextCell.js +1 -1
- package/dist/esm/components/Table/EditableTextCell.js.map +1 -1
- package/dist/esm/components/Table/SelectColumn.d.ts +5 -0
- package/dist/esm/components/Table/SelectColumn.d.ts.map +1 -1
- package/dist/esm/components/Table/SelectColumn.js +6 -3
- package/dist/esm/components/Table/SelectColumn.js.map +1 -1
- package/dist/esm/components/Table/SortColumn.d.ts +4 -0
- package/dist/esm/components/Table/SortColumn.d.ts.map +1 -1
- package/dist/esm/components/Table/SortColumn.js +2 -2
- package/dist/esm/components/Table/SortColumn.js.map +1 -1
- package/dist/esm/components/Table/Table.js +2 -2
- package/dist/esm/components/Table/TableText.d.ts +3 -1
- package/dist/esm/components/Table/TableText.d.ts.map +1 -1
- package/dist/esm/components/Table/TableText.js +12 -10
- package/dist/esm/components/Table/TableText.js.map +1 -1
- package/dist/esm/components/Table/TableTypes.d.ts +5 -0
- package/dist/esm/components/Table/TableTypes.d.ts.map +1 -1
- package/dist/esm/components/Table/Td.d.ts +1 -1
- package/dist/esm/components/Table/Th.d.ts +11 -0
- package/dist/esm/components/Table/Th.d.ts.map +1 -1
- package/dist/esm/components/Table/Th.js +20 -9
- package/dist/esm/components/Table/Th.js.map +1 -1
- package/dist/esm/components/Table/utils/decorators/selectable.d.ts.map +1 -1
- package/dist/esm/components/Table/utils/decorators/selectable.js +3 -3
- package/dist/esm/components/Table/utils/decorators/selectable.js.map +1 -1
- package/dist/esm/components/Table/utils/decorators/sortable.d.ts.map +1 -1
- package/dist/esm/components/Table/utils/decorators/sortable.js +6 -3
- package/dist/esm/components/Table/utils/decorators/sortable.js.map +1 -1
- package/dist/esm/components/Table/utils/decorators/treeRow.d.ts +1 -1
- package/dist/esm/demos/DashboardHeader.d.ts +8 -0
- package/dist/esm/demos/DashboardHeader.d.ts.map +1 -0
- package/dist/esm/demos/DashboardHeader.js +77 -0
- package/dist/esm/demos/DashboardHeader.js.map +1 -0
- package/dist/esm/demos/DashboardWrapper.d.ts +85 -0
- package/dist/esm/demos/DashboardWrapper.d.ts.map +1 -0
- package/dist/esm/demos/DashboardWrapper.js +41 -0
- package/dist/esm/demos/DashboardWrapper.js.map +1 -0
- package/dist/esm/demos/index.d.ts +2 -0
- package/dist/esm/demos/index.d.ts.map +1 -1
- package/dist/esm/demos/index.js +2 -0
- package/dist/esm/demos/index.js.map +1 -1
- package/dist/js/components/Table/ActionsColumn.d.ts +2 -0
- package/dist/js/components/Table/ActionsColumn.d.ts.map +1 -1
- package/dist/js/components/Table/ActionsColumn.js +4 -5
- package/dist/js/components/Table/ActionsColumn.js.map +1 -1
- package/dist/js/components/Table/EditableSelectInputCell.js +1 -1
- package/dist/js/components/Table/EditableSelectInputCell.js.map +1 -1
- package/dist/js/components/Table/EditableTextCell.js +1 -1
- package/dist/js/components/Table/EditableTextCell.js.map +1 -1
- package/dist/js/components/Table/SelectColumn.d.ts +5 -0
- package/dist/js/components/Table/SelectColumn.d.ts.map +1 -1
- package/dist/js/components/Table/SelectColumn.js +6 -3
- package/dist/js/components/Table/SelectColumn.js.map +1 -1
- package/dist/js/components/Table/SortColumn.d.ts +4 -0
- package/dist/js/components/Table/SortColumn.d.ts.map +1 -1
- package/dist/js/components/Table/SortColumn.js +3 -2
- package/dist/js/components/Table/SortColumn.js.map +1 -1
- package/dist/js/components/Table/Table.js +2 -2
- package/dist/js/components/Table/TableText.d.ts +3 -1
- package/dist/js/components/Table/TableText.d.ts.map +1 -1
- package/dist/js/components/Table/TableText.js +12 -10
- package/dist/js/components/Table/TableText.js.map +1 -1
- package/dist/js/components/Table/TableTypes.d.ts +5 -0
- package/dist/js/components/Table/TableTypes.d.ts.map +1 -1
- package/dist/js/components/Table/Td.d.ts +1 -1
- package/dist/js/components/Table/Th.d.ts +11 -0
- package/dist/js/components/Table/Th.d.ts.map +1 -1
- package/dist/js/components/Table/Th.js +20 -9
- package/dist/js/components/Table/Th.js.map +1 -1
- package/dist/js/components/Table/utils/decorators/selectable.d.ts.map +1 -1
- package/dist/js/components/Table/utils/decorators/selectable.js +3 -3
- package/dist/js/components/Table/utils/decorators/selectable.js.map +1 -1
- package/dist/js/components/Table/utils/decorators/sortable.d.ts.map +1 -1
- package/dist/js/components/Table/utils/decorators/sortable.js +6 -3
- package/dist/js/components/Table/utils/decorators/sortable.js.map +1 -1
- package/dist/js/components/Table/utils/decorators/treeRow.d.ts +1 -1
- package/dist/js/demos/DashboardHeader.d.ts +8 -0
- package/dist/js/demos/DashboardHeader.d.ts.map +1 -0
- package/dist/js/demos/DashboardHeader.js +82 -0
- package/dist/js/demos/DashboardHeader.js.map +1 -0
- package/dist/js/demos/DashboardWrapper.d.ts +85 -0
- package/dist/js/demos/DashboardWrapper.d.ts.map +1 -0
- package/dist/js/demos/DashboardWrapper.js +45 -0
- package/dist/js/demos/DashboardWrapper.js.map +1 -0
- package/dist/js/demos/index.d.ts +2 -0
- package/dist/js/demos/index.d.ts.map +1 -1
- package/dist/js/demos/index.js +2 -0
- package/dist/js/demos/index.js.map +1 -1
- package/dist/umd/react-table.min.js +3 -3
- package/package.json +6 -6
- package/single-packages.config.json +3 -6
- package/src/components/Table/ActionsColumn.tsx +35 -31
- package/src/components/Table/EditableSelectInputCell.tsx +1 -1
- package/src/components/Table/EditableTextCell.tsx +1 -1
- package/src/components/Table/SelectColumn.tsx +27 -8
- package/src/components/Table/SortColumn.tsx +15 -1
- package/src/components/Table/Table.tsx +2 -2
- package/src/components/Table/TableText.tsx +19 -9
- package/src/components/Table/TableTypes.tsx +5 -0
- package/src/components/Table/Td.tsx +1 -1
- package/src/components/Table/Th.tsx +36 -7
- package/src/components/Table/__tests__/Th.test.tsx +31 -0
- package/src/components/Table/__tests__/__snapshots__/RowWrapper.test.tsx.snap +2 -2
- package/src/components/Table/examples/TableActions.tsx +2 -2
- package/src/components/Table/examples/TableActionsOverflow.tsx +3 -4
- package/src/components/Table/examples/TableCompoundExpandable.tsx +1 -1
- package/src/components/Table/examples/TableDraggable.tsx +19 -16
- package/src/components/Table/examples/TableEmptyState.tsx +1 -8
- package/src/components/Table/examples/TableExpandable.tsx +1 -1
- package/src/components/Table/examples/TableNestedExpandable.tsx +1 -1
- package/src/components/Table/examples/TableNestedHeaders.tsx +4 -6
- package/src/components/Table/examples/TableNestedStickyHeader.tsx +4 -9
- package/src/components/Table/examples/TableNestedTableExpandable.tsx +1 -1
- package/src/components/Table/examples/TableSelectable.tsx +1 -0
- package/src/components/Table/examples/TableSelectableRadio.tsx +1 -1
- package/src/components/Table/examples/TableSortableCustom.tsx +2 -3
- package/src/components/Table/examples/TableStickyColumnsAndHeader.tsx +1 -1
- package/src/components/Table/examples/TableStripedExpandable.tsx +1 -1
- package/src/components/Table/utils/__snapshots__/transformers.test.tsx.snap +2 -2
- package/src/components/Table/utils/decorators/selectable.tsx +3 -2
- package/src/components/Table/utils/decorators/sortable.tsx +8 -2
- package/src/demos/DashboardHeader.tsx +198 -0
- package/src/demos/DashboardWrapper.tsx +199 -0
- package/src/demos/Table.md +28 -4
- package/src/demos/assets/avatarImg.svg +18 -0
- package/src/demos/assets/index.d.ts +4 -0
- package/src/demos/assets/pf-logo.svg +28 -0
- package/src/demos/examples/TableBulkSelect.tsx +2 -2
- package/src/demos/examples/TableColumnManagement.tsx +1 -1
- package/src/demos/examples/TableColumnManagementWithDraggable.tsx +2 -6
- package/src/demos/examples/TableCompact.tsx +8 -3
- package/src/demos/examples/TableCompoundExpansion.tsx +4 -3
- package/src/demos/examples/TableEmptyStateDefault.tsx +1 -1
- package/src/demos/examples/TableEmptyStateError.tsx +1 -1
- package/src/demos/examples/TableEmptyStateLoading.tsx +1 -1
- package/src/demos/examples/TableExpandCollapseAll.tsx +3 -2
- package/src/demos/examples/TableSortableResponsive.tsx +8 -9
- package/src/demos/examples/TableStaticBottomPagination.tsx +8 -3
- package/src/demos/examples/TableStickyFirstColumn.tsx +1 -1
- package/src/demos/examples/TableStickyHeader.tsx +1 -1
- package/src/demos/index.ts +2 -0
- package/src/deprecated/components/Table/__tests__/__snapshots__/Table.test.tsx.snap +1960 -1878
- package/src/deprecated/components/Table/examples/LegacyTableEmptyState.tsx +6 -8
- package/src/deprecated/components/Table/examples/LegacyTableSortableCustom.tsx +2 -3
|
@@ -4,10 +4,8 @@ import {
|
|
|
4
4
|
Bullseye,
|
|
5
5
|
EmptyState,
|
|
6
6
|
EmptyStateVariant,
|
|
7
|
-
EmptyStateIcon,
|
|
8
7
|
EmptyStateBody,
|
|
9
8
|
Button,
|
|
10
|
-
EmptyStateHeader,
|
|
11
9
|
EmptyStateFooter,
|
|
12
10
|
EmptyStateActions
|
|
13
11
|
} from '@patternfly/react-core';
|
|
@@ -31,12 +29,7 @@ export const TableEmptyState: React.FunctionComponent = () => (
|
|
|
31
29
|
<Tr>
|
|
32
30
|
<Td colSpan={8}>
|
|
33
31
|
<Bullseye>
|
|
34
|
-
<EmptyState variant={EmptyStateVariant.sm}>
|
|
35
|
-
<EmptyStateHeader
|
|
36
|
-
icon={<EmptyStateIcon icon={SearchIcon} />}
|
|
37
|
-
titleText="No results found"
|
|
38
|
-
headingLevel="h2"
|
|
39
|
-
/>
|
|
32
|
+
<EmptyState headingLevel="h2" titleText="No results found" icon={SearchIcon} variant={EmptyStateVariant.sm}>
|
|
40
33
|
<EmptyStateBody>Clear all filters and try again.</EmptyStateBody>
|
|
41
34
|
<EmptyStateFooter>
|
|
42
35
|
<EmptyStateActions>
|
|
@@ -120,7 +120,7 @@ export const TableExpandable: React.FunctionComponent = () => {
|
|
|
120
120
|
<Table aria-label="Expandable table" variant={isExampleCompact ? 'compact' : undefined}>
|
|
121
121
|
<Thead>
|
|
122
122
|
<Tr>
|
|
123
|
-
<Th />
|
|
123
|
+
<Th screenReaderText="Row expansion" />
|
|
124
124
|
<Th width={25}>{columnNames.name}</Th>
|
|
125
125
|
<Th width={10}>{columnNames.branches}</Th>
|
|
126
126
|
<Th width={15}>{columnNames.prs}</Th>
|
|
@@ -64,7 +64,7 @@ export const TableNestedExpandable: React.FunctionComponent = () => {
|
|
|
64
64
|
<Table aria-label="Nested column headers with expandable rows table" gridBreakPoint="">
|
|
65
65
|
<Thead hasNestedHeader>
|
|
66
66
|
<Tr>
|
|
67
|
-
<Th rowSpan={2} />
|
|
67
|
+
<Th screenReaderText="Row expansion" rowSpan={2} />
|
|
68
68
|
<Th width={35} rowSpan={2} hasRightBorder>
|
|
69
69
|
{columnNames.team}
|
|
70
70
|
</Th>
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { Table, Thead, Tr, Th, Tbody, Td, InnerScrollContainer, ThProps } from '@patternfly/react-table';
|
|
3
|
-
import { Stack, StackItem } from '@patternfly/react-core';
|
|
4
|
-
import textStyles from '@patternfly/react-styles/css/utilities/Text/text';
|
|
5
|
-
|
|
3
|
+
import { Stack, StackItem, Timestamp } from '@patternfly/react-core';
|
|
6
4
|
interface PodConnection {
|
|
7
5
|
source: {
|
|
8
6
|
podName: string;
|
|
@@ -163,7 +161,7 @@ export const TableNestedHeaders: React.FunctionComponent = () => {
|
|
|
163
161
|
<Td dataLabel={columnNames.datetime}>
|
|
164
162
|
<div>
|
|
165
163
|
<span>{new Date(connection.timestamp).toDateString()}</span>{' '}
|
|
166
|
-
<
|
|
164
|
+
<Timestamp>{new Date(connection.timestamp).toLocaleTimeString()}</Timestamp>
|
|
167
165
|
</div>
|
|
168
166
|
</Td>
|
|
169
167
|
<Td dataLabel={columnNames.source}>
|
|
@@ -172,7 +170,7 @@ export const TableNestedHeaders: React.FunctionComponent = () => {
|
|
|
172
170
|
<span>{connection.source.port.num}</span>
|
|
173
171
|
</StackItem>
|
|
174
172
|
<StackItem>
|
|
175
|
-
<
|
|
173
|
+
<Timestamp>({connection.source.port.protocol})</Timestamp>
|
|
176
174
|
</StackItem>
|
|
177
175
|
</Stack>
|
|
178
176
|
</Td>
|
|
@@ -182,7 +180,7 @@ export const TableNestedHeaders: React.FunctionComponent = () => {
|
|
|
182
180
|
<span>{connection.destination.port.num}</span>
|
|
183
181
|
</StackItem>
|
|
184
182
|
<StackItem>
|
|
185
|
-
<
|
|
183
|
+
<Timestamp>({connection.destination.port.protocol})</Timestamp>
|
|
186
184
|
</StackItem>
|
|
187
185
|
</Stack>
|
|
188
186
|
</Td>
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { Table, Thead, Tr, Th, Tbody, Td, InnerScrollContainer, ThProps } from '@patternfly/react-table';
|
|
3
|
-
import { Stack, StackItem } from '@patternfly/react-core';
|
|
4
|
-
import textStyles from '@patternfly/react-styles/css/utilities/Text/text';
|
|
5
|
-
|
|
3
|
+
import { Stack, StackItem, Timestamp } from '@patternfly/react-core';
|
|
6
4
|
interface PodConnection {
|
|
7
5
|
source: {
|
|
8
6
|
podName: string;
|
|
@@ -154,9 +152,6 @@ export const TableNestedHeaders: React.FunctionComponent = () => {
|
|
|
154
152
|
{columnNames.destination}
|
|
155
153
|
</Th>
|
|
156
154
|
</Tr>
|
|
157
|
-
<Tr isBorderRow aria-hidden="true">
|
|
158
|
-
<Td colSpan={9}></Td>
|
|
159
|
-
</Tr>
|
|
160
155
|
</Thead>
|
|
161
156
|
<Tbody>
|
|
162
157
|
{sortedConnections.map((connection) => (
|
|
@@ -166,7 +161,7 @@ export const TableNestedHeaders: React.FunctionComponent = () => {
|
|
|
166
161
|
<Td dataLabel={columnNames.datetime}>
|
|
167
162
|
<div>
|
|
168
163
|
<span>{new Date(connection.timestamp).toDateString()}</span>{' '}
|
|
169
|
-
<
|
|
164
|
+
<Timestamp>{new Date(connection.timestamp).toLocaleTimeString()}</Timestamp>
|
|
170
165
|
</div>
|
|
171
166
|
</Td>
|
|
172
167
|
<Td dataLabel={columnNames.source}>
|
|
@@ -175,7 +170,7 @@ export const TableNestedHeaders: React.FunctionComponent = () => {
|
|
|
175
170
|
<span>{connection.source.port.num}</span>
|
|
176
171
|
</StackItem>
|
|
177
172
|
<StackItem>
|
|
178
|
-
<
|
|
173
|
+
<Timestamp>({connection.source.port.protocol})</Timestamp>
|
|
179
174
|
</StackItem>
|
|
180
175
|
</Stack>
|
|
181
176
|
</Td>
|
|
@@ -185,7 +180,7 @@ export const TableNestedHeaders: React.FunctionComponent = () => {
|
|
|
185
180
|
<span>{connection.destination.port.num}</span>
|
|
186
181
|
</StackItem>
|
|
187
182
|
<StackItem>
|
|
188
|
-
<
|
|
183
|
+
<Timestamp>({connection.destination.port.protocol})</Timestamp>
|
|
189
184
|
</StackItem>
|
|
190
185
|
</Stack>
|
|
191
186
|
</Td>
|
|
@@ -131,7 +131,7 @@ export const TableExpandable: React.FunctionComponent = () => {
|
|
|
131
131
|
<Table aria-label="Simple table">
|
|
132
132
|
<Thead>
|
|
133
133
|
<Tr>
|
|
134
|
-
<
|
|
134
|
+
<Th screenReaderText="Row expansion" />
|
|
135
135
|
<Th width={20}>{columnNames.name}</Th>
|
|
136
136
|
<Th>{columnNames.branches}</Th>
|
|
137
137
|
<Th>{columnNames.prs}</Th>
|
|
@@ -93,6 +93,7 @@ export const TableSelectable: React.FunctionComponent = () => {
|
|
|
93
93
|
onSelect: (_event, isSelecting) => selectAllRepos(isSelecting),
|
|
94
94
|
isSelected: areAllReposSelected
|
|
95
95
|
}}
|
|
96
|
+
aria-label="Row select"
|
|
96
97
|
/>
|
|
97
98
|
<Th>{columnNames.name}</Th>
|
|
98
99
|
<Th>{columnNames.branches}</Th>
|
|
@@ -35,7 +35,7 @@ export const TableSelectableRadio: React.FunctionComponent = () => {
|
|
|
35
35
|
<Table aria-label="Selectable table">
|
|
36
36
|
<Thead>
|
|
37
37
|
<Tr>
|
|
38
|
-
<Th />
|
|
38
|
+
<Th screenReaderText="Row select" />
|
|
39
39
|
<Th>{columnNames.name}</Th>
|
|
40
40
|
<Th>{columnNames.branches}</Th>
|
|
41
41
|
<Th>{columnNames.prs}</Th>
|
|
@@ -117,9 +117,8 @@ export const TableSortableCustom: React.FunctionComponent = () => {
|
|
|
117
117
|
isExpanded={isSortDropdownOpen}
|
|
118
118
|
variant="plain"
|
|
119
119
|
aria-label="Sort columns"
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
</MenuToggle>
|
|
120
|
+
icon={<SortAmountDownIcon />}
|
|
121
|
+
/>
|
|
123
122
|
)}
|
|
124
123
|
>
|
|
125
124
|
<SelectGroup label="Sort column">
|
|
@@ -98,7 +98,7 @@ export const TableStickyColumnsAndHeader: React.FunctionComponent = () => {
|
|
|
98
98
|
});
|
|
99
99
|
|
|
100
100
|
return (
|
|
101
|
-
<div style={{ height: '
|
|
101
|
+
<div style={{ height: '400px' }}>
|
|
102
102
|
<OuterScrollContainer>
|
|
103
103
|
<InnerScrollContainer>
|
|
104
104
|
<Table aria-label="Sticky columns and header table" gridBreakPoint="" isStickyHeader>
|
|
@@ -115,7 +115,7 @@ export const TableStripedExpandable: React.FunctionComponent = () => {
|
|
|
115
115
|
<Table aria-label="Expandable table" variant={isExampleCompact ? 'compact' : undefined} isStriped isExpandable>
|
|
116
116
|
<Thead>
|
|
117
117
|
<Tr>
|
|
118
|
-
<Th />
|
|
118
|
+
<Th screenReaderText="Row expansion" />
|
|
119
119
|
<Th width={25}>{columnNames.name}</Th>
|
|
120
120
|
<Th width={10}>{columnNames.branches}</Th>
|
|
121
121
|
<Th width={15}>{columnNames.prs}</Th>
|
|
@@ -10,7 +10,7 @@ Object {
|
|
|
10
10
|
>
|
|
11
11
|
|
|
12
12
|
</SelectColumn>,
|
|
13
|
-
"className": "pf-
|
|
13
|
+
"className": "pf-v6-c-table__check",
|
|
14
14
|
"component": "td",
|
|
15
15
|
"isVisible": true,
|
|
16
16
|
}
|
|
@@ -26,6 +26,6 @@ Object {
|
|
|
26
26
|
>
|
|
27
27
|
|
|
28
28
|
</SortColumn>,
|
|
29
|
-
"className": "pf-
|
|
29
|
+
"className": "pf-v6-c-table__sort pf-m-selected",
|
|
30
30
|
}
|
|
31
31
|
`;
|
|
@@ -7,7 +7,7 @@ import checkStyles from '@patternfly/react-styles/css/components/Check/check';
|
|
|
7
7
|
|
|
8
8
|
export const selectable: ITransform = (
|
|
9
9
|
label: IFormatterValueType,
|
|
10
|
-
{ rowIndex, columnIndex, rowData, column, property }: IExtra
|
|
10
|
+
{ rowIndex, columnIndex, rowData, column, property, tooltip }: IExtra
|
|
11
11
|
) => {
|
|
12
12
|
const {
|
|
13
13
|
extraParams: { onSelect, selectVariant, allRowsSelected, isHeaderSelectDisabled }
|
|
@@ -61,7 +61,7 @@ export const selectable: ITransform = (
|
|
|
61
61
|
|
|
62
62
|
return {
|
|
63
63
|
className: css(styles.tableCheck),
|
|
64
|
-
component: 'td',
|
|
64
|
+
component: rowId !== -1 ? 'td' : 'th',
|
|
65
65
|
isVisible: !rowData || !rowData.fullWidth,
|
|
66
66
|
children: (
|
|
67
67
|
<SelectColumn
|
|
@@ -69,6 +69,7 @@ export const selectable: ITransform = (
|
|
|
69
69
|
selectVariant={selectVariant as RowSelectVariant}
|
|
70
70
|
onSelect={selectClick}
|
|
71
71
|
name={selectName}
|
|
72
|
+
tooltip={tooltip}
|
|
72
73
|
>
|
|
73
74
|
{label as React.ReactNode}
|
|
74
75
|
</SelectColumn>
|
|
@@ -15,12 +15,15 @@ export const sortableFavorites = (sort: any) => () =>
|
|
|
15
15
|
sortBy: sort.sortBy,
|
|
16
16
|
onSort: sort?.onSort
|
|
17
17
|
}
|
|
18
|
-
}
|
|
18
|
+
},
|
|
19
|
+
tooltip: sort.tooltip,
|
|
20
|
+
tooltipProps: sort.tooltipProps,
|
|
21
|
+
tooltipHasDefaultBehavior: true
|
|
19
22
|
});
|
|
20
23
|
|
|
21
24
|
export const sortable: ITransform = (
|
|
22
25
|
label: IFormatterValueType,
|
|
23
|
-
{ columnIndex, column, property, className, ariaLabel }: IExtra
|
|
26
|
+
{ columnIndex, column, property, className, ariaLabel, tooltip, tooltipProps, tooltipHasDefaultBehavior }: IExtra
|
|
24
27
|
) => {
|
|
25
28
|
const {
|
|
26
29
|
extraParams: { sortBy, onSort }
|
|
@@ -56,6 +59,9 @@ export const sortable: ITransform = (
|
|
|
56
59
|
sortDirection={isSortedBy ? sortBy.direction : ''}
|
|
57
60
|
onSort={sortClicked}
|
|
58
61
|
aria-label={ariaLabel}
|
|
62
|
+
tooltip={tooltip}
|
|
63
|
+
tooltipProps={tooltipProps}
|
|
64
|
+
tooltipHasDefaultBehavior={tooltipHasDefaultBehavior}
|
|
59
65
|
>
|
|
60
66
|
{label as React.ReactNode}
|
|
61
67
|
</SortColumn>
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import {
|
|
3
|
+
Avatar,
|
|
4
|
+
Brand,
|
|
5
|
+
Button,
|
|
6
|
+
ButtonVariant,
|
|
7
|
+
Divider,
|
|
8
|
+
Dropdown,
|
|
9
|
+
DropdownGroup,
|
|
10
|
+
DropdownItem,
|
|
11
|
+
DropdownList,
|
|
12
|
+
Masthead,
|
|
13
|
+
MastheadToggle,
|
|
14
|
+
MastheadMain,
|
|
15
|
+
MastheadBrand,
|
|
16
|
+
MastheadContent,
|
|
17
|
+
MenuToggle,
|
|
18
|
+
Toolbar,
|
|
19
|
+
ToolbarContent,
|
|
20
|
+
ToolbarGroup,
|
|
21
|
+
ToolbarItem,
|
|
22
|
+
PageToggleButton
|
|
23
|
+
} from '@patternfly/react-core';
|
|
24
|
+
import BarsIcon from '@patternfly/react-icons/dist/esm/icons/bars-icon';
|
|
25
|
+
import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon';
|
|
26
|
+
import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
|
|
27
|
+
import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';
|
|
28
|
+
import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
|
|
29
|
+
import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
|
|
30
|
+
import imgAvatar from '@patternfly/react-table/src/demos/assets/avatarImg.svg';
|
|
31
|
+
import pfLogo from '@patternfly/react-table/src/demos/assets/pf-logo.svg';
|
|
32
|
+
|
|
33
|
+
interface DashboardHeaderProps {
|
|
34
|
+
/** Render custom notification badge */
|
|
35
|
+
notificationBadge?: React.ReactNode;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export const DashboardHeader: React.FC<DashboardHeaderProps> = ({ notificationBadge }) => {
|
|
39
|
+
const [isDropdownOpen, setIsDropdownOpen] = useState(false);
|
|
40
|
+
const [isKebabDropdownOpen, setIsKebabDropdownOpen] = useState(false);
|
|
41
|
+
const [isFullKebabDropdownOpen, setIsFullKebabDropdownOpen] = useState(false);
|
|
42
|
+
|
|
43
|
+
const kebabDropdownItems = (
|
|
44
|
+
<>
|
|
45
|
+
<DropdownItem>
|
|
46
|
+
<CogIcon /> Settings
|
|
47
|
+
</DropdownItem>
|
|
48
|
+
<DropdownItem>
|
|
49
|
+
<HelpIcon /> Help
|
|
50
|
+
</DropdownItem>
|
|
51
|
+
</>
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
const userDropdownItems = (
|
|
55
|
+
<>
|
|
56
|
+
<DropdownItem key="group 2 profile">My profile</DropdownItem>
|
|
57
|
+
<DropdownItem key="group 2 user">User management</DropdownItem>
|
|
58
|
+
<DropdownItem key="group 2 logout">Logout</DropdownItem>
|
|
59
|
+
</>
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
const onDropdownToggle = () => {
|
|
63
|
+
setIsDropdownOpen(!isDropdownOpen);
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
const onDropdownSelect = () => {
|
|
67
|
+
setIsDropdownOpen(false);
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const onKebabDropdownToggle = () => {
|
|
71
|
+
setIsKebabDropdownOpen(!isKebabDropdownOpen);
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const onKebabDropdownSelect = () => {
|
|
75
|
+
setIsKebabDropdownOpen(false);
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
const onFullKebabToggle = () => {
|
|
79
|
+
setIsFullKebabDropdownOpen(!isFullKebabDropdownOpen);
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const onFullKebabSelect = () => {
|
|
83
|
+
setIsFullKebabDropdownOpen(false);
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
return (
|
|
87
|
+
<Masthead>
|
|
88
|
+
<MastheadToggle>
|
|
89
|
+
<PageToggleButton variant="plain" aria-label="Global navigation">
|
|
90
|
+
<BarsIcon />
|
|
91
|
+
</PageToggleButton>
|
|
92
|
+
</MastheadToggle>
|
|
93
|
+
<MastheadMain>
|
|
94
|
+
<MastheadBrand>
|
|
95
|
+
<Brand src={pfLogo} alt="PatternFly" heights={{ default: '36px' }} />
|
|
96
|
+
</MastheadBrand>
|
|
97
|
+
</MastheadMain>
|
|
98
|
+
<MastheadContent>
|
|
99
|
+
<Toolbar id="toolbar" isFullHeight isStatic>
|
|
100
|
+
<ToolbarContent>
|
|
101
|
+
<ToolbarGroup
|
|
102
|
+
variant="icon-button-group"
|
|
103
|
+
align={{ default: 'alignRight' }}
|
|
104
|
+
spacer={{ default: 'spacerNone', md: 'spacerMd' }}
|
|
105
|
+
>
|
|
106
|
+
{notificationBadge ?? (
|
|
107
|
+
<ToolbarItem>
|
|
108
|
+
<Button
|
|
109
|
+
aria-label="Notifications"
|
|
110
|
+
variant={ButtonVariant.plain}
|
|
111
|
+
icon={<BellIcon />}
|
|
112
|
+
onClick={() => {}}
|
|
113
|
+
/>
|
|
114
|
+
</ToolbarItem>
|
|
115
|
+
)}
|
|
116
|
+
<ToolbarGroup variant="icon-button-group" visibility={{ default: 'hidden', lg: 'visible' }}>
|
|
117
|
+
<ToolbarItem>
|
|
118
|
+
<Button aria-label="Settings" variant={ButtonVariant.plain} icon={<CogIcon />} />
|
|
119
|
+
</ToolbarItem>
|
|
120
|
+
<ToolbarItem>
|
|
121
|
+
<Button aria-label="Help" variant={ButtonVariant.plain} icon={<QuestionCircleIcon />} />
|
|
122
|
+
</ToolbarItem>
|
|
123
|
+
</ToolbarGroup>
|
|
124
|
+
<ToolbarItem visibility={{ default: 'hidden', md: 'visible', lg: 'hidden' }}>
|
|
125
|
+
<Dropdown
|
|
126
|
+
isOpen={isKebabDropdownOpen}
|
|
127
|
+
onSelect={onKebabDropdownSelect}
|
|
128
|
+
onOpenChange={setIsKebabDropdownOpen}
|
|
129
|
+
popperProps={{ position: 'right' }}
|
|
130
|
+
toggle={(toggleRef: React.RefObject<any>) => (
|
|
131
|
+
<MenuToggle
|
|
132
|
+
ref={toggleRef}
|
|
133
|
+
isExpanded={isKebabDropdownOpen}
|
|
134
|
+
onClick={onKebabDropdownToggle}
|
|
135
|
+
variant="plain"
|
|
136
|
+
aria-label="Settings and help"
|
|
137
|
+
>
|
|
138
|
+
<EllipsisVIcon aria-hidden="true" />
|
|
139
|
+
</MenuToggle>
|
|
140
|
+
)}
|
|
141
|
+
>
|
|
142
|
+
<DropdownList>{kebabDropdownItems}</DropdownList>
|
|
143
|
+
</Dropdown>
|
|
144
|
+
</ToolbarItem>
|
|
145
|
+
<ToolbarItem visibility={{ md: 'hidden' }}>
|
|
146
|
+
<Dropdown
|
|
147
|
+
isOpen={isFullKebabDropdownOpen}
|
|
148
|
+
onSelect={onFullKebabSelect}
|
|
149
|
+
onOpenChange={setIsFullKebabDropdownOpen}
|
|
150
|
+
popperProps={{ position: 'right' }}
|
|
151
|
+
toggle={(toggleRef: React.RefObject<any>) => (
|
|
152
|
+
<MenuToggle
|
|
153
|
+
ref={toggleRef}
|
|
154
|
+
isExpanded={isFullKebabDropdownOpen}
|
|
155
|
+
onClick={onFullKebabToggle}
|
|
156
|
+
variant="plain"
|
|
157
|
+
aria-label="Toolbar menu"
|
|
158
|
+
>
|
|
159
|
+
<EllipsisVIcon aria-hidden="true" />
|
|
160
|
+
</MenuToggle>
|
|
161
|
+
)}
|
|
162
|
+
>
|
|
163
|
+
<DropdownGroup key="group 2" aria-label="User actions">
|
|
164
|
+
<DropdownList>{userDropdownItems}</DropdownList>
|
|
165
|
+
</DropdownGroup>
|
|
166
|
+
<Divider />
|
|
167
|
+
<DropdownList>{kebabDropdownItems}</DropdownList>
|
|
168
|
+
</Dropdown>
|
|
169
|
+
</ToolbarItem>
|
|
170
|
+
</ToolbarGroup>
|
|
171
|
+
<ToolbarItem visibility={{ default: 'hidden', md: 'visible' }}>
|
|
172
|
+
<Dropdown
|
|
173
|
+
isOpen={isDropdownOpen}
|
|
174
|
+
onSelect={onDropdownSelect}
|
|
175
|
+
onOpenChange={setIsDropdownOpen}
|
|
176
|
+
popperProps={{ position: 'right' }}
|
|
177
|
+
toggle={(toggleRef: React.RefObject<any>) => (
|
|
178
|
+
<MenuToggle
|
|
179
|
+
ref={toggleRef}
|
|
180
|
+
isExpanded={isDropdownOpen}
|
|
181
|
+
onClick={onDropdownToggle}
|
|
182
|
+
icon={<Avatar src={imgAvatar} alt="" />}
|
|
183
|
+
isFullHeight
|
|
184
|
+
>
|
|
185
|
+
Ned Username
|
|
186
|
+
</MenuToggle>
|
|
187
|
+
)}
|
|
188
|
+
>
|
|
189
|
+
<DropdownList>{userDropdownItems}</DropdownList>
|
|
190
|
+
</Dropdown>
|
|
191
|
+
</ToolbarItem>
|
|
192
|
+
</ToolbarContent>
|
|
193
|
+
</Toolbar>
|
|
194
|
+
</MastheadContent>
|
|
195
|
+
</Masthead>
|
|
196
|
+
);
|
|
197
|
+
};
|
|
198
|
+
DashboardHeader.displayName = 'DashboardHeader';
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import {
|
|
3
|
+
Breadcrumb,
|
|
4
|
+
BreadcrumbItem,
|
|
5
|
+
Nav,
|
|
6
|
+
NavItem,
|
|
7
|
+
NavList,
|
|
8
|
+
Page,
|
|
9
|
+
PageSection,
|
|
10
|
+
PageSidebar,
|
|
11
|
+
PageSidebarBody,
|
|
12
|
+
SkipToContent,
|
|
13
|
+
Text,
|
|
14
|
+
TextContent
|
|
15
|
+
} from '@patternfly/react-core';
|
|
16
|
+
import { DashboardHeader } from './DashboardHeader';
|
|
17
|
+
|
|
18
|
+
interface DashboardWrapperProps {
|
|
19
|
+
/** Programmatically manage if the sidebar nav is shown */
|
|
20
|
+
sidebarNavOpen?: boolean;
|
|
21
|
+
/** Flag to render sample breadcrumb if custom breadcrumb not passed */
|
|
22
|
+
hasDefaultBreadcrumb?: boolean;
|
|
23
|
+
/** Flag to render sample page title if custom title not passed */
|
|
24
|
+
hasPageTemplateTitle?: boolean;
|
|
25
|
+
/** Content rendered inside the main section of the page layout (e.g. <PageSection />) */
|
|
26
|
+
children?: React.ReactNode;
|
|
27
|
+
/** Additional classes added to the page layout */
|
|
28
|
+
className?: string;
|
|
29
|
+
/** Header component (e.g. <Masthead />) */
|
|
30
|
+
header?: React.ReactNode;
|
|
31
|
+
/** Sidebar component for a side nav (e.g. <PageSidebar />) */
|
|
32
|
+
sidebar?: React.ReactNode;
|
|
33
|
+
/** Notification drawer component for an optional notification drawer (e.g. <NotificationDrawer />) */
|
|
34
|
+
notificationDrawer?: React.ReactNode;
|
|
35
|
+
/** Flag indicating Notification drawer in expanded */
|
|
36
|
+
isNotificationDrawerExpanded?: boolean;
|
|
37
|
+
/** Flag indicating if breadcrumb width should be limited */
|
|
38
|
+
isBreadcrumbWidthLimited?: boolean;
|
|
39
|
+
/** Callback when notification drawer panel is finished expanding. */
|
|
40
|
+
onNotificationDrawerExpand?: (event: KeyboardEvent | React.MouseEvent | React.TransitionEvent) => void;
|
|
41
|
+
/** Skip to content component for the page */
|
|
42
|
+
skipToContent?: React.ReactElement;
|
|
43
|
+
/** Sets the value for role on the <main> element */
|
|
44
|
+
role?: string;
|
|
45
|
+
/** an id to use for the [role="main"] element */
|
|
46
|
+
mainContainerId?: string;
|
|
47
|
+
/** tabIndex to use for the [role="main"] element, null to unset it */
|
|
48
|
+
mainTabIndex?: number | null;
|
|
49
|
+
/**
|
|
50
|
+
* If true, manages the sidebar open/close state and there is no need to pass the isSidebarOpen boolean into
|
|
51
|
+
* the sidebar component or add a callback onSidebarToggle function into the Masthead component
|
|
52
|
+
*/
|
|
53
|
+
isManagedSidebar?: boolean;
|
|
54
|
+
/** Flag indicating if tertiary nav width should be limited */
|
|
55
|
+
isTertiaryNavWidthLimited?: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* If true, the managed sidebar is initially open for desktop view
|
|
58
|
+
*/
|
|
59
|
+
defaultManagedSidebarIsOpen?: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Can add callback to be notified when resize occurs, for example to set the sidebar isSidebarOpen prop to false for a width < 768px
|
|
62
|
+
* Returns object { mobileView: boolean, windowSize: number }
|
|
63
|
+
*/
|
|
64
|
+
onPageResize?: ((event: MouseEvent | TouchEvent | React.KeyboardEvent, object: any) => void) | null;
|
|
65
|
+
/**
|
|
66
|
+
* The page resize observer uses the breakpoints returned from this function when adding the pf-m-breakpoint-[default|sm|md|lg|xl|2xl] class
|
|
67
|
+
* You can override the default getBreakpoint function to return breakpoints at different sizes than the default
|
|
68
|
+
* You can view the default getBreakpoint function here:
|
|
69
|
+
* https://github.com/patternfly/patternfly-react/blob/main/packages/react-core/src/helpers/util.ts
|
|
70
|
+
*/
|
|
71
|
+
getBreakpoint?: (width: number | null) => 'default' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
|
|
72
|
+
/**
|
|
73
|
+
* The page resize observer uses the breakpoints returned from this function when adding the pf-m-breakpoint-[default|sm|md|lg|xl|2xl] class
|
|
74
|
+
* You can override the default getVerticalBreakpoint function to return breakpoints at different sizes than the default
|
|
75
|
+
* You can view the default getVerticalBreakpoint function here:
|
|
76
|
+
* https://github.com/patternfly/patternfly-react/blob/main/packages/react-core/src/helpers/util.ts
|
|
77
|
+
*/
|
|
78
|
+
getVerticalBreakpoint?: (height: number | null) => 'default' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
|
|
79
|
+
/** Breadcrumb component for the page */
|
|
80
|
+
breadcrumb?: React.ReactNode;
|
|
81
|
+
/** Tertiary nav component for the page */
|
|
82
|
+
tertiaryNav?: React.ReactNode;
|
|
83
|
+
/** Accessible label, can be used to name main section */
|
|
84
|
+
mainAriaLabel?: string;
|
|
85
|
+
/** Flag indicating if the tertiaryNav should be in a group */
|
|
86
|
+
isTertiaryNavGrouped?: boolean;
|
|
87
|
+
/** Flag indicating if the breadcrumb should be in a group */
|
|
88
|
+
isBreadcrumbGrouped?: boolean;
|
|
89
|
+
/** Additional content of the group */
|
|
90
|
+
additionalGroupedContent?: React.ReactNode;
|
|
91
|
+
/** HTML component used as main component of the page. Defaults to 'main', only pass in 'div' if another 'main' element already exists. */
|
|
92
|
+
mainComponent?: 'main' | 'div';
|
|
93
|
+
/** Additional props of the group */
|
|
94
|
+
groupProps?: any;
|
|
95
|
+
/** Additional props of the breadcrumb */
|
|
96
|
+
breadcrumbProps?: any;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export const DashboardBreadcrumb = (
|
|
100
|
+
<Breadcrumb>
|
|
101
|
+
<BreadcrumbItem>Section home</BreadcrumbItem>
|
|
102
|
+
<BreadcrumbItem to="#">Section title</BreadcrumbItem>
|
|
103
|
+
<BreadcrumbItem to="#">Section title</BreadcrumbItem>
|
|
104
|
+
<BreadcrumbItem to="#" isActive>
|
|
105
|
+
Section landing
|
|
106
|
+
</BreadcrumbItem>
|
|
107
|
+
</Breadcrumb>
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
const PageTemplateTitle = (
|
|
111
|
+
<PageSection>
|
|
112
|
+
<TextContent>
|
|
113
|
+
<Text component="h1">Main title</Text>
|
|
114
|
+
<Text component="p">This is a full page demo.</Text>
|
|
115
|
+
</TextContent>
|
|
116
|
+
</PageSection>
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
export const DashboardWrapper: React.FC<DashboardWrapperProps> = ({
|
|
120
|
+
children,
|
|
121
|
+
mainContainerId,
|
|
122
|
+
breadcrumb,
|
|
123
|
+
header,
|
|
124
|
+
sidebar,
|
|
125
|
+
sidebarNavOpen,
|
|
126
|
+
onPageResize,
|
|
127
|
+
hasDefaultBreadcrumb,
|
|
128
|
+
notificationDrawer,
|
|
129
|
+
isNotificationDrawerExpanded,
|
|
130
|
+
hasPageTemplateTitle,
|
|
131
|
+
...pageProps
|
|
132
|
+
}: DashboardWrapperProps) => {
|
|
133
|
+
const [activeItem, setActiveItem] = useState(1);
|
|
134
|
+
|
|
135
|
+
const onNavSelect = (_event: React.FormEvent<HTMLInputElement>, result: any) => {
|
|
136
|
+
setActiveItem(result.itemId);
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
let renderedBreadcrumb;
|
|
140
|
+
if (!hasDefaultBreadcrumb) {
|
|
141
|
+
renderedBreadcrumb = breadcrumb ?? DashboardBreadcrumb;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const PageNav = (
|
|
145
|
+
<Nav onSelect={onNavSelect} aria-label="Nav">
|
|
146
|
+
<NavList>
|
|
147
|
+
<NavItem itemId={0} isActive={activeItem === 0} to="#system-panel">
|
|
148
|
+
System panel
|
|
149
|
+
</NavItem>
|
|
150
|
+
<NavItem itemId={1} isActive={activeItem === 1} to="#policy">
|
|
151
|
+
Policy
|
|
152
|
+
</NavItem>
|
|
153
|
+
<NavItem itemId={2} isActive={activeItem === 2} to="#auth">
|
|
154
|
+
Authentication
|
|
155
|
+
</NavItem>
|
|
156
|
+
<NavItem itemId={3} isActive={activeItem === 3} to="#network">
|
|
157
|
+
Network services
|
|
158
|
+
</NavItem>
|
|
159
|
+
<NavItem itemId={4} isActive={activeItem === 4} to="#server">
|
|
160
|
+
Server
|
|
161
|
+
</NavItem>
|
|
162
|
+
</NavList>
|
|
163
|
+
</Nav>
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
const _sidebar = (
|
|
167
|
+
<PageSidebar isSidebarOpen={sidebarNavOpen || false}>
|
|
168
|
+
<PageSidebarBody>{PageNav}</PageSidebarBody>
|
|
169
|
+
</PageSidebar>
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
const PageSkipToContent = (
|
|
173
|
+
<SkipToContent href={`#${mainContainerId ?? 'main-content-page-layout-default-nav'}`}>
|
|
174
|
+
Skip to content
|
|
175
|
+
</SkipToContent>
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
return (
|
|
179
|
+
<Page
|
|
180
|
+
header={header ?? <DashboardHeader />}
|
|
181
|
+
sidebar={sidebar ?? _sidebar}
|
|
182
|
+
isManagedSidebar
|
|
183
|
+
skipToContent={PageSkipToContent}
|
|
184
|
+
breadcrumb={renderedBreadcrumb}
|
|
185
|
+
mainContainerId={mainContainerId ?? 'main-content-page-layout-default-nav'}
|
|
186
|
+
notificationDrawer={notificationDrawer}
|
|
187
|
+
isNotificationDrawerExpanded={isNotificationDrawerExpanded}
|
|
188
|
+
{...(typeof onPageResize === 'function' && {
|
|
189
|
+
onPageResize: (event: MouseEvent | TouchEvent | React.KeyboardEvent<Element>, resizeObject: any) =>
|
|
190
|
+
onPageResize(event, resizeObject)
|
|
191
|
+
})}
|
|
192
|
+
{...pageProps}
|
|
193
|
+
>
|
|
194
|
+
{hasPageTemplateTitle && PageTemplateTitle}
|
|
195
|
+
{children}
|
|
196
|
+
</Page>
|
|
197
|
+
);
|
|
198
|
+
};
|
|
199
|
+
DashboardWrapper.displayName = 'DashboardWrapper';
|