decidim-forms 0.24.0 → 0.25.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) 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/config/locales/sv.yml +9 -0
  46. data/db/migrate/20170515144119_create_decidim_forms_answers.rb +1 -2
  47. data/db/migrate/20210616153042_set_position_to_question_matrix_rows.rb +11 -0
  48. data/lib/decidim/forms/admin_engine.rb +0 -4
  49. data/lib/decidim/forms/engine.rb +2 -4
  50. data/lib/decidim/forms/test/factories.rb +39 -2
  51. data/lib/decidim/forms/test/shared_examples/has_questionnaire.rb +2 -0
  52. data/lib/decidim/forms/user_answers_serializer.rb +3 -0
  53. data/lib/decidim/forms/version.rb +1 -1
  54. metadata +35 -32
  55. data/app/assets/config/admin/decidim_forms_manifest.css +0 -3
  56. data/app/assets/config/admin/decidim_forms_manifest.js +0 -2
  57. data/app/assets/config/decidim_forms_manifest.css +0 -4
  58. data/app/assets/config/decidim_forms_manifest.js +0 -1
  59. data/app/assets/javascripts/decidim/forms/admin/auto_buttons_by_min_items.component.js.es6 +0 -25
  60. data/app/assets/javascripts/decidim/forms/admin/auto_select_options_by_total_items.component.js.es6 +0 -23
  61. data/app/assets/javascripts/decidim/forms/admin/auto_select_options_from_url.component.js.es6 +0 -40
  62. data/app/assets/javascripts/decidim/forms/admin/live_text_update.component.js.es6 +0 -52
  63. data/app/assets/javascripts/decidim/forms/autosortable_checkboxes.component.js.es6 +0 -85
  64. data/app/assets/javascripts/decidim/forms/display_conditions.component.js.es6 +0 -203
  65. data/app/assets/javascripts/decidim/forms/max_choices_alert.component.js.es6 +0 -44
  66. data/app/assets/javascripts/decidim/forms/option_attached_inputs.component.js.es6 +0 -32
  67. 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)