decidim-forms 0.30.2 → 0.31.0.rc1

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.
Files changed (158) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +10 -10
  3. data/app/cells/decidim/forms/matrix_readonly/show.erb +1 -1
  4. data/app/cells/decidim/forms/matrix_readonly_cell.rb +3 -3
  5. data/app/cells/decidim/forms/question_readonly/show.erb +5 -5
  6. data/app/cells/decidim/forms/question_readonly/title_and_description.erb +3 -3
  7. data/app/cells/decidim/forms/response_readonly_cell.rb +9 -0
  8. data/app/cells/decidim/forms/step_navigation/show.erb +3 -3
  9. data/app/cells/decidim/forms/step_navigation_cell.rb +3 -3
  10. data/app/commands/decidim/forms/admin/update_questions.rb +6 -6
  11. data/app/commands/decidim/forms/{answer_questionnaire.rb → response_questionnaire.rb} +35 -35
  12. data/app/controllers/decidim/forms/admin/concerns/has_questionnaire.rb +12 -12
  13. data/app/controllers/decidim/forms/admin/concerns/{has_questionnaire_answers.rb → has_questionnaire_responses.rb} +23 -19
  14. data/app/controllers/decidim/forms/concerns/has_questionnaire.rb +38 -33
  15. data/app/forms/decidim/forms/admin/display_condition_form.rb +14 -14
  16. data/app/forms/decidim/forms/admin/question_form.rb +3 -3
  17. data/app/forms/decidim/forms/admin/{answer_option_form.rb → response_option_form.rb} +3 -3
  18. data/app/forms/decidim/forms/questionnaire_form.rb +8 -9
  19. data/app/forms/decidim/forms/{answer_choice_form.rb → response_choice_form.rb} +5 -5
  20. data/app/forms/decidim/forms/{answer_form.rb → response_form.rb} +9 -9
  21. data/app/helpers/decidim/forms/admin/application_helper.rb +2 -2
  22. data/app/helpers/decidim/forms/admin/concerns/{has_questionnaire_answers_pagination_helper.rb → has_questionnaire_responses_pagination_helper.rb} +4 -4
  23. data/app/helpers/decidim/forms/admin/concerns/{has_questionnaire_answers_url_helper.rb → has_questionnaire_responses_url_helper.rb} +5 -5
  24. data/app/helpers/decidim/forms/admin/questionnaire_responses_helper.rb +32 -0
  25. data/app/helpers/decidim/forms/application_helper.rb +1 -2
  26. data/app/jobs/decidim/forms/{export_questionnaire_answers_job.rb → export_questionnaire_responses_job.rb} +5 -5
  27. data/app/models/decidim/forms/display_condition.rb +20 -20
  28. data/app/models/decidim/forms/question.rb +14 -13
  29. data/app/models/decidim/forms/question_matrix_row.rb +1 -1
  30. data/app/models/decidim/forms/questionnaire.rb +11 -6
  31. data/app/models/decidim/forms/{answer.rb → response.rb} +9 -9
  32. data/app/models/decidim/forms/response_choice.rb +22 -0
  33. data/app/models/decidim/forms/{answer_option.rb → response_option.rb} +5 -5
  34. data/app/packs/entrypoints/decidim_forms_admin.js +3 -3
  35. data/app/packs/src/decidim/forms/admin/collapsible_questions.js +12 -10
  36. data/app/packs/src/decidim/forms/admin/forms.js +35 -35
  37. data/app/packs/src/decidim/forms/admin/{publish_answers_buttons.js → publish_responses_buttons.js} +12 -12
  38. data/app/packs/src/decidim/forms/display_conditions.component.js +12 -12
  39. data/app/packs/src/decidim/forms/forms.js +4 -4
  40. data/app/packs/stylesheets/decidim/forms/forms.scss +2 -2
  41. data/app/presenters/decidim/forms/admin/questionnaire_participant_presenter.rb +13 -13
  42. data/app/presenters/decidim/forms/admin/{questionnaire_answer_presenter.rb → questionnaire_response_presenter.rb} +15 -15
  43. data/app/presenters/decidim/forms/admin_log/question_presenter.rb +3 -3
  44. data/app/presenters/decidim/forms/{answer_option_presenter.rb → response_option_presenter.rb} +2 -2
  45. data/app/queries/decidim/forms/questionnaire_participant.rb +5 -5
  46. data/app/queries/decidim/forms/questionnaire_participants.rb +6 -6
  47. data/app/queries/decidim/forms/questionnaire_user_responses.rb +32 -0
  48. data/app/views/decidim/forms/admin/questionnaires/_display_condition.html.erb +9 -9
  49. data/app/views/decidim/forms/admin/questionnaires/_form.html.erb +2 -2
  50. data/app/views/decidim/forms/admin/questionnaires/_matrix_row.html.erb +3 -3
  51. data/app/views/decidim/forms/admin/questionnaires/_question.html.erb +16 -16
  52. data/app/views/decidim/forms/admin/questionnaires/_questions_form.html.erb +11 -10
  53. data/app/views/decidim/forms/admin/questionnaires/{_answer_option.html.erb → _response_option.html.erb} +7 -7
  54. data/app/views/decidim/forms/admin/questionnaires/_response_option_template.html.erb +7 -0
  55. data/app/views/decidim/forms/admin/questionnaires/_separator.html.erb +10 -7
  56. data/app/views/decidim/forms/admin/questionnaires/_title_and_description.html.erb +7 -7
  57. data/app/views/decidim/forms/admin/questionnaires/edit.html.erb +1 -1
  58. data/app/views/decidim/forms/admin/questionnaires/edit_questions.html.erb +8 -8
  59. data/app/views/decidim/forms/admin/questionnaires/responses/index.html.erb +80 -0
  60. data/app/views/decidim/forms/admin/questionnaires/responses/show.html.erb +43 -0
  61. data/app/views/decidim/forms/questionnaires/_questionnaire.html.erb +22 -26
  62. data/app/views/decidim/forms/questionnaires/_questionnaire_readonly.html.erb +8 -3
  63. data/app/views/decidim/forms/questionnaires/_response.html.erb +61 -0
  64. data/app/views/decidim/forms/questionnaires/edit.html.erb +2 -2
  65. data/app/views/decidim/forms/questionnaires/responses/_files.html.erb +1 -0
  66. data/app/views/decidim/forms/questionnaires/responses/_long_response.html.erb +3 -0
  67. data/app/views/decidim/forms/questionnaires/{answers → responses}/_matrix_multiple.html.erb +16 -15
  68. data/app/views/decidim/forms/questionnaires/{answers → responses}/_matrix_single.html.erb +17 -16
  69. data/app/views/decidim/forms/questionnaires/responses/_multiple_option.html.erb +26 -0
  70. data/app/views/decidim/forms/questionnaires/responses/_separator.html.erb +1 -0
  71. data/app/views/decidim/forms/questionnaires/responses/_short_response.html.erb +3 -0
  72. data/app/views/decidim/forms/questionnaires/responses/_single_option.html.erb +33 -0
  73. data/app/views/decidim/forms/questionnaires/responses/_sorting.html.erb +26 -0
  74. data/app/views/decidim/forms/questionnaires/responses/_title_and_description.html.erb +1 -0
  75. data/app/views/decidim/forms/questionnaires/show.html.erb +10 -10
  76. data/config/assets.rb +2 -2
  77. data/config/locales/ar.yml +0 -22
  78. data/config/locales/bg.yml +3 -36
  79. data/config/locales/ca-IT.yml +73 -73
  80. data/config/locales/ca.yml +73 -73
  81. data/config/locales/cs.yml +72 -75
  82. data/config/locales/de.yml +72 -72
  83. data/config/locales/el.yml +3 -36
  84. data/config/locales/en.yml +83 -83
  85. data/config/locales/es-MX.yml +75 -75
  86. data/config/locales/es-PY.yml +75 -75
  87. data/config/locales/es.yml +73 -73
  88. data/config/locales/eu.yml +71 -71
  89. data/config/locales/fi-plain.yml +71 -71
  90. data/config/locales/fi.yml +69 -69
  91. data/config/locales/fr-CA.yml +70 -67
  92. data/config/locales/fr.yml +70 -67
  93. data/config/locales/ga-IE.yml +0 -7
  94. data/config/locales/gl.yml +0 -22
  95. data/config/locales/hu.yml +0 -22
  96. data/config/locales/id-ID.yml +0 -22
  97. data/config/locales/it.yml +3 -40
  98. data/config/locales/ja.yml +80 -80
  99. data/config/locales/lb.yml +3 -36
  100. data/config/locales/lt.yml +3 -36
  101. data/config/locales/lv.yml +0 -22
  102. data/config/locales/nl.yml +3 -36
  103. data/config/locales/no.yml +3 -36
  104. data/config/locales/pl.yml +3 -36
  105. data/config/locales/pt-BR.yml +3 -36
  106. data/config/locales/pt.yml +3 -36
  107. data/config/locales/ro-RO.yml +22 -51
  108. data/config/locales/ru.yml +0 -9
  109. data/config/locales/sk.yml +0 -22
  110. data/config/locales/sl.yml +0 -5
  111. data/config/locales/sv.yml +82 -54
  112. data/config/locales/tr-TR.yml +3 -36
  113. data/config/locales/zh-CN.yml +3 -36
  114. data/config/locales/zh-TW.yml +3 -36
  115. data/db/migrate/20190315203056_add_session_token_to_decidim_forms_answers.rb +1 -1
  116. data/db/migrate/20250314150250_rename_answer_to_response_in_decidim_forms.rb +30 -0
  117. data/db/migrate/20250319130003_change_question_types_in_questions.rb +14 -0
  118. data/lib/decidim/api/question_matrix_row_type.rb +13 -0
  119. data/lib/decidim/api/question_type.rb +4 -3
  120. data/lib/decidim/api/questionnaire_type.rb +1 -0
  121. data/lib/decidim/api/response_option_type.rb +13 -0
  122. data/lib/decidim/exporters/form_pdf.rb +33 -33
  123. data/lib/decidim/forms/api.rb +2 -1
  124. data/lib/decidim/forms/{download_your_data_user_answers_serializer.rb → download_your_data_user_responses_serializer.rb} +3 -3
  125. data/lib/decidim/forms/engine.rb +2 -2
  126. data/lib/decidim/forms/test/factories.rb +24 -24
  127. data/lib/decidim/forms/test/shared_examples/has_questionnaire.rb +176 -176
  128. data/lib/decidim/forms/test/shared_examples/manage_questionnaire_responses.rb +159 -0
  129. data/lib/decidim/forms/test/shared_examples/manage_questionnaires/add_display_conditions.rb +19 -19
  130. data/lib/decidim/forms/test/shared_examples/manage_questionnaires/add_questions.rb +44 -44
  131. data/lib/decidim/forms/test/shared_examples/manage_questionnaires/update_display_conditions.rb +10 -10
  132. data/lib/decidim/forms/test/shared_examples/manage_questionnaires/update_questions.rb +18 -18
  133. data/lib/decidim/forms/test/shared_examples/manage_questionnaires.rb +4 -4
  134. data/lib/decidim/forms/test.rb +1 -1
  135. data/lib/decidim/forms/user_responses_serializer.rb +110 -0
  136. data/lib/decidim/forms/version.rb +1 -1
  137. data/lib/decidim/forms.rb +2 -2
  138. metadata +48 -45
  139. data/app/cells/decidim/forms/answer_readonly_cell.rb +0 -9
  140. data/app/helpers/decidim/forms/admin/questionnaire_answers_helper.rb +0 -30
  141. data/app/models/decidim/forms/answer_choice.rb +0 -22
  142. data/app/queries/decidim/forms/questionnaire_user_answers.rb +0 -32
  143. data/app/views/decidim/forms/admin/questionnaires/_answer_option_template.html.erb +0 -7
  144. data/app/views/decidim/forms/admin/questionnaires/answers/index.html.erb +0 -49
  145. data/app/views/decidim/forms/admin/questionnaires/answers/show.html.erb +0 -43
  146. data/app/views/decidim/forms/questionnaires/_answer.html.erb +0 -61
  147. data/app/views/decidim/forms/questionnaires/answers/_files.html.erb +0 -1
  148. data/app/views/decidim/forms/questionnaires/answers/_long_answer.html.erb +0 -3
  149. data/app/views/decidim/forms/questionnaires/answers/_multiple_option.html.erb +0 -25
  150. data/app/views/decidim/forms/questionnaires/answers/_separator.html.erb +0 -1
  151. data/app/views/decidim/forms/questionnaires/answers/_short_answer.html.erb +0 -3
  152. data/app/views/decidim/forms/questionnaires/answers/_single_option.html.erb +0 -32
  153. data/app/views/decidim/forms/questionnaires/answers/_sorting.html.erb +0 -26
  154. data/app/views/decidim/forms/questionnaires/answers/_title_and_description.html.erb +0 -1
  155. data/lib/decidim/api/answer_option_type.rb +0 -13
  156. data/lib/decidim/forms/test/shared_examples/manage_questionnaire_answers.rb +0 -149
  157. data/lib/decidim/forms/user_answers_serializer.rb +0 -105
  158. /data/app/cells/decidim/forms/{answer_readonly → response_readonly}/show.erb +0 -0
