decidim-meetings 0.29.2 → 0.30.0.rc2

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 (136) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/meetings/cancel_registration_meeting_button/cancelation_modal.erb +1 -1
  3. data/app/cells/decidim/meetings/cancel_registration_meeting_button/show.erb +3 -1
  4. data/app/cells/decidim/meetings/cancel_registration_meeting_button_cell.rb +1 -1
  5. data/app/cells/decidim/meetings/dates_and_map/show.erb +1 -1
  6. data/app/cells/decidim/meetings/highlighted_meetings_for_component/show.erb +1 -1
  7. data/app/cells/decidim/meetings/join_meeting_button/show.erb +5 -2
  8. data/app/cells/decidim/meetings/meeting_card_metadata_cell.rb +3 -3
  9. data/app/cells/decidim/meetings/meeting_l_cell.rb +12 -0
  10. data/app/commands/decidim/meetings/admin/copy_meeting.rb +1 -2
  11. data/app/commands/decidim/meetings/admin/create_meeting.rb +8 -2
  12. data/app/commands/decidim/meetings/admin/update_meeting.rb +8 -2
  13. data/app/commands/decidim/meetings/create_meeting.rb +2 -2
  14. data/app/commands/decidim/meetings/update_meeting.rb +2 -3
  15. data/app/controllers/concerns/decidim/meetings/admin/filterable.rb +9 -5
  16. data/app/controllers/concerns/decidim/meetings/component_filterable.rb +1 -2
  17. data/app/controllers/decidim/meetings/admin/meetings_controller.rb +14 -22
  18. data/app/controllers/decidim/meetings/admin/registration_form_controller.rb +8 -0
  19. data/app/controllers/decidim/meetings/directory/meetings_controller.rb +2 -4
  20. data/app/controllers/decidim/meetings/meetings_controller.rb +40 -6
  21. data/app/forms/decidim/meetings/admin/meeting_form.rb +16 -30
  22. data/app/forms/decidim/meetings/base_meeting_form.rb +6 -0
  23. data/app/forms/decidim/meetings/meeting_form.rb +2 -30
  24. data/app/helpers/decidim/meetings/admin/application_helper.rb +11 -1
  25. data/app/helpers/decidim/meetings/application_helper.rb +35 -1
  26. data/app/helpers/decidim/meetings/directory/application_helper.rb +9 -48
  27. data/app/helpers/decidim/meetings/meetings_helper.rb +5 -0
  28. data/app/models/decidim/meetings/invite.rb +10 -0
  29. data/app/models/decidim/meetings/meeting.rb +23 -1
  30. data/app/models/decidim/meetings/meeting_link.rb +25 -0
  31. data/app/packs/entrypoints/decidim_meetings_admin.js +1 -0
  32. data/app/packs/src/decidim/meetings/admin/meetings_components_form.js +77 -0
  33. data/app/packs/src/decidim/meetings/admin/meetings_form.js +8 -0
  34. data/app/permissions/decidim/meetings/admin/permissions.rb +1 -1
  35. data/app/permissions/decidim/meetings/permissions.rb +13 -9
  36. data/app/presenters/decidim/meetings/admin_log/meeting_presenter.rb +1 -1
  37. data/app/presenters/decidim/meetings/meeting_presenter.rb +13 -1
  38. data/app/queries/decidim/meetings/filtered_meetings.rb +2 -2
  39. data/app/queries/decidim/meetings/metrics/meeting_followers_metric_measure.rb +2 -2
  40. data/app/queries/decidim/meetings/metrics/meetings_metric_manage.rb +6 -6
  41. data/app/serializers/decidim/meetings/base_download_your_data_serializer.rb +32 -0
  42. data/app/serializers/decidim/meetings/download_your_data_invite_serializer.rb +6 -26
  43. data/app/serializers/decidim/meetings/download_your_data_meeting_serializer.rb +15 -0
  44. data/app/serializers/decidim/meetings/download_your_data_registration_serializer.rb +6 -24
  45. data/app/views/decidim/meetings/admin/meetings/_component.html.erb +15 -0
  46. data/app/views/decidim/meetings/admin/meetings/_form.html.erb +7 -9
  47. data/app/views/decidim/meetings/admin/meetings/_linked_spaces.html.erb +53 -0
  48. data/app/views/decidim/meetings/admin/meetings/_meeting-tr.html.erb +42 -0
  49. data/app/views/decidim/meetings/admin/meetings/_meeting_actions.html.erb +70 -0
  50. data/app/views/decidim/meetings/admin/meetings/_meetings-thead.html.erb +26 -0
  51. data/app/views/decidim/meetings/admin/meetings/index.html.erb +16 -142
  52. data/app/views/decidim/meetings/admin/meetings/manage_trash.html.erb +23 -0
  53. data/app/views/decidim/meetings/admin/registration_form/edit_questions.html.erb +44 -0
  54. data/app/views/decidim/meetings/admin/registrations/edit.html.erb +1 -0
  55. data/app/views/decidim/meetings/directory/meetings/index.html.erb +1 -2
  56. data/app/views/decidim/meetings/live_events/show.html.erb +5 -5
  57. data/app/views/decidim/meetings/meetings/_form.html.erb +4 -8
  58. data/app/views/decidim/meetings/meetings/_meeting.html.erb +51 -26
  59. data/app/views/decidim/meetings/meetings/_meeting_actions.html.erb +34 -0
  60. data/app/views/decidim/meetings/meetings/_meeting_aside.html.erb +20 -59
  61. data/app/views/decidim/meetings/meetings/_meeting_poll_actions.html.erb +2 -5
  62. data/app/views/decidim/meetings/meetings/_schema_org_event_meeting.html.erb +3 -0
  63. data/app/views/decidim/meetings/meetings/index.html.erb +10 -2
  64. data/app/views/decidim/meetings/meetings/show.html.erb +5 -5
  65. data/app/views/decidim/meetings/polls/answers/index.html.erb +5 -5
  66. data/app/views/decidim/meetings/shared/_filters.html.erb +1 -13
  67. data/app/views/decidim/meetings/shared/_index.html.erb +1 -1
  68. data/app/views/decidim/meetings/shared/_index.js.erb +3 -2
  69. data/app/views/decidim/meetings/shared/_meetings_aside.html.erb +2 -2
  70. data/app/views/decidim/participatory_spaces/_conference_venues.html.erb +1 -1
  71. data/config/locales/ar.yml +17 -17
  72. data/config/locales/bg.yml +5 -25
  73. data/config/locales/ca.yml +137 -25
  74. data/config/locales/cs.yml +138 -28
  75. data/config/locales/de.yml +138 -26
  76. data/config/locales/el.yml +1 -22
  77. data/config/locales/en.yml +133 -21
  78. data/config/locales/es-MX.yml +137 -25
  79. data/config/locales/es-PY.yml +137 -25
  80. data/config/locales/es.yml +137 -25
  81. data/config/locales/eu.yml +138 -26
  82. data/config/locales/fi-plain.yml +138 -26
  83. data/config/locales/fi.yml +138 -26
  84. data/config/locales/fr-CA.yml +79 -26
  85. data/config/locales/fr.yml +79 -26
  86. data/config/locales/ga-IE.yml +0 -13
  87. data/config/locales/gl.yml +1 -12
  88. data/config/locales/hu.yml +1 -19
  89. data/config/locales/id-ID.yml +1 -13
  90. data/config/locales/is-IS.yml +0 -12
  91. data/config/locales/it.yml +1 -17
  92. data/config/locales/ja.yml +95 -25
  93. data/config/locales/lb.yml +0 -11
  94. data/config/locales/lt.yml +1 -23
  95. data/config/locales/lv.yml +1 -13
  96. data/config/locales/nl.yml +1 -17
  97. data/config/locales/no.yml +1 -16
  98. data/config/locales/pl.yml +5 -21
  99. data/config/locales/pt-BR.yml +1 -21
  100. data/config/locales/pt.yml +1 -17
  101. data/config/locales/ro-RO.yml +30 -17
  102. data/config/locales/ru.yml +1 -13
  103. data/config/locales/sk.yml +1 -13
  104. data/config/locales/sv.yml +74 -26
  105. data/config/locales/tr-TR.yml +1 -19
  106. data/config/locales/uk.yml +0 -12
  107. data/config/locales/zh-CN.yml +1 -18
  108. data/config/locales/zh-TW.yml +1 -21
  109. data/db/migrate/20181107175558_add_questionnaire_to_existing_meetings.rb +1 -1
  110. data/db/migrate/20200827153856_add_commentable_counter_cache_to_meetings.rb +1 -1
  111. data/db/migrate/20201016065302_fix_meetings_registration_terms.rb +1 -1
  112. data/db/migrate/20210310120731_add_followable_counter_cache_to_meetings.rb +1 -1
  113. data/db/migrate/20240712104245_create_decidim_meetings_meeting_link.rb +12 -0
  114. data/db/migrate/20240828103603_add_deleted_at_to_decidim_meetings_meetings.rb +8 -0
  115. data/decidim-meetings.gemspec +1 -1
  116. data/lib/decidim/api/agenda_item_type.rb +6 -7
  117. data/lib/decidim/api/agenda_type.rb +3 -4
  118. data/lib/decidim/api/meeting_type.rb +33 -41
  119. data/lib/decidim/api/meetings_type.rb +4 -5
  120. data/lib/decidim/api/service_type.rb +1 -1
  121. data/lib/decidim/meetings/admin_engine.rb +9 -1
  122. data/lib/decidim/meetings/component.rb +14 -4
  123. data/lib/decidim/meetings/download_your_data_user_answers_serializer.rb +13 -7
  124. data/lib/decidim/meetings/meeting_serializer.rb +70 -59
  125. data/lib/decidim/meetings/schema_org_event_meeting_serializer.rb +151 -0
  126. data/lib/decidim/meetings/seeds.rb +2 -4
  127. data/lib/decidim/meetings/test/factories.rb +8 -0
  128. data/lib/decidim/meetings/test/translated_event.rb +3 -3
  129. data/lib/decidim/meetings/version.rb +1 -1
  130. data/lib/decidim/meetings.rb +1 -0
  131. metadata +32 -21
  132. data/app/cells/decidim/meetings/meetings_map/show.erb +0 -16
  133. data/app/cells/decidim/meetings/meetings_map_cell.rb +0 -32
  134. data/app/commands/decidim/meetings/admin/destroy_meeting.rb +0 -21
  135. data/app/helpers/decidim/meetings/map_helper.rb +0 -21
  136. data/app/views/decidim/meetings/meetings/_actions.html.erb +0 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1914015424af6badd9b0449162f29d9531f45777617c85abf7afc8bcfc7fc439
