decidim-meetings 0.25.2 → 0.26.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) 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 +1 -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} +11 -10
  6. data/app/cells/decidim/meetings/highlighted_meetings_for_component_cell.rb +1 -1
  7. data/app/cells/decidim/meetings/join_meeting_button_cell.rb +1 -1
  8. data/app/cells/decidim/meetings/meeting_list_item_cell.rb +10 -0
  9. data/app/cells/decidim/meetings/meeting_m_cell.rb +48 -0
  10. data/app/cells/decidim/meetings/meeting_s_cell.rb +22 -0
  11. data/app/cells/decidim/meetings/meetings_map_cell.rb +6 -0
  12. data/app/cells/decidim/meetings/online_meeting_cell.rb +23 -8
  13. data/app/cells/decidim/meetings/online_meeting_link/show.erb +2 -2
  14. data/app/cells/decidim/meetings/online_meeting_link_cell.rb +1 -5
  15. data/app/cells/decidim/meetings/public_participants_list_cell.rb +1 -0
  16. data/app/cells/decidim/meetings/question_responses_cell.rb +1 -1
  17. data/app/commands/decidim/meetings/admin/create_meeting.rb +11 -1
  18. data/app/commands/decidim/meetings/admin/publish_meeting.rb +3 -1
  19. data/app/commands/decidim/meetings/admin/update_meeting.rb +8 -2
  20. data/app/commands/decidim/meetings/create_meeting.rb +14 -2
  21. data/app/commands/decidim/meetings/update_meeting.rb +5 -2
  22. data/app/commands/decidim/meetings/withdraw_meeting.rb +39 -0
  23. data/app/controllers/concerns/decidim/meetings/filterable.rb +33 -0
  24. data/app/controllers/decidim/meetings/directory/application_controller.rb +16 -0
  25. data/app/controllers/decidim/meetings/directory/meetings_controller.rb +31 -20
  26. data/app/controllers/decidim/meetings/live_events_controller.rb +7 -1
  27. data/app/controllers/decidim/meetings/meetings_controller.rb +19 -17
  28. data/app/events/decidim/meetings/close_meeting_event.rb +1 -3
  29. data/app/events/decidim/meetings/create_meeting_event.rb +2 -4
  30. data/app/events/decidim/meetings/meeting_event.rb +37 -0
  31. data/app/events/decidim/meetings/meeting_registrations_enabled_event.rb +1 -3
  32. data/app/events/decidim/meetings/meeting_registrations_over_percentage_event.rb +2 -4
  33. data/app/events/decidim/meetings/registration_code_validated_event.rb +2 -4
  34. data/app/events/decidim/meetings/upcoming_meeting_event.rb +1 -3
  35. data/app/events/decidim/meetings/update_meeting_event.rb +1 -3
  36. data/app/forms/decidim/meetings/admin/close_meeting_form.rb +1 -1
  37. data/app/forms/decidim/meetings/admin/meeting_copy_form.rb +4 -13
  38. data/app/forms/decidim/meetings/admin/meeting_form.rb +34 -46
  39. data/app/forms/decidim/meetings/base_meeting_form.rb +59 -0
  40. data/app/forms/decidim/meetings/close_meeting_form.rb +6 -6
  41. data/app/forms/decidim/meetings/meeting_form.rb +30 -46
  42. data/app/helpers/decidim/meetings/application_helper.rb +13 -1
  43. data/app/helpers/decidim/meetings/directory/application_helper.rb +150 -0
  44. data/app/helpers/decidim/meetings/meeting_cells_helper.rb +4 -1
  45. data/app/helpers/decidim/meetings/meetings_helper.rb +3 -0
  46. data/app/models/decidim/meetings/meeting.rb +53 -1
  47. data/app/packs/src/decidim/meetings/admin/meetings_form.js +27 -11
  48. data/app/packs/src/decidim/meetings/meetings_form.js +19 -0
  49. data/app/packs/src/decidim/meetings/meetings_polls.js +31 -26
  50. data/app/permissions/decidim/meetings/permissions.rb +9 -1
  51. data/app/presenters/decidim/meetings/meeting_edition_presenter.rb +14 -0
  52. data/app/presenters/decidim/meetings/meeting_presenter.rb +13 -6
  53. data/app/services/decidim/meetings/directory/meeting_search.rb +53 -0
  54. data/app/services/decidim/meetings/meeting_iframe_embedder.rb +1 -1
  55. data/app/services/decidim/meetings/meeting_search.rb +15 -2
  56. data/app/views/decidim/meetings/admin/meeting_copies/_form.html.erb +16 -1
  57. data/app/views/decidim/meetings/admin/meeting_copies/new.html.erb +1 -1
  58. data/app/views/decidim/meetings/admin/meetings/_form.html.erb +15 -3
  59. data/app/views/decidim/meetings/directory/meetings/_filters.html.erb +34 -0
  60. data/app/views/decidim/meetings/directory/meetings/index.html.erb +1 -18
  61. data/app/views/decidim/meetings/meetings/_filters.html.erb +2 -0
  62. data/app/views/decidim/meetings/meetings/_filters_small_view.html.erb +3 -3
  63. data/app/views/decidim/meetings/meetings/_form.html.erb +14 -3
  64. data/app/views/decidim/meetings/meetings/_linked_meetings.html.erb +1 -1
  65. data/app/views/decidim/meetings/meetings/_meetings.html.erb +18 -0
  66. data/app/views/decidim/meetings/meetings/index.html.erb +1 -0
  67. data/app/views/decidim/meetings/meetings/show.html.erb +10 -4
  68. data/config/locales/ar.yml +2 -7
  69. data/config/locales/ca.yml +3 -15
  70. data/config/locales/cs.yml +41 -13
  71. data/config/locales/de.yml +2 -9
  72. data/config/locales/el.yml +2 -7
  73. data/config/locales/en.yml +41 -13
  74. data/config/locales/es-MX.yml +2 -15
  75. data/config/locales/es-PY.yml +2 -15
  76. data/config/locales/es.yml +40 -12
  77. data/config/locales/eu.yml +19 -15
  78. data/config/locales/fi-plain.yml +40 -13
  79. data/config/locales/fi.yml +41 -13
  80. data/config/locales/fr-CA.yml +32 -15
  81. data/config/locales/fr.yml +42 -24
  82. data/config/locales/ga-IE.yml +2 -7
  83. data/config/locales/gl.yml +28 -7
  84. data/config/locales/hu.yml +2 -7
  85. data/config/locales/id-ID.yml +2 -7
  86. data/config/locales/is-IS.yml +0 -7
  87. data/config/locales/it.yml +3 -15
  88. data/config/locales/ja.yml +44 -17
  89. data/config/locales/lb-LU.yml +210 -0
  90. data/config/locales/lb.yml +2 -6
  91. data/config/locales/lv.yml +2 -7
  92. data/config/locales/nl.yml +33 -9
  93. data/config/locales/no.yml +2 -9
  94. data/config/locales/pl.yml +14 -9
  95. data/config/locales/pt-BR.yml +3 -10
  96. data/config/locales/pt.yml +2 -15
  97. data/config/locales/ro-RO.yml +31 -15
  98. data/config/locales/ru.yml +0 -7
  99. data/config/locales/sk.yml +2 -7
  100. data/config/locales/sv.yml +23 -15
  101. data/config/locales/tr-TR.yml +2 -9
  102. data/config/locales/uk.yml +0 -9
  103. data/config/locales/val-ES.yml +1 -0
  104. data/config/locales/zh-CN.yml +2 -9
  105. data/db/migrate/20210519133705_add_comments_availability_columns_to_meetings_table.rb +14 -0
  106. data/db/migrate/20210727085318_add_state_field_to_meeting.rb +7 -0
  107. data/db/migrate/20210903143040_add_iframe_access_level_to_decidim_meetings.rb +7 -0
  108. data/db/migrate/20210922140454_transform_show_embedded_iframe_column.rb +15 -0
  109. data/db/migrate/20210928095036_rename_upcoming_events_content_block_to_upcoming_meetings.rb +13 -0
  110. data/lib/decidim/api/meeting_type.rb +2 -1
  111. data/lib/decidim/meetings/component.rb +13 -5
  112. data/lib/decidim/meetings/directory_engine.rb +3 -3
  113. data/lib/decidim/meetings/engine.rb +4 -1
  114. data/lib/decidim/meetings/meeting_serializer.rb +2 -2
  115. data/lib/decidim/meetings/test/factories.rb +24 -3
  116. data/lib/decidim/meetings/test/notifications_handling.rb +39 -0
  117. data/lib/decidim/meetings/test/translated_event.rb +22 -0
  118. data/lib/decidim/meetings/version.rb +1 -1
  119. data/lib/decidim/meetings.rb +5 -0
  120. metadata +36 -19
