voluntary_survey 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/app/assets/javascripts/voluntary_survey/story/adapters/application_adapter.js.coffee +5 -0
- data/app/assets/javascripts/voluntary_survey/story/app.js.coffee +10 -0
- data/app/assets/javascripts/voluntary_survey/story/application.js +9 -0
- data/app/assets/javascripts/voluntary_survey/story/components/page_form_component.js.coffee +59 -0
- data/app/assets/javascripts/voluntary_survey/story/components/task_form_component.js.coffee +63 -0
- data/app/assets/javascripts/voluntary_survey/story/components/task_option_form_component.js.coffee +43 -0
- data/app/assets/javascripts/voluntary_survey/story/controllers/pages_controller.js.coffee +54 -0
- data/app/assets/javascripts/voluntary_survey/story/helpers/is_equal_helper.js.coffee +2 -0
- data/app/assets/javascripts/voluntary_survey/story/helpers/t_helper.js.coffee +10 -0
- data/app/assets/javascripts/voluntary_survey/story/models/survey_page.js.coffee +3 -0
- data/app/assets/javascripts/voluntary_survey/story/router.js.coffee +8 -0
- data/app/assets/javascripts/voluntary_survey/story/routes/application_route.js.coffee +3 -0
- data/app/assets/javascripts/voluntary_survey/story/routes/pages_route.js.coffee +26 -0
- data/app/assets/javascripts/voluntary_survey/story/templates/application.js.handlebars +11 -0
- data/app/assets/javascripts/voluntary_survey/story/templates/components/page-form.js.handlebars +57 -0
- data/app/assets/javascripts/voluntary_survey/story/templates/components/task-form.js.handlebars +126 -0
- data/app/assets/javascripts/voluntary_survey/story/templates/components/task-option-form.js.handlebars +19 -0
- data/app/assets/javascripts/voluntary_survey/story/templates/pages.js.handlebars +41 -0
- data/app/controllers/survey_results_controller.rb +14 -0
- data/app/controllers/voluntary/api/v1/survey_input_options_controller.rb +63 -0
- data/app/controllers/voluntary/api/v1/survey_pages_controller.rb +63 -0
- data/app/controllers/voluntary/api/v1/survey_tasks_controller.rb +63 -0
- data/app/controllers/workflow/user/survey_pages_controller.rb +27 -0
- data/app/models/product/survey/input_option.rb +16 -0
- data/app/models/product/survey/page.rb +57 -0
- data/app/models/product/survey/result.rb +42 -0
- data/app/models/product/survey/story.rb +19 -0
- data/app/models/product/survey/task.rb +25 -0
- data/app/models/product/survey.rb +2 -0
- data/app/serializers/survey_input_option_serializer.rb +3 -0
- data/app/serializers/survey_page_serializer.rb +7 -0
- data/app/serializers/survey_story_serializer.rb +7 -0
- data/app/serializers/survey_task_serializer.rb +7 -0
- data/app/views/products/types/survey/wizard.html.erb +15 -0
- data/app/views/products/types/survey/workflow/user/stories/_next_task.html.erb +1 -0
- data/app/views/survey_results/index.html.erb +54 -0
- data/app/views/workflow/user/survey_pages/show.html.erb +65 -0
- data/config/locales/resources/survey/en.yml +36 -0
- data/config/locales/resources/survey_input_option/en.yml +37 -0
- data/config/locales/resources/survey_page/en.yml +35 -0
- data/config/locales/resources/survey_result/en.yml +4 -0
- data/config/locales/resources/survey_task/en.yml +37 -0
- data/config/routes.rb +20 -0
- data/db/migrate/20150903170909_add_product_survey.rb +14 -0
- data/lib/voluntary_survey/engine.rb +8 -0
- data/lib/voluntary_survey/navigation.rb +22 -0
- data/lib/voluntary_survey/version.rb +2 -2
- data/lib/voluntary_survey.rb +5 -1
- metadata +317 -35
- data/MIT-LICENSE +0 -20
@@ -0,0 +1,63 @@
|
|
1
|
+
class Voluntary::Api::V1::SurveyInputOptionsController < ActionController::Base
|
2
|
+
include Voluntary::V1::BaseController
|
3
|
+
|
4
|
+
respond_to :json
|
5
|
+
|
6
|
+
def show
|
7
|
+
resource = Product::Survey::Story.find(params[:story_id]).pages.find(params[:page_id]).tasks.find(params[:task_id]).options.find params[:id]
|
8
|
+
|
9
|
+
respond_to do |format|
|
10
|
+
format.json do
|
11
|
+
render json: resource
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def create
|
17
|
+
story = Product::Survey::Story.find params[:survey_input_option][:story_id]
|
18
|
+
|
19
|
+
authorize! :update, story
|
20
|
+
|
21
|
+
resource = story.pages.find(params[:survey_input_option].delete(:page_id)).tasks.find(params[:survey_input_option].delete(:task_id)).options.create params[:survey_input_option]
|
22
|
+
|
23
|
+
respond_to do |format|
|
24
|
+
format.json do
|
25
|
+
render json: resource.persisted? ? resource : { errors: resource.errors.to_hash }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def update
|
31
|
+
story = Product::Survey::Story.find params[:survey_input_option].delete(:story_id)
|
32
|
+
|
33
|
+
authorize! :update, story
|
34
|
+
|
35
|
+
resource = story.pages.find(params[:survey_input_option].delete(:page_id)).tasks.find(params[:survey_input_option].delete(:task_id)).options.find(params[:id])
|
36
|
+
resource.update_attributes params[:survey_input_option]
|
37
|
+
|
38
|
+
respond_to do |format|
|
39
|
+
format.json do
|
40
|
+
render json: resource.valid? ? resource : { errors: resource.errors.to_hash }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def destroy
|
46
|
+
story = Product::Survey::Story.find(params[:story_id])
|
47
|
+
|
48
|
+
authorize! :destroy, story
|
49
|
+
|
50
|
+
resource = story.pages.find(params[:page_id]).tasks.find(params[:task_id]).options.find params[:id]
|
51
|
+
resource.destroy
|
52
|
+
|
53
|
+
respond_to do |format|
|
54
|
+
format.json do
|
55
|
+
render json: if resource.persisted?
|
56
|
+
{ error: I18n.t('activerecord.errors.models.survey_page.attributes.base.deletion_failed') }
|
57
|
+
else
|
58
|
+
{}
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
class Voluntary::Api::V1::SurveyPagesController < ActionController::Base
|
2
|
+
include Voluntary::V1::BaseController
|
3
|
+
|
4
|
+
respond_to :json
|
5
|
+
|
6
|
+
def show
|
7
|
+
resource = Product::Survey::Page.find(params[:story_id]).pages.find(params[:id])
|
8
|
+
|
9
|
+
respond_to do |format|
|
10
|
+
format.json do
|
11
|
+
render json: resource
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def create
|
17
|
+
story = Product::Survey::Story.find(params[:survey_page].delete(:story_id))
|
18
|
+
|
19
|
+
authorize! :update, story
|
20
|
+
|
21
|
+
resource = story.pages.create params[:survey_page]
|
22
|
+
|
23
|
+
respond_to do |format|
|
24
|
+
format.json do
|
25
|
+
render json: resource.persisted? ? resource : { errors: resource.errors.to_hash }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def update
|
31
|
+
story = Product::Survey::Story.find(params[:survey_page].delete(:story_id))
|
32
|
+
|
33
|
+
authorize! :update, story
|
34
|
+
|
35
|
+
resource = story.pages.find(params[:id])
|
36
|
+
resource.update_attributes params[:survey_page]
|
37
|
+
|
38
|
+
respond_to do |format|
|
39
|
+
format.json do
|
40
|
+
render json: resource.valid? ? resource : { errors: resource.errors.to_hash }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def destroy
|
46
|
+
story = Product::Survey::Story.find(params[:story_id])
|
47
|
+
|
48
|
+
authorize! :destroy, story
|
49
|
+
|
50
|
+
resource = story.pages.find(params[:id])
|
51
|
+
resource.destroy
|
52
|
+
|
53
|
+
respond_to do |format|
|
54
|
+
format.json do
|
55
|
+
render json: if resource.persisted?
|
56
|
+
{ error: I18n.t('activerecord.errors.models.survey_page.attributes.base.deletion_failed') }
|
57
|
+
else
|
58
|
+
{}
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
class Voluntary::Api::V1::SurveyTasksController < ActionController::Base
|
2
|
+
include Voluntary::V1::BaseController
|
3
|
+
|
4
|
+
respond_to :json
|
5
|
+
|
6
|
+
def show
|
7
|
+
resource = Product::Survey::Story.find(params[:story_id]).pages.find(params[:page_id]).tasks.find(params[:id])
|
8
|
+
|
9
|
+
respond_to do |format|
|
10
|
+
format.json do
|
11
|
+
render json: resource
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def create
|
17
|
+
story = Product::Survey::Story.find params[:survey_task][:story_id]
|
18
|
+
|
19
|
+
authorize! :update, story
|
20
|
+
|
21
|
+
resource = story.pages.find(params[:survey_task].delete(:page_id)).tasks.create params[:survey_task]
|
22
|
+
|
23
|
+
respond_to do |format|
|
24
|
+
format.json do
|
25
|
+
render json: resource.persisted? ? SurveyTaskSerializer.new(resource) : { errors: resource.errors.to_hash }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def update
|
31
|
+
story = Product::Survey::Story.find params[:survey_task].delete(:story_id)
|
32
|
+
|
33
|
+
authorize! :update, story
|
34
|
+
|
35
|
+
resource = story.pages.find(params[:survey_task].delete(:page_id)).tasks.find(params[:id])
|
36
|
+
resource.update_attributes params[:survey_task]
|
37
|
+
|
38
|
+
respond_to do |format|
|
39
|
+
format.json do
|
40
|
+
render json: resource.valid? ? resource : { errors: resource.errors.to_hash }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def destroy
|
46
|
+
story = Product::Survey::Story.find(params[:story_id])
|
47
|
+
|
48
|
+
authorize! :destroy, story
|
49
|
+
|
50
|
+
resource = story.pages.find(params[:page_id]).tasks.find(params[:id])
|
51
|
+
resource.destroy
|
52
|
+
|
53
|
+
respond_to do |format|
|
54
|
+
format.json do
|
55
|
+
render json: if resource.persisted?
|
56
|
+
{ error: I18n.t('activerecord.errors.models.survey_page.attributes.base.deletion_failed') }
|
57
|
+
else
|
58
|
+
{}
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class Workflow::User::SurveyPagesController < ApplicationController
|
2
|
+
def show
|
3
|
+
@story = Story.find(params[:story_id])
|
4
|
+
@page = @story.pages.where(position: params[:page_position]).first
|
5
|
+
@results = Product::Survey::Result.where(task_id: { '$in' => @page.tasks.map(&:id) }, user_id: current_user.id).index_by{|r| r.task_id.to_s}
|
6
|
+
@errors = {}
|
7
|
+
end
|
8
|
+
|
9
|
+
def update
|
10
|
+
@story = Story.find(params[:story_id])
|
11
|
+
@page = @story.pages.where(position: params[:page_position]).first
|
12
|
+
@results, @errors = @page.set_results(params[:results], current_user)
|
13
|
+
|
14
|
+
if @errors.empty?
|
15
|
+
next_page_position = @story.submit_page(params[:page_position], current_user)
|
16
|
+
|
17
|
+
if next_page_position
|
18
|
+
redirect_to survey_page_workflow_user_index_path(story_id: @story.slug, page_position: next_page_position)
|
19
|
+
else
|
20
|
+
flash[:notice] = I18n.t('surveys.complete.success_message')
|
21
|
+
redirect_to workflow_user_index_path
|
22
|
+
end
|
23
|
+
else
|
24
|
+
render 'show'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Product::Survey::InputOption
|
2
|
+
include Mongoid::Document
|
3
|
+
include Mongoid::Timestamps
|
4
|
+
include ActiveModel::MassAssignmentSecurity
|
5
|
+
include Mongoid::Orderable
|
6
|
+
|
7
|
+
embedded_in :task, class_name: 'Product::Survey::Task', inverse_of: :options
|
8
|
+
|
9
|
+
field :key, type: String
|
10
|
+
field :value, type: String
|
11
|
+
field :chosen_count, type: Integer
|
12
|
+
|
13
|
+
orderable
|
14
|
+
|
15
|
+
attr_accessible :option, :key, :value
|
16
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
class Product::Survey::Page
|
2
|
+
include Mongoid::Document
|
3
|
+
include Mongoid::Timestamps
|
4
|
+
include ActiveModel::MassAssignmentSecurity
|
5
|
+
include Mongoid::Orderable
|
6
|
+
|
7
|
+
embedded_in :story, class_name: 'Product::Survey::Story', inverse_of: :pages
|
8
|
+
has_many :tasks, class_name: 'Product::Survey::Task', inverse_of: :page
|
9
|
+
|
10
|
+
field :name, type: String
|
11
|
+
field :text, type: String
|
12
|
+
|
13
|
+
orderable
|
14
|
+
|
15
|
+
attr_accessible :story_id, :position, :name, :text
|
16
|
+
|
17
|
+
def set_results(params, user)
|
18
|
+
working_tasks = tasks.index_by{|t| t.id.to_s }
|
19
|
+
results = Product::Survey::Result.where(task_id: { '$in' => tasks.map(&:id) }, user_id: user.id).index_by{|r| r.task_id.to_s }
|
20
|
+
errors = {}
|
21
|
+
|
22
|
+
params.each do |task_id, result_form|
|
23
|
+
result = if result_form['id'].present? && results[task_id].try(:user_id) == user.id
|
24
|
+
results[task_id]
|
25
|
+
else
|
26
|
+
value = Product::Survey::Result.new(task_id: task_id)
|
27
|
+
value.user_id = user.id
|
28
|
+
value
|
29
|
+
end
|
30
|
+
|
31
|
+
text = working_tasks[task_id].answer_type == 'Checkboxes' ? result_form['text'].to_json : result_form['text']
|
32
|
+
|
33
|
+
result.update_attributes text: text
|
34
|
+
|
35
|
+
results[result.task_id.to_s] = result
|
36
|
+
|
37
|
+
unless result.valid?
|
38
|
+
errors[task_id] ||= []
|
39
|
+
|
40
|
+
result.errors.full_messages.each {|message| errors[task_id] << message }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
working_tasks.each do |task_id, task|
|
45
|
+
next if params.has_key? task_id
|
46
|
+
|
47
|
+
errors[task_id] ||= []
|
48
|
+
errors[task_id] << I18n.t('errors.messages.blank')
|
49
|
+
end
|
50
|
+
|
51
|
+
[results, errors]
|
52
|
+
end
|
53
|
+
|
54
|
+
protected
|
55
|
+
|
56
|
+
def with_offeror; false; end
|
57
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
class Product::Survey::Result < ::Result
|
2
|
+
belongs_to :task, class_name: 'Product::Survey::Task'
|
3
|
+
|
4
|
+
after_create :increment_chosen_count_of_option, if: 'task.with_options?'
|
5
|
+
after_update :update_chosen_count_of_options, if: 'text_changed? && task.with_options?'
|
6
|
+
|
7
|
+
def increment_chosen_count_of_option
|
8
|
+
if task.answer_type == 'Checkboxes'
|
9
|
+
task.options.where(_id: { '$in' => JSON.parse(text) }).each do |option|
|
10
|
+
option.update_attribute(:chosen_count, option.chosen_count.to_i + 1)
|
11
|
+
end
|
12
|
+
else
|
13
|
+
option = task.options.where(_id: text).first
|
14
|
+
option.update_attribute(:chosen_count, option.chosen_count.to_i + 1)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def update_chosen_count_of_options
|
19
|
+
if task.answer_type == 'Checkboxes'
|
20
|
+
option_ids = JSON.parse(text)
|
21
|
+
option_ids_was_array = JSON.parse(text_was)
|
22
|
+
|
23
|
+
options = task.options.where(_id: { '$in' => (option_ids + option_ids_was_array).uniq }).index_by{|o| o.id.to_s}
|
24
|
+
|
25
|
+
option_ids_was_array.select{|id| !option_ids.include?(id) }.each do |option_id_was|
|
26
|
+
option = options[option_id_was]
|
27
|
+
option.update_attribute(:chosen_count, option.chosen_count.to_i - 1)
|
28
|
+
end
|
29
|
+
|
30
|
+
option_ids.select{|id| !option_ids_was_array.include?(id) }.each do |option_id|
|
31
|
+
option = options[option_id]
|
32
|
+
option.update_attribute(:chosen_count, option.chosen_count.to_i + 1)
|
33
|
+
end
|
34
|
+
else
|
35
|
+
option = task.options.where(_id: text).first
|
36
|
+
option.update_attribute(:chosen_count, option.chosen_count.to_i + 1)
|
37
|
+
|
38
|
+
option = task.options.where(_id: text_was).first
|
39
|
+
option.update_attribute(:chosen_count, option.chosen_count.to_i - 1)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class Product::Survey::Story < Story
|
2
|
+
embeds_many :pages, class_name: 'Product::Survey::Page', inverse_of: :story
|
3
|
+
|
4
|
+
def submit_page(page_position, user)
|
5
|
+
next_page_position = pages.where(:position.gt => page_position).order_by(position: 'asc').first.try(:position)
|
6
|
+
|
7
|
+
unless next_page_position
|
8
|
+
self.users_without_tasks_ids ||= []
|
9
|
+
self.users_without_tasks_ids << user.id
|
10
|
+
save
|
11
|
+
end
|
12
|
+
|
13
|
+
return next_page_position
|
14
|
+
end
|
15
|
+
|
16
|
+
protected
|
17
|
+
|
18
|
+
def with_offeror; false; end
|
19
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class Product::Survey::Task < ::Task
|
2
|
+
include Mongoid::Orderable
|
3
|
+
|
4
|
+
belongs_to :page, class_name: 'Product::Survey::Page', inverse_of: :tasks
|
5
|
+
|
6
|
+
embeds_many :options, class_name: 'Product::Survey::InputOption', inverse_of: :task
|
7
|
+
has_many :results, class_name: 'Product::Survey::Result', foreign_key: 'task_id', dependent: :destroy
|
8
|
+
|
9
|
+
field :answer_type, type: String
|
10
|
+
|
11
|
+
validates :name, presence: true, uniqueness: { scope: :story_id }
|
12
|
+
validates :answer_type, presence: true
|
13
|
+
|
14
|
+
orderable
|
15
|
+
|
16
|
+
attr_accessible :position, :answer_type
|
17
|
+
|
18
|
+
def with_options?
|
19
|
+
['Multiple choice', 'Checkboxes', 'Drop-down list'].include? answer_type
|
20
|
+
end
|
21
|
+
|
22
|
+
protected
|
23
|
+
|
24
|
+
def with_offeror; false; end
|
25
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<div id="outlet">
|
2
|
+
</div>
|
3
|
+
|
4
|
+
<% content_for :javascript_includes do %>
|
5
|
+
<script type="text/javascript">
|
6
|
+
Volontariat = typeof Volontariat === 'undefined' ? {} : Volontariat;
|
7
|
+
Volontariat.Survey = typeof Volontariat.Survey === 'undefined' ? {} : Volontariat.Survey;
|
8
|
+
Volontariat.Survey.NewRecord = <%= @story.new_record? %>;
|
9
|
+
Volontariat.Survey.ProjectId = '<%= @project.id %>';
|
10
|
+
Volontariat.Survey.StoryId = '<%= @story.id %>';
|
11
|
+
Volontariat.Survey.StoryState = '<%= @story.state %>';
|
12
|
+
</script>
|
13
|
+
<%= javascript_include_tag 'voluntary_survey/story/application' %>
|
14
|
+
<%= render partial: 'layouts/voluntary/translations_javascript' %>
|
15
|
+
<% end %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= link_to t('surveys.workflow.user.take_survey'), survey_page_workflow_user_index_path(story_id: story.slug, page_position: 1) %>
|
@@ -0,0 +1,54 @@
|
|
1
|
+
<% @story.pages.each do |page| %>
|
2
|
+
<fieldset class="fieldset" style="border: 1px solid black; padding:15px; margin-top:15px;">
|
3
|
+
<legend>
|
4
|
+
<% if page.name.present? %>
|
5
|
+
<%= page.name %></h3>
|
6
|
+
<% else %>
|
7
|
+
<%= t('activerecord.models.survey_page_short') %> <%= page.position %>
|
8
|
+
<% end %>
|
9
|
+
</legend>
|
10
|
+
|
11
|
+
<% page.tasks.each do |task| %>
|
12
|
+
<h3 style="margin-top:0px;"><%= task.name %></h3>
|
13
|
+
|
14
|
+
<% if ['Short text', 'Long text'].include? task.answer_type %>
|
15
|
+
<table class="table table-striped">
|
16
|
+
<thead>
|
17
|
+
<tr>
|
18
|
+
<th><% t('general.author')%></th>
|
19
|
+
<th><% t('attributes.text')%></th>
|
20
|
+
</tr>
|
21
|
+
</thead>
|
22
|
+
<tbody>
|
23
|
+
<% @results[task.id.to_s].each do |result| %>
|
24
|
+
<tr>
|
25
|
+
<td><%= link_to result.user.name, user_path(result.user) %></td>
|
26
|
+
<td class="more"><%= result.text %></td>
|
27
|
+
</tr>
|
28
|
+
<% end %>
|
29
|
+
</tbody>
|
30
|
+
</table>
|
31
|
+
|
32
|
+
<%= will_paginate @results[task.id.to_s], param_name: "result_#{task.id}_page" %>
|
33
|
+
<% elsif task.with_options? %>
|
34
|
+
<table class="table table-striped">
|
35
|
+
<tbody>
|
36
|
+
<% results_count = task.results.count %>
|
37
|
+
|
38
|
+
<% task.options.order_by(chosen_count: 'desc').each do |option| %>
|
39
|
+
<tr>
|
40
|
+
<td><%= option.value %></td>
|
41
|
+
<td style="text-align:right;"><%= option.chosen_count.to_i %></td>
|
42
|
+
<td style="text-align:right;"><%= option.chosen_count.to_i > 0 && results_count > 0 ? (option.chosen_count / results_count) * 100 : 0 %> %</td>
|
43
|
+
</tr>
|
44
|
+
<% end %>
|
45
|
+
</tbody>
|
46
|
+
</table>
|
47
|
+
<% end %>
|
48
|
+
<% end %>
|
49
|
+
</fieldset>
|
50
|
+
<% end %>
|
51
|
+
|
52
|
+
<% content_for :document_ready do %>
|
53
|
+
toggleText();
|
54
|
+
<% end %>
|
@@ -0,0 +1,65 @@
|
|
1
|
+
<h2><%= @story.name %></h2>
|
2
|
+
|
3
|
+
<% if @page.name.present? %>
|
4
|
+
<h3><%= @page.name %></h3>
|
5
|
+
<% else %>
|
6
|
+
<h3><%= t('activerecord.models.survey_page_short') %> <%= @page.position %></h3>
|
7
|
+
<% end %>
|
8
|
+
|
9
|
+
<% if @page.text.present? %>
|
10
|
+
<p>
|
11
|
+
<%= @page.text %>
|
12
|
+
</p>
|
13
|
+
<% end %>
|
14
|
+
|
15
|
+
<%= form_tag survey_page_workflow_user_index_path(story_id: @story.slug, page_position: params[:page_position]), method: :put, class: 'form-vertical' do %>
|
16
|
+
<% @page.tasks.each do |task| %>
|
17
|
+
<% result = @results[task.id.to_s] %>
|
18
|
+
|
19
|
+
<%= hidden_field_tag "results[#{task.id}][id]", result.id if result %>
|
20
|
+
|
21
|
+
<div class="form-group string required <%= (@errors[task.id.to_s] ? 'has-error' : '') %>">
|
22
|
+
<label class="string required control-label control-label">
|
23
|
+
<%= task.name %>
|
24
|
+
</label>
|
25
|
+
<% if task.text.present? %>
|
26
|
+
<p>
|
27
|
+
<%= task.text %>
|
28
|
+
</p>
|
29
|
+
<% end %>
|
30
|
+
|
31
|
+
<p>
|
32
|
+
<% if task.answer_type == 'Short text' %>
|
33
|
+
<%= text_field_tag "results[#{task.id}][text]", result.try(:text), class: 'required form-control' %>
|
34
|
+
<% elsif task.answer_type == 'Long text' %>
|
35
|
+
<%= text_area_tag "results[#{task.id}][text]", result.try(:text), class: 'required form-control' %>
|
36
|
+
<% elsif task.answer_type == 'Multiple choice' %>
|
37
|
+
<% task.options.each do |option| %>
|
38
|
+
<input type="radio" name="results[<%=task.id %>][text]"
|
39
|
+
value="<%= option.id.to_s %>"<% if result.try(:text) == option.id.to_s %> checked="checked"<% end %>/> <%= option.value %><br/>
|
40
|
+
<% end %>
|
41
|
+
<% elsif task.answer_type == 'Checkboxes' %>
|
42
|
+
<% task.options.each do |option| %>
|
43
|
+
<% input = result.try(:text).present? && result.text != 'null' ? JSON.parse(result.text) : [] %>
|
44
|
+
<input type="checkbox" name="results[<%=task.id %>][text][]"
|
45
|
+
value="<%= option.id.to_s %>"<% if input.include? option.id.to_s %> checked="checked"<% end %>/> <%= option.value %><br/>
|
46
|
+
<% end %>
|
47
|
+
<% elsif task.answer_type == 'Drop-down list' %>
|
48
|
+
<select name="results[<%=task.id %>][text]">
|
49
|
+
<% task.options.each do |option| %>
|
50
|
+
<option value="<%= option.id.to_s %>"<% if result.try(:text) == option.id.to_s %> selected="selected"<% end %>><%= option.value %></option>
|
51
|
+
<% end %>
|
52
|
+
</select>
|
53
|
+
<% end %>
|
54
|
+
</p>
|
55
|
+
|
56
|
+
<% if @errors[task.id.to_s] %>
|
57
|
+
<% @errors[task.id.to_s].each do |message| %>
|
58
|
+
<span class="help-block"><%= message %></span>
|
59
|
+
<% end %>
|
60
|
+
<% end %>
|
61
|
+
</div>
|
62
|
+
<% end %>
|
63
|
+
|
64
|
+
<%= submit_tag t('general.submit'), class: 'btn btn-default' %>
|
65
|
+
<% end %>
|
@@ -0,0 +1,36 @@
|
|
1
|
+
en:
|
2
|
+
surveys:
|
3
|
+
index:
|
4
|
+
title: Surveys
|
5
|
+
empty_collection: No surveys found.
|
6
|
+
new:
|
7
|
+
title: New Survey
|
8
|
+
edit:
|
9
|
+
title: Edit Survey
|
10
|
+
save:
|
11
|
+
failed: Something went wrong at saving survey
|
12
|
+
successful: Successfully saved survey.
|
13
|
+
|
14
|
+
create:
|
15
|
+
title: Create Survey
|
16
|
+
|
17
|
+
update:
|
18
|
+
title: Update Survey
|
19
|
+
|
20
|
+
complete:
|
21
|
+
success_message: Thanks for participating in the survey!
|
22
|
+
|
23
|
+
destroy:
|
24
|
+
confirmation: Do you really want to remove this survey?
|
25
|
+
|
26
|
+
workflow:
|
27
|
+
user:
|
28
|
+
take_survey: Take survey!
|
29
|
+
|
30
|
+
activerecord:
|
31
|
+
errors:
|
32
|
+
models:
|
33
|
+
survey:
|
34
|
+
attributes:
|
35
|
+
base:
|
36
|
+
deletion_failed: Survey could not be deleted!
|
@@ -0,0 +1,37 @@
|
|
1
|
+
en:
|
2
|
+
survey_input_options:
|
3
|
+
index:
|
4
|
+
title: Input options
|
5
|
+
empty_collection: No input options found.
|
6
|
+
new:
|
7
|
+
title: New Option
|
8
|
+
edit:
|
9
|
+
title: Edit Option
|
10
|
+
save:
|
11
|
+
failed: Something went wrong at saving input option
|
12
|
+
successful: Successfully saved input option.
|
13
|
+
|
14
|
+
create:
|
15
|
+
title: Create Option
|
16
|
+
update:
|
17
|
+
title: Update Option
|
18
|
+
destroy:
|
19
|
+
title: Remove Option
|
20
|
+
confirmation: Do you really want to remove this input option?
|
21
|
+
|
22
|
+
activerecord:
|
23
|
+
models:
|
24
|
+
survey_input_option: Survey Input Option
|
25
|
+
survey_input_option_short: Option
|
26
|
+
|
27
|
+
attributes:
|
28
|
+
survey_input_option:
|
29
|
+
key: Key
|
30
|
+
value: Value
|
31
|
+
|
32
|
+
errors:
|
33
|
+
models:
|
34
|
+
survey_input_option:
|
35
|
+
attributes:
|
36
|
+
base:
|
37
|
+
deletion_failed: Input option could not be deleted!
|
@@ -0,0 +1,35 @@
|
|
1
|
+
en:
|
2
|
+
survey_pages:
|
3
|
+
index:
|
4
|
+
title: Pages
|
5
|
+
empty_collection: No pages found.
|
6
|
+
new:
|
7
|
+
title: New Page
|
8
|
+
edit:
|
9
|
+
title: Edit Page
|
10
|
+
save:
|
11
|
+
failed: Something went wrong at saving page
|
12
|
+
successful: Successfully saved page.
|
13
|
+
|
14
|
+
create:
|
15
|
+
title: Create Page
|
16
|
+
show:
|
17
|
+
untitled_page: Untitled Page
|
18
|
+
page_without_text: Put your page description here!
|
19
|
+
update:
|
20
|
+
title: Update Page
|
21
|
+
destroy:
|
22
|
+
title: Remove Page
|
23
|
+
confirmation: Do you really want to remove this page?
|
24
|
+
|
25
|
+
activerecord:
|
26
|
+
models:
|
27
|
+
survey_page: Survey Page
|
28
|
+
survey_page_short: Page
|
29
|
+
|
30
|
+
errors:
|
31
|
+
models:
|
32
|
+
survey_page:
|
33
|
+
attributes:
|
34
|
+
base:
|
35
|
+
deletion_failed: Page could not be deleted!
|