decidim-forms 0.25.1 → 0.26.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/app/commands/decidim/forms/answer_questionnaire.rb +6 -2
  3. data/app/forms/decidim/forms/admin/question_form.rb +4 -0
  4. data/app/models/decidim/forms/answer.rb +1 -0
  5. data/app/models/decidim/forms/question.rb +7 -1
  6. data/app/packs/src/decidim/forms/admin/forms.js +2 -0
  7. data/app/presenters/decidim/forms/admin/questionnaire_answer_presenter.rb +19 -4
  8. data/app/presenters/decidim/forms/admin/questionnaire_participant_presenter.rb +5 -2
  9. data/app/queries/decidim/forms/questionnaire_user_answers.rb +4 -1
  10. data/app/views/decidim/forms/admin/questionnaires/_form.html.erb +12 -0
  11. data/app/views/decidim/forms/admin/questionnaires/_title_and_description.html.erb +80 -0
  12. data/app/views/decidim/forms/questionnaires/_answer.html.erb +10 -1
  13. data/app/views/decidim/forms/questionnaires/answers/_title_and_description.html.erb +1 -0
  14. data/app/views/decidim/forms/questionnaires/show.html.erb +8 -7
  15. data/config/locales/ca.yml +11 -0
  16. data/config/locales/cs.yml +11 -0
  17. data/config/locales/en.yml +11 -0
  18. data/config/locales/es-MX.yml +11 -0
  19. data/config/locales/es-PY.yml +11 -0
  20. data/config/locales/es.yml +11 -0
  21. data/config/locales/fi-plain.yml +11 -0
  22. data/config/locales/fi.yml +11 -0
  23. data/config/locales/fr-CA.yml +11 -0
  24. data/config/locales/fr.yml +12 -1
  25. data/config/locales/gl.yml +11 -0
  26. data/config/locales/hu.yml +11 -0
  27. data/config/locales/ja.yml +12 -1
  28. data/config/locales/lb-LU.yml +103 -0
  29. data/config/locales/nl.yml +11 -0
  30. data/config/locales/no.yml +52 -0
  31. data/config/locales/pt-BR.yml +1 -1
  32. data/config/locales/ro-RO.yml +69 -58
  33. data/config/locales/sv.yml +12 -0
  34. data/config/locales/val-ES.yml +18 -0
  35. data/lib/decidim/forms/test/factories.rb +12 -0
  36. data/lib/decidim/forms/test/shared_examples/manage_questionnaire_answers.rb +18 -0
  37. data/lib/decidim/forms/test/shared_examples/manage_questionnaires/add_questions.rb +36 -5
  38. data/lib/decidim/forms/test/shared_examples/manage_questionnaires/update_questions.rb +98 -0
  39. data/lib/decidim/forms/test/shared_examples/manage_questionnaires.rb +8 -0
  40. data/lib/decidim/forms/user_answers_serializer.rb +7 -1
  41. data/lib/decidim/forms/version.rb +1 -1
  42. metadata +15 -12
@@ -79,6 +79,7 @@ sv:
79
79
  form:
80
80
  add_question: Lägg till fråga
81
81
  add_separator: Lägg till separator
82
+ add_title_and_description: Lägg till titel och beskrivning
82
83
  already_answered_warning: Frågeformuläret har redan besvarats av vissa användare så du inte kan ändra dess frågor.
83
84
  collapse: Komprimera alla frågor
84
85
  expand: Expandera alla frågor
@@ -108,8 +109,18 @@ sv:
108
109
  remove: Radera
109
110
  separator: Avgränsare
110
111
  up: Upp
112
+ title_and_description:
113
+ collapse: Kollapsa
114
+ description: Beskrivning
115
+ down: Ner
116
+ expand: Expandera
117
+ remove: Ta bort
118
+ title: Titel
119
+ title_and_description: Titel och beskrivning
120
+ up: Upp
111
121
  update:
112
122
  invalid: Det gick inte att spara formuläret.
123
+ success: Formuläret har sparats.
113
124
  errors:
114
125
  answer:
115
126
  body: Kroppen kan inte vara to
@@ -130,6 +141,7 @@ sv:
130
141
  short_answer: Kort svar
131
142
  single_option: Ett alternativ
132
143
  sorting: Sortering
144
+ title_and_description: Titel och beskrivning
133
145
  questionnaires:
134
146
  answer:
135
147
  invalid: Det gick inte att besvara formuläret.
