@@ -15,8 +15,10 @@ import { provideKitIonicSignalForms } from './provide-kit-ionic-signal-forms';
1515 <ion-checkbox [formField]="fields.checkbox"></ion-checkbox>
1616 <ion-radio-group [formField]="fields.radio"></ion-radio-group>
1717 <ion-toggle [formField]="fields.toggle"></ion-toggle>
18- <ion-input [formField]="fields.explicit" errorText="Cross-field error"></ion-input>
19- <ion-input [formField]="fields.explicit" [errorText]="boundError"></ion-input>
18+ <ion-input [formField]="fields.custom"></ion-input>
19+ <ion-input [formField]="fields.unknown"></ion-input>
20+ <ion-input data-testid="static-error" [formField]="fields.explicit" errorText="Cross-field error"></ion-input>
21+ <ion-input data-testid="bound-error" [formField]="fields.explicit" [errorText]="boundError"></ion-input>
2022 ` ,
2123} )
2224class Host {
@@ -29,19 +31,19 @@ class Host {
2931 checkbox : false ,
3032 radio : '' ,
3133 toggle : false ,
34+ custom : '' ,
35+ unknown : '' ,
3236 explicit : '' ,
3337 } ) ;
3438 readonly fields = form ( this . model , ( path ) => {
35- validate ( path . input , ( { value } ) =>
36- value ( ) ? undefined : { kind : 'non-string' , message : 123 as unknown as string } ,
37- ) ;
38- validate ( path . input , ( { value } ) => ( value ( ) ? undefined : { kind : 'empty' , message : ' ' } ) ) ;
39- required ( path . input , { message : 'Input required' } ) ;
40- required ( path . textarea , { message : 'Textarea required' } ) ;
41- required ( path . select , { message : 'Select required' } ) ;
42- required ( path . checkbox , { message : 'Checkbox required' } ) ;
43- required ( path . radio , { message : 'Radio required' } ) ;
44- required ( path . toggle , { message : 'Toggle required' } ) ;
39+ required ( path . input ) ;
40+ required ( path . textarea ) ;
41+ required ( path . select ) ;
42+ required ( path . checkbox ) ;
43+ required ( path . radio ) ;
44+ required ( path . toggle ) ;
45+ required ( path . custom , { message : 'Localized required' } ) ;
46+ validate ( path . unknown , ( { value } ) => ( value ( ) ? undefined : { kind : 'domain-error' } ) ) ;
4547 required ( path . explicit , { message : 'Generated error' } ) ;
4648 } ) ;
4749}
@@ -54,11 +56,20 @@ describe('KitIonicFormField', () => {
5456
5557 expect (
5658 [ ...fixture . nativeElement . querySelectorAll ( 'ion-input, ion-textarea, ion-select, ion-checkbox, ion-radio-group, ion-toggle' ) ]
57- . slice ( 0 , 6 )
59+ . slice ( 0 , 8 )
5860 . map ( ( element : { errorText ?: string } ) => element . errorText ) ,
59- ) . toEqual ( [ 'Input required' , 'Textarea required' , 'Select required' , 'Checkbox required' , 'Radio required' , 'Toggle required' ] ) ;
60- expect ( fixture . nativeElement . querySelectorAll ( 'ion-input' ) [ 1 ] . errorText ) . toBe ( 'Cross-field error' ) ;
61- expect ( fixture . nativeElement . querySelectorAll ( 'ion-input' ) [ 2 ] . errorText ) . toBe ( 'Bound cross-field error' ) ;
61+ ) . toEqual ( [
62+ 'This field is required.' ,
63+ 'This field is required.' ,
64+ 'This field is required.' ,
65+ 'This field is required.' ,
66+ 'This field is required.' ,
67+ 'This field is required.' ,
68+ 'Localized required' ,
69+ 'Enter a valid value.' ,
70+ ] ) ;
71+ expect ( fixture . nativeElement . querySelector ( '[data-testid="static-error"]' ) . errorText ) . toBe ( 'Cross-field error' ) ;
72+ expect ( fixture . nativeElement . querySelector ( '[data-testid="bound-error"]' ) . errorText ) . toBe ( 'Bound cross-field error' ) ;
6273
6374 const input = fixture . nativeElement . querySelector ( 'ion-input' ) ;
6475 expect ( input . classList . contains ( 'ion-invalid' ) ) . toBe ( true ) ;
0 commit comments