decidim-meetings 0.30.5 → 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 (205) 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/meeting_cell.rb +6 -1
  11. data/app/cells/decidim/meetings/meeting_s_cell.rb +15 -0
  12. data/app/cells/decidim/meetings/question_responses/show.erb +7 -7
  13. data/app/cells/decidim/meetings/question_responses_cell.rb +28 -28
  14. data/app/commands/decidim/meetings/admin/copy_meeting.rb +5 -2
  15. data/app/commands/decidim/meetings/admin/create_agenda.rb +6 -2
  16. data/app/commands/decidim/meetings/admin/create_meeting.rb +7 -3
  17. data/app/commands/decidim/meetings/admin/mark_as_attendee.rb +44 -0
  18. data/app/commands/decidim/meetings/admin/publish_meeting.rb +2 -1
  19. data/app/commands/decidim/meetings/admin/update_agenda.rb +6 -2
  20. data/app/commands/decidim/meetings/admin/update_meeting.rb +15 -6
  21. data/app/commands/decidim/meetings/admin/update_questionnaire.rb +4 -4
  22. data/app/commands/decidim/meetings/admin/update_registrations.rb +19 -7
  23. data/app/commands/decidim/meetings/create_meeting.rb +2 -3
  24. data/app/commands/decidim/meetings/{create_answer.rb → create_response.rb} +11 -11
  25. data/app/commands/decidim/meetings/join_meeting.rb +4 -6
  26. data/app/commands/decidim/meetings/join_waitlist.rb +53 -0
  27. data/app/commands/decidim/meetings/leave_meeting.rb +14 -5
  28. data/app/commands/decidim/meetings/update_meeting.rb +1 -2
  29. data/app/controllers/concerns/decidim/meetings/admin/filterable.rb +1 -1
  30. data/app/controllers/decidim/meetings/admin/agenda_controller.rb +2 -2
  31. data/app/controllers/decidim/meetings/admin/invites_controller.rb +1 -1
  32. data/app/controllers/decidim/meetings/admin/meeting_closes_controller.rb +1 -1
  33. data/app/controllers/decidim/meetings/admin/meeting_copies_controller.rb +1 -1
  34. data/app/controllers/decidim/meetings/admin/meetings_controller.rb +4 -4
  35. data/app/controllers/decidim/meetings/admin/meetings_poll_controller.rb +10 -10
  36. data/app/controllers/decidim/meetings/admin/registrations_attendees_controller.rb +79 -0
  37. data/app/controllers/decidim/meetings/admin/registrations_controller.rb +1 -22
  38. data/app/controllers/decidim/meetings/meeting_closes_controller.rb +1 -1
  39. data/app/controllers/decidim/meetings/meetings_controller.rb +11 -44
  40. data/app/controllers/decidim/meetings/polls/{answers_controller.rb → responses_controller.rb} +7 -7
  41. data/app/controllers/decidim/meetings/registrations_controller.rb +39 -12
  42. data/app/events/decidim/meetings/registration_marked_as_attendee_event.rb +9 -0
  43. data/app/events/decidim/meetings/upcoming_meeting_event.rb +41 -0
  44. data/app/events/decidim/meetings/update_meeting_event.rb +25 -0
  45. data/app/forms/decidim/meetings/admin/close_meeting_form.rb +2 -1
  46. data/app/forms/decidim/meetings/admin/meeting_agenda_items_form.rb +4 -0
  47. data/app/forms/decidim/meetings/admin/meeting_form.rb +28 -3
  48. data/app/forms/decidim/meetings/admin/question_form.rb +3 -3
  49. data/app/forms/decidim/meetings/admin/{answer_option_form.rb → response_option_form.rb} +3 -3
  50. data/app/forms/decidim/meetings/admin/validate_registration_code_form.rb +1 -1
  51. data/app/forms/decidim/meetings/base_meeting_form.rb +0 -2
  52. data/app/forms/decidim/meetings/close_meeting_form.rb +2 -1
  53. data/app/forms/decidim/meetings/join_meeting_form.rb +0 -1
  54. data/app/forms/decidim/meetings/meeting_form.rb +3 -2
  55. data/app/forms/decidim/meetings/response_choice_form.rb +14 -0
  56. data/app/forms/decidim/meetings/{answer_form.rb → response_form.rb} +7 -7
  57. data/app/helpers/decidim/meetings/application_helper.rb +0 -1
  58. data/app/helpers/decidim/meetings/meetings_helper.rb +14 -5
  59. data/app/jobs/decidim/meetings/promote_from_waitlist_job.rb +63 -0
  60. data/app/jobs/decidim/meetings/upcoming_meeting_notification_job.rb +1 -1
  61. data/app/mailers/decidim/meetings/registration_mailer.rb +13 -0
  62. data/app/models/decidim/meetings/agenda_item.rb +5 -0
  63. data/app/models/decidim/meetings/meeting.rb +15 -12
  64. data/app/models/decidim/meetings/question.rb +12 -12
  65. data/app/models/decidim/meetings/questionnaire.rb +1 -1
  66. data/app/models/decidim/meetings/registration.rb +19 -7
  67. data/app/models/decidim/meetings/{answer.rb → response.rb} +6 -6
  68. data/app/models/decidim/meetings/response_choice.rb +15 -0
  69. data/app/models/decidim/meetings/{answer_option.rb → response_option.rb} +5 -5
  70. data/app/packs/src/decidim/meetings/admin/destroy_meeting_alert.js +1 -1
  71. data/app/packs/src/decidim/meetings/admin/meetings_components_form.js +1 -8
  72. data/app/packs/src/decidim/meetings/admin/meetings_form.js +1 -1
  73. data/app/packs/src/decidim/meetings/admin/registrations_form.js +1 -1
  74. data/app/packs/src/decidim/meetings/admin/registrations_invite_form.js +1 -1
  75. data/app/packs/src/decidim/meetings/meetings_form.js +1 -1
  76. data/app/packs/src/decidim/meetings/meetings_polls.js +1 -1
  77. data/app/packs/src/decidim/meetings/poll.component.js +5 -5
  78. data/app/packs/stylesheets/decidim/meetings/_item.scss +5 -1
  79. data/app/packs/stylesheets/decidim/meetings/meetings.scss +4 -4
  80. data/app/permissions/decidim/meetings/admin/agenda_permissions.rb +34 -0
  81. data/app/permissions/decidim/meetings/admin/meeting_permissions.rb +44 -0
  82. data/app/permissions/decidim/meetings/admin/permissions.rb +5 -66
  83. data/app/permissions/decidim/meetings/admin/questionnaire_permissions.rb +30 -0
  84. data/app/permissions/decidim/meetings/meeting_permissions.rb +90 -0
  85. data/app/permissions/decidim/meetings/permissions.rb +9 -105
  86. data/app/presenters/decidim/meetings/admin_log/value_types/meeting_title_description_presenter.rb +1 -1
  87. data/app/presenters/decidim/meetings/agenda_item_presenter.rb +29 -0
  88. data/app/presenters/decidim/meetings/meeting_presenter.rb +12 -15
  89. data/app/presenters/decidim/meetings/registration_presenter.rb +24 -0
  90. data/app/queries/decidim/meetings/{questionnaire_user_answers.rb → questionnaire_user_responses.rb} +5 -5
  91. data/app/serializers/decidim/meetings/registration_serializer.rb +5 -6
  92. data/app/services/decidim/meetings/diff_renderer.rb +0 -1
  93. data/app/views/decidim/meetings/_calendar_modal.html.erb +1 -0
  94. data/app/views/decidim/meetings/admin/agenda/_agenda_item_fields.html.erb +1 -1
  95. data/app/views/decidim/meetings/admin/invites/_form.html.erb +1 -1
  96. data/app/views/decidim/meetings/admin/meeting_closes/_form.html.erb +1 -1
  97. data/app/views/decidim/meetings/admin/meetings/_form.html.erb +3 -2
  98. data/app/views/decidim/meetings/admin/meetings/_linked_spaces.html.erb +1 -1
  99. data/app/views/decidim/meetings/admin/meetings/_meeting-tr.html.erb +9 -14
  100. data/app/views/decidim/meetings/admin/meetings/_meeting_actions.html.erb +200 -69
  101. data/app/views/decidim/meetings/admin/meetings/_meetings-thead.html.erb +0 -3
  102. data/app/views/decidim/meetings/admin/meetings/_reminders.html.erb +19 -0
  103. data/app/views/decidim/meetings/admin/meetings/_services.html.erb +1 -1
  104. data/app/views/decidim/meetings/admin/meetings/index.html.erb +7 -5
  105. data/app/views/decidim/meetings/admin/meetings/manage_trash.html.erb +2 -1
  106. data/app/views/decidim/meetings/admin/poll/_form.html.erb +9 -9
  107. data/app/views/decidim/meetings/admin/poll/_question.html.erb +19 -9
  108. data/app/views/decidim/meetings/admin/poll/_response_option.html.erb +35 -0
  109. data/app/views/decidim/meetings/admin/poll/_response_option_template.html.erb +7 -0
  110. data/app/views/decidim/meetings/admin/poll/edit.html.erb +3 -3
  111. data/app/views/decidim/meetings/admin/registration_form/edit_questions.html.erb +5 -5
  112. data/app/views/decidim/meetings/admin/registrations/edit.html.erb +19 -39
  113. data/app/views/decidim/meetings/admin/registrations_attendees/index.html.erb +126 -0
  114. data/app/views/decidim/meetings/layouts/live_event.html.erb +1 -1
  115. data/app/views/decidim/meetings/meeting_closes/_form.html.erb +2 -2
  116. data/app/views/decidim/meetings/meetings/_form.html.erb +2 -11
  117. data/app/views/decidim/meetings/meetings/_meeting.html.erb +2 -2
  118. data/app/views/decidim/meetings/meetings/_meeting_actions.html.erb +3 -3
  119. data/app/views/decidim/meetings/meetings/_meeting_agenda.html.erb +2 -2
  120. data/app/views/decidim/meetings/meetings/_meeting_aside.html.erb +11 -10
  121. data/app/views/decidim/meetings/meetings/_meeting_poll_actions.html.erb +3 -3
  122. data/app/views/decidim/meetings/meetings/_registration_code_modal.html.erb +16 -0
  123. data/app/views/decidim/meetings/polls/questions/_index_admin.html.erb +1 -1
  124. data/app/views/decidim/meetings/polls/questions/_published_question.html.erb +5 -5
  125. data/app/views/decidim/meetings/polls/responses/_multiple_option.html.erb +13 -0
  126. data/app/views/decidim/meetings/polls/responses/_single_option.html.erb +13 -0
  127. data/app/views/decidim/meetings/polls/{answers → responses}/admin.html.erb +4 -4
  128. data/app/views/decidim/meetings/polls/{answers → responses}/index.html.erb +4 -4
  129. data/app/views/decidim/meetings/registration_mailer/confirmation.html.erb +6 -1
  130. data/config/assets.rb +2 -2
  131. data/config/locales/ar.yml +1 -26
  132. data/config/locales/bg.yml +2 -32
  133. data/config/locales/ca-IT.yml +87 -44
  134. data/config/locales/ca.yml +87 -44
  135. data/config/locales/cs.yml +71 -46
  136. data/config/locales/de.yml +89 -46
  137. data/config/locales/el.yml +1 -25
  138. data/config/locales/en.yml +89 -46
  139. data/config/locales/es-MX.yml +87 -44
  140. data/config/locales/es-PY.yml +87 -44
  141. data/config/locales/es.yml +87 -44
  142. data/config/locales/eu.yml +114 -71
  143. data/config/locales/fi-plain.yml +86 -43
  144. data/config/locales/fi.yml +85 -42
  145. data/config/locales/fr-CA.yml +79 -41
  146. data/config/locales/fr.yml +79 -41
  147. data/config/locales/ga-IE.yml +1 -8
  148. data/config/locales/gl.yml +1 -19
  149. data/config/locales/hu.yml +1 -23
  150. data/config/locales/id-ID.yml +0 -16
  151. data/config/locales/is-IS.yml +0 -10
  152. data/config/locales/it.yml +1 -38
  153. data/config/locales/ja.yml +88 -45
  154. data/config/locales/lb.yml +1 -16
  155. data/config/locales/lt.yml +1 -28
  156. data/config/locales/lv.yml +0 -16
  157. data/config/locales/nl.yml +1 -26
  158. data/config/locales/no.yml +1 -29
  159. data/config/locales/pl.yml +2 -32
  160. data/config/locales/pt-BR.yml +13 -205
  161. data/config/locales/pt.yml +1 -29
  162. data/config/locales/ro-RO.yml +56 -32
  163. data/config/locales/ru.yml +0 -16
  164. data/config/locales/sk.yml +0 -16
  165. data/config/locales/sl.yml +0 -4
  166. data/config/locales/sv.yml +89 -46
  167. data/config/locales/tr-TR.yml +0 -20
  168. data/config/locales/uk.yml +0 -12
  169. data/config/locales/zh-CN.yml +0 -19
  170. data/config/locales/zh-TW.yml +1 -26
  171. data/db/migrate/20181107175558_add_questionnaire_to_existing_meetings.rb +8 -2
  172. data/db/migrate/20200827153856_add_commentable_counter_cache_to_meetings.rb +8 -2
  173. data/db/migrate/20201016065302_fix_meetings_registration_terms.rb +8 -2
  174. data/db/migrate/20210310120731_add_followable_counter_cache_to_meetings.rb +8 -2
  175. data/db/migrate/20250317103343_rename_answer_to_response_in_decidim_meetings.rb +18 -0
  176. data/db/migrate/20250403094034_add_reminder_customization_to_decidim_meetings.rb +9 -0
  177. data/db/migrate/20250408071941_add_status_to_registrations_to_decidim_meetings_registrations.rb +8 -0
  178. data/lib/decidim/api/agenda_item_type.rb +6 -2
  179. data/lib/decidim/api/agenda_type.rb +6 -2
  180. data/lib/decidim/api/linked_resources_interface.rb +1 -1
  181. data/lib/decidim/api/meeting_type.rb +20 -10
  182. data/lib/decidim/api/service_type.rb +3 -0
  183. data/lib/decidim/meetings/admin_engine.rb +9 -1
  184. data/lib/decidim/meetings/component.rb +29 -20
  185. data/lib/decidim/meetings/engine.rb +6 -21
  186. data/lib/decidim/meetings/meeting_serializer.rb +1 -2
  187. data/lib/decidim/meetings/schema_org_event_meeting_serializer.rb +0 -10
  188. data/lib/decidim/meetings/seeds.rb +4 -13
  189. data/lib/decidim/meetings/test/factories.rb +10 -16
  190. data/lib/decidim/meetings/user_responses_serializer.rb +47 -0
  191. data/lib/decidim/meetings/version.rb +1 -1
  192. data/lib/decidim/meetings.rb +7 -9
  193. metadata +50 -35
  194. data/app/cells/decidim/meetings/attending_organizations_list_cell.rb +0 -32
  195. data/app/forms/decidim/meetings/answer_choice_form.rb +0 -14
  196. data/app/models/decidim/meetings/answer_choice.rb +0 -15
  197. data/app/queries/decidim/meetings/metrics/meeting_followers_metric_measure.rb +0 -31
  198. data/app/queries/decidim/meetings/metrics/meetings_metric_manage.rb +0 -48
  199. data/app/views/decidim/meetings/admin/poll/_answer_option.html.erb +0 -35
  200. data/app/views/decidim/meetings/admin/poll/_answer_option_template.html.erb +0 -7
  201. data/app/views/decidim/meetings/polls/answers/_multiple_option.html.erb +0 -13
  202. data/app/views/decidim/meetings/polls/answers/_single_option.html.erb +0 -13
  203. data/lib/decidim/meetings/download_your_data_user_answers_serializer.rb +0 -39
  204. data/lib/decidim/meetings/user_answers_serializer.rb +0 -47
  205. /data/app/views/decidim/meetings/polls/{answers → responses}/create.js.erb +0 -0
