decidim-meetings 0.25.1 → 0.26.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/meetings/content_blocks/highlighted_meetings/heading.erb +1 -1
  3. data/app/cells/decidim/meetings/content_blocks/highlighted_meetings_cell.rb +7 -1
  4. data/app/cells/decidim/meetings/content_blocks/{upcoming_events → upcoming_meetings}/show.erb +6 -6
  5. data/app/cells/decidim/meetings/content_blocks/{upcoming_events_cell.rb → upcoming_meetings_cell.rb} +12 -10
  6. data/app/cells/decidim/meetings/highlighted_meetings_for_component/show.erb +5 -4
  7. data/app/cells/decidim/meetings/highlighted_meetings_for_component_cell.rb +13 -1
  8. data/app/cells/decidim/meetings/join_meeting_button_cell.rb +1 -1
  9. data/app/cells/decidim/meetings/meeting_list_item_cell.rb +10 -0
  10. data/app/cells/decidim/meetings/meeting_m_cell.rb +48 -0
  11. data/app/cells/decidim/meetings/meeting_s_cell.rb +22 -0
  12. data/app/cells/decidim/meetings/meetings_map_cell.rb +6 -0
  13. data/app/cells/decidim/meetings/online_meeting_cell.rb +23 -8
  14. data/app/cells/decidim/meetings/online_meeting_link/show.erb +2 -2
  15. data/app/cells/decidim/meetings/online_meeting_link_cell.rb +1 -5
  16. data/app/cells/decidim/meetings/public_participants_list_cell.rb +1 -0
  17. data/app/cells/decidim/meetings/question_responses_cell.rb +1 -1
  18. data/app/commands/decidim/meetings/admin/create_meeting.rb +11 -1
  19. data/app/commands/decidim/meetings/admin/publish_meeting.rb +3 -1
  20. data/app/commands/decidim/meetings/admin/update_meeting.rb +8 -2
  21. data/app/commands/decidim/meetings/create_meeting.rb +14 -2
  22. data/app/commands/decidim/meetings/update_meeting.rb +5 -2
  23. data/app/commands/decidim/meetings/withdraw_meeting.rb +39 -0
  24. data/app/controllers/concerns/decidim/meetings/filterable.rb +33 -0
  25. data/app/controllers/decidim/meetings/directory/application_controller.rb +16 -0
  26. data/app/controllers/decidim/meetings/directory/meetings_controller.rb +31 -20
  27. data/app/controllers/decidim/meetings/live_events_controller.rb +7 -1
  28. data/app/controllers/decidim/meetings/meetings_controller.rb +19 -17
  29. data/app/events/decidim/meetings/close_meeting_event.rb +1 -3
  30. data/app/events/decidim/meetings/create_meeting_event.rb +2 -4
  31. data/app/events/decidim/meetings/meeting_event.rb +37 -0
  32. data/app/events/decidim/meetings/meeting_registrations_enabled_event.rb +1 -3
  33. data/app/events/decidim/meetings/meeting_registrations_over_percentage_event.rb +2 -4
  34. data/app/events/decidim/meetings/registration_code_validated_event.rb +2 -4
  35. data/app/events/decidim/meetings/upcoming_meeting_event.rb +1 -3
  36. data/app/events/decidim/meetings/update_meeting_event.rb +1 -3
  37. data/app/forms/decidim/meetings/admin/close_meeting_form.rb +1 -1
  38. data/app/forms/decidim/meetings/admin/meeting_copy_form.rb +4 -13
  39. data/app/forms/decidim/meetings/admin/meeting_form.rb +34 -46
  40. data/app/forms/decidim/meetings/base_meeting_form.rb +59 -0
  41. data/app/forms/decidim/meetings/close_meeting_form.rb +6 -6
  42. data/app/forms/decidim/meetings/meeting_form.rb +30 -46
  43. data/app/helpers/decidim/meetings/application_helper.rb +13 -1
  44. data/app/helpers/decidim/meetings/directory/application_helper.rb +150 -0
  45. data/app/helpers/decidim/meetings/meeting_cells_helper.rb +4 -1
  46. data/app/helpers/decidim/meetings/meetings_helper.rb +3 -0
  47. data/app/models/decidim/meetings/meeting.rb +54 -2
  48. data/app/packs/src/decidim/meetings/admin/meetings_form.js +27 -11
  49. data/app/packs/src/decidim/meetings/meetings_form.js +19 -0
  50. data/app/packs/src/decidim/meetings/meetings_polls.js +31 -26
  51. data/app/permissions/decidim/meetings/permissions.rb +9 -1
  52. data/app/presenters/decidim/meetings/meeting_edition_presenter.rb +14 -0
  53. data/app/presenters/decidim/meetings/meeting_presenter.rb +13 -6
  54. data/app/services/decidim/meetings/directory/meeting_search.rb +53 -0
  55. data/app/services/decidim/meetings/meeting_iframe_embedder.rb +2 -2
  56. data/app/services/decidim/meetings/meeting_search.rb +15 -2
  57. data/app/views/decidim/meetings/admin/meeting_copies/_form.html.erb +16 -1
  58. data/app/views/decidim/meetings/admin/meeting_copies/new.html.erb +1 -1
  59. data/app/views/decidim/meetings/admin/meetings/_form.html.erb +15 -3
  60. data/app/views/decidim/meetings/directory/meetings/_filters.html.erb +34 -0
  61. data/app/views/decidim/meetings/directory/meetings/index.html.erb +1 -18
  62. data/app/views/decidim/meetings/meetings/_filters.html.erb +2 -0
  63. data/app/views/decidim/meetings/meetings/_filters_small_view.html.erb +3 -3
  64. data/app/views/decidim/meetings/meetings/_form.html.erb +14 -3
  65. data/app/views/decidim/meetings/meetings/_linked_meetings.html.erb +1 -1
  66. data/app/views/decidim/meetings/meetings/_meetings.html.erb +18 -0
  67. data/app/views/decidim/meetings/meetings/index.html.erb +1 -0
  68. data/app/views/decidim/meetings/meetings/show.html.erb +12 -13
  69. data/config/locales/ar.yml +2 -7
  70. data/config/locales/ca.yml +45 -17
  71. data/config/locales/cs.yml +41 -13
  72. data/config/locales/de.yml +57 -9
  73. data/config/locales/el.yml +2 -7
  74. data/config/locales/en.yml +41 -13
  75. data/config/locales/es-MX.yml +41 -13
  76. data/config/locales/es-PY.yml +42 -14
  77. data/config/locales/es.yml +42 -14
  78. data/config/locales/eu.yml +20 -16
  79. data/config/locales/fi-plain.yml +41 -13
  80. data/config/locales/fi.yml +41 -13
  81. data/config/locales/fr-CA.yml +48 -13
  82. data/config/locales/fr.yml +69 -34
  83. data/config/locales/ga-IE.yml +2 -7
  84. data/config/locales/gl.yml +33 -7
  85. data/config/locales/hu.yml +32 -7
  86. data/config/locales/id-ID.yml +2 -7
  87. data/config/locales/is-IS.yml +0 -7
  88. data/config/locales/it.yml +4 -16
  89. data/config/locales/ja.yml +47 -19
  90. data/config/locales/lb-LU.yml +210 -0
  91. data/config/locales/lb.yml +2 -12
  92. data/config/locales/lv.yml +2 -7
  93. data/config/locales/nl.yml +35 -11
  94. data/config/locales/no.yml +154 -9
  95. data/config/locales/pl.yml +25 -12
  96. data/config/locales/pt-BR.yml +13 -10
  97. data/config/locales/pt.yml +2 -15
  98. data/config/locales/ro-RO.yml +35 -17
  99. data/config/locales/ru.yml +0 -7
  100. data/config/locales/sk.yml +2 -7
  101. data/config/locales/sv.yml +41 -13
  102. data/config/locales/tr-TR.yml +13 -10
  103. data/config/locales/uk.yml +0 -9
  104. data/config/locales/val-ES.yml +1 -0
  105. data/config/locales/zh-CN.yml +8 -9
  106. data/db/migrate/20210519133705_add_comments_availability_columns_to_meetings_table.rb +14 -0
  107. data/db/migrate/20210727085318_add_state_field_to_meeting.rb +7 -0
  108. data/db/migrate/20210903143040_add_iframe_access_level_to_decidim_meetings.rb +7 -0
  109. data/db/migrate/20210922140454_transform_show_embedded_iframe_column.rb +15 -0
  110. data/db/migrate/20210928095036_rename_upcoming_events_content_block_to_upcoming_meetings.rb +13 -0
  111. data/lib/decidim/api/meeting_type.rb +2 -1
  112. data/lib/decidim/meetings/component.rb +15 -6
  113. data/lib/decidim/meetings/directory_engine.rb +3 -3
  114. data/lib/decidim/meetings/engine.rb +4 -1
  115. data/lib/decidim/meetings/meeting_serializer.rb +2 -2
  116. data/lib/decidim/meetings/test/factories.rb +30 -3
  117. data/lib/decidim/meetings/test/notifications_handling.rb +39 -0
  118. data/lib/decidim/meetings/test/translated_event.rb +22 -0
  119. data/lib/decidim/meetings/version.rb +1 -1
  120. data/lib/decidim/meetings.rb +5 -0
  121. metadata +37 -20