4
- data.tar.gz: a60c1966bd2920683d25767d342118657da641bbf0332d3b19a4a038602810d6
3
+ metadata.gz: 4b58f1c4cc8b63dfe20cb6aa3fa67afda07d428ad033f027d964d9162fa14da5
4
+ data.tar.gz: 43ee05d04ffb189bb5257f602906c0ddd955e298f1645a6f2387a63315cf45a7
5
5
  SHA512:
6
- metadata.gz: b299704d14a16389756ded8685c48e5e5e4283640fe8418e7be764a52f8fa837325d8659b3a9686bef37f60467fe8186942251cf9439b954b1353681984f6491
7
- data.tar.gz: ffd91e602170b5a2479c63565c01f990daa13ef2db41561b23c4c5c18319a8a3b51ba921bae5dec70f22c0235a0fa3590eb0dde046676e7da92df2769fce70e2
6
+ metadata.gz: ae5610457400edf2dd345a06e66a92597c5b840c8f3d77663f2b9da6249b063ab889c9a42dd8f41c894f0190c9c7f77a8f8d9da00569166a9d9c43fd3748ff79
7
+ data.tar.gz: e06e563e57f22ca38b5555c4c29f3bfccc51f1e80ebb49f6452aa6e7722ea11abf745cfdb0e5396db0564ad1f3f2c9d5d8eb6926738ec84457266687ab658bf8
@@ -12,7 +12,7 @@
12
12
  <button type="button" class="button button__sm md:button__lg button__transparent-secondary" data-dialog-close="meeting-cancelation-confirm-<%= model.id %>">