@@ -8,11 +8,11 @@ module Decidim
8
8
  return permission_action unless user
9
9
  return permission_action unless permission_action.scope == :admin
10
10
 
11
- allowed_registration_form_action?
12
- allowed_meeting_action?
13
- allowed_agenda_action?
14
- allowed_poll_action?
15
- allowed_export_answers?
11
+ return Decidim::Meetings::Admin::MeetingPermissions.new(user, permission_action, context).permissions if subject == :meeting
12
+ return Decidim::Meetings::Admin::QuestionnairePermissions.new(user, permission_action, context).permissions if subject == :questionnaire
13
+ return Decidim::Meetings::Admin::AgendaPermissions.new(user, permission_action, context).permissions if subject == :agenda
14
+
15
+ toggle_allow(poll.present? && meeting.present?) if subject == :poll && action == :update
16
16
 
17
17
  permission_action
18
18
  end
@@ -23,70 +23,9 @@ module Decidim
23
23
  @meeting ||= context.fetch(:meeting, nil)
24
24
  end
25
25
 
26
- def agenda
27
- @agenda ||= context.fetch(:agenda, nil)
28
- end
29
-
30
26
  def poll
31
27
  @poll ||= context.fetch(:poll, nil)
32
28
  end
33
-
34
- def registration_form
35
- @registration_form ||= context.fetch(:questionnaire, nil)
36
- end
37
-
38
- def allowed_meeting_action?
39
- return unless permission_action.subject == :meeting
40
-
41
- return disallow! if meeting && !meeting.official?
42
-
43
- case permission_action.action
44
- when :close, :copy, :export_registrations, :update, :read_invites
45
- toggle_allow(meeting.present?)
46
- when :invite_attendee
47
- toggle_allow(meeting.present? && meeting.registrations_enabled?)
48
- when :create
49
- allow!
50
- end
51
- end
52
-
53
- def allowed_registration_form_action?
54
- return unless permission_action.subject == :questionnaire
55
-
56
- case permission_action.action
57
- when :update
58
- toggle_allow(registration_form.present?)
59
- end
60
- end
61
-
62
- def allowed_agenda_action?
63
- return unless permission_action.subject == :agenda
64
-
65
- case permission_action.action
66
- when :create
67
- toggle_allow(meeting.present?)
68
- when :update
69
- toggle_allow(agenda.present? && meeting.present?)
70
- end
71
- end
72
-
73
- def allowed_poll_action?
74
- return unless permission_action.subject == :poll
75
-
76
- case permission_action.action
77
- when :update
78
- toggle_allow(poll.present? && meeting.present?)
79
- end
80
- end
81
-
82
- def allowed_export_answers?
83
- return unless permission_action.subject == :questionnaire
84
-
85
- case permission_action.action
86
- when :export_answers
87
- permission_action.allow!
88
- end
89
- end
90
29
  end