@@ -42,10 +42,6 @@ ro:
42
42
  type_of_meeting: Tip
43
43
  errors:
44
44
  models:
45
- meeting:
46
- attributes:
47
- show_embedded_iframe:
48
- not_embeddable: Acest URL nu poate fi încorporat
49
45
  meeting_agenda:
50
46
  attributes:
51
47
  base:
@@ -286,6 +282,9 @@ ro:
286
282
  edit:
287
283
  close: Închide
288
284
  title: Închide ședința
285
+ meeting_copies:
286
+ form:
287
+ select_a_meeting_type: Te rugăm să selectezi un tip de ședință
289
288
  meetings:
290
289
  close:
291
290
  invalid: A apărut o problemă la închiderea acestei întâlniri
@@ -314,7 +313,6 @@ ro:
314
313
  registration_url_help: 'Link: permite participanților să acceseze serviciul extern pe care îl utilizezi pentru înregistrare'
315
314
  select_a_meeting_type: Te rugăm să selectezi un tip de ședință
316
315
  select_a_registration_type: Te rugăm să selectezi un tip de înregistrare
317
- show_embedded_iframe_help: Indiferent dacă iframe este încorporat sau nu în acest URL pentru videoconferință. Doar câteva servicii permit încorporarea (de exemplu, Youtube, Twitch...)
318
316
  index:
319
317
  title: Întâlniri
320
318
  new:
@@ -385,26 +383,33 @@ ro:
385
383
  value_types:
386
384
  organizer_presenter:
387
385
  not_found: 'Organizatorul nu a fost găsit în baza de date (ID: %{id})'
386
+ application_helper:
387
+ filter_category_values:
388
+ all: Toate
389
+ filter_meeting_space_values:
390
+ all: Toate
391
+ filter_scope_values:
392
+ all: Toate
388
393
  calendar_modal:
389
394
  calendar_url: URL Calendar
390
395
  close_window: Închide fereastra
391
396
  export_calendar: Exportă calendarul
392
397
  conference_venues: Locuri ale conferinței
393
398
  content_blocks:
394
- upcoming_events:
395
- name: Evenimente viitoare
396
- upcoming_events: Întâlniri viitoare
397
- view_all_events: Vezi toate
399
+ upcoming_meetings:
400
+ name: Şedinţe viitoare
401
+ upcoming_meetings: Şedinţe viitoare
402
+ view_all_meetings: Vezi toate
398
403
  directory:
399
404
  meetings:
400
405
  index:
401
- all: Toate
402
- date: Data
403
406
  meetings: Întâlniri
404
- past: Trecute
405
- search: Caută
406
407
  space_type: Spaţiu participativ
407
- upcoming: Viitoare
408
+ iframe_access_level:
409
+ all: Toți vizitatorii
410
+ iframe_embed_type:
411
+ embed_in_meeting_page: Incorporează în pagina de şedinţe
412
+ open_in_new_tab: Deschideți în filă nouă
408
413
  last_activity:
409
414
  meeting_updated_at_html: "<span>Întâlnire actualizată la %{link}</span>"
410
415
  new_meeting_at_html: "<span>O nouă ședință la %{link}</span>"
@@ -488,9 +493,12 @@ ro:
488
493
  select_a_category: Te rugăm să selectezi o categorie
489
494
  select_a_meeting_type: Te rugăm să selectezi un tip de ședință
490
495
  select_a_registration_type: Te rugăm să selectezi un tip de înregistrare
491
- show_embedded_iframe_help: Indiferent dacă iframe este încorporat sau nu în acest URL pentru videoconferință. Doar câteva servicii permit încorporarea (de exemplu, Youtube, Twitch...)
492
496
  index:
497
+ click_here: Vezi toate întâlnirile
493
498
  new_meeting: Întâlnire nouă
499
+ see_all: Vezi toate întâlnirile
500
+ see_all_withdrawn: Afișează toate întâlnirile anulate
501
+ text_banner: Vizualizezi lista de întâlniri anulate de autorii lor. %{go_back_link}.
494
502
  meeting_minutes:
495
503
  related_information: Informații asociate
496
504
  meetings:
@@ -509,6 +517,7 @@ ro:
509
517
  close_meeting: Închide ședința
510
518
  contributions: Număr de contribuții
511
519
  date: Data
520
+ edit_close_meeting: Editează raportul întâlnirii
512
521
  edit_meeting: Editează întâlnirea
513
522
  going: Te-ai înregistrat pentru această întâlnire
514
523
  join: Participă la întâlnire
@@ -531,6 +540,9 @@ ro:
531
540
  other: "%{count} sloturi rămase"
532
541
  view: Vizualizare
