decidim-forms 0.27.4 → 0.28.0.rc5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/app/cells/decidim/forms/answer_readonly/show.erb +1 -1
  4. data/app/cells/decidim/forms/matrix_readonly/show.erb +1 -1
  5. data/app/cells/decidim/forms/question_readonly/show.erb +7 -7
  6. data/app/cells/decidim/forms/question_readonly/title_and_description.erb +8 -0
  7. data/app/cells/decidim/forms/question_readonly_cell.rb +7 -0
  8. data/app/cells/decidim/forms/step_navigation/show.erb +13 -26
  9. data/app/cells/decidim/forms/step_navigation_cell.rb +7 -0
  10. data/app/commands/decidim/forms/answer_questionnaire.rb +31 -11
  11. data/app/controllers/decidim/forms/admin/concerns/has_questionnaire.rb +3 -3
  12. data/app/controllers/decidim/forms/admin/concerns/has_questionnaire_answers.rb +1 -1
  13. data/app/controllers/decidim/forms/concerns/has_questionnaire.rb +3 -3
  14. data/app/forms/decidim/forms/answer_form.rb +7 -3
  15. data/app/forms/decidim/forms/questionnaire_form.rb +1 -1
  16. data/app/helpers/decidim/forms/admin/application_helper.rb +1 -1
  17. data/app/helpers/decidim/forms/admin/concerns/has_questionnaire_answers_url_helper.rb +2 -2
  18. data/app/models/decidim/forms/answer.rb +1 -1
  19. data/app/models/decidim/forms/display_condition.rb +2 -2
  20. data/app/models/decidim/forms/question.rb +0 -4
  21. data/app/models/decidim/forms/questionnaire.rb +1 -1
  22. data/app/packs/entrypoints/decidim_forms.js +4 -0
  23. data/app/packs/src/decidim/forms/admin/collapsible_questions.js +12 -6
  24. data/app/packs/src/decidim/forms/admin/forms.js +7 -7
  25. data/app/packs/src/decidim/forms/display_conditions.component.js +3 -3
  26. data/app/packs/src/decidim/forms/forms.js +15 -9
  27. data/app/packs/src/decidim/forms/option_attached_inputs.component.js +1 -1
  28. data/app/packs/stylesheets/decidim/forms/forms.scss +82 -52
  29. data/app/packs/stylesheets/decidim/forms/questionnaire-answers-pdf.scss +13 -13
  30. data/app/presenters/decidim/forms/admin/questionnaire_participant_presenter.rb +2 -2
  31. data/app/presenters/decidim/forms/admin_log/questionnaire_presenter.rb +2 -2
  32. data/app/presenters/decidim/forms/answer_option_presenter.rb +1 -1
  33. data/app/queries/decidim/forms/questionnaire_participants.rb +1 -1
  34. data/app/views/decidim/forms/admin/questionnaires/_answer_option.html.erb +2 -1
  35. data/app/views/decidim/forms/admin/questionnaires/_answer_option_template.html.erb +1 -1
  36. data/app/views/decidim/forms/admin/questionnaires/_display_condition.html.erb +3 -2
  37. data/app/views/decidim/forms/admin/questionnaires/_display_condition_template.html.erb +1 -1
  38. data/app/views/decidim/forms/admin/questionnaires/_form.html.erb +52 -74
  39. data/app/views/decidim/forms/admin/questionnaires/_matrix_row.html.erb +2 -1
  40. data/app/views/decidim/forms/admin/questionnaires/_matrix_row_template.html.erb +1 -1
  41. data/app/views/decidim/forms/admin/questionnaires/_question.html.erb +147 -135
  42. data/app/views/decidim/forms/admin/questionnaires/_separator.html.erb +15 -13
  43. data/app/views/decidim/forms/admin/questionnaires/_title_and_description.html.erb +69 -63
  44. data/app/views/decidim/forms/admin/questionnaires/answers/export/_answer.html.erb +4 -4
  45. data/app/views/decidim/forms/admin/questionnaires/answers/export/pdf.html.erb +1 -1
  46. data/app/views/decidim/forms/admin/questionnaires/answers/index.html.erb +41 -45
  47. data/app/views/decidim/forms/admin/questionnaires/answers/show.html.erb +13 -18
  48. data/app/views/decidim/forms/admin/questionnaires/edit.html.erb +33 -6
  49. data/app/views/decidim/forms/questionnaires/_answer.html.erb +31 -27
  50. data/app/views/decidim/forms/questionnaires/_questionnaire.html.erb +78 -0
  51. data/app/views/decidim/forms/questionnaires/_questionnaire_readonly.html.erb +11 -0
  52. data/app/views/decidim/forms/questionnaires/answers/_files.html.erb +1 -1
  53. data/app/views/decidim/forms/questionnaires/answers/_long_answer.html.erb +3 -1
  54. data/app/views/decidim/forms/questionnaires/answers/_matrix_multiple.html.erb +44 -41
  55. data/app/views/decidim/forms/questionnaires/answers/_matrix_single.html.erb +44 -41
  56. data/app/views/decidim/forms/questionnaires/answers/_multiple_option.html.erb +7 -6
  57. data/app/views/decidim/forms/questionnaires/answers/_separator.html.erb +1 -1
  58. data/app/views/decidim/forms/questionnaires/answers/_short_answer.html.erb +3 -1
  59. data/app/views/decidim/forms/questionnaires/answers/_single_option.html.erb +13 -12
  60. data/app/views/decidim/forms/questionnaires/answers/_sorting.html.erb +9 -12
  61. data/app/views/decidim/forms/questionnaires/answers/_title_and_description.html.erb +1 -1
  62. data/app/views/decidim/forms/questionnaires/show.html.erb +35 -144
  63. data/config/environment.rb +3 -0
  64. data/config/initializers/wicked_pdf.rb +1 -1
  65. data/config/locales/ar.yml +0 -6
  66. data/config/locales/ca.yml +7 -2
  67. data/config/locales/cs.yml +8 -3
  68. data/config/locales/de.yml +9 -4
  69. data/config/locales/el.yml +7 -2
  70. data/config/locales/en.yml +8 -3
  71. data/config/locales/es-MX.yml +7 -2
  72. data/config/locales/es-PY.yml +7 -2
  73. data/config/locales/es.yml +7 -2
  74. data/config/locales/eu.yml +22 -17
  75. data/config/locales/fi-plain.yml +7 -2
  76. data/config/locales/fi.yml +7 -2
  77. data/config/locales/fr-CA.yml +8 -3
  78. data/config/locales/fr.yml +8 -3
  79. data/config/locales/gl.yml +0 -4
  80. data/config/locales/hu.yml +1 -6
  81. data/config/locales/id-ID.yml +0 -4
  82. data/config/locales/it.yml +0 -6
  83. data/config/locales/ja.yml +6 -1
  84. data/config/locales/lb.yml +0 -6
  85. data/config/locales/lt.yml +9 -2
  86. data/config/locales/lv.yml +0 -6
  87. data/config/locales/nl.yml +0 -6
  88. data/config/locales/no.yml +0 -6
  89. data/config/locales/pl.yml +18 -2
  90. data/config/locales/pt-BR.yml +0 -6
  91. data/config/locales/pt.yml +0 -6
  92. data/config/locales/ro-RO.yml +7 -2
  93. data/config/locales/ru.yml +0 -3
  94. data/config/locales/sk.yml +0 -6
  95. data/config/locales/sq-AL.yml +1 -0
  96. data/config/locales/sv.yml +3 -6
  97. data/config/locales/th-TH.yml +1 -0
  98. data/config/locales/tr-TR.yml +0 -6
  99. data/config/locales/zh-CN.yml +0 -6
  100. data/config/locales/zh-TW.yml +7 -2
  101. data/lib/decidim/forms/engine.rb +8 -0
  102. data/lib/decidim/forms/test/factories.rb +6 -6
  103. data/lib/decidim/forms/test/shared_examples/has_questionnaire.rb +127 -237
  104. data/lib/decidim/forms/test/shared_examples/manage_questionnaire_answers.rb +18 -18
  105. data/lib/decidim/forms/test/shared_examples/manage_questionnaires/add_display_conditions.rb +14 -14
  106. data/lib/decidim/forms/test/shared_examples/manage_questionnaires/add_questions.rb +60 -78
  107. data/lib/decidim/forms/test/shared_examples/manage_questionnaires/update_display_conditions.rb +6 -6
  108. data/lib/decidim/forms/test/shared_examples/manage_questionnaires/update_questions.rb +25 -25
  109. data/lib/decidim/forms/test/shared_examples/manage_questionnaires.rb +9 -9
  110. data/lib/decidim/forms/user_answers_serializer.rb +2 -2
  111. data/lib/decidim/forms/version.rb +1 -1
  112. metadata +24 -15
  113. data/app/packs/src/decidim/forms/autosortable_checkboxes.component.js +0 -83