13
13
  <span><%= t("close", scope: "decidim.shared.flag_modal") %></span>
14
14
  </button>
15
- <button type="submit" class="button button__sm md:button__lg button__secondary">
15
+ <button type="submit" class="button button__sm md:button__lg button__transparent-secondary">
16
16
  <span><%= t("leave", scope: "decidim.meetings.meetings.show") %></span>
17
17
  <%= icon "arrow-right-line" %>
18
18
  </button>
@@ -1,4 +1,6 @@
1
- <%= render :cancelation_modal %>
1
+ <% unless options[:hide_modal] %>
2
+ <%= render :cancelation_modal %>
3
+ <% end %>
2
4
  <%= action_authorized_button_to(
3
5
  :join,
4
6
  "#",
@@ -20,7 +20,7 @@ module Decidim
20
20
  end
21
21
 
22
22
  def button_classes
23
- "button button__sm button__text-secondary"
23
+ "button button__sm button__transparent-secondary w-full"
24
24
  end
25
25
 
26
26
  def icon_name
@@ -1,6 +1,6 @@
1
1
  <div class="meeting__calendar-container">
2
2
  <div class="meeting__calendar meeting__calendar__lg">
3
- <div class="meeting__calendar-month">
3
+ <div class="meeting__calendar-month mb-4">
4
4
  <span><%= l(start_time, format: !same_month? ? "%b" : "%B") %></span>
5
5
  <span class="meeting__calendar-separator"><%= "-" if !same_month? %></span>
6
6
  <span><%= l(end_time, format: "%b") if !same_month? %></span>
@@ -16,7 +16,7 @@
16
16
  </div>
17
17
  <% if show_map? %>
18
18
  <div class="meeting-list__block-map">
19
- <%= cell "decidim/meetings/meetings_map", collection %>
19
+ <%= cell "decidim/map", collection, metadata_card: "decidim/meetings/meeting_card_metadata" %>
20
20
  </div>
21
21
  <% end %>
22
22
  <div class="meeting-list__block-list">
@@ -9,14 +9,17 @@
9
9
  disabled: !model.has_available_slots?
10
10
  ) %>
11
11
  <% else %>
