decidim-forms 0.24.3 → 0.25.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/forms/step_navigation/show.erb +1 -1
  3. data/app/commands/decidim/forms/admin/update_questionnaire.rb +3 -2
  4. data/app/forms/decidim/forms/admin/question_form.rb +14 -0
  5. data/app/forms/decidim/forms/admin/question_matrix_row_form.rb +2 -2
  6. data/app/forms/decidim/forms/questionnaire_form.rb +1 -0
  7. data/app/helpers/decidim/forms/application_helper.rb +1 -0
  8. data/app/jobs/decidim/forms/export_questionnaire_answers_job.rb +1 -1
  9. data/app/models/decidim/forms/question.rb +4 -0
  10. data/app/models/decidim/forms/question_matrix_row.rb +3 -0
  11. data/app/packs/entrypoints/decidim_forms.js +4 -0
  12. data/app/packs/entrypoints/decidim_forms_admin.js +4 -0
  13. data/app/packs/entrypoints/decidim_questionnaire_answers_pdf.js +1 -0
  14. data/app/packs/entrypoints/decidim_questionnaire_answers_pdf.scss +1 -0
  15. data/app/{assets/images/decidim/surveys/icon.svg → packs/images/decidim/surveys/decidim_surveys.svg} +0 -0
  16. data/app/packs/src/decidim/forms/admin/auto_buttons_by_min_items.component.js +20 -0
  17. data/app/packs/src/decidim/forms/admin/auto_select_options_by_total_items.component.js +18 -0
  18. data/app/packs/src/decidim/forms/admin/auto_select_options_from_url.component.js +35 -0
  19. data/app/{assets/javascripts/decidim/forms/admin/collapsible_questions.js.es6 → packs/src/decidim/forms/admin/collapsible_questions.js} +0 -0
  20. data/app/{assets/javascripts/decidim/forms/admin/forms.js.es6 → packs/src/decidim/forms/admin/forms.js} +16 -12
  21. data/app/packs/src/decidim/forms/admin/live_text_update.component.js +49 -0
  22. data/app/packs/src/decidim/forms/autosortable_checkboxes.component.js +83 -0
  23. data/app/packs/src/decidim/forms/display_conditions.component.js +200 -0
  24. data/app/{assets/javascripts/decidim/forms/forms.js.es6 → packs/src/decidim/forms/forms.js} +7 -7
  25. data/app/packs/src/decidim/forms/max_choices_alert.component.js +43 -0
  26. data/app/packs/src/decidim/forms/option_attached_inputs.component.js +31 -0
  27. data/app/{assets → packs}/stylesheets/decidim/forms/forms.scss +5 -0
  28. data/app/{assets → packs}/stylesheets/decidim/forms/questionnaire-answers-pdf.scss +0 -0
  29. data/app/views/decidim/forms/admin/questionnaires/_display_condition.html.erb +2 -2
  30. data/app/views/decidim/forms/admin/questionnaires/_form.html.erb +5 -3
  31. data/app/views/decidim/forms/admin/questionnaires/_matrix_row.html.erb +1 -0
  32. data/app/views/decidim/forms/admin/questionnaires/_question.html.erb +1 -1
  33. data/app/views/decidim/forms/questionnaires/answers/_matrix_multiple.html.erb +1 -1
  34. data/app/views/decidim/forms/questionnaires/answers/_matrix_single.html.erb +1 -1
  35. data/app/views/decidim/forms/questionnaires/show.html.erb +7 -1
  36. data/app/views/layouts/decidim/forms/admin/questionnaires/questionnaire_answers.html.erb +1 -1
  37. data/config/assets.rb +10 -0
  38. data/config/locales/fr-LU.yml +178 -0
  39. data/config/locales/hu.yml +2 -0
  40. data/config/locales/it.yml +7 -0
  41. data/config/locales/ja.yml +8 -0
  42. data/config/locales/lb-LU.yml +1 -0
  43. data/config/locales/pl.yml +2 -2
  44. data/config/locales/pt-BR.yml +93 -0
  45. data/db/migrate/20170515144119_create_decidim_forms_answers.rb +1 -2
  46. data/db/migrate/20210616153042_set_position_to_question_matrix_rows.rb +11 -0
  47. data/lib/decidim/forms/admin_engine.rb +0 -4
  48. data/lib/decidim/forms/engine.rb +2 -4
  49. data/lib/decidim/forms/test/factories.rb +39 -2
  50. data/lib/decidim/forms/test/shared_examples/has_questionnaire.rb +2 -0
  51. data/lib/decidim/forms/user_answers_serializer.rb +3 -0
  52. data/lib/decidim/forms/version.rb +1 -1
  53. metadata +35 -32
  54. data/app/assets/config/admin/decidim_forms_manifest.css +0 -3
  55. data/app/assets/config/admin/decidim_forms_manifest.js +0 -2
  56. data/app/assets/config/decidim_forms_manifest.css +0 -4
  57. data/app/assets/config/decidim_forms_manifest.js +0 -1
  58. data/app/assets/javascripts/decidim/forms/admin/auto_buttons_by_min_items.component.js.es6 +0 -25
  59. data/app/assets/javascripts/decidim/forms/admin/auto_select_options_by_total_items.component.js.es6 +0 -23
  60. data/app/assets/javascripts/decidim/forms/admin/auto_select_options_from_url.component.js.es6 +0 -40
  61. data/app/assets/javascripts/decidim/forms/admin/live_text_update.component.js.es6 +0 -52
  62. data/app/assets/javascripts/decidim/forms/autosortable_checkboxes.component.js.es6 +0 -85
  63. data/app/assets/javascripts/decidim/forms/display_conditions.component.js.es6 +0 -203
  64. data/app/assets/javascripts/decidim/forms/max_choices_alert.component.js.es6 +0 -44
  65. data/app/assets/javascripts/decidim/forms/option_attached_inputs.component.js.es6 +0 -32
  66. data/config/locales/ja-JP.yml +0 -170
