@patternfly/react-core 6.0.0-prerelease.3 → 6.0.0-prerelease.4

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 (150) hide show
  1. package/CHANGELOG.md +6 -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/Tile/package.json +1 -1
  74. package/dist/dynamic/components/TimePicker/package.json +1 -1
  75. package/dist/dynamic/components/Timestamp/package.json +1 -1
  76. package/dist/dynamic/components/Title/package.json +1 -1
  77. package/dist/dynamic/components/ToggleGroup/package.json +1 -1
  78. package/dist/dynamic/components/Toolbar/package.json +1 -1
  79. package/dist/dynamic/components/Tooltip/package.json +1 -1
  80. package/dist/dynamic/components/TreeView/package.json +1 -1
  81. package/dist/dynamic/components/Truncate/package.json +1 -1
  82. package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
  83. package/dist/dynamic/components/Wizard/package.json +1 -1
  84. package/dist/dynamic/deprecated/components/Chip/package.json +1 -1
  85. package/dist/dynamic/deprecated/components/DragDrop/package.json +1 -1
  86. package/dist/dynamic/deprecated/components/DualListSelector/package.json +1 -1
  87. package/dist/dynamic/deprecated/components/Modal/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/components/TextInputGroup/TextInputGroup.d.ts +2 -0
  115. package/dist/esm/components/TextInputGroup/TextInputGroup.d.ts.map +1 -1
  116. package/dist/esm/components/TextInputGroup/TextInputGroup.js +3 -3
  117. package/dist/esm/components/TextInputGroup/TextInputGroup.js.map +1 -1
  118. package/dist/esm/components/TextInputGroup/TextInputGroupIcon.d.ts +11 -0
  119. package/dist/esm/components/TextInputGroup/TextInputGroupIcon.d.ts.map +1 -0
  120. package/dist/esm/components/TextInputGroup/TextInputGroupIcon.js +10 -0
  121. package/dist/esm/components/TextInputGroup/TextInputGroupIcon.js.map +1 -0
  122. package/dist/esm/components/TextInputGroup/TextInputGroupMain.d.ts.map +1 -1
  123. package/dist/esm/components/TextInputGroup/TextInputGroupMain.js +7 -3
  124. package/dist/esm/components/TextInputGroup/TextInputGroupMain.js.map +1 -1
  125. package/dist/js/components/TextInputGroup/TextInputGroup.d.ts +2 -0
  126. package/dist/js/components/TextInputGroup/TextInputGroup.d.ts.map +1 -1
  127. package/dist/js/components/TextInputGroup/TextInputGroup.js +3 -3
  128. package/dist/js/components/TextInputGroup/TextInputGroup.js.map +1 -1
  129. package/dist/js/components/TextInputGroup/TextInputGroupIcon.d.ts +11 -0
  130. package/dist/js/components/TextInputGroup/TextInputGroupIcon.d.ts.map +1 -0
  131. package/dist/js/components/TextInputGroup/TextInputGroupIcon.js +14 -0
  132. package/dist/js/components/TextInputGroup/TextInputGroupIcon.js.map +1 -0
  133. package/dist/js/components/TextInputGroup/TextInputGroupMain.d.ts.map +1 -1
  134. package/dist/js/components/TextInputGroup/TextInputGroupMain.js +7 -3
  135. package/dist/js/components/TextInputGroup/TextInputGroupMain.js.map +1 -1
  136. package/dist/styles/base-no-reset.css +2 -5
  137. package/dist/styles/base.css +2 -5
  138. package/dist/umd/assets/{output-CDQqwJov.css → output--nhNsNY5.css} +17684 -17567
  139. package/dist/umd/react-core.min.js +1 -1
  140. package/helpers/package.json +1 -1
  141. package/layouts/package.json +1 -1
  142. package/next/package.json +1 -1
  143. package/package.json +6 -6
  144. package/src/components/TextInputGroup/TextInputGroup.tsx +5 -1
  145. package/src/components/TextInputGroup/TextInputGroupIcon.tsx +25 -0
  146. package/src/components/TextInputGroup/TextInputGroupMain.tsx +6 -2
  147. package/src/components/TextInputGroup/__tests__/TextInputGroup.test.tsx +26 -4
  148. package/src/components/TextInputGroup/__tests__/TextInputGroupMain.test.tsx +10 -0
  149. package/src/components/TextInputGroup/examples/TextInputGroup.md +12 -0
  150. package/src/components/TextInputGroup/examples/TextInputGroupWithStatus.tsx +66 -0
