ultimate-base 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/app/assets/javascripts/{backbone/ultimate → ultimate/backbone}/app.js.coffee +4 -4
- data/app/assets/javascripts/{backbone/ultimate → ultimate/backbone}/collection.js.coffee +2 -2
- data/app/assets/javascripts/{backbone → ultimate/backbone/lib}/backbone.js +9 -3
- data/app/assets/javascripts/{backbone/ultimate → ultimate/backbone}/model.js.coffee +2 -2
- data/app/assets/javascripts/{backbone/ultimate → ultimate/backbone}/router.js.coffee +2 -2
- data/app/assets/javascripts/{backbone/ultimate → ultimate/backbone}/view.js.coffee +2 -2
- data/app/assets/javascripts/ultimate/backbone/views/slider.js.coffee +128 -0
- data/app/assets/javascripts/ultimate/improves/typed-field.js.coffee +4 -0
- data/lib/ultimate-base/version.rb +1 -1
- metadata +9 -8
@@ -1,6 +1,6 @@
|
|
1
|
-
|
1
|
+
(@Ultimate ||= {}).Backbone ||= {}
|
2
2
|
|
3
|
-
class Backbone.
|
3
|
+
class Ultimate.Backbone.App
|
4
4
|
@App: null
|
5
5
|
|
6
6
|
name: null
|
@@ -14,7 +14,7 @@ class Backbone.Ultimate.App
|
|
14
14
|
|
15
15
|
constructor: (name = null) ->
|
16
16
|
if @constructor.App
|
17
|
-
throw new Error("Can't create new Backbone.
|
17
|
+
throw new Error("Can't create new Ultimate.Backbone.App because the single instance has already been created");
|
18
18
|
else
|
19
19
|
@constructor.App = @
|
20
20
|
@name = name
|
@@ -22,4 +22,4 @@ class Backbone.Ultimate.App
|
|
22
22
|
|
23
23
|
|
24
24
|
|
25
|
-
_.extend Backbone.
|
25
|
+
_.extend Ultimate.Backbone.App::, Backbone.Events
|
@@ -134,6 +134,9 @@
|
|
134
134
|
|
135
135
|
rest = [];
|
136
136
|
events = events.split(eventSplitter);
|
137
|
+
|
138
|
+
// Fill up `rest` with the callback arguments. Since we're only copying
|
139
|
+
// the tail of `arguments`, a loop is much faster than Array#slice.
|
137
140
|
for (i = 1, length = arguments.length; i < length; i++) {
|
138
141
|
rest[i - 1] = arguments[i];
|
139
142
|
}
|
@@ -1023,6 +1026,9 @@
|
|
1023
1026
|
var docMode = document.documentMode;
|
1024
1027
|
var oldIE = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7));
|
1025
1028
|
|
1029
|
+
// Normalize root to always include trailing slash
|
1030
|
+
if (!trailingSlash.test(this.options.root)) this.options.root += '/';
|
1031
|
+
|
1026
1032
|
if (oldIE && this._wantsHashChange) {
|
1027
1033
|
this.iframe = Backbone.$('<iframe src="javascript:0" tabindex="-1" />').hide().appendTo('body')[0].contentWindow;
|
1028
1034
|
this.navigate(fragment);
|
@@ -1042,7 +1048,7 @@
|
|
1042
1048
|
// opened by a non-pushState browser.
|
1043
1049
|
this.fragment = fragment;
|
1044
1050
|
var loc = this.location;
|
1045
|
-
var atRoot
|
1051
|
+
var atRoot = (loc.pathname.replace(/[^/]$/, '$&/') === this.options.root) && !loc.search;
|
1046
1052
|
|
1047
1053
|
// If we've started off with a route from a `pushState`-enabled browser,
|
1048
1054
|
// but we're currently in a browser that doesn't support it...
|
@@ -1284,8 +1290,8 @@
|
|
1284
1290
|
_ensureElement: function() {
|
1285
1291
|
if (!this.el) {
|
1286
1292
|
var attrs = _.extend({}, getValue(this, 'attributes'));
|
1287
|
-
if (this.id) attrs.id = this
|
1288
|
-
if (this.className) attrs['class'] = this
|
1293
|
+
if (this.id) attrs.id = getValue(this, 'id');
|
1294
|
+
if (this.className) attrs['class'] = getValue(this, 'className');
|
1289
1295
|
this.setElement(this.make(getValue(this, 'tagName'), attrs), false);
|
1290
1296
|
} else {
|
1291
1297
|
this.setElement(this.el, false);
|
@@ -0,0 +1,128 @@
|
|
1
|
+
Ultimate.Backbone.Views ||= {}
|
2
|
+
|
3
|
+
class Ultimate.Backbone.Views.Slider extends Ultimate.Backbone.View
|
4
|
+
el: ".g-slider"
|
5
|
+
|
6
|
+
nodes: ->
|
7
|
+
jNavs: ".nav"
|
8
|
+
jDisplay:
|
9
|
+
selector: ".slide-display"
|
10
|
+
jLine:
|
11
|
+
selector: ".slide-line"
|
12
|
+
jItems: ".item"
|
13
|
+
|
14
|
+
events: ->
|
15
|
+
"click .nav.enabled" : "navClick"
|
16
|
+
|
17
|
+
viewOptions: ["vertical", "cycling", "interval", "durationPerPixel", "prevItems"]
|
18
|
+
|
19
|
+
vertical: false
|
20
|
+
cycling: false
|
21
|
+
interval: 0
|
22
|
+
durationPerPixel: 2
|
23
|
+
|
24
|
+
totalItems: 0
|
25
|
+
itemSize: 0
|
26
|
+
displayItems: 0
|
27
|
+
moveItems: 0
|
28
|
+
overItems: 0
|
29
|
+
prevItems: 0 # can as setting
|
30
|
+
|
31
|
+
timeoutId: null # for cycling == true
|
32
|
+
startSide: "left" # set by @vertical
|
33
|
+
sizeAttr: "width" # set by @vertical
|
34
|
+
|
35
|
+
initialize: (options) ->
|
36
|
+
@startSide = if @vertical then "top" else "left"
|
37
|
+
@sizeAttr = if @vertical then "height" else "width"
|
38
|
+
@totalItems = @jItems.length
|
39
|
+
if @totalItems
|
40
|
+
@jItems.each (index) -> $(@).attr "data-slide-index", index
|
41
|
+
jFirstItem = @jItems.first()
|
42
|
+
@itemSize = jFirstItem[_.camelize("outer-#{@sizeAttr}")](true)
|
43
|
+
needSize = @totalItems * @itemSize
|
44
|
+
@jLine[@sizeAttr](needSize) if @jLine[@sizeAttr]() < needSize
|
45
|
+
@displayItems = Math.round(@jDisplay[@sizeAttr]() / @itemSize)
|
46
|
+
@moveItems = Math.round(@displayItems / 2)
|
47
|
+
@overItems = @totalItems - @displayItems
|
48
|
+
if @overItems
|
49
|
+
if @prevItems
|
50
|
+
@jLine.css @startSide, (- @prevItems * @itemSize)
|
51
|
+
else
|
52
|
+
@prevItems = Math.round(- @jLine.position()[@startSide] / @itemSize)
|
53
|
+
@refreshNavs()
|
54
|
+
@setTimeout() if @interval
|
55
|
+
else
|
56
|
+
@prevItems = 0
|
57
|
+
#@bus().trigger "slider:slide", 0, @prevItems, jItems.eq(@prevItems)
|
58
|
+
|
59
|
+
currentIndex: ->
|
60
|
+
@jLine.find(".item:eq(#{@prevItems})").data("slideIndex")
|
61
|
+
|
62
|
+
trySlide: (move = 1, moveItems = move * @moveItems) ->
|
63
|
+
if @totalItems and @overItems
|
64
|
+
newPrevItems = @prevItems + moveItems
|
65
|
+
needFlip = false
|
66
|
+
flipItems = 0
|
67
|
+
animatedOverItems = 0
|
68
|
+
if newPrevItems < 0
|
69
|
+
if @cycling
|
70
|
+
needFlip = true
|
71
|
+
flipItems = newPrevItems
|
72
|
+
animatedOverItems = Math.ceil(- @jLine.position()[@startSide] / @itemSize)
|
73
|
+
newPrevItems = 0
|
74
|
+
else if newPrevItems > @overItems
|
75
|
+
if @cycling
|
76
|
+
needFlip = true
|
77
|
+
flipItems = newPrevItems - @overItems
|
78
|
+
animatedOverItems = @overItems - Math.floor(- @jLine.position()[@startSide] / @itemSize)
|
79
|
+
newPrevItems = @overItems
|
80
|
+
if needFlip
|
81
|
+
if flipItems and animatedOverItems < @overItems
|
82
|
+
@prevItems -= flipItems
|
83
|
+
if flipItems < 0
|
84
|
+
@jLine.prepend @jLine.find(".item").slice(flipItems)
|
85
|
+
else
|
86
|
+
@jLine.append @jLine.find(".item").slice(0, flipItems)
|
87
|
+
props = {}
|
88
|
+
props[@startSide] = "+=#{flipItems * @itemSize}"
|
89
|
+
@jLine.css props
|
90
|
+
@slideTo newPrevItems
|
91
|
+
else
|
92
|
+
@slideTo newPrevItems
|
93
|
+
|
94
|
+
trySlideToStart: ->
|
95
|
+
if @totalItems and @overItems
|
96
|
+
@slideTo 0
|
97
|
+
|
98
|
+
_duration: (deltaItems) ->
|
99
|
+
Math.sqrt(Math.abs(deltaItems) * @itemSize * 500) * @durationPerPixel
|
100
|
+
|
101
|
+
# TODO protect bounds, mb trySlideTo() and _slideTo()
|
102
|
+
slideTo: (newPrevItems) ->
|
103
|
+
deltaItems = newPrevItems - @prevItems
|
104
|
+
if deltaItems
|
105
|
+
#@bus().trigger "slider:slide", deltaItems, newPrevItems, jLine.find(".item:eq(#{newPrevItems})")
|
106
|
+
props = {}
|
107
|
+
props[@startSide] = (- newPrevItems * @itemSize)
|
108
|
+
@jLine.stop(true).animate props, @_duration(deltaItems)
|
109
|
+
@prevItems = newPrevItems
|
110
|
+
@refreshNavs()
|
111
|
+
@setTimeout() if @interval
|
112
|
+
deltaItems
|
113
|
+
|
114
|
+
refreshNavs: ->
|
115
|
+
@jNavs.filter(".prev").toggleClass "enabled", @cycling or @prevItems > 0
|
116
|
+
@jNavs.filter(".next").toggleClass "enabled", @cycling or (@overItems - @prevItems) > 0
|
117
|
+
|
118
|
+
setTimeout: ->
|
119
|
+
if @timeoutId?
|
120
|
+
clearTimeout @timeoutId
|
121
|
+
@timeoutId = null
|
122
|
+
@timeoutId = setTimeout =>
|
123
|
+
@trySlide()
|
124
|
+
, @interval
|
125
|
+
|
126
|
+
navClick: (event) ->
|
127
|
+
@trySlide if $(event.currentTarget).hasClass("prev") then -1 else 1
|
128
|
+
false
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ultimate-base
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-08-
|
12
|
+
date: 2012-08-14 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Ultimate UI core, base helpers and improves for Ruby on Rails Front-end
|
15
15
|
email:
|
@@ -26,12 +26,13 @@ files:
|
|
26
26
|
- LICENSE
|
27
27
|
- README.md
|
28
28
|
- Rakefile
|
29
|
-
- app/assets/javascripts/backbone/
|
30
|
-
- app/assets/javascripts/backbone/
|
31
|
-
- app/assets/javascripts/backbone/
|
32
|
-
- app/assets/javascripts/backbone/
|
33
|
-
- app/assets/javascripts/backbone/
|
34
|
-
- app/assets/javascripts/backbone/
|
29
|
+
- app/assets/javascripts/ultimate/backbone/app.js.coffee
|
30
|
+
- app/assets/javascripts/ultimate/backbone/collection.js.coffee
|
31
|
+
- app/assets/javascripts/ultimate/backbone/lib/backbone.js
|
32
|
+
- app/assets/javascripts/ultimate/backbone/model.js.coffee
|
33
|
+
- app/assets/javascripts/ultimate/backbone/router.js.coffee
|
34
|
+
- app/assets/javascripts/ultimate/backbone/view.js.coffee
|
35
|
+
- app/assets/javascripts/ultimate/backbone/views/slider.js.coffee
|
35
36
|
- app/assets/javascripts/ultimate/base.js.coffee
|
36
37
|
- app/assets/javascripts/ultimate/bus.js.coffee
|
37
38
|
- app/assets/javascripts/ultimate/devise.js.coffee
|