91
30
  end
92
31
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Meetings
5
+ module Admin
6
+ class QuestionnairePermissions < Decidim::DefaultPermissions
7
+ def permissions
8
+ return permission_action unless user
9
+ return permission_action unless permission_action.scope == :admin
10
+ return permission_action unless subject == :questionnaire
11
+
12
+ case permission_action.action
13
+ when :update
14
+ toggle_allow(registration_form.present?)
15
+ when :export_responses
16
+ allow!
17
+ end
18
+
19
+ permission_action
20
+ end
21
+
22
+ private
23
+
24
+ def registration_form
25
+ @registration_form ||= context.fetch(:questionnaire, nil)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Meetings
5
+ class MeetingPermissions < Decidim::DefaultPermissions
6
+ private
7
+
8
+ def target_scope = :public
9
+
10
+ def target_subject = :meeting
11
+
12
+ def can_read?
13
+ user_has_any_role?(user, meeting.participatory_space, broad_check: true) || (!meeting&.hidden? && meeting&.current_user_can_visit_meeting?(user))
14
+ end
15
+
16
+ def meeting
17
+ @meeting ||= context.fetch(:meeting, nil)
18
+ end
19
+
20
+ def can_join?
21
+ meeting.can_be_joined_by?(user) &&
22
+ authorized?(:join, resource: meeting)
23
+ end
24
+
25
+ def can_join_waitlist?
26
+ meeting.waitlist_enabled? &&
27
+ !meeting.has_available_slots? &&
28
+ !meeting.has_registration_for?(user) &&
29
+ authorized?(:join_waitlist, resource: meeting)
30
+ end
31
+
32
+ def can_leave?
33
+ meeting.registrations_enabled?
34
+ end
35
+
36
+ def can_decline_invitation?
37
+ meeting.registrations_enabled? &&
38
+ meeting.invites.exists?(user:)
39
+ end
40
+
41
+ def can_create?
42
+ return false unless user
43
+
44
+ (component_settings&.creation_enabled_for_participants? && can_participate?) || initiative_authorship?
45
+ end
46
+
47
+ def can_update?
48
+ meeting.authored_by?(user) &&
49
+ !meeting.closed?
50
+ end
51
+
52
+ def can_withdraw?
53
+ meeting.authored_by?(user) &&
54
+ !meeting.withdrawn? &&
55
+ !meeting.past?
56
+ end
57
+
58
+ def can_close?
59
+ meeting.authored_by?(user) &&
60
+ meeting.past?
61
+ end
62
+
63
+ def can_register?
64
+ return false unless user
65
+
66
+ meeting.can_register_invitation?(user) &&
67
+ authorized?(:register, resource: meeting)
68
+ end
69
+
70
+ def can_reply_poll?
71
+ meeting.present? &&
72
+ meeting.poll.present? &&
73
+ authorized?(:reply_poll, resource: meeting)
74
+ end
75
+
76
+ def can_participate?
77
+ context[:current_component].participatory_space.can_participate?(user)
78
+ end
79
+
80
+ def initiative_authorship?
81
+ return false unless Decidim.module_installed?("initiatives")
82
+
83
+ participatory_space = context[:current_component].participatory_space
84
+
85
+ participatory_space.is_a?(Decidim::Initiative) &&
86
+ participatory_space.has_authorship?(user)
87
+ end
88
+ end
89
+ end
90
+ end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "meeting_permissions"
4
+
3
5
  module Decidim
