decidim-forms 0.20.1 → 0.23.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (158) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/config/admin/decidim_forms_manifest.css +3 -0
  3. data/app/assets/config/admin/decidim_forms_manifest.js +1 -0
  4. data/app/assets/config/decidim_forms_manifest.css +1 -0
  5. data/app/assets/images/decidim/surveys/icon.svg +1 -19
  6. data/app/assets/javascripts/decidim/forms/admin/auto_select_options_from_url.component.js.es6 +40 -0
  7. data/app/assets/javascripts/decidim/forms/admin/collapsible_questions.js.es6 +13 -0
  8. data/app/assets/javascripts/decidim/forms/admin/forms.js.es6 +260 -16
  9. data/app/assets/javascripts/decidim/forms/admin/live_text_update.component.js.es6 +52 -0
  10. data/app/assets/javascripts/decidim/forms/autosortable_checkboxes.component.js.es6 +54 -34
  11. data/app/assets/javascripts/decidim/forms/display_conditions.component.js.es6 +203 -0
  12. data/app/assets/javascripts/decidim/forms/forms.js.es6 +49 -1
  13. data/app/assets/javascripts/decidim/forms/max_choices_alert.component.js.es6 +44 -0
  14. data/app/assets/stylesheets/decidim/forms/forms.scss +39 -0
  15. data/app/assets/stylesheets/decidim/forms/questionnaire-answers-pdf.scss +69 -0
  16. data/app/cells/decidim/forms/matrix_readonly/show.erb +5 -0
  17. data/app/cells/decidim/forms/matrix_readonly_cell.rb +12 -0
  18. data/app/cells/decidim/forms/question_readonly/show.erb +5 -1
  19. data/app/cells/decidim/forms/question_readonly_cell.rb +5 -0
  20. data/app/cells/decidim/forms/step_navigation/show.erb +35 -0
  21. data/app/cells/decidim/forms/step_navigation_cell.rb +46 -0
  22. data/app/commands/decidim/forms/admin/update_questionnaire.rb +33 -1
  23. data/app/commands/decidim/forms/answer_questionnaire.rb +2 -1
  24. data/app/controllers/decidim/forms/admin/concerns/has_questionnaire.rb +52 -2
  25. data/app/controllers/decidim/forms/admin/concerns/has_questionnaire_answers.rb +97 -0
  26. data/app/controllers/decidim/forms/concerns/has_questionnaire.rb +11 -2
  27. data/app/forms/decidim/forms/admin/display_condition_form.rb +100 -0
  28. data/app/forms/decidim/forms/admin/question_form.rb +21 -1
  29. data/app/forms/decidim/forms/admin/question_matrix_row_form.rb +26 -0
  30. data/app/forms/decidim/forms/answer_choice_form.rb +1 -0
  31. data/app/forms/decidim/forms/answer_form.rb +31 -2
  32. data/app/forms/decidim/forms/questionnaire_form.rb +30 -3
  33. data/app/helpers/decidim/forms/admin/application_helper.rb +37 -0
  34. data/app/helpers/decidim/forms/admin/concerns/has_questionnaire_answers_pagination_helper.rb +49 -0
  35. data/app/helpers/decidim/forms/admin/concerns/has_questionnaire_answers_url_helper.rb +40 -0
  36. data/app/helpers/decidim/forms/admin/questionnaire_answers_helper.rb +27 -0
  37. data/app/jobs/decidim/forms/export_questionnaire_answers_job.rb +19 -0
  38. data/app/models/decidim/forms/answer.rb +0 -3
  39. data/app/models/decidim/forms/answer_choice.rb +7 -0
  40. data/app/models/decidim/forms/answer_option.rb +14 -0
  41. data/app/models/decidim/forms/display_condition.rb +65 -0
  42. data/app/models/decidim/forms/question.rb +52 -2
  43. data/app/models/decidim/forms/question_matrix_row.rb +15 -0
  44. data/app/models/decidim/forms/questionnaire.rb +11 -1
  45. data/app/presenters/decidim/forms/admin/questionnaire_answer_presenter.rb +43 -0
  46. data/app/presenters/decidim/forms/admin/questionnaire_participant_presenter.rb +60 -0
  47. data/app/presenters/decidim/forms/answer_option_presenter.rb +20 -0
  48. data/app/presenters/decidim/forms/question_presenter.rb +16 -0
  49. data/app/queries/decidim/forms/questionnaire_participant.rb +35 -0
  50. data/app/queries/decidim/forms/questionnaire_participants.rb +43 -0
  51. data/app/types/decidim/forms/answer_option_type.rb +14 -0
  52. data/app/types/decidim/forms/question_type.rb +23 -0
  53. data/app/types/decidim/forms/questionnaire_type.rb +22 -0
  54. data/app/views/decidim/forms/admin/questionnaires/_answer_option_template.html.erb +1 -1
  55. data/app/views/decidim/forms/admin/questionnaires/_display_condition.html.erb +88 -0
  56. data/app/views/decidim/forms/admin/questionnaires/_display_condition_template.html.erb +7 -0
  57. data/app/views/decidim/forms/admin/questionnaires/_form.html.erb +67 -8
  58. data/app/views/decidim/forms/admin/questionnaires/_matrix_row.html.erb +34 -0
  59. data/app/views/decidim/forms/admin/questionnaires/_matrix_row_template.html.erb +7 -0
  60. data/app/views/decidim/forms/admin/questionnaires/_question.html.erb +45 -6
  61. data/app/views/decidim/forms/admin/questionnaires/_separator.html.erb +41 -0
  62. data/app/views/decidim/forms/admin/questionnaires/answers/export/_answer.html.erb +31 -0
  63. data/app/views/decidim/forms/admin/questionnaires/answers/export/pdf.html.erb +13 -0
  64. data/app/views/decidim/forms/admin/questionnaires/answers/index.html.erb +53 -0
  65. data/app/views/decidim/forms/admin/questionnaires/answers/show.html.erb +48 -0
  66. data/app/views/decidim/forms/admin/questionnaires/edit.html.erb +9 -5
  67. data/app/views/decidim/forms/questionnaires/_answer.html.erb +28 -99
  68. data/app/views/decidim/forms/questionnaires/answers/_long_answer.html.erb +1 -0
  69. data/app/views/decidim/forms/questionnaires/answers/_matrix_multiple.html.erb +43 -0
  70. data/app/views/decidim/forms/questionnaires/answers/_matrix_single.html.erb +43 -0
  71. data/app/views/decidim/forms/questionnaires/answers/_multiple_option.html.erb +23 -0
  72. data/app/views/decidim/forms/questionnaires/answers/_separator.html.erb +1 -0
  73. data/app/views/decidim/forms/questionnaires/answers/_short_answer.html.erb +1 -0
  74. data/app/views/decidim/forms/questionnaires/answers/_single_option.html.erb +30 -0
  75. data/app/views/decidim/forms/questionnaires/answers/_sorting.html.erb +23 -0
  76. data/app/views/decidim/forms/questionnaires/show.html.erb +78 -26
  77. data/app/views/layouts/decidim/forms/admin/questionnaires/questionnaire_answers.html.erb +12 -0
  78. data/config/initializers/wicked_pdf.rb +25 -0
  79. data/config/locales/am-ET.yml +1 -0
  80. data/config/locales/ar.yml +7 -4
  81. data/config/locales/bg-BG.yml +14 -0
  82. data/config/locales/bg.yml +14 -0
  83. data/config/locales/ca.yml +89 -5
  84. data/config/locales/cs.yml +89 -5
  85. data/config/locales/da-DK.yml +1 -0
  86. data/config/locales/da.yml +1 -0
  87. data/config/locales/de.yml +92 -4
  88. data/config/locales/el.yml +118 -0
  89. data/config/locales/en.yml +89 -5
  90. data/config/locales/eo.yml +1 -0
  91. data/config/locales/es-MX.yml +88 -4
  92. data/config/locales/es-PY.yml +88 -4
  93. data/config/locales/es.yml +88 -4
  94. data/config/locales/et-EE.yml +1 -0
  95. data/config/locales/et.yml +1 -0
  96. data/config/locales/eu.yml +7 -4
  97. data/config/locales/fi-plain.yml +88 -4
  98. data/config/locales/fi.yml +88 -4
  99. data/config/locales/fr-CA.yml +172 -0
  100. data/config/locales/fr.yml +89 -5
  101. data/config/locales/ga-IE.yml +1 -0
  102. data/config/locales/gl.yml +7 -4
  103. data/config/locales/hr-HR.yml +1 -0
  104. data/config/locales/hr.yml +1 -0
  105. data/config/locales/hu.yml +11 -5
  106. data/config/locales/id-ID.yml +7 -4
  107. data/config/locales/is.yml +1 -0
  108. data/config/locales/it.yml +89 -5
  109. data/config/locales/ja-JP.yml +170 -0
  110. data/config/locales/ja.yml +170 -0
  111. data/config/locales/ko-KR.yml +1 -0
  112. data/config/locales/ko.yml +1 -0
  113. data/config/locales/lt-LT.yml +1 -0
  114. data/config/locales/lt.yml +1 -0
  115. data/config/locales/lv.yml +118 -0
  116. data/config/locales/mt-MT.yml +1 -0
  117. data/config/locales/mt.yml +1 -0
  118. data/config/locales/nl.yml +92 -8
  119. data/config/locales/no.yml +54 -5
  120. data/config/locales/om-ET.yml +1 -0
  121. data/config/locales/pl.yml +113 -26
  122. data/config/locales/pt-BR.yml +8 -5
  123. data/config/locales/pt.yml +111 -24
  124. data/config/locales/ro-RO.yml +167 -0
  125. data/config/locales/ru.yml +4 -2
  126. data/config/locales/sk-SK.yml +88 -0
  127. data/config/locales/sk.yml +90 -0
  128. data/config/locales/sl.yml +12 -0
  129. data/config/locales/so-SO.yml +1 -0
  130. data/config/locales/sr-CS.yml +1 -0
  131. data/config/locales/sv.yml +88 -7
  132. data/config/locales/ti-ER.yml +1 -0
  133. data/config/locales/tr-TR.yml +7 -4
  134. data/config/locales/vi-VN.yml +1 -0
  135. data/config/locales/vi.yml +1 -0
  136. data/config/locales/zh-CN.yml +172 -0
  137. data/config/locales/zh-TW.yml +1 -0
  138. data/db/migrate/20200130194123_create_decidim_forms_display_conditions.rb +20 -0
  139. data/db/migrate/20200225123810_create_decidim_forms_question_matrix_rows.rb +11 -0
  140. data/db/migrate/20200304152939_add_matrix_row_id_to_decidim_forms_answer_choices.rb +11 -0
  141. data/lib/decidim/api/questionnaire_entity_interface.rb +18 -0
  142. data/lib/decidim/exporters/form_pdf.rb +33 -0
  143. data/lib/decidim/exporters/form_pdf_controller_helper.rb +11 -0
  144. data/lib/decidim/forms.rb +6 -0
  145. data/lib/decidim/forms/admin_engine.rb +1 -1
  146. data/lib/decidim/forms/api.rb +7 -0
  147. data/lib/decidim/forms/test.rb +6 -0
  148. data/lib/decidim/forms/test/factories.rb +55 -0
  149. data/lib/decidim/forms/test/shared_examples/has_questionnaire.rb +918 -60
  150. data/lib/decidim/forms/test/shared_examples/manage_questionnaire_answers.rb +108 -0
  151. data/lib/decidim/forms/test/shared_examples/manage_questionnaires.rb +33 -575
  152. data/lib/decidim/forms/test/shared_examples/manage_questionnaires/add_display_conditions.rb +179 -0
  153. data/lib/decidim/forms/test/shared_examples/manage_questionnaires/add_questions.rb +463 -0
  154. data/lib/decidim/forms/test/shared_examples/manage_questionnaires/update_display_conditions.rb +93 -0
  155. data/lib/decidim/forms/test/shared_examples/manage_questionnaires/update_questions.rb +461 -0
  156. data/lib/decidim/forms/user_answers_serializer.rb +21 -4
  157. data/lib/decidim/forms/version.rb +1 -1
  158. metadata +133 -10
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Forms
5
+ # A class used to collect user answers for a questionnaire
6
+ class QuestionnaireParticipants < Rectify::Query
7
+ # Syntactic sugar to initialize the class and return the queried objects.
8
+ #
9
+ # questionnaire - a Questionnaire object
10
+ def self.for(questionnaire)
11
+ new(questionnaire).query
12
+ end
13
+
14
+ # Initializes the class.
15
+ #
16
+ # questionnaire = a Questionnaire object
17
+ def initialize(questionnaire)
18
+ @questionnaire = questionnaire
19
+ end
20
+
21
+ # Finds all Answers for the questionnaire (unique session_tokens).
22
+ # Because exporters only have access to the Answers this
23
+ # is used as an indirect way to access the participants
24
+ # (see #participants and #participant)
25
+ def query
26
+ Answer.where(questionnaire: @questionnaire)
27
+ end
28
+
29
+ def participant(session_token)
30
+ query.find_by(session_token: session_token)
31
+ end
32
+
33
+ def participants
34
+ subquery = query.select("DISTINCT ON (decidim_forms_answers.session_token) decidim_forms_answers.*")
35
+ Answer.select("*").from(subquery).order(:created_at)
36
+ end
37
+
38
+ def count_participants
39
+ query.select(:session_token).distinct.count
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Forms
5
+ AnswerOptionType = GraphQL::ObjectType.define do
6
+ name "AnswerOption"
7
+ description "An answer option for a multi-choice question in a questionnaire"
8
+
9
+ field :id, !types.ID, "ID of this answer option"
10
+ field :body, !Decidim::Core::TranslatedFieldType, "The text answer response option."
11
+ field :freeText, !types.Boolean, "Whether if this answer accepts any free text from the user.", property: :free_text
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Forms
5
+ QuestionType = GraphQL::ObjectType.define do
6
+ name "Question"
7
+ description "A question in a questionnaire"
8
+
9
+ interfaces [
10
+ -> { Decidim::Core::TimestampsInterface }
11
+ ]
12
+
13
+ field :id, !types.ID, "ID of this question"
14
+ field :body, !Decidim::Core::TranslatedFieldType, "What is being asked in this question."
15
+ field :description, Decidim::Core::TranslatedFieldType, "The description of this question."
16
+ field :mandatory, !types.Boolean, "Whether if this question is mandatory."
17
+ field :position, types.Int, "Order position of the question in the questionnaire"
18
+ field :maxChoices, types.Int, "On questions with answer options, maximum number of choices the user has", property: :max_choices
19
+ field :questionType, types.String, "Type of question.", property: :question_type
20
+ field :answerOptions, !types[AnswerOptionType], "List of answer options in multi-choice questions.", property: :answer_options
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Forms
5
+ QuestionnaireType = GraphQL::ObjectType.define do
6
+ name "Questionnaire"
7
+ description "A questionnaire"
8
+
9
+ interfaces [
10
+ -> { Decidim::Core::TimestampsInterface }
11
+ ]
12
+
13
+ field :id, !types.ID, "ID of this questionnaire"
14
+ field :title, !Decidim::Core::TranslatedFieldType, "The title of this questionnaire."
15
+ field :description, Decidim::Core::TranslatedFieldType, "The description of this questionnaire."
16
+ field :tos, Decidim::Core::TranslatedFieldType, "The Terms of Service for this questionnaire."
17
+ field :forType, types.String, "Type of entity using this questionnaire.", property: :questionnaire_for_type
18
+ field :forEntity, QuestionnaireEntityInterface, "Entity using this questionnaire.", property: :questionnaire_for
19
+ field :questions, !types[QuestionType], "Questions in this questionnaire."
20
+ end
21
+ end
22
+ end
@@ -1,6 +1,6 @@
1
1
  <% question = form.object %>
