decidim-meetings 0.30.3 → 0.31.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 (203) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/meetings/cancel_registration_meeting_button/cancelation_modal.erb +7 -4
  3. data/app/cells/decidim/meetings/cancel_registration_meeting_button/show.erb +1 -1
  4. data/app/cells/decidim/meetings/cancel_registration_meeting_button_cell.rb +36 -0
  5. data/app/cells/decidim/meetings/dates_and_map_cell.rb +1 -1
  6. data/app/cells/decidim/meetings/join_meeting_button/registration_modal.erb +4 -5
  7. data/app/cells/decidim/meetings/join_meeting_button/show.erb +25 -28
  8. data/app/cells/decidim/meetings/join_meeting_button/waitlist_button.erb +22 -0
  9. data/app/cells/decidim/meetings/join_meeting_button_cell.rb +28 -0
  10. data/app/cells/decidim/meetings/question_responses/show.erb +7 -7
  11. data/app/cells/decidim/meetings/question_responses_cell.rb +28 -28
  12. data/app/commands/decidim/meetings/admin/copy_meeting.rb +5 -2
  13. data/app/commands/decidim/meetings/admin/create_agenda.rb +6 -2
  14. data/app/commands/decidim/meetings/admin/create_meeting.rb +7 -3
  15. data/app/commands/decidim/meetings/admin/mark_as_attendee.rb +44 -0
  16. data/app/commands/decidim/meetings/admin/publish_meeting.rb +2 -1
  17. data/app/commands/decidim/meetings/admin/update_agenda.rb +6 -2
  18. data/app/commands/decidim/meetings/admin/update_meeting.rb +15 -6
  19. data/app/commands/decidim/meetings/admin/update_questionnaire.rb +4 -4
  20. data/app/commands/decidim/meetings/admin/update_registrations.rb +19 -7
  21. data/app/commands/decidim/meetings/create_meeting.rb +2 -3
  22. data/app/commands/decidim/meetings/{create_answer.rb → create_response.rb} +11 -11
  23. data/app/commands/decidim/meetings/join_meeting.rb +4 -6
  24. data/app/commands/decidim/meetings/join_waitlist.rb +53 -0
  25. data/app/commands/decidim/meetings/leave_meeting.rb +14 -5
  26. data/app/commands/decidim/meetings/update_meeting.rb +1 -2
  27. data/app/controllers/concerns/decidim/meetings/admin/filterable.rb +1 -1
  28. data/app/controllers/decidim/meetings/admin/agenda_controller.rb +2 -2
  29. data/app/controllers/decidim/meetings/admin/invites_controller.rb +1 -1
  30. data/app/controllers/decidim/meetings/admin/meeting_closes_controller.rb +1 -1
  31. data/app/controllers/decidim/meetings/admin/meeting_copies_controller.rb +1 -1
  32. data/app/controllers/decidim/meetings/admin/meetings_controller.rb +4 -4
  33. data/app/controllers/decidim/meetings/admin/meetings_poll_controller.rb +10 -10
  34. data/app/controllers/decidim/meetings/admin/registrations_attendees_controller.rb +79 -0
  35. data/app/controllers/decidim/meetings/admin/registrations_controller.rb +1 -22
  36. data/app/controllers/decidim/meetings/meeting_closes_controller.rb +1 -1
  37. data/app/controllers/decidim/meetings/meetings_controller.rb +11 -11
  38. data/app/controllers/decidim/meetings/polls/{answers_controller.rb → responses_controller.rb} +7 -7
  39. data/app/controllers/decidim/meetings/registrations_controller.rb +39 -12
  40. data/app/events/decidim/meetings/registration_marked_as_attendee_event.rb +9 -0
  41. data/app/events/decidim/meetings/upcoming_meeting_event.rb +41 -0
  42. data/app/events/decidim/meetings/update_meeting_event.rb +25 -0
  43. data/app/forms/decidim/meetings/admin/close_meeting_form.rb +2 -1
  44. data/app/forms/decidim/meetings/admin/meeting_agenda_items_form.rb +4 -0
  45. data/app/forms/decidim/meetings/admin/meeting_form.rb +28 -3
  46. data/app/forms/decidim/meetings/admin/question_form.rb +3 -3
  47. data/app/forms/decidim/meetings/admin/{answer_option_form.rb → response_option_form.rb} +3 -3
  48. data/app/forms/decidim/meetings/admin/validate_registration_code_form.rb +1 -1
  49. data/app/forms/decidim/meetings/base_meeting_form.rb +0 -2
  50. data/app/forms/decidim/meetings/close_meeting_form.rb +2 -1
  51. data/app/forms/decidim/meetings/join_meeting_form.rb +0 -1
  52. data/app/forms/decidim/meetings/meeting_form.rb +3 -2
  53. data/app/forms/decidim/meetings/response_choice_form.rb +14 -0
  54. data/app/forms/decidim/meetings/{answer_form.rb → response_form.rb} +7 -7
  55. data/app/helpers/decidim/meetings/application_helper.rb +0 -1
  56. data/app/helpers/decidim/meetings/meetings_helper.rb +14 -5
  57. data/app/jobs/decidim/meetings/promote_from_waitlist_job.rb +63 -0
  58. data/app/jobs/decidim/meetings/upcoming_meeting_notification_job.rb +1 -1
  59. data/app/mailers/decidim/meetings/registration_mailer.rb +13 -0
  60. data/app/models/decidim/meetings/agenda_item.rb +5 -0
  61. data/app/models/decidim/meetings/meeting.rb +15 -12
  62. data/app/models/decidim/meetings/question.rb +12 -12
  63. data/app/models/decidim/meetings/questionnaire.rb +1 -1
  64. data/app/models/decidim/meetings/registration.rb +19 -7
  65. data/app/models/decidim/meetings/{answer.rb → response.rb} +6 -6
  66. data/app/models/decidim/meetings/response_choice.rb +15 -0
  67. data/app/models/decidim/meetings/{answer_option.rb → response_option.rb} +5 -5
  68. data/app/packs/src/decidim/meetings/admin/destroy_meeting_alert.js +1 -1
  69. data/app/packs/src/decidim/meetings/admin/meetings_components_form.js +1 -8
  70. data/app/packs/src/decidim/meetings/admin/meetings_form.js +1 -1
  71. data/app/packs/src/decidim/meetings/admin/registrations_form.js +1 -1
  72. data/app/packs/src/decidim/meetings/admin/registrations_invite_form.js +1 -1
  73. data/app/packs/src/decidim/meetings/meetings_form.js +1 -1
  74. data/app/packs/src/decidim/meetings/meetings_polls.js +1 -1
  75. data/app/packs/src/decidim/meetings/poll.component.js +5 -5
  76. data/app/packs/stylesheets/decidim/meetings/_item.scss +5 -1
  77. data/app/packs/stylesheets/decidim/meetings/meetings.scss +4 -4
  78. data/app/permissions/decidim/meetings/admin/agenda_permissions.rb +34 -0
  79. data/app/permissions/decidim/meetings/admin/meeting_permissions.rb +44 -0
  80. data/app/permissions/decidim/meetings/admin/permissions.rb +5 -66
  81. data/app/permissions/decidim/meetings/admin/questionnaire_permissions.rb +30 -0
  82. data/app/permissions/decidim/meetings/meeting_permissions.rb +90 -0
  83. data/app/permissions/decidim/meetings/permissions.rb +9 -105
  84. data/app/presenters/decidim/meetings/admin_log/value_types/meeting_title_description_presenter.rb +1 -1
  85. data/app/presenters/decidim/meetings/agenda_item_presenter.rb +29 -0
  86. data/app/presenters/decidim/meetings/meeting_presenter.rb +11 -15
  87. data/app/presenters/decidim/meetings/registration_presenter.rb +24 -0
  88. data/app/queries/decidim/meetings/{questionnaire_user_answers.rb → questionnaire_user_responses.rb} +5 -5
  89. data/app/serializers/decidim/meetings/registration_serializer.rb +5 -6
  90. data/app/services/decidim/meetings/diff_renderer.rb +0 -1
  91. data/app/views/decidim/meetings/_calendar_modal.html.erb +1 -0
  92. data/app/views/decidim/meetings/admin/agenda/_agenda_item_fields.html.erb +1 -1
  93. data/app/views/decidim/meetings/admin/invites/_form.html.erb +1 -1
  94. data/app/views/decidim/meetings/admin/meeting_closes/_form.html.erb +1 -1
  95. data/app/views/decidim/meetings/admin/meetings/_form.html.erb +3 -2
  96. data/app/views/decidim/meetings/admin/meetings/_linked_spaces.html.erb +1 -1
  97. data/app/views/decidim/meetings/admin/meetings/_meeting-tr.html.erb +9 -14
  98. data/app/views/decidim/meetings/admin/meetings/_meeting_actions.html.erb +200 -69
  99. data/app/views/decidim/meetings/admin/meetings/_meetings-thead.html.erb +0 -3
  100. data/app/views/decidim/meetings/admin/meetings/_reminders.html.erb +19 -0
  101. data/app/views/decidim/meetings/admin/meetings/_services.html.erb +1 -1
  102. data/app/views/decidim/meetings/admin/meetings/index.html.erb +7 -5
  103. data/app/views/decidim/meetings/admin/meetings/manage_trash.html.erb +2 -1
  104. data/app/views/decidim/meetings/admin/poll/_form.html.erb +8 -37
  105. data/app/views/decidim/meetings/admin/poll/_question.html.erb +19 -9
  106. data/app/views/decidim/meetings/admin/poll/_response_option.html.erb +35 -0
  107. data/app/views/decidim/meetings/admin/poll/_response_option_template.html.erb +7 -0
  108. data/app/views/decidim/meetings/admin/poll/edit.html.erb +3 -3
  109. data/app/views/decidim/meetings/admin/registration_form/edit_questions.html.erb +5 -5
  110. data/app/views/decidim/meetings/admin/registrations/edit.html.erb +19 -39
  111. data/app/views/decidim/meetings/admin/registrations_attendees/index.html.erb +126 -0
  112. data/app/views/decidim/meetings/layouts/live_event.html.erb +1 -1
  113. data/app/views/decidim/meetings/meeting_closes/_form.html.erb +2 -2
  114. data/app/views/decidim/meetings/meetings/_form.html.erb +2 -11
  115. data/app/views/decidim/meetings/meetings/_meeting.html.erb +2 -2
  116. data/app/views/decidim/meetings/meetings/_meeting_actions.html.erb +3 -3
  117. data/app/views/decidim/meetings/meetings/_meeting_agenda.html.erb +2 -2
  118. data/app/views/decidim/meetings/meetings/_meeting_aside.html.erb +11 -10
  119. data/app/views/decidim/meetings/meetings/_meeting_poll_actions.html.erb +3 -3
  120. data/app/views/decidim/meetings/meetings/_registration_code_modal.html.erb +16 -0
  121. data/app/views/decidim/meetings/polls/questions/_index_admin.html.erb +1 -1
  122. data/app/views/decidim/meetings/polls/questions/_published_question.html.erb +5 -5
  123. data/app/views/decidim/meetings/polls/responses/_multiple_option.html.erb +13 -0
  124. data/app/views/decidim/meetings/polls/responses/_single_option.html.erb +13 -0
  125. data/app/views/decidim/meetings/polls/{answers → responses}/admin.html.erb +4 -4
  126. data/app/views/decidim/meetings/polls/{answers → responses}/index.html.erb +4 -4
  127. data/app/views/decidim/meetings/registration_mailer/confirmation.html.erb +6 -1
  128. data/config/assets.rb +2 -2
  129. data/config/locales/ar.yml +1 -26
  130. data/config/locales/bg.yml +2 -32
  131. data/config/locales/ca-IT.yml +87 -44
  132. data/config/locales/ca.yml +87 -44
  133. data/config/locales/cs.yml +71 -46
  134. data/config/locales/de.yml +87 -41
  135. data/config/locales/el.yml +1 -25
  136. data/config/locales/en.yml +89 -46
  137. data/config/locales/es-MX.yml +87 -44
  138. data/config/locales/es-PY.yml +87 -44
  139. data/config/locales/es.yml +87 -44
  140. data/config/locales/eu.yml +93 -50
  141. data/config/locales/fi-plain.yml +86 -43
  142. data/config/locales/fi.yml +85 -42
  143. data/config/locales/fr-CA.yml +79 -41
  144. data/config/locales/fr.yml +79 -41
  145. data/config/locales/ga-IE.yml +1 -7
  146. data/config/locales/gl.yml +1 -19
  147. data/config/locales/hu.yml +1 -22
  148. data/config/locales/id-ID.yml +0 -16
  149. data/config/locales/is-IS.yml +0 -10
  150. data/config/locales/it.yml +1 -29
  151. data/config/locales/ja.yml +88 -45
  152. data/config/locales/lb.yml +1 -15
  153. data/config/locales/lt.yml +1 -28
  154. data/config/locales/lv.yml +0 -16
  155. data/config/locales/nl.yml +1 -26
  156. data/config/locales/no.yml +1 -28
  157. data/config/locales/pl.yml +2 -32
  158. data/config/locales/pt-BR.yml +1 -28
  159. data/config/locales/pt.yml +1 -28
  160. data/config/locales/ro-RO.yml +56 -29
  161. data/config/locales/ru.yml +0 -16
  162. data/config/locales/sk.yml +0 -16
  163. data/config/locales/sl.yml +0 -4
  164. data/config/locales/sv.yml +85 -42
  165. data/config/locales/tr-TR.yml +0 -20
  166. data/config/locales/uk.yml +0 -12
  167. data/config/locales/zh-CN.yml +0 -19
  168. data/config/locales/zh-TW.yml +1 -26
  169. data/db/migrate/20181107175558_add_questionnaire_to_existing_meetings.rb +8 -2
  170. data/db/migrate/20200827153856_add_commentable_counter_cache_to_meetings.rb +8 -2
  171. data/db/migrate/20201016065302_fix_meetings_registration_terms.rb +8 -2
  172. data/db/migrate/20210310120731_add_followable_counter_cache_to_meetings.rb +8 -2
  173. data/db/migrate/20250317103343_rename_answer_to_response_in_decidim_meetings.rb +18 -0
  174. data/db/migrate/20250403094034_add_reminder_customization_to_decidim_meetings.rb +9 -0
  175. data/db/migrate/20250408071941_add_status_to_registrations_to_decidim_meetings_registrations.rb +8 -0
  176. data/lib/decidim/api/agenda_item_type.rb +6 -2
  177. data/lib/decidim/api/agenda_type.rb +6 -2
  178. data/lib/decidim/api/linked_resources_interface.rb +1 -1
  179. data/lib/decidim/api/meeting_type.rb +20 -10
  180. data/lib/decidim/api/service_type.rb +3 -0
  181. data/lib/decidim/meetings/admin_engine.rb +9 -1
  182. data/lib/decidim/meetings/component.rb +29 -8
  183. data/lib/decidim/meetings/engine.rb +6 -21
  184. data/lib/decidim/meetings/meeting_serializer.rb +1 -2
  185. data/lib/decidim/meetings/schema_org_event_meeting_serializer.rb +0 -10
  186. data/lib/decidim/meetings/seeds.rb +4 -13
  187. data/lib/decidim/meetings/test/factories.rb +10 -16
  188. data/lib/decidim/meetings/user_responses_serializer.rb +47 -0
  189. data/lib/decidim/meetings/version.rb +1 -1
  190. data/lib/decidim/meetings.rb +7 -9
  191. metadata +49 -35
  192. data/app/cells/decidim/meetings/attending_organizations_list_cell.rb +0 -32
  193. data/app/forms/decidim/meetings/answer_choice_form.rb +0 -14
  194. data/app/models/decidim/meetings/answer_choice.rb +0 -15
  195. data/app/queries/decidim/meetings/metrics/meeting_followers_metric_measure.rb +0 -31
  196. data/app/queries/decidim/meetings/metrics/meetings_metric_manage.rb +0 -48
  197. data/app/views/decidim/meetings/admin/poll/_answer_option.html.erb +0 -35
  198. data/app/views/decidim/meetings/admin/poll/_answer_option_template.html.erb +0 -7
  199. data/app/views/decidim/meetings/polls/answers/_multiple_option.html.erb +0 -13
  200. data/app/views/decidim/meetings/polls/answers/_single_option.html.erb +0 -13
  201. data/lib/decidim/meetings/download_your_data_user_answers_serializer.rb +0 -39
  202. data/lib/decidim/meetings/user_answers_serializer.rb +0 -47
  203. /data/app/views/decidim/meetings/polls/{answers → responses}/create.js.erb +0 -0
