@patternfly/react-core 5.2.0-prerelease.26 → 5.2.0-prerelease.28
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 +8 -0
- package/components/package.json +1 -1
- package/deprecated/package.json +1 -1
- package/dist/dynamic/components/AboutModal/package.json +1 -1
- package/dist/dynamic/components/Accordion/package.json +1 -1
- package/dist/dynamic/components/ActionList/package.json +1 -1
- package/dist/dynamic/components/Alert/package.json +1 -1
- package/dist/dynamic/components/Avatar/package.json +1 -1
- package/dist/dynamic/components/BackToTop/package.json +1 -1
- package/dist/dynamic/components/Backdrop/package.json +1 -1
- package/dist/dynamic/components/BackgroundImage/package.json +1 -1
- package/dist/dynamic/components/Badge/package.json +1 -1
- package/dist/dynamic/components/Banner/package.json +1 -1
- package/dist/dynamic/components/Brand/package.json +1 -1
- package/dist/dynamic/components/Breadcrumb/package.json +1 -1
- package/dist/dynamic/components/Button/package.json +1 -1
- package/dist/dynamic/components/CalendarMonth/package.json +1 -1
- package/dist/dynamic/components/Card/package.json +1 -1
- package/dist/dynamic/components/Checkbox/package.json +1 -1
- package/dist/dynamic/components/Chip/package.json +1 -1
- package/dist/dynamic/components/ClipboardCopy/package.json +1 -1
- package/dist/dynamic/components/CodeBlock/package.json +1 -1
- package/dist/dynamic/components/DataList/package.json +1 -1
- package/dist/dynamic/components/DatePicker/package.json +1 -1
- package/dist/dynamic/components/DescriptionList/package.json +1 -1
- package/dist/dynamic/components/Divider/package.json +1 -1
- package/dist/dynamic/components/DragDrop/package.json +1 -1
- package/dist/dynamic/components/Drawer/package.json +1 -1
- package/dist/dynamic/components/Dropdown/package.json +1 -1
- package/dist/dynamic/components/DualListSelector/package.json +1 -1
- package/dist/dynamic/components/EmptyState/package.json +1 -1
- package/dist/dynamic/components/ExpandableSection/package.json +1 -1
- package/dist/dynamic/components/FileUpload/package.json +1 -1
- package/dist/dynamic/components/Form/package.json +1 -1
- package/dist/dynamic/components/FormSelect/package.json +1 -1
- package/dist/dynamic/components/HelperText/package.json +1 -1
- package/dist/dynamic/components/Hint/package.json +1 -1
- package/dist/dynamic/components/Icon/package.json +1 -1
- package/dist/dynamic/components/InputGroup/package.json +1 -1
- package/dist/dynamic/components/JumpLinks/package.json +1 -1
- package/dist/dynamic/components/Label/package.json +1 -1
- package/dist/dynamic/components/List/package.json +1 -1
- package/dist/dynamic/components/LoginPage/package.json +1 -1
- package/dist/dynamic/components/Masthead/package.json +1 -1
- package/dist/dynamic/components/Menu/package.json +1 -1
- package/dist/dynamic/components/MenuToggle/package.json +1 -1
- package/dist/dynamic/components/Modal/package.json +1 -1
- package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
- package/dist/dynamic/components/Nav/package.json +1 -1
- package/dist/dynamic/components/NotificationBadge/package.json +1 -1
- package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
- package/dist/dynamic/components/NumberInput/package.json +1 -1
- package/dist/dynamic/components/OverflowMenu/package.json +1 -1
- package/dist/dynamic/components/Page/package.json +1 -1
- package/dist/dynamic/components/Pagination/package.json +1 -1
- package/dist/dynamic/components/Panel/package.json +1 -1
- package/dist/dynamic/components/Popover/package.json +1 -1
- package/dist/dynamic/components/Progress/package.json +1 -1
- package/dist/dynamic/components/ProgressStepper/package.json +1 -1
- package/dist/dynamic/components/Radio/package.json +1 -1
- package/dist/dynamic/components/SearchInput/package.json +1 -1
- package/dist/dynamic/components/Select/package.json +1 -1
- package/dist/dynamic/components/Sidebar/package.json +1 -1
- package/dist/dynamic/components/SimpleList/package.json +1 -1
- package/dist/dynamic/components/Skeleton/package.json +1 -1
- package/dist/dynamic/components/SkipToContent/package.json +1 -1
- package/dist/dynamic/components/Slider/package.json +1 -1
- package/dist/dynamic/components/Spinner/package.json +1 -1
- package/dist/dynamic/components/Switch/package.json +1 -1
- package/dist/dynamic/components/Tabs/package.json +1 -1
- package/dist/dynamic/components/Text/package.json +1 -1
- package/dist/dynamic/components/TextArea/package.json +1 -1
- package/dist/dynamic/components/TextInput/package.json +1 -1
- package/dist/dynamic/components/TextInputGroup/package.json +1 -1
- package/dist/dynamic/components/Tile/package.json +1 -1
- package/dist/dynamic/components/TimePicker/package.json +1 -1
- package/dist/dynamic/components/Timestamp/package.json +1 -1
- package/dist/dynamic/components/Title/package.json +1 -1
- package/dist/dynamic/components/ToggleGroup/package.json +1 -1
- package/dist/dynamic/components/Toolbar/package.json +1 -1
- package/dist/dynamic/components/Tooltip/package.json +1 -1
- package/dist/dynamic/components/TreeView/package.json +1 -1
- package/dist/dynamic/components/Truncate/package.json +1 -1
- package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
- package/dist/dynamic/components/Wizard/package.json +1 -1
- package/dist/dynamic/deprecated/components/ApplicationLauncher/package.json +1 -1
- package/dist/dynamic/deprecated/components/ContextSelector/package.json +1 -1
- package/dist/dynamic/deprecated/components/Dropdown/package.json +1 -1
- package/dist/dynamic/deprecated/components/OptionsMenu/package.json +1 -1
- package/dist/dynamic/deprecated/components/PageHeader/package.json +1 -1
- package/dist/dynamic/deprecated/components/Select/package.json +1 -1
- package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
- package/dist/dynamic/deprecated/components/package.json +1 -1
- package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
- package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
- package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
- package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
- package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
- package/dist/dynamic/helpers/constants/package.json +1 -1
- package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
- package/dist/dynamic/helpers/favorites/package.json +1 -1
- package/dist/dynamic/helpers/fileUtils/package.json +1 -1
- package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
- package/dist/dynamic/helpers/package.json +1 -1
- package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
- package/dist/dynamic/helpers/typeUtils/package.json +1 -1
- package/dist/dynamic/helpers/useInterval/package.json +1 -1
- package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
- package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
- package/dist/dynamic/helpers/util/package.json +1 -1
- package/dist/dynamic/layouts/Bullseye/package.json +1 -1
- package/dist/dynamic/layouts/Flex/package.json +1 -1
- package/dist/dynamic/layouts/Gallery/package.json +1 -1
- package/dist/dynamic/layouts/Grid/package.json +1 -1
- package/dist/dynamic/layouts/Level/package.json +1 -1
- package/dist/dynamic/layouts/Split/package.json +1 -1
- package/dist/dynamic/layouts/Stack/package.json +1 -1
- package/dist/dynamic/next/components/package.json +1 -1
- package/helpers/package.json +1 -1
- package/layouts/package.json +1 -1
- package/next/package.json +1 -1
- package/package.json +2 -2
- package/src/components/Nav/examples/NavFlyout.tsx +1 -1
- package/src/components/Nav/examples/NavHorizontalSubNav.tsx +1 -1
- package/src/components/Nav/examples/NavLegacyTertiary.tsx +1 -1
- package/src/components/Pagination/examples/PaginationSticky.tsx +2 -2
- package/src/demos/Banner.md +4 -4
- package/src/demos/PrimaryDetail.md +3 -975
- package/src/demos/examples/BackToTop/BackToTopNameDemo.tsx +3 -3
- package/src/demos/examples/Masthead/MastheadWithUtilitiesAndUserDropdownMenu.tsx +2 -2
- package/src/demos/examples/Nav/NavDefault.tsx +1 -1
- package/src/demos/examples/Nav/NavExpandable.tsx +1 -1
- package/src/demos/examples/Nav/NavHorizontal.tsx +1 -1
- package/src/demos/examples/Nav/NavHorizontalWithSubnav.tsx +1 -1
- package/src/demos/examples/Nav/NavManual.tsx +1 -1
- package/src/demos/examples/Nav/NavWithSubnav.tsx +1 -1
- package/src/demos/examples/Nav/deprecated/NavLight.tsx +1 -1
- package/src/demos/examples/Nav/deprecated/NavTertiary.tsx +1 -1
- package/src/demos/examples/Page/PageStickySectionBreadcrumb.tsx +2 -2
- package/src/demos/examples/Page/PageStickySectionGroup.tsx +2 -2
- package/src/demos/examples/Page/PageStickySectionGroupAlternate.tsx +2 -2
- package/src/demos/examples/PrimaryDetail/PrimaryDetailCardView.tsx +659 -0
- package/src/demos/examples/PrimaryDetail/PrimaryDetailDataListInCard.tsx +207 -0
- package/src/demos/examples/PrimaryDetail/PrimaryDetailSimpleListInCard.tsx +116 -0
- package/src/demos/examples/Wizard/InModal.tsx +2 -2
|
@@ -40,989 +40,17 @@ import { data } from '@patternfly/react-core/src/demos/CardView/examples/CardVie
|
|
|
40
40
|
|
|
41
41
|
### Primary-detail card view
|
|
42
42
|
|
|
43
|
-
```js isFullscreen
|
|
44
|
-
import React from 'react';
|
|
45
|
-
import {
|
|
46
|
-
Button,
|
|
47
|
-
Card,
|
|
48
|
-
CardHeader,
|
|
49
|
-
CardBody,
|
|
50
|
-
CardTitle,
|
|
51
|
-
Divider,
|
|
52
|
-
Drawer,
|
|
53
|
-
DrawerActions,
|
|
54
|
-
DrawerPanelBody,
|
|
55
|
-
DrawerCloseButton,
|
|
56
|
-
DrawerContent,
|
|
57
|
-
DrawerContentBody,
|
|
58
|
-
DrawerHead,
|
|
59
|
-
DrawerPanelContent,
|
|
60
|
-
Dropdown,
|
|
61
|
-
DropdownItem,
|
|
62
|
-
DropdownList,
|
|
63
|
-
Flex,
|
|
64
|
-
FlexItem,
|
|
65
|
-
Gallery,
|
|
66
|
-
MenuToggle,
|
|
67
|
-
MenuToggleCheckbox,
|
|
68
|
-
PageSection,
|
|
69
|
-
PageSectionVariants,
|
|
70
|
-
Pagination,
|
|
71
|
-
Progress,
|
|
72
|
-
TextContent,
|
|
73
|
-
Text,
|
|
74
|
-
Title,
|
|
75
|
-
Toolbar,
|
|
76
|
-
ToolbarItem,
|
|
77
|
-
ToolbarContent
|
|
78
|
-
} from '@patternfly/react-core';
|
|
79
|
-
import TrashIcon from '@patternfly/react-icons/dist/esm/icons/trash-icon';
|
|
80
|
-
import pfIcon from './assets/pf-logo-small.svg';
|
|
81
|
-
import activeMQIcon from './assets/activemq-core_200x150.png';
|
|
82
|
-
import avroIcon from './assets/camel-avro_200x150.png';
|
|
83
|
-
import dropBoxIcon from './assets/camel-dropbox_200x150.png';
|
|
84
|
-
import infinispanIcon from './assets/camel-infinispan_200x150.png';
|
|
85
|
-
import saxonIcon from './assets/camel-saxon_200x150.png';
|
|
86
|
-
import sparkIcon from './assets/camel-spark_200x150.png';
|
|
87
|
-
import swaggerIcon from './assets/camel-swagger-java_200x150.png';
|
|
88
|
-
import azureIcon from './assets/FuseConnector_Icons_AzureServices.png';
|
|
89
|
-
import restIcon from './assets/FuseConnector_Icons_REST.png';
|
|
90
|
-
import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
|
|
91
|
-
import { DashboardWrapper } from '@patternfly/react-core/src/demos/DashboardWrapper';
|
|
92
|
-
import { data } from '@patternfly/react-core/src/demos/CardView/examples/CardViewData.jsx';
|
|
93
|
-
|
|
94
|
-
class PrimaryDetailCardView extends React.Component {
|
|
95
|
-
constructor(props) {
|
|
96
|
-
super(props);
|
|
97
|
-
|
|
98
|
-
this.state = {
|
|
99
|
-
page: 1,
|
|
100
|
-
perPage: 10,
|
|
101
|
-
totalItemCount: 10,
|
|
102
|
-
isDrawerExpanded: false,
|
|
103
|
-
isChecked: false,
|
|
104
|
-
selectedItems: [],
|
|
105
|
-
areAllSelected: false,
|
|
106
|
-
splitButtonDropdownIsOpen: false,
|
|
107
|
-
activeCard: null,
|
|
108
|
-
filters: {
|
|
109
|
-
products: []
|
|
110
|
-
},
|
|
111
|
-
cardData: data,
|
|
112
|
-
isUpperToolbarDropdownOpen: false,
|
|
113
|
-
isUpperToolbarKebabDropdownOpen: false,
|
|
114
|
-
isLowerToolbarDropdownOpen: false,
|
|
115
|
-
isLowerToolbarKebabDropdownOpen: false,
|
|
116
|
-
isCardKebabDropdownOpen: false,
|
|
117
|
-
activeItem: 0
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
this.onToolbarDropdownToggle = (_event, isLowerToolbarDropdownOpen) => {
|
|
121
|
-
this.setState((prevState) => ({
|
|
122
|
-
isLowerToolbarDropdownOpen
|
|
123
|
-
}));
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
this.onToolbarDropdownSelect = (_event) => {
|
|
127
|
-
this.setState({
|
|
128
|
-
isLowerToolbarDropdownOpen: !this.state.isLowerToolbarDropdownOpen
|
|
129
|
-
});
|
|
130
|
-
};
|
|
131
|
-
|
|
132
|
-
this.onToolbarKebabDropdownToggle = () => {
|
|
133
|
-
this.setState((prevState) => ({
|
|
134
|
-
isLowerToolbarKebabDropdownOpen: !prevState.isLowerToolbarKebabDropdownOpen
|
|
135
|
-
}));
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
this.onToolbarKebabDropdownSelect = () => {
|
|
139
|
-
this.setState({
|
|
140
|
-
isLowerToolbarKebabDropdownOpen: false
|
|
141
|
-
});
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
this.checkAllSelected = (selected, total) => {
|
|
145
|
-
if (selected && selected < total) {
|
|
146
|
-
return null;
|
|
147
|
-
}
|
|
148
|
-
return selected === total;
|
|
149
|
-
};
|
|
150
|
-
|
|
151
|
-
this.onNameSelect = (event, selection) => {
|
|
152
|
-
const checked = event.target.checked;
|
|
153
|
-
this.setState((prevState) => {
|
|
154
|
-
const prevSelections = prevState.filters.products;
|
|
155
|
-
return {
|
|
156
|
-
filters: {
|
|
157
|
-
...prevState.filters,
|
|
158
|
-
['products']: checked
|
|
159
|
-
? [...prevSelections, selection]
|
|
160
|
-
: prevSelections.filter((value) => value !== selection)
|
|
161
|
-
}
|
|
162
|
-
};
|
|
163
|
-
});
|
|
164
|
-
};
|
|
165
|
-
|
|
166
|
-
this.onDelete = (type = '', id = '') => {
|
|
167
|
-
if (type) {
|
|
168
|
-
this.setState((prevState) => {
|
|
169
|
-
prevState.filters[type.toLowerCase()] = prevState.filters[type.toLowerCase()].filter((s) => s !== id);
|
|
170
|
-
return {
|
|
171
|
-
filters: prevState.filters
|
|
172
|
-
};
|
|
173
|
-
});
|
|
174
|
-
} else {
|
|
175
|
-
this.setState({
|
|
176
|
-
filters: {
|
|
177
|
-
products: []
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
};
|
|
182
|
-
|
|
183
|
-
this.onCloseDrawerClick = () => {
|
|
184
|
-
this.setState({
|
|
185
|
-
activeCard: null,
|
|
186
|
-
isDrawerExpanded: false
|
|
187
|
-
});
|
|
188
|
-
};
|
|
189
|
-
|
|
190
|
-
this.onCheckboxClick = (event, productId) => {
|
|
191
|
-
this.setState((prevState) =>
|
|
192
|
-
prevState.selectedItems.includes(productId * 1) || this.state.selectedItems.includes(productId * 1)
|
|
193
|
-
? {
|
|
194
|
-
selectedItems: [...this.state.selectedItems.filter((id) => productId * 1 !== id)],
|
|
195
|
-
areAllSelected: this.checkAllSelected(prevState.selectedItems.length - 1, prevState.totalItemCount)
|
|
196
|
-
}
|
|
197
|
-
: {
|
|
198
|
-
selectedItems: [...prevState.selectedItems, productId * 1],
|
|
199
|
-
areAllSelected: this.checkAllSelected(prevState.selectedItems.length + 1, prevState.totalItemCount)
|
|
200
|
-
}
|
|
201
|
-
);
|
|
202
|
-
};
|
|
203
|
-
|
|
204
|
-
this.onClick = (productId) => {
|
|
205
|
-
this.setState((prevState) =>
|
|
206
|
-
prevState.selectedItems.includes(productId * 1)
|
|
207
|
-
? {
|
|
208
|
-
selectedItems: [...prevState.selectedItems.filter((id) => productId * 1 !== id)],
|
|
209
|
-
areAllSelected: this.checkAllSelected(prevState.selectedItems.length - 1, prevState.totalItemCount)
|
|
210
|
-
}
|
|
211
|
-
: {
|
|
212
|
-
selectedItems: [...prevState.selectedItems, productId * 1],
|
|
213
|
-
areAllSelected: this.checkAllSelected(prevState.selectedItems.length + 1, prevState.totalItemCount)
|
|
214
|
-
}
|
|
215
|
-
);
|
|
216
|
-
};
|
|
217
|
-
|
|
218
|
-
this.onCardClick = (productId) => {
|
|
219
|
-
|
|
220
|
-
if (productId === this.state.activeCard) {
|
|
221
|
-
this.setState({
|
|
222
|
-
isDrawerExpanded: !this.state.isDrawerExpanded,
|
|
223
|
-
activeCard: null
|
|
224
|
-
});
|
|
225
|
-
return;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
this.setState({
|
|
229
|
-
activeCard: productId,
|
|
230
|
-
isDrawerExpanded: true
|
|
231
|
-
});
|
|
232
|
-
};
|
|
233
|
-
|
|
234
|
-
this.onChange = (_event, labelledById) => {
|
|
235
|
-
if (labelledById === this.state.activeCard) {
|
|
236
|
-
return;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
this.setState({
|
|
240
|
-
activeCard: labelledById,
|
|
241
|
-
isDrawerExpanded: true
|
|
242
|
-
});
|
|
243
|
-
};
|
|
244
|
-
|
|
245
|
-
this.onPerPageSelect = (_evt, perPage) => {
|
|
246
|
-
this.setState({ page: 1, perPage });
|
|
247
|
-
};
|
|
248
|
-
|
|
249
|
-
this.onSetPage = (_evt, page) => {
|
|
250
|
-
this.setState({ page });
|
|
251
|
-
};
|
|
252
|
-
|
|
253
|
-
this.selectPage = () => {
|
|
254
|
-
const { totalItemCount, perPage } = this.state;
|
|
255
|
-
let collection = [];
|
|
256
|
-
|
|
257
|
-
collection = this.getAllItems();
|
|
258
|
-
|
|
259
|
-
this.setState(
|
|
260
|
-
{
|
|
261
|
-
selectedItems: collection,
|
|
262
|
-
areAllSelected: totalItemCount === perPage ? true : false
|
|
263
|
-
},
|
|
264
|
-
this.updateSelected
|
|
265
|
-
);
|
|
266
|
-
};
|
|
267
|
-
|
|
268
|
-
this.selectAll = () => {
|
|
269
|
-
let collection = [];
|
|
270
|
-
for (let i = 0; i <= 9; i++) {
|
|
271
|
-
collection = [...collection, i];
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
this.setState(
|
|
275
|
-
{
|
|
276
|
-
selectedItems: collection,
|
|
277
|
-
isChecked: true,
|
|
278
|
-
areAllSelected: true
|
|
279
|
-
},
|
|
280
|
-
this.updateSelected
|
|
281
|
-
);
|
|
282
|
-
};
|
|
283
|
-
|
|
284
|
-
this.selectNone = () => {
|
|
285
|
-
this.setState(
|
|
286
|
-
{
|
|
287
|
-
selectedItems: [],
|
|
288
|
-
isChecked: false,
|
|
289
|
-
areAllSelected: false,
|
|
290
|
-
isDrawerExpanded: false,
|
|
291
|
-
activeCard: null
|
|
292
|
-
},
|
|
293
|
-
this.updateSelected
|
|
294
|
-
);
|
|
295
|
-
};
|
|
296
|
-
|
|
297
|
-
this.splitCheckboxSelectAll = (e) => {
|
|
298
|
-
const { checked } = e.target;
|
|
299
|
-
const { isChecked } = this.state;
|
|
300
|
-
let collection = [];
|
|
301
|
-
|
|
302
|
-
if (checked) {
|
|
303
|
-
for (let i = 0; i <= 9; i++) {
|
|
304
|
-
collection = [...collection, i];
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
this.setState(
|
|
309
|
-
{
|
|
310
|
-
selectedItems: collection,
|
|
311
|
-
areAllSelected: checked,
|
|
312
|
-
isDrawerExpanded: false,
|
|
313
|
-
activeCard: null,
|
|
314
|
-
isChecked
|
|
315
|
-
},
|
|
316
|
-
this.updateSelected
|
|
317
|
-
);
|
|
318
|
-
};
|
|
319
|
-
|
|
320
|
-
this.onSplitButtonSelect = () => {
|
|
321
|
-
this.setState(() => ({
|
|
322
|
-
splitButtonDropdownIsOpen: false,
|
|
323
|
-
isDrawerExpanded: false,
|
|
324
|
-
activeCard: null
|
|
325
|
-
}));
|
|
326
|
-
};
|
|
327
|
-
|
|
328
|
-
this.onSplitButtonToggle = () => {
|
|
329
|
-
this.setState((prevState) => ({
|
|
330
|
-
splitButtonDropdownIsOpen: !prevState.splitButtonDropdownIsOpen
|
|
331
|
-
}));
|
|
332
|
-
};
|
|
333
|
-
|
|
334
|
-
this.onCardKebabDropdownToggle = (key) => {
|
|
335
|
-
this.setState((prevState) => ({
|
|
336
|
-
[key]: !prevState[key]
|
|
337
|
-
}));
|
|
338
|
-
};
|
|
339
|
-
|
|
340
|
-
this.onCardKebabDropdownSelect = (key) => {
|
|
341
|
-
this.setState({
|
|
342
|
-
[key]: false
|
|
343
|
-
});
|
|
344
|
-
};
|
|
345
|
-
|
|
346
|
-
this.deleteItem = (event, item) => {
|
|
347
|
-
const filter = (getter) => (val) => getter(val) !== item.id;
|
|
348
|
-
const filteredCards = this.state.cardData.filter(filter(({ id }) => id));
|
|
349
|
-
this.setState({
|
|
350
|
-
cardData: filteredCards,
|
|
351
|
-
selectedItems: this.state.selectedItems.filter(filter((id) => id)),
|
|
352
|
-
totalItemCount: this.state.totalItemCount - 1,
|
|
353
|
-
isDrawerExpanded: false,
|
|
354
|
-
activeCard: null
|
|
355
|
-
});
|
|
356
|
-
};
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
getAllItems() {
|
|
360
|
-
const { cardData } = this.state;
|
|
361
|
-
const collection = [];
|
|
362
|
-
for (const items of cardData) {
|
|
363
|
-
collection.push(items.id);
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
return collection;
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
buildSelectDropdown() {
|
|
370
|
-
const { splitButtonDropdownIsOpen, selectedItems, areAllSelected } = this.state;
|
|
371
|
-
const numSelected = selectedItems.length;
|
|
372
|
-
const allSelected = areAllSelected;
|
|
373
|
-
const anySelected = numSelected > 0;
|
|
374
|
-
const someChecked = anySelected ? null : false;
|
|
375
|
-
const isChecked = allSelected ? true : someChecked;
|
|
376
|
-
const splitButtonDropdownItems = (
|
|
377
|
-
<>
|
|
378
|
-
<DropdownItem key="item-1" onClick={this.selectNone.bind(this)}>
|
|
379
|
-
Select none (0 items)
|
|
380
|
-
</DropdownItem>
|
|
381
|
-
<DropdownItem key="item-2" onClick={this.selectPage.bind(this)}>
|
|
382
|
-
Select page ({this.state.perPage} items)
|
|
383
|
-
</DropdownItem>
|
|
384
|
-
<DropdownItem key="item-3" onClick={this.selectAll.bind(this)}>
|
|
385
|
-
Select all ({this.state.totalItemCount} items)
|
|
386
|
-
</DropdownItem>
|
|
387
|
-
</>
|
|
388
|
-
);
|
|
389
|
-
|
|
390
|
-
return (
|
|
391
|
-
<Dropdown
|
|
392
|
-
onSelect={this.onSplitButtonSelect}
|
|
393
|
-
isOpen={splitButtonDropdownIsOpen}
|
|
394
|
-
onOpenChange={(isOpen) => this.setState({ splitButtonDropdownIsOpen: isOpen })}
|
|
395
|
-
toggle={(toggleRef) => (
|
|
396
|
-
<MenuToggle
|
|
397
|
-
ref={toggleRef}
|
|
398
|
-
isExpanded={splitButtonDropdownIsOpen}
|
|
399
|
-
onClick={this.onSplitButtonToggle}
|
|
400
|
-
aria-label="Select cards"
|
|
401
|
-
splitButtonOptions={{
|
|
402
|
-
items: [
|
|
403
|
-
<MenuToggleCheckbox
|
|
404
|
-
id="split-dropdown-checkbox"
|
|
405
|
-
key="split-dropdown-checkbox"
|
|
406
|
-
aria-label={anySelected ? 'Deselect all cards' : 'Select all cards'}
|
|
407
|
-
isChecked={areAllSelected}
|
|
408
|
-
onClick={this.splitCheckboxSelectAll.bind(this)}
|
|
409
|
-
>
|
|
410
|
-
{numSelected !== 0 && `${numSelected} selected`}
|
|
411
|
-
</MenuToggleCheckbox>
|
|
412
|
-
]
|
|
413
|
-
}}
|
|
414
|
-
></MenuToggle>
|
|
415
|
-
)}
|
|
416
|
-
>
|
|
417
|
-
<DropdownList>{splitButtonDropdownItems}</DropdownList>
|
|
418
|
-
</Dropdown>
|
|
419
|
-
);
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
render() {
|
|
423
|
-
const {
|
|
424
|
-
isDrawerExpanded,
|
|
425
|
-
isChecked,
|
|
426
|
-
selectedItems,
|
|
427
|
-
activeCard,
|
|
428
|
-
isLowerToolbarKebabDropdownOpen,
|
|
429
|
-
filters,
|
|
430
|
-
cardData
|
|
431
|
-
} = this.state;
|
|
432
|
-
|
|
433
|
-
const toolbarKebabDropdownItems = (
|
|
434
|
-
<>
|
|
435
|
-
<DropdownItem value={0} key="action">
|
|
436
|
-
Action
|
|
437
|
-
</DropdownItem>
|
|
438
|
-
<DropdownItem
|
|
439
|
-
value={1}
|
|
440
|
-
key="link"
|
|
441
|
-
to="#default-link2"
|
|
442
|
-
// Prevent the default onClick functionality for example purposes
|
|
443
|
-
onClick={(ev) => ev.preventDefault()}
|
|
444
|
-
>
|
|
445
|
-
Link
|
|
446
|
-
</DropdownItem>
|
|
447
|
-
<DropdownItem value={2} isDisabled key="disabled action">
|
|
448
|
-
Disabled Action
|
|
449
|
-
</DropdownItem>
|
|
450
|
-
<DropdownItem value={3} isDisabled key="disabled link" to="#default-link4">
|
|
451
|
-
Disabled Link
|
|
452
|
-
</DropdownItem>
|
|
453
|
-
<Divider component="li" key="separator" />
|
|
454
|
-
<DropdownItem value={4} key="separated action">
|
|
455
|
-
Separated Action
|
|
456
|
-
</DropdownItem>
|
|
457
|
-
<DropdownItem value={5} key="separated link" to="#default-link6" onClick={(ev) => ev.preventDefault()}>
|
|
458
|
-
Separated Link
|
|
459
|
-
</DropdownItem>
|
|
460
|
-
</>
|
|
461
|
-
);
|
|
462
|
-
const toolbarItems = (
|
|
463
|
-
<React.Fragment>
|
|
464
|
-
<ToolbarItem>{this.buildSelectDropdown()}</ToolbarItem>
|
|
465
|
-
<ToolbarItem>
|
|
466
|
-
<Button variant="primary">Create instance</Button>
|
|
467
|
-
</ToolbarItem>
|
|
468
|
-
<ToolbarItem>
|
|
469
|
-
<Button variant="secondary">Action</Button>
|
|
470
|
-
</ToolbarItem>
|
|
471
|
-
<ToolbarItem>
|
|
472
|
-
<Dropdown
|
|
473
|
-
onSelect={this.onToolbarKebabDropdownSelect}
|
|
474
|
-
isOpen={isLowerToolbarKebabDropdownOpen}
|
|
475
|
-
onOpenChange={(isOpen) => this.setState({ isLowerToolbarKebabDropdownOpen: isOpen })}
|
|
476
|
-
toggle={(toggleRef) => (
|
|
477
|
-
<MenuToggle
|
|
478
|
-
ref={toggleRef}
|
|
479
|
-
isExpanded={isLowerToolbarKebabDropdownOpen}
|
|
480
|
-
variant="plain"
|
|
481
|
-
onClick={this.onToolbarKebabDropdownToggle}
|
|
482
|
-
aria-label="Toolbar actions"
|
|
483
|
-
>
|
|
484
|
-
<EllipsisVIcon aria-hidden="true" />
|
|
485
|
-
</MenuToggle>
|
|
486
|
-
)}
|
|
487
|
-
>
|
|
488
|
-
<DropdownList>{toolbarKebabDropdownItems}</DropdownList>
|
|
489
|
-
</Dropdown>
|
|
490
|
-
</ToolbarItem>
|
|
491
|
-
</React.Fragment>
|
|
492
|
-
);
|
|
493
|
-
|
|
494
|
-
const filtered =
|
|
495
|
-
filters.products.length > 0
|
|
496
|
-
? cardData.filter((card) => filters.products.length === 0 || filters.products.includes(card.name))
|
|
497
|
-
: cardData;
|
|
498
|
-
|
|
499
|
-
const icons = {
|
|
500
|
-
pfIcon,
|
|
501
|
-
activeMQIcon,
|
|
502
|
-
sparkIcon,
|
|
503
|
-
avroIcon,
|
|
504
|
-
azureIcon,
|
|
505
|
-
saxonIcon,
|
|
506
|
-
dropBoxIcon,
|
|
507
|
-
infinispanIcon,
|
|
508
|
-
restIcon,
|
|
509
|
-
swaggerIcon
|
|
510
|
-
};
|
|
511
|
-
|
|
512
|
-
const drawerContent = (
|
|
513
|
-
<Gallery hasGutter role="region" aria-label="Selectable card container">
|
|
514
|
-
{filtered.map((product, key) => (
|
|
515
|
-
<Card
|
|
516
|
-
key={product.name}
|
|
517
|
-
id={'card-view-' + key}
|
|
518
|
-
isClickable
|
|
519
|
-
isSelectable
|
|
520
|
-
isSelected={activeCard === product.id}
|
|
521
|
-
>
|
|
522
|
-
<CardHeader
|
|
523
|
-
actions={{
|
|
524
|
-
actions: (
|
|
525
|
-
<>
|
|
526
|
-
<Dropdown
|
|
527
|
-
onSelect={() => this.onCardKebabDropdownSelect(key)}
|
|
528
|
-
isOpen={this.state[key] || false}
|
|
529
|
-
onOpenChange={(isOpen) => this.setState({ [key]: isOpen })}
|
|
530
|
-
popperProps={{ position: 'right' }}
|
|
531
|
-
toggle={(toggleRef) => (
|
|
532
|
-
<MenuToggle
|
|
533
|
-
ref={toggleRef}
|
|
534
|
-
isExpanded={this.state[key] || false}
|
|
535
|
-
aria-label={`${product.name} actions`}
|
|
536
|
-
variant="plain"
|
|
537
|
-
onClick={() => this.onCardKebabDropdownToggle(key)}
|
|
538
|
-
>
|
|
539
|
-
<EllipsisVIcon aria-hidden="true" />
|
|
540
|
-
</MenuToggle>
|
|
541
|
-
)}
|
|
542
|
-
>
|
|
543
|
-
<DropdownList>
|
|
544
|
-
<DropdownItem key="trash" onClick={(e) => this.deleteItem(e, product)}>
|
|
545
|
-
<TrashIcon />
|
|
546
|
-
Delete
|
|
547
|
-
</DropdownItem>
|
|
548
|
-
</DropdownList>
|
|
549
|
-
</Dropdown>
|
|
550
|
-
</>
|
|
551
|
-
)
|
|
552
|
-
}}
|
|
553
|
-
selectableActions={{ isChecked: selectedItems.includes(product.id), selectableActionId: `selectable-actions-item-${product.id}`, selectableActionAriaLabelledby: `${'card-view-' + key}`, name: `check-${product.id}`, onChange: () => this.onClick(product.id) }}
|
|
554
|
-
>
|
|
555
|
-
<img src={icons[product.icon]} alt={`${product.name} icon`} style={{ height: '50px' }} />
|
|
556
|
-
</CardHeader>
|
|
557
|
-
<CardTitle>
|
|
558
|
-
<Button variant="link" isInline onClick={() => this.onCardClick(product.id)} aria-expanded={activeCard === product.id}>
|
|
559
|
-
{product.name}
|
|
560
|
-
</Button>
|
|
561
|
-
</CardTitle>
|
|
562
|
-
<CardBody>{product.description}</CardBody>
|
|
563
|
-
</Card>
|
|
564
|
-
))}
|
|
565
|
-
</Gallery>
|
|
566
|
-
);
|
|
567
|
-
|
|
568
|
-
const panelContent = (
|
|
569
|
-
<DrawerPanelContent>
|
|
570
|
-
<DrawerHead>
|
|
571
|
-
<Title headingLevel="h2" size="xl">
|
|
572
|
-
node-{activeCard}
|
|
573
|
-
</Title>
|
|
574
|
-
<DrawerActions>
|
|
575
|
-
<DrawerCloseButton onClick={this.onCloseDrawerClick} />
|
|
576
|
-
</DrawerActions>
|
|
577
|
-
</DrawerHead>
|
|
578
|
-
<DrawerPanelBody>
|
|
579
|
-
<Flex spaceItems={{ default: 'spaceItemsLg' }} direction={{ default: 'column' }}>
|
|
580
|
-
<FlexItem>
|
|
581
|
-
<p>
|
|
582
|
-
The content of the drawer really is up to you. It could have form fields, definition lists, text lists,
|
|
583
|
-
labels, charts, progress bars, etc. Spacing recommendation is 24px margins. You can put tabs in here,
|
|
584
|
-
and can also make the drawer scrollable.
|
|
585
|
-
</p>
|
|
586
|
-
</FlexItem>
|
|
587
|
-
<FlexItem>
|
|
588
|
-
<Progress value={activeCard * 10} title="Title" />
|
|
589
|
-
</FlexItem>
|
|
590
|
-
<FlexItem>
|
|
591
|
-
<Progress value={activeCard * 5} title="Title" />
|
|
592
|
-
</FlexItem>
|
|
593
|
-
</Flex>
|
|
594
|
-
</DrawerPanelBody>
|
|
595
|
-
</DrawerPanelContent>
|
|
596
|
-
);
|
|
597
|
-
|
|
598
|
-
return (
|
|
599
|
-
<DashboardWrapper mainContainerId="main-content-card-view-default-nav" breadcrumb={null}>
|
|
600
|
-
<PageSection variant={PageSectionVariants.light}>
|
|
601
|
-
<TextContent>
|
|
602
|
-
<Text component="h1">Projects</Text>
|
|
603
|
-
<Text component="p">This is a demo that showcases Patternfly Cards.</Text>
|
|
604
|
-
</TextContent>
|
|
605
|
-
</PageSection>
|
|
606
|
-
<PageSection isFilled padding={{ default: 'noPadding' }}>
|
|
607
|
-
<Toolbar id="card-view-data-toolbar-group-types" usePageInsets clearAllFilters={this.onDelete}>
|
|
608
|
-
<ToolbarContent>{toolbarItems}</ToolbarContent>
|
|
609
|
-
</Toolbar>
|
|
610
|
-
<Divider component="div" />
|
|
611
|
-
</PageSection>
|
|
612
|
-
<PageSection isFilled padding={{ default: 'noPadding' }}>
|
|
613
|
-
<Drawer isExpanded={isDrawerExpanded} className={'pf-m-inline-on-2xl'}>
|
|
614
|
-
<DrawerContent panelContent={panelContent} colorVariant="no-background">
|
|
615
|
-
<DrawerContentBody hasPadding>{drawerContent}</DrawerContentBody>
|
|
616
|
-
</DrawerContent>
|
|
617
|
-
</Drawer>
|
|
618
|
-
</PageSection>
|
|
619
|
-
<PageSection isFilled={false} sticky="bottom" padding={{ default: 'noPadding' }} variant="light">
|
|
620
|
-
<Pagination
|
|
621
|
-
itemCount={filtered.length}
|
|
622
|
-
page={this.state.page}
|
|
623
|
-
perPage={this.state.perPage}
|
|
624
|
-
onPerPageSelect={this.onPerPageSelect}
|
|
625
|
-
onSetPage={this.onSetPage}
|
|
626
|
-
variant="bottom"
|
|
627
|
-
/>
|
|
628
|
-
</PageSection>
|
|
629
|
-
</DashboardWrapper>
|
|
630
|
-
);
|
|
631
|
-
}
|
|
632
|
-
}
|
|
43
|
+
```js file="./examples/PrimaryDetail/PrimaryDetailCardView.tsx" isFullscreen
|
|
633
44
|
```
|
|
634
45
|
|
|
635
46
|
### Primary-detail simple list in card
|
|
636
47
|
|
|
637
|
-
```js isFullscreen
|
|
638
|
-
import React from 'react';
|
|
639
|
-
import {
|
|
640
|
-
Card,
|
|
641
|
-
CardBody,
|
|
642
|
-
Divider,
|
|
643
|
-
Drawer,
|
|
644
|
-
DrawerActions,
|
|
645
|
-
DrawerCloseButton,
|
|
646
|
-
DrawerContent,
|
|
647
|
-
DrawerContentBody,
|
|
648
|
-
DrawerHead,
|
|
649
|
-
DrawerPanelBody,
|
|
650
|
-
DrawerPanelContent,
|
|
651
|
-
Flex,
|
|
652
|
-
FlexItem,
|
|
653
|
-
PageSection,
|
|
654
|
-
PageSectionVariants,
|
|
655
|
-
Progress,
|
|
656
|
-
SimpleList,
|
|
657
|
-
SimpleListGroup,
|
|
658
|
-
SimpleListItem,
|
|
659
|
-
Text,
|
|
660
|
-
TextContent,
|
|
661
|
-
TextInput,
|
|
662
|
-
Title
|
|
663
|
-
} from '@patternfly/react-core';
|
|
664
|
-
import { DashboardWrapper } from '@patternfly/react-core/src/demos/DashboardWrapper';
|
|
665
|
-
|
|
666
|
-
class PrimaryDetailSimpleListInCard extends React.Component {
|
|
667
|
-
constructor(props) {
|
|
668
|
-
super(props);
|
|
669
|
-
this.state = {
|
|
670
|
-
drawerPanelBodyContent: 1,
|
|
671
|
-
activeItem: 0,
|
|
672
|
-
isKebabDropdownOpen: false,
|
|
673
|
-
isDropdownOpen: false,
|
|
674
|
-
isExpanded: false
|
|
675
|
-
};
|
|
676
|
-
|
|
677
|
-
this.onSelectListItem = (listItem, listItemProps) => {
|
|
678
|
-
const id = listItemProps.id;
|
|
679
|
-
this.setState({
|
|
680
|
-
drawerPanelBodyContent: id.charAt(id.length - 1),
|
|
681
|
-
isExpanded: true
|
|
682
|
-
});
|
|
683
|
-
};
|
|
684
|
-
|
|
685
|
-
this.onClose = () => {
|
|
686
|
-
this.setState({
|
|
687
|
-
isExpanded: false
|
|
688
|
-
});
|
|
689
|
-
};
|
|
690
|
-
}
|
|
691
|
-
|
|
692
|
-
render() {
|
|
693
|
-
const { drawerPanelBodyContent, selectedListItemId, activeItem, isExpanded } = this.state;
|
|
694
|
-
|
|
695
|
-
const panelContent = (
|
|
696
|
-
<DrawerPanelContent widthOnXl={75}>
|
|
697
|
-
<DrawerHead>
|
|
698
|
-
<Title headingLevel="h2" size="xl">
|
|
699
|
-
{`List item ${drawerPanelBodyContent} details`}
|
|
700
|
-
</Title>
|
|
701
|
-
<DrawerActions>
|
|
702
|
-
<DrawerCloseButton onClick={this.onClose} />
|
|
703
|
-
</DrawerActions>
|
|
704
|
-
</DrawerHead>
|
|
705
|
-
<DrawerPanelBody>
|
|
706
|
-
<Flex spaceItems={{ default: 'spaceItemsLg' }} direction={{ default: 'column' }}>
|
|
707
|
-
<FlexItem>
|
|
708
|
-
<p>
|
|
709
|
-
The content of the drawer really is up to you. It could have form fields, definition lists, text lists,
|
|
710
|
-
labels, charts, progress bars, etc. Spacing recommendation is 24px margins. You can put tabs in here,
|
|
711
|
-
and can also make the drawer scrollable.
|
|
712
|
-
</p>
|
|
713
|
-
</FlexItem>
|
|
714
|
-
<FlexItem>
|
|
715
|
-
<Progress value={drawerPanelBodyContent * 10} title="Title" />
|
|
716
|
-
</FlexItem>
|
|
717
|
-
<FlexItem>
|
|
718
|
-
<Progress value={drawerPanelBodyContent * 5} title="Title" />
|
|
719
|
-
</FlexItem>
|
|
720
|
-
</Flex>
|
|
721
|
-
</DrawerPanelBody>
|
|
722
|
-
</DrawerPanelContent>
|
|
723
|
-
);
|
|
724
|
-
|
|
725
|
-
const drawerContent = (
|
|
726
|
-
<React.Fragment>
|
|
727
|
-
<SimpleList onSelect={this.onSelectListItem}>
|
|
728
|
-
<SimpleListGroup title="Section 1" id="simple-list-section-1">
|
|
729
|
-
<SimpleListItem key="item1" id="simple-list-item1" isCurrent>
|
|
730
|
-
List item 1
|
|
731
|
-
</SimpleListItem>
|
|
732
|
-
<SimpleListItem key="item2" id="simple-list-item2">
|
|
733
|
-
List item 2
|
|
734
|
-
</SimpleListItem>
|
|
735
|
-
<SimpleListItem key="item3" id="simple-list-item3">
|
|
736
|
-
List item 3
|
|
737
|
-
</SimpleListItem>
|
|
738
|
-
<SimpleListItem key="item4" id="simple-list-item4">
|
|
739
|
-
List item 4
|
|
740
|
-
</SimpleListItem>
|
|
741
|
-
</SimpleListGroup>
|
|
742
|
-
<SimpleListGroup title="Section 2" id="section-2">
|
|
743
|
-
<SimpleListItem key="item5" id="simple-list-item5">
|
|
744
|
-
List item 5
|
|
745
|
-
</SimpleListItem>
|
|
746
|
-
<SimpleListItem key="item6" id="simple-list-item6">
|
|
747
|
-
List item 6
|
|
748
|
-
</SimpleListItem>
|
|
749
|
-
<SimpleListItem key="item7" id="simple-list-item7">
|
|
750
|
-
List item 7
|
|
751
|
-
</SimpleListItem>
|
|
752
|
-
<SimpleListItem key="item8" id="simple-list-item8">
|
|
753
|
-
List item 8
|
|
754
|
-
</SimpleListItem>
|
|
755
|
-
<SimpleListItem key="item9" id="simple-list-item9">
|
|
756
|
-
List item 9
|
|
757
|
-
</SimpleListItem>
|
|
758
|
-
</SimpleListGroup>
|
|
759
|
-
</SimpleList>
|
|
760
|
-
</React.Fragment>
|
|
761
|
-
);
|
|
762
|
-
|
|
763
|
-
return (
|
|
764
|
-
<DashboardWrapper>
|
|
765
|
-
<PageSection variant={PageSectionVariants.light}>
|
|
766
|
-
<TextContent>
|
|
767
|
-
<Text component="h1">Main title</Text>
|
|
768
|
-
<Text component="p">
|
|
769
|
-
Body text should be Overpass Regular at 16px. It should have leading of 24px because <br />
|
|
770
|
-
of it’s relative line height of 1.5.
|
|
771
|
-
</Text>
|
|
772
|
-
</TextContent>
|
|
773
|
-
</PageSection>
|
|
774
|
-
<Divider component="div" />
|
|
775
|
-
<PageSection>
|
|
776
|
-
<Card>
|
|
777
|
-
<Drawer isStatic isExpanded={isExpanded}>
|
|
778
|
-
<DrawerContent panelContent={panelContent}>
|
|
779
|
-
<DrawerContentBody>{drawerContent}</DrawerContentBody>
|
|
780
|
-
</DrawerContent>
|
|
781
|
-
</Drawer>
|
|
782
|
-
</Card>
|
|
783
|
-
</PageSection>
|
|
784
|
-
</DashboardWrapper>
|
|
785
|
-
);
|
|
786
|
-
}
|
|
787
|
-
}
|
|
48
|
+
```js file="./examples/PrimaryDetail/PrimaryDetailSimpleListInCard.tsx" isFullscreen
|
|
788
49
|
```
|
|
789
50
|
|
|
790
51
|
### Primary-detail data list in card
|
|
791
52
|
|
|
792
|
-
```js isFullscreen
|
|
793
|
-
import React from 'react';
|
|
794
|
-
import {
|
|
795
|
-
Card,
|
|
796
|
-
DataList,
|
|
797
|
-
DataListCell,
|
|
798
|
-
DataListItem,
|
|
799
|
-
DataListItemCells,
|
|
800
|
-
DataListItemRow,
|
|
801
|
-
Toolbar,
|
|
802
|
-
ToolbarContent,
|
|
803
|
-
ToolbarItem,
|
|
804
|
-
Divider,
|
|
805
|
-
Drawer,
|
|
806
|
-
DrawerActions,
|
|
807
|
-
DrawerCloseButton,
|
|
808
|
-
DrawerContent,
|
|
809
|
-
DrawerContentBody,
|
|
810
|
-
DrawerHead,
|
|
811
|
-
DrawerPanelBody,
|
|
812
|
-
DrawerPanelContent,
|
|
813
|
-
Dropdown,
|
|
814
|
-
DropdownItem,
|
|
815
|
-
DropdownList,
|
|
816
|
-
Flex,
|
|
817
|
-
FlexItem,
|
|
818
|
-
MenuToggle,
|
|
819
|
-
PageSection,
|
|
820
|
-
PageSectionVariants,
|
|
821
|
-
Progress,
|
|
822
|
-
Text,
|
|
823
|
-
TextContent,
|
|
824
|
-
Title
|
|
825
|
-
} from '@patternfly/react-core';
|
|
826
|
-
import { DashboardWrapper } from '@patternfly/react-core/src/demos/DashboardWrapper';
|
|
827
|
-
|
|
828
|
-
class PrimaryDetailDataListInCard extends React.Component {
|
|
829
|
-
constructor(props) {
|
|
830
|
-
super(props);
|
|
831
|
-
this.state = {
|
|
832
|
-
drawerPanelBodyContent: 1,
|
|
833
|
-
activeItem: 0,
|
|
834
|
-
isKebabDropdownOpen: false,
|
|
835
|
-
isDropdownOpen: false,
|
|
836
|
-
selectedDataListItemId: 'dataListItem1',
|
|
837
|
-
isExpanded: false
|
|
838
|
-
};
|
|
839
|
-
|
|
840
|
-
this.onDropdownToggle = () => {
|
|
841
|
-
this.setState((prevState) => ({
|
|
842
|
-
isDropdownOpen: !prevState.isDropdownOpen
|
|
843
|
-
}));
|
|
844
|
-
};
|
|
845
|
-
this.onDropdownSelect = () => {
|
|
846
|
-
this.setState({
|
|
847
|
-
isDropdownOpen: false
|
|
848
|
-
});
|
|
849
|
-
this.onDropdownFocus();
|
|
850
|
-
};
|
|
851
|
-
this.onDropdownFocus = () => {
|
|
852
|
-
const element = document.getElementById('toggle-id');
|
|
853
|
-
element.focus();
|
|
854
|
-
};
|
|
855
|
-
this.onSelectDataListItem = (_event, id) => {
|
|
856
|
-
this.setState({
|
|
857
|
-
selectedDataListItemId: id,
|
|
858
|
-
drawerPanelBodyContent: id.charAt(id.length - 1),
|
|
859
|
-
isExpanded: true
|
|
860
|
-
});
|
|
861
|
-
};
|
|
862
|
-
this.onClose = () => {
|
|
863
|
-
this.setState({
|
|
864
|
-
isExpanded: false
|
|
865
|
-
});
|
|
866
|
-
};
|
|
867
|
-
}
|
|
868
|
-
|
|
869
|
-
render() {
|
|
870
|
-
const {
|
|
871
|
-
drawerPanelBodyContent,
|
|
872
|
-
selectedListItemId,
|
|
873
|
-
activeItem,
|
|
874
|
-
isDropdownOpen,
|
|
875
|
-
selectedDataListItemId,
|
|
876
|
-
isExpanded
|
|
877
|
-
} = this.state;
|
|
878
|
-
|
|
879
|
-
const panelContent = (
|
|
880
|
-
<DrawerPanelContent widthOn2Xl={75}>
|
|
881
|
-
<DrawerHead>
|
|
882
|
-
<Title size="lg" headingLevel="h2">
|
|
883
|
-
Patternfly-elements
|
|
884
|
-
</Title>
|
|
885
|
-
<DrawerActions>
|
|
886
|
-
<DrawerCloseButton onClick={this.onClose} />
|
|
887
|
-
</DrawerActions>
|
|
888
|
-
</DrawerHead>
|
|
889
|
-
<DrawerPanelBody>
|
|
890
|
-
<Flex spaceItems={{ default: 'spaceItemsLg' }} direction={{ default: 'column' }}>
|
|
891
|
-
<FlexItem>
|
|
892
|
-
<p>
|
|
893
|
-
The content of the drawer really is up to you. It could have form fields, definition lists, text lists,
|
|
894
|
-
labels, charts, progress bars, etc. Spacing recommendation is 24px margins. You can put tabs in here,
|
|
895
|
-
and can also make the drawer scrollable.
|
|
896
|
-
</p>
|
|
897
|
-
</FlexItem>
|
|
898
|
-
<FlexItem>
|
|
899
|
-
<Progress value={drawerPanelBodyContent * 10} title="Title" />
|
|
900
|
-
</FlexItem>
|
|
901
|
-
<FlexItem>
|
|
902
|
-
<Progress value={drawerPanelBodyContent * 5} title="Title" />
|
|
903
|
-
</FlexItem>
|
|
904
|
-
</Flex>
|
|
905
|
-
</DrawerPanelBody>
|
|
906
|
-
</DrawerPanelContent>
|
|
907
|
-
);
|
|
908
|
-
|
|
909
|
-
const drawerContent = (
|
|
910
|
-
<React.Fragment>
|
|
911
|
-
<Toolbar id="data-list-data-toolbar" usePageInsets>
|
|
912
|
-
<ToolbarContent>
|
|
913
|
-
<ToolbarItem>
|
|
914
|
-
<Dropdown
|
|
915
|
-
onSelect={this.onDropdownSelect}
|
|
916
|
-
isOpen={isDropdownOpen}
|
|
917
|
-
onOpenChange={(isOpen) => this.setState({ isDropdownOpen: isOpen })}
|
|
918
|
-
toggle={(toggleRef) => (
|
|
919
|
-
<MenuToggle ref={toggleRef} isExpanded={isDropdownOpen} onClick={this.onDropdownToggle}>
|
|
920
|
-
Dropdown
|
|
921
|
-
</MenuToggle>
|
|
922
|
-
)}
|
|
923
|
-
>
|
|
924
|
-
<DropdownList>
|
|
925
|
-
<DropdownItem key="option1">Option 1</DropdownItem>
|
|
926
|
-
<DropdownItem key="option2">Option 2</DropdownItem>
|
|
927
|
-
</DropdownList>
|
|
928
|
-
</Dropdown>
|
|
929
|
-
</ToolbarItem>
|
|
930
|
-
</ToolbarContent>
|
|
931
|
-
</Toolbar>
|
|
932
|
-
<DataList
|
|
933
|
-
aria-label="selectable data list example"
|
|
934
|
-
selectedDataListItemId={selectedDataListItemId}
|
|
935
|
-
onSelectDataListItem={this.onSelectDataListItem}
|
|
936
|
-
>
|
|
937
|
-
<DataListItem aria-label="data-list-item1-in-card" id="data-list-item1">
|
|
938
|
-
<DataListItemRow>
|
|
939
|
-
<DataListItemCells
|
|
940
|
-
dataListCells={[
|
|
941
|
-
<DataListCell>
|
|
942
|
-
<div>Node 1</div>
|
|
943
|
-
<a href="#">siemur/test-space</a>
|
|
944
|
-
</DataListCell>
|
|
945
|
-
]}
|
|
946
|
-
/>
|
|
947
|
-
</DataListItemRow>
|
|
948
|
-
</DataListItem>
|
|
949
|
-
<DataListItem aria-label="data-list-item2-in-card" id="data-list-item2">
|
|
950
|
-
<DataListItemRow>
|
|
951
|
-
<DataListItemCells
|
|
952
|
-
dataListCells={[
|
|
953
|
-
<DataListCell>
|
|
954
|
-
<div>Node 2</div>
|
|
955
|
-
<a href="#">siemur/test-space</a>
|
|
956
|
-
</DataListCell>
|
|
957
|
-
]}
|
|
958
|
-
/>
|
|
959
|
-
</DataListItemRow>
|
|
960
|
-
</DataListItem>
|
|
961
|
-
<DataListItem aria-label="data-list-item3-in-card" id="data-list-item3">
|
|
962
|
-
<DataListItemRow>
|
|
963
|
-
<DataListItemCells
|
|
964
|
-
dataListCells={[
|
|
965
|
-
<DataListCell>
|
|
966
|
-
<div>Node 3</div>
|
|
967
|
-
<a href="#">siemur/test-space</a>
|
|
968
|
-
</DataListCell>
|
|
969
|
-
]}
|
|
970
|
-
/>
|
|
971
|
-
</DataListItemRow>
|
|
972
|
-
</DataListItem>
|
|
973
|
-
<DataListItem aria-label="data-list-item4-in-card" id="data-list-item4">
|
|
974
|
-
<DataListItemRow>
|
|
975
|
-
<DataListItemCells
|
|
976
|
-
dataListCells={[
|
|
977
|
-
<DataListCell>
|
|
978
|
-
<div>Node 4</div>
|
|
979
|
-
<a href="#">siemur/test-space</a>
|
|
980
|
-
</DataListCell>
|
|
981
|
-
]}
|
|
982
|
-
/>
|
|
983
|
-
</DataListItemRow>
|
|
984
|
-
</DataListItem>
|
|
985
|
-
<DataListItem aria-label="data-list-item5-in-card" id="data-list-item5">
|
|
986
|
-
<DataListItemRow>
|
|
987
|
-
<DataListItemCells
|
|
988
|
-
dataListCells={[
|
|
989
|
-
<DataListCell>
|
|
990
|
-
<div>Node 5</div>
|
|
991
|
-
<a href="#">siemur/test-space</a>
|
|
992
|
-
</DataListCell>
|
|
993
|
-
]}
|
|
994
|
-
/>
|
|
995
|
-
</DataListItemRow>
|
|
996
|
-
</DataListItem>
|
|
997
|
-
</DataList>
|
|
998
|
-
</React.Fragment>
|
|
999
|
-
);
|
|
1000
|
-
|
|
1001
|
-
return (
|
|
1002
|
-
<DashboardWrapper>
|
|
1003
|
-
<PageSection variant={PageSectionVariants.light}>
|
|
1004
|
-
<TextContent>
|
|
1005
|
-
<Text component="h1">Main title</Text>
|
|
1006
|
-
<Text component="p">
|
|
1007
|
-
Body text should be Overpass Regular at 16px. It should have leading of 24px because <br />
|
|
1008
|
-
of it’s relative line height of 1.5.
|
|
1009
|
-
</Text>
|
|
1010
|
-
</TextContent>
|
|
1011
|
-
</PageSection>
|
|
1012
|
-
<Divider component="div" />
|
|
1013
|
-
<PageSection>
|
|
1014
|
-
<Card>
|
|
1015
|
-
<Drawer isStatic isExpanded={isExpanded}>
|
|
1016
|
-
<DrawerContent panelContent={panelContent}>
|
|
1017
|
-
<DrawerContentBody>{drawerContent}</DrawerContentBody>
|
|
1018
|
-
</DrawerContent>
|
|
1019
|
-
</Drawer>
|
|
1020
|
-
</Card>
|
|
1021
|
-
</PageSection>
|
|
1022
|
-
</DashboardWrapper>
|
|
1023
|
-
);
|
|
1024
|
-
}
|
|
1025
|
-
}
|
|
53
|
+
```js file="./examples/PrimaryDetail/PrimaryDetailDataListInCard.tsx" isFullscreen
|
|
1026
54
|
```
|
|
1027
55
|
|
|
1028
56
|
### Primary-detail inline modifier
|