2
2
 
3
- <script type="text/template" class="decidim-template" id="<%= template_id %>">
3
+ <script type="text/template" class="decidim-answer-option-template decidim-template" id="<%= template_id %>">
4
4
  <%= fields_for "questionnaire[questions][#{question.to_param}][answer_options][]", blank_answer_option do |answer_option_form| %>
5
5
  <%= render "decidim/forms/admin/questionnaires/answer_option", form: answer_option_form, question: question, editable: editable %>
6
6
  <% end %>
@@ -0,0 +1,88 @@
1
+ <% display_condition = form.object %>
2
+
3
+ <div class="card questionnaire-question-display-condition">
4
+ <div class="card-divider">
5
+ <h2 class="card-title">
6
+ <span><%= t(".display_condition") %></span>
7
+ <% if editable %>
8
+ <button class="button small alert hollow remove-display-condition button--title">
9
+ <%= t(".remove") %>
10
+ </button>
11
+ <% end %>
12
+ </h2>
13
+ </div>
14
+ <div class="card-section">
15
+ <div class="row column">
16
+ <small class="text-muted">
17
+ <%= t(".save_warning") %>
18
+ </small>
19
+ </div>
20
+ </div>
21
+ <div class="card-section">
22
+ <div class="row column questionnaire-question-display-condition-condition-question">
23
+ <%=
24
+ form.select(
25
+ :decidim_condition_question_id,
26
+ options_for_select(display_condition.questions_for_select(questionnaire, question.id), selected: display_condition.decidim_condition_question_id),
27
+ { prompt: t(".select_condition_question"), label: t(".condition_question") },
28
+ disabled: !editable,
29
+ data: { url: answer_options_url(id: question.id) }
30
+ )
31
+ %>
32
+ </div>
33
+ <div class="row column">
34
+ <%=
35
+ form.select(
36
+ :condition_type,
37
+ options_from_collection_for_select(display_condition_types, :first, :last, display_condition.condition_type),
38
+ { prompt: t(".select_condition_type"), label: t(".condition_type") },
39
+ disabled: !editable,
40
+ )
41
+ %>
42
+ </div>
43
+ <div class="row column questionnaire-question-display-condition-answer-option">
44
+ <%=
45
+ form.select(
46
+ :decidim_answer_option_id,
47
+ options_from_collection_for_select(display_condition.answer_options, :id, :translated_body, display_condition.answer_option),
48
+ { prompt: t(".select_answer_option"), label: t(".answer_option") },
49
+ disabled: !editable,
50
+ data: { selected: display_condition.answer_option&.id }
51
+ )
52
+ %>
53
+ </div>
54
+ <div class="row column questionnaire-question-display-condition-value">
55
+ <%=
56
+ form.translated(
57
+ :text_field,
58
+ :condition_value,
59
+ tabs_id: tabs_id_for_question_display_condition(question, display_condition),
60
+ label: t(".condition_value"),
61
+ disabled: !editable
62
+ )
63
+ %>
64
+ </div>
65
+ <div class="row column">
66
+ <%=
67
+ form.check_box(
68
+ :mandatory,
69
+ label: t(".mandatory"),
70
+ disabled: !questionnaire.questions_editable?
71
+ )
72
+ %>
73
+ </div>
74
+ <div class="row column">
75
+ <% display_condition.errors.full_messages.each do |msg| %>
76
+ <small class="form-error is-visible"><%= msg %></small>
77
+ <% end %>
78
+ </div>
79
+ </div>
80
+
81
+ <%= form.hidden_field :decidim_question_id, value: question.id, disabled: !editable %>
82
+
83
+ <% if display_condition.persisted? %>
84
+ <%= form.hidden_field :id, disabled: !editable %>
85
+ <% end %>
86
+
87
+ <%= form.hidden_field :deleted, disabled: !editable %>
88
+ </div>
@@ -0,0 +1,7 @@
1
+ <% question = form.object %>
2
+
3
+ <script type="text/template" class="decidim-template" id="<%= template_id %>">
4
+ <%= fields_for "questionnaire[questions][#{question.to_param}][display_conditions][]", blank_display_condition do |display_condition_form| %>
5
+ <%= render "decidim/forms/admin/questionnaires/display_condition", form: display_condition_form, question: question, editable: editable %>
6
+ <% end %>
7
+ </script>
@@ -1,10 +1,26 @@
1
1
  <div class="card">
