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.
Files changed (47) hide show
  1. data/Gemfile +1 -0
  2. data/Gemfile.lock +8 -1
  3. data/MIT-LICENSE +2 -2
  4. data/README.md +89 -0
  5. data/app/assets/javascripts/joosy/core/application.js.coffee +25 -5
  6. data/app/assets/javascripts/joosy/core/form.js.coffee +212 -22
  7. data/app/assets/javascripts/joosy/core/helpers.js.coffee +11 -1
  8. data/app/assets/javascripts/joosy/core/joosy.js.coffee +22 -17
  9. data/app/assets/javascripts/joosy/core/layout.js.coffee +17 -7
  10. data/app/assets/javascripts/joosy/core/modules/container.js.coffee +19 -15
  11. data/app/assets/javascripts/joosy/core/modules/events.js.coffee +10 -9
  12. data/app/assets/javascripts/joosy/core/modules/filters.js.coffee +16 -12
  13. data/app/assets/javascripts/joosy/core/modules/log.js.coffee +8 -5
  14. data/app/assets/javascripts/joosy/core/modules/module.js.coffee +31 -21
  15. data/app/assets/javascripts/joosy/core/modules/renderer.js.coffee +114 -51
  16. data/app/assets/javascripts/joosy/core/modules/time_manager.js.coffee +2 -2
  17. data/app/assets/javascripts/joosy/core/modules/widgets_manager.js.coffee +10 -10
  18. data/app/assets/javascripts/joosy/core/page.js.coffee +31 -21
  19. data/app/assets/javascripts/joosy/core/preloader.js.coffee +3 -3
  20. data/app/assets/javascripts/joosy/core/resource/collection.js.coffee +137 -0
  21. data/app/assets/javascripts/joosy/core/resource/generic.js.coffee +178 -13
  22. data/app/assets/javascripts/joosy/core/resource/rest.js.coffee +167 -44
  23. data/app/assets/javascripts/joosy/core/resource/rest_collection.js.coffee +100 -32
  24. data/app/assets/javascripts/joosy/core/router.js.coffee +23 -25
  25. data/app/assets/javascripts/joosy/core/templaters/rails_jst.js.coffee +19 -3
  26. data/app/assets/javascripts/joosy/core/widget.js.coffee +7 -9
  27. data/app/assets/javascripts/joosy/preloaders/caching.js.coffee +117 -57
  28. data/app/assets/javascripts/joosy/preloaders/inline.js.coffee +23 -24
  29. data/app/helpers/joosy/sprockets_helper.rb +1 -1
  30. data/lib/joosy/forms.rb +2 -12
  31. data/lib/joosy/rails/version.rb +1 -1
  32. data/lib/rails/generators/joosy/templates/app/pages/template.js.coffee +1 -1
  33. data/lib/rails/generators/joosy/templates/app/resources/template.js.coffee +1 -1
  34. data/spec/javascripts/joosy/core/form_spec.js.coffee +55 -12
  35. data/spec/javascripts/joosy/core/layout_spec.js.coffee +1 -1
  36. data/spec/javascripts/joosy/core/modules/container_spec.js.coffee +0 -1
  37. data/spec/javascripts/joosy/core/modules/module_spec.js.coffee +1 -1
  38. data/spec/javascripts/joosy/core/modules/renderer_spec.js.coffee +39 -3
  39. data/spec/javascripts/joosy/core/modules/time_manager_spec.js.coffee +1 -1
  40. data/spec/javascripts/joosy/core/page_spec.js.coffee +4 -1
  41. data/spec/javascripts/joosy/core/resource/collection_spec.js.coffee +84 -0
  42. data/spec/javascripts/joosy/core/resource/generic_spec.js.coffee +86 -3
  43. data/spec/javascripts/joosy/core/resource/rest_collection_spec.js.coffee +15 -22
  44. data/spec/javascripts/joosy/core/resource/rest_spec.js.coffee +27 -4
  45. data/spec/javascripts/joosy/core/widget_spec.js.coffee +3 -14
  46. metadata +21 -19
  47. data/README.rdoc +0 -3