@@ -1,11 +1,11 @@
1
- // = require ./option_attached_inputs.component
2
- // = require ./autosortable_checkboxes.component
3
- // = require ./display_conditions.component
4
- // = require ./max_choices_alert.component
1
+ /* eslint-disable require-jsdoc */
5
2
 
6
- ((exports) => {
7
- const { createOptionAttachedInputs, createAutosortableCheckboxes, createMaxChoicesAlertComponent, createDisplayConditions } = exports.Decidim;
3
+ import createOptionAttachedInputs from "src/decidim/forms/option_attached_inputs.component"
4
+ import createAutosortableCheckboxes from "src/decidim/forms/autosortable_checkboxes.component"
5
+ import createDisplayConditions from "src/decidim/forms/display_conditions.component"
6
+ import createMaxChoicesAlertComponent from "src/decidim/forms/max_choices_alert.component"
8
7
 
8
+ $(() => {
9
9
  $(".radio-button-collection, .check-box-collection").each((idx, el) => {
10
10
  createOptionAttachedInputs({
11
11
  wrapperField: $(el),
@@ -65,4 +65,4 @@
65
65
  event.returnValue = true;
66
66
  });
67
67
  }
68
- })(window);
68
+ })
@@ -0,0 +1,43 @@
1
+ /* eslint-disable require-jsdoc */
2
+
3
+ class MaxChoicesAlertComponent {
4
+ constructor(options = {}) {
5
+ this.wrapperField = options.wrapperField;
6
+ this.alertElement = options.alertElement;
7
+ this.controllerFieldSelector = options.controllerFieldSelector;
8
+ this.controllerCollectionSelector = options.controllerCollectionSelector;
9
+ this.maxChoices = options.maxChoices;
10
+ this.controllerSelector = this.wrapperField.find(this.controllerFieldSelector);
11
+ this._bindEvent();
12
+ this._run();
13
+ }
14
+
15
+ _run() {
16
+ const rows = this.wrapperField.find(this.controllerCollectionSelector);
17
+
18
+ let alert = false;
19
+
20
+ rows.each((rowIdx, row) => {
21
+ const checked = $(row).find(this.controllerFieldSelector).filter((checkboxIdx, checkbox) => $(checkbox).is(":checked"));
22
+
23
+ alert = alert || checked.length > this.maxChoices;
24
+ });
25
+
26
+ if (alert) {
27
+ this.alertElement.show();
28
+ }
29
+ else {
30
+ this.alertElement.hide();
31
+ }
32
+ }
33
+
34
+ _bindEvent() {
35
+ this.controllerSelector.on("change", () => {
36
+ this._run();
37
+ });
38
+ }
39
+ }
40
+
41
+ export default function createMaxChoicesAlertComponent(options) {
42
+ return new MaxChoicesAlertComponent(options);
43
+ }
@@ -0,0 +1,31 @@
1
+ /* eslint-disable require-jsdoc */
2
+
3
+ class OptionAttachedInputsComponent {
4
+ constructor(options = {}) {
5
+ this.wrapperField = options.wrapperField;
6
+ this.controllerFieldSelector = options.controllerFieldSelector;
7
+ this.dependentInputSelector = options.dependentInputSelector;
8
+ this.controllerSelector = this.wrapperField.find(this.controllerFieldSelector);
9
+ this._bindEvent();
10
+ this._run();
11
+ }
12
+
13
+ _run() {
14
+ this.controllerSelector.each((idx, el) => {
15
+ const $field = $(el);
16
+ const enabled = $field.is(":checked");
17
+
18
+ $field.parents("div.collection-input").find(this.dependentInputSelector).prop("disabled", !enabled);
19
+ });
20
+ }
21
+
22
+ _bindEvent() {
23
+ this.controllerSelector.on("change", () => {
24
+ this._run();
25
+ });
26
+ }
27
+ }
28
+
29
+ export default function createOptionAttachedInputs(options) {
30
+ return new OptionAttachedInputsComponent(options);
31
+ }
@@ -37,6 +37,9 @@
37
37
  }
