@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.
Files changed (145) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/components/package.json +1 -1
  3. package/deprecated/package.json +1 -1
  4. package/dist/dynamic/components/AboutModal/package.json +1 -1
  5. package/dist/dynamic/components/Accordion/package.json +1 -1
  6. package/dist/dynamic/components/ActionList/package.json +1 -1
  7. package/dist/dynamic/components/Alert/package.json +1 -1
  8. package/dist/dynamic/components/Avatar/package.json +1 -1
  9. package/dist/dynamic/components/BackToTop/package.json +1 -1
  10. package/dist/dynamic/components/Backdrop/package.json +1 -1
  11. package/dist/dynamic/components/BackgroundImage/package.json +1 -1
  12. package/dist/dynamic/components/Badge/package.json +1 -1
  13. package/dist/dynamic/components/Banner/package.json +1 -1
  14. package/dist/dynamic/components/Brand/package.json +1 -1
  15. package/dist/dynamic/components/Breadcrumb/package.json +1 -1
  16. package/dist/dynamic/components/Button/package.json +1 -1
  17. package/dist/dynamic/components/CalendarMonth/package.json +1 -1
  18. package/dist/dynamic/components/Card/package.json +1 -1
  19. package/dist/dynamic/components/Checkbox/package.json +1 -1
  20. package/dist/dynamic/components/Chip/package.json +1 -1
  21. package/dist/dynamic/components/ClipboardCopy/package.json +1 -1
  22. package/dist/dynamic/components/CodeBlock/package.json +1 -1
  23. package/dist/dynamic/components/DataList/package.json +1 -1
  24. package/dist/dynamic/components/DatePicker/package.json +1 -1
  25. package/dist/dynamic/components/DescriptionList/package.json +1 -1
  26. package/dist/dynamic/components/Divider/package.json +1 -1
  27. package/dist/dynamic/components/DragDrop/package.json +1 -1
  28. package/dist/dynamic/components/Drawer/package.json +1 -1
  29. package/dist/dynamic/components/Dropdown/package.json +1 -1
  30. package/dist/dynamic/components/DualListSelector/package.json +1 -1
  31. package/dist/dynamic/components/EmptyState/package.json +1 -1
  32. package/dist/dynamic/components/ExpandableSection/package.json +1 -1
  33. package/dist/dynamic/components/FileUpload/package.json +1 -1
  34. package/dist/dynamic/components/Form/package.json +1 -1
  35. package/dist/dynamic/components/FormSelect/package.json +1 -1
  36. package/dist/dynamic/components/HelperText/package.json +1 -1
  37. package/dist/dynamic/components/Hint/package.json +1 -1
  38. package/dist/dynamic/components/Icon/package.json +1 -1
  39. package/dist/dynamic/components/InputGroup/package.json +1 -1
  40. package/dist/dynamic/components/JumpLinks/package.json +1 -1
  41. package/dist/dynamic/components/Label/package.json +1 -1
  42. package/dist/dynamic/components/List/package.json +1 -1
  43. package/dist/dynamic/components/LoginPage/package.json +1 -1
  44. package/dist/dynamic/components/Masthead/package.json +1 -1
  45. package/dist/dynamic/components/Menu/package.json +1 -1
  46. package/dist/dynamic/components/MenuToggle/package.json +1 -1
  47. package/dist/dynamic/components/Modal/package.json +1 -1
  48. package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
  49. package/dist/dynamic/components/Nav/package.json +1 -1
  50. package/dist/dynamic/components/NotificationBadge/package.json +1 -1
  51. package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
  52. package/dist/dynamic/components/NumberInput/package.json +1 -1
  53. package/dist/dynamic/components/OverflowMenu/package.json +1 -1
  54. package/dist/dynamic/components/Page/package.json +1 -1
  55. package/dist/dynamic/components/Pagination/package.json +1 -1
  56. package/dist/dynamic/components/Panel/package.json +1 -1
  57. package/dist/dynamic/components/Popover/package.json +1 -1
  58. package/dist/dynamic/components/Progress/package.json +1 -1
  59. package/dist/dynamic/components/ProgressStepper/package.json +1 -1
  60. package/dist/dynamic/components/Radio/package.json +1 -1
  61. package/dist/dynamic/components/SearchInput/package.json +1 -1
  62. package/dist/dynamic/components/Select/package.json +1 -1
  63. package/dist/dynamic/components/Sidebar/package.json +1 -1
  64. package/dist/dynamic/components/SimpleList/package.json +1 -1
  65. package/dist/dynamic/components/Skeleton/package.json +1 -1
  66. package/dist/dynamic/components/SkipToContent/package.json +1 -1
  67. package/dist/dynamic/components/Slider/package.json +1 -1
  68. package/dist/dynamic/components/Spinner/package.json +1 -1
  69. package/dist/dynamic/components/Switch/package.json +1 -1
  70. package/dist/dynamic/components/Tabs/package.json +1 -1
  71. package/dist/dynamic/components/Text/package.json +1 -1
  72. package/dist/dynamic/components/TextArea/package.json +1 -1
  73. package/dist/dynamic/components/TextInput/package.json +1 -1
  74. package/dist/dynamic/components/TextInputGroup/package.json +1 -1
  75. package/dist/dynamic/components/Tile/package.json +1 -1
  76. package/dist/dynamic/components/TimePicker/package.json +1 -1
  77. package/dist/dynamic/components/Timestamp/package.json +1 -1
  78. package/dist/dynamic/components/Title/package.json +1 -1
  79. package/dist/dynamic/components/ToggleGroup/package.json +1 -1
  80. package/dist/dynamic/components/Toolbar/package.json +1 -1
  81. package/dist/dynamic/components/Tooltip/package.json +1 -1
  82. package/dist/dynamic/components/TreeView/package.json +1 -1
  83. package/dist/dynamic/components/Truncate/package.json +1 -1
  84. package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
  85. package/dist/dynamic/components/Wizard/package.json +1 -1
  86. package/dist/dynamic/deprecated/components/ApplicationLauncher/package.json +1 -1
  87. package/dist/dynamic/deprecated/components/ContextSelector/package.json +1 -1
  88. package/dist/dynamic/deprecated/components/Dropdown/package.json +1 -1
  89. package/dist/dynamic/deprecated/components/OptionsMenu/package.json +1 -1
  90. package/dist/dynamic/deprecated/components/PageHeader/package.json +1 -1
  91. package/dist/dynamic/deprecated/components/Select/package.json +1 -1
  92. package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
  93. package/dist/dynamic/deprecated/components/package.json +1 -1
  94. package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
  95. package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
  96. package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
  97. package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
  98. package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
  99. package/dist/dynamic/helpers/constants/package.json +1 -1
  100. package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
  101. package/dist/dynamic/helpers/favorites/package.json +1 -1
  102. package/dist/dynamic/helpers/fileUtils/package.json +1 -1
  103. package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
  104. package/dist/dynamic/helpers/package.json +1 -1
  105. package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
  106. package/dist/dynamic/helpers/typeUtils/package.json +1 -1
  107. package/dist/dynamic/helpers/useInterval/package.json +1 -1
  108. package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
  109. package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
  110. package/dist/dynamic/helpers/util/package.json +1 -1
  111. package/dist/dynamic/layouts/Bullseye/package.json +1 -1
  112. package/dist/dynamic/layouts/Flex/package.json +1 -1
  113. package/dist/dynamic/layouts/Gallery/package.json +1 -1
  114. package/dist/dynamic/layouts/Grid/package.json +1 -1
  115. package/dist/dynamic/layouts/Level/package.json +1 -1
  116. package/dist/dynamic/layouts/Split/package.json +1 -1
  117. package/dist/dynamic/layouts/Stack/package.json +1 -1
  118. package/dist/dynamic/next/components/package.json +1 -1
  119. package/helpers/package.json +1 -1
  120. package/layouts/package.json +1 -1
  121. package/next/package.json +1 -1
  122. package/package.json +2 -2
  123. package/src/components/Nav/examples/NavFlyout.tsx +1 -1
  124. package/src/components/Nav/examples/NavHorizontalSubNav.tsx +1 -1
  125. package/src/components/Nav/examples/NavLegacyTertiary.tsx +1 -1
  126. package/src/components/Pagination/examples/PaginationSticky.tsx +2 -2
  127. package/src/demos/Banner.md +4 -4
  128. package/src/demos/PrimaryDetail.md +3 -975
  129. package/src/demos/examples/BackToTop/BackToTopNameDemo.tsx +3 -3
  130. package/src/demos/examples/Masthead/MastheadWithUtilitiesAndUserDropdownMenu.tsx +2 -2
  131. package/src/demos/examples/Nav/NavDefault.tsx +1 -1
  132. package/src/demos/examples/Nav/NavExpandable.tsx +1 -1
  133. package/src/demos/examples/Nav/NavHorizontal.tsx +1 -1
  134. package/src/demos/examples/Nav/NavHorizontalWithSubnav.tsx +1 -1
  135. package/src/demos/examples/Nav/NavManual.tsx +1 -1
  136. package/src/demos/examples/Nav/NavWithSubnav.tsx +1 -1
  137. package/src/demos/examples/Nav/deprecated/NavLight.tsx +1 -1
  138. package/src/demos/examples/Nav/deprecated/NavTertiary.tsx +1 -1
  139. package/src/demos/examples/Page/PageStickySectionBreadcrumb.tsx +2 -2
  140. package/src/demos/examples/Page/PageStickySectionGroup.tsx +2 -2
  141. package/src/demos/examples/Page/PageStickySectionGroupAlternate.tsx +2 -2
  142. package/src/demos/examples/PrimaryDetail/PrimaryDetailCardView.tsx +659 -0
  143. package/src/demos/examples/PrimaryDetail/PrimaryDetailDataListInCard.tsx +207 -0
  144. package/src/demos/examples/PrimaryDetail/PrimaryDetailSimpleListInCard.tsx +116 -0
  145. 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