@@ -113,7 +113,7 @@ class Pattern extends BasePattern {
113
113
}
114
114
115
115
// In any case, clear the custom validity first.
116
- this . set_validity ( { input : input , msg : "" } ) ;
116
+ this . set_error ( { input : input , msg : "" , skip_event : true } ) ;
117
117
const validity_state = input . validity ;
118
118
119
119
if ( event ?. submitter ?. hasAttribute ( "formnovalidate" ) ) {
@@ -148,7 +148,7 @@ class Pattern extends BasePattern {
148
148
const message =
149
149
input_options . message . equality ||
150
150
`The value is not equal to %{attribute}` ;
151
- this . set_validity ( {
151
+ this . set_error ( {
152
152
input : input ,
153
153
msg : message ,
154
154
attribute : input_options . equality ,
@@ -216,7 +216,7 @@ class Pattern extends BasePattern {
216
216
) ;
217
217
msg_attr = msg_attr || not_after_el . name ;
218
218
}
219
- this . set_validity ( {
219
+ this . set_error ( {
220
220
input : input ,
221
221
msg : msg || msg_default_not_after ,
222
222
attribute : msg_attr . trim ( ) ,
@@ -237,7 +237,7 @@ class Pattern extends BasePattern {
237
237
) ;
238
238
msg_attr = msg_attr || not_before_el . name ;
239
239
}
240
- this . set_validity ( {
240
+ this . set_error ( {
241
241
input : input ,
242
242
msg : msg || msg_default_not_before ,
243
243
attribute : msg_attr . trim ( ) ,
@@ -266,15 +266,15 @@ class Pattern extends BasePattern {
266
266
// Default error cases with custom messages.
267
267
268
268
if ( validity_state . valueMissing && input_options . message . required ) {
269
- this . set_validity ( { input : input , msg : input_options . message . required } ) ;
269
+ this . set_error ( { input : input , msg : input_options . message . required } ) ;
270
270
} else if ( validity_state . rangeUnderflow && input_options . message . min ) {
271
- this . set_validity ( {
271
+ this . set_error ( {
272
272
input : input ,
273
273
msg : input_options . message . min ,
274
274
min : input . getAttribute ( "min" ) ,
275
275
} ) ;
276
276
} else if ( validity_state . rangeOverflow && input_options . message . max ) {
277
- this . set_validity ( {
277
+ this . set_error ( {
278
278
input : input ,
279
279
msg : input_options . message . max ,
280
280
max : input . getAttribute ( "max" ) ,
@@ -284,38 +284,43 @@ class Pattern extends BasePattern {
284
284
input . type === "number" &&
285
285
input_options . message . number
286
286
) {
287
- this . set_validity ( { input : input , msg : input_options . message . number } ) ;
287
+ this . set_error ( { input : input , msg : input_options . message . number } ) ;
288
288
} else if (
289
289
validity_state . typeMismatch &&
290
290
input . type === "email" &&
291
291
input_options . message . email
292
292
) {
293
- this . set_validity ( { input : input , msg : input_options . message . email } ) ;
293
+ this . set_error ( { input : input , msg : input_options . message . email } ) ;
294
294
} else if (
295
295
validity_state . rangeUnderflow &&
296
296
input . type === "date" &&
297
297
input_options . message . date
298
298
) {
299
- this . set_validity ( { input : input , msg : input_options . message . date } ) ;
299
+ this . set_error ( { input : input , msg : input_options . message . date } ) ;
300
300
} else if (
301
301
validity_state . rangeOverflow &&
302
302
input . type === "date" &&
303
303
input_options . message . date
304
304
) {
305
- this . set_validity ( { input : input , msg : input_options . message . date } ) ;
305
+ this . set_error ( { input : input , msg : input_options . message . date } ) ;
306
306
} else if (
307
307
validity_state . rangeUnderflow &&
308
308
input . type === "datetime" &&
309
309
input_options . message . datetime
310
310
) {
311
- this . set_validity ( { input : input , msg : input_options . message . datetime } ) ;
311
+ this . set_error ( { input : input , msg : input_options . message . datetime } ) ;
312
312
} else if (
313
313
validity_state . rangeOverflow &&
314
314
input . type === "datetime" &&
315
315
input_options . message . datetime
316
316
) {
317
- this . set_validity ( { input : input , msg : input_options . message . datetime } ) ;
317
+ this . set_error ( { input : input , msg : input_options . message . datetime } ) ;
318
+ } else {
319
+ // Still an error, but without customized messages.
320
+ // Call `emit_update` separately
321
+ this . emit_update ( "invalid" ) ;
318
322
}
323
+
319
324
}
320
325
321
326
if ( event ?. type === "submit" ) {
@@ -327,7 +332,7 @@ class Pattern extends BasePattern {
327
332
this . set_error_message ( input ) ;
328
333
}
329
334
330
- set_validity ( { input, msg, attribute = null , min = null , max = null } ) {
335
+ set_error ( { input, msg, attribute = null , min = null , max = null , skip_event = false } ) {
331
336
// Replace some variables, as like validate.js
332
337
if ( attribute ) {
333
338
msg = msg . replace ( / % { attribute} / g, attribute ) ;
@@ -345,9 +350,13 @@ class Pattern extends BasePattern {
345
350
// Hidden inputs do not participate in validation but we need this
346
351
// (e.g. styled date input).
347
352
input [ KEY_ERROR_MSG ] = msg ;
353
+
354
+ if ( ! skip_event ) {
355
+ this . emit_update ( "invalid" ) ;
356
+ }
348
357
}
349
358
350
- remove_error ( input , all_of_group = false ) {
359
+ remove_error ( input , all_of_group = false , skip_event = false ) {
351
360
// Remove error message and related referencesfrom input.
352
361
353
362
let inputs = [ input ] ;
@@ -370,10 +379,15 @@ class Pattern extends BasePattern {
370
379
}
371
380
}
372
381
}
382
+
383
+ if ( ! skip_event ) {
384
+ this . emit_update ( "valid" ) ;
385
+ }
373
386
}
374
387
375
388
set_error_message ( input ) {
376
- this . remove_error ( input ) ;
389
+ // First, remove the old error message.
390
+ this . remove_error ( input , false , true ) ;
377
391
378
392
// Do not set a error message for a input group like radio buttons or
379
393
// checkboxes where one has already been set.
0 commit comments