@patternfly/react-core 6.2.0-prerelease.1 → 6.2.0-prerelease.10
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 +48 -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/ClipboardCopy/package.json +1 -1
- package/dist/dynamic/components/CodeBlock/package.json +1 -1
- package/dist/dynamic/components/Content/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/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/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/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/Chip/package.json +1 -1
- package/dist/dynamic/deprecated/components/DragDrop/package.json +1 -1
- package/dist/dynamic/deprecated/components/DualListSelector/package.json +1 -1
- package/dist/dynamic/deprecated/components/Modal/package.json +1 -1
- package/dist/dynamic/deprecated/components/Tile/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/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/styles/package.json +1 -1
- package/dist/esm/components/ClipboardCopy/ClipboardCopy.d.ts +1 -1
- package/dist/esm/components/ClipboardCopy/ClipboardCopy.d.ts.map +1 -1
- package/dist/esm/components/ClipboardCopy/ClipboardCopy.js +4 -2
- package/dist/esm/components/ClipboardCopy/ClipboardCopy.js.map +1 -1
- package/dist/esm/components/TextArea/TextArea.d.ts +3 -2
- package/dist/esm/components/TextArea/TextArea.d.ts.map +1 -1
- package/dist/esm/components/TextArea/TextArea.js +5 -2
- package/dist/esm/components/TextArea/TextArea.js.map +1 -1
- package/dist/js/components/ClipboardCopy/ClipboardCopy.d.ts +1 -1
- package/dist/js/components/ClipboardCopy/ClipboardCopy.d.ts.map +1 -1
- package/dist/js/components/ClipboardCopy/ClipboardCopy.js +4 -2
- package/dist/js/components/ClipboardCopy/ClipboardCopy.js.map +1 -1
- package/dist/js/components/TextArea/TextArea.d.ts +3 -2
- package/dist/js/components/TextArea/TextArea.d.ts.map +1 -1
- package/dist/js/components/TextArea/TextArea.js +5 -2
- package/dist/js/components/TextArea/TextArea.js.map +1 -1
- package/dist/umd/assets/{output-BwnR4NQh.css → output-BTedH57W.css} +19022 -19022
- package/dist/umd/react-core.min.js +2 -2
- package/helpers/package.json +1 -1
- package/layouts/package.json +1 -1
- package/next/package.json +1 -1
- package/package.json +8 -8
- package/src/components/ClipboardCopy/ClipboardCopy.tsx +5 -3
- package/src/components/ClipboardCopy/__tests__/ClipboardCopy.test.tsx +15 -0
- package/src/components/ClipboardCopy/__tests__/__snapshots__/ClipboardCopy.test.tsx.snap +1 -1
- package/src/components/TextArea/TextArea.tsx +8 -7
- package/src/components/TextArea/__tests__/TextArea.test.tsx +18 -0
- package/src/components/TextArea/examples/TextArea.md +6 -0
- package/src/components/TextArea/examples/TextAreaResizableNone.tsx +14 -0
- package/src/components/Toolbar/examples/Toolbar.md +8 -8
- package/src/components/TreeView/examples/TreeView.md +7 -1
- package/src/components/TreeView/examples/TreeViewWithIconPerItem.tsx +64 -0
- package/src/demos/DataList/examples/DataListActionable.tsx +134 -0
- package/src/demos/DataListDemo.md +5 -0
- package/src/demos/DescriptionList/DescriptionList.md +7 -1
- package/src/demos/DescriptionList/examples/DescriptionListInDrawer.tsx +162 -0
- package/src/demos/Skeleton.md +13 -0
- package/src/demos/examples/Skeleton/SkeletonCard.tsx +40 -0
- package/src/components/DataList/examples/DataListDraggable.tsx +0 -108
- package/src/components/DualListSelector/examples/DualListSelectorDragDrop.tsx +0 -177
package/helpers/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"6.2.0-prerelease.
|
|
1
|
+
{"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"6.2.0-prerelease.9","private":true}
|
package/layouts/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"6.2.0-prerelease.
|
|
1
|
+
{"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"6.2.0-prerelease.9","private":true}
|
package/next/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"6.2.0-prerelease.
|
|
1
|
+
{"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"6.2.0-prerelease.9","private":true}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@patternfly/react-core",
|
|
3
|
-
"version": "6.2.0-prerelease.
|
|
3
|
+
"version": "6.2.0-prerelease.10",
|
|
4
4
|
"description": "This library provides a set of common React components for use with the PatternFly reference implementation.",
|
|
5
5
|
"main": "dist/js/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -46,22 +46,22 @@
|
|
|
46
46
|
"subpaths": "node ../../scripts/exportSubpaths.mjs --config subpaths.config.json"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@patternfly/react-icons": "^6.2.0-prerelease.
|
|
50
|
-
"@patternfly/react-styles": "^6.2.0-prerelease.
|
|
51
|
-
"@patternfly/react-tokens": "^6.2.0-prerelease.
|
|
52
|
-
"focus-trap": "7.6.
|
|
49
|
+
"@patternfly/react-icons": "^6.2.0-prerelease.2",
|
|
50
|
+
"@patternfly/react-styles": "^6.2.0-prerelease.2",
|
|
51
|
+
"@patternfly/react-tokens": "^6.2.0-prerelease.2",
|
|
52
|
+
"focus-trap": "7.6.4",
|
|
53
53
|
"react-dropzone": "^14.3.5",
|
|
54
54
|
"tslib": "^2.8.1"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
|
-
"@patternfly/patternfly": "6.1.0
|
|
57
|
+
"@patternfly/patternfly": "6.1.0",
|
|
58
58
|
"case-anything": "^2.1.13",
|
|
59
59
|
"css": "^3.0.0",
|
|
60
|
-
"fs-extra": "^11.
|
|
60
|
+
"fs-extra": "^11.3.0"
|
|
61
61
|
},
|
|
62
62
|
"peerDependencies": {
|
|
63
63
|
"react": "^17 || ^18",
|
|
64
64
|
"react-dom": "^17 || ^18"
|
|
65
65
|
},
|
|
66
|
-
"gitHead": "
|
|
66
|
+
"gitHead": "d42afe0415af6981593e28bbecfb4d1ac620c54f"
|
|
67
67
|
}
|
|
@@ -89,7 +89,7 @@ export interface ClipboardCopyProps extends Omit<React.HTMLProps<HTMLDivElement>
|
|
|
89
89
|
/** A function that is triggered on changing the text. */
|
|
90
90
|
onChange?: (event: React.FormEvent, text?: string) => void;
|
|
91
91
|
/** The text which is copied. */
|
|
92
|
-
children: string;
|
|
92
|
+
children: string | string[];
|
|
93
93
|
/** Additional actions for inline clipboard copy. Should be wrapped with ClipboardCopyAction. */
|
|
94
94
|
additionalActions?: React.ReactNode;
|
|
95
95
|
/** Value to overwrite the randomly generated data-ouia-component-id.*/
|
|
@@ -103,7 +103,7 @@ class ClipboardCopy extends React.Component<ClipboardCopyProps, ClipboardCopySta
|
|
|
103
103
|
timer = null as number;
|
|
104
104
|
constructor(props: ClipboardCopyProps) {
|
|
105
105
|
super(props);
|
|
106
|
-
const text = Array.isArray(this.props.children) ? this.props.children.join('') : (this.props.children as string);
|
|
106
|
+
const text = Array.isArray(this.props.children) ? this.props.children.join(' ') : (this.props.children as string);
|
|
107
107
|
this.state = {
|
|
108
108
|
text,
|
|
109
109
|
expanded: this.props.isExpanded,
|
|
@@ -134,7 +134,9 @@ class ClipboardCopy extends React.Component<ClipboardCopyProps, ClipboardCopySta
|
|
|
134
134
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
135
135
|
componentDidUpdate = (prevProps: ClipboardCopyProps, prevState: ClipboardCopyState) => {
|
|
136
136
|
if (prevProps.children !== this.props.children) {
|
|
137
|
-
const newText = this.props.children
|
|
137
|
+
const newText = Array.isArray(this.props.children)
|
|
138
|
+
? this.props.children.join(' ')
|
|
139
|
+
: (this.props.children as string);
|
|
138
140
|
this.setState({ text: newText, textWhenExpanded: newText });
|
|
139
141
|
}
|
|
140
142
|
};
|
|
@@ -336,6 +336,21 @@ test('Does not call onCopy when ClipboardCopyButton is not clicked', async () =>
|
|
|
336
336
|
expect(onCopyMock).not.toHaveBeenCalled();
|
|
337
337
|
});
|
|
338
338
|
|
|
339
|
+
test('Can take array of strings as children', async () => {
|
|
340
|
+
const onCopyMock = jest.fn();
|
|
341
|
+
const user = userEvent.setup();
|
|
342
|
+
const childrenArray = children.split(' ');
|
|
343
|
+
|
|
344
|
+
// sanity check to ensure we are checking an array with at least 2 elements
|
|
345
|
+
expect(childrenArray.length).toBeGreaterThan(1);
|
|
346
|
+
|
|
347
|
+
render(<ClipboardCopy onCopy={onCopyMock}>{childrenArray}</ClipboardCopy>);
|
|
348
|
+
|
|
349
|
+
await user.click(screen.getByRole('button', { name: 'Test CCB clicker' }));
|
|
350
|
+
|
|
351
|
+
expect(onCopyMock).toHaveBeenCalledWith(expect.any(Object), children);
|
|
352
|
+
});
|
|
353
|
+
|
|
339
354
|
test('Matches snapshot', () => {
|
|
340
355
|
const { asFragment } = render(
|
|
341
356
|
<ClipboardCopy id="snapshot" ouiaId="snapshot">
|
|
@@ -18,7 +18,7 @@ exports[`Matches snapshot 1`] = `
|
|
|
18
18
|
<input
|
|
19
19
|
aria-invalid="false"
|
|
20
20
|
aria-label="Copyable input"
|
|
21
|
-
data-ouia-component-id="OUIA-Generated-TextInputBase-
|
|
21
|
+
data-ouia-component-id="OUIA-Generated-TextInputBase-27"
|
|
22
22
|
data-ouia-component-type="PF6/TextInput"
|
|
23
23
|
data-ouia-safe="true"
|
|
24
24
|
id="text-input-generated-id"
|
|
@@ -8,7 +8,8 @@ import { FormControlIcon } from '../FormControl/FormControlIcon';
|
|
|
8
8
|
export enum TextAreResizeOrientation {
|
|
9
9
|
horizontal = 'horizontal',
|
|
10
10
|
vertical = 'vertical',
|
|
11
|
-
both = 'both'
|
|
11
|
+
both = 'both',
|
|
12
|
+
none = 'none'
|
|
12
13
|
}
|
|
13
14
|
|
|
14
15
|
export enum TextAreaReadOnlyVariant {
|
|
@@ -37,7 +38,7 @@ export interface TextAreaProps extends Omit<HTMLProps<HTMLTextAreaElement>, 'onC
|
|
|
37
38
|
/** A callback for when the text area value changes. */
|
|
38
39
|
onChange?: (event: React.ChangeEvent<HTMLTextAreaElement>, value: string) => void;
|
|
39
40
|
/** Sets the orientation to limit the resize to */
|
|
40
|
-
resizeOrientation?: 'horizontal' | 'vertical' | 'both';
|
|
41
|
+
resizeOrientation?: 'horizontal' | 'vertical' | 'both' | 'none';
|
|
41
42
|
/** Custom flag to show that the text area requires an associated id or aria-label. */
|
|
42
43
|
'aria-label'?: string;
|
|
43
44
|
/** @hide A reference object to attach to the text area. */
|
|
@@ -118,10 +119,10 @@ class TextAreaBase extends React.Component<TextAreaProps> {
|
|
|
118
119
|
onFocus,
|
|
119
120
|
...props
|
|
120
121
|
} = this.props;
|
|
121
|
-
const orientation =
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
122
|
+
const orientation =
|
|
123
|
+
resizeOrientation !== 'none'
|
|
124
|
+
? (`resize${capitalize(resizeOrientation)}` as 'resizeVertical' | 'resizeHorizontal' | 'resizeBoth')
|
|
125
|
+
: undefined;
|
|
125
126
|
const hasStatusIcon = ['success', 'error', 'warning'].includes(validated);
|
|
126
127
|
|
|
127
128
|
return (
|
|
@@ -130,7 +131,7 @@ class TextAreaBase extends React.Component<TextAreaProps> {
|
|
|
130
131
|
styles.formControl,
|
|
131
132
|
readOnlyVariant && styles.modifiers.readonly,
|
|
132
133
|
readOnlyVariant === 'plain' && styles.modifiers.plain,
|
|
133
|
-
resizeOrientation && styles.modifiers[orientation],
|
|
134
|
+
resizeOrientation !== 'none' && styles.modifiers[orientation],
|
|
134
135
|
isDisabled && styles.modifiers.disabled,
|
|
135
136
|
hasStatusIcon && styles.modifiers[validated as 'success' | 'warning' | 'error'],
|
|
136
137
|
className
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import '@testing-library/jest-dom';
|
|
2
3
|
|
|
3
4
|
import { render, screen } from '@testing-library/react';
|
|
4
5
|
import userEvent from '@testing-library/user-event';
|
|
@@ -93,6 +94,16 @@ test('Text area is not invalid by default', () => {
|
|
|
93
94
|
expect(screen.getByRole('textbox')).not.toBeInvalid();
|
|
94
95
|
});
|
|
95
96
|
|
|
97
|
+
test('Renders vertically & resizable text area by default', () => {
|
|
98
|
+
render(<TextArea aria-label="vertical resize textarea" />);
|
|
99
|
+
expect(screen.getByRole('textbox').parentElement).toHaveClass('pf-m-resize-both');
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
test('Renders vertically & resizable text area when resizeOrientation is set to both', () => {
|
|
103
|
+
render(<TextArea aria-label="vertical resize textarea" resizeOrientation="both" />);
|
|
104
|
+
expect(screen.getByRole('textbox').parentElement).toHaveClass('pf-m-resize-both');
|
|
105
|
+
});
|
|
106
|
+
|
|
96
107
|
test('Renders vertically resizable text area', () => {
|
|
97
108
|
render(<TextArea aria-label="vertical resize textarea" resizeOrientation="vertical" />);
|
|
98
109
|
expect(screen.getByRole('textbox').parentElement).toHaveClass('pf-m-resize-vertical');
|
|
@@ -103,6 +114,13 @@ test('Renders horizontally resizable text area', () => {
|
|
|
103
114
|
expect(screen.getByRole('textbox').parentElement).toHaveClass('pf-m-resize-horizontal');
|
|
104
115
|
});
|
|
105
116
|
|
|
117
|
+
test('Disables resizable text area', () => {
|
|
118
|
+
render(<TextArea aria-label="disabled resize textarea" resizeOrientation="none" />);
|
|
119
|
+
expect(screen.getByRole('textbox').parentElement).not.toHaveClass('pf-m-resize-vertical');
|
|
120
|
+
expect(screen.getByRole('textbox').parentElement).not.toHaveClass('pf-m-resize-horizontal');
|
|
121
|
+
expect(screen.getByRole('textbox').parentElement).not.toHaveClass('pf-m-resize-both');
|
|
122
|
+
});
|
|
123
|
+
|
|
106
124
|
test('Throws console error when no aria-label or id is given', () => {
|
|
107
125
|
jest.spyOn(global.console, 'error');
|
|
108
126
|
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { TextArea } from '@patternfly/react-core';
|
|
3
|
+
|
|
4
|
+
export const TextAreaResizeNone: React.FunctionComponent = () => {
|
|
5
|
+
const [value, setValue] = React.useState('');
|
|
6
|
+
return (
|
|
7
|
+
<TextArea
|
|
8
|
+
value={value}
|
|
9
|
+
onChange={(_event, value) => setValue(value)}
|
|
10
|
+
resizeOrientation="none"
|
|
11
|
+
aria-label="text area resize none example"
|
|
12
|
+
/>
|
|
13
|
+
);
|
|
14
|
+
};
|
|
@@ -62,6 +62,14 @@ Note: This example does not demonstrate responsive toolbar behavior. Responsive
|
|
|
62
62
|
|
|
63
63
|
```
|
|
64
64
|
|
|
65
|
+
### Background color variants
|
|
66
|
+
|
|
67
|
+
To change the background color of a toolbar, use the `colorVariant` property on the `<Toolbar>`.
|
|
68
|
+
|
|
69
|
+
```ts file="./ToolbarColorVariant.tsx"
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
|
|
65
73
|
## Examples with toggle groups and filters
|
|
66
74
|
|
|
67
75
|
The following examples use toggle groups to allow for more responsive and complex toolbars with multiple items and groups of items. To visualize responsive toolbar behavior in the following examples, resize the browser to a smaller screen width.
|
|
@@ -112,11 +120,3 @@ When all of a toolbar's required elements cannot fit in a single line, you can s
|
|
|
112
120
|
```ts file="./ToolbarStacked.tsx"
|
|
113
121
|
|
|
114
122
|
```
|
|
115
|
-
|
|
116
|
-
## Background color variants
|
|
117
|
-
|
|
118
|
-
To change the background color of a toolbar, use the `colorVariant` property on the `<Toolbar>`.
|
|
119
|
-
|
|
120
|
-
```ts file="./ToolbarColorVariant.tsx"
|
|
121
|
-
|
|
122
|
-
```
|
|
@@ -5,7 +5,7 @@ cssPrefix: pf-v6-c-tree-view
|
|
|
5
5
|
propComponents: ['TreeView', 'TreeViewDataItem', 'TreeViewSearch']
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
import { FolderIcon, FolderOpenIcon, EllipsisVIcon, ClipboardIcon, HamburgerIcon } from '@patternfly/react-icons';
|
|
8
|
+
import { FolderIcon, FolderOpenIcon, EllipsisVIcon, ClipboardIcon, HamburgerIcon, GitlabIcon, GithubIcon, GoogleIcon } from '@patternfly/react-icons';
|
|
9
9
|
|
|
10
10
|
## Examples
|
|
11
11
|
|
|
@@ -51,6 +51,12 @@ A search input can be used to filter tree view items. It is recommended that a t
|
|
|
51
51
|
|
|
52
52
|
```
|
|
53
53
|
|
|
54
|
+
### With unique icon per item
|
|
55
|
+
|
|
56
|
+
```ts file='./TreeViewWithIconPerItem.tsx'
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
|
|
54
60
|
### With badges
|
|
55
61
|
|
|
56
62
|
```ts file='./TreeViewWithBadges.tsx'
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { TreeView, TreeViewDataItem } from '@patternfly/react-core';
|
|
3
|
+
import GitlabIcon from '@patternfly/react-icons/dist/esm/icons/gitlab-icon';
|
|
4
|
+
import GithubIcon from '@patternfly/react-icons/dist/esm/icons/github-icon';
|
|
5
|
+
import GoogleIcon from '@patternfly/react-icons/dist/esm/icons/google-icon';
|
|
6
|
+
|
|
7
|
+
export const TreeViewWithIconPerItem: React.FunctionComponent = () => {
|
|
8
|
+
const [activeItems, setActiveItems] = React.useState<TreeViewDataItem[]>();
|
|
9
|
+
|
|
10
|
+
const onSelect = (_event: React.MouseEvent, treeViewItem: TreeViewDataItem) => {
|
|
11
|
+
// Ignore folders for selection
|
|
12
|
+
if (treeViewItem && !treeViewItem.children) {
|
|
13
|
+
setActiveItems([treeViewItem]);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
const options: TreeViewDataItem[] = [
|
|
17
|
+
{
|
|
18
|
+
name: 'Github accounts',
|
|
19
|
+
id: 'iconPerItem-Github',
|
|
20
|
+
icon: <GithubIcon />,
|
|
21
|
+
children: [
|
|
22
|
+
{
|
|
23
|
+
name: 'Account 1',
|
|
24
|
+
id: 'iconPerItem-Acc1'
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'Account 2',
|
|
28
|
+
id: 'iconPerItem-Acc2'
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
defaultExpanded: true
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'Gitlab accounts',
|
|
35
|
+
id: 'iconPerItem-Gitlab',
|
|
36
|
+
icon: <GitlabIcon />,
|
|
37
|
+
children: [
|
|
38
|
+
{
|
|
39
|
+
name: 'Account 3',
|
|
40
|
+
id: 'iconPerItem-Acc3'
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: 'Google accounts',
|
|
46
|
+
id: 'iconPerItem-Google',
|
|
47
|
+
icon: <GoogleIcon />,
|
|
48
|
+
children: [
|
|
49
|
+
{
|
|
50
|
+
name: 'Account 4',
|
|
51
|
+
id: 'iconPerItem-Acc4'
|
|
52
|
+
}
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
];
|
|
56
|
+
return (
|
|
57
|
+
<TreeView
|
|
58
|
+
aria-label="Tree View with unique icon per item example"
|
|
59
|
+
data={options}
|
|
60
|
+
activeItems={activeItems}
|
|
61
|
+
onSelect={onSelect}
|
|
62
|
+
/>
|
|
63
|
+
);
|
|
64
|
+
};
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
Button,
|
|
4
|
+
Content,
|
|
5
|
+
DataList,
|
|
6
|
+
DataListItem,
|
|
7
|
+
DataListCell,
|
|
8
|
+
DataListItemRow,
|
|
9
|
+
DataListItemCells,
|
|
10
|
+
DataListAction,
|
|
11
|
+
Dropdown,
|
|
12
|
+
DropdownList,
|
|
13
|
+
DropdownItem,
|
|
14
|
+
MenuToggle,
|
|
15
|
+
MenuToggleElement,
|
|
16
|
+
PageSection,
|
|
17
|
+
Title
|
|
18
|
+
} from '@patternfly/react-core';
|
|
19
|
+
import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
|
|
20
|
+
import { DashboardWrapper } from '@patternfly/react-core/dist/js/demos/DashboardWrapper';
|
|
21
|
+
|
|
22
|
+
export const DataListActionable: React.FunctionComponent = () => {
|
|
23
|
+
const [isOpen, setIsOpen] = React.useState(false);
|
|
24
|
+
const [isDeleted, setIsDeleted] = React.useState(false);
|
|
25
|
+
|
|
26
|
+
const onToggle = () => {
|
|
27
|
+
setIsOpen(!isOpen);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const onSelect = () => {
|
|
31
|
+
setIsOpen(!isOpen);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
return (
|
|
35
|
+
<DashboardWrapper mainContainerId="main-content-datalist-view-actions" breadcrumb={null}>
|
|
36
|
+
<PageSection>
|
|
37
|
+
<Content>
|
|
38
|
+
<Title headingLevel="h1">Projects</Title>
|
|
39
|
+
<Content component="p">This is a demo that showcases PatternFly Data List</Content>
|
|
40
|
+
</Content>
|
|
41
|
+
</PageSection>
|
|
42
|
+
<PageSection>
|
|
43
|
+
<DataList aria-label="single action data list example ">
|
|
44
|
+
{!isDeleted && (
|
|
45
|
+
<DataListItem aria-labelledby="single-action-item1">
|
|
46
|
+
<DataListItemRow>
|
|
47
|
+
<DataListItemCells
|
|
48
|
+
dataListCells={[
|
|
49
|
+
<DataListCell key="primary content">
|
|
50
|
+
<span id="single-action-item1">Single actionable Primary content</span>
|
|
51
|
+
</DataListCell>,
|
|
52
|
+
<DataListCell key="secondary content">Single actionable Secondary content</DataListCell>
|
|
53
|
+
]}
|
|
54
|
+
/>
|
|
55
|
+
<DataListAction
|
|
56
|
+
aria-labelledby="single-action-item1 single-action-action1"
|
|
57
|
+
id="single-action-action1"
|
|
58
|
+
aria-label="Actions"
|
|
59
|
+
>
|
|
60
|
+
<Button
|
|
61
|
+
onClick={() => {
|
|
62
|
+
if (confirm('Are you sure?')) {
|
|
63
|
+
setIsDeleted(true);
|
|
64
|
+
}
|
|
65
|
+
}}
|
|
66
|
+
variant="primary"
|
|
67
|
+
key="delete-action"
|
|
68
|
+
>
|
|
69
|
+
Delete
|
|
70
|
+
</Button>
|
|
71
|
+
</DataListAction>
|
|
72
|
+
</DataListItemRow>
|
|
73
|
+
</DataListItem>
|
|
74
|
+
)}
|
|
75
|
+
<DataListItem aria-labelledby="multi-actions-item1">
|
|
76
|
+
<DataListItemRow>
|
|
77
|
+
<DataListItemCells
|
|
78
|
+
dataListCells={[
|
|
79
|
+
<DataListCell key="primary content">
|
|
80
|
+
<span id="multi-actions-item1">Multi actions Primary content</span>
|
|
81
|
+
</DataListCell>,
|
|
82
|
+
<DataListCell key="secondary content">Multi actions Secondary content</DataListCell>
|
|
83
|
+
]}
|
|
84
|
+
/>
|
|
85
|
+
<DataListAction
|
|
86
|
+
aria-labelledby="multi-actions-item1 multi-actions-action1"
|
|
87
|
+
id="multi-actions-action1"
|
|
88
|
+
aria-label="Actions"
|
|
89
|
+
>
|
|
90
|
+
<Dropdown
|
|
91
|
+
popperProps={{ position: 'right' }}
|
|
92
|
+
onSelect={onSelect}
|
|
93
|
+
toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
|
|
94
|
+
<MenuToggle
|
|
95
|
+
ref={toggleRef}
|
|
96
|
+
isExpanded={isOpen}
|
|
97
|
+
onClick={onToggle}
|
|
98
|
+
variant="plain"
|
|
99
|
+
aria-label="Data list with actions example kebab toggle"
|
|
100
|
+
>
|
|
101
|
+
<EllipsisVIcon aria-hidden="true" />
|
|
102
|
+
</MenuToggle>
|
|
103
|
+
)}
|
|
104
|
+
isOpen={isOpen}
|
|
105
|
+
onOpenChange={(isOpen: boolean) => setIsOpen(isOpen)}
|
|
106
|
+
>
|
|
107
|
+
<DropdownList>
|
|
108
|
+
<DropdownItem key="action">Action</DropdownItem>
|
|
109
|
+
{/* Prevent default onClick functionality for example
|
|
110
|
+
purposes */}
|
|
111
|
+
<DropdownItem key="link" to="#" onClick={(event: any) => event.preventDefault()}>
|
|
112
|
+
Link
|
|
113
|
+
</DropdownItem>
|
|
114
|
+
<DropdownItem key="disabled action" isDisabled>
|
|
115
|
+
Disabled Action
|
|
116
|
+
</DropdownItem>
|
|
117
|
+
<DropdownItem
|
|
118
|
+
key="disabled link"
|
|
119
|
+
isDisabled
|
|
120
|
+
to="#"
|
|
121
|
+
onClick={(event: any) => event.preventDefault()}
|
|
122
|
+
>
|
|
123
|
+
Disabled Link
|
|
124
|
+
</DropdownItem>
|
|
125
|
+
</DropdownList>
|
|
126
|
+
</Dropdown>
|
|
127
|
+
</DataListAction>
|
|
128
|
+
</DataListItemRow>
|
|
129
|
+
</DataListItem>
|
|
130
|
+
</DataList>
|
|
131
|
+
</PageSection>
|
|
132
|
+
</DashboardWrapper>
|
|
133
|
+
);
|
|
134
|
+
};
|
|
@@ -30,6 +30,11 @@ import { rows } from '@patternfly/react-core/dist/esm/demos/sampleData';
|
|
|
30
30
|
```js file="./DataList/examples/DataListExpandableControlInToolbar.tsx" isFullscreen
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
+
### Actionable
|
|
34
|
+
|
|
35
|
+
```js file="./DataList/examples/DataListActionable.tsx" isFullscreen
|
|
36
|
+
```
|
|
37
|
+
|
|
33
38
|
### Static bottom pagination
|
|
34
39
|
|
|
35
40
|
```js file="./DataList/examples/DataListStaticBottomPagination.tsx" isFullscreen
|
|
@@ -4,6 +4,7 @@ section: components
|
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
import CheckCircleIcon from '@patternfly/react-icons/dist/esm/icons/check-circle-icon';
|
|
7
|
+
import PlusCircleIcon from '@patternfly/react-icons/dist/esm/icons/plus-circle-icon';
|
|
7
8
|
import { DashboardWrapper } from '@patternfly/react-core/dist/js/demos/DashboardWrapper';
|
|
8
9
|
|
|
9
10
|
## Demos
|
|
@@ -11,4 +12,9 @@ import { DashboardWrapper } from '@patternfly/react-core/dist/js/demos/Dashboard
|
|
|
11
12
|
### Basic
|
|
12
13
|
|
|
13
14
|
```js file='./examples/DescriptionListBasic.tsx' isFullscreen
|
|
14
|
-
```
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### In drawer
|
|
18
|
+
|
|
19
|
+
```js file='./examples/DescriptionListInDrawer.tsx' isFullscreen
|
|
20
|
+
```
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
Gallery,
|
|
4
|
+
Content,
|
|
5
|
+
PageSection,
|
|
6
|
+
GalleryItem,
|
|
7
|
+
Card,
|
|
8
|
+
CardBody,
|
|
9
|
+
DrawerHead,
|
|
10
|
+
DrawerActions,
|
|
11
|
+
DrawerCloseButton,
|
|
12
|
+
DrawerPanelBody,
|
|
13
|
+
DescriptionList,
|
|
14
|
+
DescriptionListTerm,
|
|
15
|
+
DescriptionListGroup,
|
|
16
|
+
DescriptionListDescription,
|
|
17
|
+
Button,
|
|
18
|
+
Title
|
|
19
|
+
} from '@patternfly/react-core';
|
|
20
|
+
import { DashboardWrapper } from '@patternfly/react-core/dist/js/demos/DashboardWrapper';
|
|
21
|
+
import PlusCircleIcon from '@patternfly/react-icons/dist/esm/icons/plus-circle-icon';
|
|
22
|
+
|
|
23
|
+
export const DescriptionListInDrawer: React.FunctionComponent = () => {
|
|
24
|
+
const drawerRef = React.useRef<HTMLDivElement>(null);
|
|
25
|
+
const btnRef = React.useRef<HTMLDivElement>(null);
|
|
26
|
+
const [isExpanded, setIsExpanded] = React.useState(true);
|
|
27
|
+
|
|
28
|
+
const onExpand = () => {
|
|
29
|
+
drawerRef.current && drawerRef.current.focus();
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const onCloseClick = () => {
|
|
33
|
+
setIsExpanded(false);
|
|
34
|
+
btnRef.current && btnRef.current.focus();
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const onToggleDrawer = () => {
|
|
38
|
+
setIsExpanded((prevIsExpanded) => !prevIsExpanded);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const panelContent = (
|
|
42
|
+
<>
|
|
43
|
+
<DrawerHead>
|
|
44
|
+
<Title headingLevel="h2">
|
|
45
|
+
<span ref={drawerRef} tabIndex={isExpanded ? 0 : -1}>
|
|
46
|
+
test
|
|
47
|
+
</span>
|
|
48
|
+
</Title>
|
|
49
|
+
<DrawerActions>
|
|
50
|
+
<DrawerCloseButton onClick={onCloseClick} />
|
|
51
|
+
</DrawerActions>
|
|
52
|
+
</DrawerHead>
|
|
53
|
+
<DrawerPanelBody>
|
|
54
|
+
<DescriptionList isFillColumns columnModifier={{ default: '2Col', lg: '2Col' }}>
|
|
55
|
+
<DescriptionListGroup>
|
|
56
|
+
<DescriptionListTerm>Name</DescriptionListTerm>
|
|
57
|
+
<DescriptionListDescription>test</DescriptionListDescription>
|
|
58
|
+
</DescriptionListGroup>
|
|
59
|
+
<DescriptionListGroup>
|
|
60
|
+
<DescriptionListTerm>Namespace</DescriptionListTerm>
|
|
61
|
+
<DescriptionListDescription>
|
|
62
|
+
<a href="#">mary-test</a>
|
|
63
|
+
</DescriptionListDescription>
|
|
64
|
+
</DescriptionListGroup>
|
|
65
|
+
<DescriptionListGroup>
|
|
66
|
+
<DescriptionListTerm>Labels</DescriptionListTerm>
|
|
67
|
+
<DescriptionListDescription>app=test</DescriptionListDescription>
|
|
68
|
+
</DescriptionListGroup>
|
|
69
|
+
<DescriptionListGroup>
|
|
70
|
+
<DescriptionListTerm>Pod selector</DescriptionListTerm>
|
|
71
|
+
<DescriptionListDescription>Node selector is not available at this time</DescriptionListDescription>
|
|
72
|
+
</DescriptionListGroup>
|
|
73
|
+
<DescriptionListGroup>
|
|
74
|
+
<DescriptionListTerm>Tolerations</DescriptionListTerm>
|
|
75
|
+
<DescriptionListDescription>No tolerations</DescriptionListDescription>
|
|
76
|
+
</DescriptionListGroup>
|
|
77
|
+
<DescriptionListGroup>
|
|
78
|
+
<DescriptionListTerm>Annotations</DescriptionListTerm>
|
|
79
|
+
<DescriptionListDescription>No annotaions</DescriptionListDescription>
|
|
80
|
+
</DescriptionListGroup>
|
|
81
|
+
<DescriptionListGroup>
|
|
82
|
+
<DescriptionListTerm>Status</DescriptionListTerm>
|
|
83
|
+
<DescriptionListDescription>Active</DescriptionListDescription>
|
|
84
|
+
</DescriptionListGroup>
|
|
85
|
+
<DescriptionListGroup>
|
|
86
|
+
<DescriptionListTerm>Created at:</DescriptionListTerm>
|
|
87
|
+
<DescriptionListDescription>3 minutes agot</DescriptionListDescription>
|
|
88
|
+
</DescriptionListGroup>
|
|
89
|
+
<DescriptionListGroup>
|
|
90
|
+
<DescriptionListTerm>Pod selector</DescriptionListTerm>
|
|
91
|
+
<DescriptionListDescription>
|
|
92
|
+
<Button variant="link" isInline icon={<PlusCircleIcon />}>
|
|
93
|
+
app=MyApp
|
|
94
|
+
</Button>
|
|
95
|
+
</DescriptionListDescription>
|
|
96
|
+
</DescriptionListGroup>
|
|
97
|
+
<DescriptionListGroup>
|
|
98
|
+
<DescriptionListTerm>Session affinity</DescriptionListTerm>
|
|
99
|
+
<DescriptionListDescription>None</DescriptionListDescription>
|
|
100
|
+
</DescriptionListGroup>
|
|
101
|
+
<DescriptionListGroup>
|
|
102
|
+
<DescriptionListTerm>Latest version</DescriptionListTerm>
|
|
103
|
+
<DescriptionListDescription>1.0</DescriptionListDescription>
|
|
104
|
+
</DescriptionListGroup>
|
|
105
|
+
<DescriptionListGroup>
|
|
106
|
+
<DescriptionListTerm>Update strategy</DescriptionListTerm>
|
|
107
|
+
<DescriptionListDescription>Rolling</DescriptionListDescription>
|
|
108
|
+
</DescriptionListGroup>
|
|
109
|
+
<DescriptionListGroup>
|
|
110
|
+
<DescriptionListTerm>Timeout</DescriptionListTerm>
|
|
111
|
+
<DescriptionListDescription>600 seconds</DescriptionListDescription>
|
|
112
|
+
</DescriptionListGroup>
|
|
113
|
+
<DescriptionListGroup>
|
|
114
|
+
<DescriptionListTerm>Max available</DescriptionListTerm>
|
|
115
|
+
<DescriptionListDescription>25% of 1 pod</DescriptionListDescription>
|
|
116
|
+
</DescriptionListGroup>
|
|
117
|
+
<DescriptionListGroup>
|
|
118
|
+
<DescriptionListTerm>Max surge</DescriptionListTerm>
|
|
119
|
+
<DescriptionListDescription>25% greater than 1 pod</DescriptionListDescription>
|
|
120
|
+
</DescriptionListGroup>
|
|
121
|
+
</DescriptionList>
|
|
122
|
+
</DrawerPanelBody>
|
|
123
|
+
</>
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
const drawerContent = (
|
|
127
|
+
<Gallery hasGutter>
|
|
128
|
+
<GalleryItem key={0}>
|
|
129
|
+
<Card>
|
|
130
|
+
<CardBody>
|
|
131
|
+
<Button variant="link" isInline onClick={onToggleDrawer} ref={btnRef}>
|
|
132
|
+
{`${isExpanded ? 'Close' : 'Open'} drawer`}
|
|
133
|
+
</Button>
|
|
134
|
+
</CardBody>
|
|
135
|
+
</Card>
|
|
136
|
+
</GalleryItem>
|
|
137
|
+
{Array.from({ length: 30 }).map((_value, index) => (
|
|
138
|
+
<GalleryItem key={index + 1}>
|
|
139
|
+
<Card>
|
|
140
|
+
<CardBody>{`Card-${index + 1}`}</CardBody>
|
|
141
|
+
</Card>
|
|
142
|
+
</GalleryItem>
|
|
143
|
+
))}
|
|
144
|
+
</Gallery>
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
return (
|
|
148
|
+
<DashboardWrapper
|
|
149
|
+
notificationDrawer={panelContent}
|
|
150
|
+
isNotificationDrawerExpanded={isExpanded}
|
|
151
|
+
onNotificationDrawerExpand={onExpand}
|
|
152
|
+
>
|
|
153
|
+
<PageSection>
|
|
154
|
+
<Content>
|
|
155
|
+
<Content component="h1">Main title</Content>
|
|
156
|
+
<Content component="p">This is a full page demo.</Content>
|
|
157
|
+
</Content>
|
|
158
|
+
</PageSection>
|
|
159
|
+
<PageSection>{drawerContent}</PageSection>
|
|
160
|
+
</DashboardWrapper>
|
|
161
|
+
);
|
|
162
|
+
};
|