@patternfly/react-core 4.273.3 → 4.274.1

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 (232) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/components/Chip/Chip.d.ts.map +1 -1
  3. package/components/Chip/Chip.js +5 -4
  4. package/components/Chip/Chip.js.map +1 -1
  5. package/components/Menu/MenuGroup.d.ts +1 -1
  6. package/components/Menu/MenuGroup.d.ts.map +1 -1
  7. package/components/Menu/MenuGroup.js.map +1 -1
  8. package/components/Text/TextList.d.ts +2 -0
  9. package/components/Text/TextList.d.ts.map +1 -1
  10. package/components/Text/TextList.js +3 -2
  11. package/components/Text/TextList.js.map +1 -1
  12. package/dist/esm/components/Chip/Chip.d.ts.map +1 -1
  13. package/dist/esm/components/Chip/Chip.js +5 -4
  14. package/dist/esm/components/Chip/Chip.js.map +1 -1
  15. package/dist/esm/components/Menu/MenuGroup.d.ts +1 -1
  16. package/dist/esm/components/Menu/MenuGroup.d.ts.map +1 -1
  17. package/dist/esm/components/Menu/MenuGroup.js.map +1 -1
  18. package/dist/esm/components/Text/TextList.d.ts +2 -0
  19. package/dist/esm/components/Text/TextList.d.ts.map +1 -1
  20. package/dist/esm/components/Text/TextList.js +3 -2
  21. package/dist/esm/components/Text/TextList.js.map +1 -1
  22. package/dist/esm/next/components/Wizard/Wizard.d.ts +11 -14
  23. package/dist/esm/next/components/Wizard/Wizard.d.ts.map +1 -1
  24. package/dist/esm/next/components/Wizard/Wizard.js +30 -23
  25. package/dist/esm/next/components/Wizard/Wizard.js.map +1 -1
  26. package/dist/esm/next/components/Wizard/WizardContext.d.ts +16 -16
  27. package/dist/esm/next/components/Wizard/WizardContext.d.ts.map +1 -1
  28. package/dist/esm/next/components/Wizard/WizardContext.js +17 -19
  29. package/dist/esm/next/components/Wizard/WizardContext.js.map +1 -1
  30. package/dist/esm/next/components/Wizard/WizardFooter.d.ts +8 -5
  31. package/dist/esm/next/components/Wizard/WizardFooter.d.ts.map +1 -1
  32. package/dist/esm/next/components/Wizard/WizardFooter.js +1 -1
  33. package/dist/esm/next/components/Wizard/WizardFooter.js.map +1 -1
  34. package/dist/esm/next/components/Wizard/WizardHeader.d.ts +1 -1
  35. package/dist/esm/next/components/Wizard/WizardHeader.d.ts.map +1 -1
  36. package/dist/esm/next/components/Wizard/WizardNavInternal.d.ts +2 -2
  37. package/dist/esm/next/components/Wizard/WizardNavInternal.d.ts.map +1 -1
  38. package/dist/esm/next/components/Wizard/WizardNavInternal.js +15 -9
  39. package/dist/esm/next/components/Wizard/WizardNavInternal.js.map +1 -1
  40. package/dist/esm/next/components/Wizard/WizardNavItem.d.ts +10 -4
  41. package/dist/esm/next/components/Wizard/WizardNavItem.d.ts.map +1 -1
  42. package/dist/esm/next/components/Wizard/WizardNavItem.js +10 -9
  43. package/dist/esm/next/components/Wizard/WizardNavItem.js.map +1 -1
  44. package/dist/esm/next/components/Wizard/WizardStep.d.ts +3 -3
  45. package/dist/esm/next/components/Wizard/WizardStep.d.ts.map +1 -1
  46. package/dist/esm/next/components/Wizard/WizardStep.js +4 -2
  47. package/dist/esm/next/components/Wizard/WizardStep.js.map +1 -1
  48. package/dist/esm/next/components/Wizard/WizardToggle.d.ts +4 -4
  49. package/dist/esm/next/components/Wizard/WizardToggle.d.ts.map +1 -1
  50. package/dist/esm/next/components/Wizard/WizardToggle.js +1 -1
  51. package/dist/esm/next/components/Wizard/WizardToggle.js.map +1 -1
  52. package/dist/esm/next/components/Wizard/hooks/index.d.ts +1 -0
  53. package/dist/esm/next/components/Wizard/hooks/index.d.ts.map +1 -1
  54. package/dist/esm/next/components/Wizard/hooks/index.js +1 -0
  55. package/dist/esm/next/components/Wizard/hooks/index.js.map +1 -1
  56. package/dist/esm/next/components/Wizard/hooks/useGetMergedSteps.d.ts +9 -0
  57. package/dist/esm/next/components/Wizard/hooks/useGetMergedSteps.d.ts.map +1 -0
  58. package/dist/esm/next/components/Wizard/hooks/useGetMergedSteps.js +33 -0
  59. package/dist/esm/next/components/Wizard/hooks/useGetMergedSteps.js.map +1 -0
  60. package/dist/esm/next/components/Wizard/index.d.ts +2 -2
  61. package/dist/esm/next/components/Wizard/index.d.ts.map +1 -1
  62. package/dist/esm/next/components/Wizard/index.js +2 -2
  63. package/dist/esm/next/components/Wizard/index.js.map +1 -1
  64. package/dist/esm/next/components/Wizard/types.d.ts +13 -19
  65. package/dist/esm/next/components/Wizard/types.d.ts.map +1 -1
  66. package/dist/esm/next/components/Wizard/types.js +6 -0
  67. package/dist/esm/next/components/Wizard/types.js.map +1 -1
  68. package/dist/esm/next/components/Wizard/utils.d.ts +5 -6
  69. package/dist/esm/next/components/Wizard/utils.d.ts.map +1 -1
  70. package/dist/esm/next/components/Wizard/utils.js +15 -22
  71. package/dist/esm/next/components/Wizard/utils.js.map +1 -1
  72. package/dist/js/components/Chip/Chip.d.ts.map +1 -1
  73. package/dist/js/components/Chip/Chip.js +4 -4
  74. package/dist/js/components/Chip/Chip.js.map +1 -1
  75. package/dist/js/components/Menu/MenuGroup.d.ts +1 -1
  76. package/dist/js/components/Menu/MenuGroup.d.ts.map +1 -1
  77. package/dist/js/components/Menu/MenuGroup.js.map +1 -1
  78. package/dist/js/components/Text/TextList.d.ts +2 -0
  79. package/dist/js/components/Text/TextList.d.ts.map +1 -1
  80. package/dist/js/components/Text/TextList.js +3 -2
  81. package/dist/js/components/Text/TextList.js.map +1 -1
  82. package/dist/js/next/components/Wizard/Wizard.d.ts +11 -14
  83. package/dist/js/next/components/Wizard/Wizard.d.ts.map +1 -1
  84. package/dist/js/next/components/Wizard/Wizard.js +28 -21
  85. package/dist/js/next/components/Wizard/Wizard.js.map +1 -1
  86. package/dist/js/next/components/Wizard/WizardContext.d.ts +16 -16
  87. package/dist/js/next/components/Wizard/WizardContext.d.ts.map +1 -1
  88. package/dist/js/next/components/Wizard/WizardContext.js +16 -17
  89. package/dist/js/next/components/Wizard/WizardContext.js.map +1 -1
  90. package/dist/js/next/components/Wizard/WizardFooter.d.ts +8 -5
  91. package/dist/js/next/components/Wizard/WizardFooter.d.ts.map +1 -1
  92. package/dist/js/next/components/Wizard/WizardFooter.js +1 -1
  93. package/dist/js/next/components/Wizard/WizardFooter.js.map +1 -1
  94. package/dist/js/next/components/Wizard/WizardHeader.d.ts +1 -1
  95. package/dist/js/next/components/Wizard/WizardHeader.d.ts.map +1 -1
  96. package/dist/js/next/components/Wizard/WizardNavInternal.d.ts +2 -2
  97. package/dist/js/next/components/Wizard/WizardNavInternal.d.ts.map +1 -1
  98. package/dist/js/next/components/Wizard/WizardNavInternal.js +15 -9
  99. package/dist/js/next/components/Wizard/WizardNavInternal.js.map +1 -1
  100. package/dist/js/next/components/Wizard/WizardNavItem.d.ts +10 -4
  101. package/dist/js/next/components/Wizard/WizardNavItem.d.ts.map +1 -1
  102. package/dist/js/next/components/Wizard/WizardNavItem.js +10 -8
  103. package/dist/js/next/components/Wizard/WizardNavItem.js.map +1 -1
  104. package/dist/js/next/components/Wizard/WizardStep.d.ts +3 -3
  105. package/dist/js/next/components/Wizard/WizardStep.d.ts.map +1 -1
  106. package/dist/js/next/components/Wizard/WizardStep.js +4 -2
  107. package/dist/js/next/components/Wizard/WizardStep.js.map +1 -1
  108. package/dist/js/next/components/Wizard/WizardToggle.d.ts +4 -4
  109. package/dist/js/next/components/Wizard/WizardToggle.d.ts.map +1 -1
  110. package/dist/js/next/components/Wizard/WizardToggle.js +1 -1
  111. package/dist/js/next/components/Wizard/WizardToggle.js.map +1 -1
  112. package/dist/js/next/components/Wizard/hooks/index.d.ts +1 -0
  113. package/dist/js/next/components/Wizard/hooks/index.d.ts.map +1 -1
  114. package/dist/js/next/components/Wizard/hooks/index.js +3 -1
  115. package/dist/js/next/components/Wizard/hooks/index.js.map +1 -1
  116. package/dist/js/next/components/Wizard/hooks/useGetMergedSteps.d.ts +9 -0
  117. package/dist/js/next/components/Wizard/hooks/useGetMergedSteps.d.ts.map +1 -0
  118. package/dist/js/next/components/Wizard/hooks/useGetMergedSteps.js +38 -0
  119. package/dist/js/next/components/Wizard/hooks/useGetMergedSteps.js.map +1 -0
  120. package/dist/js/next/components/Wizard/index.d.ts +2 -2
  121. package/dist/js/next/components/Wizard/index.d.ts.map +1 -1
  122. package/dist/js/next/components/Wizard/index.js +4 -2
  123. package/dist/js/next/components/Wizard/index.js.map +1 -1
  124. package/dist/js/next/components/Wizard/types.d.ts +13 -19
  125. package/dist/js/next/components/Wizard/types.d.ts.map +1 -1
  126. package/dist/js/next/components/Wizard/types.js +7 -1
  127. package/dist/js/next/components/Wizard/types.js.map +1 -1
  128. package/dist/js/next/components/Wizard/utils.d.ts +5 -6
  129. package/dist/js/next/components/Wizard/utils.d.ts.map +1 -1
  130. package/dist/js/next/components/Wizard/utils.js +17 -25
  131. package/dist/js/next/components/Wizard/utils.js.map +1 -1
  132. package/dist/umd/react-core.min.js +2 -2
  133. package/next/components/Wizard/Wizard.d.ts +11 -14
  134. package/next/components/Wizard/Wizard.d.ts.map +1 -1
  135. package/next/components/Wizard/Wizard.js +30 -23
  136. package/next/components/Wizard/Wizard.js.map +1 -1
  137. package/next/components/Wizard/WizardContext.d.ts +16 -16
  138. package/next/components/Wizard/WizardContext.d.ts.map +1 -1
  139. package/next/components/Wizard/WizardContext.js +17 -19
  140. package/next/components/Wizard/WizardContext.js.map +1 -1
  141. package/next/components/Wizard/WizardFooter.d.ts +8 -5
  142. package/next/components/Wizard/WizardFooter.d.ts.map +1 -1
  143. package/next/components/Wizard/WizardFooter.js +1 -1
  144. package/next/components/Wizard/WizardFooter.js.map +1 -1
  145. package/next/components/Wizard/WizardHeader.d.ts +1 -1
  146. package/next/components/Wizard/WizardHeader.d.ts.map +1 -1
  147. package/next/components/Wizard/WizardNavInternal.d.ts +2 -2
  148. package/next/components/Wizard/WizardNavInternal.d.ts.map +1 -1
  149. package/next/components/Wizard/WizardNavInternal.js +15 -9
  150. package/next/components/Wizard/WizardNavInternal.js.map +1 -1
  151. package/next/components/Wizard/WizardNavItem.d.ts +10 -4
  152. package/next/components/Wizard/WizardNavItem.d.ts.map +1 -1
  153. package/next/components/Wizard/WizardNavItem.js +10 -9
  154. package/next/components/Wizard/WizardNavItem.js.map +1 -1
  155. package/next/components/Wizard/WizardStep.d.ts +3 -3
  156. package/next/components/Wizard/WizardStep.d.ts.map +1 -1
  157. package/next/components/Wizard/WizardStep.js +4 -2
  158. package/next/components/Wizard/WizardStep.js.map +1 -1
  159. package/next/components/Wizard/WizardToggle.d.ts +4 -4
  160. package/next/components/Wizard/WizardToggle.d.ts.map +1 -1
  161. package/next/components/Wizard/WizardToggle.js +1 -1
  162. package/next/components/Wizard/WizardToggle.js.map +1 -1
  163. package/next/components/Wizard/hooks/index.d.ts +1 -0
  164. package/next/components/Wizard/hooks/index.d.ts.map +1 -1
  165. package/next/components/Wizard/hooks/index.js +1 -0
  166. package/next/components/Wizard/hooks/index.js.map +1 -1
  167. package/next/components/Wizard/hooks/useGetMergedSteps.d.ts +9 -0
  168. package/next/components/Wizard/hooks/useGetMergedSteps.d.ts.map +1 -0
  169. package/next/components/Wizard/hooks/useGetMergedSteps.js +33 -0
  170. package/next/components/Wizard/hooks/useGetMergedSteps.js.map +1 -0
  171. package/next/components/Wizard/index.d.ts +2 -2
  172. package/next/components/Wizard/index.d.ts.map +1 -1
  173. package/next/components/Wizard/index.js +2 -2
  174. package/next/components/Wizard/index.js.map +1 -1
  175. package/next/components/Wizard/types.d.ts +13 -19
  176. package/next/components/Wizard/types.d.ts.map +1 -1
  177. package/next/components/Wizard/types.js +6 -0
  178. package/next/components/Wizard/types.js.map +1 -1
  179. package/next/components/Wizard/utils.d.ts +5 -6
  180. package/next/components/Wizard/utils.d.ts.map +1 -1
  181. package/next/components/Wizard/utils.js +15 -22
  182. package/next/components/Wizard/utils.js.map +1 -1
  183. package/package.json +2 -2
  184. package/src/components/Chip/Chip.tsx +4 -2
  185. package/src/components/Chip/__tests__/Chip.test.tsx +9 -0
  186. package/src/components/Chip/__tests__/__snapshots__/Chip.test.tsx.snap +55 -0
  187. package/src/components/ChipGroup/__tests__/__snapshots__/ChipGroup.test.tsx.snap +4 -0
  188. package/src/components/Menu/MenuGroup.tsx +2 -2
  189. package/src/components/Modal/examples/Modal.md +46 -11
  190. package/src/components/Select/__tests__/__snapshots__/Select.test.tsx.snap +2 -0
  191. package/src/components/Text/TextList.tsx +5 -1
  192. package/src/components/Text/__tests__/TextList.test.tsx +5 -0
  193. package/src/components/Text/examples/Text.md +5 -0
  194. package/src/components/Text/examples/TextPlainList.tsx +24 -0
  195. package/src/components/Toolbar/__tests__/__snapshots__/Toolbar.test.tsx.snap +2 -0
  196. package/src/next/components/Wizard/Wizard.tsx +71 -46
  197. package/src/next/components/Wizard/WizardContext.tsx +38 -43
  198. package/src/next/components/Wizard/WizardFooter.tsx +10 -6
  199. package/src/next/components/Wizard/WizardHeader.tsx +1 -1
  200. package/src/next/components/Wizard/WizardNavInternal.tsx +51 -43
  201. package/src/next/components/Wizard/WizardNavItem.tsx +21 -14
  202. package/src/next/components/Wizard/WizardStep.tsx +8 -6
  203. package/src/next/components/Wizard/WizardToggle.tsx +5 -5
  204. package/src/next/components/Wizard/__tests__/Wizard.test.tsx +129 -26
  205. package/src/next/components/Wizard/__tests__/WizardStep.test.tsx +5 -5
  206. package/src/next/components/Wizard/__tests__/WizardToggle.test.tsx +2 -2
  207. package/src/next/components/Wizard/__tests__/utils.test.tsx +3 -17
  208. package/src/next/components/Wizard/examples/Wizard.md +69 -41
  209. package/src/next/components/Wizard/examples/WizardBasic.tsx +6 -12
  210. package/src/next/components/Wizard/examples/WizardBasicDisabledSteps.tsx +22 -0
  211. package/src/next/components/Wizard/examples/WizardEnabledOnFormValidation.tsx +84 -0
  212. package/src/next/components/Wizard/examples/WizardExpandableSteps.tsx +42 -0
  213. package/src/next/components/Wizard/examples/WizardGetCurrentStep.tsx +53 -0
  214. package/src/next/components/Wizard/examples/WizardProgressiveSteps.tsx +31 -0
  215. package/src/next/components/Wizard/examples/WizardStepDrawerContent.tsx +80 -0
  216. package/src/next/components/Wizard/examples/WizardStepErrorStatus.tsx +55 -0
  217. package/src/next/components/Wizard/examples/WizardStepVisitRequired.tsx +22 -0
  218. package/src/next/components/Wizard/examples/WizardToggleStepVisibility.tsx +57 -0
  219. package/src/next/components/Wizard/examples/WizardValidateOnButtonPress.tsx +183 -0
  220. package/src/next/components/Wizard/examples/WizardWithCustomFooter.tsx +107 -0
  221. package/src/next/components/Wizard/examples/{WizardCustomNav.tsx → WizardWithCustomNav.tsx} +11 -11
  222. package/src/next/components/Wizard/examples/WizardWithCustomNavItem.tsx +22 -0
  223. package/src/next/components/Wizard/examples/WizardWithHeader.tsx +26 -0
  224. package/src/next/components/Wizard/examples/WizardWithNavAnchors.tsx +46 -0
  225. package/src/next/components/Wizard/examples/WizardWithSubmitProgress.tsx +86 -0
  226. package/src/next/components/Wizard/examples/WizardWithinModal.tsx +41 -0
  227. package/src/next/components/Wizard/hooks/index.ts +1 -0
  228. package/src/next/components/Wizard/hooks/useGetMergedSteps.tsx +45 -0
  229. package/src/next/components/Wizard/index.ts +2 -2
  230. package/src/next/components/Wizard/types.tsx +19 -29
  231. package/src/next/components/Wizard/utils.ts +27 -33
  232. package/src/next/components/Wizard/examples/WizardKitchenSink.tsx +0 -243