533
542
  visit_finished: Arată întâlniri deja desfășurate
543
+ withdraw_btn_hint: Poți să anulezi întâlnirea dacă te răzgândești. Întâlnirea nu va fi ștearsă, ci va apărea în lista de întâlniri anulate.
544
+ withdraw_confirmation_html: Sigur dorești să retragi această întâlnire?<br><br><strong>Această acțiune nu poate fi anulată!</strong>
545
+ withdraw_meeting: Anulează întâlnirea
534
546
  update:
535
547
  invalid: A apărut o eroare la actualizarea ședinței.
536
548
  success: Ai actualizat întâlnirea cu succes.
@@ -609,8 +621,12 @@ ro:
609
621
  types:
610
622
  private_meeting: Întâlnire privată
611
623
  transparent: Transparent
624
+ withdraw: Retrasă
612
625
  versions:
613
626
  back_to_resource: Intră din nou în întâlnire
627
+ withdraw:
628
+ error: S-a produs o eroare la retragerea întâlnirii
629
+ success: Întâlnirea a fost anulată
614
630
  metrics:
615
631
  meetings:
616
632
  description: Numărul de întâlniri create
@@ -289,17 +289,10 @@ ru:
289
289
  calendar_url: Ссылка на календарь
290
290
  close_window: Закрыть окно
291
291
  export_calendar: Экспорт календаря
292
- content_blocks:
293
- upcoming_events:
294
- name: Предстоящие события
295
- upcoming_events: Предстоящие встречи
296
292
  directory:
297
293
  meetings:
298
294
  index:
299
- all: Все
300
- date: Дата
301
295
  meetings: Встречи
302
- search: Поиск
303
296
  last_activity:
304
297
  new_meeting_at_html: "<span>Новая встреча в %{link}</span>"
305
298
  mailer:
@@ -302,17 +302,12 @@ sk:
302
302
  export_calendar: Exportovať kalendár
303
303
  conference_venues: Konferenčné priestory
304
304
  content_blocks:
305
- upcoming_events:
306
- name: Pripravované akcie
307
- upcoming_events: Nadchádzajúce schôdzky
308
- view_all_events: Zobraziť všetko
305
+ upcoming_meetings:
306
+ view_all_meetings: Zobraziť všetko
309
307
  directory:
310
308
  meetings:
311
309
  index:
312
- all: Všetko
313
- date: dátum
314
310
  meetings: Stretnutie
315
- search: Vyhľadávanie
316
311
  space_type: Zúčastňujú priestor
317
312
  last_activity:
318
313
  new_meeting_at_html: "<span> Nové stretnutie v %{link} </ span>"
@@ -42,10 +42,6 @@ sv:
42
42
  type_of_meeting: Typ
43
43
  errors:
44
44
  models:
45
- meeting:
46
- attributes:
47
- show_embedded_iframe:
48
- not_embeddable: URL:en kan inte integreras
49
45
  meeting_agenda:
50
46
  attributes:
51
47
  base:
@@ -309,7 +305,6 @@ sv:
309
305
  registration_url_help: 'Länk: tillåt deltagare att registrera sig på en extern tjänst'
310
306
  select_a_meeting_type: Välj mötestyp
311
307
  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...)
313
308
  index:
314
309
  title: Möten
315
310
  new:
@@ -379,26 +374,28 @@ sv:
379
374
  value_types:
380
375
  organizer_presenter:
381
376
  not_found: 'Arrangören hittades inte i databasen (ID: %{id})'
377
+ application_helper:
378
+ filter_category_values:
379
+ all: Alla
380
+ filter_meeting_space_values:
381
+ all: Alla
382
+ filter_scope_values:
383
+ all: Alla
382
384
  calendar_modal:
383
385
  calendar_url: Kalender-URL
384
386
  close_window: Stäng fönster
385
387
  export_calendar: Exportera kalender
386
388
  conference_venues: Konferenslokaler
387
389
  content_blocks:
388
- upcoming_events:
389
- name: Kommande händelser
390
- upcoming_events: Kommande möten
391
- view_all_events: Visa alla
390
+ upcoming_meetings:
391
+ name: Kommande möten
392
+ upcoming_meetings: Kommande möten
393
+ view_all_meetings: Visa alla
392
394
  directory:
393
395
  meetings:
394
396
  index:
395
- all: Allt
396
- date: Datum
397
397
  meetings: Möten
398
- past: Tidigare
399
- search: Sök
400
398
  space_type: Deltagarutrymme
401
- upcoming: Kommande
402
399
  last_activity:
403
400
  meeting_updated_at_html: "<span>Mötet uppdaterades på %{link}</span>"
404
401
  new_meeting_at_html: "<span>Nytt möte på %{link}</span>"
@@ -481,9 +478,12 @@ sv:
481
478
  select_a_category: Välj en kategori
482
479
  select_a_meeting_type: Välj mötestyp
483
480
  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...)
485
481
  index:
482
+ click_here: Se alla möten
486
483
  new_meeting: Nytt möte
484
+ see_all: Se alla möten
485
+ see_all_withdrawn: Se alla tillbakadragna möten
486
+ text_banner: Du tittar på listan över möten som dragits tillbaka av sina författare. %{go_back_link}.
487
487
  meeting_minutes:
488
488
  related_information: Relaterad information
489
489
  meetings:
@@ -502,6 +502,7 @@ sv:
502
502
  close_meeting: Avsluta möte
503
503
  contributions: Antal bidrag
504
504
  date: Datum
505
+ edit_close_meeting: Redigera mötesrapport
505
506
  edit_meeting: Redigera möte
506
507
  going: Du har anmält dig för detta möte
507
508
  join: Gå med i mötet
@@ -523,6 +524,9 @@ sv:
523
524
  other: "%{count} platser kvar"
524
525
  view: Visa
525
526
  visit_finished: Visa tidigare möten
527
+ 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.
528
+ 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>
529
+ withdraw_meeting: Dra tillbaka möte
526
530
  update:
527
531
  invalid: Det gick inte att uppdatera mötet.
528
532
  success: Du har uppdaterat mötet.
@@ -600,8 +604,12 @@ sv:
600
604
  types:
601
605
  private_meeting: Privat möte
602
606
  transparent: Transparent
607
+ withdraw: Tillbakadragna
603
608
  versions:
604
609
  back_to_resource: Gå tillbaka till mötet
610
+ withdraw:
611
+ error: Det gick inte att dra tillbaka mötet
612
+ success: Mötet har dragits tillbaka
605
613
  metrics:
606
614
  meetings:
607
615
  description: Antal skapade möten
@@ -326,20 +326,13 @@ tr:
326
326
  export_calendar: Takvimi dışa aktar
327
327
  conference_venues: Konferans Mekanları
328
328
  content_blocks:
329
- upcoming_events:
330
- name: Yaklaşan Etkinlikler
331
- upcoming_events: Yaklaşan toplantılar
332
- view_all_events: Hepsini gör
329
+ upcoming_meetings:
330
+ view_all_meetings: Hepsini gör
333
331
  directory:
334
332
  meetings:
335
333
  index:
336
- all: Tümü
337
- date: Tarih
338
334
  meetings: Toplantılar
339
- past: Geçmiş
340
- search: Arama
341
335
  space_type: Katılımcı alan
342
- upcoming: Yaklaşan
343
336
  last_activity:
344
337
  new_meeting_at_html: "<span>%{link} </span> adresinde yeni toplantı"
345
338
  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:
@@ -304,20 +304,13 @@ zh-CN:
304
304
  export_calendar: 导出日历
305
305
  conference_venues: 会议地点
306
306
  content_blocks:
307
- upcoming_events:
308
- name: 即将到来的事件
309
- upcoming_events: 即将举行的会议
310
- view_all_events: 查看全部
307
+ upcoming_meetings:
308
+ view_all_meetings: 查看全部
311
309
  directory:
312
310
  meetings:
313
311
  index:
314
- all: 所有的
315
- date: 日期
316
312
  meetings: 会议
317
- past: 过去的
318
- search: 搜索
319
313
  space_type: 参与空间
320
- upcoming: 即将到来的
321
314
  last_activity:
322
315
  new_meeting_at_html: "<span>在 %{link}的新会议</span>"
323
316
  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
@@ -157,14 +157,22 @@ Decidim.register_component(:meetings) do |component|
157
157
  _hybrid_meeting = Decidim.traceability.create!(
158
158
  Decidim::Meetings::Meeting,
159
159
  admin_user,
160
- 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
+ ),
161
165
  visibility: "all"
162
166
  )
163
167
 
164
168
  _online_meeting = Decidim.traceability.create!(
165
169
  Decidim::Meetings::Meeting,
166
170
  admin_user,
167
- 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
+ ),
168
176
  visibility: "all"
169
177
  )
170
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,24 @@ 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 }
140
161
  end
141
162
  end
142
163
 
@@ -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.2"
7
+ "0.26.0.rc1"
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