joosy 0.1.0.RC1 → 0.1.0.RC2
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -0
- data/Gemfile.lock +8 -1
- data/MIT-LICENSE +2 -2
- data/README.md +89 -0
- data/app/assets/javascripts/joosy/core/application.js.coffee +25 -5
- data/app/assets/javascripts/joosy/core/form.js.coffee +212 -22
- data/app/assets/javascripts/joosy/core/helpers.js.coffee +11 -1
- data/app/assets/javascripts/joosy/core/joosy.js.coffee +22 -17
- data/app/assets/javascripts/joosy/core/layout.js.coffee +17 -7
- data/app/assets/javascripts/joosy/core/modules/container.js.coffee +19 -15
- data/app/assets/javascripts/joosy/core/modules/events.js.coffee +10 -9
- data/app/assets/javascripts/joosy/core/modules/filters.js.coffee +16 -12
- data/app/assets/javascripts/joosy/core/modules/log.js.coffee +8 -5
- data/app/assets/javascripts/joosy/core/modules/module.js.coffee +31 -21
- data/app/assets/javascripts/joosy/core/modules/renderer.js.coffee +114 -51
- data/app/assets/javascripts/joosy/core/modules/time_manager.js.coffee +2 -2
- data/app/assets/javascripts/joosy/core/modules/widgets_manager.js.coffee +10 -10
- data/app/assets/javascripts/joosy/core/page.js.coffee +31 -21
- data/app/assets/javascripts/joosy/core/preloader.js.coffee +3 -3
- data/app/assets/javascripts/joosy/core/resource/collection.js.coffee +137 -0
- data/app/assets/javascripts/joosy/core/resource/generic.js.coffee +178 -13
- data/app/assets/javascripts/joosy/core/resource/rest.js.coffee +167 -44
- data/app/assets/javascripts/joosy/core/resource/rest_collection.js.coffee +100 -32
- data/app/assets/javascripts/joosy/core/router.js.coffee +23 -25
- data/app/assets/javascripts/joosy/core/templaters/rails_jst.js.coffee +19 -3
- data/app/assets/javascripts/joosy/core/widget.js.coffee +7 -9
- data/app/assets/javascripts/joosy/preloaders/caching.js.coffee +117 -57
- data/app/assets/javascripts/joosy/preloaders/inline.js.coffee +23 -24
- data/app/helpers/joosy/sprockets_helper.rb +1 -1
- data/lib/joosy/forms.rb +2 -12
- data/lib/joosy/rails/version.rb +1 -1
- data/lib/rails/generators/joosy/templates/app/pages/template.js.coffee +1 -1
- data/lib/rails/generators/joosy/templates/app/resources/template.js.coffee +1 -1
- data/spec/javascripts/joosy/core/form_spec.js.coffee +55 -12
- data/spec/javascripts/joosy/core/layout_spec.js.coffee +1 -1
- data/spec/javascripts/joosy/core/modules/container_spec.js.coffee +0 -1
- data/spec/javascripts/joosy/core/modules/module_spec.js.coffee +1 -1
- data/spec/javascripts/joosy/core/modules/renderer_spec.js.coffee +39 -3
- data/spec/javascripts/joosy/core/modules/time_manager_spec.js.coffee +1 -1
- data/spec/javascripts/joosy/core/page_spec.js.coffee +4 -1
- data/spec/javascripts/joosy/core/resource/collection_spec.js.coffee +84 -0
- data/spec/javascripts/joosy/core/resource/generic_spec.js.coffee +86 -3
- data/spec/javascripts/joosy/core/resource/rest_collection_spec.js.coffee +15 -22
- data/spec/javascripts/joosy/core/resource/rest_spec.js.coffee +27 -4
- data/spec/javascripts/joosy/core/widget_spec.js.coffee +3 -14
- metadata +21 -19
- data/README.rdoc +0 -3
@@ -4,37 +4,39 @@ Joosy.Modules.Container =
|
|
4
4
|
|
5
5
|
eventSplitter: /^(\S+)\s*(.*)$/
|
6
6
|
|
7
|
-
$: (selector) ->
|
7
|
+
$: (selector) ->
|
8
|
+
$(selector, @container)
|
8
9
|
|
9
10
|
refreshElements: ->
|
10
11
|
@__collectElements().each (key, value) =>
|
12
|
+
# TODO: Check for possible collisions?
|
11
13
|
@[key] = @$(value)
|
12
14
|
|
13
15
|
swapContainer: (container, data) ->
|
14
|
-
|
15
|
-
container.
|
16
|
-
|
16
|
+
container.unbind().off()
|
17
|
+
container.html data
|
18
|
+
container
|
17
19
|
|
18
20
|
__collectElements: ->
|
19
|
-
elements = Object.extended
|
21
|
+
elements = Object.extended @elements || {}
|
20
22
|
|
21
23
|
klass = this
|
22
24
|
while klass = klass.constructor.__super__
|
23
|
-
|
25
|
+
Joosy.Module.merge elements, klass.elements, false
|
24
26
|
|
25
27
|
elements
|
26
28
|
|
27
29
|
__collectEvents: ->
|
28
|
-
events = Object.extended
|
30
|
+
events = Object.extended @events || {}
|
29
31
|
|
30
32
|
klass = this
|
31
33
|
while klass = klass.constructor.__super__
|
32
|
-
|
34
|
+
Joosy.Module.merge events, klass.events, false
|
33
35
|
|
34
36
|
events
|
35
37
|
|
36
38
|
__extractSelector: (selector) ->
|
37
|
-
if r = selector.match
|
39
|
+
if r = selector.match /\$([A-z]+)/
|
38
40
|
selector = @__collectElements()[r[1]]
|
39
41
|
|
40
42
|
selector
|
@@ -44,16 +46,18 @@ Joosy.Modules.Container =
|
|
44
46
|
events = @__collectEvents()
|
45
47
|
|
46
48
|
events.each (key, method) =>
|
47
|
-
|
48
|
-
|
49
|
+
unless Object.isFunction method
|
50
|
+
method = @[method]
|
51
|
+
callback = (event) ->
|
52
|
+
method.call module, this, event
|
49
53
|
|
50
|
-
match = key.match
|
54
|
+
match = key.match @eventSplitter
|
51
55
|
eventName = match[1]
|
52
|
-
selector = @__extractSelector
|
56
|
+
selector = @__extractSelector match[2]
|
53
57
|
|
54
58
|
if selector == ""
|
55
|
-
@container.bind
|
59
|
+
@container.bind eventName, callback
|
56
60
|
Joosy.Modules.Log.debugAs @, "#{eventName} binded on container"
|
57
61
|
else
|
58
|
-
@container.on
|
62
|
+
@container.on eventName, selector, callback
|
59
63
|
Joosy.Modules.Log.debugAs @, "#{eventName} binded on #{selector}"
|
@@ -1,12 +1,12 @@
|
|
1
1
|
Joosy.Modules.Events =
|
2
2
|
wait: (events, callback) ->
|
3
|
-
events = events.split
|
3
|
+
events = events.split /\s+/
|
4
4
|
|
5
5
|
@__oneShotEvents ||= []
|
6
6
|
@__oneShotEvents.push [events, callback]
|
7
7
|
|
8
8
|
bind: (events, callback) ->
|
9
|
-
events = events.split
|
9
|
+
events = events.split /\s+/
|
10
10
|
|
11
11
|
@__boundEvents ||= []
|
12
12
|
@__boundEvents.push [events, callback]
|
@@ -14,22 +14,23 @@ Joosy.Modules.Events =
|
|
14
14
|
unbind: (target) ->
|
15
15
|
for [events, callback], index in @__boundEvents
|
16
16
|
if callback == target
|
17
|
-
@__boundEvents.splice
|
17
|
+
@__boundEvents.splice index, 1
|
18
18
|
return
|
19
19
|
|
20
20
|
trigger: (event) ->
|
21
21
|
Joosy.Modules.Log.debugAs @, "Event #{event} triggered"
|
22
22
|
if @__oneShotEvents
|
23
23
|
for [events, callback], index in @__oneShotEvents
|
24
|
-
position = events.indexOf
|
25
|
-
|
24
|
+
position = events.indexOf event
|
25
|
+
if position >= 0
|
26
|
+
events.splice position, 1
|
26
27
|
|
27
28
|
if events.length == 0
|
28
|
-
@__oneShotEvents.splice
|
29
|
+
@__oneShotEvents.splice index, 1
|
29
30
|
|
30
31
|
callback()
|
31
32
|
|
32
33
|
if @__boundEvents
|
33
|
-
for [
|
34
|
-
if events.has
|
35
|
-
callback()
|
34
|
+
for [events, callback] in @__boundEvents
|
35
|
+
if events.has event
|
36
|
+
callback()
|
@@ -1,39 +1,43 @@
|
|
1
1
|
Joosy.Modules.Filters =
|
2
2
|
included: ->
|
3
3
|
@beforeLoad = (callback) ->
|
4
|
-
unless @::hasOwnProperty
|
4
|
+
unless @::hasOwnProperty '__beforeLoads'
|
5
5
|
@::__beforeLoads = [].concat @.__super__.__beforeLoads || []
|
6
6
|
@::__beforeLoads.push callback
|
7
7
|
|
8
8
|
@afterLoad = (callback) ->
|
9
|
-
unless @::hasOwnProperty
|
9
|
+
unless @::hasOwnProperty '__afterLoads'
|
10
10
|
@::__afterLoads = [].concat @.__super__.__afterLoads || []
|
11
11
|
@::__afterLoads.push callback
|
12
12
|
|
13
13
|
@afterUnload = (callback) ->
|
14
|
-
unless @::hasOwnProperty
|
14
|
+
unless @::hasOwnProperty '__afterUnloads'
|
15
15
|
@::__afterUnloads = [].concat @.__super__.__afterUnloads || []
|
16
16
|
@::__afterUnloads.push callback
|
17
17
|
|
18
18
|
__runBeforeLoads: (opts...) ->
|
19
|
-
|
19
|
+
unless @__beforeLoads?.length > 0
|
20
|
+
return true
|
20
21
|
|
21
22
|
flag = true
|
22
23
|
|
23
24
|
for filter in @__beforeLoads
|
24
|
-
|
25
|
-
|
25
|
+
unless Object.isFunction filter
|
26
|
+
filter = @[filter]
|
27
|
+
flag = flag && filter.apply @, opts
|
26
28
|
|
27
29
|
return flag
|
28
30
|
|
29
31
|
__runAfterLoads: (opts...) ->
|
30
|
-
if @__afterLoads
|
32
|
+
if @__afterLoads?.length > 0
|
31
33
|
for filter in @__afterLoads
|
32
|
-
|
33
|
-
|
34
|
+
unless Object.isFunction filter
|
35
|
+
filter = @[filter]
|
36
|
+
filter.apply @, opts
|
34
37
|
|
35
38
|
__runAfterUnloads: (opts...) ->
|
36
|
-
if @__afterUnloads
|
39
|
+
if @__afterUnloads?.length > 0
|
37
40
|
for filter in @__afterUnloads
|
38
|
-
|
39
|
-
|
41
|
+
unless Object.isFunction filter
|
42
|
+
filter = @[filter]
|
43
|
+
filter.apply @, opts
|
@@ -1,15 +1,18 @@
|
|
1
1
|
Joosy.Modules.Log =
|
2
2
|
log: (args...) ->
|
3
|
-
return
|
3
|
+
return unless console?
|
4
4
|
|
5
5
|
if console.log.apply?
|
6
6
|
args.unshift "Joosy>"
|
7
|
-
console.log
|
7
|
+
console.log args...
|
8
8
|
else
|
9
|
-
console.log
|
9
|
+
console.log args.first()
|
10
10
|
|
11
11
|
debug: (args...) ->
|
12
|
-
|
12
|
+
return unless Joosy.debug
|
13
|
+
@log args...
|
13
14
|
|
14
15
|
debugAs: (context, string, args...) ->
|
15
|
-
|
16
|
+
return unless Joosy.debug
|
17
|
+
context = Joosy.Module.__className(context) || 'unknown context'
|
18
|
+
@debug "#{context}> #{string}", args...
|
@@ -3,41 +3,51 @@ moduleKeywords = ['included', 'extended']
|
|
3
3
|
class Joosy.Module
|
4
4
|
@__namespace__: []
|
5
5
|
|
6
|
-
@
|
7
|
-
|
6
|
+
@__className = (klass) ->
|
7
|
+
unless Object.isFunction(klass)
|
8
|
+
klass = klass.constructor
|
8
9
|
|
9
10
|
if klass.name?
|
10
11
|
klass.name
|
11
12
|
else
|
12
|
-
klass.toString().replace
|
13
|
+
klass.toString().replace /^function ([a-zA-Z]+)\([\s\S]+/, '$1'
|
13
14
|
|
14
|
-
@hasAncestor
|
15
|
-
|
15
|
+
@hasAncestor: (what, klass) ->
|
16
|
+
unless what? && klass?
|
17
|
+
return false
|
16
18
|
|
17
|
-
[
|
19
|
+
[what, klass] = [what.prototype, klass.prototype]
|
18
20
|
|
19
21
|
while what
|
20
|
-
|
22
|
+
if what == klass
|
23
|
+
return true
|
21
24
|
what = what.constructor?.__super__
|
22
25
|
|
23
26
|
false
|
24
|
-
|
25
|
-
@
|
26
|
-
|
27
|
-
|
28
|
-
|
27
|
+
|
28
|
+
@merge: (destination, source, unsafe=true) ->
|
29
|
+
for key, value of source
|
30
|
+
if source.hasOwnProperty(key)
|
31
|
+
if unsafe || !destination.hasOwnProperty(key)
|
32
|
+
destination[key] = value
|
33
|
+
destination
|
34
|
+
|
35
|
+
@include: (object) ->
|
36
|
+
unless object
|
37
|
+
throw new Error 'include(object) requires obj'
|
38
|
+
|
39
|
+
Object.each object, (key, value) =>
|
29
40
|
if key not in moduleKeywords
|
30
41
|
this::[key] = value
|
31
42
|
|
32
|
-
|
33
|
-
|
43
|
+
object.included?.apply this
|
44
|
+
null
|
34
45
|
|
35
|
-
@extend: (
|
36
|
-
|
46
|
+
@extend: (object) ->
|
47
|
+
unless object
|
48
|
+
throw new Error 'extend(object) requires object'
|
37
49
|
|
38
|
-
|
39
|
-
if key not in moduleKeywords
|
40
|
-
this[key] = value
|
50
|
+
@merge this, object
|
41
51
|
|
42
|
-
|
43
|
-
|
52
|
+
object.extended?.apply this
|
53
|
+
null
|
@@ -4,17 +4,20 @@
|
|
4
4
|
Joosy.Modules.Renderer =
|
5
5
|
|
6
6
|
__renderer: ->
|
7
|
-
throw new Error "#{@constructor
|
7
|
+
throw new Error "#{Joosy.Module.__className @constructor} does not have an attached template"
|
8
8
|
|
9
9
|
__helpers: null
|
10
10
|
|
11
11
|
included: ->
|
12
|
-
@view = (template) ->
|
13
|
-
if Object.isFunction
|
12
|
+
@view = (template, options={}) ->
|
13
|
+
if Object.isFunction template
|
14
14
|
@::__renderer = template
|
15
15
|
else
|
16
16
|
@::__renderer = (locals={}) ->
|
17
|
-
|
17
|
+
if options.dynamic
|
18
|
+
@renderDynamic template, locals
|
19
|
+
else
|
20
|
+
@render template, locals
|
18
21
|
|
19
22
|
@helpers = (helpers...) ->
|
20
23
|
@::__helpers ||= []
|
@@ -30,26 +33,23 @@ Joosy.Modules.Renderer =
|
|
30
33
|
__instantiateHelpers: ->
|
31
34
|
unless @__helpersInstance
|
32
35
|
@__helpersInstance = Object.extended Joosy.Helpers.Application
|
33
|
-
|
34
|
-
@__helpersInstance.render = =>
|
35
|
-
@render(arguments...)
|
36
36
|
|
37
37
|
@__helpersInstance.widget = (element, widget) =>
|
38
38
|
@widgets ||= {}
|
39
39
|
|
40
40
|
uuid = Joosy.uuid()
|
41
|
-
element = document.createElement
|
42
|
-
temp = document.createElement
|
41
|
+
element = document.createElement element
|
42
|
+
temp = document.createElement 'div'
|
43
43
|
|
44
|
-
element.id
|
44
|
+
element.id = uuid
|
45
45
|
@widgets['#'+uuid] = widget
|
46
46
|
|
47
|
-
temp.appendChild
|
47
|
+
temp.appendChild element
|
48
48
|
temp.innerHTML
|
49
49
|
|
50
50
|
if @__helpers
|
51
51
|
for helper in @__helpers
|
52
|
-
|
52
|
+
Joosy.Module.merge @__helpersInstance, helper
|
53
53
|
|
54
54
|
@__helpersInstance
|
55
55
|
|
@@ -57,60 +57,123 @@ Joosy.Modules.Renderer =
|
|
57
57
|
__proxifyHelpers: (locals) ->
|
58
58
|
if locals.hasOwnProperty '__proto__'
|
59
59
|
locals.__proto__ = @__instantiateHelpers()
|
60
|
-
|
61
60
|
locals
|
62
61
|
else
|
63
62
|
unless @__helpersProxyInstance
|
64
63
|
@__helpersProxyInstance = (locals) ->
|
65
|
-
|
64
|
+
Joosy.Module.merge this, locals
|
66
65
|
|
67
66
|
@__helpersProxyInstance.prototype = @__instantiateHelpers()
|
68
67
|
|
69
|
-
new @__helpersProxyInstance
|
68
|
+
new @__helpersProxyInstance locals
|
70
69
|
|
71
|
-
render: (template, locals={}) ->
|
72
|
-
|
70
|
+
render: (template, locals={}, parentStackPointer=false) ->
|
71
|
+
@__render false, template, locals, parentStackPointer
|
72
|
+
|
73
|
+
renderDynamic: (template, locals={}, parentStackPointer=false) ->
|
74
|
+
@__render true, template, locals, parentStackPointer
|
75
|
+
|
76
|
+
__render: (dynamic, template, locals={}, parentStackPointer=false) ->
|
77
|
+
stack = @__renderingStackChildFor parentStackPointer
|
78
|
+
|
79
|
+
stack.template = template
|
80
|
+
|
81
|
+
isResource = Joosy.Module.hasAncestor locals.constructor, Joosy.Resource.Generic
|
82
|
+
isCollection = Joosy.Module.hasAncestor locals.constructor, Joosy.Resource.Collection
|
73
83
|
|
74
84
|
if Object.isString template
|
75
85
|
if @__renderSection?
|
76
86
|
template = Joosy.Application.templater.resolveTemplate @__renderSection(), template, this
|
77
87
|
|
78
88
|
template = Joosy.Application.templater.buildView template
|
79
|
-
else if !Object.isFunction
|
80
|
-
throw new Error "#{Joosy.Module.
|
81
|
-
|
82
|
-
if !Object.isObject(locals) && !isResource
|
83
|
-
throw new Error "#{Joosy.Module.
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
if !isResource
|
88
|
-
locals = @__proxifyHelpers(locals)
|
89
|
-
morph = Metamorph template(locals)
|
90
|
-
update = => morph.html template(locals)
|
89
|
+
else if !Object.isFunction template
|
90
|
+
throw new Error "#{Joosy.Module.__className @}> template (maybe @view) does not look like a string or lambda"
|
91
|
+
|
92
|
+
if !Object.isObject(locals) && !isResource && !isCollection
|
93
|
+
throw new Error "#{Joosy.Module.__className @}> locals (maybe @data?) not in: dumb hash, Resource, Collection"
|
94
|
+
|
95
|
+
if isResource
|
96
|
+
stack.locals = locals.e
|
91
97
|
else
|
92
|
-
locals
|
93
|
-
morph = Metamorph template(locals.e)
|
94
|
-
update = => morph.html template(locals.e)
|
98
|
+
stack.locals = locals
|
95
99
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
100
|
+
renderers =
|
101
|
+
render: (template, locals={}) =>
|
102
|
+
@render template, locals, stack
|
103
|
+
renderDynamic: (template, locals={}) =>
|
104
|
+
@renderDynamic template, locals, stack
|
105
|
+
|
106
|
+
context = =>
|
107
|
+
data = {}
|
108
|
+
Joosy.Module.merge data, stack.locals
|
109
|
+
Joosy.Module.merge data, @__instantiateHelpers(), false
|
110
|
+
Joosy.Module.merge data, renderers
|
111
|
+
data
|
112
|
+
|
113
|
+
if dynamic
|
114
|
+
morph = Metamorph template(context())
|
115
|
+
update = =>
|
116
|
+
for child in stack.children
|
117
|
+
@__removeMetamorphs child
|
118
|
+
stack.children = []
|
119
|
+
morph.html template(context())
|
120
|
+
@refreshElements?()
|
121
|
+
|
122
|
+
# This is here to break stack tree and save from
|
123
|
+
# repeating DOM handling
|
124
|
+
update = update.debounce 0
|
125
|
+
|
126
|
+
if isCollection
|
127
|
+
for resource in locals.data
|
128
|
+
resource.bind 'changed', update
|
129
|
+
stack.metamorphBindings.push [resource, update]
|
130
|
+
if isResource || isCollection
|
131
|
+
locals.bind 'changed', update
|
132
|
+
stack.metamorphBindings.push [locals, update]
|
133
|
+
else
|
134
|
+
for key, object of locals
|
135
|
+
if locals.hasOwnProperty key
|
136
|
+
if object?.bind? && object?.unbind?
|
137
|
+
object.bind 'changed', update
|
138
|
+
stack.metamorphBindings.push [object, update]
|
101
139
|
|
102
|
-
|
103
|
-
|
140
|
+
morph.outerHTML()
|
141
|
+
else
|
142
|
+
template context()
|
143
|
+
|
144
|
+
__renderingStackElement: (parent=null) ->
|
145
|
+
metamorphBindings: []
|
146
|
+
locals: null
|
147
|
+
template: null
|
148
|
+
children: []
|
149
|
+
parent: parent
|
150
|
+
|
151
|
+
__renderingStackChildFor: (parentPointer) ->
|
152
|
+
if !@__renderingStack
|
153
|
+
@__renderingStack = []
|
154
|
+
|
155
|
+
if !parentPointer
|
156
|
+
element = @__renderingStackElement()
|
157
|
+
@__renderingStack.push element
|
158
|
+
element
|
159
|
+
else
|
160
|
+
element = @__renderingStackElement parentPointer
|
161
|
+
parentPointer.children.push element
|
162
|
+
element
|
163
|
+
|
164
|
+
__removeMetamorphs: (stackPointer=false) ->
|
165
|
+
remove = (stackPointer) =>
|
166
|
+
if stackPointer?.children
|
167
|
+
for child in stackPointer.children
|
168
|
+
@__removeMetamorphs child
|
169
|
+
|
170
|
+
if stackPointer?.metamorphBindings
|
171
|
+
for [object, callback] in stackPointer.metamorphBindings
|
172
|
+
object.unbind callback
|
173
|
+
stackPointer.metamorphBindings = []
|
174
|
+
|
175
|
+
unless stackPointer
|
176
|
+
@__renderingStack?.each (stackPointer) ->
|
177
|
+
remove stackPointer
|
104
178
|
else
|
105
|
-
|
106
|
-
if locals.hasOwnProperty key
|
107
|
-
if object?.bind? && object?.unbind?
|
108
|
-
object.bind 'changed', update
|
109
|
-
@__metamorphs.push [object, update]
|
110
|
-
|
111
|
-
morph.outerHTML()
|
112
|
-
|
113
|
-
__removeMetamorphs: ->
|
114
|
-
if @__metamorphs
|
115
|
-
for [object, callback] in @__metamorphs
|
116
|
-
object.unbind callback
|
179
|
+
remove stackPointer
|
@@ -15,11 +15,11 @@ Joosy.Modules.TimeManager =
|
|
15
15
|
|
16
16
|
timer
|
17
17
|
|
18
|
-
|
18
|
+
__clearTime: ->
|
19
19
|
if @__intervals
|
20
20
|
for entry in @__intervals
|
21
21
|
window.clearInterval entry
|
22
22
|
|
23
23
|
if @__timeouts
|
24
24
|
for entry in @__timeouts
|
25
|
-
window.clearTimeout entry
|
25
|
+
window.clearTimeout entry
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Joosy.Modules.WidgetsManager =
|
2
2
|
registerWidget: (container, widget) ->
|
3
|
-
if Joosy.Module.hasAncestor
|
3
|
+
if Joosy.Module.hasAncestor widget, Joosy.Widget
|
4
4
|
widget = new widget()
|
5
5
|
|
6
6
|
@__activeWidgets ||= []
|
@@ -11,14 +11,14 @@ Joosy.Modules.WidgetsManager =
|
|
11
11
|
unregisterWidget: (widget) ->
|
12
12
|
widget.__unload()
|
13
13
|
|
14
|
-
@__activeWidgets.splice
|
14
|
+
@__activeWidgets.splice @__activeWidgets.indexOf(widget), 1
|
15
15
|
|
16
16
|
__collectWidgets: ->
|
17
|
-
widgets = Object.extended
|
17
|
+
widgets = Object.extended @widgets || {}
|
18
18
|
|
19
19
|
klass = this
|
20
20
|
while klass = klass.constructor.__super__
|
21
|
-
|
21
|
+
Joosy.Module.merge widgets, klass.widgets, false
|
22
22
|
|
23
23
|
widgets
|
24
24
|
|
@@ -30,7 +30,7 @@ Joosy.Modules.WidgetsManager =
|
|
30
30
|
if selector == '$container'
|
31
31
|
activeSelector = @container
|
32
32
|
else
|
33
|
-
if r = selector.match
|
33
|
+
if r = selector.match /\$([A-z_]+)/
|
34
34
|
selector = @elements[r[1]]
|
35
35
|
|
36
36
|
activeSelector = $(selector, @container)
|
@@ -38,15 +38,15 @@ Joosy.Modules.WidgetsManager =
|
|
38
38
|
registered[selector] = Object.extended()
|
39
39
|
|
40
40
|
activeSelector.each (index, elem) =>
|
41
|
-
if Joosy.Module.hasAncestor
|
41
|
+
if Joosy.Module.hasAncestor widget, Joosy.Widget
|
42
42
|
instance = new widget
|
43
43
|
else
|
44
44
|
instance = widget.call this, index
|
45
45
|
|
46
|
-
registered[selector][Joosy.Module.
|
47
|
-
registered[selector][Joosy.Module.
|
46
|
+
registered[selector][Joosy.Module.__className instance] ||= 0
|
47
|
+
registered[selector][Joosy.Module.__className instance] += 1
|
48
48
|
|
49
|
-
@registerWidget
|
49
|
+
@registerWidget $(elem), instance
|
50
50
|
|
51
51
|
registered.each (selector, value) =>
|
52
52
|
value.each (widget, count) =>
|
@@ -55,4 +55,4 @@ Joosy.Modules.WidgetsManager =
|
|
55
55
|
__unloadWidgets: ->
|
56
56
|
if @__activeWidgets
|
57
57
|
for widget in @__activeWidgets
|
58
|
-
widget.__unload()
|
58
|
+
widget.__unload()
|
@@ -33,21 +33,26 @@ class Joosy.Page extends Joosy.Module
|
|
33
33
|
@layout: (layoutClass) ->
|
34
34
|
@::__layoutClass = layoutClass
|
35
35
|
|
36
|
-
@beforePaint: (callback) ->
|
37
|
-
|
38
|
-
@
|
39
|
-
|
36
|
+
@beforePaint: (callback) ->
|
37
|
+
@::__beforePaint = callback
|
38
|
+
@paint: (callback) ->
|
39
|
+
@::__paint = callback
|
40
|
+
@afterPaint: (callback) ->
|
41
|
+
@::__afterPaint = callback
|
42
|
+
@erase: (callback) ->
|
43
|
+
@::__erase = callback
|
40
44
|
|
41
45
|
constructor: (@params, @previous) ->
|
42
46
|
@__layoutClass ||= ApplicationLayout
|
43
47
|
|
44
|
-
if @__runBeforeLoads
|
48
|
+
if @__runBeforeLoads @params, @previous
|
45
49
|
if !@previous?.layout?.uuid? || @previous?.__layoutClass != @__layoutClass
|
46
50
|
@__bootstrapLayout()
|
47
51
|
else
|
48
52
|
@__bootstrap()
|
49
53
|
|
50
|
-
navigate: (args...) ->
|
54
|
+
navigate: (args...) ->
|
55
|
+
Joosy.Router.navigate(args...)
|
51
56
|
|
52
57
|
__renderSection: ->
|
53
58
|
'pages'
|
@@ -62,23 +67,23 @@ class Joosy.Page extends Joosy.Module
|
|
62
67
|
@refreshElements()
|
63
68
|
@__delegateEvents()
|
64
69
|
@__setupWidgets()
|
65
|
-
@__runAfterLoads
|
70
|
+
@__runAfterLoads @params, @previous
|
66
71
|
if @__scrollElement
|
67
|
-
scroll = $(@__extractSelector
|
68
|
-
Joosy.Modules.Log.debugAs @, "Scrolling to #{@__extractSelector
|
72
|
+
scroll = $(@__extractSelector @__scrollElement).offset()?.top + @__scrollMargin
|
73
|
+
Joosy.Modules.Log.debugAs @, "Scrolling to #{@__extractSelector @__scrollElement}"
|
69
74
|
$('html, body').animate {scrollTop: scroll}, @__scrollSpeed, =>
|
70
|
-
|
75
|
+
if @__scrollSpeed != 0
|
76
|
+
@__releaseHeight()
|
71
77
|
|
72
78
|
Joosy.Modules.Log.debugAs @, "Page loaded"
|
73
79
|
|
74
80
|
__unload: ->
|
75
|
-
@
|
81
|
+
@__clearTime()
|
76
82
|
@__unloadWidgets()
|
77
83
|
@__removeMetamorphs()
|
78
|
-
@__runAfterUnloads
|
84
|
+
@__runAfterUnloads @params, @previous
|
79
85
|
delete @previous
|
80
86
|
|
81
|
-
|
82
87
|
__callSyncedThrough: (entity, receiver, params, callback) ->
|
83
88
|
if entity?[receiver]?
|
84
89
|
entity[receiver].apply entity, params.clone().add(callback)
|
@@ -99,7 +104,8 @@ class Joosy.Page extends Joosy.Module
|
|
99
104
|
|
100
105
|
callbacksParams = [@layout.content()]
|
101
106
|
|
102
|
-
|
107
|
+
if @__scrollElement && @__scrollSpeed != 0
|
108
|
+
@__fixHeight()
|
103
109
|
|
104
110
|
@wait "stageClear dataReceived", =>
|
105
111
|
@__callSyncedThrough this, '__paint', callbacksParams, =>
|
@@ -123,17 +129,20 @@ class Joosy.Page extends Joosy.Module
|
|
123
129
|
|
124
130
|
__bootstrapLayout: ->
|
125
131
|
Joosy.Modules.Log.debugAs @, "Boostraping page with layout"
|
126
|
-
@layout = new @__layoutClass
|
132
|
+
@layout = new @__layoutClass(@params)
|
127
133
|
|
128
134
|
callbacksParams = [Joosy.Application.content(), this]
|
129
135
|
|
130
|
-
|
136
|
+
if @__scrollElement && @__scrollSpeed != 0
|
137
|
+
@__fixHeight()
|
131
138
|
|
132
139
|
@wait "stageClear dataReceived", =>
|
133
140
|
@__callSyncedThrough @layout, '__paint', callbacksParams, =>
|
134
141
|
# Layout HTML
|
135
|
-
|
136
|
-
|
142
|
+
data = Joosy.Module.merge {}, @layout.data || {}
|
143
|
+
data = Joosy.Module.merge data, yield: => @layout.yield()
|
144
|
+
|
145
|
+
@swapContainer Joosy.Application.content(), @layout.__renderer data
|
137
146
|
|
138
147
|
# Page HTML
|
139
148
|
@swapContainer @layout.content(), @__renderer(@data || {})
|
@@ -151,6 +160,7 @@ class Joosy.Page extends Joosy.Module
|
|
151
160
|
@__callSyncedThrough @layout, '__beforePaint', callbacksParams, =>
|
152
161
|
@trigger 'stageClear'
|
153
162
|
|
154
|
-
@__callSyncedThrough
|
155
|
-
|
156
|
-
|
163
|
+
@__callSyncedThrough @layout, '__fetch', [], =>
|
164
|
+
@__callSyncedThrough this, '__fetch', [], =>
|
165
|
+
Joosy.Modules.Log.debugAs @, "Fetch complete"
|
166
|
+
@trigger 'dataReceived'
|