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.
- checksums.yaml +4 -4
- data/app/cells/decidim/meetings/cancel_registration_meeting_button/cancelation_modal.erb +7 -4
- data/app/cells/decidim/meetings/cancel_registration_meeting_button/show.erb +1 -1
- data/app/cells/decidim/meetings/cancel_registration_meeting_button_cell.rb +36 -0
- data/app/cells/decidim/meetings/dates_and_map_cell.rb +1 -1
- data/app/cells/decidim/meetings/join_meeting_button/registration_modal.erb +4 -5
- data/app/cells/decidim/meetings/join_meeting_button/show.erb +25 -28
- data/app/cells/decidim/meetings/join_meeting_button/waitlist_button.erb +22 -0
- data/app/cells/decidim/meetings/join_meeting_button_cell.rb +28 -0
- data/app/cells/decidim/meetings/question_responses/show.erb +7 -7
- data/app/cells/decidim/meetings/question_responses_cell.rb +28 -28
- data/app/commands/decidim/meetings/admin/copy_meeting.rb +5 -2
- data/app/commands/decidim/meetings/admin/create_agenda.rb +6 -2
- data/app/commands/decidim/meetings/admin/create_meeting.rb +7 -3
- data/app/commands/decidim/meetings/admin/mark_as_attendee.rb +44 -0
- data/app/commands/decidim/meetings/admin/publish_meeting.rb +2 -1
- data/app/commands/decidim/meetings/admin/update_agenda.rb +6 -2
- data/app/commands/decidim/meetings/admin/update_meeting.rb +15 -6
- data/app/commands/decidim/meetings/admin/update_questionnaire.rb +4 -4
- data/app/commands/decidim/meetings/admin/update_registrations.rb +19 -7
- data/app/commands/decidim/meetings/create_meeting.rb +2 -3
- data/app/commands/decidim/meetings/{create_answer.rb → create_response.rb} +11 -11
- data/app/commands/decidim/meetings/join_meeting.rb +4 -6
- data/app/commands/decidim/meetings/join_waitlist.rb +53 -0
- data/app/commands/decidim/meetings/leave_meeting.rb +14 -5
- data/app/commands/decidim/meetings/update_meeting.rb +1 -2
- data/app/controllers/concerns/decidim/meetings/admin/filterable.rb +1 -1
- data/app/controllers/decidim/meetings/admin/agenda_controller.rb +2 -2
- data/app/controllers/decidim/meetings/admin/invites_controller.rb +1 -1
- data/app/controllers/decidim/meetings/admin/meeting_closes_controller.rb +1 -1
- data/app/controllers/decidim/meetings/admin/meeting_copies_controller.rb +1 -1
- data/app/controllers/decidim/meetings/admin/meetings_controller.rb +4 -4
- data/app/controllers/decidim/meetings/admin/meetings_poll_controller.rb +10 -10
- data/app/controllers/decidim/meetings/admin/registrations_attendees_controller.rb +79 -0
- data/app/controllers/decidim/meetings/admin/registrations_controller.rb +1 -22
- data/app/controllers/decidim/meetings/meeting_closes_controller.rb +1 -1
- data/app/controllers/decidim/meetings/meetings_controller.rb +11 -11
- data/app/controllers/decidim/meetings/polls/{answers_controller.rb → responses_controller.rb} +7 -7
- data/app/controllers/decidim/meetings/registrations_controller.rb +39 -12
- data/app/events/decidim/meetings/registration_marked_as_attendee_event.rb +9 -0
- data/app/events/decidim/meetings/upcoming_meeting_event.rb +41 -0
- data/app/events/decidim/meetings/update_meeting_event.rb +25 -0
- data/app/forms/decidim/meetings/admin/close_meeting_form.rb +2 -1
- data/app/forms/decidim/meetings/admin/meeting_agenda_items_form.rb +4 -0
- data/app/forms/decidim/meetings/admin/meeting_form.rb +28 -3
- data/app/forms/decidim/meetings/admin/question_form.rb +3 -3
- data/app/forms/decidim/meetings/admin/{answer_option_form.rb → response_option_form.rb} +3 -3
- data/app/forms/decidim/meetings/admin/validate_registration_code_form.rb +1 -1
- data/app/forms/decidim/meetings/base_meeting_form.rb +0 -2
- data/app/forms/decidim/meetings/close_meeting_form.rb +2 -1
- data/app/forms/decidim/meetings/join_meeting_form.rb +0 -1
- data/app/forms/decidim/meetings/meeting_form.rb +3 -2
- data/app/forms/decidim/meetings/response_choice_form.rb +14 -0
- data/app/forms/decidim/meetings/{answer_form.rb → response_form.rb} +7 -7
- data/app/helpers/decidim/meetings/application_helper.rb +0 -1
- data/app/helpers/decidim/meetings/meetings_helper.rb +14 -5
- data/app/jobs/decidim/meetings/promote_from_waitlist_job.rb +63 -0
- data/app/jobs/decidim/meetings/upcoming_meeting_notification_job.rb +1 -1
- data/app/mailers/decidim/meetings/registration_mailer.rb +13 -0
- data/app/models/decidim/meetings/agenda_item.rb +5 -0
- data/app/models/decidim/meetings/meeting.rb +15 -12
- data/app/models/decidim/meetings/question.rb +12 -12
- data/app/models/decidim/meetings/questionnaire.rb +1 -1
- data/app/models/decidim/meetings/registration.rb +19 -7
- data/app/models/decidim/meetings/{answer.rb → response.rb} +6 -6
- data/app/models/decidim/meetings/response_choice.rb +15 -0
- data/app/models/decidim/meetings/{answer_option.rb → response_option.rb} +5 -5
- data/app/packs/src/decidim/meetings/admin/destroy_meeting_alert.js +1 -1
- data/app/packs/src/decidim/meetings/admin/meetings_components_form.js +1 -8
- data/app/packs/src/decidim/meetings/admin/meetings_form.js +1 -1
- data/app/packs/src/decidim/meetings/admin/registrations_form.js +1 -1
- data/app/packs/src/decidim/meetings/admin/registrations_invite_form.js +1 -1
- data/app/packs/src/decidim/meetings/meetings_form.js +1 -1
- data/app/packs/src/decidim/meetings/meetings_polls.js +1 -1
- data/app/packs/src/decidim/meetings/poll.component.js +5 -5
- data/app/packs/stylesheets/decidim/meetings/_item.scss +5 -1
- data/app/packs/stylesheets/decidim/meetings/meetings.scss +4 -4
- data/app/permissions/decidim/meetings/admin/agenda_permissions.rb +34 -0
- data/app/permissions/decidim/meetings/admin/meeting_permissions.rb +44 -0
- data/app/permissions/decidim/meetings/admin/permissions.rb +5 -66
- data/app/permissions/decidim/meetings/admin/questionnaire_permissions.rb +30 -0
- data/app/permissions/decidim/meetings/meeting_permissions.rb +90 -0
- data/app/permissions/decidim/meetings/permissions.rb +9 -105
- data/app/presenters/decidim/meetings/admin_log/value_types/meeting_title_description_presenter.rb +1 -1
- data/app/presenters/decidim/meetings/agenda_item_presenter.rb +29 -0
- data/app/presenters/decidim/meetings/meeting_presenter.rb +11 -15
- data/app/presenters/decidim/meetings/registration_presenter.rb +24 -0
- data/app/queries/decidim/meetings/{questionnaire_user_answers.rb → questionnaire_user_responses.rb} +5 -5
- data/app/serializers/decidim/meetings/registration_serializer.rb +5 -6
- data/app/services/decidim/meetings/diff_renderer.rb +0 -1
- data/app/views/decidim/meetings/_calendar_modal.html.erb +1 -0
- data/app/views/decidim/meetings/admin/agenda/_agenda_item_fields.html.erb +1 -1
- data/app/views/decidim/meetings/admin/invites/_form.html.erb +1 -1
- data/app/views/decidim/meetings/admin/meeting_closes/_form.html.erb +1 -1
- data/app/views/decidim/meetings/admin/meetings/_form.html.erb +3 -2
- data/app/views/decidim/meetings/admin/meetings/_linked_spaces.html.erb +1 -1
- data/app/views/decidim/meetings/admin/meetings/_meeting-tr.html.erb +11 -8
- data/app/views/decidim/meetings/admin/meetings/_meeting_actions.html.erb +200 -69
- data/app/views/decidim/meetings/admin/meetings/_reminders.html.erb +19 -0
- data/app/views/decidim/meetings/admin/meetings/_services.html.erb +1 -1
- data/app/views/decidim/meetings/admin/meetings/index.html.erb +7 -5
- data/app/views/decidim/meetings/admin/meetings/manage_trash.html.erb +2 -1
- data/app/views/decidim/meetings/admin/poll/_form.html.erb +6 -6
- data/app/views/decidim/meetings/admin/poll/_question.html.erb +13 -13
- data/app/views/decidim/meetings/admin/poll/_response_option.html.erb +35 -0
- data/app/views/decidim/meetings/admin/poll/_response_option_template.html.erb +7 -0
- data/app/views/decidim/meetings/admin/poll/edit.html.erb +3 -3
- data/app/views/decidim/meetings/admin/registration_form/edit_questions.html.erb +5 -5
- data/app/views/decidim/meetings/admin/registrations/edit.html.erb +19 -39
- data/app/views/decidim/meetings/admin/registrations_attendees/index.html.erb +126 -0
- data/app/views/decidim/meetings/layouts/live_event.html.erb +1 -1
- data/app/views/decidim/meetings/meeting_closes/_form.html.erb +2 -2
- data/app/views/decidim/meetings/meetings/_form.html.erb +2 -11
- data/app/views/decidim/meetings/meetings/_meeting.html.erb +2 -2
- data/app/views/decidim/meetings/meetings/_meeting_actions.html.erb +3 -3
- data/app/views/decidim/meetings/meetings/_meeting_agenda.html.erb +2 -2
- data/app/views/decidim/meetings/meetings/_meeting_aside.html.erb +11 -10
- data/app/views/decidim/meetings/meetings/_meeting_poll_actions.html.erb +3 -3
- data/app/views/decidim/meetings/meetings/_registration_code_modal.html.erb +16 -0
- data/app/views/decidim/meetings/polls/questions/_index_admin.html.erb +1 -1
- data/app/views/decidim/meetings/polls/questions/_published_question.html.erb +5 -5
- data/app/views/decidim/meetings/polls/responses/_multiple_option.html.erb +13 -0
- data/app/views/decidim/meetings/polls/responses/_single_option.html.erb +13 -0
- data/app/views/decidim/meetings/polls/{answers → responses}/admin.html.erb +4 -4
- data/app/views/decidim/meetings/polls/{answers → responses}/index.html.erb +4 -4
- data/app/views/decidim/meetings/registration_mailer/confirmation.html.erb +6 -1
- data/config/assets.rb +2 -2
- data/config/locales/ar.yml +1 -26
- data/config/locales/bg.yml +2 -32
- data/config/locales/ca-IT.yml +86 -40
- data/config/locales/ca.yml +86 -40
- data/config/locales/cs.yml +71 -43
- data/config/locales/de.yml +87 -41
- data/config/locales/el.yml +1 -25
- data/config/locales/en.yml +89 -43
- data/config/locales/es-MX.yml +87 -41
- data/config/locales/es-PY.yml +87 -41
- data/config/locales/es.yml +87 -41
- data/config/locales/eu.yml +86 -40
- data/config/locales/fi-plain.yml +86 -40
- data/config/locales/fi.yml +85 -39
- data/config/locales/fr-CA.yml +79 -38
- data/config/locales/fr.yml +79 -38
- data/config/locales/ga-IE.yml +1 -7
- data/config/locales/gl.yml +1 -19
- data/config/locales/hu.yml +1 -22
- data/config/locales/id-ID.yml +0 -16
- data/config/locales/is-IS.yml +0 -10
- data/config/locales/it.yml +1 -29
- data/config/locales/ja.yml +88 -42
- data/config/locales/lb.yml +1 -15
- data/config/locales/lt.yml +1 -28
- data/config/locales/lv.yml +0 -16
- data/config/locales/nl.yml +1 -26
- data/config/locales/no.yml +1 -28
- data/config/locales/pl.yml +2 -32
- data/config/locales/pt-BR.yml +1 -28
- data/config/locales/pt.yml +1 -28
- data/config/locales/ro-RO.yml +56 -29
- data/config/locales/ru.yml +0 -16
- data/config/locales/sk.yml +0 -16
- data/config/locales/sl.yml +0 -4
- data/config/locales/sv.yml +85 -39
- data/config/locales/tr-TR.yml +0 -20
- data/config/locales/uk.yml +0 -12
- data/config/locales/zh-CN.yml +0 -19
- data/config/locales/zh-TW.yml +1 -26
- data/db/migrate/20181107175558_add_questionnaire_to_existing_meetings.rb +8 -2
- data/db/migrate/20200827153856_add_commentable_counter_cache_to_meetings.rb +8 -2
- data/db/migrate/20201016065302_fix_meetings_registration_terms.rb +8 -2
- data/db/migrate/20210310120731_add_followable_counter_cache_to_meetings.rb +8 -2
- data/db/migrate/20250317103343_rename_answer_to_response_in_decidim_meetings.rb +18 -0
- data/db/migrate/20250403094034_add_reminder_customization_to_decidim_meetings.rb +9 -0
- data/db/migrate/20250408071941_add_status_to_registrations_to_decidim_meetings_registrations.rb +8 -0
- data/lib/decidim/api/agenda_item_type.rb +6 -2
- data/lib/decidim/api/agenda_type.rb +6 -2
- data/lib/decidim/api/linked_resources_interface.rb +1 -1
- data/lib/decidim/api/meeting_type.rb +20 -10
- data/lib/decidim/api/service_type.rb +3 -0
- data/lib/decidim/meetings/admin_engine.rb +9 -1
- data/lib/decidim/meetings/component.rb +29 -8
- data/lib/decidim/meetings/engine.rb +6 -21
- data/lib/decidim/meetings/meeting_serializer.rb +1 -2
- data/lib/decidim/meetings/schema_org_event_meeting_serializer.rb +0 -10
- data/lib/decidim/meetings/seeds.rb +4 -13
- data/lib/decidim/meetings/test/factories.rb +10 -16
- data/lib/decidim/meetings/user_responses_serializer.rb +47 -0
- data/lib/decidim/meetings/version.rb +1 -1
- data/lib/decidim/meetings.rb +7 -9
- metadata +49 -35
- data/app/cells/decidim/meetings/attending_organizations_list_cell.rb +0 -32
- data/app/forms/decidim/meetings/answer_choice_form.rb +0 -14
- data/app/models/decidim/meetings/answer_choice.rb +0 -15
- data/app/queries/decidim/meetings/metrics/meeting_followers_metric_measure.rb +0 -31
- data/app/queries/decidim/meetings/metrics/meetings_metric_manage.rb +0 -48
- data/app/views/decidim/meetings/admin/poll/_answer_option.html.erb +0 -35
- data/app/views/decidim/meetings/admin/poll/_answer_option_template.html.erb +0 -7
- data/app/views/decidim/meetings/polls/answers/_multiple_option.html.erb +0 -13
- data/app/views/decidim/meetings/polls/answers/_single_option.html.erb +0 -13
- data/lib/decidim/meetings/download_your_data_user_answers_serializer.rb +0 -39
- data/lib/decidim/meetings/user_answers_serializer.rb +0 -47
- /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
|
-
|
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
|
-
|
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
|
-
|
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
|
145
|
-
question.present? && user.present? && !question.
|
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?
|
data/app/presenters/decidim/meetings/admin_log/value_types/meeting_title_description_presenter.rb
CHANGED
@@ -10,7 +10,7 @@ module Decidim
|
|
10
10
|
def present
|
11
11
|
return unless value
|
12
12
|
|
13
|
-
renderer = Decidim::ContentRenderers::
|
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,
|
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(
|
33
|
+
def title(html_escape: false, all_locales: false)
|
34
34
|
return unless meeting
|
35
35
|
|
36
|
-
super(meeting.title,
|
36
|
+
super(meeting.title, html_escape, all_locales)
|
37
37
|
end
|
38
38
|
|
39
|
-
def description(links: 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,
|
42
|
+
content_handle_locale(meeting.description, all_locales, links, strip_tags)
|
43
43
|
end
|
44
44
|
|
45
|
-
def editor_description(all_locales: false
|
45
|
+
def editor_description(all_locales: false)
|
46
46
|
return unless meeting
|
47
47
|
|
48
|
-
editor_locales(meeting.description, all_locales
|
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,
|
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,
|
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::
|
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
|
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
|
data/app/queries/decidim/meetings/{questionnaire_user_answers.rb → questionnaire_user_responses.rb}
RENAMED
@@ -2,8 +2,8 @@
|
|
2
2
|
|
3
3
|
module Decidim
|
4
4
|
module Meetings
|
5
|
-
# A class used to collect user
|
6
|
-
class
|
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
|
21
|
+
# Finds and group responses by user for each questionnaire's question.
|
22
22
|
def query
|
23
|
-
|
23
|
+
responses = Response.joins(:question).where(questionnaire: @questionnaire)
|
24
24
|
|
25
|
-
|
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
|
-
|
16
|
+
registration_form_responses: serialize_responses
|
18
17
|
}
|
19
18
|
end
|
20
19
|
|
21
20
|
private
|
22
21
|
|
23
|
-
def
|
22
|
+
def serialize_responses
|
24
23
|
return [] unless resource.meeting.questionnaire
|
25
24
|
|
26
|
-
Decidim::Forms::
|
27
|
-
resource.meeting.questionnaire.
|
25
|
+
Decidim::Forms::UserResponsesSerializer.new(
|
26
|
+
resource.meeting.questionnaire.responses.where(user: resource.user)
|
28
27
|
).serialize
|
29
28
|
end
|
30
29
|
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-
|
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
|
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,
|
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,
|
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-
|
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
|
-
|
33
|
+
|
34
|
+
<td data-label="<%= t("models.meeting.fields.taxonomies", scope: "decidim.meetings") %>">
|
33
35
|
<%= present(meeting).taxonomy_names.join(", ") %>
|
34
36
|
</td>
|
35
|
-
|
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 %>
|