@@ -3,57 +3,37 @@
3
3
  <h1 class="item_show__header-title">
4
4
  <%= t("title", scope: "decidim.meetings.admin.registrations.form") %>
5
5
  <div class="flex items-center gap-x-4 ml-auto">
6
- <%= link_to t("invites", scope: "decidim.meetings.admin.registrations.form"), meeting_registrations_invites_path(meeting), class: "button button__sm button__secondary #{"disabled" unless allowed_to? :read_invites, :meeting, meeting: meeting}" %>
6
+ <%= link_to t("registrations", scope: "decidim.meetings.admin.registrations.form"), meeting_registrations_attendees_path(meeting), class: "button button__sm button__transparent-secondary #{"disabled" unless allowed_to? :read_invites, :meeting, meeting: meeting}" %>
7
+ <%= link_to t("invites", scope: "decidim.meetings.admin.registrations.form"), meeting_registrations_invites_path(meeting), class: "button button__sm button__transparent-secondary #{"disabled" unless allowed_to? :read_invites, :meeting, meeting: meeting}" %>
8
+
7
9
  <% if allowed_to? :export_registrations, :meeting, meeting: meeting %>
8
- <span class="exports button button__sm button__secondary button--title" data-toggle="export-dropdown">
9
- <%= t "actions.export", scope: "decidim.admin" %>
10
- <%= icon "arrow-down-s-line", class: "dropdown-filter-icon" %>
11
- </span>
12
- <div class="dropdown-pane" id="export-dropdown" data-dropdown data-auto-focus="true" data-close-on-click="true">
13
- <ul class="vertical menu add-components">
10
+ <div class="relative">
11
+ <button class="button button__sm button__transparent-secondary" data-controller="dropdown" data-target="export-dropdown">
12
+ <%= t "actions.export", scope: "decidim.admin" %>
13
+ <%= icon "arrow-down-s-line" %>
14
+ <%= icon "arrow-down-s-line" %>
15
+ </button>
16
+
17
+ <ul class="dropdown dropdown_bottom" id="export-dropdown">
14
18
  <% %w(CSV JSON Excel).each do |format| %>
