decidim-forms 0.25.0 → 0.26.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) 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/ja.yml +12 -1
  26. data/config/locales/lb-LU.yml +103 -0
  27. data/config/locales/nl.yml +11 -0
  28. data/config/locales/pt-BR.yml +1 -1
  29. data/config/locales/ro-RO.yml +67 -58
  30. data/config/locales/val-ES.yml +18 -0
  31. data/lib/decidim/forms/engine.rb +4 -0
  32. data/lib/decidim/forms/test/factories.rb +12 -0
  33. data/lib/decidim/forms/test/shared_examples/manage_questionnaire_answers.rb +18 -0
  34. data/lib/decidim/forms/test/shared_examples/manage_questionnaires/add_questions.rb +36 -5
  35. data/lib/decidim/forms/test/shared_examples/manage_questionnaires/update_questions.rb +98 -0
  36. data/lib/decidim/forms/test/shared_examples/manage_questionnaires.rb +8 -0
  37. data/lib/decidim/forms/user_answers_serializer.rb +7 -1
  38. data/lib/decidim/forms/version.rb +1 -1
  39. metadata +17 -14
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 931723679f0358853351adc3557731b3a523b30d9da94cddcf7c2ec142667f9d
4
- data.tar.gz: f43b8c8c48c9612c9334e36d9fe42448bc0ee66640186f41e67d00f37c0dd3ce
3
+ metadata.gz: 0b9bda71f82ea8834423fdd0160f804ffd07b4f2463374c06c497fbac9311349
4
+ data.tar.gz: 734131fa283abc6c4985cccb00221e2899cbe9a51bb6f4526a6235d144a318ad
5
5
  SHA512:
6
- metadata.gz: a3aa93724afce7f04fd75159b1f960471fab8142d79f16b2c9d43c05ab91e92c8dfd266e78ab0cc859b9759e9fc2baf0fc8d1e0db0bb589e08fde8db821ee52c
7
- data.tar.gz: 2ab2812b7a9510c7f1d314ad52cf359fc23a87b952b49d401d337e58904ee2e99fc74e9d52018d54f432cf546bfd3a8597d6ee52660f90251bd8adba25b76423
6
+ metadata.gz: 0eef2098c5cb0e0239051c2889a1ab727a746622d78ceccaf3b9a74249c0e605d713b4d6189d15c68114fe17cf30cd0ed55105c8e2392c866906bc0efeea6ef9
7
+ data.tar.gz: 77b2ce921a9dfd4415f59d1227bc24b22c3307a81a5214e8b66fdfe9b12a117ec91d70f0655e9dafaaaf5ba491e1a453053e4008e32744b6280a292d3011bf6b
@@ -20,7 +20,7 @@ module Decidim
20
20
  #
21
21
  # Broadcasts :ok if successful, :invalid otherwise.
22
22
  def call
23
- return broadcast(:invalid) if @form.invalid?
23
+ return broadcast(:invalid) if @form.invalid? || user_already_answered?
24
24
 
25
25
  answer_questionnaire
26
26
 
@@ -32,7 +32,7 @@ module Decidim
32
32
  end
33
33
  end
34
34
 
35
- attr_reader :form
35
+ attr_reader :form, :questionnaire, :current_user
36
36
 
37
37
  private
38
38
 
@@ -96,6 +96,10 @@ module Decidim
96
96
  raise ActiveRecord::Rollback if @errors
97
97
  end
98
98
  end
99
+
100
+ def user_already_answered?
101
+ questionnaire.answered_by?(current_user || form.context.session_token)
102
+ end
99
103
  end
100
104
  end
101
105
  end
@@ -42,6 +42,10 @@ module Decidim
42
42
  question_type == Decidim::Forms::Question::SEPARATOR_TYPE
43
43
  end
44
44
 
45
+ def title_and_description?
46
+ question_type == Decidim::Forms::Question::TITLE_AND_DESCRIPTION_TYPE
47
+ end
48
+
45
49
  def matrix_rows_by_position