12
- <%= render :registration_modal %>
12
+ <% unless options[:hide_modal] %>
13
+ <%= render :registration_modal %>
14
+ <% end %>
13
15
  <%= action_authorized_button_to(
14
16
  :join,
15
17
  i18n_join_text,
16
18
  "#",
17
19
  class: button_classes,
18
20
  disabled: !model.has_available_slots?,
19
- data: { "dialog-open": current_user.present? ? "meeting-registration-confirm-#{model.id}" : "loginModal" }
21
+ data: { "dialog-open": current_user.present? ? "meeting-registration-confirm-#{model.id}" : "loginModal" },
22
+ resource: model
20
23
  ) %>
21
24
  <% end %>
22
25
  <% end %>
@@ -6,7 +6,7 @@ module Decidim
6
6
  class MeetingCardMetadataCell < Decidim::CardMetadataCell
7
7
  alias meeting model
8
8
 
9
- delegate :type_of_meeting, :start_time, :end_time, :category, :withdrawn?, to: :meeting
9
+ delegate :type_of_meeting, :start_time, :end_time, :withdrawn?, to: :meeting
10
10
 
11
11
  alias start_date start_time
12
12
  alias end_date end_time
@@ -20,10 +20,10 @@ module Decidim
20
20
  private
21
21
 
22
22
  def meeting_items
23
- [start_date_item, type, comments_count_item, category_item, withdrawn_item]
23
+ [start_date_item, type, comments_count_item] + taxonomy_items + [withdrawn_item]
24
24
  end
25
25
 
26
- def meeting_items_for_map
26
+ def items_for_map
27
27
  [dates_item, type].compact_blank.map do |item|