15
- <%= link_to export_meeting_registrations_path(meeting_id: meeting, format:) do %>
16
- <li class="exports--format--<%= format.downcase %> exports--registrations"><%= t("decidim.admin.exports.export_as", name: t("decidim.#{current_component.manifest.name}.admin.exports.registrations"), export_format: format) %></li>
17
- <% end %>
19
+ <li class="dropdown__item">
20
+ <%= link_to export_meeting_registrations_path(meeting_id: meeting, format:), class: "dropdown__button" do %>
21
+ <%= t("decidim.admin.exports.export_as", name: t("decidim.#{current_component.manifest.name}.admin.exports.registrations"), export_format: format) %>
22
+ <% end %>
23
+ </li>
18
24
  <% end %>
19
25
  </ul>
20
26
  </div>
21
27
  <% end %>
22
- <%= link_to t("registration_form" , scope: "decidim.meetings.admin.registrations.form"), edit_meeting_registrations_form_path(meeting_id: meeting.id), class: "button button__sm button__secondary" %>
23
- <%= link_to t("manage_questions" , scope: "decidim.meetings.admin.registrations.form"), edit_questions_meeting_registrations_form_path(meeting_id: meeting.id), class: "button button__sm button__secondary" %>
28
+
29
+ <%= link_to t("registration_form" , scope: "decidim.meetings.admin.registrations.form"), edit_meeting_registrations_form_path(meeting_id: meeting.id), class: "button button__sm button__transparent-secondary" %>
30
+ <%= link_to t("manage_questions" , scope: "decidim.meetings.admin.registrations.form"), edit_questions_meeting_registrations_form_path(meeting_id: meeting.id), class: "button button__sm button__transparent-secondary" %>
24
31
  </div>
