decidim-forms 0.30.4 → 0.30.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6a0f4cea6ba0a0ef0d79e62bf482e26c6c48ab12d37728c573a31787d2695bd9
4
- data.tar.gz: '079a62c596d24c2dc0de52a2e10aaf6fd753330c0842dce9da336173079a76ae'
3
+ metadata.gz: e06e7d226bccdc4f66eb8caf167f5b1df063e7d5d4177e9fa1ecb5c128f0a5b6
4
+ data.tar.gz: e3e81b54b7935115821b67dd2a7bd79a5688ab1609d097318d032667d3318023
5
5
  SHA512:
6
- metadata.gz: 6f80063798eab93f515bb60a1e145a5e15437194a1d1f55309540d36e09fd5160cd4c34601046c0bb7acdc105bd91b10c10b8b387ada1a14408b972b8b530e98
7
- data.tar.gz: e23a02ad49d75d4b923eb9f83fc201ea0be58722bbc0ffabbe8c38b1bfd6ef251c3b6bd8d510a43e8eace0bc67be79c266d20dc94737981ff54aba3adf5236e4
6
+ metadata.gz: 0f22985f3338a928b32c0248789e0dea4f4052d82696ecbb42951f4a55b370eae67df3eb44bb46d9efaba5e19ad73148e4aaaf348d2b716437eb11af983d6cfe
7
+ data.tar.gz: 5244b69958892b107747377b6125468c49eaeb1a86000cc241158f721acdcb8d86c1fb1728b3ff387d8ec85f73f66ae68a9e0f4ec0d6e7f81ca1a8a145588060
@@ -39,7 +39,7 @@ module Decidim
39
39
  end
40
40
 
41
41
  def questions_for_select(questionnaire, id)
42
- questionnaire.questions.map do |question|
42
+ questionnaire.questions.not_separator.map do |question|
43
43
  [
44
44
  question.translated_body,
45
45
  question.id,
@@ -42,18 +42,15 @@ module Decidim
42
42
 
43
43
  # Public: Splits responses by step, keeping the separator.
44
44
  #
45
- # Returns an array of steps. Each step is a list of the questions in that
46
- # step, including the separator.
45
+ # Returns an array of steps. Splits responses at each separator.
46
+ # Allowing only steps with questions to be counted, excluding the separators.
47
47
  def responses_by_step
48
- @responses_by_step ||=
49
- begin
50
- steps = responses.chunk_while do |a, b|
51
- !a.question.separator? || b.question.separator?
52
- end.to_a
53
-
54
- steps = [[]] if steps == []
55
- steps
48
+ @responses_by_step ||= begin
49
+ steps = responses.slice_before { |response| response.question.separator? }.map do |group|
50
+ group.reject { |response| response.question.separator? }
56
51
  end
52
+ steps.reject(&:empty?)
53
+ end
57
54
  end
58
55
 
59
56
  def total_steps
@@ -7,7 +7,6 @@ import AutoSelectOptionsFromUrl from "src/decidim/forms/admin/auto_select_option
7
7
  import createLiveTextUpdateComponent from "src/decidim/forms/admin/live_text_update.component"
8
8
  import AutoButtonsByPositionComponent from "src/decidim/admin/auto_buttons_by_position.component"
9
9
  import AutoLabelByPositionComponent from "src/decidim/admin/auto_label_by_position.component"
10
- import createSortList from "src/decidim/admin/sort_list.component"
11
10
  import createDynamicFields from "src/decidim/admin/dynamic_fields.component"
12
11
  import createFieldDependentInputs from "src/decidim/admin/field_dependent_inputs.component"
13
12
  import initLanguageChangeSelect from "src/decidim/admin/choose_language"
@@ -99,16 +98,16 @@ export default function createEditableForm() {
99
98
  })
100
99
  };
101
100
 