28
28
  {
29
29
  text: item[:text],
@@ -22,8 +22,20 @@ module Decidim
22
22
  render
23
23
  end
24
24
 
25
+ def url_extra_params
26
+ return options[:url_extra_params] if options[:url_extra_params]
27
+ return {} unless defined?(current_component)
28
+ return {} if current_component == meeting.component
29
+
30
+ { previous_space: "#{current_space.class}##{current_space.id}" }
31
+ end
32
+
25
33
  private
26
34
 
35
+ def current_space
36
+ @current_space ||= current_component.participatory_space
37
+ end
38
+
27
39
  def metadata_cell
28
40
  "decidim/meetings/meeting_card_metadata"
29
41
  end
@@ -44,8 +44,7 @@ module Decidim
44
44
  @copied_meeting = Decidim.traceability.create!(
45
45
  Meeting,
46
46
  form.current_user,
47
- scope: form.scope,
48
- category: form.category,
47
+ taxonomies: form.taxonomies,
49
48
  title: parsed_title,
50
49
  description: parsed_description,
51
50
  end_time: form.end_time,
@@ -6,16 +6,17 @@ module Decidim
6
6
  # This command is executed when the user creates a Meeting from the admin
7
7
  # panel.
8
8
  class CreateMeeting < Decidim::Commands::CreateResource
9
- fetch_form_attributes :scope, :category, :end_time, :start_time, :online_meeting_url, :registration_type,
9
+ fetch_form_attributes :end_time, :start_time, :online_meeting_url, :registration_type,
10
10
  :registration_url, :address, :latitude, :longitude, :location, :location_hints,
11
11
  :private_meeting, :transparent, :registrations_enabled, :component, :iframe_embed_type,
12
- :comments_enabled, :comments_start_time, :comments_end_time, :iframe_access_level
12
+ :comments_enabled, :taxonomizations, :comments_start_time, :comments_end_time, :iframe_access_level
13
13
 
14
14
  protected
15
15
 
16
16
  def run_after_hooks
17
17
  create_services!
18
18
  create_follow_form_resource(form.current_user)
19
+ link_components!
19
20
  end
20
21
 
21
22
  def attributes
@@ -47,6 +48,11 @@ module Decidim
47
48
  end
48
49
  end
49
50
 
51
+ def link_components!
52
+ resource.components = form.components
53
+ resource.save!
54
+ end
55
+
50
56
  def create_follow_form_resource(user)
51
57
  follow_form = Decidim::FollowForm.from_params(followable_gid: resource.to_signed_global_id.to_s).with_context(current_user: user)
52
58
  Decidim::CreateFollow.call(follow_form)
@@ -6,9 +6,9 @@ module Decidim
6
6
  # This command is executed when the user changes a Meeting from the admin
7
7
  # panel.
8
8
  class UpdateMeeting < Decidim::Commands::UpdateResource
9
- fetch_form_attributes :scope, :category, :end_time, :start_time, :online_meeting_url, :registration_type,
9
+ fetch_form_attributes :end_time, :start_time, :online_meeting_url, :registration_type,
10
10
  :registration_url, :registrations_enabled, :address, :latitude, :longitude, :location,
11
- :location_hints,
11
+ :location_hints, :taxonomizations,
12
12
  :private_meeting, :transparent, :iframe_embed_type, :comments_enabled,
13
13
  :comments_start_time, :comments_end_time, :iframe_access_level
14
14
 
@@ -18,6 +18,7 @@ module Decidim
18
18
  send_notification if should_notify_followers?
19
19
  schedule_upcoming_meeting_notification if resource.published? && start_time_changed?
20
20
  update_services!
21
+ update_components!
21
22
  end
22
23
 
23
24
  def attributes
@@ -37,6 +38,11 @@ module Decidim
37
38
  resource.save!
38
39
  end
39
40
 
41
+ def update_components!
42
+ resource.components = form.components
43
+ resource.save!
44
+ end
45
+
40
46
  def send_notification
41
47
  Decidim::EventsManager.publish(
42
48
  event: "decidim.events.meetings.meeting_updated",
@@ -5,9 +5,9 @@ module Decidim
5
5
  # This command is executed when a participant or user group creates a Meeting from the public
6
6
  # views.
7
7
  class CreateMeeting < Decidim::Commands::CreateResource
8
- fetch_form_attributes :scope, :category, :end_time, :start_time, :address, :latitude, :longitude,
8
+ fetch_form_attributes :end_time, :start_time, :address, :latitude, :longitude,
9
9
  :online_meeting_url, :registration_type, :registration_url, :available_slots,
10
- :registrations_enabled, :component, :iframe_embed_type, :iframe_access_level
10
+ :registrations_enabled, :taxonomizations, :component, :iframe_embed_type, :iframe_access_level
11
11
 
12
12
  protected
13
13
 
@@ -52,8 +52,6 @@ module Decidim
52
52
  meeting,
53
53
  current_user,
54
54
  {
55
- scope: form.scope,
56
- category: form.category,
57
55
  title: { I18n.locale => parsed_title },
58
56
  description: { I18n.locale => parsed_description },
59
57
  end_time: form.end_time,
@@ -73,7 +71,8 @@ module Decidim
73
71
  type_of_meeting: form.clean_type_of_meeting,
74
72
  online_meeting_url: form.online_meeting_url,
75
73
  iframe_embed_type: form.iframe_embed_type,
76
- iframe_access_level: form.iframe_access_level
74
+ iframe_access_level: form.iframe_access_level,
75
+ taxonomizations: form.taxonomizations
77
76
  },
78
77
  visibility: "public-only"
79
78
  )
@@ -16,15 +16,20 @@ module Decidim
16
16
  private
17
17
 
18
18
  def base_query
19
- Meeting.not_hidden.where(component: current_component).order(start_time: :desc).page(params[:page]).per(15)
19
+ Meeting
20
+ .not_hidden
21
+ .where(component: current_component)
22
+ .or(MeetingLink.find_meetings(component: current_component))
23
+ .order(start_time: :desc)
24
+ .page(params[:page])
25
+ .per(15)
20
26
  end
21
27
 
22
28
  def filters
23
29
  [
24
30
  :with_any_type,
25
31
  :is_upcoming_true,
26
- :scope_id_eq,
27
- :category_id_eq,
32
+ :taxonomies_part_of_contains,
28
33
  :with_any_origin,
29
34
  :closed_at_present
30
35
  ]
@@ -33,8 +38,7 @@ module Decidim
33
38
  def filters_with_values
34
39
  {
35
40
  with_any_type: meeting_types,
36
- scope_id_eq: scope_ids_hash(scopes.top_level),
37
- category_id_eq: category_ids_hash(categories.first_class),
41
+ taxonomies_part_of_contains: taxonomy_ids_hash(available_root_taxonomies),
38
42
  closed_at_present: %w(true false),
39
43
  is_upcoming_true: %w(true false),
40
44
  with_any_origin: %w(participants official user_group)
@@ -18,8 +18,7 @@ module Decidim
18
18
  with_any_date: "upcoming",
19
19
  activity: "all",
20
20
  with_availability: "",
21
- with_any_scope: nil,
22
- with_any_category: nil,
21
+ with_any_taxonomies: nil,
23
22
  with_any_state: nil,
24
23
  with_any_origin: nil,
25
24
  with_any_type: nil
@@ -5,6 +5,7 @@ module Decidim
5
5
  module Admin
6
6
  # This controller allows an admin to manage meetings from a Participatory Process
7
7
  class MeetingsController < Admin::ApplicationController
8
+ include Decidim::Admin::HasTrashableResources
8
9
  include Decidim::Meetings::Admin::Filterable
9
10
 
10
11
  helper_method :blank_service
@@ -57,27 +58,6 @@ module Decidim
57
58
  end
58
59
  end
59
60
 
60
- def destroy
61
- enforce_permission_to(:destroy, :meeting, meeting:)
62
-
63
- Decidim::Meetings::Admin::DestroyMeeting.call(meeting, current_user) do
64
- on(:ok) do
65
- flash[:notice] = I18n.t("meetings.destroy.success", scope: "decidim.meetings.admin")
66
- redirect_to meetings_path
67
- end
68
-
69
- on(:invalid) do
70
- flash.now[:alert] = I18n.t(
71
- "meetings.destroy.invalid.proposals_count",
72
- count: proposals.size,
73
- scope: "decidim.meetings.admin"
74
- )
75
-
76
- render action: "index"
77
- end
78
- end
79
- end
80
-
81
61
  def publish
82
62
  enforce_permission_to(:update, :meeting, meeting:)
83
63
 
@@ -112,12 +92,24 @@ module Decidim
112
92
 
113
93
  private
114
94
 
95
+ def trashable_deleted_resource_type
96
+ :meeting
97
+ end
98
+
99
+ def trashable_deleted_collection
100
+ @trashable_deleted_collection ||= filtered_collection.only_deleted.deleted_at_desc
101
+ end
102
+
103
+ def trashable_deleted_resource
104
+ @trashable_deleted_resource ||= Meeting.with_deleted.where(component: current_component).find_by(id: params[:id])
105
+ end
106
+
115
107
  def meetings
116
108
  @meetings ||= filtered_collection
117
109
  end
118
110
 
119
111
  def meeting
120
- @meeting ||= meetings.find(params[:id])
112
+ @meeting ||= Meeting.where(component: current_component).find_by(id: params[:id])
121
113
  end
122
114
 
123
115
  def collection
@@ -23,8 +23,16 @@ module Decidim
23
23
  Decidim::EngineRouter.main_proxy(current_component).join_meeting_registration_path(meeting)
24
24
  end
25
25
 
26
+ def edit_questions_template
27
+ "decidim/meetings/admin/registration_form/edit_questions"
28
+ end
29
+
26
30
  private
27
31
 
32
+ def i18n_questions_flashes_scope
33
+ "decidim.forms.admin.questionnaires"
34
+ end
35
+
28
36
  def meeting
29
37
  @meeting ||= Meeting.where(component: current_component).find(params[:meeting_id])
30
38
  end
@@ -11,7 +11,6 @@ module Decidim
11
11
  include Paginable
12
12
 
13
13
  helper Decidim::FiltersHelper
14
- helper Decidim::Meetings::MapHelper
15
14
  helper Decidim::ResourceHelper
16
15
  helper Decidim::ShortLinkHelper
17
16
 
@@ -42,11 +41,10 @@ module Decidim
42
41
  with_any_date: "upcoming",
43
42
  title_or_description_cont: "",
44
43
  activity: "all",
45
- with_any_scope: nil,
44
+ with_any_taxonomies: nil,
46
45
  with_any_space: nil,
47
46
  with_any_type: nil,
48
- with_any_origin: nil,
49
- with_any_global_category: nil
47
+ with_any_origin: nil
50
48
  }
51
49
  end
52
50
 
@@ -14,6 +14,7 @@ module Decidim
14
14
  helper Decidim::ResourceVersionsHelper
15
15
  helper Decidim::ShortLinkHelper
16
16
  include Decidim::AttachmentsHelper
17
+ include Decidim::SanitizeHelper
17
18
 
18
19
  helper_method :meetings, :meeting, :registration, :search, :tab_panel_items
19
20
 
@@ -59,6 +60,8 @@ module Decidim
59
60
  def show
60
61
  raise ActionController::RoutingError, "Not Found" unless meeting
61
62
 
63
+ maybe_show_redirect_notice!
64
+
62
65
  return if meeting.current_user_can_visit_meeting?(current_user)
63
66
 
64
67
  flash[:alert] = I18n.t("meeting.not_allowed", scope: "decidim.meetings")
@@ -120,12 +123,19 @@ module Decidim
120
123
  end
121
124
 
122
125
  def search_collection
123
- Meeting.where(component: current_component).published.not_hidden.visible_for(current_user).with_availability(
124
- filter_params[:with_availability]
125
- ).includes(
126
- :component,
127
- attachments: :file_attachment
128
- )
126
+ Meeting
127
+ .where(component: current_component)
128
+ .published
129
+ .not_hidden
130
+ .or(MeetingLink.find_meetings(component: current_component))
131
+ .visible_for(current_user)
132
+ .with_availability(
133
+ filter_params[:with_availability]
134
+ )
135
+ .includes(
136
+ :component,
137
+ attachments: :file_attachment
138
+ )
129
139
  end
130
140
 
131
141
  def meeting_form
@@ -168,6 +178,30 @@ module Decidim
168
178
  }
169
179
  ] + attachments_tab_panel_items(@meeting)