@@ -16,7 +16,7 @@ shared_examples_for "update questions" do
16
16
  fill_in "questions_questions_#{question.id}_body_en", with: "Modified question"
17
17
  fill_in "questions_questions_#{question.id}_max_characters", with: 30
18
18
  check "Mandatory"
19
- select "Long answer", from: "Type"
19
+ select "Long response", from: "Type"
20
20
  end
21
21
 
22
22
  click_on "Save"
@@ -29,7 +29,7 @@ shared_examples_for "update questions" do
29
29
  expect(page).to have_no_css("input[value='This is the first question']")
30
30
  expect(page).to have_css("input#questions_questions_#{question.id}_mandatory[checked]")
31
31
  expect(page).to have_css("input#questions_questions_#{question.id}_max_characters[value='30']")
32
- expect(page).to have_css("select#questions_questions_#{question.id}_question_type option[value='long_answer'][selected]")
32
+ expect(page).to have_css("select#questions_questions_#{question.id}_question_type option[value='long_response'][selected]")
33
33
  end
34
34
 
35
35
  it "re-renders the form when the information is invalid and displays errors" do
@@ -85,7 +85,7 @@ shared_examples_for "update questions" do
85
85
 
86
86
  expect(page).to have_admin_callout("successfully")
87
87
 