46
50
  matrix_rows.sort do |a, b|
47
51
  if a.position && b.position
@@ -22,6 +22,7 @@ module Decidim
22
22
  validate :question_belongs_to_questionnaire
23
23
 
24
24
  scope :not_separator, -> { joins(:question).where.not(decidim_forms_questions: { question_type: Decidim::Forms::Question::SEPARATOR_TYPE }) }
25
+ scope :not_title_and_description, -> { joins(:question).where.not(decidim_forms_questions: { question_type: Decidim::Forms::Question::TITLE_AND_DESCRIPTION_TYPE }) }
25
26
 
26
27
  def self.user_collection(user)
27
28
  where(decidim_user_id: user.id)
@@ -8,7 +8,8 @@ module Decidim
8
8
 
9
9
  QUESTION_TYPES = %w(short_answer long_answer single_option multiple_option sorting files matrix_single matrix_multiple).freeze
10
10
  SEPARATOR_TYPE = "separator"
11
- TYPES = (QUESTION_TYPES + [SEPARATOR_TYPE]).freeze
11
+ TITLE_AND_DESCRIPTION_TYPE = "title_and_description"
12
+ TYPES = (QUESTION_TYPES + [SEPARATOR_TYPE, TITLE_AND_DESCRIPTION_TYPE]).freeze
12
13
 
13
14
  translatable_fields :body, :description
14
15
 
@@ -49,6 +50,7 @@ module Decidim
49
50
  validates :question_type, inclusion: { in: TYPES }
50
51
 
51
52
  scope :not_separator, -> { where.not(question_type: SEPARATOR_TYPE) }
53
+ scope :not_title_and_description, -> { where.not(question_type: TITLE_AND_DESCRIPTION_TYPE) }
52
54
 
53
55
  scope :with_body, -> { where(question_type: %w(short_answer long_answer)) }
54
56
  scope :with_choices, -> { where.not(question_type: %w(short_answer long_answer)) }
@@ -84,6 +86,10 @@ module Decidim
84
86
  question_type.to_s == SEPARATOR_TYPE
85
87
  end
86
88
 
89
+ def title_and_description?
90
+ question_type.to_s == TITLE_AND_DESCRIPTION_TYPE
91
+ end
92
+
87
93
  def has_attachments?
88
94
  question_type.to_s == "files"
89
95
  end