4
6
  module Meetings
5
7
  class Permissions < Decidim::DefaultPermissions
@@ -8,53 +10,13 @@ module Decidim
8
10
  return Decidim::Meetings::Admin::Permissions.new(user, permission_action, context).permissions if permission_action.scope == :admin
9
11
  return permission_action if permission_action.scope != :public
10
12
 
11
- if permission_action.subject == :meeting && permission_action.action == :read
12
- toggle_allow(user_has_any_role?(user, meeting.participatory_space, broad_check: true) || (!meeting&.hidden? && meeting&.current_user_can_visit_meeting?(user)))
13
- return permission_action
14
- end
13
+ return Decidim::Meetings::MeetingPermissions.new(user, permission_action, context).permissions if subject == :meeting
15
14
 
16
- return permission_action unless user
15
+ toggle_allow(can_respond_question?) if subject == :response && action == :create
16
+ toggle_allow(can_update_question?) if subject == :question && action == :update
17
+ toggle_allow(can_update_poll?) if subject == :poll && action == :update
17
18
 
18
- case permission_action.subject
19
- when :answer
20
- case permission_action.action
21
- when :create
22
- toggle_allow(can_answer_question?)
23
- end
24
- when :question
25
- case permission_action.action
26
- when :update
27
- toggle_allow(can_update_question?)
28
- end
29
- when :meeting
30
- case permission_action.action
31
- when :join
32
- toggle_allow(can_join_meeting?)
33
- when :leave
34
- toggle_allow(can_leave_meeting?)
35
- when :decline_invitation
36
- toggle_allow(can_decline_invitation?)
37
- when :create
38
- toggle_allow(can_create_meetings?)
39
- when :update
40
- toggle_allow(can_update_meeting?)
41
- when :withdraw
42
- toggle_allow(can_withdraw_meeting?)
43
- when :close
44
- toggle_allow(can_close_meeting?)
45
- when :register
46
- toggle_allow(can_register_invitation_meeting?)
47
- when :reply_poll
48
- toggle_allow(can_reply_poll?)
49
- end
50
- when :poll
51
- case permission_action.action
52
- when :update
53
- toggle_allow(can_update_poll?)
54
- end
55
- else
56
- return permission_action
57
- end
19
+ return permission_action unless user
58
20
 