38
38
 
39
39
  .questionnaire-question-matrix{
40
+ display: block;
41
+ overflow-x: auto;
42
+
40
43
  .collection-input{
41
44
  display: flex;
42
45
  align-items: center;
@@ -74,3 +77,5 @@
74
77
  border-right: 1px solid #f0f0f0;
75
78
  }
76
79
  }
80
+
81
+ @import "stylesheets/decidim/forms/questionnaire-answers-pdf";
@@ -44,10 +44,10 @@
44
44
  <%=
45
45
  form.select(
46
46
  :decidim_answer_option_id,
47
- options_from_collection_for_select(display_condition.answer_options, :id, :translated_body, display_condition.answer_option),
47
+ options_from_collection_for_select(display_condition.answer_options, :id, :translated_body, selected: display_condition.decidim_answer_option_id),
48
48
  { prompt: t(".select_answer_option"), label: t(".answer_option") },
49
49
  disabled: !editable,
50
- data: { selected: display_condition.answer_option&.id }
50
+ data: { selected: display_condition.decidim_answer_option_id }
51
51
  )
52
52
  %>
53
53
  </div>
@@ -105,8 +105,10 @@
105
105
  <% end %>
106
106
  </div>
107
107
 
108
+ <%= javascript_pack_tag "decidim_forms_admin" %>
109
+
108
110
  <% if questionnaire.questions_editable? %>
109
- <%= javascript_include_tag "decidim/forms/admin/forms" %>
111
+ <script>
112
+ window.Decidim.createEditableForm()
113
+ </script>
110
114
  <% end %>
111
-
112
- <%= javascript_include_tag "decidim/forms/admin/collapsible_questions" %>
@@ -28,6 +28,7 @@
28
28
 
29
29
  <% if matrix_row.persisted? %>
30
30
  <%= form.hidden_field :id, disabled: !editable %>
31
+ <%= form.hidden_field :position, disabled: !editable %>
31
32
  <% end %>
32
33
 
33
34
  <%= form.hidden_field :deleted, disabled: !editable %>
@@ -104,7 +104,7 @@
104
104
 
105
105
  <div class="questionnaire-question-matrix-rows" data-template="<%= matrix_row_template_selector %>">
106
106
  <div class="questionnaire-question-matrix-rows-list">