@@ -375,8 +375,10 @@ export default function createEditableForm() {
375
375
  fieldSelector: fieldSelector,
376
376
  addFieldButtonSelector: ".add-question",
377
377
  addSeparatorButtonSelector: ".add-separator",
378
+ addTitleAndDescriptionButtonSelector: ".add-title-and-description",
378
379
  fieldTemplateSelector: ".decidim-question-template",
379
380
  separatorTemplateSelector: ".decidim-separator-template",
381
+ TitleAndDescriptionTemplateSelector: ".decidim-title-and-description-template",
380
382
  removeFieldButtonSelector: ".remove-question",
381
383
  moveUpFieldButtonSelector: ".move-up-question",
382
384
  moveDownFieldButtonSelector: ".move-down-question",
@@ -21,10 +21,13 @@ module Decidim
21
21
  return "-" if answer.choices.empty?
22
22
 
23
23
  choices = answer.choices.map do |choice|
24
- choice.try(:custom_body) || choice.try(:body)
24
+ {
25
+ answer_option_body: choice.try(:answer_option).try(:translated_body),
26
+ choice_body: body_or_custom_body(choice)
27
+ }
25
28
  end
26
29
 
27
- return choices.first if answer.question.question_type == "single_option"
30
+ return choice(choices.first) if answer.question.question_type == "single_option"
28
31
 
29
32
  content_tag(:ul) do
30
33
  safe_join(choices.map { |c| choice(c) })
@@ -52,11 +55,23 @@ module Decidim
52
55
  # rubocop:enable Style/StringConcatenation
53
56
  end
54
57
 
55
- def choice(choice_body)
58
+ def choice(choice_hash)
56
59
  content_tag :li do
57
- choice_body
60
+ render_body_for choice_hash
58
61
  end
59
62
  end
63
+
64
+ def render_body_for(choice_hash)
65
+ return choice_hash[:answer_option_body] if choice_hash[:choice_body].blank?
66
+
67
+ "#{choice_hash[:answer_option_body]} (#{choice_hash[:choice_body]})"
68
+ end
69
+
70
+ def body_or_custom_body(choice)
71
+ return choice.custom_body if choice.try(:custom_body).present?
72
+
73
+ ""
74
+ end
60
75
  end
61
76
  end
62
77
  end
@@ -46,13 +46,16 @@ module Decidim
46
46
  with_choices = sibilings.where.not("decidim_forms_questions.question_type in (?)", %w(short_answer long_answer))
47
47
  .where("decidim_forms_answers.id IN (SELECT decidim_answer_id FROM decidim_forms_answer_choices)").count
48
48
 
49
- (with_body + with_choices).to_f / questionnaire.questions.not_separator.count * 100
49
+ (with_body + with_choices).to_f / questionnaire.questions.not_separator.not_title_and_description.count * 100
50
50
  end
51
51
 
52
52
  private
53
53
 
54
54
  def sibilings
55
- Answer.not_separator.where(questionnaire: questionnaire, session_token: participant.session_token).joins(:question).order("decidim_forms_questions.position ASC")
55
+ Answer.not_separator
56
+ .not_title_and_description
57
+ .where(questionnaire: questionnaire, session_token: participant.session_token)
58
+ .joins(:question).order("decidim_forms_questions.position ASC")
56
59
  end
57
60
  end
58
61
  end
@@ -20,7 +20,10 @@ module Decidim
20
20
 
21
21
  # Finds and group answers by user for each questionnaire's question.
22
22
  def query
23
- answers = Answer.not_separator.joins(:question).where(questionnaire: @questionnaire)
23
+ answers = Answer.not_separator
24
+ .not_title_and_description
25
+ .joins(:question)
26
+ .where(questionnaire: @questionnaire)
24
27
 
25
28
  answers.sort_by { |answer| answer.question.position }.group_by { |a| a.user || a.session_token }.values
26
29
  end
@@ -65,6 +65,12 @@
65
65
  id: tabs_id_for_question(blank_question),
66
66
  editable: questionnaire.questions_editable? %>
67
67
  </script>
68
+ <script type="text/template" class="decidim-title-and-description-template decidim-template" id="title-and-description-template">
69
+ <%= render "decidim/forms/admin/questionnaires/title_and_description",
70
+ form: question_form,
71
+ id: tabs_id_for_question(blank_question),
72
+ editable: questionnaire.questions_editable? %>
73
+ </script>
68
74
  <%= render "decidim/forms/admin/questionnaires/answer_option_template", form: question_form, editable: questionnaire.questions_editable?, template_id: "answer-option-template-dummy" %>
69
75
  <%= render "decidim/forms/admin/questionnaires/display_condition_template", form: question_form, editable: questionnaire.questions_editable?, template_id: "display-condition-template-dummy" %>
70
76
  <%= render "decidim/forms/admin/questionnaires/matrix_row_template", form: question_form, editable: questionnaire.questions_editable?, template_id: "matrix-row-template-dummy" %>
@@ -83,6 +89,11 @@
83
89
  form: question_form,
84
90
  id: tabs_id_for_question(question),
85
91
  editable: questionnaire.questions_editable? %>
92
+ <% elsif question.title_and_description? %>
93
+ <%= render "decidim/forms/admin/questionnaires/title_and_description",
94
+ form: question_form,
95
+ id: tabs_id_for_question(question),
96
+ editable: questionnaire.questions_editable? %>
86
97
  <% else %>
87
98
  <%= render "decidim/forms/admin/questionnaires/question",
88
99
  form: question_form,
@@ -102,6 +113,7 @@
102
113
  <% if questionnaire.questions_editable? %>
103
114
  <button class="button add-question"><%= t(".add_question") %></button>
104
115
  <button class="button add-separator"><%= t(".add_separator") %></button>
116
+ <button class="button add-title-and-description"><%= t(".add_title_and_description") %></button>
105
117
  <% end %>
106
118
  </div>
107
119
 
@@ -0,0 +1,80 @@
1
+ <% question = form.object %>
2
+ <% is_expanded = question.errors.any? %>
3
+
4
+ <div class="card questionnaire-question" id="<%= id %>-field">
5
+ <div class="card-divider question-divider">
6
+ <h2 class="card-title">
7
+ <span>
8
+ <% if editable %>
9
+ <%== icon("move") %>
10
+ <% end %>
11
+ <%= dynamic_title(translated_attribute(question.body), class: "question-title-statement", max_length: 50, omission: "...", placeholder: t(".title_and_description")) %>
12
+ </span>
13
+
14
+ <button type="button" class="button small secondary button--title question--collapse" data-toggle="<%= id %>-question-card button--collapse-question-<%= id %> button--expand-question-<%= id %>">
15
+ <span id="button--collapse-question-<%= id %>" data-toggler=".hide" class="icon-collapse <%= "hide" unless is_expanded %>">
16
+ <%== icon("caret-top", aria_label: t(".collapse"), role: "img") %>
17
+ </span>
18
+
19
+ <span id="button--expand-question-<%= id %>" data-toggler=".hide" class="icon-expand <%= "hide" if is_expanded %>">
20
+ <%== icon("caret-bottom", aria_label: t(".expand"), role: "img") %>
21
+ </span>
22
+ </button>
23
+
24
+ <% if editable %>
25
+ <button class="button small alert hollow move-up-question button--title">
26
+ <%== "#{icon("arrow-top")} #{t(".up")}" %>
27
+ </button>
28
+
29
+ <button class="button small alert hollow move-down-question button--title">
30
+ <%== "#{icon("arrow-bottom")} #{t(".down")}" %>
31
+ </button>
32
+
33
+ <button class="button small alert hollow remove-question button--title">
34
+ <%= t(".remove") %>
35
+ </button>
36
+ <% end %>
37
+ </h2>
38
+ </div>
39
+
40
+ <div class="card-section collapsible <%= "hide" unless is_expanded %>" data-toggler=".hide" id="<%= id %>-question-card">
41
+ <div class="row column">
42
+ <%=
43
+ form.translated(
44
+ :text_field,
45
+ :body,
46
+ tabs_id: id,
47
+ label: t(".title"),
48
+ disabled: !editable
49
+ )
50
+ %>
51
+ </div>
52
+
53
+ <div class="row column">
54
+ <%=
55
+ form.translated(
56
+ :editor,
57
+ :description,
58
+ toolbar: :full,
59
+ tabs_id: id,
60
+ label: t(".description"),
61
+ disabled: !editable
62
+ )
63
+ %>
64
+ </div>
65
+
66
+ <%=
67
+ form.hidden_field(
68
+ :question_type,
69
+ value: :title_and_description
70
+ )
71
+ %>
72
+
73
+ <% if question.persisted? %>
74
+ <%= form.hidden_field :id, disabled: !editable %>
75
+ <% end %>
76
+
77
+ <%= form.hidden_field :position, value: question.position || 0, disabled: !editable %>
78
+ <%= form.hidden_field :deleted, disabled: !editable %>
79
+ </div>
80
+ </div>
@@ -3,6 +3,15 @@
3
3
  <% if answer.question.separator? %>
4
4
  <%= render partial: "decidim/forms/questionnaires/answers/#{answer.question.question_type}", locals: { answer: answer, answer_form: answer_form, answer_idx: answer_idx, field_id: field_id, disabled: disabled } %>
5
5
  <%= answer_form.hidden_field :question_id %>
6
+ <% elsif answer.question.title_and_description? %>
7
+ <%= label_tag field_id, translated_attribute(answer.question.body), class: "questionnaire-title_and_description" %>
8
+ <% if translated_attribute(answer.question.description).present? %>
9
+ <div class="help-title_and_description ">
10
+ <%= decidim_sanitize_editor translated_attribute(answer.question.description) %>
11
+ </div>
12
+ <% end %>
13
+ <%= render partial: "decidim/forms/questionnaires/answers/#{answer.question.question_type}", locals: { answer: answer, answer_form: answer_form, answer_idx: answer_idx, field_id: field_id, disabled: disabled } %>
14
+ <%= answer_form.hidden_field :question_id %>
6
15
  <% else %>
7
16
  <% case answer.question.question_type %>
8
17
  <% when "single_option", "multiple_option", "sorting" %>
@@ -13,7 +22,7 @@
13
22
 
14
23
  <% if translated_attribute(answer.question.description).present? %>
15
24
  <div class="help-text">
16
- <%= decidim_sanitize translated_attribute(answer.question.description) %>
25
+ <%= decidim_sanitize_editor translated_attribute(answer.question.description) %>
17
26
  </div>
18
27
  <% end %>
19
28
 
@@ -0,0 +1 @@
1
+ <%= answer_form.hidden_field :body, value: "title-and-description", id: field_id, disabled: disabled %>
@@ -11,7 +11,7 @@
11
11
  <h3 class="section-heading"><%= translated_attribute questionnaire.title %></h3>
12
12
  <div class="row">
13
13
  <div class="columns large-<%= columns %> medium-centered lead">
14
- <%= decidim_sanitize translated_attribute questionnaire.description %>
14
+ <%= decidim_sanitize_editor translated_attribute questionnaire.description %>
15
15
  </div>
16
16
  </div>
17
17
  </div>
@@ -20,8 +20,8 @@
20
20
  <div class="columns large-<%= columns %> medium-centered">
21
21
  <div class="card">
22
22
  <div class="card__content">
23
- <% unless questionnaire_for.try(:component)&.try(:published?) %>
24
- <div class="section">
23
+ <% unless questionnaire_for.try(:component)&.try(:published?) %>
24
+ <div class="section">
25
25
  <div class="callout warning">
26
26
  <p><%= t(".questionnaire_not_published.body") %></p>
27
27
  </div>
@@ -65,14 +65,15 @@
65
65
  <div id="step-<%= step_index %>" class="<%= step_index.zero? ? "questionnaire-step" : "questionnaire-step hide" %>" data-toggler=".hide">
66
66
  <% if @form.total_steps > 1 %>
67
67
  <h4 class="section-heading">
68
- <%= t(".current_step", step: step_index + 1) %> <span class="answer-questionnaire__steps"><%= t(".of_total_steps", total_steps: @form.total_steps) %></span>
68
+ <%= t(".current_step", step: step_index + 1) %>
69
+ <span class="answer-questionnaire__steps"><%= t(".of_total_steps", total_steps: @form.total_steps) %></span>
69
70
  </h4>
70
71
  <% end %>
71
72
 
72
73
  <% step_answers.each do |answer| %>
73
74
  <div class="row column answer question" data-max-choices="<%= answer.question.max_choices %>" data-conditioned="<%= answer.question.display_conditions.any? %>" data-question-id="<%= answer.question.id %>">
74
75
  <% answer.question.display_conditions.each do |display_condition| %>
75
- <%= content_tag :div, nil, class: "display-condition", data: display_condition.to_html_data %>
76
+ <%= content_tag :div, nil, class: "display-condition", data: display_condition.to_html_data %>
76
77
  <% end %>
77
78
 
78
79
  <%= fields_for "questionnaire[responses][#{answer_idx}]", answer do |answer_form| %>
@@ -86,7 +87,7 @@
86
87
  ) %>