@@ -5,13 +5,13 @@ require "spec_helper"
5
5
  shared_examples_for "manage questionnaire answers" do
6
6
  let(:first_type) { "short_answer" }
7
7
  let!(:first) do
8
- create :questionnaire_question, questionnaire: questionnaire, position: 1, question_type: first_type
8
+ create :questionnaire_question, questionnaire:, position: 1, question_type: first_type
9
9
  end
10
10
  let!(:second) do
11
- create :questionnaire_question, questionnaire: questionnaire, position: 2, question_type: "single_option"
11
+ create :questionnaire_question, questionnaire:, position: 2, question_type: "single_option"
12
12
  end
13
13
  let!(:third) do
14
- create :questionnaire_question, questionnaire: questionnaire, position: 3, question_type: "files"
14
+ create :questionnaire_question, questionnaire:, position: 3, question_type: "files"
15
15
  end
16
16
  let(:questions) do
17
17
  [first, second, third]
@@ -25,10 +25,10 @@ shared_examples_for "manage questionnaire answers" do
25
25
  end
26
26
 
27
27
  context "when there are answers" do
28
- let!(:answer1) { create :answer, questionnaire: questionnaire, question: first }
29
- let!(:answer2) { create :answer, body: "second answer", questionnaire: questionnaire, question: first }
30
- let!(:answer3) { create :answer, questionnaire: questionnaire, question: second }
31
- let!(:file_answer) { create :answer, :with_attachments, questionnaire: questionnaire, question: third, body: nil, user: answer3.user, session_token: answer3.session_token }
28
+ let!(:answer1) { create :answer, questionnaire:, question: first }
29
+ let!(:answer2) { create :answer, body: "second answer", questionnaire:, question: first }
30
+ let!(:answer3) { create :answer, questionnaire:, question: second }
31
+ let!(:file_answer) { create :answer, :with_attachments, questionnaire:, question: third, body: nil, user: answer3.user, session_token: answer3.session_token }
32
32
 
