upjs-rails 0.8.0 → 0.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +6 -3
- data/dist/up-bootstrap.css +5 -0
- data/dist/up-bootstrap.js +14 -0
- data/dist/up-bootstrap.min.css +1 -0
- data/dist/up-bootstrap.min.js +1 -0
- data/dist/up.css +22 -36
- data/dist/up.js +300 -137
- data/dist/up.min.css +1 -1
- data/dist/up.min.js +2 -2
- data/lib/assets/javascripts/up/browser.js.coffee +9 -35
- data/lib/assets/javascripts/up/bus.js.coffee +10 -10
- data/lib/assets/javascripts/up/modal.js.coffee +98 -40
- data/lib/assets/javascripts/up/motion.js.coffee +13 -13
- data/lib/assets/javascripts/up/navigation.js.coffee +28 -3
- data/lib/assets/javascripts/up/popup.js.coffee +14 -12
- data/lib/assets/javascripts/up/proxy.js.coffee +21 -24
- data/lib/assets/javascripts/up/util.js.coffee +72 -9
- data/lib/assets/javascripts/up/viewport.js.coffee +10 -8
- data/lib/assets/javascripts/up-bootstrap/modal-ext.js.coffee +16 -0
- data/lib/assets/javascripts/up-bootstrap.js.coffee +1 -0
- data/lib/assets/stylesheets/up/modal.css.sass +37 -24
- data/lib/assets/stylesheets/up/popup.css.sass +1 -6
- data/lib/assets/stylesheets/up-bootstrap/modal-ext.css.sass +9 -0
- data/lib/assets/stylesheets/up-bootstrap.css.sass +1 -0
- data/lib/assets/stylesheets/up.css.sass +3 -0
- data/lib/upjs/rails/version.rb +1 -1
- data/spec_app/Gemfile.lock +1 -1
- data/spec_app/spec/javascripts/up/modal_spec.js.coffee +26 -0
- data/spec_app/spec/javascripts/up/navigation_spec.js.coffee +6 -0
- data/spec_app/spec/javascripts/up/util_spec.js.coffee +24 -0
- metadata +11 -3
- data/lib/assets/stylesheets/up.css +0 -3
data/dist/up.js
CHANGED
@@ -25,7 +25,22 @@ If you use them in your own code, you will get hurt.
|
|
25
25
|
var slice = [].slice;
|
26
26
|
|
27
27
|
up.util = (function() {
|
28
|
-
var $createElementFromSelector, ANIMATION_PROMISE_KEY, CONSOLE_PLACEHOLDERS, ajax, castsToFalse, castsToTrue, clientSize, compact, contains, copy, copyAttributes, createElement, createElementFromHtml, createSelectorFromElement, cssAnimate, debug, detect, each, error, escapePressed, extend, findWithSelf, finishCssAnimate, forceCompositing, get, ifGiven, isArray, isBlank, isDeferred, isDefined, isElement, isFunction, isGiven, isHash, isJQuery, isMissing, isNull, isObject, isPresent, isPromise, isStandardPort, isString, isUndefined, isUnmodifiedKeyEvent, isUnmodifiedMouseEvent, keys, last, locationFromXhr, measure, merge, methodFromXhr, nextFrame, normalizeMethod, normalizeUrl, nullJquery, only, option, options, prependGhost, presence, presentAttr, remove, resolvableWhen, resolvedDeferred, resolvedPromise, select, setMissingAttrs, stringifyConsoleArgs, temporaryCss, times, toArray, trim, unwrap, warn;
|
28
|
+
var $createElementFromSelector, ANIMATION_PROMISE_KEY, CONSOLE_PLACEHOLDERS, ajax, castsToFalse, castsToTrue, clientSize, compact, config, contains, copy, copyAttributes, createElement, createElementFromHtml, createSelectorFromElement, cssAnimate, debug, detect, each, error, escapePressed, extend, findWithSelf, finishCssAnimate, forceCompositing, get, ifGiven, isArray, isBlank, isDeferred, isDefined, isElement, isFunction, isGiven, isHash, isJQuery, isMissing, isNull, isObject, isPresent, isPromise, isStandardPort, isString, isUndefined, isUnmodifiedKeyEvent, isUnmodifiedMouseEvent, keys, last, locationFromXhr, measure, memoize, merge, methodFromXhr, nextFrame, normalizeMethod, normalizeUrl, nullJquery, once, only, option, options, prependGhost, presence, presentAttr, remove, resolvableWhen, resolvedDeferred, resolvedPromise, scrollbarWidth, select, setMissingAttrs, stringifyConsoleArgs, temporaryCss, times, toArray, trim, uniq, unwrap, warn;
|
29
|
+
memoize = function(func) {
|
30
|
+
var cache, cached;
|
31
|
+
cache = void 0;
|
32
|
+
cached = false;
|
33
|
+
return function() {
|
34
|
+
var args;
|
35
|
+
args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
|
36
|
+
if (cached) {
|
37
|
+
return cache;
|
38
|
+
} else {
|
39
|
+
cached = true;
|
40
|
+
return cache = func.apply(null, args);
|
41
|
+
}
|
42
|
+
};
|
43
|
+
};
|
29
44
|
get = function(url, options) {
|
30
45
|
options = options || {};
|
31
46
|
options.url = url;
|
@@ -418,6 +433,17 @@ If you use them in your own code, you will get hurt.
|
|
418
433
|
compact = function(array) {
|
419
434
|
return select(array, isGiven);
|
420
435
|
};
|
436
|
+
uniq = function(array) {
|
437
|
+
var seen;
|
438
|
+
seen = {};
|
439
|
+
return select(array, function(element) {
|
440
|
+
if (seen.hasOwnProperty(element)) {
|
441
|
+
return false;
|
442
|
+
} else {
|
443
|
+
return seen[element] = true;
|
444
|
+
}
|
445
|
+
});
|
446
|
+
};
|
421
447
|
select = function(array, tester) {
|
422
448
|
var matches;
|
423
449
|
matches = [];
|
@@ -456,6 +482,41 @@ If you use them in your own code, you will get hurt.
|
|
456
482
|
height: element.clientHeight
|
457
483
|
};
|
458
484
|
};
|
485
|
+
scrollbarWidth = memoize(function() {
|
486
|
+
var $outer, outer, width;
|
487
|
+
$outer = $('<div>').css({
|
488
|
+
position: 'absolute',
|
489
|
+
top: '0',
|
490
|
+
left: '0',
|
491
|
+
width: '50px',
|
492
|
+
height: '50px',
|
493
|
+
overflowY: 'scroll'
|
494
|
+
});
|
495
|
+
$outer.appendTo(document.body);
|
496
|
+
outer = $outer.get(0);
|
497
|
+
width = outer.offsetWidth - outer.clientWidth;
|
498
|
+
$outer.remove();
|
499
|
+
return width;
|
500
|
+
});
|
501
|
+
|
502
|
+
/**
|
503
|
+
Modifies the given function so it only runs once.
|
504
|
+
Subsequent calls will return the previous return value.
|
505
|
+
|
506
|
+
@method up.util.once
|
507
|
+
@private
|
508
|
+
*/
|
509
|
+
once = function(fun) {
|
510
|
+
var result;
|
511
|
+
result = void 0;
|
512
|
+
return function() {
|
513
|
+
if (fun != null) {
|
514
|
+
result = fun();
|
515
|
+
}
|
516
|
+
fun = void 0;
|
517
|
+
return result;
|
518
|
+
};
|
519
|
+
};
|
459
520
|
temporaryCss = function($element, css, block) {
|
460
521
|
var memo, oldCss;
|
461
522
|
oldCss = $element.css(keys(css));
|
@@ -467,7 +528,7 @@ If you use them in your own code, you will get hurt.
|
|
467
528
|
block();
|
468
529
|
return memo();
|
469
530
|
} else {
|
470
|
-
return memo;
|
531
|
+
return once(memo);
|
471
532
|
}
|
472
533
|
};
|
473
534
|
forceCompositing = function($element) {
|
@@ -630,8 +691,8 @@ If you use them in your own code, you will get hurt.
|
|
630
691
|
escapePressed = function(event) {
|
631
692
|
return event.keyCode === 27;
|
632
693
|
};
|
633
|
-
contains = function(
|
634
|
-
return
|
694
|
+
contains = function(stringOrArray, element) {
|
695
|
+
return stringOrArray.indexOf(element) >= 0;
|
635
696
|
};
|
636
697
|
castsToTrue = function(object) {
|
637
698
|
return String(object) === "true";
|
@@ -717,6 +778,31 @@ If you use them in your own code, you will get hurt.
|
|
717
778
|
return element;
|
718
779
|
}
|
719
780
|
};
|
781
|
+
config = function(factoryOptions) {
|
782
|
+
var apiKeys, hash;
|
783
|
+
if (factoryOptions == null) {
|
784
|
+
factoryOptions = {};
|
785
|
+
}
|
786
|
+
hash = {
|
787
|
+
reset: function() {
|
788
|
+
var j, key, len, ownKeys;
|
789
|
+
ownKeys = Object.getOwnPropertyNames(hash);
|
790
|
+
for (j = 0, len = ownKeys.length; j < len; j++) {
|
791
|
+
key = ownKeys[j];
|
792
|
+
if (!contains(apiKeys, key)) {
|
793
|
+
delete hash[key];
|
794
|
+
}
|
795
|
+
}
|
796
|
+
return hash.update(copy(factoryOptions));
|
797
|
+
},
|
798
|
+
update: function(options) {
|
799
|
+
return extend(hash, options);
|
800
|
+
}
|
801
|
+
};
|
802
|
+
apiKeys = Object.getOwnPropertyNames(hash);
|
803
|
+
hash.reset();
|
804
|
+
return hash;
|
805
|
+
};
|
720
806
|
return {
|
721
807
|
presentAttr: presentAttr,
|
722
808
|
createElement: createElement,
|
@@ -740,6 +826,7 @@ If you use them in your own code, you will get hurt.
|
|
740
826
|
detect: detect,
|
741
827
|
select: select,
|
742
828
|
compact: compact,
|
829
|
+
uniq: uniq,
|
743
830
|
last: last,
|
744
831
|
isNull: isNull,
|
745
832
|
isDefined: isDefined,
|
@@ -787,7 +874,10 @@ If you use them in your own code, you will get hurt.
|
|
787
874
|
resolvedDeferred: resolvedDeferred,
|
788
875
|
resolvableWhen: resolvableWhen,
|
789
876
|
setMissingAttrs: setMissingAttrs,
|
790
|
-
remove: remove
|
877
|
+
remove: remove,
|
878
|
+
memoize: memoize,
|
879
|
+
scrollbarWidth: scrollbarWidth,
|
880
|
+
config: config
|
791
881
|
};
|
792
882
|
})();
|
793
883
|
|
@@ -797,17 +887,16 @@ If you use them in your own code, you will get hurt.
|
|
797
887
|
Browser interface
|
798
888
|
=================
|
799
889
|
|
800
|
-
Some browser-interfacing methods and switches that
|
890
|
+
Some browser-interfacing methods and switches that
|
891
|
+
we can't currently get rid off.
|
801
892
|
|
802
893
|
@protected
|
803
894
|
@class up.browser
|
804
895
|
*/
|
805
896
|
|
806
897
|
(function() {
|
807
|
-
var slice = [].slice;
|
808
|
-
|
809
898
|
up.browser = (function() {
|
810
|
-
var canCssAnimation, canInputEvent, canPushState, ensureConsoleExists, ensureRecentJquery, isSupported, loadPage,
|
899
|
+
var canCssAnimation, canInputEvent, canPushState, ensureConsoleExists, ensureRecentJquery, isSupported, loadPage, u, url;
|
811
900
|
u = up.util;
|
812
901
|
loadPage = function(url, options) {
|
813
902
|
var $form, csrfParam, csrfToken, metadataInput, method, target;
|
@@ -851,28 +940,13 @@ Some browser-interfacing methods and switches that we can't currently get rid of
|
|
851
940
|
(base6 = window.console).groupCollapsed || (base6.groupCollapsed = noop);
|
852
941
|
return (base7 = window.console).groupEnd || (base7.groupEnd = noop);
|
853
942
|
};
|
854
|
-
|
855
|
-
var cache, cached;
|
856
|
-
cache = void 0;
|
857
|
-
cached = false;
|
858
|
-
return function() {
|
859
|
-
var args;
|
860
|
-
args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
|
861
|
-
if (cached) {
|
862
|
-
return cache;
|
863
|
-
} else {
|
864
|
-
cached = true;
|
865
|
-
return cache = func.apply(null, args);
|
866
|
-
}
|
867
|
-
};
|
868
|
-
};
|
869
|
-
canPushState = memoize(function() {
|
943
|
+
canPushState = u.memoize(function() {
|
870
944
|
return u.isDefined(history.pushState);
|
871
945
|
});
|
872
|
-
canCssAnimation = memoize(function() {
|
946
|
+
canCssAnimation = u.memoize(function() {
|
873
947
|
return 'transition' in document.documentElement.style;
|
874
948
|
});
|
875
|
-
canInputEvent = memoize(function() {
|
949
|
+
canInputEvent = u.memoize(function() {
|
876
950
|
return 'oninput' in document.createElement('input');
|
877
951
|
});
|
878
952
|
ensureRecentJquery = function() {
|
@@ -884,7 +958,7 @@ Some browser-interfacing methods and switches that we can't currently get rid of
|
|
884
958
|
compatible = major >= 2 || (major === 1 && minor >= 9);
|
885
959
|
return compatible || u.error("jQuery %o found, but Up.js requires 1.9+", version);
|
886
960
|
};
|
887
|
-
isSupported = memoize(function() {
|
961
|
+
isSupported = u.memoize(function() {
|
888
962
|
return u.isDefined(document.addEventListener);
|
889
963
|
});
|
890
964
|
return {
|
@@ -954,6 +1028,17 @@ We need to work on this page:
|
|
954
1028
|
u = up.util;
|
955
1029
|
callbacksByEvent = {};
|
956
1030
|
defaultCallbacksByEvent = {};
|
1031
|
+
|
1032
|
+
/**
|
1033
|
+
Resets the list of registered event listeners to the
|
1034
|
+
moment when the framework was booted.
|
1035
|
+
|
1036
|
+
@private
|
1037
|
+
@method up.bus.reset
|
1038
|
+
*/
|
1039
|
+
reset = function() {
|
1040
|
+
return callbacksByEvent = u.copy(defaultCallbacksByEvent);
|
1041
|
+
};
|
957
1042
|
callbacksFor = function(event) {
|
958
1043
|
return callbacksByEvent[event] || (callbacksByEvent[event] = []);
|
959
1044
|
};
|
@@ -976,17 +1061,6 @@ We need to work on this page:
|
|
976
1061
|
return results;
|
977
1062
|
};
|
978
1063
|
|
979
|
-
/**
|
980
|
-
Resets the list of registered event listeners to the
|
981
|
-
moment when the framework was booted.
|
982
|
-
|
983
|
-
@private
|
984
|
-
@method up.bus.reset
|
985
|
-
*/
|
986
|
-
reset = function() {
|
987
|
-
return callbacksByEvent = u.copy(defaultCallbacksByEvent);
|
988
|
-
};
|
989
|
-
|
990
1064
|
/**
|
991
1065
|
Registers an event handler to be called when the given
|
992
1066
|
event is triggered.
|
@@ -1087,13 +1161,8 @@ By default Up.js will always scroll to an element before updating it.
|
|
1087
1161
|
|
1088
1162
|
(function() {
|
1089
1163
|
up.viewport = (function() {
|
1090
|
-
var SCROLL_PROMISE_KEY, config,
|
1164
|
+
var SCROLL_PROMISE_KEY, config, finishScrolling, reset, reveal, scroll, u;
|
1091
1165
|
u = up.util;
|
1092
|
-
config = {
|
1093
|
-
duration: 0,
|
1094
|
-
view: 'body',
|
1095
|
-
easing: 'swing'
|
1096
|
-
};
|
1097
1166
|
|
1098
1167
|
/**
|
1099
1168
|
@method up.viewport.defaults
|
@@ -1102,8 +1171,13 @@ By default Up.js will always scroll to an element before updating it.
|
|
1102
1171
|
@param {Number} [options.padding]
|
1103
1172
|
@param {String|Element|jQuery} [options.view]
|
1104
1173
|
*/
|
1105
|
-
|
1106
|
-
|
1174
|
+
config = u.config({
|
1175
|
+
duration: 0,
|
1176
|
+
view: 'body',
|
1177
|
+
easing: 'swing'
|
1178
|
+
});
|
1179
|
+
reset = function() {
|
1180
|
+
return config.reset();
|
1107
1181
|
};
|
1108
1182
|
SCROLL_PROMISE_KEY = 'up-scroll-promise';
|
1109
1183
|
|
@@ -1193,11 +1267,12 @@ By default Up.js will always scroll to an element before updating it.
|
|
1193
1267
|
return u.resolvedDeferred();
|
1194
1268
|
}
|
1195
1269
|
};
|
1270
|
+
up.bus.on('framework:reset', reset);
|
1196
1271
|
return {
|
1197
1272
|
reveal: reveal,
|
1198
1273
|
scroll: scroll,
|
1199
1274
|
finishScrolling: finishScrolling,
|
1200
|
-
defaults:
|
1275
|
+
defaults: config.update
|
1201
1276
|
};
|
1202
1277
|
})();
|
1203
1278
|
|
@@ -2130,26 +2205,30 @@ We need to work on this page:
|
|
2130
2205
|
|
2131
2206
|
(function() {
|
2132
2207
|
up.motion = (function() {
|
2133
|
-
var GHOSTING_PROMISE_KEY, animate, animateOptions, animation, animations, assertIsDeferred, config, defaultAnimations, defaultTransitions,
|
2208
|
+
var GHOSTING_PROMISE_KEY, animate, animateOptions, animation, animations, assertIsDeferred, config, defaultAnimations, defaultTransitions, findAnimation, finish, finishGhosting, morph, none, reset, resolvableWhen, snapshot, transition, transitions, u, withGhosts;
|
2134
2209
|
u = up.util;
|
2135
2210
|
animations = {};
|
2136
2211
|
defaultAnimations = {};
|
2137
2212
|
transitions = {};
|
2138
2213
|
defaultTransitions = {};
|
2139
|
-
config = {
|
2140
|
-
duration: 300,
|
2141
|
-
delay: 0,
|
2142
|
-
easing: 'ease'
|
2143
|
-
};
|
2144
2214
|
|
2145
2215
|
/**
|
2216
|
+
Sets default options for animations and transitions.
|
2217
|
+
|
2146
2218
|
@method up.motion.defaults
|
2147
2219
|
@param {Number} [options.duration=300]
|
2148
2220
|
@param {Number} [options.delay=0]
|
2149
2221
|
@param {String} [options.easing='ease']
|
2150
2222
|
*/
|
2151
|
-
|
2152
|
-
|
2223
|
+
config = u.config({
|
2224
|
+
duration: 300,
|
2225
|
+
delay: 0,
|
2226
|
+
easing: 'ease'
|
2227
|
+
});
|
2228
|
+
reset = function() {
|
2229
|
+
animations = u.copy(defaultAnimations);
|
2230
|
+
transitions = u.copy(defaultTransitions);
|
2231
|
+
return config.reset();
|
2153
2232
|
};
|
2154
2233
|
|
2155
2234
|
/**
|
@@ -2473,10 +2552,6 @@ We need to work on this page:
|
|
2473
2552
|
defaultAnimations = u.copy(animations);
|
2474
2553
|
return defaultTransitions = u.copy(transitions);
|
2475
2554
|
};
|
2476
|
-
reset = function() {
|
2477
|
-
animations = u.copy(defaultAnimations);
|
2478
|
-
return transitions = u.copy(defaultTransitions);
|
2479
|
-
};
|
2480
2555
|
|
2481
2556
|
/**
|
2482
2557
|
Returns a new promise that resolves once all promises in arguments resolve.
|
@@ -2640,7 +2715,7 @@ We need to work on this page:
|
|
2640
2715
|
finish: finish,
|
2641
2716
|
transition: transition,
|
2642
2717
|
animation: animation,
|
2643
|
-
defaults:
|
2718
|
+
defaults: config.update,
|
2644
2719
|
none: none,
|
2645
2720
|
when: resolvableWhen
|
2646
2721
|
};
|
@@ -2710,21 +2785,36 @@ You can change (or remove) this delay like this:
|
|
2710
2785
|
|
2711
2786
|
(function() {
|
2712
2787
|
up.proxy = (function() {
|
2713
|
-
var $waitingLink,
|
2788
|
+
var $waitingLink, SAFE_HTTP_METHODS, ajax, alias, busy, busyDelayTimer, busyEventEmitted, cache, cacheKey, cancelBusyDelay, cancelPreloadDelay, checkPreload, clear, config, get, idle, isFresh, isIdempotent, load, loadEnded, loadStarted, normalizeRequest, pendingCount, preload, preloadDelayTimer, remove, reset, set, startPreloadDelay, timestamp, trim, u;
|
2714
2789
|
u = up.util;
|
2715
2790
|
cache = void 0;
|
2716
2791
|
$waitingLink = void 0;
|
2717
2792
|
preloadDelayTimer = void 0;
|
2718
2793
|
busyDelayTimer = void 0;
|
2719
2794
|
pendingCount = void 0;
|
2720
|
-
config = void 0;
|
2721
2795
|
busyEventEmitted = void 0;
|
2722
|
-
|
2796
|
+
|
2797
|
+
/**
|
2798
|
+
@method up.proxy.defaults
|
2799
|
+
@param {Number} [options.preloadDelay=75]
|
2800
|
+
The number of milliseconds to wait before [`[up-preload]`](#up-preload)
|
2801
|
+
starts preloading.
|
2802
|
+
@param {Number} [options.cacheSize=70]
|
2803
|
+
The maximum number of responses to cache.
|
2804
|
+
If the size is exceeded, the oldest items will be dropped from the cache.
|
2805
|
+
@param {Number} [options.cacheExpiry=300000]
|
2806
|
+
The number of milliseconds until a cache entry expires.
|
2807
|
+
Defaults to 5 minutes.
|
2808
|
+
@param {Number} [options.busyDelay=300]
|
2809
|
+
How long the proxy waits until emitting the `proxy:busy` [event](/up.bus).
|
2810
|
+
Use this to prevent flickering of spinners.
|
2811
|
+
*/
|
2812
|
+
config = u.config({
|
2723
2813
|
busyDelay: 300,
|
2724
2814
|
preloadDelay: 75,
|
2725
2815
|
cacheSize: 70,
|
2726
2816
|
cacheExpiry: 1000 * 60 * 5
|
2727
|
-
};
|
2817
|
+
});
|
2728
2818
|
cancelPreloadDelay = function() {
|
2729
2819
|
clearTimeout(preloadDelayTimer);
|
2730
2820
|
return preloadDelayTimer = null;
|
@@ -2739,29 +2829,10 @@ You can change (or remove) this delay like this:
|
|
2739
2829
|
cancelPreloadDelay();
|
2740
2830
|
cancelBusyDelay();
|
2741
2831
|
pendingCount = 0;
|
2742
|
-
config
|
2832
|
+
config.reset();
|
2743
2833
|
return busyEventEmitted = false;
|
2744
2834
|
};
|
2745
2835
|
reset();
|
2746
|
-
|
2747
|
-
/**
|
2748
|
-
@method up.proxy.defaults
|
2749
|
-
@param {Number} [options.preloadDelay=75]
|
2750
|
-
The number of milliseconds to wait before [`[up-preload]`](#up-preload)
|
2751
|
-
starts preloading.
|
2752
|
-
@param {Number} [options.cacheSize=70]
|
2753
|
-
The maximum number of responses to cache.
|
2754
|
-
If the size is exceeded, the oldest items will be dropped from the cache.
|
2755
|
-
@param {Number} [options.cacheExpiry=300000]
|
2756
|
-
The number of milliseconds until a cache entry expires.
|
2757
|
-
Defaults to 5 minutes.
|
2758
|
-
@param {Number} [options.busyDelay=300]
|
2759
|
-
How long the proxy waits until emitting the `proxy:busy` [event](/up.bus).
|
2760
|
-
Use this to prevent flickering of spinners.
|
2761
|
-
*/
|
2762
|
-
defaults = function(options) {
|
2763
|
-
return u.extend(config, options);
|
2764
|
-
};
|
2765
2836
|
cacheKey = function(request) {
|
2766
2837
|
normalizeRequest(request);
|
2767
2838
|
return [request.url, request.method, request.data, request.selector].join('|');
|
@@ -3014,7 +3085,6 @@ You can change (or remove) this delay like this:
|
|
3014
3085
|
return u.resolvedPromise();
|
3015
3086
|
}
|
3016
3087
|
};
|
3017
|
-
up.bus.on('framework:reset', reset);
|
3018
3088
|
|
3019
3089
|
/**
|
3020
3090
|
Links with an `up-preload` attribute will silently fetch their target
|
@@ -3035,6 +3105,7 @@ You can change (or remove) this delay like this:
|
|
3035
3105
|
return checkPreload($element);
|
3036
3106
|
}
|
3037
3107
|
});
|
3108
|
+
up.bus.on('framework:reset', reset);
|
3038
3109
|
return {
|
3039
3110
|
preload: preload,
|
3040
3111
|
ajax: ajax,
|
@@ -3045,7 +3116,7 @@ You can change (or remove) this delay like this:
|
|
3045
3116
|
remove: remove,
|
3046
3117
|
idle: idle,
|
3047
3118
|
busy: busy,
|
3048
|
-
defaults:
|
3119
|
+
defaults: config.update
|
3049
3120
|
};
|
3050
3121
|
})();
|
3051
3122
|
|
@@ -3781,22 +3852,23 @@ We need to work on this page:
|
|
3781
3852
|
|
3782
3853
|
(function() {
|
3783
3854
|
up.popup = (function() {
|
3784
|
-
var autoclose, close, config, contains, createHiddenPopup, currentSource,
|
3855
|
+
var autoclose, close, config, contains, createHiddenPopup, currentSource, discardHistory, ensureInViewport, open, rememberHistory, reset, setPosition, source, u, updated;
|
3785
3856
|
u = up.util;
|
3786
3857
|
currentSource = void 0;
|
3787
|
-
config = {
|
3788
|
-
openAnimation: 'fade-in',
|
3789
|
-
closeAnimation: 'fade-out',
|
3790
|
-
position: 'bottom-right'
|
3791
|
-
};
|
3792
3858
|
|
3793
3859
|
/**
|
3794
3860
|
@method up.popup.defaults
|
3795
3861
|
@param {String} options.animation
|
3796
3862
|
@param {String} options.position
|
3797
3863
|
*/
|
3798
|
-
|
3799
|
-
|
3864
|
+
config = u.config({
|
3865
|
+
openAnimation: 'fade-in',
|
3866
|
+
closeAnimation: 'fade-out',
|
3867
|
+
position: 'bottom-right'
|
3868
|
+
});
|
3869
|
+
reset = function() {
|
3870
|
+
close();
|
3871
|
+
return config.reset();
|
3800
3872
|
};
|
3801
3873
|
setPosition = function($link, $popup, position) {
|
3802
3874
|
var css, linkBox;
|
@@ -3971,6 +4043,8 @@ We need to work on this page:
|
|
3971
4043
|
});
|
3972
4044
|
currentSource = void 0;
|
3973
4045
|
return up.destroy($popup, options);
|
4046
|
+
} else {
|
4047
|
+
return u.resolvedPromise();
|
3974
4048
|
}
|
3975
4049
|
};
|
3976
4050
|
autoclose = function() {
|
@@ -4051,12 +4125,12 @@ We need to work on this page:
|
|
4051
4125
|
return close();
|
4052
4126
|
}
|
4053
4127
|
});
|
4054
|
-
up.bus.on('framework:reset',
|
4128
|
+
up.bus.on('framework:reset', reset);
|
4055
4129
|
return {
|
4056
4130
|
open: open,
|
4057
4131
|
close: close,
|
4058
4132
|
source: source,
|
4059
|
-
defaults:
|
4133
|
+
defaults: config.update,
|
4060
4134
|
contains: contains
|
4061
4135
|
};
|
4062
4136
|
})();
|
@@ -4079,34 +4153,32 @@ For small popup overlays ("dropdowns") see [up.popup](/up.popup) instead.
|
|
4079
4153
|
var slice = [].slice;
|
4080
4154
|
|
4081
4155
|
up.modal = (function() {
|
4082
|
-
var autoclose, close, config, contains, createHiddenModal, currentSource,
|
4156
|
+
var autoclose, close, config, contains, createHiddenModal, currentSource, discardHistory, open, rememberHistory, reset, shiftBody, source, templateHtml, u, unshiftBody, updated;
|
4083
4157
|
u = up.util;
|
4084
|
-
currentSource = void 0;
|
4085
|
-
config = {
|
4086
|
-
width: 'auto',
|
4087
|
-
height: 'auto',
|
4088
|
-
openAnimation: 'fade-in',
|
4089
|
-
closeAnimation: 'fade-out',
|
4090
|
-
closeLabel: 'X',
|
4091
|
-
template: function(config) {
|
4092
|
-
return "<div class=\"up-modal\">\n <div class=\"up-modal-dialog\">\n <div class=\"up-modal-close\" up-close>" + config.closeLabel + "</div>\n <div class=\"up-modal-content\"></div>\n </div>\n</div>";
|
4093
|
-
}
|
4094
|
-
};
|
4095
4158
|
|
4096
4159
|
/**
|
4097
4160
|
Sets default options for future modals.
|
4098
4161
|
|
4099
4162
|
@method up.modal.defaults
|
4100
|
-
@param {Number} [options.width
|
4101
|
-
The width of the dialog
|
4102
|
-
|
4163
|
+
@param {Number} [options.width]
|
4164
|
+
The width of the dialog as a CSS value like `'400px'` or `50%`.
|
4165
|
+
|
4166
|
+
Defaults to `undefined`, meaning that the dialog will grow to fit its contents
|
4167
|
+
until it reaches `options.maxWidth`. Leaving this as `undefined` will
|
4168
|
+
also allow you to control the width using CSS.
|
4169
|
+
@param {Number} [options.maxWidth]
|
4170
|
+
The width of the dialog as a CSS value like `'400px'` or `50%`.
|
4171
|
+
You can set this to `undefined` to make the dialog fit its contents.
|
4172
|
+
Be aware however, that e.g. Bootstrap stretches input elements
|
4173
|
+
to `width: 100%`, meaning the dialog will also stretch to the full
|
4174
|
+
width of the screen.
|
4103
4175
|
@param {Number} [options.height='auto']
|
4104
4176
|
The height of the dialog in pixels.
|
4105
|
-
Defaults to `
|
4177
|
+
Defaults to `undefined`, meaning that the dialog will grow to fit its contents.
|
4106
4178
|
@param {String|Function(config)} [options.template]
|
4107
4179
|
A string containing the HTML structure of the modal.
|
4108
4180
|
You can supply an alternative template string, but make sure that it
|
4109
|
-
contains
|
4181
|
+
contains a containing tag with the class `up-modal`.
|
4110
4182
|
|
4111
4183
|
You can also supply a function that returns a HTML string.
|
4112
4184
|
The function will be called with the modal options (merged from these defaults
|
@@ -4120,8 +4192,23 @@ For small popup overlays ("dropdowns") see [up.popup](/up.popup) instead.
|
|
4120
4192
|
The animation used to close the modal. The animation will be applied
|
4121
4193
|
to both the dialog box and the overlay dimming the page.
|
4122
4194
|
*/
|
4123
|
-
|
4124
|
-
|
4195
|
+
config = u.config({
|
4196
|
+
maxWidth: void 0,
|
4197
|
+
minWidth: void 0,
|
4198
|
+
width: void 0,
|
4199
|
+
height: void 0,
|
4200
|
+
openAnimation: 'fade-in',
|
4201
|
+
closeAnimation: 'fade-out',
|
4202
|
+
closeLabel: '×',
|
4203
|
+
template: function(config) {
|
4204
|
+
return "<div class=\"up-modal\">\n <div class=\"up-modal-dialog\">\n <div class=\"up-modal-close\" up-close>" + config.closeLabel + "</div>\n <div class=\"up-modal-content\"></div>\n </div>\n</div>";
|
4205
|
+
}
|
4206
|
+
});
|
4207
|
+
currentSource = void 0;
|
4208
|
+
reset = function() {
|
4209
|
+
close();
|
4210
|
+
currentSource = void 0;
|
4211
|
+
return config.reset();
|
4125
4212
|
};
|
4126
4213
|
templateHtml = function() {
|
4127
4214
|
var template;
|
@@ -4144,32 +4231,53 @@ For small popup overlays ("dropdowns") see [up.popup](/up.popup) instead.
|
|
4144
4231
|
$popup.removeAttr('up-previous-url');
|
4145
4232
|
return $popup.removeAttr('up-previous-title');
|
4146
4233
|
};
|
4147
|
-
createHiddenModal = function(
|
4234
|
+
createHiddenModal = function(options) {
|
4148
4235
|
var $content, $dialog, $modal, $placeholder;
|
4149
4236
|
$modal = $(templateHtml());
|
4150
|
-
if (sticky) {
|
4237
|
+
if (options.sticky) {
|
4151
4238
|
$modal.attr('up-sticky', '');
|
4152
4239
|
}
|
4153
4240
|
$modal.attr('up-previous-url', up.browser.url());
|
4154
4241
|
$modal.attr('up-previous-title', document.title);
|
4155
4242
|
$dialog = $modal.find('.up-modal-dialog');
|
4156
|
-
if (u.isPresent(width)) {
|
4157
|
-
$dialog.css('width', width);
|
4243
|
+
if (u.isPresent(options.width)) {
|
4244
|
+
$dialog.css('width', options.width);
|
4158
4245
|
}
|
4159
|
-
if (u.isPresent(
|
4160
|
-
$dialog.css('
|
4246
|
+
if (u.isPresent(options.maxWidth)) {
|
4247
|
+
$dialog.css('max-width', options.maxWidth);
|
4161
4248
|
}
|
4162
|
-
|
4163
|
-
|
4249
|
+
if (u.isPresent(options.height)) {
|
4250
|
+
$dialog.css('height', options.height);
|
4251
|
+
}
|
4252
|
+
$content = $modal.find('.up-modal-content');
|
4253
|
+
$placeholder = u.$createElementFromSelector(options.selector);
|
4164
4254
|
$placeholder.appendTo($content);
|
4165
4255
|
$modal.appendTo(document.body);
|
4166
4256
|
rememberHistory();
|
4167
4257
|
$modal.hide();
|
4168
4258
|
return $modal;
|
4169
4259
|
};
|
4260
|
+
unshiftBody = void 0;
|
4261
|
+
shiftBody = function() {
|
4262
|
+
var bodyRightPadding, bodyRightShift, scrollbarWidth;
|
4263
|
+
scrollbarWidth = u.scrollbarWidth();
|
4264
|
+
bodyRightPadding = parseInt($('body').css('padding-right'));
|
4265
|
+
bodyRightShift = scrollbarWidth + bodyRightPadding;
|
4266
|
+
return unshiftBody = u.temporaryCss($('body'), {
|
4267
|
+
'padding-right': bodyRightShift + "px",
|
4268
|
+
'overflow-y': 'hidden'
|
4269
|
+
});
|
4270
|
+
};
|
4170
4271
|
updated = function($modal, animation, animateOptions) {
|
4272
|
+
var promise;
|
4273
|
+
up.bus.emit('modal:open');
|
4274
|
+
shiftBody();
|
4171
4275
|
$modal.show();
|
4172
|
-
|
4276
|
+
promise = up.animate($modal, animation, animateOptions);
|
4277
|
+
promise.then(function() {
|
4278
|
+
return up.bus.emit('modal:opened');
|
4279
|
+
});
|
4280
|
+
return promise;
|
4173
4281
|
};
|
4174
4282
|
|
4175
4283
|
/**
|
@@ -4187,6 +4295,13 @@ For small popup overlays ("dropdowns") see [up.popup](/up.popup) instead.
|
|
4187
4295
|
This will request `/foo`, extract the `.list` selector from the response
|
4188
4296
|
and open the selected container in a modal dialog.
|
4189
4297
|
|
4298
|
+
\#\#\#\# Events
|
4299
|
+
|
4300
|
+
- Emits an [event](/up.bus) `modal:open` when the modal
|
4301
|
+
is starting to open.
|
4302
|
+
- Emits an [event](/up.bus) `modal:opened` when the opening
|
4303
|
+
animation has finished and the modal contents are fully visible.
|
4304
|
+
|
4190
4305
|
@method up.modal.open
|
4191
4306
|
@param {Element|jQuery|String} [elementOrSelector]
|
4192
4307
|
The link to follow.
|
@@ -4219,7 +4334,7 @@ For small popup overlays ("dropdowns") see [up.popup](/up.popup) instead.
|
|
4219
4334
|
A promise that will be resolved when the modal has finished loading.
|
4220
4335
|
*/
|
4221
4336
|
open = function() {
|
4222
|
-
var $link, $modal, animateOptions, animation, args, height, history, options, selector, sticky, url, width;
|
4337
|
+
var $link, $modal, animateOptions, animation, args, height, history, maxWidth, options, selector, sticky, url, width;
|
4223
4338
|
args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
|
4224
4339
|
if (u.isObject(args[0]) && !u.isElement(args[0]) && !u.isJQuery(args[0])) {
|
4225
4340
|
$link = u.nullJquery();
|
@@ -4232,13 +4347,20 @@ For small popup overlays ("dropdowns") see [up.popup](/up.popup) instead.
|
|
4232
4347
|
url = u.option(options.url, $link.attr('up-href'), $link.attr('href'));
|
4233
4348
|
selector = u.option(options.target, $link.attr('up-modal'), 'body');
|
4234
4349
|
width = u.option(options.width, $link.attr('up-width'), config.width);
|
4350
|
+
maxWidth = u.option(options.maxWidth, $link.attr('up-max-width'), config.maxWidth);
|
4235
4351
|
height = u.option(options.height, $link.attr('up-height'), config.height);
|
4236
4352
|
animation = u.option(options.animation, $link.attr('up-animation'), config.openAnimation);
|
4237
4353
|
sticky = u.option(options.sticky, $link.is('[up-sticky]'));
|
4238
4354
|
history = up.browser.canPushState() ? u.option(options.history, $link.attr('up-history'), true) : false;
|
4239
4355
|
animateOptions = up.motion.animateOptions(options, $link);
|
4240
4356
|
close();
|
4241
|
-
$modal = createHiddenModal(
|
4357
|
+
$modal = createHiddenModal({
|
4358
|
+
selector: selector,
|
4359
|
+
width: width,
|
4360
|
+
maxWidth: maxWidth,
|
4361
|
+
height: height,
|
4362
|
+
sticky: sticky
|
4363
|
+
});
|
4242
4364
|
return up.replace(selector, url, {
|
4243
4365
|
history: history,
|
4244
4366
|
insert: function() {
|
@@ -4263,12 +4385,19 @@ For small popup overlays ("dropdowns") see [up.popup](/up.popup) instead.
|
|
4263
4385
|
Closes a currently opened modal overlay.
|
4264
4386
|
Does nothing if no modal is currently open.
|
4265
4387
|
|
4388
|
+
\#\#\#\# Events
|
4389
|
+
|
4390
|
+
- Emits an [event](/up.bus) `modal:close` when the modal
|
4391
|
+
is starting to close.
|
4392
|
+
- Emits an [event](/up.bus) `modal:closed` when the closing
|
4393
|
+
animation has finished and the modal has been removed from the DOM.
|
4394
|
+
|
4266
4395
|
@method up.modal.close
|
4267
4396
|
@param {Object} options
|
4268
4397
|
See options for [`up.animate`](/up.motion#up.animate)
|
4269
4398
|
*/
|
4270
4399
|
close = function(options) {
|
4271
|
-
var $modal;
|
4400
|
+
var $modal, promise;
|
4272
4401
|
$modal = $('.up-modal');
|
4273
4402
|
if ($modal.length) {
|
4274
4403
|
options = u.options(options, {
|
@@ -4277,7 +4406,15 @@ For small popup overlays ("dropdowns") see [up.popup](/up.popup) instead.
|
|
4277
4406
|
title: $modal.attr('up-previous-title')
|
4278
4407
|
});
|
4279
4408
|
currentSource = void 0;
|
4280
|
-
|
4409
|
+
up.bus.emit('modal:close');
|
4410
|
+
promise = up.destroy($modal, options);
|
4411
|
+
promise.then(function() {
|
4412
|
+
unshiftBody();
|
4413
|
+
return up.bus.emit('modal:closed');
|
4414
|
+
});
|
4415
|
+
return promise;
|
4416
|
+
} else {
|
4417
|
+
return u.resolvedPromise();
|
4281
4418
|
}
|
4282
4419
|
};
|
4283
4420
|
autoclose = function() {
|
@@ -4406,12 +4543,12 @@ For small popup overlays ("dropdowns") see [up.popup](/up.popup) instead.
|
|
4406
4543
|
return close();
|
4407
4544
|
}
|
4408
4545
|
});
|
4409
|
-
up.bus.on('framework:reset',
|
4546
|
+
up.bus.on('framework:reset', reset);
|
4410
4547
|
return {
|
4411
4548
|
open: open,
|
4412
4549
|
close: close,
|
4413
4550
|
source: source,
|
4414
|
-
defaults:
|
4551
|
+
defaults: config.update,
|
4415
4552
|
contains: contains
|
4416
4553
|
};
|
4417
4554
|
})();
|
@@ -4571,10 +4708,31 @@ by providing instant feedback for user interactions.
|
|
4571
4708
|
|
4572
4709
|
(function() {
|
4573
4710
|
up.navigation = (function() {
|
4574
|
-
var CLASS_ACTIVE,
|
4711
|
+
var CLASS_ACTIVE, SELECTORS_SECTION, SELECTOR_ACTIVE, SELECTOR_SECTION, SELECTOR_SECTION_INSTANT, config, currentClass, enlargeClickArea, locationChanged, normalizeUrl, reset, sectionClicked, sectionUrls, selector, u, unmarkActive, urlSet;
|
4575
4712
|
u = up.util;
|
4713
|
+
|
4714
|
+
/**
|
4715
|
+
Sets default options for this module.
|
4716
|
+
|
4717
|
+
@param {Number} [options.currentClass]
|
4718
|
+
The class to set on [links that point the current location](#up-current).
|
4719
|
+
@method up.navigation.defaults
|
4720
|
+
*/
|
4721
|
+
config = u.config({
|
4722
|
+
currentClass: 'up-current'
|
4723
|
+
});
|
4724
|
+
reset = function() {
|
4725
|
+
return config.reset();
|
4726
|
+
};
|
4727
|
+
currentClass = function() {
|
4728
|
+
var klass;
|
4729
|
+
klass = config.currentClass;
|
4730
|
+
if (!u.contains(klass, 'up-current')) {
|
4731
|
+
klass += ' up-current';
|
4732
|
+
}
|
4733
|
+
return klass;
|
4734
|
+
};
|
4576
4735
|
CLASS_ACTIVE = 'up-active';
|
4577
|
-
CLASS_CURRENT = 'up-current';
|
4578
4736
|
SELECTORS_SECTION = ['a', '[up-href]', '[up-alias]'];
|
4579
4737
|
SELECTOR_SECTION = SELECTORS_SECTION.join(', ');
|
4580
4738
|
SELECTOR_SECTION_INSTANT = ((function() {
|
@@ -4637,16 +4795,17 @@ by providing instant feedback for user interactions.
|
|
4637
4795
|
};
|
4638
4796
|
};
|
4639
4797
|
locationChanged = function() {
|
4640
|
-
var currentUrls;
|
4798
|
+
var currentUrls, klass;
|
4641
4799
|
currentUrls = urlSet([normalizeUrl(up.browser.url()), normalizeUrl(up.modal.source()), normalizeUrl(up.popup.source())]);
|
4800
|
+
klass = currentClass();
|
4642
4801
|
return u.each($(SELECTOR_SECTION), function(section) {
|
4643
4802
|
var $section, urls;
|
4644
4803
|
$section = $(section);
|
4645
4804
|
urls = sectionUrls($section);
|
4646
4805
|
if (currentUrls.matchesAny(urls)) {
|
4647
|
-
return $section.addClass(
|
4806
|
+
return $section.addClass(klass);
|
4648
4807
|
} else {
|
4649
|
-
return $section.removeClass(
|
4808
|
+
return $section.removeClass(klass);
|
4650
4809
|
}
|
4651
4810
|
});
|
4652
4811
|
};
|
@@ -4748,11 +4907,15 @@ by providing instant feedback for user interactions.
|
|
4748
4907
|
unmarkActive();
|
4749
4908
|
return locationChanged();
|
4750
4909
|
});
|
4751
|
-
|
4910
|
+
up.bus.on('fragment:destroy', function($fragment) {
|
4752
4911
|
if ($fragment.is('.up-modal, .up-popup')) {
|
4753
4912
|
return locationChanged();
|
4754
4913
|
}
|
4755
4914
|
});
|
4915
|
+
up.bus.on('framework:reset', reset);
|
4916
|
+
return {
|
4917
|
+
defaults: config.update
|
4918
|
+
};
|
4756
4919
|
})();
|
4757
4920
|
|
4758
4921
|
}).call(this);
|