88
- click_on "Manage questions"
88
+ click_on "Questions"
89
89
 
90
90
  expect(page).to have_css(".questionnaire-question", count: 0)
91
91
  end
@@ -169,7 +169,7 @@ shared_examples_for "update questions" do
169
169
 
170
170
  expect(page).to have_admin_callout("successfully")
171
171
 
172
- click_on "Manage questions"
172
+ click_on "Questions"
173
173
 
174
174
  expect(page).to have_css(".questionnaire-question", count: 0)
175
175
  end
@@ -187,7 +187,7 @@ shared_examples_for "update questions" do
187
187
  end
188
188
  end
189
189
 
190
- context "when a questionnaire has an existing question with answer options" do
190
+ context "when a questionnaire has an existing question with response options" do
191
191
  let!(:question) do
192
192
  create(
193
193
  :questionnaire_question,
@@ -205,13 +205,13 @@ shared_examples_for "update questions" do
205
205
 
206
206
  before do
207
207
  click_on "Save"
208
- click_on "Manage questions"
208
+ click_on "Questions"
209
209
  end
210
210
 
211
- it "allows deleting answer options" do
211
+ it "allows deleting response options" do
212
212
  expand_all_questions
213
213
 
214
- within ".questionnaire-question-answer-option:last-of-type" do
214
+ within ".questionnaire-question-response-option:last-of-type" do
215
215
  click_on "Remove"
216
216
  end
217
217
 
@@ -219,7 +219,7 @@ shared_examples_for "update questions" do
219
219
 
220
220
  visit_manage_questions_and_expand_all
221
221
 
222
- expect(page).to have_css(".questionnaire-question-answer-option", count: 2)
222
+ expect(page).to have_css(".questionnaire-question-response-option", count: 2)
223
223
  end
224
224
 
225
225
  it "still removes the question even if previous editions rendered the options invalid" do
@@ -227,7 +227,7 @@ shared_examples_for "update questions" do
227
227
 
228
228
  expand_all_questions
229
229
 
230
- within ".questionnaire-question-answer-option:first-of-type" do
230
+ within ".questionnaire-question-response-option:first-of-type" do
231
231
  fill_in find_nested_form_field_locator("body_en"), with: ""
232
232
  end
233
233
 
@@ -283,7 +283,7 @@ shared_examples_for "update questions" do
283
283
 
284
284
  within ".questionnaire-question:last-of-type" do
285
285
  expect(page).to have_css(".questionnaire-question-matrix-row", count: 2)
286
- expect(page).to have_css(".questionnaire-question-answer-option", count: 3)
286
+ expect(page).to have_css(".questionnaire-question-response-option", count: 3)
287
287
  end
288
288
  end
289
289
 
@@ -478,26 +478,26 @@ shared_examples_for "update questions" do
478
478
  end.to change { page.all(".editor-toolbar").size }.by(1)
479
479
  end
480
480
 
481
- it "properly decides which button to show after adding/removing answer options" do
481
+ it "properly decides which button to show after adding/removing response options" do
482
482
  click_on "Add question"
483
483
  expand_all_questions
484
484
 
485
485
  within ".questionnaire-question:last-of-type" do
486
486
  select "Single option", from: "Type"
487
487
 
488
- within ".questionnaire-question-answer-options-list" do
488
+ within ".questionnaire-question-response-options-list" do
489
489
  expect(page).to have_no_button("Remove")
490
490
  end
491
491
 
492
- click_on "Add answer option"
492
+ click_on "Add response option"
493
493
 
494
- expect(page.all(".questionnaire-question-answer-option")).to all(have_button("Remove"))
494
+ expect(page.all(".questionnaire-question-response-option")).to all(have_button("Remove"))
495
495
 
496
- within ".questionnaire-question-answer-option:first-of-type" do
496
+ within ".questionnaire-question-response-option:first-of-type" do
497
497
  click_on "Remove"
498
498
  end
499
499
 
500
- within ".questionnaire-question-answer-options-list" do
500
+ within ".questionnaire-question-response-options-list" do
501
501
  expect(page).to have_no_button("Remove")
502
502
  end
503
503
  end
@@ -506,7 +506,7 @@ shared_examples_for "update questions" do
506
506
  expand_all_questions
507
507
 
508
508
  within ".questionnaire-question:last-of-type" do
509
- within ".questionnaire-question-answer-options-list" do
509
+ within ".questionnaire-question-response-options-list" do
510
510
  expect(page).to have_no_button("Remove")
511
511
  end
512
512
  end
@@ -24,7 +24,7 @@ shared_examples_for "manage questionnaires" do
24
24
  }