@@ -1,22 +1,23 @@
1
1
  import React from 'react';
2
2
 
3
- import { isCustomWizardFooter, WizardControlStep, WizardFooterType } from './types';
3
+ import { isCustomWizardFooter, isWizardSubStep, WizardStepType, WizardFooterType } from './types';
4
4
  import { getActiveStep } from './utils';
5
+ import { useGetMergedSteps } from './hooks';
5
6
  import { WizardFooter, WizardFooterProps } from './WizardFooter';
6
7
 
7
8
  export interface WizardContextProps {
8
9
  /** List of steps */
9
- steps: WizardControlStep[];
10
+ steps: WizardStepType[];
10
11
  /** Current step */
11
- activeStep: WizardControlStep;
12
+ activeStep: WizardStepType;
12
13
  /** Footer element */
13
14
  footer: React.ReactElement;
15
+ /** Close the wizard */
16
+ close: () => void;
14
17
  /** Navigate to the next step */
15
- onNext: () => void | Promise<void>;
18
+ goToNextStep: () => void | Promise<void>;
16
19
  /** Navigate to the previous step */
17
- onBack: () => void | Promise<void>;
18
- /** Close the wizard */
19
- onClose: () => void;
20
+ goToPrevStep: () => void | Promise<void>;
20
21
  /** Navigate to step by ID */
21
22
  goToStepById: (id: number | string) => void;
22
23
  /** Navigate to step by name */
@@ -26,24 +27,28 @@ export interface WizardContextProps {
26
27
  /** Update the footer with any react element */
27
28
  setFooter: (footer: React.ReactElement | Partial<WizardFooterProps>) => void;
28
29
  /** Get step by ID */
29
- getStep: (stepId: number | string) => WizardControlStep;
30
+ getStep: (stepId: number | string) => WizardStepType;
30
31
  /** Set step by ID */
31
- setStep: (step: Pick<WizardControlStep, 'id'> & Partial<WizardControlStep>) => void;
32
+ setStep: (step: Pick<WizardStepType, 'id'> & Partial<WizardStepType>) => void;
32
33
  }
33
34
 
34
35
  export const WizardContext = React.createContext({} as WizardContextProps);
35
36
 
36
37
  export interface WizardContextProviderProps {
37
- steps: WizardControlStep[];
38
+ steps: WizardStepType[];
38
39
  activeStepIndex: number;
39
40
  footer: WizardFooterType;
40
41
  children: React.ReactElement;
41
- onNext(steps: WizardControlStep[]): void;
42
- onBack(steps: WizardControlStep[]): void;
43
- onClose(): void;
44
- goToStepById(steps: WizardControlStep[], id: number | string): void;
45
- goToStepByName(steps: WizardControlStep[], name: string): void;
46
- goToStepByIndex(steps: WizardControlStep[], index: number): void;
42
+ onNext(event: React.MouseEvent<HTMLButtonElement>, steps: WizardStepType[]): void;
43
+ onBack(event: React.MouseEvent<HTMLButtonElement>, steps: WizardStepType[]): void;
44
+ onClose(event: React.MouseEvent<HTMLButtonElement>): void;
45
+ goToStepById(steps: WizardStepType[], id: number | string): void;
46
+ goToStepByName(steps: WizardStepType[], name: string): void;
47
+ goToStepByIndex(
48
+ event: React.MouseEvent<HTMLButtonElement> | React.MouseEvent<HTMLAnchorElement>,
49
+ steps: WizardStepType[],
50
+ index: number
51
+ ): void;
47
52
  }
48
53
 
49
54
  export const WizardContextProvider: React.FunctionComponent<WizardContextProviderProps> = ({
@@ -62,25 +67,12 @@ export const WizardContextProvider: React.FunctionComponent<WizardContextProvide
62
67
  const [currentFooter, setCurrentFooter] = React.useState(
63
68
  typeof initialFooter !== 'function' ? initialFooter : undefined
64
69
  );
70
+ const steps = useGetMergedSteps(initialSteps, currentSteps);
71
+ const activeStep = React.useMemo(() => getActiveStep(steps, activeStepIndex), [activeStepIndex, steps]);
65
72
 
66
- // Combined initial and current state steps
67
- const steps = React.useMemo(
68
- () =>
69
- currentSteps.map((currentStepProps, index) => {
70
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
71
- const { isVisited, ...initialStepProps } = initialSteps[index];
72
-
73
- return {
74
- ...currentStepProps,
75
- ...initialStepProps
76
- };
77
- }),
78
- [initialSteps, currentSteps]
79
- );
80
- const activeStep = getActiveStep(steps, activeStepIndex);
81
-
82
- const goToNextStep = React.useCallback(() => onNext(steps), [onNext, steps]);
83
- const goToPrevStep = React.useCallback(() => onBack(steps), [onBack, steps]);
73
+ const close = React.useCallback(() => onClose(null), [onClose]);
74
+ const goToNextStep = React.useCallback(() => onNext(null, steps), [onNext, steps]);
75
+ const goToPrevStep = React.useCallback(() => onBack(null, steps), [onBack, steps]);
84
76
 
85
77
  const footer = React.useMemo(() => {
86
78
  const wizardFooter = activeStep?.footer || currentFooter || initialFooter;
@@ -89,7 +81,7 @@ export const WizardContextProvider: React.FunctionComponent<WizardContextProvide
89
81
  const customFooter = wizardFooter;
90
82
 
91
83
  return typeof customFooter === 'function'
92
- ? customFooter(activeStep, goToNextStep, goToPrevStep, onClose)
84
+ ? customFooter(activeStep, goToNextStep, goToPrevStep, close)
93
85
  : customFooter;
94
86
  }
95
87
 
@@ -98,17 +90,17 @@ export const WizardContextProvider: React.FunctionComponent<WizardContextProvide
98
90
  activeStep={activeStep}
99
91
  onNext={goToNextStep}
100
92
  onBack={goToPrevStep}
101
- onClose={onClose}
102
- isBackDisabled={activeStep?.id === steps[0]?.id}
93
+ onClose={close}
94
+ isBackDisabled={activeStep?.index === 1 || (isWizardSubStep(activeStep) && activeStep?.index === 2)}
103
95
  {...wizardFooter}
104
96
  />
105
97
  );
106
- }, [currentFooter, initialFooter, activeStep, goToNextStep, goToPrevStep, onClose, steps]);
98
+ }, [currentFooter, initialFooter, activeStep, goToNextStep, goToPrevStep, close]);
107
99
 