@@ -44,8 +44,8 @@ sv:
44
44
  models:
45
45
  meeting:
46
46
  attributes:
47
- show_embedded_iframe:
48
- not_embeddable: URL:en kan inte integreras
47
+ iframe_embed_type:
48
+ not_embeddable: Denna URL kan inte bäddas in på ett mötes- eller liveevenemangssida
49
49
  meeting_agenda:
50
50
  attributes:
51
51
  base:
@@ -282,6 +282,9 @@ sv:
282
282
  edit:
283
283
  close: Stäng
284
284
  title: Stäng mötet
285
+ meeting_copies:
286
+ form:
287
+ select_a_meeting_type: Välj mötestyp
285
288
  meetings:
286
289
  close:
287
290
  invalid: Det gick inte att stänga mötet
@@ -309,7 +312,8 @@ sv:
309
312
  registration_url_help: 'Länk: tillåt deltagare att registrera sig på en extern tjänst'
310
313
  select_a_meeting_type: Välj mötestyp
311
314
  select_a_registration_type: Välj en registreringsmetod
312
- show_embedded_iframe_help: Välj om adressen ska integreras som iframe. Endast ett fåtal tjänster tillåter integrering (t.ex. Youtube, Twitch...)
315
+ select_an_iframe_access_level: Välj vem får tillgång till denna iframe
316
+ show_embedded_iframe_help: Endast ett fåtal tjänster tillåter inbäddning i möten eller live-event (t.ex. YouTube, Twitch och Jitsi)
313
317
  index:
314
318
  title: Möten
315
319
  new:
@@ -379,26 +383,37 @@ sv:
379
383
  value_types:
380
384
  organizer_presenter:
381
385
  not_found: 'Arrangören hittades inte i databasen (ID: %{id})'
386
+ application_helper:
387
+ filter_category_values:
388
+ all: Alla
389
+ filter_meeting_space_values:
390
+ all: Alla
391
+ filter_scope_values:
392
+ all: Alla
382
393
  calendar_modal:
383
394
  calendar_url: Kalender-URL
384
395
  close_window: Stäng fönster
385
396
  export_calendar: Exportera kalender
386
397
  conference_venues: Konferenslokaler
387
398
  content_blocks:
388
- upcoming_events:
389
- name: Kommande händelser
390
- upcoming_events: Kommande möten
391
- view_all_events: Visa alla
399
+ upcoming_meetings:
400
+ name: Kommande möten
401
+ upcoming_meetings: Kommande möten
402
+ view_all_meetings: Visa alla
392
403
  directory:
393
404
  meetings:
394
405
  index:
395
- all: Allt
396
- date: Datum
397
406
  meetings: Möten
398
- past: Tidigare
399
- search: Sök
400
407
  space_type: Deltagarutrymme
401
- upcoming: Kommande
408
+ iframe_access_level:
409
+ all: Alla besökare
410
+ registered: Registrerade deltagare till detta möte
411
+ signed_in: Endast registrerade deltagare
412
+ iframe_embed_type:
413
+ embed_in_meeting_page: Bädda in på mötessidan
414
+ none: Ingen
415
+ open_in_live_event_page: Öppna i live event sida (med valfria omröstningar)
416
+ open_in_new_tab: Öppna länk i ny flik
402
417
  last_activity:
403
418
  meeting_updated_at_html: "<span>Mötet uppdaterades på %{link}</span>"
404
419
  new_meeting_at_html: "<span>Nytt möte på %{link}</span>"
@@ -481,9 +496,14 @@ sv:
481
496
  select_a_category: Välj en kategori
482
497
  select_a_meeting_type: Välj mötestyp
483
498
  select_a_registration_type: Välj en registreringsmetod
484
- show_embedded_iframe_help: Välj om adressen ska integreras som iframe. Endast ett fåtal tjänster tillåter integrering (t.ex. Youtube, Twitch...)
499
+ select_an_iframe_access_level: Välj vem får tillgång till denna iframe
500
+ show_embedded_iframe_help: Endast ett fåtal tjänster tillåter inbäddning i möten eller live-event (t.ex. YouTube, Twitch och Jitsi)
485
501
  index:
502
+ click_here: Se alla möten
486
503
  new_meeting: Nytt möte
504
+ see_all: Se alla möten
505
+ see_all_withdrawn: Se alla tillbakadragna möten
506
+ text_banner: Du tittar på listan över möten som dragits tillbaka av sina författare. %{go_back_link}.
487
507
  meeting_minutes:
488
508
  related_information: Relaterad information
489
509
  meetings:
@@ -502,6 +522,7 @@ sv:
502
522
  close_meeting: Avsluta möte
503
523
  contributions: Antal bidrag
504
524
  date: Datum
525
+ edit_close_meeting: Redigera mötesrapport
505
526
  edit_meeting: Redigera möte
506
527
  going: Du har anmält dig för detta möte
507
528
  join: Gå med i mötet
@@ -523,6 +544,9 @@ sv:
523
544
  other: "%{count} platser kvar"
524
545
  view: Visa
525
546
  visit_finished: Visa tidigare möten
547
+ withdraw_btn_hint: Du kan dra tillbaka ditt möte om du ändrar dig. Mötet raderas inte utan kommer att synas i listan över möten som dragits tillbaka.
548
+ withdraw_confirmation_html: Är du säker på att du vill dra tillbaka det här mötet?<br><br><strong>Den här åtgärden kan inte ångras!</strong>
549
+ withdraw_meeting: Dra tillbaka möte
526
550
  update:
527
551
  invalid: Det gick inte att uppdatera mötet.
528
552
  success: Du har uppdaterat mötet.
@@ -600,8 +624,12 @@ sv:
600
624
  types:
601
625
  private_meeting: Privat möte
602
626
  transparent: Transparent
627
+ withdraw: Tillbakadragna
603
628
  versions:
604
629
  back_to_resource: Gå tillbaka till mötet
630
+ withdraw:
631
+ error: Det gick inte att dra tillbaka mötet
632
+ success: Mötet har dragits tillbaka
605
633
  metrics:
606
634
  meetings:
607
635
  description: Antal skapade möten
@@ -67,6 +67,16 @@ tr:
67
67
  other: Kayıtlar
68
68
  decidim:
69
69
  admin:
70
+ filters:
71
+ meetings:
72
+ origin_eq:
73
+ label: Orijin
74
+ values:
75
+ official: Resmi
76
+ type_eq:
77
+ values:
78
+ hybrid: Her ikisi
79
+ online: Çevrimiçi
70
80
  meeting_copies:
71
81
  create:
72
82
  error: Bu toplantıyı kopyalarken bir sorun oluştu.
@@ -255,7 +265,7 @@ tr:
255
265
  update: Güncelle
256
266
  form:
257
267
  address_help: 'Adres: Geocoder tarafından konumu bulmak için kullanılır'
258
- available_slots_help: Sınırsız yuvanız varsa bunu 0 olarak bırakın
268
+ available_slots_help: Sınırsız alanınız varsa bunu 0 olarak bırakın
259
269
  disclaimer: 'Sorumluluk reddi: Harici bir kayıt sistemi kullanarak, %{organization} organizatörlerinin, kullanıcılar tarafından harici hizmete sağlanan verilerden sorumlu olmadığını biliyorsunuz.'
260
270
  location_help: 'Konum: kullanıcılara buluşulacak yeri ima eden mesaj'
