decidim-meetings 0.30.2 → 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 (202) 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 +11 -8
  98. data/app/views/decidim/meetings/admin/meetings/_meeting_actions.html.erb +200 -69
  99. data/app/views/decidim/meetings/admin/meetings/_reminders.html.erb +19 -0
  100. data/app/views/decidim/meetings/admin/meetings/_services.html.erb +1 -1
  101. data/app/views/decidim/meetings/admin/meetings/index.html.erb +7 -5
  102. data/app/views/decidim/meetings/admin/meetings/manage_trash.html.erb +2 -1
  103. data/app/views/decidim/meetings/admin/poll/_form.html.erb +6 -6
  104. data/app/views/decidim/meetings/admin/poll/_question.html.erb +13 -13
  105. data/app/views/decidim/meetings/admin/poll/_response_option.html.erb +35 -0
  106. data/app/views/decidim/meetings/admin/poll/_response_option_template.html.erb +7 -0
  107. data/app/views/decidim/meetings/admin/poll/edit.html.erb +3 -3
  108. data/app/views/decidim/meetings/admin/registration_form/edit_questions.html.erb +5 -5
  109. data/app/views/decidim/meetings/admin/registrations/edit.html.erb +19 -39
  110. data/app/views/decidim/meetings/admin/registrations_attendees/index.html.erb +126 -0
  111. data/app/views/decidim/meetings/layouts/live_event.html.erb +1 -1
  112. data/app/views/decidim/meetings/meeting_closes/_form.html.erb +2 -2
  113. data/app/views/decidim/meetings/meetings/_form.html.erb +2 -11
  114. data/app/views/decidim/meetings/meetings/_meeting.html.erb +2 -2
  115. data/app/views/decidim/meetings/meetings/_meeting_actions.html.erb +3 -3
  116. data/app/views/decidim/meetings/meetings/_meeting_agenda.html.erb +2 -2
  117. data/app/views/decidim/meetings/meetings/_meeting_aside.html.erb +11 -10
  118. data/app/views/decidim/meetings/meetings/_meeting_poll_actions.html.erb +3 -3
  119. data/app/views/decidim/meetings/meetings/_registration_code_modal.html.erb +16 -0
  120. data/app/views/decidim/meetings/polls/questions/_index_admin.html.erb +1 -1
  121. data/app/views/decidim/meetings/polls/questions/_published_question.html.erb +5 -5
  122. data/app/views/decidim/meetings/polls/responses/_multiple_option.html.erb +13 -0
  123. data/app/views/decidim/meetings/polls/responses/_single_option.html.erb +13 -0
  124. data/app/views/decidim/meetings/polls/{answers → responses}/admin.html.erb +4 -4
  125. data/app/views/decidim/meetings/polls/{answers → responses}/index.html.erb +4 -4
  126. data/app/views/decidim/meetings/registration_mailer/confirmation.html.erb +6 -1
  127. data/config/assets.rb +2 -2
  128. data/config/locales/ar.yml +1 -26
  129. data/config/locales/bg.yml +2 -32
  130. data/config/locales/ca-IT.yml +86 -40
  131. data/config/locales/ca.yml +86 -40
  132. data/config/locales/cs.yml +71 -43
  133. data/config/locales/de.yml +87 -41
  134. data/config/locales/el.yml +1 -25
  135. data/config/locales/en.yml +89 -43
  136. data/config/locales/es-MX.yml +87 -41
  137. data/config/locales/es-PY.yml +87 -41
  138. data/config/locales/es.yml +87 -41
  139. data/config/locales/eu.yml +86 -40
  140. data/config/locales/fi-plain.yml +86 -40
  141. data/config/locales/fi.yml +85 -39
  142. data/config/locales/fr-CA.yml +79 -38
  143. data/config/locales/fr.yml +79 -38
  144. data/config/locales/ga-IE.yml +1 -7
  145. data/config/locales/gl.yml +1 -19
  146. data/config/locales/hu.yml +1 -22
  147. data/config/locales/id-ID.yml +0 -16
  148. data/config/locales/is-IS.yml +0 -10
  149. data/config/locales/it.yml +1 -29
  150. data/config/locales/ja.yml +88 -42
  151. data/config/locales/lb.yml +1 -15
  152. data/config/locales/lt.yml +1 -28
  153. data/config/locales/lv.yml +0 -16
  154. data/config/locales/nl.yml +1 -26
  155. data/config/locales/no.yml +1 -28
  156. data/config/locales/pl.yml +2 -32
  157. data/config/locales/pt-BR.yml +1 -28
  158. data/config/locales/pt.yml +1 -28
  159. data/config/locales/ro-RO.yml +56 -29
  160. data/config/locales/ru.yml +0 -16
  161. data/config/locales/sk.yml +0 -16
  162. data/config/locales/sl.yml +0 -4
  163. data/config/locales/sv.yml +85 -39
  164. data/config/locales/tr-TR.yml +0 -20
  165. data/config/locales/uk.yml +0 -12
  166. data/config/locales/zh-CN.yml +0 -19
  167. data/config/locales/zh-TW.yml +1 -26
  168. data/db/migrate/20181107175558_add_questionnaire_to_existing_meetings.rb +8 -2
  169. data/db/migrate/20200827153856_add_commentable_counter_cache_to_meetings.rb +8 -2
  170. data/db/migrate/20201016065302_fix_meetings_registration_terms.rb +8 -2
  171. data/db/migrate/20210310120731_add_followable_counter_cache_to_meetings.rb +8 -2
  172. data/db/migrate/20250317103343_rename_answer_to_response_in_decidim_meetings.rb +18 -0
  173. data/db/migrate/20250403094034_add_reminder_customization_to_decidim_meetings.rb +9 -0
  174. data/db/migrate/20250408071941_add_status_to_registrations_to_decidim_meetings_registrations.rb +8 -0
  175. data/lib/decidim/api/agenda_item_type.rb +6 -2
  176. data/lib/decidim/api/agenda_type.rb +6 -2
  177. data/lib/decidim/api/linked_resources_interface.rb +1 -1
  178. data/lib/decidim/api/meeting_type.rb +20 -10
  179. data/lib/decidim/api/service_type.rb +3 -0
  180. data/lib/decidim/meetings/admin_engine.rb +9 -1
  181. data/lib/decidim/meetings/component.rb +29 -8
  182. data/lib/decidim/meetings/engine.rb +6 -21
  183. data/lib/decidim/meetings/meeting_serializer.rb +1 -2
  184. data/lib/decidim/meetings/schema_org_event_meeting_serializer.rb +0 -10
  185. data/lib/decidim/meetings/seeds.rb +4 -13
  186. data/lib/decidim/meetings/test/factories.rb +10 -16
  187. data/lib/decidim/meetings/user_responses_serializer.rb +47 -0
  188. data/lib/decidim/meetings/version.rb +1 -1
  189. data/lib/decidim/meetings.rb +7 -9
  190. metadata +49 -35
  191. data/app/cells/decidim/meetings/attending_organizations_list_cell.rb +0 -32
  192. data/app/forms/decidim/meetings/answer_choice_form.rb +0 -14
  193. data/app/models/decidim/meetings/answer_choice.rb +0 -15
  194. data/app/queries/decidim/meetings/metrics/meeting_followers_metric_measure.rb +0 -31
  195. data/app/queries/decidim/meetings/metrics/meetings_metric_manage.rb +0 -48
  196. data/app/views/decidim/meetings/admin/poll/_answer_option.html.erb +0 -35
  197. data/app/views/decidim/meetings/admin/poll/_answer_option_template.html.erb +0 -7
  198. data/app/views/decidim/meetings/polls/answers/_multiple_option.html.erb +0 -13
  199. data/app/views/decidim/meetings/polls/answers/_single_option.html.erb +0 -13
  200. data/lib/decidim/meetings/download_your_data_user_answers_serializer.rb +0 -39
  201. data/lib/decidim/meetings/user_answers_serializer.rb +0 -47
  202. /data/app/views/decidim/meetings/polls/{answers → responses}/create.js.erb +0 -0