59
21
  permission_action
60
22
  end
@@ -69,37 +31,6 @@ module Decidim
69
31
  @question ||= context.fetch(:question, nil)
70
32
  end
71
33
 
72
- def can_join_meeting?
73
- meeting.can_be_joined_by?(user) &&
74
- authorized?(:join, resource: meeting)
75
- end
76
-
77
- def can_leave_meeting?
78
- meeting.registrations_enabled?
79
- end
80
-
81
- def can_decline_invitation?
82
- meeting.registrations_enabled? &&
83
- meeting.invites.exists?(user:)
84
- end
85
-
86
- def can_create_meetings?
87
- (component_settings&.creation_enabled_for_participants? && can_participate?) || initiative_authorship?
88
- end
89
-
90
- def can_participate?
91
- context[:current_component].participatory_space.can_participate?(user)
92
- end
93
-
94
- def initiative_authorship?
95
- return false unless Decidim.module_installed?("initiatives")
96
-
97
- participatory_space = context[:current_component].participatory_space
98
-
99
- participatory_space.is_a?(Decidim::Initiative) &&
100
- participatory_space.has_authorship?(user)
101
- end
102
-
103
34
  # Neither platform admins, nor space admins should be able to create meetings from the public side.
104
35
  def space_member?(participatory_space, user)