108
100
  const getStep = React.useCallback((stepId: string | number) => steps.find(step => step.id === stepId), [steps]);
109
101
 
110
102
  const setStep = React.useCallback(
111
- (step: Pick<WizardControlStep, 'id'> & Partial<WizardControlStep>) =>
103
+ (step: Pick<WizardStepType, 'id'> & Partial<WizardStepType>) =>
112
104
  setCurrentSteps(prevSteps =>
113
105
  prevSteps.map(prevStep => {
114
106
  if (prevStep.id === step.id) {
@@ -127,15 +119,18 @@ export const WizardContextProvider: React.FunctionComponent<WizardContextProvide
127
119
  steps,
128
120
  activeStep,
129
121
  footer,
130
- onClose,
122
+ close,
131
123
  getStep,
132
124
  setStep,
125
+ goToNextStep,
126
+ goToPrevStep,
133
127
  setFooter: setCurrentFooter,
134
- onNext: goToNextStep,
135
- onBack: goToPrevStep,
136
128
  goToStepById: React.useCallback(id => goToStepById(steps, id), [goToStepById, steps]),
137
129
  goToStepByName: React.useCallback(name => goToStepByName(steps, name), [goToStepByName, steps]),
138
- goToStepByIndex: React.useCallback(index => goToStepByIndex(steps, index), [goToStepByIndex, steps])
130
+ goToStepByIndex: React.useCallback((index: number) => goToStepByIndex(null, steps, index), [
131
+ goToStepByIndex,
132
+ steps
133
+ ])
139
134
  }}
140
135
  >
141
136
  {children}
@@ -4,7 +4,7 @@ import { css } from '@patternfly/react-styles';
4
4
  import styles from '@patternfly/react-styles/css/components/Wizard/wizard';
5
5
 
6
6
  import { Button, ButtonVariant } from '../../../components/Button';
7
- import { isCustomWizardFooter, WizardControlStep, WizardNavStepFunction } from './types';
7
+ import { isCustomWizardFooter, WizardStepType } from './types';
8
8
 
9
9
  /**
10
10
  * Hosts the standard structure of a footer with ties to the active step so that text for buttons can vary from step to step.
@@ -12,13 +12,13 @@ import { isCustomWizardFooter, WizardControlStep, WizardNavStepFunction } from '
12
12
 
13
13
  export interface WizardFooterProps {
14
14
  /** The active step */
15
- activeStep: WizardControlStep;
15
+ activeStep: WizardStepType;
16
16
  /** Next button callback */
17
- onNext: () => WizardNavStepFunction | void | Promise<void>;
17
+ onNext: (event: React.MouseEvent<HTMLButtonElement>) => void | Promise<void>;
18
18
  /** Back button callback */
19
- onBack: () => WizardNavStepFunction | void | Promise<void>;
19
+ onBack: (event: React.MouseEvent<HTMLButtonElement>) => void | Promise<void>;
20
20
  /** Cancel link callback */
21
- onClose: () => void;
21
+ onClose: (event: React.MouseEvent<HTMLButtonElement>) => void;
22
22
  /** Custom text for the Next button. The current step's nextButtonText takes precedence. */
23
23
  nextButtonText?: React.ReactNode;
24
24
  /** Custom text for the Back button */
@@ -35,6 +35,10 @@ export interface WizardFooterProps {
35
35
  isCancelHidden?: boolean;
36
36
  }
37
37
 
38
+ /**
39
+ * Applies default wizard footer styling any number of child elements.
40
+ */
41
+
38
42
  interface WizardFooterWrapperProps {
39
43
  children: React.ReactNode;
40
44
  }
@@ -44,7 +48,7 @@ export const WizardFooterWrapper = ({ children }: WizardFooterWrapperProps) => (
44
48
  );
45
49
 
46
50
  export const WizardFooter = ({ activeStep, ...internalProps }: WizardFooterProps) => {
47
- const activeStepFooter = !isCustomWizardFooter(activeStep.footer) && activeStep.footer;
51
+ const activeStepFooter = !isCustomWizardFooter(activeStep?.footer) && activeStep?.footer;
48
52
  return <InternalWizardFooter {...internalProps} {...activeStepFooter} />;
49
53
  };
50
54
 
@@ -7,7 +7,7 @@ import TimesIcon from '@patternfly/react-icons/dist/esm/icons/times-icon';
7
7
 
8
8
  export interface WizardHeaderProps {
9
9
  /** Callback function called when the X (Close) button is clicked */
10
- onClose?: () => void;
10
+ onClose?: (event: React.MouseEvent<HTMLButtonElement>) => void;
11
11
  /** Title of the wizard */
12
12
  title: string;
13
13
  /** Description of the wizard */
@@ -11,12 +11,12 @@ import { WizardNavItem } from './WizardNavItem';
11
11
  * This component is not exposed to consumers.
12
12
  */
13
13
 
14
- interface WizardNavInternalProps extends Pick<WizardProps, 'isStepVisitRequired'> {
14
+ interface WizardNavInternalProps extends Pick<WizardProps, 'isVisitRequired' | 'isProgressive'> {
15
15
  nav: Partial<WizardNavProps>;
16
16
  isNavExpanded: boolean;
17
17
  }
18
18
 
19
- export const WizardNavInternal = ({ nav, isStepVisitRequired, isNavExpanded }: WizardNavInternalProps) => {
19
+ export const WizardNavInternal = ({ nav, isVisitRequired, isProgressive, isNavExpanded }: WizardNavInternalProps) => {
20
20
  const { activeStep, steps, goToStepByIndex } = useWizardContext();
21
21
 
22
22
  const wizardNavProps: WizardNavProps = {
@@ -31,7 +31,7 @@ export const WizardNavInternal = ({ nav, isStepVisitRequired, isNavExpanded }: W
31
31
  <WizardNav {...wizardNavProps}>
32
32
  {steps.map((step, stepIndex) => {
33
33
  const hasVisitedNextStep = steps.some(step => step.index > stepIndex + 1 && step.isVisited);
34
- const isStepDisabled = step.isDisabled || (isStepVisitRequired && !step.isVisited && !hasVisitedNextStep);
34
+ const isStepDisabled = step.isDisabled || (isVisitRequired && !step.isVisited && !hasVisitedNextStep);
35
35
  const customStepNavItem = isCustomWizardNavItem(step.navItem) && (
36
36
  <React.Fragment key={step.id}>
37
37
  {typeof step.navItem === 'function' ? step.navItem(step, activeStep, steps, goToStepByIndex) : step.navItem}
@@ -46,7 +46,7 @@ export const WizardNavInternal = ({ nav, isStepVisitRequired, isNavExpanded }: W
46
46
  const subStep = steps.find(step => step.id === subStepId);
47
47
  const hasVisitedNextStep = steps.some(step => step.index > subStep.index && step.isVisited);
48
48
  const isSubStepDisabled =
49
- subStep.isDisabled || (isStepVisitRequired && !subStep.isVisited && !hasVisitedNextStep);
49
+ subStep.isDisabled || (isVisitRequired && !subStep.isVisited && !hasVisitedNextStep);
50
50
  const customSubStepNavItem = isCustomWizardNavItem(subStep.navItem) && (
51
51
  <React.Fragment key={subStep.id}>
52
52
  {typeof subStep.navItem === 'function'
@@ -70,51 +70,59 @@ export const WizardNavInternal = ({ nav, isStepVisitRequired, isNavExpanded }: W
70
70
  hasActiveChild = true;
71
71
  }
72
72
 
73
- return (
74
- customSubStepNavItem || (
75
- <WizardNavItem
76
- key={subStep.id}
77
- id={subStep.id}
78
- content={subStep.name}
79
- isCurrent={activeStep?.id === subStep.id}
80
- isDisabled={isSubStepDisabled}
81
- isVisited={subStep.isVisited}
82
- stepIndex={subStep.index}
83
- onNavItemClick={goToStepByIndex}
84
- status={subStep.status}
85
- {...subStep.navItem}
86
- />
87
- )
88
- );
73
+ if (!isProgressive || (isProgressive && subStep.index <= activeStep.index)) {
74
+ return (
75
+ customSubStepNavItem || (
76
+ <WizardNavItem
77
+ key={subStep.id}
78
+ id={subStep.id}
79
+ content={subStep.name}
80
+ isCurrent={activeStep?.id === subStep.id}
81
+ isDisabled={isSubStepDisabled}
82
+ isVisited={subStep.isVisited}
83
+ stepIndex={subStep.index}
84
+ onClick={() => goToStepByIndex(subStep.index)}
85
+ status={subStep.status}
86
+ {...subStep.navItem}
87
+ />
88
+ )
89
+ );
90
+ }
89
91
  });
90
92
  const hasEnabledChildren = React.Children.toArray(subNavItems).some(
91
93
  child => React.isValidElement(child) && !child.props.isDisabled
92
94
  );
93
95
 
94
- return (
95
- customStepNavItem || (
96
- <WizardNavItem
97
- key={step.id}
98
- id={step.id}
99
- content={step.name}
100
- isExpandable={step.isCollapsible ?? true}
101
- isCurrent={hasActiveChild}
102
- isDisabled={!hasEnabledChildren}
103
- isVisited={step.isVisited}
104
- stepIndex={firstSubStepIndex}
105
- onNavItemClick={goToStepByIndex}
106
- status={step.status}
107
- {...step.navItem}
108
- >
109
- <WizardNav {...wizardNavProps} isInnerList>
110
- {subNavItems}
111
- </WizardNav>
112
- </WizardNavItem>
113
- )
114
- );
96
+ if (!isProgressive || (isProgressive && step.index <= activeStep.index)) {
97
+ return (
98
+ customStepNavItem || (
99
+ <WizardNavItem
100
+ key={step.id}
101
+ id={step.id}
102
+ content={step.name}
103
+ isExpandable={step.isExpandable}
104
+ isCurrent={hasActiveChild}
105
+ isDisabled={!hasEnabledChildren}
106
+ isVisited={step.isVisited}
107
+ stepIndex={firstSubStepIndex}
108
+ onClick={() => goToStepByIndex(firstSubStepIndex)}
109
+ status={step.status}
110
+ {...step.navItem}
111
+ >
112
+ <WizardNav {...wizardNavProps} isInnerList>
113
+ {subNavItems}
114
+ </WizardNav>
115
+ </WizardNavItem>
116
+ )
117
+ );
118
+ }
115
119
  }
116
120
 
117
- if (isWizardBasicStep(step) && !step.isHidden) {
121
+ if (
122
+ isWizardBasicStep(step) &&
123
+ !step.isHidden &&
124
+ (!isProgressive || (isProgressive && step.index <= activeStep.index))
125
+ ) {
118
126
  return (
119
127
  customStepNavItem || (
120
128
  <WizardNavItem
@@ -125,7 +133,7 @@ export const WizardNavInternal = ({ nav, isStepVisitRequired, isNavExpanded }: W
125
133
  isDisabled={isStepDisabled}
126
134
  isVisited={step.isVisited}
127
135
  stepIndex={step.index}
128
- onNavItemClick={goToStepByIndex}
136
+ onClick={() => goToStepByIndex(step.index)}
129
137
  status={step.status}
130
138
  {...step.navItem}
131
139
  />
@@ -5,9 +5,10 @@ import styles from '@patternfly/react-styles/css/components/Wizard/wizard';
5
5
  import AngleRightIcon from '@patternfly/react-icons/dist/esm/icons/angle-right-icon';
6
6
  import ExclamationCircleIcon from '@patternfly/react-icons/dist/esm/icons/exclamation-circle-icon';
7
7
 
8
+ import { OUIAProps, useOUIAProps } from '../../../helpers';
8
9
  import { WizardNavItemStatus } from './types';
9
10
 
10
- export interface WizardNavItemProps {
11
+ export interface WizardNavItemProps extends OUIAProps {
11
12
  /** Can nest a WizardNav component for substeps */
12
13
  children?: React.ReactNode;
13
14
  /** The content to display in the navigation item */
@@ -21,11 +22,13 @@ export interface WizardNavItemProps {
21
22
  /** The step index passed into the onNavItemClick callback */
22
23
  stepIndex: number;
23
24
  /** Callback for when the navigation item is clicked */
24
- onNavItemClick?: (stepIndex: number) => any;
25
+ onClick?: (event: React.MouseEvent<HTMLButtonElement> | React.MouseEvent<HTMLAnchorElement>, index: number) => any;
25
26
  /** Component used to render WizardNavItem */
26
- navItemComponent?: 'button' | 'a';
27
+ component?: 'button' | 'a';
27
28
  /** An optional url to use for when using an anchor component */
28
29
  href?: string;
30
+ /** Where to display the linked URL when using an anchor component */
31
+ target?: React.HTMLAttributeAnchorTarget;
29
32
  /** Flag indicating that this NavItem has child steps and is expandable */
30
33
  isExpandable?: boolean;
31
34
  /** The id for the navigation item */
@@ -34,29 +37,31 @@ export interface WizardNavItemProps {
34
37
  status?: 'default' | 'error';
35
38
  }
36
39
 
37
- export const WizardNavItem: React.FunctionComponent<WizardNavItemProps> = ({
40
+ export const WizardNavItem = ({
38
41
  children = null,
39
42
  content = '',
40
43
  isCurrent = false,
41
44
  isDisabled = false,
42
45
  isVisited = false,
43
46
  stepIndex,
44
- onNavItemClick = () => undefined,
45
- navItemComponent = 'button',
46
- href = null,
47
+ onClick,
48
+ component: NavItemComponent = 'button',
49
+ href,
47
50
  isExpandable = false,
48
51
  id,
49
52
  status = 'default',
50
- ...rest
53
+ target,
54
+ ouiaId,
55
+ ouiaSafe = true
51
56
  }: WizardNavItemProps) => {
52
- const NavItemComponent = navItemComponent;
53
57
  const [isExpanded, setIsExpanded] = React.useState(false);
58
+ const ouiaProps = useOUIAProps(WizardNavItem.displayName, ouiaId, ouiaSafe);
54
59
 
55
60
  React.useEffect(() => {
56
61
  setIsExpanded(isCurrent);
57
62
  }, [isCurrent]);
58
63
 
59
- if (navItemComponent === 'a' && !href && process.env.NODE_ENV !== 'production') {
64
+ if (NavItemComponent === 'a' && !href && process.env.NODE_ENV !== 'production') {
60
65
  // eslint-disable-next-line no-console
61
66
  console.error('WizardNavItem: When using an anchor, please provide an href');
62
67
  }
@@ -87,12 +92,13 @@ export const WizardNavItem: React.FunctionComponent<WizardNavItemProps> = ({
87
92
  )}
88
93
  >
89
94
  <NavItemComponent
90
- {...rest}
91
- {...(navItemComponent === 'a' ? { tabIndex: isDisabled ? -1 : undefined, href } : { disabled: isDisabled })}
95
+ {...(NavItemComponent === 'a'
96
+ ? { tabIndex: isDisabled ? -1 : undefined, href, target }
97
+ : { disabled: isDisabled })}
92
98
  {...(id && { id: id.toString() })}
93
99
  onClick={e => {
94
- e.preventDefault();
95
- isExpandable ? setIsExpanded(!isExpanded || isCurrent) : onNavItemClick(stepIndex);
100
+ e.stopPropagation();
101
+ isExpandable ? setIsExpanded(!isExpanded || isCurrent) : onClick?.(e, stepIndex);
96
102
  }}
97
103
  className={css(
98
104
  styles.wizardNavLink,
@@ -103,6 +109,7 @@ export const WizardNavItem: React.FunctionComponent<WizardNavItemProps> = ({
103
109
  aria-current={isCurrent && !children ? 'step' : false}
104
110
  {...(isExpandable && { 'aria-expanded': isExpanded })}
105
111
  {...(ariaLabel && { 'aria-label': ariaLabel })}
112
+ {...ouiaProps}
106
113
  >
107
114
  {isExpandable ? (
108
115
  <>
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
 
3
- import { WizardNavItemType } from './types';
3
+ import { isWizardParentStep, WizardNavItemType } from './types';
4
4
  import { WizardBodyProps } from './WizardBody';
5
5
  import { useWizardContext } from './WizardContext';
6
6
  import { WizardFooterProps } from './WizardFooter';
@@ -15,7 +15,7 @@ export interface WizardStepProps {
15
15
  /** Unique identifier */
16
16
  id: string | number;
17
17
  /** Optional for when the step is used as a parent to sub-steps */
18
- children?: React.ReactNode;
18
+ children?: React.ReactNode | undefined;
19
19
  /** Props for WizardBody that wraps content by default. Can be set to null for exclusion of WizardBody. */
20
20
  body?: Omit<Omit<WizardBodyProps, 'children'>, 'children'> | null;
21
21
  /** Optional list of sub-steps */
@@ -30,8 +30,8 @@ export interface WizardStepProps {
30
30
  footer?: React.ReactElement | Partial<WizardFooterProps>;
31
31
  /** Used to determine icon next to the step's navigation item */
32
32
  status?: 'default' | 'error';
33
- /** Flag to determine whether sub-steps can collapse or not */
34
- isCollapsible?: boolean;
33
+ /** Flag to determine whether parent steps can expand or not. Defaults to false. */
34
+ isExpandable?: boolean;
35
35
  }
36
36
 
37
37
  export const WizardStep = ({ children, steps: _subSteps, ...props }: WizardStepProps) => {
@@ -40,6 +40,8 @@ export const WizardStep = ({ children, steps: _subSteps, ...props }: WizardStepP
40
40
 
41
41
  // Update step in context when props change or when the step is active has yet to be marked as visited.
42
42
  React.useEffect(() => {
43
+ const shouldUpdateIsVisited = !isWizardParentStep(activeStep) && id === activeStep?.id && !activeStep?.isVisited;
44
+
43
45
  setStep({
44
46
  id,
45
47
  name,
@@ -49,9 +51,9 @@ export const WizardStep = ({ children, steps: _subSteps, ...props }: WizardStepP
49
51
  ...(navItem && { navItem }),
50
52
  ...(footer && { footer }),
51
53
  ...(status && { status }),
52
- ...(id === activeStep?.id && !activeStep?.isVisited && { isVisited: true })
54
+ ...(shouldUpdateIsVisited && { isVisited: true })
53
55
  });
54
- }, [body, footer, id, isDisabled, isHidden, name, navItem, status, activeStep?.id, activeStep?.isVisited, setStep]);
56
+ }, [body, footer, id, isDisabled, isHidden, name, navItem, status, activeStep, setStep]);
55
57
 
56
58
  return <>{children}</>;
57
59
  };
@@ -7,7 +7,7 @@ import CaretDownIcon from '@patternfly/react-icons/dist/esm/icons/caret-down-ico
7
7
 
8
8
  import { KeyTypes } from '../../../helpers/constants';
9
9
  import { WizardNavProps, WizardBody, WizardStep, WizardStepProps } from '../Wizard';
10
- import { WizardControlStep, isWizardSubStep } from './types';
10
+ import { WizardStepType, isWizardSubStep } from './types';
11
11
 
12
12
  /**
13
13
  * Used to toggle between step content, including the body and footer. This is also where the navigation and its expandability is controlled.
@@ -15,9 +15,9 @@ import { WizardControlStep, isWizardSubStep } from './types';
15
15
 
16
16
  export interface WizardToggleProps {
17
17
  /** List of steps and/or sub-steps */
18
- steps: WizardControlStep[];
18
+ steps: WizardStepType[];
19
19
  /** The current step */
20
- activeStep: WizardControlStep;
20
+ activeStep: WizardStepType;
21
21
  /** Wizard footer */
22
22
  footer: React.ReactElement;
23
23
  /** Wizard navigation */
@@ -27,7 +27,7 @@ export interface WizardToggleProps {
27
27
  /** Flag to determine whether the dropdown navigation is expanded */
28
28
  isNavExpanded?: boolean;
29
29
  /** Callback to expand or collapse the dropdown navigation */
30
- toggleNavExpanded?: () => void;
30
+ toggleNavExpanded?: (event: React.MouseEvent<HTMLButtonElement> | KeyboardEvent) => void;
31
31
  }
32
32
 
33
33
  export const WizardToggle = ({
@@ -49,7 +49,7 @@ export const WizardToggle = ({
49
49
  const handleKeyClicks = React.useCallback(
50
50
  (event: KeyboardEvent): void => {
51
51
  if (isNavExpanded && event.key === KeyTypes.Escape) {
52
- toggleNavExpanded?.();
52
+ toggleNavExpanded?.(event);
53
53
  }
54
54
  },
55
55
  [isNavExpanded, toggleNavExpanded]