33
33
  it "shows the answer admin link" do
34
34
  visit questionnaire_edit_path
@@ -76,25 +76,25 @@ shared_examples_for "manage questionnaire answers" do
76
76
 
77
77
  context "when multiple answer choice" do
78
78
  let(:first_type) { "multiple_option" }
79
- let!(:answer1) { create :answer, questionnaire: questionnaire, question: first, body: nil }
79
+ let!(:answer1) { create :answer, questionnaire:, question: first, body: nil }
80
80
  let!(:answer_option) { create :answer_option, question: first }
81
- let!(:answer_choice) { create :answer_choice, answer: answer1, answer_option: answer_option, body: translated(answer_option.body, locale: I18n.locale) }
82
-
83
- before do
84
- find_all("a.action-icon.action-icon--eye").first.click
85
- end
81
+ let!(:answer_choice) { create :answer_choice, answer: answer1, answer_option:, body: translated(answer_option.body, locale: I18n.locale) }
86
82
 
87
83
  it "shows the answers page with custom body" do
88
- within "#answers" do
89
- expect(page).to have_css("dt", text: translated(first.body))
90
- expect(page).to have_css("li", text: translated(answer_option.body))
84
+ new_window = window_opened_by { find_all("a.action-icon.action-icon--eye").first.click }
85
+
86
+ page.within_window(new_window) do
87
+ within "#answers" do
88
+ expect(page).to have_css("dt", text: translated(first.body))
89
+ expect(page).to have_css("li", text: translated(answer_option.body))
90
+ end
91
91
  end
92
92
  end
93
93
  end
94
94
  end
95
95
 
96
96
  context "and managing individual answer page" do
97
- let!(:answer11) { create :answer, questionnaire: questionnaire, body: "", user: answer1.user, question: second }
97
+ let!(:answer11) { create :answer, questionnaire:, body: "", user: answer1.user, question: second }
98
98
 
99
99
  before do
100
100
  visit questionnaire_edit_path
@@ -133,7 +133,7 @@ shared_examples_for "manage questionnaire answers" do
133
133
  end
134
134
 
135
135
  context "when the file answer does not have a title for the attachment" do
136
- let!(:file_answer) { create :answer, questionnaire: questionnaire, question: third, body: nil, user: answer3.user, session_token: answer3.session_token }
136
+ let!(:file_answer) { create :answer, questionnaire:, question: third, body: nil, user: answer3.user, session_token: answer3.session_token }
137
137
 
138
138
  before do
139
139
  create :attachment, :with_image, attached_to: file_answer, title: {}, description: {}
@@ -14,18 +14,18 @@ shared_examples_for "add display conditions" do
14
14
  end
15
15
 
16
16
  context "when questionnaire has only one question" do
17
- let!(:question) { create(:questionnaire_question, questionnaire: questionnaire, body: body, question_type: "short_answer") }
17
+ let!(:question) { create(:questionnaire_question, questionnaire:, body:, question_type: "short_answer") }
18
18
 
19
19
  before do
20
20
  visit_questionnaire_edit_path_and_expand_all
21
21
  end
22
22
 
23
- it "doesn't display an add display condition button" do
24
- expect(page).to have_no_button("Add display condition")
23
+ it "does not display an add display condition button" do
24
+ expect(page).not_to have_button("Add display condition")
25
25
  end
26
26
 
27
27
  context "when creating a new question" do
28
- it "disables the add display condition button if the question hasn't been saved" do
28
+ it "disables the add display condition button if the question has not been saved" do
29
29
  within "form.edit_questionnaire" do
30
30
  click_button "Add question"
31
31
  expand_all_questions
@@ -40,21 +40,21 @@ shared_examples_for "add display conditions" do
40
40
  let!(:question_short_answer) do
41
41
  create(:questionnaire_question,
42
42
  position: 0,
43
- questionnaire: questionnaire,
43
+ questionnaire:,
44
44
  body: Decidim::Faker::Localized.sentence,
45
45
  question_type: "short_answer")
46
46
  end
47
47
  let!(:question_long_answer) do