105
36
  return false unless user
@@ -107,33 +38,6 @@ module Decidim
107
38
  participatory_space.participatory_space_private_users.exists?(decidim_user_id: user.id)
108
39
  end
109
40
 
110
- def can_update_meeting?
111
- meeting.authored_by?(user) &&
112
- !meeting.closed?
113
- end
114
-
115
- def can_withdraw_meeting?
116
- meeting.authored_by?(user) &&
117
- !meeting.withdrawn? &&
118
- !meeting.past?
119
- end
120
-
121
- def can_close_meeting?
122
- meeting.authored_by?(user) &&
123
- meeting.past?
124
- end
125
-
126
- def can_register_invitation_meeting?
127
- meeting.can_register_invitation?(user) &&
128
- authorized?(:register, resource: meeting)
129
- end
130
-
131
- def can_reply_poll?
132
- meeting.present? &&
133
- meeting.poll.present? &&
134
- authorized?(:reply_poll, resource: meeting)
135
- end
136
-
137
41
  def can_update_poll?
138
42
  user.present? &&
139
43
  user.admin? &&
@@ -141,8 +45,8 @@ module Decidim
141
45
  meeting.poll.present?
142
46
  end
143
47
 
144
- def can_answer_question?
145
- question.present? && user.present? && !question.answered_by?(user)
48
+ def can_respond_question?
49
+ question.present? && user.present? && !question.responded_by?(user)
146
50
  end
147
51
 
148
52
  def can_update_question?
@@ -10,7 +10,7 @@ module Decidim
10
10
  def present
11
11
  return unless value
12
12
 
13
- renderer = Decidim::ContentRenderers::HashtagRenderer.new(h.decidim_escape_translated(value))
13
+ renderer = Decidim::ContentRenderers::BlobRenderer.new(h.decidim_escape_translated(value))
14
14
  renderer.render(links: false).html_safe
15
15
  end
16
16
  end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Meetings
5
+ #
6
+ # Decorator for agenda items
7
+ #
8
+ class AgendaItemPresenter < Decidim::ResourcePresenter
9
+ include Decidim::ResourceHelper
10
+ include Decidim::SanitizeHelper
11
+
12
+ def agenda_item
13
+ __getobj__
14
+ end
15
+
16
+ def description(links: false, strip_tags: false, all_locales: false)
17
+ return unless agenda_item
18
+
19
+ content_handle_locale(agenda_item.description, all_locales, links, strip_tags)
20
+ end
21
+
22
+ def editor_description(all_locales: false)
23
+ return unless agenda_item
24
+
25
+ editor_locales(agenda_item.description, all_locales)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -8,6 +8,7 @@ module Decidim
8
8
  class MeetingPresenter < Decidim::ResourcePresenter
9
9
  include Decidim::ResourceHelper
10
10
  include ActionView::Helpers::UrlHelper
