decidim-meetings 0.29.1 → 0.30.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) 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 +6 -4
  6. data/app/cells/decidim/meetings/dates_and_map_cell.rb +1 -1
  7. data/app/cells/decidim/meetings/highlighted_meetings_for_component/show.erb +1 -1
  8. data/app/cells/decidim/meetings/join_meeting_button/show.erb +5 -2
  9. data/app/cells/decidim/meetings/meeting_card_metadata_cell.rb +3 -3
  10. data/app/cells/decidim/meetings/meeting_l_cell.rb +17 -0
  11. data/app/commands/decidim/meetings/admin/copy_meeting.rb +1 -2
  12. data/app/commands/decidim/meetings/admin/create_meeting.rb +8 -2
  13. data/app/commands/decidim/meetings/admin/update_meeting.rb +8 -2
  14. data/app/commands/decidim/meetings/create_meeting.rb +2 -2
  15. data/app/commands/decidim/meetings/update_meeting.rb +2 -3
  16. data/app/controllers/concerns/decidim/meetings/admin/filterable.rb +9 -5
  17. data/app/controllers/concerns/decidim/meetings/component_filterable.rb +1 -2
  18. data/app/controllers/decidim/meetings/admin/meetings_controller.rb +14 -22
  19. data/app/controllers/decidim/meetings/admin/registration_form_controller.rb +8 -0
  20. data/app/controllers/decidim/meetings/directory/meetings_controller.rb +2 -4
  21. data/app/controllers/decidim/meetings/meetings_controller.rb +40 -6
  22. data/app/forms/decidim/meetings/admin/close_meeting_form.rb +1 -1
  23. data/app/forms/decidim/meetings/admin/meeting_agenda_items_form.rb +1 -1
  24. data/app/forms/decidim/meetings/admin/meeting_form.rb +17 -31
  25. data/app/forms/decidim/meetings/admin/meeting_registrations_form.rb +2 -2
  26. data/app/forms/decidim/meetings/base_meeting_form.rb +6 -0
  27. data/app/forms/decidim/meetings/meeting_form.rb +2 -30
  28. data/app/helpers/decidim/meetings/admin/application_helper.rb +11 -1
  29. data/app/helpers/decidim/meetings/application_helper.rb +35 -1
  30. data/app/helpers/decidim/meetings/directory/application_helper.rb +9 -48
  31. data/app/helpers/decidim/meetings/meetings_helper.rb +5 -0
  32. data/app/models/decidim/meetings/invite.rb +10 -0
  33. data/app/models/decidim/meetings/meeting.rb +23 -1
  34. data/app/models/decidim/meetings/meeting_link.rb +25 -0
  35. data/app/packs/entrypoints/decidim_meetings_admin.js +1 -0
  36. data/app/packs/src/decidim/meetings/admin/meetings_components_form.js +77 -0
  37. data/app/packs/src/decidim/meetings/admin/meetings_form.js +8 -0
  38. data/app/packs/stylesheets/decidim/meetings/_item.scss +5 -17
  39. data/app/permissions/decidim/meetings/admin/permissions.rb +1 -1
  40. data/app/permissions/decidim/meetings/permissions.rb +20 -11
  41. data/app/presenters/decidim/meetings/admin_log/meeting_presenter.rb +1 -1
  42. data/app/presenters/decidim/meetings/meeting_presenter.rb +14 -6
  43. data/app/queries/decidim/meetings/filtered_meetings.rb +2 -2
  44. data/app/queries/decidim/meetings/metrics/meeting_followers_metric_measure.rb +2 -2
  45. data/app/queries/decidim/meetings/metrics/meetings_metric_manage.rb +6 -6
  46. data/app/serializers/decidim/meetings/base_download_your_data_serializer.rb +32 -0
  47. data/app/serializers/decidim/meetings/download_your_data_invite_serializer.rb +6 -26
  48. data/app/serializers/decidim/meetings/download_your_data_meeting_serializer.rb +15 -0
  49. data/app/serializers/decidim/meetings/download_your_data_registration_serializer.rb +6 -24
  50. data/app/views/decidim/meetings/admin/meetings/_component.html.erb +15 -0
  51. data/app/views/decidim/meetings/admin/meetings/_form.html.erb +7 -9
  52. data/app/views/decidim/meetings/admin/meetings/_linked_spaces.html.erb +53 -0
  53. data/app/views/decidim/meetings/admin/meetings/_meeting-tr.html.erb +42 -0
  54. data/app/views/decidim/meetings/admin/meetings/_meeting_actions.html.erb +70 -0
  55. data/app/views/decidim/meetings/admin/meetings/_meetings-thead.html.erb +26 -0
  56. data/app/views/decidim/meetings/admin/meetings/index.html.erb +16 -142
  57. data/app/views/decidim/meetings/admin/meetings/manage_trash.html.erb +23 -0
  58. data/app/views/decidim/meetings/admin/registration_form/edit_questions.html.erb +44 -0
  59. data/app/views/decidim/meetings/admin/registrations/edit.html.erb +1 -0
  60. data/app/views/decidim/meetings/directory/meetings/index.html.erb +1 -2
  61. data/app/views/decidim/meetings/live_events/show.html.erb +5 -5
  62. data/app/views/decidim/meetings/meetings/_form.html.erb +4 -8
  63. data/app/views/decidim/meetings/meetings/_meeting.html.erb +51 -26
  64. data/app/views/decidim/meetings/meetings/_meeting_actions.html.erb +34 -0
  65. data/app/views/decidim/meetings/meetings/_meeting_aside.html.erb +20 -59
  66. data/app/views/decidim/meetings/meetings/_meeting_poll_actions.html.erb +2 -5
  67. data/app/views/decidim/meetings/meetings/_schema_org_event_meeting.html.erb +3 -0
  68. data/app/views/decidim/meetings/meetings/index.html.erb +10 -2
  69. data/app/views/decidim/meetings/meetings/show.html.erb +5 -5
  70. data/app/views/decidim/meetings/polls/answers/index.html.erb +5 -5
  71. data/app/views/decidim/meetings/registration_mailer/confirmation.html.erb +1 -1
  72. data/app/views/decidim/meetings/shared/_filters.html.erb +1 -13
  73. data/app/views/decidim/meetings/shared/_index.html.erb +1 -1
  74. data/app/views/decidim/meetings/shared/_index.js.erb +5 -5
  75. data/app/views/decidim/meetings/shared/_meetings_aside.html.erb +2 -2
  76. data/app/views/decidim/participatory_spaces/_conference_venues.html.erb +1 -1
  77. data/config/locales/ar.yml +17 -15
  78. data/config/locales/bg.yml +5 -26
  79. data/config/locales/bn-BD.yml +1 -0
  80. data/config/locales/bs-BA.yml +8 -0
  81. data/config/locales/ca.yml +137 -25
  82. data/config/locales/cs.yml +139 -28
  83. data/config/locales/de.yml +172 -92
  84. data/config/locales/el.yml +1 -20
  85. data/config/locales/en.yml +133 -21
  86. data/config/locales/es-MX.yml +137 -25
  87. data/config/locales/es-PY.yml +137 -25
  88. data/config/locales/es.yml +137 -25
  89. data/config/locales/eu.yml +167 -55
  90. data/config/locales/fi-plain.yml +138 -26
  91. data/config/locales/fi.yml +150 -38
  92. data/config/locales/fr-CA.yml +79 -26
  93. data/config/locales/fr.yml +79 -26
  94. data/config/locales/ga-IE.yml +0 -10
  95. data/config/locales/gl.yml +1 -8
  96. data/config/locales/hu.yml +1 -17
  97. data/config/locales/id-ID.yml +1 -5
  98. data/config/locales/is-IS.yml +0 -4
  99. data/config/locales/it.yml +1 -12
  100. data/config/locales/ja.yml +96 -26
  101. data/config/locales/lb.yml +0 -8
  102. data/config/locales/lt.yml +1 -24
  103. data/config/locales/lv.yml +1 -5
  104. data/config/locales/nl.yml +1 -15
  105. data/config/locales/no.yml +1 -14
  106. data/config/locales/pl.yml +5 -22
  107. data/config/locales/pt-BR.yml +1 -22
  108. data/config/locales/pt.yml +1 -12
  109. data/config/locales/ro-RO.yml +32 -16
  110. data/config/locales/ru.yml +1 -5
  111. data/config/locales/sk.yml +1 -5
  112. data/config/locales/sv.yml +74 -26
  113. data/config/locales/tr-TR.yml +1 -8
  114. data/config/locales/uk.yml +0 -4
  115. data/config/locales/zh-CN.yml +1 -8
  116. data/config/locales/zh-TW.yml +1 -19
  117. data/db/migrate/20181107175558_add_questionnaire_to_existing_meetings.rb +1 -1
  118. data/db/migrate/20200827153856_add_commentable_counter_cache_to_meetings.rb +1 -1
  119. data/db/migrate/20201016065302_fix_meetings_registration_terms.rb +1 -1
  120. data/db/migrate/20210310120731_add_followable_counter_cache_to_meetings.rb +1 -1
  121. data/db/migrate/20240712104245_create_decidim_meetings_meeting_link.rb +12 -0
  122. data/db/migrate/20240828103603_add_deleted_at_to_decidim_meetings_meetings.rb +8 -0
  123. data/decidim-meetings.gemspec +2 -2
  124. data/lib/decidim/api/agenda_item_type.rb +6 -7
  125. data/lib/decidim/api/agenda_type.rb +3 -4
  126. data/lib/decidim/api/meeting_type.rb +44 -40
  127. data/lib/decidim/api/meetings_type.rb +5 -8
  128. data/lib/decidim/api/service_type.rb +1 -1
  129. data/lib/decidim/meetings/admin_engine.rb +9 -1
  130. data/lib/decidim/meetings/component.rb +14 -4
  131. data/lib/decidim/meetings/download_your_data_user_answers_serializer.rb +13 -7
  132. data/lib/decidim/meetings/engine.rb +2 -0
  133. data/lib/decidim/meetings/meeting_serializer.rb +86 -38
  134. data/lib/decidim/meetings/schema_org_event_meeting_serializer.rb +151 -0
  135. data/lib/decidim/meetings/seeds.rb +2 -4
  136. data/lib/decidim/meetings/test/factories.rb +14 -0
  137. data/lib/decidim/meetings/test/translated_event.rb +3 -3
  138. data/lib/decidim/meetings/version.rb +1 -1
  139. data/lib/decidim/meetings.rb +1 -0
  140. metadata +35 -22
  141. data/app/cells/decidim/meetings/meetings_map/show.erb +0 -16
  142. data/app/cells/decidim/meetings/meetings_map_cell.rb +0 -32
  143. data/app/commands/decidim/meetings/admin/destroy_meeting.rb +0 -21
  144. data/app/helpers/decidim/meetings/map_helper.rb +0 -21
  145. 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: 2e7f819ca23ee377f7c6b3f36c884edeb1db3793de73e78445948e49b62a5bad
