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.
- checksums.yaml +4 -4
- data/app/cells/decidim/meetings/content_blocks/highlighted_meetings/heading.erb +1 -1
- data/app/cells/decidim/meetings/content_blocks/highlighted_meetings_cell.rb +7 -1
- data/app/cells/decidim/meetings/content_blocks/{upcoming_events → upcoming_meetings}/show.erb +6 -6
- data/app/cells/decidim/meetings/content_blocks/{upcoming_events_cell.rb → upcoming_meetings_cell.rb} +12 -10
- data/app/cells/decidim/meetings/highlighted_meetings_for_component/show.erb +5 -4
- data/app/cells/decidim/meetings/highlighted_meetings_for_component_cell.rb +13 -1
- data/app/cells/decidim/meetings/join_meeting_button_cell.rb +1 -1
- data/app/cells/decidim/meetings/meeting_list_item_cell.rb +10 -0
- data/app/cells/decidim/meetings/meeting_m_cell.rb +48 -0
- data/app/cells/decidim/meetings/meeting_s_cell.rb +22 -0
- data/app/cells/decidim/meetings/meetings_map_cell.rb +6 -0
- data/app/cells/decidim/meetings/online_meeting_cell.rb +23 -8
- data/app/cells/decidim/meetings/online_meeting_link/show.erb +2 -2
- data/app/cells/decidim/meetings/online_meeting_link_cell.rb +1 -5
- data/app/cells/decidim/meetings/public_participants_list_cell.rb +1 -0
- data/app/cells/decidim/meetings/question_responses_cell.rb +1 -1
- data/app/commands/decidim/meetings/admin/create_meeting.rb +11 -1
- data/app/commands/decidim/meetings/admin/publish_meeting.rb +3 -1
- data/app/commands/decidim/meetings/admin/update_meeting.rb +8 -2
- data/app/commands/decidim/meetings/create_meeting.rb +14 -2
- data/app/commands/decidim/meetings/update_meeting.rb +5 -2
- data/app/commands/decidim/meetings/withdraw_meeting.rb +39 -0
- data/app/controllers/concerns/decidim/meetings/filterable.rb +33 -0
- data/app/controllers/decidim/meetings/directory/application_controller.rb +16 -0
- data/app/controllers/decidim/meetings/directory/meetings_controller.rb +31 -20
- data/app/controllers/decidim/meetings/live_events_controller.rb +7 -1
- data/app/controllers/decidim/meetings/meetings_controller.rb +19 -17
- data/app/events/decidim/meetings/close_meeting_event.rb +1 -3
- data/app/events/decidim/meetings/create_meeting_event.rb +2 -4
- data/app/events/decidim/meetings/meeting_event.rb +37 -0
- data/app/events/decidim/meetings/meeting_registrations_enabled_event.rb +1 -3
- data/app/events/decidim/meetings/meeting_registrations_over_percentage_event.rb +2 -4
- data/app/events/decidim/meetings/registration_code_validated_event.rb +2 -4
- data/app/events/decidim/meetings/upcoming_meeting_event.rb +1 -3
- data/app/events/decidim/meetings/update_meeting_event.rb +1 -3
- data/app/forms/decidim/meetings/admin/close_meeting_form.rb +1 -1
- data/app/forms/decidim/meetings/admin/meeting_copy_form.rb +4 -13
- data/app/forms/decidim/meetings/admin/meeting_form.rb +34 -46
- data/app/forms/decidim/meetings/base_meeting_form.rb +59 -0
- data/app/forms/decidim/meetings/close_meeting_form.rb +6 -6
- data/app/forms/decidim/meetings/meeting_form.rb +30 -46
- data/app/helpers/decidim/meetings/application_helper.rb +13 -1
- data/app/helpers/decidim/meetings/directory/application_helper.rb +150 -0
- data/app/helpers/decidim/meetings/meeting_cells_helper.rb +4 -1
- data/app/helpers/decidim/meetings/meetings_helper.rb +3 -0
- data/app/models/decidim/meetings/meeting.rb +54 -2
- data/app/packs/src/decidim/meetings/admin/meetings_form.js +27 -11
- data/app/packs/src/decidim/meetings/meetings_form.js +19 -0
- data/app/packs/src/decidim/meetings/meetings_polls.js +31 -26
- data/app/permissions/decidim/meetings/permissions.rb +9 -1
- data/app/presenters/decidim/meetings/meeting_edition_presenter.rb +14 -0
- data/app/presenters/decidim/meetings/meeting_presenter.rb +13 -6
- data/app/services/decidim/meetings/directory/meeting_search.rb +53 -0
- data/app/services/decidim/meetings/meeting_iframe_embedder.rb +2 -2
- data/app/services/decidim/meetings/meeting_search.rb +15 -2
- data/app/views/decidim/meetings/admin/meeting_copies/_form.html.erb +16 -1
- data/app/views/decidim/meetings/admin/meeting_copies/new.html.erb +1 -1
- data/app/views/decidim/meetings/admin/meetings/_form.html.erb +15 -3
- data/app/views/decidim/meetings/directory/meetings/_filters.html.erb +34 -0
- data/app/views/decidim/meetings/directory/meetings/index.html.erb +1 -18
- data/app/views/decidim/meetings/meetings/_filters.html.erb +2 -0
- data/app/views/decidim/meetings/meetings/_filters_small_view.html.erb +3 -3
- data/app/views/decidim/meetings/meetings/_form.html.erb +14 -3
- data/app/views/decidim/meetings/meetings/_linked_meetings.html.erb +1 -1
- data/app/views/decidim/meetings/meetings/_meetings.html.erb +18 -0
- data/app/views/decidim/meetings/meetings/index.html.erb +1 -0
- data/app/views/decidim/meetings/meetings/show.html.erb +12 -13
- data/config/locales/ar.yml +2 -7
- data/config/locales/ca.yml +45 -17
- data/config/locales/cs.yml +41 -13
- data/config/locales/de.yml +57 -9
- data/config/locales/el.yml +2 -7
- data/config/locales/en.yml +41 -13
- data/config/locales/es-MX.yml +41 -13
- data/config/locales/es-PY.yml +42 -14
- data/config/locales/es.yml +42 -14
- data/config/locales/eu.yml +20 -16
- data/config/locales/fi-plain.yml +41 -13
- data/config/locales/fi.yml +41 -13
- data/config/locales/fr-CA.yml +48 -13
- data/config/locales/fr.yml +69 -34
- data/config/locales/ga-IE.yml +2 -7
- data/config/locales/gl.yml +33 -7
- data/config/locales/hu.yml +32 -7
- data/config/locales/id-ID.yml +2 -7
- data/config/locales/is-IS.yml +0 -7
- data/config/locales/it.yml +4 -16
- data/config/locales/ja.yml +47 -19
- data/config/locales/lb-LU.yml +210 -0
- data/config/locales/lb.yml +2 -12
- data/config/locales/lv.yml +2 -7
- data/config/locales/nl.yml +35 -11
- data/config/locales/no.yml +154 -9
- data/config/locales/pl.yml +25 -12
- data/config/locales/pt-BR.yml +13 -10
- data/config/locales/pt.yml +2 -15
- data/config/locales/ro-RO.yml +35 -17
- data/config/locales/ru.yml +0 -7
- data/config/locales/sk.yml +2 -7
- data/config/locales/sv.yml +41 -13
- data/config/locales/tr-TR.yml +13 -10
- data/config/locales/uk.yml +0 -9
- data/config/locales/val-ES.yml +1 -0
- data/config/locales/zh-CN.yml +8 -9
- data/db/migrate/20210519133705_add_comments_availability_columns_to_meetings_table.rb +14 -0
- data/db/migrate/20210727085318_add_state_field_to_meeting.rb +7 -0
- data/db/migrate/20210903143040_add_iframe_access_level_to_decidim_meetings.rb +7 -0
- data/db/migrate/20210922140454_transform_show_embedded_iframe_column.rb +15 -0
- data/db/migrate/20210928095036_rename_upcoming_events_content_block_to_upcoming_meetings.rb +13 -0
- data/lib/decidim/api/meeting_type.rb +2 -1
- data/lib/decidim/meetings/component.rb +15 -6
- data/lib/decidim/meetings/directory_engine.rb +3 -3
- data/lib/decidim/meetings/engine.rb +4 -1
- data/lib/decidim/meetings/meeting_serializer.rb +2 -2
- data/lib/decidim/meetings/test/factories.rb +30 -3
- data/lib/decidim/meetings/test/notifications_handling.rb +39 -0
- data/lib/decidim/meetings/test/translated_event.rb +22 -0
- data/lib/decidim/meetings/version.rb +1 -1
- data/lib/decidim/meetings.rb +5 -0
- metadata +37 -20
data/config/locales/sv.yml
CHANGED
@@ -44,8 +44,8 @@ sv:
|
|
44
44
|
models:
|
45
45
|
meeting:
|
46
46
|
attributes:
|
47
|
-
|
48
|
-
not_embeddable: URL
|
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
|
-
|
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
|
-
|
389
|
-
name: Kommande
|
390
|
-
|
391
|
-
|
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
|
-
|
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
|
-
|
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
|
data/config/locales/tr-TR.yml
CHANGED
@@ -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
|
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
|
-
|
330
|
-
|
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:
|
data/config/locales/uk.yml
CHANGED
@@ -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:
|
data/config/locales/zh-CN.yml
CHANGED
@@ -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
|
-
|
308
|
-
|
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,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 :
|
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:
|
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(
|
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(
|
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, :
|
26
|
-
content_block.cell = "decidim/meetings/content_blocks/
|
27
|
-
content_block.public_name_key = "decidim.meetings.content_blocks.
|
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.
|
45
|
-
followers: meeting.
|
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
|
-
|
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 :
|
139
|
-
|
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
|
data/lib/decidim/meetings.rb
CHANGED
@@ -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
|