11
+ include Decidim::SanitizeHelper
11
12
 
12
13
  alias super_title title
13
14
 
@@ -21,7 +22,7 @@ module Decidim
21
22
 
22
23
  def taxonomy_names(html_escape: false, all_locales: false)
23
24
  meeting.taxonomies.map do |taxonomy|
24
- super_title(taxonomy.name, false, html_escape, all_locales)
25
+ super_title(taxonomy.name, html_escape, all_locales)
25
26
  end
26
27
  end
27
28
 
@@ -29,22 +30,22 @@ module Decidim
29
30
  link_to title, meeting_path
30
31
  end
31
32
 
32
- def title(links: false, html_escape: false, all_locales: false)
33
+ def title(html_escape: false, all_locales: false)
33
34
  return unless meeting
34
35
 
35
- super(meeting.title, links, html_escape, all_locales)
36
+ super(meeting.title, html_escape, all_locales)
36
37
  end
37
38
 
38
- def description(links: false, extras: true, strip_tags: false, all_locales: false)
39
+ def description(links: false, strip_tags: false, all_locales: false)
39
40
  return unless meeting
40
41
 
41
- content_handle_locale(meeting.description, all_locales, extras, links, strip_tags)
42
+ content_handle_locale(meeting.description, all_locales, links, strip_tags)
42
43
  end
43
44
 
44
- def editor_description(all_locales: false, extras: true)
45
+ def editor_description(all_locales: false)
45
46
  return unless meeting
46
47
 
47
- editor_locales(meeting.description, all_locales, extras:)
48
+ editor_locales(meeting.description, all_locales)
48
49
  end
49
50
 
50
51
  def location(all_locales: false)
@@ -71,17 +72,17 @@ module Decidim
71
72
  end
72
73
  end
73
74
 
74
- def closing_report(links: false, extras: false, strip_tags: false, all_locales: false)
75
+ def closing_report(links: false, strip_tags: false, all_locales: false)
75
76
  return unless meeting
76
77
 
77
- content_handle_locale(meeting.closing_report, all_locales, extras, links, strip_tags)
78
+ content_handle_locale(meeting.closing_report, all_locales, links, strip_tags)
78
79
  end
79
80
 
80
81
  def registration_email_custom_content(links: false, all_locales: false)
81
82
  return unless meeting
82
83
 
83
84
  handle_locales(meeting.registration_email_custom_content, all_locales) do |content|
84
- renderer = Decidim::ContentRenderers::HashtagRenderer.new(decidim_sanitize_editor_admin(content))
85
+ renderer = Decidim::ContentRenderers::BlobRenderer.new(decidim_sanitize_editor_admin(content))
85
86
  renderer.render(links:).html_safe
86
87
  end
87
88
  end
@@ -130,12 +131,8 @@ module Decidim
130
131
  false
131
132
  end
132
133
 
133
- def has_tooltip?
134
- false
135
- end
136
-
137
134
  def proposals
138
- return unless Decidim::Meetings.enable_proposal_linking
135
+ return unless Decidim.module_installed?(:proposals)
139
136
  return unless meeting
140
137
 
141
138
  @proposals ||= meeting.authored_proposals.load
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Meetings
5
+ #
6
+ # Decorator for meeting registrations
7
+ #
8
+ class RegistrationPresenter < SimpleDelegator
9
+ delegate :name, :email, to: :user
10
+
11
+ def status
12
+ return I18n.t("attended", scope: "decidim.meetings.models.registration.status") if validated?
13
+
14
+ I18n.t("not_attended", scope: "decidim.meetings.models.registration.status")
15
+ end
16
+
17
+ def status_html_class
18
+ return "success" if validated?
19
+
20
+ "alert"
21
+ end
22
+ end
23
+ end
24
+ end
@@ -2,8 +2,8 @@
2
2
 
3
3
  module Decidim
4
4
  module Meetings
5
- # A class used to collect user answers for a questionnaire
6
- class QuestionnaireUserAnswers < Decidim::Query
5
+ # A class used to collect user responses for a questionnaire
6
+ class QuestionnaireUserResponses < Decidim::Query
7
7
  # Syntactic sugar to initialize the class and return the queried objects.
8
8
  #
9
9
  # questionnaire - a Questionnaire object
@@ -18,11 +18,11 @@ module Decidim
18
18
  @questionnaire = questionnaire
19
19
  end
20
20
 
21
- # Finds and group answers by user for each questionnaire's question.
21
+ # Finds and group responses by user for each questionnaire's question.
22
22
  def query
23
- answers = Answer.joins(:question).where(questionnaire: @questionnaire)
23
+ responses = Response.joins(:question).where(questionnaire: @questionnaire)
24
24
 
25
- answers.sort_by { |answer| answer.question.position }.group_by(&:user).values
25
+ responses.sort_by { |response| response.question.position }.group_by(&:user).values
26
26
  end
