@patternfly/react-core 5.4.0-prerelease.20 → 5.4.0-prerelease.22

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 (182) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/components/package.json +1 -8
  3. package/deprecated/package.json +1 -8
  4. package/dist/dynamic/components/AboutModal/package.json +1 -8
  5. package/dist/dynamic/components/Accordion/package.json +1 -8
  6. package/dist/dynamic/components/ActionList/package.json +1 -8
  7. package/dist/dynamic/components/Alert/package.json +1 -8
  8. package/dist/dynamic/components/Avatar/package.json +1 -8
  9. package/dist/dynamic/components/BackToTop/package.json +1 -8
  10. package/dist/dynamic/components/Backdrop/package.json +1 -8
  11. package/dist/dynamic/components/BackgroundImage/package.json +1 -8
  12. package/dist/dynamic/components/Badge/package.json +1 -8
  13. package/dist/dynamic/components/Banner/package.json +1 -8
  14. package/dist/dynamic/components/Brand/package.json +1 -8
  15. package/dist/dynamic/components/Breadcrumb/package.json +1 -8
  16. package/dist/dynamic/components/Button/package.json +1 -8
  17. package/dist/dynamic/components/CalendarMonth/package.json +1 -8
  18. package/dist/dynamic/components/Card/package.json +1 -8
  19. package/dist/dynamic/components/Checkbox/package.json +1 -8
  20. package/dist/dynamic/components/Chip/package.json +1 -8
  21. package/dist/dynamic/components/ClipboardCopy/package.json +1 -8
  22. package/dist/dynamic/components/CodeBlock/package.json +1 -8
  23. package/dist/dynamic/components/DataList/package.json +1 -8
  24. package/dist/dynamic/components/DatePicker/package.json +1 -8
  25. package/dist/dynamic/components/DescriptionList/package.json +1 -8
  26. package/dist/dynamic/components/Divider/package.json +1 -8
  27. package/dist/dynamic/components/DragDrop/package.json +1 -8
  28. package/dist/dynamic/components/Drawer/package.json +1 -8
  29. package/dist/dynamic/components/Dropdown/package.json +1 -8
  30. package/dist/dynamic/components/DualListSelector/package.json +1 -8
  31. package/dist/dynamic/components/EmptyState/package.json +1 -8
  32. package/dist/dynamic/components/ExpandableSection/package.json +1 -8
  33. package/dist/dynamic/components/FileUpload/package.json +1 -8
  34. package/dist/dynamic/components/Form/package.json +1 -8
  35. package/dist/dynamic/components/FormSelect/package.json +1 -8
  36. package/dist/dynamic/components/HelperText/package.json +1 -8
  37. package/dist/dynamic/components/Hint/package.json +1 -8
  38. package/dist/dynamic/components/Icon/package.json +1 -8
  39. package/dist/dynamic/components/InputGroup/package.json +1 -8
  40. package/dist/dynamic/components/JumpLinks/package.json +1 -8
  41. package/dist/dynamic/components/Label/package.json +1 -8
  42. package/dist/dynamic/components/List/package.json +1 -8
  43. package/dist/dynamic/components/LoginPage/package.json +1 -8
  44. package/dist/dynamic/components/Masthead/package.json +1 -8
  45. package/dist/dynamic/components/Menu/package.json +1 -8
  46. package/dist/dynamic/components/MenuToggle/package.json +1 -8
  47. package/dist/dynamic/components/Modal/package.json +1 -8
  48. package/dist/dynamic/components/MultipleFileUpload/package.json +1 -8
  49. package/dist/dynamic/components/Nav/package.json +1 -8
  50. package/dist/dynamic/components/NotificationBadge/package.json +1 -8
  51. package/dist/dynamic/components/NotificationDrawer/package.json +1 -8
  52. package/dist/dynamic/components/NumberInput/package.json +1 -8
  53. package/dist/dynamic/components/OverflowMenu/package.json +1 -8
  54. package/dist/dynamic/components/Page/package.json +1 -8
  55. package/dist/dynamic/components/Pagination/package.json +1 -8
  56. package/dist/dynamic/components/Panel/package.json +1 -8
  57. package/dist/dynamic/components/Popover/package.json +1 -8
  58. package/dist/dynamic/components/Progress/package.json +1 -8
  59. package/dist/dynamic/components/ProgressStepper/package.json +1 -8
  60. package/dist/dynamic/components/Radio/package.json +1 -8
  61. package/dist/dynamic/components/SearchInput/package.json +1 -8
  62. package/dist/dynamic/components/Select/package.json +1 -8
  63. package/dist/dynamic/components/Sidebar/package.json +1 -8
  64. package/dist/dynamic/components/SimpleList/package.json +1 -8
  65. package/dist/dynamic/components/Skeleton/package.json +1 -8
  66. package/dist/dynamic/components/SkipToContent/package.json +1 -8
  67. package/dist/dynamic/components/Slider/package.json +1 -8
  68. package/dist/dynamic/components/Spinner/package.json +1 -8
  69. package/dist/dynamic/components/Switch/package.json +1 -8
  70. package/dist/dynamic/components/Tabs/package.json +1 -8
  71. package/dist/dynamic/components/Text/package.json +1 -8
  72. package/dist/dynamic/components/TextArea/package.json +1 -8
  73. package/dist/dynamic/components/TextInput/package.json +1 -8
  74. package/dist/dynamic/components/TextInputGroup/package.json +1 -8
  75. package/dist/dynamic/components/Tile/package.json +1 -8
  76. package/dist/dynamic/components/TimePicker/package.json +1 -8
  77. package/dist/dynamic/components/Timestamp/package.json +1 -8
  78. package/dist/dynamic/components/Title/package.json +1 -8
  79. package/dist/dynamic/components/ToggleGroup/package.json +1 -8
  80. package/dist/dynamic/components/Toolbar/package.json +1 -8
  81. package/dist/dynamic/components/Tooltip/package.json +1 -8
  82. package/dist/dynamic/components/TreeView/package.json +1 -8
  83. package/dist/dynamic/components/Truncate/package.json +1 -8
  84. package/dist/dynamic/components/Wizard/hooks/package.json +1 -8
  85. package/dist/dynamic/components/Wizard/package.json +1 -8
  86. package/dist/dynamic/deprecated/components/ApplicationLauncher/package.json +1 -8
  87. package/dist/dynamic/deprecated/components/ContextSelector/package.json +1 -8
  88. package/dist/dynamic/deprecated/components/Dropdown/package.json +1 -8
  89. package/dist/dynamic/deprecated/components/OptionsMenu/package.json +1 -8
  90. package/dist/dynamic/deprecated/components/PageHeader/package.json +1 -8
  91. package/dist/dynamic/deprecated/components/Select/package.json +1 -8
  92. package/dist/dynamic/deprecated/components/Wizard/package.json +1 -8
  93. package/dist/dynamic/deprecated/components/package.json +1 -8
  94. package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -8
  95. package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -8
  96. package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -8
  97. package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -8
  98. package/dist/dynamic/helpers/Popper/Popper/package.json +1 -8
  99. package/dist/dynamic/helpers/constants/package.json +1 -8
  100. package/dist/dynamic/helpers/datetimeUtils/package.json +1 -8
  101. package/dist/dynamic/helpers/favorites/package.json +1 -8
  102. package/dist/dynamic/helpers/fileUtils/package.json +1 -8
  103. package/dist/dynamic/helpers/htmlConstants/package.json +1 -8
  104. package/dist/dynamic/helpers/package.json +1 -8
  105. package/dist/dynamic/helpers/resizeObserver/package.json +1 -8
  106. package/dist/dynamic/helpers/typeUtils/package.json +1 -8
  107. package/dist/dynamic/helpers/useInterval/package.json +1 -8
  108. package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -8
  109. package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -8
  110. package/dist/dynamic/helpers/util/package.json +1 -8
  111. package/dist/dynamic/layouts/Bullseye/package.json +1 -8
  112. package/dist/dynamic/layouts/Flex/package.json +1 -8
  113. package/dist/dynamic/layouts/Gallery/package.json +1 -8
  114. package/dist/dynamic/layouts/Grid/package.json +1 -8
  115. package/dist/dynamic/layouts/Level/package.json +1 -8
  116. package/dist/dynamic/layouts/Split/package.json +1 -8
  117. package/dist/dynamic/layouts/Stack/package.json +1 -8
  118. package/dist/dynamic/next/components/DualListSelector/package.json +1 -8
  119. package/dist/dynamic/next/components/Modal/package.json +1 -8
  120. package/dist/dynamic/next/components/package.json +1 -8
  121. package/dist/dynamic/styles/package.json +1 -8
  122. package/dist/esm/components/Wizard/WizardBody.d.ts +4 -2
  123. package/dist/esm/components/Wizard/WizardBody.d.ts.map +1 -1
  124. package/dist/esm/components/Wizard/WizardBody.js +4 -2
  125. package/dist/esm/components/Wizard/WizardBody.js.map +1 -1
  126. package/dist/esm/components/Wizard/WizardFooter.d.ts +6 -3
  127. package/dist/esm/components/Wizard/WizardFooter.d.ts.map +1 -1
  128. package/dist/esm/components/Wizard/WizardFooter.js +12 -6
  129. package/dist/esm/components/Wizard/WizardFooter.js.map +1 -1
  130. package/dist/esm/components/Wizard/WizardHeader.d.ts +3 -1
  131. package/dist/esm/components/Wizard/WizardHeader.d.ts.map +1 -1
  132. package/dist/esm/components/Wizard/WizardHeader.js +11 -7
  133. package/dist/esm/components/Wizard/WizardHeader.js.map +1 -1
  134. package/dist/esm/components/Wizard/WizardNav.d.ts +3 -1
  135. package/dist/esm/components/Wizard/WizardNav.d.ts.map +1 -1
  136. package/dist/esm/components/Wizard/WizardNav.js +5 -3
  137. package/dist/esm/components/Wizard/WizardNav.js.map +1 -1
  138. package/dist/esm/components/Wizard/WizardNavItem.d.ts +4 -2
  139. package/dist/esm/components/Wizard/WizardNavItem.d.ts.map +1 -1
  140. package/dist/esm/components/Wizard/WizardNavItem.js +6 -4
  141. package/dist/esm/components/Wizard/WizardNavItem.js.map +1 -1
  142. package/dist/esm/helpers/resizeObserver.js +2 -2
  143. package/dist/esm/helpers/resizeObserver.js.map +1 -1
  144. package/dist/js/components/Wizard/WizardBody.d.ts +4 -2
  145. package/dist/js/components/Wizard/WizardBody.d.ts.map +1 -1
  146. package/dist/js/components/Wizard/WizardBody.js +3 -2
  147. package/dist/js/components/Wizard/WizardBody.js.map +1 -1
  148. package/dist/js/components/Wizard/WizardFooter.d.ts +6 -3
  149. package/dist/js/components/Wizard/WizardFooter.d.ts.map +1 -1
  150. package/dist/js/components/Wizard/WizardFooter.js +12 -6
  151. package/dist/js/components/Wizard/WizardFooter.js.map +1 -1
  152. package/dist/js/components/Wizard/WizardHeader.d.ts +3 -1
  153. package/dist/js/components/Wizard/WizardHeader.d.ts.map +1 -1
  154. package/dist/js/components/Wizard/WizardHeader.js +10 -7
  155. package/dist/js/components/Wizard/WizardHeader.js.map +1 -1
  156. package/dist/js/components/Wizard/WizardNav.d.ts +3 -1
  157. package/dist/js/components/Wizard/WizardNav.d.ts.map +1 -1
  158. package/dist/js/components/Wizard/WizardNav.js +4 -3
  159. package/dist/js/components/Wizard/WizardNav.js.map +1 -1
  160. package/dist/js/components/Wizard/WizardNavItem.d.ts +4 -2
  161. package/dist/js/components/Wizard/WizardNavItem.d.ts.map +1 -1
  162. package/dist/js/components/Wizard/WizardNavItem.js +5 -4
  163. package/dist/js/components/Wizard/WizardNavItem.js.map +1 -1
  164. package/dist/js/helpers/resizeObserver.js +1 -1
  165. package/dist/js/helpers/resizeObserver.js.map +1 -1
  166. package/dist/umd/assets/{output-CVNbFt8G.css → output-QR0coZbk.css} +11273 -11216
  167. package/dist/umd/react-core.min.js +3 -3
  168. package/helpers/package.json +1 -8
  169. package/layouts/package.json +1 -8
  170. package/next/package.json +1 -8
  171. package/package.json +6 -6
  172. package/src/components/Wizard/WizardBody.tsx +8 -3
  173. package/src/components/Wizard/WizardFooter.tsx +13 -7
  174. package/src/components/Wizard/WizardHeader.tsx +7 -3
  175. package/src/components/Wizard/WizardNav.tsx +9 -4
  176. package/src/components/Wizard/WizardNavItem.tsx +11 -3
  177. package/src/components/Wizard/__tests__/WizardBody.test.tsx +25 -8
  178. package/src/components/Wizard/__tests__/WizardFooter.test.tsx +9 -0
  179. package/src/components/Wizard/__tests__/WizardHeader.test.tsx +51 -0
  180. package/src/components/Wizard/__tests__/WizardNav.test.tsx +46 -0
  181. package/src/components/Wizard/__tests__/WizardNavItem.test.tsx +55 -0
  182. package/src/helpers/resizeObserver.tsx +2 -2