@@ -1,48 +1,116 @@
1
- class Joosy.Resource.RESTCollection extends Joosy.Module
1
+ #
2
+ # Collection of Resources with REST-fetching capabilities
3
+ #
4
+ # Generally you should not use RESTCollection directly. It will be
5
+ # automatically created by Joosy.Resource.REST#find.
6
+ #
7
+ # Example:
8
+ # class R extends Joosy.Resource.REST
9
+ # @entity 'r'
10
+ #
11
+ # collection = new Joosy.Resource.RESTCollection(R, {color: 'green'})
12
+ #
13
+ # collection.fetch()
14
+ # collection.page 2
15
+ #
16
+ # collection.params = {color: 'red', sort: 'date'}
17
+ # collection.fetch()
18
+ #
19
+ class Joosy.Resource.RESTCollection extends Joosy.Resource.Collection
2
20
  @include Joosy.Modules.Log
3
21
  @include Joosy.Modules.Events
4
22
 
5
- data: []
23
+ #
24
+ # Hash containing the cache for pages of raw data
25
+ # Keys are pages numbers, values are stored AJAX response
26
+ #
6
27
  pages: Object.extended()
7
28
 
29
+ #
30
+ # @param [Class] model Resource class this collection will handle
31
+ # @param [Object] params Additional GET-parameters to supply when fetching
32
+ #
8
33
  constructor: (@model, params={}) ->
9
- @params = Object.extended(params)
34
+ @params = Object.extended params
10
35
 
36
+ #
11
37
  # Clears the storage and attempts to import given JSON
12
- reset: (entities) ->
13
- @data = @modelize entities
14
- @pages = Object.extended().merge { 1: @data }
15
-
38
+ #
39
+ # @param [Object] entities Entities to import
40
+ #
41
+ reset: (entities, notify=true) ->
42
+ super entities, false
43
+ if notify
44
+ @trigger 'changed'
16
45
  this
17
46
 
47
+ #
18
48
  # Clears the storage and gets new data from server
19
- fetch: (callback, options) ->
20
- @model.__ajax 'get', @model.__buildSource(params: @params), options, (data) =>
21
- @reset(data)
22
- callback?(this)
23
-
49
+ #
50
+ # @param [Function|Object] options AJAX options.
51
+ # Will be considered as a success callback if function given
52
+ #
53
+ fetch: (options) ->
54
+ if Object.isFunction options
55
+ callback = options
56
+ else
57
+ callback = options?.success
58
+ delete options?.success
59
+
60
+ @__fetch @params, options, (data) =>
61
+ @reset data, false
62
+ callback? this
63
+ @trigger 'changed'
24
64
  this
25
65
 
66
+ #
26
67
  # Returns the subset for requested page. Requests with &page=x if not found localy.
27
- page: (number, callback=false) ->
28
- if @pages[number]?
29
- callback?(@pages[number])
30
- return this
31
-
32
- @model.__ajax 'get', @model.__buildSource(params: @params.merge(page: number)), {}, (data) =>
33
- @pages[number] = @modelize data
34
-
35
- @data = []
36
- @pages.keys().sort().each (x) =>
37
- @data.add @pages[x]
38
-
39
- callback?(@pages[number])
40
-
68
+ #
69
+ # @param [Integer] number Index of page
70
+ # @param [Function|Object] options AJAX options.
71
+ # Will be considered as a success callback if function given
72
+ #
73
+ page: (number, options) ->
74
+ if Object.isFunction options
75
+ callback = options
76
+ else
77
+ callback = options?.success
78
+ delete options?.success
79
+
80
+ @__fetch Joosy.Module.merge({page: number}, @params), options, (data) =>
81
+ @reset data, false
82
+ callback? @data
83
+ @trigger 'changed'
41
84
  this