@@ -0,0 +1,18 @@
1
+ val:
2
+ decidim:
3
+ forms:
4
+ admin:
5
+ questionnaires:
6
+ form:
7
+ add_title_and_description: Afig títol i descripció
8
+ title_and_description:
9
+ collapse: Redueix
10
+ description: Descripció
11
+ down: Baixar
12
+ expand: Expandeix
13
+ remove: Elimina
14
+ title: Títol
15
+ title_and_description: Títol i descripció
16
+ up: Pujar
17
+ question_types:
18
+ title_and_description: Títol i descripció
@@ -123,6 +123,10 @@ FactoryBot.define do
123
123
  trait :separator do
124
124
  question_type { :separator }
125
125
  end
126
+
127
+ trait :title_and_description do
128
+ question_type { :title_and_description }
129
+ end
126
130
  end
127
131
 
128
132
  factory :answer, class: "Decidim::Forms::Answer" do
@@ -144,6 +148,14 @@ FactoryBot.define do
144
148
  question { create(:questionnaire_question) }
145
149
  body { generate_localized_title }
146
150
  free_text { false }
151
+
152
+ trait :free_text_enabled do
153
+ free_text { true }
154
+ end
155
+
156
+ trait :free_text_disabled do
157
+ free_text { false }
158
+ end
147
159
  end
148
160
 
149
161
  factory :answer_choice, class: "Decidim::Forms::AnswerChoice" do
@@ -69,6 +69,24 @@ shared_examples_for "manage questionnaire answers" do
69
69
  expect(page).to have_content("User identifier")
70
70
  end
71
71
  end
72
+
73
+ context "when multiple answer choice" do
74
+ let(:first_type) { "multiple_option" }
75
+ let!(:answer1) { create :answer, questionnaire: questionnaire, question: first, body: nil }
76
+ let!(:answer_option) { create :answer_option, question: first }
77
+ let!(:answer_choice) { create :answer_choice, answer: answer1, answer_option: answer_option, body: translated(answer_option.body, locale: I18n.locale) }
78
+
79
+ before do
80
+ find_all("a.action-icon.action-icon--eye").first.click
81
+ end
82
+
83
+ it "shows the answers page with custom body" do
84
+ within "#answers" do
85
+ expect(page).to have_css("dt", text: translated(first.body))
86
+ expect(page).to have_css("li", text: translated(answer_option.body))
87
+ end
88
+ end
89
+ end
72
90
  end
73
91
 
74
92
  context "and managing individual answer page" do
@@ -4,20 +4,21 @@ require "spec_helper"
4
4
 
5
5
  shared_examples_for "add questions" do
6
6
  it "adds a few questions and separators to the questionnaire" do
7
- questions_body = ["This is the first question", "This is the second question"]
7
+ fields_body = ["This is the first question", "This is the second question", "This is the first title and description"]
8
8
 
9
9
  within "form.edit_questionnaire" do
10
10
  click_button "Add question"
11
11
  click_button "Add separator"
12
+ click_button "Add title and description"
12
13
  click_button "Add question"
13
14
 
14
- expect(page).to have_selector(".questionnaire-question", count: 3)
15
+ expect(page).to have_selector(".questionnaire-question", count: 4)
15
16
 
16
17
  expand_all_questions
17
18
 
18
- page.all(".questionnaire-question .collapsible").each_with_index do |question, idx|
19
- within question do
20
- fill_in find_nested_form_field_locator("body_en"), with: questions_body[idx]
19
+ page.all(".questionnaire-question .collapsible").each_with_index do |field, idx|
20
+ within field do
21
+ fill_in find_nested_form_field_locator("body_en"), with: fields_body[idx]
21
22
  end
22
23
  end
23
24
 
@@ -30,6 +31,7 @@ shared_examples_for "add questions" do
30
31
 
31
32
  expect(page).to have_selector("input[value='This is the first question']")
32
33
  expect(page).to have_selector("input[value='This is the second question']")
34
+ expect(page).to have_selector("input[value='This is the first title and description']")
33
35
  expect(page).to have_content("Separator #2")
34
36
  end
35
37
 
@@ -62,6 +64,35 @@ shared_examples_for "add questions" do
62
64
  expect(page).to have_selector("strong", text: "Superkalifragilistic description")
63
65
  end
64
66
 
67
+ it "adds a title-and-description" do
68
+ within "form.edit_questionnaire" do
69
+ click_button "Add title and description"
70
+ expand_all_questions
71
+
72
+ within ".questionnaire-question" do
73
+ fill_in find_nested_form_field_locator("body_en"), with: "Body"
74
+
75
+ fill_in_editor find_nested_form_field_locator("description_en", visible: false), with: "<strong>Superkalifragilistic description</strong>"
76
+ end
77
+
78
+ click_button "Save"
79
+ end
80
+
81
+ expect(page).to have_admin_callout("successfully")
82
+
83
+ component.update!(
84
+ step_settings: {
85
+ component.participatory_space.active_step.id => {
86
+ allow_answers: true
87
+ }
88
+ }
89
+ )
90
+
91
+ visit questionnaire_public_path
92
+
93
+ expect(page).to have_selector("strong", text: "Superkalifragilistic description")
94
+ end
95
+
65
96
  it "adds a question with answer options" do
