Skip to content

Commit ba66f17

Browse files
committed
feat: first test for new wizard
1 parent 7746a98 commit ba66f17

File tree

6 files changed

+354
-5
lines changed

6 files changed

+354
-5
lines changed

src/i18n/messages/all.en.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,9 @@
468468
"i18nStrings.nextButton": "Next",
469469
"i18nStrings.optional": "optional",
470470
"i18nStrings.nextButtonLoadingAnnouncement": "Loading next step",
471-
"i18nStrings.submitButtonLoadingAnnouncement": "Submitting form"
471+
"i18nStrings.submitButtonLoadingAnnouncement": "Submitting form",
472+
"i18nStrings.stepNavigationTitle": "Step",
473+
"i18nStrings.stepNavigationDismissAriaLabel": "Close step navigation",
474+
"i18nStrings.stepNavigationConfirmButton": "Ok"
472475
}
473-
}
476+
}

src/wizard/interfaces.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,9 @@ export namespace WizardProps {
170170
optional?: string;
171171
nextButtonLoadingAnnouncement?: string;
172172
submitButtonLoadingAnnouncement?: string;
173+
stepNavigationTitle?: string;
174+
stepNavigationDismissAriaLabel?: string;
175+
stepNavigationConfirmButton?: string;
173176
}
174177

