@patternfly/react-core 6.6.1-prerelease.1 → 6.6.1-prerelease.3

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 (205) hide show
  1. package/CHANGELOG.md +10 -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/Compass/package.json +1 -1
  23. package/dist/dynamic/components/Content/package.json +1 -1
  24. package/dist/dynamic/components/DataList/package.json +1 -1
  25. package/dist/dynamic/components/DatePicker/package.json +1 -1
  26. package/dist/dynamic/components/DescriptionList/package.json +1 -1
  27. package/dist/dynamic/components/Divider/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/Hero/package.json +1 -1
  38. package/dist/dynamic/components/Hint/package.json +1 -1
  39. package/dist/dynamic/components/Icon/package.json +1 -1
  40. package/dist/dynamic/components/InputGroup/package.json +1 -1
  41. package/dist/dynamic/components/JumpLinks/package.json +1 -1
  42. package/dist/dynamic/components/Label/package.json +1 -1
  43. package/dist/dynamic/components/List/package.json +1 -1
  44. package/dist/dynamic/components/LoginPage/package.json +1 -1
  45. package/dist/dynamic/components/Masthead/package.json +1 -1
  46. package/dist/dynamic/components/Menu/package.json +1 -1
  47. package/dist/dynamic/components/MenuToggle/package.json +1 -1
  48. package/dist/dynamic/components/Modal/package.json +1 -1
  49. package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
  50. package/dist/dynamic/components/Nav/package.json +1 -1
  51. package/dist/dynamic/components/NotificationBadge/package.json +1 -1
  52. package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
  53. package/dist/dynamic/components/NumberInput/package.json +1 -1
  54. package/dist/dynamic/components/OverflowMenu/package.json +1 -1
  55. package/dist/dynamic/components/Page/package.json +1 -1
  56. package/dist/dynamic/components/Pagination/package.json +1 -1
  57. package/dist/dynamic/components/Panel/package.json +1 -1
  58. package/dist/dynamic/components/Popover/package.json +1 -1
  59. package/dist/dynamic/components/Progress/package.json +1 -1
  60. package/dist/dynamic/components/ProgressStepper/package.json +1 -1
  61. package/dist/dynamic/components/Radio/package.json +1 -1
  62. package/dist/dynamic/components/SearchInput/package.json +1 -1
  63. package/dist/dynamic/components/Select/package.json +1 -1
  64. package/dist/dynamic/components/Sidebar/package.json +1 -1
  65. package/dist/dynamic/components/SimpleList/package.json +1 -1
  66. package/dist/dynamic/components/Skeleton/package.json +1 -1
  67. package/dist/dynamic/components/SkipToContent/package.json +1 -1
  68. package/dist/dynamic/components/Slider/package.json +1 -1
  69. package/dist/dynamic/components/Spinner/package.json +1 -1
  70. package/dist/dynamic/components/Switch/package.json +1 -1
  71. package/dist/dynamic/components/Tabs/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/TimePicker/package.json +1 -1
  76. package/dist/dynamic/components/Timestamp/package.json +1 -1
  77. package/dist/dynamic/components/Title/package.json +1 -1
  78. package/dist/dynamic/components/ToggleGroup/package.json +1 -1
  79. package/dist/dynamic/components/Toolbar/package.json +1 -1
  80. package/dist/dynamic/components/Tooltip/package.json +1 -1
  81. package/dist/dynamic/components/TreeView/package.json +1 -1
  82. package/dist/dynamic/components/Truncate/package.json +1 -1
  83. package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
  84. package/dist/dynamic/components/Wizard/package.json +1 -1
  85. package/dist/dynamic/deprecated/components/Chip/package.json +1 -1
  86. package/dist/dynamic/deprecated/components/DragDrop/package.json +1 -1
  87. package/dist/dynamic/deprecated/components/DualListSelector/package.json +1 -1
  88. package/dist/dynamic/deprecated/components/Modal/package.json +1 -1
  89. package/dist/dynamic/deprecated/components/Tile/package.json +1 -1
  90. package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
  91. package/dist/dynamic/deprecated/components/package.json +1 -1
  92. package/dist/dynamic/helpers/AnimationsProvider/AnimationsProvider/package.json +1 -1
  93. package/dist/dynamic/helpers/AnimationsProvider/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/SSRSafeIds/SSRSafeIds/package.json +1 -1
  100. package/dist/dynamic/helpers/constants/package.json +1 -1
  101. package/dist/dynamic/helpers/datetimeUtils/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/inert/package.json +1 -1
  105. package/dist/dynamic/helpers/package.json +1 -1
  106. package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
  107. package/dist/dynamic/helpers/typeUtils/package.json +1 -1
  108. package/dist/dynamic/helpers/useInterval/package.json +1 -1
  109. package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
  110. package/dist/dynamic/helpers/useSSRSafeId/package.json +1 -1
  111. package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
  112. package/dist/dynamic/helpers/util/package.json +1 -1
  113. package/dist/dynamic/layouts/Bullseye/package.json +1 -1
  114. package/dist/dynamic/layouts/Flex/package.json +1 -1
  115. package/dist/dynamic/layouts/Gallery/package.json +1 -1
  116. package/dist/dynamic/layouts/Grid/package.json +1 -1
  117. package/dist/dynamic/layouts/Level/package.json +1 -1
  118. package/dist/dynamic/layouts/Split/package.json +1 -1
  119. package/dist/dynamic/layouts/Stack/package.json +1 -1
  120. package/dist/dynamic/styles/package.json +1 -1
  121. package/dist/esm/components/CalendarMonth/CalendarMonth.d.ts +7 -2
  122. package/dist/esm/components/CalendarMonth/CalendarMonth.d.ts.map +1 -1
  123. package/dist/esm/components/CalendarMonth/CalendarMonth.js +4 -3
  124. package/dist/esm/components/CalendarMonth/CalendarMonth.js.map +1 -1
  125. package/dist/esm/components/Drawer/Drawer.d.ts +6 -1
  126. package/dist/esm/components/Drawer/Drawer.d.ts.map +1 -1
  127. package/dist/esm/components/Drawer/Drawer.js +4 -2
  128. package/dist/esm/components/Drawer/Drawer.js.map +1 -1
  129. package/dist/esm/components/Drawer/DrawerCloseButton.d.ts +3 -0
  130. package/dist/esm/components/Drawer/DrawerCloseButton.d.ts.map +1 -1
  131. package/dist/esm/components/Drawer/DrawerCloseButton.js +4 -2
  132. package/dist/esm/components/Drawer/DrawerCloseButton.js.map +1 -1
  133. package/dist/esm/components/DualListSelector/DualListSelector.d.ts +6 -1
  134. package/dist/esm/components/DualListSelector/DualListSelector.d.ts.map +1 -1
  135. package/dist/esm/components/DualListSelector/DualListSelector.js +4 -4
  136. package/dist/esm/components/DualListSelector/DualListSelector.js.map +1 -1
  137. package/dist/esm/components/Popover/Popover.d.ts +6 -1
  138. package/dist/esm/components/Popover/Popover.d.ts.map +1 -1
  139. package/dist/esm/components/Popover/Popover.js +4 -4
  140. package/dist/esm/components/Popover/Popover.js.map +1 -1
  141. package/dist/esm/components/Progress/Progress.d.ts +6 -1
  142. package/dist/esm/components/Progress/Progress.d.ts.map +1 -1
  143. package/dist/esm/components/Progress/Progress.js +5 -4
  144. package/dist/esm/components/Progress/Progress.js.map +1 -1
  145. package/dist/esm/components/Slider/Slider.d.ts +6 -1
  146. package/dist/esm/components/Slider/Slider.d.ts.map +1 -1
  147. package/dist/esm/components/Slider/Slider.js +4 -2
  148. package/dist/esm/components/Slider/Slider.js.map +1 -1
  149. package/dist/js/components/CalendarMonth/CalendarMonth.d.ts +7 -2
  150. package/dist/js/components/CalendarMonth/CalendarMonth.d.ts.map +1 -1
  151. package/dist/js/components/CalendarMonth/CalendarMonth.js +3 -2
  152. package/dist/js/components/CalendarMonth/CalendarMonth.js.map +1 -1
  153. package/dist/js/components/Drawer/Drawer.d.ts +6 -1
  154. package/dist/js/components/Drawer/Drawer.d.ts.map +1 -1
  155. package/dist/js/components/Drawer/Drawer.js +4 -2
  156. package/dist/js/components/Drawer/Drawer.js.map +1 -1
  157. package/dist/js/components/Drawer/DrawerCloseButton.d.ts +3 -0
  158. package/dist/js/components/Drawer/DrawerCloseButton.d.ts.map +1 -1
  159. package/dist/js/components/Drawer/DrawerCloseButton.js +4 -2
  160. package/dist/js/components/Drawer/DrawerCloseButton.js.map +1 -1
  161. package/dist/js/components/DualListSelector/DualListSelector.d.ts +6 -1
  162. package/dist/js/components/DualListSelector/DualListSelector.d.ts.map +1 -1
  163. package/dist/js/components/DualListSelector/DualListSelector.js +4 -4
  164. package/dist/js/components/DualListSelector/DualListSelector.js.map +1 -1
  165. package/dist/js/components/Popover/Popover.d.ts +6 -1
  166. package/dist/js/components/Popover/Popover.d.ts.map +1 -1
  167. package/dist/js/components/Popover/Popover.js +4 -4
  168. package/dist/js/components/Popover/Popover.js.map +1 -1
  169. package/dist/js/components/Progress/Progress.d.ts +6 -1
  170. package/dist/js/components/Progress/Progress.d.ts.map +1 -1
  171. package/dist/js/components/Progress/Progress.js +4 -3
  172. package/dist/js/components/Progress/Progress.js.map +1 -1
  173. package/dist/js/components/Slider/Slider.d.ts +6 -1
  174. package/dist/js/components/Slider/Slider.d.ts.map +1 -1
  175. package/dist/js/components/Slider/Slider.js +4 -2
  176. package/dist/js/components/Slider/Slider.js.map +1 -1
  177. package/dist/umd/assets/{output-lAo4DFMr.css → output-eXFa6Wof.css} +18077 -18077
  178. package/dist/umd/react-core.min.js +1 -1
  179. package/helpers/package.json +1 -1
  180. package/layouts/package.json +1 -1
  181. package/next/package.json +1 -1
  182. package/package.json +2 -2
  183. package/src/components/CalendarMonth/CalendarMonth.tsx +10 -3
  184. package/src/components/CalendarMonth/__tests__/CalendarMonth.test.tsx +20 -0
  185. package/src/components/Compass/__tests__/__snapshots__/Compass.test.tsx.snap +3 -0
  186. package/src/components/Compass/__tests__/__snapshots__/CompassContent.test.tsx.snap +3 -0
  187. package/src/components/DatePicker/__tests__/__snapshots__/DatePicker.test.tsx.snap +17 -11
  188. package/src/components/Drawer/Drawer.tsx +10 -1
  189. package/src/components/Drawer/DrawerCloseButton.tsx +20 -6
  190. package/src/components/Drawer/__tests__/Drawer.test.tsx +45 -1
  191. package/src/components/Drawer/__tests__/DrawerCloseButton.test.tsx +39 -0
  192. package/src/components/Drawer/__tests__/__snapshots__/Drawer.test.tsx.snap +38 -14
  193. package/src/components/DualListSelector/DualListSelector.tsx +10 -3
  194. package/src/components/DualListSelector/__tests__/DualListSelector.test.tsx +25 -0
  195. package/src/components/DualListSelector/__tests__/__snapshots__/DualListSelector.test.tsx.snap +13 -0
  196. package/src/components/MultipleFileUpload/__tests__/__snapshots__/MultipleFileUploadStatusItem.test.tsx.snap +16 -0
  197. package/src/components/Popover/Popover.tsx +10 -3
  198. package/src/components/Popover/__tests__/Popover.test.tsx +44 -1
  199. package/src/components/Progress/Progress.tsx +11 -3
  200. package/src/components/Progress/__tests__/Progress.test.tsx +21 -1
  201. package/src/components/Progress/__tests__/__snapshots__/Progress.test.tsx.snap +41 -0
  202. package/src/components/Slider/Slider.tsx +10 -1
  203. package/src/components/Slider/__tests__/Slider.test.tsx +21 -1
  204. package/src/components/Slider/__tests__/__snapshots__/Slider.test.tsx.snap +33 -6
  205. package/src/helpers/OUIA/OUIA.md +6 -0