@@ -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.0.0-prerelease.2","private":true}
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.0.0-prerelease.3","private":true}
@@ -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.0.0-prerelease.2","private":true}
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.0.0-prerelease.3","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.0.0-prerelease.2","private":true}
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.0.0-prerelease.3","private":true}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/react-core",
3
- "version": "6.0.0-prerelease.3",
3
+ "version": "6.0.0-prerelease.4",
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,15 +46,15 @@
46
46
  "subpaths": "node ../../scripts/exportSubpaths.mjs --config subpaths.config.json"
47
47
  },
48
48
  "dependencies": {
49
- "@patternfly/react-icons": "^6.0.0-prerelease.2",
50
- "@patternfly/react-styles": "^6.0.0-prerelease.1",
51
- "@patternfly/react-tokens": "^6.0.0-prerelease.1",
49
+ "@patternfly/react-icons": "^6.0.0-prerelease.3",
50
+ "@patternfly/react-styles": "^6.0.0-prerelease.2",
51
+ "@patternfly/react-tokens": "^6.0.0-prerelease.2",
52
52
  "focus-trap": "7.5.4",
53
53
  "react-dropzone": "^14.2.3",
54
54
  "tslib": "^2.7.0"
55
55
  },
56
56
  "devDependencies": {
57
- "@patternfly/patternfly": "6.0.0-alpha.226",
57
+ "@patternfly/patternfly": "6.0.0-prerelease.3",
58
58
  "case-anything": "^2.1.13",
59
59
  "css": "^3.0.0",
60
60
  "fs-extra": "^11.2.0"
@@ -63,5 +63,5 @@
63
63
  "react": "^17 || ^18",
64
64
  "react-dom": "^17 || ^18"
65
65
  },
66
- "gitHead": "2aade65babf146113763e30fb38654b18a90c76f"
66
+ "gitHead": "9a0312477ff9ea58d3fce5032cf381f848e830dc"
67
67
  }
@@ -11,6 +11,8 @@ export interface TextInputGroupProps extends React.HTMLProps<HTMLDivElement> {
11
11
  isDisabled?: boolean;
12
12
  /** Flag to indicate the toggle has no border or background */
13
13
  isPlain?: boolean;
14
+ /** Status variant of the text input group. */
15
+ validated?: 'success' | 'warning' | 'error';
14
16
  /** @hide A reference object to attach to the input box */
15
17
  innerRef?: React.RefObject<any>;
16
18
  }