87
88
  <% end %>
88
89
  </div>
89
- <% if !answer.question.separator? %>
90
+ <% if !(answer.question.separator? || answer.question.title_and_description?) %>
90
91
  <% cleaned_answer_idx += 1 %>
91
92
  <% end %>
92
93
  <% answer_idx += 1 %>
@@ -108,7 +109,7 @@
108
109
  <div class="row column tos-agreement">
109
110
  <%= form.check_box :tos_agreement, label: t(".tos_agreement"), id: "questionnaire_tos_agreement", disabled: !current_participatory_space.can_participate?(current_user) %>
110
111
  <div class="help-text">
111
- <%= decidim_sanitize translated_attribute questionnaire.tos %>
112
+ <%= decidim_sanitize_editor translated_attribute questionnaire.tos %>
112
113
  </div>
113
114
  </div>
114
115
  <% end %>
@@ -79,6 +79,7 @@ ca:
79
79
  form:
80
80
  add_question: Afegeix una pregunta
81
81
  add_separator: Afegir separador
82
+ add_title_and_description: Afegir títol i descripció
82
83
  already_answered_warning: No pots modificar les preguntes d'aquest formulari perquè ja ha estat contestat per algunes participants.
83
84
  collapse: Redueix totes les preguntes
84
85
  expand: Expandeix totes les preguntes
