unpoly-rails 0.54.1 → 0.55.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of unpoly-rails might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +27 -0
- data/dist/unpoly.js +207 -96
- data/dist/unpoly.min.js +3 -3
- data/lib/assets/javascripts/unpoly/browser.coffee.erb +0 -1
- data/lib/assets/javascripts/unpoly/classes/extract_cascade.coffee +10 -22
- data/lib/assets/javascripts/unpoly/classes/extract_plan.coffee +57 -17
- data/lib/assets/javascripts/unpoly/classes/extract_step.coffee +4 -0
- data/lib/assets/javascripts/unpoly/link.coffee.erb +2 -2
- data/lib/assets/javascripts/unpoly/util.coffee +77 -26
- data/lib/unpoly/rails/version.rb +1 -1
- data/package.json +1 -1
- data/spec_app/Gemfile +1 -0
- data/spec_app/Gemfile.lock +3 -2
- data/spec_app/spec/javascripts/helpers/to_match_text.js.coffee +10 -0
- data/spec_app/spec/javascripts/up/dom_spec.js.coffee +331 -0
- data/spec_app/spec/javascripts/up/radio_spec.js.coffee +22 -0
- data/spec_app/spec/javascripts/up/util_spec.js.coffee +165 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1fdee33cdc0082856a8323e4b98743dc38231346dd10a166c8abadaa03b70663
|
4
|
+
data.tar.gz: ebd311b2afaedf289c35de0ed0b56d5e4ad6da81ba927ca174ecc44f2d192c7d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a2b40fc88ec64615aec1360710d669e9757c88673af1a0c319c37df744caf7838fd707638fd56634129564851c95881dca35e4890d449a5f77af9ad5e524c81d
|
7
|
+
data.tar.gz: d5d04c17594f151a4104dfbac2e3280d9776b39b4fe653f36fce3ea8587dcbc877c3cab683ca20f22a586df87400e9ac839bde2233ac588ff388765599990cdd
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,33 @@ Changes to this project will be documented in this file.
|
|
6
6
|
This project mostly adheres to [Semantic Versioning](http://semver.org/).
|
7
7
|
|
8
8
|
|
9
|
+
Unreleased
|
10
|
+
----------
|
11
|
+
|
12
|
+
### Fragment updates
|
13
|
+
|
14
|
+
- Unpoly now detects when an [`[up-target]`](/up-target) with multiple selectors would [replace](/up.replace) the same element multiple times. In such a case the target selector will be shortened to contain the element once.
|
15
|
+
- Unpoly now detects when an [`[up-target]`](/up-target) with multiple selectors contains nested elements. In such a case the target selector will be shortened to only contain the outmost element.
|
16
|
+
|
17
|
+
|
18
|
+
### Utility functions
|
19
|
+
|
20
|
+
- [`up.util.uniq()`](/up.util.uniq) now works on DOM elements and other object references.
|
21
|
+
- New experimental function [`up.util.uniqBy()`](/up.util.uniqBy). This function is like [`uniq`](/up.util.uniq), accept that the given function is invoked for each element to generate the value for which uniquness is computed.
|
22
|
+
- Changes to [utility functions](/up.util) that work on lists ([`up.util.each()`](/up.util.each), [`up.util.map()`](/up.util.map), [`up.util.all()`](/up.util.all), [`up.util.any()`](/up.util.any), [`up.util.select()`](/up.util.select), [`up.util.reject()`](/up.util.reject)):
|
23
|
+
- List functions now accept a property name instead of a mapping function:
|
24
|
+
|
25
|
+
```
|
26
|
+
users = [{ name: 'foo' }, { name: 'bar' }]
|
27
|
+
up.util.map(users, 'name') // ['foo', 'bar']
|
28
|
+
```
|
29
|
+
- List functions now pass the iteration index as a second argument to the given function:
|
30
|
+
|
31
|
+
```
|
32
|
+
users = [{ name: 'foo' }, { name: 'bar' }]
|
33
|
+
up.util.map(users, function(user, index) { return index }) // [0, 1]
|
34
|
+
```
|
35
|
+
|
9
36
|
0.54.1
|
10
37
|
------
|
11
38
|
|
data/dist/unpoly.js
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
(function() {
|
7
7
|
window.up = {
|
8
|
-
version: "0.
|
8
|
+
version: "0.55.0",
|
9
9
|
renamedModule: function(oldName, newName) {
|
10
10
|
return typeof Object.defineProperty === "function" ? Object.defineProperty(up, oldName, {
|
11
11
|
get: function() {
|
@@ -41,7 +41,7 @@ that might save you from loading something like [Lodash](https://lodash.com/).
|
|
41
41
|
@function up.util.noop
|
42
42
|
@experimental
|
43
43
|
*/
|
44
|
-
var $createElementFromSelector, $createPlaceholder, $submittingButton, DivertibleChain, ESCAPE_HTML_ENTITY_MAP, all, always, any, appendRequestData, assign, assignPolyfill, attributeSelector, castedAttr, clientSize, compact, config, contains, copy, copyAttributes, createElementFromHtml, cssAnimate, detachWith, detect, documentHasVerticalScrollbar, each, escapeHtml, escapePressed, evalOption, except, extractOptions, fail, fixedToAbsolute, flatten, forceCompositing, forceRepaint, horizontalScreenHalf, identity, intersect, isArray, isBlank, isBodyDescendant, isCrossDomain, isDefined, isDetached, isElement, isFixed, isFormData, isFunction, isGiven, isJQuery, isMissing, isNull, isNumber, isObject, isOptions, isPresent, isPromise, isStandardPort, isString, isTruthy, isUndefined, isUnmodifiedKeyEvent, isUnmodifiedMouseEvent, last, map, margins, measure, memoize, merge, mergeRequestData, methodAllowsPayload, microtask, multiSelector, muteRejection, newDeferred, nextFrame, nonUpClasses, noop, normalizeMethod, normalizeUrl, nullJQuery, offsetParent, once, only, opacity, openConfig, option, options, parseUrl, pluckData, pluckKey, presence, presentAttr, previewable, promiseTimer, reject, rejectOnError, remove, renameKey, requestDataAsArray, requestDataAsQuery, requestDataFromForm, scrollbarWidth, select, selectInDynasty, selectInSubtree, selectorForElement, sequence, setMissingAttrs, setTimer, submittedValue, temporaryCss, times, toArray, trim, unJQuery, uniq, unresolvablePromise, unwrapElement, whenReady;
|
44
|
+
var $createElementFromSelector, $createPlaceholder, $submittingButton, DivertibleChain, ESCAPE_HTML_ENTITY_MAP, all, always, any, appendRequestData, assign, assignPolyfill, attributeSelector, castedAttr, clientSize, compact, config, contains, copy, copyAttributes, createElementFromHtml, cssAnimate, detachWith, detect, documentHasVerticalScrollbar, each, escapeHtml, escapePressed, evalOption, except, extractOptions, fail, fixedToAbsolute, flatten, forceCompositing, forceRepaint, horizontalScreenHalf, identity, intersect, isArray, isBlank, isBodyDescendant, isCrossDomain, isDefined, isDetached, isElement, isFixed, isFormData, isFunction, isGiven, isJQuery, isMissing, isNull, isNumber, isObject, isOptions, isPresent, isPromise, isStandardPort, isString, isTruthy, isUndefined, isUnmodifiedKeyEvent, isUnmodifiedMouseEvent, last, listBlock, map, margins, measure, memoize, merge, mergeRequestData, methodAllowsPayload, microtask, multiSelector, muteRejection, newDeferred, nextFrame, nonUpClasses, noop, normalizeMethod, normalizeUrl, nullJQuery, offsetParent, once, only, opacity, openConfig, option, options, parseUrl, pluckData, pluckKey, presence, presentAttr, previewable, promiseTimer, reject, rejectOnError, remove, renameKey, requestDataAsArray, requestDataAsQuery, requestDataFromForm, scrollbarWidth, select, selectInDynasty, selectInSubtree, selectorForElement, sequence, setMissingAttrs, setTimer, setToArray, submittedValue, temporaryCss, times, toArray, trim, unJQuery, uniq, uniqBy, unresolvablePromise, unwrapElement, whenReady;
|
45
45
|
noop = $.noop;
|
46
46
|
|
47
47
|
/***
|
@@ -331,19 +331,33 @@ that might save you from loading something like [Lodash](https://lodash.com/).
|
|
331
331
|
@stable
|
332
332
|
*/
|
333
333
|
trim = $.trim;
|
334
|
+
listBlock = function(block) {
|
335
|
+
if (isString(block)) {
|
336
|
+
return function(item) {
|
337
|
+
return item[block];
|
338
|
+
};
|
339
|
+
} else {
|
340
|
+
return block;
|
341
|
+
}
|
342
|
+
};
|
334
343
|
|
335
344
|
/***
|
336
|
-
|
337
|
-
of the given array.
|
345
|
+
Translate all items in an array to new array of items.
|
338
346
|
|
339
|
-
@function up.util.
|
347
|
+
@function up.util.map
|
340
348
|
@param {Array<T>} array
|
341
|
-
@param {Function(T, number)} block
|
349
|
+
@param {Function(T, number): any|String} block
|
342
350
|
A function that will be called with each element and (optional) iteration index.
|
351
|
+
|
352
|
+
You can also pass a property name as a String,
|
353
|
+
which will be collected from each item in the array.
|
354
|
+
@return {Array}
|
355
|
+
A new array containing the result of each function call.
|
343
356
|
@stable
|
344
357
|
*/
|
345
|
-
|
358
|
+
map = function(array, block) {
|
346
359
|
var i, index, item, len, results;
|
360
|
+
block = listBlock(block);
|
347
361
|
results = [];
|
348
362
|
for (index = i = 0, len = array.length; i < len; index = ++i) {
|
349
363
|
item = array[index];
|
@@ -353,17 +367,16 @@ that might save you from loading something like [Lodash](https://lodash.com/).
|
|
353
367
|
};
|
354
368
|
|
355
369
|
/***
|
356
|
-
|
370
|
+
Calls the given function for each element (and, optional, index)
|
371
|
+
of the given array.
|
357
372
|
|
358
|
-
@function up.util.
|
373
|
+
@function up.util.each
|
359
374
|
@param {Array<T>} array
|
360
|
-
@param {Function(T, number)
|
375
|
+
@param {Function(T, number)} block
|
361
376
|
A function that will be called with each element and (optional) iteration index.
|
362
|
-
@return {Array}
|
363
|
-
A new array containing the result of each function call.
|
364
377
|
@stable
|
365
378
|
*/
|
366
|
-
|
379
|
+
each = map;
|
367
380
|
|
368
381
|
/***
|
369
382
|
Calls the given function for the given number of times.
|
@@ -776,16 +789,19 @@ that might save you from loading something like [Lodash](https://lodash.com/).
|
|
776
789
|
|
777
790
|
@function up.util.any
|
778
791
|
@param {Array<T>} array
|
779
|
-
@param {Function(T): boolean} tester
|
792
|
+
@param {Function(T, number): boolean} tester
|
793
|
+
A function that will be called with each element and (optional) iteration index.
|
794
|
+
|
780
795
|
@return {boolean}
|
781
796
|
@experimental
|
782
797
|
*/
|
783
798
|
any = function(array, tester) {
|
784
|
-
var element, i, len, match;
|
799
|
+
var element, i, index, len, match;
|
800
|
+
tester = listBlock(tester);
|
785
801
|
match = false;
|
786
|
-
for (i = 0, len = array.length; i < len; i
|
787
|
-
element = array[
|
788
|
-
if (tester(element)) {
|
802
|
+
for (index = i = 0, len = array.length; i < len; index = ++i) {
|
803
|
+
element = array[index];
|
804
|
+
if (tester(element, index)) {
|
789
805
|
match = true;
|
790
806
|
break;
|
791
807
|
}
|
@@ -799,16 +815,19 @@ that might save you from loading something like [Lodash](https://lodash.com/).
|
|
799
815
|
|
800
816
|
@function up.util.all
|
801
817
|
@param {Array<T>} array
|
802
|
-
@param {Function(T): boolean} tester
|
818
|
+
@param {Function(T, number): boolean} tester
|
819
|
+
A function that will be called with each element and (optional) iteration index.
|
820
|
+
|
803
821
|
@return {boolean}
|
804
822
|
@experimental
|
805
823
|
*/
|
806
824
|
all = function(array, tester) {
|
807
|
-
var element, i, len, match;
|
825
|
+
var element, i, index, len, match;
|
826
|
+
tester = listBlock(tester);
|
808
827
|
match = true;
|
809
|
-
for (i = 0, len = array.length; i < len; i
|
810
|
-
element = array[
|
811
|
-
if (!tester(element)) {
|
828
|
+
for (index = i = 0, len = array.length; i < len; index = ++i) {
|
829
|
+
element = array[index];
|
830
|
+
if (!tester(element, index)) {
|
812
831
|
match = false;
|
813
832
|
break;
|
814
833
|
}
|
@@ -838,31 +857,73 @@ that might save you from loading something like [Lodash](https://lodash.com/).
|
|
838
857
|
@stable
|
839
858
|
*/
|
840
859
|
uniq = function(array) {
|
841
|
-
var
|
842
|
-
|
843
|
-
|
844
|
-
|
860
|
+
var set;
|
861
|
+
if (array.length < 2) {
|
862
|
+
return array;
|
863
|
+
}
|
864
|
+
set = new Set(array);
|
865
|
+
return setToArray(set);
|
866
|
+
};
|
867
|
+
|
868
|
+
/**
|
869
|
+
This function is like [`uniq`](/up.util.uniq), accept that
|
870
|
+
the given function is invoked for each element to generate the value
|
871
|
+
for which uniquness is computed.
|
872
|
+
|
873
|
+
@function up.util.uniqBy
|
874
|
+
@param {Array<T>} array
|
875
|
+
@param {Function<T>: any} array
|
876
|
+
@return {Array<T>}
|
877
|
+
@experimental
|
878
|
+
*/
|
879
|
+
uniqBy = function(array, mapper) {
|
880
|
+
var set;
|
881
|
+
if (array.length < 2) {
|
882
|
+
return array;
|
883
|
+
}
|
884
|
+
mapper = listBlock(mapper);
|
885
|
+
set = new Set();
|
886
|
+
return select(array, function(elem, index) {
|
887
|
+
var mapped;
|
888
|
+
mapped = mapper(elem, index);
|
889
|
+
if (set.has(mapped)) {
|
845
890
|
return false;
|
846
891
|
} else {
|
847
|
-
|
892
|
+
set.add(mapped);
|
893
|
+
return true;
|
848
894
|
}
|
849
895
|
});
|
850
896
|
};
|
851
897
|
|
898
|
+
/**
|
899
|
+
@function up.util.setToArray
|
900
|
+
@internal
|
901
|
+
*/
|
902
|
+
setToArray = function(set) {
|
903
|
+
var array;
|
904
|
+
array = [];
|
905
|
+
set.forEach(function(elem) {
|
906
|
+
return array.push(elem);
|
907
|
+
});
|
908
|
+
return array;
|
909
|
+
};
|
910
|
+
|
852
911
|
/***
|
853
912
|
Returns all elements from the given array that return
|
854
913
|
a truthy value when passed to the given function.
|
855
914
|
|
856
915
|
@function up.util.select
|
857
916
|
@param {Array<T>} array
|
917
|
+
@param {Function(T, number): boolean} tester
|
858
918
|
@return {Array<T>}
|
859
919
|
@stable
|
860
920
|
*/
|
861
921
|
select = function(array, tester) {
|
862
922
|
var matches;
|
923
|
+
tester = listBlock(tester);
|
863
924
|
matches = [];
|
864
|
-
each(array, function(element) {
|
865
|
-
if (tester(element)) {
|
925
|
+
each(array, function(element, index) {
|
926
|
+
if (tester(element, index)) {
|
866
927
|
return matches.push(element);
|
867
928
|
}
|
868
929
|
});
|
@@ -875,12 +936,14 @@ that might save you from loading something like [Lodash](https://lodash.com/).
|
|
875
936
|
|
876
937
|
@function up.util.reject
|
877
938
|
@param {Array<T>} array
|
939
|
+
@param {Function(T, number): boolean} tester
|
878
940
|
@return {Array<T>}
|
879
941
|
@stable
|
880
942
|
*/
|
881
943
|
reject = function(array, tester) {
|
882
|
-
|
883
|
-
|
944
|
+
tester = listBlock(tester);
|
945
|
+
return select(array, function(element, index) {
|
946
|
+
return !tester(element, index);
|
884
947
|
});
|
885
948
|
};
|
886
949
|
|
@@ -1848,7 +1911,7 @@ that might save you from loading something like [Lodash](https://lodash.com/).
|
|
1848
1911
|
*/
|
1849
1912
|
isDetached = function(element) {
|
1850
1913
|
element = unJQuery(element);
|
1851
|
-
return
|
1914
|
+
return !$.contains(document.documentElement, element);
|
1852
1915
|
};
|
1853
1916
|
|
1854
1917
|
/***
|
@@ -2076,17 +2139,17 @@ that might save you from loading something like [Lodash](https://lodash.com/).
|
|
2076
2139
|
* Registers an empty rejection handler with the given promise.
|
2077
2140
|
* This prevents browsers from printing "Uncaught (in promise)" to the error
|
2078
2141
|
* console when the promise is rejection.
|
2079
|
-
|
2142
|
+
#
|
2080
2143
|
* This is helpful for event handlers where it is clear that no rejection
|
2081
2144
|
* handler will be registered:
|
2082
|
-
|
2145
|
+
#
|
2083
2146
|
* up.on('submit', 'form[up-target]', (event, $form) => {
|
2084
2147
|
* promise = up.submit($form)
|
2085
2148
|
* up.util.muteRejection(promise)
|
2086
2149
|
* })
|
2087
|
-
|
2150
|
+
#
|
2088
2151
|
* Does nothing if passed a missing value.
|
2089
|
-
|
2152
|
+
#
|
2090
2153
|
* @function up.util.muteRejection
|
2091
2154
|
* @param {Promise|undefined|null} promise
|
2092
2155
|
* @return {Promise}
|
@@ -2126,8 +2189,8 @@ that might save you from loading something like [Lodash](https://lodash.com/).
|
|
2126
2189
|
var error;
|
2127
2190
|
try {
|
2128
2191
|
return block();
|
2129
|
-
} catch (
|
2130
|
-
error =
|
2192
|
+
} catch (_error) {
|
2193
|
+
error = _error;
|
2131
2194
|
return Promise.reject(error);
|
2132
2195
|
}
|
2133
2196
|
};
|
@@ -2177,6 +2240,7 @@ that might save you from loading something like [Lodash](https://lodash.com/).
|
|
2177
2240
|
intersect: intersect,
|
2178
2241
|
compact: compact,
|
2179
2242
|
uniq: uniq,
|
2243
|
+
uniqBy: uniqBy,
|
2180
2244
|
last: last,
|
2181
2245
|
isNull: isNull,
|
2182
2246
|
isDefined: isDefined,
|
@@ -2471,7 +2535,6 @@ that might save you from loading something like [Lodash](https://lodash.com/).
|
|
2471
2535
|
function ExtractCascade(selector, options) {
|
2472
2536
|
this.oldPlanNotFound = bind(this.oldPlanNotFound, this);
|
2473
2537
|
this.matchingPlanNotFound = bind(this.matchingPlanNotFound, this);
|
2474
|
-
this.hungrySteps = bind(this.hungrySteps, this);
|
2475
2538
|
this.bestMatchingSteps = bind(this.bestMatchingSteps, this);
|
2476
2539
|
this.bestPreflightSelector = bind(this.bestPreflightSelector, this);
|
2477
2540
|
this.detectPlan = bind(this.detectPlan, this);
|
@@ -2530,9 +2593,13 @@ that might save you from loading something like [Lodash](https://lodash.com/).
|
|
2530
2593
|
ExtractCascade.prototype.bestPreflightSelector = function() {
|
2531
2594
|
var plan;
|
2532
2595
|
if (this.options.provideTarget) {
|
2533
|
-
|
2534
|
-
} else
|
2535
|
-
|
2596
|
+
plan = this.plans[0];
|
2597
|
+
} else {
|
2598
|
+
plan = this.oldPlan();
|
2599
|
+
}
|
2600
|
+
if (plan) {
|
2601
|
+
plan.resolveNesting();
|
2602
|
+
return plan.selector();
|
2536
2603
|
} else {
|
2537
2604
|
return this.oldPlanNotFound();
|
2538
2605
|
}
|
@@ -2541,37 +2608,14 @@ that might save you from loading something like [Lodash](https://lodash.com/).
|
|
2541
2608
|
ExtractCascade.prototype.bestMatchingSteps = function() {
|
2542
2609
|
var plan;
|
2543
2610
|
if (plan = this.matchingPlan()) {
|
2544
|
-
|
2611
|
+
plan.addHungrySteps();
|
2612
|
+
plan.resolveNesting();
|
2613
|
+
return plan.steps;
|
2545
2614
|
} else {
|
2546
2615
|
return this.matchingPlanNotFound();
|
2547
2616
|
}
|
2548
2617
|
};
|
2549
2618
|
|
2550
|
-
ExtractCascade.prototype.hungrySteps = function() {
|
2551
|
-
var $hungries, $hungry, $newHungry, hungry, j, len, selector, steps, transition;
|
2552
|
-
steps = [];
|
2553
|
-
if (this.options.hungry) {
|
2554
|
-
$hungries = up.radio.hungrySelector().select();
|
2555
|
-
for (j = 0, len = $hungries.length; j < len; j++) {
|
2556
|
-
hungry = $hungries[j];
|
2557
|
-
$hungry = $(hungry);
|
2558
|
-
selector = u.selectorForElement($hungry);
|
2559
|
-
if ($newHungry = this.options.response.first(selector)) {
|
2560
|
-
transition = u.option(up.radio.config.hungryTransition, this.options.transition);
|
2561
|
-
steps.push({
|
2562
|
-
selector: selector,
|
2563
|
-
$old: $hungry,
|
2564
|
-
$new: $newHungry,
|
2565
|
-
transition: transition,
|
2566
|
-
reveal: false,
|
2567
|
-
origin: null
|
2568
|
-
});
|
2569
|
-
}
|
2570
|
-
}
|
2571
|
-
}
|
2572
|
-
return steps;
|
2573
|
-
};
|
2574
|
-
|
2575
2619
|
ExtractCascade.prototype.matchingPlanNotFound = function() {
|
2576
2620
|
var inspectAction, message;
|
2577
2621
|
if (this.newPlan()) {
|
@@ -2616,19 +2660,25 @@ that might save you from loading something like [Lodash](https://lodash.com/).
|
|
2616
2660
|
|
2617
2661
|
up.ExtractPlan = (function() {
|
2618
2662
|
function ExtractPlan(selector, options) {
|
2663
|
+
this.addHungrySteps = bind(this.addHungrySteps, this);
|
2619
2664
|
this.parseSteps = bind(this.parseSteps, this);
|
2665
|
+
this.selector = bind(this.selector, this);
|
2666
|
+
this.resolveNesting = bind(this.resolveNesting, this);
|
2667
|
+
this.addSteps = bind(this.addSteps, this);
|
2620
2668
|
this.matchExists = bind(this.matchExists, this);
|
2621
2669
|
this.newExists = bind(this.newExists, this);
|
2622
2670
|
this.oldExists = bind(this.oldExists, this);
|
2623
2671
|
this.findNew = bind(this.findNew, this);
|
2624
2672
|
this.findOld = bind(this.findOld, this);
|
2673
|
+
var originalSelector;
|
2625
2674
|
this.reveal = options.reveal;
|
2626
2675
|
this.origin = options.origin;
|
2627
|
-
this.
|
2676
|
+
this.hungry = options.hungry;
|
2628
2677
|
this.transition = options.transition;
|
2629
2678
|
this.response = options.response;
|
2630
2679
|
this.oldLayer = options.layer;
|
2631
|
-
this.
|
2680
|
+
originalSelector = up.dom.resolveSelector(selector, this.origin);
|
2681
|
+
this.parseSteps(originalSelector);
|
2632
2682
|
}
|
2633
2683
|
|
2634
2684
|
ExtractPlan.prototype.findOld = function() {
|
@@ -2667,35 +2717,59 @@ that might save you from loading something like [Lodash](https://lodash.com/).
|
|
2667
2717
|
return this.oldExists() && this.newExists();
|
2668
2718
|
};
|
2669
2719
|
|
2720
|
+
ExtractPlan.prototype.addSteps = function(steps) {
|
2721
|
+
return this.steps = this.steps.concat(steps);
|
2722
|
+
};
|
2670
2723
|
|
2671
|
-
|
2672
|
-
|
2673
|
-
|
2674
|
-
|
2675
|
-
|
2676
|
-
|
2677
|
-
|
2678
|
-
|
2679
|
-
|
2680
|
-
|
2724
|
+
ExtractPlan.prototype.resolveNesting = function() {
|
2725
|
+
var compressed;
|
2726
|
+
if (this.steps.length < 2) {
|
2727
|
+
return;
|
2728
|
+
}
|
2729
|
+
compressed = u.copy(this.steps);
|
2730
|
+
compressed = u.uniqBy(compressed, function(step) {
|
2731
|
+
return step.$old[0];
|
2732
|
+
});
|
2733
|
+
compressed = u.select(compressed, (function(_this) {
|
2734
|
+
return function(candidateStep, candidateIndex) {
|
2735
|
+
return u.all(compressed, function(rivalStep, rivalIndex) {
|
2736
|
+
var candidateElement, rivalElement;
|
2737
|
+
if (rivalIndex === candidateIndex) {
|
2738
|
+
return true;
|
2739
|
+
} else {
|
2740
|
+
candidateElement = candidateStep.$old[0];
|
2741
|
+
rivalElement = rivalStep.$old[0];
|
2742
|
+
return rivalStep.pseudoClass || !$.contains(rivalElement, candidateElement);
|
2743
|
+
}
|
2744
|
+
});
|
2745
|
+
};
|
2746
|
+
})(this));
|
2747
|
+
compressed[0].reveal = this.steps[0].reveal;
|
2748
|
+
return this.steps = compressed;
|
2749
|
+
};
|
2681
2750
|
|
2682
|
-
ExtractPlan.prototype.
|
2751
|
+
ExtractPlan.prototype.selector = function() {
|
2752
|
+
return u.map(this.steps, 'expression').join(', ');
|
2753
|
+
};
|
2754
|
+
|
2755
|
+
ExtractPlan.prototype.parseSteps = function(originalSelector) {
|
2683
2756
|
var comma, disjunction;
|
2684
2757
|
comma = /\ *,\ */;
|
2685
2758
|
this.steps = [];
|
2686
|
-
disjunction =
|
2759
|
+
disjunction = originalSelector.split(comma);
|
2687
2760
|
return u.each(disjunction, (function(_this) {
|
2688
|
-
return function(
|
2689
|
-
var doReveal,
|
2690
|
-
|
2691
|
-
|
2692
|
-
selector =
|
2761
|
+
return function(expression, i) {
|
2762
|
+
var doReveal, expressionParts, pseudoClass, selector;
|
2763
|
+
expressionParts = expression.match(/^(.+?)(?:\:(before|after))?$/);
|
2764
|
+
expressionParts || up.fail('Could not parse selector literal "%s"', expression);
|
2765
|
+
selector = expressionParts[1];
|
2693
2766
|
if (selector === 'html') {
|
2694
2767
|
selector = 'body';
|
2695
2768
|
}
|
2696
|
-
pseudoClass =
|
2769
|
+
pseudoClass = expressionParts[2];
|
2697
2770
|
doReveal = i === 0 ? _this.reveal : false;
|
2698
2771
|
return _this.steps.push({
|
2772
|
+
expression: expression,
|
2699
2773
|
selector: selector,
|
2700
2774
|
pseudoClass: pseudoClass,
|
2701
2775
|
transition: _this.transition,
|
@@ -2706,10 +2780,48 @@ that might save you from loading something like [Lodash](https://lodash.com/).
|
|
2706
2780
|
})(this));
|
2707
2781
|
};
|
2708
2782
|
|
2783
|
+
ExtractPlan.prototype.addHungrySteps = function() {
|
2784
|
+
var $hungries, $hungry, $newHungry, hungry, hungrySteps, j, len, selector, transition;
|
2785
|
+
hungrySteps = [];
|
2786
|
+
if (this.hungry) {
|
2787
|
+
$hungries = up.radio.hungrySelector().select();
|
2788
|
+
transition = u.option(up.radio.config.hungryTransition, this.transition);
|
2789
|
+
for (j = 0, len = $hungries.length; j < len; j++) {
|
2790
|
+
hungry = $hungries[j];
|
2791
|
+
$hungry = $(hungry);
|
2792
|
+
selector = u.selectorForElement($hungry);
|
2793
|
+
if ($newHungry = this.response.first(selector)) {
|
2794
|
+
hungrySteps.push({
|
2795
|
+
selector: selector,
|
2796
|
+
$old: $hungry,
|
2797
|
+
$new: $newHungry,
|
2798
|
+
transition: transition,
|
2799
|
+
reveal: false,
|
2800
|
+
origin: null
|
2801
|
+
});
|
2802
|
+
}
|
2803
|
+
}
|
2804
|
+
}
|
2805
|
+
return this.addSteps(hungrySteps);
|
2806
|
+
};
|
2807
|
+
|
2709
2808
|
return ExtractPlan;
|
2710
2809
|
|
2711
2810
|
})();
|
2712
2811
|
|
2812
|
+
}).call(this);
|
2813
|
+
(function() {
|
2814
|
+
var u;
|
2815
|
+
|
2816
|
+
u = up.util;
|
2817
|
+
|
2818
|
+
up.ExtractStep = (function() {
|
2819
|
+
function ExtractStep() {}
|
2820
|
+
|
2821
|
+
return ExtractStep;
|
2822
|
+
|
2823
|
+
})();
|
2824
|
+
|
2713
2825
|
}).call(this);
|
2714
2826
|
(function() {
|
2715
2827
|
var u,
|
@@ -3852,7 +3964,7 @@ Internet Explorer 10 or lower
|
|
3852
3964
|
sessionStorage = u.memoize(function() {
|
3853
3965
|
try {
|
3854
3966
|
return window.sessionStorage;
|
3855
|
-
} catch (
|
3967
|
+
} catch (_error) {
|
3856
3968
|
return polyfilledSessionStorage();
|
3857
3969
|
}
|
3858
3970
|
});
|
@@ -3901,8 +4013,7 @@ Internet Explorer 10 or lower
|
|
3901
4013
|
sprintfWithFormattedArgs: sprintfWithFormattedArgs,
|
3902
4014
|
sessionStorage: sessionStorage,
|
3903
4015
|
popCookie: popCookie,
|
3904
|
-
hash: hash
|
3905
|
-
canPushState: canPushState
|
4016
|
+
hash: hash
|
3906
4017
|
};
|
3907
4018
|
})(jQuery);
|
3908
4019
|
|
@@ -6923,8 +7034,8 @@ is built from these functions. You can use them to extend Unpoly from your
|
|
6923
7034
|
try {
|
6924
7035
|
improvedTarget = bestPreflightSelector(selectorOrElement, successOptions);
|
6925
7036
|
improvedFailTarget = bestPreflightSelector(options.failTarget, failureOptions);
|
6926
|
-
} catch (
|
6927
|
-
e =
|
7037
|
+
} catch (_error) {
|
7038
|
+
e = _error;
|
6928
7039
|
return Promise.reject(e);
|
6929
7040
|
}
|
6930
7041
|
request = {
|
@@ -9399,8 +9510,8 @@ new page is loading.
|
|
9399
9510
|
@function up.link.addFollowVariant
|
9400
9511
|
@param {string} simplifiedSelector
|
9401
9512
|
A selector without `a` or `[up-href]`, e.g. `[up-target]`
|
9402
|
-
@param {Function
|
9403
|
-
@param {Function
|
9513
|
+
@param {Function(jQuery, Object)} options.follow
|
9514
|
+
@param {Function(jQuery, Object)} options.preload
|
9404
9515
|
@internal
|
9405
9516
|
*/
|
9406
9517
|
addFollowVariant = function(simplifiedSelector, options) {
|