25
32
  </h1>
26
33
  </div>
27
34
 
28
35
  <div class="item__edit item__edit-1col">
29
36
  <div class="item__edit-form">
30
- <% if meeting.component.settings.registration_code_enabled %>
31
- <div class="card mb-4">
32
- <div class="card-divider">
33
- <h2 class="card-title">
34
- <%= t(".validate_registration_code") %>
35
- </h2>
36
- </div>
37
- <div class="card-section">
38
- <%= decidim_form_for(@validation_form, url: validate_registration_code_meeting_registrations_path, html: { class: "form form-defaults validate_meeting_registration_code" }) do |f| %>
39
- <div class="form__wrapper">
40
- <div class="card-section">
41
- <div class="row column">
42
- <div>
43
- <%= f.label :code %>
44
- </div>
45
- <%= f.text_field :code, label: false %>
46
- </div>
47
- <div class="row column">
48
- <%= f.submit t(".validate"), class: "button button__sm button__secondary" %>
49
- </div>
50
- </div>
51
- </div>
52
- <% end %>
53
- </div>
54
- </div>
55
- <% end %>
56
-
57
37
  <%= cell("decidim/announcement", t("recommendation_message", scope: "decidim.meetings.admin.registrations.form"), callout_class: "warning" ) %>
58
38
 
59
39
  <%= decidim_form_for(@form, url: meeting_registrations_path, html: { class: "form-defaults form edit_meeting_registrations mt-4" }) do |f| %>