170
180
  end
181
+
182
+ def maybe_show_redirect_notice!
183
+ return unless previous_space
184
+
185
+ flash.now[:notice] = I18n.t(
186
+ "meetings.show.redirect_notice",
187
+ scope: "decidim.meetings",
188
+ previous_space_url: request.referer,
189
+ previous_space_name: decidim_escape_translated(previous_space.title),
190
+ current_space_name: decidim_escape_translated(current_component.participatory_space.title)
191
+ )
192
+ end
193
+
194
+ def previous_space
195
+ return @previous_space if @previous_space
196
+ return unless params[:previous_space]
197
+
198
+ previous_space_class, previous_space_id = params[:previous_space].split("#")
199
+
200
+ @previous_space = previous_space_class.constantize.find_by(id: previous_space_id)
201
+ @previous_space
202
+ rescue NameError, LoadError
203
+ nil
204
+ end
171
205
  end
172
206
  end
173
207
  end
@@ -8,8 +8,7 @@ module Decidim
8
8
  include TranslatableAttributes
9
9
 
10
10
  attribute :services, Array[MeetingServiceForm]
11
- attribute :decidim_scope_id, Integer
12
- attribute :decidim_category_id, Integer
11
+ attribute :component_ids, Array[Integer]
13
12
  attribute :private_meeting, Boolean
