survey_on_rails 0.4.3 → 1.0.0
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/gen/models/model.rb +6 -2
- data/gen/models/styles.rb +1 -1
- data/gen/models/view.rb +4 -0
- data/lib/generators/survey/USAGE +4 -4
- data/lib/generators/survey/metamodels/app.rb +38 -27
- data/lib/generators/survey/metamodels/base.rb +31 -29
- data/lib/generators/survey/metamodels/main.rb +1 -0
- data/lib/generators/survey/metamodels/model.rb +22 -54
- data/lib/generators/survey/metamodels/static.rb +44 -0
- data/lib/generators/survey/metamodels/style.rb +64 -83
- data/lib/generators/survey/metamodels/types.rb +2 -0
- data/lib/generators/survey/metamodels/validation.rb +15 -2
- data/lib/generators/survey/metamodels/view.rb +124 -172
- data/lib/generators/survey/showcase/assets/static_pages/about.html.erb +10 -0
- data/lib/generators/survey/showcase/assets/static_pages/contact.html.erb +7 -0
- data/lib/generators/survey/showcase/assets/static_pages/help.html.erb +8 -0
- data/lib/generators/survey/showcase/assets/static_pages/home.html.erb +11 -0
- data/lib/generators/survey/showcase/models/app.rb +10 -0
- data/lib/generators/survey/showcase/models/model.rb +13 -0
- data/lib/generators/survey/showcase/models/static.rb +22 -0
- data/lib/generators/survey/showcase/models/styles.rb +3 -0
- data/lib/generators/survey/showcase/models/view.rb +13 -0
- data/lib/generators/survey/survey_generator.rb +11 -0
- data/lib/generators/survey/templates/app/assets/stylesheets/stylesheet.tpl +7 -7
- data/lib/generators/survey/templates/app/controllers/survey_controller.tpl +1 -1
- data/lib/generators/survey/templates/app/models/validator.tpl +2 -2
- data/lib/generators/survey/templates/app/views/{form → forms}/checkbox_group.tpl +12 -12
- data/lib/generators/survey/templates/app/views/{form → forms}/choice_question.tpl +0 -0
- data/lib/generators/survey/templates/app/views/{form → forms}/dropdown.tpl +0 -0
- data/lib/generators/survey/templates/app/views/{form → forms}/element.tpl +0 -0
- data/lib/generators/survey/templates/app/views/{form → forms}/form.tpl +0 -0
- data/lib/generators/survey/templates/app/views/{form → forms}/group.tpl +0 -0
- data/lib/generators/survey/templates/app/views/{form → forms}/horizontal_radio_button_group.tpl +0 -0
- data/lib/generators/survey/templates/app/views/{form → forms}/image.tpl +0 -0
- data/lib/generators/survey/templates/app/views/{form → forms}/pagination.tpl +4 -5
- data/lib/generators/survey/templates/app/views/{form → forms}/radio_button_group.tpl +0 -0
- data/lib/generators/survey/templates/app/views/{form → forms}/table.tpl +0 -0
- data/lib/generators/survey/templates/app/views/{form → forms}/textfield.tpl +0 -0
- data/lib/generators/survey/templates/app/views/layouts/header.tpl +31 -31
- data/lib/generators/survey/templates/app/views/views.tpl +1 -1
- metadata +29 -17
- checksums.yaml +0 -15
@@ -1,4 +1,6 @@
|
|
1
1
|
module SurveyMetamodel extend RGen::MetamodelBuilder::ModuleExtension
|
2
|
+
LIKERT_SCALE = ["Strongly disagree", "Disagree", "Neutral", "Agree", "Strongly Agree"]
|
3
|
+
|
2
4
|
Color = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "Color", :literals => [:blue, :red, :yellow, :gray, :green, :white, :black, :lightGray, :darkGray])
|
3
5
|
FontStyle = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "FontStyle", :literals => [:normal, :italic, :oblique])
|
4
6
|
FontWeight = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "FontWeight", :literals => [:normal, :bold])
|
@@ -1,4 +1,9 @@
|
|
1
1
|
module SurveyMetamodel extend RGen::MetamodelBuilder::ModuleExtension
|
2
|
+
class Dependency < Base
|
3
|
+
has_attr 'requires', String
|
4
|
+
has_attr 'value', String
|
5
|
+
end
|
6
|
+
|
2
7
|
class ValidationRule < Base
|
3
8
|
abstract
|
4
9
|
end
|
@@ -7,10 +12,10 @@ module SurveyMetamodel extend RGen::MetamodelBuilder::ModuleExtension
|
|
7
12
|
has_attr 'regex', String
|
8
13
|
end
|
9
14
|
|
10
|
-
class
|
15
|
+
class IntegerRule < ValidationRule
|
11
16
|
end
|
12
17
|
|
13
|
-
class
|
18
|
+
class FloatRule < ValidationRule
|
14
19
|
end
|
15
20
|
|
16
21
|
class PresenceRule < ValidationRule
|
@@ -25,4 +30,12 @@ module SurveyMetamodel extend RGen::MetamodelBuilder::ModuleExtension
|
|
25
30
|
has_attr 'min', Float
|
26
31
|
has_attr 'max', Float
|
27
32
|
end
|
33
|
+
end
|
34
|
+
|
35
|
+
module SurveyMetamodel
|
36
|
+
module Dependency::ClassModule
|
37
|
+
def condition
|
38
|
+
return "(!params[:#{requires}].blank? and params[:#{requires}][:content] == '#{value}')"
|
39
|
+
end
|
40
|
+
end
|
28
41
|
end
|
@@ -1,22 +1,25 @@
|
|
1
1
|
module SurveyMetamodel extend RGen::MetamodelBuilder::ModuleExtension
|
2
2
|
class ViewElement < StyleElement
|
3
3
|
abstract
|
4
|
-
|
4
|
+
has_attr 'model_element', Object, :unsettable => true
|
5
5
|
end
|
6
6
|
|
7
|
-
class
|
8
|
-
|
9
|
-
contains_many 'elements', ViewElement, 'form'
|
10
|
-
|
11
|
-
has_attr 'page_elements', Object
|
7
|
+
class ContentElement < ViewElement
|
8
|
+
abstract
|
12
9
|
end
|
13
10
|
|
14
|
-
class Input <
|
11
|
+
class Input < ContentElement
|
15
12
|
abstract
|
16
13
|
has_attr 'info', String
|
17
14
|
contains_one 'for', Input, 'element'
|
18
15
|
end
|
19
16
|
|
17
|
+
class Form < ViewElement
|
18
|
+
has_attr 'author', String
|
19
|
+
has_attr 'page_elements', Object, :unsettable => true
|
20
|
+
contains_many 'elements', ContentElement, 'form'
|
21
|
+
end
|
22
|
+
|
20
23
|
class Textfield < Input
|
21
24
|
has_attr 'type', TextFieldType
|
22
25
|
has_attr 'prefix', String
|
@@ -37,7 +40,16 @@ module SurveyMetamodel extend RGen::MetamodelBuilder::ModuleExtension
|
|
37
40
|
class HorizontalRadioButtonGroup < SelectionGroup
|
38
41
|
end
|
39
42
|
|
40
|
-
class
|
43
|
+
class Page < ContentElement
|
44
|
+
has_attr 'break', Boolean
|
45
|
+
contains_many 'elements', ContentElement, 'container'
|
46
|
+
end
|
47
|
+
|
48
|
+
class Group < ContentElement
|
49
|
+
contains_many 'elements', Input, 'container'
|
50
|
+
end
|
51
|
+
|
52
|
+
class Image < ContentElement
|
41
53
|
has_attr 'source', String
|
42
54
|
has_attr 'url', String
|
43
55
|
has_attr 'width', Integer
|
@@ -50,85 +62,36 @@ module SurveyMetamodel extend RGen::MetamodelBuilder::ModuleExtension
|
|
50
62
|
has_attr 'images_s', String
|
51
63
|
contains_many 'images', Image, 'matrix'
|
52
64
|
end
|
53
|
-
|
54
|
-
class LayoutElement < ViewElement
|
55
|
-
abstract
|
56
|
-
contains_many 'elements', ViewElement, 'container'
|
57
|
-
end
|
58
|
-
|
59
|
-
class Group < LayoutElement
|
60
|
-
end
|
61
|
-
|
62
|
-
class Page < LayoutElement
|
63
|
-
has_attr 'break', Boolean
|
64
|
-
end
|
65
|
-
|
66
|
-
class StaticElement < ViewElement
|
67
|
-
abstract
|
68
|
-
end
|
69
|
-
|
70
|
-
class PageView < ViewElement
|
71
|
-
abstract
|
72
|
-
contains_many 'elements', StaticElement, 'page'
|
73
|
-
end
|
74
|
-
|
75
|
-
class StaticPage < PageView
|
76
|
-
has_attr 'root', Boolean
|
77
|
-
has_attr 'file', String
|
78
|
-
end
|
79
|
-
|
80
|
-
class Header < PageView
|
81
|
-
end
|
82
|
-
|
83
|
-
class Footer < PageView
|
84
|
-
end
|
85
|
-
|
86
|
-
class Label < StaticElement
|
87
|
-
end
|
88
|
-
|
89
|
-
class Link < StaticElement
|
90
|
-
has_attr 'url', String
|
91
|
-
has_attr 'path', Boolean
|
92
|
-
end
|
93
|
-
|
94
|
-
class SurveyManagement < StaticElement
|
95
|
-
end
|
96
|
-
|
97
|
-
class UserManagement < StaticElement
|
98
|
-
end
|
99
65
|
end
|
100
66
|
|
101
67
|
module SurveyMetamodel
|
102
68
|
module ViewElement::ClassModule
|
103
|
-
def
|
104
|
-
|
105
|
-
while true
|
106
|
-
if !cont.container.nil?
|
107
|
-
cont = cont.container
|
108
|
-
else
|
109
|
-
break
|
110
|
-
end
|
111
|
-
end
|
112
|
-
return cont.form
|
113
|
-
end
|
114
|
-
|
115
|
-
def rules
|
116
|
-
model_element.rules if !model_element.nil?
|
69
|
+
def model_element?
|
70
|
+
return !model_element.nil?
|
117
71
|
end
|
118
72
|
|
119
|
-
def
|
120
|
-
return (
|
73
|
+
def is_layout_element?
|
74
|
+
return (self.is_a?(Group) or self.is_a?(Page) or self.is_a?(Image))
|
121
75
|
end
|
122
76
|
|
123
77
|
def has_label?
|
124
78
|
return self.is_a?(Input)
|
125
79
|
end
|
126
80
|
|
127
|
-
def
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
81
|
+
def has_model_element?
|
82
|
+
return (model_element? and !is_layout_element?)
|
83
|
+
end
|
84
|
+
|
85
|
+
def has_valid_model_element?
|
86
|
+
return (model_element? or is_layout_element?)
|
87
|
+
end
|
88
|
+
|
89
|
+
def is_mandatory?
|
90
|
+
return (!model_element.nil? and model_element.rules.any? { |r| r.is_a?(PresenceRule) })
|
91
|
+
end
|
92
|
+
|
93
|
+
def rules
|
94
|
+
model_element.rules if !model_element.nil?
|
132
95
|
end
|
133
96
|
|
134
97
|
def set_model_element
|
@@ -144,7 +107,8 @@ module SurveyMetamodel
|
|
144
107
|
self.for.model_element = nil
|
145
108
|
end
|
146
109
|
|
147
|
-
cont =
|
110
|
+
cont = get_form
|
111
|
+
cont.set_model_element if !cont.model_element?
|
148
112
|
view = cont.view
|
149
113
|
survey = view.app.model.surveys.select { |s| s.name == cont.name }.first
|
150
114
|
model_elements = survey.questions.select { |q| q.name == self.name or q.name == self.snake_class }
|
@@ -158,25 +122,28 @@ module SurveyMetamodel
|
|
158
122
|
self.class_name = self.snake_base_class
|
159
123
|
end
|
160
124
|
|
161
|
-
raise "Names cannot be nil and can only consist of letters, numbers and underscore (name='#{
|
162
|
-
end
|
163
|
-
|
164
|
-
def is_layout_element?
|
165
|
-
return (self.is_a?(Group) or self.is_a?(Page) or self.is_a?(Image))
|
125
|
+
raise "Names cannot be nil and can only consist of letters, numbers and underscore (name='#{name}')!" if has_name? and !(self.name.scan(/\w+/).count == 1)
|
166
126
|
end
|
167
127
|
|
168
|
-
def
|
169
|
-
|
128
|
+
def number_title(i)
|
129
|
+
suffix = (is_mandatory?)? " *": ""
|
130
|
+
real_title = "#{title}#{suffix}"
|
131
|
+
num_title = (i > 0)? ("#{i}. #{real_title}"): real_title
|
132
|
+
return num_title
|
170
133
|
end
|
171
134
|
|
172
|
-
def
|
173
|
-
|
135
|
+
def get_form
|
136
|
+
cont = self
|
137
|
+
while true
|
138
|
+
if !cont.container.nil?
|
139
|
+
cont = cont.container
|
140
|
+
else
|
141
|
+
break
|
142
|
+
end
|
143
|
+
end
|
144
|
+
return cont.form
|
174
145
|
end
|
175
146
|
|
176
|
-
def has_valid_model_element?
|
177
|
-
return (model_element? or is_layout_element?)
|
178
|
-
end
|
179
|
-
|
180
147
|
private
|
181
148
|
|
182
149
|
def custom_html?
|
@@ -185,12 +152,17 @@ module SurveyMetamodel
|
|
185
152
|
end
|
186
153
|
|
187
154
|
module Form::ClassModule
|
155
|
+
def has_multiple_pages?
|
156
|
+
actual_pages_number > 1
|
157
|
+
end
|
158
|
+
|
188
159
|
def author
|
189
|
-
model_element.author if
|
160
|
+
model_element.author if model_element?
|
190
161
|
end
|
191
162
|
|
192
|
-
def
|
193
|
-
|
163
|
+
def page_title(j)
|
164
|
+
page = (pages.reject { |p| p.break == true })[j - 1]
|
165
|
+
return (!page.nil? and page.title? and !page.break)? page.title: ""
|
194
166
|
end
|
195
167
|
|
196
168
|
def pages_number
|
@@ -201,8 +173,8 @@ module SurveyMetamodel
|
|
201
173
|
page_elements.count
|
202
174
|
end
|
203
175
|
|
204
|
-
def
|
205
|
-
|
176
|
+
def inputs
|
177
|
+
elements.select { |e| e.is_a?(Input) }
|
206
178
|
end
|
207
179
|
|
208
180
|
def pages
|
@@ -210,7 +182,7 @@ module SurveyMetamodel
|
|
210
182
|
end
|
211
183
|
|
212
184
|
def input_elements
|
213
|
-
page_elements =
|
185
|
+
page_elements = elements.select { |e| e.is_a?(Page) }.elements
|
214
186
|
other_elements = page_elements.select { |e| !e.is_a?(Group) }
|
215
187
|
group_elements = page_elements.select { |e| e.is_a?(Group) }.elements
|
216
188
|
input_elems = (inputs + other_elements + group_elements)
|
@@ -218,7 +190,8 @@ module SurveyMetamodel
|
|
218
190
|
end
|
219
191
|
|
220
192
|
def set_model_element
|
221
|
-
model_elements =
|
193
|
+
model_elements = view.app.model.surveys.select { |s| s.name == name }
|
194
|
+
raise "Form have to be associated to exactly one survey (name='#{name}')!" if !name? or model_elements.nil? or model_elements.count > 1
|
222
195
|
if !model_elements.nil? and model_elements.count == 1
|
223
196
|
self.model_element = model_elements.first
|
224
197
|
self.title = model_element.title if !title? and model_element.title?
|
@@ -226,36 +199,29 @@ module SurveyMetamodel
|
|
226
199
|
end
|
227
200
|
|
228
201
|
def set_page_elements
|
229
|
-
|
230
|
-
|
202
|
+
first_page = pages.first
|
203
|
+
page_elems = Array.new
|
204
|
+
page_elems << elements if pages.count == 0
|
231
205
|
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
if
|
237
|
-
|
238
|
-
|
239
|
-
if page_break == first_page_break
|
240
|
-
self.page_elements << page_elements_before_first
|
241
|
-
self.page_elements << page_elements_after(page_break)
|
242
|
-
else
|
243
|
-
self.page_elements << page_elements_after(page_break)
|
244
|
-
end
|
245
|
-
end
|
206
|
+
pages.each do |page|
|
207
|
+
if !page.elements.nil? and !page.elements.empty?
|
208
|
+
page_elems << page.elements
|
209
|
+
else
|
210
|
+
page_elems << page_elements_before(first_page) if (page == first_page)
|
211
|
+
after_page_elements = page_elements_after(page)
|
212
|
+
page_elems << after_page_elements if after_page_elements.any?
|
246
213
|
end
|
247
214
|
end
|
215
|
+
self.page_elements = page_elems
|
248
216
|
end
|
249
217
|
|
250
218
|
private
|
251
219
|
|
252
|
-
def
|
220
|
+
def page_elements_before(page)
|
253
221
|
page_elements = Array.new
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
add = false if elem.is_a?(Page)
|
258
|
-
page_elements << elem if add
|
222
|
+
elements.each do |element|
|
223
|
+
break if element.is_a?(Page) and element == page
|
224
|
+
page_elements << element
|
259
225
|
end
|
260
226
|
return page_elements
|
261
227
|
end
|
@@ -263,14 +229,13 @@ module SurveyMetamodel
|
|
263
229
|
def page_elements_after(page)
|
264
230
|
page_elements = Array.new
|
265
231
|
add = false
|
266
|
-
|
267
|
-
|
268
|
-
if elem.is_a?(Page) and elem == page
|
232
|
+
elements.each do |element|
|
233
|
+
if element.is_a?(Page) and element == page
|
269
234
|
add = true
|
270
|
-
elsif
|
235
|
+
elsif element.is_a?(Page) and element != page
|
271
236
|
add = false
|
272
237
|
end
|
273
|
-
page_elements <<
|
238
|
+
page_elements << element if !element.is_a?(Page) and add
|
274
239
|
end
|
275
240
|
return page_elements
|
276
241
|
end
|
@@ -282,26 +247,15 @@ module SurveyMetamodel
|
|
282
247
|
end
|
283
248
|
|
284
249
|
def dependencies?
|
285
|
-
|
250
|
+
!model_element.dependencies.empty? if model_element?
|
286
251
|
end
|
287
252
|
|
288
253
|
def dependencies
|
289
|
-
model_element.dependencies if
|
254
|
+
model_element.dependencies if model_element?
|
290
255
|
end
|
291
256
|
|
292
257
|
def conditions
|
293
|
-
model_element.conditions if
|
294
|
-
end
|
295
|
-
end
|
296
|
-
|
297
|
-
module StaticPage::ClassModule
|
298
|
-
def file_path
|
299
|
-
raise "The referenced static page does not exist. Please define it first." if !file.nil? and !File.exists?(file)
|
300
|
-
return (!file.nil?)? file: "gen/assets/static_pages/#{name}.html.erb"
|
301
|
-
end
|
302
|
-
|
303
|
-
def create_page_file
|
304
|
-
File.new(file_path, 'w') unless File.exists?(file_path)
|
258
|
+
model_element.conditions if model_element?
|
305
259
|
end
|
306
260
|
end
|
307
261
|
|
@@ -320,65 +274,63 @@ module SurveyMetamodel
|
|
320
274
|
model_element.real_choices if !model_element.nil?
|
321
275
|
end
|
322
276
|
|
323
|
-
def
|
324
|
-
|
325
|
-
choices.each { |choice|
|
326
|
-
return "[#{
|
277
|
+
def parameters
|
278
|
+
parameters_a = Array.new
|
279
|
+
choices.each { |choice| parameters_a << "params[:#{name}_#{choice.name}].to_s" }
|
280
|
+
return "[#{parameters_a.join(', ')}].reject(&:empty?).join(', ')"
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
284
|
+
module Image::ClassModule
|
285
|
+
def source?
|
286
|
+
!source.blank?
|
287
|
+
end
|
288
|
+
|
289
|
+
def url?
|
290
|
+
!url.blank?
|
327
291
|
end
|
328
292
|
end
|
329
293
|
|
330
294
|
module Table::ClassModule
|
295
|
+
def has_images?
|
296
|
+
return (images.any? or !images_s.blank?)
|
297
|
+
end
|
298
|
+
|
331
299
|
def type
|
332
|
-
model_element.type if
|
300
|
+
model_element.type if model_element?
|
333
301
|
end
|
334
302
|
|
335
303
|
def rows
|
336
|
-
model_element.real_rows if
|
304
|
+
model_element.real_rows if model_element?
|
337
305
|
end
|
338
306
|
|
339
307
|
def columns
|
340
|
-
model_element.real_columns if
|
308
|
+
model_element.real_columns if model_element?
|
341
309
|
end
|
342
310
|
|
343
311
|
def choices
|
344
|
-
model_element.real_choices if
|
345
|
-
end
|
346
|
-
|
347
|
-
def has_images?
|
348
|
-
return (images.any? or !images_s.blank?)
|
312
|
+
model_element.real_choices if model_element?
|
349
313
|
end
|
350
314
|
|
351
315
|
def real_images
|
352
|
-
|
316
|
+
images_a = nil
|
353
317
|
if !images_s.blank? and images.empty?
|
354
|
-
|
355
|
-
images_s.split(",").each { |
|
318
|
+
images_a = Array.new
|
319
|
+
images_s.split(",").each { |image| images_a << Image.new(:source => image.strip) }
|
356
320
|
else
|
357
|
-
|
321
|
+
images_a = images
|
358
322
|
end
|
359
|
-
raise "The number of images
|
360
|
-
return
|
323
|
+
raise "The number of images has to be the same than the number of cells." if images_a.count != (rows.count * columns.count)
|
324
|
+
return images_a
|
361
325
|
end
|
362
326
|
|
363
|
-
def
|
364
|
-
|
327
|
+
def parameters
|
328
|
+
parameters_a = Array.new
|
365
329
|
rows.each do |row|
|
366
|
-
|
367
|
-
columns.each
|
368
|
-
cells_string_a << "params[:#{name}_#{row.name}_#{column.name}]"
|
369
|
-
end
|
330
|
+
parameters_a << "params[:#{name}_#{row.name}]"
|
331
|
+
columns.each { |column| parameters_a << "params[:#{name}_#{row.name}_#{column.name}]" }
|
370
332
|
end
|
371
|
-
return "[#{
|
372
|
-
end
|
373
|
-
end
|
374
|
-
|
375
|
-
module Image::ClassModule
|
376
|
-
def source?
|
377
|
-
!source.blank?
|
378
|
-
end
|
379
|
-
|
380
|
-
def url?
|
381
|
-
!url.blank?
|
333
|
+
return "[#{parameters_a.join(', ')}].uniq.reject(&:blank?).join(', ')"
|
382
334
|
end
|
383
335
|
end
|
384
336
|
end
|