42
-
43
- modelize: (collection) ->
44
- if collection instanceof Array
45
- collection.map (x) =>
46
- @model.create x
85
+
86
+ #
87
+ # Requests the REST collection URL with POST or any method given in options.type
88
+ #
89
+ # @param [String] ending Collection url (like 'foo' or 'foo/bar')
90
+ # @param [Function|Object] options AJAX options.
91
+ # Will be considered as a success callback if function given
92
+ #
93
+ request: (ending, options) ->
94
+ if Object.isFunction options
95
+ callback = options
96
+ else
97
+ callback = options?.success
98
+ delete options?.success
99
+
100
+ if options.method || options.type
101
+ type = options.method || options.type
47
102
  else
48
- []
103
+ type = 'post'
104
+
105
+ @model.__ajax type, @model.__buildSource(extension: ending), options, callback
106
+
107
+ #
108
+ # Does AJAX request
109
+ #
110
+ # @param [Object] urlOptions GET-params for request
111
+ # @param [Object] ajaxOptions AJAX options to pass with request
112
+ # @param [Function] callback
113
+ #
114
+ __fetch: (urlOptions, ajaxOptions, callback) ->
115
+ @model.__ajax 'get', @model.__buildSource(params: @params.merge(urlOptions)), ajaxOptions, (data) ->
116
+ callback(data)
@@ -9,61 +9,59 @@ Joosy.Router =
9
9
  @routes = Object.extended()
10
10
 
11
11
  map: (routes) ->
12
- @rawRoutes.merge routes
12
+ Joosy.Module.merge @rawRoutes, routes
13
13
 
14
14
  setupRoutes: ->
15
15
  @prepareRoutes @rawRoutes
16
-
17
- @respondRoute(location.hash)
18
- $(window).hashchange => @respondRoute(location.hash)
16
+ @respondRoute location.hash
17
+ $(window).hashchange =>
18
+ @respondRoute location.hash
19
19
 
20
20
  prepareRoutes: (routes, namespace='') ->
21
21
  if !namespace && routes[404]
22
22
  @wildcardAction = routes[404]
23
23
  delete routes[404]
24
24
 
25
- routes.each (path, response) =>
26
- path = (namespace + path).replace(/\/{2,}/, '/')
27
- if response && (typeof(response) == 'function' || response.prototype?)
28
- @routes.merge @prepareRoute path,response
25
+ Object.each routes, (path, response) =>
26
+ path = (namespace + path).replace /\/{2,}/, '/'
27
+ if response && (Object.isFunction(response) || response.prototype?)
28
+ Joosy.Module.merge @routes, @prepareRoute(path, response)
29
29
  else
30
- @prepareRoutes Object.extended(response), path
30
+ @prepareRoutes response, path
31
31
 
32
32
  prepareRoute: (path, response) ->
33
33
  matchPath = path.replace(/\/:([^\/]+)/g, '/([^/]+)').replace(/^\/?/, '^/?').replace(/\/?$/, '/?$')
34
34
  result = Object.extended()
35
35
 
36
36
  result[matchPath] =
37
- capture: (path.match(/\/:[^\/]+/g) || []).map((str) -> str.substr(2))
37
+ capture: (path.match(/\/:[^\/]+/g) || []).map (str) ->
38
+ str.substr 2
38
39
  action: response
39
40
  result
40
41
 
41
42
  respondRoute: (hash) ->
42
43
  Joosy.Modules.Log.debug "Router> Answering '#{hash}'"