@@ -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
@@ -22,7 +22,7 @@ module Decidim
22
22
 
23
23
  def taxonomy_names(html_escape: false, all_locales: false)
24
24
  meeting.taxonomies.map do |taxonomy|
25
- super_title(taxonomy.name, false, html_escape, all_locales)
25
+ super_title(taxonomy.name, html_escape, all_locales)
26
26
  end
27
27
  end
28
28
 
@@ -30,22 +30,22 @@ module Decidim
30
30
  link_to title, meeting_path
31
31
  end
32
32
 
33
- def title(links: false, html_escape: false, all_locales: false)
33
+ def title(html_escape: false, all_locales: false)
34
34
  return unless meeting
35
35
 
36
- super(meeting.title, links, html_escape, all_locales)
36
+ super(meeting.title, html_escape, all_locales)
37
37
  end
38
38
 
39
- def description(links: false, extras: true, strip_tags: false, all_locales: false)
39
+ def description(links: false, strip_tags: false, all_locales: false)
40
40
  return unless meeting
41
41
 
42
- content_handle_locale(meeting.description, all_locales, extras, links, strip_tags)
42
+ content_handle_locale(meeting.description, all_locales, links, strip_tags)
43
43
  end
44
44
 
45
- def editor_description(all_locales: false, extras: true)
45
+ def editor_description(all_locales: false)
46
46
  return unless meeting