25
25
  end
26
26
 
27
- context "when the questionnaire is not already answered" do
27
+ context "when the questionnaire is not already responded" do
28
28
  before do
29
29
  visit manage_questions_path
30
30
  end
@@ -35,9 +35,9 @@ shared_examples_for "manage questionnaires" do
35
35
  it_behaves_like "update display conditions"
36
36
  end
37
37
 
38
- context "when the questionnaire is already answered" do
38
+ context "when the questionnaire is already responded" do
39
39
  let!(:question) { create(:questionnaire_question, questionnaire:, body:, question_type: "multiple_option") }
40
- let!(:answer) { create(:answer, questionnaire:, question:) }
40
+ let!(:response) { create(:response, questionnaire:, question:) }
41
41
 
42
42
  it "cannot modify questionnaire questions" do
43
43
  visit manage_questions_path
@@ -92,7 +92,7 @@ shared_examples_for "manage questionnaires" do
92
92
  end
93
93
 
94
94
  def visit_manage_questions_and_expand_all
95
- click_on "Manage questions"
95
+ click_on "Questions"
96
96
  expand_all_questions
97
97
  end
98
98
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  require "decidim/forms/test/shared_examples/has_questionnaire"
4
4
  require "decidim/forms/test/shared_examples/manage_questionnaires"
5
- require "decidim/forms/test/shared_examples/manage_questionnaire_answers"
5
+ require "decidim/forms/test/shared_examples/manage_questionnaire_responses"
6
6
 
7
7
  if defined? Decidim::Templates
