@jsenv/navi 0.29.362 → 0.29.363

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.
@@ -9248,6 +9248,17 @@ const naviI18nFromValidityMessage = ({ key, params }) => {
9248
9248
  return naviI18n(`constraint.${key}`, params);
9249
9249
  };
9250
9250
 
9251
+ // The characters a ui state holds, for the rules that read a value as text
9252
+ // (length, pattern, number, email…). `undefined` and `null` both hold none:
9253
+ // `String(null)` would hand those rules the four letters "null" — a number
9254
+ // field cleared with `value={null}` then reported "must be a number".
9255
+ const uiStateAsText = (uiState) => {
9256
+ if (uiState === undefined || uiState === null) {
9257
+ return "";
9258
+ }
9259
+ return String(uiState);
9260
+ };
9261
+
9251
9262
  /**
9252
9263
  * https://developer.mozilla.org/en-US/docs/Web/HTML/Guides/Constraint_validation
9253
9264
  */
@@ -9314,8 +9325,7 @@ const REQUIRED_CONSTRAINT = {
9314
9325
  return naviI18n("constraint.required.checkbox");
9315
9326
  }
9316
9327
 
9317
- const valueAsString =
9318
- field.uiState === undefined ? "" : String(field.uiState);
9328
+ const valueAsString = uiStateAsText(field.uiState);
9319
9329
  if (valueAsString) {
9320
9330
  return null;
9321
9331
  }