14
13
  attribute :transparent, Boolean
15
14
  attribute :registration_type, String
@@ -28,8 +27,8 @@ module Decidim
28
27
  translatable_attribute :location_hints, String
29
28
 
30
29
  validates :iframe_embed_type, inclusion: { in: Decidim::Meetings::Meeting.iframe_embed_types }
31
- validates :title, translatable_presence: true
32
- validates :description, translatable_presence: true
30
+ validates :title, :description, translatable_presence: true
31
+ validates :title, :description, translated_etiquette: true
33
32
  validates :registration_type, presence: true
34
33
  validates :registration_url, presence: true, url: true, if: ->(form) { form.on_different_platform? }
35
34
  validates :type_of_meeting, presence: true
@@ -37,9 +36,6 @@ module Decidim
37
36
  validates :online_meeting_url, url: true, if: ->(form) { form.online_meeting? || form.hybrid_meeting? }
38
37
  validates :comments_start_time, date: { before: :comments_end_time, allow_blank: true, if: proc { |obj| obj.comments_end_time.present? } }
39
38
  validates :comments_end_time, date: { after: :comments_start_time, allow_blank: true, if: proc { |obj| obj.comments_start_time.present? } }
40
- validates :category, presence: true, if: ->(form) { form.decidim_category_id.present? }
41
- validates :scope, presence: true, if: ->(form) { form.decidim_scope_id.present? }
42
- validates :decidim_scope_id, scope_belongs_to_component: true, if: ->(form) { form.decidim_scope_id.present? }
43
39
  validates :clean_type_of_meeting, presence: true
44
40
  validates(
45
41
  :iframe_access_level,
@@ -48,14 +44,11 @@ module Decidim
48
44
  )
49
45
  validate :embeddable_meeting_url
50
46
 
51
- delegate :categories, to: :current_component
52
-
53
47
  def map_model(model)
54
48
  self.services = model.services.map do |service|
55
49
  MeetingServiceForm.from_model(service)
56
50
  end
57
51
 
58
- self.decidim_category_id = model.categorization.decidim_category_id if model.categorization
59
52
  self.type_of_meeting = model.type_of_meeting
60
53
 
61
54
  presenter = MeetingEditionPresenter.new(model)
@@ -67,32 +60,25 @@ module Decidim
67
60
  services.reject(&:deleted)
68
61
  end
69
62
 
70
- def number_of_services
71
- services.size
72
- end
63
+ # linked components
64
+ def components
65
+ return [] if private_non_transparent_space?
73
66
 
74
- alias component current_component
75
-
76
- # Finds the Scope from the given decidim_scope_id, uses component scope if missing.
77
- #
78
- # Returns a Decidim::Scope
79
- def scope
80
- @scope ||= @attributes["decidim_scope_id"].value ? current_component.scopes.find_by(id: @attributes["decidim_scope_id"].value) : current_component.scope
81
- end
82
-
83
- # Scope identifier
84
- #
85
- # Returns the scope identifier related to the meeting
86
- def decidim_scope_id
87
- super || scope&.id
67
+ if private_meeting && !transparent
68
+ []
69
+ else
70
+ Decidim::Component.where(id: component_ids)
71
+ end
88
72
  end
89
73
 
90
- def category
91
- return unless current_component
74
+ delegate :private_non_transparent_space?, to: :current_component
92
75
 
93
- @category ||= categories.find_by(id: decidim_category_id)
76
+ def number_of_services
77
+ services.size
94
78
  end
95
79
 
80
+ alias component current_component
81
+
96
82
  def clean_type_of_meeting
97
83
  type_of_meeting.presence
98
84
  end
@@ -3,6 +3,8 @@
3
3
  module Decidim
4
4
  module Meetings
5
5
  class BaseMeetingForm < Decidim::Form
6
+ include Decidim::HasTaxonomyFormAttributes
7
+
6
8
  attribute :address, String
7
9
  attribute :latitude, Float
8
10
  attribute :longitude, Float