48
48
  create(:questionnaire_question,
49
49
  position: 1,
50
- questionnaire: questionnaire,
50
+ questionnaire:,
51
51
  body: Decidim::Faker::Localized.sentence,
52
52
  question_type: "long_answer")
53
53
  end
54
54
  let!(:question_single_option) do
55
55
  create(:questionnaire_question,
56
56
  position: 2,
57
- questionnaire: questionnaire,
57
+ questionnaire:,
58
58
  body: Decidim::Faker::Localized.sentence,
59
59
  question_type: "single_option",
60
60
  options: answer_options)
@@ -62,7 +62,7 @@ shared_examples_for "add display conditions" do
62
62
  let!(:question_multiple_option) do
63
63
  create(:questionnaire_question,
64
64
  position: 3,
65
- questionnaire: questionnaire,
65
+ questionnaire:,
66
66
  body: Decidim::Faker::Localized.sentence,
67
67
  question_type: "multiple_option",
68
68
  options: answer_options)
@@ -85,14 +85,14 @@ shared_examples_for "add display conditions" do
85
85
  select question_single_option.body["en"], from: "Question"
86
86
  select "Answered", from: "Condition"
87
87
 
88
- expect(page).to have_no_select("Answer option")
89
- expect(page).to have_no_css("[id$=condition_value_en]", visible: :visible)
88
+ expect(page).not_to have_select("Answer option")
89
+ expect(page).not_to have_css("[id$=condition_value_en]", visible: :visible)
90
90
 
91
91
  select question_single_option.body["en"], from: "Question"
92
92
  select "Equal", from: "Condition"
93
93
 
94
94
  expect(page).to have_select("Answer option")
95
- expect(page).to have_no_css("[id$=condition_value_en]", visible: :visible)
95
+ expect(page).not_to have_css("[id$=condition_value_en]", visible: :visible)
96
96
  end
97
97
  end
98
98
  end
@@ -101,7 +101,7 @@ shared_examples_for "add display conditions" do
101
101
  within_add_display_condition do
102
102
  options = questions.map { |question| question["body"]["en"] }
103
103
  options << "Select a question"
104
- expect(page).to have_select("Question", options: options)
104
+ expect(page).to have_select("Question", options:)
105
105
 
106
106
  within "select[id$=decidim_condition_question_id]" do
107
107
  elements = page.all("option[data-type]")
@@ -149,7 +149,7 @@ shared_examples_for "add display conditions" do
149
149
  options = answer_options.map { |option| option["body"]["en"] }
150
150
  options << "Select answer option"
151
151
 
152
- expect(page).to have_select("Answer option", options: options, wait: 5)
152
+ expect(page).to have_select("Answer option", options:, wait: 5)
153
153
  end
154
154
  end
155
155
 
@@ -164,7 +164,7 @@ shared_examples_for "add display conditions" do
164
164
  it "loads a mandatory field with false value" do
165
165
  within_add_display_condition do
166
166
  expect(page).to have_selector("[id$=mandatory]")
167
- expect(page).to have_no_selector("[id$=mandatory][checked]")
167
+ expect(page).not_to have_selector("[id$=mandatory][checked]")
168
168
  end
169
169
  end
170
170
 
@@ -3,6 +3,38 @@
3
3
  require "spec_helper"
4
4
 
5
5
  shared_examples_for "add questions" do
6
+ shared_examples_for "updating the max choices selector according to the configured options" do
7
+ it "updates them" do
8
+ expect(page).not_to have_select("Maximum number of choices")
9
+
10
+ select "Multiple option", from: "Type"
11
+ expect(page).to have_select("Maximum number of choices", options: %w(Any 2))
12
+
13
+ click_button "Add answer option"
14
+ expect(page).to have_select("Maximum number of choices", options: %w(Any 2 3))
15
+
16
+ click_button "Add answer option"
17
+ expect(page).to have_select("Maximum number of choices", options: %w(Any 2 3 4))
18
+
19
+ within(".questionnaire-question-answer-option:last-of-type") { click_button "Remove" }
20
+ expect(page).to have_select("Maximum number of choices", options: %w(Any 2 3))
21
+
22
+ within(".questionnaire-question-answer-option:last-of-type") { click_button "Remove" }
23
+ expect(page).to have_select("Maximum number of choices", options: %w(Any 2))
24
+
25
+ click_button "Add question"
26
+ expand_all_questions
27
+
28
+ within(".questionnaire-question:last-of-type") do
29
+ select multiple_option_string, from: "Type"
30
+ expect(page).to have_select("Maximum number of choices", options: %w(Any 2))
31
+
32
+ select single_option_string, from: "Type"
33
+ expect(page).not_to have_select("Maximum number of choices")
34
+ end
35
+ end
36
+ end
37
+
6
38
  it "adds a few questions and separators to the questionnaire" do
7
39
  fields_body = ["This is the first question", "This is the second question", "This is the first title and description"]
8
40
 
@@ -43,7 +75,7 @@ shared_examples_for "add questions" do
43
75
  within ".questionnaire-question" do