@@ -108,6 +109,15 @@ ca:
108
109
  remove: Eliminar
109
110
  separator: Separador
110
111
  up: Pujar
112
+ title_and_description:
113
+ collapse: Replegar
114
+ description: Descripció
115
+ down: Baixar
116
+ expand: Expandir
117
+ remove: Esborrar
118
+ title: Títol
119
+ title_and_description: Títol i descripció
120
+ up: Pujar
111
121
  update:
112
122
  invalid: S'ha produït un error en desar el formulari.
113
123
  success: Formulari desat correctament.
@@ -131,6 +141,7 @@ ca:
131
141
  short_answer: Resposta curta
132
142
  single_option: Opció única
133
143
  sorting: Ordenació
144
+ title_and_description: Títol i descripció
134
145
  questionnaires:
135
146
  answer:
136
147
  invalid: S'han produït un error en respondre el formulari.
@@ -79,6 +79,7 @@ cs:
79
79
  form:
80
80
  add_question: Přidat otázku
81
81
  add_separator: Přidat oddělovač
82
+ add_title_and_description: Přidat název a popis
82
83
  already_answered_warning: Formulář je již zodpovězen některými uživateli, takže jeho otázky nemůžete upravovat.
83
84
  collapse: Sbalit všechny otázky
84
85
  expand: Rozbalit všechny otázky