107
- <% question.matrix_rows.each do |matrix_row| %>
107
+ <% question.matrix_rows_by_position.each do |matrix_row| %>
108
108
  <%= fields_for "questionnaire[questions][#{question.to_param}][matrix_rows][]", matrix_row do |matrix_row_form| %>
109
109
  <%= render "decidim/forms/admin/questionnaires/matrix_row", form: matrix_row_form, question: question, editable: editable %>
110
110
  <% end %>
@@ -8,7 +8,7 @@
8
8
  </tr>
9
9
  </thead>
10
10
  <tbody>
11
- <% answer.question.matrix_rows.each_with_index do |row, row_idx| %>
11
+ <% answer.question.matrix_rows.by_position.each_with_index do |row, row_idx| %>
12
12
  <tr class="check-box-collection">
13
13
  <td><%= translated_attribute row.body %></td>
14
14
  <% answer.question.answer_options.each_with_index do |answer_option, idx| %>
@@ -8,7 +8,7 @@
8
8
  </tr>
9
9
  </thead>
10
10
  <tbody>
11
- <% answer.question.matrix_rows.each_with_index do |row, row_idx| %>
11
+ <% answer.question.matrix_rows.by_position.each_with_index do |row, row_idx| %>
12
12
  <tr class="radio-button-collection">
13
13
  <td><%= translated_attribute row.body %></td>
14
14
  <% answer.question.answer_options.each_with_index do |answer_option, idx| %>
@@ -99,6 +99,12 @@
99
99
  </div>
100
100
  <% end %>
101
101
 
102
+ <% if show_public_participation? %>
103
+ <div class="row column public-participation">
104
+ <%= cell("decidim/public_participation", form) %>
105
+ </div>
106
+ <% end %>
107
+
102
108
  <div class="row column tos-agreement">
103
109
  <%= form.check_box :tos_agreement, label: t(".tos_agreement"), id: "questionnaire_tos_agreement", disabled: !current_participatory_space.can_participate?(current_user) %>
104
110
  <div class="help-text">
@@ -144,4 +150,4 @@
144
150
  </div>
145
151
  </div>
146
152
 
147
- <%= javascript_include_tag "decidim/forms/forms" %>
153
+ <%= javascript_pack_tag "decidim_forms" %>
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
5
  <meta name="viewport" content="width=device-width">
6
- <%= wicked_pdf_stylesheet_link_tag "decidim/forms/questionnaire-answers-pdf" %>
6
+ <%= wicked_pdf_stylesheet_pack_tag "decidim_questionnaire_answers_pdf" %>
7
7
  <title><%= @title %></title>
8
8
  </head>
9
9
  <body>