2
2
  <div class="card-divider">
3
3
  <h2 class="card-title">
4
- <%= title %>
5
- <div class="button--title">
6
- <%= export_dropdown if allowed_to? :export_answers, :questionnaire %>
7
- </div>
4
+ <%= t(".title") %>
5
+ <% unless template? questionnaire.questionnaire_for %>
6
+ <% if allowed_to? :preview, :questionnaire %>
7
+ <div class="button--title">
8
+ <%= link_to t(".preview"), public_url, class: "button tiny button--simple", target: :_blank %>
9
+ </div>
10
+ <% end %>
11
+ <% if questionnaire.answers.any? %>
12
+ <div class="button--title">
13
+ <%= export_dropdown if allowed_to? :export_answers, :questionnaire %>
14
+ </div>
15
+ <div class="button--title">
16
+ <% if allowed_to? :show, :questionnaire_answers %>
17
+ <%= link_to t("actions.show", scope: "decidim.forms.admin.questionnaires"), questionnaire_participants_url, class: "button tiny button--title new" %>
18
+ <% end %>
19
+ </div>
20
+ <% else %>
21
+ <button class="button tiny button--title" disabled><%= t("empty", scope: "decidim.forms.admin.questionnaires.answers") %></a>
22
+ <% end %>
23
+ <% end %>
8
24
  </h2>