@@ -108,6 +109,15 @@ cs:
108
109
  remove: Odebrat
109
110
  separator: Oddělovač
110
111
  up: Nahoru
112
+ title_and_description:
113
+ collapse: Sbalit
114
+ description: Popis
115
+ down: Dolů
116
+ expand: Rozbalit
117
+ remove: Odebrat
118
+ title: Název
119
+ title_and_description: Název a popis
120
+ up: Nahoru
111
121
  update:
112
122
  invalid: Při ukládání dotazníku došlo k chybám.
113
123
  success: Formulář byl úspěšně uložen.
@@ -131,6 +141,7 @@ cs:
131
141
  short_answer: Stručná odpověď
132
142
  single_option: Jedna možnost
133
143
  sorting: Třídění
144
+ title_and_description: Název a popis
134
145
  questionnaires:
135
146
  answer:
136
147
  invalid: Při odpovědi na dotazník došlo k chybám.
@@ -80,6 +80,7 @@ en:
80
80
  form:
81
81
  add_question: Add question
82
82
  add_separator: Add separator
83
+ add_title_and_description: Add title and description
83
84
  already_answered_warning: The form is already answered by some users so you cannot modify its questions.
84
85
  collapse: Collapse all questions
85
86
  expand: Expand all questions
@@ -109,6 +110,15 @@ en:
109
110
  remove: Remove