8
8
  require "decidim/templates/test/shared_examples/uses_questionnaire_templates"
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Forms
5
+ # This class serializes the responses given by a User for questionnaire so can be
6
+ # exported to CSV, JSON or other formats.
7
+ class UserResponsesSerializer < Decidim::Exporters::Serializer
8
+ include Decidim::TranslationsHelper
9
+
10
+ # Public: Initializes the serializer with a collection of Responses.
11
+ def initialize(responses)
12
+ @responses = responses
13
+ end
14
+
15
+ # i18n-tasks-use t('decidim.forms.user_responses_serializer.body')
16
+ # i18n-tasks-use t('decidim.forms.user_responses_serializer.id')
17
+ # i18n-tasks-use t('decidim.forms.user_responses_serializer.question')
18
+ # i18n-tasks-use t('decidim.forms.user_responses_serializer.registered')
19
+ # i18n-tasks-use t('decidim.forms.user_responses_serializer.unregistered')
20
+ # Public: Exports a hash with the serialized data for the user responses.
21
+ def serialize
22
+ responses_hash = hash_for(@responses.first)
23
+ responses_hash.merge!(questions_hash)
24
+
25
+ @responses.each do |response|
26
+ responses_hash[translated_question_key(response.question.position, response.question.body)] = normalize_body(response)
27
+ end
28
+
29
+ responses_hash
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :responses
35
+ alias resource responses
36
+
37
+ def hash_for(response)
38
+ {
39
+ response_translated_attribute_name(:id) => response&.session_token,
40
+ response_translated_attribute_name(:created_at) => response&.created_at,
41
+ response_translated_attribute_name(:ip_hash) => response&.ip_hash,
42
+ response_translated_attribute_name(:user_status) => response_translated_attribute_name(response&.decidim_user_id.present? ? "registered" : "unregistered")
43
+ }
44
+ end
45
+
46
+ def questions_hash
47
+ questionnaire_id = @responses.first&.decidim_questionnaire_id
48
+ return {} unless questionnaire_id
49
+
50
+ questions = Decidim::Forms::Question.where(decidim_questionnaire_id: questionnaire_id).order(:position)
51
+ return {} if questions.none?
52
+
53
+ questions.each.inject({}) do |serialized, question|
54
+ serialized.update(
55
+ translated_question_key(question.position, question.body) => ""
56
+ )
57
+ end
58
+ end
59
+
60
+ def translated_question_key(idx, body)
61
+ "#{idx + 1}. #{translated_attribute(body)}"
62
+ end
63
+
64
+ def normalize_body(response)
65
+ response.body ||
66
+ normalize_attachments(response) ||
67
+ normalize_choices(response, response.choices)
68
+ end
69
+
70
+ def normalize_attachments(response)
71
+ return if response.attachments.blank?
72
+
73
+ response.attachments.map(&:url)
74
+ end
75
+
76
+ def normalize_choices(response, choices)
77
+ if response.question.matrix?
78
+ normalize_matrix_choices(response, choices)
79
+ else
80
+ choices.map do |choice|
81
+ format_free_text_for choice
82
+ end
83
+ end
84
+ end
85
+
86
+ def normalize_matrix_choices(response, choices)
87
+ response.question.matrix_rows.to_h do |matrix_row|
88
+ row_body = translated_attribute(matrix_row.body)
89
+
90
+ row_choices = response.question.response_options.map do |response_option|
91
+ choice = choices.find_by(matrix_row:, response_option:)
92
+ choice.try(:custom_body) || choice.try(:body)
93
+ end
94
+
95
+ [row_body, row_choices]
96
+ end
97
+ end
98
+
99
+ def response_translated_attribute_name(attribute)
100
+ I18n.t(attribute.to_sym, scope: "decidim.forms.user_responses_serializer")
101
+ end
102
+
103
+ def format_free_text_for(choice)
104
+ return choice.try(:body) if choice.try(:custom_body).blank?
105
+
106
+ "#{choice.try(:body)} (#{choice.try(:custom_body)})"
107
+ end
108
+ end
109
+ end
110
+ end
@@ -4,7 +4,7 @@ module Decidim
4
4
  # This holds the decidim-forms version.
5
5
  module Forms
6
6
  def self.version
7
- "0.30.2"
7
+ "0.31.0.rc1"
8
8
  end
9
9
  end
10
10
  end
data/lib/decidim/forms.rb CHANGED
@@ -8,8 +8,8 @@ require "decidim/forms/admin_engine"
8
8
  module Decidim
9
9
  # This namespace holds the logic of the `Forms`.
10
10
  module Forms
11
- autoload :UserAnswersSerializer, "decidim/forms/user_answers_serializer"
12
- autoload :DownloadYourDataUserAnswersSerializer, "decidim/forms/download_your_data_user_answers_serializer"
11
+ autoload :UserResponsesSerializer, "decidim/forms/user_responses_serializer"
12
+ autoload :DownloadYourDataUserResponsesSerializer, "decidim/forms/download_your_data_user_responses_serializer"
13
13
  end
14
14
 
15
15
  module Exporters
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: decidim-forms
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.30.2
4
+ version: 0.31.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josep Jaume Rey Peroy
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2025-09-23 00:00:00.000000000 Z
14
+ date: 2025-09-25 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: decidim-core
@@ -19,42 +19,42 @@ dependencies:
19
19
  requirements:
20
20
  - - '='
21
21
  - !ruby/object:Gem::Version
22
- version: 0.30.2
22
+ version: 0.31.0.rc1
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - '='
28
28
  - !ruby/object:Gem::Version
29
- version: 0.30.2
29
+ version: 0.31.0.rc1
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: decidim-admin
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  requirements:
34
34
  - - '='
35
35
  - !ruby/object:Gem::Version
36
- version: 0.30.2
36
+ version: 0.31.0.rc1
37
37
  type: :development
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
41
  - - '='
42
42
  - !ruby/object:Gem::Version
43
- version: 0.30.2
43
+ version: 0.31.0.rc1
44
44
  - !ruby/object:Gem::Dependency