9
25
  </div>
10
26
  <div class="card-section">
@@ -21,12 +37,37 @@
21
37
  </div>
22
38
 
23
39
  <div class="questionnaire-questions">
40
+ <div class="row column text-center">
41
+ <button type="button" class="button collapse-all"><%= t(".collapse") %></button>
42
+ <button type="button" class="button expand-all"><%= t(".expand") %></button>
43
+ </div>
44
+
24
45
  <% if questionnaire.questions_editable? %>
46
+ <% if questionnaire.answers.any? && !questionnaire.published? %>
47
+ <div class="callout warning">
48
+ <%= t(".unpublished_warning") %>
49
+ </div>
50
+ <% end %>
51
+
25
52
  <%= fields_for "questionnaire[questions][#{blank_question.to_param}]", blank_question do |question_form| %>
26
- <script type="text/template" class="decidim-template">
27
- <%= render "decidim/forms/admin/questionnaires/question", form: question_form, id: tabs_id_for_question(blank_question), editable: questionnaire.questions_editable?, child_template_selector: "#answer-option-template-dummy" %>
53
+ <script type="text/template" class="decidim-question-template decidim-template" id="question-template">
54
+ <%= render "decidim/forms/admin/questionnaires/question",
55
+ form: question_form,
56
+ id: tabs_id_for_question(blank_question),
57
+ editable: questionnaire.questions_editable?,
58
+ answer_option_template_selector: "#answer-option-template-dummy",
59
+ display_condition_template_selector: "#display-condition-template-dummy",
60
+ matrix_row_template_selector: "#matrix-row-template-dummy" %>
61
+ </script>
62
+ <script type="text/template" class="decidim-separator-template decidim-template" id="separator-template">
63
+ <%= render "decidim/forms/admin/questionnaires/separator",
64
+ form: question_form,
65
+ id: tabs_id_for_question(blank_question),
66
+ editable: questionnaire.questions_editable? %>
28
67
  </script>
