@patternfly/react-table 5.2.0-prerelease.9 → 5.2.1
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 +176 -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/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 +3 -3
- 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.d.ts +3 -1
- package/dist/esm/components/Table/TableText.d.ts.map +1 -1
- package/dist/esm/components/Table/TableText.js +13 -11
- package/dist/esm/components/Table/TableText.js.map +1 -1
- package/dist/esm/components/Table/TableTypes.d.ts +3 -0
- package/dist/esm/components/Table/TableTypes.d.ts.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.d.ts +3 -0
- package/dist/esm/components/Table/Th.d.ts.map +1 -1
- package/dist/esm/components/Table/Th.js +16 -9
- 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.d.ts.map +1 -1
- package/dist/esm/components/Table/utils/decorators/selectable.js +4 -4
- 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 +7 -4
- 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/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 +4 -0
- package/dist/esm/demos/index.d.ts.map +1 -0
- package/dist/esm/demos/index.js +4 -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/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/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 +3 -0
- package/dist/js/components/Table/TableTypes.d.ts.map +1 -1
- package/dist/js/components/Table/Th.d.ts +3 -0
- package/dist/js/components/Table/Th.d.ts.map +1 -1
- package/dist/js/components/Table/Th.js +14 -7
- 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 +2 -2
- 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/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 +4 -0
- package/dist/js/demos/index.d.ts.map +1 -0
- package/dist/js/demos/index.js +7 -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/single-packages.config.json +3 -6
- package/src/components/Table/SelectColumn.tsx +27 -8
- package/src/components/Table/SortColumn.tsx +15 -1
- package/src/components/Table/TableText.tsx +19 -9
- package/src/components/Table/TableTypes.tsx +3 -0
- package/src/components/Table/Th.tsx +16 -5
- package/src/components/Table/examples/TableStickyColumnsAndHeader.tsx +5 -4
- package/src/components/Table/utils/decorators/selectable.tsx +2 -1
- package/src/components/Table/utils/decorators/sortable.tsx +8 -2
- package/src/components/Table/utils/transformers.test.tsx +1 -0
- package/src/demos/DashboardHeader.tsx +198 -0
- package/src/demos/DashboardWrapper.tsx +199 -0
- package/src/demos/Table.md +183 -0
- 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/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} +30 -28
- 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 +3 -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 -1621
- package/src/docs/demos/table-demos/ColumnManagement.jsx +0 -471
|
@@ -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 variant="light">
|
|
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';
|
|
@@ -0,0 +1,183 @@
|
|
|
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,
|
|
27
|
+
Avatar,
|
|
28
|
+
Brand,
|
|
29
|
+
Button,
|
|
30
|
+
ButtonVariant,
|
|
31
|
+
Dropdown,
|
|
32
|
+
DropdownGroup,
|
|
33
|
+
DropdownItem,
|
|
34
|
+
DropdownList,
|
|
35
|
+
MastheadBrand,
|
|
36
|
+
MenuToggle,
|
|
37
|
+
ToolbarGroup,
|
|
38
|
+
PageToggleButton,
|
|
39
|
+
Nav,
|
|
40
|
+
NavItem,
|
|
41
|
+
NavList,
|
|
42
|
+
PageSidebar,
|
|
43
|
+
PageSidebarBody,
|
|
44
|
+
} from '@patternfly/react-core';
|
|
45
|
+
import { Table as TableDeprecated, TableHeader, TableBody } from '@patternfly/react-table/deprecated';
|
|
46
|
+
import CheckIcon from '@patternfly/react-icons/dist/esm/icons/check-icon';
|
|
47
|
+
import CloneIcon from '@patternfly/react-icons/dist/esm/icons/clone-icon';
|
|
48
|
+
import CodeIcon from '@patternfly/react-icons/dist/esm/icons/code-icon';
|
|
49
|
+
import CodeBranchIcon from '@patternfly/react-icons/dist/esm/icons/code-branch-icon';
|
|
50
|
+
import CubeIcon from '@patternfly/react-icons/dist/esm/icons/cube-icon';
|
|
51
|
+
import EditIcon from '@patternfly/react-icons/dist/esm/icons/edit-icon';
|
|
52
|
+
import FilterIcon from '@patternfly/react-icons/dist/esm/icons/filter-icon';
|
|
53
|
+
import SortAmountDownIcon from '@patternfly/react-icons/dist/esm/icons/sort-amount-down-icon';
|
|
54
|
+
import SearchIcon from '@patternfly/react-icons/dist/esm/icons/search-icon';
|
|
55
|
+
import SyncIcon from '@patternfly/react-icons/dist/esm/icons/sync-icon';
|
|
56
|
+
import ExclamationCircleIcon from '@patternfly/react-icons/dist/esm/icons/exclamation-circle-icon';
|
|
57
|
+
import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon';
|
|
58
|
+
import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
|
|
59
|
+
import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';
|
|
60
|
+
import globalDangerColor200 from '@patternfly/react-tokens/dist/esm/global_danger_color_200';
|
|
61
|
+
import AngleDownIcon from '@patternfly/react-icons/dist/esm/icons/angle-down-icon';
|
|
62
|
+
import AngleRightIcon from '@patternfly/react-icons/dist/esm/icons/angle-right-icon';
|
|
63
|
+
import BarsIcon from '@patternfly/react-icons/dist/esm/icons/bars-icon';
|
|
64
|
+
import AttentionBellIcon from '@patternfly/react-icons/dist/esm/icons/attention-bell-icon';
|
|
65
|
+
import BlueprintIcon from '@patternfly/react-icons/dist/esm/icons/blueprint-icon';
|
|
66
|
+
import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
|
|
67
|
+
import { DashboardWrapper } from '@patternfly/react-table/dist/esm/demos/DashboardWrapper';
|
|
68
|
+
import { rows, columns } from '@patternfly/react-table/dist/esm/demos/sampleData';
|
|
69
|
+
import spacing from '@patternfly/react-styles/css/utilities/Spacing/spacing';
|
|
70
|
+
import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
|
|
71
|
+
|
|
72
|
+
## Demos
|
|
73
|
+
|
|
74
|
+
### Bulk select
|
|
75
|
+
|
|
76
|
+
```js isFullscreen file="./examples/TableBulkSelect.tsx"
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Expand/collapse all
|
|
81
|
+
|
|
82
|
+
```js isFullscreen file="./examples/TableExpandCollapseAll.tsx"
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Compact
|
|
87
|
+
|
|
88
|
+
```js isFullscreen file="./examples/TableCompact.tsx"
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Compound expansion
|
|
93
|
+
|
|
94
|
+
```js isFullscreen file="./examples/TableCompoundExpansion.tsx"
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Column management
|
|
99
|
+
|
|
100
|
+
```js isFullscreen file="./examples/TableColumnManagement.tsx"
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Column management with draggable
|
|
105
|
+
|
|
106
|
+
```js isFullscreen file="./examples/TableColumnManagementWithDraggable.tsx"
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Filterable
|
|
111
|
+
|
|
112
|
+
```js isFullscreen file="./examples/TableFilterable.tsx"
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Sortable - responsive
|
|
117
|
+
|
|
118
|
+
```js isFullscreen file="./examples/TableSortableResponsive.tsx"
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Automatic pagination
|
|
123
|
+
|
|
124
|
+
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:
|
|
125
|
+
|
|
126
|
+
- The component automatically changes the page back to the last full page of results, rather than defaulting to the final page of results.
|
|
127
|
+
|
|
128
|
+
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.
|
|
129
|
+
|
|
130
|
+
- The default behavior would show the last page of results, which would only contain the last two rows (rows 11 - 12).
|
|
131
|
+
- The `isLastFullPageShown` prop navigates you back to the previous page which does contain a full page of 5 rows (rows 6 - 10).
|
|
132
|
+
|
|
133
|
+
```js isFullscreen file="./examples/TableAutomaticPagination.tsx"
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Static bottom pagination on mobile
|
|
138
|
+
|
|
139
|
+
```ts isFullscreen file="./examples/TableStaticBottomPagination.tsx"
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Sticky header
|
|
144
|
+
|
|
145
|
+
```js isFullscreen file="./examples/TableStickyHeader.tsx"
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Sticky first column
|
|
150
|
+
|
|
151
|
+
```js isFullscreen file="./examples/TableStickyFirstColumn.tsx"
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Sticky columns and header with toolbar
|
|
156
|
+
|
|
157
|
+
A toolbar may be added above a sticky table either inside or outside the `OuterScrollContainer`.
|
|
158
|
+
|
|
159
|
+
```js isFullscreen file="../components/Table/examples/TableStickyColumnsAndHeader.tsx"
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Empty states
|
|
164
|
+
|
|
165
|
+
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.
|
|
166
|
+
|
|
167
|
+
### Empty
|
|
168
|
+
|
|
169
|
+
```js isFullscreen file="./examples/TableEmptyStateDefault.tsx"
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Loading
|
|
174
|
+
|
|
175
|
+
```js isFullscreen file="./examples/TableEmptyStateLoading.tsx"
|
|
176
|
+
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Error
|
|
180
|
+
|
|
181
|
+
```js isFullscreen file="./examples/TableEmptyStateError.tsx"
|
|
182
|
+
|
|
183
|
+
```
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<!-- Generator: Adobe Illustrator 24.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
3
|
+
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
4
|
+
viewBox="0 0 36 36" style="enable-background:new 0 0 36 36;" xml:space="preserve">
|
|
5
|
+
<style type="text/css">
|
|
6
|
+
.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#F0F0F0;}
|
|
7
|
+
.st1{fill-rule:evenodd;clip-rule:evenodd;fill:#D2D2D2;}
|
|
8
|
+
.st2{fill:#B8BBBE;}
|
|
9
|
+
.st3{fill:#D2D2D2;}
|
|
10
|
+
</style>
|
|
11
|
+
<rect class="st0" width="36" height="36"/>
|
|
12
|
+
<path class="st1" d="M17.7,20.1c-3.5,0-6.4-2.9-6.4-6.4s2.9-6.4,6.4-6.4s6.4,2.9,6.4,6.4S21.3,20.1,17.7,20.1z"/>
|
|
13
|
+
<path class="st2" d="M13.3,36l0-6.7c-2,0.4-2.9,1.4-3.1,3.5L10.1,36H13.3z"/>
|
|
14
|
+
<path class="st3" d="M10.1,36l0.1-3.2c0.2-2.1,1.1-3.1,3.1-3.5l0,6.7h9.4l0-6.7c2,0.4,2.9,1.4,3.1,3.5l0.1,3.2h4.7
|
|
15
|
+
c-0.4-3.9-1.3-9-2.9-11c-1.1-1.4-2.3-2.2-3.5-2.6s-1.8-0.6-6.3-0.6s-6.1,0.7-6.1,0.7c-1.2,0.4-2.4,1.2-3.4,2.6
|
|
16
|
+
C6.7,27,5.8,32.2,5.4,36H10.1z"/>
|
|
17
|
+
<path class="st2" d="M25.9,36l-0.1-3.2c-0.2-2.1-1.1-3.1-3.1-3.5l0,6.7H25.9z"/>
|
|
18
|
+
</svg>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg width="679px" height="158px" viewBox="0 0 679 158" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
3
|
+
<title>PF-HorizontalLogo-Reverse </title>
|
|
4
|
+
<defs>
|
|
5
|
+
<linearGradient x1="100%" y1="1.31838984e-13%" x2="40.4021492%" y2="59.4473677%" id="linearGradient-1">
|
|
6
|
+
<stop stop-color="#FFFFFF" offset="0%"></stop>
|
|
7
|
+
<stop stop-color="#FFFFFF" stop-opacity="0.498497596" offset="100%"></stop>
|
|
8
|
+
</linearGradient>
|
|
9
|
+
</defs>
|
|
10
|
+
<g id="PF-HorizontalLogo-Reverse" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
|
11
|
+
<g id="Group" transform="translate(-0.000000, 0.000000)">
|
|
12
|
+
<path d="M61.7658863,0 L157.846154,0 L157.846154,96.0802676 C104.782487,96.0802676 61.7658863,53.0636665 61.7658863,0 L61.7658863,0 L61.7658863,0 Z" id="Rectangle-Copy-15" fill="#FFFFFF" opacity="0.401297433"></path>
|
|
13
|
+
<path d="M158,1.84777167 L158,138 C158,149.045695 149.045695,158 138,158 L66.3656919,158 L158,1.84777167 Z M156.152228,3.55271368e-13 L-9.37916411e-13,91.6343081 L-9.37916411e-13,20 C-9.09494702e-13,8.954305 8.954305,3.55271368e-13 20,3.41060513e-13 L156.152228,3.55271368e-13 Z" id="Combined-Shape-Copy-4" fill="url(#linearGradient-1)"></path>
|
|
14
|
+
</g>
|
|
15
|
+
<g id="PatternFly-Copy-11" transform="translate(206.000000, 45.750000)" fill="#FFFFFF" fill-rule="nonzero">
|
|
16
|
+
<path d="M0,65.25 L0,2.25 L33.21,2.25 C37.35,2.25 41.025,3.135 44.235,4.905 C47.445,6.675 49.98,9.09 51.84,12.15 C53.7,15.21 54.63,18.72 54.63,22.68 C54.63,26.46 53.7,29.865 51.84,32.895 C49.98,35.925 47.43,38.31 44.19,40.05 C40.95,41.79 37.29,42.66 33.21,42.66 L15.48,42.66 L15.48,65.25 L0,65.25 Z M15.48,29.88 L31.41,29.88 C33.69,29.88 35.52,29.22 36.9,27.9 C38.28,26.58 38.97,24.87 38.97,22.77 C38.97,20.61 38.28,18.855 36.9,17.505 C35.52,16.155 33.69,15.48 31.41,15.48 L15.48,15.48 L15.48,29.88 Z" id="Shape"></path>
|
|
17
|
+
<path d="M77.04,66.06 C73.68,66.06 70.695,65.43 68.085,64.17 C65.475,62.91 63.435,61.17 61.965,58.95 C60.495,56.73 59.76,54.18 59.76,51.3 C59.76,46.74 61.485,43.215 64.935,40.725 C68.385,38.235 73.2,36.99 79.38,36.99 C83.1,36.99 86.7,37.44 90.18,38.34 L90.18,36 C90.18,31.26 87.15,28.89 81.09,28.89 C77.49,28.89 72.69,30.15 66.69,32.67 L61.47,21.96 C69.15,18.48 76.56,16.74 83.7,16.74 C90.3,16.74 95.43,18.315 99.09,21.465 C102.75,24.615 104.58,29.04 104.58,34.74 L104.58,65.25 L90.18,65.25 L90.18,62.37 C88.26,63.69 86.235,64.635 84.105,65.205 C81.975,65.775 79.62,66.06 77.04,66.06 Z M73.62,51.03 C73.62,52.53 74.28,53.7 75.6,54.54 C76.92,55.38 78.75,55.8 81.09,55.8 C84.69,55.8 87.72,55.05 90.18,53.55 L90.18,47.43 C87.42,46.71 84.54,46.35 81.54,46.35 C79.02,46.35 77.07,46.755 75.69,47.565 C74.31,48.375 73.62,49.53 73.62,51.03 Z" id="Shape"></path>
|
|
18
|
+
<path d="M137.25,65.88 C125.73,65.88 119.97,60.84 119.97,50.76 L119.97,29.79 L110.34,29.79 L110.34,17.64 L119.97,17.64 L119.97,5.4 L134.55,2.25 L134.55,17.64 L147.87,17.64 L147.87,29.79 L134.55,29.79 L134.55,47.88 C134.55,49.98 135.015,51.465 135.945,52.335 C136.875,53.205 138.51,53.64 140.85,53.64 C143.01,53.64 145.2,53.31 147.42,52.65 L147.42,64.44 C146.1,64.86 144.42,65.205 142.38,65.475 C140.34,65.745 138.63,65.88 137.25,65.88 Z" id="Path"></path>
|
|
19
|
+
<path d="M177.57,65.88 C166.05,65.88 160.29,60.84 160.29,50.76 L160.29,29.79 L150.66,29.79 L150.66,17.64 L160.29,17.64 L160.29,5.4 L174.87,2.25 L174.87,17.64 L188.19,17.64 L188.19,29.79 L174.87,29.79 L174.87,47.88 C174.87,49.98 175.335,51.465 176.265,52.335 C177.195,53.205 178.83,53.64 181.17,53.64 C183.33,53.64 185.52,53.31 187.74,52.65 L187.74,64.44 C186.42,64.86 184.74,65.205 182.7,65.475 C180.66,65.745 178.95,65.88 177.57,65.88 Z" id="Path"></path>
|
|
20
|
+
<path d="M217.62,66.15 C212.76,66.15 208.365,65.055 204.435,62.865 C200.505,60.675 197.4,57.72 195.12,54 C192.84,50.28 191.7,46.11 191.7,41.49 C191.7,36.87 192.795,32.7 194.985,28.98 C197.175,25.26 200.16,22.305 203.94,20.115 C207.72,17.925 211.92,16.83 216.54,16.83 C221.22,16.83 225.36,17.955 228.96,20.205 C232.56,22.455 235.395,25.53 237.465,29.43 C239.535,33.33 240.57,37.8 240.57,42.84 L240.57,46.44 L206.64,46.44 C207.6,48.66 209.1,50.475 211.14,51.885 C213.18,53.295 215.58,54 218.34,54 C222.42,54 225.6,52.8 227.88,50.4 L237.51,58.95 C234.51,61.47 231.435,63.3 228.285,64.44 C225.135,65.58 221.58,66.15 217.62,66.15 Z M206.37,36.27 L226.26,36.27 C225.48,33.99 224.205,32.16 222.435,30.78 C220.665,29.4 218.61,28.71 216.27,28.71 C213.87,28.71 211.8,29.37 210.06,30.69 C208.32,32.01 207.09,33.87 206.37,36.27 Z" id="Shape"></path>
|
|
21
|
+
<path d="M247.41,65.25 L247.41,17.64 L261.99,17.64 L261.99,22.41 C265.23,18.51 269.4,16.56 274.5,16.56 C277.08,16.62 278.91,17.01 279.99,17.73 L279.99,30.42 C277.95,29.46 275.64,28.98 273.06,28.98 C270.78,28.98 268.665,29.505 266.715,30.555 C264.765,31.605 263.19,33.09 261.99,35.01 L261.99,65.25 L247.41,65.25 Z" id="Path"></path>
|
|
22
|
+
<path d="M286.29,65.25 L286.29,17.64 L300.87,17.64 L300.87,20.88 C304.47,18.12 308.73,16.74 313.65,16.74 C317.37,16.74 320.655,17.55 323.505,19.17 C326.355,20.79 328.59,23.04 330.21,25.92 C331.83,28.8 332.64,32.13 332.64,35.91 L332.64,65.25 L318.06,65.25 L318.06,37.89 C318.06,35.25 317.28,33.15 315.72,31.59 C314.16,30.03 312.06,29.25 309.42,29.25 C305.76,29.25 302.91,30.51 300.87,33.03 L300.87,65.25 L286.29,65.25 Z" id="Path"></path>
|
|
23
|
+
<polygon id="Path" points="342 65.25 342 2.25 392.04 2.25 392.04 15.66 357.48 15.66 357.48 27.45 380.52 27.45 380.52 40.41 357.48 40.41 357.48 65.25"></polygon>
|
|
24
|
+
<polygon id="Path" points="399.96 65.25 399.96 2.25 414.54 0 414.54 65.25"></polygon>
|
|
25
|
+
<path d="M429.21,84.69 C428.07,84.69 426.96,84.645 425.88,84.555 C424.8,84.465 423.9,84.33 423.18,84.15 L423.18,71.73 C424.38,71.97 425.88,72.09 427.68,72.09 C432.36,72.09 435.51,70.05 437.13,65.97 L437.13,65.88 L418.86,17.64 L434.97,17.64 L445.5,47.61 L457.74,17.64 L473.49,17.64 L452.16,67.68 C450.42,71.82 448.5,75.135 446.4,77.625 C444.3,80.115 441.87,81.915 439.11,83.025 C436.35,84.135 433.05,84.69 429.21,84.69 Z" id="Path"></path>
|
|
26
|
+
</g>
|
|
27
|
+
</g>
|
|
28
|
+
</svg>
|
|
@@ -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-table/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
|
);
|