175178
export interface NavigateDetail {

src/wizard/internal.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,9 @@ export default function InternalWizard({
136136
previousButton: i18n('i18nStrings.previousButton', rest.i18nStrings?.previousButton),
137137
nextButton: i18n('i18nStrings.nextButton', rest.i18nStrings?.nextButton),
138138
optional: i18n('i18nStrings.optional', rest.i18nStrings?.optional),
139+
stepNavigationTitle: rest.i18nStrings?.stepNavigationTitle,
140+
stepNavigationDismissAriaLabel: rest.i18nStrings?.stepNavigationDismissAriaLabel,
141+
stepNavigationConfirmButton: rest.i18nStrings?.stepNavigationConfirmButton,
139142
};
140143

141144
if (activeStepIndex && activeStepIndex >= steps.length) {
@@ -201,12 +204,14 @@ export default function InternalWizard({
201204
i18nStrings={i18nStrings}
202205
submitButtonText={submitButtonText}
203206
activeStepIndex={actualActiveStepIndex}
207+
farthestStepIndex={farthestStepIndex.current}
204208
isPrimaryLoading={isLoadingNextStep}
205209
allowSkipTo={allowSkipTo}
206210
customPrimaryActions={customPrimaryActions}
207211
secondaryActions={secondaryActions}
208212
onCancelClick={onCancelClick}
209213
onPreviousClick={onPreviousClick}
214+
onStepClick={onStepClick}
210215
onSkipToClick={onSkipToClick}
211216
onPrimaryClick={onPrimaryClick}
212217
/>

src/wizard/styles.scss

Lines changed: 151 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,14 +261,163 @@
261261
}
262262

263263
.collapsed-steps {
264-
color: awsui.$color-text-heading-secondary;
265-
font-weight: styles.$font-weight-bold;
266264
padding-block-start: awsui.$space-scaled-xxs;
267265
&-hidden {
268266
display: none;
269267
}
270268
}
271269

270+
.collapsed-steps-navigation {
271+
display: inline-block;
272+
}
273+
274+
.collapsed-steps-trigger {
275+
@include styles.styles-reset;
276+
display: inline-flex;
277+
align-items: center;
278+
gap: awsui.$space-xxs;
279+
padding-block: 0;
280+
padding-inline: 0;
281+
border-block: none;
282+
border-inline: none;
283+
background: transparent;
284+
color: awsui.$color-text-link-default;
285+
font-weight: styles.$font-weight-bold;
286+
font-size: inherit;
287+
cursor: pointer;
288+
289+
&:hover {
290+
color: awsui.$color-text-link-hover;
291+
}
292+
293+
&:disabled {
294+
color: awsui.$color-text-interactive-disabled;
295+
cursor: default;
296+
}
297+
298+
@include focus-visible.when-visible {
299+
@include styles.link-focus;
300+
}
301+
}
302+
303+
.collapsed-steps-trigger-label {
304+
/* used for test utils */
305+
}
306+
307+
.step-navigation-list {
308+
list-style: none;
309+
margin-block: 0;
310+
margin-inline: 0;
311+
padding-block: 0;
312+
padding-inline: 0;
313+
}
314+
315+
.step-navigation-item {
316+
position: relative;
317+
padding-inline-start: awsui.$space-l;
318+
margin-block-end: awsui.$space-s;
319+
320+
&:not(:last-child)::before {
321+
content: '';
322+
position: absolute;
323+
inset-inline-start: calc(#{awsui.$space-l} / 2 - 1px);
324+
inset-block-start: calc(#{awsui.$space-m} + 6px);
325+
block-size: calc(100% + #{awsui.$space-s} - 6px);
326+
inline-size: 2px;
327+
background-color: awsui.$color-border-divider-default;
328+
}
329+
330+
&:last-child {
331+
margin-block-end: 0;
332+
}
333+
}
334+
335+
.step-navigation-button {
336+
@include styles.styles-reset;
337+
display: flex;
338+
align-items: flex-start;
339+
gap: awsui.$space-xs;
340+
padding-block: 0;
341+
padding-inline: 0;
342+
border-block: none;
343+
border-inline: none;
344+
background: transparent;
345+
cursor: pointer;
346+
text-align: start;
347+
inline-size: 100%;
348+
349+
&:disabled {
350+
cursor: default;
351+
}
352+
353+
@include focus-visible.when-visible {
354+
@include styles.link-focus;
355+
}
356+
}
357+
358+
.step-navigation-button-disabled {
359+
cursor: default;
360+
}
361+
362+
.step-navigation-circle {
363+
flex-shrink: 0;
364+
inline-size: 12px;
365+
block-size: 12px;
366+
margin-block-start: 4px;
367+
border-start-start-radius: 50%;
368+
border-start-end-radius: 50%;
369+
border-end-start-radius: 50%;
370+
border-end-end-radius: 50%;
371+
border-block: 2px solid awsui.$color-text-interactive-disabled;
372+
border-inline: 2px solid awsui.$color-text-interactive-disabled;
373+
background-color: awsui.$color-background-container-content;
374+
box-sizing: border-box;
375+
}
376+
377+
.step-navigation-circle-selected {
378+
border-color: awsui.$color-background-control-checked;
379+
background-color: awsui.$color-background-control-checked;
380+
box-shadow:
381+
0 0 0 2px awsui.$color-background-container-content,
382+
0 0 0 4px awsui.$color-background-control-checked;
383+
}
384+
385+
.step-navigation-circle-visited {
386+
border-color: awsui.$color-text-interactive-default;
387+
}
388+
389+
.step-navigation-circle-unvisited {
390+
border-color: awsui.$color-text-interactive-disabled;
391+
}
392+
393+
.step-navigation-content {
394+
display: flex;
395+
flex-direction: column;
396+
}
397+
398+
.step-navigation-label {
399+
font-size: awsui.$font-size-body-s;
400+
color: awsui.$color-text-small;
401+
}
402+
403+
.step-navigation-title {
404+
font-size: awsui.$font-size-body-m;
405+
color: awsui.$color-text-body-default;
406+
}
407+
408+
.step-navigation-title-selected {
409+
color: awsui.$color-background-control-checked;
410+
font-weight: styles.$font-weight-bold;
411+
}
412+
413+
.step-navigation-title-visited {
414+
color: awsui.$color-text-interactive-default;
415+
}
416+
417+
.step-navigation-title-unvisited {
418+
color: awsui.$color-text-status-inactive;
419+
}
420+
272421
.form-header-component {
273422
&-wrapper {
274423
outline: none;

src/wizard/wizard-form.tsx

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,14 @@ import { useEffectOnUpdate } from '../internal/hooks/use-effect-on-update';
2525
import { WizardProps } from './interfaces';
2626
import WizardActions from './wizard-actions';
2727
import WizardFormHeader from './wizard-form-header';
28+
import WizardStepNavigationModal from './wizard-step-navigation-modal';
2829

2930
import styles from './styles.css.js';
3031

3132
interface WizardFormProps extends InternalBaseComponentProps {
3233
steps: ReadonlyArray<WizardProps.Step>;
3334
activeStepIndex: number;
35+
farthestStepIndex: number;
3436
showCollapsedSteps: boolean;
3537
i18nStrings: WizardProps.I18nStrings;
3638
submitButtonText?: string;
@@ -41,6 +43,7 @@ interface WizardFormProps extends InternalBaseComponentProps {
4143
onCancelClick: () => void;
4244
onPreviousClick: () => void;
4345
onPrimaryClick: () => void;
46+
onStepClick: (stepIndex: number) => void;
4447
onSkipToClick: (stepIndex: number) => void;
4548
}
4649

@@ -75,6 +78,7 @@ function WizardForm({
7578
stepHeaderRef,
7679
steps,
7780
activeStepIndex,
81+
farthestStepIndex,
7882
showCollapsedSteps,
7983
i18nStrings,
8084
submitButtonText,
@@ -85,6 +89,7 @@ function WizardForm({
8589
onCancelClick,
8690
onPreviousClick,
8791
onPrimaryClick,
92+
onStepClick,
8893
onSkipToClick,
8994
}: WizardFormProps & { stepHeaderRef: MutableRefObject<HTMLDivElement | null> }) {
9095
const rootRef = useRef<HTMLElement>();
@@ -132,7 +137,16 @@ function WizardForm({
132137
<>
133138
<WizardFormHeader>
134139
<div className={clsx(styles['collapsed-steps'], !showCollapsedSteps && styles['collapsed-steps-hidden'])}>
135-
{i18nStrings.collapsedStepsLabel?.(activeStepIndex + 1, steps.length)}
140+
<WizardStepNavigationModal
141+
activeStepIndex={activeStepIndex}
142+
farthestStepIndex={farthestStepIndex}
143+
allowSkipTo={allowSkipTo}
144+
i18nStrings={i18nStrings}
145+
isLoadingNextStep={isPrimaryLoading}
146+
onStepClick={onStepClick}
147+
onSkipToClick={onSkipToClick}
148+
steps={steps}
149+
/>
136150
</div>
137151
<InternalHeader
138152
className={styles['form-header-component']}

0 commit comments

Comments
 (0)