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.
- checksums.yaml +4 -4
- data/README.md +10 -10
- data/app/cells/decidim/forms/matrix_readonly/show.erb +1 -1
- data/app/cells/decidim/forms/matrix_readonly_cell.rb +3 -3
- data/app/cells/decidim/forms/question_readonly/show.erb +5 -5
- data/app/cells/decidim/forms/question_readonly/title_and_description.erb +3 -3
- data/app/cells/decidim/forms/response_readonly_cell.rb +9 -0
- data/app/cells/decidim/forms/step_navigation/show.erb +3 -3
- data/app/cells/decidim/forms/step_navigation_cell.rb +3 -3
- data/app/commands/decidim/forms/admin/update_questions.rb +6 -6
- data/app/commands/decidim/forms/{answer_questionnaire.rb → response_questionnaire.rb} +35 -35
- data/app/controllers/decidim/forms/admin/concerns/has_questionnaire.rb +12 -12
- data/app/controllers/decidim/forms/admin/concerns/{has_questionnaire_answers.rb → has_questionnaire_responses.rb} +23 -19
- data/app/controllers/decidim/forms/concerns/has_questionnaire.rb +38 -33
- data/app/forms/decidim/forms/admin/display_condition_form.rb +14 -14
- data/app/forms/decidim/forms/admin/question_form.rb +3 -3
- data/app/forms/decidim/forms/admin/{answer_option_form.rb → response_option_form.rb} +3 -3
- data/app/forms/decidim/forms/questionnaire_form.rb +8 -9
- data/app/forms/decidim/forms/{answer_choice_form.rb → response_choice_form.rb} +5 -5
- data/app/forms/decidim/forms/{answer_form.rb → response_form.rb} +9 -9
- data/app/helpers/decidim/forms/admin/application_helper.rb +2 -2
- data/app/helpers/decidim/forms/admin/concerns/{has_questionnaire_answers_pagination_helper.rb → has_questionnaire_responses_pagination_helper.rb} +4 -4
- data/app/helpers/decidim/forms/admin/concerns/{has_questionnaire_answers_url_helper.rb → has_questionnaire_responses_url_helper.rb} +5 -5
- data/app/helpers/decidim/forms/admin/questionnaire_responses_helper.rb +32 -0
- data/app/helpers/decidim/forms/application_helper.rb +1 -2
- data/app/jobs/decidim/forms/{export_questionnaire_answers_job.rb → export_questionnaire_responses_job.rb} +5 -5
- data/app/models/decidim/forms/display_condition.rb +20 -20
- data/app/models/decidim/forms/question.rb +14 -13
- data/app/models/decidim/forms/question_matrix_row.rb +1 -1
- data/app/models/decidim/forms/questionnaire.rb +11 -6
- data/app/models/decidim/forms/{answer.rb → response.rb} +9 -9
- data/app/models/decidim/forms/response_choice.rb +22 -0
- data/app/models/decidim/forms/{answer_option.rb → response_option.rb} +5 -5
- data/app/packs/entrypoints/decidim_forms_admin.js +3 -3
- data/app/packs/src/decidim/forms/admin/collapsible_questions.js +12 -10
- data/app/packs/src/decidim/forms/admin/forms.js +35 -35
- data/app/packs/src/decidim/forms/admin/{publish_answers_buttons.js → publish_responses_buttons.js} +12 -12
- data/app/packs/src/decidim/forms/display_conditions.component.js +12 -12
- data/app/packs/src/decidim/forms/forms.js +4 -4
- data/app/packs/stylesheets/decidim/forms/forms.scss +2 -2
- data/app/presenters/decidim/forms/admin/questionnaire_participant_presenter.rb +13 -13
- data/app/presenters/decidim/forms/admin/{questionnaire_answer_presenter.rb → questionnaire_response_presenter.rb} +15 -15
- data/app/presenters/decidim/forms/admin_log/question_presenter.rb +3 -3
- data/app/presenters/decidim/forms/{answer_option_presenter.rb → response_option_presenter.rb} +2 -2
- data/app/queries/decidim/forms/questionnaire_participant.rb +5 -5
- data/app/queries/decidim/forms/questionnaire_participants.rb +6 -6
- data/app/queries/decidim/forms/questionnaire_user_responses.rb +32 -0
- data/app/views/decidim/forms/admin/questionnaires/_display_condition.html.erb +9 -9
- data/app/views/decidim/forms/admin/questionnaires/_form.html.erb +2 -2
- data/app/views/decidim/forms/admin/questionnaires/_matrix_row.html.erb +3 -3
- data/app/views/decidim/forms/admin/questionnaires/_question.html.erb +16 -16
- data/app/views/decidim/forms/admin/questionnaires/_questions_form.html.erb +11 -10
- data/app/views/decidim/forms/admin/questionnaires/{_answer_option.html.erb → _response_option.html.erb} +7 -7
- data/app/views/decidim/forms/admin/questionnaires/_response_option_template.html.erb +7 -0
- data/app/views/decidim/forms/admin/questionnaires/_separator.html.erb +10 -7
- data/app/views/decidim/forms/admin/questionnaires/_title_and_description.html.erb +7 -7
- data/app/views/decidim/forms/admin/questionnaires/edit.html.erb +1 -1
- data/app/views/decidim/forms/admin/questionnaires/edit_questions.html.erb +8 -8
- data/app/views/decidim/forms/admin/questionnaires/responses/index.html.erb +80 -0
- data/app/views/decidim/forms/admin/questionnaires/responses/show.html.erb +43 -0
- data/app/views/decidim/forms/questionnaires/_questionnaire.html.erb +22 -26
- data/app/views/decidim/forms/questionnaires/_questionnaire_readonly.html.erb +8 -3
- data/app/views/decidim/forms/questionnaires/_response.html.erb +61 -0
- data/app/views/decidim/forms/questionnaires/edit.html.erb +2 -2
- data/app/views/decidim/forms/questionnaires/responses/_files.html.erb +1 -0
- data/app/views/decidim/forms/questionnaires/responses/_long_response.html.erb +3 -0
- data/app/views/decidim/forms/questionnaires/{answers → responses}/_matrix_multiple.html.erb +16 -15
- data/app/views/decidim/forms/questionnaires/{answers → responses}/_matrix_single.html.erb +17 -16
- data/app/views/decidim/forms/questionnaires/responses/_multiple_option.html.erb +26 -0
- data/app/views/decidim/forms/questionnaires/responses/_separator.html.erb +1 -0
- data/app/views/decidim/forms/questionnaires/responses/_short_response.html.erb +3 -0
- data/app/views/decidim/forms/questionnaires/responses/_single_option.html.erb +33 -0
- data/app/views/decidim/forms/questionnaires/responses/_sorting.html.erb +26 -0
- data/app/views/decidim/forms/questionnaires/responses/_title_and_description.html.erb +1 -0
- data/app/views/decidim/forms/questionnaires/show.html.erb +10 -10
- data/config/assets.rb +2 -2
- data/config/locales/ar.yml +0 -22
- data/config/locales/bg.yml +3 -36
- data/config/locales/ca-IT.yml +73 -73
- data/config/locales/ca.yml +73 -73
- data/config/locales/cs.yml +72 -75
- data/config/locales/de.yml +72 -72
- data/config/locales/el.yml +3 -36
- data/config/locales/en.yml +83 -83
- data/config/locales/es-MX.yml +75 -75
- data/config/locales/es-PY.yml +75 -75
- data/config/locales/es.yml +73 -73
- data/config/locales/eu.yml +71 -71
- data/config/locales/fi-plain.yml +71 -71
- data/config/locales/fi.yml +69 -69
- data/config/locales/fr-CA.yml +70 -67
- data/config/locales/fr.yml +70 -67
- data/config/locales/ga-IE.yml +0 -7
- data/config/locales/gl.yml +0 -22
- data/config/locales/hu.yml +0 -22
- data/config/locales/id-ID.yml +0 -22
- data/config/locales/it.yml +3 -40
- data/config/locales/ja.yml +80 -80
- data/config/locales/lb.yml +3 -36
- data/config/locales/lt.yml +3 -36
- data/config/locales/lv.yml +0 -22
- data/config/locales/nl.yml +3 -36
- data/config/locales/no.yml +3 -36
- data/config/locales/pl.yml +3 -36
- data/config/locales/pt-BR.yml +3 -36
- data/config/locales/pt.yml +3 -36
- data/config/locales/ro-RO.yml +22 -51
- data/config/locales/ru.yml +0 -9
- data/config/locales/sk.yml +0 -22
- data/config/locales/sl.yml +0 -5
- data/config/locales/sv.yml +82 -54
- data/config/locales/tr-TR.yml +3 -36
- data/config/locales/zh-CN.yml +3 -36
- data/config/locales/zh-TW.yml +3 -36
- data/db/migrate/20190315203056_add_session_token_to_decidim_forms_answers.rb +1 -1
- data/db/migrate/20250314150250_rename_answer_to_response_in_decidim_forms.rb +30 -0
- data/db/migrate/20250319130003_change_question_types_in_questions.rb +14 -0
- data/lib/decidim/api/question_matrix_row_type.rb +13 -0
- data/lib/decidim/api/question_type.rb +4 -3
- data/lib/decidim/api/questionnaire_type.rb +1 -0
- data/lib/decidim/api/response_option_type.rb +13 -0
- data/lib/decidim/exporters/form_pdf.rb +33 -33
- data/lib/decidim/forms/api.rb +2 -1
- data/lib/decidim/forms/{download_your_data_user_answers_serializer.rb → download_your_data_user_responses_serializer.rb} +3 -3
- data/lib/decidim/forms/engine.rb +2 -2
- data/lib/decidim/forms/test/factories.rb +24 -24
- data/lib/decidim/forms/test/shared_examples/has_questionnaire.rb +176 -176
- data/lib/decidim/forms/test/shared_examples/manage_questionnaire_responses.rb +159 -0
- data/lib/decidim/forms/test/shared_examples/manage_questionnaires/add_display_conditions.rb +19 -19
- data/lib/decidim/forms/test/shared_examples/manage_questionnaires/add_questions.rb +44 -44
- data/lib/decidim/forms/test/shared_examples/manage_questionnaires/update_display_conditions.rb +10 -10
- data/lib/decidim/forms/test/shared_examples/manage_questionnaires/update_questions.rb +18 -18
- data/lib/decidim/forms/test/shared_examples/manage_questionnaires.rb +4 -4
- data/lib/decidim/forms/test.rb +1 -1
- data/lib/decidim/forms/user_responses_serializer.rb +110 -0
- data/lib/decidim/forms/version.rb +1 -1
- data/lib/decidim/forms.rb +2 -2
- metadata +48 -45
- data/app/cells/decidim/forms/answer_readonly_cell.rb +0 -9
- data/app/helpers/decidim/forms/admin/questionnaire_answers_helper.rb +0 -30
- data/app/models/decidim/forms/answer_choice.rb +0 -22
- data/app/queries/decidim/forms/questionnaire_user_answers.rb +0 -32
- data/app/views/decidim/forms/admin/questionnaires/_answer_option_template.html.erb +0 -7
- data/app/views/decidim/forms/admin/questionnaires/answers/index.html.erb +0 -49
- data/app/views/decidim/forms/admin/questionnaires/answers/show.html.erb +0 -43
- data/app/views/decidim/forms/questionnaires/_answer.html.erb +0 -61
- data/app/views/decidim/forms/questionnaires/answers/_files.html.erb +0 -1
- data/app/views/decidim/forms/questionnaires/answers/_long_answer.html.erb +0 -3
- data/app/views/decidim/forms/questionnaires/answers/_multiple_option.html.erb +0 -25
- data/app/views/decidim/forms/questionnaires/answers/_separator.html.erb +0 -1
- data/app/views/decidim/forms/questionnaires/answers/_short_answer.html.erb +0 -3
- data/app/views/decidim/forms/questionnaires/answers/_single_option.html.erb +0 -32
- data/app/views/decidim/forms/questionnaires/answers/_sorting.html.erb +0 -26
- data/app/views/decidim/forms/questionnaires/answers/_title_and_description.html.erb +0 -1
- data/lib/decidim/api/answer_option_type.rb +0 -13
- data/lib/decidim/forms/test/shared_examples/manage_questionnaire_answers.rb +0 -149
- data/lib/decidim/forms/user_answers_serializer.rb +0 -105
- /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
|
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='
|
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 "
|
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 "
|
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
|
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 "
|
208
|
+
click_on "Questions"
|
209
209
|
end
|
210
210
|
|
211
|
-
it "allows deleting
|
211
|
+
it "allows deleting response options" do
|
212
212
|
expand_all_questions
|
213
213
|
|
214
|
-
within ".questionnaire-question-
|
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-
|
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-
|
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-
|
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
|
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-
|
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
|
492
|
+
click_on "Add response option"
|
493
493
|
|
494
|
-
expect(page.all(".questionnaire-question-
|
494
|
+
expect(page.all(".questionnaire-question-response-option")).to all(have_button("Remove"))
|
495
495
|
|
496
|
-
within ".questionnaire-question-
|
496
|
+
within ".questionnaire-question-response-option:first-of-type" do
|
497
497
|
click_on "Remove"
|
498
498
|
end
|
499
499
|
|
500
|
-
within ".questionnaire-question-
|
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-
|
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
|
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
|
38
|
+
context "when the questionnaire is already responded" do
|
39
39
|
let!(:question) { create(:questionnaire_question, questionnaire:, body:, question_type: "multiple_option") }
|
40
|
-
let!(:
|
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 "
|
95
|
+
click_on "Questions"
|
96
96
|
expand_all_questions
|
97
97
|
end
|
98
98
|
end
|
data/lib/decidim/forms/test.rb
CHANGED
@@ -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/
|
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
|
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 :
|
12
|
-
autoload :
|
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.
|
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-
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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/
|
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/
|
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/
|
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/
|
96
|
-
- app/helpers/decidim/forms/admin/concerns/
|
97
|
-
- app/helpers/decidim/forms/admin/
|
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/
|
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/
|
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/
|
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/
|
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/
|
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/
|
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/
|
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/
|
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/
|
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,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>
|