@@ -0,0 +1,126 @@
1
+ <% add_decidim_page_title(t("title", scope: "decidim.meetings.admin.registrations_attendees.index")) %>
2
+ <div class="item_show__header">
3
+ <h1 class="item_show__header-title">
4
+ <%= t("title", scope: "decidim.meetings.admin.registrations_attendees.index") %>
5
+ <div class="flex items-center gap-x-4 ml-auto">
6
+ <%= link_to t("invites", scope: "decidim.meetings.admin.registrations.form"), meeting_registrations_invites_path(meeting), class: "button button__sm button__transparent-secondary #{"disabled" unless allowed_to? :read_invites, :meeting, meeting: meeting}" %>
7
+
8
+ <% if allowed_to? :export_registrations, :meeting, meeting: meeting %>
9
+ <div class="relative">
10
+ <button class="exports button button__sm button__transparent-secondary button--title" data-controller="dropdown" data-target="export-dropdown">
11
+ <%= t "actions.export", scope: "decidim.admin" %>
12
+ <%= icon "arrow-down-s-line" %>
13
+ <%= icon "arrow-down-s-line" %>
14
+ </button>
15
+
16
+ <ul class="dropdown dropdown__bottom" id="export-dropdown" aria-hidden="true">
17
+ <% %w(CSV JSON Excel).each do |format| %>
18
+ <li class="dropdown__item">
19
+ <%= link_to export_meeting_registrations_path(meeting_id: meeting, format:), class: "dropdown__button" do %>
20
+ <%= t("decidim.admin.exports.export_as", name: t("decidim.#{current_component.manifest.name}.admin.exports.registrations"), export_format: format) %>
21
+ <% end %>
22
+ </li>
23
+ <% end %>
24
+ </ul>
25
+ </div>
26
+ <% end %>
27
+
28
+ <%= link_to t("registration_form" , scope: "decidim.meetings.admin.registrations.form"), edit_meeting_registrations_form_path(meeting_id: meeting.id), class: "button button__sm button__transparent-secondary" %>
29
+ <%= link_to t("manage_questions" , scope: "decidim.meetings.admin.registrations.form"), edit_questions_meeting_registrations_form_path(meeting_id: meeting.id), class: "button button__sm button__transparent-secondary" %>
30
+ </div>
31
+ </h1>
32
+ </div>
33
+
34
+ <div class="item__edit item__edit-1col">
35
+ <div class="item__edit-form">
36
+ <% if meeting.component.settings.registration_code_enabled %>
37
+ <div class="card mb-4">
38
+ <div class="card-divider">
39
+ <h2 class="card-title">
40
+ <%= t(".validate_registration_code") %>
41
+ </h2>
42
+ </div>
43
+ <div class="card-section">
44
+ <%= decidim_form_for(@validation_form, url: validate_registration_code_meeting_registrations_attendees_path, html: { class: "form form-defaults validate_meeting_registration_code" }) do |f| %>
45
+ <div class="form__wrapper">
46
+ <div class="card-section">
47
+ <div class="row column">
48
+ <div>
49
+ <%= f.label :code %>
50
+ </div>
51
+ <%= f.text_field :code, label: false %>
52
+ </div>
53
+ <div class="row column">
54
+ <%= f.submit t(".validate"), class: "button button__sm button__transparent-secondary" %>
55
+ </div>
56
+ </div>
57
+ </div>
58
+ <% end %>
59
+ </div>
60
+ </div>
61
+ <% end %>
62
+
63
+ <div class="card" id="meeting-invites">
64
+ <div class="table-stacked">
65
+ <table class="table-list">
66
+ <thead>
67
+ <tr>
68
+ <th><%= t("models.registration.fields.name", scope: "decidim.meetings") %></th>
69
+ <th><%= t("models.registration.fields.email", scope: "decidim.meetings") %></th>
70
+ <th><%= t("models.registration.fields.status", scope: "decidim.meetings") %></th>
71
+ <th><%= t("models.registration.actions", scope: "decidim.meetings") %></th>
72
+ </tr>
73
+ </thead>
74
+ <tbody>
75
+ <% registrations.each do |registration| %>
76
+ <% presenter = registration.presenter %>
77
+
78
+ <tr data-id="<%= registration.id %>">
79
+ <td data-label="<%= t("models.registration.fields.name", scope: "decidim.meetings") %>">
80
+ <%= presenter.name %>
81
+ </td>
82
+ <td data-label="<%= t("models.registration.fields.email", scope: "decidim.meetings") %>">
83
+ <%= presenter.email %>
84
+ </td>
85
+ <td class="<%= presenter.status_html_class %>" data-label="<%= t("models.registration.fields.status", scope: "decidim.meetings") %>">
86
+ <strong class="label <%= presenter.status_html_class %>">
87
+ <%= presenter.status %>
88
+ </strong>
89
+ </td>
90
+ <td class="table-list__actions" data-label="<%= t("models.registration.actions", scope: "decidim.meetings") %>">
91
+ <% if allowed_to? :update, :meeting, meeting: meeting %>
92
+ <button type="button" data-controller="dropdown" data-target="actions-meeting-registration-<%= registration.id %>" aria-label="<%= t("actions.actions_label", scope: "decidim.admin", resource: translated_attribute(meeting.title)) %>">
93
+ <%= icon "more-fill", class: "text-secondary" %>
94
+ </button>
95
+
96
+ <div class="inline-block relative">
97
+ <ul id="actions-meeting-registration-<%= registration.id %>" class="dropdown dropdown__action" aria-hidden="true">
98
+ <li class="dropdown__item">
99
+ <% if presenter.validated? %>
100
+ <div class="dropdown__button-disabled">
101
+ <%= with_tooltip t("tooltips.cannot_mark_attendee", scope: "decidim.admin") do %>
102
+ <%= icon "user-follow-line", class: "text-gray" %>
103
+ <span>
104
+ <%= t("actions.mark_as_attendee", scope: "decidim.meetings") %>
105
+ </span>
106
+ <% end %>
107
+ </div>
108
+ <% else %>
109
+ <%= link_to mark_as_attendee_meeting_registrations_attendee_path(id: registration), method: :put, class: "dropdown__button" do %>
110
+ <%= icon "user-follow-line" %>
111
+ <%= t("actions.mark_as_attendee", scope: "decidim.meetings") %>
112
+ <% end %>
113
+ <% end %>
114
+ </li>
115
+ </ul>
116
+ </div>
117
+ <% end %>
118
+ </td>
119
+ </tr>
120
+ <% end %>
121
+ </tbody>
122
+ </table>
123
+ </div>
124
+ </div>
125
+ </div>
126
+ </div>
@@ -15,7 +15,7 @@
15
15
 
16
16
  <header class="meeting-polls__header">
17
17
  <div>
18
- <strong class="text-secondary"><%= current_organization_name %></strong> / <strong><%= present(meeting).title(links: true, html_escape: true ) %></strong>
18
+ <strong class="text-secondary"><%= current_organization_name %></strong> / <strong><%= present(meeting).title(html_escape: true) %></strong>
19
19
  </div>
20
20
 
21
21
  <div class="flex gap-10">
@@ -1,7 +1,7 @@
1
- <%= text_editor_for(form, :closing_report, hashtaggable: true) %>
1
+ <%= text_editor_for(form, :closing_report) %>
2
2
 
3
3
  <%= form.number_field :attendees_count, min: 0, help_text: t("decidim.forms.meetings.attendees_count_help_text") %>
4
4
 
5
- <% if Decidim::Meetings.enable_proposal_linking %>
5
+ <% if Decidim.module_installed?(:proposals) %>
6
6
  <%= render partial: "decidim/proposals/proposals/proposals_picker", locals: { form:, field: :proposals } %>
7
7
  <% end %>
@@ -1,9 +1,9 @@
1
1
  <div>
2
- <%= form.text_field :title, autofocus: true, class: "js-hashtags", hashtaggable: true %>
2
+ <%= form.text_field :title, autofocus: true %>
3
3
  </div>
4
4
 
5
5
  <div>
6
- <%= text_editor_for(form, :description, hashtaggable: true) %>
6
+ <%= text_editor_for(form, :description) %>
7
7
  </div>
8
8
 
9
9
  <div>
@@ -79,13 +79,4 @@
79
79
  <label><%= t(".disclaimer", organization: organization_name(current_component.organization)) %></label><br>