@@ -1,8 +1 @@
1
- {
2
- "name": "@patternfly/react-core-helpers",
3
- "main": "../dist/js/helpers/index.js",
4
- "module": "../dist/esm/helpers/index.js",
5
- "typings": "../dist/esm/helpers/index.d.ts",
6
- "version": "5.4.0-prerelease.19",
7
- "private": true
8
- }
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":"5.4.0-prerelease.21","private":true}
@@ -1,8 +1 @@
1
- {
2
- "name": "@patternfly/react-core-layouts",
3
- "main": "../dist/js/layouts/index.js",
4
- "module": "../dist/esm/layouts/index.js",
5
- "typings": "../dist/esm/layouts/index.d.ts",
6
- "version": "5.4.0-prerelease.19",
7
- "private": true
8
- }
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":"5.4.0-prerelease.21","private":true}
package/next/package.json CHANGED
@@ -1,8 +1 @@
1
- {
2
- "name": "@patternfly/react-core-next",
3
- "main": "../dist/js/next/index.js",
4
- "module": "../dist/esm/next/index.js",
5
- "typings": "../dist/esm/next/index.d.ts",
6
- "version": "5.4.0-prerelease.19",
7
- "private": true
8
- }
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":"5.4.0-prerelease.21","private":true}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/react-core",
3
- "version": "5.4.0-prerelease.20",
3
+ "version": "5.4.0-prerelease.22",
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
  "clean:exports": "node scripts/cleanDistExports.js"