@@ -24,6 +26,7 @@ export const TextInputGroup: React.FunctionComponent<TextInputGroupProps> = ({
24
26
  className,
25
27
  isDisabled,
26
28
  isPlain,
29
+ validated,
27
30
  innerRef,
28
31
  ...props
29
32
  }: TextInputGroupProps) => {
@@ -31,13 +34,14 @@ export const TextInputGroup: React.FunctionComponent<TextInputGroupProps> = ({
31
34
  const textInputGroupRef = innerRef || ref;
32
35
 
33
36
  return (
34
- <TextInputGroupContext.Provider value={{ isDisabled }}>
37
+ <TextInputGroupContext.Provider value={{ isDisabled, validated }}>
35
38
  <div
36
39
  ref={textInputGroupRef}
37
40
  className={css(
38
41
  styles.textInputGroup,
39
42
  isDisabled && styles.modifiers.disabled,
40
43
  isPlain && styles.modifiers.plain,
44
+ validated && styles.modifiers[validated],
41
45
  className
42
46
  )}
43
47
  {...props}
@@ -0,0 +1,25 @@
1
+ import * as React from 'react';
2
+ import styles from '@patternfly/react-styles/css/components/TextInputGroup/text-input-group';
3
+ import { css } from '@patternfly/react-styles';
4
+
5
+ export interface TextInputGroupIconProps extends React.HTMLProps<HTMLSpanElement> {
6
+ /** Content rendered inside the text input group utilities div */
7
+ children?: React.ReactNode;
8
+ /** Additional classes applied to the text input group utilities container */
9
+ className?: string;
10
+ /** Flag indicating if the icon is a status icon and should inherit status styling. */
11
+ isStatus?: boolean;
12
+ }
13
+
14
+ export const TextInputGroupIcon: React.FunctionComponent<TextInputGroupIconProps> = ({
15
+ children,
16
+ className,
17
+ isStatus,
18
+ ...props
19
+ }: TextInputGroupIconProps) => (
20
+ <span className={css(styles.textInputGroupIcon, isStatus && styles.modifiers.status, className)} {...props}>
21
+ {children}
22
+ </span>
23
+ );
24
+
25
+ TextInputGroupIcon.displayName = 'TextInputGroupIcon';
@@ -2,6 +2,8 @@ import * as React from 'react';
2
2
  import styles from '@patternfly/react-styles/css/components/TextInputGroup/text-input-group';
3
3
  import { css } from '@patternfly/react-styles';
4
4
  import { TextInputGroupContext } from './TextInputGroup';
5
+ import { TextInputGroupIcon } from './TextInputGroupIcon';
6
+ import { statusIcons, ValidatedOptions } from '../../helpers';
5
7
 
6
8
  export interface TextInputGroupMainProps extends Omit<React.HTMLProps<HTMLDivElement>, 'onChange'> {
7
9
  /** Content rendered inside the text input group main div */
@@ -78,9 +80,10 @@ const TextInputGroupMainBase: React.FunctionComponent<TextInputGroupMainProps> =
78
80
  inputId,
79
81
  ...props
80
82
  }: TextInputGroupMainProps) => {
81
- const { isDisabled } = React.useContext(TextInputGroupContext);
83
+ const { isDisabled, validated } = React.useContext(TextInputGroupContext);
82
84
  const ref = React.useRef(null);
83
85
  const textInputGroupInputInputRef = innerRef || ref;
86
+ const StatusIcon = statusIcons[validated === ValidatedOptions.error ? 'danger' : validated];
84
87
 
85
88
  const handleChange = (event: React.FormEvent<HTMLInputElement>) => {
86
89
  onChange(event, event.currentTarget.value);
@@ -100,7 +103,7 @@ const TextInputGroupMainBase: React.FunctionComponent<TextInputGroupMainProps> =
100
103
  id={inputId}
101
104
  />
102
105
  )}
103
- {icon && <span className={css(styles.textInputGroupIcon)}>{icon}</span>}
106
+ {icon && <TextInputGroupIcon>{icon}</TextInputGroupIcon>}
104
107
  <input
105
108
  ref={textInputGroupInputInputRef}
106
109
  type={type}
@@ -119,6 +122,7 @@ const TextInputGroupMainBase: React.FunctionComponent<TextInputGroupMainProps> =
119
122
  {...(isExpanded !== undefined && { 'aria-expanded': isExpanded })}
120
123
  {...(ariaControls && { 'aria-controls': ariaControls })}
121
124
  />
125
+ {validated && <TextInputGroupIcon isStatus>{<StatusIcon aria-hidden="true" />}</TextInputGroupIcon>}
122
126
  </span>
123
127
  </div>
124
128
  );
@@ -34,20 +34,42 @@ describe('TextInputGroup', () => {
34
34
  expect(inputGroup).toHaveClass('custom-class');
35
35
  });
36
36
 
37
- it('does not render with the pf-m-disabled class when not disabled', () => {
37
+ it(`does not render with the ${styles.modifiers.disabled} class when not disabled`, () => {
38
38
  render(<TextInputGroup>Test</TextInputGroup>);
39
39
 
40
40
  const inputGroup = screen.getByText('Test');
41
41
 
42
- expect(inputGroup).not.toHaveClass('pf-m-disabled');
42
+ expect(inputGroup).not.toHaveClass(styles.modifiers.disabled);
43
43
  });
44
44
 
45
- it('renders with the pf-m-disabled class when disabled', () => {
45
+ it(`renders with the ${styles.modifiers.disabled} class when disabled`, () => {
46
46
  render(<TextInputGroup isDisabled>Test</TextInputGroup>);
47
47
 
48
48
  const inputGroup = screen.getByText('Test');
49
49
 
50
- expect(inputGroup).toHaveClass('pf-m-disabled');
50
+ expect(inputGroup).toHaveClass(styles.modifiers.disabled);
51
+ });
52
+
53
+ it(`renders with class ${styles.modifiers.success} when validated="success"`, () => {
54
+ render(<TextInputGroup validated="success">Test</TextInputGroup>);
55
+
56
+ const inputGroup = screen.getByText('Test');
57
+
58
+ expect(inputGroup).toHaveClass(styles.modifiers.success);
59
+ });
60
+ it(`renders with class ${styles.modifiers.warning} when validated="warning"`, () => {
61
+ render(<TextInputGroup validated="warning">Test</TextInputGroup>);
62
+
63
+ const inputGroup = screen.getByText('Test');
64
+
65
+ expect(inputGroup).toHaveClass(styles.modifiers.warning);
66
+ });
67
+ it(`renders with class ${styles.modifiers.error} when validated="error"`, () => {
68
+ render(<TextInputGroup validated="error">Test</TextInputGroup>);
69
+
70
+ const inputGroup = screen.getByText('Test');
71
+
72
+ expect(inputGroup).toHaveClass(styles.modifiers.error);
51
73
  });
52
74
 
53
75
  it('passes isDisabled=false to children via a context when isDisabled prop is not passed', () => {
@@ -242,6 +242,16 @@ describe('TextInputGroupMain', () => {
242
242
  expect(hintInput).toBeVisible();
243
243
  });
244
244
 
245
+ it(`Renders status icon with class ${styles.modifiers.status} when a validated prop is passed`, () => {
246
+ render(
247
+ <TextInputGroupContext.Provider value={{ validated: 'success' }}>
248
+ <TextInputGroupMain />
249
+ </TextInputGroupContext.Provider>
250
+ );
251
+
252
+ expect(screen.getByRole('textbox').nextElementSibling).toHaveClass(styles.modifiers.status);
253
+ });
254
+
245
255
  it('does not call onChange callback when the input does not change', () => {
246
256
  const onChangeMock = jest.fn();
247
257
 
@@ -13,19 +13,31 @@ import TimesIcon from '@patternfly/react-icons/dist/esm/icons/times-icon';
13
13
  ### Basic
14
14
 
15
15
  ```ts file="./TextInputGroupBasic.tsx"
16
+
16
17
  ```
17
18
 
18
19
  ### Disabled
19
20
 
20
21
  ```ts file="./TextInputGroupDisabled.tsx"
22
+
21
23
  ```
22
24
 
23
25
  ### Utilities and icon
24
26
 
25
27
  ```ts file="./TextInputGroupUtilitiesAndIcon.tsx"
28
+
29
+ ```
30
+
31
+ ### With validation
32
+
33
+ You can add a validation status to a `<TextInputGroup>` by passing the `validated` property with a value of either "success", "warning", or "error".
34
+
35
+ ```ts file="./TextInputGroupWithStatus.tsx"
36
+
26
37
  ```
27
38
 
28
39
  ### Filters
29
40
 
30
41
  ```ts file="./TextInputGroupFilters.tsx"
42
+
31
43
  ```
@@ -0,0 +1,66 @@
1
+ import React from 'react';
2
+ import {
3
+ TextInputGroup,
4
+ TextInputGroupMain,
5
+ TextInputGroupUtilities,
6
+ Button,
7
+ ValidatedOptions,
8
+ Flex,
9
+ FlexItem
10
+ } from '@patternfly/react-core';
11
+ import SearchIcon from '@patternfly/react-icons/dist/esm/icons/search-icon';
12
+ import TimesIcon from '@patternfly/react-icons/dist/esm/icons/times-icon';
13
+
14
+ export const TextInputGroupWithStatus: React.FunctionComponent = () => {
15
+ const [successValue, setSuccessValue] = React.useState('Success validation');
16
+ const [warningValue, setWarningValue] = React.useState('Warning validation with custom non-status icon at start');
17
+ const [errorValue, setErrorValue] = React.useState(
18
+ 'Error validation with custom non-status icon at start and utilities'
19
+ );
20
+
21
+ /** show the input clearing button only when the input is not empty */
22
+ const showClearButton = !!errorValue;
23
+
24
+ /** render the utilities component only when a component it contains is being rendered */
25
+ const showUtilities = showClearButton;
26
+
27
+ /** callback for clearing the text input */
28
+ const clearInput = () => {
29
+ setErrorValue('');
30
+ };
31
+
32
+ return (
33
+ <Flex direction={{ default: 'column' }} rowGap={{ default: 'rowGapSm' }}>
34
+ <FlexItem>
35
+ <TextInputGroup validated={ValidatedOptions.success}>
36
+ <TextInputGroupMain value={successValue} onChange={(_event, value) => setSuccessValue(value)} />
37
+ </TextInputGroup>
38
+ </FlexItem>
39
+ <FlexItem>
40
+ <TextInputGroup validated={ValidatedOptions.warning}>
41
+ <TextInputGroupMain
42
+ icon={<SearchIcon />}
43
+ value={warningValue}
44
+ onChange={(_event, value) => setWarningValue(value)}
45
+ />
46
+ </TextInputGroup>
47
+ </FlexItem>
48
+ <FlexItem>
49
+ <TextInputGroup validated={ValidatedOptions.error}>
50
+ <TextInputGroupMain
51
+ icon={<SearchIcon />}
52
+ value={errorValue}
53
+ onChange={(_event, value) => setErrorValue(value)}
54
+ />
55
+ {showUtilities && (
56
+ <TextInputGroupUtilities>
57
+ {showClearButton && (
58
+ <Button variant="plain" onClick={clearInput} aria-label="Clear button and input" icon={<TimesIcon />} />
59
+ )}
60
+ </TextInputGroupUtilities>
61
+ )}
62
+ </TextInputGroup>
63
+ </FlexItem>
64
+ </Flex>
65
+ );
66
+ };