@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.
- package/dist/dev/jsenv_navi.js +39 -40
- package/dist/dev/jsenv_navi.js.map +12 -10
- package/dist/jsenv_navi.js +39 -40
- package/dist/jsenv_navi.js.map +12 -10
- package/docs/popup_open.md +2 -1
- package/package.json +1 -1
package/dist/jsenv_navi.js
CHANGED
|
@@ -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 =
|
|
36531
|
+
const str = uiStateAsText(uiState);
|
|
36539
36532
|
if (compileCharClassAnchored(charClass).test(str)) return null;
|
|
36540
|
-
const strNow =
|
|
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 =
|
|
36546
|
+
const str = uiStateAsText(uiState);
|
|
36554
36547
|
if (str.length <= maxLength) return null;
|
|
36555
|
-
const strNow =
|
|
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;
|