261
271
  location_hints_help: 'Konum ipuçları: ek bilgi. Örnek: Yüz yüze bir toplantıysa binanın katı veya kısıtlı erişime sahip çevrimiçi bir toplantıysa toplantı parolası.'
@@ -326,20 +336,13 @@ tr:
326
336
  export_calendar: Takvimi dışa aktar
327
337
  conference_venues: Konferans Mekanları
328
338
  content_blocks:
329
- upcoming_events:
330
- name: Yaklaşan Etkinlikler
331
- upcoming_events: Yaklaşan toplantılar
332
- view_all_events: Hepsini gör
339
+ upcoming_meetings:
340
+ view_all_meetings: Hepsini gör
333
341
  directory:
334
342
  meetings:
335
343
  index:
336
- all: Tümü
337
- date: Tarih
338
344
  meetings: Toplantılar
339
- past: Geçmiş
340
- search: Arama
341
345
  space_type: Katılımcı alan
342
- upcoming: Yaklaşan
343
346
  last_activity:
344
347
  new_meeting_at_html: "<span>%{link} </span> adresinde yeni toplantı"
345
348
  mailer:
@@ -263,15 +263,6 @@ uk:
263
263
  value_types:
264
264
  organizer_presenter:
265
265
  not_found: 'Цього організатора не знайдено в базі даних (ID: %{id})'
266
- content_blocks:
267
- upcoming_events:
268
- upcoming_events: Прийдешні зустрічі
269
- directory:
270
- meetings:
271
- index:
272
- all: Усі
273
- date: Дата
274
- search: Шукати
275
266
  mailer:
276
267
  invite_join_meeting_mailer:
277
268
  invite:
@@ -0,0 +1 @@
1
+ val:
@@ -59,6 +59,12 @@ zh-CN:
59
59
  other: 注册
60
60
  decidim:
61
61
  admin:
62
+ filters:
63
+ meetings:
64
+ origin_eq:
65
+ label: 始发地
66
+ values:
67
+ official: 官方的
62
68
  meeting_copies:
63
69
  create:
64
70
  error: 重复这次会议时出现问题。
@@ -304,20 +310,13 @@ zh-CN:
304
310
  export_calendar: 导出日历
305
311
  conference_venues: 会议地点
306
312
  content_blocks:
307
- upcoming_events:
308
- name: 即将到来的事件
309
- upcoming_events: 即将举行的会议
310
- view_all_events: 查看全部
313
+ upcoming_meetings:
314
+ view_all_meetings: 查看全部
311
315
  directory:
312
316
  meetings:
313
317
  index:
314
- all: 所有的
315
- date: 日期
316
318
  meetings: 会议
317
- past: 过去的
318
- search: 搜索
319
319
  space_type: 参与空间
320
- upcoming: 即将到来的
321
320
  last_activity:
322
321
  new_meeting_at_html: "<span>在 %{link}的新会议</span>"
323
322
  mailer:
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddCommentsAvailabilityColumnsToMeetingsTable < ActiveRecord::Migration[6.0]
4
+ def change
5
+ add_column :decidim_meetings_meetings, :comments_enabled, :boolean, default: true
6
+ add_column :decidim_meetings_meetings, :comments_start_time, :datetime
7
+ add_column :decidim_meetings_meetings, :comments_end_time, :datetime
8
+ reversible do |dir|
9
+ dir.up do
10
+ execute "UPDATE decidim_meetings_meetings set comments_enabled = true"
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddStateFieldToMeeting < ActiveRecord::Migration[6.0]
4
+ def change
5
+ add_column :decidim_meetings_meetings, :state, :string, index: true
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddIframeAccessLevelToDecidimMeetings < ActiveRecord::Migration[6.0]
4
+ def change
5
+ add_column :decidim_meetings_meetings, :iframe_access_level, :integer, default: 0
6
+ end
7
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ class TransformShowEmbeddedIframeColumn < ActiveRecord::Migration[6.0]
4
+ def up
5
+ add_column :decidim_meetings_meetings, :iframe_embed_type, :integer, default: 0
6
+ execute "UPDATE decidim_meetings_meetings SET iframe_embed_type = 1 WHERE show_embedded_iframe = 't'"
7
+ remove_column :decidim_meetings_meetings, :show_embedded_iframe
8
+ end
9
+
10
+ def down
11
+ add_column :decidim_meetings_meetings, :show_embedded_iframe, :boolean, default: false
12
+ execute "UPDATE decidim_meetings_meetings SET show_embedded_iframe = 't' WHERE iframe_embed_type = 1"
13
+ remove_column :decidim_meetings_meetings, :iframe_embed_type
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ class RenameUpcomingEventsContentBlockToUpcomingMeetings < ActiveRecord::Migration[6.0]
4
+ class ContentBlock < ApplicationRecord
5
+ self.table_name = :decidim_content_blocks
6
+ end
7
+
8
+ def change
9
+ # rubocop:disable Rails/SkipsModelValidations
10
+ ContentBlock.where(manifest_name: "upcoming_events").update_all(manifest_name: "upcoming_meetings")
11
+ # rubocop:enable Rails/SkipsModelValidations
12
+ end
13
+ end
@@ -28,6 +28,7 @@ module Decidim
28
28
  end
