exoskeleton 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +8 -8
- data/README.md +7 -1
- data/app/assets/javascripts/exoskeleton/collections/base_collection.js +40 -0
- data/app/assets/javascripts/exoskeleton/index.js +2 -0
- data/app/assets/javascripts/exoskeleton/main.js +2 -1
- data/app/assets/javascripts/exoskeleton/models/base_model.js +42 -0
- data/app/assets/javascripts/exoskeleton/models/load_status.js +40 -0
- data/app/assets/javascripts/exoskeleton/views/base_view.js +63 -0
- data/app/assets/javascripts/exoskeleton/views/mixins/required_elements_mixin.js +80 -0
- data/lib/exoskeleton/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NTllOTFjMDk4Y2Y4ZmZkNGZlZjMzNzIxZTBhNDAxNTU2NDU0MmY3ZQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NzVmNDA0NzExZDE1OGFlMjA2ZWNkN2E2MGFkMWNhZmNiZDEyZWQ0Yw==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZWI4NTQxNTZhZTRlYmFhNTYxMzdjMzQ0ZmM3OTIxZmE1ZTllNzJhOTYwNjZm
|
10
|
+
ZDFiNWFjN2NkYjU3Y2ZkMmFhNDQ1MDU0NWMzOGIwOTE3MGNhZGNmNWY5MTk4
|
11
|
+
YjEzMWM5ZDI2Y2RiMDI0YWQ2M2ZmZDA5NWIyYzY3Njk1MzBjNWE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
Mzc1ZWZjOTU4OGRmZmI2MmJkNmIyZmQ3YmM4ZmZiMmY2YTQ1N2ExNWFlZGE0
|
14
|
+
OGJiNzc1YWVjZjg2MjM5NTE2ZjBhODc3ODNiOTJkMmJhMmUxOGIyOTE2OTU1
|
15
|
+
NWJlMzI4MDlhNzY4NTg2YjMzMDZhNTk2YTlkZmM5MTAyZDc3YjI=
|
data/README.md
CHANGED
@@ -2,6 +2,10 @@
|
|
2
2
|
|
3
3
|
This gem builds out the basic framework to use [Backbone.js](http://backbonejs.org/) along with templating abilities
|
4
4
|
|
5
|
+
# Controller Prerequisite
|
6
|
+
|
7
|
+
Please review the required format for data responses coming from your controllers which can be found [here](https://github.com/agapered/exoskeleton/wiki/Using-Backbone-Collections-and-Models)
|
8
|
+
|
5
9
|
## Installation
|
6
10
|
|
7
11
|
Add this line to your application's Gemfile:
|
@@ -80,7 +84,9 @@ Navigate to the awesomness
|
|
80
84
|
|
81
85
|
http://localhost:3000/home/index
|
82
86
|
|
83
|
-
|
87
|
+
## More Detailed Usage
|
88
|
+
|
89
|
+
There are a few things to learn to use the full functionality of this gem. These items can be found on the [wiki](https://github.com/agapered/exoskeleton/wiki).
|
84
90
|
|
85
91
|
## Contributing
|
86
92
|
|
@@ -1,5 +1,45 @@
|
|
1
1
|
exoskeleton.collections.base_collection = Backbone.Collection.extend({
|
2
2
|
|
3
|
+
__fetchStatus: new exoskeleton.models.load_status,
|
3
4
|
|
5
|
+
fetchStatus: function(){
|
6
|
+
return this.__fetchStatus
|
7
|
+
},
|
8
|
+
|
9
|
+
fetch: function(options){
|
10
|
+
var _this = this ;
|
11
|
+
this.__fetchStatus = new exoskeleton.models.load_status()
|
12
|
+
Backbone.Collection.prototype.fetch.call(this,{
|
13
|
+
success: function(collection, response){
|
14
|
+
if(response.success == undefined){
|
15
|
+
_this.trigger('fetch:unsuccessful', collection, null, null)
|
16
|
+
alert("Response did not come back in appropriate json format needed: {success: [true/false], data: [Your Data], message: [Custom Message]")
|
17
|
+
return
|
18
|
+
}
|
19
|
+
_this.__fetchStatus.set_completed()
|
20
|
+
_this.__fetchStatus.set_message(response.message)
|
21
|
+
if(response.success){
|
22
|
+
_this.__fetchStatus.set_successful()
|
23
|
+
_this.trigger('fetch:successful', collection, response.data, response.message)
|
24
|
+
} else {
|
25
|
+
_this.trigger('fetch:unsuccessful', collection, response.data, response.message)
|
26
|
+
}
|
27
|
+
if(options && options.success){
|
28
|
+
options.success(collection, response)
|
29
|
+
}
|
30
|
+
_this.trigger('fetch:complete', collection, response.data, response.message)
|
31
|
+
},
|
32
|
+
error: function(collection, response) {
|
33
|
+
_this.__fetchStatus.set_completed()
|
34
|
+
_this.__fetchStatus.set_message(response.message)
|
35
|
+
_this.__fetchStatus.set_system_error()
|
36
|
+
_this.trigger('fetch:error', collection, response.data, response.message)
|
37
|
+
if(options && options.error){
|
38
|
+
options.error(collection, response)
|
39
|
+
}
|
40
|
+
_this.trigger('fetch:complete', collection, response.data, response.message)
|
41
|
+
}
|
42
|
+
})
|
43
|
+
}
|
4
44
|
|
5
45
|
})
|
@@ -1,5 +1,47 @@
|
|
1
1
|
exoskeleton.models.base_model = Backbone.Model.extend({
|
2
2
|
|
3
|
+
__fetchStatus: new exoskeleton.models.load_status,
|
4
|
+
|
5
|
+
fetchStatus: function(){
|
6
|
+
return this.__fetchStatus
|
7
|
+
},
|
8
|
+
|
9
|
+
parse: function(response){
|
10
|
+
var data = _.isUndefined(response.data) ? response : response.data
|
11
|
+
return data
|
12
|
+
},
|
13
|
+
|
14
|
+
fetch: function(options){
|
15
|
+
var _this = this ;
|
16
|
+
this.__fetchStatus = new exoskeleton.models.load_status()
|
17
|
+
Backbone.Model.prototype.fetch.call(this,{
|
18
|
+
success: function(model, response){
|
19
|
+
_this.__fetchStatus.set_completed()
|
20
|
+
_this.__fetchStatus.set_message(response.message)
|
21
|
+
if(response.success){
|
22
|
+
_this.__fetchStatus.set_successful()
|
23
|
+
_this._original_attributes = _.clone(model.attributes);
|
24
|
+
_this.trigger('fetch:successful', model, response.data, response.message)
|
25
|
+
} else {
|
26
|
+
_this.trigger('fetch:unsuccessful', model, response.data, response.message)
|
27
|
+
}
|
28
|
+
if(options && options.success){
|
29
|
+
options.success(model, response)
|
30
|
+
}
|
31
|
+
_this.trigger('fetch:complete', model, response.data, response.message)
|
32
|
+
},
|
33
|
+
error: function(model, response) {
|
34
|
+
_this.__fetchStatus.set_completed()
|
35
|
+
_this.__fetchStatus.set_message(response.message)
|
36
|
+
_this.__fetchStatus.set_system_error()
|
37
|
+
_this.trigger('fetch:error', model, response.data, response.message)
|
38
|
+
if(options && options.error){
|
39
|
+
options.error(model, response)
|
40
|
+
}
|
41
|
+
_this.trigger('fetch:complete', model, response.data, response.message)
|
42
|
+
}
|
43
|
+
})
|
44
|
+
},
|
3
45
|
|
4
46
|
|
5
47
|
})
|
@@ -0,0 +1,40 @@
|
|
1
|
+
exoskeleton.models.load_status = Backbone.Model.extend( {
|
2
|
+
initialize: function(){
|
3
|
+
this.is_complete = false
|
4
|
+
this.is_successful = false
|
5
|
+
this.status_message = null
|
6
|
+
this.is_error = false
|
7
|
+
},
|
8
|
+
|
9
|
+
set_completed: function(){
|
10
|
+
this.is_complete = true
|
11
|
+
},
|
12
|
+
|
13
|
+
set_successful: function(){
|
14
|
+
this.is_successful = true
|
15
|
+
},
|
16
|
+
|
17
|
+
set_message: function(message){
|
18
|
+
this.status_message = message
|
19
|
+
},
|
20
|
+
|
21
|
+
set_system_error: function(){
|
22
|
+
this.is_error = true
|
23
|
+
},
|
24
|
+
|
25
|
+
complete: function(){
|
26
|
+
return this.is_complete
|
27
|
+
},
|
28
|
+
|
29
|
+
successful: function(){
|
30
|
+
return this.is_successful
|
31
|
+
},
|
32
|
+
|
33
|
+
message: function(){
|
34
|
+
return this.status_message
|
35
|
+
},
|
36
|
+
|
37
|
+
system_error: function(){
|
38
|
+
return this.is_error
|
39
|
+
}
|
40
|
+
})
|
@@ -1,4 +1,67 @@
|
|
1
1
|
exoskeleton.views.base_view = Backbone.View.extend({
|
2
2
|
|
3
|
+
remove: function(){
|
4
|
+
|
5
|
+
if (_.isFunction(this.clean_up)){
|
6
|
+
this.clean_up()
|
7
|
+
}
|
8
|
+
|
9
|
+
_.each(this.child_views, function(child_view){
|
10
|
+
child_view.remove()
|
11
|
+
})
|
12
|
+
|
13
|
+
this.child_views = []
|
14
|
+
|
15
|
+
this.$el.children().remove()
|
16
|
+
|
17
|
+
this.undelegateEvents()
|
18
|
+
Backbone.View.prototype.remove.call(this);
|
19
|
+
},
|
20
|
+
|
21
|
+
add_subview: function(view_to_append){
|
22
|
+
if (_.isUndefined(this.child_views))
|
23
|
+
{
|
24
|
+
this.child_views = []
|
25
|
+
}
|
26
|
+
this.child_views.push(view_to_append)
|
27
|
+
},
|
28
|
+
|
29
|
+
append_view: function(view, target){
|
30
|
+
this.$(target).append(view.render().el)
|
31
|
+
this.add_subview(view)
|
32
|
+
},
|
33
|
+
|
34
|
+
set_html: function(view, target){
|
35
|
+
this.$(target).html(view.render().el)
|
36
|
+
this.add_subview(view)
|
37
|
+
},
|
38
|
+
|
39
|
+
/*postAttachment
|
40
|
+
This function executes the supplied function after the view has been attached to the DOM.
|
41
|
+
If the view is already attached to the DOM the function is executed immediately. If the
|
42
|
+
view is not attached to the DOM, it will check every eighth second for up to 30 seconds
|
43
|
+
and execute the function as soon as it is attached. If the view is not attached to the
|
44
|
+
DOM within 30 seconds, the function will never be executed. The view itself will be
|
45
|
+
passed into the function as an argument.
|
46
|
+
*/
|
47
|
+
post_attachment: function(fn, count){
|
48
|
+
if ( count ){
|
49
|
+
count++
|
50
|
+
} else {
|
51
|
+
count = 0
|
52
|
+
}
|
53
|
+
if( count > 240 ){
|
54
|
+
return
|
55
|
+
}
|
56
|
+
if( $(this.el).parents('body').length > 0 ){
|
57
|
+
fn(this)
|
58
|
+
} else {
|
59
|
+
var _this = this
|
60
|
+
setTimeout(function(){
|
61
|
+
_this.post_attachment(fn, count)
|
62
|
+
}, 125)
|
63
|
+
}
|
64
|
+
|
65
|
+
}
|
3
66
|
|
4
67
|
})
|
@@ -0,0 +1,80 @@
|
|
1
|
+
exoskeleton.mixins.required_elements = {
|
2
|
+
add_required_element: function(element){
|
3
|
+
if(!this.required_elements){
|
4
|
+
this.required_elements = []
|
5
|
+
}
|
6
|
+
if(_.isUndefined(this.required_element_error_shown)){
|
7
|
+
this.required_element_error_shown = false
|
8
|
+
}
|
9
|
+
var _this = this;
|
10
|
+
element.bind('fetch:complete', function(event_element){
|
11
|
+
// Prevent triggering render on sub-models and sub-collections.
|
12
|
+
if( event_element === element ){
|
13
|
+
_this.render();
|
14
|
+
}
|
15
|
+
}, this);
|
16
|
+
this.required_elements.push(element)
|
17
|
+
},
|
18
|
+
required_elements_loaded: function(){
|
19
|
+
if(!this.required_elements){
|
20
|
+
this.required_elements = []
|
21
|
+
}
|
22
|
+
var loaded = true
|
23
|
+
var successful = true
|
24
|
+
var system_error = false
|
25
|
+
|
26
|
+
for(var i=0; i<this.required_elements.length; i++){
|
27
|
+
var element = this.required_elements[i]
|
28
|
+
if(!(element.fetchStatus().is_complete)){
|
29
|
+
loaded = false
|
30
|
+
break;
|
31
|
+
}
|
32
|
+
if(!(element.fetchStatus().successful())){
|
33
|
+
successful = false
|
34
|
+
if(element.fetchStatus().system_error()){
|
35
|
+
system_error = true
|
36
|
+
}
|
37
|
+
break;
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
var status = {
|
42
|
+
loaded: loaded,
|
43
|
+
successful: successful,
|
44
|
+
system_error: system_error
|
45
|
+
}
|
46
|
+
|
47
|
+
return status
|
48
|
+
},
|
49
|
+
render: function(){
|
50
|
+
if(this.required_element_error_shown){
|
51
|
+
return this
|
52
|
+
}
|
53
|
+
var load_status = this.required_elements_loaded()
|
54
|
+
if(!load_status.loaded){
|
55
|
+
this.render_progress()
|
56
|
+
return this
|
57
|
+
}
|
58
|
+
|
59
|
+
if(!load_status.successful){
|
60
|
+
if(load_status.system_error){
|
61
|
+
this.system_error()
|
62
|
+
return this
|
63
|
+
}
|
64
|
+
this.required_element_error_shown = true
|
65
|
+
this.render_error()
|
66
|
+
return this
|
67
|
+
}
|
68
|
+
|
69
|
+
this.render_successful()
|
70
|
+
return this
|
71
|
+
},
|
72
|
+
system_error: function(){
|
73
|
+
//Blank method incase it is not implemented on older views
|
74
|
+
},
|
75
|
+
render_error: function(){
|
76
|
+
//Blank method incase it is not implemented on older views
|
77
|
+
}
|
78
|
+
|
79
|
+
|
80
|
+
}
|
data/lib/exoskeleton/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: exoskeleton
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Hopp
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-06-
|
11
|
+
date: 2013-06-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -194,9 +194,11 @@ files:
|
|
194
194
|
- app/assets/javascripts/exoskeleton/index.js
|
195
195
|
- app/assets/javascripts/exoskeleton/main.js
|
196
196
|
- app/assets/javascripts/exoskeleton/models/base_model.js
|
197
|
+
- app/assets/javascripts/exoskeleton/models/load_status.js
|
197
198
|
- app/assets/javascripts/exoskeleton/vendor/backbone-min.js
|
198
199
|
- app/assets/javascripts/exoskeleton/vendor/underscore-min.js
|
199
200
|
- app/assets/javascripts/exoskeleton/views/base_view.js
|
201
|
+
- app/assets/javascripts/exoskeleton/views/mixins/required_elements_mixin.js
|
200
202
|
- exoskeleton.gemspec
|
201
203
|
- lib/exoskeleton.rb
|
202
204
|
- lib/exoskeleton/engine.rb
|