unpoly-rails 0.25.2 → 0.26.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 +19 -0
- data/dist/unpoly.css +21 -9
- data/dist/unpoly.js +345 -157
- data/dist/unpoly.min.css +1 -1
- data/dist/unpoly.min.js +3 -3
- data/lib/assets/javascripts/unpoly.js.coffee +1 -1
- data/lib/assets/javascripts/unpoly/browser.js.coffee +47 -21
- data/lib/assets/javascripts/unpoly/bus.js.coffee +15 -7
- data/lib/assets/javascripts/unpoly/flow.js.coffee +1 -1
- data/lib/assets/javascripts/unpoly/log.js.coffee +78 -7
- data/lib/assets/javascripts/unpoly/module.js.coffee.erb +6 -0
- data/lib/assets/javascripts/unpoly/motion.js.coffee +2 -2
- data/lib/assets/javascripts/unpoly/popup.js.coffee +2 -0
- data/lib/assets/javascripts/unpoly/syntax.js.coffee +1 -1
- data/lib/assets/javascripts/unpoly/tooltip.js.coffee +2 -2
- data/lib/assets/javascripts/unpoly/util.js.coffee +55 -3
- data/lib/assets/stylesheets/unpoly/error.css.sass +11 -5
- data/lib/assets/stylesheets/unpoly/tooltip.css.sass +9 -4
- data/lib/unpoly/rails/version.rb +1 -1
- data/spec_app/Gemfile.lock +1 -1
- data/spec_app/spec/javascripts/helpers/enable_logging.js.coffee +2 -0
- data/spec_app/spec/javascripts/helpers/to_have_request_method.js.coffee +0 -1
- data/spec_app/spec/javascripts/helpers/wait_until_dom_ready.js.coffee +3 -0
- data/spec_app/spec/javascripts/up/log_spec.js.coffee +46 -0
- data/spec_app/spec/javascripts/up/popup_spec.js.coffee +30 -8
- data/spec_app/spec/javascripts/up/util_spec.js.coffee +18 -1
- metadata +6 -3
- data/lib/assets/javascripts/unpoly/module.js.coffee +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7039fd337b09cb3538de1a1d83b253689ff0cad7
|
4
|
+
data.tar.gz: e757bc24a9379ab5d9b6a6e9884718d75bf94ed5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4f11fe51e4a7541923d428336b6166b4d2c3a43d00da245731048e89d50edd15fe3bf8bad05724629ce249c8f5c08b7aea62b76a5e0f0c6aa9867793a7ebf76b
|
7
|
+
data.tar.gz: 82190a7430b26ce7e0c73fd0b177c36931dd7344e7e48054aa05adb83b74dc32566b75a8efa171c6096aef856a762f40d594658ecf58e214335b6f7a30ea4973
|
data/CHANGELOG.md
CHANGED
@@ -10,10 +10,29 @@ Unreleased
|
|
10
10
|
|
11
11
|
### Compatible changes
|
12
12
|
|
13
|
+
|
13
14
|
### Breaking changes
|
14
15
|
|
15
16
|
|
16
17
|
|
18
|
+
0.26.0
|
19
|
+
------
|
20
|
+
|
21
|
+
### Compatible changes
|
22
|
+
|
23
|
+
- [Popups](/up.popup) no longer scroll with the document if they are attached to an element with `position: fixed`
|
24
|
+
- [Tooltips](/up.tooltip) no longer flicker if an [`[up-tooltip]`](/up-tooltip) elements has children
|
25
|
+
- [Tooltips](/up.tooltip) no longer flicker if the user moves the mouse too close to the tooltip triangle
|
26
|
+
- Before [compiling](/up.compile) the body, Unpoly now explicitly waits until user-provided compiles have been registered and the DOM is ready.
|
27
|
+
- Debugging messages in the developer console are now disabled by default. Call [`up.log.enable()`](/up.log.enable) to get them back.
|
28
|
+
- New configuration options in [`up.log.config`](/up.log.config): `up.log.config.enabled`, `up.log.config.collapse` and
|
29
|
+
`up.log.config.prefix`.
|
30
|
+
- Improve formatting of error messages.
|
31
|
+
- New experimental utility function [`up.util.escapeHtml`](/up.util.escapeHtml).
|
32
|
+
- If an error is thrown before the document is ready, Unpoly now waits until the document is ready before showing the red error box.
|
33
|
+
|
34
|
+
|
35
|
+
|
17
36
|
0.25.2
|
18
37
|
------
|
19
38
|
|
data/dist/unpoly.css
CHANGED
@@ -1,19 +1,26 @@
|
|
1
1
|
[up-close] {
|
2
2
|
cursor: pointer; }
|
3
3
|
.up-error {
|
4
|
-
background-color: #
|
4
|
+
background-color: #c30;
|
5
5
|
color: white;
|
6
|
-
padding:
|
6
|
+
padding: 10px;
|
7
7
|
font-family: arial, helvetica, sans-serif;
|
8
|
-
font-weight: bold;
|
9
8
|
font-size: 14px;
|
10
9
|
line-height: 18px;
|
11
10
|
position: fixed;
|
12
11
|
left: 0;
|
13
|
-
|
12
|
+
bottom: 0;
|
14
13
|
max-width: 100%;
|
15
14
|
box-sizing: border-box;
|
16
15
|
z-index: 99999999; }
|
16
|
+
|
17
|
+
.up-error-variable {
|
18
|
+
background-color: rgba(0, 0, 0, 0.3);
|
19
|
+
padding: 1px 3px;
|
20
|
+
border-radius: 2px;
|
21
|
+
font-weight: normal;
|
22
|
+
max-width: 100px;
|
23
|
+
overflow: hidden; }
|
17
24
|
[up-href] {
|
18
25
|
cursor: pointer; }
|
19
26
|
.up-modal {
|
@@ -89,7 +96,8 @@
|
|
89
96
|
background-color: #111;
|
90
97
|
color: white;
|
91
98
|
padding: 6px 9px;
|
92
|
-
white-space: nowrap;
|
99
|
+
white-space: nowrap;
|
100
|
+
pointer-events: none; }
|
93
101
|
.up-tooltip:after {
|
94
102
|
content: "";
|
95
103
|
position: absolute;
|
@@ -101,27 +109,31 @@
|
|
101
109
|
margin-top: -6px; }
|
102
110
|
.up-tooltip[up-position=top]:after {
|
103
111
|
border-top-color: #111;
|
104
|
-
bottom:
|
112
|
+
border-bottom-width: 0;
|
113
|
+
bottom: -8px;
|
105
114
|
left: 50%;
|
106
115
|
margin-left: -8px; }
|
107
116
|
.up-tooltip[up-position=left] {
|
108
117
|
margin-left: -6px; }
|
109
118
|
.up-tooltip[up-position=left]:after {
|
110
119
|
border-left-color: #111;
|
111
|
-
right:
|
120
|
+
border-right-width: 0;
|
121
|
+
right: -8px;
|
112
122
|
top: 50%;
|
113
123
|
margin-top: -8px; }
|
114
124
|
.up-tooltip[up-position=right] {
|
115
125
|
margin-left: 6px; }
|
116
126
|
.up-tooltip[up-position=right]:after {
|
117
127
|
border-right-color: #111;
|
118
|
-
left:
|
128
|
+
border-left-width: 0;
|
129
|
+
left: -8px;
|
119
130
|
top: 50%;
|
120
131
|
margin-top: -8px; }
|
121
132
|
.up-tooltip[up-position=bottom] {
|
122
133
|
margin-top: 6px; }
|
123
134
|
.up-tooltip[up-position=bottom]:after {
|
124
135
|
border-bottom-color: #111;
|
125
|
-
top:
|
136
|
+
border-top-width: 0;
|
137
|
+
top: -8px;
|
126
138
|
left: 50%;
|
127
139
|
margin-left: -8px; }
|
data/dist/unpoly.js
CHANGED
@@ -4,7 +4,9 @@
|
|
4
4
|
*/
|
5
5
|
|
6
6
|
(function() {
|
7
|
-
window.up = {
|
7
|
+
window.up = {
|
8
|
+
version: "0.26.0"
|
9
|
+
};
|
8
10
|
|
9
11
|
}).call(this);
|
10
12
|
|
@@ -29,7 +31,7 @@ that might save you from loading something like [Underscore.js](http://underscor
|
|
29
31
|
@function up.util.noop
|
30
32
|
@experimental
|
31
33
|
*/
|
32
|
-
var $createElementFromSelector, $createPlaceholder, ANIMATION_DEFERRED_KEY, all, any, appendRequestData, cache, castedAttr, clientSize, compact, config, contains, copy, copyAttributes, createElement, createElementFromHtml, cssAnimate, detect, documentHasVerticalScrollbar, each, error, escapePressed, except, extend, extractOptions, findWithSelf, finishCssAnimate, fixedToAbsolute, forceCompositing, forceRepaint, intersect, isArray, isBlank, isDeferred, isDefined, isDetached, isElement, isFormData, isFunction, isGiven, isHash, isJQuery, isMissing, isNull, isNumber, isObject, isPresent, isPromise, isStandardPort, isString, isUndefined, isUnmodifiedKeyEvent, isUnmodifiedMouseEvent, last, locationFromXhr, map, measure, memoize, merge, methodFromXhr, multiSelector, nextFrame, nonUpClasses, noop, normalizeMethod, normalizeUrl, nullJQuery, offsetParent, once, only, opacity, option, options, parseUrl, pluckData, pluckKey, presence, presentAttr, reject, remove, requestDataAsArray, requestDataAsQuery, requestDataFromForm, resolvableWhen, resolvedDeferred, resolvedPromise, scrollbarWidth, select, selectorForElement, setMissingAttrs, setTimer, temporaryCss, times, titleFromXhr, toArray, trim, unJQuery, uniq, unresolvableDeferred, unresolvablePromise, unwrapElement;
|
34
|
+
var $createElementFromSelector, $createPlaceholder, ANIMATION_DEFERRED_KEY, ESCAPE_HTML_ENTITY_MAP, all, any, appendRequestData, cache, castedAttr, clientSize, compact, config, contains, copy, copyAttributes, createElement, createElementFromHtml, cssAnimate, detect, documentHasVerticalScrollbar, each, error, escapeHtml, escapePressed, except, extend, extractOptions, findWithSelf, finishCssAnimate, fixedToAbsolute, forceCompositing, forceRepaint, identity, intersect, isArray, isBlank, isDeferred, isDefined, isDetached, isElement, isFixed, isFormData, isFunction, isGiven, isHash, isJQuery, isMissing, isNull, isNumber, isObject, isPresent, isPromise, isStandardPort, isString, isUndefined, isUnmodifiedKeyEvent, isUnmodifiedMouseEvent, last, locationFromXhr, map, measure, memoize, merge, methodFromXhr, multiSelector, nextFrame, nonUpClasses, noop, normalizeMethod, normalizeUrl, nullJQuery, offsetParent, once, only, opacity, option, options, parseUrl, pluckData, pluckKey, presence, presentAttr, reject, remove, requestDataAsArray, requestDataAsQuery, requestDataFromForm, resolvableWhen, resolvedDeferred, resolvedPromise, scrollbarWidth, select, selectorForElement, setMissingAttrs, setTimer, temporaryCss, times, titleFromXhr, toArray, trim, unJQuery, uniq, unresolvableDeferred, unresolvablePromise, unwrapElement, whenReady;
|
33
35
|
noop = $.noop;
|
34
36
|
|
35
37
|
/**
|
@@ -1790,6 +1792,28 @@ that might save you from loading something like [Underscore.js](http://underscor
|
|
1790
1792
|
return $match;
|
1791
1793
|
};
|
1792
1794
|
|
1795
|
+
/**
|
1796
|
+
Returns if the given element has a `fixed` position.
|
1797
|
+
|
1798
|
+
@function up.util.isFixed
|
1799
|
+
@internal
|
1800
|
+
*/
|
1801
|
+
isFixed = function(element) {
|
1802
|
+
var $element, position;
|
1803
|
+
$element = $(element);
|
1804
|
+
while (true) {
|
1805
|
+
position = $element.css('position');
|
1806
|
+
if (position === 'fixed') {
|
1807
|
+
return true;
|
1808
|
+
} else {
|
1809
|
+
$element = $element.parent();
|
1810
|
+
if ($element.length === 0 || $element.is(document)) {
|
1811
|
+
return false;
|
1812
|
+
}
|
1813
|
+
}
|
1814
|
+
}
|
1815
|
+
};
|
1816
|
+
|
1793
1817
|
/**
|
1794
1818
|
@function up.util.fixedToAbsolute
|
1795
1819
|
@internal
|
@@ -1932,15 +1956,41 @@ that might save you from loading something like [Underscore.js](http://underscor
|
|
1932
1956
|
@experimental
|
1933
1957
|
*/
|
1934
1958
|
error = function() {
|
1935
|
-
var
|
1959
|
+
var args, asString, ref, ref1;
|
1936
1960
|
args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
|
1937
1961
|
(ref = up.log).error.apply(ref, args);
|
1962
|
+
whenReady().then(function() {
|
1963
|
+
var $error, asHtml, formatter, ref1;
|
1964
|
+
$error = presence($('.up-error')) || $('<div class="up-error"></div>').prependTo('body');
|
1965
|
+
formatter = function(arg) {
|
1966
|
+
return "<span class='up-error-variable'>" + (escapeHtml(arg)) + "</span>";
|
1967
|
+
};
|
1968
|
+
asHtml = (ref1 = up.browser).sprintfWithFormattedArgs.apply(ref1, [formatter].concat(slice.call(args)));
|
1969
|
+
return $error.html(asHtml);
|
1970
|
+
});
|
1938
1971
|
asString = (ref1 = up.browser).sprintf.apply(ref1, args);
|
1939
|
-
$error = presence($('.up-error')) || $('<div class="up-error"></div>').prependTo('body');
|
1940
|
-
$error.addClass('up-error');
|
1941
|
-
$error.text(asString);
|
1942
1972
|
throw new Error(asString);
|
1943
1973
|
};
|
1974
|
+
ESCAPE_HTML_ENTITY_MAP = {
|
1975
|
+
"&": "&",
|
1976
|
+
"<": "<",
|
1977
|
+
">": ">",
|
1978
|
+
'"': '"'
|
1979
|
+
};
|
1980
|
+
|
1981
|
+
/**
|
1982
|
+
Escapes the given string of HTML by replacing control chars with their HTML entities.
|
1983
|
+
|
1984
|
+
@function up.util.escapeHtml
|
1985
|
+
@param {String} string
|
1986
|
+
The text that should be escaped
|
1987
|
+
@experimental
|
1988
|
+
*/
|
1989
|
+
escapeHtml = function(string) {
|
1990
|
+
return string.replace(/[&<>"]/g, function(char) {
|
1991
|
+
return ESCAPE_HTML_ENTITY_MAP[char];
|
1992
|
+
});
|
1993
|
+
};
|
1944
1994
|
pluckKey = function(object, key) {
|
1945
1995
|
var value;
|
1946
1996
|
value = object[key];
|
@@ -1972,6 +2022,21 @@ that might save you from loading something like [Underscore.js](http://underscor
|
|
1972
2022
|
return void 0;
|
1973
2023
|
}
|
1974
2024
|
};
|
2025
|
+
whenReady = memoize(function() {
|
2026
|
+
var deferred;
|
2027
|
+
if ($.isReady) {
|
2028
|
+
return resolvedPromise();
|
2029
|
+
} else {
|
2030
|
+
deferred = $.Deferred();
|
2031
|
+
$(function() {
|
2032
|
+
return deferred.resolve();
|
2033
|
+
});
|
2034
|
+
return deferred.promise();
|
2035
|
+
}
|
2036
|
+
});
|
2037
|
+
identity = function(arg) {
|
2038
|
+
return arg;
|
2039
|
+
};
|
1975
2040
|
|
1976
2041
|
/**
|
1977
2042
|
Returns whether the given element has been detached from the DOM
|
@@ -1992,6 +2057,7 @@ that might save you from loading something like [Underscore.js](http://underscor
|
|
1992
2057
|
requestDataFromForm: requestDataFromForm,
|
1993
2058
|
offsetParent: offsetParent,
|
1994
2059
|
fixedToAbsolute: fixedToAbsolute,
|
2060
|
+
isFixed: isFixed,
|
1995
2061
|
presentAttr: presentAttr,
|
1996
2062
|
createElement: createElement,
|
1997
2063
|
parseUrl: parseUrl,
|
@@ -2030,6 +2096,7 @@ that might save you from loading something like [Underscore.js](http://underscor
|
|
2030
2096
|
isObject: isObject,
|
2031
2097
|
isFunction: isFunction,
|
2032
2098
|
isString: isString,
|
2099
|
+
isNumber: isNumber,
|
2033
2100
|
isElement: isElement,
|
2034
2101
|
isJQuery: isJQuery,
|
2035
2102
|
isPromise: isPromise,
|
@@ -2082,7 +2149,10 @@ that might save you from loading something like [Underscore.js](http://underscor
|
|
2082
2149
|
extractOptions: extractOptions,
|
2083
2150
|
isDetached: isDetached,
|
2084
2151
|
noop: noop,
|
2085
|
-
opacity: opacity
|
2152
|
+
opacity: opacity,
|
2153
|
+
whenReady: whenReady,
|
2154
|
+
identity: identity,
|
2155
|
+
escapeHtml: escapeHtml
|
2086
2156
|
};
|
2087
2157
|
})($);
|
2088
2158
|
|
@@ -2090,117 +2160,6 @@ that might save you from loading something like [Underscore.js](http://underscor
|
|
2090
2160
|
|
2091
2161
|
}).call(this);
|
2092
2162
|
|
2093
|
-
/**
|
2094
|
-
Logging
|
2095
|
-
=======
|
2096
|
-
|
2097
|
-
Elaborate wrappers around `window.console`.
|
2098
|
-
Should only used internally since they prefix `ᴜᴘ` to each
|
2099
|
-
printed message.
|
2100
|
-
*/
|
2101
|
-
|
2102
|
-
(function() {
|
2103
|
-
var slice = [].slice;
|
2104
|
-
|
2105
|
-
up.log = (function($) {
|
2106
|
-
var debug, error, group, prefix, puts, warn;
|
2107
|
-
prefix = function(message) {
|
2108
|
-
return "ᴜᴘ " + message;
|
2109
|
-
};
|
2110
|
-
|
2111
|
-
/**
|
2112
|
-
Prints a debugging message to the browser console.
|
2113
|
-
|
2114
|
-
@function up.debug
|
2115
|
-
@param {String} message
|
2116
|
-
@param {Array} args...
|
2117
|
-
@internal
|
2118
|
-
*/
|
2119
|
-
debug = function() {
|
2120
|
-
var args, message, ref;
|
2121
|
-
message = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
|
2122
|
-
if (message) {
|
2123
|
-
return (ref = up.browser).puts.apply(ref, ['debug', prefix(message)].concat(slice.call(args)));
|
2124
|
-
}
|
2125
|
-
};
|
2126
|
-
|
2127
|
-
/**
|
2128
|
-
Prints a logging message to the browser console.
|
2129
|
-
|
2130
|
-
@function up.puts
|
2131
|
-
@param {String} message
|
2132
|
-
@param {Array} args...
|
2133
|
-
@internal
|
2134
|
-
*/
|
2135
|
-
puts = function() {
|
2136
|
-
var args, message, ref;
|
2137
|
-
message = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
|
2138
|
-
if (message) {
|
2139
|
-
return (ref = up.browser).puts.apply(ref, ['log', prefix(message)].concat(slice.call(args)));
|
2140
|
-
}
|
2141
|
-
};
|
2142
|
-
|
2143
|
-
/**
|
2144
|
-
@function up.log.warn
|
2145
|
-
@internal
|
2146
|
-
*/
|
2147
|
-
warn = function() {
|
2148
|
-
var args, message, ref;
|
2149
|
-
message = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
|
2150
|
-
if (message) {
|
2151
|
-
return (ref = up.browser).puts.apply(ref, ['warn', prefix(message)].concat(slice.call(args)));
|
2152
|
-
}
|
2153
|
-
};
|
2154
|
-
|
2155
|
-
/**
|
2156
|
-
- Makes sure the group always closes
|
2157
|
-
- Does not make a group if the message is nil
|
2158
|
-
|
2159
|
-
@function up.log.group
|
2160
|
-
@internal
|
2161
|
-
*/
|
2162
|
-
group = function() {
|
2163
|
-
var args, block, message, ref;
|
2164
|
-
message = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
|
2165
|
-
block = args.pop();
|
2166
|
-
if (message) {
|
2167
|
-
(ref = up.browser).puts.apply(ref, ['group', prefix(message)].concat(slice.call(args)));
|
2168
|
-
try {
|
2169
|
-
return block();
|
2170
|
-
} finally {
|
2171
|
-
if (message) {
|
2172
|
-
console.groupEnd();
|
2173
|
-
}
|
2174
|
-
}
|
2175
|
-
} else {
|
2176
|
-
return block();
|
2177
|
-
}
|
2178
|
-
};
|
2179
|
-
|
2180
|
-
/**
|
2181
|
-
@function up.log.error
|
2182
|
-
@internal
|
2183
|
-
*/
|
2184
|
-
error = function() {
|
2185
|
-
var args, message, ref;
|
2186
|
-
message = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
|
2187
|
-
if (message) {
|
2188
|
-
return (ref = up.browser).puts.apply(ref, ['error', prefix(message)].concat(slice.call(args)));
|
2189
|
-
}
|
2190
|
-
};
|
2191
|
-
return {
|
2192
|
-
puts: puts,
|
2193
|
-
debug: debug,
|
2194
|
-
error: error,
|
2195
|
-
warn: warn,
|
2196
|
-
group: group
|
2197
|
-
};
|
2198
|
-
})(jQuery);
|
2199
|
-
|
2200
|
-
up.puts = up.log.puts;
|
2201
|
-
|
2202
|
-
}).call(this);
|
2203
|
-
|
2204
2163
|
/**
|
2205
2164
|
Browser interface
|
2206
2165
|
=================
|
@@ -2215,7 +2174,7 @@ we can't currently get rid off.
|
|
2215
2174
|
var slice = [].slice;
|
2216
2175
|
|
2217
2176
|
up.browser = (function($) {
|
2218
|
-
var CONSOLE_PLACEHOLDERS, canCssTransition, canFormData, canInputEvent, canLogSubstitution, canPushState, confirm, initialRequestMethod, installPolyfills, isIE8OrWorse, isIE9OrWorse, isRecentJQuery, isSupported, loadPage, popCookie, puts, sprintf, u, url;
|
2177
|
+
var CONSOLE_PLACEHOLDERS, canCssTransition, canFormData, canInputEvent, canLogSubstitution, canPushState, confirm, initialRequestMethod, installPolyfills, isIE8OrWorse, isIE9OrWorse, isRecentJQuery, isSupported, loadPage, popCookie, puts, sprintf, sprintfWithFormattedArgs, stringifyArg, u, url;
|
2219
2178
|
u = up.util;
|
2220
2179
|
|
2221
2180
|
/**
|
@@ -2278,13 +2237,54 @@ we can't currently get rid off.
|
|
2278
2237
|
stream = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
|
2279
2238
|
u.isDefined(console[stream]) || (stream = 'log');
|
2280
2239
|
if (canLogSubstitution()) {
|
2281
|
-
return console[stream].apply(console, args);
|
2240
|
+
return typeof console[stream] === "function" ? console[stream].apply(console, args) : void 0;
|
2282
2241
|
} else {
|
2283
2242
|
message = sprintf.apply(null, args);
|
2284
|
-
return console[stream](message);
|
2243
|
+
return typeof console[stream] === "function" ? console[stream](message) : void 0;
|
2285
2244
|
}
|
2286
2245
|
};
|
2287
2246
|
CONSOLE_PLACEHOLDERS = /\%[odisf]/g;
|
2247
|
+
stringifyArg = function(arg) {
|
2248
|
+
var $arg, attr, closer, j, len, maxLength, ref, string, value;
|
2249
|
+
maxLength = 100;
|
2250
|
+
closer = '';
|
2251
|
+
if (u.isString(arg)) {
|
2252
|
+
string = arg.replace(/[\n\r\t ]+/g, ' ');
|
2253
|
+
string = string.replace(/^[\n\r\t ]+/, '');
|
2254
|
+
string = string.replace(/[\n\r\t ]$/, '');
|
2255
|
+
string = "\"" + string + "\"";
|
2256
|
+
closer = '"';
|
2257
|
+
} else if (u.isUndefined(arg)) {
|
2258
|
+
string = 'undefined';
|
2259
|
+
} else if (u.isNumber(arg) || u.isFunction(arg)) {
|
2260
|
+
string = arg.toString();
|
2261
|
+
} else if (u.isArray(arg)) {
|
2262
|
+
string = "[" + (u.map(arg, stringifyArg).join(', ')) + "]";
|
2263
|
+
closer = ']';
|
2264
|
+
} else if (u.isJQuery(arg)) {
|
2265
|
+
string = "$(" + (u.map(arg, stringifyArg).join(', ')) + ")";
|
2266
|
+
closer = ')';
|
2267
|
+
} else if (u.isElement(arg)) {
|
2268
|
+
$arg = $(arg);
|
2269
|
+
string = "<" + (arg.tagName.toLowerCase());
|
2270
|
+
ref = ['id', 'name', 'class'];
|
2271
|
+
for (j = 0, len = ref.length; j < len; j++) {
|
2272
|
+
attr = ref[j];
|
2273
|
+
if (value = $arg.attr(attr)) {
|
2274
|
+
string += " " + attr + "=\"" + value + "\"";
|
2275
|
+
}
|
2276
|
+
}
|
2277
|
+
string += ">";
|
2278
|
+
closer = '>';
|
2279
|
+
} else {
|
2280
|
+
string = JSON.stringify(arg);
|
2281
|
+
}
|
2282
|
+
if (string.length > maxLength) {
|
2283
|
+
string = (string.substr(0, maxLength)) + " …";
|
2284
|
+
string += closer;
|
2285
|
+
}
|
2286
|
+
return string;
|
2287
|
+
};
|
2288
2288
|
|
2289
2289
|
/**
|
2290
2290
|
See https://developer.mozilla.org/en-US/docs/Web/API/Console#Using_string_substitutions
|
@@ -2293,33 +2293,23 @@ we can't currently get rid off.
|
|
2293
2293
|
@internal
|
2294
2294
|
*/
|
2295
2295
|
sprintf = function() {
|
2296
|
-
var args,
|
2296
|
+
var args, message;
|
2297
2297
|
message = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
|
2298
|
+
return sprintfWithFormattedArgs.apply(null, [u.identity, message].concat(slice.call(args)));
|
2299
|
+
};
|
2300
|
+
|
2301
|
+
/**
|
2302
|
+
@function up.browser.sprintfWithBounds
|
2303
|
+
@internal
|
2304
|
+
*/
|
2305
|
+
sprintfWithFormattedArgs = function() {
|
2306
|
+
var args, formatter, i, message;
|
2307
|
+
formatter = arguments[0], message = arguments[1], args = 3 <= arguments.length ? slice.call(arguments, 2) : [];
|
2298
2308
|
i = 0;
|
2299
|
-
maxLength = 80;
|
2300
2309
|
return message.replace(CONSOLE_PLACEHOLDERS, function() {
|
2301
|
-
var arg
|
2310
|
+
var arg;
|
2302
2311
|
arg = args[i];
|
2303
|
-
|
2304
|
-
if (argType === 'string') {
|
2305
|
-
arg = arg.replace(/\s+/g, ' ');
|
2306
|
-
if (arg.length > maxLength) {
|
2307
|
-
arg = (arg.substr(0, maxLength)) + "…";
|
2308
|
-
}
|
2309
|
-
arg = "\"" + arg + "\"";
|
2310
|
-
} else if (argType === 'undefined') {
|
2311
|
-
arg = 'undefined';
|
2312
|
-
} else if (argType === 'number' || argType === 'function') {
|
2313
|
-
arg = arg.toString();
|
2314
|
-
} else {
|
2315
|
-
arg = JSON.stringify(arg);
|
2316
|
-
}
|
2317
|
-
if (arg.length > maxLength) {
|
2318
|
-
arg = (arg.substr(0, maxLength)) + " …";
|
2319
|
-
if (argType === 'object' || argType === 'function') {
|
2320
|
-
arg += " }";
|
2321
|
-
}
|
2322
|
-
}
|
2312
|
+
arg = formatter(stringifyArg(arg));
|
2323
2313
|
i += 1;
|
2324
2314
|
return arg;
|
2325
2315
|
});
|
@@ -2492,7 +2482,8 @@ we can't currently get rid off.
|
|
2492
2482
|
isSupported: isSupported,
|
2493
2483
|
installPolyfills: installPolyfills,
|
2494
2484
|
puts: puts,
|
2495
|
-
sprintf: sprintf
|
2485
|
+
sprintf: sprintf,
|
2486
|
+
sprintfWithFormattedArgs: sprintfWithFormattedArgs
|
2496
2487
|
};
|
2497
2488
|
})(jQuery);
|
2498
2489
|
|
@@ -2902,7 +2893,7 @@ This improves jQuery's [`on`](http://api.jquery.com/on/) in multiple ways:
|
|
2902
2893
|
@experimental
|
2903
2894
|
*/
|
2904
2895
|
emitReset = function() {
|
2905
|
-
return
|
2896
|
+
return emit('up:framework:reset', {
|
2906
2897
|
message: 'Resetting framework'
|
2907
2898
|
});
|
2908
2899
|
};
|
@@ -2917,7 +2908,7 @@ This improves jQuery's [`on`](http://api.jquery.com/on/) in multiple ways:
|
|
2917
2908
|
/**
|
2918
2909
|
Boots the Unpoly framework.
|
2919
2910
|
|
2920
|
-
This is
|
2911
|
+
**This is called automatically** by including the Unpoly Javascript files.
|
2921
2912
|
|
2922
2913
|
Unpoly will not boot if the current browser is [not supported](/up.browser.isSupported).
|
2923
2914
|
This leaves you with a classic server-side application on legacy browsers.
|
@@ -2925,24 +2916,37 @@ This improves jQuery's [`on`](http://api.jquery.com/on/) in multiple ways:
|
|
2925
2916
|
Emits the [`up:framework:boot`](/up:framework:boot) event.
|
2926
2917
|
|
2927
2918
|
@function up.boot
|
2928
|
-
@
|
2919
|
+
@internal
|
2929
2920
|
*/
|
2930
2921
|
boot = function() {
|
2931
2922
|
if (up.browser.isSupported()) {
|
2932
2923
|
up.browser.installPolyfills();
|
2933
|
-
|
2924
|
+
emit('up:framework:boot', {
|
2934
2925
|
message: 'Booting framework'
|
2935
2926
|
});
|
2927
|
+
emit('up:framework:booted', {
|
2928
|
+
message: 'Framework booted'
|
2929
|
+
});
|
2930
|
+
return u.nextFrame(function() {
|
2931
|
+
return u.whenReady().then(function() {
|
2932
|
+
emit('up:app:boot', {
|
2933
|
+
message: 'Booting user application'
|
2934
|
+
});
|
2935
|
+
return emit('up:app:booted', {
|
2936
|
+
message: 'User application booted'
|
2937
|
+
});
|
2938
|
+
});
|
2939
|
+
});
|
2936
2940
|
}
|
2937
2941
|
};
|
2938
2942
|
|
2939
2943
|
/**
|
2940
|
-
This event is [emitted](/up.emit) when Unpoly [
|
2944
|
+
This event is [emitted](/up.emit) when Unpoly [starts to boot](/up.boot).
|
2941
2945
|
|
2942
2946
|
@event up:framework:boot
|
2943
|
-
@
|
2947
|
+
@internal
|
2944
2948
|
*/
|
2945
|
-
live('up:framework:
|
2949
|
+
live('up:framework:booted', snapshot);
|
2946
2950
|
live('up:framework:reset', restoreSnapshot);
|
2947
2951
|
return {
|
2948
2952
|
knife: eval(typeof Knife !== "undefined" && Knife !== null ? Knife.point : void 0),
|
@@ -2968,6 +2972,187 @@ This improves jQuery's [`on`](http://api.jquery.com/on/) in multiple ways:
|
|
2968
2972
|
|
2969
2973
|
}).call(this);
|
2970
2974
|
|
2975
|
+
/**
|
2976
|
+
Logging
|
2977
|
+
=======
|
2978
|
+
|
2979
|
+
Elaborate wrappers around `window.console`.
|
2980
|
+
Should only used internally since they prefix `ᴜᴘ` to each
|
2981
|
+
printed message.
|
2982
|
+
*/
|
2983
|
+
|
2984
|
+
(function() {
|
2985
|
+
var slice = [].slice;
|
2986
|
+
|
2987
|
+
up.log = (function($) {
|
2988
|
+
var config, debug, disable, enable, error, group, prefix, printBanner, puts, reset, u, warn;
|
2989
|
+
u = up.util;
|
2990
|
+
|
2991
|
+
/**
|
2992
|
+
Configures the logging output on the developer console.
|
2993
|
+
|
2994
|
+
@property up.log.config
|
2995
|
+
@param {Boolean} [options.enabled=false]
|
2996
|
+
Whether Unpoly will print debugging information to the developer console.
|
2997
|
+
|
2998
|
+
Debugging information includes which elements are being [compiled](/up.syntax)
|
2999
|
+
and which [events](/up.bus) are being emitted.
|
3000
|
+
Note that errors will always be printed, regardless of this setting.
|
3001
|
+
@param {Boolean} [options.collapse=false]
|
3002
|
+
Whether debugging information is printed as a collapsed tree.
|
3003
|
+
|
3004
|
+
Set this to `true` if you are overwhelmed by the debugging information Unpoly
|
3005
|
+
prints to the developer console.
|
3006
|
+
@param {String} [options.prefix='[UP] ']
|
3007
|
+
A string to prepend to Unpoly's logging messages so you can distinguish it from your own messages.
|
3008
|
+
@stable
|
3009
|
+
*/
|
3010
|
+
config = u.config({
|
3011
|
+
prefix: '[UP] ',
|
3012
|
+
enabled: false,
|
3013
|
+
collapse: false
|
3014
|
+
});
|
3015
|
+
reset = function() {
|
3016
|
+
return config.reset();
|
3017
|
+
};
|
3018
|
+
prefix = function(message) {
|
3019
|
+
return "" + config.prefix + message;
|
3020
|
+
};
|
3021
|
+
|
3022
|
+
/**
|
3023
|
+
Prints a debugging message to the browser console.
|
3024
|
+
|
3025
|
+
@function up.debug
|
3026
|
+
@param {String} message
|
3027
|
+
@param {Array} args...
|
3028
|
+
@internal
|
3029
|
+
*/
|
3030
|
+
debug = function() {
|
3031
|
+
var args, message, ref;
|
3032
|
+
message = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
|
3033
|
+
if (config.enabled && message) {
|
3034
|
+
return (ref = up.browser).puts.apply(ref, ['debug', prefix(message)].concat(slice.call(args)));
|
3035
|
+
}
|
3036
|
+
};
|
3037
|
+
|
3038
|
+
/**
|
3039
|
+
Prints a logging message to the browser console.
|
3040
|
+
|
3041
|
+
@function up.puts
|
3042
|
+
@param {String} message
|
3043
|
+
@param {Array} args...
|
3044
|
+
@internal
|
3045
|
+
*/
|
3046
|
+
puts = function() {
|
3047
|
+
var args, message, ref;
|
3048
|
+
message = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
|
3049
|
+
if (config.enabled && message) {
|
3050
|
+
return (ref = up.browser).puts.apply(ref, ['log', prefix(message)].concat(slice.call(args)));
|
3051
|
+
}
|
3052
|
+
};
|
3053
|
+
|
3054
|
+
/**
|
3055
|
+
@function up.log.warn
|
3056
|
+
@internal
|
3057
|
+
*/
|
3058
|
+
warn = function() {
|
3059
|
+
var args, message, ref;
|
3060
|
+
message = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
|
3061
|
+
if (config.enabled && message) {
|
3062
|
+
return (ref = up.browser).puts.apply(ref, ['warn', prefix(message)].concat(slice.call(args)));
|
3063
|
+
}
|
3064
|
+
};
|
3065
|
+
|
3066
|
+
/**
|
3067
|
+
- Makes sure the group always closes
|
3068
|
+
- Does not make a group if the message is nil
|
3069
|
+
|
3070
|
+
@function up.log.group
|
3071
|
+
@internal
|
3072
|
+
*/
|
3073
|
+
group = function() {
|
3074
|
+
var args, block, message, ref, stream;
|
3075
|
+
message = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
|
3076
|
+
block = args.pop();
|
3077
|
+
if (config.enabled && message) {
|
3078
|
+
stream = config.collapse ? 'groupCollapsed' : 'group';
|
3079
|
+
(ref = up.browser).puts.apply(ref, [stream, prefix(message)].concat(slice.call(args)));
|
3080
|
+
try {
|
3081
|
+
return block();
|
3082
|
+
} finally {
|
3083
|
+
if (message) {
|
3084
|
+
console.groupEnd();
|
3085
|
+
}
|
3086
|
+
}
|
3087
|
+
} else {
|
3088
|
+
return block();
|
3089
|
+
}
|
3090
|
+
};
|
3091
|
+
|
3092
|
+
/**
|
3093
|
+
@function up.log.error
|
3094
|
+
@internal
|
3095
|
+
*/
|
3096
|
+
error = function() {
|
3097
|
+
var args, message, ref;
|
3098
|
+
message = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
|
3099
|
+
if (message) {
|
3100
|
+
return (ref = up.browser).puts.apply(ref, ['error', prefix(message)].concat(slice.call(args)));
|
3101
|
+
}
|
3102
|
+
};
|
3103
|
+
printBanner = function() {
|
3104
|
+
var banner;
|
3105
|
+
banner = " __ _____ ___ ___ / /_ __\n" + ("/ // / _ \\/ _ \\/ _ \\/ / // / " + up.version + "\n") + "\\___/_//_/ .__/\\___/_/\\_. / \n" + " / / / /\n" + "\n";
|
3106
|
+
if (config.enabled) {
|
3107
|
+
banner += "Call `up.log.disable()` to disable debugging output.";
|
3108
|
+
} else {
|
3109
|
+
banner += "Call `up.log.enable()` to enable debugging output.";
|
3110
|
+
}
|
3111
|
+
return up.browser.puts('log', banner);
|
3112
|
+
};
|
3113
|
+
up.on('up:framework:boot', printBanner);
|
3114
|
+
up.on('up:framework:reset', reset);
|
3115
|
+
|
3116
|
+
/**
|
3117
|
+
Makes future Unpoly events print vast amounts of debugging information to the developer console.
|
3118
|
+
|
3119
|
+
Debugging information includes which elements are being [compiled](/up.syntax)
|
3120
|
+
and which [events](/up.bus) are being emitted.
|
3121
|
+
|
3122
|
+
@function up.log.enable
|
3123
|
+
@stable
|
3124
|
+
*/
|
3125
|
+
enable = function() {
|
3126
|
+
return config.enabled = true;
|
3127
|
+
};
|
3128
|
+
|
3129
|
+
/**
|
3130
|
+
Prevents future Unpoly events from printing vast amounts of debugging information to the developer console.
|
3131
|
+
|
3132
|
+
Errors will still be printed.
|
3133
|
+
|
3134
|
+
@function up.log.enable
|
3135
|
+
@stable
|
3136
|
+
*/
|
3137
|
+
disable = function() {
|
3138
|
+
return config.enabled = false;
|
3139
|
+
};
|
3140
|
+
return {
|
3141
|
+
puts: puts,
|
3142
|
+
debug: debug,
|
3143
|
+
error: error,
|
3144
|
+
warn: warn,
|
3145
|
+
group: group,
|
3146
|
+
config: config,
|
3147
|
+
enable: enable,
|
3148
|
+
disable: disable
|
3149
|
+
};
|
3150
|
+
})(jQuery);
|
3151
|
+
|
3152
|
+
up.puts = up.log.puts;
|
3153
|
+
|
3154
|
+
}).call(this);
|
3155
|
+
|
2971
3156
|
/**
|
2972
3157
|
Enhancing elements
|
2973
3158
|
==================
|
@@ -3465,7 +3650,7 @@ later.
|
|
3465
3650
|
compilers = u.select(compilers, isDefault);
|
3466
3651
|
return macros = u.select(macros, isDefault);
|
3467
3652
|
};
|
3468
|
-
up.on('up:framework:
|
3653
|
+
up.on('up:framework:booted', snapshot);
|
3469
3654
|
up.on('up:framework:reset', reset);
|
3470
3655
|
return {
|
3471
3656
|
compiler: compiler,
|
@@ -5233,7 +5418,7 @@ are based on this module.
|
|
5233
5418
|
sourceUrl = options.url || source(selectorOrElement);
|
5234
5419
|
return replace(selectorOrElement, sourceUrl, options);
|
5235
5420
|
};
|
5236
|
-
up.on('
|
5421
|
+
up.on('up:app:boot', function() {
|
5237
5422
|
var $body;
|
5238
5423
|
$body = $(document.body);
|
5239
5424
|
setSource($body, up.browser.url());
|
@@ -5967,7 +6152,7 @@ or [transitions](/up.transition) using Javascript or CSS.
|
|
5967
6152
|
transition('cross-fade', function($old, $new, options) {
|
5968
6153
|
return resolvableWhen(animate($old, 'fade-out', options), animate($new, 'fade-in', options));
|
5969
6154
|
});
|
5970
|
-
up.on('up:framework:
|
6155
|
+
up.on('up:framework:booted', snapshot);
|
5971
6156
|
up.on('up:framework:reset', reset);
|
5972
6157
|
return {
|
5973
6158
|
morph: morph,
|
@@ -8191,6 +8376,9 @@ To disable this behavior, give the opening link an `up-sticky` attribute:
|
|
8191
8376
|
return u.error("Unknown position option '%s'", position);
|
8192
8377
|
}
|
8193
8378
|
})();
|
8379
|
+
if (u.isFixed($link)) {
|
8380
|
+
css['position'] = 'fixed';
|
8381
|
+
}
|
8194
8382
|
$popup = $('.up-popup');
|
8195
8383
|
$popup.attr('up-position', position);
|
8196
8384
|
$popup.css(css);
|
@@ -9509,10 +9697,10 @@ The tooltip element is appended to the end of `<body>`.
|
|
9509
9697
|
@stable
|
9510
9698
|
*/
|
9511
9699
|
up.compiler('[up-tooltip], [up-tooltip-html]', function($link) {
|
9512
|
-
$link.on('
|
9700
|
+
$link.on('mouseenter', function() {
|
9513
9701
|
return attach($link);
|
9514
9702
|
});
|
9515
|
-
return $link.on('
|
9703
|
+
return $link.on('mouseleave', function() {
|
9516
9704
|
return close();
|
9517
9705
|
});
|
9518
9706
|
});
|