@patternfly/react-table 6.0.0-alpha.2 → 6.0.0-alpha.4
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 +56 -0
- 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/Caption.js +1 -1
- package/dist/esm/components/Table/Caption.js.map +1 -1
- package/dist/esm/components/Table/CollapseColumn.js +1 -1
- package/dist/esm/components/Table/CollapseColumn.js.map +1 -1
- package/dist/esm/components/Table/DraggableRowWrapper.js +2 -2
- package/dist/esm/components/Table/DraggableRowWrapper.js.map +1 -1
- package/dist/esm/components/Table/EditColumn.js +1 -1
- package/dist/esm/components/Table/EditColumn.js.map +1 -1
- package/dist/esm/components/Table/EditableSelectInputCell.js +2 -2
- package/dist/esm/components/Table/EditableSelectInputCell.js.map +1 -1
- package/dist/esm/components/Table/EditableTextCell.js +2 -2
- package/dist/esm/components/Table/EditableTextCell.js.map +1 -1
- package/dist/esm/components/Table/ExpandableRowContent.js +1 -1
- package/dist/esm/components/Table/ExpandableRowContent.js.map +1 -1
- package/dist/esm/components/Table/HeaderCellInfoWrapper.js +1 -1
- package/dist/esm/components/Table/HeaderCellInfoWrapper.js.map +1 -1
- package/dist/esm/components/Table/InnerScrollContainer.js +1 -1
- package/dist/esm/components/Table/InnerScrollContainer.js.map +1 -1
- package/dist/esm/components/Table/OuterScrollContainer.js +1 -1
- package/dist/esm/components/Table/OuterScrollContainer.js.map +1 -1
- package/dist/esm/components/Table/SortColumn.js +1 -1
- package/dist/esm/components/Table/SortColumn.js.map +1 -1
- package/dist/esm/components/Table/Table.js +3 -3
- package/dist/esm/components/Table/Table.js.map +1 -1
- package/dist/esm/components/Table/TableText.js +1 -1
- package/dist/esm/components/Table/TableText.js.map +1 -1
- package/dist/esm/components/Table/Tbody.js +1 -1
- package/dist/esm/components/Table/Tbody.js.map +1 -1
- package/dist/esm/components/Table/Td.js +3 -3
- package/dist/esm/components/Table/Td.js.map +1 -1
- package/dist/esm/components/Table/Th.js +2 -2
- package/dist/esm/components/Table/Th.js.map +1 -1
- package/dist/esm/components/Table/Thead.js +1 -1
- package/dist/esm/components/Table/Thead.js.map +1 -1
- package/dist/esm/components/Table/Tr.js +2 -2
- package/dist/esm/components/Table/Tr.js.map +1 -1
- package/dist/esm/components/Table/TreeRowWrapper.js +2 -2
- package/dist/esm/components/Table/TreeRowWrapper.js.map +1 -1
- package/dist/esm/components/Table/utils/decorators/cellActions.js +1 -1
- package/dist/esm/components/Table/utils/decorators/cellActions.js.map +1 -1
- package/dist/esm/components/Table/utils/decorators/cellWidth.js +1 -1
- package/dist/esm/components/Table/utils/decorators/cellWidth.js.map +1 -1
- package/dist/esm/components/Table/utils/decorators/classNames.js +1 -1
- package/dist/esm/components/Table/utils/decorators/classNames.js.map +1 -1
- package/dist/esm/components/Table/utils/decorators/collapsible.js +1 -1
- package/dist/esm/components/Table/utils/decorators/collapsible.js.map +1 -1
- package/dist/esm/components/Table/utils/decorators/compoundExpand.js +1 -1
- package/dist/esm/components/Table/utils/decorators/compoundExpand.js.map +1 -1
- package/dist/esm/components/Table/utils/decorators/editable.js +1 -1
- package/dist/esm/components/Table/utils/decorators/editable.js.map +1 -1
- package/dist/esm/components/Table/utils/decorators/favoritable.js +1 -1
- package/dist/esm/components/Table/utils/decorators/favoritable.js.map +1 -1
- package/dist/esm/components/Table/utils/decorators/info.js +1 -1
- package/dist/esm/components/Table/utils/decorators/info.js.map +1 -1
- package/dist/esm/components/Table/utils/decorators/selectable.js +2 -2
- package/dist/esm/components/Table/utils/decorators/selectable.js.map +1 -1
- package/dist/esm/components/Table/utils/decorators/sortable.js +1 -1
- package/dist/esm/components/Table/utils/decorators/sortable.js.map +1 -1
- package/dist/esm/components/Table/utils/decorators/treeRow.js +2 -2
- package/dist/esm/components/Table/utils/decorators/treeRow.js.map +1 -1
- package/dist/esm/components/Table/utils/decorators/wrappable.js +1 -1
- package/dist/esm/components/Table/utils/decorators/wrappable.js.map +1 -1
- package/dist/esm/demos/index.d.ts +2 -0
- package/dist/esm/demos/index.d.ts.map +1 -0
- package/dist/esm/demos/index.js +2 -0
- package/dist/esm/demos/index.js.map +1 -0
- package/dist/esm/demos/sampleData.d.ts +13 -0
- package/dist/esm/demos/sampleData.d.ts.map +1 -0
- package/dist/esm/demos/sampleData.js +764 -0
- package/dist/esm/demos/sampleData.js.map +1 -0
- package/dist/esm/deprecated/components/Table/Table.js +1 -1
- package/dist/esm/deprecated/components/Table/Table.js.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/js/demos/index.d.ts +2 -0
- package/dist/js/demos/index.d.ts.map +1 -0
- package/dist/js/demos/index.js +5 -0
- package/dist/js/demos/index.js.map +1 -0
- package/dist/js/demos/sampleData.d.ts +13 -0
- package/dist/js/demos/sampleData.d.ts.map +1 -0
- package/dist/js/demos/sampleData.js +767 -0
- package/dist/js/demos/sampleData.js.map +1 -0
- package/dist/js/index.d.ts +1 -0
- package/dist/js/index.d.ts.map +1 -1
- package/dist/js/index.js +1 -0
- package/dist/js/index.js.map +1 -1
- package/dist/umd/react-table.min.js +3 -3
- package/package.json +6 -6
- package/src/components/Table/examples/TableStickyColumnsAndHeader.tsx +5 -4
- package/src/components/Table/utils/transformers.test.tsx +1 -0
- package/src/demos/Table.md +159 -0
- package/src/demos/examples/TableAutomaticPagination.tsx +101 -0
- package/src/{docs/demos/table-demos/BulkSelect.jsx → demos/examples/TableBulkSelect.tsx} +41 -20
- package/src/demos/examples/TableColumnManagement.tsx +486 -0
- package/src/demos/examples/TableColumnManagementWithDraggable.tsx +641 -0
- package/src/{docs/demos/table-demos/Compact.jsx → demos/examples/TableCompact.tsx} +32 -16
- package/src/{docs/demos/table-demos/CompoundExpansion.jsx → demos/examples/TableCompoundExpansion.tsx} +25 -12
- package/src/demos/examples/TableEmptyStateDefault.tsx +60 -0
- package/src/demos/examples/TableEmptyStateError.tsx +53 -0
- package/src/demos/examples/TableEmptyStateLoading.tsx +43 -0
- package/src/{docs/demos/table-demos/ExpandCollapseAll.jsx → demos/examples/TableExpandCollapseAll.tsx} +17 -10
- package/src/demos/examples/TableFilterable.tsx +394 -0
- package/src/{docs/demos/table-demos/SortableResponsive.jsx → demos/examples/TableSortableResponsive.tsx} +29 -27
- package/src/{docs/demos/table-demos/StaticBottomPagination.jsx → demos/examples/TableStaticBottomPagination.tsx} +22 -9
- package/src/{docs/demos/table-demos/StickyFirstColumn.jsx → demos/examples/TableStickyFirstColumn.tsx} +31 -9
- package/src/{docs/demos/table-demos/StickyHeader.jsx → demos/examples/TableStickyHeader.tsx} +3 -3
- package/src/demos/index.ts +1 -0
- package/src/{docs/demos/table-demos/sampleData.js → demos/sampleData.tsx} +88 -77
- package/src/deprecated/components/Table/__tests__/Table.test.tsx +4 -9
- package/src/index.ts +1 -0
- package/src/docs/demos/Table.md +0 -1620
- package/src/docs/demos/table-demos/ColumnManagement.jsx +0 -471
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@patternfly/react-table",
|
|
3
|
-
"version": "6.0.0-alpha.
|
|
3
|
+
"version": "6.0.0-alpha.4",
|
|
4
4
|
"description": "This library provides a set of React table components for use with the PatternFly 4",
|
|
5
5
|
"main": "dist/js/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -40,10 +40,10 @@
|
|
|
40
40
|
"subpaths": "node ../../scripts/exportSubpaths.js --config subpaths.config.json"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@patternfly/react-core": "^6.0.0-alpha.
|
|
44
|
-
"@patternfly/react-icons": "^6.0.0-alpha.
|
|
45
|
-
"@patternfly/react-styles": "^6.0.0-alpha.
|
|
46
|
-
"@patternfly/react-tokens": "^6.0.0-alpha.
|
|
43
|
+
"@patternfly/react-core": "^6.0.0-alpha.4",
|
|
44
|
+
"@patternfly/react-icons": "^6.0.0-alpha.3",
|
|
45
|
+
"@patternfly/react-styles": "^6.0.0-alpha.3",
|
|
46
|
+
"@patternfly/react-tokens": "^6.0.0-alpha.3",
|
|
47
47
|
"lodash": "^4.17.19",
|
|
48
48
|
"tslib": "^2.5.0"
|
|
49
49
|
},
|
|
@@ -55,5 +55,5 @@
|
|
|
55
55
|
"react": "^17 || ^18",
|
|
56
56
|
"react-dom": "^17 || ^18"
|
|
57
57
|
},
|
|
58
|
-
"gitHead": "
|
|
58
|
+
"gitHead": "a566e687735aab45907215a3ee70850908d12c70"
|
|
59
59
|
}
|
|
@@ -8,7 +8,8 @@ import {
|
|
|
8
8
|
Td,
|
|
9
9
|
InnerScrollContainer,
|
|
10
10
|
OuterScrollContainer,
|
|
11
|
-
ThProps
|
|
11
|
+
ThProps,
|
|
12
|
+
ISortBy
|
|
12
13
|
} from '@patternfly/react-table';
|
|
13
14
|
import BlueprintIcon from '@patternfly/react-icons/dist/esm/icons/blueprint-icon';
|
|
14
15
|
|
|
@@ -53,10 +54,10 @@ export const TableStickyColumnsAndHeader: React.FunctionComponent = () => {
|
|
|
53
54
|
// Index of the currently sorted column
|
|
54
55
|
// Note: if you intend to make columns reorderable, you may instead want to use a non-numeric key
|
|
55
56
|
// as the identifier of the sorted column. See the "Compound expandable" example.
|
|
56
|
-
const [activeSortIndex, setActiveSortIndex] = React.useState
|
|
57
|
+
const [activeSortIndex, setActiveSortIndex] = React.useState(-1);
|
|
57
58
|
|
|
58
59
|
// Sort direction of the currently sorted column
|
|
59
|
-
const [activeSortDirection, setActiveSortDirection] = React.useState<'
|
|
60
|
+
const [activeSortDirection, setActiveSortDirection] = React.useState<ISortBy['direction']>();
|
|
60
61
|
|
|
61
62
|
// Since OnSort specifies sorted columns by index, we need sortable values for our object by column index.
|
|
62
63
|
// This example is trivial since our data objects just contain strings, but if the data was more complex
|
|
@@ -69,7 +70,7 @@ export const TableStickyColumnsAndHeader: React.FunctionComponent = () => {
|
|
|
69
70
|
// Note that we perform the sort as part of the component's render logic and not in onSort.
|
|
70
71
|
// We shouldn't store the list of data in state because we don't want to have to sync that with props.
|
|
71
72
|
let sortedFacts = facts;
|
|
72
|
-
if (activeSortIndex
|
|
73
|
+
if (activeSortIndex > -1) {
|
|
73
74
|
sortedFacts = facts.sort((a, b) => {
|
|
74
75
|
const aValue = getSortableRowValues(a)[activeSortIndex];
|
|
75
76
|
const bValue = getSortableRowValues(b)[activeSortIndex];
|
|
@@ -76,6 +76,7 @@ const testCellActions = async ({
|
|
|
76
76
|
const { container } = render(returnedData.children as React.ReactElement<any>);
|
|
77
77
|
await user.click(screen.getAllByRole('button')[0]);
|
|
78
78
|
await waitFor(() =>
|
|
79
|
+
// eslint-disable-next-line testing-library/no-container
|
|
79
80
|
expect(container.querySelectorAll(`.${dropdownStyles.dropdownMenu} li button`)).toHaveLength(
|
|
80
81
|
expectDisabled ? 0 : 1
|
|
81
82
|
)
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: Table
|
|
3
|
+
section: components
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
Checkbox,
|
|
8
|
+
Label,
|
|
9
|
+
PageSection,
|
|
10
|
+
ToolbarExpandIconWrapper,
|
|
11
|
+
ToolbarContent,
|
|
12
|
+
Toolbar,
|
|
13
|
+
ToolbarItem,
|
|
14
|
+
SearchInput,
|
|
15
|
+
Masthead,
|
|
16
|
+
MastheadToggle,
|
|
17
|
+
MastheadMain,
|
|
18
|
+
MastheadContent,
|
|
19
|
+
SkipToContent,
|
|
20
|
+
Breadcrumb,
|
|
21
|
+
BreadcrumbItem,
|
|
22
|
+
Page,
|
|
23
|
+
PageSectionVariants,
|
|
24
|
+
TextContent,
|
|
25
|
+
Text,
|
|
26
|
+
Divider } from '@patternfly/react-core';
|
|
27
|
+
import { Table as TableDeprecated, TableHeader, TableBody } from '@patternfly/react-table/deprecated';
|
|
28
|
+
import CheckIcon from '@patternfly/react-icons/dist/esm/icons/check-icon';
|
|
29
|
+
import CloneIcon from '@patternfly/react-icons/dist/esm/icons/clone-icon';
|
|
30
|
+
import CodeIcon from '@patternfly/react-icons/dist/esm/icons/code-icon';
|
|
31
|
+
import CodeBranchIcon from '@patternfly/react-icons/dist/esm/icons/code-branch-icon';
|
|
32
|
+
import CubeIcon from '@patternfly/react-icons/dist/esm/icons/cube-icon';
|
|
33
|
+
import EditIcon from '@patternfly/react-icons/dist/esm/icons/edit-icon';
|
|
34
|
+
import FilterIcon from '@patternfly/react-icons/dist/esm/icons/filter-icon';
|
|
35
|
+
import SortAmountDownIcon from '@patternfly/react-icons/dist/esm/icons/sort-amount-down-icon';
|
|
36
|
+
import SearchIcon from '@patternfly/react-icons/dist/esm/icons/search-icon';
|
|
37
|
+
import SyncIcon from '@patternfly/react-icons/dist/esm/icons/sync-icon';
|
|
38
|
+
import ExclamationCircleIcon from '@patternfly/react-icons/dist/esm/icons/exclamation-circle-icon';
|
|
39
|
+
import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon';
|
|
40
|
+
import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
|
|
41
|
+
import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';
|
|
42
|
+
import globalDangerColor200 from '@patternfly/react-tokens/dist/esm/global_danger_color_200';
|
|
43
|
+
import imgBrand from '@patternfly/react-core/src/components/assets/pfLogo.svg';
|
|
44
|
+
import imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';
|
|
45
|
+
import AngleDownIcon from '@patternfly/react-icons/dist/esm/icons/angle-down-icon';
|
|
46
|
+
import AngleRightIcon from '@patternfly/react-icons/dist/esm/icons/angle-right-icon';
|
|
47
|
+
import BarsIcon from '@patternfly/react-icons/dist/esm/icons/bars-icon';
|
|
48
|
+
import AttentionBellIcon from '@patternfly/react-icons/dist/esm/icons/attention-bell-icon';
|
|
49
|
+
import BlueprintIcon from '@patternfly/react-icons/dist/esm/icons/blueprint-icon';
|
|
50
|
+
import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
|
|
51
|
+
import { DashboardWrapper } from '@patternfly/react-core/dist/esm/demos/DashboardWrapper';
|
|
52
|
+
import { rows, columns } from '@patternfly/react-table/dist/esm/demos/sampleData';
|
|
53
|
+
import spacing from '@patternfly/react-styles/css/utilities/Spacing/spacing';
|
|
54
|
+
|
|
55
|
+
## Demos
|
|
56
|
+
|
|
57
|
+
### Bulk select
|
|
58
|
+
|
|
59
|
+
```js isFullscreen file="./examples/TableBulkSelect.tsx"
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Expand/collapse all
|
|
63
|
+
|
|
64
|
+
```js isFullscreen file="./examples/TableExpandCollapseAll.tsx"
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Compact
|
|
69
|
+
|
|
70
|
+
```js isFullscreen file="./examples/TableCompact.tsx"
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Compound expansion
|
|
75
|
+
|
|
76
|
+
```js isFullscreen file="./examples/TableCompoundExpansion.tsx"
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Column management
|
|
81
|
+
|
|
82
|
+
```js isFullscreen file="./examples/TableColumnManagement.tsx"
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Column management with draggable
|
|
87
|
+
|
|
88
|
+
```js isFullscreen file="./examples/TableColumnManagementWithDraggable.tsx"
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Filterable
|
|
92
|
+
|
|
93
|
+
```js isFullscreen file="./examples/TableFilterable.tsx"
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Sortable - responsive
|
|
97
|
+
|
|
98
|
+
```js isFullscreen file="./examples/TableSortableResponsive.tsx"
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Automatic pagination
|
|
103
|
+
|
|
104
|
+
The below example illustrates the `isLastFullPageShown` prop, which makes the following changes when the user sets the number of items to display per page to an amount that exceeds the remaining amount of data:
|
|
105
|
+
|
|
106
|
+
- The component automatically changes the page back to the last full page of results, rather than defaulting to the final page of results.
|
|
107
|
+
|
|
108
|
+
To demonstrate this, navigate to the last page of data below using the `>>` navigation arrows, then use the dropdown selector to change the view to 5 per page.
|
|
109
|
+
|
|
110
|
+
- The default behavior would show the last page of results, which would only contain the last two rows (rows 11 - 12).
|
|
111
|
+
- The `isLastFullPageShown` prop navigates you back to the previous page which does contain a full page of 5 rows (rows 6 - 10).
|
|
112
|
+
|
|
113
|
+
```js isFullscreen file="./examples/TableAutomaticPagination.tsx"
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Static bottom pagination on mobile
|
|
117
|
+
|
|
118
|
+
```ts isFullscreen file="./examples/TableStaticBottomPagination.tsx"
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Sticky header
|
|
123
|
+
|
|
124
|
+
```js isFullscreen file="./examples/TableStickyHeader.tsx"
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Sticky first column
|
|
129
|
+
|
|
130
|
+
```js isFullscreen file="./examples/TableStickyFirstColumn.tsx"
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Sticky columns and header with toolbar
|
|
135
|
+
|
|
136
|
+
A toolbar may be added above a sticky table either inside or outside the `OuterScrollContainer`.
|
|
137
|
+
|
|
138
|
+
```js isFullscreen file="../components/Table/examples/TableStickyColumnsAndHeader.tsx"
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Empty states
|
|
143
|
+
|
|
144
|
+
These examples demonstrate the use of an [Empty State component](/components/empty-state) inside of a [Table](/components/table). Empty states are useful in a table when a filter returns no results, while data is loading, or when any type of error or exception condition occurs.
|
|
145
|
+
|
|
146
|
+
### Empty
|
|
147
|
+
|
|
148
|
+
```js isFullscreen file="./examples/TableEmptyStateDefault.tsx"
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Loading
|
|
152
|
+
|
|
153
|
+
```js isFullscreen file="./examples/TableEmptyStateLoading.tsx"
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Error
|
|
157
|
+
|
|
158
|
+
```js isFullscreen file="./examples/TableEmptyStateError.tsx"
|
|
159
|
+
```
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Pagination } from '@patternfly/react-core';
|
|
3
|
+
import { Table, Thead, Tr, Th, Tbody, Td } from '@patternfly/react-table';
|
|
4
|
+
|
|
5
|
+
export const TableAutomaticPagination: React.FunctionComponent = () => {
|
|
6
|
+
const columns = {
|
|
7
|
+
firstColumn: 'First column',
|
|
8
|
+
secondColumn: 'Second column',
|
|
9
|
+
thirdColumn: 'Third column'
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const defaultRows = [
|
|
13
|
+
{ firstColumn: 'Row 1 column 1', secondColumn: 'Row 1 column 2', thirdColumn: 'Row 1 column 3' },
|
|
14
|
+
{ firstColumn: 'Row 2 column 1', secondColumn: 'Row 2 column 2', thirdColumn: 'Row 2 column 3' },
|
|
15
|
+
{ firstColumn: 'Row 3 column 1', secondColumn: 'Row 3 column 2', thirdColumn: 'Row 3 column 3' },
|
|
16
|
+
{ firstColumn: 'Row 4 column 1', secondColumn: 'Row 4 column 2', thirdColumn: 'Row 4 column 3' },
|
|
17
|
+
{ firstColumn: 'Row 5 column 1', secondColumn: 'Row 5 column 2', thirdColumn: 'Row 5 column 3' },
|
|
18
|
+
{ firstColumn: 'Row 6 column 1', secondColumn: 'Row 6 column 2', thirdColumn: 'Row 6 column 3' },
|
|
19
|
+
{ firstColumn: 'Row 7 column 1', secondColumn: 'Row 7 column 2', thirdColumn: 'Row 7 column 3' },
|
|
20
|
+
{ firstColumn: 'Row 8 column 1', secondColumn: 'Row 8 column 2', thirdColumn: 'Row 8 column 3' },
|
|
21
|
+
{ firstColumn: 'Row 9 column 1', secondColumn: 'Row 9 column 2', thirdColumn: 'Row 9 column 3' },
|
|
22
|
+
{ firstColumn: 'Row 10 column 1', secondColumn: 'Row 10 column 2', thirdColumn: 'Row 10 column 3' },
|
|
23
|
+
{ firstColumn: 'Row 11 column 1', secondColumn: 'Row 11 column 2', thirdColumn: 'Row 11 column 3' },
|
|
24
|
+
{ firstColumn: 'Row 12 column 1', secondColumn: 'Row 12 column 2', thirdColumn: 'Row 12 column 3' }
|
|
25
|
+
];
|
|
26
|
+
const defaultPerPage = 10;
|
|
27
|
+
|
|
28
|
+
const [perPage, setPerPage] = React.useState(defaultPerPage);
|
|
29
|
+
const [page, setPage] = React.useState(1);
|
|
30
|
+
const [rows, setRows] = React.useState(defaultRows.slice(0, defaultPerPage));
|
|
31
|
+
|
|
32
|
+
const handleSetPage = (
|
|
33
|
+
_evt: React.MouseEvent | React.KeyboardEvent | MouseEvent,
|
|
34
|
+
newPage: number,
|
|
35
|
+
_perPage: number,
|
|
36
|
+
startIdx: number,
|
|
37
|
+
endIdx: number
|
|
38
|
+
) => {
|
|
39
|
+
setPage(newPage);
|
|
40
|
+
setRows(defaultRows.slice(startIdx, endIdx));
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const handlePerPageSelect = (
|
|
44
|
+
_evt: React.MouseEvent | React.KeyboardEvent | MouseEvent,
|
|
45
|
+
newPerPage: number,
|
|
46
|
+
newPage: number,
|
|
47
|
+
startIdx: number,
|
|
48
|
+
endIdx: number
|
|
49
|
+
) => {
|
|
50
|
+
setPerPage(newPerPage);
|
|
51
|
+
setPage(newPage);
|
|
52
|
+
setRows(defaultRows.slice(startIdx, endIdx));
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const renderPagination = (variant = 'top') => (
|
|
56
|
+
<Pagination
|
|
57
|
+
isCompact
|
|
58
|
+
itemCount={defaultRows.length}
|
|
59
|
+
page={page}
|
|
60
|
+
perPage={perPage}
|
|
61
|
+
isLastFullPageShown
|
|
62
|
+
onSetPage={handleSetPage}
|
|
63
|
+
onPerPageSelect={handlePerPageSelect}
|
|
64
|
+
perPageOptions={[
|
|
65
|
+
{ title: '3', value: 3 },
|
|
66
|
+
{ title: '5', value: 5 },
|
|
67
|
+
{ title: '12', value: 12 },
|
|
68
|
+
{ title: '20', value: 20 }
|
|
69
|
+
]}
|
|
70
|
+
titles={{
|
|
71
|
+
paginationAriaLabel: `${variant} pagination`
|
|
72
|
+
}}
|
|
73
|
+
/>
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
return (
|
|
77
|
+
<React.Fragment>
|
|
78
|
+
{renderPagination()}
|
|
79
|
+
<Table aria-label="Automated Pagination Table Demo">
|
|
80
|
+
<Thead>
|
|
81
|
+
<Tr>
|
|
82
|
+
<Th>{columns.firstColumn}</Th>
|
|
83
|
+
<Th>{columns.secondColumn}</Th>
|
|
84
|
+
<Th>{columns.thirdColumn}</Th>
|
|
85
|
+
</Tr>
|
|
86
|
+
</Thead>
|
|
87
|
+
<Tbody>
|
|
88
|
+
{rows.map((row, rowIndex) => (
|
|
89
|
+
<Tr key={rowIndex}>
|
|
90
|
+
<>
|
|
91
|
+
<Td dataLabel={columns.firstColumn}>{row.firstColumn}</Td>
|
|
92
|
+
<Td dataLabel={columns.secondColumn}>{row.secondColumn}</Td>
|
|
93
|
+
<Td dataLabel={columns.thirdColumn}>{row.thirdColumn}</Td>
|
|
94
|
+
</>
|
|
95
|
+
</Tr>
|
|
96
|
+
))}
|
|
97
|
+
</Tbody>
|
|
98
|
+
</Table>
|
|
99
|
+
</React.Fragment>
|
|
100
|
+
);
|
|
101
|
+
};
|
|
@@ -6,44 +6,63 @@ import {
|
|
|
6
6
|
DropdownItem,
|
|
7
7
|
MenuToggle,
|
|
8
8
|
MenuToggleCheckbox,
|
|
9
|
+
MenuToggleElement,
|
|
9
10
|
PageSection,
|
|
10
11
|
Pagination,
|
|
11
12
|
Toolbar,
|
|
12
13
|
ToolbarContent,
|
|
13
14
|
ToolbarGroup,
|
|
14
|
-
ToolbarItem
|
|
15
|
+
ToolbarItem,
|
|
16
|
+
PaginationVariant
|
|
15
17
|
} from '@patternfly/react-core';
|
|
16
18
|
import { Table, Thead, Tr, Th, Tbody, Td } from '@patternfly/react-table';
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
+
import { rows, columns, SampleDataRow } from '@patternfly/react-table/dist/esm/demos/sampleData';
|
|
20
|
+
import { DashboardWrapper } from '@patternfly/react-core/dist/esm/demos/DashboardWrapper';
|
|
19
21
|
|
|
20
|
-
export const
|
|
22
|
+
export const TableBulkSelect: React.FunctionComponent = () => {
|
|
21
23
|
const [isBulkSelectDropdownOpen, setIsBulkSelectDropdownOpen] = React.useState(false);
|
|
22
24
|
const [bulkSelection, setBulkSelection] = React.useState('');
|
|
23
25
|
const [page, setPage] = React.useState(1);
|
|
24
26
|
const [perPage, setPerPage] = React.useState(10);
|
|
25
27
|
const [paginatedRows, setPaginatedRows] = React.useState(rows.slice(0, 10));
|
|
26
|
-
const [selectedRows, setSelectedRows] = React.useState([]);
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
const [selectedRows, setSelectedRows] = React.useState<string[]>([]);
|
|
29
|
+
|
|
30
|
+
const handleSetPage = (
|
|
31
|
+
_evt: React.MouseEvent | React.KeyboardEvent | MouseEvent,
|
|
32
|
+
newPage: number,
|
|
33
|
+
_perPage: number,
|
|
34
|
+
startIdx: number,
|
|
35
|
+
endIdx: number
|
|
36
|
+
) => {
|
|
37
|
+
setPaginatedRows(rows?.slice(startIdx, endIdx));
|
|
29
38
|
setPage(newPage);
|
|
30
39
|
};
|
|
31
|
-
|
|
40
|
+
|
|
41
|
+
const handlePerPageSelect = (
|
|
42
|
+
_evt: React.MouseEvent | React.KeyboardEvent | MouseEvent,
|
|
43
|
+
newPerPage: number,
|
|
44
|
+
newPage: number,
|
|
45
|
+
startIdx: number,
|
|
46
|
+
endIdx: number
|
|
47
|
+
) => {
|
|
32
48
|
setPaginatedRows(rows.slice(startIdx, endIdx));
|
|
33
49
|
setPage(newPage);
|
|
34
50
|
setPerPage(newPerPage);
|
|
35
51
|
};
|
|
36
52
|
|
|
37
|
-
const setRowSelected = (row, isSelecting
|
|
53
|
+
const setRowSelected = (row: SampleDataRow, isSelecting: boolean) =>
|
|
38
54
|
setSelectedRows((prevSelected) => {
|
|
39
55
|
const otherSelectedRows = prevSelected.filter((r) => r !== row.name);
|
|
40
56
|
return isSelecting ? [...otherSelectedRows, row.name] : otherSelectedRows;
|
|
41
57
|
});
|
|
42
|
-
const selectAllRows = (isSelecting = true) => setSelectedRows(isSelecting ? rows.map((r) => r.name) : []);
|
|
43
|
-
const selectPageRows = (isSelecting = true) => setSelectedRows(isSelecting ? paginatedRows.map((r) => r.name) : []);
|
|
44
|
-
const isRowSelected = (row) => selectedRows.includes(row.name);
|
|
45
58
|
|
|
46
|
-
const
|
|
59
|
+
const selectAllRows = (isSelecting: boolean) => setSelectedRows(isSelecting ? rows.map((r) => r.name) : []);
|
|
60
|
+
|
|
61
|
+
const selectPageRows = (isSelecting: boolean) => setSelectedRows(isSelecting ? paginatedRows.map((r) => r.name) : []);
|
|
62
|
+
|
|
63
|
+
const isRowSelected = (row: any) => selectedRows.includes(row.name);
|
|
64
|
+
|
|
65
|
+
const buildPagination = (variant: 'bottom' | 'top' | PaginationVariant, isCompact: boolean) => (
|
|
47
66
|
<Pagination
|
|
48
67
|
isCompact={isCompact}
|
|
49
68
|
itemCount={rows.length}
|
|
@@ -72,10 +91,11 @@ export const BulkSelectTableDemo = () => {
|
|
|
72
91
|
<DropdownItem value="all">Select all ({rows.length} items)</DropdownItem>
|
|
73
92
|
</>
|
|
74
93
|
);
|
|
94
|
+
|
|
75
95
|
return (
|
|
76
96
|
<Dropdown
|
|
77
97
|
role="menu"
|
|
78
|
-
onSelect={(
|
|
98
|
+
onSelect={(_event: React.MouseEvent<Element, MouseEvent>, value: string) => {
|
|
79
99
|
if (value === 'all') {
|
|
80
100
|
selectAllRows(bulkSelection !== 'all');
|
|
81
101
|
} else if (value === 'page') {
|
|
@@ -83,11 +103,11 @@ export const BulkSelectTableDemo = () => {
|
|
|
83
103
|
} else {
|
|
84
104
|
setSelectedRows([]);
|
|
85
105
|
}
|
|
86
|
-
setBulkSelection(value);
|
|
106
|
+
setBulkSelection(value as string);
|
|
87
107
|
}}
|
|
88
108
|
isOpen={isBulkSelectDropdownOpen}
|
|
89
|
-
onOpenChange={(isOpen) => setIsBulkSelectDropdownOpen(isOpen)}
|
|
90
|
-
toggle={(toggleRef) => (
|
|
109
|
+
onOpenChange={(isOpen: boolean) => setIsBulkSelectDropdownOpen(isOpen)}
|
|
110
|
+
toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
|
|
91
111
|
<MenuToggle
|
|
92
112
|
ref={toggleRef}
|
|
93
113
|
isExpanded={isBulkSelectDropdownOpen}
|
|
@@ -122,7 +142,7 @@ export const BulkSelectTableDemo = () => {
|
|
|
122
142
|
<ToolbarGroup>
|
|
123
143
|
<ToolbarItem variant="bulk-select">{buildBulkSelectDropdown()}</ToolbarItem>
|
|
124
144
|
</ToolbarGroup>
|
|
125
|
-
<ToolbarItem variant="pagination">{buildPagination('top')}</ToolbarItem>
|
|
145
|
+
<ToolbarItem variant="pagination">{buildPagination('top', false)}</ToolbarItem>
|
|
126
146
|
</ToolbarContent>
|
|
127
147
|
</Toolbar>
|
|
128
148
|
);
|
|
@@ -147,7 +167,8 @@ export const BulkSelectTableDemo = () => {
|
|
|
147
167
|
<Td
|
|
148
168
|
select={{
|
|
149
169
|
rowIndex,
|
|
150
|
-
onSelect: (_event
|
|
170
|
+
onSelect: (_event: React.FormEvent<HTMLInputElement>, isSelecting: boolean) =>
|
|
171
|
+
setRowSelected(row, isSelecting),
|
|
151
172
|
isSelected: isRowSelected(row)
|
|
152
173
|
}}
|
|
153
174
|
/>
|
|
@@ -159,7 +180,7 @@ export const BulkSelectTableDemo = () => {
|
|
|
159
180
|
))}
|
|
160
181
|
</Tbody>
|
|
161
182
|
</Table>
|
|
162
|
-
{buildPagination('bottom')}
|
|
183
|
+
{buildPagination('bottom', true)}
|
|
163
184
|
</PageSection>
|
|
164
185
|
</DashboardWrapper>
|
|
165
186
|
);
|