4
- data.tar.gz: 6b463bf3658a7c1d0b3d9ca26a25eb800ca7ec70da30b6e11cc7db00f0522f17
3
+ metadata.gz: dcd3f09c335e14cfd8af7bb8e69aeebb463d7c1a857a8103160de1888501f327
4
+ data.tar.gz: f2e9d27de11c40f9cdf57b3ca2d12a4242c0817219e199825b2267077ced7b53
5
5
  SHA512:
6
- metadata.gz: 0c18cde6a37d3e4c56dba6e951c3dd27e4af50f9895156796b7d4908001ca7534099874f6279bbb5cc1b49ebc7106e7d5b9fb0b5c9dfbc5c3fc8626c1ea8be56
7
- data.tar.gz: 67312f06fa33b06598e930f97cd37ef6eabf9218499e725fa4d0e25bd36d181335efd5e772c1c51036d4caad3df1727c0974afb3a9b66d038895dd8df9e48af6
6
+ metadata.gz: 86fb431af3abf5c2fc4a5279c20ce5c1966569962d281e17cff0adf1760aa870b21c89766fb34aa005027cd864f7047f3fe864c0da247f4686da1a648fb85383
7
+ data.tar.gz: 3de5c0b9b0402c9cb690eb6091a71306db567cd9d9b4ff7b9511cf0f7205403a396d38a3fbd501b8ac1613f7eca890ce5d7a0700ae2673a9af73d3a6965e2264
@@ -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>
@@ -15,9 +15,11 @@
15
15
  </div>