44
76
  fill_in find_nested_form_field_locator("body_en"), with: "Body"
45
77
 
46
- fill_in_editor find_nested_form_field_locator("description_en", visible: false), with: "<strong>Superkalifragilistic description</strong>"
78
+ fill_in_editor find_nested_form_field_locator("description_en", visible: false), with: "<p>\n<strong>Superkalifragilistic description</strong>\n</p>"
47
79
  end
48
80
 
49
81
  click_button "Save"
@@ -72,7 +104,7 @@ shared_examples_for "add questions" do
72
104
  within ".questionnaire-question" do
73
105
  fill_in find_nested_form_field_locator("body_en"), with: "Body"
74
106
 
75
- fill_in_editor find_nested_form_field_locator("description_en", visible: false), with: "<strong>Superkalifragilistic description</strong>"
107
+ fill_in_editor find_nested_form_field_locator("description_en", visible: false), with: "<p>\n<strong>Superkalifragilistic description</strong>\n</p>"
76
108
  end
77
109
 
78
110
  click_button "Save"
@@ -119,7 +151,7 @@ shared_examples_for "add questions" do
119
151
  end
120
152
  end
121
153
 
122
- expect(page).to have_no_content "Add answer option"
154
+ expect(page).not_to have_content "Add answer option"
123
155
 
124
156
  page.all(".questionnaire-question").each do |question|
125
157
  within question do
@@ -158,24 +190,24 @@ shared_examples_for "add questions" do
158
190
  expand_all_questions
159
191
 
160
192
  select "Long answer", from: "Type"
161
- expect(page).to have_no_selector(".questionnaire-question-answer-option")
162
- expect(page).to have_no_selector(".questionnaire-question-matrix-row")
193
+ expect(page).not_to have_selector(".questionnaire-question-answer-option")
194
+ expect(page).not_to have_selector(".questionnaire-question-matrix-row")
163
195
 
164
196
  select "Single option", from: "Type"
165
197
  expect(page).to have_selector(".questionnaire-question-answer-option", count: 2)
166
- expect(page).to have_no_selector(".questionnaire-question-matrix-row")
198
+ expect(page).not_to have_selector(".questionnaire-question-matrix-row")
167
199
 
168
200
  select "Multiple option", from: "Type"
169
201
  expect(page).to have_selector(".questionnaire-question-answer-option", count: 2)
170
- expect(page).to have_no_selector(".questionnaire-question-matrix-row")
202
+ expect(page).not_to have_selector(".questionnaire-question-matrix-row")
171
203
 
172
204
  select "Matrix (Multiple option)", from: "Type"
173
205
  expect(page).to have_selector(".questionnaire-question-answer-option", count: 2)
174
206
  expect(page).to have_selector(".questionnaire-question-matrix-row", count: 2)
175
207
 
176
208
  select "Short answer", from: "Type"
177
- expect(page).to have_no_selector(".questionnaire-question-answer-option")
178
- expect(page).to have_no_selector(".questionnaire-question-matrix-row")
209
+ expect(page).not_to have_selector(".questionnaire-question-answer-option")
210
+ expect(page).not_to have_selector(".questionnaire-question-matrix-row")
179
211
 
180
212
  select "Matrix (Single option)", from: "Type"
181
213
  expect(page).to have_selector(".questionnaire-question-answer-option", count: 2)
@@ -363,12 +395,15 @@ shared_examples_for "add questions" do
363
395
  click_link "English", match: :first
364
396
 
365
397
  expect(page).to have_nested_field("body_en", with: "Bye")
366
- expect(page).to have_no_selector(nested_form_field_selector("body_ca"))
367
- expect(page).to have_no_content("Adeu")
398
+ expect(page).not_to have_selector(nested_form_field_selector("body_ca"))
399
+ expect(page).not_to have_content("Adeu")
368
400
  end
369
401
  end
370
402
 
371
403
  context "when adding a multiple option question" do
404
+ let(:multiple_option_string) { "Multiple option" }
405
+ let(:single_option_string) { "Single option" }
406
+
372
407
  before do
373
408
  visit questionnaire_edit_path
374
409
 
@@ -381,56 +416,31 @@ shared_examples_for "add questions" do
381
416
  fill_in find_nested_form_field_locator("body_en"), with: "This is the first question"
382
417
  end
383
418
 
384
- expect(page).to have_no_content "Add answer option"
385
- expect(page).to have_no_select("Maximum number of choices")
419
+ expect(page).not_to have_content "Add answer option"
420
+ expect(page).not_to have_select("Maximum number of choices")
386
421
  end
387
422
  end
388
423
 
389
424
  it "updates the free text option selector according to the selected question type" do
390
- expect(page).to have_no_selector("input[type=checkbox][id$=_free_text]")
425
+ expect(page).not_to have_selector("input[type=checkbox][id$=_free_text]")
391
426
 
392
427
  select "Multiple option", from: "Type"
393
428
  expect(page).to have_selector("input[type=checkbox][id$=_free_text]")
394
429
 