45
45
  name: decidim-dev
46
46
  requirement: !ruby/object:Gem::Requirement
47
47
  requirements:
48
48
  - - '='
49
49
  - !ruby/object:Gem::Version
50
- version: 0.30.2
50
+ version: 0.31.0.rc1
51
51
  type: :development
52
52
  prerelease: false
53
53
  version_requirements: !ruby/object:Gem::Requirement
54
54
  requirements:
55
55
  - - '='
56
56
  - !ruby/object:Gem::Version
57
- version: 0.30.2
57
+ version: 0.31.0.rc1
58
58
  description: A forms gem for decidim.
59
59
  email:
60
60
  - josepjaume@gmail.com
@@ -67,45 +67,45 @@ extra_rdoc_files: []
67
67
  files:
68
68
  - README.md
69
69
  - Rakefile
70
- - app/cells/decidim/forms/answer_readonly/show.erb
71
- - app/cells/decidim/forms/answer_readonly_cell.rb
72
70
  - app/cells/decidim/forms/matrix_readonly/show.erb
73
71
  - app/cells/decidim/forms/matrix_readonly_cell.rb
74
72
  - app/cells/decidim/forms/question_readonly/show.erb
75
73
  - app/cells/decidim/forms/question_readonly/title_and_description.erb
76
74
  - app/cells/decidim/forms/question_readonly_cell.rb
75
+ - app/cells/decidim/forms/response_readonly/show.erb
76
+ - app/cells/decidim/forms/response_readonly_cell.rb
77
77
  - app/cells/decidim/forms/step_navigation/show.erb
78
78
  - app/cells/decidim/forms/step_navigation_cell.rb
79
79
  - app/commands/decidim/forms/admin/update_questionnaire.rb
80
80
  - app/commands/decidim/forms/admin/update_questions.rb
81
- - app/commands/decidim/forms/answer_questionnaire.rb
81
+ - app/commands/decidim/forms/response_questionnaire.rb
82
82
  - app/controllers/decidim/forms/admin/concerns/has_questionnaire.rb
83
- - app/controllers/decidim/forms/admin/concerns/has_questionnaire_answers.rb
83
+ - app/controllers/decidim/forms/admin/concerns/has_questionnaire_responses.rb
84
84
  - app/controllers/decidim/forms/concerns/has_questionnaire.rb
85
- - app/forms/decidim/forms/admin/answer_option_form.rb
86
85
  - app/forms/decidim/forms/admin/display_condition_form.rb
87
86
  - app/forms/decidim/forms/admin/question_form.rb
88
87
  - app/forms/decidim/forms/admin/question_matrix_row_form.rb
89
88
  - app/forms/decidim/forms/admin/questionnaire_form.rb
90
89
  - app/forms/decidim/forms/admin/questions_form.rb
91
- - app/forms/decidim/forms/answer_choice_form.rb
92
- - app/forms/decidim/forms/answer_form.rb
90
+ - app/forms/decidim/forms/admin/response_option_form.rb
93
91
  - app/forms/decidim/forms/questionnaire_form.rb
92
+ - app/forms/decidim/forms/response_choice_form.rb
93
+ - app/forms/decidim/forms/response_form.rb
94
94
  - app/helpers/decidim/forms/admin/application_helper.rb
95
- - app/helpers/decidim/forms/admin/concerns/has_questionnaire_answers_pagination_helper.rb
96
- - app/helpers/decidim/forms/admin/concerns/has_questionnaire_answers_url_helper.rb
97
- - app/helpers/decidim/forms/admin/questionnaire_answers_helper.rb
95
+ - app/helpers/decidim/forms/admin/concerns/has_questionnaire_responses_pagination_helper.rb
96
+ - app/helpers/decidim/forms/admin/concerns/has_questionnaire_responses_url_helper.rb
97
+ - app/helpers/decidim/forms/admin/questionnaire_responses_helper.rb
98
98
  - app/helpers/decidim/forms/application_helper.rb
99
- - app/jobs/decidim/forms/export_questionnaire_answers_job.rb
99
+ - app/jobs/decidim/forms/export_questionnaire_responses_job.rb
100
100
  - app/models/concerns/decidim/forms/has_questionnaire.rb
101
- - app/models/decidim/forms/answer.rb
102
- - app/models/decidim/forms/answer_choice.rb
103
- - app/models/decidim/forms/answer_option.rb
104
101
  - app/models/decidim/forms/application_record.rb
105
102
  - app/models/decidim/forms/display_condition.rb
106
103
  - app/models/decidim/forms/question.rb
107
104
  - app/models/decidim/forms/question_matrix_row.rb
108
105
  - app/models/decidim/forms/questionnaire.rb
106
+ - app/models/decidim/forms/response.rb
107
+ - app/models/decidim/forms/response_choice.rb
108
+ - app/models/decidim/forms/response_option.rb
109
109
  - app/packs/entrypoints/decidim_forms.js
110
110
  - app/packs/entrypoints/decidim_forms_admin.js
111
111
  - app/packs/images/decidim/surveys/decidim_surveys.svg
@@ -115,23 +115,21 @@ files:
115
115
  - app/packs/src/decidim/forms/admin/collapsible_questions.js
116
116
  - app/packs/src/decidim/forms/admin/forms.js
117
117
  - app/packs/src/decidim/forms/admin/live_text_update.component.js