80
80
  </div>
81
81
 
82
- <div>
83
- <%= form.select(
84
- :user_group_id,
85
- Decidim::UserGroups::ManageableUserGroups.for(current_user).verified.map { |g| [g.name, g.id] },
86
- prompt: current_user.name,
87
- label: t(".create_as")
88
- ) %>
89
- </div>
90
-
91
82
  <%= append_javascript_pack_tag "decidim_meetings" %>
@@ -3,7 +3,7 @@
3
3
  <%= render partial: "schema_org_event_meeting" %>
4
4
 
5
5
  <section class="layout-main__section layout-main__heading">
6
- <h1 class="h2 decorator"><%= present(meeting).title(links: true, html_escape: true ) %></h1>
6
+ <h1 class="h2 decorator"><%= present(meeting).title(html_escape: true ) %></h1>
7
7
  <%= cell "decidim/meetings/dates_and_map", meeting %>
8
8
  <div class="block md:hidden">
9
9
  <%= render partial: "meeting_aside", locals: { hide_modal: true } %>
@@ -34,7 +34,7 @@
34
34
  <div class="layout-author <%= "has_status" if meeting.private_meeting? || meeting.withdrawn? %>">
35
35
  <div class="relative flex items-center justify-center w-full">
36
36
  <div class="w-10/12 flex items-center gap-4">
37
- <%= cell "decidim/author", author_presenter_for(meeting.normalized_author), from: meeting, context_actions: nil, layout: :compact %>
37
+ <%= cell "decidim/author", author_presenter_for(meeting.author), from: meeting, context_actions: nil, layout: :compact %>
38
38
  </div>
39
39
  <%= render "decidim/shared/resource_actions", resource: meeting do %>
40
40
  <%= render "decidim/meetings/meetings/meeting_actions" %>
@@ -1,6 +1,6 @@
1
1
  <% if allowed_to?(:update, :meeting, meeting: meeting) %>
2
2
  <li role="menuitem">
3
- <%= link_to edit_meeting_path(meeting), class: "button button__sm button__text button__text-secondary" do %>
3
+ <%= link_to edit_meeting_path(meeting), class: "dropdown__button" do %>
4
4
  <span><%= t("edit_meeting", scope: "decidim.meetings.meetings.meeting") %></span>
5
5
  <%= icon "pencil-line" %>
6
6
  <% end %>
@@ -10,7 +10,7 @@
10
10
  <% if allowed_to?(:close, :meeting, meeting: meeting) %>
11
11
  <% caption = meeting.closed? ? t("edit_close_meeting", scope: "decidim.meetings.meetings.meeting") : t("close_meeting", scope: "decidim.meetings.meetings.meeting") %>
12
12
  <li role="menuitem">
13
- <%= link_to edit_meeting_meeting_close_path(meeting_id: meeting.id, id: meeting.id), class: "button button__sm button__text button__text-secondary" do %>
13
+ <%= link_to edit_meeting_meeting_close_path(meeting_id: meeting.id, id: meeting.id), class: "dropdown__button" do %>
14
14
  <span><%= caption %></span>
15
15
  <%= icon "lock-line" %>
16
16
  <% end %>
@@ -23,7 +23,7 @@
23
23
  :withdraw,
24
24
  withdraw_meeting_path(meeting),
25
25
  method: :put,
26
- class: "button button__sm button__text button__text-secondary" ,
26
+ class: "dropdown__button" ,
27
27
  title: t("withdraw_btn_hint", scope: "decidim.meetings.meetings.show"),
28
28
  data: { confirm: t("withdraw_confirmation_html", scope: "decidim.meetings.meetings.show") }
29
29
  ) do %>
@@ -12,7 +12,7 @@
12
12
  <span><%= display_duration_agenda_items(agenda_item.id, index, agenda_items_times) %></span>
13
13
  </h3>
14
14
 
15
- <div class="meeting__agenda-item__description editor-content"><%= decidim_sanitize_translated(agenda_item.description).html_safe %></div>
15
+ <div class="meeting__agenda-item__description editor-content"><%= render_meeting_sanitize_field(agenda_item, :description) %></div>
16
16
 
17
17
  <% if agenda_item.agenda_item_children.presence %>
18
18
  <% parent_start_time = agenda_items_times[index][:start_time] %>
@@ -24,7 +24,7 @@
24
24
  <span><%= translated_attribute(agenda_item_child.title) %></span>
25
25
  <span><%= display_duration_agenda_items(agenda_item_child.id, index_child, agenda_item_children_times) %></span>
26
26
  </h4>
27
- <div class="meeting__agenda-item__description"><%= decidim_sanitize_translated(agenda_item_child.description).html_safe %></div>
27
+ <div class="meeting__agenda-item__description"><%= render_meeting_sanitize_field(agenda_item_child, :description) %></div>
28
28
  </div>
29
29
  <% end %>
30
30
  <% end %>
@@ -1,7 +1,7 @@
1
1
  <%= render partial: "meeting_poll_actions" %>
2
2
 
3
3
  <% if meeting.can_be_joined_by?(current_user) || meeting.on_different_platform? %>
4
- <section class="layout-aside__section layout-aside__buttons layout-aside__ctas-buttons" data-sticky-buttons>
4
+ <section class="layout-aside__section layout-aside__buttons layout-aside__ctas-buttons" data-controller="sticky-buttons">
5
5
  <%= cell "decidim/meetings/join_meeting_button", meeting, show_remaining_slots: true, hide_modal: local_assigns[:hide_modal] %>
6
6
  </section>
7
7
  <% end %>
@@ -35,19 +35,20 @@
35
35
  <% end %>
36
36
  <% end %>
37
37
 
38
- <% if registration.present? && registration.meeting.component.settings.registration_code_enabled %>
38
+ <% if registration.present? %>
39
+ <%= waitlist_status_block(registration) %>
40
+
41
+ <% if registration.meeting.component.settings.registration_code_enabled && registration.registered? %>
42
+ <%= render partial: "registration_code_modal" %>
39
43
  <%= render layout: "decidim/meetings/layouts/aside_block", locals: { emoji: "coupon-line" } do %>