43
-
44
- fullPath = hash.replace(/^#!?/, '')
45
-
44
+ fullPath = hash.replace /^#!?/, ''
46
45
  @currentPath = fullPath
47
46
  found = false
48
-
49
- queryArray = fullPath.split('&')
47
+ queryArray = fullPath.split '&'
50
48
  path = queryArray.shift()
51
- urlParams = @paramsFromQueryArray(queryArray)
49
+ urlParams = @paramsFromQueryArray queryArray
52
50
 
53
- for regex, route of @routes when @routes.hasOwnProperty(regex)
54
- if vals = path.match(new RegExp(regex))
51
+ for regex, route of @routes when @routes.hasOwnProperty regex
52
+ if vals = path.match new RegExp(regex)
55
53
  params = @paramsFromRouteMatch(vals, route).merge urlParams
56
54
 
57
- if !Joosy.Module.hasAncestor(route.action, Joosy.Page)
58
- route.action.call(this, params)
55
+ if Joosy.Module.hasAncestor route.action, Joosy.Page
56
+ Joosy.Application.setCurrentPage route.action, params
59
57
  else
60
- Joosy.Application.setCurrentPage(route.action, params)
58
+ route.action.call this, params
61
59
 
62
60
  found = true
63
61
  break
64
62
 
65
- if !found && @wildcardAction
66
- @wildcardAction(path, urlParams)
63
+ if !found && @wildcardAction?
64
+ @wildcardAction path, urlParams
67
65
 
68
66
  paramsFromRouteMatch: (vals, route) ->
69
67
  params = Object.extended()
@@ -78,8 +76,8 @@ Joosy.Router =
78
76
  params = Object.extended()
79
77
 
80
78
  if queryArray
81
- $.each queryArray, () ->
82
- if this != ''
79
+ $.each queryArray, ->
80
+ unless @isBlank()
83
81
  pair = @split '='
84
82
  params[pair[0]] = pair[1]
85
83
 
@@ -1,8 +1,16 @@
1
1
  #= require joosy/core/joosy
2
2
 
3
+ #
4
+ # Rails JST template precompilation binding
5
+ #
3
6
  class Joosy.Templaters.RailsJST
4
7
  constructor: (@applicationName) ->
5
8
 
9
+ #
10
+ # Gets template lambda by its full name
11
+ #
12
+ # @param [String] name Template name 'foo/bar'
13
+ #
6
14
  buildView: (name) ->
7
15
  template = JST[location = "#{@applicationName}/templates/#{name}"]
8
16
 
@@ -11,10 +19,18 @@ class Joosy.Templaters.RailsJST
11
19
 
12
20
  template
13
21
 
22
+ #
23
+ # Gets full name of template by several params
24
+ #
25
+ # @param [String] section Section of templates like pages/layouts/...
26
+ # @param [String] template Internal template path
27
+ # @param [String] entity Entity to lookup template path by its namespace
28
+ #
14
29
  resolveTemplate: (section, template, entity) ->
15
- return template.substr 1 if template.startsWith '/'
30
+ if template.startsWith '/'
31
+ return template.substr 1
16
32
 
17
33
  path = entity.constructor?.__namespace__?.map('underscore') || []
18
- path.unshift(section)
34
+ path.unshift section
19
35
 
20
- "#{path.join('/')}/#{template}"
36
+ "#{path.join '/'}/#{template}"
@@ -12,24 +12,21 @@ class Joosy.Widget extends Joosy.Module
12
12
  @include Joosy.Modules.Container
13
13
  @include Joosy.Modules.Renderer
14
14
  @include Joosy.Modules.Filters
15
+ @include Joosy.Modules.TimeManager
15
16
 
16
17
  __renderer: false
17
-
18
- setInterval: (args...) ->
19
- @parent.setInterval(args...)
20
-
21
- setTimeout: (args...) ->
22
- @parent.setTimeout(args...)
18
+
19
+ data: false
23
20
 
24
21
  navigate: (args...) ->
25
- Joosy.Router.navigate(args...)
22
+ Joosy.Router.navigate args...
26
23
 
27
24
  __renderSection: ->
28
25
  'widgets'
29
26
 
30
27
  __load: (@parent, @container) ->
31
28
  if @__renderer
32
- @container.html @__renderer()
29
+ @container.html @__renderer(@data || {})
33
30
  @refreshElements()
34
31
  @__delegateEvents()
35
32
  @__runAfterLoads()
@@ -37,5 +34,6 @@ class Joosy.Widget extends Joosy.Module
37
34
  this
38
35
 
39
36
  __unload: ->
37
+ @__clearTime()
40
38
  @__removeMetamorphs()
41
- @__runAfterUnloads()
39
+ @__runAfterUnloads()
@@ -1,52 +1,83 @@
1
1
  #= require base64
2
2
 
3
- window.globalEval = (src) ->
4
- if window.execScript
5
- window.execScript src
6
- else
7
- fn = ->
8
- window.eval.call window,src
9
- fn()
10
-
3
+ #
4
+ # Preloader for libraries with localStorage cache
5
+ #
6
+ # Example:
7
+ # libraries = [['/test1.js', 100], ['/test2.js', 500]] #100, 500 - size in bytes
8
+ # CachingPreloader.load libraries,
9
+ # start: -> console.log 'preloading started'
10
+ # progress: (percent) -> console.log "#{percent}% loaded"
11
+ # complete: -> console.log 'preloading finished'
12
+ #
13
+ # @class CachingPreloader
14
+ #
11
15
  @Preloader = @CachingPreloader =
16
+ #
17
+ # If set to true, localStorage cache will be avoided
18
+ #
12
19
  force: false
20
+
21
+ #
22
+ # Prefix for localStorage keys
23
+ #
13
24
  prefix: "cache:"
14
-
15
- libraries: []
25
+
26
+ #
27
+ # Number of libraries have been loaded (increases after lib was loaded)
28
+ #
16
29
  counter: 0
30
+
31
+ #
32
+ # Loads (or takes from cache) set of libraries using xhr and caches them in localStorage
33
+ # See class description for example of usage
34
+ #
35
+ # @param [Array] 2-levels array of libraries URLs i.e. [['/test1.js', 10],['/test2.js', 20]]
36
+ # Second param of inner level is a size of script in bytes. Can be undefined.
37
+ # @param [Hash] Available options:
38
+ # * start: `() -> null` to call before load starts
39
+ # * progress: `(int percents) -> null` to call each 100ms of load in progress
40
+ # * complete: `() -> null` to call after load completes
41
+ #
42
+ load: (libraries, options={}) ->
43
+ @[key] = val for key, val of options
44
+ @libraries = libraries.slice()
17
45
 
18
- complete: false
46
+ for lib, i in @libraries
47
+ @libraries[i] = @prefix+lib[0]
19
48
 
20
- ajax: (url, size, callback) ->
21
- if window.XMLHttpRequest
22
- x = new XMLHttpRequest
49
+ if !@force && @check()
50
+ @restore()
23
51
  else
24
- x = new ActiveXObject 'Microsoft.XMLHTTP'
25
-
26
- x.open 'GET', url, 1
27
-
28
- x.onreadystatechange = () =>
29
- if x.readyState > 3
30
- clearInterval(@interval)
31
- callback?(x)
32
-
33
- if @progress
34
- poller = =>
35
- try
36
- @progress.call window, Math.round((x.responseText.length / size) * (@counter / @libraries.length) * 100)
37
- catch e
38
- # ... IE?
39
-
40
- @interval = setInterval poller, 100
41
-
42
- x.send()
52
+ @start?.call window
53
+ @download libraries
43
54
 
55
+ #
56
+ # Checks if we can load libraries or have to download them over
57
+ #
58
+ check: ->
59
+ flag = true
60
+ for name, i in @libraries
61
+ flag &&= window.localStorage.getItem(name)?
62
+ flag
63
+
64
+ #
65
+ # Gets sources of scripts from localStorage and evals them
66
+ #
44
67
  restore: ->
45
68
  for name, i in @libraries
46
- code = window.localStorage.getItem(name)
47
- window.globalEval if window.navigator.appName == "Microsoft Internet Explorer" then Base64.decode(code) else code
69
+ code = window.localStorage.getItem name
70
+ if window.navigator.appName == "Microsoft Internet Explorer"
71
+ code = Base64.decode code
72
+ @evalGlobaly code
48
73
  @complete?.call window, true
49
74
 
75
+ #
76
+ # Loads set of libraries using xhr and caches them in localStorage
77
+ #
78
+ # @param [Array] 2-levels array of libraries URLs i.e. [['/test1.js', 100],['/test2.js', 500]]
79
+ # Second param of inner level is a size of script in bytes. Can be undefined.
80
+ #
50
81
  download: (libraries) ->
51
82
  if libraries.length > 0
52
83
  @counter += 1
@@ -57,38 +88,67 @@ window.globalEval = (src) ->
57
88
 
58
89
  @ajax url, size, (xhr) =>
59
90
  code = xhr.responseText
60
- window.localStorage.setItem @prefix+url, (if window.navigator.appName == "Microsoft Internet Explorer" then Base64.encode(code) else code)
61
- window.globalEval xhr.responseText
91
+ if window.navigator.appName == "Microsoft Internet Explorer"
92
+ code = Base64.encode code
93
+ window.localStorage.setItem @prefix+url, code
94
+ @evalGlobaly xhr.responseText
62
95
  @download libraries
63
96
  else
64
97
  @clean()
65
98
  @complete?.call window
66
99
 
67
- load: (libraries, options={}) ->
68
- @[key] = val for key, val of options
69
- @libraries = libraries.slice()
100
+ #
101
+ # Runs XHR request to get single script body
102
+ # Binds poller to call @progress each 100ms if possible (not IE *doh*)
103
+ #
104
+ # @param [String] URL to download from
105
+ # @param [Float] Expected size of download (to calculate percents)
106
+ # Size can not be taken from headers since we are supposed to get gziped content
107
+ # @param [Function] `(xhr) -> null` to call after script was loaded
108
+ #
109
+ ajax: (url, size, callback) ->
110
+ if window.XMLHttpRequest
111
+ x = new XMLHttpRequest
112
+ else
113
+ x = new ActiveXObject 'Microsoft.XMLHTTP'
70
114
 
71
- for lib, i in @libraries
72
- @libraries[i] = @prefix+lib[0]
115
+ x.open 'GET', url, 1
73
116
 
74
- if !@force && @check()
75
- @restore()
76
- else
77
- @start?.call window
78
- @download libraries
117
+ x.onreadystatechange = () =>
118
+ if x.readyState > 3
119
+ clearInterval @interval
120
+ callback? x
79
121
 
80
- check: ->
81
- flag = true
82
- for name, i in @libraries
83
- flag &&= window.localStorage.getItem(name)?
84
- flag
122
+ if @progress
123
+ poller = =>
124
+ try
125
+ @progress.call window, Math.round((x.responseText.length / size) * (@counter / @libraries.length) * 100)
126
+ catch e
127
+ # ... IE?
85
128
 
86
- clean: ->
87
- removed = 0
129
+ @interval = setInterval poller, 100
88
130
 
89
- for element, i in window.localStorage
90
- key = window.localStorage.key(i-removed)
131
+ x.send()
132
+
133
+ #
134
+ # Searches through localStorage for outdated entries with our prefix and removes them
135
+ #
136
+ clean: ->
137
+ i = 0
91
138
 
139
+ while i < window.localStorage.length && key = window.localStorage.key(i)
92
140
  if key.indexOf(@prefix) == 0 && @libraries.indexOf(key) < 0
93
141
  window.localStorage.removeItem key
94
- removed += 1
142
+ else
143
+ i += 1
144
+
145
+ #
146
+ # Evals source at a global scope
147
+ #
148
+ # @param [String] JS source to execute
149
+ #
150
+ evalGlobaly: (src) ->
151
+ if window.execScript
152
+ window.execScript src
153
+ else
154
+ window.eval src
@@ -11,6 +11,24 @@
11
11
  #
12
12
  @Preloader = @InlinePreloader =
13
13
 
14
+ #
15
+ # Loads set of libraries by adding <script src> to DOM head
16
+ # See class description for example of usage
17
+ #
18
+ # @param [Array] 2-levels array of libraries URLs i.e. [['/test1.js'],['/test2.js']]
19
+ # @param [Hash] Available options:
20
+ # * start: `() -> null` to call before load starts:
21
+ # * complete: `() -> null` to call after load completes
22
+ #
23
+ load: (libraries, options) ->
24
+ @[key] = val for key, val of options
25
+ @start?()
26
+
27
+ if libraries.length > 0
28
+ @receive libraries.shift()[0], => @load(libraries)
29
+ else
30
+ @complete?()
31
+
14
32
  #
15
33
  # Loads one script by adding <script src> to DOM head
16
34
  #
@@ -19,37 +37,18 @@
19
37
  #
20
38
  receive: (url, callback) ->
21
39
  head = document.getElementsByTagName("head")[0]
22
- script = document.createElement("script")
40
+ script = document.createElement "script"
23
41
  script.src = url
24
42
 
25
43
  done = false
26
44
 
27
45
  proceed = ->
28
- if ( !done && (!this.readyState ||
29
- this.readyState == "loaded" || this.readyState == "complete") )
30
-
31
- done = true and callback() if callback
46
+ if !done && (!@readyState? || @readyState == "loaded" || @readyState == "complete")
47
+ done = true
48
+ callback?()
32
49
  script.onload = script.onreadystatechange = null
33
50
 
34
51
  script.onload = script.onreadystatechange = proceed
35
52
 
36
- head.appendChild(script)
53
+ head.appendChild script
37
54
  return undefined
38
-
39
- #
40
- # Loads set of libraries by adding <script src> to DOM head
41
- # See class description for example of usage
42
- #
43
- # @param [Array] 2-levels array of libraries URLs i.e. [['/test1.js'],['/test2.js']]
44
- # @param [Hash] Available options:
45
- # * start: `() -> null` to call before load starts:
46
- # * complete: `() -> null` to call after load completes
47
- #
48
- load: (libraries, options) ->
49
- @[key] = val for key, val of options
50
- @start?.call window
51
-
52
- if libraries.length > 0
53
- @receive libraries.shift()[0], => @load(libraries)
54
- else
55
- @complete?.call window
@@ -17,7 +17,7 @@ module Joosy::SprocketsHelper
17
17
  if force_preloader
18
18
  require_asset preloader_asset
19
19
  else
20
- require_asset Rails.env == 'production' ? preloader_asset : app_asset
20
+ require_asset Rails.env == 'development' ? app_asset : preloader_asset
21
21
  end
22
22
  end
23
23
  end
data/lib/joosy/forms.rb CHANGED
@@ -9,23 +9,13 @@ module Joosy
9
9
  if entity.save
10
10
  joosy_succeed(data, entity, &block)
11
11
  else
12
- joosy_fail(entity.errors.messages, entity.class.name)
12
+ joosy_fail(entity.errors, entity.class.name)
13
13
  end
14
14
  end
15
15
 
16
16
  def joosy_fail(errors, entity=false)
17
17
  errors = Hash[*errors.map {|x| [x, nil]}.flatten] if errors.is_a?(Array)
18
-
19
- if !entity
20
- notifications = errors
21
- else
22
- notifications = {}
23
- errors.each do |k, v|
24
- notifications["#{entity.underscore}[#{k}]"] = v
25
- end
26
- end
27
-
28
- joosy_respond notifications, :unprocessable_entity
18
+ joosy_respond errors, :unprocessable_entity
29
19
  end
30
20
 
31
21
  def joosy_succeed(data, entity=nil, &block)
@@ -1,5 +1,5 @@
1
1
  module Joosy
2
2
  module Rails
3
- VERSION = "0.1.0.RC1"
3
+ VERSION = "0.1.0.RC2"
4
4
  end
5
5
  end
@@ -1,5 +1,5 @@
1
1
  Joosy.namespace '<%= namespace_name %>', ->
2
2
 
3
3
  class @<%= file_name.camelize %>Page extends ApplicationPage
4
- @layout <%= layout_name.camelize %>Layout
4
+ @layout ApplicationLayout
5
5
  @view '<%= file_name %>'
@@ -1,2 +1,2 @@
1
- class @<%= file_name.camelize %>Resource extends Joosy.Resource.REST
1
+ class @<%= file_name.camelize %> extends Joosy.Resource.REST
2
2
  @entity '<%= file_name %>'