@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.
@@ -8914,6 +8914,17 @@ const naviI18nFromValidityMessage = ({ key, params }) => {
8914
8914
  return naviI18n(`constraint.${key}`, params);
8915
8915
  };
8916
8916
 
8917
+ // The characters a ui state holds, for the rules that read a value as text
8918
+ // (length, pattern, number, email…). `undefined` and `null` both hold none:
8919
+ // `String(null)` would hand those rules the four letters "null" — a number
8920
+ // field cleared with `value={null}` then reported "must be a number".
8921
+ const uiStateAsText = (uiState) => {
8922
+ if (uiState === undefined || uiState === null) {
8923
+ return "";
8924
+ }
8925
+ return String(uiState);
8926
+ };
8927
+
8917
8928
  /**
8918
8929
  * https://developer.mozilla.org/en-US/docs/Web/HTML/Guides/Constraint_validation
8919
8930
  */
@@ -8980,8 +8991,7 @@ const REQUIRED_CONSTRAINT = {
8980
8991
  return naviI18n("constraint.required.checkbox");
8981
8992
  }
8982
8993
 
8983
- const valueAsString =
8984
- field.uiState === undefined ? "" : String(field.uiState);
8994
+ const valueAsString = uiStateAsText(field.uiState);
8985
8995
  if (valueAsString) {
8986
8996
  return null;
8987
8997
  }