47
47
  },
48
48
  "dependencies": {
49
- "@patternfly/react-icons": "^5.4.0-prerelease.8",
50
- "@patternfly/react-styles": "^5.4.0-prerelease.9",
51
- "@patternfly/react-tokens": "^5.4.0-prerelease.8",
49
+ "@patternfly/react-icons": "^5.4.0-prerelease.9",
50
+ "@patternfly/react-styles": "^5.4.0-prerelease.10",
51
+ "@patternfly/react-tokens": "^5.4.0-prerelease.9",
52
52
  "focus-trap": "7.5.4",
53
53
  "react-dropzone": "^14.2.3",
54
54
  "tslib": "^2.6.3"
55
55
  },
56
56
  "devDependencies": {
57
- "@patternfly/patternfly": "5.4.0-prerelease.6",
57
+ "@patternfly/patternfly": "5.4.0-prerelease.7",
58
58
  "css": "^3.0.0",
59
59
  "fs-extra": "^11.2.0"
60
60
  },
@@ -62,5 +62,5 @@
62
62
  "react": "^17 || ^18",
63
63
  "react-dom": "^17 || ^18"
64
64
  },
65
- "gitHead": "471218c7aa7f9ee4ed972da44c37a76b433bfefe"
65
+ "gitHead": "f81bc585db3dc2a488630773722ff4ebe1105c86"
66
66
  }