102
- const createSortableList = () => {
103
- createSortList(".questionnaire-questions-list:not(.published)", {
104
- handle: ".question-divider",
105
- placeholder: '<div style="border-style: dashed; border-color: #000"></div>',
106
- forcePlaceholderSize: true,
107
- onSortUpdate: () => {
101
+ // Listen for sortupdate events from html5sortable (initialized by draggable-table.js)
102
+ const setupSortUpdateListener = () => {
103
+ const container = document.querySelector(".questionnaire-questions-list:not(.published)");
104
+ if (container && !container.dataset.sortListenerAttached) {
105
+ container.addEventListener("sortupdate", () => {
108
106
  autoLabelByPosition.run();
109
107
  autoButtonsByPosition.run();
110
- }
111
- });
108
+ });
109
+ container.dataset.sortListenerAttached = "true";
110
+ }
112
111
  };
113
112
 
114
113
  const createDynamicQuestionTitle = (fieldId) => {
@@ -386,7 +385,7 @@ export default function createEditableForm() {
386
385
  moveDownFieldButtonSelector: ".move-down-question",
387
386
  onAddField: ($field) => {
388
387
  setupInitialQuestionAttributes($field);
389
- createSortableList();
388
+ setupSortUpdateListener();
390
389
 
391
390
  autoLabelByPosition.run();
392
391
  autoButtonsByPosition.run();
@@ -422,7 +421,7 @@ export default function createEditableForm() {
422
421
  }
423
422
  });
424
423
 
425
- createSortableList();
424
+ setupSortUpdateListener();
426
425
 
427
426
  $(fieldSelector).each((idx, el) => {
428
427
  const $target = $(el);
@@ -35,10 +35,12 @@ module Decidim
35
35
  }
36
36
  end
37
37
 
38
- return choice(choices.first) if answer.question.question_type == "single_option"
39
-
40
38
  content_tag(:ul) do
41
- safe_join(choices.map { |c| choice(c) })
39
+ if answer.question.question_type == "single_option"
40
+ choice(choices.first)
41
+ else
42
+ safe_join(choices.map { |c| choice(c) })
43
+ end
42
44
  end
43
45
  end
44
46
 
@@ -39,7 +39,7 @@
39
39
  <%= cell("decidim/announcement", t(".already_answered_warning"), callout_class: "warning" ) %>
40
40
  <% end %>
41
41
 
42
- <div class="questionnaire-questions-list flex flex-col py-6 gap-6 last:pb-0" data-draggable-table data-sort-url="#" id="questionnaire-questions-list">
42
+ <div class="questionnaire-questions-list flex flex-col py-6 gap-6 last:pb-0" data-draggable-table data-sort-url="#" data-draggable-handle=".card-divider" id="questionnaire-questions-list">
43
43
  <% @form.questions.each_with_index do |question, index| %>
44
44
  <%= fields_for "questions[questions][]", question do |question_form| %>
45
45
  <% if question.separator? %>
@@ -75,35 +75,6 @@
75
75
  <script>
76
76
  document.addEventListener("DOMContentLoaded", function () {
77
77
  window.Decidim.createEditableForm();
78
-
79
- // Function to initialize the sortable functionality
80
- function initializeSortable() {
81
- const container = document.querySelector("#questionnaire-questions-list");
82
- const questionCards = container?.querySelectorAll(".card.questionnaire-question");
83
-
84
- if (!container || !questionCards?.length) return;
85
-
86
- questionCards.forEach(card => {
87
- card.setAttribute("draggable", "true");
88
- card.setAttribute("role", "option");
89
- card.setAttribute("aria-grabbed", "false");
90
- });
91
-
92
- window.Decidim?.createSortableList?.("#questionnaire-questions-list");
93
- }
94
-
95
- // Initialize on load and when new options such as questions etc are added
96
- initializeSortable();
97
-
98
- const observer = new MutationObserver(() => {
99
- clearTimeout(observer.timer);
100
- observer.timer = setTimeout(initializeSortable, 500);
101
- });
102
-
103
- const container = document.querySelector("#questionnaire-questions-list");
104
- if (container) {
105
- observer.observe(container, { childList: true, subtree: true });
106
- }
107
78
  });
108
79
  </script>
109
80
  <% end %>
@@ -55,6 +55,7 @@ de:
55
55
  tos: Nutzungsbedingungen
56
56
  questionnaires:
57
57
  actions:
58
+ back: Zurück zu den Antworten
58
59
  publish_answers: Antworten veröffentlichen
59
60
  show: Antworten anzeigen
60
61
  answer_option:
@@ -216,7 +217,7 @@ de:
216
217
  back: Zurück
217
218
  continue: Weiter
218
219
  disallowed: Sie dürfen Ihre Antworten nicht bearbeiten.
219
- submit: einreichen
220
+ submit: Absenden
220
221
  user_answers_serializer:
221
222
  body: Antwort
222
223
  completion: Abschluss
@@ -55,7 +55,7 @@ eu:
55
55
  tos: Zerbitzu-baldintzak
56
56
  questionnaires:
57
57
  actions:
58
- back: Itzuli erantzunetara
58
+ back: Erantzunetara itzuli
59
59
  publish_answers: Argitaratu erantzunak
60
60
  show: Erakutsi erantzunak
61
61
  answer_option:
@@ -94,7 +94,7 @@ eu:
94
94
  display_condition: Bistaratzeko baldintza
95
95
  mandatory: Baldintza hau beti bete behar da, beste baldintza batzuen egoera edozein dela ere
96
96
  remove: Kendu
97
- save_warning: Gogoratu formularioa gorde behar duzula, bistaratze-baldintzak konfiguratu aurretik
97
+ save_warning: Gogoratu formularioa gorde behar duzula bistaratzeko baldintzak konfiguratu aurretik
98
98
  select_answer_option: Hautatu erantzun-aukera
99
99
  select_condition_question: Hautatu galdera bat
100
100
  select_condition_type: Hautatu baldintza mota bat
@@ -119,7 +119,7 @@ eu:
119
119
  statement: Adierazpena
120
120
  question:
121
121
  add_answer_option: Gehitu erantzun aukera
122
- add_display_condition: Gehitu bistaratzeko baldintza
122
+ add_display_condition: Bistaratzeko baldintza gehitu
123
123
  add_display_condition_info: Gorde galdetegia bistaratzeko baldintzak konfiguratzeko
124
124
  add_matrix_row: Gehitu errenkada
125
125
  any: Edozein
@@ -4,32 +4,80 @@ pt-BR:
4
4
  attributes:
5
5
  answer:
6
6
  body: Responda
7
+ choices: Escolhas
8
+ selected_choices: Escolhas selecionadas
7
9
  question:
8
10
  max_choices: Número máximo de escolhas
9
11
  question_type: Tipo
10
12
  questionnaire_question:
11
13
  mandatory: Obrigatório
12
14
  max_characters: Limite de caracteres (deixe para 0 se não houver limite)
15
+ errors:
16
+ models:
17
+ answer:
18
+ attributes:
19
+ add_documents:
20
+ needs_to_be_reattached: Precisa ser reanexado
21
+ body:
22
+ too_long: é muito longo
23
+ choices:
24
+ missing: não estão completos
25
+ too_many: Você pode escolher um máximo de %{count}.
26
+ questionnaire:
27
+ request_invalid: Houve um problema ao lidar com a solicitação. Por favor, tente novamente.
13
28
  decidim:
29
+ download_your_data:
30
+ help:
31
+ answers:
32
+ answer: A resposta para a pergunta
33
+ id: O identificador único da resposta
34
+ question: A pergunta respondida
35
+ questionnaire: O questionário respondido
36
+ user: O usuário que respondeu o questionário
37
+ show:
38
+ answers: Exportação de respostas
39
+ survey_user_answers: Respostas do usuário
14
40
  forms:
15
41
  admin:
16
42
  models:
17
43
  components:
44
+ allow_answers: Permitir respostas
45
+ allow_editing_answers: Permitir que usuários registrados editem as próprias respostas de pesquisa
46
+ allow_unregistered: Permitir que usuários não registrados respondam à pesquisa
47
+ allow_unregistered_help: Se estiver ativo, não será necessário fazer login para responder à pesquisa. Isso pode levar a dados imprecisos ou não confiáveis ​​e tornará o sistema mais vulnerável a ataques automatizados. Use com cautela! Lembre-se de que um participante pode responder à mesma pesquisa várias vezes, usando navegadores diferentes ou o recurso de "navegação anônima" do seu navegador.
48
+ announcement: Anúncio
49
+ clean_after_publish: Excluir respostas ao publicar a pesquisa
18
50
  description: Descrição
51
+ ends_at: Respostas aceitas até
52
+ ends_at_help: Deixe em branco para nenhuma data específica
53
+ starts_at: Respostas aceitas de
54
+ starts_at_help: Deixe em branco para nenhuma data específica
19
55
  tos: Termos de serviço
20
56
  questionnaires:
21
57
  actions:
58
+ back: Voltar para respostas
59
+ publish_answers: Publicar respostas
22
60
  show: Mostrar respostas
23
61
  answer_option:
24
62
  answer_option: Opção de resposta
63
+ free_text: Texto livre
25
64
  remove: Remover
26
65
  statement: Declaração
27
66
  answers:
28
67
  actions:
68
+ back: Voltar para respostas
69
+ export: Exportar
70
+ next: Próximo &rsaquo;
71
+ previous: "&lsaquo; Anterior"
29
72
  show: Mostrar respostas
30
73
  empty: Ainda não há respostas
74
+ export:
75
+ answer:
76
+ title: 'Resposta #%{number}'
31
77
  export_response:
32
78
  title: pesquisa_respostas_do_usuário_%{token}
79
+ index:
80
+ title: "Total de respostas de %{total}"
33
81
  show:
34
82
  title: 'Resposta #%{number}'
35
83
  display_condition:
@@ -53,6 +101,12 @@ pt-BR:
53
101
  edit:
54
102
  save: Salvar
55
103
  title: Editar questionário
104
+ edit_questions:
105
+ add_question: Adicionar pergunta
106
+ add_separator: Adicionar separador
107
+ add_title_and_description: Adicionar título e descrição
108
+ save: Salvar
109
+ title: Perguntas
56
110
  form:
57
111
  add_question: Adicionar pergunta
58
112
  collapse: Recolher todas as questões
@@ -75,6 +129,11 @@ pt-BR:
75
129
  question: Questão
76
130
  remove: Remover
77
131
  statement: Declaração
132
+ questions_form:
133
+ collapse: Recolher todas as perguntas
134
+ expand: Expandir todas as perguntas
135
+ update:
136
+ success: Perguntas da pesquisa salvas com sucesso.
78
137
  separator:
79
138
  remove: Remover
80
139
  separator: Separador
@@ -89,8 +148,14 @@ pt-BR:
89
148
  invalid: Houve erros ao salvar o questionário.
90
149
  success: Formulário salvo com sucesso.
91
150
  admin_log:
151
+ question:
152
+ publish_answers: "%{user_name} publicou as respostas da pergunta %{resource_name} no espaço %{space_name}"
153
+ unpublish_answers: "%{user_name} não publicou as respostas da pergunta %{resource_name} no espaço %{space_name}"
92
154
  questionnaire:
93
155
  update: "%{user_name} atualizou o questionário %{resource_name}"
156
+ errors:
157
+ answer:
158
+ body: Corpo não pode estar em branco
94
159
  images:
95
160
  dimensions: "%{width} x %{height} px"
96
161
  processors:
@@ -106,20 +171,31 @@ pt-BR:
106
171
  single_option: Opção única
107
172
  sorting: Classificação
108
173
  title_and_description: Título e descrição
174
+ questionnaire_answer_presenter:
175
+ download_attachment: Baixar anexo
109
176
  questionnaires:
110
177
  answer:
111
178
  invalid: Houve erros ao responder a pesquisa.
179
+ max_choices_alert: Há muitas opções selecionadas
112
180
  success: Questionário respondido com sucesso.
113
181
  question:
114
182
  max_choices: 'Escolhas máximas: %{n}'
115
183
  show:
116
184
  answer_questionnaire:
185
+ already_have_an_account?: Já tem uma conta?
186
+ are_you_new?: Usuário novo?
187
+ sign_in_description: Faça ‘login’ para participar da pesquisa
188
+ sign_up_description: Crie uma conta de participante para responder à pesquisa
117
189
  title: Responda o questionário
118
190
  current_step: Passo %{step}
191
+ empty: Nenhuma pergunta configurada para este formulário ainda.
119
192
  of_total_steps: de %{total_steps}
120
193
  questionnaire_answered:
121
194
  body: Você já respondeu esta pesquisa.
122
195
  title: Já respondido
196
+ questionnaire_answered_edit:
197
+ body: Você já respondeu a este formulário. %{link}
198
+ edit: Editar suas respostas
123
199
  questionnaire_closed:
124
200
  body: O questionário está fechado e não pode ser respondido.
125
201
  title: Questionário fechado
@@ -134,11 +210,19 @@ pt-BR:
134
210
  tos_agreement: Ao participar você aceita seus Termos de Serviço
135
211
  step_navigation:
136
212
  show:
213
+ are_you_sure_edit_guest: Se você quiser ser capaz de editar suas respostas depois, então você precisa entrar ou criar uma conta.
137
214
  back: Voltar
138
215
  continue: Continuar
216
+ disallowed: Você não tem permissão para editar suas respostas.
139
217
  submit: Enviar
140
218
  user_answers_serializer:
141
219
  body: Resposta
220
+ completion: Conclusão
142
221
  created_at: Respondido em
143
222
  id: ID da resposta
223
+ ip_hash: IP 'Hash'
144
224
  question: Questão
225
+ registered: Registrado
226
+ session_token: Identificador do usuário
227
+ unregistered: Não registrado
228
+ user_status: '''Status'' do usuário'
@@ -145,7 +145,7 @@ ro:
145
145
  title: Formular închis
146
146
  questionnaire_for_private_users:
147
147
  body: Chestionarul este disponibil doar pentru utilizatorii privați
148
- title: Chestionar închis
148
+ title: Formular închis
149
149
  questionnaire_js_disabled:
150
150
  body: Unele dintre funcționalitățile acestui chestionar vor fi dezactivate. Pentru a îți îmbunătăți experiența, te rugăm să activezi JavaScript în browser-ul tău.
151
151
  title: JavaScript este dezactivat
@@ -60,7 +60,7 @@ sk:
60
60
  title: Formulár je uzavretý.
61
61
  questionnaire_for_private_users:
62
62
  body: Formulár je otvorený len pre súkromných používateľov
63
- title: Formulár je uzavretý
63
+ title: Formulár je uzavretý.
64
64
  tos_agreement: Účasťou súhlasíte s našimi Podmienkami použitia
65
65
  step_navigation:
66
66
  show:
@@ -4,7 +4,7 @@ module Decidim
4
4
  # This holds the decidim-forms version.
5
5
  module Forms
6
6
  def self.version
7
- "0.30.4"
7
+ "0.30.5"
8
8
  end
9
9
  end
10
10
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: decidim-forms
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.30.4
4
+ version: 0.30.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josep Jaume Rey Peroy
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2025-11-20 00:00:00.000000000 Z
14
+ date: 2026-01-28 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: decidim-core
@@ -19,42 +19,42 @@ dependencies:
19
19
  requirements:
20
20
  - - '='
21
21
  - !ruby/object:Gem::Version
22
- version: 0.30.4
22
+ version: 0.30.5
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - '='
28
28
  - !ruby/object:Gem::Version
29
- version: 0.30.4
29
+ version: 0.30.5
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: decidim-admin
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  requirements:
34
34
  - - '='
35
35
  - !ruby/object:Gem::Version
36
- version: 0.30.4
36
+ version: 0.30.5
37
37
  type: :development
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
41
  - - '='
42
42
  - !ruby/object:Gem::Version
43
- version: 0.30.4
43
+ version: 0.30.5
44
44
  - !ruby/object:Gem::Dependency
45
45
  name: decidim-dev
46
46
  requirement: !ruby/object:Gem::Requirement
47
47
  requirements:
48
48
  - - '='
49
49
  - !ruby/object:Gem::Version
50
- version: 0.30.4
50
+ version: 0.30.5
51
51
  type: :development
52
52
  prerelease: false
53
53
  version_requirements: !ruby/object:Gem::Requirement
54
54
  requirements:
55
55
  - - '='
56
56
  - !ruby/object:Gem::Version
57
- version: 0.30.4
57
+ version: 0.30.5
58
58
  description: A forms gem for decidim.
59
59
  email:
60
60
  - josepjaume@gmail.com