unpoly-rails 3.9.5 → 3.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/assets/unpoly/unpoly-bootstrap3.js +3 -2
- data/assets/unpoly/unpoly-bootstrap3.min.js +1 -1
- data/assets/unpoly/unpoly-bootstrap4.js +3 -2
- data/assets/unpoly/unpoly-bootstrap4.min.js +1 -1
- data/assets/unpoly/unpoly-bootstrap5.js +3 -2
- data/assets/unpoly/unpoly-bootstrap5.min.js +1 -1
- data/assets/unpoly/unpoly-migrate.js +29 -6
- data/assets/unpoly/unpoly-migrate.min.js +1 -1
- data/assets/unpoly/unpoly.es6.js +1565 -1030
- data/assets/unpoly/unpoly.es6.min.js +1 -1
- data/assets/unpoly/unpoly.js +1540 -1013
- data/assets/unpoly/unpoly.min.js +1 -1
- data/lib/unpoly/rails/change/field_definition.rb +12 -4
- data/lib/unpoly/rails/change.rb +26 -11
- data/lib/unpoly/rails/util.rb +8 -0
- data/lib/unpoly/rails/version.rb +1 -1
- metadata +3 -3
data/assets/unpoly/unpoly.js
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
/***/ (() => {
|
6
6
|
|
7
7
|
window.up = {
|
8
|
-
version: '3.
|
8
|
+
version: '3.10.0'
|
9
9
|
};
|
10
10
|
|
11
11
|
|
@@ -202,6 +202,9 @@ up.util = (function () {
|
|
202
202
|
function isElement(object) {
|
203
203
|
return object instanceof Element;
|
204
204
|
}
|
205
|
+
function isTextNode(object) {
|
206
|
+
return object instanceof Text;
|
207
|
+
}
|
205
208
|
function isRegExp(object) {
|
206
209
|
return object instanceof RegExp;
|
207
210
|
}
|
@@ -211,8 +214,8 @@ up.util = (function () {
|
|
211
214
|
function isJQuery(object) {
|
212
215
|
return up.browser.canJQuery() && object instanceof jQuery;
|
213
216
|
}
|
214
|
-
function
|
215
|
-
return !!(object && (object.addEventListener || object[0]?.addEventListener));
|
217
|
+
function isElementLike(object) {
|
218
|
+
return !!(object && (object.addEventListener || (isJQuery(object) && object[0]?.addEventListener)));
|
216
219
|
}
|
217
220
|
function isPromise(object) {
|
218
221
|
return isObject(object) && isFunction(object.then);
|
@@ -240,6 +243,9 @@ up.util = (function () {
|
|
240
243
|
function isArguments(value) {
|
241
244
|
return Object.prototype.toString.call(value) === '[object Arguments]';
|
242
245
|
}
|
246
|
+
function isAdjacentPosition(value) {
|
247
|
+
return /^(before|after)/.test(value);
|
248
|
+
}
|
243
249
|
function wrapList(value) {
|
244
250
|
if (isList(value)) {
|
245
251
|
return value;
|
@@ -297,10 +303,9 @@ up.util = (function () {
|
|
297
303
|
}
|
298
304
|
}
|
299
305
|
function parseArgIntoOptions(args, argKey) {
|
300
|
-
let options =
|
301
|
-
if (isDefined(
|
302
|
-
options =
|
303
|
-
options[argKey] = args[0];
|
306
|
+
let [positionalArg, options] = parseArgs(args, 'val', 'options');
|
307
|
+
if (isDefined(positionalArg)) {
|
308
|
+
options[argKey] = positionalArg;
|
304
309
|
}
|
305
310
|
return options;
|
306
311
|
}
|
@@ -468,7 +473,9 @@ up.util = (function () {
|
|
468
473
|
return value;
|
469
474
|
}
|
470
475
|
function renameKey(object, oldKey, newKey) {
|
471
|
-
|
476
|
+
if (oldKey in object) {
|
477
|
+
object[newKey] = pluckKey(object, oldKey);
|
478
|
+
}
|
472
479
|
}
|
473
480
|
function extractLastArg(args, tester) {
|
474
481
|
if (tester(last(args))) {
|
@@ -554,26 +561,34 @@ up.util = (function () {
|
|
554
561
|
function isEqualList(a, b) {
|
555
562
|
return (a.length === b.length) && every(a, (elem, index) => isEqual(elem, b[index]));
|
556
563
|
}
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
if (isString(value)) {
|
564
|
-
value = value.trim();
|
565
|
-
if (options.json && /^\[.*]$/.test(value)) {
|
566
|
-
return JSON.parse(value);
|
567
|
-
}
|
568
|
-
else {
|
569
|
-
let separator = options.separator || 'space/or';
|
570
|
-
let pattern = PARSE_TOKEN_PATTERNS[separator];
|
571
|
-
return value.split(pattern);
|
572
|
-
}
|
564
|
+
function getSimpleTokens(value, { json = false, separator = /[,\s]/ } = {}) {
|
565
|
+
if (!isString(value)) {
|
566
|
+
return wrapList(value);
|
567
|
+
}
|
568
|
+
else if (json && /^\[.*]$/.test(value)) {
|
569
|
+
return parseRelaxedJSON(value);
|
573
570
|
}
|
574
571
|
else {
|
572
|
+
return splitSimpleTokenString(value, separator);
|
573
|
+
}
|
574
|
+
}
|
575
|
+
function splitSimpleTokenString(value, separator) {
|
576
|
+
let parts = up.migrate.splitAtOr?.(value) || value.split(separator);
|
577
|
+
return parts.map((s) => s.trim()).filter(identity);
|
578
|
+
}
|
579
|
+
function getComplexTokens(value) {
|
580
|
+
if (!isString(value)) {
|
575
581
|
return wrapList(value);
|
576
582
|
}
|
583
|
+
else {
|
584
|
+
let { maskedTokens, restore } = complexTokenOutlines(value);
|
585
|
+
return maskedTokens.map((token) => restore(token));
|
586
|
+
}
|
587
|
+
}
|
588
|
+
function complexTokenOutlines(string) {
|
589
|
+
let { masked, restore } = expressionOutline(string);
|
590
|
+
let maskedTokens = splitSimpleTokenString(masked, ',');
|
591
|
+
return { maskedTokens, restore };
|
577
592
|
}
|
578
593
|
function wrapValue(constructor, ...args) {
|
579
594
|
return (args[0] instanceof constructor) ? args[0] : new constructor(...args);
|
@@ -585,18 +600,13 @@ up.util = (function () {
|
|
585
600
|
function reverse(list) {
|
586
601
|
return copy(list).reverse();
|
587
602
|
}
|
588
|
-
function
|
589
|
-
if (value === matchValue) {
|
590
|
-
return replacementValue;
|
591
|
-
}
|
592
|
-
else {
|
593
|
-
return value;
|
594
|
-
}
|
595
|
-
}
|
596
|
-
function renameKeys(object, renameKeyFn) {
|
603
|
+
function withRenamedKeys(object, renameKeyFn) {
|
597
604
|
const renamed = {};
|
598
605
|
for (let key in object) {
|
599
|
-
|
606
|
+
let transformed = renameKeyFn(key);
|
607
|
+
if (isGiven(transformed)) {
|
608
|
+
renamed[transformed] = object[key];
|
609
|
+
}
|
600
610
|
}
|
601
611
|
return renamed;
|
602
612
|
}
|
@@ -627,6 +637,9 @@ up.util = (function () {
|
|
627
637
|
});
|
628
638
|
}
|
629
639
|
}
|
640
|
+
function delegatePromise(object, promiseProp) {
|
641
|
+
return defineDelegates(object, ['then', 'catch', 'finally'], function () { return this[promiseProp]; });
|
642
|
+
}
|
630
643
|
function stringifyArg(arg, placeholder = '%o') {
|
631
644
|
let string;
|
632
645
|
const maxLength = 200;
|
@@ -736,6 +749,122 @@ up.util = (function () {
|
|
736
749
|
Object.assign(variant, changes);
|
737
750
|
return variant;
|
738
751
|
}
|
752
|
+
function parseArgs(args, ...specs) {
|
753
|
+
let results = [];
|
754
|
+
while (specs.length) {
|
755
|
+
let lastSpec = specs.pop();
|
756
|
+
if (lastSpec === 'options') {
|
757
|
+
results.unshift(extractOptions(args));
|
758
|
+
}
|
759
|
+
else if (lastSpec === 'callback') {
|
760
|
+
results.unshift(extractCallback(args));
|
761
|
+
}
|
762
|
+
else if (lastSpec === 'val') {
|
763
|
+
results.unshift(args.pop());
|
764
|
+
}
|
765
|
+
else if (isFunction(lastSpec)) {
|
766
|
+
let value = lastSpec(last(args)) ? args.pop() : undefined;
|
767
|
+
results.unshift(value);
|
768
|
+
}
|
769
|
+
}
|
770
|
+
return results;
|
771
|
+
}
|
772
|
+
function scanFunctions(...values) {
|
773
|
+
return values.flat().filter(isFunction);
|
774
|
+
}
|
775
|
+
function cleaner() {
|
776
|
+
let fns = [];
|
777
|
+
let track = function (values, transform) {
|
778
|
+
values = scanFunctions(...values).map(transform);
|
779
|
+
fns.push(...scanFunctions(...values));
|
780
|
+
};
|
781
|
+
let api = function (...values) {
|
782
|
+
track(values, identity);
|
783
|
+
};
|
784
|
+
api.guard = function (...values) {
|
785
|
+
track(values, up.error.guardFn);
|
786
|
+
};
|
787
|
+
api.clean = function (...args) {
|
788
|
+
let { length } = fns;
|
789
|
+
for (let i = length - 1; i >= 0; i--)
|
790
|
+
fns[i](...args);
|
791
|
+
fns = [];
|
792
|
+
};
|
793
|
+
return api;
|
794
|
+
}
|
795
|
+
function maskPattern(str, patterns, { keepDelimiters = false } = {}) {
|
796
|
+
let maskCount = 0;
|
797
|
+
let maskPattern = /§(\d+)/g;
|
798
|
+
let matches = [];
|
799
|
+
let replaceLayers = 0;
|
800
|
+
let replace = (replacePattern) => {
|
801
|
+
let didReplace = false;
|
802
|
+
str = str.replaceAll(replacePattern, function (match) {
|
803
|
+
didReplace = true;
|
804
|
+
let glyph = '§' + (maskCount++);
|
805
|
+
let mask;
|
806
|
+
let masked;
|
807
|
+
if (keepDelimiters) {
|
808
|
+
let startDelimiter = match[0];
|
809
|
+
let endDelimiter = match.slice(-1);
|
810
|
+
masked = match.slice(1, -1);
|
811
|
+
mask = startDelimiter + glyph + endDelimiter;
|
812
|
+
}
|
813
|
+
else {
|
814
|
+
masked = match;
|
815
|
+
mask = glyph;
|
816
|
+
}
|
817
|
+
matches.push(masked);
|
818
|
+
return mask;
|
819
|
+
});
|
820
|
+
if (didReplace)
|
821
|
+
replaceLayers++;
|
822
|
+
};
|
823
|
+
[maskPattern, ...patterns].forEach(replace);
|
824
|
+
let restore = (s, transform = identity) => {
|
825
|
+
for (let i = 0; i < replaceLayers; i++) {
|
826
|
+
s = s.replace(maskPattern, (match, placeholderIndex) => transform(matches[placeholderIndex]));
|
827
|
+
}
|
828
|
+
return s;
|
829
|
+
};
|
830
|
+
return { masked: str, restore };
|
831
|
+
}
|
832
|
+
const QUOTED_STRING_PATTERN = /'(?:\\\\|\\'|[^'])*'|"(?:\\\\|\\"|[^"])*"/g;
|
833
|
+
const NESTED_GROUP_PATTERN = /{(?:[^{}]|{[^{}]*})*}|\((?:[^\(\)]|\([^\(\)]*\))*\)|\[(?:[^\[\]]|\[[^\[\]]*\])*\]/g;
|
834
|
+
function expressionOutline(str) {
|
835
|
+
return maskPattern(str, [QUOTED_STRING_PATTERN, NESTED_GROUP_PATTERN], { keepDelimiters: true });
|
836
|
+
}
|
837
|
+
function ensureDoubleQuotes(str) {
|
838
|
+
if (str[0] === '"')
|
839
|
+
return str;
|
840
|
+
str = str.slice(1, -1);
|
841
|
+
let transformed = str.replace(/(\\\\)|(\\')|(\\")|(")/g, function (_match, escapedBackslash, escapedSingleQuote, _doubleQuote) {
|
842
|
+
return escapedBackslash
|
843
|
+
|| (escapedSingleQuote && "'")
|
844
|
+
|| '\\"';
|
845
|
+
});
|
846
|
+
return '"' + transformed + '"';
|
847
|
+
}
|
848
|
+
function parseString(value) {
|
849
|
+
return JSON.parse(ensureDoubleQuotes(value));
|
850
|
+
}
|
851
|
+
function parseRelaxedJSON(str) {
|
852
|
+
let { masked, restore } = maskPattern(str, [QUOTED_STRING_PATTERN]);
|
853
|
+
masked = masked.replace(/([a-z_$][\w$]*:)/gi, (unquotedProperty) => ('"' + unquotedProperty.slice(0, -1) + '":'));
|
854
|
+
masked = masked.replace(/,\s*([}\]])/g, '$1');
|
855
|
+
masked = restore(masked, ensureDoubleQuotes);
|
856
|
+
return JSON.parse(masked);
|
857
|
+
}
|
858
|
+
function parseScalarJSONPairs(str) {
|
859
|
+
let { maskedTokens, restore } = complexTokenOutlines(str);
|
860
|
+
return maskedTokens.map((maskedToken) => {
|
861
|
+
let [_match, string, json] = maskedToken.match(/([^{]+)({[^}]*})?/);
|
862
|
+
return [
|
863
|
+
restore(string.trim()),
|
864
|
+
json && parseRelaxedJSON(restore(json))
|
865
|
+
];
|
866
|
+
});
|
867
|
+
}
|
739
868
|
return {
|
740
869
|
parseURL,
|
741
870
|
normalizeURL,
|
@@ -779,14 +908,16 @@ up.util = (function () {
|
|
779
908
|
isBoolean,
|
780
909
|
isNumber,
|
781
910
|
isElement,
|
911
|
+
isTextNode,
|
782
912
|
isJQuery,
|
783
|
-
|
913
|
+
isElementLike,
|
784
914
|
isPromise,
|
785
915
|
isOptions,
|
786
916
|
isArray,
|
787
917
|
isFormData,
|
788
918
|
isList,
|
789
919
|
isRegExp,
|
920
|
+
isAdjacentPosition,
|
790
921
|
timer: scheduleTimer,
|
791
922
|
contains,
|
792
923
|
containsAll,
|
@@ -817,21 +948,30 @@ up.util = (function () {
|
|
817
948
|
isCrossOrigin,
|
818
949
|
task: queueTask,
|
819
950
|
isEqual,
|
820
|
-
|
951
|
+
getSimpleTokens,
|
952
|
+
getComplexTokens,
|
821
953
|
wrapList,
|
822
954
|
wrapValue,
|
823
955
|
uid,
|
824
956
|
upperCaseFirst,
|
825
957
|
lowerCaseFirst,
|
826
958
|
delegate: defineDelegates,
|
959
|
+
delegatePromise,
|
827
960
|
reverse,
|
828
961
|
camelToKebabCase,
|
829
|
-
replaceValue,
|
830
962
|
sprintf,
|
831
|
-
|
963
|
+
withRenamedKeys,
|
832
964
|
memoizeMethod,
|
833
965
|
safeStringifyJSON,
|
834
966
|
variant,
|
967
|
+
cleaner,
|
968
|
+
scanFunctions,
|
969
|
+
args: parseArgs,
|
970
|
+
parseRelaxedJSON,
|
971
|
+
parseScalarJSONPairs,
|
972
|
+
maskPattern,
|
973
|
+
expressionOutline,
|
974
|
+
parseString,
|
835
975
|
};
|
836
976
|
})();
|
837
977
|
|
@@ -863,17 +1003,12 @@ up.error = (function () {
|
|
863
1003
|
throw value;
|
864
1004
|
}
|
865
1005
|
}
|
866
|
-
function
|
867
|
-
console.error('Uncaught %o', error);
|
868
|
-
let event = new ErrorEvent('error', { error, message: 'Uncaught ' + error });
|
869
|
-
window.dispatchEvent(event);
|
870
|
-
}
|
871
|
-
function guard(fn) {
|
1006
|
+
function guard(fn, ...args) {
|
872
1007
|
try {
|
873
|
-
return fn();
|
1008
|
+
return fn(...args);
|
874
1009
|
}
|
875
1010
|
catch (error) {
|
876
|
-
|
1011
|
+
reportError(error);
|
877
1012
|
}
|
878
1013
|
}
|
879
1014
|
function guardFn(fn) {
|
@@ -905,7 +1040,6 @@ up.migrate = {
|
|
905
1040
|
/***/ (() => {
|
906
1041
|
|
907
1042
|
up.browser = (function () {
|
908
|
-
const u = up.util;
|
909
1043
|
function submitForm(form) {
|
910
1044
|
form.submit();
|
911
1045
|
}
|
@@ -915,7 +1049,6 @@ up.browser = (function () {
|
|
915
1049
|
function canJQuery() {
|
916
1050
|
return !!window.jQuery;
|
917
1051
|
}
|
918
|
-
const canHasSelector = u.memoize(() => CSS.supports('selector(:has(*))'));
|
919
1052
|
function popCookie(name) {
|
920
1053
|
let value = document.cookie.match(new RegExp(name + "=(\\w+)"))?.[1];
|
921
1054
|
if (value) {
|
@@ -936,7 +1069,6 @@ up.browser = (function () {
|
|
936
1069
|
canJQuery,
|
937
1070
|
assertConfirmed,
|
938
1071
|
popCookie,
|
939
|
-
canHasSelector,
|
940
1072
|
};
|
941
1073
|
})();
|
942
1074
|
|
@@ -949,18 +1081,23 @@ __webpack_require__(8);
|
|
949
1081
|
up.element = (function () {
|
950
1082
|
const u = up.util;
|
951
1083
|
function first(...args) {
|
952
|
-
|
953
|
-
const root = args[0] || document;
|
1084
|
+
let [root = document, selector] = u.args(args, 'val', 'val');
|
954
1085
|
return root.querySelector(selector);
|
955
1086
|
}
|
956
1087
|
function subtree(root, selector) {
|
957
1088
|
const results = [];
|
958
|
-
if (root
|
1089
|
+
if (elementLikeMatches(root, selector)) {
|
959
1090
|
results.push(root);
|
960
1091
|
}
|
961
1092
|
results.push(...root.querySelectorAll(selector));
|
962
1093
|
return results;
|
963
1094
|
}
|
1095
|
+
function subtreeFirst(root, selector) {
|
1096
|
+
return elementLikeMatches(root, selector) ? root : root.querySelector(selector);
|
1097
|
+
}
|
1098
|
+
function elementLikeMatches(elementLike, selector) {
|
1099
|
+
return u.isElement(elementLike) && elementLike.matches(selector);
|
1100
|
+
}
|
964
1101
|
function contains(root, selectorOrElement) {
|
965
1102
|
const element = getOne(selectorOrElement);
|
966
1103
|
return Node.prototype.contains.call(root, element);
|
@@ -1001,24 +1138,38 @@ up.element = (function () {
|
|
1001
1138
|
}
|
1002
1139
|
}
|
1003
1140
|
function hide(element) {
|
1004
|
-
element
|
1141
|
+
setVisible(element, false);
|
1005
1142
|
}
|
1006
1143
|
function show(element) {
|
1007
|
-
element
|
1008
|
-
if (element.style.display === 'none') {
|
1009
|
-
element.style.display = '';
|
1010
|
-
}
|
1144
|
+
setVisible(element, true);
|
1011
1145
|
}
|
1012
|
-
function
|
1013
|
-
|
1014
|
-
newVisible = !isVisible(element);
|
1015
|
-
}
|
1016
|
-
(newVisible ? show : hide)(element);
|
1146
|
+
function showTemp(element) {
|
1147
|
+
return setVisibleTemp(element, true);
|
1017
1148
|
}
|
1018
|
-
function
|
1019
|
-
|
1020
|
-
|
1149
|
+
function hideTemp(element) {
|
1150
|
+
return setVisibleTemp(element, false);
|
1151
|
+
}
|
1152
|
+
function setVisibleTemp(element, newVisible) {
|
1153
|
+
if (newVisible === isVisible(element))
|
1154
|
+
return u.noop;
|
1155
|
+
setVisible(element, newVisible);
|
1156
|
+
return () => setVisible(element, !newVisible);
|
1157
|
+
}
|
1158
|
+
function setVisible(element, newVisible) {
|
1159
|
+
if (newVisible) {
|
1160
|
+
element.removeAttribute('hidden');
|
1161
|
+
if (element.style.display === 'none') {
|
1162
|
+
element.style.display = '';
|
1163
|
+
}
|
1164
|
+
}
|
1165
|
+
else {
|
1166
|
+
element.setAttribute('hidden', '');
|
1021
1167
|
}
|
1168
|
+
}
|
1169
|
+
function toggle(element, newVisible = !isVisible(element)) {
|
1170
|
+
setVisible(element, newVisible);
|
1171
|
+
}
|
1172
|
+
function setAttrPresence(element, attr, value, newPresent) {
|
1022
1173
|
if (newPresent) {
|
1023
1174
|
return element.setAttribute(attr, value);
|
1024
1175
|
}
|
@@ -1037,11 +1188,9 @@ up.element = (function () {
|
|
1037
1188
|
}
|
1038
1189
|
}
|
1039
1190
|
}
|
1040
|
-
function
|
1041
|
-
|
1042
|
-
|
1043
|
-
oldAttrs[key] = element.getAttribute(key);
|
1044
|
-
}
|
1191
|
+
function setAttrsTemp(element, attrs) {
|
1192
|
+
let keys = Object.keys(attrs);
|
1193
|
+
let oldAttrs = pickAttrs(element, keys);
|
1045
1194
|
setAttrs(element, attrs);
|
1046
1195
|
return () => setAttrs(element, oldAttrs);
|
1047
1196
|
}
|
@@ -1049,8 +1198,8 @@ up.element = (function () {
|
|
1049
1198
|
const selector = "meta" + attrSelector('name', name);
|
1050
1199
|
return first(selector)?.getAttribute('content');
|
1051
1200
|
}
|
1052
|
-
function insertBefore(
|
1053
|
-
|
1201
|
+
function insertBefore(existingNode, newNode) {
|
1202
|
+
existingNode.parentNode.insertBefore(newNode, existingNode);
|
1054
1203
|
}
|
1055
1204
|
function createFromSelector(selector, attrs = {}) {
|
1056
1205
|
let { includePath } = parseSelector(selector);
|
@@ -1058,7 +1207,7 @@ up.element = (function () {
|
|
1058
1207
|
let depthElement;
|
1059
1208
|
let previousElement;
|
1060
1209
|
for (let includeSegment of includePath) {
|
1061
|
-
let { tagName
|
1210
|
+
let { tagName } = includeSegment;
|
1062
1211
|
if (!tagName || tagName === '*') {
|
1063
1212
|
tagName = 'div';
|
1064
1213
|
}
|
@@ -1066,25 +1215,14 @@ up.element = (function () {
|
|
1066
1215
|
if (!rootElement) {
|
1067
1216
|
rootElement = depthElement;
|
1068
1217
|
}
|
1069
|
-
|
1070
|
-
depthElement.id = id;
|
1071
|
-
}
|
1072
|
-
for (let className of classNames) {
|
1073
|
-
depthElement.classList.add(className);
|
1074
|
-
}
|
1075
|
-
for (let attributeName in attributes) {
|
1076
|
-
let attributeValue = attributes[attributeName];
|
1077
|
-
depthElement.setAttribute(attributeName, attributeValue || '');
|
1078
|
-
}
|
1218
|
+
makeVariation(depthElement, includeSegment);
|
1079
1219
|
previousElement?.appendChild(depthElement);
|
1080
1220
|
previousElement = depthElement;
|
1081
1221
|
}
|
1082
1222
|
for (let key in attrs) {
|
1083
1223
|
let value = attrs[key];
|
1084
1224
|
if (key === 'class') {
|
1085
|
-
|
1086
|
-
rootElement.classList.add(klass);
|
1087
|
-
}
|
1225
|
+
addClasses(rootElement, u.wrapList(value));
|
1088
1226
|
}
|
1089
1227
|
else if (key === 'style') {
|
1090
1228
|
setInlineStyle(rootElement, value);
|
@@ -1093,7 +1231,12 @@ up.element = (function () {
|
|
1093
1231
|
rootElement.textContent = value;
|
1094
1232
|
}
|
1095
1233
|
else if (key === 'content') {
|
1096
|
-
|
1234
|
+
if (u.isString(value)) {
|
1235
|
+
rootElement.innerHTML = value;
|
1236
|
+
}
|
1237
|
+
else {
|
1238
|
+
rootElement.append(...u.wrapList(value));
|
1239
|
+
}
|
1097
1240
|
}
|
1098
1241
|
else {
|
1099
1242
|
rootElement.setAttribute(key, value);
|
@@ -1101,14 +1244,24 @@ up.element = (function () {
|
|
1101
1244
|
}
|
1102
1245
|
return rootElement;
|
1103
1246
|
}
|
1104
|
-
function
|
1247
|
+
function makeVariation(element, { id, classNames, attributes }) {
|
1248
|
+
if (id) {
|
1249
|
+
element.id = id;
|
1250
|
+
}
|
1251
|
+
for (let [name, value] of Object.entries(attributes)) {
|
1252
|
+
element.setAttribute(name, value);
|
1253
|
+
}
|
1254
|
+
addClasses(element, classNames);
|
1255
|
+
}
|
1256
|
+
function parseSelector(rawSelector) {
|
1105
1257
|
let excludeRaw;
|
1106
|
-
const
|
1107
|
-
|
1258
|
+
const { masked: selectorOutline, restore: restoreSelectorLiterals, } = u.expressionOutline(rawSelector);
|
1259
|
+
const includeWithoutAttrs = selectorOutline.replace(/:not\([^)]*\)/, function (match) {
|
1260
|
+
excludeRaw = restoreSelectorLiterals(match);
|
1108
1261
|
return '';
|
1109
1262
|
});
|
1110
|
-
|
1111
|
-
const includeSegments =
|
1263
|
+
let includeRaw = restoreSelectorLiterals(includeWithoutAttrs);
|
1264
|
+
const includeSegments = includeWithoutAttrs.split(/[ >]+/);
|
1112
1265
|
let includePath = includeSegments.map(function (depthSelector) {
|
1113
1266
|
let parsed = {
|
1114
1267
|
tagName: null,
|
@@ -1128,14 +1281,15 @@ up.element = (function () {
|
|
1128
1281
|
parsed.classNames.push(className);
|
1129
1282
|
return '';
|
1130
1283
|
});
|
1131
|
-
|
1132
|
-
|
1133
|
-
|
1134
|
-
|
1135
|
-
|
1136
|
-
|
1284
|
+
depthSelector = depthSelector.replace(/\[[^\]]*]/g, function (attr) {
|
1285
|
+
attr = restoreSelectorLiterals(attr);
|
1286
|
+
let [_raw, name, _operator, quote, value] = attr.match(/\[([\w-]+)(?:([~|^$*]?=)(["'])?([^\3\]]*?)\3)?]/);
|
1287
|
+
quote ||= '"';
|
1288
|
+
parsed.attributes[name] = value ? u.parseString(quote + value + quote) : '';
|
1289
|
+
return '';
|
1290
|
+
});
|
1137
1291
|
if (depthSelector) {
|
1138
|
-
up.fail('Cannot parse selector: ' +
|
1292
|
+
up.fail('Cannot parse selector: ' + rawSelector);
|
1139
1293
|
}
|
1140
1294
|
return parsed;
|
1141
1295
|
});
|
@@ -1145,33 +1299,8 @@ up.element = (function () {
|
|
1145
1299
|
excludeRaw,
|
1146
1300
|
};
|
1147
1301
|
}
|
1148
|
-
|
1149
|
-
|
1150
|
-
return string.replace(ATTR_SELECTOR_PATTERN, function (_match, name, operator, quote, value) {
|
1151
|
-
if (value) {
|
1152
|
-
value = value.replace(/\\([\\"'])/, '$1');
|
1153
|
-
}
|
1154
|
-
return replacement({ name, operator, quote, value });
|
1155
|
-
});
|
1156
|
-
}
|
1157
|
-
function removeAttrSelectorValues(selector) {
|
1158
|
-
let values = [];
|
1159
|
-
selector = replaceAttrSelectors(selector, function ({ name, value }) {
|
1160
|
-
values.push(value);
|
1161
|
-
return `[${name}]`;
|
1162
|
-
});
|
1163
|
-
return [selector, values];
|
1164
|
-
}
|
1165
|
-
function affix(parent, ...args) {
|
1166
|
-
let position, selector;
|
1167
|
-
const attributes = u.extractOptions(args);
|
1168
|
-
if (args.length === 2) {
|
1169
|
-
[position, selector] = args;
|
1170
|
-
}
|
1171
|
-
else {
|
1172
|
-
position = 'beforeend';
|
1173
|
-
selector = args[0];
|
1174
|
-
}
|
1302
|
+
function affix(...args) {
|
1303
|
+
let [parent, position = 'beforeend', selector, attributes] = u.args(args, 'val', u.isAdjacentPosition, 'val', 'options');
|
1175
1304
|
const element = createFromSelector(selector, attributes);
|
1176
1305
|
parent.insertAdjacentElement(position, element);
|
1177
1306
|
return element;
|
@@ -1210,14 +1339,22 @@ up.element = (function () {
|
|
1210
1339
|
scriptish.replaceWith(clone);
|
1211
1340
|
}
|
1212
1341
|
function createFromHTML(html) {
|
1342
|
+
return extractSingular(createNodesFromHTML(html));
|
1343
|
+
}
|
1344
|
+
function extractSingular(nodes) {
|
1345
|
+
if (nodes.length === 1 && u.isElementLike(nodes[0])) {
|
1346
|
+
return nodes[0];
|
1347
|
+
}
|
1348
|
+
else {
|
1349
|
+
up.fail('Expected a single element, but got %d elements', nodes.length);
|
1350
|
+
}
|
1351
|
+
}
|
1352
|
+
function createNodesFromHTML(html) {
|
1353
|
+
html = html.trim();
|
1213
1354
|
const range = document.createRange();
|
1214
1355
|
range.setStart(document.body, 0);
|
1215
|
-
const fragment = range.createContextualFragment(html
|
1216
|
-
|
1217
|
-
if (elements.length !== 1) {
|
1218
|
-
throw new Error('HTML must have a single root element');
|
1219
|
-
}
|
1220
|
-
return elements[0];
|
1356
|
+
const fragment = range.createContextualFragment(html);
|
1357
|
+
return fragment.childNodes;
|
1221
1358
|
}
|
1222
1359
|
function getRoot() {
|
1223
1360
|
return document.documentElement;
|
@@ -1226,7 +1363,7 @@ up.element = (function () {
|
|
1226
1363
|
element.offsetHeight;
|
1227
1364
|
}
|
1228
1365
|
function concludeCSSTransition(element) {
|
1229
|
-
const undo =
|
1366
|
+
const undo = setStyleTemp(element, { transition: 'none' });
|
1230
1367
|
paint(element);
|
1231
1368
|
return undo;
|
1232
1369
|
}
|
@@ -1259,19 +1396,28 @@ up.element = (function () {
|
|
1259
1396
|
}
|
1260
1397
|
function unwrap(wrapper) {
|
1261
1398
|
preservingFocus(function () {
|
1262
|
-
|
1263
|
-
|
1264
|
-
|
1265
|
-
|
1399
|
+
let childNodes = [...wrapper.childNodes];
|
1400
|
+
for (let child of childNodes)
|
1401
|
+
insertBefore(wrapper, child);
|
1402
|
+
wrapper.remove();
|
1266
1403
|
});
|
1267
1404
|
}
|
1268
|
-
function
|
1269
|
-
let childNode;
|
1405
|
+
function wrapNodes(nodeOrNodes) {
|
1270
1406
|
const wrapper = document.createElement('up-wrapper');
|
1271
|
-
|
1272
|
-
|
1407
|
+
wrapper.append(...u.wrapList(nodeOrNodes));
|
1408
|
+
return wrapper;
|
1409
|
+
}
|
1410
|
+
function wrapIfRequired(nodes) {
|
1411
|
+
if (nodes.length === 1 && u.isElement(nodes[0])) {
|
1412
|
+
return nodes[0];
|
1413
|
+
}
|
1414
|
+
else {
|
1415
|
+
return wrapNodes(nodes);
|
1273
1416
|
}
|
1274
|
-
|
1417
|
+
}
|
1418
|
+
function wrapChildren(element) {
|
1419
|
+
const wrapper = wrapNodes(element.childNodes);
|
1420
|
+
element.append(wrapper);
|
1275
1421
|
return wrapper;
|
1276
1422
|
}
|
1277
1423
|
function preservingFocus(fn) {
|
@@ -1285,76 +1431,90 @@ up.element = (function () {
|
|
1285
1431
|
}
|
1286
1432
|
}
|
1287
1433
|
}
|
1434
|
+
function parseAttr(element, attribute, ...parsers) {
|
1435
|
+
if (!element.hasAttribute?.(attribute))
|
1436
|
+
return undefined;
|
1437
|
+
let rawValue = element.getAttribute(attribute);
|
1438
|
+
for (let parser of parsers) {
|
1439
|
+
let parserResult = parser(rawValue, attribute, element);
|
1440
|
+
if (u.isDefined(parserResult))
|
1441
|
+
return parserResult;
|
1442
|
+
}
|
1443
|
+
}
|
1288
1444
|
function stringAttr(element, attribute) {
|
1289
|
-
|
1290
|
-
return u.replaceValue(value, null, undefined);
|
1445
|
+
return parseAttr(element, attribute, tryParseString);
|
1291
1446
|
}
|
1292
|
-
|
1293
|
-
|
1294
|
-
|
1295
|
-
|
1447
|
+
let tryParseString = u.identity;
|
1448
|
+
function booleanAttr(element, attribute) {
|
1449
|
+
return parseAttr(element, attribute, tryParseBoolean);
|
1450
|
+
}
|
1451
|
+
function tryParseBoolean(value, attribute) {
|
1296
1452
|
switch (value) {
|
1297
1453
|
case 'false': {
|
1298
1454
|
return false;
|
1299
1455
|
}
|
1300
1456
|
case 'true':
|
1301
1457
|
case '':
|
1302
|
-
case attribute:
|
1303
|
-
|
1304
|
-
}
|
1305
|
-
default: {
|
1306
|
-
if (pass) {
|
1307
|
-
return value;
|
1308
|
-
}
|
1309
|
-
else {
|
1458
|
+
case attribute:
|
1459
|
+
{
|
1310
1460
|
return true;
|
1311
1461
|
}
|
1312
|
-
}
|
1313
1462
|
}
|
1314
1463
|
}
|
1315
|
-
function booleanOrStringAttr(element, attribute
|
1316
|
-
|
1317
|
-
|
1464
|
+
function booleanOrStringAttr(element, attribute) {
|
1465
|
+
return parseAttr(element, attribute, tryParseBoolean, tryParseString);
|
1466
|
+
}
|
1467
|
+
function booleanOrNumberAttr(element, attribute) {
|
1468
|
+
return parseAttr(element, attribute, tryParseBoolean, tryParseNumber);
|
1318
1469
|
}
|
1319
1470
|
function numberAttr(element, attribute) {
|
1320
|
-
|
1321
|
-
|
1322
|
-
|
1323
|
-
|
1324
|
-
|
1325
|
-
|
1471
|
+
return parseAttr(element, attribute, tryParseNumber);
|
1472
|
+
}
|
1473
|
+
function tryParseNumber(value) {
|
1474
|
+
value = value.replaceAll('_', '');
|
1475
|
+
if (value.match(/^-?[\d.]+$/)) {
|
1476
|
+
return parseFloat(value);
|
1326
1477
|
}
|
1327
1478
|
}
|
1328
1479
|
function jsonAttr(element, attribute) {
|
1329
|
-
|
1330
|
-
|
1331
|
-
|
1332
|
-
|
1333
|
-
|
1334
|
-
function callbackAttr(link, attr, { exposedKeys = [], mainKey = 'event' } = {}) {
|
1335
|
-
let code = link.getAttribute(attr);
|
1336
|
-
if (code) {
|
1337
|
-
const callback = up.NonceableCallback.fromString(code).toFunction(mainKey, ...exposedKeys);
|
1338
|
-
return function (event) {
|
1339
|
-
const exposedValues = Object.values(u.pick(event, exposedKeys));
|
1340
|
-
return callback.call(link, event, ...exposedValues);
|
1341
|
-
};
|
1480
|
+
return parseAttr(element, attribute, tryParseJSON);
|
1481
|
+
}
|
1482
|
+
function tryParseJSON(value) {
|
1483
|
+
if (value?.trim()) {
|
1484
|
+
return u.parseRelaxedJSON(value);
|
1342
1485
|
}
|
1343
1486
|
}
|
1344
|
-
function
|
1487
|
+
function callbackAttr(link, attr, callbackOptions) {
|
1488
|
+
return parseAttr(link, attr, (value) => tryParseCallback(value, link, callbackOptions));
|
1489
|
+
}
|
1490
|
+
function tryParseCallback(code, link, { exposedKeys = [], mainKey = 'event' } = {}) {
|
1491
|
+
const callback = up.NonceableCallback.fromString(code).toFunction(mainKey, ...exposedKeys);
|
1492
|
+
return function (event) {
|
1493
|
+
const exposedValues = Object.values(u.pick(event, exposedKeys));
|
1494
|
+
return callback.call(link, event, ...exposedValues);
|
1495
|
+
};
|
1496
|
+
}
|
1497
|
+
function closestAttr(element, attr, readAttrFn = stringAttr) {
|
1345
1498
|
let match = element.closest('[' + attr + ']');
|
1346
1499
|
if (match) {
|
1347
|
-
return
|
1500
|
+
return readAttrFn(match, attr);
|
1348
1501
|
}
|
1349
1502
|
}
|
1350
|
-
function
|
1351
|
-
|
1352
|
-
|
1353
|
-
|
1503
|
+
function addClasses(element, classes) {
|
1504
|
+
for (let klass of classes)
|
1505
|
+
element.classList.add(klass);
|
1506
|
+
}
|
1507
|
+
function addClassTemp(element, klass) {
|
1508
|
+
return setClassStateTemp(element, klass, true);
|
1509
|
+
}
|
1510
|
+
function removeClassTemp(element, klass) {
|
1511
|
+
return setClassStateTemp(element, klass, false);
|
1354
1512
|
}
|
1355
|
-
function
|
1356
|
-
element.classList.
|
1357
|
-
|
1513
|
+
function setClassStateTemp(element, klass, targetState) {
|
1514
|
+
if (element.classList.contains(klass) === targetState)
|
1515
|
+
return u.noop;
|
1516
|
+
element.classList.toggle(klass, targetState);
|
1517
|
+
return () => element.classList.toggle(klass, !targetState);
|
1358
1518
|
}
|
1359
1519
|
function computedStyle(element, props) {
|
1360
1520
|
const style = window.getComputedStyle(element);
|
@@ -1394,16 +1554,24 @@ up.element = (function () {
|
|
1394
1554
|
}
|
1395
1555
|
}
|
1396
1556
|
}
|
1557
|
+
function setStyleTemp(element, newStyles) {
|
1558
|
+
const oldStyles = inlineStyle(element, Object.keys(newStyles));
|
1559
|
+
setInlineStyle(element, newStyles);
|
1560
|
+
return () => setInlineStyle(element, oldStyles);
|
1561
|
+
}
|
1397
1562
|
function isVisible(element) {
|
1398
1563
|
return !!(element.offsetWidth || element.offsetHeight || element.getClientRects().length);
|
1399
1564
|
}
|
1400
1565
|
function isUpPrefixed(string) {
|
1401
1566
|
return /^up-/.test(string);
|
1402
1567
|
}
|
1403
|
-
function
|
1404
|
-
let attrNames = u.filter(element.getAttributeNames(), isUpPrefixed);
|
1568
|
+
function pickAttrs(element, attrNames) {
|
1405
1569
|
return u.mapObject(attrNames, (name) => [name, element.getAttribute(name)]);
|
1406
1570
|
}
|
1571
|
+
function upAttrs(element) {
|
1572
|
+
let attrNames = element.getAttributeNames().filter(isUpPrefixed);
|
1573
|
+
return pickAttrs(element, attrNames);
|
1574
|
+
}
|
1407
1575
|
function upClasses(element) {
|
1408
1576
|
return u.filter(element.classList.values(), isUpPrefixed);
|
1409
1577
|
}
|
@@ -1430,8 +1598,29 @@ up.element = (function () {
|
|
1430
1598
|
selector += `:not(${excludes.join()})`;
|
1431
1599
|
return selector;
|
1432
1600
|
}
|
1601
|
+
function matchSelectorMap(selectorMap, element) {
|
1602
|
+
let matches = [];
|
1603
|
+
if (selectorMap) {
|
1604
|
+
for (let [selector, value] of Object.entries(selectorMap)) {
|
1605
|
+
if (u.isDefined(value) && element.matches(selector)) {
|
1606
|
+
matches.push(value);
|
1607
|
+
}
|
1608
|
+
}
|
1609
|
+
}
|
1610
|
+
return matches;
|
1611
|
+
}
|
1612
|
+
function documentPosition(element) {
|
1613
|
+
let nextSibling = element.nextElementSibling;
|
1614
|
+
if (nextSibling) {
|
1615
|
+
return [nextSibling, 'beforebegin'];
|
1616
|
+
}
|
1617
|
+
else {
|
1618
|
+
return [element.parentElement, 'beforeend'];
|
1619
|
+
}
|
1620
|
+
}
|
1433
1621
|
return {
|
1434
1622
|
subtree,
|
1623
|
+
subtreeFirst,
|
1435
1624
|
contains,
|
1436
1625
|
closestAttr,
|
1437
1626
|
ancestor,
|
@@ -1440,12 +1629,14 @@ up.element = (function () {
|
|
1440
1629
|
list: getList,
|
1441
1630
|
toggle,
|
1442
1631
|
hide,
|
1632
|
+
hideTemp,
|
1443
1633
|
show,
|
1634
|
+
showTemp,
|
1444
1635
|
metaContent,
|
1445
1636
|
insertBefore,
|
1446
1637
|
createFromSelector,
|
1447
1638
|
setAttrs,
|
1448
|
-
|
1639
|
+
setAttrsTemp,
|
1449
1640
|
affix,
|
1450
1641
|
idSelector,
|
1451
1642
|
classSelector,
|
@@ -1454,7 +1645,9 @@ up.element = (function () {
|
|
1454
1645
|
tagName: elementTagName,
|
1455
1646
|
createBrokenDocumentFromHTML,
|
1456
1647
|
fixParserDamage,
|
1648
|
+
createNodesFromHTML,
|
1457
1649
|
createFromHTML,
|
1650
|
+
extractSingular,
|
1458
1651
|
get root() { return getRoot(); },
|
1459
1652
|
paint,
|
1460
1653
|
concludeCSSTransition,
|
@@ -1464,13 +1657,15 @@ up.element = (function () {
|
|
1464
1657
|
setMissingAttr,
|
1465
1658
|
unwrap,
|
1466
1659
|
wrapChildren,
|
1660
|
+
wrapIfRequired,
|
1467
1661
|
attr: stringAttr,
|
1468
1662
|
booleanAttr,
|
1469
1663
|
numberAttr,
|
1470
1664
|
jsonAttr,
|
1471
1665
|
callbackAttr,
|
1472
1666
|
booleanOrStringAttr,
|
1473
|
-
|
1667
|
+
booleanOrNumberAttr,
|
1668
|
+
setStyleTemp,
|
1474
1669
|
style: computedStyle,
|
1475
1670
|
styleNumber: computedStyleNumber,
|
1476
1671
|
inlineStyle,
|
@@ -1478,14 +1673,19 @@ up.element = (function () {
|
|
1478
1673
|
isVisible,
|
1479
1674
|
upAttrs,
|
1480
1675
|
upClasses,
|
1481
|
-
|
1482
|
-
|
1676
|
+
setAttrPresence,
|
1677
|
+
addClasses,
|
1678
|
+
addClassTemp,
|
1679
|
+
removeClassTemp,
|
1483
1680
|
cleanJQuery,
|
1484
1681
|
parseSelector,
|
1485
1682
|
isEmpty,
|
1486
1683
|
crossOriginSelector,
|
1487
1684
|
isIntersectingWindow,
|
1488
1685
|
unionSelector,
|
1686
|
+
matchSelectorMap,
|
1687
|
+
elementLikeMatches,
|
1688
|
+
documentPosition,
|
1489
1689
|
};
|
1490
1690
|
})();
|
1491
1691
|
|
@@ -1682,6 +1882,9 @@ up.OptionsParser = class OptionsParser {
|
|
1682
1882
|
booleanOrString(key, keyOptions) {
|
1683
1883
|
this.parse(e.booleanOrStringAttr, key, keyOptions);
|
1684
1884
|
}
|
1885
|
+
booleanOrNumber(key, keyOptions) {
|
1886
|
+
this.parse(e.booleanOrNumberAttr, key, keyOptions);
|
1887
|
+
}
|
1685
1888
|
json(key, keyOptions) {
|
1686
1889
|
this.parse(e.jsonAttr, key, keyOptions);
|
1687
1890
|
}
|
@@ -1801,16 +2004,17 @@ up.Rect = class Rect extends up.Record {
|
|
1801
2004
|
/***/ (() => {
|
1802
2005
|
|
1803
2006
|
const e = up.element;
|
2007
|
+
const u = up.util;
|
1804
2008
|
const SHIFT_CLASS = 'up-scrollbar-away';
|
1805
2009
|
up.BodyShifter = class BodyShifter {
|
1806
2010
|
constructor() {
|
1807
2011
|
this._anchoredElements = new Set();
|
1808
2012
|
this._stack = 0;
|
1809
|
-
this.
|
2013
|
+
this._cleaner = u.cleaner();
|
1810
2014
|
}
|
1811
2015
|
lowerStack() {
|
1812
2016
|
if (--this._stack === 0)
|
1813
|
-
this.
|
2017
|
+
this._cleaner.clean();
|
1814
2018
|
}
|
1815
2019
|
raiseStack() {
|
1816
2020
|
if (++this._stack === 1)
|
@@ -1826,7 +2030,7 @@ up.BodyShifter = class BodyShifter {
|
|
1826
2030
|
}
|
1827
2031
|
_shiftNow() {
|
1828
2032
|
this._rootScrollbarWidth = up.viewport.rootScrollbarWidth();
|
1829
|
-
this.
|
2033
|
+
this._cleaner(e.setStyleTemp(e.root, {
|
1830
2034
|
'--up-scrollbar-width': this._rootScrollbarWidth + 'px'
|
1831
2035
|
}));
|
1832
2036
|
this._shiftElement(document.body, 'padding-right');
|
@@ -1838,13 +2042,7 @@ up.BodyShifter = class BodyShifter {
|
|
1838
2042
|
if (!this._isShifted())
|
1839
2043
|
return;
|
1840
2044
|
let originalValue = e.style(element, styleProp);
|
1841
|
-
this.
|
1842
|
-
}
|
1843
|
-
_unshiftNow() {
|
1844
|
-
let cleaner;
|
1845
|
-
while (cleaner = this._cleaners.pop()) {
|
1846
|
-
cleaner();
|
1847
|
-
}
|
2045
|
+
this._cleaner(e.setStyleTemp(element, { ['--up-original-' + styleProp]: originalValue }), e.addClassTemp(element, SHIFT_CLASS));
|
1848
2046
|
}
|
1849
2047
|
};
|
1850
2048
|
|
@@ -1861,9 +2059,6 @@ up.Change = class Change {
|
|
1861
2059
|
execute() {
|
1862
2060
|
throw new up.NotImplemented();
|
1863
2061
|
}
|
1864
|
-
onFinished(renderResult) {
|
1865
|
-
return this.options.onFinished?.(renderResult);
|
1866
|
-
}
|
1867
2062
|
improveHistoryValue(existingValue, newValue) {
|
1868
2063
|
if ((existingValue === false) || u.isString(existingValue)) {
|
1869
2064
|
return existingValue;
|
@@ -1894,30 +2089,30 @@ up.Change.Addition = class Addition extends up.Change {
|
|
1894
2089
|
}
|
1895
2090
|
handleLayerChangeRequests() {
|
1896
2091
|
if (this.layer.isOverlay()) {
|
1897
|
-
this.
|
2092
|
+
this._tryAcceptLayerFromServer();
|
1898
2093
|
this.abortWhenLayerClosed();
|
1899
|
-
this.layer.tryAcceptForLocation(this.
|
2094
|
+
this.layer.tryAcceptForLocation(this._responseOptions());
|
1900
2095
|
this.abortWhenLayerClosed();
|
1901
|
-
this.
|
2096
|
+
this._tryDismissLayerFromServer();
|
1902
2097
|
this.abortWhenLayerClosed();
|
1903
|
-
this.layer.tryDismissForLocation(this.
|
2098
|
+
this.layer.tryDismissForLocation(this._responseOptions());
|
1904
2099
|
this.abortWhenLayerClosed();
|
1905
2100
|
}
|
1906
2101
|
this.layer.asCurrent(() => {
|
1907
2102
|
for (let eventPlan of this._eventPlans) {
|
1908
|
-
up.emit({ ...eventPlan, ...this.
|
2103
|
+
up.emit({ ...eventPlan, ...this._responseOptions() });
|
1909
2104
|
this.abortWhenLayerClosed();
|
1910
2105
|
}
|
1911
2106
|
});
|
1912
2107
|
}
|
1913
|
-
|
2108
|
+
_tryAcceptLayerFromServer() {
|
1914
2109
|
if (u.isDefined(this._acceptLayer) && this.layer.isOverlay()) {
|
1915
|
-
this.layer.accept(this._acceptLayer, this.
|
2110
|
+
this.layer.accept(this._acceptLayer, this._responseOptions());
|
1916
2111
|
}
|
1917
2112
|
}
|
1918
|
-
|
2113
|
+
_tryDismissLayerFromServer() {
|
1919
2114
|
if (u.isDefined(this._dismissLayer) && this.layer.isOverlay()) {
|
1920
|
-
this.layer.dismiss(this._dismissLayer, this.
|
2115
|
+
this.layer.dismiss(this._dismissLayer, this._responseOptions());
|
1921
2116
|
}
|
1922
2117
|
}
|
1923
2118
|
abortWhenLayerClosed(layer = this.layer) {
|
@@ -1925,7 +2120,7 @@ up.Change.Addition = class Addition extends up.Change {
|
|
1925
2120
|
throw new up.Aborted('Layer was closed');
|
1926
2121
|
}
|
1927
2122
|
}
|
1928
|
-
|
2123
|
+
_setSource({ oldElement, newElement, source }) {
|
1929
2124
|
if (source === 'keep') {
|
1930
2125
|
source = (oldElement && up.fragment.source(oldElement));
|
1931
2126
|
}
|
@@ -1933,18 +2128,18 @@ up.Change.Addition = class Addition extends up.Change {
|
|
1933
2128
|
e.setMissingAttr(newElement, 'up-source', up.fragment.normalizeSource(source));
|
1934
2129
|
}
|
1935
2130
|
}
|
1936
|
-
|
2131
|
+
_setTime({ newElement, time }) {
|
1937
2132
|
e.setMissingAttr(newElement, 'up-time', time ? time.toUTCString() : false);
|
1938
2133
|
}
|
1939
|
-
|
2134
|
+
_setETag({ newElement, etag }) {
|
1940
2135
|
e.setMissingAttr(newElement, 'up-etag', etag || false);
|
1941
2136
|
}
|
1942
2137
|
setReloadAttrs(options) {
|
1943
|
-
this.
|
1944
|
-
this.
|
1945
|
-
this.
|
2138
|
+
this._setSource(options);
|
2139
|
+
this._setTime(options);
|
2140
|
+
this._setETag(options);
|
1946
2141
|
}
|
1947
|
-
|
2142
|
+
_responseOptions() {
|
1948
2143
|
return { response: this._response };
|
1949
2144
|
}
|
1950
2145
|
executeSteps(steps, responseDoc, noneOptions) {
|
@@ -1969,8 +2164,10 @@ up.RenderJob = (_a = class RenderJob {
|
|
1969
2164
|
}
|
1970
2165
|
async _executePromise() {
|
1971
2166
|
try {
|
1972
|
-
this.
|
2167
|
+
this._emitGuardEvent();
|
1973
2168
|
this.options = up.RenderOptions.preprocess(this.options);
|
2169
|
+
up.browser.assertConfirmed(this.options);
|
2170
|
+
up.RenderOptions.assertContentGiven(this.options);
|
1974
2171
|
let result = await this._getChange().execute();
|
1975
2172
|
this._handleResult(result);
|
1976
2173
|
return result;
|
@@ -2015,21 +2212,19 @@ up.RenderJob = (_a = class RenderJob {
|
|
2015
2212
|
}
|
2016
2213
|
}
|
2017
2214
|
_getChange() {
|
2018
|
-
|
2019
|
-
|
2020
|
-
|
2215
|
+
let handleAbort = u.memoize((request) => this._handleAbortOption(request));
|
2216
|
+
let renderOptions = { ...this.options, handleAbort };
|
2217
|
+
if (renderOptions.url) {
|
2218
|
+
return new up.Change.FromURL(renderOptions);
|
2021
2219
|
}
|
2022
|
-
else if (
|
2023
|
-
|
2024
|
-
return new up.Change.FromResponse({ ...this.options, onRender });
|
2220
|
+
else if (renderOptions.response) {
|
2221
|
+
return new up.Change.FromResponse(renderOptions);
|
2025
2222
|
}
|
2026
2223
|
else {
|
2027
|
-
|
2028
|
-
return new up.Change.FromContent({ ...this.options, onRender });
|
2224
|
+
return new up.Change.FromContent(renderOptions);
|
2029
2225
|
}
|
2030
2226
|
}
|
2031
|
-
|
2032
|
-
up.browser.assertConfirmed(this.options);
|
2227
|
+
_emitGuardEvent() {
|
2033
2228
|
let guardEvent = u.pluckKey(this.options, 'guardEvent');
|
2034
2229
|
if (guardEvent) {
|
2035
2230
|
guardEvent.renderOptions = this.options;
|
@@ -2037,24 +2232,23 @@ up.RenderJob = (_a = class RenderJob {
|
|
2037
2232
|
throw new up.Aborted(`Rendering was prevented by ${guardEvent.type} listener`);
|
2038
2233
|
}
|
2039
2234
|
}
|
2040
|
-
up.RenderOptions.assertContentGiven(this.options);
|
2041
2235
|
}
|
2042
2236
|
_handleAbortOption(request) {
|
2043
2237
|
let { abort } = this.options;
|
2044
2238
|
if (!abort || !up.network.isBusy())
|
2045
2239
|
return;
|
2046
|
-
let {
|
2240
|
+
let { bindFragments, bindLayer, origin, layer } = this._getChange().getPreflightProps();
|
2047
2241
|
let abortOptions = {
|
2048
2242
|
except: request,
|
2049
2243
|
logOnce: ['up.render()', 'Change with { abort } option will abort other requests'],
|
2050
|
-
newLayer,
|
2244
|
+
newLayer: (layer === 'new'),
|
2051
2245
|
origin,
|
2052
2246
|
};
|
2053
2247
|
if (abort === 'target') {
|
2054
|
-
up.fragment.abort(
|
2248
|
+
up.fragment.abort(bindFragments, { ...abortOptions });
|
2055
2249
|
}
|
2056
2250
|
else if (abort === 'layer') {
|
2057
|
-
up.fragment.abort({ ...abortOptions, layer });
|
2251
|
+
up.fragment.abort({ ...abortOptions, layer: bindLayer });
|
2058
2252
|
}
|
2059
2253
|
else if (abort === 'all' || abort === true) {
|
2060
2254
|
up.fragment.abort({ ...abortOptions, layer: 'any' });
|
@@ -2063,12 +2257,12 @@ up.RenderJob = (_a = class RenderJob {
|
|
2063
2257
|
abort(abortOptions);
|
2064
2258
|
}
|
2065
2259
|
else {
|
2066
|
-
up.fragment.abort(abort, { ...abortOptions, layer });
|
2260
|
+
up.fragment.abort(abort, { ...abortOptions, layer: bindLayer });
|
2067
2261
|
}
|
2068
2262
|
}
|
2069
2263
|
},
|
2070
2264
|
(() => {
|
2071
|
-
u.
|
2265
|
+
u.delegatePromise(_a.prototype, '_rendered');
|
2072
2266
|
u.memoizeMethod(_a.prototype, {
|
2073
2267
|
_awaitFinished: true,
|
2074
2268
|
_getChange: true,
|
@@ -2081,21 +2275,14 @@ up.RenderJob = (_a = class RenderJob {
|
|
2081
2275
|
/* 26 */
|
2082
2276
|
/***/ (() => {
|
2083
2277
|
|
2084
|
-
up.Change.
|
2085
|
-
};
|
2086
|
-
|
2087
|
-
|
2088
|
-
/***/ }),
|
2089
|
-
/* 27 */
|
2090
|
-
/***/ (() => {
|
2091
|
-
|
2092
|
-
up.Change.DestroyFragment = class DestroyFragment extends up.Change.Removal {
|
2278
|
+
up.Change.DestroyFragment = class DestroyFragment extends up.Change {
|
2093
2279
|
constructor(options) {
|
2094
2280
|
super(options);
|
2095
2281
|
this._layer = up.layer.get(options) || up.layer.current;
|
2096
2282
|
this._element = this.options.element;
|
2097
2283
|
this._animation = this.options.animation;
|
2098
2284
|
this._log = this.options.log;
|
2285
|
+
this._onFinished = this.options.onFinished;
|
2099
2286
|
}
|
2100
2287
|
execute() {
|
2101
2288
|
this._parent = this._element.parentNode;
|
@@ -2111,12 +2298,12 @@ up.Change.DestroyFragment = class DestroyFragment extends up.Change.Removal {
|
|
2111
2298
|
this._emitDestroyed();
|
2112
2299
|
await this._animate();
|
2113
2300
|
this._wipe();
|
2114
|
-
this.
|
2301
|
+
this._onFinished?.();
|
2115
2302
|
}
|
2116
2303
|
_destroyNow() {
|
2117
2304
|
this._wipe();
|
2118
2305
|
this._emitDestroyed();
|
2119
|
-
this.
|
2306
|
+
this._onFinished?.();
|
2120
2307
|
}
|
2121
2308
|
_animate() {
|
2122
2309
|
return up.motion.animate(this._element, this._animation, this.options);
|
@@ -2136,7 +2323,7 @@ up.Change.DestroyFragment = class DestroyFragment extends up.Change.Removal {
|
|
2136
2323
|
|
2137
2324
|
|
2138
2325
|
/***/ }),
|
2139
|
-
/*
|
2326
|
+
/* 27 */
|
2140
2327
|
/***/ (() => {
|
2141
2328
|
|
2142
2329
|
let u = up.util;
|
@@ -2153,9 +2340,10 @@ up.Change.OpenLayer = class OpenLayer extends up.Change.Addition {
|
|
2153
2340
|
context: this._buildLayer().context,
|
2154
2341
|
origin: this.options.origin,
|
2155
2342
|
target: this.target,
|
2156
|
-
|
2157
|
-
|
2158
|
-
|
2343
|
+
bindLayer: this._baseLayer,
|
2344
|
+
layer: 'new',
|
2345
|
+
bindFragments: u.compact([up.fragment.get(':main', { layer: this._baseLayer })]),
|
2346
|
+
fragments: [],
|
2159
2347
|
};
|
2160
2348
|
}
|
2161
2349
|
execute(responseDoc, onApplicable) {
|
@@ -2205,7 +2393,7 @@ up.Change.OpenLayer = class OpenLayer extends up.Change.Addition {
|
|
2205
2393
|
fragments: [this._content],
|
2206
2394
|
target: this.target,
|
2207
2395
|
});
|
2208
|
-
up.hello(this.layer.element, { ...this.options, layer: this.layer });
|
2396
|
+
up.hello(this.layer.element, { ...this.options, layer: this.layer, dataRoot: this._content });
|
2209
2397
|
this._handleScroll();
|
2210
2398
|
this._newOverlayResult.finished = this._finish();
|
2211
2399
|
this.layer.opening = false;
|
@@ -2290,7 +2478,7 @@ up.Change.OpenLayer = class OpenLayer extends up.Change.Addition {
|
|
2290
2478
|
|
2291
2479
|
|
2292
2480
|
/***/ }),
|
2293
|
-
/*
|
2481
|
+
/* 28 */
|
2294
2482
|
/***/ (() => {
|
2295
2483
|
|
2296
2484
|
var _a;
|
@@ -2306,14 +2494,16 @@ up.Change.UpdateLayer = (_a = class UpdateLayer extends up.Change.Addition {
|
|
2306
2494
|
}
|
2307
2495
|
getPreflightProps() {
|
2308
2496
|
this._matchPreflight();
|
2497
|
+
let fragments = this._getFragments();
|
2309
2498
|
return {
|
2310
2499
|
layer: this.layer,
|
2500
|
+
bindLayer: this.layer,
|
2311
2501
|
mode: this.layer.mode,
|
2312
2502
|
context: u.merge(this.layer.context, this._context),
|
2313
2503
|
origin: this.options.origin,
|
2314
2504
|
target: this._bestPreflightSelector(),
|
2315
|
-
fragments
|
2316
|
-
|
2505
|
+
fragments,
|
2506
|
+
bindFragments: fragments,
|
2317
2507
|
};
|
2318
2508
|
}
|
2319
2509
|
_bestPreflightSelector() {
|
@@ -2439,7 +2629,7 @@ up.Change.UpdateLayer = (_a = class UpdateLayer extends up.Change.Addition {
|
|
2439
2629
|
|
2440
2630
|
|
2441
2631
|
/***/ }),
|
2442
|
-
/*
|
2632
|
+
/* 29 */
|
2443
2633
|
/***/ (() => {
|
2444
2634
|
|
2445
2635
|
const u = up.util;
|
@@ -2511,7 +2701,7 @@ up.Change.UpdateSteps = class UpdateSteps extends up.Change.Addition {
|
|
2511
2701
|
up.script.clean(step.oldElement, { layer: step.layer });
|
2512
2702
|
},
|
2513
2703
|
afterDetach() {
|
2514
|
-
|
2704
|
+
e.cleanJQuery();
|
2515
2705
|
up.fragment.emitDestroyed(step.oldElement, { parent, log: false });
|
2516
2706
|
},
|
2517
2707
|
scrollNew: () => {
|
@@ -2555,7 +2745,7 @@ up.Change.UpdateSteps = class UpdateSteps extends up.Change.Addition {
|
|
2555
2745
|
}
|
2556
2746
|
}
|
2557
2747
|
_findKeepPlan(options) {
|
2558
|
-
if (!options.
|
2748
|
+
if (!options.keep) {
|
2559
2749
|
return;
|
2560
2750
|
}
|
2561
2751
|
const { oldElement, newElement } = options;
|
@@ -2570,7 +2760,7 @@ up.Change.UpdateSteps = class UpdateSteps extends up.Change.Addition {
|
|
2570
2760
|
partner = up.fragment.get(newElement, partnerSelector, lookupOpts);
|
2571
2761
|
}
|
2572
2762
|
else {
|
2573
|
-
partner =
|
2763
|
+
partner = e.subtreeFirst(newElement, partnerSelector, lookupOpts);
|
2574
2764
|
}
|
2575
2765
|
if (partner && e.booleanAttr(partner, 'up-keep') !== false) {
|
2576
2766
|
const plan = {
|
@@ -2586,7 +2776,7 @@ up.Change.UpdateSteps = class UpdateSteps extends up.Change.Addition {
|
|
2586
2776
|
}
|
2587
2777
|
_preserveKeepables(step) {
|
2588
2778
|
const keepPlans = [];
|
2589
|
-
if (step.
|
2779
|
+
if (step.keep) {
|
2590
2780
|
for (let keepable of step.oldElement.querySelectorAll('[up-keep]')) {
|
2591
2781
|
let keepPlan = this._findKeepPlan({ ...step, oldElement: keepable, descendantsOnly: true });
|
2592
2782
|
if (keepPlan) {
|
@@ -2647,11 +2837,11 @@ up.Change.UpdateSteps = class UpdateSteps extends up.Change.Addition {
|
|
2647
2837
|
|
2648
2838
|
|
2649
2839
|
/***/ }),
|
2650
|
-
/*
|
2840
|
+
/* 30 */
|
2651
2841
|
/***/ (() => {
|
2652
2842
|
|
2653
2843
|
const u = up.util;
|
2654
|
-
up.Change.CloseLayer = class CloseLayer extends up.Change
|
2844
|
+
up.Change.CloseLayer = class CloseLayer extends up.Change {
|
2655
2845
|
constructor(options) {
|
2656
2846
|
super(options);
|
2657
2847
|
this._verb = options.verb;
|
@@ -2723,27 +2913,26 @@ up.Change.CloseLayer = class CloseLayer extends up.Change.Removal {
|
|
2723
2913
|
|
2724
2914
|
|
2725
2915
|
/***/ }),
|
2726
|
-
/*
|
2916
|
+
/* 31 */
|
2727
2917
|
/***/ (() => {
|
2728
2918
|
|
2729
2919
|
var _a;
|
2730
2920
|
const u = up.util;
|
2731
2921
|
up.Change.FromURL = (_a = class FromURL extends up.Change {
|
2732
|
-
execute() {
|
2733
|
-
let
|
2734
|
-
if (
|
2735
|
-
up.puts('up.render()',
|
2922
|
+
async execute() {
|
2923
|
+
let newPageReason = this._newPageReason();
|
2924
|
+
if (newPageReason) {
|
2925
|
+
up.puts('up.render()', newPageReason);
|
2736
2926
|
up.network.loadPage(this.options);
|
2737
2927
|
return u.unresolvablePromise();
|
2738
2928
|
}
|
2739
|
-
this.request = up.request(this._getRequestAttrs());
|
2740
|
-
this.options.
|
2741
|
-
|
2742
|
-
|
2743
|
-
|
2744
|
-
|
2745
|
-
|
2746
|
-
return u.always(this.request, responseOrError => this._onRequestSettled(responseOrError));
|
2929
|
+
let request = this.request = up.request(this._getRequestAttrs());
|
2930
|
+
this.options.onRequestKnown?.(request);
|
2931
|
+
if (this.options.preload)
|
2932
|
+
return request;
|
2933
|
+
this.options.handleAbort?.(request);
|
2934
|
+
request.runPreviews(this.options);
|
2935
|
+
return await u.always(request, responseOrError => this._onRequestSettled(responseOrError));
|
2747
2936
|
}
|
2748
2937
|
_newPageReason() {
|
2749
2938
|
if (u.isCrossOrigin(this.options.url)) {
|
@@ -2759,15 +2948,15 @@ up.Change.FromURL = (_a = class FromURL extends up.Change {
|
|
2759
2948
|
return {
|
2760
2949
|
...this.options,
|
2761
2950
|
...successAttrs,
|
2762
|
-
...u.
|
2951
|
+
...u.withRenamedKeys(failAttrs, up.fragment.failKey),
|
2763
2952
|
};
|
2764
2953
|
}
|
2765
2954
|
getPreflightProps() {
|
2766
2955
|
return this._getRequestAttrs();
|
2767
2956
|
}
|
2768
|
-
_preflightPropsForRenderOptions(renderOptions,
|
2769
|
-
const
|
2770
|
-
return
|
2957
|
+
_preflightPropsForRenderOptions(renderOptions, getPreflightPropsOptions) {
|
2958
|
+
const preflightChange = new up.Change.FromContent({ ...renderOptions, preflight: true });
|
2959
|
+
return preflightChange.getPreflightProps(getPreflightPropsOptions);
|
2771
2960
|
}
|
2772
2961
|
_onRequestSettled(response) {
|
2773
2962
|
if (response instanceof up.Response) {
|
@@ -2801,7 +2990,7 @@ up.Change.FromURL = (_a = class FromURL extends up.Change {
|
|
2801
2990
|
|
2802
2991
|
|
2803
2992
|
/***/ }),
|
2804
|
-
/*
|
2993
|
+
/* 32 */
|
2805
2994
|
/***/ (() => {
|
2806
2995
|
|
2807
2996
|
var _a;
|
@@ -2862,17 +3051,17 @@ up.Change.FromResponse = (_a = class FromResponse extends up.Change {
|
|
2862
3051
|
up.puts('up.render()', 'Revalidating cached response for target "%s"', effectiveTarget);
|
2863
3052
|
let verifyResult = await up.reload(effectiveTarget, {
|
2864
3053
|
...originalRenderOptions,
|
3054
|
+
...up.RenderOptions.NO_MOTION,
|
3055
|
+
...up.RenderOptions.NO_INPUT_INTERFERENCE,
|
3056
|
+
...up.RenderOptions.NO_PREVIEWS,
|
2865
3057
|
preferOldElements: renderResult.fragments,
|
2866
3058
|
layer: renderResult.layer,
|
2867
3059
|
onFinished: null,
|
2868
|
-
scroll: false,
|
2869
|
-
focus: 'keep',
|
2870
|
-
transition: false,
|
2871
|
-
cache: false,
|
2872
|
-
confirm: false,
|
2873
|
-
feedback: false,
|
2874
|
-
abort: false,
|
2875
3060
|
expiredResponse: this._response,
|
3061
|
+
preview: this._revalidatePreview(originalRenderOptions),
|
3062
|
+
abort: false,
|
3063
|
+
cache: false,
|
3064
|
+
background: true,
|
2876
3065
|
});
|
2877
3066
|
if (!verifyResult.none) {
|
2878
3067
|
renderResult = verifyResult;
|
@@ -2880,6 +3069,14 @@ up.Change.FromResponse = (_a = class FromResponse extends up.Change {
|
|
2880
3069
|
}
|
2881
3070
|
return renderResult;
|
2882
3071
|
}
|
3072
|
+
_revalidatePreview({ preview, revalidatePreview }) {
|
3073
|
+
if (revalidatePreview === true) {
|
3074
|
+
return preview;
|
3075
|
+
}
|
3076
|
+
else {
|
3077
|
+
return revalidatePreview;
|
3078
|
+
}
|
3079
|
+
}
|
2883
3080
|
_loadedEventProps() {
|
2884
3081
|
const { expiredResponse } = this.options;
|
2885
3082
|
return {
|
@@ -2939,7 +3136,7 @@ up.Change.FromResponse = (_a = class FromResponse extends up.Change {
|
|
2939
3136
|
|
2940
3137
|
|
2941
3138
|
/***/ }),
|
2942
|
-
/*
|
3139
|
+
/* 33 */
|
2943
3140
|
/***/ (() => {
|
2944
3141
|
|
2945
3142
|
var _a;
|
@@ -2948,7 +3145,7 @@ up.Change.FromContent = (_a = class FromContent extends up.Change {
|
|
2948
3145
|
constructor(options) {
|
2949
3146
|
super(options);
|
2950
3147
|
this._origin = options.origin;
|
2951
|
-
this.
|
3148
|
+
this._preflight = options.preflight;
|
2952
3149
|
this._layers = up.layer.getAll(options);
|
2953
3150
|
}
|
2954
3151
|
_getPlans() {
|
@@ -3000,10 +3197,10 @@ up.Change.FromContent = (_a = class FromContent extends up.Change {
|
|
3000
3197
|
if (assets) {
|
3001
3198
|
up.script.assertAssetsOK(assets, plan.options);
|
3002
3199
|
}
|
3003
|
-
this.options.
|
3200
|
+
this.options.handleAbort?.(null);
|
3004
3201
|
}
|
3005
3202
|
_getResponseDoc() {
|
3006
|
-
if (this.
|
3203
|
+
if (this._preflight)
|
3007
3204
|
return;
|
3008
3205
|
const docOptions = u.pick(this.options, [
|
3009
3206
|
'target',
|
@@ -3013,6 +3210,7 @@ up.Change.FromContent = (_a = class FromContent extends up.Change {
|
|
3013
3210
|
'html',
|
3014
3211
|
'cspNonces',
|
3015
3212
|
'origin',
|
3213
|
+
'data',
|
3016
3214
|
]);
|
3017
3215
|
up.migrate.handleResponseDocOptions?.(docOptions);
|
3018
3216
|
if (this._defaultPlacement() === 'content') {
|
@@ -3021,7 +3219,7 @@ up.Change.FromContent = (_a = class FromContent extends up.Change {
|
|
3021
3219
|
return new up.ResponseDoc(docOptions);
|
3022
3220
|
}
|
3023
3221
|
_improveOptionsFromResponseDoc() {
|
3024
|
-
if (this.
|
3222
|
+
if (this._preflight)
|
3025
3223
|
return;
|
3026
3224
|
let responseDoc = this._getResponseDoc();
|
3027
3225
|
if (this.options.fragment) {
|
@@ -3093,17 +3291,18 @@ up.Change.FromContent = (_a = class FromContent extends up.Change {
|
|
3093
3291
|
|
3094
3292
|
|
3095
3293
|
/***/ }),
|
3096
|
-
/*
|
3294
|
+
/* 34 */
|
3097
3295
|
/***/ (() => {
|
3098
3296
|
|
3099
3297
|
const u = up.util;
|
3100
3298
|
up.CompilerPass = class CompilerPass {
|
3101
|
-
constructor(root, compilers, { layer, data, dataMap, meta }) {
|
3299
|
+
constructor(root, compilers, { layer, data, dataRoot, dataMap, meta }) {
|
3102
3300
|
layer ||= up.layer.get(root) || up.layer.current;
|
3103
3301
|
this._root = root;
|
3104
3302
|
this._compilers = compilers;
|
3105
3303
|
this._layer = layer;
|
3106
3304
|
this._data = data;
|
3305
|
+
this._dataRoot = dataRoot || root;
|
3107
3306
|
this._dataMap = dataMap;
|
3108
3307
|
meta ||= {};
|
3109
3308
|
meta.layer = layer;
|
@@ -3119,7 +3318,7 @@ up.CompilerPass = class CompilerPass {
|
|
3119
3318
|
}
|
3120
3319
|
setCompileData() {
|
3121
3320
|
if (this._data) {
|
3122
|
-
this.
|
3321
|
+
this._dataRoot.upCompileData = this._data;
|
3123
3322
|
}
|
3124
3323
|
if (this._dataMap) {
|
3125
3324
|
for (let selector in this._dataMap) {
|
@@ -3154,10 +3353,7 @@ up.CompilerPass = class CompilerPass {
|
|
3154
3353
|
compileArgs.push(data, this._meta);
|
3155
3354
|
}
|
3156
3355
|
const result = this._applyCompilerFunction(compiler, element, compileArgs);
|
3157
|
-
|
3158
|
-
if (destructorOrDestructors) {
|
3159
|
-
up.destructor(element, destructorOrDestructors);
|
3160
|
-
}
|
3356
|
+
up.destructor(element, result);
|
3161
3357
|
}
|
3162
3358
|
_compileBatch(compiler, elements) {
|
3163
3359
|
const compileArgs = [elements];
|
@@ -3166,18 +3362,13 @@ up.CompilerPass = class CompilerPass {
|
|
3166
3362
|
compileArgs.push(dataList, this._meta);
|
3167
3363
|
}
|
3168
3364
|
const result = this._applyCompilerFunction(compiler, elements, compileArgs);
|
3169
|
-
if (
|
3365
|
+
if (result) {
|
3170
3366
|
up.fail('Compilers with { batch: true } cannot return destructors');
|
3171
3367
|
}
|
3172
3368
|
}
|
3173
3369
|
_applyCompilerFunction(compiler, elementOrElements, compileArgs) {
|
3174
3370
|
return up.error.guard(() => compiler.apply(elementOrElements, compileArgs));
|
3175
3371
|
}
|
3176
|
-
_destructorPresence(result) {
|
3177
|
-
if (u.isFunction(result) || (u.isArray(result) && (u.every(result, u.isFunction)))) {
|
3178
|
-
return result;
|
3179
|
-
}
|
3180
|
-
}
|
3181
3372
|
_select(selector) {
|
3182
3373
|
return up.fragment.subtree(this._root, u.evalOption(selector), { layer: this._layer });
|
3183
3374
|
}
|
@@ -3195,7 +3386,7 @@ up.CompilerPass = class CompilerPass {
|
|
3195
3386
|
|
3196
3387
|
|
3197
3388
|
/***/ }),
|
3198
|
-
/*
|
3389
|
+
/* 35 */
|
3199
3390
|
/***/ (() => {
|
3200
3391
|
|
3201
3392
|
const u = up.util;
|
@@ -3279,7 +3470,7 @@ up.CSSTransition = class CSSTransition {
|
|
3279
3470
|
if (oldTransition['transition-property'] !== 'all') {
|
3280
3471
|
const oldTransitionProperties = oldTransition['transition-property'].split(/\s*,\s*/);
|
3281
3472
|
const oldTransitionFrame = e.style(this._element, oldTransitionProperties);
|
3282
|
-
this._setOldTransitionTargetFrame = e.
|
3473
|
+
this._setOldTransitionTargetFrame = e.setStyleTemp(this._element, oldTransitionFrame);
|
3283
3474
|
}
|
3284
3475
|
this._setOldTransition = e.concludeCSSTransition(this._element);
|
3285
3476
|
}
|
@@ -3300,7 +3491,7 @@ up.CSSTransition = class CSSTransition {
|
|
3300
3491
|
|
3301
3492
|
|
3302
3493
|
/***/ }),
|
3303
|
-
/*
|
3494
|
+
/* 36 */
|
3304
3495
|
/***/ (() => {
|
3305
3496
|
|
3306
3497
|
const u = up.util;
|
@@ -3311,27 +3502,19 @@ up.DestructorPass = class DestructorPass {
|
|
3311
3502
|
}
|
3312
3503
|
run() {
|
3313
3504
|
for (let cleanable of this._selectCleanables()) {
|
3314
|
-
let
|
3315
|
-
|
3316
|
-
for (let destructor of destructors) {
|
3317
|
-
this._applyDestructorFunction(destructor, cleanable);
|
3318
|
-
}
|
3319
|
-
}
|
3320
|
-
cleanable.classList.remove('up-can-clean');
|
3505
|
+
let registry = u.pluckKey(cleanable, 'upDestructors');
|
3506
|
+
registry?.clean(cleanable);
|
3321
3507
|
}
|
3322
3508
|
}
|
3323
3509
|
_selectCleanables() {
|
3324
3510
|
const selectOptions = { ...this._options, destroying: true };
|
3325
3511
|
return up.fragment.subtree(this._fragment, '.up-can-clean', selectOptions);
|
3326
3512
|
}
|
3327
|
-
_applyDestructorFunction(destructor, element) {
|
3328
|
-
up.error.guard(() => destructor(element));
|
3329
|
-
}
|
3330
3513
|
};
|
3331
3514
|
|
3332
3515
|
|
3333
3516
|
/***/ }),
|
3334
|
-
/*
|
3517
|
+
/* 37 */
|
3335
3518
|
/***/ (() => {
|
3336
3519
|
|
3337
3520
|
const u = up.util;
|
@@ -3393,7 +3576,7 @@ up.EventEmitter = class EventEmitter extends up.Record {
|
|
3393
3576
|
static fromEmitArgs(args, defaults = {}) {
|
3394
3577
|
let options = u.extractOptions(args);
|
3395
3578
|
options = u.merge(defaults, options);
|
3396
|
-
if (u.
|
3579
|
+
if (u.isElementLike(args[0])) {
|
3397
3580
|
options.target = e.get(args.shift());
|
3398
3581
|
}
|
3399
3582
|
else if (args[0] instanceof up.Layer) {
|
@@ -3430,7 +3613,7 @@ up.EventEmitter = class EventEmitter extends up.Record {
|
|
3430
3613
|
|
3431
3614
|
|
3432
3615
|
/***/ }),
|
3433
|
-
/*
|
3616
|
+
/* 38 */
|
3434
3617
|
/***/ (() => {
|
3435
3618
|
|
3436
3619
|
const u = up.util;
|
@@ -3534,7 +3717,7 @@ up.EventListener = class EventListener extends up.Record {
|
|
3534
3717
|
|
3535
3718
|
|
3536
3719
|
/***/ }),
|
3537
|
-
/*
|
3720
|
+
/* 39 */
|
3538
3721
|
/***/ (() => {
|
3539
3722
|
|
3540
3723
|
const u = up.util;
|
@@ -3554,13 +3737,13 @@ up.EventListenerGroup = class EventListenerGroup extends up.Record {
|
|
3554
3737
|
];
|
3555
3738
|
}
|
3556
3739
|
bind() {
|
3557
|
-
const
|
3740
|
+
const cleaner = u.cleaner();
|
3558
3741
|
this._eachListenerAttributes(function (attrs) {
|
3559
3742
|
const listener = new up.EventListener(attrs);
|
3560
3743
|
listener.bind();
|
3561
|
-
return
|
3744
|
+
return cleaner(listener.unbind.bind(listener));
|
3562
3745
|
});
|
3563
|
-
return
|
3746
|
+
return cleaner.clean;
|
3564
3747
|
}
|
3565
3748
|
_eachListenerAttributes(fn) {
|
3566
3749
|
for (let element of this.elements) {
|
@@ -3593,7 +3776,7 @@ up.EventListenerGroup = class EventListenerGroup extends up.Record {
|
|
3593
3776
|
else {
|
3594
3777
|
elements = [document];
|
3595
3778
|
}
|
3596
|
-
let eventTypes = u.
|
3779
|
+
let eventTypes = u.getSimpleTokens(args.shift());
|
3597
3780
|
let fixTypes = up.migrate.fixEventTypes;
|
3598
3781
|
if (fixTypes) {
|
3599
3782
|
eventTypes = fixTypes(eventTypes);
|
@@ -3607,7 +3790,7 @@ up.EventListenerGroup = class EventListenerGroup extends up.Record {
|
|
3607
3790
|
|
3608
3791
|
|
3609
3792
|
/***/ }),
|
3610
|
-
/*
|
3793
|
+
/* 40 */
|
3611
3794
|
/***/ (() => {
|
3612
3795
|
|
3613
3796
|
const u = up.util;
|
@@ -3618,26 +3801,24 @@ up.FieldWatcher = class FieldWatcher {
|
|
3618
3801
|
this._scope = up.form.getScope(root);
|
3619
3802
|
this._callback = callback;
|
3620
3803
|
this._batch = options.batch;
|
3621
|
-
this._abortable = options.abortable;
|
3622
3804
|
}
|
3623
3805
|
start() {
|
3624
3806
|
this._scheduledValues = null;
|
3625
3807
|
this._processedValues = this._readFieldValues();
|
3626
3808
|
this._currentTimer = null;
|
3627
3809
|
this._callbackRunning = false;
|
3628
|
-
this.
|
3810
|
+
this._cleaner = u.cleaner();
|
3629
3811
|
this._watchFieldsWithin(this._root);
|
3630
3812
|
this._root.addEventListener('up:fragment:inserted', ({ target }) => {
|
3631
3813
|
if (target !== this._root)
|
3632
3814
|
this._watchFieldsWithin(target);
|
3633
3815
|
});
|
3634
|
-
this.
|
3635
|
-
this.
|
3816
|
+
this._cleaner(up.fragment.onAborted(this._scope, () => this._abort()));
|
3817
|
+
this._cleaner(up.on(this._scope, 'reset', () => this._onFormReset()));
|
3636
3818
|
}
|
3637
3819
|
stop() {
|
3638
3820
|
this._abort();
|
3639
|
-
|
3640
|
-
unbindFn();
|
3821
|
+
this._cleaner.clean();
|
3641
3822
|
}
|
3642
3823
|
_fieldOptions(field) {
|
3643
3824
|
let rootOptions = u.copy(this._options);
|
@@ -3650,7 +3831,7 @@ up.FieldWatcher = class FieldWatcher {
|
|
3650
3831
|
}
|
3651
3832
|
_watchField(field) {
|
3652
3833
|
let fieldOptions = this._fieldOptions(field);
|
3653
|
-
this.
|
3834
|
+
this._cleaner(up.on(field, fieldOptions.event, () => this._check(fieldOptions)));
|
3654
3835
|
}
|
3655
3836
|
_abort() {
|
3656
3837
|
this._scheduledValues = null;
|
@@ -3677,13 +3858,12 @@ up.FieldWatcher = class FieldWatcher {
|
|
3677
3858
|
return;
|
3678
3859
|
if (!this._scope.isConnected)
|
3679
3860
|
return;
|
3680
|
-
let
|
3861
|
+
let callbackOptions = u.omit(this._scheduledFieldOptions, ['event', 'delay']);
|
3681
3862
|
const diff = this._changedValues(this._processedValues, this._scheduledValues);
|
3682
3863
|
this._processedValues = this._scheduledValues;
|
3683
3864
|
this._scheduledValues = null;
|
3684
3865
|
this._callbackRunning = true;
|
3685
3866
|
this._scheduledFieldOptions = null;
|
3686
|
-
let callbackOptions = { ...fieldOptions, disable: false };
|
3687
3867
|
const callbackReturnValues = [];
|
3688
3868
|
if (this._batch) {
|
3689
3869
|
callbackReturnValues.push(this._runCallback(diff, callbackOptions));
|
@@ -3696,14 +3876,13 @@ up.FieldWatcher = class FieldWatcher {
|
|
3696
3876
|
}
|
3697
3877
|
if (u.some(callbackReturnValues, u.isPromise)) {
|
3698
3878
|
let callbackDone = Promise.allSettled(callbackReturnValues);
|
3699
|
-
up.form.disableWhile(callbackDone, fieldOptions);
|
3700
3879
|
await callbackDone;
|
3701
3880
|
}
|
3702
3881
|
this._callbackRunning = false;
|
3703
3882
|
this._requestCallback();
|
3704
3883
|
}
|
3705
3884
|
_runCallback(...args) {
|
3706
|
-
return up.error.guard(
|
3885
|
+
return up.error.guard(this._callback, ...args);
|
3707
3886
|
}
|
3708
3887
|
_changedValues(previous, next) {
|
3709
3888
|
const changes = {};
|
@@ -3735,7 +3914,7 @@ up.FieldWatcher = class FieldWatcher {
|
|
3735
3914
|
|
3736
3915
|
|
3737
3916
|
/***/ }),
|
3738
|
-
/*
|
3917
|
+
/* 41 */
|
3739
3918
|
/***/ (() => {
|
3740
3919
|
|
3741
3920
|
const u = up.util;
|
@@ -3854,47 +4033,52 @@ up.FormValidator = class FormValidator {
|
|
3854
4033
|
return;
|
3855
4034
|
if (this._nextRenderTimer)
|
3856
4035
|
return;
|
3857
|
-
let
|
4036
|
+
let options = this._mergeRenderOptions(this._dirtySolutions);
|
3858
4037
|
this._dirtySolutions = [];
|
4038
|
+
this._rendering = true;
|
4039
|
+
let renderingPromise = this._nextRenderPromise;
|
4040
|
+
this._resetNextRenderPromise();
|
4041
|
+
try {
|
4042
|
+
renderingPromise.resolve(up.render(options));
|
4043
|
+
await renderingPromise;
|
4044
|
+
}
|
4045
|
+
finally {
|
4046
|
+
this._rendering = false;
|
4047
|
+
this._renderDirtySolutions();
|
4048
|
+
}
|
4049
|
+
}
|
4050
|
+
_mergeRenderOptions(dirtySolutions) {
|
3859
4051
|
let dirtyOrigins = u.map(dirtySolutions, 'origin');
|
3860
4052
|
let dirtyFields = u.flatMap(dirtyOrigins, up.form.fields);
|
3861
4053
|
let dirtyNames = u.uniq(u.map(dirtyFields, 'name'));
|
3862
|
-
let dataMap = this._buildDataMap(dirtySolutions);
|
3863
4054
|
let dirtyRenderOptionsList = u.map(dirtySolutions, 'renderOptions');
|
3864
|
-
let options = u.mergeDefined(...dirtyRenderOptionsList,
|
4055
|
+
let options = u.mergeDefined(...dirtyRenderOptionsList, up.form.destinationOptions(this._form));
|
3865
4056
|
options.target = u.map(dirtySolutions, 'target').join(', ');
|
3866
|
-
options.feedback = u.some(dirtyRenderOptionsList, 'feedback');
|
3867
4057
|
options.origin = this._form;
|
3868
4058
|
options.focus ??= 'keep';
|
3869
4059
|
options.failOptions = false;
|
3870
4060
|
options.defaultMaybe = true;
|
3871
4061
|
options.params = up.Params.merge(options.params, ...u.map(dirtyRenderOptionsList, 'params'));
|
3872
|
-
options.headers = u.merge(...u.map(dirtyRenderOptionsList, 'headers'));
|
4062
|
+
options.headers = u.merge(options.headers, ...u.map(dirtyRenderOptionsList, 'headers'));
|
3873
4063
|
this._addValidateHeader(options.headers, dirtyNames);
|
4064
|
+
options.feedback = u.some(dirtyRenderOptionsList, 'feedback');
|
4065
|
+
options.data = undefined;
|
4066
|
+
options.dataMap = u.mapObject(dirtySolutions, ({ target, element, renderOptions: { data, keepData } }) => [
|
4067
|
+
target,
|
4068
|
+
keepData ? up.data(element) : data
|
4069
|
+
]);
|
4070
|
+
options.preview = undefined;
|
4071
|
+
options.previewMap = u.mapObject(dirtySolutions, ({ target, renderOptions: { preview } }) => [target, preview]);
|
4072
|
+
options.placeholder = undefined;
|
4073
|
+
options.placeholderMap = u.mapObject(dirtySolutions, ({ target, renderOptions: { placeholder } }) => [target, placeholder]);
|
4074
|
+
options.disable = dirtySolutions.map((solution) => up.fragment.resolveOrigin(solution.renderOptions.disable, solution));
|
3874
4075
|
options.guardEvent = up.event.build('up:form:validate', {
|
3875
4076
|
fields: dirtyFields,
|
3876
4077
|
log: 'Validating form',
|
3877
4078
|
params: options.params,
|
3878
4079
|
form: this._form,
|
3879
4080
|
});
|
3880
|
-
|
3881
|
-
let renderingPromise = this._nextRenderPromise;
|
3882
|
-
this._resetNextRenderPromise();
|
3883
|
-
options.disable = false;
|
3884
|
-
for (let solution of dirtySolutions) {
|
3885
|
-
up.form.disableWhile(renderingPromise, {
|
3886
|
-
disable: solution.renderOptions.disable,
|
3887
|
-
origin: solution.origin,
|
3888
|
-
});
|
3889
|
-
}
|
3890
|
-
try {
|
3891
|
-
renderingPromise.resolve(up.render(options));
|
3892
|
-
await renderingPromise;
|
3893
|
-
}
|
3894
|
-
finally {
|
3895
|
-
this._rendering = false;
|
3896
|
-
this._renderDirtySolutions();
|
3897
|
-
}
|
4081
|
+
return options;
|
3898
4082
|
}
|
3899
4083
|
_addValidateHeader(headers, names) {
|
3900
4084
|
let key = up.protocol.headerize('validate');
|
@@ -3903,20 +4087,6 @@ up.FormValidator = class FormValidator {
|
|
3903
4087
|
value = ':unknown';
|
3904
4088
|
headers[key] = value;
|
3905
4089
|
}
|
3906
|
-
_buildDataMap(solutions) {
|
3907
|
-
let dataMap = {};
|
3908
|
-
for (let solution of solutions) {
|
3909
|
-
let data = u.pluckKey(solution.renderOptions, 'data');
|
3910
|
-
let keepData = u.pluckKey(solution.renderOptions, 'keepData');
|
3911
|
-
if (keepData) {
|
3912
|
-
data = up.data(solution.element);
|
3913
|
-
}
|
3914
|
-
if (data) {
|
3915
|
-
dataMap[solution.target] = data;
|
3916
|
-
}
|
3917
|
-
}
|
3918
|
-
return dataMap;
|
3919
|
-
}
|
3920
4090
|
static forElement(element) {
|
3921
4091
|
let form = up.form.get(element);
|
3922
4092
|
return form.upFormValidator ||= new this(form);
|
@@ -3925,19 +4095,23 @@ up.FormValidator = class FormValidator {
|
|
3925
4095
|
|
3926
4096
|
|
3927
4097
|
/***/ }),
|
3928
|
-
/*
|
4098
|
+
/* 42 */
|
3929
4099
|
/***/ (() => {
|
3930
4100
|
|
3931
4101
|
up.FocusCapsule = class FocusCapsule {
|
3932
|
-
constructor(target, cursorProps) {
|
4102
|
+
constructor(element, target, cursorProps) {
|
4103
|
+
this._element = element;
|
3933
4104
|
this._target = target;
|
3934
4105
|
this._cursorProps = cursorProps;
|
3935
4106
|
}
|
3936
|
-
|
4107
|
+
wasLost() {
|
4108
|
+
return document.activeElement !== this._element;
|
4109
|
+
}
|
4110
|
+
restore(layer, focusOptions) {
|
3937
4111
|
let rediscoveredElement = up.fragment.get(this._target, { layer });
|
3938
4112
|
if (rediscoveredElement) {
|
3939
4113
|
up.viewport.copyCursorProps(this._cursorProps, rediscoveredElement);
|
3940
|
-
up.focus(rediscoveredElement,
|
4114
|
+
up.focus(rediscoveredElement, focusOptions);
|
3941
4115
|
return true;
|
3942
4116
|
}
|
3943
4117
|
}
|
@@ -3949,13 +4123,13 @@ up.FocusCapsule = class FocusCapsule {
|
|
3949
4123
|
if (!target)
|
3950
4124
|
return;
|
3951
4125
|
const cursorProps = up.viewport.copyCursorProps(focusedElement);
|
3952
|
-
return new this(target, cursorProps);
|
4126
|
+
return new this(focusedElement, target, cursorProps);
|
3953
4127
|
}
|
3954
4128
|
};
|
3955
4129
|
|
3956
4130
|
|
3957
4131
|
/***/ }),
|
3958
|
-
/*
|
4132
|
+
/* 43 */
|
3959
4133
|
/***/ (() => {
|
3960
4134
|
|
3961
4135
|
const u = up.util;
|
@@ -3973,14 +4147,14 @@ up.FragmentProcessor = class FragmentProcessor extends up.Record {
|
|
3973
4147
|
return this.tryProcess(preprocessed);
|
3974
4148
|
}
|
3975
4149
|
preprocess(opt) {
|
3976
|
-
return u.
|
4150
|
+
return u.getComplexTokens(opt);
|
3977
4151
|
}
|
3978
4152
|
tryProcess(opt) {
|
3979
4153
|
if (u.isArray(opt)) {
|
3980
4154
|
return this.processArray(opt);
|
3981
4155
|
}
|
3982
4156
|
if (u.isFunction(opt)) {
|
3983
|
-
let result = up.error.guard(
|
4157
|
+
let result = up.error.guard(opt, this.fragment, this.attributes());
|
3984
4158
|
return this.tryProcess(result);
|
3985
4159
|
}
|
3986
4160
|
if (u.isElement(opt)) {
|
@@ -4020,7 +4194,7 @@ up.FragmentProcessor = class FragmentProcessor extends up.Record {
|
|
4020
4194
|
|
4021
4195
|
|
4022
4196
|
/***/ }),
|
4023
|
-
/*
|
4197
|
+
/* 44 */
|
4024
4198
|
/***/ (() => {
|
4025
4199
|
|
4026
4200
|
const u = up.util;
|
@@ -4057,19 +4231,19 @@ up.FragmentFinder = class FragmentFinder {
|
|
4057
4231
|
if (parts) {
|
4058
4232
|
let parent = up.fragment.closest(this._origin, parts[1], this._options);
|
4059
4233
|
if (parent) {
|
4060
|
-
return up.fragment.
|
4234
|
+
return up.fragment.getFirstDescendant(parent, parts[2]);
|
4061
4235
|
}
|
4062
4236
|
}
|
4063
4237
|
});
|
4064
4238
|
}
|
4065
4239
|
_findFirst() {
|
4066
|
-
return up.fragment.
|
4240
|
+
return up.fragment.getFirstDescendant(this._document, this._selector, this._options);
|
4067
4241
|
}
|
4068
4242
|
};
|
4069
4243
|
|
4070
4244
|
|
4071
4245
|
/***/ }),
|
4072
|
-
/*
|
4246
|
+
/* 45 */
|
4073
4247
|
/***/ (() => {
|
4074
4248
|
|
4075
4249
|
const u = up.util;
|
@@ -4130,7 +4304,7 @@ up.FragmentFocus = class FragmentFocus extends up.FragmentProcessor {
|
|
4130
4304
|
return up.viewport.restoreFocus({ layer: this.layer });
|
4131
4305
|
}
|
4132
4306
|
_autofocus() {
|
4133
|
-
let autofocusElement = this.fragment && e.
|
4307
|
+
let autofocusElement = this.fragment && e.subtreeFirst(this.fragment, '[autofocus]');
|
4134
4308
|
if (autofocusElement) {
|
4135
4309
|
return this._focusElement(autofocusElement);
|
4136
4310
|
}
|
@@ -4148,13 +4322,13 @@ up.FragmentFocus = class FragmentFocus extends up.FragmentProcessor {
|
|
4148
4322
|
}
|
4149
4323
|
}
|
4150
4324
|
_wasFocusLost() {
|
4151
|
-
return
|
4325
|
+
return this.focusCapsule?.wasLost();
|
4152
4326
|
}
|
4153
4327
|
};
|
4154
4328
|
|
4155
4329
|
|
4156
4330
|
/***/ }),
|
4157
|
-
/*
|
4331
|
+
/* 46 */
|
4158
4332
|
/***/ (() => {
|
4159
4333
|
|
4160
4334
|
const e = up.element;
|
@@ -4223,17 +4397,17 @@ up.FragmentPolling = class FragmentPolling {
|
|
4223
4397
|
(this._options.ifLayer === 'any' || this._isOnFrontLayer());
|
4224
4398
|
}
|
4225
4399
|
_clearReloadTimer() {
|
4226
|
-
clearTimeout(this.
|
4227
|
-
this.
|
4400
|
+
clearTimeout(this._reloadTimer);
|
4401
|
+
this._reloadTimer = null;
|
4228
4402
|
}
|
4229
4403
|
_scheduleRemainingTime() {
|
4230
|
-
if (!this.
|
4404
|
+
if (!this._reloadTimer && !this._loading) {
|
4231
4405
|
this._clearReloadTimer();
|
4232
|
-
this.
|
4406
|
+
this._reloadTimer = setTimeout(this._onTimerReached.bind(this), this._getRemainingDelay());
|
4233
4407
|
}
|
4234
4408
|
}
|
4235
4409
|
_onTimerReached() {
|
4236
|
-
this.
|
4410
|
+
this._reloadTimer = null;
|
4237
4411
|
this._tryReload();
|
4238
4412
|
}
|
4239
4413
|
_tryReload() {
|
@@ -4309,7 +4483,7 @@ up.FragmentPolling = class FragmentPolling {
|
|
4309
4483
|
|
4310
4484
|
|
4311
4485
|
/***/ }),
|
4312
|
-
/*
|
4486
|
+
/* 47 */
|
4313
4487
|
/***/ (() => {
|
4314
4488
|
|
4315
4489
|
const u = up.util;
|
@@ -4373,7 +4547,7 @@ up.FragmentScrolling = class FragmentScrolling extends up.FragmentProcessor {
|
|
4373
4547
|
|
4374
4548
|
|
4375
4549
|
/***/ }),
|
4376
|
-
/*
|
4550
|
+
/* 48 */
|
4377
4551
|
/***/ (() => {
|
4378
4552
|
|
4379
4553
|
const e = up.element;
|
@@ -4639,285 +4813,294 @@ up.Layer = class Layer extends up.Record {
|
|
4639
4813
|
|
4640
4814
|
|
4641
4815
|
/***/ }),
|
4642
|
-
/*
|
4816
|
+
/* 49 */
|
4643
4817
|
/***/ (() => {
|
4644
4818
|
|
4819
|
+
var _a;
|
4645
4820
|
const e = up.element;
|
4646
4821
|
const u = up.util;
|
4647
|
-
up.Layer.Overlay = class Overlay extends up.Layer {
|
4648
|
-
|
4649
|
-
|
4650
|
-
|
4651
|
-
|
4652
|
-
|
4653
|
-
|
4654
|
-
|
4655
|
-
|
4656
|
-
|
4657
|
-
|
4658
|
-
|
4659
|
-
|
4660
|
-
|
4661
|
-
|
4662
|
-
|
4663
|
-
'backdropCloseAnimation',
|
4664
|
-
'dismissable',
|
4665
|
-
'dismissLabel',
|
4666
|
-
'dismissAriaLabel',
|
4667
|
-
'trapFocus',
|
4668
|
-
'onOpened',
|
4669
|
-
'onAccept',
|
4670
|
-
'onAccepted',
|
4671
|
-
'onDismiss',
|
4672
|
-
'onDismissed',
|
4673
|
-
'acceptEvent',
|
4674
|
-
'dismissEvent',
|
4675
|
-
'acceptLocation',
|
4676
|
-
'dismissLocation',
|
4677
|
-
'opening'
|
4678
|
-
]);
|
4679
|
-
}
|
4680
|
-
constructor(options) {
|
4681
|
-
super(options);
|
4682
|
-
if (this.dismissable === true) {
|
4683
|
-
this.dismissable = ['button', 'key', 'outside'];
|
4822
|
+
up.Layer.Overlay = (_a = class Overlay extends up.Layer {
|
4823
|
+
keys() {
|
4824
|
+
return [
|
4825
|
+
...super.keys(),
|
4826
|
+
...this.constructor.VISUAL_KEYS,
|
4827
|
+
'onOpened',
|
4828
|
+
'onAccept',
|
4829
|
+
'onAccepted',
|
4830
|
+
'onDismiss',
|
4831
|
+
'onDismissed',
|
4832
|
+
'acceptEvent',
|
4833
|
+
'dismissEvent',
|
4834
|
+
'acceptLocation',
|
4835
|
+
'dismissLocation',
|
4836
|
+
'opening'
|
4837
|
+
];
|
4684
4838
|
}
|
4685
|
-
|
4686
|
-
|
4839
|
+
constructor(options) {
|
4840
|
+
super(options);
|
4841
|
+
if (this.dismissable === true) {
|
4842
|
+
this.dismissable = ['button', 'key', 'outside'];
|
4843
|
+
}
|
4844
|
+
else if (this.dismissable === false) {
|
4845
|
+
this.dismissable = [];
|
4846
|
+
}
|
4847
|
+
else {
|
4848
|
+
this.dismissable = u.getSimpleTokens(this.dismissable);
|
4849
|
+
}
|
4850
|
+
if (this.acceptLocation) {
|
4851
|
+
this.acceptLocation = new up.URLPattern(this.acceptLocation);
|
4852
|
+
}
|
4853
|
+
if (this.dismissLocation) {
|
4854
|
+
this.dismissLocation = new up.URLPattern(this.dismissLocation);
|
4855
|
+
}
|
4687
4856
|
}
|
4688
|
-
|
4689
|
-
|
4857
|
+
callback(name) {
|
4858
|
+
let fn = this[name];
|
4859
|
+
if (fn) {
|
4860
|
+
return fn.bind(this);
|
4861
|
+
}
|
4690
4862
|
}
|
4691
|
-
|
4692
|
-
this.
|
4863
|
+
createElement(parentElement) {
|
4864
|
+
this.nesting ||= this._suggestVisualNesting();
|
4865
|
+
const elementAttrs = u.compactObject(u.pick(this, ['align', 'position', 'size', 'class', 'nesting']));
|
4866
|
+
this.element = this.affixPart(parentElement, null, elementAttrs);
|
4693
4867
|
}
|
4694
|
-
|
4695
|
-
this.
|
4868
|
+
createBackdropElement(parentElement) {
|
4869
|
+
this.backdropElement = this.affixPart(parentElement, 'backdrop');
|
4696
4870
|
}
|
4697
|
-
|
4698
|
-
|
4699
|
-
let fn = this[name];
|
4700
|
-
if (fn) {
|
4701
|
-
return fn.bind(this);
|
4871
|
+
createViewportElement(parentElement) {
|
4872
|
+
this.viewportElement = this.affixPart(parentElement, 'viewport', { 'up-viewport': '' });
|
4702
4873
|
}
|
4703
|
-
|
4704
|
-
|
4705
|
-
this.nesting ||= this._suggestVisualNesting();
|
4706
|
-
const elementAttrs = u.compactObject(u.pick(this, ['align', 'position', 'size', 'class', 'nesting']));
|
4707
|
-
this.element = this.affixPart(parentElement, null, elementAttrs);
|
4708
|
-
}
|
4709
|
-
createBackdropElement(parentElement) {
|
4710
|
-
this.backdropElement = this.affixPart(parentElement, 'backdrop');
|
4711
|
-
}
|
4712
|
-
createViewportElement(parentElement) {
|
4713
|
-
this.viewportElement = this.affixPart(parentElement, 'viewport', { 'up-viewport': '' });
|
4714
|
-
}
|
4715
|
-
createBoxElement(parentElement) {
|
4716
|
-
this.boxElement = this.affixPart(parentElement, 'box');
|
4717
|
-
}
|
4718
|
-
createContentElement(parentElement) {
|
4719
|
-
this.contentElement = this.affixPart(parentElement, 'content');
|
4720
|
-
}
|
4721
|
-
setContent(content) {
|
4722
|
-
this.contentElement.append(content);
|
4723
|
-
this.onContentSet();
|
4724
|
-
}
|
4725
|
-
onContentSet() {
|
4726
|
-
}
|
4727
|
-
createDismissElement(parentElement) {
|
4728
|
-
this.dismissElement = this.affixPart(parentElement, 'dismiss', {
|
4729
|
-
'up-dismiss': '":button"',
|
4730
|
-
'aria-label': this.dismissAriaLabel
|
4731
|
-
});
|
4732
|
-
return e.affix(this.dismissElement, 'span[aria-hidden="true"]', { text: this.dismissLabel });
|
4733
|
-
}
|
4734
|
-
affixPart(parentElement, part, options = {}) {
|
4735
|
-
return e.affix(parentElement, this.selector(part), options);
|
4736
|
-
}
|
4737
|
-
static selector(part) {
|
4738
|
-
return u.compact(['up', this.mode, part]).join('-');
|
4739
|
-
}
|
4740
|
-
_suggestVisualNesting() {
|
4741
|
-
const { parent } = this;
|
4742
|
-
if (this.mode === parent.mode) {
|
4743
|
-
return 1 + parent._suggestVisualNesting();
|
4874
|
+
createBoxElement(parentElement) {
|
4875
|
+
this.boxElement = this.affixPart(parentElement, 'box');
|
4744
4876
|
}
|
4745
|
-
|
4746
|
-
|
4877
|
+
createContentElement(parentElement) {
|
4878
|
+
this.contentElement = this.affixPart(parentElement, 'content');
|
4747
4879
|
}
|
4748
|
-
|
4749
|
-
|
4750
|
-
|
4751
|
-
|
4752
|
-
|
4753
|
-
|
4754
|
-
|
4755
|
-
|
4756
|
-
|
4757
|
-
|
4758
|
-
|
4759
|
-
|
4760
|
-
|
4761
|
-
|
4880
|
+
setContent(content) {
|
4881
|
+
this.contentElement.append(content);
|
4882
|
+
this.onContentSet();
|
4883
|
+
}
|
4884
|
+
onContentSet() {
|
4885
|
+
}
|
4886
|
+
createDismissElement(parentElement) {
|
4887
|
+
this.dismissElement = this.affixPart(parentElement, 'dismiss', {
|
4888
|
+
'up-dismiss': '":button"',
|
4889
|
+
'aria-label': this.dismissARIALabel
|
4890
|
+
});
|
4891
|
+
return e.affix(this.dismissElement, 'span[aria-hidden="true"]', { text: this.dismissLabel });
|
4892
|
+
}
|
4893
|
+
affixPart(parentElement, part, options = {}) {
|
4894
|
+
return e.affix(parentElement, this.selector(part), options);
|
4895
|
+
}
|
4896
|
+
static selector(part) {
|
4897
|
+
return u.compact(['up', this.mode, part]).join('-');
|
4898
|
+
}
|
4899
|
+
_suggestVisualNesting() {
|
4900
|
+
const { parent } = this;
|
4901
|
+
if (this.mode === parent.mode) {
|
4902
|
+
return 1 + parent._suggestVisualNesting();
|
4762
4903
|
}
|
4763
4904
|
else {
|
4764
|
-
|
4765
|
-
if (!up.layer.isWithinForeignOverlay(element)) {
|
4766
|
-
const originClicked = this.origin && this.origin.contains(element);
|
4767
|
-
this._onOutsideClicked(event, originClicked);
|
4768
|
-
}
|
4769
|
-
});
|
4905
|
+
return 0;
|
4770
4906
|
}
|
4771
4907
|
}
|
4772
|
-
|
4773
|
-
|
4908
|
+
setupHandlers() {
|
4909
|
+
super.setupHandlers();
|
4910
|
+
this.overlayFocus = new up.OverlayFocus(this);
|
4911
|
+
if (this._supportsDismissMethod('button')) {
|
4912
|
+
this.createDismissElement(this.getBoxElement());
|
4913
|
+
}
|
4914
|
+
if (this._supportsDismissMethod('outside')) {
|
4915
|
+
if (this.viewportElement) {
|
4916
|
+
up.on(this.viewportElement, 'up:click', event => {
|
4917
|
+
if (event.target === this.viewportElement) {
|
4918
|
+
this._onOutsideClicked(event, true);
|
4919
|
+
}
|
4920
|
+
});
|
4921
|
+
}
|
4922
|
+
else {
|
4923
|
+
this.unbindParentClicked = this.parent.on('up:click', (event, element) => {
|
4924
|
+
if (!up.layer.isWithinForeignOverlay(element)) {
|
4925
|
+
const originClicked = this.origin && this.origin.contains(element);
|
4926
|
+
this._onOutsideClicked(event, originClicked);
|
4927
|
+
}
|
4928
|
+
});
|
4929
|
+
}
|
4930
|
+
}
|
4931
|
+
if (this._supportsDismissMethod('key')) {
|
4932
|
+
this.unbindEscapePressed = up.event.onEscape(event => this.onEscapePressed(event));
|
4933
|
+
}
|
4934
|
+
this.registerClickCloser('up-accept', (value, closeOptions) => {
|
4935
|
+
this.accept(value, closeOptions);
|
4936
|
+
});
|
4937
|
+
this.registerClickCloser('up-dismiss', (value, closeOptions) => {
|
4938
|
+
this.dismiss(value, closeOptions);
|
4939
|
+
});
|
4940
|
+
up.migrate.registerLayerCloser?.(this);
|
4941
|
+
this._registerEventCloser(this.acceptEvent, this.accept);
|
4942
|
+
this._registerEventCloser(this.dismissEvent, this.dismiss);
|
4943
|
+
this.on('up:click', 'label[for]', (event, label) => this._onLabelClicked(event, label));
|
4944
|
+
}
|
4945
|
+
_onLabelClicked(event, label) {
|
4946
|
+
let id = label.getAttribute('for');
|
4947
|
+
let fieldSelector = up.form.fieldSelector(e.idSelector(id));
|
4948
|
+
let fieldsAnywhere = up.fragment.all(fieldSelector, { layer: 'any' });
|
4949
|
+
let fieldsInLayer = up.fragment.all(fieldSelector, { layer: this });
|
4950
|
+
if (fieldsAnywhere.length > 1 && fieldsInLayer[0] !== fieldsAnywhere[0]) {
|
4951
|
+
event.preventDefault();
|
4952
|
+
const field = fieldsInLayer[0];
|
4953
|
+
field.focus();
|
4954
|
+
if (field.matches('input[type=checkbox], input[type=radio]')) {
|
4955
|
+
field.click();
|
4956
|
+
}
|
4957
|
+
}
|
4774
4958
|
}
|
4775
|
-
|
4776
|
-
|
4777
|
-
|
4778
|
-
|
4779
|
-
this.dismiss(
|
4780
|
-
}
|
4781
|
-
|
4782
|
-
|
4783
|
-
|
4784
|
-
|
4785
|
-
|
4786
|
-
|
4787
|
-
|
4788
|
-
|
4789
|
-
|
4790
|
-
|
4791
|
-
if (fieldsAnywhere.length > 1 && fieldsInLayer[0] !== fieldsAnywhere[0]) {
|
4792
|
-
event.preventDefault();
|
4793
|
-
const field = fieldsInLayer[0];
|
4794
|
-
field.focus();
|
4795
|
-
if (field.matches('input[type=checkbox], input[type=radio]')) {
|
4796
|
-
field.click();
|
4797
|
-
}
|
4798
|
-
}
|
4799
|
-
}
|
4800
|
-
_onOutsideClicked(event, halt) {
|
4801
|
-
up.log.putsEvent(event);
|
4802
|
-
if (halt)
|
4803
|
-
up.event.halt(event);
|
4804
|
-
up.error.muteUncriticalSync(() => this.dismiss(':outside', { origin: event.target }));
|
4805
|
-
}
|
4806
|
-
onEscapePressed(event) {
|
4807
|
-
if (this.isFront()) {
|
4808
|
-
let field = up.form.focusedField();
|
4809
|
-
if (field) {
|
4810
|
-
field.blur();
|
4959
|
+
_onOutsideClicked(event, halt) {
|
4960
|
+
up.log.putsEvent(event);
|
4961
|
+
if (halt)
|
4962
|
+
up.event.halt(event);
|
4963
|
+
up.error.muteUncriticalSync(() => this.dismiss(':outside', { origin: event.target }));
|
4964
|
+
}
|
4965
|
+
onEscapePressed(event) {
|
4966
|
+
if (this.isFront()) {
|
4967
|
+
let field = up.form.focusedField();
|
4968
|
+
if (field) {
|
4969
|
+
field.blur();
|
4970
|
+
}
|
4971
|
+
else if (this._supportsDismissMethod('key')) {
|
4972
|
+
up.event.halt(event, { log: true });
|
4973
|
+
up.error.muteUncriticalSync(() => this.dismiss(':key'));
|
4974
|
+
}
|
4811
4975
|
}
|
4812
|
-
|
4976
|
+
}
|
4977
|
+
registerClickCloser(attribute, closeFn) {
|
4978
|
+
let selector = `[${attribute}]`;
|
4979
|
+
this.on('up:click', selector, function (event) {
|
4813
4980
|
up.event.halt(event, { log: true });
|
4814
|
-
|
4981
|
+
const origin = event.target.closest(selector);
|
4982
|
+
const value = e.jsonAttr(origin, attribute);
|
4983
|
+
const closeOptions = { origin };
|
4984
|
+
const parser = new up.OptionsParser(origin, closeOptions);
|
4985
|
+
parser.booleanOrString('animation');
|
4986
|
+
parser.string('easing');
|
4987
|
+
parser.number('duration');
|
4988
|
+
parser.string('confirm');
|
4989
|
+
up.error.muteUncriticalSync(() => closeFn(value, closeOptions));
|
4990
|
+
});
|
4991
|
+
}
|
4992
|
+
_registerEventCloser(eventTypes, closeFn) {
|
4993
|
+
if (!eventTypes) {
|
4994
|
+
return;
|
4815
4995
|
}
|
4996
|
+
return this.on(eventTypes, event => {
|
4997
|
+
event.preventDefault();
|
4998
|
+
up.error.muteUncriticalSync(() => closeFn.call(this, event, { response: event.response }));
|
4999
|
+
});
|
4816
5000
|
}
|
4817
|
-
|
4818
|
-
|
4819
|
-
let selector = `[${attribute}]`;
|
4820
|
-
this.on('up:click', selector, function (event) {
|
4821
|
-
up.event.halt(event, { log: true });
|
4822
|
-
const origin = event.target.closest(selector);
|
4823
|
-
const value = e.jsonAttr(origin, attribute);
|
4824
|
-
const closeOptions = { origin };
|
4825
|
-
const parser = new up.OptionsParser(origin, closeOptions);
|
4826
|
-
parser.booleanOrString('animation');
|
4827
|
-
parser.string('easing');
|
4828
|
-
parser.number('duration');
|
4829
|
-
parser.string('confirm');
|
4830
|
-
up.error.muteUncriticalSync(() => closeFn(value, closeOptions));
|
4831
|
-
});
|
4832
|
-
}
|
4833
|
-
_registerEventCloser(eventTypes, closeFn) {
|
4834
|
-
if (!eventTypes) {
|
4835
|
-
return;
|
5001
|
+
tryAcceptForLocation(options) {
|
5002
|
+
this._tryCloseForLocation(this.acceptLocation, this.accept, options);
|
4836
5003
|
}
|
4837
|
-
|
4838
|
-
|
4839
|
-
up.error.muteUncriticalSync(() => closeFn.call(this, event, { response: event.response }));
|
4840
|
-
});
|
4841
|
-
}
|
4842
|
-
tryAcceptForLocation(options) {
|
4843
|
-
this._tryCloseForLocation(this.acceptLocation, this.accept, options);
|
4844
|
-
}
|
4845
|
-
tryDismissForLocation(options) {
|
4846
|
-
this._tryCloseForLocation(this.dismissLocation, this.dismiss, options);
|
4847
|
-
}
|
4848
|
-
_tryCloseForLocation(urlPattern, closeFn, options) {
|
4849
|
-
let location, resolution;
|
4850
|
-
if (urlPattern && (location = this.location) && (resolution = urlPattern.recognize(location))) {
|
4851
|
-
const closeValue = { ...resolution, location };
|
4852
|
-
up.error.muteUncriticalSync(() => closeFn.call(this, closeValue, options));
|
5004
|
+
tryDismissForLocation(options) {
|
5005
|
+
this._tryCloseForLocation(this.dismissLocation, this.dismiss, options);
|
4853
5006
|
}
|
4854
|
-
|
4855
|
-
|
4856
|
-
|
4857
|
-
|
4858
|
-
|
4859
|
-
|
4860
|
-
}
|
4861
|
-
destroyElements(options) {
|
4862
|
-
const animation = () => this.startCloseAnimation(options);
|
4863
|
-
const onFinished = () => {
|
4864
|
-
this.onElementsRemoved();
|
4865
|
-
options.onFinished?.();
|
4866
|
-
};
|
4867
|
-
const destroyOptions = { ...options, animation, onFinished, log: false };
|
4868
|
-
up.destroy(this.element, destroyOptions);
|
4869
|
-
}
|
4870
|
-
onElementsRemoved() {
|
4871
|
-
}
|
4872
|
-
_startAnimation(options = {}) {
|
4873
|
-
const boxDone = up.animate(this.getBoxElement(), options.boxAnimation, options);
|
4874
|
-
let backdropDone;
|
4875
|
-
if (this.backdrop && !up.motion.isNone(options.boxAnimation)) {
|
4876
|
-
backdropDone = up.animate(this.backdropElement, options.backdropAnimation, options);
|
5007
|
+
_tryCloseForLocation(urlPattern, closeFn, options) {
|
5008
|
+
let location, resolution;
|
5009
|
+
if (urlPattern && (location = this.location) && (resolution = urlPattern.recognize(location))) {
|
5010
|
+
const closeValue = { ...resolution, location };
|
5011
|
+
up.error.muteUncriticalSync(() => closeFn.call(this, closeValue, options));
|
5012
|
+
}
|
4877
5013
|
}
|
4878
|
-
|
4879
|
-
|
4880
|
-
|
4881
|
-
|
4882
|
-
|
4883
|
-
|
4884
|
-
|
4885
|
-
|
4886
|
-
|
4887
|
-
|
4888
|
-
|
4889
|
-
|
4890
|
-
|
4891
|
-
|
4892
|
-
|
4893
|
-
|
4894
|
-
|
4895
|
-
})
|
4896
|
-
|
4897
|
-
|
4898
|
-
|
4899
|
-
|
4900
|
-
|
4901
|
-
|
4902
|
-
|
4903
|
-
|
4904
|
-
|
4905
|
-
|
4906
|
-
|
4907
|
-
|
4908
|
-
|
4909
|
-
|
4910
|
-
|
4911
|
-
|
4912
|
-
|
4913
|
-
|
4914
|
-
|
4915
|
-
|
4916
|
-
|
5014
|
+
teardownHandlers() {
|
5015
|
+
super.teardownHandlers();
|
5016
|
+
this.unbindParentClicked?.();
|
5017
|
+
this.unbindEscapePressed?.();
|
5018
|
+
this.overlayFocus.teardown();
|
5019
|
+
}
|
5020
|
+
destroyElements(options) {
|
5021
|
+
const animation = () => this.startCloseAnimation(options);
|
5022
|
+
const onFinished = () => {
|
5023
|
+
this.onElementsRemoved();
|
5024
|
+
options.onFinished?.();
|
5025
|
+
};
|
5026
|
+
const destroyOptions = { ...options, animation, onFinished, log: false };
|
5027
|
+
up.destroy(this.element, destroyOptions);
|
5028
|
+
}
|
5029
|
+
onElementsRemoved() {
|
5030
|
+
}
|
5031
|
+
_startAnimation(options = {}) {
|
5032
|
+
const boxDone = up.animate(this.getBoxElement(), options.boxAnimation, options);
|
5033
|
+
let backdropDone;
|
5034
|
+
if (this.backdrop && !up.motion.isNone(options.boxAnimation)) {
|
5035
|
+
backdropDone = up.animate(this.backdropElement, options.backdropAnimation, options);
|
5036
|
+
}
|
5037
|
+
return Promise.all([boxDone, backdropDone]);
|
5038
|
+
}
|
5039
|
+
async startOpenAnimation(options = {}) {
|
5040
|
+
let boxAnimation = options.animation ?? this.evalOption(this.openAnimation);
|
5041
|
+
let backdropAnimation = 'fade-in';
|
5042
|
+
await this._startAnimation({
|
5043
|
+
boxAnimation,
|
5044
|
+
backdropAnimation,
|
5045
|
+
easing: options.easing || this.openEasing,
|
5046
|
+
duration: options.duration || this.openDuration
|
5047
|
+
});
|
5048
|
+
this.wasEverVisible = true;
|
5049
|
+
}
|
5050
|
+
startCloseAnimation(options = {}) {
|
5051
|
+
let boxAnimation = this.wasEverVisible && (options.animation ?? this.evalOption(this.closeAnimation));
|
5052
|
+
let backdropAnimation = 'fade-out';
|
5053
|
+
return this._startAnimation({
|
5054
|
+
boxAnimation,
|
5055
|
+
backdropAnimation,
|
5056
|
+
easing: options.easing || this.closeEasing,
|
5057
|
+
duration: options.duration || this.closeDuration
|
5058
|
+
});
|
5059
|
+
}
|
5060
|
+
accept(value = null, options = {}) {
|
5061
|
+
return this._executeCloseChange('accept', value, options);
|
5062
|
+
}
|
5063
|
+
dismiss(value = null, options = {}) {
|
5064
|
+
return this._executeCloseChange('dismiss', value, options);
|
5065
|
+
}
|
5066
|
+
_supportsDismissMethod(method) {
|
5067
|
+
return u.contains(this.dismissable, method);
|
5068
|
+
}
|
5069
|
+
_executeCloseChange(verb, value, options) {
|
5070
|
+
options = { ...options, verb, value, layer: this };
|
5071
|
+
return new up.Change.CloseLayer(options).execute();
|
5072
|
+
}
|
5073
|
+
getFirstSwappableElement() {
|
5074
|
+
return this.getContentElement().children[0];
|
5075
|
+
}
|
5076
|
+
toString() {
|
5077
|
+
return `${this.mode} overlay`;
|
5078
|
+
}
|
5079
|
+
},
|
5080
|
+
_a.VISUAL_KEYS = [
|
5081
|
+
'mode',
|
5082
|
+
'position',
|
5083
|
+
'align',
|
5084
|
+
'size',
|
5085
|
+
'origin',
|
5086
|
+
'class',
|
5087
|
+
'backdrop',
|
5088
|
+
'dismissable',
|
5089
|
+
'dismissLabel',
|
5090
|
+
'dismissARIALabel',
|
5091
|
+
'openAnimation',
|
5092
|
+
'closeAnimation',
|
5093
|
+
'openDuration',
|
5094
|
+
'closeDuration',
|
5095
|
+
'openEasing',
|
5096
|
+
'closeEasing',
|
5097
|
+
'trapFocus',
|
5098
|
+
],
|
5099
|
+
_a);
|
4917
5100
|
|
4918
5101
|
|
4919
5102
|
/***/ }),
|
4920
|
-
/*
|
5103
|
+
/* 50 */
|
4921
5104
|
/***/ (() => {
|
4922
5105
|
|
4923
5106
|
up.Layer.OverlayWithTether = class OverlayWithTether extends up.Layer.Overlay {
|
@@ -4956,7 +5139,7 @@ up.Layer.OverlayWithTether = class OverlayWithTether extends up.Layer.Overlay {
|
|
4956
5139
|
|
4957
5140
|
|
4958
5141
|
/***/ }),
|
4959
|
-
/*
|
5142
|
+
/* 51 */
|
4960
5143
|
/***/ (() => {
|
4961
5144
|
|
4962
5145
|
up.Layer.OverlayWithViewport = class OverlayWithViewport extends up.Layer.Overlay {
|
@@ -4985,7 +5168,7 @@ up.Layer.OverlayWithViewport = class OverlayWithViewport extends up.Layer.Overla
|
|
4985
5168
|
|
4986
5169
|
|
4987
5170
|
/***/ }),
|
4988
|
-
/*
|
5171
|
+
/* 52 */
|
4989
5172
|
/***/ (() => {
|
4990
5173
|
|
4991
5174
|
var _a;
|
@@ -5031,7 +5214,7 @@ up.Layer.Root = (_a = class Root extends up.Layer {
|
|
5031
5214
|
|
5032
5215
|
|
5033
5216
|
/***/ }),
|
5034
|
-
/*
|
5217
|
+
/* 53 */
|
5035
5218
|
/***/ (() => {
|
5036
5219
|
|
5037
5220
|
var _a;
|
@@ -5042,7 +5225,7 @@ up.Layer.Modal = (_a = class Modal extends up.Layer.OverlayWithViewport {
|
|
5042
5225
|
|
5043
5226
|
|
5044
5227
|
/***/ }),
|
5045
|
-
/*
|
5228
|
+
/* 54 */
|
5046
5229
|
/***/ (() => {
|
5047
5230
|
|
5048
5231
|
var _a;
|
@@ -5053,7 +5236,7 @@ up.Layer.Popup = (_a = class Popup extends up.Layer.OverlayWithTether {
|
|
5053
5236
|
|
5054
5237
|
|
5055
5238
|
/***/ }),
|
5056
|
-
/*
|
5239
|
+
/* 55 */
|
5057
5240
|
/***/ (() => {
|
5058
5241
|
|
5059
5242
|
var _a;
|
@@ -5064,7 +5247,7 @@ up.Layer.Drawer = (_a = class Drawer extends up.Layer.OverlayWithViewport {
|
|
5064
5247
|
|
5065
5248
|
|
5066
5249
|
/***/ }),
|
5067
|
-
/*
|
5250
|
+
/* 56 */
|
5068
5251
|
/***/ (() => {
|
5069
5252
|
|
5070
5253
|
var _a;
|
@@ -5075,7 +5258,7 @@ up.Layer.Cover = (_a = class Cover extends up.Layer.OverlayWithViewport {
|
|
5075
5258
|
|
5076
5259
|
|
5077
5260
|
/***/ }),
|
5078
|
-
/*
|
5261
|
+
/* 57 */
|
5079
5262
|
/***/ (() => {
|
5080
5263
|
|
5081
5264
|
var _a;
|
@@ -5088,7 +5271,7 @@ up.LayerLookup = (_a = class LayerLookup {
|
|
5088
5271
|
up.layer.normalizeOptions(options);
|
5089
5272
|
}
|
5090
5273
|
this._options = options;
|
5091
|
-
this._values = u.
|
5274
|
+
this._values = u.getSimpleTokens(options.layer);
|
5092
5275
|
}
|
5093
5276
|
all() {
|
5094
5277
|
let results = u.flatMap(this._values, value => this._resolveValue(value));
|
@@ -5121,7 +5304,7 @@ up.LayerLookup = (_a = class LayerLookup {
|
|
5121
5304
|
if (/^\d+$/.test(value)) {
|
5122
5305
|
return this._forIndex(Number(value));
|
5123
5306
|
}
|
5124
|
-
if (u.
|
5307
|
+
if (u.isElementLike(value)) {
|
5125
5308
|
return this._forElement(value);
|
5126
5309
|
}
|
5127
5310
|
switch (value) {
|
@@ -5188,7 +5371,7 @@ up.LayerLookup = (_a = class LayerLookup {
|
|
5188
5371
|
|
5189
5372
|
|
5190
5373
|
/***/ }),
|
5191
|
-
/*
|
5374
|
+
/* 58 */
|
5192
5375
|
/***/ (() => {
|
5193
5376
|
|
5194
5377
|
const u = up.util;
|
@@ -5302,11 +5485,11 @@ up.LayerStack = class LayerStack {
|
|
5302
5485
|
|
5303
5486
|
|
5304
5487
|
/***/ }),
|
5305
|
-
/*
|
5488
|
+
/* 59 */
|
5306
5489
|
/***/ (() => {
|
5307
5490
|
|
5308
5491
|
const u = up.util;
|
5309
|
-
up.
|
5492
|
+
up.LinkCurrentURLs = class LinkCurrentURLs {
|
5310
5493
|
constructor(link) {
|
5311
5494
|
this._isSafe = up.link.isSafe(link);
|
5312
5495
|
if (this._isSafe) {
|
@@ -5336,7 +5519,7 @@ up.LinkFeedbackURLs = class LinkFeedbackURLs {
|
|
5336
5519
|
|
5337
5520
|
|
5338
5521
|
/***/ }),
|
5339
|
-
/*
|
5522
|
+
/* 60 */
|
5340
5523
|
/***/ (() => {
|
5341
5524
|
|
5342
5525
|
const u = up.util;
|
@@ -5345,12 +5528,13 @@ up.LinkFollowIntent = class LinkFollowIntent {
|
|
5345
5528
|
constructor(link, callback) {
|
5346
5529
|
this._link = link;
|
5347
5530
|
this._callback = callback;
|
5531
|
+
this._lastRequest = null;
|
5348
5532
|
this._on('mouseenter mousedown touchstart', (event) => this._scheduleCallback(event));
|
5349
5533
|
this._on('mouseleave', () => this._unscheduleCallback());
|
5350
5534
|
up.fragment.onAborted(this._link, () => this._unscheduleCallback());
|
5351
5535
|
}
|
5352
|
-
_on(eventType,
|
5353
|
-
up.on(this._link, eventType, { passive: true },
|
5536
|
+
_on(eventType, fn) {
|
5537
|
+
up.on(this._link, eventType, { passive: true }, fn);
|
5354
5538
|
}
|
5355
5539
|
_scheduleCallback(event) {
|
5356
5540
|
if (!up.link.shouldFollowEvent(event, this._link))
|
@@ -5367,20 +5551,22 @@ up.LinkFollowIntent = class LinkFollowIntent {
|
|
5367
5551
|
}
|
5368
5552
|
_unscheduleCallback() {
|
5369
5553
|
clearTimeout(this._timer);
|
5370
|
-
|
5554
|
+
if (this._lastRequest?.background)
|
5555
|
+
this._lastRequest.abort();
|
5556
|
+
this._lastRequest = null;
|
5371
5557
|
}
|
5372
5558
|
_parseDelay() {
|
5373
5559
|
return e.numberAttr(this._link, 'up-preload-delay') ?? up.link.config.preloadDelay;
|
5374
5560
|
}
|
5375
5561
|
_runCallback(event) {
|
5376
5562
|
up.log.putsEvent(event);
|
5377
|
-
|
5563
|
+
this._callback({ onRequestKnown: (request) => this._lastRequest = request });
|
5378
5564
|
}
|
5379
5565
|
};
|
5380
5566
|
|
5381
5567
|
|
5382
5568
|
/***/ }),
|
5383
|
-
/*
|
5569
|
+
/* 61 */
|
5384
5570
|
/***/ (() => {
|
5385
5571
|
|
5386
5572
|
const u = up.util;
|
@@ -5476,7 +5662,7 @@ up.MotionController = class MotionController {
|
|
5476
5662
|
|
5477
5663
|
|
5478
5664
|
/***/ }),
|
5479
|
-
/*
|
5665
|
+
/* 62 */
|
5480
5666
|
/***/ (() => {
|
5481
5667
|
|
5482
5668
|
const u = up.util;
|
@@ -5491,33 +5677,34 @@ up.NonceableCallback = class NonceableCallback {
|
|
5491
5677
|
return new this(match[3], match[2]);
|
5492
5678
|
}
|
5493
5679
|
toFunction(...argNames) {
|
5680
|
+
let script = this.script;
|
5494
5681
|
if (this.nonce) {
|
5495
5682
|
let callbackThis = this;
|
5496
5683
|
return function (...args) {
|
5497
|
-
return callbackThis._runAsNoncedFunction(this, argNames, args);
|
5684
|
+
return callbackThis._runAsNoncedFunction(script, this, argNames, args);
|
5498
5685
|
};
|
5499
5686
|
}
|
5500
5687
|
else {
|
5501
|
-
return new Function(...argNames,
|
5688
|
+
return new Function(...argNames, script);
|
5502
5689
|
}
|
5503
5690
|
}
|
5504
5691
|
toString() {
|
5505
5692
|
return `nonce-${this.nonce} ${this.script}`;
|
5506
5693
|
}
|
5507
|
-
_runAsNoncedFunction(thisArg, argNames, args) {
|
5694
|
+
_runAsNoncedFunction(script, thisArg, argNames, args) {
|
5508
5695
|
let wrappedScript = `
|
5509
5696
|
try {
|
5510
5697
|
up.noncedEval.value = (function(${argNames.join()}) {
|
5511
|
-
${
|
5698
|
+
${script}
|
5512
5699
|
}).apply(up.noncedEval.thisArg, up.noncedEval.args)
|
5513
5700
|
} catch (error) {
|
5514
5701
|
up.noncedEval.error = error
|
5515
5702
|
}
|
5516
5703
|
`;
|
5517
|
-
let
|
5704
|
+
let scriptElement;
|
5518
5705
|
try {
|
5519
5706
|
up.noncedEval = { args, thisArg: thisArg };
|
5520
|
-
|
5707
|
+
scriptElement = e.affix(document.body, 'script', { nonce: this.nonce, text: wrappedScript });
|
5521
5708
|
if (up.noncedEval.error) {
|
5522
5709
|
throw up.noncedEval.error;
|
5523
5710
|
}
|
@@ -5527,8 +5714,8 @@ up.NonceableCallback = class NonceableCallback {
|
|
5527
5714
|
}
|
5528
5715
|
finally {
|
5529
5716
|
up.noncedEval = undefined;
|
5530
|
-
if (
|
5531
|
-
|
5717
|
+
if (scriptElement) {
|
5718
|
+
scriptElement.remove();
|
5532
5719
|
}
|
5533
5720
|
}
|
5534
5721
|
}
|
@@ -5562,7 +5749,7 @@ up.NonceableCallback = class NonceableCallback {
|
|
5562
5749
|
|
5563
5750
|
|
5564
5751
|
/***/ }),
|
5565
|
-
/*
|
5752
|
+
/* 63 */
|
5566
5753
|
/***/ (() => {
|
5567
5754
|
|
5568
5755
|
const e = up.element;
|
@@ -5578,7 +5765,7 @@ up.OverlayFocus = class OverlayFocus {
|
|
5578
5765
|
return;
|
5579
5766
|
}
|
5580
5767
|
this._active = true;
|
5581
|
-
this._unsetAttrs = e.
|
5768
|
+
this._unsetAttrs = e.setAttrsTemp(this._focusElement, {
|
5582
5769
|
'tabindex': '0',
|
5583
5770
|
'role': 'dialog',
|
5584
5771
|
'aria-modal': this._trapFocus.toString()
|
@@ -5635,7 +5822,7 @@ up.OverlayFocus = class OverlayFocus {
|
|
5635
5822
|
|
5636
5823
|
|
5637
5824
|
/***/ }),
|
5638
|
-
/*
|
5825
|
+
/* 64 */
|
5639
5826
|
/***/ (() => {
|
5640
5827
|
|
5641
5828
|
const u = up.util;
|
@@ -5868,6 +6055,140 @@ up.Params = class Params {
|
|
5868
6055
|
};
|
5869
6056
|
|
5870
6057
|
|
6058
|
+
/***/ }),
|
6059
|
+
/* 65 */
|
6060
|
+
/***/ (() => {
|
6061
|
+
|
6062
|
+
const u = up.util;
|
6063
|
+
const e = up.element;
|
6064
|
+
up.Preview = class Preview {
|
6065
|
+
constructor({ fragment, request, renderOptions, cleaner }) {
|
6066
|
+
this.fragment = fragment;
|
6067
|
+
this.request = request;
|
6068
|
+
this.renderOptions = renderOptions;
|
6069
|
+
this._cleaner = cleaner;
|
6070
|
+
}
|
6071
|
+
undo(...args) {
|
6072
|
+
if (this.ended) {
|
6073
|
+
reportError(new up.Error('Preview used after end of request'));
|
6074
|
+
}
|
6075
|
+
else {
|
6076
|
+
this._cleaner.guard(...args);
|
6077
|
+
}
|
6078
|
+
}
|
6079
|
+
get origin() {
|
6080
|
+
return this.request.origin;
|
6081
|
+
}
|
6082
|
+
get params() {
|
6083
|
+
return this.request.params;
|
6084
|
+
}
|
6085
|
+
get layer() {
|
6086
|
+
return this.request.layer;
|
6087
|
+
}
|
6088
|
+
get ended() {
|
6089
|
+
return this.request.ended;
|
6090
|
+
}
|
6091
|
+
get expiredResponse() {
|
6092
|
+
return this.renderOptions.expiredResponse;
|
6093
|
+
}
|
6094
|
+
get revalidating() {
|
6095
|
+
return !!this.expiredResponse;
|
6096
|
+
}
|
6097
|
+
run(value, options = {}) {
|
6098
|
+
for (let fn of up.status.resolvePreviewFns(value)) {
|
6099
|
+
this.undo(up.error.guard(fn, this, options));
|
6100
|
+
}
|
6101
|
+
}
|
6102
|
+
revert() {
|
6103
|
+
this._cleaner.clean();
|
6104
|
+
}
|
6105
|
+
setAttrs(...args) {
|
6106
|
+
let [element, attrs] = this._parseMutatorArgs(args, 'val', 'val');
|
6107
|
+
this.undo(e.setAttrsTemp(element, attrs));
|
6108
|
+
}
|
6109
|
+
addClass(...args) {
|
6110
|
+
let [element, klass] = this._parseMutatorArgs(args, 'val', 'val');
|
6111
|
+
this.undo(e.addClassTemp(element, klass));
|
6112
|
+
}
|
6113
|
+
addClassBatch(elements, classes) {
|
6114
|
+
for (let element of elements) {
|
6115
|
+
for (let klass of classes) {
|
6116
|
+
this.addClass(element, klass);
|
6117
|
+
}
|
6118
|
+
}
|
6119
|
+
}
|
6120
|
+
removeClass(...args) {
|
6121
|
+
let [element, klass] = this._parseMutatorArgs(args, 'val', 'val');
|
6122
|
+
this.undo(e.removeClassTemp(element, klass));
|
6123
|
+
}
|
6124
|
+
setStyle(...args) {
|
6125
|
+
let [element, styles] = this._parseMutatorArgs(args, 'val', 'val');
|
6126
|
+
this.undo(e.setStyleTemp(element, styles));
|
6127
|
+
}
|
6128
|
+
disable(...args) {
|
6129
|
+
let [element] = this._parseMutatorArgs(args, 'val');
|
6130
|
+
this.undo(up.form.disable(element));
|
6131
|
+
}
|
6132
|
+
insert(...args) {
|
6133
|
+
let [reference, position = 'beforeend', tempValue] = this._parseMutatorArgs(args, 'val', u.isAdjacentPosition, 'val');
|
6134
|
+
this.undo(up.fragment.insertTemp(reference, position, tempValue));
|
6135
|
+
}
|
6136
|
+
show(...args) {
|
6137
|
+
let [element] = this._parseMutatorArgs(args, 'val');
|
6138
|
+
this.undo(e.showTemp(element));
|
6139
|
+
}
|
6140
|
+
hide(...args) {
|
6141
|
+
let [element] = this._parseMutatorArgs(args, 'val');
|
6142
|
+
this.undo(e.hideTemp(element));
|
6143
|
+
}
|
6144
|
+
hideContent(...args) {
|
6145
|
+
let [parent] = this._parseMutatorArgs(args, 'val');
|
6146
|
+
let wrapper = e.wrapChildren(parent);
|
6147
|
+
e.hide(wrapper);
|
6148
|
+
this.undo(() => e.unwrap(wrapper));
|
6149
|
+
}
|
6150
|
+
showPlaceholder(...args) {
|
6151
|
+
let [parent, placeholderReference] = this._parseMutatorArgs(args, 'val', 'val');
|
6152
|
+
let placeholderNodes = up.fragment.provideNodes(placeholderReference, { origin: this.origin });
|
6153
|
+
up.puts('[up-placeholder]', 'Showing placeholder %o', placeholderReference);
|
6154
|
+
if (parent) {
|
6155
|
+
this.swapContent(parent, placeholderNodes);
|
6156
|
+
}
|
6157
|
+
else if (this.layer === 'new') {
|
6158
|
+
this.openLayer(placeholderNodes, { closeAnimation: false });
|
6159
|
+
this.renderOptions.openAnimation = false;
|
6160
|
+
}
|
6161
|
+
}
|
6162
|
+
swapContent(...args) {
|
6163
|
+
let [parent, newContent] = this._parseMutatorArgs(args, 'val', 'val');
|
6164
|
+
this.hideContent(parent);
|
6165
|
+
this.insert(parent, newContent);
|
6166
|
+
}
|
6167
|
+
openLayer(content, options = {}) {
|
6168
|
+
let undoDismissValue = ':undo-preview';
|
6169
|
+
let onDismiss = ({ value }) => {
|
6170
|
+
if (value !== undoDismissValue)
|
6171
|
+
this.request.abort({ reason: 'Preview overlay dismissed' });
|
6172
|
+
};
|
6173
|
+
up.layer.open({
|
6174
|
+
...u.pick(this.renderOptions, [...up.Layer.Overlay.VISUAL_KEYS, 'target']),
|
6175
|
+
...options,
|
6176
|
+
content,
|
6177
|
+
abort: false,
|
6178
|
+
onDismiss
|
6179
|
+
});
|
6180
|
+
let overlay = up.layer.front;
|
6181
|
+
this.undo(() => overlay.dismiss(undoDismissValue, { preventable: false }));
|
6182
|
+
return overlay;
|
6183
|
+
}
|
6184
|
+
_parseMutatorArgs(args, ...specs) {
|
6185
|
+
let [element, ...rest] = u.args(args, ...specs);
|
6186
|
+
element = up.fragment.get(element, { layer: this.layer, origin: this.origin }) || this.fragment;
|
6187
|
+
return [element, ...rest];
|
6188
|
+
}
|
6189
|
+
};
|
6190
|
+
|
6191
|
+
|
5871
6192
|
/***/ }),
|
5872
6193
|
/* 66 */
|
5873
6194
|
/***/ (() => {
|
@@ -5880,7 +6201,7 @@ up.ProgressBar = class ProgressBar {
|
|
5880
6201
|
this._element = e.affix(document.body, 'up-progress-bar');
|
5881
6202
|
this._element.style.transition = `width ${TRANSITION_DELAY}ms ease-out`;
|
5882
6203
|
this._moveTo(0);
|
5883
|
-
|
6204
|
+
e.paint(this._element);
|
5884
6205
|
this._width = 31;
|
5885
6206
|
this._nextStep();
|
5886
6207
|
}
|
@@ -5924,21 +6245,22 @@ up.ProgressBar = class ProgressBar {
|
|
5924
6245
|
|
5925
6246
|
const u = up.util;
|
5926
6247
|
up.RenderOptions = (function () {
|
5927
|
-
const
|
5928
|
-
|
5929
|
-
|
5930
|
-
|
5931
|
-
|
5932
|
-
focus: 'keep',
|
5933
|
-
abort: 'target',
|
5934
|
-
failOptions: true,
|
6248
|
+
const NO_PREVIEWS = {
|
6249
|
+
preview: false,
|
6250
|
+
disable: false,
|
6251
|
+
placeholder: false,
|
6252
|
+
feedback: false,
|
5935
6253
|
};
|
5936
|
-
const
|
5937
|
-
|
6254
|
+
const NO_INPUT_INTERFERENCE = {
|
6255
|
+
scroll: false,
|
6256
|
+
focus: 'keep',
|
5938
6257
|
confirm: false,
|
5939
|
-
|
5940
|
-
|
5941
|
-
|
6258
|
+
};
|
6259
|
+
const NO_MOTION = {
|
6260
|
+
transition: false,
|
6261
|
+
animation: false,
|
6262
|
+
openAnimation: false,
|
6263
|
+
closeAnimation: false,
|
5942
6264
|
};
|
5943
6265
|
const PREFLIGHT_KEYS = [
|
5944
6266
|
'url',
|
@@ -5952,9 +6274,13 @@ up.RenderOptions = (function () {
|
|
5952
6274
|
'abortable',
|
5953
6275
|
'confirm',
|
5954
6276
|
'feedback',
|
6277
|
+
'disable',
|
6278
|
+
'placeholder',
|
6279
|
+
'preview',
|
5955
6280
|
'origin',
|
5956
6281
|
'originLayer',
|
5957
6282
|
'baseLayer',
|
6283
|
+
'navigate',
|
5958
6284
|
'fail',
|
5959
6285
|
'onError',
|
5960
6286
|
];
|
@@ -5964,8 +6290,6 @@ up.RenderOptions = (function () {
|
|
5964
6290
|
'history',
|
5965
6291
|
'source',
|
5966
6292
|
'saveScroll',
|
5967
|
-
'navigate',
|
5968
|
-
'baseLayer',
|
5969
6293
|
]);
|
5970
6294
|
const CONTENT_KEYS = [
|
5971
6295
|
'url',
|
@@ -5989,15 +6313,17 @@ up.RenderOptions = (function () {
|
|
5989
6313
|
return { url: u.normalizeURL(url) };
|
5990
6314
|
}
|
5991
6315
|
}
|
5992
|
-
function
|
5993
|
-
|
5994
|
-
|
5995
|
-
|
6316
|
+
function removeUsePrefix(options) {
|
6317
|
+
u.renameKey(options, 'useData', 'data');
|
6318
|
+
u.renameKey(options, 'useHungry', 'hungry');
|
6319
|
+
u.renameKey(options, 'useKeep', 'keep');
|
5996
6320
|
}
|
5997
6321
|
function preprocess(options) {
|
5998
6322
|
up.migrate.preprocessRenderOptions?.(options);
|
5999
|
-
|
6000
|
-
|
6323
|
+
up.layer.normalizeOptions(options);
|
6324
|
+
removeUsePrefix(options);
|
6325
|
+
const defaults = u.merge(up.fragment.config.renderOptions, navigateDefaults(options));
|
6326
|
+
return u.merge(u.omit(defaults, LATE_KEYS), { defaults }, { inputDevice: up.event.inputDevice }, options, normalizeURL(options), rememberOriginLayer(options));
|
6001
6327
|
}
|
6002
6328
|
function rememberOriginLayer({ origin, originLayer }) {
|
6003
6329
|
if (origin && !originLayer) {
|
@@ -6032,13 +6358,11 @@ up.RenderOptions = (function () {
|
|
6032
6358
|
}
|
6033
6359
|
function deriveFailOptions(preprocessedOptions) {
|
6034
6360
|
let overrides = failOverrides(preprocessedOptions);
|
6035
|
-
let layers = rememberOriginLayer(overrides);
|
6036
6361
|
if (preprocessedOptions.failOptions) {
|
6037
6362
|
return {
|
6038
6363
|
...preprocessedOptions.defaults,
|
6039
6364
|
...u.pick(preprocessedOptions, SHARED_KEYS),
|
6040
6365
|
...overrides,
|
6041
|
-
...layers,
|
6042
6366
|
...{ failPrefixForced: true }
|
6043
6367
|
};
|
6044
6368
|
}
|
@@ -6046,7 +6370,6 @@ up.RenderOptions = (function () {
|
|
6046
6370
|
return {
|
6047
6371
|
...preprocessedOptions,
|
6048
6372
|
...overrides,
|
6049
|
-
...layers,
|
6050
6373
|
};
|
6051
6374
|
}
|
6052
6375
|
}
|
@@ -6055,6 +6378,9 @@ up.RenderOptions = (function () {
|
|
6055
6378
|
finalize,
|
6056
6379
|
assertContentGiven,
|
6057
6380
|
deriveFailOptions,
|
6381
|
+
NO_PREVIEWS,
|
6382
|
+
NO_MOTION,
|
6383
|
+
NO_INPUT_INTERFERENCE,
|
6058
6384
|
};
|
6059
6385
|
})();
|
6060
6386
|
|
@@ -6135,7 +6461,6 @@ up.Request = (_a = class Request extends up.Record {
|
|
6135
6461
|
'failMode',
|
6136
6462
|
'failContext',
|
6137
6463
|
'origin',
|
6138
|
-
'fragments',
|
6139
6464
|
'builtAt',
|
6140
6465
|
'wrapMethod',
|
6141
6466
|
'contentType',
|
@@ -6143,7 +6468,8 @@ up.Request = (_a = class Request extends up.Record {
|
|
6143
6468
|
'onLoading',
|
6144
6469
|
'fail',
|
6145
6470
|
'abortable',
|
6146
|
-
'
|
6471
|
+
'lateDelay',
|
6472
|
+
'previews',
|
6147
6473
|
];
|
6148
6474
|
}
|
6149
6475
|
defaults() {
|
@@ -6153,6 +6479,7 @@ up.Request = (_a = class Request extends up.Record {
|
|
6153
6479
|
headers: {},
|
6154
6480
|
timeout: up.network.config.timeout,
|
6155
6481
|
builtAt: new Date(),
|
6482
|
+
previews: [],
|
6156
6483
|
};
|
6157
6484
|
}
|
6158
6485
|
constructor(options) {
|
@@ -6171,26 +6498,37 @@ up.Request = (_a = class Request extends up.Record {
|
|
6171
6498
|
this.mode ||= this.layer.mode;
|
6172
6499
|
this.failMode ||= this.failLayer?.mode;
|
6173
6500
|
}
|
6174
|
-
this.
|
6175
|
-
this.
|
6501
|
+
this.bindLayer = options.bindLayer || this.layer;
|
6502
|
+
this._fragments = options.fragments;
|
6503
|
+
this._bindFragments = options.bindFragments;
|
6504
|
+
this._deferred = u.newDeferred();
|
6176
6505
|
this._setAutoHeaders();
|
6177
6506
|
}
|
6507
|
+
get effectiveLateTime() {
|
6508
|
+
if (this.background) {
|
6509
|
+
return false;
|
6510
|
+
}
|
6511
|
+
else {
|
6512
|
+
return this.lateDelay ?? u.evalOption(up.network.config.lateDelay, this);
|
6513
|
+
}
|
6514
|
+
}
|
6515
|
+
isTimed() {
|
6516
|
+
return u.isNumber(this.effectiveLateTime);
|
6517
|
+
}
|
6178
6518
|
get xhr() {
|
6179
6519
|
return this._xhr ??= new XMLHttpRequest();
|
6180
6520
|
}
|
6181
6521
|
get fragments() {
|
6182
|
-
|
6183
|
-
|
6184
|
-
|
6185
|
-
|
6186
|
-
|
6187
|
-
|
6188
|
-
|
6189
|
-
return u.compact(u.map(selectors, (selector) => up.fragment.get(selector, lookupOpts)));
|
6190
|
-
}
|
6522
|
+
return (this._fragments ||= this._findFragments());
|
6523
|
+
}
|
6524
|
+
_findFragments() {
|
6525
|
+
let steps = up.fragment.parseTargetSteps(this.target);
|
6526
|
+
let lookupOpts = { origin: this.origin, layer: this.layer };
|
6527
|
+
let matches = u.map(steps, (step) => up.fragment.get(step.selector, lookupOpts));
|
6528
|
+
return u.compact(matches);
|
6191
6529
|
}
|
6192
|
-
|
6193
|
-
this.
|
6530
|
+
get bindFragments() {
|
6531
|
+
return this._bindFragments || this.fragments;
|
6194
6532
|
}
|
6195
6533
|
get fragment() {
|
6196
6534
|
return this.fragments?.[0];
|
@@ -6205,8 +6543,10 @@ up.Request = (_a = class Request extends up.Record {
|
|
6205
6543
|
u.task(() => {
|
6206
6544
|
this.layer = undefined;
|
6207
6545
|
this.failLayer = undefined;
|
6546
|
+
this._bindLayer = undefined;
|
6208
6547
|
this.origin = undefined;
|
6209
|
-
this.
|
6548
|
+
this._fragments = undefined;
|
6549
|
+
this._bindFragments = undefined;
|
6210
6550
|
});
|
6211
6551
|
}
|
6212
6552
|
_extractHashFromURL() {
|
@@ -6258,6 +6598,11 @@ up.Request = (_a = class Request extends up.Record {
|
|
6258
6598
|
this.abort({ reason: 'Prevented by event listener' });
|
6259
6599
|
}
|
6260
6600
|
}
|
6601
|
+
runPreviews(renderOptions) {
|
6602
|
+
if (!this.ended && !this.fromCache) {
|
6603
|
+
this._revertPreviews = up.status.runPreviews(this, renderOptions);
|
6604
|
+
}
|
6605
|
+
}
|
6261
6606
|
_emitLoad() {
|
6262
6607
|
let event = this.emit('up:request:load', { log: ['Loading %s', this.description] });
|
6263
6608
|
return !event.defaultPrevented;
|
@@ -6287,35 +6632,46 @@ up.Request = (_a = class Request extends up.Record {
|
|
6287
6632
|
}
|
6288
6633
|
}
|
6289
6634
|
_setAbortedState(reason) {
|
6290
|
-
if (this.
|
6635
|
+
if (this.ended)
|
6291
6636
|
return;
|
6292
6637
|
let message = 'Aborted request to ' + this.description + (reason ? ': ' + reason : '');
|
6293
6638
|
this.state = 'aborted';
|
6294
|
-
this.
|
6639
|
+
this._reject(new up.Aborted(message));
|
6295
6640
|
this.emit('up:request:aborted', { log: message });
|
6296
6641
|
return true;
|
6297
6642
|
}
|
6298
6643
|
_setOfflineState(reason) {
|
6299
|
-
if (this.
|
6644
|
+
if (this.ended)
|
6300
6645
|
return;
|
6301
6646
|
let message = 'Cannot load request to ' + this.description + (reason ? ': ' + reason : '');
|
6302
6647
|
this.state = 'offline';
|
6303
6648
|
this.emit('up:request:offline', { log: message });
|
6304
|
-
this.
|
6649
|
+
this._reject(new up.Offline(message));
|
6305
6650
|
}
|
6306
6651
|
respondWith(response) {
|
6307
6652
|
this.response = response;
|
6308
|
-
if (this.
|
6653
|
+
if (this.ended)
|
6309
6654
|
return;
|
6310
6655
|
this.state = 'loaded';
|
6311
6656
|
if (response.ok) {
|
6312
|
-
this.
|
6657
|
+
this._resolve(response);
|
6313
6658
|
}
|
6314
6659
|
else {
|
6315
|
-
this.
|
6660
|
+
this._reject(response);
|
6316
6661
|
}
|
6317
6662
|
}
|
6318
|
-
|
6663
|
+
_resolve(response) {
|
6664
|
+
this._onSettle();
|
6665
|
+
this._deferred.resolve(response);
|
6666
|
+
}
|
6667
|
+
_reject(responseOrError) {
|
6668
|
+
this._onSettle();
|
6669
|
+
this._deferred.reject(responseOrError);
|
6670
|
+
}
|
6671
|
+
_onSettle() {
|
6672
|
+
this._revertPreviews?.();
|
6673
|
+
}
|
6674
|
+
get ended() {
|
6319
6675
|
return (this.state !== 'new') && (this.state !== 'loading') && (this.state !== 'tracking');
|
6320
6676
|
}
|
6321
6677
|
csrfHeader() {
|
@@ -6365,7 +6721,7 @@ up.Request = (_a = class Request extends up.Record {
|
|
6365
6721
|
}
|
6366
6722
|
_buildEventEmitter(args) {
|
6367
6723
|
return up.EventEmitter.fromEmitArgs(args, {
|
6368
|
-
layer: this.
|
6724
|
+
layer: this.bindLayer,
|
6369
6725
|
request: this,
|
6370
6726
|
origin: this.origin
|
6371
6727
|
});
|
@@ -6379,12 +6735,15 @@ up.Request = (_a = class Request extends up.Record {
|
|
6379
6735
|
get description() {
|
6380
6736
|
return this.method + ' ' + this.url;
|
6381
6737
|
}
|
6382
|
-
|
6383
|
-
|
6384
|
-
return u.some(this.
|
6385
|
-
return u.some(
|
6738
|
+
isBoundToSubtrees(subtreeRoots) {
|
6739
|
+
subtreeRoots = u.wrapList(subtreeRoots);
|
6740
|
+
return u.some(this.bindFragments, function (fragment) {
|
6741
|
+
return u.some(subtreeRoots, (subtreeElement) => subtreeElement.contains(fragment));
|
6386
6742
|
});
|
6387
6743
|
}
|
6744
|
+
isBoundToLayers(layers) {
|
6745
|
+
return u.contains(layers, this.bindLayer);
|
6746
|
+
}
|
6388
6747
|
get age() {
|
6389
6748
|
return new Date() - this.builtAt;
|
6390
6749
|
}
|
@@ -6447,7 +6806,7 @@ up.Request = (_a = class Request extends up.Record {
|
|
6447
6806
|
}
|
6448
6807
|
},
|
6449
6808
|
(() => {
|
6450
|
-
u.
|
6809
|
+
u.delegatePromise(_a.prototype, '_deferred');
|
6451
6810
|
})(),
|
6452
6811
|
_a);
|
6453
6812
|
|
@@ -6488,8 +6847,8 @@ class Route {
|
|
6488
6847
|
return true;
|
6489
6848
|
if (!newValue)
|
6490
6849
|
return false;
|
6491
|
-
let cachedTokens =
|
6492
|
-
let newTokens =
|
6850
|
+
let cachedTokens = up.fragment.splitTarget(cachedValue);
|
6851
|
+
let newTokens = up.fragment.splitTarget(newValue);
|
6493
6852
|
return u.containsAll(cachedTokens, newTokens);
|
6494
6853
|
}
|
6495
6854
|
else {
|
@@ -6546,7 +6905,13 @@ up.Request.Cache = class Cache {
|
|
6546
6905
|
async track(existingRequest, newRequest, options = {}) {
|
6547
6906
|
newRequest.trackedRequest = existingRequest;
|
6548
6907
|
newRequest.state = 'tracking';
|
6549
|
-
let value
|
6908
|
+
let value;
|
6909
|
+
if (existingRequest.ended && existingRequest.response) {
|
6910
|
+
value = existingRequest.response;
|
6911
|
+
}
|
6912
|
+
else {
|
6913
|
+
value = await u.always(existingRequest);
|
6914
|
+
}
|
6550
6915
|
if (value instanceof up.Response) {
|
6551
6916
|
if (options.force || existingRequest.cacheRoute.satisfies(existingRequest, newRequest)) {
|
6552
6917
|
newRequest.fromCache = true;
|
@@ -6562,7 +6927,7 @@ up.Request.Cache = class Cache {
|
|
6562
6927
|
}
|
6563
6928
|
else {
|
6564
6929
|
newRequest.state = existingRequest.state;
|
6565
|
-
newRequest.
|
6930
|
+
newRequest._reject(value);
|
6566
6931
|
}
|
6567
6932
|
}
|
6568
6933
|
willHaveSameResponse(existingRequest, newRequest) {
|
@@ -6642,8 +7007,10 @@ up.Request.Queue = class Queue {
|
|
6642
7007
|
}
|
6643
7008
|
}
|
6644
7009
|
_scheduleSlowTimer(request) {
|
6645
|
-
|
6646
|
-
|
7010
|
+
if (!request.isTimed())
|
7011
|
+
return;
|
7012
|
+
let timeUntilLate = Math.max(request.effectiveLateTime - request.age);
|
7013
|
+
u.timer(timeUntilLate, () => this._checkForLate());
|
6647
7014
|
}
|
6648
7015
|
_getMaxConcurrency() {
|
6649
7016
|
return u.evalOption(up.network.config.concurrency);
|
@@ -6673,8 +7040,8 @@ up.Request.Queue = class Queue {
|
|
6673
7040
|
if ((responseOrError instanceof up.Response) && responseOrError.ok) {
|
6674
7041
|
up.network.registerAliasForRedirect(request, responseOrError);
|
6675
7042
|
}
|
6676
|
-
this._checkLate();
|
6677
7043
|
queueMicrotask(() => this._poke());
|
7044
|
+
u.task(() => this._checkForRecover());
|
6678
7045
|
}
|
6679
7046
|
_poke() {
|
6680
7047
|
let request;
|
@@ -6683,9 +7050,7 @@ up.Request.Queue = class Queue {
|
|
6683
7050
|
}
|
6684
7051
|
}
|
6685
7052
|
abort(...args) {
|
6686
|
-
let
|
6687
|
-
let { except, reason, logOnce } = options;
|
6688
|
-
let conditions = args[0] ?? true;
|
7053
|
+
let [conditions = true, { except, reason, logOnce }] = u.args(args, 'val', 'options');
|
6689
7054
|
let tester = up.Request.tester(conditions, { except });
|
6690
7055
|
for (let list of [this._currentRequests, this._queuedRequests]) {
|
6691
7056
|
const abortableRequests = u.filter(list, tester);
|
@@ -6699,22 +7064,25 @@ up.Request.Queue = class Queue {
|
|
6699
7064
|
}
|
6700
7065
|
}
|
6701
7066
|
}
|
6702
|
-
|
6703
|
-
|
6704
|
-
|
6705
|
-
|
6706
|
-
|
6707
|
-
|
6708
|
-
|
6709
|
-
|
6710
|
-
|
6711
|
-
}
|
7067
|
+
_checkForLate() {
|
7068
|
+
if (!this._emittedLate && this._hasLateTimedRequests()) {
|
7069
|
+
this._emittedLate = true;
|
7070
|
+
up.emit('up:network:late', { log: 'Server is slow to respond' });
|
7071
|
+
}
|
7072
|
+
}
|
7073
|
+
_checkForRecover() {
|
7074
|
+
if (this._emittedLate && !this._timedRequests.length) {
|
7075
|
+
this._emittedLate = false;
|
7076
|
+
up.emit('up:network:recover', { log: 'Slow requests were loaded' });
|
6712
7077
|
}
|
6713
7078
|
}
|
6714
|
-
|
6715
|
-
|
7079
|
+
get _timedRequests() {
|
7080
|
+
return this.allRequests.filter((request) => request.isTimed());
|
7081
|
+
}
|
7082
|
+
_hasLateTimedRequests() {
|
6716
7083
|
const timerTolerance = 1;
|
6717
|
-
|
7084
|
+
const isLate = (request) => request.age >= (request.effectiveLateTime - timerTolerance);
|
7085
|
+
return u.some(this._timedRequests, isLate);
|
6718
7086
|
}
|
6719
7087
|
};
|
6720
7088
|
|
@@ -6873,7 +7241,7 @@ up.Response = class Response extends up.Record {
|
|
6873
7241
|
}
|
6874
7242
|
get varyHeaderNames() {
|
6875
7243
|
let varyHeaderValue = this.header('Vary');
|
6876
|
-
return u.
|
7244
|
+
return u.getSimpleTokens(varyHeaderValue, { separator: ',' });
|
6877
7245
|
}
|
6878
7246
|
get contentType() {
|
6879
7247
|
return this.header('Content-Type');
|
@@ -6916,15 +7284,15 @@ const u = up.util;
|
|
6916
7284
|
const e = up.element;
|
6917
7285
|
const FULL_DOCUMENT_PATTERN = /^\s*<(html|!DOCTYPE)\b/i;
|
6918
7286
|
up.ResponseDoc = (_a = class ResponseDoc {
|
6919
|
-
constructor({ document, fragment, content, target, origin, cspNonces, match }) {
|
7287
|
+
constructor({ document, fragment, content, target, origin, data, cspNonces, match }) {
|
6920
7288
|
if (document) {
|
6921
|
-
this._parseDocument(document);
|
7289
|
+
this._parseDocument(document, origin, data);
|
6922
7290
|
}
|
6923
7291
|
else if (fragment) {
|
6924
|
-
this._parseFragment(fragment);
|
7292
|
+
this._parseFragment(fragment, origin, data);
|
6925
7293
|
}
|
6926
7294
|
else {
|
6927
|
-
this._parseContent(content || '', target);
|
7295
|
+
this._parseContent(content || '', origin, target, data);
|
6928
7296
|
}
|
6929
7297
|
this._cspNonces = cspNonces;
|
6930
7298
|
if (origin) {
|
@@ -6935,46 +7303,49 @@ up.ResponseDoc = (_a = class ResponseDoc {
|
|
6935
7303
|
}
|
6936
7304
|
this._match = match;
|
6937
7305
|
}
|
6938
|
-
_parseDocument(value) {
|
7306
|
+
_parseDocument(value, origin, data) {
|
6939
7307
|
if (value instanceof Document) {
|
6940
7308
|
this._document = value;
|
6941
7309
|
this._isFullDocument = true;
|
6942
7310
|
}
|
6943
7311
|
else if (u.isString(value)) {
|
6944
|
-
this._document = e.createBrokenDocumentFromHTML(value);
|
6945
7312
|
this._isFullDocument = FULL_DOCUMENT_PATTERN.test(value);
|
6946
|
-
|
7313
|
+
let htmlParser = (html) => [e.createBrokenDocumentFromHTML(html)];
|
7314
|
+
let nodes = up.fragment.provideNodes(value, { origin, data, htmlParser });
|
7315
|
+
if (nodes[0] instanceof Document) {
|
7316
|
+
this._document = nodes[0];
|
7317
|
+
}
|
7318
|
+
else {
|
7319
|
+
this._document = this._buildFauxDocument(nodes);
|
7320
|
+
}
|
6947
7321
|
}
|
6948
7322
|
else {
|
6949
7323
|
this._document = this._buildFauxDocument(value);
|
6950
|
-
this._isFullDocument = value.matches('html');
|
6951
7324
|
}
|
6952
7325
|
}
|
6953
|
-
|
6954
|
-
|
6955
|
-
this._document = this._buildFauxDocument(parsed);
|
7326
|
+
_parseDocumentFromHTML(html) {
|
7327
|
+
return e.createBrokenDocumentFromHTML(html);
|
6956
7328
|
}
|
6957
|
-
|
7329
|
+
_parseFragment(value, origin, data) {
|
7330
|
+
let element = e.extractSingular(up.fragment.provideNodes(value, { origin, data }));
|
7331
|
+
this._document = this._buildFauxDocument(element);
|
7332
|
+
}
|
7333
|
+
_parseContent(value, origin, target, data) {
|
6958
7334
|
if (!target)
|
6959
7335
|
up.fail("must pass a { target } when passing { content }");
|
6960
7336
|
let simplifiedTarget = u.map(up.fragment.parseTargetSteps(target), 'selector').join();
|
6961
|
-
|
6962
|
-
|
6963
|
-
matchingElement.innerHTML = value;
|
6964
|
-
}
|
6965
|
-
else {
|
6966
|
-
matchingElement.appendChild(value);
|
6967
|
-
}
|
7337
|
+
let nodes = up.fragment.provideNodes(value, { origin, data });
|
7338
|
+
let matchingElement = e.createFromSelector(simplifiedTarget, { content: nodes });
|
6968
7339
|
this._document = this._buildFauxDocument(matchingElement);
|
6969
7340
|
}
|
6970
|
-
_buildFauxDocument(
|
7341
|
+
_buildFauxDocument(nodes) {
|
7342
|
+
nodes = u.wrapList(nodes);
|
6971
7343
|
let fauxDocument = document.createElement('up-document');
|
6972
|
-
fauxDocument.append(
|
6973
|
-
fauxDocument.documentElement = node;
|
7344
|
+
fauxDocument.append(...nodes);
|
6974
7345
|
return fauxDocument;
|
6975
7346
|
}
|
6976
7347
|
rootSelector() {
|
6977
|
-
return up.fragment.toTarget(this._document.
|
7348
|
+
return up.fragment.toTarget(this._document.children[0]);
|
6978
7349
|
}
|
6979
7350
|
get title() {
|
6980
7351
|
return this._fromHead(this._getTitleText);
|
@@ -7055,7 +7426,7 @@ up.ResponseDoc = (_a = class ResponseDoc {
|
|
7055
7426
|
}
|
7056
7427
|
finalizeElement(element) {
|
7057
7428
|
up.NonceableCallback.adoptNonces(element, this._cspNonces);
|
7058
|
-
if (this.
|
7429
|
+
if (this._document instanceof Document) {
|
7059
7430
|
let brokenElements = e.subtree(element, ':is(noscript,script,audio,video):not(.up-keeping, .up-keeping *)');
|
7060
7431
|
u.each(brokenElements, e.fixParserDamage);
|
7061
7432
|
}
|
@@ -7164,16 +7535,17 @@ up.RevealMotion = class RevealMotion {
|
|
7164
7535
|
/***/ (() => {
|
7165
7536
|
|
7166
7537
|
const u = up.util;
|
7167
|
-
const
|
7538
|
+
const e = up.element;
|
7168
7539
|
up.Selector = class Selector {
|
7169
7540
|
constructor(selector, elementOrDocument, options = {}) {
|
7170
7541
|
this._filters = [];
|
7171
|
-
|
7542
|
+
let matchingInExternalDocument = elementOrDocument && !document.contains(elementOrDocument);
|
7543
|
+
if (!matchingInExternalDocument && !options.destroying) {
|
7172
7544
|
this._filters.push(up.fragment.isNotDestroying);
|
7173
7545
|
}
|
7174
|
-
|
7546
|
+
this._ignoreLayers = matchingInExternalDocument || options.layer === 'any' || up.layer.count === 1;
|
7175
7547
|
let expandTargetLayer;
|
7176
|
-
if (
|
7548
|
+
if (this._ignoreLayers) {
|
7177
7549
|
expandTargetLayer = up.layer.root;
|
7178
7550
|
}
|
7179
7551
|
else {
|
@@ -7184,44 +7556,45 @@ up.Selector = class Selector {
|
|
7184
7556
|
this._filters.push(match => u.some(this._layers, layer => layer.contains(match)));
|
7185
7557
|
expandTargetLayer = this._layers[0];
|
7186
7558
|
}
|
7187
|
-
|
7188
|
-
this._selectors = expandedTargets.map((target) => {
|
7189
|
-
if (!up.browser.canHasSelector()) {
|
7190
|
-
target = target.replace(CSS_HAS_SUFFIX_PATTERN, (match, descendantSelector) => {
|
7191
|
-
this._filters.push(element => element.querySelector(descendantSelector));
|
7192
|
-
return '';
|
7193
|
-
});
|
7194
|
-
}
|
7195
|
-
return target || '*';
|
7196
|
-
});
|
7559
|
+
this._selectors = up.fragment.expandTargets(selector, { ...options, layer: expandTargetLayer });
|
7197
7560
|
this._unionSelector = this._selectors.join() || 'match-none';
|
7198
7561
|
}
|
7199
7562
|
matches(element) {
|
7200
|
-
return
|
7563
|
+
return e.elementLikeMatches(element, this._unionSelector) && this._passesFilter(element);
|
7201
7564
|
}
|
7202
7565
|
closest(element) {
|
7203
|
-
|
7204
|
-
|
7205
|
-
|
7566
|
+
return this._filterOne(element.closest(this._unionSelector));
|
7567
|
+
}
|
7568
|
+
descendants(root = document) {
|
7569
|
+
return this._filterMany(root.querySelectorAll(this._unionSelector));
|
7570
|
+
}
|
7571
|
+
firstDescendant(root) {
|
7572
|
+
if (this._ignoreLayers) {
|
7573
|
+
root ||= document;
|
7574
|
+
return this._firstSelectorMatch((selector) => root.querySelectorAll(selector));
|
7206
7575
|
}
|
7207
|
-
else
|
7208
|
-
return this.
|
7576
|
+
else {
|
7577
|
+
return u.findResult(this._layers, (layer) => {
|
7578
|
+
return this._firstSelectorMatch((selector) => e.subtree(layer.element, selector));
|
7579
|
+
});
|
7209
7580
|
}
|
7210
7581
|
}
|
7582
|
+
subtree(root) {
|
7583
|
+
return this._filterMany(e.subtree(root, this._unionSelector));
|
7584
|
+
}
|
7585
|
+
_firstSelectorMatch(fn) {
|
7586
|
+
return u.findResult(this._selectors, (selector) => {
|
7587
|
+
return this._filterMany(fn(selector))[0];
|
7588
|
+
});
|
7589
|
+
}
|
7211
7590
|
_passesFilter(element) {
|
7212
|
-
return u.every(this._filters, filter => filter(element));
|
7591
|
+
return element && u.every(this._filters, filter => filter(element));
|
7213
7592
|
}
|
7214
|
-
|
7215
|
-
|
7216
|
-
return u.filter(results, element => this._passesFilter(element));
|
7593
|
+
_filterOne(element) {
|
7594
|
+
return u.presence(element, this._passesFilter.bind(this));
|
7217
7595
|
}
|
7218
|
-
|
7219
|
-
|
7220
|
-
if (!(root instanceof Document) && this.matches(root)) {
|
7221
|
-
results.push(root);
|
7222
|
-
}
|
7223
|
-
results.push(...this.descendants(root));
|
7224
|
-
return results;
|
7596
|
+
_filterMany(elements) {
|
7597
|
+
return u.filter(elements, this._passesFilter.bind(this));
|
7225
7598
|
}
|
7226
7599
|
};
|
7227
7600
|
|
@@ -7356,7 +7729,7 @@ up.URLPattern = class URLPattern {
|
|
7356
7729
|
this._groups = [];
|
7357
7730
|
const positiveList = [];
|
7358
7731
|
const negativeList = [];
|
7359
|
-
for (let pattern of u.
|
7732
|
+
for (let pattern of u.getSimpleTokens(fullPattern)) {
|
7360
7733
|
if (pattern[0] === '-') {
|
7361
7734
|
negativeList.push(pattern.substring(1));
|
7362
7735
|
}
|
@@ -7479,7 +7852,7 @@ up.framework = (function () {
|
|
7479
7852
|
return !supportIssue();
|
7480
7853
|
}
|
7481
7854
|
function supportIssue() {
|
7482
|
-
for (let feature of ['
|
7855
|
+
for (let feature of ['Promise', 'DOMParser', 'FormData', 'reportError']) {
|
7483
7856
|
if (!window[feature]) {
|
7484
7857
|
return `Browser doesn't support the ${feature} API`;
|
7485
7858
|
}
|
@@ -7487,6 +7860,11 @@ up.framework = (function () {
|
|
7487
7860
|
if (document.compatMode === 'BackCompat') {
|
7488
7861
|
return 'Browser is in quirks mode (missing DOCTYPE?)';
|
7489
7862
|
}
|
7863
|
+
for (let selector of [':is(*)', ':has(*)']) {
|
7864
|
+
if (!CSS.supports(`selector(${selector})`)) {
|
7865
|
+
return `Browser doesn't support the ${selector} selector`;
|
7866
|
+
}
|
7867
|
+
}
|
7490
7868
|
}
|
7491
7869
|
return {
|
7492
7870
|
onEvaled,
|
@@ -7655,28 +8033,31 @@ up.protocol = (function () {
|
|
7655
8033
|
return extractHeader(xhr, 'expireCache') || up.migrate.clearCacheFromXHR?.(xhr);
|
7656
8034
|
}
|
7657
8035
|
function contextFromXHR(xhr) {
|
7658
|
-
return extractHeader(xhr, 'context',
|
8036
|
+
return extractHeader(xhr, 'context', u.parseRelaxedJSON);
|
7659
8037
|
}
|
7660
8038
|
function methodFromXHR(xhr) {
|
7661
8039
|
return extractHeader(xhr, 'method', u.normalizeMethod);
|
7662
8040
|
}
|
7663
8041
|
function titleFromXHR(xhr) {
|
7664
|
-
return up.migrate.titleFromXHR?.(xhr) ?? extractHeader(xhr, 'title',
|
8042
|
+
return up.migrate.titleFromXHR?.(xhr) ?? extractHeader(xhr, 'title', u.parseRelaxedJSON);
|
7665
8043
|
}
|
7666
8044
|
function eventPlansFromXHR(xhr) {
|
7667
|
-
return extractHeader(xhr, 'events',
|
8045
|
+
return extractHeader(xhr, 'events', u.parseRelaxedJSON);
|
7668
8046
|
}
|
7669
8047
|
function acceptLayerFromXHR(xhr) {
|
7670
|
-
return extractHeader(xhr, 'acceptLayer',
|
8048
|
+
return extractHeader(xhr, 'acceptLayer', u.parseRelaxedJSON);
|
7671
8049
|
}
|
7672
8050
|
function dismissLayerFromXHR(xhr) {
|
7673
|
-
return extractHeader(xhr, 'dismissLayer',
|
8051
|
+
return extractHeader(xhr, 'dismissLayer', u.parseRelaxedJSON);
|
7674
8052
|
}
|
7675
8053
|
const initialRequestMethod = u.memoize(function () {
|
7676
8054
|
return u.normalizeMethod(up.browser.popCookie('_up_method'));
|
7677
8055
|
});
|
7678
8056
|
function locationFromXHR(xhr) {
|
7679
|
-
|
8057
|
+
let location = extractHeader(xhr, 'location') || xhr.responseURL;
|
8058
|
+
if (location) {
|
8059
|
+
return u.normalizeURL(location);
|
8060
|
+
}
|
7680
8061
|
}
|
7681
8062
|
const config = new up.Config(() => ({
|
7682
8063
|
methodParam: '_method',
|
@@ -7841,6 +8222,9 @@ up.script = (function () {
|
|
7841
8222
|
],
|
7842
8223
|
nonceableAttributes: [
|
7843
8224
|
'up-watch',
|
8225
|
+
'up-on-keep',
|
8226
|
+
'up-on-hungry',
|
8227
|
+
'up-on-opened',
|
7844
8228
|
'up-on-accepted',
|
7845
8229
|
'up-on-dismissed',
|
7846
8230
|
'up-on-loaded',
|
@@ -7850,7 +8234,10 @@ up.script = (function () {
|
|
7850
8234
|
'up-on-offline',
|
7851
8235
|
],
|
7852
8236
|
scriptSelectors: [
|
7853
|
-
'script'
|
8237
|
+
'script:not([type])',
|
8238
|
+
'script[type="text/javascript"]',
|
8239
|
+
'script[type="module"]',
|
8240
|
+
'script[type="importmap"]',
|
7854
8241
|
],
|
7855
8242
|
noScriptSelectors: [
|
7856
8243
|
'script[type="application/ld+json"]'
|
@@ -7881,10 +8268,13 @@ up.script = (function () {
|
|
7881
8268
|
function registerAttrCompiler(...args) {
|
7882
8269
|
let [attr, options, valueCallback] = parseProcessorArgs(args);
|
7883
8270
|
let selector = `[${attr}]`;
|
8271
|
+
let { defaultValue } = options;
|
7884
8272
|
let callback = (element) => {
|
7885
|
-
let value = e.booleanOrStringAttr(element, attr
|
7886
|
-
if (
|
8273
|
+
let value = e.booleanOrStringAttr(element, attr);
|
8274
|
+
if (value === false)
|
7887
8275
|
return;
|
8276
|
+
if (u.isDefined(defaultValue) && value === true)
|
8277
|
+
value = defaultValue;
|
7888
8278
|
return valueCallback(element, value);
|
7889
8279
|
};
|
7890
8280
|
registerProcessor([selector, options, callback]);
|
@@ -7911,11 +8301,7 @@ up.script = (function () {
|
|
7911
8301
|
}
|
7912
8302
|
}
|
7913
8303
|
const parseProcessorArgs = function (args) {
|
7914
|
-
|
7915
|
-
const selector = args.shift();
|
7916
|
-
const callback = args.pop();
|
7917
|
-
const options = { ...defaults, ...u.extractOptions(args) };
|
7918
|
-
return [selector, options, callback];
|
8304
|
+
return u.args(args, 'val', 'options', 'callback');
|
7919
8305
|
};
|
7920
8306
|
function buildProcessor(args, overrides) {
|
7921
8307
|
let [selector, options, callback] = parseProcessorArgs(args);
|
@@ -7953,18 +8339,16 @@ up.script = (function () {
|
|
7953
8339
|
pass.run();
|
7954
8340
|
}
|
7955
8341
|
function registerDestructor(element, destructor) {
|
7956
|
-
let
|
7957
|
-
if (!
|
7958
|
-
|
7959
|
-
|
7960
|
-
|
7961
|
-
|
7962
|
-
|
7963
|
-
|
7964
|
-
|
7965
|
-
|
7966
|
-
destructors.push(destructor);
|
7967
|
-
}
|
8342
|
+
let fns = u.scanFunctions(destructor);
|
8343
|
+
if (!fns.length)
|
8344
|
+
return;
|
8345
|
+
let registry = (element.upDestructors ||= buildDestructorRegistry(element));
|
8346
|
+
registry.guard(fns);
|
8347
|
+
}
|
8348
|
+
function buildDestructorRegistry(element) {
|
8349
|
+
let registry = u.cleaner();
|
8350
|
+
registry(e.addClassTemp(element, 'up-can-clean'));
|
8351
|
+
return registry;
|
7968
8352
|
}
|
7969
8353
|
function hello(element, options = {}) {
|
7970
8354
|
element = up.fragment.get(element, options);
|
@@ -7981,18 +8365,12 @@ up.script = (function () {
|
|
7981
8365
|
return element.upData ||= buildData(element);
|
7982
8366
|
}
|
7983
8367
|
function buildData(element) {
|
7984
|
-
|
7985
|
-
|
7986
|
-
|
7987
|
-
let rawJSON = element.getAttribute('up-data');
|
7988
|
-
let parsedJSON;
|
7989
|
-
if (rawJSON) {
|
7990
|
-
parsedJSON = JSON.parse(rawJSON);
|
7991
|
-
if (!u.isOptions(parsedJSON)) {
|
7992
|
-
return parsedJSON;
|
7993
|
-
}
|
8368
|
+
let parsedJSON = e.jsonAttr(element, 'up-data') ?? {};
|
8369
|
+
if (!u.isOptions(parsedJSON)) {
|
8370
|
+
return parsedJSON;
|
7994
8371
|
}
|
7995
8372
|
return {
|
8373
|
+
...element.upTemplateData,
|
7996
8374
|
...element.dataset,
|
7997
8375
|
...parsedJSON,
|
7998
8376
|
...element.upCompileData,
|
@@ -8016,6 +8394,9 @@ up.script = (function () {
|
|
8016
8394
|
let selector = config.selector('scriptSelectors');
|
8017
8395
|
u.each(e.subtree(root, selector), disableScript);
|
8018
8396
|
}
|
8397
|
+
function isScript(value) {
|
8398
|
+
return config.matches(value, 'scriptSelectors');
|
8399
|
+
}
|
8019
8400
|
function reset() {
|
8020
8401
|
registeredCompilers = u.filter(registeredCompilers, 'isDefault');
|
8021
8402
|
registeredMacros = u.filter(registeredMacros, 'isDefault');
|
@@ -8033,6 +8414,7 @@ up.script = (function () {
|
|
8033
8414
|
findAssets,
|
8034
8415
|
assertAssetsOK,
|
8035
8416
|
disableSubtree: disableScriptsInSubtree,
|
8417
|
+
isScript,
|
8036
8418
|
};
|
8037
8419
|
})();
|
8038
8420
|
up.compiler = up.script.compiler;
|
@@ -8181,7 +8563,7 @@ up.history = (function () {
|
|
8181
8563
|
}
|
8182
8564
|
}
|
8183
8565
|
function updateLang(newLang) {
|
8184
|
-
e.
|
8566
|
+
e.setAttrPresence(e.root, 'lang', newLang, !!newLang);
|
8185
8567
|
}
|
8186
8568
|
up.macro('[up-back]', function (link) {
|
8187
8569
|
if (previousLocation) {
|
@@ -8223,14 +8605,18 @@ up.fragment = (function () {
|
|
8223
8605
|
return tagName;
|
8224
8606
|
}
|
8225
8607
|
}
|
8608
|
+
const STRONG_TARGET_DERIVERS = [
|
8609
|
+
'[up-id]',
|
8610
|
+
'[id]',
|
8611
|
+
'html',
|
8612
|
+
'head',
|
8613
|
+
'body',
|
8614
|
+
];
|
8226
8615
|
const config = new up.Config(() => ({
|
8227
8616
|
badTargetClasses: [/^up-/],
|
8617
|
+
strongTargetDerivers: STRONG_TARGET_DERIVERS,
|
8228
8618
|
targetDerivers: [
|
8229
|
-
|
8230
|
-
'[id]',
|
8231
|
-
'html',
|
8232
|
-
'head',
|
8233
|
-
'body',
|
8619
|
+
...STRONG_TARGET_DERIVERS,
|
8234
8620
|
'main',
|
8235
8621
|
'[up-main]',
|
8236
8622
|
upTagName,
|
@@ -8248,10 +8634,19 @@ up.fragment = (function () {
|
|
8248
8634
|
'form',
|
8249
8635
|
],
|
8250
8636
|
verifyDerivedTarget: true,
|
8637
|
+
renderOptions: {
|
8638
|
+
hungry: true,
|
8639
|
+
keep: true,
|
8640
|
+
saveScroll: true,
|
8641
|
+
saveFocus: true,
|
8642
|
+
focus: 'keep',
|
8643
|
+
abort: 'target',
|
8644
|
+
failOptions: true,
|
8645
|
+
feedback: true,
|
8646
|
+
},
|
8251
8647
|
navigateOptions: {
|
8252
8648
|
cache: 'auto',
|
8253
8649
|
revalidate: 'auto',
|
8254
|
-
feedback: true,
|
8255
8650
|
fallback: true,
|
8256
8651
|
focus: 'auto',
|
8257
8652
|
scroll: 'auto',
|
@@ -8264,7 +8659,7 @@ up.fragment = (function () {
|
|
8264
8659
|
autoFocus: ['hash', 'autofocus', 'main-if-main', 'keep', 'target-if-lost'],
|
8265
8660
|
autoScroll: ['hash', 'layer-if-main'],
|
8266
8661
|
autoRevalidate: (response) => response.expired,
|
8267
|
-
skipResponse: defaultSkipResponse
|
8662
|
+
skipResponse: defaultSkipResponse,
|
8268
8663
|
}));
|
8269
8664
|
u.delegate(config, ['mainTargets'], () => up.layer.config.any);
|
8270
8665
|
function defaultSkipResponse({ response, expiredResponse }) {
|
@@ -8323,14 +8718,12 @@ up.fragment = (function () {
|
|
8323
8718
|
return fragment.isConnected && isNotDestroying(fragment);
|
8324
8719
|
}
|
8325
8720
|
function getSmart(...args) {
|
8326
|
-
|
8327
|
-
|
8328
|
-
const root = args[0];
|
8329
|
-
if (u.isElementish(selector)) {
|
8721
|
+
let [root, selector, options] = parseGetArgs(args);
|
8722
|
+
if (u.isElementLike(selector)) {
|
8330
8723
|
return e.get(selector);
|
8331
8724
|
}
|
8332
8725
|
if (root) {
|
8333
|
-
return
|
8726
|
+
return getFirstDescendant(root, selector, options);
|
8334
8727
|
}
|
8335
8728
|
return new up.FragmentFinder({
|
8336
8729
|
selector,
|
@@ -8339,13 +8732,16 @@ up.fragment = (function () {
|
|
8339
8732
|
match: options.match,
|
8340
8733
|
}).find();
|
8341
8734
|
}
|
8342
|
-
function
|
8343
|
-
|
8735
|
+
function getFirstDescendant(...args) {
|
8736
|
+
let [root, selectorString, options] = parseGetArgs(args);
|
8737
|
+
let selector = new up.Selector(selectorString, root, options);
|
8738
|
+
return selector.firstDescendant(root);
|
8739
|
+
}
|
8740
|
+
function parseGetArgs(args) {
|
8741
|
+
return u.args(args, 'val', 'val', 'options');
|
8344
8742
|
}
|
8345
8743
|
function getAll(...args) {
|
8346
|
-
|
8347
|
-
let selectorString = args.pop();
|
8348
|
-
const root = args[0];
|
8744
|
+
let [root, selectorString, options] = parseGetArgs(args);
|
8349
8745
|
if (u.isElement(selectorString)) {
|
8350
8746
|
return [selectorString];
|
8351
8747
|
}
|
@@ -8451,8 +8847,9 @@ up.fragment = (function () {
|
|
8451
8847
|
function cannotTarget(element) {
|
8452
8848
|
throw new up.CannotTarget(untargetableMessage(element));
|
8453
8849
|
}
|
8454
|
-
function tryToTarget(element, options) {
|
8455
|
-
|
8850
|
+
function tryToTarget(element, options = {}) {
|
8851
|
+
let derivers = options.strong ? config.strongTargetDerivers : config.targetDerivers;
|
8852
|
+
return u.findResult(derivers, function (deriver) {
|
8456
8853
|
let target = deriveTarget(element, deriver);
|
8457
8854
|
if (target && isGoodTarget(target, element, options)) {
|
8458
8855
|
return target;
|
@@ -8478,7 +8875,7 @@ up.fragment = (function () {
|
|
8478
8875
|
}
|
8479
8876
|
}
|
8480
8877
|
function deriveTargetFromPattern(element, deriver) {
|
8481
|
-
let { includePath, excludeRaw } =
|
8878
|
+
let { includePath, excludeRaw } = e.parseSelector(deriver);
|
8482
8879
|
if (includePath.length !== 1) {
|
8483
8880
|
throw new up.CannotParse(deriver);
|
8484
8881
|
}
|
@@ -8516,7 +8913,8 @@ up.fragment = (function () {
|
|
8516
8913
|
return result;
|
8517
8914
|
}
|
8518
8915
|
function isGoodTarget(target, element, options = {}) {
|
8519
|
-
|
8916
|
+
let verify = options.verify ?? config.verifyDerivedTarget;
|
8917
|
+
return !isAlive(element) || !verify || up.fragment.get(target, { layer: element, ...options }) === element;
|
8520
8918
|
}
|
8521
8919
|
function matchesPattern(pattern, str) {
|
8522
8920
|
if (u.isRegExp(pattern)) {
|
@@ -8558,7 +8956,7 @@ up.fragment = (function () {
|
|
8558
8956
|
let firstSwappableTarget = toTarget(layer.getFirstSwappableElement(), options);
|
8559
8957
|
targets.unshift(target.replace(LAYER_PSEUDO, firstSwappableTarget));
|
8560
8958
|
}
|
8561
|
-
else if (u.
|
8959
|
+
else if (u.isElementLike(target)) {
|
8562
8960
|
expanded.push(toTarget(target, options));
|
8563
8961
|
}
|
8564
8962
|
else if (u.isString(target)) {
|
@@ -8585,11 +8983,13 @@ up.fragment = (function () {
|
|
8585
8983
|
}
|
8586
8984
|
});
|
8587
8985
|
}
|
8588
|
-
function resolveOrigin(
|
8589
|
-
|
8986
|
+
function resolveOrigin(target, options) {
|
8987
|
+
if (!u.isString(target))
|
8988
|
+
return target;
|
8989
|
+
return (up.migrate.resolveOrigin || modernResolveOrigin)(target, options);
|
8590
8990
|
}
|
8591
8991
|
function splitTarget(target) {
|
8592
|
-
return u.
|
8992
|
+
return u.getComplexTokens(target);
|
8593
8993
|
}
|
8594
8994
|
function parseTargetSteps(target, options = {}) {
|
8595
8995
|
let defaultPlacement = options.defaultPlacement || 'swap';
|
@@ -8601,7 +9001,7 @@ up.fragment = (function () {
|
|
8601
9001
|
continue;
|
8602
9002
|
let placement = defaultPlacement;
|
8603
9003
|
let maybe = defaultMaybe;
|
8604
|
-
selector = selector.replace(/\b::?(before|after)\b/, (_match, customPlacement) => {
|
9004
|
+
selector = selector.replace(/\b::?(before|after|content)\b/, (_match, customPlacement) => {
|
8605
9005
|
placement = customPlacement;
|
8606
9006
|
return '';
|
8607
9007
|
});
|
@@ -8669,13 +9069,13 @@ up.fragment = (function () {
|
|
8669
9069
|
let elements;
|
8670
9070
|
if (options.target) {
|
8671
9071
|
elements = getAll(options.target, options);
|
8672
|
-
testFn = (request) => request.
|
9072
|
+
testFn = (request) => request.isBoundToSubtrees(elements);
|
8673
9073
|
reason ||= 'Aborting requests within fragment';
|
8674
9074
|
}
|
8675
9075
|
else {
|
8676
9076
|
let layers = up.layer.getAll(options);
|
8677
9077
|
elements = u.map(layers, 'element');
|
8678
|
-
testFn = (request) =>
|
9078
|
+
testFn = (request) => request.isBoundToLayers(layers);
|
8679
9079
|
reason ||= 'Aborting requests within ' + layers.join(', ');
|
8680
9080
|
}
|
8681
9081
|
let testFnWithAbortable = (request) => request.abortable && testFn(request);
|
@@ -8690,8 +9090,8 @@ up.fragment = (function () {
|
|
8690
9090
|
up.destructor(fragment, unsubscribe);
|
8691
9091
|
return unsubscribe;
|
8692
9092
|
}
|
8693
|
-
function onFirstIntersect(
|
8694
|
-
if (e.isIntersectingWindow(
|
9093
|
+
function onFirstIntersect(element, callback, { margin = 0 } = {}) {
|
9094
|
+
if (e.isIntersectingWindow(element, { margin })) {
|
8695
9095
|
callback();
|
8696
9096
|
return;
|
8697
9097
|
}
|
@@ -8706,15 +9106,62 @@ up.fragment = (function () {
|
|
8706
9106
|
}
|
8707
9107
|
let observer = new IntersectionObserver(processIntersectEntries, { rootMargin: `${margin}px` });
|
8708
9108
|
let disconnect = () => observer.disconnect();
|
8709
|
-
observer.observe(
|
8710
|
-
|
9109
|
+
observer.observe(element);
|
9110
|
+
up.destructor(element, disconnect);
|
9111
|
+
}
|
9112
|
+
const STARTS_WITH_SELECTOR = /^([\w-]+|\*)?(#|\.|[:[][a-z-]{3,})/;
|
9113
|
+
function provideNodes(value, { origin, originLayer, data, htmlParser = e.createNodesFromHTML } = {}) {
|
9114
|
+
if (u.isString(value) && STARTS_WITH_SELECTOR.test(value)) {
|
9115
|
+
let [parsedValue, parsedData] = u.parseScalarJSONPairs(value)[0];
|
9116
|
+
data = { ...data, ...parsedData };
|
9117
|
+
value = up.fragment.get(parsedValue, { layer: 'closest', origin, originLayer }) || up.fail(`Cannot find template "%s"`, value);
|
9118
|
+
}
|
9119
|
+
if (u.isString(value)) {
|
9120
|
+
value = htmlParser(value);
|
9121
|
+
}
|
9122
|
+
if (isTemplate(value)) {
|
9123
|
+
value = cloneTemplate(value, data, { htmlParser });
|
9124
|
+
}
|
9125
|
+
return u.wrapList(value);
|
9126
|
+
}
|
9127
|
+
function isTemplate(value) {
|
9128
|
+
return u.isElement(value) && value.matches('template, script[type]') && !up.script.isScript(value);
|
9129
|
+
}
|
9130
|
+
function cloneTemplate(templateOrSelector, data = {}, { origin, htmlParser } = {}) {
|
9131
|
+
let template = getSmart(templateOrSelector, { origin }) || up.fail('Template not found: %o', templateOrSelector);
|
9132
|
+
let event = up.emit(template, 'up:template:clone', { data, nodes: null, log: ["Using template %o", templateOrSelector] });
|
9133
|
+
let nodes = event.nodes ?? defaultTemplateNodes(template, htmlParser);
|
9134
|
+
for (let node of nodes) {
|
9135
|
+
node.upTemplateData = data;
|
9136
|
+
}
|
9137
|
+
return nodes;
|
9138
|
+
}
|
9139
|
+
function defaultTemplateNodes(template, htmlParser = e.createNodesFromHTML) {
|
9140
|
+
let templateText = template.innerHTML;
|
9141
|
+
return htmlParser(templateText);
|
9142
|
+
}
|
9143
|
+
function insertTemp(...args) {
|
9144
|
+
let [reference, position = 'beforeend', tempValue] = u.args(args, 'val', u.isAdjacentPosition, 'val');
|
9145
|
+
let tempNodes = provideNodes(tempValue, { origin: reference });
|
9146
|
+
let tempElement = e.wrapIfRequired(tempNodes);
|
9147
|
+
let oldPosition = document.contains(tempElement) && e.documentPosition(tempElement);
|
9148
|
+
reference.insertAdjacentElement(position, tempElement);
|
9149
|
+
if (oldPosition) {
|
9150
|
+
return () => {
|
9151
|
+
oldPosition[0].insertAdjacentElement(oldPosition[1], tempElement);
|
9152
|
+
};
|
9153
|
+
}
|
9154
|
+
else {
|
9155
|
+
up.hello(tempElement);
|
9156
|
+
return () => up.destroy(tempElement);
|
9157
|
+
}
|
8711
9158
|
}
|
8712
9159
|
up.on('up:framework:boot', function () {
|
8713
9160
|
const { documentElement } = document;
|
8714
9161
|
documentElement.setAttribute('up-source', normalizeSource(location.href));
|
8715
9162
|
up.hello(documentElement);
|
8716
9163
|
if (!up.browser.canPushState()) {
|
8717
|
-
return up.warn('Cannot push history changes. Next
|
9164
|
+
return up.warn('Cannot push history changes. Next render pass with history will load a full page.');
|
8718
9165
|
}
|
8719
9166
|
});
|
8720
9167
|
return {
|
@@ -8724,7 +9171,7 @@ up.fragment = (function () {
|
|
8724
9171
|
render,
|
8725
9172
|
navigate,
|
8726
9173
|
get: getSmart,
|
8727
|
-
|
9174
|
+
getFirstDescendant,
|
8728
9175
|
all: getAll,
|
8729
9176
|
subtree: getSubtree,
|
8730
9177
|
contains,
|
@@ -8758,6 +9205,9 @@ up.fragment = (function () {
|
|
8758
9205
|
targetForSteps,
|
8759
9206
|
compressNestedSteps,
|
8760
9207
|
containsMainPseudo,
|
9208
|
+
insertTemp,
|
9209
|
+
provideNodes,
|
9210
|
+
cloneTemplate,
|
8761
9211
|
};
|
8762
9212
|
})();
|
8763
9213
|
up.reload = up.fragment.reload;
|
@@ -8765,6 +9215,7 @@ up.destroy = up.fragment.destroy;
|
|
8765
9215
|
up.render = up.fragment.render;
|
8766
9216
|
up.navigate = up.fragment.navigate;
|
8767
9217
|
up.visit = up.fragment.visit;
|
9218
|
+
up.template = { clone: up.fragment.cloneTemplate };
|
8768
9219
|
u.delegate(up, ['context'], () => up.layer.current);
|
8769
9220
|
|
8770
9221
|
|
@@ -8801,7 +9252,7 @@ up.viewport = (function () {
|
|
8801
9252
|
up.compiler(config.selectorFn('anchoredRightSelectors'), function (element) {
|
8802
9253
|
return bodyShifter.onAnchoredElementInserted(element);
|
8803
9254
|
});
|
8804
|
-
|
9255
|
+
const reveal = up.mockable(function (element, options) {
|
8805
9256
|
options = u.options(options);
|
8806
9257
|
element = f.get(element, options);
|
8807
9258
|
if (!(options.layer = up.layer.get(element))) {
|
@@ -8813,7 +9264,7 @@ up.viewport = (function () {
|
|
8813
9264
|
const motion = new up.RevealMotion(element, options);
|
8814
9265
|
motion.start();
|
8815
9266
|
return up.migrate.formerlyAsync?.('up.reveal()') || true;
|
8816
|
-
}
|
9267
|
+
});
|
8817
9268
|
function doFocus(element, { preventScroll, force, inputDevice, focusVisible } = {}) {
|
8818
9269
|
if (force) {
|
8819
9270
|
if (!element.hasAttribute('tabindex') && element.tabIndex === -1) {
|
@@ -8846,7 +9297,7 @@ up.viewport = (function () {
|
|
8846
9297
|
function revealHash(hash = location.hash, options) {
|
8847
9298
|
let match = firstHashTarget(hash, options);
|
8848
9299
|
if (match) {
|
8849
|
-
return
|
9300
|
+
return reveal(match, { top: true });
|
8850
9301
|
}
|
8851
9302
|
}
|
8852
9303
|
function allSelector() {
|
@@ -8950,11 +9401,11 @@ up.viewport = (function () {
|
|
8950
9401
|
return new up.FIFOCache({ capacity: 30, normalizeKey: u.matchableURL });
|
8951
9402
|
}
|
8952
9403
|
function parseOptions(args) {
|
8953
|
-
const options = u.
|
9404
|
+
const [reference, options] = u.args(args, 'val', 'options');
|
8954
9405
|
options.layer = up.layer.get(options);
|
8955
9406
|
let viewports;
|
8956
|
-
if (
|
8957
|
-
viewports = [closest(
|
9407
|
+
if (reference) {
|
9408
|
+
viewports = [closest(reference, options)];
|
8958
9409
|
}
|
8959
9410
|
else if (options.around) {
|
8960
9411
|
viewports = getAround(options.around, options);
|
@@ -9014,7 +9465,7 @@ up.viewport = (function () {
|
|
9014
9465
|
function firstHashTarget(hash, options = {}) {
|
9015
9466
|
if (hash = pureHash(hash)) {
|
9016
9467
|
const selector = [
|
9017
|
-
e.
|
9468
|
+
e.idSelector(hash),
|
9018
9469
|
'a' + e.attrSelector('name', hash)
|
9019
9470
|
].join();
|
9020
9471
|
return f.get(selector, options);
|
@@ -9040,16 +9491,19 @@ up.viewport = (function () {
|
|
9040
9491
|
}
|
9041
9492
|
return to;
|
9042
9493
|
}
|
9043
|
-
|
9044
|
-
|
9045
|
-
|
9046
|
-
u.task(function () {
|
9047
|
-
if (!userScrolled) {
|
9048
|
-
return revealHash();
|
9049
|
-
}
|
9050
|
-
});
|
9494
|
+
document.addEventListener('DOMContentLoaded', function () {
|
9495
|
+
revealHash();
|
9496
|
+
u.task(revealHash);
|
9051
9497
|
});
|
9052
9498
|
up.on(window, 'hashchange', () => revealHash());
|
9499
|
+
up.on('up:click', 'a[href^="#"]', function (event, link) {
|
9500
|
+
if (link.hash !== location.hash)
|
9501
|
+
return;
|
9502
|
+
if (up.link.isFollowable(link))
|
9503
|
+
return;
|
9504
|
+
if (revealHash(link.hash))
|
9505
|
+
up.event.halt(event);
|
9506
|
+
});
|
9053
9507
|
return {
|
9054
9508
|
reveal,
|
9055
9509
|
revealHash,
|
@@ -9374,7 +9828,7 @@ up.network = (function () {
|
|
9374
9828
|
cacheSize: 70,
|
9375
9829
|
cacheExpireAge: 15 * 1000,
|
9376
9830
|
cacheEvictAge: 90 * 60 * 1000,
|
9377
|
-
|
9831
|
+
lateDelay: 400,
|
9378
9832
|
fail(response) { return (response.status < 200 || response.status > 299) && response.status !== 304; },
|
9379
9833
|
autoCache(request) { return request.isSafe(); },
|
9380
9834
|
expireCache(request, _response) { return !request.isSafe(); },
|
@@ -9399,10 +9853,7 @@ up.network = (function () {
|
|
9399
9853
|
return request;
|
9400
9854
|
}
|
9401
9855
|
function parseRequestOptions(args) {
|
9402
|
-
|
9403
|
-
if (!options.url) {
|
9404
|
-
options.url = args[0];
|
9405
|
-
}
|
9856
|
+
let options = u.parseArgIntoOptions(args, 'url');
|
9406
9857
|
up.migrate.handleRequestOptions?.(options);
|
9407
9858
|
return options;
|
9408
9859
|
}
|
@@ -9550,7 +10001,7 @@ up.layer = (function () {
|
|
9550
10001
|
openAnimation: 'fade-in',
|
9551
10002
|
closeAnimation: 'fade-out',
|
9552
10003
|
dismissLabel: '×',
|
9553
|
-
|
10004
|
+
dismissARIALabel: 'Dismiss dialog',
|
9554
10005
|
dismissable: true,
|
9555
10006
|
history: 'auto',
|
9556
10007
|
trapFocus: true,
|
@@ -9630,10 +10081,7 @@ up.layer = (function () {
|
|
9630
10081
|
}
|
9631
10082
|
}
|
9632
10083
|
}
|
9633
|
-
else if (options.
|
9634
|
-
options.layer = 'new';
|
9635
|
-
}
|
9636
|
-
else if (u.isElementish(options.target)) {
|
10084
|
+
else if (u.isElementLike(options.target)) {
|
9637
10085
|
options.layer = stack.get(options.target, { normalizeLayerOptions: false });
|
9638
10086
|
}
|
9639
10087
|
else if (options.origin) {
|
@@ -9834,7 +10282,7 @@ up.link = (function () {
|
|
9834
10282
|
parser.boolean('abortable');
|
9835
10283
|
parser.boolean('background');
|
9836
10284
|
parser.string('contentType');
|
9837
|
-
parser.
|
10285
|
+
parser.booleanOrNumber('lateDelay');
|
9838
10286
|
parser.number('timeout');
|
9839
10287
|
return options;
|
9840
10288
|
}
|
@@ -9843,7 +10291,6 @@ up.link = (function () {
|
|
9843
10291
|
options = u.options(options);
|
9844
10292
|
const parser = new up.OptionsParser(link, options, { fail: true, ...parserOptions });
|
9845
10293
|
parser.include(parseRequestOptions);
|
9846
|
-
parser.boolean('feedback');
|
9847
10294
|
options.origin ||= link;
|
9848
10295
|
parser.boolean('fail');
|
9849
10296
|
parser.boolean('navigate', { default: true });
|
@@ -9851,11 +10298,12 @@ up.link = (function () {
|
|
9851
10298
|
parser.string('target');
|
9852
10299
|
parser.booleanOrString('fallback');
|
9853
10300
|
parser.string('match');
|
9854
|
-
parser.string('content');
|
9855
|
-
parser.string('fragment');
|
9856
10301
|
parser.string('document');
|
9857
|
-
parser.
|
9858
|
-
parser.
|
10302
|
+
parser.string('fragment');
|
10303
|
+
parser.string('content');
|
10304
|
+
parser.boolean('keep', { attr: 'up-use-keep' });
|
10305
|
+
parser.boolean('hungry', { attr: 'up-use-hungry' });
|
10306
|
+
parser.json('data', { attr: 'up-use-data' });
|
9859
10307
|
parser.callback('onLoaded');
|
9860
10308
|
parser.callback('onRendered', { mainKey: 'result' });
|
9861
10309
|
parser.callback('onFinished', { mainKey: 'result' });
|
@@ -9879,6 +10327,7 @@ up.link = (function () {
|
|
9879
10327
|
parser.string('acceptLocation');
|
9880
10328
|
parser.string('dismissLocation');
|
9881
10329
|
parser.booleanOrString('history');
|
10330
|
+
parser.include(up.status.statusOptions);
|
9882
10331
|
parser.booleanOrString('focus');
|
9883
10332
|
parser.boolean('saveScroll');
|
9884
10333
|
parser.boolean('saveFocus');
|
@@ -9905,10 +10354,15 @@ up.link = (function () {
|
|
9905
10354
|
}
|
9906
10355
|
const guardEvent = up.event.build('up:link:preload', { log: ['Preloading link %o', link] });
|
9907
10356
|
return follow(link, {
|
10357
|
+
abort: false,
|
9908
10358
|
abortable: false,
|
10359
|
+
background: true,
|
10360
|
+
cache: true,
|
10361
|
+
...up.RenderOptions.NO_INPUT_INTERFERENCE,
|
10362
|
+
...up.RenderOptions.NO_PREVIEWS,
|
9909
10363
|
...options,
|
9910
10364
|
guardEvent,
|
9911
|
-
preload: true
|
10365
|
+
preload: true,
|
9912
10366
|
});
|
9913
10367
|
}
|
9914
10368
|
function preloadIssue(link) {
|
@@ -10031,7 +10485,7 @@ up.link = (function () {
|
|
10031
10485
|
return follow(link, forcedOptions, { defaults });
|
10032
10486
|
}
|
10033
10487
|
up.attribute('up-defer', { defaultValue: 'insert' }, function (link, condition) {
|
10034
|
-
let doLoad = () => up.error.muteUncriticalRejection(loadDeferred(link));
|
10488
|
+
let doLoad = (options) => up.error.muteUncriticalRejection(loadDeferred(link, options));
|
10035
10489
|
onLoadCondition(condition, link, doLoad);
|
10036
10490
|
});
|
10037
10491
|
up.on('up:click', config.selectorFn('followSelectors'), function (event, link) {
|
@@ -10048,14 +10502,16 @@ up.link = (function () {
|
|
10048
10502
|
'up-href': e.attr(childLink, 'href'),
|
10049
10503
|
...e.upAttrs(childLink)
|
10050
10504
|
});
|
10051
|
-
|
10505
|
+
e.addClasses(area, e.upClasses(childLink));
|
10052
10506
|
makeFollowable(area);
|
10053
10507
|
}
|
10054
10508
|
});
|
10055
10509
|
up.compiler(config.selectorFn('preloadSelectors'), function (link) {
|
10056
10510
|
if (!isPreloadDisabled(link)) {
|
10057
|
-
let doPreload = () => up.error.muteUncriticalRejection(preload(link));
|
10058
|
-
let condition = e.booleanOrStringAttr(link, 'up-preload'
|
10511
|
+
let doPreload = (options) => up.error.muteUncriticalRejection(preload(link, options));
|
10512
|
+
let condition = e.booleanOrStringAttr(link, 'up-preload');
|
10513
|
+
if (condition === true || u.isUndefined(condition))
|
10514
|
+
condition = 'hover';
|
10059
10515
|
onLoadCondition(condition, link, doPreload);
|
10060
10516
|
}
|
10061
10517
|
});
|
@@ -10096,10 +10552,11 @@ up.form = (function () {
|
|
10096
10552
|
const e = up.element;
|
10097
10553
|
const config = new up.Config(() => ({
|
10098
10554
|
groupSelectors: ['[up-form-group]', 'fieldset', 'label', 'form'],
|
10099
|
-
fieldSelectors: ['select', 'input:not([type=submit]
|
10555
|
+
fieldSelectors: ['select', 'input:not([type=submit], [type=image], [type=button])', 'button[type]:not([type=submit], [type=button])', 'textarea'],
|
10100
10556
|
submitSelectors: ['form:is([up-submit], [up-target], [up-layer], [up-transition])'],
|
10101
10557
|
noSubmitSelectors: ['[up-submit=false]', '[target]', e.crossOriginSelector('action')],
|
10102
10558
|
submitButtonSelectors: ['input[type=submit]', 'input[type=image]', 'button[type=submit]', 'button:not([type])'],
|
10559
|
+
genericButtonSelectors: ['input[type=button]', 'button[type=button]'],
|
10103
10560
|
watchInputEvents: ['input', 'change'],
|
10104
10561
|
watchInputDelay: 0,
|
10105
10562
|
watchChangeEvents: ['change'],
|
@@ -10124,6 +10581,9 @@ up.form = (function () {
|
|
10124
10581
|
function findSubmitButtons(root) {
|
10125
10582
|
return e.subtree(root, submitButtonSelector());
|
10126
10583
|
}
|
10584
|
+
function findGenericButtons(root) {
|
10585
|
+
return e.subtree(root, config.selector('genericButtonSelectors'));
|
10586
|
+
}
|
10127
10587
|
function isSubmitButton(element) {
|
10128
10588
|
return element?.matches(submitButtonSelector());
|
10129
10589
|
}
|
@@ -10139,7 +10599,6 @@ up.form = (function () {
|
|
10139
10599
|
let parser = new up.OptionsParser(form, options, parserOptions);
|
10140
10600
|
parser.include(destinationOptions);
|
10141
10601
|
parser.string('failTarget', { default: up.fragment.tryToTarget(form) });
|
10142
|
-
parser.booleanOrString('disable');
|
10143
10602
|
options.guardEvent ||= up.event.build('up:form:submit', {
|
10144
10603
|
submitButton: options.submitButton,
|
10145
10604
|
log: 'Submitting form',
|
@@ -10147,14 +10606,14 @@ up.form = (function () {
|
|
10147
10606
|
form,
|
10148
10607
|
});
|
10149
10608
|
options.origin ||= up.viewport.focusedElementWithin(form) || options.submitButton || form;
|
10609
|
+
options.activeElements = u.uniq([options.origin, options.submitButton, form].filter(u.isElement));
|
10150
10610
|
parser.include(up.link.followOptions);
|
10151
10611
|
return options;
|
10152
10612
|
}
|
10153
10613
|
function watchOptions(field, options, parserOptions = {}) {
|
10154
10614
|
options = u.options(options);
|
10155
10615
|
let parser = new up.OptionsParser(field, options, { ...parserOptions, closest: true, attrPrefix: 'up-watch-' });
|
10156
|
-
parser.
|
10157
|
-
parser.booleanOrString('disable');
|
10616
|
+
parser.include(up.status.statusOptions);
|
10158
10617
|
parser.string('event');
|
10159
10618
|
parser.number('delay');
|
10160
10619
|
let config = up.form.config;
|
@@ -10169,61 +10628,52 @@ up.form = (function () {
|
|
10169
10628
|
return options;
|
10170
10629
|
}
|
10171
10630
|
function disableContainer(container) {
|
10172
|
-
let
|
10631
|
+
let controls = [
|
10632
|
+
...findFields(container),
|
10633
|
+
...findSubmitButtons(container),
|
10634
|
+
...findGenericButtons(container),
|
10635
|
+
];
|
10636
|
+
return u.sequence(u.map(controls, disableControl));
|
10637
|
+
}
|
10638
|
+
function disableControl(control) {
|
10639
|
+
if (control.disabled)
|
10640
|
+
return;
|
10173
10641
|
let focusFallback;
|
10174
|
-
|
10175
|
-
|
10176
|
-
|
10177
|
-
focusFallback = findGroup(focusedElement);
|
10178
|
-
}
|
10179
|
-
raiseDisableStack(control);
|
10180
|
-
}
|
10181
|
-
if (focusFallback) {
|
10642
|
+
if (document.activeElement === control) {
|
10643
|
+
focusFallback = findGroup(control);
|
10644
|
+
control.disabled = true;
|
10182
10645
|
up.focus(focusFallback, { force: true, preventScroll: true });
|
10183
10646
|
}
|
10184
|
-
|
10185
|
-
|
10186
|
-
};
|
10187
|
-
}
|
10188
|
-
function raiseDisableStack(control) {
|
10189
|
-
if (!control.upDisableCount) {
|
10190
|
-
control.upDisableCount ||= 0;
|
10191
|
-
control.upOriginalDisabled = control.disabled;
|
10192
|
-
}
|
10193
|
-
control.upDisableCount++;
|
10194
|
-
control.disabled = true;
|
10195
|
-
}
|
10196
|
-
function lowerDisableStack(control) {
|
10197
|
-
if (control.upDisableCount) {
|
10198
|
-
if (!control.disabled) {
|
10199
|
-
control.upDisableCount = 0;
|
10200
|
-
}
|
10201
|
-
else {
|
10202
|
-
control.upDisableCount--;
|
10203
|
-
if (!control.upDisableCount) {
|
10204
|
-
control.disabled = control.upOriginalDisabled;
|
10205
|
-
}
|
10206
|
-
}
|
10647
|
+
else {
|
10648
|
+
control.disabled = true;
|
10207
10649
|
}
|
10650
|
+
return () => { control.disabled = false; };
|
10208
10651
|
}
|
10209
|
-
function
|
10210
|
-
let
|
10211
|
-
u.always(promise, undoDisable);
|
10212
|
-
}
|
10213
|
-
function handleDisableOption({ disable, origin }) {
|
10214
|
-
if (!disable)
|
10215
|
-
return u.noop;
|
10216
|
-
let missingOption = (key) => { up.fail("Cannot process { disable: '%s' } option without { %s }", disable, key); };
|
10217
|
-
let getOrigin = () => origin || missingOption('origin');
|
10218
|
-
let getOriginForm = () => getScope(getOrigin());
|
10219
|
-
let containers;
|
10652
|
+
function getDisableContainers(disable, origin) {
|
10653
|
+
let originScope = () => getScope(origin);
|
10220
10654
|
if (disable === true) {
|
10221
|
-
|
10655
|
+
return [originScope()];
|
10656
|
+
}
|
10657
|
+
else if (u.isElement(disable)) {
|
10658
|
+
return [disable];
|
10222
10659
|
}
|
10223
10660
|
else if (u.isString(disable)) {
|
10224
|
-
|
10661
|
+
return up.fragment.subtree(originScope(), disable, { origin });
|
10662
|
+
}
|
10663
|
+
else if (u.isArray(disable)) {
|
10664
|
+
return u.flatMap(disable, (d) => getDisableContainers(d, origin));
|
10225
10665
|
}
|
10226
|
-
|
10666
|
+
else {
|
10667
|
+
return [];
|
10668
|
+
}
|
10669
|
+
}
|
10670
|
+
function getDisablePreviewFn(disable, origin) {
|
10671
|
+
return function (preview) {
|
10672
|
+
let containers = getDisableContainers(disable, origin);
|
10673
|
+
for (let container of containers) {
|
10674
|
+
preview.disable(container);
|
10675
|
+
}
|
10676
|
+
};
|
10227
10677
|
}
|
10228
10678
|
function destinationOptions(form, options, parserOptions) {
|
10229
10679
|
options = u.options(options);
|
@@ -10251,10 +10701,10 @@ up.form = (function () {
|
|
10251
10701
|
}
|
10252
10702
|
return options;
|
10253
10703
|
}
|
10254
|
-
function watch(
|
10704
|
+
function watch(...args) {
|
10705
|
+
let [root, options, callback] = u.args(args, 'val', 'options', 'callback');
|
10255
10706
|
root = up.element.get(root);
|
10256
|
-
|
10257
|
-
let options = u.extractOptions(args);
|
10707
|
+
callback ||= watchCallbackFromElement(root) || up.fail('No callback given for up.watch()');
|
10258
10708
|
const watcher = new up.FieldWatcher(root, options, callback);
|
10259
10709
|
watcher.start();
|
10260
10710
|
return () => watcher.stop();
|
@@ -10262,12 +10712,12 @@ up.form = (function () {
|
|
10262
10712
|
function watchCallbackFromElement(element) {
|
10263
10713
|
let rawCallback = element.getAttribute('up-watch');
|
10264
10714
|
if (rawCallback) {
|
10265
|
-
return up.NonceableCallback.fromString(rawCallback).toFunction('value', 'name').bind(element);
|
10715
|
+
return up.NonceableCallback.fromString(rawCallback).toFunction('value', 'name', 'options').bind(element);
|
10266
10716
|
}
|
10267
10717
|
}
|
10268
10718
|
function autosubmit(target, options = {}) {
|
10269
10719
|
const onChange = (_diff, renderOptions) => submit(target, renderOptions);
|
10270
|
-
return watch(target, { options, batch: true }, onChange);
|
10720
|
+
return watch(target, { ...options, batch: true }, onChange);
|
10271
10721
|
}
|
10272
10722
|
function getGroupSelectors() {
|
10273
10723
|
return up.migrate.migratedFormGroupSelectors?.() || config.groupSelectors;
|
@@ -10279,10 +10729,10 @@ up.form = (function () {
|
|
10279
10729
|
return u.findResult(getGroupSelectors(), function (groupSelector) {
|
10280
10730
|
let group = field.closest(groupSelector);
|
10281
10731
|
if (group) {
|
10282
|
-
let
|
10732
|
+
let strongDerivedGroupTarget = up.fragment.tryToTarget(group, { strong: true });
|
10283
10733
|
let goodDerivedFieldTarget = up.fragment.tryToTarget(field);
|
10284
10734
|
let groupHasFieldTarget = goodDerivedFieldTarget && (group !== field) && `${groupSelector}:has(${goodDerivedFieldTarget})`;
|
10285
|
-
let target =
|
10735
|
+
let target = strongDerivedGroupTarget || groupHasFieldTarget;
|
10286
10736
|
if (target) {
|
10287
10737
|
return {
|
10288
10738
|
target,
|
@@ -10374,7 +10824,7 @@ up.form = (function () {
|
|
10374
10824
|
target.classList.add('up-switched');
|
10375
10825
|
});
|
10376
10826
|
function parseSwitchTokens(str) {
|
10377
|
-
return u.
|
10827
|
+
return u.getSimpleTokens(str, { json: true });
|
10378
10828
|
}
|
10379
10829
|
function findSwitcherForTarget(target) {
|
10380
10830
|
const form = getScope(target);
|
@@ -10389,8 +10839,13 @@ up.form = (function () {
|
|
10389
10839
|
const element = up.fragment.get(elementOrSelector, options);
|
10390
10840
|
return element.form || element.closest('form');
|
10391
10841
|
}
|
10392
|
-
function getScope(
|
10393
|
-
|
10842
|
+
function getScope(origin, options) {
|
10843
|
+
if (origin) {
|
10844
|
+
return getForm(origin, options) || up.layer.get(origin).element;
|
10845
|
+
}
|
10846
|
+
else {
|
10847
|
+
return up.layer.current.element;
|
10848
|
+
}
|
10394
10849
|
}
|
10395
10850
|
function focusedField() {
|
10396
10851
|
return u.presence(document.activeElement, isField);
|
@@ -10442,8 +10897,8 @@ up.form = (function () {
|
|
10442
10897
|
submitButtons: findSubmitButtons,
|
10443
10898
|
focusedField,
|
10444
10899
|
switchTarget,
|
10445
|
-
disableWhile,
|
10446
10900
|
disable: disableContainer,
|
10901
|
+
getDisablePreviewFn,
|
10447
10902
|
group: findGroup,
|
10448
10903
|
groupSolution: findGroupSolution,
|
10449
10904
|
groupSelectors: getGroupSelectors,
|
@@ -10461,22 +10916,24 @@ up.validate = up.form.validate;
|
|
10461
10916
|
/* 98 */
|
10462
10917
|
/***/ (() => {
|
10463
10918
|
|
10464
|
-
up.
|
10919
|
+
up.status = (function () {
|
10465
10920
|
const u = up.util;
|
10466
10921
|
const e = up.element;
|
10922
|
+
let namedPreviewFns = {};
|
10467
10923
|
const config = new up.Config(() => ({
|
10468
10924
|
currentClasses: ['up-current'],
|
10925
|
+
activeClasses: ['up-active'],
|
10926
|
+
loadingClasses: ['up-loading'],
|
10469
10927
|
navSelectors: ['[up-nav]', 'nav'],
|
10470
10928
|
noNavSelectors: ['[up-nav=false]'],
|
10471
10929
|
}));
|
10472
10930
|
function reset() {
|
10473
10931
|
up.layer.root.feedbackLocation = null;
|
10932
|
+
namedPreviewFns = u.pickBy(namedPreviewFns, 'isDefault');
|
10474
10933
|
}
|
10475
|
-
const CLASS_ACTIVE = 'up-active';
|
10476
|
-
const CLASS_LOADING = 'up-loading';
|
10477
10934
|
const SELECTOR_LINK = 'a, [up-href]';
|
10478
|
-
function
|
10479
|
-
return link.
|
10935
|
+
function linkCurrentURLs(link) {
|
10936
|
+
return link.upCurrentURLs ||= new up.LinkCurrentURLs(link);
|
10480
10937
|
}
|
10481
10938
|
function updateFragment(fragment, { layer } = {}) {
|
10482
10939
|
layer ||= up.layer.get(fragment);
|
@@ -10485,11 +10942,11 @@ up.feedback = (function () {
|
|
10485
10942
|
const navLinkSelector = `${navSelector} :is(${SELECTOR_LINK}), ${navSelector}:is(${SELECTOR_LINK})`;
|
10486
10943
|
const links = up.fragment.all(navLinkSelector, { layer });
|
10487
10944
|
for (let link of links) {
|
10488
|
-
const isCurrent =
|
10945
|
+
const isCurrent = linkCurrentURLs(link).isCurrent(layerLocation);
|
10489
10946
|
for (let currentClass of config.currentClasses) {
|
10490
10947
|
link.classList.toggle(currentClass, isCurrent);
|
10491
10948
|
}
|
10492
|
-
e.
|
10949
|
+
e.setAttrPresence(link, 'aria-current', 'page', isCurrent);
|
10493
10950
|
}
|
10494
10951
|
}
|
10495
10952
|
function getMatchableLayerLocation(layer) {
|
@@ -10498,24 +10955,88 @@ up.feedback = (function () {
|
|
10498
10955
|
function findActivatableArea(element) {
|
10499
10956
|
return e.ancestor(element, SELECTOR_LINK) || element;
|
10500
10957
|
}
|
10501
|
-
function
|
10502
|
-
|
10958
|
+
function runPreviews(request, renderOptions) {
|
10959
|
+
let { bindLayer } = request;
|
10960
|
+
let focusCapsule = up.FocusCapsule.preserve(bindLayer);
|
10961
|
+
let applyPreviews = () => doRunPreviews(request, renderOptions);
|
10962
|
+
let revertPreviews = bindLayer.asCurrent(applyPreviews);
|
10963
|
+
up.on('focusin', { once: true }, () => focusCapsule = null);
|
10964
|
+
return () => {
|
10965
|
+
bindLayer.asCurrent(revertPreviews);
|
10966
|
+
focusCapsule?.restore(bindLayer, { preventScroll: true });
|
10967
|
+
};
|
10968
|
+
}
|
10969
|
+
function doRunPreviews(request, renderOptions) {
|
10970
|
+
let { fragment, fragments, origin } = request;
|
10971
|
+
let cleaner = u.cleaner();
|
10972
|
+
let previewForFragment = (fragment) => new up.Preview({ fragment, request, renderOptions, cleaner });
|
10973
|
+
let singlePreview = previewForFragment(fragment);
|
10974
|
+
singlePreview.run(resolvePreviewFns(renderOptions.preview));
|
10975
|
+
singlePreview.run(getPlaceholderPreviewFn(renderOptions.placeholder));
|
10976
|
+
singlePreview.run(getFeedbackClassesPreviewFn(renderOptions.feedback, fragments));
|
10977
|
+
singlePreview.run(up.form.getDisablePreviewFn(renderOptions.disable, origin));
|
10978
|
+
for (let fragment of fragments) {
|
10979
|
+
let eachPreview = previewForFragment(fragment);
|
10980
|
+
eachPreview.run(e.matchSelectorMap(renderOptions.previewMap, fragment));
|
10981
|
+
eachPreview.run(e.matchSelectorMap(renderOptions.placeholderMap, fragment).flatMap(getPlaceholderPreviewFn));
|
10982
|
+
}
|
10983
|
+
return cleaner.clean;
|
10984
|
+
}
|
10985
|
+
function getPlaceholderPreviewFn(placeholder) {
|
10986
|
+
if (!placeholder)
|
10503
10987
|
return;
|
10988
|
+
return function (preview) {
|
10989
|
+
preview.showPlaceholder(placeholder);
|
10990
|
+
};
|
10991
|
+
}
|
10992
|
+
function resolvePreviewFns(value) {
|
10993
|
+
if (u.isFunction(value)) {
|
10994
|
+
return [value];
|
10995
|
+
}
|
10996
|
+
else if (u.isString(value)) {
|
10997
|
+
return resolvePreviewString(value);
|
10504
10998
|
}
|
10505
|
-
|
10506
|
-
|
10507
|
-
if (activeElement) {
|
10508
|
-
clean(e.addTemporaryClass(activeElement, CLASS_ACTIVE));
|
10999
|
+
else if (u.isArray(value)) {
|
11000
|
+
return value.flatMap(resolvePreviewFns);
|
10509
11001
|
}
|
10510
|
-
|
10511
|
-
|
11002
|
+
else {
|
11003
|
+
return [];
|
10512
11004
|
}
|
10513
11005
|
}
|
10514
|
-
function
|
10515
|
-
|
10516
|
-
|
10517
|
-
return
|
10518
|
-
|
11006
|
+
function resolvePreviewString(str) {
|
11007
|
+
return u.map(u.parseScalarJSONPairs(str), ([name, parsedOptions]) => {
|
11008
|
+
let previewFn = namedPreviewFns[name] || up.fail('Unknown preview "%s"', name);
|
11009
|
+
return function (preview, runOptions) {
|
11010
|
+
up.puts('[up-preview]', 'Showing preview %o', name);
|
11011
|
+
return previewFn(preview, parsedOptions || runOptions);
|
11012
|
+
};
|
11013
|
+
});
|
11014
|
+
}
|
11015
|
+
function getActiveElements({ origin, activeElements }) {
|
11016
|
+
activeElements ||= u.wrapList(origin);
|
11017
|
+
return activeElements.map(findActivatableArea);
|
11018
|
+
}
|
11019
|
+
function registerPreview(name, previewFn) {
|
11020
|
+
previewFn.isDefault = up.framework.evaling;
|
11021
|
+
namedPreviewFns[name] = previewFn;
|
11022
|
+
}
|
11023
|
+
function getFeedbackClassesPreviewFn(feedbackOption, fragments) {
|
11024
|
+
if (!feedbackOption)
|
11025
|
+
return;
|
11026
|
+
return function (preview) {
|
11027
|
+
preview.addClassBatch(getActiveElements(preview.renderOptions), config.activeClasses);
|
11028
|
+
preview.addClassBatch(fragments, config.loadingClasses);
|
11029
|
+
};
|
11030
|
+
}
|
11031
|
+
function statusOptions(element, options, parserOptions) {
|
11032
|
+
options = u.options(options);
|
11033
|
+
const parser = new up.OptionsParser(element, options, parserOptions);
|
11034
|
+
parser.booleanOrString('disable');
|
11035
|
+
parser.boolean('feedback');
|
11036
|
+
parser.string('preview');
|
11037
|
+
parser.booleanOrString('revalidatePreview');
|
11038
|
+
parser.string('placeholder');
|
11039
|
+
return options;
|
10519
11040
|
}
|
10520
11041
|
function updateLayerIfLocationChanged(layer) {
|
10521
11042
|
const processedLocation = layer.feedbackLocation;
|
@@ -10543,9 +11064,13 @@ up.feedback = (function () {
|
|
10543
11064
|
up.on('up:framework:reset', reset);
|
10544
11065
|
return {
|
10545
11066
|
config,
|
10546
|
-
|
11067
|
+
preview: registerPreview,
|
11068
|
+
resolvePreviewFns,
|
11069
|
+
runPreviews,
|
11070
|
+
statusOptions,
|
10547
11071
|
};
|
10548
11072
|
})();
|
11073
|
+
up.preview = up.status.preview;
|
10549
11074
|
|
10550
11075
|
|
10551
11076
|
/***/ }),
|
@@ -10560,9 +11085,9 @@ up.radio = (function () {
|
|
10560
11085
|
pollInterval: 30000,
|
10561
11086
|
}));
|
10562
11087
|
function hungrySteps(renderOptions) {
|
10563
|
-
let {
|
11088
|
+
let { hungry, origin, layer: renderLayer, meta } = renderOptions;
|
10564
11089
|
let steps = { current: [], other: [] };
|
10565
|
-
if (!
|
11090
|
+
if (!hungry)
|
10566
11091
|
return steps;
|
10567
11092
|
let hungrySelector = config.selector('hungrySelectors');
|
10568
11093
|
const layerPreference = [renderLayer, ...renderLayer.ancestors, ...renderLayer.descendants];
|
@@ -10586,8 +11111,9 @@ up.radio = (function () {
|
|
10586
11111
|
origin,
|
10587
11112
|
...motionOptions,
|
10588
11113
|
placement: 'swap',
|
10589
|
-
|
11114
|
+
keep: true,
|
10590
11115
|
maybe: true,
|
11116
|
+
meta,
|
10591
11117
|
selectEvent,
|
10592
11118
|
selectCallback,
|
10593
11119
|
originalRenderOptions: renderOptions,
|
@@ -10613,6 +11139,7 @@ up.radio = (function () {
|
|
10613
11139
|
parser.number('interval', { default: config.pollInterval });
|
10614
11140
|
parser.string('ifLayer', { default: 'front' });
|
10615
11141
|
parser.include(up.link.requestOptions);
|
11142
|
+
parser.include(up.status.statusOptions);
|
10616
11143
|
return options;
|
10617
11144
|
}
|
10618
11145
|
up.attribute('up-poll', function (fragment) {
|