unpoly-rails 0.56.7 → 0.57.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 +74 -1
- data/dist/unpoly.js +1569 -793
- data/dist/unpoly.min.js +4 -4
- data/lib/assets/javascripts/unpoly.coffee +2 -0
- data/lib/assets/javascripts/unpoly/browser.coffee.erb +25 -41
- data/lib/assets/javascripts/unpoly/bus.coffee.erb +20 -6
- data/lib/assets/javascripts/unpoly/classes/cache.coffee +23 -13
- data/lib/assets/javascripts/unpoly/classes/compile_pass.coffee +87 -0
- data/lib/assets/javascripts/unpoly/classes/focus_tracker.coffee +29 -0
- data/lib/assets/javascripts/unpoly/classes/follow_variant.coffee +7 -4
- data/lib/assets/javascripts/unpoly/classes/record.coffee +1 -1
- data/lib/assets/javascripts/unpoly/classes/request.coffee +38 -45
- data/lib/assets/javascripts/unpoly/classes/response.coffee +16 -1
- data/lib/assets/javascripts/unpoly/classes/store/memory.coffee +26 -0
- data/lib/assets/javascripts/unpoly/classes/store/session.coffee +59 -0
- data/lib/assets/javascripts/unpoly/cookie.coffee +56 -0
- data/lib/assets/javascripts/unpoly/dom.coffee.erb +67 -39
- data/lib/assets/javascripts/unpoly/feedback.coffee +2 -2
- data/lib/assets/javascripts/unpoly/form.coffee.erb +23 -12
- data/lib/assets/javascripts/unpoly/history.coffee +2 -2
- data/lib/assets/javascripts/unpoly/layout.coffee.erb +118 -99
- data/lib/assets/javascripts/unpoly/link.coffee.erb +12 -5
- data/lib/assets/javascripts/unpoly/log.coffee +6 -5
- data/lib/assets/javascripts/unpoly/modal.coffee.erb +9 -2
- data/lib/assets/javascripts/unpoly/motion.coffee.erb +2 -6
- data/lib/assets/javascripts/unpoly/namespace.coffee.erb +2 -2
- data/lib/assets/javascripts/unpoly/params.coffee.erb +522 -0
- data/lib/assets/javascripts/unpoly/popup.coffee.erb +3 -3
- data/lib/assets/javascripts/unpoly/proxy.coffee +42 -34
- data/lib/assets/javascripts/unpoly/{syntax.coffee → syntax.coffee.erb} +59 -117
- data/lib/assets/javascripts/unpoly/{util.coffee → util.coffee.erb} +206 -171
- data/lib/unpoly/rails/version.rb +1 -1
- data/package.json +1 -1
- data/spec_app/Gemfile.lock +1 -1
- data/spec_app/app/assets/javascripts/integration_test.coffee +0 -4
- data/spec_app/app/assets/stylesheets/integration_test.sass +7 -1
- data/spec_app/app/controllers/pages_controller.rb +4 -0
- data/spec_app/app/views/form_test/basics/new.erb +34 -5
- data/spec_app/app/views/form_test/submission_result.erb +2 -2
- data/spec_app/app/views/form_test/uploads/new.erb +15 -2
- data/spec_app/app/views/hash_test/unpoly.erb +30 -0
- data/spec_app/app/views/pages/start.erb +2 -1
- data/spec_app/spec/javascripts/helpers/parse_form_data.js.coffee +17 -2
- data/spec_app/spec/javascripts/helpers/reset_up.js.coffee +5 -0
- data/spec_app/spec/javascripts/helpers/to_be_error.coffee +1 -1
- data/spec_app/spec/javascripts/helpers/to_match_selector.coffee +5 -0
- data/spec_app/spec/javascripts/up/browser_spec.js.coffee +8 -8
- data/spec_app/spec/javascripts/up/bus_spec.js.coffee +58 -20
- data/spec_app/spec/javascripts/up/classes/cache_spec.js.coffee +78 -0
- data/spec_app/spec/javascripts/up/classes/focus_tracker_spec.coffee +31 -0
- data/spec_app/spec/javascripts/up/classes/request_spec.coffee +50 -0
- data/spec_app/spec/javascripts/up/classes/store/memory_spec.js.coffee +67 -0
- data/spec_app/spec/javascripts/up/classes/store/session_spec.js.coffee +113 -0
- data/spec_app/spec/javascripts/up/dom_spec.js.coffee +133 -45
- data/spec_app/spec/javascripts/up/form_spec.js.coffee +13 -13
- data/spec_app/spec/javascripts/up/layout_spec.js.coffee +110 -26
- data/spec_app/spec/javascripts/up/link_spec.js.coffee +1 -1
- data/spec_app/spec/javascripts/up/modal_spec.js.coffee +1 -0
- data/spec_app/spec/javascripts/up/motion_spec.js.coffee +52 -51
- data/spec_app/spec/javascripts/up/namespace_spec.js.coffee +2 -2
- data/spec_app/spec/javascripts/up/params_spec.coffee +768 -0
- data/spec_app/spec/javascripts/up/proxy_spec.js.coffee +75 -36
- data/spec_app/spec/javascripts/up/syntax_spec.js.coffee +48 -15
- data/spec_app/spec/javascripts/up/util_spec.js.coffee +148 -131
- metadata +17 -5
- data/spec_app/spec/javascripts/up/classes/.keep +0 -0
@@ -56,7 +56,7 @@ up.popup = (($) ->
|
|
56
56
|
@param {string} [config.position='bottom-right']
|
57
57
|
Defines where the popup is attached to the opening element.
|
58
58
|
|
59
|
-
Valid values are `bottom-right`, `bottom-left`, `top-right` and `top-left`.
|
59
|
+
Valid values are `'bottom-right'`, `'bottom-left'`, `'top-right'` and `'top-left'`.
|
60
60
|
@param {string} [config.history=false]
|
61
61
|
Whether opening a popup will add a browser history entry.
|
62
62
|
@param {string} [config.openAnimation='fade-in']
|
@@ -199,7 +199,7 @@ up.popup = (($) ->
|
|
199
199
|
@param {string} [options.position='bottom-right']
|
200
200
|
Defines where the popup is attached to the opening element.
|
201
201
|
|
202
|
-
Valid values are `bottom-right`, `bottom-left`, `top-right` and `top-left`.
|
202
|
+
Valid values are `'bottom-right'`, `'bottom-left'`, `'top-right'` and `'top-left'`.
|
203
203
|
@param {string} [options.html]
|
204
204
|
A string of HTML from which to extract the popup contents. No network request will be made.
|
205
205
|
@param {string} [options.confirm]
|
@@ -405,7 +405,7 @@ up.popup = (($) ->
|
|
405
405
|
@param [up-position]
|
406
406
|
Defines where the popup is attached to the opening element.
|
407
407
|
|
408
|
-
Valid values are `bottom-right`, `bottom-left`, `top-right` and `top-left`.
|
408
|
+
Valid values are `'bottom-right'`, `'bottom-left'`, `'top-right'` and `'top-left'`.
|
409
409
|
@param {string} [up-confirm]
|
410
410
|
A message that will be displayed in a cancelable confirmation dialog
|
411
411
|
before the popup is opened.
|
@@ -157,7 +157,7 @@ up.proxy = (($) ->
|
|
157
157
|
|
158
158
|
\#\#\# Example
|
159
159
|
|
160
|
-
up.request('/search',
|
160
|
+
up.request('/search', params: { query: 'sunshine' }).then(function(response) {
|
161
161
|
console.log('The response text is %o', response.text);
|
162
162
|
}).catch(function() {
|
163
163
|
console.error('The request failed');
|
@@ -192,14 +192,8 @@ up.proxy = (($) ->
|
|
192
192
|
requests, if available. If set to `false` a network connection will always be attempted.
|
193
193
|
@param {Object} [options.headers={}]
|
194
194
|
An object of additional HTTP headers.
|
195
|
-
@param {Object|Array
|
196
|
-
Parameters that should be sent as the request's payload.
|
197
|
-
|
198
|
-
Parameters may be passed as one of the following forms:
|
199
|
-
|
200
|
-
1. An object where keys are param names and the values are param values
|
201
|
-
2. An array of `{ name: 'param-name', value: 'param-value' }` objects
|
202
|
-
3. A [`FormData`](https://developer.mozilla.org/en-US/docs/Web/API/FormData) object
|
195
|
+
@param {Object|FormData|string|Array} [options.params={}]
|
196
|
+
[Parameters](/up.params) that should be sent as the request's payload.
|
203
197
|
@param {string} [options.timeout]
|
204
198
|
A timeout in milliseconds.
|
205
199
|
|
@@ -214,23 +208,30 @@ up.proxy = (($) ->
|
|
214
208
|
@stable
|
215
209
|
###
|
216
210
|
makeRequest = (args...) ->
|
217
|
-
|
218
|
-
|
211
|
+
if u.isString(args[0])
|
212
|
+
url = args.shift()
|
219
213
|
|
220
|
-
|
214
|
+
# We cannot use u.extractOptions() since sometimes the last argument
|
215
|
+
# is an up.Request instead of a basic object.
|
216
|
+
requestOrOptions = args.shift() || {}
|
221
217
|
|
222
|
-
|
218
|
+
if url
|
219
|
+
requestOrOptions.url = url
|
220
|
+
|
221
|
+
request = up.Request.wrap(requestOrOptions)
|
223
222
|
|
224
223
|
# Non-GET requests always touch the network
|
225
|
-
# unless `
|
224
|
+
# unless `request.cache` is explicitly set to `true`.
|
226
225
|
# These requests are never cached.
|
227
226
|
if !request.isSafe()
|
228
227
|
# We clear the entire cache before an unsafe request, since we
|
229
228
|
# assume the user is writing a change.
|
230
229
|
clear()
|
231
230
|
|
231
|
+
ignoreCache = (request.cache == false)
|
232
|
+
|
232
233
|
# If we have an existing promise matching this new request,
|
233
|
-
# we use it unless `
|
234
|
+
# we use it unless `request.cache` is explicitly set to `false`.
|
234
235
|
if !ignoreCache && (promise = get(request))
|
235
236
|
up.puts 'Re-using cached response for %s %s', request.method, request.url
|
236
237
|
else
|
@@ -241,7 +242,7 @@ up.proxy = (($) ->
|
|
241
242
|
promise.catch (e) ->
|
242
243
|
remove(request)
|
243
244
|
|
244
|
-
if !
|
245
|
+
if !request.preload
|
245
246
|
# This might actually make `pendingCount` higher than the actual
|
246
247
|
# number of outstanding requests. However, we need to cover the
|
247
248
|
# following case:
|
@@ -264,7 +265,7 @@ up.proxy = (($) ->
|
|
264
265
|
|
265
266
|
\#\#\# Example
|
266
267
|
|
267
|
-
up.request('/search',
|
268
|
+
up.request('/search', params: { query: 'sunshine' }).then(function(text) {
|
268
269
|
console.log('The response text is %o', text);
|
269
270
|
}).catch(function() {
|
270
271
|
console.error('The request failed');
|
@@ -286,14 +287,8 @@ up.proxy = (($) ->
|
|
286
287
|
@param {Object} [request.headers={}]
|
287
288
|
An object of additional header key/value pairs to send along
|
288
289
|
with the request.
|
289
|
-
@param {Object|Array
|
290
|
-
Parameters that should be sent as the request's payload.
|
291
|
-
|
292
|
-
Parameters may be passed as one of the following forms:
|
293
|
-
|
294
|
-
1. An object where keys are param names and the values are param values
|
295
|
-
2. An array of `{ name: 'param-name', value: 'param-value' }` objects
|
296
|
-
3. A [`FormData`](https://developer.mozilla.org/en-US/docs/Web/API/FormData) object
|
290
|
+
@param {Object|FormData|string|Array} [options.params]
|
291
|
+
[Parameters](/up.params) that should be sent as the request's payload.
|
297
292
|
@param {string} [request.timeout]
|
298
293
|
A timeout in milliseconds for the request.
|
299
294
|
|
@@ -305,7 +300,7 @@ up.proxy = (($) ->
|
|
305
300
|
Use [`up.request()`](/up.request) instead.
|
306
301
|
###
|
307
302
|
ajax = (args...) ->
|
308
|
-
up.
|
303
|
+
up.warn('up.ajax() has been deprecated. Use up.request() instead.')
|
309
304
|
new Promise (resolve, reject) ->
|
310
305
|
pickResponseText = (response) -> resolve(response.text)
|
311
306
|
makeRequest(args...).then(pickResponseText, reject)
|
@@ -418,7 +413,6 @@ up.proxy = (($) ->
|
|
418
413
|
@event up:proxy:recover
|
419
414
|
@stable
|
420
415
|
###
|
421
|
-
|
422
416
|
loadOrQueue = (request) ->
|
423
417
|
if pendingCount < config.maxRequests
|
424
418
|
load(request)
|
@@ -563,7 +557,7 @@ up.proxy = (($) ->
|
|
563
557
|
###
|
564
558
|
clear = cache.clear
|
565
559
|
|
566
|
-
up.bus.
|
560
|
+
up.bus.deprecateRenamedEvent('up:proxy:received', 'up:proxy:loaded')
|
567
561
|
|
568
562
|
preloadAfterDelay = ($link) ->
|
569
563
|
delay = parseInt(u.presentAttr($link, 'up-delay')) || config.preloadDelay
|
@@ -592,20 +586,34 @@ up.proxy = (($) ->
|
|
592
586
|
@function up.proxy.preload
|
593
587
|
@param {string|Element|jQuery}
|
594
588
|
The element whose destination should be preloaded.
|
589
|
+
@param {object} options
|
590
|
+
Options that will be passed to the function making the HTTP requests.
|
595
591
|
@return
|
596
592
|
A promise that will be fulfilled when the request was loaded and cached
|
597
593
|
@experimental
|
598
594
|
###
|
599
|
-
preload = (linkOrSelector) ->
|
595
|
+
preload = (linkOrSelector, options) ->
|
600
596
|
$link = $(linkOrSelector)
|
601
597
|
|
602
598
|
if up.link.isSafe($link)
|
603
|
-
|
599
|
+
preloadEventAttrs = { message: ['Preloading link %o', $link.get(0)], $element: $link, $link: $link }
|
600
|
+
up.bus.whenEmitted('up:link:preload', preloadEventAttrs).then ->
|
604
601
|
variant = up.link.followVariantForLink($link)
|
605
|
-
variant.preloadLink($link)
|
602
|
+
variant.preloadLink($link, options)
|
606
603
|
else
|
607
604
|
Promise.reject(new Error("Won't preload unsafe link"))
|
608
605
|
|
606
|
+
###**
|
607
|
+
This event is [emitted](/up.emit) before a link is [preloaded](/up.preload).
|
608
|
+
|
609
|
+
@event up:link:preload
|
610
|
+
@param {jQuery} event.$link
|
611
|
+
The link element that will be preloaded.
|
612
|
+
@param event.preventDefault()
|
613
|
+
Event listeners may call this method to prevent the link from being preloaded.
|
614
|
+
@stable
|
615
|
+
###
|
616
|
+
|
609
617
|
###**
|
610
618
|
@internal
|
611
619
|
###
|
@@ -615,11 +623,11 @@ up.proxy = (($) ->
|
|
615
623
|
###**
|
616
624
|
@internal
|
617
625
|
###
|
618
|
-
wrapMethod = (method,
|
626
|
+
wrapMethod = (method, params) ->
|
619
627
|
if u.contains(config.wrapMethods, method)
|
620
|
-
|
628
|
+
params = up.params.add(params, up.protocol.config.methodParam, method)
|
621
629
|
method = 'POST'
|
622
|
-
[method,
|
630
|
+
[method, params]
|
623
631
|
|
624
632
|
###**
|
625
633
|
Links with an `up-preload` attribute will silently fetch their target
|
@@ -23,9 +23,6 @@ up.syntax = (($) ->
|
|
23
23
|
|
24
24
|
u = up.util
|
25
25
|
|
26
|
-
DESTRUCTIBLE_CLASS = 'up-destructible'
|
27
|
-
DESTRUCTORS_KEY = 'up-destructors'
|
28
|
-
|
29
26
|
SYSTEM_MACRO_PRIORITIES = {
|
30
27
|
'[up-back]': -100 # sets [up-href] to previous URL
|
31
28
|
'[up-drawer]': -200 # sets [up-modal] and makes link followable
|
@@ -213,17 +210,11 @@ up.syntax = (($) ->
|
|
213
210
|
such as timeouts and event handlers bound to the document.
|
214
211
|
The destructor is *not* expected to remove the element from the DOM, which
|
215
212
|
is already handled by [`up.destroy()`](/up.destroy).
|
216
|
-
|
217
|
-
The function may also return an array of destructor functions.
|
218
213
|
@stable
|
219
214
|
###
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
return unless up.browser.isSupported()
|
224
|
-
callback = args.pop()
|
225
|
-
options = u.options(args[0])
|
226
|
-
insertCompiler(compilers, selector, options, callback)
|
215
|
+
registerCompiler = (args...) ->
|
216
|
+
compiler = buildCompiler(args...)
|
217
|
+
insertCompiler(compilers, compiler)
|
227
218
|
|
228
219
|
###**
|
229
220
|
Registers a [compiler](/up.compiler) that is run before all other compilers.
|
@@ -266,72 +257,36 @@ up.syntax = (($) ->
|
|
266
257
|
See [`up.compiler()`](/up.compiler) for details.
|
267
258
|
@stable
|
268
259
|
###
|
269
|
-
|
270
|
-
|
271
|
-
# due to an unsupported browser. In that case do no work and exit early.
|
272
|
-
return unless up.browser.isSupported()
|
273
|
-
callback = args.pop()
|
274
|
-
options = u.options(args[0])
|
260
|
+
registerMacro = (args...) ->
|
261
|
+
macro = buildCompiler(args...)
|
275
262
|
if isBooting
|
276
|
-
|
277
|
-
up.fail('Unregistered priority for system macro %o', selector)
|
278
|
-
insertCompiler(macros,
|
263
|
+
macro.priority = detectSystemMacroPriority(macro.selector) ||
|
264
|
+
up.fail('Unregistered priority for system macro %o', macro.selector)
|
265
|
+
insertCompiler(macros, macro)
|
279
266
|
|
280
|
-
detectSystemMacroPriority = (
|
267
|
+
detectSystemMacroPriority = (macroSelector) ->
|
281
268
|
for substr, priority of SYSTEM_MACRO_PRIORITIES
|
282
|
-
if
|
269
|
+
if macroSelector.indexOf(substr) >= 0
|
283
270
|
return priority
|
284
271
|
|
285
|
-
buildCompiler = (selector,
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
return
|
296
|
-
|
272
|
+
buildCompiler = (selector, args...) ->
|
273
|
+
callback = args.pop()
|
274
|
+
options = u.extractOptions(args)
|
275
|
+
options = u.options(options,
|
276
|
+
selector: selector,
|
277
|
+
isSystem: isBooting,
|
278
|
+
priority: 0,
|
279
|
+
batch: false
|
280
|
+
keep: false
|
281
|
+
)
|
282
|
+
return u.assign(callback, options)
|
283
|
+
|
284
|
+
insertCompiler = (queue, newCompiler) ->
|
297
285
|
index = 0
|
298
|
-
while (
|
286
|
+
while (existingCompiler = queue[index]) && (existingCompiler.priority >= newCompiler.priority)
|
299
287
|
index += 1
|
300
288
|
queue.splice(index, 0, newCompiler)
|
301
289
|
|
302
|
-
applyCompiler = (compiler, $jqueryElement, nativeElement) ->
|
303
|
-
up.puts ("Compiling '%s' on %o" unless compiler.isSystem), compiler.selector, nativeElement
|
304
|
-
if compiler.keep
|
305
|
-
value = if u.isString(compiler.keep) then compiler.keep else ''
|
306
|
-
$jqueryElement.attr('up-keep', value)
|
307
|
-
returnValue = compiler.callback.apply(nativeElement, [$jqueryElement, data($jqueryElement)])
|
308
|
-
addDestructor($jqueryElement, returnValue)
|
309
|
-
|
310
|
-
###**
|
311
|
-
Tries to find a list of destructors in a compiler's return value.
|
312
|
-
|
313
|
-
@param {Object} returnValue
|
314
|
-
@return {Function|undefined}
|
315
|
-
@internal
|
316
|
-
###
|
317
|
-
normalizeDestructor = (returnValue) ->
|
318
|
-
if u.isFunction(returnValue)
|
319
|
-
returnValue
|
320
|
-
else if u.isArray(returnValue) && u.all(returnValue, u.isFunction)
|
321
|
-
u.sequence(returnValue...)
|
322
|
-
|
323
|
-
addDestructor = ($element, newDestructor) ->
|
324
|
-
if newDestructor = normalizeDestructor(newDestructor)
|
325
|
-
$element.addClass(DESTRUCTIBLE_CLASS)
|
326
|
-
# The initial destructor function is a function that removes the destructor class and data.
|
327
|
-
elementDestructor = $element.data(DESTRUCTORS_KEY) || -> removeDestructors($element)
|
328
|
-
elementDestructor = u.sequence(elementDestructor, newDestructor)
|
329
|
-
$element.data(DESTRUCTORS_KEY, elementDestructor)
|
330
|
-
|
331
|
-
removeDestructors = ($element) ->
|
332
|
-
$element.removeData(DESTRUCTORS_KEY)
|
333
|
-
$element.removeClass(DESTRUCTIBLE_CLASS)
|
334
|
-
|
335
290
|
###**
|
336
291
|
Applies all compilers on the given element and its descendants.
|
337
292
|
Unlike [`up.hello()`](/up.hello), this doesn't emit any events.
|
@@ -342,30 +297,21 @@ up.syntax = (($) ->
|
|
342
297
|
@internal
|
343
298
|
###
|
344
299
|
compile = ($fragment, options) ->
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
u.all $skipSubtrees, (skipSubtree) ->
|
361
|
-
$match.closest(skipSubtree).length == 0
|
362
|
-
|
363
|
-
if $matches.length
|
364
|
-
up.log.group ("Compiling '%s' on %d element(s)" unless compiler.isSystem), compiler.selector, $matches.length, ->
|
365
|
-
if compiler.batch
|
366
|
-
applyCompiler(compiler, $matches, $matches.get())
|
367
|
-
else
|
368
|
-
$matches.each -> applyCompiler(compiler, $(this), this)
|
300
|
+
orderedCompilers = macros.concat(compilers)
|
301
|
+
compileRun = new up.CompilePass($fragment, orderedCompilers, options)
|
302
|
+
compileRun.compile()
|
303
|
+
|
304
|
+
###**
|
305
|
+
@function up.syntax.destructor
|
306
|
+
@internal
|
307
|
+
###
|
308
|
+
registerDestructor = (element, destructor) ->
|
309
|
+
element = u.element(element)
|
310
|
+
unless destructors = element.upDestructors
|
311
|
+
destructors = []
|
312
|
+
element.upDestructors = destructors
|
313
|
+
element.classList.add('up-can-clean')
|
314
|
+
destructors.push(destructor)
|
369
315
|
|
370
316
|
###**
|
371
317
|
Runs any destroyers on the given fragment and its descendants.
|
@@ -376,20 +322,18 @@ up.syntax = (($) ->
|
|
376
322
|
@internal
|
377
323
|
###
|
378
324
|
clean = ($fragment) ->
|
379
|
-
|
380
|
-
u.each
|
381
|
-
|
382
|
-
|
383
|
-
#
|
384
|
-
#
|
385
|
-
if destructor = $(destructible).data(DESTRUCTORS_KEY)
|
386
|
-
destructor()
|
325
|
+
cleanables = u.selectInSubtree($fragment, '.up-can-clean')
|
326
|
+
u.each cleanables, (cleanable) ->
|
327
|
+
if destructors = cleanable.upDestructors
|
328
|
+
destructor() for destructor in destructors
|
329
|
+
# We do not actually remove the #upDestructors property or .up-can-* classes for performance reasons.
|
330
|
+
# The element we just cleaned is about to be removed from the DOM.
|
387
331
|
|
388
332
|
###**
|
389
333
|
Checks if the given element has an [`up-data`](/up-data) attribute.
|
390
334
|
If yes, parses the attribute value as JSON and returns the parsed object.
|
391
335
|
|
392
|
-
Returns
|
336
|
+
Returns `undefined` if the element has no `up-data` attribute.
|
393
337
|
|
394
338
|
\#\#\# Example
|
395
339
|
|
@@ -406,8 +350,8 @@ up.syntax = (($) ->
|
|
406
350
|
@return
|
407
351
|
The JSON-decoded value of the `up-data` attribute.
|
408
352
|
|
409
|
-
Returns
|
410
|
-
@
|
353
|
+
Returns `undefined` if the element has no (or an empty) `up-data` attribute.
|
354
|
+
@experimental
|
411
355
|
###
|
412
356
|
|
413
357
|
###**
|
@@ -453,13 +397,9 @@ up.syntax = (($) ->
|
|
453
397
|
A serialized JSON string
|
454
398
|
@stable
|
455
399
|
###
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
if u.isString(json) && u.trim(json) != ''
|
460
|
-
JSON.parse(json)
|
461
|
-
else
|
462
|
-
{}
|
400
|
+
readData = (elementOrSelector) ->
|
401
|
+
if element = u.element(elementOrSelector)
|
402
|
+
u.jsonAttr(element, 'up-data') || {}
|
463
403
|
|
464
404
|
###**
|
465
405
|
Resets the list of registered compiler directives to the
|
@@ -468,20 +408,22 @@ up.syntax = (($) ->
|
|
468
408
|
@internal
|
469
409
|
###
|
470
410
|
reset = ->
|
471
|
-
|
472
|
-
|
473
|
-
macros = u.select(macros, isSystem)
|
411
|
+
compilers = u.select(compilers, 'isSystem')
|
412
|
+
macros = u.select(macros, 'isSystem')
|
474
413
|
|
475
414
|
up.on 'up:framework:booted', -> isBooting = false
|
476
415
|
up.on 'up:framework:reset', reset
|
477
416
|
|
478
|
-
|
479
|
-
|
417
|
+
<% if ENV['JS_KNIFE'] %>knife: eval(Knife.point)<% end %>
|
418
|
+
compiler: registerCompiler
|
419
|
+
macro: registerMacro
|
420
|
+
destructor: registerDestructor
|
480
421
|
compile: compile
|
481
422
|
clean: clean
|
482
|
-
data:
|
423
|
+
data: readData
|
483
424
|
|
484
425
|
)(jQuery)
|
485
426
|
|
486
427
|
up.compiler = up.syntax.compiler
|
428
|
+
up.destructor = up.syntax.destructor
|
487
429
|
up.macro = up.syntax.macro
|