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.
- 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/meeting_cell.rb +6 -1
- data/app/cells/decidim/meetings/meeting_s_cell.rb +15 -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 -44
- 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 +12 -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 +9 -14
- data/app/views/decidim/meetings/admin/meetings/_meeting_actions.html.erb +200 -69
- data/app/views/decidim/meetings/admin/meetings/_meetings-thead.html.erb +0 -3
- 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 +9 -9
- data/app/views/decidim/meetings/admin/poll/_question.html.erb +19 -9
- 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 +87 -44
- data/config/locales/ca.yml +87 -44
- data/config/locales/cs.yml +71 -46
- data/config/locales/de.yml +89 -46
- data/config/locales/el.yml +1 -25
- data/config/locales/en.yml +89 -46
- data/config/locales/es-MX.yml +87 -44
- data/config/locales/es-PY.yml +87 -44
- data/config/locales/es.yml +87 -44
- data/config/locales/eu.yml +114 -71
- data/config/locales/fi-plain.yml +86 -43
- data/config/locales/fi.yml +85 -42
- data/config/locales/fr-CA.yml +79 -41
- data/config/locales/fr.yml +79 -41
- data/config/locales/ga-IE.yml +1 -8
- data/config/locales/gl.yml +1 -19
- data/config/locales/hu.yml +1 -23
- data/config/locales/id-ID.yml +0 -16
- data/config/locales/is-IS.yml +0 -10
- data/config/locales/it.yml +1 -38
- data/config/locales/ja.yml +88 -45
- data/config/locales/lb.yml +1 -16
- 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 -29
- data/config/locales/pl.yml +2 -32
- data/config/locales/pt-BR.yml +13 -205
- data/config/locales/pt.yml +1 -29
- data/config/locales/ro-RO.yml +56 -32
- 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 +89 -46
- 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 -20
- 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 +50 -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
|
@@ -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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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
|
|
@@ -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,
|
|
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(
|
|
33
|
+
def title(html_escape: false, all_locales: false)
|
|
33
34
|
return unless meeting
|
|
34
35
|
|
|
35
|
-
super(meeting.title,
|
|
36
|
+
super(meeting.title, html_escape, all_locales)
|
|
36
37
|
end
|
|
37
38
|
|
|
38
|
-
def description(links: 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,
|
|
42
|
+
content_handle_locale(meeting.description, all_locales, links, strip_tags)
|
|
42
43
|
end
|
|
43
44
|
|
|
44
|
-
def editor_description(all_locales: false
|
|
45
|
+
def editor_description(all_locales: false)
|
|
45
46
|
return unless meeting
|
|
46
47
|
|
|
47
|
-
editor_locales(meeting.description, all_locales
|
|
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,
|
|
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,
|
|
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::
|
|
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
|
|
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
|
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" %>
|