29
68
  <%= render "decidim/forms/admin/questionnaires/answer_option_template", form: question_form, editable: questionnaire.questions_editable?, template_id: "answer-option-template-dummy" %>
69
+ <%= render "decidim/forms/admin/questionnaires/display_condition_template", form: question_form, editable: questionnaire.questions_editable?, template_id: "display-condition-template-dummy" %>
70
+ <%= render "decidim/forms/admin/questionnaires/matrix_row_template", form: question_form, editable: questionnaire.questions_editable?, template_id: "matrix-row-template-dummy" %>
30
71
  <% end %>
31
72
  <% else %>
32
73
  <div class="callout warning">
@@ -37,17 +78,35 @@
37
78
  <div class="questionnaire-questions-list">
38
79
  <% @form.questions.each_with_index do |question, index| %>
39
80
  <%= fields_for "questionnaire[questions][]", question do |question_form| %>
40
- <%= render "decidim/forms/admin/questionnaires/question", form: question_form, id: tabs_id_for_question(question), editable: questionnaire.questions_editable?, child_template_selector: "#answer-option-template-#{index}" %>
41
- <%= render "decidim/forms/admin/questionnaires/answer_option_template", form: question_form, editable: questionnaire.questions_editable?, template_id: "answer-option-template-#{index}" %>
81
+ <% if question.separator? %>
82
+ <%= render "decidim/forms/admin/questionnaires/separator",
83
+ form: question_form,
84
+ id: tabs_id_for_question(question),
85
+ editable: questionnaire.questions_editable? %>
86
+ <% else %>
87
+ <%= render "decidim/forms/admin/questionnaires/question",
88
+ form: question_form,
89
+ id: tabs_id_for_question(question),
90
+ editable: questionnaire.questions_editable?,
91
+ display_condition_template_selector: "#display-condition-template-#{index}",
92
+ answer_option_template_selector: "#answer-option-template-#{index}",
93
+ matrix_row_template_selector: "#matrix-row-template-#{index}" %>
94
+ <%= render "decidim/forms/admin/questionnaires/display_condition_template", form: question_form, editable: questionnaire.questions_editable?, template_id: "display-condition-template-#{index}" %>
95
+ <%= render "decidim/forms/admin/questionnaires/answer_option_template", form: question_form, editable: questionnaire.questions_editable?, template_id: "answer-option-template-#{index}" %>
96
+ <%= render "decidim/forms/admin/questionnaires/matrix_row_template", form: question_form, editable: questionnaire.questions_editable?, template_id: "matrix-row-template-#{index}" %>
97
+ <% end %>
42
98
  <% end %>