@@ -10,9 +10,11 @@ import { getResizeObserver } from '../../helpers/resizeObserver';
10
10
  * Used as a wrapper for WizardStep content, where the wrapping element is customizable.
11
11
  */
12
12
 
13
- export interface WizardBodyProps {
13
+ export interface WizardBodyProps extends React.HTMLProps<HTMLElement> {
14
14
  /** Anything that can be rendered in the Wizard body */
15
15
  children: React.ReactNode;
16
+ /** Additional classes spread to the wizard body */
17
+ className?: string;
16
18
  /** Flag to remove the default body padding */
17
19
  hasNoPadding?: boolean;
18
20
  /** Adds an accessible name to the wrapper element when the content overflows and renders
@@ -29,10 +31,12 @@ export interface WizardBodyProps {
29
31
 
30
32
  export const WizardBody = ({
31
33
  children,
34
+ className,
32
35
  hasNoPadding = false,
33
36
  'aria-label': ariaLabel,
34
37
  'aria-labelledby': ariaLabelledBy,
35
- component = 'div'
38
+ component = 'div',
39
+ ...props
36
40
  }: WizardBodyProps) => {
37
41
  const [hasScrollbar, setHasScrollbar] = React.useState(false);
38
42
  const [previousWidth, setPreviousWidth] = React.useState<number | undefined>(undefined);
@@ -74,7 +78,8 @@ export const WizardBody = ({
74
78
  {...(shouldFocusContent && { tabIndex: -1 })}
75
79
  {...(component === 'div' && hasScrollbar && { role: 'region' })}
76
80
  {...(hasScrollbar && { 'aria-label': defaultAriaLabel, 'aria-labelledby': ariaLabelledBy, tabIndex: 0 })}
77
- className={css(styles.wizardMain)}
81
+ className={css(styles.wizardMain, className)}
82
+ {...props}
78
83
  >
79
84
  <div className={css(styles.wizardMainBody, hasNoPadding && styles.modifiers.noPadding)}>{children}</div>
80
85
  </WrapperComponent>
@@ -5,12 +5,11 @@ import styles from '@patternfly/react-styles/css/components/Wizard/wizard';
5
5
 
6
6
  import { Button, ButtonVariant } from '../Button';
7
7
  import { isCustomWizardFooter, WizardFooterButtonProps, WizardStepType } from './types';
8
-
9
8
  /**
10
9
  * Hosts the standard structure of a footer with ties to the active step so that text for buttons can vary from step to step.
11
10
  */
12
11
 
13
- export interface WizardFooterProps {
12
+ export interface WizardFooterProps extends React.HTMLProps<HTMLElement> {
14
13
  /** The active step */
15
14
  activeStep: WizardStepType;
16
15
  /** Next button callback */
@@ -39,18 +38,23 @@ export interface WizardFooterProps {
39
38
  backButtonProps?: Omit<WizardFooterButtonProps, 'isDisabled'>;
40
39
  /** Additional props for the Cancel button. */
41
40
  cancelButtonProps?: WizardFooterButtonProps;
41
+ /** Additional classes spread to the wizard footer */
42
+ className?: string;
42
43
  }
43
44
 
44
45
  /**
45
46
  * Applies default wizard footer styling any number of child elements.
46
47
  */
47
48
 
48
- interface WizardFooterWrapperProps {
49
+ interface WizardFooterWrapperProps extends React.HTMLProps<HTMLElement> {
49
50
  children: React.ReactNode;
51
+ className?: string;
50
52
  }
51
53
 
52
- export const WizardFooterWrapper = ({ children }: WizardFooterWrapperProps) => (
53
- <footer className={css(styles.wizardFooter)}>{children}</footer>
54
+ export const WizardFooterWrapper = ({ children, className, ...props }: WizardFooterWrapperProps) => (
55
+ <footer className={css(styles.wizardFooter, className)} {...props}>
56
+ {children}
57
+ </footer>
54
58
  );
55
59
 
56
60
  export const WizardFooter = ({ activeStep, ...internalProps }: WizardFooterProps) => {
@@ -71,9 +75,11 @@ const InternalWizardFooter = ({
71
75
  cancelButtonText = 'Cancel',
72
76
  nextButtonProps,
73
77
  backButtonProps,
74
- cancelButtonProps
78
+ cancelButtonProps,
79
+ className,
80
+ ...props
75
81
  }: Omit<WizardFooterProps, 'activeStep'>) => (
76
- <WizardFooterWrapper>
82
+ <WizardFooterWrapper className={className} {...props}>
77
83
  {!isBackHidden && (
78
84
  <Button variant={ButtonVariant.secondary} onClick={onBack} isDisabled={isBackDisabled} {...backButtonProps}>
79
85
  {backButtonText}
@@ -4,7 +4,7 @@ import { css } from '@patternfly/react-styles';
4
4
  import { Button } from '../Button';
5
5
  import TimesIcon from '@patternfly/react-icons/dist/esm/icons/times-icon';
6
6
 
7
- export interface WizardHeaderProps {
7
+ export interface WizardHeaderProps extends React.HTMLProps<HTMLDivElement> {
8
8
  /** Callback function called when the X (Close) button is clicked */
9
9
  onClose?: (event: React.MouseEvent<HTMLButtonElement>) => void;
10
10
  /** Title of the wizard */
@@ -21,6 +21,8 @@ export interface WizardHeaderProps {
21
21
  titleId?: string;
22
22
  /** id for the description */
23
23
  descriptionId?: string;
24
+ /** Additional classes spread to the wizard header */
25
+ className?: string;
24
26
  }
25
27
 
26
28
  export const WizardHeader: React.FunctionComponent<WizardHeaderProps> = ({
@@ -31,9 +33,11 @@ export const WizardHeader: React.FunctionComponent<WizardHeaderProps> = ({
31
33
  closeButtonAriaLabel,
32
34
  titleId,
33
35
  descriptionComponent: Component = 'div',
34
- descriptionId
36
+ descriptionId,
37
+ className,
38
+ ...props
35
39
  }: WizardHeaderProps) => (
36
- <div className={css(styles.wizardHeader)}>
40
+ <div className={css(styles.wizardHeader, className)} {...props}>
37
41
  {!isCloseHidden && (
38
42
  <div className={css(styles.wizardClose)}>
39
43
  <Button variant="plain" aria-label={closeButtonAriaLabel} onClick={onClose}>
@@ -2,7 +2,7 @@ import * as React from 'react';
2
2
  import styles from '@patternfly/react-styles/css/components/Wizard/wizard';
3
3
  import { css } from '@patternfly/react-styles';
4
4
 
5
- export interface WizardNavProps {
5
+ export interface WizardNavProps extends Omit<React.HTMLProps<HTMLOListElement>, 'type' | 'ref'> {
6
6
  /** children should be WizardNavItem components */
7
7
  children?: any;
8
8
  /** Aria-label applied to the navigation element */
@@ -13,6 +13,8 @@ export interface WizardNavProps {
13
13
  isExpanded?: boolean;
14
14
  /** True to return the inner list without the wrapping navigation element */
15
15
  isInnerList?: boolean;
16
+ /** Additional classes spread to the wizard nav */
17
+ className?: string;
16
18
  }
17
19
 
18
20
  export const WizardNav: React.FunctionComponent<WizardNavProps> = ({
@@ -20,11 +22,13 @@ export const WizardNav: React.FunctionComponent<WizardNavProps> = ({
20
22
  'aria-label': ariaLabel,
21
23
  'aria-labelledby': ariaLabelledBy,
22
24
  isExpanded = false,
23
- isInnerList = false
25
+ isInnerList = false,
26
+ className,
27
+ ...props
24
28
  }: WizardNavProps) => {
25
29
  if (isInnerList) {
26
30
  return (
27
- <ol className={css(styles.wizardNavList)} role="list">
31
+ <ol className={css(styles.wizardNavList, className)} role="list" {...props}>
28
32
  {children}
29
33
  </ol>
30
34
  );
@@ -32,9 +36,10 @@ export const WizardNav: React.FunctionComponent<WizardNavProps> = ({
32
36
 
33
37
  return (
34
38
  <nav
35
- className={css(styles.wizardNav, isExpanded && styles.modifiers.expanded)}
39
+ className={css(styles.wizardNav, isExpanded && styles.modifiers.expanded, className)}
36
40
  aria-label={ariaLabel}
37
41
  aria-labelledby={ariaLabelledBy}
42
+ {...props}
38
43
  >
39
44
  <ol className={css(styles.wizardNavList)} role="list">
40
45
  {children}
@@ -10,7 +10,11 @@ import { WizardNavItemStatus } from './types';
10
10
  import globalSpacerSm from '@patternfly/react-tokens/dist/esm/global_spacer_sm';
11
11
  import globalDangerColor100 from '@patternfly/react-tokens/dist/esm/global_danger_color_100';
12
12
 
13
- export interface WizardNavItemProps extends OUIAProps {
13
+ export interface WizardNavItemProps
14
+ extends Omit<React.HTMLProps<HTMLLIElement>, 'onClick' | 'id' | 'content' | 'type'>,
15
+ OUIAProps {
16
+ /** Additional classes spread to the wizard nav item */
17
+ className?: string;
14
18
  /** Can nest a WizardNav component for substeps */
15
19
  children?: React.ReactNode;
16
20
  /** The content to display in the navigation item */
@@ -55,7 +59,9 @@ export const WizardNavItem = ({
55
59
  status = 'default',
56
60
  target,
57
61
  ouiaId,
58
- ouiaSafe = true
62
+ ouiaSafe = true,
63
+ className,
64
+ ...props
59
65
  }: WizardNavItemProps) => {
60
66
  const [isExpanded, setIsExpanded] = React.useState(false);
61
67
  const ouiaProps = useOUIAProps(WizardNavItem.displayName, ouiaId, ouiaSafe);
@@ -74,8 +80,10 @@ export const WizardNavItem = ({
74
80
  className={css(
75
81
  styles.wizardNavItem,
76
82
  isExpandable && styles.modifiers.expandable,
77
- isExpandable && isExpanded && styles.modifiers.expanded
83
+ isExpandable && isExpanded && styles.modifiers.expanded,
84
+ className
78
85
  )}
86
+ {...props}
79
87
  >
80
88
  <NavItemComponent
81
89
  {...(NavItemComponent === 'a'
@@ -3,11 +3,20 @@ import { render, screen } from '@testing-library/react';
3
3
  import { WizardBody } from '../WizardBody';
4
4
 
5
5
  test('renders children without additional props', () => {
6
- const { container } = render(<WizardBody>content</WizardBody>);
6
+ render(<WizardBody data-testid="test-id">content</WizardBody>);
7
7
 
8
- expect(container).toHaveTextContent('content');
9
- expect(container).not.toHaveAttribute('aria-label');
10
- expect(container).not.toHaveAttribute('aria-labelledby');
8
+ expect(screen.getByTestId('test-id')).toHaveTextContent('content');
9
+ expect(screen.getByTestId('test-id')).not.toHaveAttribute('aria-label');
10
+ expect(screen.getByTestId('test-id')).not.toHaveAttribute('aria-labelledby');
11
+ });
12
+
13
+ test(`Renders with additional classes when className is passed`, () => {
14
+ render(
15
+ <WizardBody className="custom-class" data-testid="test-id">
16
+ Test
17
+ </WizardBody>
18
+ );
19
+ expect(screen.getByTestId('test-id')).toHaveClass('custom-class');
11
20
  });
12
21
 
13
22
  test('has no padding className when hasNoPadding is not specified', () => {
@@ -21,11 +30,19 @@ test('has padding className when hasNoPadding is specified', () => {
21
30
  });
22
31
 
23
32
  test('wrapper element is of type div when component is not specified', () => {
24
- const { container } = render(<WizardBody aria-label="Wizard body">content</WizardBody>);
25
- expect(container.firstElementChild?.tagName).toEqual('DIV');
33
+ render(
34
+ <WizardBody data-testid="test-id" aria-label="Wizard body">
35
+ content
36
+ </WizardBody>
37
+ );
38
+ expect(screen.getByTestId('test-id').tagName).toEqual('DIV');
26
39
  });
27
40
 
28
41
  test('renders with custom component', () => {
29
- const { container } = render(<WizardBody component="main">content</WizardBody>);
30
- expect(container.firstElementChild?.tagName).toEqual('MAIN');
42
+ render(
43
+ <WizardBody component="main" data-testid="test-id">
44
+ content
45
+ </WizardBody>
46
+ );
47
+ expect(screen.getByTestId('test-id').tagName).toEqual('MAIN');
31
48
  });
@@ -20,6 +20,15 @@ test('has button names of "Next", "Back", and "Cancel" by default', () => {
20
20
  expect(screen.getByRole('button', { name: 'Cancel' })).toBeVisible();
21
21
  });
22
22
 
23
+ test(`Renders with additional classes when className is passed`, () => {
24
+ render(
25
+ <WizardFooter {...defaultProps} className="custom-class" data-testid="test-id">
26
+ Test
27
+ </WizardFooter>
28
+ );
29
+ expect(screen.getByTestId('test-id')).toHaveClass('custom-class');
30
+ });
31
+
23
32
  test('calls onNext when the next button is clicked', async () => {
24
33
  const onNext = jest.fn();
25
34
  const user = userEvent.setup();
@@ -0,0 +1,51 @@
1
+ import React from 'react';
2
+
3
+ import { render, screen } from '@testing-library/react';
4
+ import { WizardHeader } from '../WizardHeader';
5
+ import userEvent from '@testing-library/user-event';
6
+
7
+ // close button related tests
8
+ test(`Renders close button by default`, () => {
9
+ render(<WizardHeader data-testid="header-component" />);
10
+ expect(screen.getByRole('button')).toBeInTheDocument();
11
+ });
12
+
13
+ test(`Close button is hidden when isCloseHidden is passed`, () => {
14
+ render(<WizardHeader isCloseHidden />);
15
+ expect(screen.queryByRole('button')).toBeNull();
16
+ });
17
+
18
+ test(`Close button renders passed aria label`, () => {
19
+ render(<WizardHeader closeButtonAriaLabel="test aria label" />);
20
+ expect(screen.getByRole('button', { name: 'test aria label' })).toBeInTheDocument();
21
+ });
22
+
23
+ test(`Callback function fires when onClose passed`, async () => {
24
+ const onClose = jest.fn();
25
+ const user = userEvent.setup();
26
+ render(<WizardHeader onClose={onClose} />);
27
+ await user.click(screen.getByRole('button'));
28
+ expect(onClose).toHaveBeenCalled();
29
+ });
30
+
31
+ // description related tests
32
+ test(`Renders a description when passed description`, () => {
33
+ render(<WizardHeader description="test description" />);
34
+ expect(screen.getByText('test description')).toBeVisible();
35
+ });
36
+
37
+ test(`Renders the id passed via descriptionId`, () => {
38
+ render(<WizardHeader description="test description" descriptionId="test-id" />);
39
+ expect(screen.queryByText('test description')).toHaveAttribute('id', 'test-id');
40
+ });
41
+
42
+ // other prop tests
43
+ test(`Renders title when prop is passed`, () => {
44
+ render(<WizardHeader title="Test" />);
45
+ expect(screen.getByText('Test')).toBeVisible();
46
+ });
47
+
48
+ test(`Renders with additional classes when className is passed`, () => {
49
+ render(<WizardHeader className="custom-class" data-testid="header-component" />);
50
+ expect(screen.getByTestId('header-component')).toHaveClass('custom-class');
51
+ });
@@ -0,0 +1,46 @@
1
+ import React from 'react';
2
+
3
+ import { render, screen } from '@testing-library/react';
4
+ import { WizardNav } from '../WizardNav';
5
+ import styles from '@patternfly/react-styles/css/components/Wizard/wizard';
6
+
7
+ test(`Renders with additional classes when className is passed`, () => {
8
+ render(
9
+ <WizardNav className="custom-class" data-testid="test-id">
10
+ Test
11
+ </WizardNav>
12
+ );
13
+ expect(screen.getByTestId('test-id')).toHaveClass('custom-class');
14
+ });
15
+
16
+ test(`Renders with accessible aria-label when passed`, () => {
17
+ render(
18
+ <WizardNav aria-label="test aria label" data-testid="test-id">
19
+ Test
20
+ </WizardNav>
21
+ );
22
+ expect(screen.getByTestId('test-id')).toHaveAccessibleName('test aria label');
23
+ });
24
+
25
+ test(`Renders with accessible aria-labelledby when passed`, () => {
26
+ render(
27
+ <WizardNav aria-labelledby="test-labelledby" data-testid="test-id">
28
+ Test
29
+ </WizardNav>
30
+ );
31
+ expect(screen.getByTestId('test-id')).toHaveAttribute('aria-labelledby');
32
+ });
33
+
34
+ test(`Renders with expanded styles when prop passed`, () => {
35
+ render(
36
+ <WizardNav isExpanded data-testid="test-id">
37
+ Test
38
+ </WizardNav>
39
+ );
40
+ expect(screen.getByTestId('test-id')).toHaveClass(styles.modifiers.expanded);
41
+ });
42
+
43
+ test(`Renders with expanded styles when prop passed`, () => {
44
+ render(<WizardNav isInnerList>Test</WizardNav>);
45
+ expect(screen.getByRole('list')).toBeInTheDocument();
46
+ });
@@ -0,0 +1,55 @@
1
+ import React from 'react';
2
+
3
+ import { render, screen } from '@testing-library/react';
4
+ import { WizardNavItem } from '../WizardNavItem';
5
+ import styles from '@patternfly/react-styles/css/components/Wizard/wizard';
6
+ import userEvent from '@testing-library/user-event';
7
+
8
+ test(`Renders with additional classes when className is passed`, () => {
9
+ render(<WizardNavItem className="custom-class" />);
10
+ expect(screen.getByRole('listitem')).toHaveClass('custom-class');
11
+ });
12
+
13
+ test(`Renders content passed to content prop`, () => {
14
+ render(<WizardNavItem content="test content" />);
15
+ expect(screen.getByText('test content')).toBeVisible();
16
+ });
17
+
18
+ test(`Renders ${styles.modifiers.disabled} class when isDisabled is true`, () => {
19
+ render(<WizardNavItem isDisabled />);
20
+ expect(screen.getByRole('button')).toHaveClass(styles.modifiers.disabled);
21
+ });
22
+
23
+ test(`Renders ${styles.modifiers.current} class when isCurrent is true`, () => {
24
+ render(<WizardNavItem isCurrent />);
25
+ expect(screen.getByRole('button')).toHaveClass(styles.modifiers.current);
26
+ });
27
+
28
+ test(`Callback function fires when onClick passed`, async () => {
29
+ const onClick = jest.fn();
30
+ const user = userEvent.setup();
31
+ render(<WizardNavItem onClick={onClick} />);
32
+ await user.click(screen.getByRole('button'));
33
+ expect(onClick).toHaveBeenCalled();
34
+ });
35
+
36
+ test(`Renders a link element with an href when the props are passed`, () => {
37
+ render(<WizardNavItem component="a" href="test-href" />);
38
+ expect(screen.getByRole('link')).toHaveAttribute('href', 'test-href');
39
+ });
40
+
41
+ test(`Renders a link element with a target when the props are passed`, () => {
42
+ render(<WizardNavItem component="a" href="test-href" target="test-target" />);
43
+ expect(screen.getByRole('link')).toHaveAttribute('target', 'test-target');
44
+ });
45
+
46
+ test(`Renders an expandable li when isExapandable is passed`, () => {
47
+ render(<WizardNavItem isExpandable />);
48
+ expect(screen.getByRole('button')).toHaveAttribute('aria-expanded', 'false');
49
+ expect(screen.getByRole('listitem')).toHaveClass(styles.modifiers.expandable);
50
+ });
51
+
52
+ test(`Renders id to nav item button when passed`, () => {
53
+ render(<WizardNavItem id="test-id" />);
54
+ expect(screen.getByRole('button')).toHaveAttribute('id', 'test-id');
55
+ });
@@ -1,4 +1,4 @@
1
- import { canUseDOM } from './util';
1
+ import { canUseDOM, debounce } from './util';
2
2
 
3
3
  /**
4
4
  * This function creates a ResizeObserver used to handle resize events for the given containerRef. If ResizeObserver
@@ -83,7 +83,7 @@ export const getResizeObserver = (
83
83
  if (useRequestAnimationFrame) {
84
84
  window.requestAnimationFrame(() => {
85
85
  if (Array.isArray(entries) && entries.length > 0) {
86
- handleResize();
86
+ debounce(handleResize, 100);
87
87
  }
88
88
  });
89
89
  // Avoid wrapping function in requestAnimationFrame if the function is debounced