@@ -1,14 +1,13 @@
1
1
  import styles from '@patternfly/react-styles/css/components/DualListSelector/dual-list-selector';
2
2
  import { css } from '@patternfly/react-styles';
3
- import { useSSRSafeId } from '../../helpers';
3
+ import { useSSRSafeId, useOUIAProps, OUIAProps, useHasAnimations } from '../../helpers';
4
4
  import { DualListSelectorContext } from './DualListSelectorContext';
5
- import { useHasAnimations } from '../../helpers';
6
5
 
7
6
  /** Acts as a container for all other DualListSelector sub-components when using a
8
7
  * composable dual list selector.
9
8
  */
10
9
 
11
- export interface DualListSelectorProps {
10
+ export interface DualListSelectorProps extends OUIAProps {
12
11
  /** Additional classes applied to the dual list selector. */
13
12
  className?: string;
14
13
  /** ID of the dual list selector. */
@@ -22,6 +21,10 @@ export interface DualListSelectorProps {
22
21
  * the next breaking change release in favor of defaulting to always-rendered items.
23
22
  */
24
23
  hasAnimations?: boolean;
24
+ /** Value to overwrite the randomly generated data-ouia-component-id.*/
25
+ ouiaId?: number | string;
26
+ /** Set the value of data-ouia-safe. Only set to true when the component is in a static state, i.e. no animations are occurring. At all other times, this value must be false. */
27
+ ouiaSafe?: boolean;
25
28
  }
26
29
 
27
30
  export const DualListSelector: React.FunctionComponent<DualListSelectorProps> = ({
@@ -30,10 +33,13 @@ export const DualListSelector: React.FunctionComponent<DualListSelectorProps> =
30
33
  id,
31
34
  isTree = false,
32
35
  hasAnimations: hasAnimationsProp,
36
+ ouiaId,
37
+ ouiaSafe = true,
33
38
  ...props
34
39
  }: DualListSelectorProps) => {
35
40
  const hasAnimations = useHasAnimations(hasAnimationsProp);
36
41
  const randomId = useSSRSafeId();
42
+ const ouiaProps = useOUIAProps(DualListSelector.displayName, ouiaId, ouiaSafe);
37
43
 
38
44
  return (
39
45
  <DualListSelectorContext.Provider value={{ isTree, hasAnimations }}>
@@ -41,6 +47,7 @@ export const DualListSelector: React.FunctionComponent<DualListSelectorProps> =
41
47
  className={css(styles.dualListSelector, hasAnimations && isTree && styles.modifiers.animateExpand, className)}
42
48
  id={id || randomId}
43
49
  {...props}
50
+ {...ouiaProps}
44
51
  >
45
52
  {children}
46
53
  </div>
@@ -59,6 +59,31 @@ describe('Opt-in animations', () => {
59
59
  });
60
60
  });
61
61
 
62
+ test('Matches snapshot', () => {
63
+ const { asFragment } = render(<DualListSelector ouiaId="ouia-id" data-testid="test-id" />);
64
+ expect(asFragment()).toMatchSnapshot();
65
+ });
66
+
67
+ test('Renders with custom ouiaId', () => {
68
+ render(<DualListSelector data-testid="test-id" ouiaId="test-id" />);
69
+ expect(screen.getByTestId('test-id')).toHaveAttribute('data-ouia-component-id', 'test-id');
70
+ });
71
+
72
+ test('Renders with expected ouia component type', () => {
73
+ render(<DualListSelector data-testid="test-id" ouiaId="test-id" />);
74
+ expect(screen.getByTestId('test-id')).toHaveAttribute('data-ouia-component-type', 'PF6/DualListSelector');
75
+ });
76
+
77
+ test('Renders with ouiaSafe defaulting to true', () => {
78
+ render(<DualListSelector data-testid="test-id" ouiaId="test-id" />);
79
+ expect(screen.getByTestId('test-id')).toHaveAttribute('data-ouia-safe', 'true');
80
+ });
81
+
82
+ test('Renders with ouiaSafe=false when specified', () => {
83
+ render(<DualListSelector data-testid="test-id" ouiaId="test-id" ouiaSafe={false} />);
84
+ expect(screen.getByTestId('test-id')).toHaveAttribute('data-ouia-safe', 'false');
85
+ });
86
+
62
87
  // Following tests should be moved to a separate DualListSelectorPane test file
63
88
  describe('DualListSelector', () => {
64
89
  test('basic', () => {
@@ -120,3 +120,16 @@ exports[`DualListSelector with search inputs 1`] = `
120
120
  </div>
121
121
  </DocumentFragment>
122
122
  `;
123
+
124
+ exports[`Matches snapshot 1`] = `
125
+ <DocumentFragment>
126
+ <div
127
+ class="pf-v6-c-dual-list-selector"
128
+ data-ouia-component-id="ouia-id"
129
+ data-ouia-component-type="PF6/DualListSelector"
130
+ data-ouia-safe="true"
131
+ data-testid="test-id"
132
+ id="pf-:re:"
133
+ />
134
+ </DocumentFragment>
135
+ `;
@@ -33,6 +33,8 @@ exports[`MultipleFileUploadStatusItem renders custom aria labels 1`] = `
33
33
  </div>
34
34
  <div
35
35
  class="pf-v6-c-progress"
36
+ data-ouia-component-type="PF6/Progress"
37
+ data-ouia-safe="true"
36
38
  id="test-progress-id"
37
39
  >
38
40
  <div
@@ -152,6 +154,8 @@ exports[`MultipleFileUploadStatusItem renders custom class names 1`] = `
152
154
  </div>
153
155
  <div
154
156
  class="pf-v6-c-progress"
157
+ data-ouia-component-type="PF6/Progress"
158
+ data-ouia-safe="true"
155
159
  id="test-progress-id"
156
160
  >
157
161
  <div
@@ -268,6 +272,8 @@ exports[`MultipleFileUploadStatusItem renders custom file name/size/icon/progres
268
272
  </div>
269
273
  <div
270
274
  class="pf-v6-c-progress"
275
+ data-ouia-component-type="PF6/Progress"
276
+ data-ouia-safe="true"
271
277
  id="test-progress-id"
272
278
  >
273
279
  <div
@@ -386,6 +392,8 @@ exports[`MultipleFileUploadStatusItem renders custom function progressAriaLiveMe
386
392
  </div>
387
393
  <div
388
394
  class="pf-v6-c-progress"
395
+ data-ouia-component-type="PF6/Progress"
396
+ data-ouia-safe="true"
389
397
  id="test-progress-id"
390
398
  >
391
399
  <div
@@ -504,6 +512,8 @@ exports[`MultipleFileUploadStatusItem renders custom progress value/variant when
504
512
  </div>
505
513
  <div
506
514
  class="pf-v6-c-progress pf-m-warning"
515
+ data-ouia-component-type="PF6/Progress"
516
+ data-ouia-safe="true"
507
517
  id="test-progress-id"
508
518
  >
509
519
  <div
@@ -639,6 +649,8 @@ exports[`MultipleFileUploadStatusItem renders expected values from a passed file
639
649
  </div>
640
650
  <div
641
651
  class="pf-v6-c-progress"
652
+ data-ouia-component-type="PF6/Progress"
653
+ data-ouia-safe="true"
642
654
  id="test-progress-id"
643
655
  >
644
656
  <div
@@ -757,6 +769,8 @@ exports[`MultipleFileUploadStatusItem renders with expected class names 1`] = `
757
769
  </div>
758
770
  <div
759
771
  class="pf-v6-c-progress"
772
+ data-ouia-component-type="PF6/Progress"
773
+ data-ouia-safe="true"
760
774
  id="test-progress-id"
761
775
  >
762
776
  <div
@@ -873,6 +887,8 @@ exports[`MultipleFileUploadStatusItem rendersdefault progressAriaLiveMessage whe
873
887
  </div>
874
888
  <div
875
889
  class="pf-v6-c-progress"
890
+ data-ouia-component-type="PF6/Progress"
891
+ data-ouia-safe="true"
876
892
  id="test-progress-id"
877
893
  >
878
894
  <div
@@ -11,9 +11,8 @@ import { PopoverCloseButton } from './PopoverCloseButton';
11
11
  import { PopoverArrow } from './PopoverArrow';
12
12
  import popoverMaxWidth from '@patternfly/react-tokens/dist/esm/c_popover_MaxWidth';
13
13
  import popoverMinWidth from '@patternfly/react-tokens/dist/esm/c_popover_MinWidth';
14
- import { FocusTrap } from '../../helpers';
14
+ import { FocusTrap, useSSRSafeId, useOUIAProps, OUIAProps } from '../../helpers';
15
15
  import { Popper } from '../../helpers/Popper/Popper';
16
- import { useSSRSafeId } from '../../helpers';
17
16
 
18
17
  export enum PopoverPosition {
19
18
  auto = 'auto',
@@ -35,7 +34,7 @@ export enum PopoverPosition {
35
34
  * that has a property specifically for passing in popover properties.
36
35
  */
37
36
 
38
- export interface PopoverProps {
37
+ export interface PopoverProps extends OUIAProps {
39
38
  /** Text announced by screen reader when alert severity variant is set to indicate
40
39
  * severity level.
41
40
  */
@@ -213,6 +212,10 @@ export interface PopoverProps {
213
212
  withFocusTrap?: boolean;
214
213
  /** The z-index of the popover. */
215
214
  zIndex?: number;
215
+ /** Value to overwrite the randomly generated data-ouia-component-id.*/
216
+ ouiaId?: number | string;
217
+ /** Set the value of data-ouia-safe. Only set to true when the component is in a static state, i.e. no animations are occurring. At all other times, this value must be false. */
218
+ ouiaSafe?: boolean;
216
219
  }
217
220
 
218
221
  const alertStyle = {
@@ -274,12 +277,15 @@ export const Popover: React.FunctionComponent<PopoverProps> = ({
274
277
  hasNoPadding = false,
275
278
  hasAutoWidth = false,
276
279
  elementToFocus,
280
+ ouiaId,
281
+ ouiaSafe = true,
277
282
  ...rest
278
283
  }: PopoverProps) => {
279
284
  // could make this a prop in the future (true | false | 'toggle')
280
285
  // const hideOnClick = true;
281
286
  const generatedId = useSSRSafeId();
282
287
  const uniqueId = id || generatedId;
288
+ const ouiaProps = useOUIAProps(Popover.displayName, ouiaId, ouiaSafe);
283
289
  const triggerManually = isVisible !== null;
284
290
  const [visible, setVisible] = useState(false);
285
291
  const [focusTrapActive, setFocusTrapActive] = useState(Boolean(propWithFocusTrap));
@@ -475,6 +481,7 @@ export const Popover: React.FunctionComponent<PopoverProps> = ({
475
481
  maxWidth: hasCustomMaxWidth ? maxWidth : null
476
482
  }}
477
483
  {...rest}
484
+ {...ouiaProps}
478
485
  >
479
486
  <PopoverArrow />
480
487
  <PopoverContent>
@@ -1,5 +1,5 @@
1
1
  import { StrictMode } from 'react';
2
- import { render } from '@testing-library/react';
2
+ import { render, screen } from '@testing-library/react';
3
3
  import { Popover, PopoverPosition } from '../Popover';
4
4
 
5
5
  test('popover renders close-button, header and body', () => {
@@ -9,6 +9,7 @@ test('popover renders close-button, header and body', () => {
9
9
  position="top"
10
10
  isVisible
11
11
  hideOnOutsideClick
12
+ ouiaId="ouia-id"
12
13
  headerContent={<div>Popover Header</div>}
13
14
  bodyContent={
14
15
  <div>
@@ -114,3 +115,45 @@ test('popover renders in strict mode', () => {
114
115
  expect(consoleError).not.toHaveBeenCalled();
115
116
  expect(asFragment()).toMatchSnapshot();
116
117
  });
118
+
119
+ test('Renders with custom ouiaId', () => {
120
+ render(
121
+ <Popover isVisible ouiaId="test-id" headerContent={<div>Popover Header</div>} bodyContent={<div>Popover body</div>}>
122
+ <div>Toggle Popover</div>
123
+ </Popover>
124
+ );
125
+ expect(screen.getByRole('dialog')).toHaveAttribute('data-ouia-component-id', 'test-id');
126
+ });
127
+
128
+ test('Renders with expected ouia component type', () => {
129
+ render(
130
+ <Popover isVisible ouiaId="test-id" headerContent={<div>Popover Header</div>} bodyContent={<div>Popover body</div>}>
131
+ <div>Toggle Popover</div>
132
+ </Popover>
133
+ );
134
+ expect(screen.getByRole('dialog')).toHaveAttribute('data-ouia-component-type', 'PF6/Popover');
135
+ });
136
+
137
+ test('Renders with ouiaSafe defaulting to true', () => {
138
+ render(
139
+ <Popover isVisible ouiaId="test-id" headerContent={<div>Popover Header</div>} bodyContent={<div>Popover body</div>}>
140
+ <div>Toggle Popover</div>
141
+ </Popover>
142
+ );
143
+ expect(screen.getByRole('dialog')).toHaveAttribute('data-ouia-safe', 'true');
144
+ });
145
+
146
+ test('Renders with ouiaSafe=false when specified', () => {
147
+ render(
148
+ <Popover
149
+ isVisible
150
+ ouiaId="test-id"
151
+ ouiaSafe={false}
152
+ headerContent={<div>Popover Header</div>}
153
+ bodyContent={<div>Popover body</div>}
154
+ >
155
+ <div>Toggle Popover</div>
156
+ </Popover>
157
+ );
158
+ expect(screen.getByRole('dialog')).toHaveAttribute('data-ouia-safe', 'false');
159
+ });
@@ -3,7 +3,7 @@ import styles from '@patternfly/react-styles/css/components/Progress/progress';
3
3
  import { css } from '@patternfly/react-styles';
4
4
  import { ProgressContainer, ProgressMeasureLocation } from './ProgressContainer';
5
5
  import { AriaProps } from './ProgressBar';
6
- import { GenerateId } from '../../helpers';
6
+ import { GenerateId, getOUIAProps, OUIAProps } from '../../helpers';
7
7
 
8
8
  export enum ProgressSize {
9
9
  sm = 'sm',
@@ -11,7 +11,7 @@ export enum ProgressSize {
11
11
  lg = 'lg'
12
12
  }
13
13
 
14
- export interface ProgressProps extends Omit<React.HTMLProps<HTMLDivElement>, 'size' | 'label' | 'title'> {
14
+ export interface ProgressProps extends Omit<React.HTMLProps<HTMLDivElement>, 'size' | 'label' | 'title'>, OUIAProps {
15
15
  /** Classname for progress component. */
16
16
  className?: string;
17
17
  /** Size variant of progress. */
@@ -50,6 +50,10 @@ export interface ProgressProps extends Omit<React.HTMLProps<HTMLDivElement>, 'si
50
50
  helperText?: React.ReactNode;
51
51
  /** Flag indicating whether the status icon should be hidden, helpful when space is limited (such as within table cells). When set to true, you must ensure the context of the status is provided in another way, such as via the progress measure. */
52
52
  hideStatusIcon?: boolean;
53
+ /** Value to overwrite the randomly generated data-ouia-component-id.*/
54
+ ouiaId?: number | string;
55
+ /** Set the value of data-ouia-safe. Only set to true when the component is in a static state, i.e. no animations are occurring. At all other times, this value must be false. */
56
+ ouiaSafe?: boolean;
53
57
  }
54
58
 
55
59
  class Progress extends Component<ProgressProps> {
@@ -70,7 +74,8 @@ class Progress extends Component<ProgressProps> {
70
74
  tooltipPosition: 'top' as 'auto' | 'top' | 'bottom' | 'left' | 'right',
71
75
  'aria-label': null as string,
72
76
  'aria-labelledby': null as string,
73
- 'aria-describedby': null as string
77
+ 'aria-describedby': null as string,
78
+ ouiaSafe: true
74
79
  };
75
80
 
76
81
  render() {
@@ -94,6 +99,8 @@ class Progress extends Component<ProgressProps> {
94
99
  'aria-describedby': ariaDescribedBy,
95
100
  helperText,
96
101
  hideStatusIcon,
102
+ ouiaId,
103
+ ouiaSafe,
97
104
  ...props
98
105
  } = this.props;
99
106
 
@@ -147,6 +154,7 @@ class Progress extends Component<ProgressProps> {
147
154
  className
148
155
  )}
149
156
  id={id}
157
+ {...getOUIAProps(Progress.displayName, ouiaId, ouiaSafe)}
150
158
  >
151
159
  <ProgressContainer
152
160
  parentId={id}
@@ -3,7 +3,7 @@ import { Progress, ProgressSize } from '../Progress';
3
3
  import { ProgressVariant, ProgressMeasureLocation } from '../ProgressContainer';
4
4
 
5
5
  test('Simple progress', () => {
6
- const { asFragment } = render(<Progress value={33} id="progress-simple-example" />);
6
+ const { asFragment } = render(<Progress value={33} id="progress-simple-example" ouiaId="ouia-id" />);
7
7
  expect(asFragment()).toMatchSnapshot();
8
8
  });
9
9
 
@@ -109,6 +109,26 @@ test('Renders passed helper text', () => {
109
109
  expect(screen.getByText('Test helper text')).toBeVisible();
110
110
  });
111
111
 
112
+ test('Renders with custom ouiaId', () => {
113
+ render(<Progress value={33} id="progress-ouia-id" ouiaId="test-id" title="Test" />);
114
+ expect(document.getElementById('progress-ouia-id')).toHaveAttribute('data-ouia-component-id', 'test-id');
115
+ });
116
+
117
+ test('Renders with expected ouia component type', () => {
118
+ render(<Progress value={33} id="progress-ouia-type" ouiaId="test-id" title="Test" />);
119
+ expect(document.getElementById('progress-ouia-type')).toHaveAttribute('data-ouia-component-type', 'PF6/Progress');
120
+ });
121
+
122
+ test('Renders with ouiaSafe defaulting to true', () => {
123
+ render(<Progress value={33} id="progress-ouia-safe" ouiaId="test-id" title="Test" />);
124
+ expect(document.getElementById('progress-ouia-safe')).toHaveAttribute('data-ouia-safe', 'true');
125
+ });
126
+
127
+ test('Renders with ouiaSafe=false when specified', () => {
128
+ render(<Progress value={33} id="progress-ouia-unsafe" ouiaId="test-id" ouiaSafe={false} title="Test" />);
129
+ expect(document.getElementById('progress-ouia-unsafe')).toHaveAttribute('data-ouia-safe', 'false');
130
+ });
131
+
112
132
  describe('hideStatusIcon prop behavior', () => {
113
133
  test('shows status icon by default when hideStatusIcon is not set', () => {
114
134
  render(<Progress id="default-status-icon-test" value={100} variant="success" />);
@@ -4,6 +4,8 @@ exports[`Progress measure location inside 1`] = `
4
4
  <DocumentFragment>
5
5
  <div
6
6
  class="pf-v6-c-progress pf-m-inside pf-m-lg pf-m-singleline"
7
+ data-ouia-component-type="PF6/Progress"
8
+ data-ouia-safe="true"
7
9
  id="inside-progress"
8
10
  >
9
11
  <div
@@ -36,6 +38,8 @@ exports[`Progress measure location inside and small should render large 1`] = `
36
38
  <DocumentFragment>
37
39
  <div
38
40
  class="pf-v6-c-progress pf-m-inside pf-m-lg pf-m-singleline"
41
+ data-ouia-component-type="PF6/Progress"
42
+ data-ouia-safe="true"
39
43
  id="large-progress"
40
44
  >
41
45
  <div
@@ -68,6 +72,8 @@ exports[`Progress measure location none 1`] = `
68
72
  <DocumentFragment>
69
73
  <div
70
74
  class="pf-v6-c-progress pf-m-singleline"
75
+ data-ouia-component-type="PF6/Progress"
76
+ data-ouia-safe="true"
71
77
  id="none-progress"
72
78
  >
73
79
  <div
@@ -94,6 +100,8 @@ exports[`Progress measure location outside 1`] = `
94
100
  <DocumentFragment>
95
101
  <div
96
102
  class="pf-v6-c-progress pf-m-outside pf-m-singleline"
103
+ data-ouia-component-type="PF6/Progress"
104
+ data-ouia-safe="true"
97
105
  id="outside-progress"
98
106
  >
99
107
  <div
@@ -130,6 +138,8 @@ exports[`Progress measure location top 1`] = `
130
138
  <DocumentFragment>
131
139
  <div
132
140
  class="pf-v6-c-progress pf-m-singleline"
141
+ data-ouia-component-type="PF6/Progress"
142
+ data-ouia-safe="true"
133
143
  id="top-progress"
134
144
  >
135
145
  <div
@@ -166,6 +176,8 @@ exports[`Progress size lg 1`] = `
166
176
  <DocumentFragment>
167
177
  <div
168
178
  class="pf-v6-c-progress pf-m-lg pf-m-singleline"
179
+ data-ouia-component-type="PF6/Progress"
180
+ data-ouia-safe="true"
169
181
  id="lg-progress"
170
182
  >
171
183
  <div
@@ -202,6 +214,8 @@ exports[`Progress size md 1`] = `
202
214
  <DocumentFragment>
203
215
  <div
204
216
  class="pf-v6-c-progress pf-m-singleline"
217
+ data-ouia-component-type="PF6/Progress"
218
+ data-ouia-safe="true"
205
219
  id="md-progress"
206
220
  >
207
221
  <div
@@ -238,6 +252,8 @@ exports[`Progress size sm 1`] = `
238
252
  <DocumentFragment>
239
253
  <div
240
254
  class="pf-v6-c-progress pf-m-sm pf-m-singleline"
255
+ data-ouia-component-type="PF6/Progress"
256
+ data-ouia-safe="true"
241
257
  id="sm-progress"
242
258
  >
243
259
  <div
@@ -274,6 +290,8 @@ exports[`Progress variant danger 1`] = `
274
290
  <DocumentFragment>
275
291
  <div
276
292
  class="pf-v6-c-progress pf-m-danger pf-m-singleline"
293
+ data-ouia-component-type="PF6/Progress"
294
+ data-ouia-safe="true"
277
295
  id="danger-progress"
278
296
  >
279
297
  <div
@@ -327,6 +345,8 @@ exports[`Progress variant success 1`] = `
327
345
  <DocumentFragment>
328
346
  <div
329
347
  class="pf-v6-c-progress pf-m-success pf-m-singleline"
348
+ data-ouia-component-type="PF6/Progress"
349
+ data-ouia-safe="true"
330
350
  id="success-progress"
331
351
  >
332
352
  <div
@@ -380,6 +400,8 @@ exports[`Progress variant warning 1`] = `
380
400
  <DocumentFragment>
381
401
  <div
382
402
  class="pf-v6-c-progress pf-m-warning pf-m-singleline"
403
+ data-ouia-component-type="PF6/Progress"
404
+ data-ouia-safe="true"
383
405
  id="warning-progress"
384
406
  >
385
407
  <div
@@ -433,6 +455,8 @@ exports[`Progress with aria-valuetext 1`] = `
433
455
  <DocumentFragment>
434
456
  <div
435
457
  class="pf-v6-c-progress pf-m-singleline"
458
+ data-ouia-component-type="PF6/Progress"
459
+ data-ouia-safe="true"
436
460
  id="progress-aria-valuetext"
437
461
  >
438
462
  <div
@@ -470,6 +494,9 @@ exports[`Simple progress 1`] = `
470
494
  <DocumentFragment>
471
495
  <div
472
496
  class="pf-v6-c-progress pf-m-singleline"
497
+ data-ouia-component-id="ouia-id"
498
+ data-ouia-component-type="PF6/Progress"
499
+ data-ouia-safe="true"
473
500
  id="progress-simple-example"
474
501
  >
475
502
  <div
@@ -506,6 +533,8 @@ exports[`additional label 1`] = `
506
533
  <DocumentFragment>
507
534
  <div
508
535
  class="pf-v6-c-progress pf-m-singleline"
536
+ data-ouia-component-type="PF6/Progress"
537
+ data-ouia-safe="true"
509
538
  id="additional-label"
510
539
  >
511
540
  <div
@@ -542,6 +571,8 @@ exports[`no value specified 1`] = `
542
571
  <DocumentFragment>
543
572
  <div
544
573
  class="pf-v6-c-progress pf-m-singleline"
574
+ data-ouia-component-type="PF6/Progress"
575
+ data-ouia-safe="true"
545
576
  id="no-value"
546
577
  >
547
578
  <div
@@ -578,6 +609,8 @@ exports[`value higher than maxValue 1`] = `
578
609
  <DocumentFragment>
579
610
  <div
580
611
  class="pf-v6-c-progress pf-m-singleline"
612
+ data-ouia-component-type="PF6/Progress"
613
+ data-ouia-safe="true"
581
614
  id="higher-max-value"
582
615
  >
583
616
  <div
@@ -614,6 +647,8 @@ exports[`value lower than minValue 1`] = `
614
647
  <DocumentFragment>
615
648
  <div
616
649
  class="pf-v6-c-progress pf-m-singleline"
650
+ data-ouia-component-type="PF6/Progress"
651
+ data-ouia-safe="true"
617
652
  id="lower-min-value"
618
653
  >
619
654
  <div
@@ -650,6 +685,8 @@ exports[`value scaled between minValue and maxValue 1`] = `
650
685
  <DocumentFragment>
651
686
  <div
652
687
  class="pf-v6-c-progress pf-m-singleline"
688
+ data-ouia-component-type="PF6/Progress"
689
+ data-ouia-safe="true"
653
690
  id="scaled-range-value"
654
691
  >
655
692
  <div
@@ -686,6 +723,8 @@ exports[`value scaled with maxValue 1`] = `
686
723
  <DocumentFragment>
687
724
  <div
688
725
  class="pf-v6-c-progress pf-m-singleline"
726
+ data-ouia-component-type="PF6/Progress"
727
+ data-ouia-safe="true"
689
728
  id="scaled-max-value"
690
729
  >
691
730
  <div
@@ -722,6 +761,8 @@ exports[`value scaled with minValue 1`] = `
722
761
  <DocumentFragment>
723
762
  <div
724
763
  class="pf-v6-c-progress pf-m-singleline"
764
+ data-ouia-component-type="PF6/Progress"
765
+ data-ouia-safe="true"
725
766
  id="scaled-min-value"
726
767
  >
727
768
  <div
@@ -8,6 +8,7 @@ import { Tooltip, TooltipProps } from '../Tooltip';
8
8
  import cssSliderValue from '@patternfly/react-tokens/dist/esm/c_slider_value';
9
9
  import cssFormControlWidthChars from '@patternfly/react-tokens/dist/esm/c_slider__value_c_form_control_width_chars';
10
10
  import { getLanguageDirection } from '../../helpers/util';
11
+ import { useOUIAProps, OUIAProps } from '../../helpers';
11
12
 
12
13
  /** Properties for creating custom steps in a slider. These properties should be passed in as
13
14
  * an object within an array to the slider component's customSteps property.
@@ -29,7 +30,7 @@ export type SliderOnChangeEvent =
29
30
  | React.FocusEvent<HTMLInputElement>;
30
31
 
31
32
  /** The main slider component. */
32
- export interface SliderProps extends Omit<React.HTMLProps<HTMLDivElement>, 'onChange'> {
33
+ export interface SliderProps extends Omit<React.HTMLProps<HTMLDivElement>, 'onChange'>, OUIAProps {
33
34
  /** Flag indicating if the slider is discrete for custom steps. This will cause the slider
34
35
  * to snap to the closest value.
35
36
  */
@@ -93,6 +94,10 @@ export interface SliderProps extends Omit<React.HTMLProps<HTMLDivElement>, 'onCh
93
94
  thumbAriaValueText?: string;
94
95
  /** Current value of the slider. */
95
96
  value?: number;
97
+ /** Value to overwrite the randomly generated data-ouia-component-id.*/
98
+ ouiaId?: number | string;
99
+ /** Set the value of data-ouia-safe. Only set to true when the component is in a static state, i.e. no animations are occurring. At all other times, this value must be false. */
100
+ ouiaSafe?: boolean;
96
101
  }
97
102
 
98
103
  const getPercentage = (current: number, max: number) => (100 * current) / max;
@@ -126,8 +131,11 @@ export const Slider: React.FunctionComponent<SliderProps> = ({
126
131
  showBoundaries = true,
127
132
  'aria-describedby': ariaDescribedby,
128
133
  'aria-labelledby': ariaLabelledby,
134
+ ouiaId,
135
+ ouiaSafe = true,
129
136
  ...props
130
137
  }: SliderProps) => {
138
+ const ouiaProps = useOUIAProps(Slider.displayName, ouiaId, ouiaSafe);
131
139
  const sliderRailRef = useRef<HTMLDivElement>(undefined);
132
140
  const thumbRef = useRef<HTMLDivElement>(undefined);
133
141
 
@@ -457,6 +465,7 @@ export const Slider: React.FunctionComponent<SliderProps> = ({
457
465
  className={css(styles.slider, className, isDisabled && styles.modifiers.disabled)}
458
466
  style={{ ...style, ...inputStyle }}
459
467
  {...props}
468
+ {...ouiaProps}
460
469
  >
461
470
  {(leftActions || startActions) && <div className={css(styles.sliderActions)}>{leftActions || startActions}</div>}
462
471
  <div className={css(styles.sliderMain)}>
@@ -5,7 +5,7 @@ import { Button } from '../../Button';
5
5
 
6
6
  describe('slider', () => {
7
7
  test('renders continuous slider', () => {
8
- const { asFragment } = render(<Slider value={50} isInputVisible inputValue={50} />);
8
+ const { asFragment } = render(<Slider value={50} isInputVisible inputValue={50} ouiaId="ouia-id" />);
9
9
  expect(asFragment()).toMatchSnapshot();
10
10
  });
11
11
 
@@ -91,6 +91,26 @@ describe('slider', () => {
91
91
  });
92
92
  });
93
93
 
94
+ test('Renders with custom ouiaId', () => {
95
+ const { container } = render(<Slider value={50} ouiaId="test-id" />);
96
+ expect(container.firstChild).toHaveAttribute('data-ouia-component-id', 'test-id');
97
+ });
98
+
99
+ test('Renders with expected ouia component type', () => {
100
+ const { container } = render(<Slider value={50} ouiaId="test-id" />);
101
+ expect(container.firstChild).toHaveAttribute('data-ouia-component-type', 'PF6/Slider');
102
+ });
103
+
104
+ test('Renders with ouiaSafe defaulting to true', () => {
105
+ const { container } = render(<Slider value={50} ouiaId="test-id" />);
106
+ expect(container.firstChild).toHaveAttribute('data-ouia-safe', 'true');
107
+ });
108
+
109
+ test('Renders with ouiaSafe=false when specified', () => {
110
+ const { container } = render(<Slider value={50} ouiaId="test-id" ouiaSafe={false} />);
111
+ expect(container.firstChild).toHaveAttribute('data-ouia-safe', 'false');
112
+ });
113
+
94
114
  test('renders slider with aria-labelledby', () => {
95
115
  render(
96
116
  <>