Skip to content

Commit ba77f73

Browse files
committed
fix(stepper): avoid breaking change in stepControl type
In #15134 we reworked the stepper not to depend on `@angular/forms` under the assumption that our limited `FormControl` interface would be enough to avoid a breaking change. Some people ended up being broken by the change so this PR reworks the `stepControl` type to avoid the breaking change. Fixes #15462.
1 parent f82259b commit ba77f73

File tree

2 files changed

+98
-8
lines changed

2 files changed

+98
-8
lines changed

src/cdk/stepper/stepper.ts

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -124,12 +124,7 @@ export class CdkStep implements OnChanges {
124124
@ViewChild(TemplateRef) content: TemplateRef<any>;
125125

126126
/** The top level abstract control of the step. */
127-
@Input() stepControl: {
128-
valid: boolean;
129-
invalid: boolean;
130-
pending: boolean;
131-
reset: () => void;
132-
};
127+
@Input() stepControl: FormControlLike;
133128

134129
/** Whether user has seen the expanded step content or not. */
135130
interacted = false;
@@ -516,3 +511,57 @@ export class CdkStepper implements AfterViewInit, OnDestroy {
516511
return stepperElement === focusedElement || stepperElement.contains(focusedElement);
517512
}
518513
}
514+
515+
516+
/**
517+
* Simplified representation of a FormControl from @angular/forms.
518+
* Used to avoid having to bring in @angular/forms for a single optional interface.
519+
* @docs-private
520+
*/
521+
interface FormControlLike {
522+
asyncValidator: () => any | null;
523+
dirty: boolean;
524+
disabled: boolean;
525+
enabled: boolean;
526+
errors: {[key: string]: any} | null;
527+
invalid: boolean;
528+
parent: any;
529+
pending: boolean;
530+
pristine: boolean;
531+
root: FormControlLike;
532+
status: string;
533+
statusChanges: Observable<any>;
534+
touched: boolean;
535+
untouched: boolean;
536+
updateOn: any;
537+
valid: boolean;
538+
validator: () => any | null;
539+
value: any;
540+
valueChanges: Observable<any>;
541+
clearAsyncValidators(): void;
542+
clearValidators(): void;
543+
disable(opts?: any): void;
544+
enable(opts?: any): void;
545+
get(path: (string | number)[] | string): FormControlLike | null;
546+
getError(errorCode: string, path?: (string | number)[] | string): any;
547+
hasError(errorCode: string, path?: (string | number)[] | string): boolean;
548+
markAllAsTouched(): void;
549+
markAsDirty(opts?: any): void;
550+
markAsPending(opts?: any): void;
551+
markAsPristine(opts?: any): void;
552+
markAsTouched(opts?: any): void;
553+
markAsUntouched(opts?: any): void;
554+
patchValue(value: any, options?: Object): void;
555+
reset(value?: any, options?: Object): void;
556+
setAsyncValidators(newValidator: () => any | (() => any)[] | null): void;
557+
setErrors(errors: {[key: string]: any} | null, opts?: any): void;
558+
setParent(parent: any): void;
559+
setValidators(newValidator: () => any | (() => any)[] | null): void;
560+
setValue(value: any, options?: Object): void;
561+
updateValueAndValidity(opts?: any): void;
562+
patchValue(value: any, options?: any): void;
563+
registerOnChange(fn: Function): void;
564+
registerOnDisabledChange(fn: (isDisabled: boolean) => void): void;
565+
reset(formState?: any, options?: any): void;
566+
setValue(value: any, options?: any): void;
567+
}

tools/public_api_guard/cdk/stepper.d.ts

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,51 @@ export declare class CdkStep implements OnChanges {
1313
optional: boolean;
1414
state: StepState;
1515
stepControl: {
16-
valid: boolean;
16+
asyncValidator: () => any | null;
17+
dirty: boolean;
18+
disabled: boolean;
19+
enabled: boolean;
20+
errors: {[key: string]: any} | null;
1721
invalid: boolean;
22+
parent: any;
1823
pending: boolean;
19-
reset: () => void;
24+
pristine: boolean;
25+
root: FormControlLike;
26+
status: string;
27+
statusChanges: Observable<any>;
28+
touched: boolean;
29+
untouched: boolean;
30+
updateOn: any;
31+
valid: boolean;
32+
validator: () => any | null;
33+
value: any;
34+
valueChanges: Observable<any>;
35+
clearAsyncValidators(): void;
36+
clearValidators(): void;
37+
disable(opts?: any): void;
38+
enable(opts?: any): void;
39+
get(path: (string | number)[] | string): FormControlLike | null;
40+
getError(errorCode: string, path?: (string | number)[] | string): any;
41+
hasError(errorCode: string, path?: (string | number)[] | string): boolean;
42+
markAllAsTouched(): void;
43+
markAsDirty(opts?: any): void;
44+
markAsPending(opts?: any): void;
45+
markAsPristine(opts?: any): void;
46+
markAsTouched(opts?: any): void;
47+
markAsUntouched(opts?: any): void;
48+
patchValue(value: any, options?: Object): void;
49+
reset(value?: any, options?: Object): void;
50+
setAsyncValidators(newValidator: () => any | (() => any)[] | null): void;
51+
setErrors(errors: {[key: string]: any} | null, opts?: any): void;
52+
setParent(parent: any): void;
53+
setValidators(newValidator: () => any | (() => any)[] | null): void;
54+
setValue(value: any, options?: Object): void;
55+
updateValueAndValidity(opts?: any): void;
56+
patchValue(value: any, options?: any): void;
57+
registerOnChange(fn: Function): void;
58+
registerOnDisabledChange(fn: (isDisabled: boolean) => void): void;
59+
reset(formState?: any, options?: any): void;
60+
setValue(value: any, options?: any): void;
2061
};
2162
stepLabel: CdkStepLabel;
2263
constructor(_stepper: CdkStepper, stepperOptions?: StepperOptions);

0 commit comments

Comments
 (0)