47
47
 
48
- editor_locales(meeting.description, all_locales, extras:)
48
+ editor_locales(meeting.description, all_locales)
49
49
  end
50
50
 
51
51
  def location(all_locales: false)
@@ -72,17 +72,17 @@ module Decidim
72
72
  end
73
73
  end
74
74
 
75
- 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)
76
76
  return unless meeting
77
77
 
78
- content_handle_locale(meeting.closing_report, all_locales, extras, links, strip_tags)
78
+ content_handle_locale(meeting.closing_report, all_locales, links, strip_tags)
79
79
  end
80
80
 
81
81
  def registration_email_custom_content(links: false, all_locales: false)
82
82
  return unless meeting
83
83
 
84
84
  handle_locales(meeting.registration_email_custom_content, all_locales) do |content|
85
- renderer = Decidim::ContentRenderers::HashtagRenderer.new(decidim_sanitize_editor_admin(content))
85
+ renderer = Decidim::ContentRenderers::BlobRenderer.new(decidim_sanitize_editor_admin(content))
86
86
  renderer.render(links:).html_safe
87
87
  end
88
88
  end
@@ -131,12 +131,8 @@ module Decidim
131
131
  false
132
132
  end
133
133
 
134
- def has_tooltip?
135
- false
136
- end
137
-
138
134
  def proposals
139
- return unless Decidim::Meetings.enable_proposal_linking
135
+ return unless Decidim.module_installed?(:proposals)
140
136
  return unless meeting
141
137
 
142
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" %>
@@ -1,38 +1,41 @@
1
1
  <% is_linked = meeting.decidim_component_id != current_component.id %>
2
2
 
3
3
  <tr data-id="<%= meeting.id %>">
4
- <td>
4
+ <td data-label="<%= t("models.meeting.fields.id", scope: "decidim.meetings") %>">
5
5
  <%= meeting.id %><br>
6
6
  </td>
7
- <td class="!text-left">
7
+ <td class="!text-left" data-label="<%= t("models.meeting.fields.title", scope: "decidim.meetings") %>">
8
8
  <% if allowed_to? :update, :meeting, meeting: meeting %>
9
9
  <%= link_to present(meeting).title(html_escape: true), edit_meeting_path(meeting) %>
10
10
  <% else %>
11
11
  <%= present(meeting).title(html_escape: true) %><br>
12
12
  <% end %>
13
13
  </td>
14
- <td>
14
+ <td data-label="<%= t("models.meeting.fields.start_time", scope: "decidim.meetings") %>">
15
15
  <% if meeting.start_time %>
16
16
  <%= l meeting.start_time, format: :long %>
17
17
  <% end %>
18
18
  </td>
19
- <td>
19
+ <td data-label="<%= t("models.meeting.fields.end_time", scope: "decidim.meetings") %>">
20
20
  <% if meeting.end_time %>
21
21
  <%= l meeting.end_time, format: :long %>
22
22
  <% end %>
23
23
  </td>
24
- <td>
24
+ <td data-label="<%= t("models.meeting.fields.closed", scope: "decidim.meetings") %>">
25
25
  <%= humanize_boolean meeting.closed? %>
26
26
  </td>
27
+
27
28
  <% if maps_enabled? && Decidim::Map.available?(:static, :geocoding) %>
28
- <td>
29
+ <td data-label="<%= t("models.meeting.fields.map", scope: "decidim.meetings") %>">
29
30
  <%= static_map_link(meeting, {}, { class: "static-map__admin" }) unless meeting.online? %>
30
31
  </td>
31
32
  <% end %>
32
- <td>
33
+
34
+ <td data-label="<%= t("models.meeting.fields.taxonomies", scope: "decidim.meetings") %>">
33
35
  <%= present(meeting).taxonomy_names.join(", ") %>
34
36
  </td>
35
- <td class="table-list__actions">
37
+
38
+ <td class="table-list__actions" data-label="<%= t("actions.title", scope: "decidim.meetings") %>">
36
39
  <% if is_linked %>
37
40
  <%= t("index.linked_meeting_warning_html", href: edit_meeting_path(meeting), name: present(meeting).space_title, scope: "decidim.meetings.admin.meetings") %>
38
41
  <% else %>