@@ -18,6 +20,10 @@ module Decidim
18
20
  validates :start_time, presence: true, date: { before: :end_time }
19
21
  validates :end_time, presence: true, date: { after: :start_time }
20
22
 
23
+ def participatory_space_manifest
24
+ @participatory_space_manifest ||= current_component.participatory_space.manifest.name
25
+ end
26
+
21
27
  def type_of_meeting_select
22
28
  Decidim::Meetings::Meeting::TYPE_OF_MEETING.keys.map do |type|
23
29
  [
@@ -9,8 +9,6 @@ module Decidim
9
9
  attribute :location, String
10
10
  attribute :location_hints, String
11
11
 
12
- attribute :decidim_scope_id, Integer
13
- attribute :decidim_category_id, Integer
14
12
  attribute :user_group_id, Integer
15
13
  attribute :registration_type, String
16
14
  attribute :registrations_enabled, Boolean, default: false
@@ -21,8 +19,8 @@ module Decidim
21
19
  attribute :iframe_access_level, String
22
20
 
23
21
  validates :iframe_embed_type, inclusion: { in: Decidim::Meetings::Meeting.participants_iframe_embed_types }
24
- validates :title, presence: true
25
- validates :description, presence: true
22
+ validates :title, presence: true, etiquette: true
23
+ validates :description, presence: true, etiquette: true
26
24
  validates :type_of_meeting, presence: true
27
25
  validates :location, presence: true, if: ->(form) { form.in_person_meeting? || form.hybrid_meeting? }
28
26
  validates :online_meeting_url, presence: true, url: true, if: ->(form) { form.online_meeting? || form.hybrid_meeting? }
@@ -30,9 +28,6 @@ module Decidim
30
28
  validates :available_slots, numericality: { greater_than_or_equal_to: 0 }, presence: true, if: ->(form) { form.on_this_platform? }
31
29
  validates :registration_terms, presence: true, if: ->(form) { form.on_this_platform? }
32
30
  validates :registration_url, presence: true, url: true, if: ->(form) { form.on_different_platform? }
33
- validates :category, presence: true, if: ->(form) { form.decidim_category_id.present? }
34
- validates :scope, presence: true, if: ->(form) { form.decidim_scope_id.present? }
35
- validates :decidim_scope_id, scope_belongs_to_component: true, if: ->(form) { form.decidim_scope_id.present? }
36
31
  validates :clean_type_of_meeting, presence: true
37
32
  validates(
38
33
  :iframe_access_level,
@@ -41,10 +36,7 @@ module Decidim
41
36
  )
42
37
  validate :embeddable_meeting_url
43
38
 
44
- delegate :categories, to: :current_component
45
-
46
39
  def map_model(model)
47
- self.decidim_category_id = model.categorization.decidim_category_id if model.categorization
48
40
  presenter = MeetingEditionPresenter.new(model)
49
41
  self.title = presenter.title(all_locales: false)
50
42
  self.description = presenter.editor_description(all_locales: false)
@@ -56,26 +48,6 @@ module Decidim
56
48
 
57
49
  alias component current_component
58
50
 
59
- # Finds the Scope from the given decidim_scope_id, uses the component scope if missing.
60
- #
61
- # Returns a Decidim::Scope
62
- def scope
63
- @scope ||= @attributes["decidim_scope_id"].value ? current_component.scopes.find_by(id: @attributes["decidim_scope_id"].value) : current_component.scope
64
- end
65
-
66
- # Scope identifier
67
- #
68
- # Returns the scope identifier related to the meeting
69
- def decidim_scope_id
70
- super || scope&.id
71
- end
72
-
73
- def category
74
- return unless current_component
75
-
76
- @category ||= categories.find_by(id: decidim_category_id)
77
- end
78
-
79
51
  def clean_type_of_meeting
80
52
  type_of_meeting.presence
81
53
  end
@@ -7,7 +7,6 @@ module Decidim
7
7
  #
8
8
  module ApplicationHelper
9
9
  include Decidim::MapHelper
10
- include Decidim::Admin::ResourceScopeHelper
11
10
  include Decidim::PaginateHelper
12
11
 
13
12
  def tabs_id_for_service(service)
@@ -21,6 +20,17 @@ module Decidim
21
20
  def tabs_id_for_agenda_item_child(agenda_item)
22
21
  "meeting_agenda_item_#{agenda_item.to_param_child}"
23
22
  end
23
+
24
+ def find_meeting_components_for_select
25
+ spaces = current_organization.public_participatory_spaces
26
+ meeting_components = Decidim::Component
27
+ .where(manifest_name: "meetings", participatory_space_id: spaces.pluck(:id))
28
+ .where.not(id: current_component.id)
29
+
30
+ meeting_components.map do |component|
31
+ [component.hierarchy_title, component.id]
32
+ end.sort_by(&:first)
33
+ end
24
34
  end
25
35
  end
26
36
  end