29
29
 
30
30
  field :closed, GraphQL::Types::Boolean, "Whether this meeting is closed or not.", method: :closed?, null: false
31
+ field :isWithdrawn, GraphQL::Types::Boolean, "Whether this meeting is withdrawn or not.", method: :withdrawn?, null: false
31
32
  field :closing_report, Decidim::Core::TranslatedFieldType, "The closing report of this meeting.", null: true
32
33
  field :video_url, GraphQL::Types::String, "URL for the video of the session, if any", null: true
33
34
  field :audio_url, GraphQL::Types::String, "URL for the audio of the session, if any", null: true
@@ -72,7 +73,7 @@ module Decidim
72
73
  end
73
74
  field :type_of_meeting, GraphQL::Types::String, "The type of the meeting (online or in-person)", null: false
74
75
  field :online_meeting_url, GraphQL::Types::String, "The URL of the meeting (when the type is online)", null: false
75
- field :show_embedded_iframe, GraphQL::Types::Boolean, "Whether show or not the iframe", null: false
76
+ field :iframe_embed_type, GraphQL::Types::String, "The type of displaying of the online meeting URL", null: true
76
77
  end
77
78
  end
78
79
  end
@@ -25,7 +25,7 @@ Decidim.register_component(:meetings) do |component|
25
25
  end
26
26
 
27
27
  component.register_stat :meetings_count, primary: true, priority: Decidim::StatsRegistry::MEDIUM_PRIORITY do |components, start_at, end_at|
28
- meetings = Decidim::Meetings::FilteredMeetings.for(components, start_at, end_at)
28
+ meetings = Decidim::Meetings::FilteredMeetings.for(components, start_at, end_at).except_withdrawn
29
29
  meetings.count
30
30
  end
31
31
 
@@ -46,7 +46,7 @@ Decidim.register_component(:meetings) do |component|
46
46
  .not_hidden
47
47
  .visible
48
48
  .where(component: component_instance)
49
- .includes(component: { participatory_space: :organization })
49
+ .includes(:scope, :category, :attachments, component: { participatory_space: :organization })
50
50
  end
51
51
 
52
52
  exports.include_in_open_data = true
@@ -58,7 +58,7 @@ Decidim.register_component(:meetings) do |component|
58
58
  exports.collection do |component_instance|
59
59
  Decidim::Comments::Export.comments_for_resource(
60
60
  Decidim::Meetings::Meeting, component_instance
61
- )
61
+ ).includes(:author, :user_group, root_commentable: { component: { participatory_space: :organization } })
62
62
  end
63
63
 
64
64
  exports.include_in_open_data = true
@@ -129,6 +129,7 @@ Decidim.register_component(:meetings) do |component|
129
129
 
130
130
  2.times do
131
131
  start_time = [rand(1..20).weeks.from_now, rand(1..20).weeks.ago].sample