@@ -9032,8 +9042,7 @@ const PATTERN_CONSTRAINT = {
9032
9042
  if (!pattern) {
9033
9043
  return null;
9034
9044
  }
9035
- const valueAsString =
9036
- field.uiState === undefined ? "" : String(field.uiState);
9045
+ const valueAsString = uiStateAsText(field.uiState);
9037
9046
  if (!valueAsString) {
9038
9047
  return null;
9039
9048
  }
@@ -9068,8 +9077,7 @@ const TYPE_EMAIL_CONSTRAINT = {
9068
9077
  if (type !== "email") {
9069
9078
  return null;
9070
9079
  }
9071
- const valueAsString =
9072
- field.uiState === undefined ? "" : String(field.uiState);
9080
+ const valueAsString = uiStateAsText(field.uiState);
9073
9081
  if (!valueAsString) {
9074
9082
  return null;
9075
9083
  }
@@ -9102,8 +9110,7 @@ const MIN_LENGTH_CONSTRAINT = {
9102
9110
  if (minLength === undefined) {
9103
9111
  return null;
9104
9112
  }
9105
- const valueAsString =
9106
- field.uiState === undefined ? "" : String(field.uiState);
9113
+ const valueAsString = uiStateAsText(field.uiState);
9107
9114
  if (!valueAsString && !field.controlHostProps.required) {
9108
9115
  return null;
9109
9116
  }
@@ -9198,8 +9205,7 @@ const MAX_LENGTH_CONSTRAINT = {
9198
9205
  if (maxLength === undefined) {
9199
9206
  return null;
9200
9207
  }
9201
- const valueAsString =
9202
- field.uiState === undefined ? "" : String(field.uiState);
9208
+ const valueAsString = uiStateAsText(field.uiState);
9203
9209
  if (!valueAsString) {
9204
9210
  return null;
9205
9211
  }
@@ -9240,8 +9246,7 @@ const TYPE_NUMBER_CONSTRAINT = {
9240
9246
  if (!isNumberInput(type, naviType)) {
9241
9247
  return null;
9242
9248
  }
9243
- const valueAsString =
9244
- field.uiState === undefined ? "" : String(field.uiState);
9249
+ const valueAsString = uiStateAsText(field.uiState);
9245
9250
  if (!valueAsString) {
9246
9251
  return null;
9247
9252
  }
@@ -9306,8 +9311,7 @@ const MIN_CONSTRAINT = {
9306
9311
  }
9307
9312
  const type = field.controlHostProps.type;
9308
9313
  const naviInputType = field.controlHostProps["navi-input-type"];
9309
- const valueAsString =
9310
- field.uiState === undefined ? "" : String(field.uiState);
9314
+ const valueAsString = uiStateAsText(field.uiState);
9311
9315
  if (!valueAsString) {
9312
9316
  return null;
9313
9317
  }
@@ -9406,8 +9410,7 @@ const MAX_CONSTRAINT = {
9406
9410
  }
9407
9411
  const type = field.controlHostProps.type;
9408
9412
  const naviInputType = field.controlHostProps["navi-input-type"];
9409
- const valueAsString =
9410
- field.uiState === undefined ? "" : String(field.uiState);
9413
+ const valueAsString = uiStateAsText(field.uiState);
9411
9414
  if (!valueAsString) {
9412
9415
  return null;
9413
9416
  }
@@ -9540,8 +9543,7 @@ const STEP_CONSTRAINT = {
9540
9543
  return null;
9541
9544
  }
9542
9545
  const stepString = String(stepRaw);
9543
- const valueAsString =
9544
- field.uiState === undefined ? "" : String(field.uiState);
9546
+ const valueAsString = uiStateAsText(field.uiState);
9545
9547
  if (!valueAsString) {
9546
9548
  return null;
9547
9549
  }
@@ -12341,8 +12343,7 @@ const DISPLAYABLE_CONSTRAINT = {
12341
12343
  if (!isConstraintAttributeOn(displayable)) {
12342
12344
  return null;
12343
12345
  }
12344
- const valueAsString =
12345
- field.uiState === undefined ? "" : String(field.uiState);
12346
+ const valueAsString = uiStateAsText(field.uiState);
12346
12347
  const maxStackedMarksAttribute =
12347
12348
  field.controlHostProps["data-max-stacked-marks"];
12348
12349
  const result = DISPLAYABLE_RULE.applyOn(true, valueAsString, {
@@ -12383,8 +12384,7 @@ const MAX_LINE_BREAKS_CONSTRAINT = {
12383
12384
  if (isNaN(maxLineBreaks)) {
12384
12385
  return null;
12385
12386
  }
12386
- const valueAsString =
12387
- field.uiState === undefined ? "" : String(field.uiState);
12387
+ const valueAsString = uiStateAsText(field.uiState);
12388
12388
  const result = MAX_LINE_BREAKS_RULE.applyOn(maxLineBreaks, valueAsString);
12389
12389
  if (!result) {
12390
12390
  return null;
@@ -12413,8 +12413,7 @@ const NO_EMOJI_CONSTRAINT = {
12413
12413
  if (!isConstraintAttributeOn(noEmoji)) {
12414
12414
  return null;
12415
12415
  }
12416
- const valueAsString =
12417
- field.uiState === undefined ? "" : String(field.uiState);
12416
+ const valueAsString = uiStateAsText(field.uiState);
12418
12417
  const result = NO_EMOJI_RULE.applyOn(true, valueAsString);
12419
12418
  if (!result) {
12420
12419
  return null;
@@ -12428,8 +12427,7 @@ const MIN_LOWER_LETTER_CONSTRAINT = {
12428
12427
  name: "min_lower_letter",
12429
12428
  messageAttribute: "data-min-lower-letter-message",
12430
12429
  check: (field) => {
12431
- const valueAsString =
12432
- field.uiState === undefined ? "" : String(field.uiState);
12430
+ const valueAsString = uiStateAsText(field.uiState);
12433
12431
  const required = field.controlHostProps.required;
12434
12432
  if (!valueAsString && !required) {
12435
12433
  return "";
@@ -12474,8 +12472,7 @@ const MIN_UPPER_LETTER_CONSTRAINT = {
12474
12472
  name: "min_upper_letter",
12475
12473
  messageAttribute: "data-min-upper-letter-message",
12476
12474
  check: (field) => {
12477
- const valueAsString =
12478
- field.uiState === undefined ? "" : String(field.uiState);
12475
+ const valueAsString = uiStateAsText(field.uiState);
12479
12476
  const required = field.controlHostProps.required;
12480
12477
  if (!valueAsString && !required) {
12481
12478
  return null;
@@ -12511,8 +12508,7 @@ const MIN_DIGIT_CONSTRAINT = {
12511
12508
  name: "min_digit",
12512
12509
  messageAttribute: "data-min-digit-message",
12513
12510
  check: (field) => {
12514
- const valueAsString =
12515
- field.uiState === undefined ? "" : String(field.uiState);
12511
+ const valueAsString = uiStateAsText(field.uiState);
12516
12512
  const required = field.controlHostProps.required;
12517
12513
  if (!valueAsString && !required) {
12518
12514
  return null;
@@ -12548,8 +12544,7 @@ const MIN_SPECIAL_CHAR_CONSTRAINT = {
12548
12544
  name: "min_special_char",
12549
12545
  messageAttribute: "data-min-special-char-message",
12550
12546
  check: (field) => {
12551
- const valueAsString =
12552
- field.uiState === undefined ? "" : String(field.uiState);
12547
+ const valueAsString = uiStateAsText(field.uiState);
12553
12548
  const required = field.controlHostProps.required;
12554
12549
  if (!valueAsString && !required) {
12555
12550
  return null;
@@ -12666,8 +12661,7 @@ const SAME_AS_CONSTRAINT = {
12666
12661
  // Reference field is empty — nothing to compare against yet.
12667
12662
  return null;
12668
12663
  }
12669
- const valueAsString =
12670
- field.uiState === undefined ? "" : String(field.uiState);
12664
+ const valueAsString = uiStateAsText(field.uiState);
12671
12665
  if (valueAsString === otherFieldValue) {
12672
12666
  return null;
12673
12667
  }
@@ -12708,8 +12702,7 @@ CONSTRAINT_ATTRIBUTE_SET.add("data-same-as");
12708
12702
 
12709
12703
 
12710
12704
  const applyRule = (field) => {
12711
- const valueAsString =
12712
- field.uiState === undefined ? "" : String(field.uiState);
12705
+ const valueAsString = uiStateAsText(field.uiState);
12713
12706
  return SINGLE_SPACE_RULE.applyOn(true, valueAsString);
12714
12707
  };
12715
12708
 
@@ -36535,9 +36528,9 @@ const getInvalidCharsMessage = (
36535
36528
  uiState,
36536
36529
  { charClass, messageKey, uiStateNow },
36537
36530
  ) => {
36538
- const str = uiState === undefined ? "" : String(uiState);
36531
+ const str = uiStateAsText(uiState);
36539
36532
  if (compileCharClassAnchored(charClass).test(str)) return null;
36540
- const strNow = uiStateNow === undefined ? "" : String(uiStateNow);
36533
+ const strNow = uiStateAsText(uiStateNow);
36541
36534
  if (
36542
36535
  countCharsOutsideClass(str, charClass) <=
36543
36536
  countCharsOutsideClass(strNow, charClass)
@@ -36550,9 +36543,9 @@ const getInvalidCharsMessage = (
36550
36543
  // Paste / set: truncate what the gesture adds beyond the limit.
36551
36544
  const getLengthOverflowResult = (uiState, { maxLength, uiStateNow }) => {
36552
36545
  if (maxLength === undefined) return null;
36553
- const str = uiState === undefined ? "" : String(uiState);
36546
+ const str = uiStateAsText(uiState);
36554
36547
  if (str.length <= maxLength) return null;
36555
- const strNow = uiStateNow === undefined ? "" : String(uiStateNow);
36548
+ const strNow = uiStateAsText(uiStateNow);
36556
36549
  if (str.length <= strNow.length) return null;
36557
36550
  return {
36558
36551
  fixedValue: str.slice(0, maxLength),
@@ -63943,6 +63936,12 @@ const PickerCustom = props => {
63943
63936
  // PickerNative takes.
63944
63937
  pickerProps.resetOnError = true;
63945
63938
  }
63939
+ if (pickerProps.resetOnAbort === undefined) {
63940
+ // Same reasoning for an action the app abandons (an AbortError, e.g. a
63941
+ // verification step the user dismissed): the popup is already closed, so
63942
+ // the abandoned value rolls back instead of staying selected in the list.
63943
+ pickerProps.resetOnAbort = true;
63944
+ }
63946
63945
  // ref
63947
63946
  const popupRef = useRef(null);
63948
63947
  popupProps.ref = popupRef;