joosy 1.0.0.RC4 → 1.0.0.RC5
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.
- data/Gemfile +1 -1
- data/Gemfile.lock +99 -82
- data/README.md +1 -1
- data/app/assets/javascripts/joosy/core/application.js.coffee +2 -2
- data/app/assets/javascripts/joosy/core/form.js.coffee +35 -22
- data/app/assets/javascripts/joosy/core/helpers/form.js.coffee +38 -9
- data/app/assets/javascripts/joosy/core/helpers/view.js.coffee +10 -4
- data/app/assets/javascripts/joosy/core/helpers/widgets.js.coffee +6 -1
- data/app/assets/javascripts/joosy/core/joosy.js.coffee +5 -3
- data/app/assets/javascripts/joosy/core/layout.js.coffee +5 -5
- data/app/assets/javascripts/joosy/core/modules/events.js.coffee +28 -10
- data/app/assets/javascripts/joosy/core/modules/log.js.coffee +1 -1
- data/app/assets/javascripts/joosy/core/modules/module.js.coffee +2 -2
- data/app/assets/javascripts/joosy/core/modules/time_manager.js.coffee +1 -1
- data/app/assets/javascripts/joosy/core/page.js.coffee +1 -1
- data/app/assets/javascripts/joosy/core/resource/collection.js.coffee +18 -18
- data/app/assets/javascripts/joosy/core/resource/generic.js.coffee +21 -19
- data/app/assets/javascripts/joosy/core/resource/rest.js.coffee +26 -14
- data/app/assets/javascripts/joosy/core/resource/rest_collection.js.coffee +2 -2
- data/app/assets/javascripts/joosy/core/router.js.coffee +2 -2
- data/app/assets/javascripts/joosy/core/widget.js.coffee +3 -0
- data/app/assets/javascripts/joosy/preloaders/caching.js.coffee +7 -7
- data/app/assets/javascripts/joosy/preloaders/inline.js.coffee +5 -5
- data/lib/joosy/rails/version.rb +1 -1
- data/lib/rails/generators/joosy/templates/app/helpers/application.js.coffee +2 -2
- data/lib/rails/generators/joosy/templates/app/pages/welcome/index.js.coffee +5 -5
- data/lib/rails/generators/joosy/templates/app/routes.js.coffee +2 -2
- data/lib/rails/generators/joosy/templates/preload.html.slim +19 -0
- data/lib/rails/resources_with_joosy.rb +2 -2
- data/spec/javascripts/helpers/spec_helper.js.coffee +19 -0
- data/spec/javascripts/joosy/core/form_spec.js.coffee +36 -16
- data/spec/javascripts/joosy/core/helpers/forms_spec.js.coffee +28 -23
- data/spec/javascripts/joosy/core/helpers/widgets_spec.js.coffee +17 -0
- data/spec/javascripts/joosy/core/joosy_spec.js.coffee +2 -0
- data/spec/javascripts/joosy/core/modules/events_spec.js.coffee +35 -1
- data/spec/javascripts/joosy/core/modules/renderer_spec.js.coffee +29 -29
- data/spec/javascripts/joosy/core/page_spec.js.coffee +2 -2
- data/spec/javascripts/joosy/core/resource/collection_spec.js.coffee +14 -9
- data/spec/javascripts/joosy/core/resource/generic_spec.js.coffee +19 -19
- data/spec/javascripts/joosy/core/resource/rest_collection_spec.js.coffee +0 -1
- data/spec/javascripts/joosy/core/resource/rest_spec.js.coffee +9 -3
- data/spec/javascripts/joosy/preloaders/caching_spec.js.coffee +7 -7
- data/spec/javascripts/joosy/preloaders/inline_spec.js.coffee +5 -5
- data/spec/javascripts/support/sinon-1.3.1.js +6 -6
- data/spec/javascripts/support/sinon-ie-1.3.1.js +5 -5
- metadata +22 -20
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,25 +1,17 @@
|
|
1
1
|
GIT
|
2
2
|
remote: git://github.com/pivotal/jasmine-gem.git
|
3
|
-
revision:
|
3
|
+
revision: 54b37cf9a51df49a77d15640e3e0caa46a508c1d
|
4
4
|
specs:
|
5
|
-
jasmine (1.2.
|
6
|
-
jasmine-core (>= 1.2.0
|
5
|
+
jasmine (1.2.1)
|
6
|
+
jasmine-core (>= 1.2.0)
|
7
7
|
rack (~> 1.0)
|
8
8
|
rspec (>= 1.3.1)
|
9
9
|
selenium-webdriver (>= 0.1.3)
|
10
10
|
|
11
|
-
GIT
|
12
|
-
remote: git://github.com/roundlake/guard-sprockets.git
|
13
|
-
revision: 77365fbf48b2af0c93a42fcb05747c174b90d8d7
|
14
|
-
specs:
|
15
|
-
guard-sprockets (0.3.1)
|
16
|
-
guard (~> 1.0.0)
|
17
|
-
sprockets (~> 2.0)
|
18
|
-
|
19
11
|
PATH
|
20
12
|
remote: .
|
21
13
|
specs:
|
22
|
-
joosy (1.0.0.
|
14
|
+
joosy (1.0.0.RC4)
|
23
15
|
coffee-rails
|
24
16
|
haml_coffee_assets
|
25
17
|
i18n-js
|
@@ -29,133 +21,158 @@ PATH
|
|
29
21
|
GEM
|
30
22
|
remote: http://rubygems.org/
|
31
23
|
specs:
|
32
|
-
actionmailer (3.2.
|
33
|
-
actionpack (= 3.2.
|
24
|
+
actionmailer (3.2.9)
|
25
|
+
actionpack (= 3.2.9)
|
34
26
|
mail (~> 2.4.4)
|
35
|
-
actionpack (3.2.
|
36
|
-
activemodel (= 3.2.
|
37
|
-
activesupport (= 3.2.
|
27
|
+
actionpack (3.2.9)
|
28
|
+
activemodel (= 3.2.9)
|
29
|
+
activesupport (= 3.2.9)
|
38
30
|
builder (~> 3.0.0)
|
39
31
|
erubis (~> 2.7.0)
|
40
|
-
journey (~> 1.0.
|
32
|
+
journey (~> 1.0.4)
|
41
33
|
rack (~> 1.4.0)
|
42
34
|
rack-cache (~> 1.2)
|
43
35
|
rack-test (~> 0.6.1)
|
44
|
-
sprockets (~> 2.1
|
45
|
-
activemodel (3.2.
|
46
|
-
activesupport (= 3.2.
|
36
|
+
sprockets (~> 2.2.1)
|
37
|
+
activemodel (3.2.9)
|
38
|
+
activesupport (= 3.2.9)
|
47
39
|
builder (~> 3.0.0)
|
48
|
-
activerecord (3.2.
|
49
|
-
activemodel (= 3.2.
|
50
|
-
activesupport (= 3.2.
|
40
|
+
activerecord (3.2.9)
|
41
|
+
activemodel (= 3.2.9)
|
42
|
+
activesupport (= 3.2.9)
|
51
43
|
arel (~> 3.0.2)
|
52
44
|
tzinfo (~> 0.3.29)
|
53
|
-
activeresource (3.2.
|
54
|
-
activemodel (= 3.2.
|
55
|
-
activesupport (= 3.2.
|
56
|
-
activesupport (3.2.
|
45
|
+
activeresource (3.2.9)
|
46
|
+
activemodel (= 3.2.9)
|
47
|
+
activesupport (= 3.2.9)
|
48
|
+
activesupport (3.2.9)
|
57
49
|
i18n (~> 0.6)
|
58
50
|
multi_json (~> 1.0)
|
59
51
|
arel (3.0.2)
|
60
|
-
builder (3.0.
|
61
|
-
childprocess (0.3.
|
62
|
-
ffi (~> 1.0.6)
|
52
|
+
builder (3.0.4)
|
53
|
+
childprocess (0.3.6)
|
54
|
+
ffi (~> 1.0, >= 1.0.6)
|
55
|
+
coderay (1.0.8)
|
63
56
|
coffee-rails (3.2.2)
|
64
57
|
coffee-script (>= 2.2.0)
|
65
58
|
railties (~> 3.2.0)
|
66
59
|
coffee-script (2.2.0)
|
67
60
|
coffee-script-source
|
68
61
|
execjs
|
69
|
-
coffee-script-source (1.
|
70
|
-
daemons (1.1.
|
62
|
+
coffee-script-source (1.4.0)
|
63
|
+
daemons (1.1.9)
|
71
64
|
diff-lcs (1.1.3)
|
72
65
|
erubis (2.7.0)
|
73
|
-
eventmachine (0.
|
74
|
-
eventmachine (0.
|
75
|
-
execjs (1.
|
66
|
+
eventmachine (1.0.0)
|
67
|
+
eventmachine (1.0.0-java)
|
68
|
+
execjs (1.4.0)
|
76
69
|
multi_json (~> 1.0)
|
77
|
-
ffi (1.
|
78
|
-
ffi (1.
|
79
|
-
guard (1.
|
80
|
-
|
81
|
-
|
82
|
-
|
70
|
+
ffi (1.1.5)
|
71
|
+
ffi (1.1.5-java)
|
72
|
+
guard (1.5.4)
|
73
|
+
listen (>= 0.4.2)
|
74
|
+
lumberjack (>= 1.0.2)
|
75
|
+
pry (>= 0.9.10)
|
76
|
+
thor (>= 0.14.6)
|
77
|
+
guard-coffeescript (1.2.1)
|
83
78
|
coffee-script (>= 2.2.0)
|
84
|
-
guard (>=
|
85
|
-
|
86
|
-
|
79
|
+
guard (>= 1.1.0)
|
80
|
+
guard-sprockets (0.4.1)
|
81
|
+
guard (>= 1.1.0)
|
82
|
+
sprockets (~> 2.0)
|
83
|
+
haml_coffee_assets (1.7.2)
|
84
|
+
coffee-script (>= 1.0.0)
|
87
85
|
sprockets (>= 2.0.3)
|
88
86
|
tilt (>= 1.3.3)
|
89
87
|
hike (1.2.1)
|
90
|
-
i18n (0.6.
|
88
|
+
i18n (0.6.1)
|
91
89
|
i18n-js (2.1.2)
|
92
90
|
i18n
|
93
|
-
jasmine-core (1.2.0
|
94
|
-
journey (1.0.
|
95
|
-
jquery-rails (2.
|
96
|
-
railties (>= 3.
|
91
|
+
jasmine-core (1.2.0)
|
92
|
+
journey (1.0.4)
|
93
|
+
jquery-rails (2.1.3)
|
94
|
+
railties (>= 3.1.0, < 5.0)
|
97
95
|
thor (~> 0.14)
|
98
|
-
json (1.7.
|
96
|
+
json (1.7.5)
|
97
|
+
json (1.7.5-java)
|
98
|
+
libwebsocket (0.1.6)
|
99
|
+
websocket
|
100
|
+
listen (0.5.3)
|
101
|
+
lumberjack (1.0.2)
|
99
102
|
mail (2.4.4)
|
100
103
|
i18n (>= 0.4.0)
|
101
104
|
mime-types (~> 1.16)
|
102
105
|
treetop (~> 1.4.8)
|
103
|
-
|
104
|
-
|
106
|
+
method_source (0.8.1)
|
107
|
+
mime-types (1.19)
|
108
|
+
multi_json (1.3.7)
|
105
109
|
polyglot (0.3.3)
|
110
|
+
pry (0.9.10)
|
111
|
+
coderay (~> 1.0.5)
|
112
|
+
method_source (~> 0.8)
|
113
|
+
slop (~> 3.3.1)
|
114
|
+
pry (0.9.10-java)
|
115
|
+
coderay (~> 1.0.5)
|
116
|
+
method_source (~> 0.8)
|
117
|
+
slop (~> 3.3.1)
|
118
|
+
spoon (~> 0.0)
|
106
119
|
rack (1.4.1)
|
107
120
|
rack-cache (1.2)
|
108
121
|
rack (>= 0.4)
|
109
122
|
rack-ssl (1.3.2)
|
110
123
|
rack
|
111
|
-
rack-test (0.6.
|
124
|
+
rack-test (0.6.2)
|
112
125
|
rack (>= 1.0)
|
113
|
-
rails (3.2.
|
114
|
-
actionmailer (= 3.2.
|
115
|
-
actionpack (= 3.2.
|
116
|
-
activerecord (= 3.2.
|
117
|
-
activeresource (= 3.2.
|
118
|
-
activesupport (= 3.2.
|
126
|
+
rails (3.2.9)
|
127
|
+
actionmailer (= 3.2.9)
|
128
|
+
actionpack (= 3.2.9)
|
129
|
+
activerecord (= 3.2.9)
|
130
|
+
activeresource (= 3.2.9)
|
131
|
+
activesupport (= 3.2.9)
|
119
132
|
bundler (~> 1.0)
|
120
|
-
railties (= 3.2.
|
121
|
-
railties (3.2.
|
122
|
-
actionpack (= 3.2.
|
123
|
-
activesupport (= 3.2.
|
133
|
+
railties (= 3.2.9)
|
134
|
+
railties (3.2.9)
|
135
|
+
actionpack (= 3.2.9)
|
136
|
+
activesupport (= 3.2.9)
|
124
137
|
rack-ssl (~> 1.3.2)
|
125
138
|
rake (>= 0.8.7)
|
126
139
|
rdoc (~> 3.4)
|
127
|
-
thor (
|
128
|
-
rake (0.
|
140
|
+
thor (>= 0.14.6, < 2.0)
|
141
|
+
rake (10.0.1)
|
129
142
|
rdoc (3.12)
|
130
143
|
json (~> 1.4)
|
131
|
-
rspec (2.
|
132
|
-
rspec-core (~> 2.
|
133
|
-
rspec-expectations (~> 2.
|
134
|
-
rspec-mocks (~> 2.
|
135
|
-
rspec-core (2.
|
136
|
-
rspec-expectations (2.
|
144
|
+
rspec (2.12.0)
|
145
|
+
rspec-core (~> 2.12.0)
|
146
|
+
rspec-expectations (~> 2.12.0)
|
147
|
+
rspec-mocks (~> 2.12.0)
|
148
|
+
rspec-core (2.12.0)
|
149
|
+
rspec-expectations (2.12.0)
|
137
150
|
diff-lcs (~> 1.1.3)
|
138
|
-
rspec-mocks (2.
|
139
|
-
rubyzip (0.9.
|
140
|
-
selenium-webdriver (2.
|
151
|
+
rspec-mocks (2.12.0)
|
152
|
+
rubyzip (0.9.9)
|
153
|
+
selenium-webdriver (2.26.0)
|
141
154
|
childprocess (>= 0.2.5)
|
142
|
-
|
155
|
+
libwebsocket (~> 0.1.3)
|
143
156
|
multi_json (~> 1.0)
|
144
157
|
rubyzip
|
145
|
-
|
158
|
+
slop (3.3.3)
|
159
|
+
spoon (0.0.1)
|
160
|
+
sprockets (2.2.1)
|
146
161
|
hike (~> 1.2)
|
162
|
+
multi_json (~> 1.0)
|
147
163
|
rack (~> 1.0)
|
148
164
|
tilt (~> 1.1, != 1.3.0)
|
149
|
-
thin (1.
|
165
|
+
thin (1.5.0)
|
150
166
|
daemons (>= 1.0.9)
|
151
167
|
eventmachine (>= 0.12.6)
|
152
168
|
rack (>= 1.0.0)
|
153
|
-
thor (0.
|
169
|
+
thor (0.16.0)
|
154
170
|
tilt (1.3.3)
|
155
|
-
treetop (1.4.
|
171
|
+
treetop (1.4.12)
|
156
172
|
polyglot
|
157
173
|
polyglot (>= 0.3.1)
|
158
|
-
tzinfo (0.3.
|
174
|
+
tzinfo (0.3.35)
|
175
|
+
websocket (1.0.3)
|
159
176
|
|
160
177
|
PLATFORMS
|
161
178
|
java
|
@@ -164,7 +181,7 @@ PLATFORMS
|
|
164
181
|
DEPENDENCIES
|
165
182
|
guard
|
166
183
|
guard-coffeescript
|
167
|
-
guard-sprockets
|
184
|
+
guard-sprockets
|
168
185
|
jasmine!
|
169
186
|
joosy!
|
170
187
|
thin
|
data/README.md
CHANGED
@@ -48,7 +48,7 @@ Credits
|
|
48
48
|
<img src="http://roundlake.ru/assets/logo.png" align="right" />
|
49
49
|
|
50
50
|
* Boris Staal ([@_inossidabile](http://twitter.com/#!/_inossidabile))
|
51
|
-
* Andrew Shaydurov
|
51
|
+
* Andrew Shaydurov ([@ImGearHead](http://twitter.com/#!/ImGearHead))
|
52
52
|
* Alexander Pavlenko ([@alerticus](http://twitter.com/#!/alerticus))
|
53
53
|
* Peter Zotov ([@whitequark](http://twitter.com/#!/whitequark))
|
54
54
|
|
@@ -9,7 +9,7 @@ Joosy.Application =
|
|
9
9
|
Pages: {}
|
10
10
|
Layouts: {}
|
11
11
|
Controls: {}
|
12
|
-
|
12
|
+
|
13
13
|
loading: true
|
14
14
|
identity: true
|
15
15
|
debug: false
|
@@ -51,4 +51,4 @@ Joosy.Application =
|
|
51
51
|
#
|
52
52
|
setCurrentPage: (page, params) ->
|
53
53
|
#if @page not instanceof page
|
54
|
-
@page = new page params, @page
|
54
|
+
@page = new page params, @page
|
@@ -8,7 +8,7 @@
|
|
8
8
|
# AJAXifies form including file uploads and stuff. Built on top of jQuery.Form.
|
9
9
|
#
|
10
10
|
# Joosy.Form automatically cares of form validation highlights. It can
|
11
|
-
# read common server error responses and add .field_with_errors class to proper
|
11
|
+
# read common server error responses and add .field_with_errors class to proper
|
12
12
|
# field.
|
13
13
|
#
|
14
14
|
# If you don't have resource associated with form (#fill), it will try to find fields
|
@@ -17,7 +17,7 @@
|
|
17
17
|
# @example Joosy.Form usage
|
18
18
|
# form = new Joosy.Form, -> (response)
|
19
19
|
# console.log "Saved and got some: #{response}"
|
20
|
-
#
|
20
|
+
#
|
21
21
|
# form.progress = (percent) -> console.log "Uploaded by #{percent}%"
|
22
22
|
# form.fill @resource
|
23
23
|
#
|
@@ -34,7 +34,7 @@ class Joosy.Form extends Joosy.Module
|
|
34
34
|
# Marks the CSS class to use to mark invalidated fields
|
35
35
|
#
|
36
36
|
invalidationClass: 'field_with_errors'
|
37
|
-
|
37
|
+
|
38
38
|
#
|
39
39
|
# List of mappings for fields of invalidated data which comes from server
|
40
40
|
#
|
@@ -84,12 +84,12 @@ class Joosy.Form extends Joosy.Module
|
|
84
84
|
# by returning false from your own before callback. Both of callbacks will run if
|
85
85
|
# you return true.
|
86
86
|
#
|
87
|
-
# @option options [Function] success `(Object) -> null` triggers on
|
87
|
+
# @option options [Function] success `(Object) -> null` triggers on 2xx HTTP code from server.
|
88
88
|
# Pases in the parsed JSON.
|
89
89
|
#
|
90
90
|
# @option options [Function] progress `(Float) -> null` runs periodically while form is uploading
|
91
91
|
#
|
92
|
-
# @option options [Function] error `(Object) -> Boolean` triggers if server responded with anything but
|
92
|
+
# @option options [Function] error `(Object) -> Boolean` triggers if server responded with anything but 2xx.
|
93
93
|
# By default will run form invalidation routine. This behavior can be canceled
|
94
94
|
# by returning false from your own error callback. Both of callbacks will run if
|
95
95
|
# you return true.
|
@@ -97,6 +97,7 @@ class Joosy.Form extends Joosy.Module
|
|
97
97
|
# @option options [Joosy.Resource.Generic] resource The resource to fill the form with
|
98
98
|
# @option options [String] resourceName The string to use as a resource name prefix for fields to match invalidation
|
99
99
|
# @option options [String] action Action URL for the form
|
100
|
+
# @option options [String] method HTTP method, for example PUT, that will passed in _method param
|
100
101
|
#
|
101
102
|
constructor: (form, options={}) ->
|
102
103
|
if Object.isFunction options
|
@@ -136,6 +137,13 @@ class Joosy.Form extends Joosy.Module
|
|
136
137
|
@fill(options.resource, options)
|
137
138
|
delete @resource
|
138
139
|
|
140
|
+
if options.action?
|
141
|
+
@container.attr 'action', options.action
|
142
|
+
@container.attr 'method', 'POST'
|
143
|
+
|
144
|
+
if options.method?
|
145
|
+
@__markMethod options.method
|
146
|
+
|
139
147
|
#
|
140
148
|
# Resets form submit behavior to default
|
141
149
|
#
|
@@ -170,14 +178,16 @@ class Joosy.Form extends Joosy.Module
|
|
170
178
|
key = @concatFieldName scope, property
|
171
179
|
input = @fields.filter("[name='#{key}']:not(:file),[name='#{key.underscore()}']:not(:file),[name='#{key.camelize(false)}']:not(:file)")
|
172
180
|
if input.length > 0
|
173
|
-
|
174
|
-
input.val val
|
175
|
-
else
|
181
|
+
if input.is ':checkbox'
|
176
182
|
if val
|
177
183
|
input.attr 'checked', 'checked'
|
178
184
|
else
|
179
185
|
input.removeAttr 'checked'
|
180
|
-
|
186
|
+
else if input.is ':radio'
|
187
|
+
input.filter("[value='#{val}']").attr 'checked', 'checked'
|
188
|
+
else
|
189
|
+
input.val val
|
190
|
+
if Object.isObject(val) || Object.isArray(val)
|
181
191
|
filler val, key
|
182
192
|
else if val instanceof Joosy.Resource.REST
|
183
193
|
filler val.data, @concatFieldName(scope, "[#{property}_attributes][0]")
|
@@ -186,7 +196,7 @@ class Joosy.Form extends Joosy.Module
|
|
186
196
|
filler entity.data, @concatFieldName(scope, "[#{property}_attributes][#{i}]")
|
187
197
|
delete data.__joosy_form_filler_lock
|
188
198
|
|
189
|
-
filler data, resource.__entityName
|
199
|
+
filler data, resource.__entityName || options.resourceName
|
190
200
|
|
191
201
|
@__markMethod(options?.method || 'PUT') if resource.id()
|
192
202
|
|
@@ -200,7 +210,7 @@ class Joosy.Form extends Joosy.Module
|
|
200
210
|
#
|
201
211
|
submit: ->
|
202
212
|
@container.submit()
|
203
|
-
|
213
|
+
|
204
214
|
#
|
205
215
|
# Serializes form into query string.
|
206
216
|
#
|
@@ -211,7 +221,7 @@ class Joosy.Form extends Joosy.Module
|
|
211
221
|
serialize: (skipMethod=true) ->
|
212
222
|
data = @container.serialize()
|
213
223
|
data = data.replace /\&?\_method\=put/i, '' if skipMethod
|
214
|
-
|
224
|
+
|
215
225
|
data
|
216
226
|
|
217
227
|
#
|
@@ -220,7 +230,7 @@ class Joosy.Form extends Joosy.Module
|
|
220
230
|
__success: (response, status, xhr) ->
|
221
231
|
if xhr
|
222
232
|
@success? response
|
223
|
-
else if response.status
|
233
|
+
else if 200 <= response.status < 300
|
224
234
|
@success response.json
|
225
235
|
else
|
226
236
|
@__error response.json
|
@@ -248,7 +258,7 @@ class Joosy.Form extends Joosy.Module
|
|
248
258
|
|
249
259
|
if !@error? || @error(errors) is true
|
250
260
|
errors = @__stringifyErrors(errors)
|
251
|
-
|
261
|
+
|
252
262
|
Object.each errors, (field, notifications) =>
|
253
263
|
input = @findField(field).addClass @invalidationClass
|
254
264
|
@notification? input, notifications
|
@@ -256,7 +266,7 @@ class Joosy.Form extends Joosy.Module
|
|
256
266
|
return errors
|
257
267
|
|
258
268
|
return false
|
259
|
-
|
269
|
+
|
260
270
|
#
|
261
271
|
# Finds field by field name.
|
262
272
|
# This is not inlined since we want to override
|
@@ -280,7 +290,7 @@ class Joosy.Form extends Joosy.Module
|
|
280
290
|
value: method
|
281
291
|
)
|
282
292
|
@container.append method
|
283
|
-
|
293
|
+
|
284
294
|
#
|
285
295
|
# Prepares server response for default error handler
|
286
296
|
# Turns all possible response notations into form notation (foo[bar])
|
@@ -297,17 +307,17 @@ class Joosy.Form extends Joosy.Module
|
|
297
307
|
#
|
298
308
|
# @param [Object] errors Data to prepare
|
299
309
|
#
|
300
|
-
# @return [Hash<String, Array>] Flat hash with field names in keys and arrays
|
310
|
+
# @return [Hash<String, Array>] Flat hash with field names in keys and arrays
|
301
311
|
# of errors in values
|
302
312
|
#
|
303
313
|
__stringifyErrors: (errors) ->
|
304
314
|
result = {}
|
305
|
-
|
315
|
+
|
306
316
|
Object.each errors, (field, notifications) =>
|
307
317
|
if @substitutions[field]?
|
308
318
|
field = @substitutions[field]
|
309
319
|
|
310
|
-
if Object.isObject notifications
|
320
|
+
if Object.isObject(notifications) || @isArrayOfObjects(notifications)
|
311
321
|
Object.each @__foldInlineEntities(notifications), (key, value) ->
|
312
322
|
result[field+key] = value
|
313
323
|
else
|
@@ -318,7 +328,7 @@ class Joosy.Form extends Joosy.Module
|
|
318
328
|
name = @resourceName || @__resource.__entityName
|
319
329
|
field = name + "[#{field}]"
|
320
330
|
field += "[#{f}]" for f in splited
|
321
|
-
|
331
|
+
|
322
332
|
else if @resourceName || @__resource
|
323
333
|
name = @resourceName || @__resource.__entityName
|
324
334
|
field = name + "[#{field}]"
|
@@ -333,7 +343,7 @@ class Joosy.Form extends Joosy.Module
|
|
333
343
|
# @example Basic flattening
|
334
344
|
# data = foo: { bar: { baz: [] } }
|
335
345
|
# inner = @__foldInlineEntities(data.foo, 'foo')
|
336
|
-
#
|
346
|
+
#
|
337
347
|
# inner # { "foo[bar][baz]": [] }
|
338
348
|
#
|
339
349
|
# @param [Object] hash Structure to fold
|
@@ -344,7 +354,7 @@ class Joosy.Form extends Joosy.Module
|
|
344
354
|
#
|
345
355
|
__foldInlineEntities: (hash, scope="", result={}) ->
|
346
356
|
Object.each hash, (key, value) =>
|
347
|
-
if Object.isObject(value)
|
357
|
+
if Object.isObject(value) || @isArrayOfObjects(value)
|
348
358
|
@__foldInlineEntities(value, "#{scope}[#{key}]", result)
|
349
359
|
else
|
350
360
|
result["#{scope}[#{key}]"] = value
|
@@ -365,3 +375,6 @@ class Joosy.Form extends Joosy.Module
|
|
365
375
|
items.splice 0, 1, first[0], first[1]
|
366
376
|
items[items.length - 1] = items[items.length - 1].split(']')[0]
|
367
377
|
items
|
378
|
+
|
379
|
+
isArrayOfObjects: (array) ->
|
380
|
+
Object.isArray(array) && array.every((elem) -> Object.isObject(elem))
|
@@ -5,17 +5,18 @@
|
|
5
5
|
#
|
6
6
|
Joosy.helpers 'Application', ->
|
7
7
|
|
8
|
-
description = (resource, method, extendIds) ->
|
9
|
-
if resource
|
8
|
+
description = (resource, method, extendIds, idSuffix) ->
|
9
|
+
if Joosy.Module.hasAncestor resource.constructor, Joosy.Resource.Generic
|
10
10
|
id = resource.id()
|
11
11
|
resource = resource.__entityName
|
12
12
|
|
13
13
|
name: resource + "#{if method.match(/^\[.*\]$/) then method else "[#{method}]"}"
|
14
|
-
id: resource + (if id && extendIds then '_'+id else '') + "_#{method.parameterize().underscore()}"
|
14
|
+
id: resource + (if id && extendIds then '_'+id else '') + "_#{method.parameterize().underscore()}" + (if idSuffix then '_'+idSuffix else '')
|
15
15
|
|
16
16
|
input = (type, resource, method, options={}) =>
|
17
|
-
d = description(resource, method, options.extendIds)
|
17
|
+
d = description(resource, method, options.extendIds, options.idSuffix)
|
18
18
|
delete options.extendIds
|
19
|
+
delete options.idSuffix
|
19
20
|
@tag 'input', Joosy.Module.merge {type: type, name: d.name, id: d.id}, options
|
20
21
|
|
21
22
|
#
|
@@ -23,11 +24,18 @@ Joosy.helpers 'Application', ->
|
|
23
24
|
#
|
24
25
|
class Form
|
25
26
|
constructor: (@context, @resource, @options) ->
|
26
|
-
|
27
|
+
|
28
|
+
label: (method, options={}, content='') ->
|
29
|
+
if !Object.isObject(options)
|
30
|
+
content = options
|
31
|
+
options = {}
|
32
|
+
|
33
|
+
@context.label(@resource, method, Joosy.Module.merge(extendIds: @options.extendIds, options), content)
|
34
|
+
|
27
35
|
radioButton: (method, tagValue, options={}) -> @context.radioButton(@resource, method, tagValue, Joosy.Module.merge(extendIds: @options.extendIds, options))
|
28
36
|
textArea: (method, options={}) -> @context.textArea(@resource, method, Joosy.Module.merge(extendIds: @options.extendIds, options))
|
29
|
-
checkBox: (method, options={}, checkedValue=1, uncheckedValue=0) ->
|
30
|
-
|
37
|
+
checkBox: (method, options={}, checkedValue=1, uncheckedValue=0) -> @context.checkBox(@resource, method, Joosy.Module.merge(extendIds: @options.extendIds, options), checkedValue, uncheckedValue)
|
38
|
+
select: (method, options={}, htmlOptions={}) -> @context.select @resource, method, options, Joosy.Module.merge(extendIds: @options.extendIds, htmlOptions)
|
31
39
|
|
32
40
|
['text', 'file', 'hidden', 'password'].each (type) =>
|
33
41
|
Form.prototype[type+'Field'] = (method, options={}) ->
|
@@ -58,7 +66,7 @@ Joosy.helpers 'Application', ->
|
|
58
66
|
['text', 'file', 'hidden', 'password'].each (type) =>
|
59
67
|
@[type+'Field'] = (resource, method, options={}) -> input type, resource, method, options
|
60
68
|
|
61
|
-
@radioButton = (resource, method, tagValue, options={}) -> input 'radio', resource, method, Joosy.Module.merge(value: tagValue, options)
|
69
|
+
@radioButton = (resource, method, tagValue, options={}) -> input 'radio', resource, method, Joosy.Module.merge(value: tagValue, idSuffix: tagValue, options)
|
62
70
|
|
63
71
|
@checkBox = (resource, method, options={}, checkedValue=1, uncheckedValue=0) ->
|
64
72
|
spy = @tag 'input', Joosy.Module.merge(name: description(resource, method).name, value: uncheckedValue, type: 'hidden')
|
@@ -66,10 +74,31 @@ Joosy.helpers 'Application', ->
|
|
66
74
|
|
67
75
|
spy+box
|
68
76
|
|
77
|
+
@select = (resource, method, options, htmlOptions) ->
|
78
|
+
if Object.isObject options
|
79
|
+
opts = []
|
80
|
+
for key, val of options
|
81
|
+
opts.push [val, key]
|
82
|
+
else
|
83
|
+
opts = options
|
84
|
+
if htmlOptions.includeBlank
|
85
|
+
delete htmlOptions.includeBlank
|
86
|
+
opts.unshift ['', '']
|
87
|
+
opts = opts.reduce (str, vals) =>
|
88
|
+
params = if Object.isArray vals then ['option', { value: vals[1] }, vals[0]] else ['option', {}, vals]
|
89
|
+
if htmlOptions.value == (if Object.isArray(vals) then vals[1] else vals)
|
90
|
+
params[1].selected = 'selected'
|
91
|
+
str += @.tag.apply @, params
|
92
|
+
, ''
|
93
|
+
extendIds = htmlOptions.extendIds
|
94
|
+
delete htmlOptions.value
|
95
|
+
delete htmlOptions.extendIds
|
96
|
+
@tag 'select', Joosy.Module.merge(description(resource, method, extendIds), htmlOptions), opts
|
97
|
+
|
69
98
|
@textArea = (resource, method, options={}) ->
|
70
99
|
value = options.value
|
71
100
|
extendIds = options.extendIds
|
72
101
|
delete options.value
|
73
102
|
delete options.extendIds
|
74
103
|
|
75
|
-
@tag 'textarea', Joosy.Module.merge(description(resource, method, extendIds), options), value
|
104
|
+
@tag 'textarea', Joosy.Module.merge(description(resource, method, extendIds), options), value
|
@@ -4,7 +4,7 @@
|
|
4
4
|
# Rendering and string representation helpers
|
5
5
|
#
|
6
6
|
Joosy.helpers 'Application', ->
|
7
|
-
|
7
|
+
|
8
8
|
@tag = (name, options={}, content='') ->
|
9
9
|
content = content() if Object.isFunction(content)
|
10
10
|
|
@@ -12,7 +12,13 @@ Joosy.helpers 'Application', ->
|
|
12
12
|
temp = document.createElement 'div'
|
13
13
|
|
14
14
|
Object.each options, (name, value) -> element.setAttribute name, value
|
15
|
-
|
15
|
+
|
16
|
+
try
|
17
|
+
element.innerHTML = content
|
18
|
+
catch e
|
19
|
+
# setting innerHTML fails in the IE for elements, which cann't have children (INPUT, for ex.)
|
20
|
+
# suppress this error unless content looks valuable
|
21
|
+
throw e if content
|
16
22
|
|
17
23
|
temp.appendChild element
|
18
24
|
temp.innerHTML
|
@@ -28,7 +34,7 @@ Joosy.helpers 'Application', ->
|
|
28
34
|
#
|
29
35
|
# Wraps the inline block into given template
|
30
36
|
# Request template will receive the inline block as @yield parameter
|
31
|
-
#
|
37
|
+
#
|
32
38
|
# Example
|
33
39
|
# -# foo/baz template
|
34
40
|
# != @renderWrapped 'foo/bar', ->
|
@@ -39,4 +45,4 @@ Joosy.helpers 'Application', ->
|
|
39
45
|
# != @yield
|
40
46
|
#
|
41
47
|
@renderWrapped = (template, lambda) ->
|
42
|
-
@render template, Joosy.Module.merge(this, yield: lambda())
|
48
|
+
@render template, Joosy.Module.merge(this, yield: lambda())
|
@@ -7,7 +7,12 @@ Joosy.helpers 'Application', ->
|
|
7
7
|
|
8
8
|
@widget = (element, widget) ->
|
9
9
|
uuid = Joosy.uuid()
|
10
|
-
|
10
|
+
params = id: uuid
|
11
|
+
parts = element.split '.'
|
12
|
+
if parts[1]
|
13
|
+
params.class = parts.from(1).join ' '
|
14
|
+
|
15
|
+
element = @tag parts[0], params
|
11
16
|
|
12
17
|
@onRefresh -> @registerWidget '#'+uuid, widget
|
13
18
|
|
@@ -8,12 +8,12 @@
|
|
8
8
|
# Core modules container
|
9
9
|
#
|
10
10
|
Modules: {}
|
11
|
-
|
11
|
+
|
12
12
|
#
|
13
13
|
# Resources container
|
14
14
|
#
|
15
15
|
Resource: {}
|
16
|
-
|
16
|
+
|
17
17
|
#
|
18
18
|
# Templaters container
|
19
19
|
#
|
@@ -25,7 +25,7 @@
|
|
25
25
|
# @example Basic usage
|
26
26
|
# Joosy.namespace 'foobar', ->
|
27
27
|
# class @RealThing
|
28
|
-
#
|
28
|
+
#
|
29
29
|
# foo = new foobar.RealThing
|
30
30
|
#
|
31
31
|
# @param [String] name Namespace keyword
|
@@ -173,6 +173,8 @@
|
|
173
173
|
space[className] = class extends Joosy.Resource.REST
|
174
174
|
@entity resource
|
175
175
|
@source path
|
176
|
+
__collection: ->
|
177
|
+
space[collectionName]
|
176
178
|
unless space[collectionName]
|
177
179
|
Joosy.Modules.Log.debugAs space, "Define #{collectionName}"
|
178
180
|
space[collectionName] = class extends Joosy.Resource.RESTCollection
|