27
27
  end
28
28
  end
@@ -11,20 +11,19 @@ module Decidim
11
11
  code: resource.code,
12
12
  user: {
13
13
  name: resource.user.name,
14
- email: resource.user.email,
15
- user_group: resource.user_group&.name || ""
14
+ email: resource.user.email
16
15
  },
17
- registration_form_answers: serialize_answers
16
+ registration_form_responses: serialize_responses
18
17
  }
19
18
  end
20
19
 
21
20
  private
22
21
 
23
- def serialize_answers
22
+ def serialize_responses
24
23
  return [] unless resource.meeting.questionnaire
25
24
 
26
- Decidim::Forms::UserAnswersSerializer.new(
27
- resource.meeting.questionnaire.answers.where(user: resource.user)
25
+ Decidim::Forms::UserResponsesSerializer.new(
26
+ resource.meeting.questionnaire.responses.where(user: resource.user)
28
27
  ).serialize
29
28
  end
30
29
  end
@@ -12,7 +12,6 @@ module Decidim
12
12
  location_hints: :i18n,
13
13
  start_time: :date,
14
14
  end_time: :date,
15
- decidim_user_group_id: :user_group,
16
15
  decidim_scope_id: :scope
17
16
  }
18
17
  end
@@ -15,6 +15,7 @@
15
15
  <div class="meeting-list__modal-input">
16
16
  <input id="urlCalendarUrl" type="text" title="<%= t(".calendar_url") %>" value="<%= "#{path}" %>" readonly>
17
17
  <button
18
+ data-controller="clipboard-copy"
18
19
  data-clipboard-copy="#urlCalendarUrl"
19
20
  data-clipboard-copy-label="<%= t(".copy_calendar_url_copied") %>"
20
21
  data-clipboard-copy-message="<%= t(".copy_calendar_url_message") %>"
@@ -9,7 +9,7 @@
9
9
 
10
10
  <div class="grid-x">
11
11
  <div class="cell">
12
- <%= form.translated :editor, :description, tabs_id:, rows: 6, aria: { label: :description } %>
12
+ <%= form.translated :editor, :description, resource_mentionable: true, tabs_id:, rows: 6, aria: { label: :description } %>
13
13
  </div>
14
14
  </div>
15
15
 
@@ -1,5 +1,5 @@
1
1
  <div class="form__wrapper attendee-fields">
2
- <div class="card" data-component="accordion" id="accordion-attendee">
2
+ <div class="card" data-controller="accordion" id="accordion-attendee">
3
3
  <div class="card-divider">
4
4
  <button class="card-divider-button" data-open="true" data-controls="panel-attendee" type="button">
5
5
  <%= icon "arrow-right-s-line" %>
@@ -19,7 +19,7 @@
19
19
  </div>
20
20
  </div>
21
21
 
22
- <% if Decidim::Meetings.enable_proposal_linking %>
22
+ <% if Decidim.module_installed?(:proposals) %>
23
23
  <div class="row column">
24
24
  <%= render partial: "decidim/proposals/proposals/proposals_picker", locals: { form:, field: :proposals } %>
25
25
  </div>
@@ -2,11 +2,11 @@
2
2
  <div class="card pt-4">
3
3
  <div class="card-section">
4
4
  <div class="row column">
5
- <%= form.translated :text_field, :title, autofocus: true, class: "js-hashtags", hashtaggable: true, aria: { label: :title } %>
5
+ <%= form.translated :text_field, :title, autofocus: true, aria: { label: :title } %>
6
6
  </div>
7
7
 
8
8
  <div class="row column">
9
- <%= form.translated :editor, :description, hashtaggable: true, aria: { label: :description } %>
9
+ <%= form.translated :editor, :description, resource_mentionable: true, aria: { label: :description } %>
10
10
  </div>
11
11
 
12
12
  <div class="row column">
@@ -91,6 +91,7 @@
91
91
  <%= render partial: "decidim/comments/admin/shared/availability_fields", locals: { form: } %>
92
92
  </div>
93
93
  </div>
94
+ <%= render "decidim/meetings/admin/meetings/reminders", form: %>
94
95
  <%= render "decidim/meetings/admin/meetings/services", form: , id: tabs_id_for_service(blank_service) %>
95
96
  <%= render "decidim/meetings/admin/meetings/linked_spaces", form: %>
96
97
  </div>
@@ -1,6 +1,6 @@
1
1
  <%= append_stylesheet_pack_tag "decidim_proposals", media: "all" %>
2
2
 
3
- <div class="card" data-component="accordion" id="accordion-linked-spaces">
3
+ <div class="card" data-controller="accordion" id="accordion-linked-spaces">
4
4
  <div class="card-divider">
5
5
  <button class="card-divider-button" data-open="false" data-controls="panel-linked-spaces" type="button">
6
6
  <%= icon "arrow-right-s-line" %>