110
111
  separator: Separator
111
112
  up: Up
113
+ title_and_description:
114
+ collapse: Collapse
115
+ description: Description
116
+ down: Down
117
+ expand: Expand
118
+ remove: Remove
119
+ title: Title
120
+ title_and_description: Title and description
121
+ up: Up
112
122
  update:
113
123
  invalid: There was a problem saving the form.
114
124
  success: Form successfully saved.
@@ -132,6 +142,7 @@ en:
132
142
  short_answer: Short answer
133
143
  single_option: Single option
134
144
  sorting: Sorting
145
+ title_and_description: Title and description
135
146
  questionnaires:
136
147
  answer:
137
148
  invalid: There was a problem answering the form.
@@ -79,6 +79,7 @@ es-MX:
79
79
  form:
80
80
  add_question: Añadir pregunta
81
81
  add_separator: Añadir separador
82
+ add_title_and_description: Añadir título y descripción
82
83
  already_answered_warning: Algunos usuarios ya han respondido al cuestionario, por lo que no puedes modificar las preguntas.
83
84
  collapse: Contraer todas las preguntas
84
85
  expand: Expandir todos las preguntas
@@ -108,6 +109,15 @@ es-MX:
108
109
  remove: Eliminar
109
110
  separator: Separador
110
111
  up: Subir
112
+ title_and_description:
113
+ collapse: Contraer
114
+ description: Descripción
115
+ down: Bajar
116
+ expand: Expandir
117
+ remove: Eliminar
118
+ title: Título
119
+ title_and_description: Título y descripción
120
+ up: Subir
111
121
  update:
112
122
  invalid: Ha habido errores al guardar el cuestionario.
113
123
  success: Formulario guardado correctamente.
@@ -131,6 +141,7 @@ es-MX:
131
141
  short_answer: Respuesta corta
132
142
  single_option: Opción única
133
143
  sorting: Ordenación
144
+ title_and_description: Titulo y descripción
134
145
  questionnaires:
135
146
  answer:
136
147
  invalid: Ha habido errores al responder al cuestionario.
@@ -79,6 +79,7 @@ es-PY:
79
79
  form:
80
80
  add_question: Añadir pregunta
81
81
  add_separator: Añadir separador
82
+ add_title_and_description: Añadir título y descripción
82
83
  already_answered_warning: Algunos usuarios ya han respondido al cuestionario, por lo que no puedes modificar las preguntas.
83
84
  collapse: Contraer todas las preguntas
84
85
  expand: Expandir todos las preguntas
@@ -108,6 +109,15 @@ es-PY:
108
109
  remove: Eliminar
109
110
  separator: Separador
110
111
  up: Subir
112
+ title_and_description:
113
+ collapse: Contraer
114
+ description: Descripción
115
+ down: Bajar
116
+ expand: Expandir
117
+ remove: Eliminar
118
+ title: Título
119
+ title_and_description: Título y descripción
120
+ up: Subir
111
121
  update:
112
122
  invalid: Ha habido errores al guardar el cuestionario.
113
123
  success: Formulario guardado correctamente.
@@ -131,6 +141,7 @@ es-PY:
131
141
  short_answer: Respuesta corta
132
142
  single_option: Opción única
133
143
  sorting: Ordenación
144
+ title_and_description: Titulo y descripción
134
145
  questionnaires:
135
146
  answer:
136
147
  invalid: Ha habido errores al responder al cuestionario.
@@ -79,6 +79,7 @@ es:
79
79
  form:
80
80
  add_question: Añadir pregunta
81
81
  add_separator: Añadir separador
82
+ add_title_and_description: Añadir título y descripción
82
83
  already_answered_warning: Algunas participantes ya han respondido el formulario, por lo que no puedes modificar las preguntas.
83
84
  collapse: Contraer todas las preguntas
84
85
  expand: Expandir todos las preguntas