16
16
  </div>
17
17
 
18
- <%= static_map %>
19
-
20
- <% if online? %>
18
+ <% if display_map? %>
19
+ <%= static_map %>
20
+ <% elsif online? %>
21
21
  <%= cell("decidim/address", meeting, online: true) %>
22
+ <% else %>
23
+ <%= cell("decidim/address", meeting) %>
22
24
  <% end %>
23
25
  </div>
@@ -14,7 +14,7 @@ module Decidim
14
14
  delegate :snippets, to: :controller
15
15
 
16
16
  def static_map
17
- return render :static_map if display_map?
17
+ return render :static_map
18
18
  end
19
19
 
20
20
  def year
@@ -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],
@@ -13,12 +13,29 @@ module Decidim
13
13
  "card__calendar-list__reset"
14
14
  end
15
15
 
16
+ # Renders the date in the meeting card list
17
+ def has_image?
18
+ true
19
+ end
20
+
16
21
  def image
17
22
  render
18
23
  end
19
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
+
20
33
  private
21
34
 
35
+ def current_space
36
+ @current_space ||= current_component.participatory_space
37
+ end
38
+
22
39
  def metadata_cell
23
40
  "decidim/meetings/meeting_card_metadata"
24
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
@@ -7,7 +7,7 @@ module Decidim
7
7
  class CloseMeetingForm < Decidim::Form