132
+ end_time = start_time + [rand(1..4).hours, rand(1..20).days].sample
132
133
  params = {
133
134
  component: component,
134
135
  scope: Faker::Boolean.boolean(true_ratio: 0.5) ? global : scopes.sample,
@@ -140,7 +141,7 @@ Decidim.register_component(:meetings) do |component|
140
141
  location: Decidim::Faker::Localized.sentence,
141
142
  location_hints: Decidim::Faker::Localized.sentence,
142
143
  start_time: start_time,
143
- end_time: start_time + rand(1..4).hours,
144
+ end_time: end_time,
144
145
  address: "#{Faker::Address.street_address} #{Faker::Address.zip} #{Faker::Address.city}",
145
146
  latitude: Faker::Address.latitude,
146
147
  longitude: Faker::Address.longitude,
@@ -156,14 +157,22 @@ Decidim.register_component(:meetings) do |component|
156
157
  _hybrid_meeting = Decidim.traceability.create!(
157
158
  Decidim::Meetings::Meeting,
158
159
  admin_user,
159
- params.merge(type_of_meeting: :hybrid, online_meeting_url: "http://example.org"),
160
+ params.merge(
161
+ title: Decidim::Faker::Localized.sentence(word_count: 2),
162
+ type_of_meeting: :hybrid,
163
+ online_meeting_url: "http://example.org"
164
+ ),
160
165
  visibility: "all"
161
166
  )
162
167
 
163
168
  _online_meeting = Decidim.traceability.create!(
164
169
  Decidim::Meetings::Meeting,
165
170
  admin_user,
166
- params.merge(type_of_meeting: :online, online_meeting_url: "http://example.org"),
171
+ params.merge(
172
+ title: Decidim::Faker::Localized.sentence(word_count: 2),
173
+ type_of_meeting: :online,
174
+ online_meeting_url: "http://example.org"
175
+ ),
167
176
  visibility: "all"
168
177
  )
169
178
 
@@ -22,9 +22,9 @@ module Decidim
22
22
  end
23
23
 
24
24
  initializer "decidim.meetings.content_blocks" do
25
- Decidim.content_blocks.register(:homepage, :upcoming_events) do |content_block|
26
- content_block.cell = "decidim/meetings/content_blocks/upcoming_events"
27
- content_block.public_name_key = "decidim.meetings.content_blocks.upcoming_events.name"
25
+ Decidim.content_blocks.register(:homepage, :upcoming_meetings) do |content_block|
26
+ content_block.cell = "decidim/meetings/content_blocks/upcoming_meetings"
27
+ content_block.public_name_key = "decidim.meetings.content_blocks.upcoming_meetings.name"
28
28
  content_block.default!
29
29
  end
30
30
  end
@@ -13,7 +13,10 @@ module Decidim
13
13
  isolate_namespace Decidim::Meetings
14
14
 
15
15
  routes do
16
- resources :meetings, only: [:index, :show, :new, :create, :edit, :update] do
16
+ resources :meetings, only: [:index, :show, :new, :create, :edit, :update, :withdraw] do
17
+ member do
18
+ put :withdraw
19
+ end
17
20
  resources :meeting_closes, only: [:edit, :update] do
18
21
  get :proposals_picker, on: :collection
19
22
  end
@@ -41,8 +41,8 @@ module Decidim
41
41
  location: meeting.location,
42
42
  reference: meeting.reference,
43
43
  comments: meeting.comments_count,
44
- attachments: meeting.attachments.count,
45
- followers: meeting.followers.count,
44
+ attachments: meeting.attachments.size,
45
+ followers: meeting.follows.size,
46
46
  url: url,
47
47
  related_proposals: related_proposals,
48
48
  related_results: related_results
@@ -37,7 +37,8 @@ FactoryBot.define do
37
37
  registration_type { :on_this_platform }
38
38
  type_of_meeting { :in_person }
39
39
  component { build(:component, manifest_name: "meetings") }
40
- show_embedded_iframe { false }
40
+ iframe_access_level { :all }
41
+ iframe_embed_type { :none }
41
42
 
42
43
  author do
43
44
  component.try(:organization)
@@ -47,6 +48,10 @@ FactoryBot.define do
47
48
  published_at { Time.current }
48
49
  end
49
50
 
51
+ trait :withdrawn do
52
+ state { "withdrawn" }
53
+ end
54
+
50
55
  trait :in_person do
51
56
  type_of_meeting { :in_person }
52
57
  end
@@ -135,8 +140,30 @@ FactoryBot.define do
135
140
  published_at { Time.current }
136
141
  end
137
142
 
138
- trait :show_embedded_iframe do
139
- show_embedded_iframe { true }
143
+ trait :signed_in_iframe_access_level do
144
+ iframe_access_level { :signed_in }
145
+ end
146
+
147
+ trait :registered_iframe_access_level do
148
+ iframe_access_level { :registered }
149
+ end
150
+
151
+ trait :embed_in_meeting_page_iframe_embed_type do
152
+ iframe_embed_type { :embed_in_meeting_page }
153
+ end
154
+
155
+ trait :open_in_live_event_page_iframe_embed_type do
156
+ iframe_embed_type { :open_in_live_event_page }
157
+ end
158
+
159
+ trait :open_in_new_tab_iframe_embed_type do
160
+ iframe_embed_type { :open_in_new_tab }
161
+ end
162
+
163
+ trait :moderated do
164
+ after(:create) do |meeting, _evaluator|
165
+ create(:moderation, reportable: meeting, hidden_at: 2.days.ago)
166
+ end
140
167
  end
141
168
  end
142
169
 
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ shared_examples_for "emits an upcoming notificaton" do
4
+ context "when it's a future meeting" do
5
+ let(:future_start_date) { 3.days.from_now }
6
+
7
+ before do
8
+ meeting.start_time = future_start_date
9
+ end
10
+
11
+ it "schedules a upcoming meeting notification job 48h before start time" do
12
+ expect(Decidim::Meetings::UpcomingMeetingNotificationJob)
13
+ .to receive(:generate_checksum).and_return "1234"
14
+
15
+ expect(Decidim::Meetings::UpcomingMeetingNotificationJob)
16
+ .to receive_message_chain(:set, :perform_later) # rubocop:disable RSpec/MessageChain
17
+ .with(set: meeting.start_time - Decidim::Meetings.upcoming_meeting_notification)
18
+ .with(kind_of(Integer), "1234")
19
+
20
+ subject.call
21
+ end
22
+ end
23
+
24
+ context "when it's a past meeting" do
25
+ let(:past_start_date) { 1.day.ago }
26
+
27
+ before do
28
+ meeting.start_time = past_start_date
29
+ end
30
+
31
+ it "doesn't schedule an upcoming meeting notification" do
32
+ expect(Decidim::Meetings::UpcomingMeetingNotificationJob).not_to receive(:generate_checksum)
33
+ expect(Decidim::Meetings::UpcomingMeetingNotificationJob).not_to receive(:set)
34
+ expect(Decidim::Meetings::UpcomingMeetingNotificationJob).not_to receive(:perform_later)
35
+
36
+ subject.call
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ shared_examples_for "a translated meeting event" do
4
+ describe "translated notifications" do
5
+ let(:en_body) { "This is Sparta!" }
6
+ let(:body) { { "en": en_body, "machine_translations": { "ca": "C'est Sparta!" } } }
7
+ let(:participatory_process) { create :participatory_process, organization: organization }
8
+ let(:meeting_component) { create(:meeting_component, participatory_space: participatory_process) }
9
+ let(:translatable) { true }
10
+ let(:en_version) { resource.description["en"] }
11
+ let(:machine_translated) { resource.description["machine_translations"]["ca"] }
12
+
13
+ let(:resource) do
14
+ create :meeting,
15
+ component: meeting_component,
16
+ title: { "en": "A nice event", "machine_translations": { "ca": "Une belle event" } },
17
+ description: body
18
+ end
19
+
20
+ it_behaves_like "a translated event"
21
+ end
22
+ end
@@ -4,7 +4,7 @@ module Decidim
4
4
  # This holds the decidim-meetings version.
5
5
  module Meetings
6
6
  def self.version
7
- "0.25.1"
7
+ "0.26.0"
8
8
  end
9
9
  end
10
10
  end
@@ -23,5 +23,10 @@ module Decidim
23
23
  config_accessor :enable_proposal_linking do
24
24
  Decidim.const_defined?("Proposals")
25
25
  end
26
+
27
+ # Public Setting that defines the interval when the upcoming meeting will be sent
28
+ config_accessor :upcoming_meeting_notification do
29
+ 2.days
30
+ end
26
31
  end
27
32
  end