data/config/assets.rb ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ base_path = File.expand_path("..", __dir__)
4
+
5
+ Decidim::Webpacker.register_path("#{base_path}/app/packs")
6
+ Decidim::Webpacker.register_entrypoints(
7
+ decidim_forms: "#{base_path}/app/packs/entrypoints/decidim_forms.js",
8
+ decidim_forms_admin: "#{base_path}/app/packs/entrypoints/decidim_forms_admin.js",
9
+ decidim_questionnaire_answers_pdf: "#{base_path}/app/packs/entrypoints/decidim_questionnaire_answers_pdf.js"
10
+ )
@@ -0,0 +1,178 @@
1
+ fr-LU:
2
+ activemodel:
3
+ attributes:
4
+ answer:
5
+ body: Répondre
6
+ choices: Choix
7
+ selected_choices: Choix sélectionnés
8
+ question:
9
+ max_choices: Nombre maximum de choix
10
+ question_type: Type
11
+ questionnaire_question:
12
+ mandatory: Obligatoire
13
+ max_characters: Limite de caractères (laisser à 0 si aucune limite)
14
+ errors:
15
+ models:
16
+ answer:
17
+ attributes:
18
+ add_documents:
19
+ needs_to_be_reattached: Doit être téléchargé de nouveau
20
+ body:
21
+ too_long: est trop long
22
+ choices:
23
+ missing: ne sont pas complets
24
+ too_many: sont trop nombreux
25
+ questionnaire:
26
+ request_invalid: Il y a eu une erreur lors du traitement de la demande. Veuillez réessayer
27
+ decidim:
28
+ forms:
29
+ admin:
30
+ models:
31
+ components:
32
+ description: La description
33
+ tos: Conditions d'utilisation
34
+ questionnaires:
35
+ actions:
36
+ back: Retour aux questions
37
+ show: Afficher les réponses
38
+ answer_option:
39
+ answer_option: Option de réponse
40
+ free_text: Texte libre
41
+ remove: Retirer
42
+ statement: Déclaration
43
+ answers:
44
+ actions:
45
+ back: Retour aux réponses
46
+ export: Exporter
47
+ show: Afficher les réponses
48
+ empty: Pas encore de réponses
49
+ export:
50
+ answer:
51
+ title: 'Réponse n°%{number}'
52
+ export_response:
53
+ title: réponses_utilisateur_sondage_%{token}
54
+ index:
55
+ title: "%{total} réponses totales"
56
+ show:
57
+ title: 'Réponse n°%{number}'
58
+ display_condition:
59
+ answer_option: Option de réponse
60
+ condition_question: Question
61
+ condition_type: Condition
62
+ condition_types:
63
+ answered: Répondu
64
+ equal: Égale
65
+ match: Inclus le texte
66
+ not_answered: Non répondu
67
+ not_equal: Différent de
68
+ condition_value: Texte comprenant
69
+ display_condition: Condition d'affichage
70
+ mandatory: Cette condition doit toujours être satisfaite indépendamment du statut des autres conditions
71
+ remove: Retirer
72
+ save_warning: N'oubliez pas d'enregistrer le formulaire avant de configurer les conditions d'affichage
73
+ select_answer_option: Sélectionnez l'option de réponse
74
+ select_condition_question: Sélectionnez une question
75
+ select_condition_type: Sélectionnez un type de condition
76
+ edit:
77
+ save: sauvegarder
78
+ title: Modifier le questionnaire
79
+ form:
80
+ add_question: Ajouter une question
81
+ add_separator: Ajouter un séparateur
82
+ already_answered_warning: Certains utilisateurs ont déjà répondu au questionnaire, vous ne pouvez donc pas modifier ses questions.
83
+ collapse: Réduire toutes les questions
84
+ expand: Développer toutes les questions
85
+ preview: Aperçu
86
+ title: Modifier le questionnaire pour %{questionnaire_for}
87
+ unpublished_warning: Le formulaire n'est pas publié. Vous pouvez modifier ses questions, mais cela supprimera les réponses actuelles.
88
+ matrix_row:
89
+ matrix_row: Ligne
90
+ remove: Retirer
91
+ statement: Déclaration
92
+ question:
93
+ add_answer_option: Ajouter une option de réponse
94
+ add_display_condition: Ajouter une condition d'affichage
95
+ add_display_condition_info: Enregistrer le formulaire pour configurer les conditions d'affichage
96
+ add_matrix_row: Ajouter une ligne
97
+ any: Tout
98
+ collapse: Réduire
99
+ description: Description
100
+ down: Descendre
101
+ expand: Déveloper
102
+ question: Question
103
+ remove: Retirer
104
+ statement: Déclaration
105
+ up: Monter
106
+ separator:
107
+ down: Bas
108
+ remove: Retirer
109
+ separator: Séparateur
110
+ up: Haut
111
+ update:
112
+ invalid: Il y a eu des erreurs lors de la sauvegarde du questionnaire.
113
+ success: Le questionnaire a bien été sauvegardé.
114
+ errors:
115
+ answer:
116
+ body: Le corps ne peut pas être vide
117
+ files:
118
+ extension_allowlist: 'Formats acceptés :'
119
+ images:
120
+ dimensions: "%{width} x %{height} px"
121
+ dimensions_info: 'Cette image sera :'
122
+ processors:
123
+ resize_and_pad: Redimensionné et ajustée à
124
+ resize_to_fit: Redimensionnée pour s'adapter
125
+ question_types:
126
+ files: Fichiers
127
+ long_answer: Longue réponse
128
+ matrix_multiple: Matrice (choix multiples)
129
+ matrix_single: Matrice (choix unique)
130
+ multiple_option: Option multiple
131
+ short_answer: Réponse courte
132
+ single_option: Option unique
133
+ sorting: Tri
134
+ questionnaires:
135
+ answer:
136
+ invalid: Il y a eu des erreurs en répondant au questionnaire.
137
+ max_choices_alert: Il y a trop de choix sélectionnés
138
+ success: Questionnaire répondu avec succès.
139
+ question:
140
+ max_choices: 'Choix maximum: %{n}'
141
+ show:
142
+ answer_questionnaire:
143
+ anonymous_user_message: <a href="%{sign_in_link}">Connectez-vous avec votre compte</a> ou <a href="%{sign_up_link}">inscrivez-vous</a> pour répondre au questionnaire.
144
+ title: Répondez au questionnaire
145
+ current_step: Étape %{step}
146
+ of_total_steps: de %{total_steps}
147
+ questionnaire_answered:
148
+ body: Vous avez déjà répondu à ce questionnaire.
149
+ title: Déjà répondu
150
+ questionnaire_closed:
151
+ body: Le questionnaire est fermé et vous ne pouvez pas y répondre.
152
+ title: Questionnaire fermé
153
+ questionnaire_for_private_users:
154
+ body: Le questionnaire est disponible uniquement pour les utilisateurs privés
155
+ title: Questionnaire fermé
156
+ questionnaire_js_disabled:
157
+ body: Certaines des fonctionnalités de ce formulaire seront désactivées. Pour améliorer votre expérience, veuillez activer JavaScript dans votre navigateur.
158
+ title: JavaScript est désactivé
159
+ questionnaire_not_published:
160
+ body: Ce formulaire n'est pas encore publié.
161
+ tos_agreement: En participant, vous acceptez ces conditions d'utilisation
162
+ step_navigation:
163
+ show:
164
+ are_you_sure: Cette action ne peut pas être annulée et vous ne pourrez pas modifier vos réponses. Êtes-vous sûr?
165
+ back: Revenir en arrière
166
+ continue: Continuer
167
+ submit: Soumettre
168
+ user_answers_serializer:
169
+ body: Répondre
170
+ completion: Fin
171
+ created_at: Répondu le
172
+ id: ID de réponse
173
+ ip_hash: Hachage IP
174
+ question: Question
175
+ registered: Enregistré
176
+ session_token: Identifiant de l'utilisateur
177
+ unregistered: Non enregistré
178
+ user_status: Statut de l'utilisateur
@@ -56,6 +56,8 @@ hu:
56
56
  errors:
57
57
  answer:
58
58
  body: A szövegtörzs nem lehet üres
59
+ files:
60
+ extension_allowlist: 'Elfogadott formátumok:'
59
61
  question_types:
60
62
  long_answer: Hosszú válasz
61
63
  multiple_option: Több választási lehetőség
@@ -10,10 +10,15 @@ it:
10
10
  question_type: Tipo
11
11
  questionnaire_question:
12
12
  mandatory: Obbligatorio
13
+ max_characters: Limite di caratteri (lasciare a 0 se nessum limite)
13
14
  errors:
14
15
  models:
15
16
  answer:
16
17
  attributes:
18
+ add_documents:
19
+ needs_to_be_reattached: Deve essere allegato nuovamente
20
+ body:
21
+ too_long: è troppo lungo
17
22
  choices:
18
23
  missing: non sono completi
19
24
  too_many: sono troppi
@@ -78,6 +83,7 @@ it:
78
83
  collapse: Comprimi tutte le domande
79
84
  expand: Espandi tutte le domande
80
85
  preview: Anteprima
86
+ title: Modifica formulario per %{questionnaire_for}
81
87
  unpublished_warning: Il modulo non è pubblicato. Puoi modificare le sue domande, ma in questo modo cancellerai le risposte correnti.
82
88
  matrix_row:
83
89
  matrix_row: Riga
@@ -117,6 +123,7 @@ it:
117
123
  resize_and_pad: Ridimensionato e spaziato a
118
124
  resize_to_fit: Ridimensionato per adattarsi
119
125
  question_types:
126
+ files: I file
120
127
  long_answer: Risposta lunga
121
128
  matrix_multiple: Matrice (opzione multipla)
122
129
  matrix_single: Matrice (opzione singola)