43
99
  <% end %>
44
100
  </div>
45
101
 
46
102
  <% if questionnaire.questions_editable? %>
47
103
  <button class="button add-question"><%= t(".add_question") %></button>
104
+ <button class="button add-separator"><%= t(".add_separator") %></button>
48
105
  <% end %>
49
106
  </div>
50
107
 
51
108
  <% if questionnaire.questions_editable? %>
52
109
  <%= javascript_include_tag "decidim/forms/admin/forms" %>
53
110
  <% end %>
111
+
112
+ <%= javascript_include_tag "decidim/forms/admin/collapsible_questions" %>
@@ -0,0 +1,34 @@
1
+ <% matrix_row = form.object %>
2
+
3
+ <div class="card questionnaire-question-matrix-row">
4
+ <div class="card-divider">
5
+ <h2 class="card-title">
6
+ <span><%= t(".matrix_row") %></span>
7
+ <% if editable %>
8
+ <button class="button small alert hollow remove-matrix-row button--title">
9
+ <%= t(".remove") %>
10
+ </button>
11
+ <% end %>
12
+ </h2>
13
+ </div>
14
+
15
+ <div class="card-section">
16
+ <div class="row column">
17
+ <%=
18
+ form.translated(
19
+ :text_field,
20
+ :body,
21
+ tabs_id: tabs_id_for_question_matrix_row(question, matrix_row),
22
+ label: t(".statement"),
23
+ disabled: !editable
24
+ )
25
+ %>
26
+ </div>
27
+ </div>
28
+
29
+ <% if matrix_row.persisted? %>
30
+ <%= form.hidden_field :id, disabled: !editable %>
31
+ <% end %>
32
+
33
+ <%= form.hidden_field :deleted, disabled: !editable %>
34
+ </div>
@@ -0,0 +1,7 @@
1
+ <% question = form.object %>
2
+
3
+ <script type="text/template" class="decidim-matrix-row-template decidim-template" id="<%= template_id %>">
4
+ <%= fields_for "questionnaire[questions][#{question.to_param}][matrix_rows][]", blank_matrix_row do |matrix_row_form| %>
5
+ <%= render "decidim/forms/admin/questionnaires/matrix_row", form: matrix_row_form, question: question, editable: editable %>
6
+ <% end %>
7
+ </script>
@@ -1,16 +1,26 @@
1
1
  <% question = form.object %>