66
97
  question_body = ["This is the first question", "This is the second question"]
67
98
  answer_options_body = [
@@ -118,6 +118,104 @@ shared_examples_for "update questions" do
118
118
  end
119
119
  end
120
120
 
121
+ context "when a questionnaire has a title and description" do
122
+ let!(:question) { create(:questionnaire_question, :title_and_description, questionnaire: questionnaire, body: title_and_description_body) }
123
+
124
+ before do
125
+ visit questionnaire_edit_path
126
+ expand_all_questions
127
+ end
128
+
129
+ it "modifies the question when the information is valid" do
130
+ within "form.edit_questionnaire" do
131
+ within ".questionnaire-question" do
132
+ fill_in "questionnaire_questions_#{question.id}_body_en", with: "Modified title and description"
133
+ end
134
+
135
+ click_button "Save"
136
+ end
137
+
138
+ expect(page).to have_admin_callout("successfully")
139
+
140
+ visit_questionnaire_edit_path_and_expand_all
141
+
142
+ expect(page).to have_selector("input[value='Modified title and description']")
143
+ expect(page).to have_no_selector("input[value='This is the first title and description']")
144
+ end
145
+
146
+ it "re-renders the form when the information is invalid and displays errors" do
147
+ expand_all_questions
148
+
149
+ within "form.edit_questionnaire" do
150
+ within ".questionnaire-question" do
151
+ fill_in "questionnaire_questions_#{question.id}_body_en", with: ""
152
+ end
153
+
154
+ click_button "Save"
155
+ end
156
+
157
+ expand_all_questions
158
+
159
+ expect(page).to have_admin_callout("There was a problem saving")
160
+ expect(page).to have_content("can't be blank", count: 1)
161
+ expect(page).to have_selector("input[value='']")
162
+ expect(page).to have_no_selector("input[value='This is the first title and description']")
163
+ end
164
+
165
+ it "preserves deleted status across submission failures" do
166
+ within "form.edit_questionnaire" do
167
+ within ".questionnaire-question" do
168
+ click_button "Remove"
169
+ end
170
+ end
171
+
172
+ click_button "Add question"
173
+
174
+ click_button "Save"
175
+
176
+ expect(page).to have_selector(".questionnaire-question", count: 1)
177
+
178
+ within ".questionnaire-question" do
179
+ expect(page).to have_selector(".card-title", text: "#1")
180
+ expect(page).to have_no_button("Up")
181
+ end
182
+ end
183
+
184
+ it "removes the question" do
185
+ within "form.edit_questionnaire" do
186
+ within ".questionnaire-question" do
187
+ click_button "Remove"
188
+ end
189
+
190
+ click_button "Save"
191
+ end
192
+
193
+ expect(page).to have_admin_callout("successfully")
194
+
195
+ visit questionnaire_edit_path
196
+
197
+ within "form.edit_questionnaire" do
198
+ expect(page).to have_selector(".questionnaire-question", count: 0)
199
+ end
200
+ end
201
+
202
+ it "cannot be moved up" do
203
+ within "form.edit_questionnaire" do
204
+ within ".questionnaire-question" do
205
+ expect(page).to have_no_button("Up")
206
+ end
207
+ end
208
+ end
209
+
210
+ it "cannot be moved down" do
211
+ within "form.edit_questionnaire" do
212
+ within ".questionnaire-question" do
213
+ expect(page).to have_no_button("Down")
214
+ end
215
+ end
216
+ end
217
+ end
218
+
121
219
  context "when a questionnaire has an existing question with answer options" do
122
220
  let!(:question) do
123
221
  create(
@@ -16,6 +16,14 @@ shared_examples_for "manage questionnaires" do
16
16
  }
17
17
  end
18
18
 
19
+ let(:title_and_description_body) do
20
+ {
21
+ en: "Este es el primer separador de texto",
22
+ ca: "Aquest és el primer separador de text",
23
+ es: "Esta es la primera pregunta"
24
+ }
25
+ end
26
+
19
27
  it "updates the questionnaire" do
20
28
  visit questionnaire_edit_path
21
29
 
@@ -73,7 +73,7 @@ module Decidim
73
73
  normalize_matrix_choices(answer, choices)
74
74
  else
75
75
  choices.map do |choice|
76
- choice.try(:custom_body) || choice.try(:body)
76
+ format_free_text_for choice
77
77
  end
78
78
  end
79
79
  end
@@ -94,6 +94,12 @@ module Decidim
94
94
  def answer_translated_attribute_name(attribute)
95
95
  I18n.t(attribute.to_sym, scope: "decidim.forms.user_answers_serializer")
96
96
  end
97
+
98
+ def format_free_text_for(choice)
99
+ return choice.try(:body) if choice.try(:custom_body).blank?
100
+
101
+ "#{choice.try(:body)} (#{choice.try(:custom_body)})"
102
+ end
97
103
  end
98
104
  end
99
105
  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.25.1"
7
+ "0.26.0"
8
8
  end
9
9
  end
10
10
  end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: decidim-forms
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.25.1
4
+ version: 0.26.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josep Jaume Rey Peroy
8
8
  - Marc Riera Casals
9
9
  - Oriol Gual Oliva
10
10
  - Rubén González Valero
11
- autorequire:
11
+ autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2021-11-02 00:00:00.000000000 Z
14
+ date: 2022-02-22 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: decidim-core
@@ -19,14 +19,14 @@ dependencies:
19
19
  requirements:
20
20
  - - '='
21
21
  - !ruby/object:Gem::Version
22
- version: 0.25.1
22
+ version: 0.26.0
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.25.1
29
+ version: 0.26.0
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: wicked_pdf
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -61,28 +61,28 @@ dependencies:
61
61
  requirements:
62
62
  - - '='
63
63
  - !ruby/object:Gem::Version
64
- version: 0.25.1
64
+ version: 0.26.0
65
65
  type: :development
66
66
  prerelease: false
67
67
  version_requirements: !ruby/object:Gem::Requirement
68
68
  requirements:
69
69
  - - '='
70
70
  - !ruby/object:Gem::Version
71
- version: 0.25.1
71
+ version: 0.26.0
72
72
  - !ruby/object:Gem::Dependency
73
73
  name: decidim-dev
74
74
  requirement: !ruby/object:Gem::Requirement
75
75
  requirements:
76
76
  - - '='
77
77
  - !ruby/object:Gem::Version
78
- version: 0.25.1
78
+ version: 0.26.0
79
79
  type: :development
80
80
  prerelease: false
81
81
  version_requirements: !ruby/object:Gem::Requirement
82
82
  requirements:
83
83
  - - '='
84
84
  - !ruby/object:Gem::Version
85
- version: 0.25.1
85
+ version: 0.26.0
86
86
  description: A forms gem for decidim.
87
87
  email:
88
88
  - josepjaume@gmail.com
@@ -165,6 +165,7 @@ files:
165
165
  - app/views/decidim/forms/admin/questionnaires/_matrix_row_template.html.erb
166
166
  - app/views/decidim/forms/admin/questionnaires/_question.html.erb
167
167
  - app/views/decidim/forms/admin/questionnaires/_separator.html.erb
168
+ - app/views/decidim/forms/admin/questionnaires/_title_and_description.html.erb
168
169
  - app/views/decidim/forms/admin/questionnaires/answers/export/_answer.html.erb
169
170
  - app/views/decidim/forms/admin/questionnaires/answers/export/pdf.html.erb
170
171
  - app/views/decidim/forms/admin/questionnaires/answers/index.html.erb
@@ -180,6 +181,7 @@ files:
180
181
  - app/views/decidim/forms/questionnaires/answers/_short_answer.html.erb
181
182
  - app/views/decidim/forms/questionnaires/answers/_single_option.html.erb
182
183
  - app/views/decidim/forms/questionnaires/answers/_sorting.html.erb
184
+ - app/views/decidim/forms/questionnaires/answers/_title_and_description.html.erb
183
185
  - app/views/decidim/forms/questionnaires/show.html.erb
184
186
  - app/views/layouts/decidim/forms/admin/questionnaires/questionnaire_answers.html.erb
185
187
  - config/assets.rb
@@ -250,6 +252,7 @@ files:
250
252
  - config/locales/ti-ER.yml
251
253
  - config/locales/tr-TR.yml
252
254
  - config/locales/uk.yml
255
+ - config/locales/val-ES.yml
253
256
  - config/locales/vi-VN.yml
254
257
  - config/locales/vi.yml
255
258
  - config/locales/zh-CN.yml
@@ -294,7 +297,7 @@ homepage: https://github.com/decidim/decidim
294
297
  licenses:
295
298
  - AGPL-3.0
296
299
  metadata: {}
297
- post_install_message:
300
+ post_install_message:
298
301
  rdoc_options: []
299
302
  require_paths:
300
303
  - lib
@@ -309,8 +312,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
309
312
  - !ruby/object:Gem::Version
310
313
  version: '0'
311
314
  requirements: []
312
- rubygems_version: 3.1.2
313
- signing_key:
315
+ rubygems_version: 3.1.6
316
+ signing_key:
314
317
  specification_version: 4
315
318
  summary: Decidim forms
316
319
  test_files: []