395
430
  select "Short answer", from: "Type"
396
- expect(page).to have_no_selector("input[type=checkbox][id$=_free_text]")
431
+ expect(page).not_to have_selector("input[type=checkbox][id$=_free_text]")
397
432
 
398
433
  select "Single option", from: "Type"
399
434
  expect(page).to have_selector("input[type=checkbox][id$=_free_text]")
400
435
  end
401
436
 
402
- it "updates the max choices selector according to the configured options" do
403
- expect(page).to have_no_select("Maximum number of choices")
404
-
405
- select "Multiple option", from: "Type"
406
- expect(page).to have_select("Maximum number of choices", options: %w(Any 2))
407
-
408
- click_button "Add answer option"
409
- expect(page).to have_select("Maximum number of choices", options: %w(Any 2 3))
410
-
411
- click_button "Add answer option"
412
- expect(page).to have_select("Maximum number of choices", options: %w(Any 2 3 4))
413
-
414
- within(".questionnaire-question-answer-option:last-of-type") { click_button "Remove" }
415
- expect(page).to have_select("Maximum number of choices", options: %w(Any 2 3))
416
-
417
- within(".questionnaire-question-answer-option:last-of-type") { click_button "Remove" }
418
- expect(page).to have_select("Maximum number of choices", options: %w(Any 2))
419
-
420
- click_button "Add question"
421
- expand_all_questions
422
-
423
- within(".questionnaire-question:last-of-type") do
424
- select "Multiple option", from: "Type"
425
- expect(page).to have_select("Maximum number of choices", options: %w(Any 2))
426
-
427
- select "Single option", from: "Type"
428
- expect(page).to have_no_select("Maximum number of choices")
429
- end
430
- end
437
+ it_behaves_like "updating the max choices selector according to the configured options"
431
438
  end
432
439
 
433
440
  context "when adding a matrix question" do
441
+ let(:multiple_option_string) { "Matrix (Multiple option)" }
442
+ let(:single_option_string) { "Matrix (Single option)" }
443
+
434
444
  before do
435
445
  visit questionnaire_edit_path
436
446
 
@@ -442,53 +452,25 @@ shared_examples_for "add questions" do
442
452
  fill_in find_nested_form_field_locator("body_en"), with: "This is the first question"
443
453
  end
444
454
 
445
- expect(page).to have_no_content "Add answer option"
446
- expect(page).to have_no_content "Add row"
447
- expect(page).to have_no_select("Maximum number of choices")
455
+ expect(page).not_to have_content "Add answer option"
456
+ expect(page).not_to have_content "Add row"
457
+ expect(page).not_to have_select("Maximum number of choices")
448
458
  end
449
459
  end
450
460
 
451
461
  it "updates the free text option selector according to the selected question type" do
452
- expect(page).to have_no_selector("input[type=checkbox][id$=_free_text]")
462
+ expect(page).not_to have_selector("input[type=checkbox][id$=_free_text]")
453
463
 
454
464
  select "Matrix (Multiple option)", from: "Type"
455
465
  expect(page).to have_selector("input[type=checkbox][id$=_free_text]")
456
466
 
457
467
  select "Short answer", from: "Type"
458
- expect(page).to have_no_selector("input[type=checkbox][id$=_free_text]")
468
+ expect(page).not_to have_selector("input[type=checkbox][id$=_free_text]")
459
469
 
460
470
  select "Matrix (Single option)", from: "Type"
461
471
  expect(page).to have_selector("input[type=checkbox][id$=_free_text]")
462
472
  end
463
473
 
464
- it "updates the max choices selector according to the configured options" do
465
- expect(page).to have_no_select("Maximum number of choices")
466
-
467
- select "Matrix (Multiple option)", from: "Type"
468
- expect(page).to have_select("Maximum number of choices", options: %w(Any 2))
469
-
470
- click_button "Add answer option"
471
- expect(page).to have_select("Maximum number of choices", options: %w(Any 2 3))
472
-
473
- click_button "Add answer option"
474
- expect(page).to have_select("Maximum number of choices", options: %w(Any 2 3 4))
475
-
476
- within(".questionnaire-question-answer-option:last-of-type") { click_button "Remove" }
477
- expect(page).to have_select("Maximum number of choices", options: %w(Any 2 3))
478
-
479
- within(".questionnaire-question-answer-option:last-of-type") { click_button "Remove" }
480
- expect(page).to have_select("Maximum number of choices", options: %w(Any 2))
481
-
482
- click_button "Add question"
483
- expand_all_questions
484
-
485
- within(".questionnaire-question:last-of-type") do
486
- select "Matrix (Multiple option)", from: "Type"
487
- expect(page).to have_select("Maximum number of choices", options: %w(Any 2))
488
-
489
- select "Matrix (Single option)", from: "Type"
490
- expect(page).to have_no_select("Maximum number of choices")
491
- end
492
- end
474
+ it_behaves_like "updating the max choices selector according to the configured options"
493
475
  end
494
476
  end