118
- - app/packs/src/decidim/forms/admin/publish_answers_buttons.js
118
+ - app/packs/src/decidim/forms/admin/publish_responses_buttons.js
119
119
  - app/packs/src/decidim/forms/display_conditions.component.js
120
120
  - app/packs/src/decidim/forms/forms.js
121
121
  - app/packs/src/decidim/forms/max_choices_alert.component.js
122
122
  - app/packs/src/decidim/forms/option_attached_inputs.component.js
123
123
  - app/packs/stylesheets/decidim/forms/forms.scss
124
- - app/presenters/decidim/forms/admin/questionnaire_answer_presenter.rb
125
124
  - app/presenters/decidim/forms/admin/questionnaire_participant_presenter.rb
125
+ - app/presenters/decidim/forms/admin/questionnaire_response_presenter.rb
126
126
  - app/presenters/decidim/forms/admin_log/question_presenter.rb
127
127
  - app/presenters/decidim/forms/admin_log/questionnaire_presenter.rb
128
- - app/presenters/decidim/forms/answer_option_presenter.rb
129
128
  - app/presenters/decidim/forms/question_presenter.rb
129
+ - app/presenters/decidim/forms/response_option_presenter.rb
130
130
  - app/queries/decidim/forms/questionnaire_participant.rb
131
131
  - app/queries/decidim/forms/questionnaire_participants.rb
132
- - app/queries/decidim/forms/questionnaire_user_answers.rb
133
- - app/views/decidim/forms/admin/questionnaires/_answer_option.html.erb
134
- - app/views/decidim/forms/admin/questionnaires/_answer_option_template.html.erb
132
+ - app/queries/decidim/forms/questionnaire_user_responses.rb
135
133
  - app/views/decidim/forms/admin/questionnaires/_display_condition.html.erb
136
134
  - app/views/decidim/forms/admin/questionnaires/_display_condition_template.html.erb
137
135
  - app/views/decidim/forms/admin/questionnaires/_form.html.erb
@@ -139,26 +137,28 @@ files:
139
137
  - app/views/decidim/forms/admin/questionnaires/_matrix_row_template.html.erb
140
138
  - app/views/decidim/forms/admin/questionnaires/_question.html.erb
141
139
  - app/views/decidim/forms/admin/questionnaires/_questions_form.html.erb
140
+ - app/views/decidim/forms/admin/questionnaires/_response_option.html.erb
141
+ - app/views/decidim/forms/admin/questionnaires/_response_option_template.html.erb
142
142
  - app/views/decidim/forms/admin/questionnaires/_separator.html.erb
143
143
  - app/views/decidim/forms/admin/questionnaires/_title_and_description.html.erb
144
- - app/views/decidim/forms/admin/questionnaires/answers/index.html.erb
145
- - app/views/decidim/forms/admin/questionnaires/answers/show.html.erb
146
144
  - app/views/decidim/forms/admin/questionnaires/edit.html.erb
147
145
  - app/views/decidim/forms/admin/questionnaires/edit_questions.html.erb
148
- - app/views/decidim/forms/questionnaires/_answer.html.erb
146
+ - app/views/decidim/forms/admin/questionnaires/responses/index.html.erb
147
+ - app/views/decidim/forms/admin/questionnaires/responses/show.html.erb
149
148
  - app/views/decidim/forms/questionnaires/_questionnaire.html.erb
150
149
  - app/views/decidim/forms/questionnaires/_questionnaire_readonly.html.erb
151
- - app/views/decidim/forms/questionnaires/answers/_files.html.erb
152
- - app/views/decidim/forms/questionnaires/answers/_long_answer.html.erb
153
- - app/views/decidim/forms/questionnaires/answers/_matrix_multiple.html.erb
154
- - app/views/decidim/forms/questionnaires/answers/_matrix_single.html.erb
155
- - app/views/decidim/forms/questionnaires/answers/_multiple_option.html.erb
156
- - app/views/decidim/forms/questionnaires/answers/_separator.html.erb
157
- - app/views/decidim/forms/questionnaires/answers/_short_answer.html.erb
158
- - app/views/decidim/forms/questionnaires/answers/_single_option.html.erb
159
- - app/views/decidim/forms/questionnaires/answers/_sorting.html.erb
160
- - app/views/decidim/forms/questionnaires/answers/_title_and_description.html.erb
150
+ - app/views/decidim/forms/questionnaires/_response.html.erb
161
151
  - app/views/decidim/forms/questionnaires/edit.html.erb
152
+ - app/views/decidim/forms/questionnaires/responses/_files.html.erb
153
+ - app/views/decidim/forms/questionnaires/responses/_long_response.html.erb
154
+ - app/views/decidim/forms/questionnaires/responses/_matrix_multiple.html.erb
155
+ - app/views/decidim/forms/questionnaires/responses/_matrix_single.html.erb
156
+ - app/views/decidim/forms/questionnaires/responses/_multiple_option.html.erb
157
+ - app/views/decidim/forms/questionnaires/responses/_separator.html.erb
158
+ - app/views/decidim/forms/questionnaires/responses/_short_response.html.erb
159
+ - app/views/decidim/forms/questionnaires/responses/_single_option.html.erb
160
+ - app/views/decidim/forms/questionnaires/responses/_sorting.html.erb
161
+ - app/views/decidim/forms/questionnaires/responses/_title_and_description.html.erb
162
162
  - app/views/decidim/forms/questionnaires/show.html.erb