@@ -108,6 +109,15 @@ es:
108
109
  remove: Eliminar
109
110
  separator: Separador
110
111
  up: Subir
112
+ title_and_description:
113
+ collapse: Contraer
114
+ description: Descripción
115
+ down: Bajar
116
+ expand: Expandir
117
+ remove: Eliminar
118
+ title: Título
119
+ title_and_description: Título y descripción
120
+ up: Subir
111
121
  update:
112
122
  invalid: Se ha producido un error al guardar el formulario.
113
123
  success: Formulario guardado correctamente.
@@ -131,6 +141,7 @@ es:
131
141
  short_answer: Respuesta corta
132
142
  single_option: Opción única
133
143
  sorting: Ordenación
144
+ title_and_description: Titulo y descripción
134
145
  questionnaires:
135
146
  answer:
136
147
  invalid: Se ha producido un error al responder el formulario.
@@ -79,6 +79,7 @@ fi-pl:
79
79
  form:
80
80
  add_question: Lisää kysymys
81
81
  add_separator: Lisää erotinviiva
82
+ add_title_and_description: Lisää otsikko ja kuvaus
82
83
  already_answered_warning: Jotkut käyttäjät ovat jo vastanneet kyselyyn, joten et voi muokata kysymyksiä.
83
84
  collapse: Sulje kaikki kysymykset
84
85
  expand: Avaa kaikki kysymykset
@@ -108,6 +109,15 @@ fi-pl:
108
109
  remove: Poista
109
110
  separator: Erotin
110
111
  up: Ylös
112
+ title_and_description:
113
+ collapse: Pienennä
114
+ description: Kuvaus
115
+ down: Alas
116
+ expand: Laajenna
117
+ remove: Poista
118
+ title: Otsikko
119
+ title_and_description: Otsikko ja kuvaus
120
+ up: Ylös
111
121
  update:
112
122
  invalid: Kyselylomakkeiden tallentamisessa on tapahtunut virheitä.
113
123
  success: Lomake tallennettu onnistuneesti.
@@ -131,6 +141,7 @@ fi-pl:
131
141
  short_answer: Lyhyt vastaus
132
142
  single_option: Yksi vaihtoehto
133
143
  sorting: Järjestäminen
144
+ title_and_description: Otsikko ja kuvaus
134
145
  questionnaires:
135
146
  answer:
136
147
  invalid: Kyselylomakkeeseen vastatessa tapahtui virheitä.
@@ -79,6 +79,7 @@ fi:
79
79
  form:
80
80
  add_question: Lisää kysymys
81
81
  add_separator: Lisää erotinviiva
82
+ add_title_and_description: Lisää otsikko ja kuvaus
82
83
  already_answered_warning: Jotkut käyttäjät ovat jo vastanneet tähän kyselylomakkeeseen, joten et voi enää muokata kysymyksiä.
83
84
  collapse: Sulje kaikki kysymykset
84
85
  expand: Avaa kaikki kysymykset
@@ -108,6 +109,15 @@ fi:
108
109
  remove: Poista
109
110
  separator: Erotin
110
111
  up: Ylös
112
+ title_and_description:
113
+ collapse: Pienennä
114
+ description: Kuvaus
115
+ down: Alas
116
+ expand: Laajenna
117
+ remove: Poista
118
+ title: Otsikko
119
+ title_and_description: Otsikko ja kuvaus
120
+ up: Ylös
111
121
  update:
112
122
  invalid: Kyselylomakkeen tallentaminen epäonnistui.
113
123
  success: Lomake tallennettu onnistuneesti.
@@ -131,6 +141,7 @@ fi:
131
141
  short_answer: Lyhyt vastaus
132
142
  single_option: Yksi vaihtoehto
133
143
  sorting: Järjestäminen
144
+ title_and_description: Otsikko ja kuvaus
134
145
  questionnaires:
135
146
  answer:
136
147
  invalid: Kyselylomakkeeseen vastaaminen epäonnistui.