@@ -5,17 +5,17 @@ require "spec_helper"
5
5
  shared_examples_for "update display conditions" do
6
6
  context "when loading a saved display condition" do
7
7
  let!(:condition_question_type) { "short_answer" }
8
- let!(:condition_question) { create(:questionnaire_question, questionnaire: questionnaire, question_type: condition_question_type, position: 1) }
9
- let!(:question) { create(:questionnaire_question, questionnaire: questionnaire, question_type: "short_answer", position: 2) }
8
+ let!(:condition_question) { create(:questionnaire_question, questionnaire:, question_type: condition_question_type, position: 1) }
9
+ let!(:question) { create(:questionnaire_question, questionnaire:, question_type: "short_answer", position: 2) }
10
10
  let!(:condition_type) { :answered }
11
11
  let!(:answer_option) { nil }
12
12
 
13
13
  let!(:display_condition) do
14
14
  create(:display_condition,
15
- question: question,
16
- condition_question: condition_question,
17
- condition_type: condition_type,
18
- answer_option: answer_option)
15
+ question:,
16
+ condition_question:,
17
+ condition_type:,
18
+ answer_option:)
19
19
  end
20
20
 
21
21
  before do
@@ -4,7 +4,7 @@ require "spec_helper"
4
4
 
5
5
  shared_examples_for "update questions" do
6
6
  context "when a questionnaire has an existing question" do
7
- let!(:question) { create(:questionnaire_question, questionnaire: questionnaire, body: body) }
7
+ let!(:question) { create(:questionnaire_question, questionnaire:, body:) }
8
8
 
9
9
  before do
10
10
  visit questionnaire_edit_path
@@ -28,7 +28,7 @@ shared_examples_for "update questions" do
28
28
  visit_questionnaire_edit_path_and_expand_all
29
29
 
30
30
  expect(page).to have_selector("input[value='Modified question']")
31
- expect(page).to have_no_selector("input[value='This is the first question']")
31
+ expect(page).not_to have_selector("input[value='This is the first question']")
32
32
  expect(page).to have_selector("input#questionnaire_questions_#{question.id}_mandatory[checked]")
33
33
  expect(page).to have_selector("input#questionnaire_questions_#{question.id}_max_characters[value='30']")
34
34
  expect(page).to have_selector("select#questionnaire_questions_#{question.id}_question_type option[value='long_answer'][selected]")
@@ -53,11 +53,11 @@ shared_examples_for "update questions" do
53
53
  expand_all_questions
54
54
 
55
55
  expect(page).to have_admin_callout("There was a problem saving")
56
- expect(page).to have_content("can't be blank", count: 5) # emtpy question, 2 empty default answer options, 2 empty default matrix rows
56
+ expect(page).to have_content("cannot be blank", count: 5) # emtpy question, 2 empty default answer options, 2 empty default matrix rows
57
57
  expect(page).to have_content("must be greater than or equal to 0", count: 1)
58
58
 
59
59
  expect(page).to have_selector("input[value='']")
60
- expect(page).to have_no_selector("input[value='This is the first question']")
60
+ expect(page).not_to have_selector("input[value='This is the first question']")
61
61
  expect(page).to have_selector("input#questionnaire_questions_#{question.id}_mandatory[checked]")
62
62
  expect(page).to have_selector("input#questionnaire_questions_#{question.id}_max_characters[value='-3']")
63
63
  expect(page).to have_select("Maximum number of choices", selected: "2")
@@ -79,7 +79,7 @@ shared_examples_for "update questions" do
79
79
 
80
80
  within ".questionnaire-question" do
81
81
  expect(page).to have_selector(".card-title", text: "#1")
82
- expect(page).to have_no_button("Up")
82
+ expect(page).not_to have_button("Up")
83
83
  end
84
84
  end
85
85
 
@@ -104,7 +104,7 @@ shared_examples_for "update questions" do
104
104
  it "cannot be moved up" do
105
105
  within "form.edit_questionnaire" do
106
106
  within ".questionnaire-question" do
107
- expect(page).to have_no_button("Up")
107
+ expect(page).not_to have_button("Up")
108
108
  end
109
109
  end
110
110
  end
@@ -112,14 +112,14 @@ shared_examples_for "update questions" do
112
112
  it "cannot be moved down" do
113
113
  within "form.edit_questionnaire" do
114
114
  within ".questionnaire-question" do
115
- expect(page).to have_no_button("Down")
115
+ expect(page).not_to have_button("Down")
116
116
  end
117
117
  end
118
118
  end
119
119
  end
120
120
 
121
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) }
122
+ let!(:question) { create(:questionnaire_question, :title_and_description, questionnaire:, body: title_and_description_body) }
123
123
 
124
124
  before do
125
125
  visit questionnaire_edit_path
@@ -140,7 +140,7 @@ shared_examples_for "update questions" do
140
140
  visit_questionnaire_edit_path_and_expand_all
141
141
 
142
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']")
143
+ expect(page).not_to have_selector("input[value='This is the first title and description']")
144
144
  end
145
145
 