@@ -9366,8 +9376,7 @@ const PATTERN_CONSTRAINT = {
9366
9376
  if (!pattern) {
9367
9377
  return null;
9368
9378
  }
9369
- const valueAsString =
9370
- field.uiState === undefined ? "" : String(field.uiState);
9379
+ const valueAsString = uiStateAsText(field.uiState);
9371
9380
  if (!valueAsString) {
9372
9381
  return null;
9373
9382
  }
@@ -9402,8 +9411,7 @@ const TYPE_EMAIL_CONSTRAINT = {
9402
9411
  if (type !== "email") {
9403
9412
  return null;
9404
9413
  }
9405
- const valueAsString =
9406
- field.uiState === undefined ? "" : String(field.uiState);
9414
+ const valueAsString = uiStateAsText(field.uiState);
9407
9415
  if (!valueAsString) {
9408
9416
  return null;
9409
9417
  }
@@ -9436,8 +9444,7 @@ const MIN_LENGTH_CONSTRAINT = {
9436
9444
  if (minLength === undefined) {
9437
9445
  return null;
9438
9446
  }
9439
- const valueAsString =
9440
- field.uiState === undefined ? "" : String(field.uiState);
9447
+ const valueAsString = uiStateAsText(field.uiState);
9441
9448
  if (!valueAsString && !field.controlHostProps.required) {
9442
9449
  return null;
9443
9450
  }
@@ -9532,8 +9539,7 @@ const MAX_LENGTH_CONSTRAINT = {
9532
9539
  if (maxLength === undefined) {
9533
9540
  return null;
9534
9541
  }
9535
- const valueAsString =
9536
- field.uiState === undefined ? "" : String(field.uiState);
9542
+ const valueAsString = uiStateAsText(field.uiState);
9537
9543
  if (!valueAsString) {
9538
9544
  return null;
9539
9545
  }
@@ -9574,8 +9580,7 @@ const TYPE_NUMBER_CONSTRAINT = {
9574
9580
  if (!isNumberInput(type, naviType)) {
9575
9581
  return null;
9576
9582
  }
9577
- const valueAsString =
9578
- field.uiState === undefined ? "" : String(field.uiState);
9583
+ const valueAsString = uiStateAsText(field.uiState);
9579
9584
  if (!valueAsString) {
9580
9585
  return null;
9581
9586
  }
@@ -9640,8 +9645,7 @@ const MIN_CONSTRAINT = {
9640
9645
  }
9641
9646
  const type = field.controlHostProps.type;
9642
9647
  const naviInputType = field.controlHostProps["navi-input-type"];
9643
- const valueAsString =
9644
- field.uiState === undefined ? "" : String(field.uiState);
9648
+ const valueAsString = uiStateAsText(field.uiState);
9645
9649
  if (!valueAsString) {
9646
9650
  return null;
9647
9651
  }
@@ -9740,8 +9744,7 @@ const MAX_CONSTRAINT = {
9740
9744
  }
9741
9745
  const type = field.controlHostProps.type;
9742
9746
  const naviInputType = field.controlHostProps["navi-input-type"];
9743
- const valueAsString =
9744
- field.uiState === undefined ? "" : String(field.uiState);
9747
+ const valueAsString = uiStateAsText(field.uiState);
9745
9748
  if (!valueAsString) {
9746
9749
  return null;
9747
9750
  }
@@ -9874,8 +9877,7 @@ const STEP_CONSTRAINT = {
9874
9877
  return null;
9875
9878
  }
9876
9879
  const stepString = String(stepRaw);
9877
- const valueAsString =
9878
- field.uiState === undefined ? "" : String(field.uiState);
9880
+ const valueAsString = uiStateAsText(field.uiState);
9879
9881
  if (!valueAsString) {
9880
9882
  return null;
9881
9883
  }
@@ -12824,8 +12826,7 @@ const DISPLAYABLE_CONSTRAINT = {
12824
12826
  if (!isConstraintAttributeOn(displayable)) {
12825
12827
  return null;
12826
12828
  }
12827
- const valueAsString =
12828
- field.uiState === undefined ? "" : String(field.uiState);
12829
+ const valueAsString = uiStateAsText(field.uiState);
12829
12830
  const maxStackedMarksAttribute =
12830
12831
  field.controlHostProps["data-max-stacked-marks"];
12831
12832
  const result = DISPLAYABLE_RULE.applyOn(true, valueAsString, {
@@ -12866,8 +12867,7 @@ const MAX_LINE_BREAKS_CONSTRAINT = {
12866
12867
  if (isNaN(maxLineBreaks)) {
12867
12868
  return null;
12868
12869
  }
12869
- const valueAsString =
12870
- field.uiState === undefined ? "" : String(field.uiState);
12870
+ const valueAsString = uiStateAsText(field.uiState);
12871
12871
  const result = MAX_LINE_BREAKS_RULE.applyOn(maxLineBreaks, valueAsString);
12872
12872
  if (!result) {
12873
12873
  return null;
@@ -12896,8 +12896,7 @@ const NO_EMOJI_CONSTRAINT = {
12896
12896
  if (!isConstraintAttributeOn(noEmoji)) {
12897
12897
  return null;
12898
12898
  }
12899
- const valueAsString =
12900
- field.uiState === undefined ? "" : String(field.uiState);
12899
+ const valueAsString = uiStateAsText(field.uiState);
12901
12900
  const result = NO_EMOJI_RULE.applyOn(true, valueAsString);
12902
12901
  if (!result) {
12903
12902
  return null;
@@ -12911,8 +12910,7 @@ const MIN_LOWER_LETTER_CONSTRAINT = {
12911
12910
  name: "min_lower_letter",
12912
12911
  messageAttribute: "data-min-lower-letter-message",
12913
12912
  check: (field) => {
12914
- const valueAsString =
12915
- field.uiState === undefined ? "" : String(field.uiState);
12913
+ const valueAsString = uiStateAsText(field.uiState);
12916
12914
  const required = field.controlHostProps.required;
12917
12915
  if (!valueAsString && !required) {
12918
12916
  return "";
@@ -12957,8 +12955,7 @@ const MIN_UPPER_LETTER_CONSTRAINT = {
12957
12955
  name: "min_upper_letter",
12958
12956
  messageAttribute: "data-min-upper-letter-message",
12959
12957
  check: (field) => {
12960
- const valueAsString =
12961
- field.uiState === undefined ? "" : String(field.uiState);
12958
+ const valueAsString = uiStateAsText(field.uiState);
12962
12959
  const required = field.controlHostProps.required;
12963
12960
  if (!valueAsString && !required) {
12964
12961
  return null;
@@ -12994,8 +12991,7 @@ const MIN_DIGIT_CONSTRAINT = {
12994
12991
  name: "min_digit",
12995
12992
  messageAttribute: "data-min-digit-message",
12996
12993
  check: (field) => {
12997
- const valueAsString =
12998
- field.uiState === undefined ? "" : String(field.uiState);
12994
+ const valueAsString = uiStateAsText(field.uiState);
12999
12995
  const required = field.controlHostProps.required;
13000
12996
  if (!valueAsString && !required) {
13001
12997
  return null;
@@ -13031,8 +13027,7 @@ const MIN_SPECIAL_CHAR_CONSTRAINT = {
13031
13027
  name: "min_special_char",
13032
13028
  messageAttribute: "data-min-special-char-message",
13033
13029
  check: (field) => {
13034
- const valueAsString =
13035
- field.uiState === undefined ? "" : String(field.uiState);
13030
+ const valueAsString = uiStateAsText(field.uiState);
13036
13031
  const required = field.controlHostProps.required;
13037
13032
  if (!valueAsString && !required) {
13038
13033
  return null;
@@ -13149,8 +13144,7 @@ const SAME_AS_CONSTRAINT = {
13149
13144
  // Reference field is empty — nothing to compare against yet.
13150
13145
  return null;
13151
13146
  }
13152
- const valueAsString =
13153
- field.uiState === undefined ? "" : String(field.uiState);
13147
+ const valueAsString = uiStateAsText(field.uiState);
13154
13148
  if (valueAsString === otherFieldValue) {
13155
13149
  return null;
13156
13150
  }
@@ -13191,8 +13185,7 @@ CONSTRAINT_ATTRIBUTE_SET.add("data-same-as");
13191
13185
 
13192
13186
 
13193
13187
  const applyRule = (field) => {
13194
- const valueAsString =
13195
- field.uiState === undefined ? "" : String(field.uiState);
13188
+ const valueAsString = uiStateAsText(field.uiState);
13196
13189
  return SINGLE_SPACE_RULE.applyOn(true, valueAsString);
13197
13190
  };
13198
13191
 
@@ -37479,9 +37472,9 @@ const getInvalidCharsMessage = (
37479
37472
  uiState,
37480
37473
  { charClass, messageKey, uiStateNow },
37481
37474
  ) => {
37482
- const str = uiState === undefined ? "" : String(uiState);
37475
+ const str = uiStateAsText(uiState);
37483
37476
  if (compileCharClassAnchored(charClass).test(str)) return null;
37484
- const strNow = uiStateNow === undefined ? "" : String(uiStateNow);
37477
+ const strNow = uiStateAsText(uiStateNow);
37485
37478
  if (
37486
37479
  countCharsOutsideClass(str, charClass) <=
37487
37480
  countCharsOutsideClass(strNow, charClass)
@@ -37494,9 +37487,9 @@ const getInvalidCharsMessage = (
37494
37487
  // Paste / set: truncate what the gesture adds beyond the limit.
37495
37488
  const getLengthOverflowResult = (uiState, { maxLength, uiStateNow }) => {
37496
37489
  if (maxLength === undefined) return null;
37497
- const str = uiState === undefined ? "" : String(uiState);
37490
+ const str = uiStateAsText(uiState);
37498
37491
  if (str.length <= maxLength) return null;
37499
- const strNow = uiStateNow === undefined ? "" : String(uiStateNow);
37492
+ const strNow = uiStateAsText(uiStateNow);
37500
37493
  if (str.length <= strNow.length) return null;
37501
37494
  return {
37502
37495
  fixedValue: str.slice(0, maxLength),
@@ -65237,6 +65230,12 @@ const PickerCustom = props => {
65237
65230
  // PickerNative takes.
65238
65231
  pickerProps.resetOnError = true;
65239
65232
  }
65233
+ if (pickerProps.resetOnAbort === undefined) {
65234
+ // Same reasoning for an action the app abandons (an AbortError, e.g. a
65235
+ // verification step the user dismissed): the popup is already closed, so
65236
+ // the abandoned value rolls back instead of staying selected in the list.
65237
+ pickerProps.resetOnAbort = true;
65238
+ }
65240
65239
  // ref
65241
65240
  const popupRef = useRef(null);
65242
65241
  popupProps.ref = popupRef;