163
163
  - config/assets.rb
164
164
  - config/locales/am-ET.yml
@@ -262,28 +262,31 @@ files:
262
262
  - db/migrate/20240416111953_add_display_conditions_counter_cache_to_questions.rb
263
263
  - db/migrate/20240416113926_add_display_conditions_for_other_questions_counter_cache_to_questions.rb
264
264
  - db/migrate/20241122142230_add_survey_answers_published_at_to_questions.rb
265
+ - db/migrate/20250314150250_rename_answer_to_response_in_decidim_forms.rb
266
+ - db/migrate/20250319130003_change_question_types_in_questions.rb
265
267
  - decidim-forms.gemspec
266
- - lib/decidim/api/answer_option_type.rb
268
+ - lib/decidim/api/question_matrix_row_type.rb
267
269
  - lib/decidim/api/question_type.rb
268
270
  - lib/decidim/api/questionnaire_entity_interface.rb
269
271
  - lib/decidim/api/questionnaire_type.rb
272
+ - lib/decidim/api/response_option_type.rb
270
273
  - lib/decidim/exporters/form_pdf.rb
271
274
  - lib/decidim/forms.rb
272
275
  - lib/decidim/forms/admin.rb
273
276
  - lib/decidim/forms/admin_engine.rb
274
277
  - lib/decidim/forms/api.rb
275
- - lib/decidim/forms/download_your_data_user_answers_serializer.rb
278
+ - lib/decidim/forms/download_your_data_user_responses_serializer.rb
276
279
  - lib/decidim/forms/engine.rb
277
280
  - lib/decidim/forms/test.rb
278
281
  - lib/decidim/forms/test/factories.rb
279
282
  - lib/decidim/forms/test/shared_examples/has_questionnaire.rb
280
- - lib/decidim/forms/test/shared_examples/manage_questionnaire_answers.rb
283
+ - lib/decidim/forms/test/shared_examples/manage_questionnaire_responses.rb
281
284
  - lib/decidim/forms/test/shared_examples/manage_questionnaires.rb
282
285
  - lib/decidim/forms/test/shared_examples/manage_questionnaires/add_display_conditions.rb
283
286
  - lib/decidim/forms/test/shared_examples/manage_questionnaires/add_questions.rb
284
287
  - lib/decidim/forms/test/shared_examples/manage_questionnaires/update_display_conditions.rb
285
288
  - lib/decidim/forms/test/shared_examples/manage_questionnaires/update_questions.rb
286
- - lib/decidim/forms/user_answers_serializer.rb
289
+ - lib/decidim/forms/user_responses_serializer.rb
287
290
  - lib/decidim/forms/version.rb
288
291
  homepage: https://decidim.org
289
292
  licenses:
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Decidim
4
- module Forms
5
- # This cell renders a possible answer of a question (readonly)
6
- class AnswerReadonlyCell < Decidim::ViewModel
7
- end
8
- end
9
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Decidim
4
- module Forms
5
- module Admin
6
- # Custom helpers for questionnaire answers
7
- #
8
- module QuestionnaireAnswersHelper
9
- def first_table_th(answer)
10
- if answer.first_short_answer
11
- @first_short_answer = answer.first_short_answer
12
- return translated_attribute @first_short_answer.question.body
13
- end
14
-
15
- t("session_token", scope: "decidim.forms.user_answers_serializer")
16
- end
17
-
18
- def first_table_td(answer)
19
- return answer.first_short_answer&.body if @first_short_answer
20
-
21
- answer.session_token
22
- end
23
-
24
- def display_percentage(number)
25
- number_to_percentage(number, precision: 0, strip_insignificant_zeros: true, locale: I18n.locale)
26
- end
27
- end
28
- end
29
- end
30
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Decidim
4
- module Forms
5
- class AnswerChoice < Forms::ApplicationRecord
6
- belongs_to :answer,
7
- class_name: "Answer",
8
- foreign_key: "decidim_answer_id"
9
-
10
- belongs_to :answer_option,
11
- class_name: "AnswerOption",
12
- foreign_key: "decidim_answer_option_id"
13
-
14
- belongs_to :matrix_row,
15
- class_name: "QuestionMatrixRow",
16
- foreign_key: "decidim_question_matrix_row_id",
17
- optional: true
18
-
19
- validates :matrix_row, presence: true, if: -> { answer.question.matrix? }
20
- end
21
- end
22
- end
@@ -1,32 +0,0 @@
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 QuestionnaireUserAnswers < Decidim::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 and group answers by user for each questionnaire's question.
22
- def query
23
- answers = Answer.not_separator
24
- .not_title_and_description
25
- .joins(:question)
26
- .where(questionnaire: @questionnaire)
27
-
28
- answers.sort_by { |answer| answer.question.position.to_i }.group_by { |a| a.user || a.session_token }.values
29
- end
30
- end
31
- end
32
- end
@@ -1,7 +0,0 @@
1
- <% question = form.object %>
2
-
3
- <script type="text/template" class="decidim-answer-option-template decidim-template" id="<%= template_id %>">
4
- <%= fields_for "questions[questions][#{question.to_param}][answer_options][]", blank_answer_option do |answer_option_form| %>
5
- <%= render "decidim/forms/admin/questionnaires/answer_option", form: answer_option_form, question:, editable: %>
6
- <% end %>
7
- </script>