146
146
  it "re-renders the form when the information is invalid and displays errors" do
@@ -157,9 +157,9 @@ shared_examples_for "update questions" do
157
157
  expand_all_questions
158
158
 
159
159
  expect(page).to have_admin_callout("There was a problem saving")
160
- expect(page).to have_content("can't be blank", count: 1)
160
+ expect(page).to have_content("cannot be blank", count: 1)
161
161
  expect(page).to have_selector("input[value='']")
162
- expect(page).to have_no_selector("input[value='This is the first title and description']")
162
+ expect(page).not_to have_selector("input[value='This is the first title and description']")
163
163
  end
164
164
 
165
165
  it "preserves deleted status across submission failures" do
@@ -177,7 +177,7 @@ shared_examples_for "update questions" do
177
177
 
178
178
  within ".questionnaire-question" do
179
179
  expect(page).to have_selector(".card-title", text: "#1")
180
- expect(page).to have_no_button("Up")
180
+ expect(page).not_to have_button("Up")
181
181
  end
182
182
  end
183
183
 
@@ -202,7 +202,7 @@ shared_examples_for "update questions" do
202
202
  it "cannot be moved up" do
203
203
  within "form.edit_questionnaire" do
204
204
  within ".questionnaire-question" do
205
- expect(page).to have_no_button("Up")
205
+ expect(page).not_to have_button("Up")
206
206
  end
207
207
  end
208
208
  end
@@ -210,7 +210,7 @@ shared_examples_for "update questions" do
210
210
  it "cannot be moved down" do
211
211
  within "form.edit_questionnaire" do
212
212
  within ".questionnaire-question" do
213
- expect(page).to have_no_button("Down")
213
+ expect(page).not_to have_button("Down")
214
214
  end
215
215
  end
216
216
  end
@@ -220,8 +220,8 @@ shared_examples_for "update questions" do
220
220
  let!(:question) do
221
221
  create(
222
222
  :questionnaire_question,
223
- questionnaire: questionnaire,
224
- body: body,
223
+ questionnaire:,
224
+ body:,
225
225
  question_type: "single_option",
226
226
  options: [
227
227
  { "body" => { "en" => "cacatua" } },
@@ -278,12 +278,12 @@ shared_examples_for "update questions" do
278
278
  end
279
279
 
280
280
  context "when a questionnaire has an existing question with matrix rows" do
281
- let!(:other_question) { create(:questionnaire_question, questionnaire: questionnaire, position: 1) }
281
+ let!(:other_question) { create(:questionnaire_question, questionnaire:, position: 1) }
282
282
  let!(:question) do
283
283
  create(
284
284
  :questionnaire_question,
285
- questionnaire: questionnaire,
286
- body: body,
285
+ questionnaire:,
286
+ body:,
287
287
  question_type: "matrix_single",
288
288
  position: 2,
289
289
  options: [
@@ -345,11 +345,11 @@ shared_examples_for "update questions" do
345
345
 
346
346
  context "when a questionnaire has multiple existing questions" do
347
347
  let!(:question1) do
348
- create(:questionnaire_question, questionnaire: questionnaire, body: first_body, position: 0)
348
+ create(:questionnaire_question, questionnaire:, body: first_body, position: 0)
349
349
  end
350
350
 
351
351
  let!(:question2) do
352
- create(:questionnaire_question, questionnaire: questionnaire, body: second_body, position: 1)
352
+ create(:questionnaire_question, questionnaire:, body: second_body, position: 1)
353
353
  end
354
354
 
355
355
  let(:first_body) do
@@ -510,7 +510,7 @@ shared_examples_for "update questions" do
510
510
  expect do
511
511
  click_button "Add question"
512
512
  expand_all_questions
513
- end.to change { page.all(".ql-toolbar").size }.by(1)
513
+ end.to change { page.all(".editor-toolbar").size }.by(1)
514
514
  end
515
515
 
516
516
  it "properly decides which button to show after adding/removing answer options" do
@@ -521,7 +521,7 @@ shared_examples_for "update questions" do
521
521
  select "Single option", from: "Type"
522
522
 
523
523
  within ".questionnaire-question-answer-options-list" do
524
- expect(page).to have_no_button("Remove")
524
+ expect(page).not_to have_button("Remove")
525
525
  end
526
526
 
527
527
  click_button "Add answer option"
@@ -533,7 +533,7 @@ shared_examples_for "update questions" do
533
533
  end
534
534
 
535
535
  within ".questionnaire-question-answer-options-list" do
536
- expect(page).to have_no_button("Remove")
536
+ expect(page).not_to have_button("Remove")
537
537
  end
538
538
  end
539
539
 
@@ -542,7 +542,7 @@ shared_examples_for "update questions" do
542
542
 
543
543
  within ".questionnaire-question:last-of-type" do
544
544
  within ".questionnaire-question-answer-options-list" do
545
- expect(page).to have_no_button("Remove")
545
+ expect(page).not_to have_button("Remove")
546
546
  end
547
547
  end
548
548
  end