40
- <h3 class="meeting__aside-block__title"><%= registration_code_help_text %></h3>
41
- <div class="meeting__aside-block__large"><%= registration.code %></div>
42
- <% if registration.validated? %>
43
- <div class="label success"><%= t("validated", scope: "decidim.meetings.meetings.show.registration_state") %></div>
44
- <% else %>
45
- <div class="label warning"><%= t("validation_pending", scope: "decidim.meetings.meetings.show.registration_state") %></div>
46
- <% end %>
44
+ <a href="#" class="text-secondary underline font-semibold text-sm" data-dialog-open="RegistrationQRCodeDialog">
45
+ <%= registration_code_help_text %>
46
+ </a>
47
47
  <% end %>
48
48
  <% end %>
49
+ <% end %>
49
50
 
50
- <% if meeting.services.any? %>
51
+ <% if meeting.services.any? %>
51
52
  <% meeting.services.each do |service| %>
52
53
  <%= render layout: "decidim/meetings/layouts/aside_block", locals: { emoji: "star-line" } do %>
53
54
  <h3 class="meeting__aside-block__title"><%= translated_attribute(service["title"]) %></h3>
@@ -2,10 +2,10 @@
2
2
  <% if meeting.poll&.has_questions? %>
3
3
  <section class="layout-aside__section layout-aside__buttons<%= extra_classes %>">
4
4
  <% reply_text = meeting.poll.has_open_questions? ? t("reply_poll", scope: "decidim.meetings.meetings.meeting") : t("view_poll", scope: "decidim.meetings.meetings.meeting") %>
5
- <%= action_authorized_link_to :reply_poll, reply_text, meeting_polls_answers_path(meeting), class: "button button__xl button__secondary w-full", data: { "redirect_url" => meeting_polls_answers_path(meeting) }, resource: meeting %>
5
+ <%= action_authorized_link_to :reply_poll, reply_text, meeting_polls_responses_path(meeting), class: "button button__xl button__secondary w-full", data: { "redirect_url" => meeting_polls_responses_path(meeting) }, resource: meeting %>
6
6
  <% if !allowed_to?(:reply_poll, :meeting, meeting:) && allowed_to?(:update, :poll, meeting:) %>
7
- <%= link_to admin_meeting_polls_answers_path(meeting), class: "button button__sm button__transparent-secondary w-full" do %>
8
- <span><%= t("administrate", scope: "decidim.meetings.polls.answers.index") %></span>
7
+ <%= link_to admin_meeting_polls_responses_path(meeting), class: "button button__sm button__transparent-secondary w-full" do %>
8
+ <span><%= t("administrate", scope: "decidim.meetings.polls.responses.index") %></span>
9
9
  <% end %>
10
10
  <% end %>
11
11
  </section>
@@ -0,0 +1,16 @@
1
+ <%= decidim_modal id: "RegistrationQRCodeDialog", class: "qr-modal" do %>
2
+ <div data-dialog-container>
3
+ <div data-dialog-title>
4
+ <%= icon "qr-code-line" %>
5
+ <h2 class="h4" tabindex="-1"><%= t("registration_and_qr_code", scope: "decidim.meetings.meetings.show") %></h2>
6
+ </div>
7
+ <div class="content">
8
+ <div>
9
+ <img src="data:;base64,<%= registration_qr_code_image %>" alt="<%= t("registration_and_qr_code", scope: "decidim.meetings.meetings.show") %>">
10
+ </div>
11
+ <div class="text-center">
12
+ <h2 class="h4"><%= t("registration_code", code: registration.code, scope: "decidim.meetings.meetings.show") %></h2>
13
+ </div>
14
+ </div>
15
+ </div>
16
+ <% end %>
@@ -25,7 +25,7 @@
25
25
  <% if question.unpublished? %>
26
26
  <button class="button button__sm button__secondary"><%= t(".send") %></button>
27
27
  <% else %>
28
- <div><%= pluralize(question.answers_count, t(".received_answer"), t(".received_answers")) %></div>
28
+ <div><%= pluralize(question.responses_count, t(".received_response"), t(".received_responses")) %></div>
29
29
  <% end %>
30
30
  </div>
31
31
 
@@ -4,15 +4,15 @@
4
4
 
5
5
  <div>
6
6
 
7
- <% @form = form || Decidim::Meetings::AnswerForm.new(question_id: question.id, current_user:) %>
7
+ <% @form = form || Decidim::Meetings::ResponseForm.new(question_id: question.id, current_user:) %>
8
8
 
9
9
  <p class="h3"><%= @form.label %></p>
10
10
 
11
- <%= decidim_form_for(@form, url: meeting_polls_answers_path(meeting), method: :post, remote: true, html: { class: "form-defaults" }, data: { "safe-path" => meeting_live_event_path(meeting) }) do |form| %>
12
- <div class="meeting-polls__answer" data-max-choices="<%= question.max_choices %>">
11
+ <%= decidim_form_for(@form, url: meeting_polls_responses_path(meeting), method: :post, remote: true, html: { class: "form-defaults" }, data: { "safe-path" => meeting_live_event_path(meeting) }) do |form| %>
12
+ <div class="meeting-polls__response" data-max-choices="<%= question.max_choices %>">
13
13
  <p class="form-error max-choices-alert mt-0 mb-4"><%= t(".max_choices_alert") %></p>
14
14
 
15
- <%= render partial: "decidim/meetings/polls/answers/#{question.question_type}", locals: { answer: @form.answer, question:, answer_form: form, disabled: question.answered_by?(current_user), field_id: question.id } %>
15
+ <%= render partial: "decidim/meetings/polls/responses/#{question.question_type}", locals: { response: @form.response, question:, response_form: form, disabled: question.responded_by?(current_user), field_id: question.id } %>
16
16
 
17
17
  <%= form.hidden_field :question_id %>
18
18
 
@@ -20,7 +20,7 @@
20
20
  <small class="form-error is-visible mt-1"><%= msg %></small>
21
21
  <% end %>
22
22
 