8
8
  include TranslatableAttributes
9
9
 
10
- translatable_attribute :closing_report, String
10
+ translatable_attribute :closing_report, Decidim::Attributes::RichText
11
11
  attribute :video_url, String
12
12
  attribute :audio_url, String
13
13
  attribute :closing_visible, Boolean, default: true
@@ -8,7 +8,7 @@ module Decidim
8
8
  include TranslatableAttributes
9
9
 
10
10
  translatable_attribute :title, String
11
- translatable_attribute :description, String
11
+ translatable_attribute :description, Decidim::Attributes::RichText
12
12
 
13
13
  attribute :duration, Integer, default: 0
14
14
  attribute :parent_id, Integer
@@ -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
@@ -23,13 +22,13 @@ module Decidim
23
22
  attribute :iframe_access_level, String
24
23
 
25
24
  translatable_attribute :title, String
26
- translatable_attribute :description, String
25
+ translatable_attribute :description, Decidim::Attributes::RichText
27
26
  translatable_attribute :location, String
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
@@ -15,8 +15,8 @@ module Decidim
15
15
  attribute :available_slots, Integer
16
16
  attribute :reserved_slots, Integer
17
17
 
18
- translatable_attribute :registration_terms, String
19
- translatable_attribute :registration_email_custom_content, String
18
+ translatable_attribute :registration_terms, Decidim::Attributes::RichText
19
+ translatable_attribute :registration_email_custom_content, Decidim::Attributes::RichText
20
20
 
21
21
  validates :registration_terms, translatable_presence: true, if: ->(form) { form.registrations_enabled? }
22
22
  validates :available_slots, :reserved_slots, presence: true, if: ->(form) { form.registrations_enabled? }
@@ -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
  [