2
+ <% is_expanded = question.errors.any? %>
2
3
 
3
4
  <div class="card questionnaire-question" id="<%= id %>-field">
4
5
  <div class="card-divider question-divider">
5
6
  <h2 class="card-title">
6
7
  <span>
7
8
  <% if editable %>
8
- <%== "#{icon("move")} #{t(".question")}" %>
9
- <% else %>
10
- <%= t(".question") %>
9
+ <%== icon("move") %>
11
10
  <% end %>
11
+ <%= dynamic_title(translated_attribute(question.body), class: "question-title-statement", max_length: 50, omission: "...", placeholder: t(".question")) %>
12
12
  </span>
13
13
 
14
+ <button type="button" class="button small secondary button--title question--collapse" data-toggle="<%= id %>-question-card button--collapse-question-<%= id %> button--expand-question-<%= id %>">
15
+ <span id="button--collapse-question-<%= id %>" data-toggler=".hide" class="icon-collapse <%= "hide" unless is_expanded %>">
16
+ <%== icon("caret-top", aria_label: t(".collapse"), role: "img") %>
17
+ </span>
18
+
19
+ <span id="button--expand-question-<%= id %>" data-toggler=".hide" class="icon-expand <%= "hide" if is_expanded %>">
20
+ <%== icon("caret-bottom", aria_label: t(".expand"), role: "img") %>
21
+ </span>
22
+ </button>
23
+
14
24
  <% if editable %>