23
- <% if question.answered_by?(current_user) %>
23
+ <% if question.responded_by?(current_user) %>
24
24
  <%= cell("decidim/announcement", t(".question_replied"), callout_class: "success" ) %>
25
25
  <% else %>
26
26
  <button class="ml-auto mt-8 button button__lg button__secondary"><%= t(".reply_question") %></button>
@@ -0,0 +1,13 @@
1
+ <div class="response-questionnaire__single-option js-check-box-collection">
2
+ <% question.response_options.each_with_index do |response_option, idx| %>
3
+ <% choice = response.choices.find { |choice| choice.decidim_response_option_id == response_option.id } if response %>
4
+
5
+ <%= label_tag "response[choices][#{response_option.id}][response_option_id]", nil, class: "js-collection-input" do %>
6
+ <%= check_box_tag "response[choices][#{response_option.id}][response_option_id]",
7
+ response_option.id,
8
+ choice.present?, disabled: %>
9
+
10
+ <%= translated_attribute(response_option.body) %>
11
+ <% end %>
12
+ <% end %>
13
+ </div>
@@ -0,0 +1,13 @@
1
+ <% choice = response.choices.first if response %>
2
+
3
+ <% question.response_options.each_with_index do |response_option, idx| %>
4
+ <% choice_id = "#{field_id}_choices_#{idx}" %>
5
+
6
+ <%= label_tag "#{choice_id}_response_option" do %>
7
+ <%= radio_button_tag "response[choices][#{question.id}][response_option_id]",
8
+ response_option.id,
9
+ response_option.id == choice.try(:decidim_response_option_id),
10
+ id: "#{choice_id}_response_option", disabled: %>
11
+ <%= translated_attribute(response_option.body) %>
12
+ <% end %>
13
+ <% end %>
@@ -14,17 +14,17 @@
14
14
  <div class="meeting-polls__topbar is-admin">
15
15
  <%= link_to meeting_path(meeting), class: "button button__sm button__text md:button__text-secondary" do %>
16
16
  <%= icon "arrow-left-line" %>
17
- <%= t("back_to_meeting", scope: "decidim.meetings.polls.answers.index_admin") %>
17
+ <%= t("back_to_meeting", scope: "decidim.meetings.polls.responses.index_admin") %>
18
18
  <% end %>
19
19
 
20
- <%= action_authorized_link_to :reply_poll, meeting_polls_answers_path(meeting), class: "button button__sm button__secondary", data: { "redirect_url" => meeting_polls_answers_path(meeting) }, resource: meeting do %>
21
- <%= t("view_poll", scope: "decidim.meetings.polls.answers.index_admin") %>
20
+ <%= action_authorized_link_to :reply_poll, meeting_polls_responses_path(meeting), class: "button button__sm button__secondary", data: { "redirect_url" => meeting_polls_responses_path(meeting) }, resource: meeting do %>
21
+ <%= t("view_poll", scope: "decidim.meetings.polls.responses.index_admin") %>
22
22
  <% end %>
23
23
  </div>
24
24
 
25
25
  <div class="text-center">
26
26
  <h1 class="title-decorator inline-block text-left">
27
- <%= t("title", scope: "decidim.meetings.polls.answers.index_admin") %>
27
+ <%= t("title", scope: "decidim.meetings.polls.responses.index_admin") %>
28
28
  </h1>
29
29
  </div>
30
30
 
@@ -14,19 +14,19 @@
14
14
  <div class="meeting-polls__topbar">
15
15
  <%= link_to meeting_path(meeting), class: "button button__sm button__text-secondary" do %>
16
16
  <%= icon "arrow-left-line" %>
17
- <%= t("back_to_meeting", scope: "decidim.meetings.polls.answers.index_admin") %>
17
+ <%= t("back_to_meeting", scope: "decidim.meetings.polls.responses.index_admin") %>
18
18
  <% end %>
19
19
 
20
20
  <% if admin_allowed_to?(:update, :poll, meeting: meeting, poll: poll) %>
21
- <%= link_to admin_meeting_polls_answers_path(meeting), class: "button button__sm button__primary" do %>
22
- <%= t("administrate", scope: "decidim.meetings.polls.answers.index") %>
21
+ <%= link_to admin_meeting_polls_responses_path(meeting), class: "button button__sm button__primary" do %>
22
+ <%= t("administrate", scope: "decidim.meetings.polls.responses.index") %>
23
23
  <% end %>
24
24
  <% end %>
25
25
  </div>
26
26
 
27
27
  <div class="text-center">
28
28
  <h1 class="title-decorator inline-block text-left">
29
- <%= t("title", scope: "decidim.meetings.polls.answers.index") %>
29
+ <%= t("title", scope: "decidim.meetings.polls.responses.index") %>
30
30
  </h1>
31
31
  </div>
32
32
 
@@ -1,8 +1,13 @@
1
1
  <p class="email-instructions"><%= t(".confirmed_html", title: present(@meeting).title, url: @locator.url) %></p>
2
2
 
3
- <% if @registration.meeting.component.settings.registration_code_enabled %>
3
+ <% if @registration_code_enabled %>
4
4
  <p><%= t(".registration_code", code: @registration.code) %></p>
5
+
6
+ <center>
7
+ <%= image_tag attachments[@qr_filename].url %>
8
+ </center>
5
9
  <% end %>
10
+
6
11
  <% if @meeting.customize_registration_email? %>
7
12
  <p><%= present(@meeting).registration_email_custom_content %></p>
8
13
  <% end %>
data/config/assets.rb CHANGED
@@ -2,8 +2,8 @@
2
2
 
3
3
  base_path = File.expand_path("..", __dir__)
4
4
 
5
- Decidim::Webpacker.register_path("#{base_path}/app/packs")
6
- Decidim::Webpacker.register_entrypoints(
5
+ Decidim::Shakapacker.register_path("#{base_path}/app/packs")
6
+ Decidim::Shakapacker.register_entrypoints(
7
7
  decidim_meetings: "#{base_path}/app/packs/entrypoints/decidim_meetings.js",
8
8
  decidim_meetings_admin: "#{base_path}/app/packs/entrypoints/decidim_meetings_admin.js"
9
9
  )