@patternfly/react-core 6.3.0-prerelease.10 → 6.3.0-prerelease.11

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 (139) hide show
  1. package/CHANGELOG.md +4 -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/ClipboardCopy/package.json +1 -1
  21. package/dist/dynamic/components/CodeBlock/package.json +1 -1
  22. package/dist/dynamic/components/Content/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/Drawer/package.json +1 -1
  28. package/dist/dynamic/components/Dropdown/package.json +1 -1
  29. package/dist/dynamic/components/DualListSelector/package.json +1 -1
  30. package/dist/dynamic/components/EmptyState/package.json +1 -1
  31. package/dist/dynamic/components/ExpandableSection/package.json +1 -1
  32. package/dist/dynamic/components/FileUpload/package.json +1 -1
  33. package/dist/dynamic/components/Form/package.json +1 -1
  34. package/dist/dynamic/components/FormSelect/package.json +1 -1
  35. package/dist/dynamic/components/HelperText/package.json +1 -1
  36. package/dist/dynamic/components/Hint/package.json +1 -1
  37. package/dist/dynamic/components/Icon/package.json +1 -1
  38. package/dist/dynamic/components/InputGroup/package.json +1 -1
  39. package/dist/dynamic/components/JumpLinks/package.json +1 -1
  40. package/dist/dynamic/components/Label/package.json +1 -1
  41. package/dist/dynamic/components/List/package.json +1 -1
  42. package/dist/dynamic/components/LoginPage/package.json +1 -1
  43. package/dist/dynamic/components/Masthead/package.json +1 -1
  44. package/dist/dynamic/components/Menu/package.json +1 -1
  45. package/dist/dynamic/components/MenuToggle/package.json +1 -1
  46. package/dist/dynamic/components/Modal/package.json +1 -1
  47. package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
  48. package/dist/dynamic/components/Nav/package.json +1 -1
  49. package/dist/dynamic/components/NotificationBadge/package.json +1 -1
  50. package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
  51. package/dist/dynamic/components/NumberInput/package.json +1 -1
  52. package/dist/dynamic/components/OverflowMenu/package.json +1 -1
  53. package/dist/dynamic/components/Page/package.json +1 -1
  54. package/dist/dynamic/components/Pagination/package.json +1 -1
  55. package/dist/dynamic/components/Panel/package.json +1 -1
  56. package/dist/dynamic/components/Popover/package.json +1 -1
  57. package/dist/dynamic/components/Progress/package.json +1 -1
  58. package/dist/dynamic/components/ProgressStepper/package.json +1 -1
  59. package/dist/dynamic/components/Radio/package.json +1 -1
  60. package/dist/dynamic/components/SearchInput/package.json +1 -1
  61. package/dist/dynamic/components/Select/package.json +1 -1
  62. package/dist/dynamic/components/Sidebar/package.json +1 -1
  63. package/dist/dynamic/components/SimpleList/package.json +1 -1
  64. package/dist/dynamic/components/Skeleton/package.json +1 -1
  65. package/dist/dynamic/components/SkipToContent/package.json +1 -1
  66. package/dist/dynamic/components/Slider/package.json +1 -1
  67. package/dist/dynamic/components/Spinner/package.json +1 -1
  68. package/dist/dynamic/components/Switch/package.json +1 -1
  69. package/dist/dynamic/components/Tabs/package.json +1 -1
  70. package/dist/dynamic/components/TextArea/package.json +1 -1
  71. package/dist/dynamic/components/TextInput/package.json +1 -1
  72. package/dist/dynamic/components/TextInputGroup/package.json +1 -1
  73. package/dist/dynamic/components/TimePicker/package.json +1 -1
  74. package/dist/dynamic/components/Timestamp/package.json +1 -1
  75. package/dist/dynamic/components/Title/package.json +1 -1
  76. package/dist/dynamic/components/ToggleGroup/package.json +1 -1
  77. package/dist/dynamic/components/Toolbar/package.json +1 -1
  78. package/dist/dynamic/components/Tooltip/package.json +1 -1
  79. package/dist/dynamic/components/TreeView/package.json +1 -1
  80. package/dist/dynamic/components/Truncate/package.json +1 -1
  81. package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
  82. package/dist/dynamic/components/Wizard/package.json +1 -1
  83. package/dist/dynamic/deprecated/components/Chip/package.json +1 -1
  84. package/dist/dynamic/deprecated/components/DragDrop/package.json +1 -1
  85. package/dist/dynamic/deprecated/components/DualListSelector/package.json +1 -1
  86. package/dist/dynamic/deprecated/components/Modal/package.json +1 -1
  87. package/dist/dynamic/deprecated/components/Tile/package.json +1 -1
  88. package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
  89. package/dist/dynamic/deprecated/components/package.json +1 -1
  90. package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
  91. package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
  92. package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
  93. package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
  94. package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
  95. package/dist/dynamic/helpers/constants/package.json +1 -1
  96. package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
  97. package/dist/dynamic/helpers/fileUtils/package.json +1 -1
  98. package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
  99. package/dist/dynamic/helpers/package.json +1 -1
  100. package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
  101. package/dist/dynamic/helpers/typeUtils/package.json +1 -1
  102. package/dist/dynamic/helpers/useInterval/package.json +1 -1
  103. package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
  104. package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
  105. package/dist/dynamic/helpers/util/package.json +1 -1
  106. package/dist/dynamic/layouts/Bullseye/package.json +1 -1
  107. package/dist/dynamic/layouts/Flex/package.json +1 -1
  108. package/dist/dynamic/layouts/Gallery/package.json +1 -1
  109. package/dist/dynamic/layouts/Grid/package.json +1 -1
  110. package/dist/dynamic/layouts/Level/package.json +1 -1
  111. package/dist/dynamic/layouts/Split/package.json +1 -1
  112. package/dist/dynamic/layouts/Stack/package.json +1 -1
  113. package/dist/dynamic/styles/package.json +1 -1
  114. package/dist/esm/demos/sampleData.d.ts.map +1 -1
  115. package/dist/esm/demos/sampleData.js +225 -226
  116. package/dist/esm/demos/sampleData.js.map +1 -1
  117. package/dist/esm/demos/sampleDataRTL.d.ts +7 -0
  118. package/dist/esm/demos/sampleDataRTL.d.ts.map +1 -0
  119. package/dist/esm/demos/sampleDataRTL.js +128 -0
  120. package/dist/esm/demos/sampleDataRTL.js.map +1 -0
  121. package/dist/js/demos/sampleData.d.ts.map +1 -1
  122. package/dist/js/demos/sampleData.js +225 -226
  123. package/dist/js/demos/sampleData.js.map +1 -1
  124. package/dist/js/demos/sampleDataRTL.d.ts +7 -0
  125. package/dist/js/demos/sampleDataRTL.d.ts.map +1 -0
  126. package/dist/js/demos/sampleDataRTL.js +131 -0
  127. package/dist/js/demos/sampleDataRTL.js.map +1 -0
  128. package/dist/umd/assets/{output-CuGIDyMV.css → output-6ExHwErv.css} +20435 -20435
  129. package/helpers/package.json +1 -1
  130. package/layouts/package.json +1 -1
  131. package/next/package.json +1 -1
  132. package/package.json +2 -2
  133. package/src/components/Timestamp/examples/TimestampBasicFormats.tsx +1 -1
  134. package/src/components/Timestamp/examples/TimestampDefaultTooltip.tsx +1 -1
  135. package/src/demos/RTL/RTL.md +1 -0
  136. package/src/demos/RTL/examples/PaginatedTable.tsx +16 -44
  137. package/src/demos/sampleData.tsx +225 -227
  138. package/src/demos/sampleDataRTL.tsx +133 -0
  139. package/src/demos/RTL/examples/PaginatedTable.jsx +0 -504