15
25
  <button class="button small alert hollow move-up-question button--title">
16
26
  <%== "#{icon("arrow-top")} #{t(".up")}" %>
@@ -27,7 +37,7 @@
27
37
  </h2>
28
38
  </div>
29
39
 
30
- <div class="card-section">
40
+ <div class="card-section collapsible <%= "hide" unless is_expanded %>" data-toggler=".hide" id="<%= id %>-question-card">
31
41
  <div class="row column">
32
42
  <%=
33
43
  form.translated(
@@ -81,7 +91,21 @@
81
91
  <%= form.hidden_field :position, value: question.position || 0, disabled: !editable %>
82
92
  <%= form.hidden_field :deleted, disabled: !editable %>
83
93
 
84
- <div class="questionnaire-question-answer-options" data-template="<%= child_template_selector %>">
94
+ <div class="questionnaire-question-matrix-rows" data-template="<%= matrix_row_template_selector %>">
95
+ <div class="questionnaire-question-matrix-rows-list">
96
+ <% question.matrix_rows.each do |matrix_row| %>
97
+ <%= fields_for "questionnaire[questions][#{question.to_param}][matrix_rows][]", matrix_row do |matrix_row_form| %>
98
+ <%= render "decidim/forms/admin/questionnaires/matrix_row", form: matrix_row_form, question: question, editable: editable %>
99
+ <% end %>
100
+ <% end %>
101
+ </div>
102
+
103
+ <% if editable %>
104
+ <button class="button add-matrix-row"><%= t(".add_matrix_row") %></button>
105
+ <% end %>
106
+ </div>
107
+
108
+ <div class="questionnaire-question-answer-options" data-template="<%= answer_option_template_selector %>">
85
109
  <div class="questionnaire-question-answer-options-list">
86
110
  <% question.answer_options.each do |answer_option| %>
87
111
  <%= fields_for "questionnaire[questions][#{question.to_param}][answer_options][]", answer_option do |answer_option_form| %>
@@ -100,10 +124,25 @@
100
124
  form.select(
101
125
  :max_choices,
102
126
  (2..question.number_of_options),
103
- { prompt: t(".any") },
127
+ { include_blank: t(".any") },
104
128
  disabled: !editable
105
129
  )
106
130
  %>
107
131
  </div>
132
+
133
+ <div class="questionnaire-question-display-conditions" data-template="<%= display_condition_template_selector %>">
134
+ <div class="questionnaire-question-display-conditions-list">
135
+ <% question.display_conditions.each do |display_condition| %>
136
+ <%= fields_for "questionnaire[questions][#{question.to_param}][display_conditions][]", display_condition do |display_condition_form| %>
137
+ <%= render "decidim/forms/admin/questionnaires/display_condition", form: display_condition_form, question: question, editable: editable %>
138
+ <% end %>
139
+ <% end %>
140
+ </div>
141
+
142
+ <% if editable %>
143
+ <% disabled = !question.persisted? %>
144
+ <button <%= "disabled" if disabled %> title="<%= disabled ? t(".add_display_condition_info") : t(".add_display_condition_info") %>" class="button add-display-condition"><%= t(".add_display_condition") %></button>
145
+ <% end %>
146
+ </div>
108
147
  </div>
109
148
  </div>