@@ -0,0 +1,133 @@
1
+ export interface SampleRowData {
2
+ status: string;
3
+ location: string;
4
+ lastModified: string;
5
+ }
6
+
7
+ export const rows: SampleRowData[] = [
8
+ {
9
+ status: 'running',
10
+ location: 'raleigh',
11
+ lastModified: 'oneHr'
12
+ },
13
+ {
14
+ status: 'stopped',
15
+ location: 'boston',
16
+ lastModified: 'threeHrs'
17
+ },
18
+ {
19
+ status: 'down',
20
+ location: 'atlanta',
21
+ lastModified: 'fiveHrs'
22
+ },
23
+ {
24
+ status: 'needsMaintenance',
25
+ location: 'sanFrancisco',
26
+ lastModified: 'sevenMins'
27
+ },
28
+ {
29
+ status: 'running',
30
+ location: 'raleigh',
31
+ lastModified: 'fortyTwoMins'
32
+ },
33
+ {
34
+ status: 'stopped',
35
+ location: 'boston',
36
+ lastModified: 'twoDays'
37
+ },
38
+ {
39
+ status: 'down',
40
+ location: 'atlanta',
41
+ lastModified: 'oneMonth'
42
+ },
43
+ {
44
+ status: 'needsMaintenance',
45
+ location: 'sanFrancisco',
46
+ lastModified: 'oneHr'
47
+ },
48
+ {
49
+ status: 'running',
50
+ location: 'raleigh',
51
+ lastModified: 'threeHrs'
52
+ },
53
+ {
54
+ status: 'stopped',
55
+ location: 'boston',
56
+ lastModified: 'fiveHrs'
57
+ },
58
+ {
59
+ status: 'down',
60
+ location: 'atlanta',
61
+ lastModified: 'sevenMins'
62
+ },
63
+ {
64
+ status: 'needsMaintenance',
65
+ location: 'sanFrancisco',
66
+ lastModified: 'fortyTwoMins'
67
+ },
68
+ {
69
+ status: 'running',
70
+ location: 'raleigh',
71
+ lastModified: 'twoDays'
72
+ },
73
+ {
74
+ status: 'stopped',
75
+ location: 'boston',
76
+ lastModified: 'oneMonth'
77
+ },
78
+ {
79
+ status: 'down',
80
+ location: 'atlanta',
81
+ lastModified: 'oneHr'
82
+ },
83
+ {
84
+ status: 'needsMaintenance',
85
+ location: 'sanFrancisco',
86
+ lastModified: 'threeHrs'
87
+ },
88
+ {
89
+ status: 'running',
90
+ location: 'raleigh',
91
+ lastModified: 'fiveHrs'
92
+ },
93
+ {
94
+ status: 'stopped',
95
+ location: 'boston',
96
+ lastModified: 'sevenMins'
97
+ },
98
+ {
99
+ status: 'down',
100
+ location: 'atlanta',
101
+ lastModified: 'fortyTwoMins'
102
+ },
103
+ {
104
+ status: 'needsMaintenance',
105
+ location: 'sanFrancisco',
106
+ lastModified: 'twoDays'
107
+ },
108
+ {
109
+ status: 'running',
110
+ location: 'raleigh',
111
+ lastModified: 'oneMonth'
112
+ },
113
+ {
114
+ status: 'stopped',
115
+ location: 'boston',
116
+ lastModified: 'oneHr'
117
+ },
118
+ {
119
+ status: 'down',
120
+ location: 'atlanta',
121
+ lastModified: 'threeHrs'
122
+ },
123
+ {
124
+ status: 'needsMaintenance',
125
+ location: 'sanFrancisco',
126
+ lastModified: 'fiveHrs'
127
+ },
128
+ {
129
+ status: 'running',
130
+ location: 'raleigh',
131
+ lastModified: 'sevenMins'
132
+ }
133
+ ];
@@ -1,504 +0,0 @@
1
- import { Fragment, useEffect, useState } from 'react';
2
- import {
3
- Avatar,
4
- Brand,
5
- Breadcrumb,
6
- BreadcrumbItem,
7
- Button,
8
- ButtonVariant,
9
- Card,
10
- Content,
11
- Divider,
12
- Dropdown,
13
- DropdownGroup,
14
- DropdownItem,
15
- DropdownList,
16
- Icon,
17
- Label,
18
- Masthead,
19
- MastheadMain,
20
- MastheadLogo,
21
- MastheadContent,
22
- MastheadBrand,
23
- MastheadToggle,
24
- MenuToggle,
25
- Nav,
26
- NavItem,
27
- NavList,
28
- Page,
29
- PageBreadcrumb,
30
- PageSection,
31
- PageSidebar,
32
- PageSidebarBody,
33
- PageToggleButton,
34
- Pagination,
35
- PaginationVariant,
36
- Toolbar,
37
- ToolbarContent,
38
- ToolbarGroup,
39
- ToolbarItem,
40
- Truncate
41
- } from '@patternfly/react-core';
42
-
43
- import { Table, Thead, Tr, Th, Tbody, Td } from '@patternfly/react-table';
44
- import translationsEn from './examples/translations.en.json';
45
- import translationsHe from './examples/translations.he.json';
46
- import AlignRightIcon from '@patternfly/react-icons/dist/esm/icons/align-right-icon';
47
- import ToolsIcon from '@patternfly/react-icons/dist/esm/icons/tools-icon';
48
- import ClockIcon from '@patternfly/react-icons/dist/esm/icons/clock-icon';
49
- import WalkingIcon from '@patternfly/react-icons/dist/esm/icons/walking-icon';
50
- import pfLogo from '@patternfly/react-core/src/demos/assets/PF-HorizontalLogo-Color.svg';
51
- import BarsIcon from '@patternfly/react-icons/dist/esm/icons/bars-icon';
52
- import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon';
53
- import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';
54
- import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
55
- import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
56
- import HandPaperIcon from '@patternfly/react-icons/dist/esm/icons/hand-paper-icon';
57
- import imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';
58
-
59
- export const PaginatedTableAction = () => {
60
- const [translation, setTranslation] = useState(translationsEn);
61
- const [page, setPage] = useState(1);
62
- const [perPage, setPerPage] = useState(10);
63
-
64
- const columns = [
65
- translation.table.columns.servers,
66
- translation.table.columns.status,
67
- translation.table.columns.location,
68
- translation.table.columns.modified,
69
- translation.table.columns.url
70
- ];
71
-
72
- const numRows = 25;
73
- const getRandomInteger = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
74
- const createRows = () => {
75
- const rows = [];
76
- for (let i = 0; i < numRows; i++) {
77
- const num = i + 1;
78
- const rowObj = {
79
- name: translation.table.rows.node + num,
80
- status: [
81
- translation.table.rows.status.stopped,
82
- translation.table.rows.status.running,
83
- translation.table.rows.status.down,
84
- translation.table.rows.status.needsMaintenance
85
- ][getRandomInteger(0, 3)],
86
- location: [
87
- translation.table.rows.locations.raleigh,
88
- translation.table.rows.locations.boston,
89
- translation.table.rows.locations.atlanta,
90
- translation.table.rows.locations.sanFrancisco
91
- ][getRandomInteger(0, 3)],
92
- lastModified: [
93
- translation.table.rows.lastModified.oneHr,
94
- translation.table.rows.lastModified.threeHrs,
95
- translation.table.rows.lastModified.fiveHrs,
96
- translation.table.rows.lastModified.sevenMins,
97
- translation.table.rows.lastModified.fortyTwoMins,
98
- translation.table.rows.lastModified.twoDays,
99
- translation.table.rows.lastModified.oneMonth
100
- ][getRandomInteger(0, 6)],
101
- url: 'http://www.redhat.com/en/office-locations/node' + num
102
- };
103
- rows.push(rowObj);
104
- }
105
-
106
- return rows;
107
- };
108
-
109
- const rows = createRows();
110
- const [managedRows, setManagedRows] = useState(rows);
111
- const [paginatedRows, setPaginatedRows] = useState(rows.slice(0, 10));
112
- const [isDirRTL, setIsDirRTL] = useState(false);
113
-
114
- const capitalize = (input) => input[0].toUpperCase() + input.substring(1);
115
-
116
- const switchTranslation = () => {
117
- setIsDirRTL((prevIsDirRTL) => !prevIsDirRTL);
118
- setTranslation((prevTranslation) => (prevTranslation === translationsEn ? translationsHe : translationsEn));
119
- };
120
-
121
- useEffect(() => {
122
- const newRows = createRows();
123
- setManagedRows(newRows);
124
- setPaginatedRows(newRows.slice((page - 1) * perPage, page * perPage));
125
- }, [translation]);
126
-
127
- useEffect(() => {
128
- const html = document.querySelector('html');
129
- html.dir = isDirRTL ? 'rtl' : 'ltr';
130
- }, [isDirRTL]);
131
-
132
- // Pagination logic
133
-
134
- const handleSetPage = (_evt, newPage, _perPage, startIdx, endIdx) => {
135
- setPaginatedRows(managedRows.slice(startIdx, endIdx));
136
- setPage(newPage);
137
- };
138
-
139
- const handlePerPageSelect = (_evt, newPerPage, _newPage, startIdx, endIdx) => {
140
- setPaginatedRows(managedRows.slice(startIdx, endIdx));
141
- setPerPage(newPerPage);
142
- };
143
-
144
- const renderPagination = (variant) => {
145
- const { pagination } = translation;
146
-
147
- return (
148
- <Pagination
149
- itemCount={managedRows.length}
150
- page={page}
151
- perPage={perPage}
152
- onSetPage={handleSetPage}
153
- onPerPageSelect={handlePerPageSelect}
154
- variant={variant}
155
- titles={{
156
- paginationAriaLabel: pagination?.[`${variant}VariantAriaLabel`] || `${variant} pagination`,
157
- ofWord: pagination?.ofWord,
158
- items: pagination?.items,
159
- perPageSuffix: pagination?.perPageSuffix,
160
- toNextPageAriaLabel: pagination?.toNextPageAriaLabel,
161
- toPreviousPageAriaLabel: pagination?.toPreviousPageAriaLabel,
162
- toFirstPageAriaLabel: pagination?.toFirstPageAriaLabel,
163
- toLastPageAriaLabel: pagination?.perPageSuffix,
164
- currPageAriaLabel: pagination?.currPageAriaLabel
165
- }}
166
- />
167
- );
168
- };
169
-
170
- const breadcrumbItems = {
171
- home: {
172
- url: '#home'
173
- },
174
- category: {
175
- url: '#category'
176
- },
177
- subCategory: {
178
- url: 'sub-category'
179
- }
180
- };
181
-
182
- const renderLabel = (labelText) => {
183
- switch (labelText) {
184
- case 'Running':
185
- case 'רץ':
186
- return (
187
- <Label
188
- color="green"
189
- icon={
190
- <Icon shouldMirrorRTL>
191
- <WalkingIcon />
192
- </Icon>
193
- }
194
- >
195
- {translation.table.rows.status.running}
196
- </Label>
197
- );
198
- case 'Stopped':
199
- case 'עצר':
200
- return (
201
- <Label
202
- icon={
203
- <Icon shouldMirrorRTL>
204
- <HandPaperIcon />
205
- </Icon>
206
- }
207
- color="red"
208
- >
209
- {translation.table.rows.status.stopped}
210
- </Label>
211
- );
212
- case 'Needs maintenance':
213
- case 'זקוק לתחזוקה':
214
- return (
215
- <Label icon={<ToolsIcon />} color="blue">
216
- {translation.table.rows.status.needsMaintenance}
217
- </Label>
218
- );
219
- case 'Down':
220
- case 'מטה':
221
- return (
222
- <Label icon={<ClockIcon />} color="orange">
223
- {translation.table.rows.status.down}
224
- </Label>
225
- );
226
- }
227
- };
228
-
229
- const toolbarItems = (
230
- <Fragment>
231
- <Toolbar id="rtl-paginated-table">
232
- <ToolbarContent>
233
- <ToolbarItem>
234
- <Button
235
- variant="primary"
236
- icon={
237
- <Icon shouldMirrorRTL>
238
- <AlignRightIcon />
239
- </Icon>
240
- }
241
- iconPosition="end"
242
- onClick={switchTranslation}
243
- >
244
- {translation.switchBtn}
245
- </Button>
246
- </ToolbarItem>
247
- <ToolbarItem variant="pagination">{renderPagination(PaginationVariant.top)}</ToolbarItem>
248
- </ToolbarContent>
249
- </Toolbar>
250
- </Fragment>
251
- );
252
-
253
- const pageNav = (
254
- <Nav aria-label={translation.nav.ariaLabel || undefined}>
255
- <NavList>
256
- <NavItem itemId={0} isActive to="#system-panel">
257
- {translation.nav.systemPanel}
258
- </NavItem>
259
- <NavItem itemId={1} to="#policy">
260
- {translation.nav.policy}
261
- </NavItem>
262
- <NavItem itemId={2} to="#auth">
263
- {translation.nav.authentication}
264
- </NavItem>
265
- <NavItem itemId={3} to="#network">
266
- {translation.nav.networkServices}
267
- </NavItem>
268
- <NavItem itemId={4} to="#server">
269
- {translation.nav.server}
270
- </NavItem>
271
- </NavList>
272
- </Nav>
273
- );
274
-
275
- const sidebar = (
276
- <PageSidebar>
277
- <PageSidebarBody>{pageNav}</PageSidebarBody>
278
- </PageSidebar>
279
- );
280
-
281
- const [isDropdownOpen, setIsDropdownOpen] = useState(false);
282
- const [isKebabDropdownOpen, setIsKebabDropdownOpen] = useState(false);
283
- const [isFullKebabDropdownOpen, setIsFullKebabDropdownOpen] = useState(false);
284
-
285
- const kebabDropdownItems = (
286
- <>
287
- <DropdownItem icon={<CogIcon />}>{translation.kebabDropdown.settings}</DropdownItem>
288
- <DropdownItem icon={<HelpIcon />}>{translation.kebabDropdown.help}</DropdownItem>
289
- </>
290
- );
291
-
292
- const userDropdownItems = (
293
- <>
294
- <DropdownItem key="group 2 profile">{translation.userDropdown.myProfile}</DropdownItem>
295
- <DropdownItem key="group 2 user">{translation.userDropdown.userManagement}</DropdownItem>
296
- <DropdownItem key="group 2 logout">{translation.userDropdown.logout}</DropdownItem>
297
- </>
298
- );
299
-
300
- const onDropdownToggle = () => {
301
- setIsDropdownOpen(!isDropdownOpen);
302
- };
303
-
304
- const onDropdownSelect = () => {
305
- setIsDropdownOpen(false);
306
- };
307
-
308
- const onKebabDropdownToggle = () => {
309
- setIsKebabDropdownOpen(!isKebabDropdownOpen);
310
- };
311
-
312
- const onKebabDropdownSelect = () => {
313
- setIsKebabDropdownOpen(false);
314
- };
315
-
316
- const onFullKebabToggle = () => {
317
- setIsFullKebabDropdownOpen(!isFullKebabDropdownOpen);
318
- };
319
-
320
- const onFullKebabSelect = () => {
321
- setIsFullKebabDropdownOpen(false);
322
- };
323
-
324
- const masthead = (
325
- <Masthead>
326
- <MastheadMain>
327
- <MastheadToggle>
328
- <PageToggleButton variant="plain" aria-label={translation.mastheadToggleAriaLabel}>
329
- <BarsIcon />
330
- </PageToggleButton>
331
- </MastheadToggle>
332
- <MastheadBrand>
333
- <MastheadLogo dir="ltr">
334
- <Brand src={pfLogo} alt="PatternFly" heights={{ default: '36px' }} />
335
- {translation.brandLanguage && <span className="brand-language">{translation.brandLanguage}</span>}
336
- </MastheadLogo>
337
- </MastheadBrand>
338
- </MastheadMain>
339
- <MastheadContent>
340
- <Toolbar id="toolbar" isStatic>
341
- <ToolbarContent>
342
- <ToolbarGroup
343
- variant="action-group-plain"
344
- align={{ default: 'alignEnd' }}
345
- gap={{ default: 'gapNone', md: 'gapMd' }}
346
- >
347
- <ToolbarGroup variant="action-group-plain" visibility={{ default: 'hidden', lg: 'visible' }}>
348
- <ToolbarItem>
349
- <Button
350
- aria-label={translation.kebabDropdown.settings}
351
- variant={ButtonVariant.plain}
352
- icon={<CogIcon />}
353
- />
354
- </ToolbarItem>
355
- <ToolbarItem>
356
- <Button
357
- aria-label={translation.kebabDropdown.help}
358
- variant={ButtonVariant.plain}
359
- icon={<QuestionCircleIcon />}
360
- />
361
- </ToolbarItem>
362
- </ToolbarGroup>
363
- <ToolbarItem visibility={{ default: 'hidden', md: 'visible', lg: 'hidden' }}>
364
- <Dropdown
365
- isOpen={isKebabDropdownOpen}
366
- onSelect={onKebabDropdownSelect}
367
- onOpenChange={setIsKebabDropdownOpen}
368
- popperProps={{ position: 'right' }}
369
- toggle={(toggleRef) => (
370
- <MenuToggle
371
- ref={toggleRef}
372
- isExpanded={isKebabDropdownOpen}
373
- onClick={onKebabDropdownToggle}
374
- variant="plain"
375
- aria-label={translation.kebabDropdown.settingsAndHelp}
376
- icon={<EllipsisVIcon />}
377
- />
378
- )}
379
- >
380
- <DropdownList>{kebabDropdownItems}</DropdownList>
381
- </Dropdown>
382
- </ToolbarItem>
383
- <ToolbarItem visibility={{ md: 'hidden' }}>
384
- <Dropdown
385
- isOpen={isFullKebabDropdownOpen}
386
- onSelect={onFullKebabSelect}
387
- onOpenChange={setIsFullKebabDropdownOpen}
388
- popperProps={{ position: 'right' }}
389
- toggle={(toggleRef) => (
390
- <MenuToggle
391
- ref={toggleRef}
392
- isExpanded={isFullKebabDropdownOpen}
393
- onClick={onFullKebabToggle}
394
- variant="plain"
395
- aria-label={translation.kebabAndUserDropdown.toolbarMenuAriaLabel}
396
- icon={<EllipsisVIcon />}
397
- />
398
- )}
399
- >
400
- <DropdownGroup key="group 2" aria-label={translation.kebabAndUserDropdown.groupAriaLabel}>
401
- <DropdownList>{userDropdownItems}</DropdownList>
402
- </DropdownGroup>
403
- <Divider />
404
- <DropdownList>{kebabDropdownItems}</DropdownList>
405
- </Dropdown>
406
- </ToolbarItem>
407
- </ToolbarGroup>
408
- <ToolbarItem visibility={{ default: 'hidden', md: 'visible' }}>
409
- <Dropdown
410
- isOpen={isDropdownOpen}
411
- onSelect={onDropdownSelect}
412
- onOpenChange={setIsDropdownOpen}
413
- popperProps={{ position: 'right' }}
414
- toggle={(toggleRef) => (
415
- <MenuToggle
416
- ref={toggleRef}
417
- isExpanded={isDropdownOpen}
418
- onClick={onDropdownToggle}
419
- icon={<Avatar src={imgAvatar} alt="" size="sm" />}
420
- >
421
- {translation.username}
422
- </MenuToggle>
423
- )}
424
- >
425
- <DropdownList>{userDropdownItems}</DropdownList>
426
- </Dropdown>
427
- </ToolbarItem>
428
- </ToolbarContent>
429
- </Toolbar>
430
- </MastheadContent>
431
- </Masthead>
432
- );
433
-
434
- return (
435
- <Fragment>
436
- <Page sidebar={sidebar} masthead={masthead} isManagedSidebar>
437
- <PageBreadcrumb>
438
- <Breadcrumb aria-label={translation.breadcrumbs.ariaLabel || undefined}>
439
- {Object.keys(breadcrumbItems).map((key, idx, arr) => (
440
- <BreadcrumbItem key={idx} isActive={arr.length - 1 === idx} to={`${breadcrumbItems[key].url}`}>
441
- {translation.breadcrumbs[key]}
442
- {breadcrumbItems.length}
443
- </BreadcrumbItem>
444
- ))}
445
- </Breadcrumb>
446
- </PageBreadcrumb>
447
- <PageSection variant="light" aria-labelledby='main-title' >
448
- <Content>
449
- <h1 id='main-title'>{translation.title}</h1>
450
- <p>{translation.body}</p>
451
- </Content>
452
- </PageSection>
453
- <PageSection>
454
- <Card>
455
- {toolbarItems}
456
- <Table variant="compact" aria-label={translation.table.ariaLabel}>
457
- <Thead>
458
- <Tr>
459
- {columns.map((column, columnIndex) => (
460
- <Th key={columnIndex}>{column}</Th>
461
- ))}
462
- </Tr>
463
- </Thead>
464
- <Tbody>
465
- {paginatedRows.map((row, rowIndex) => (
466
- <Tr key={rowIndex}>
467
- <>
468
- {Object.entries(row).map(([key, value]) => {
469
- if (key === 'status') {
470
- return (
471
- <Td key={key} width={15} dataLabel="Status">
472
- {renderLabel(value)}
473
- </Td>
474
- );
475
- } else if (key === 'url') {
476
- return (
477
- // Passing dir="rtl" forces truncation at the start of the URL,
478
- // resulting in the unique portion being visible regardless of language
479
- <Td key={key} dataLabel="URL" width={15}>
480
- <a href="#">
481
- <Truncate content={row.url} position={isDirRTL ? 'end' : 'start'} />
482
- </a>
483
- </Td>
484
- );
485
- } else {
486
- return (
487
- <Td key={key} dataLabel={key === 'lastModified' ? 'Last modified' : capitalize(key)}>
488
- {value}
489
- </Td>
490
- );
491
- }
492
- })}
493
- </>
494
- </Tr>
495
- ))}
496
- </Tbody>
497
- </Table>
498
- {renderPagination(PaginationVariant.bottom)}
499
- </Card>
500
- </PageSection>
501
- </Page>
502
- </Fragment>
503
- );
504
- };