decidim-meetings 0.27.10 → 0.28.0.rc4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/meetings/attending_organizations_list_cell.rb +32 -0
  3. data/app/cells/decidim/meetings/cancel_registration_meeting_button/cancelation_modal.erb +21 -0
  4. data/app/cells/decidim/meetings/cancel_registration_meeting_button/show.erb +10 -13
  5. data/app/cells/decidim/meetings/cancel_registration_meeting_button_cell.rb +2 -2
  6. data/app/cells/decidim/meetings/content_blocks/highlighted_meetings_cell.rb +8 -18
  7. data/app/cells/decidim/meetings/dates_and_map/show.erb +25 -0
  8. data/app/cells/decidim/meetings/dates_and_map/static_map.erb +1 -0
  9. data/app/cells/decidim/meetings/dates_and_map_cell.rb +35 -0
  10. data/app/cells/decidim/meetings/highlighted_meetings_for_component/show.erb +32 -30
  11. data/app/cells/decidim/meetings/highlighted_meetings_for_component_cell.rb +76 -16
  12. data/app/cells/decidim/meetings/join_meeting_button/registration_modal.erb +25 -0
  13. data/app/cells/decidim/meetings/join_meeting_button/remaining_slots.erb +4 -0
  14. data/app/cells/decidim/meetings/join_meeting_button/show.erb +6 -4
  15. data/app/cells/decidim/meetings/join_meeting_button_cell.rb +3 -7
  16. data/app/cells/decidim/meetings/meeting_activity_cell.rb +1 -12
  17. data/app/cells/decidim/meetings/meeting_card_metadata_cell.rb +64 -0
  18. data/app/cells/decidim/meetings/meeting_cell.rb +2 -6
  19. data/app/cells/decidim/meetings/meeting_l/image.erb +5 -0
  20. data/app/cells/decidim/meetings/meeting_l_cell.rb +33 -0
  21. data/app/cells/decidim/meetings/meeting_month/show.erb +33 -0
  22. data/app/cells/decidim/meetings/meeting_month_cell.rb +72 -0
  23. data/app/cells/decidim/meetings/meeting_s_cell.rb +5 -37
  24. data/app/cells/decidim/meetings/meetings_map/show.erb +9 -24
  25. data/app/cells/decidim/meetings/meetings_map_cell.rb +1 -1
  26. data/app/cells/decidim/meetings/online_meeting_cell.rb +1 -0
  27. data/app/cells/decidim/meetings/online_meeting_link/show.erb +18 -41
  28. data/app/cells/decidim/meetings/public_participants_list/show.erb +4 -15
  29. data/app/commands/decidim/meetings/admin/copy_meeting.rb +1 -1
  30. data/app/commands/decidim/meetings/admin/create_meeting.rb +1 -1
  31. data/app/commands/decidim/meetings/admin/invite_user_to_join_meeting.rb +5 -5
  32. data/app/commands/decidim/meetings/admin/publish_meeting.rb +1 -1
  33. data/app/commands/decidim/meetings/admin/unpublish_meeting.rb +1 -1
  34. data/app/commands/decidim/meetings/create_meeting.rb +14 -3
  35. data/app/commands/decidim/meetings/decline_invitation.rb +1 -1
  36. data/app/commands/decidim/meetings/join_meeting.rb +5 -5
  37. data/app/commands/decidim/meetings/update_meeting.rb +13 -3
  38. data/app/controllers/concerns/decidim/meetings/component_filterable.rb +4 -4
  39. data/app/controllers/decidim/meetings/admin/agenda_controller.rb +6 -6
  40. data/app/controllers/decidim/meetings/admin/invites_controller.rb +3 -3
  41. data/app/controllers/decidim/meetings/admin/meeting_closes_controller.rb +2 -4
  42. data/app/controllers/decidim/meetings/admin/meeting_copies_controller.rb +3 -3
  43. data/app/controllers/decidim/meetings/admin/meetings_controller.rb +7 -7
  44. data/app/controllers/decidim/meetings/admin/meetings_poll_controller.rb +4 -4
  45. data/app/controllers/decidim/meetings/admin/registrations_controller.rb +6 -6
  46. data/app/controllers/decidim/meetings/application_controller.rb +11 -0
  47. data/app/controllers/decidim/meetings/calendars_controller.rb +0 -1
  48. data/app/controllers/decidim/meetings/directory/application_controller.rb +12 -0
  49. data/app/controllers/decidim/meetings/directory/meetings_controller.rb +5 -30
  50. data/app/controllers/decidim/meetings/live_events_controller.rb +1 -0
  51. data/app/controllers/decidim/meetings/meeting_closes_controller.rb +2 -3
  52. data/app/controllers/decidim/meetings/meetings_controller.rb +75 -7
  53. data/app/controllers/decidim/meetings/polls/answers_controller.rb +2 -2
  54. data/app/controllers/decidim/meetings/polls/questions_controller.rb +1 -1
  55. data/app/controllers/decidim/meetings/registrations_controller.rb +5 -5
  56. data/app/events/decidim/meetings/close_meeting_event.rb +1 -1
  57. data/app/events/decidim/meetings/meeting_event.rb +1 -1
  58. data/app/events/decidim/meetings/meeting_registration_notification_event.rb +3 -3
  59. data/app/events/decidim/meetings/meeting_registrations_enabled_event.rb +1 -1
  60. data/app/events/decidim/meetings/meeting_registrations_over_percentage_event.rb +1 -1
  61. data/app/events/decidim/meetings/registration_code_validated_event.rb +1 -1
  62. data/app/forms/decidim/meetings/admin/meeting_form.rb +5 -1
  63. data/app/forms/decidim/meetings/admin/meeting_registrations_form.rb +2 -2
  64. data/app/forms/decidim/meetings/admin/validate_registration_code_form.rb +1 -1
  65. data/app/forms/decidim/meetings/base_meeting_form.rb +1 -1
  66. data/app/forms/decidim/meetings/meeting_form.rb +3 -3
  67. data/app/helpers/decidim/meetings/admin/application_helper.rb +1 -0
  68. data/app/helpers/decidim/meetings/application_helper.rb +18 -25
  69. data/app/helpers/decidim/meetings/directory/application_helper.rb +11 -59
  70. data/app/helpers/decidim/meetings/map_helper.rb +2 -9
  71. data/app/helpers/decidim/meetings/meetings_helper.rb +6 -5
  72. data/app/jobs/decidim/meetings/hide_all_created_by_author_job.rb +13 -0
  73. data/app/mailers/decidim/meetings/admin/invite_join_meeting_mailer.rb +1 -1
  74. data/app/mailers/decidim/meetings/registration_mailer.rb +1 -1
  75. data/app/models/decidim/meetings/meeting.rb +11 -32
  76. data/app/models/decidim/meetings/question.rb +1 -1
  77. data/app/packs/entrypoints/decidim_meetings.js +3 -0
  78. data/app/packs/images/decidim/gamification/badges/decidim_gamification_badges_attended_meetings.svg +42 -1
  79. data/app/packs/src/decidim/meetings/admin/agendas.js +3 -4
  80. data/app/packs/src/decidim/meetings/admin/registrations_form.js +12 -4
  81. data/app/packs/src/decidim/meetings/meetings_form.js +1 -1
  82. data/app/packs/src/decidim/meetings/poll.component.js +1 -28
  83. data/app/packs/stylesheets/decidim/meetings/_calendar.scss +47 -0
  84. data/app/packs/stylesheets/decidim/meetings/_item.scss +177 -0
  85. data/app/packs/stylesheets/decidim/meetings/_list.scss +58 -0
  86. data/app/packs/stylesheets/decidim/meetings/_live_event.scss +128 -0
  87. data/app/packs/stylesheets/decidim/meetings/meetings.scss +4 -0
  88. data/app/permissions/decidim/meetings/permissions.rb +15 -12
  89. data/app/presenters/decidim/meetings/admin_log/invite_presenter.rb +2 -2
  90. data/app/presenters/decidim/meetings/admin_log/meeting_presenter.rb +6 -2
  91. data/app/presenters/decidim/meetings/admin_log/questionnaire_presenter.rb +2 -2
  92. data/app/presenters/decidim/meetings/admin_log/value_types/meeting_title_description_presenter.rb +1 -1
  93. data/app/presenters/decidim/meetings/log/resource_presenter.rb +18 -0
  94. data/app/presenters/decidim/meetings/meeting_presenter.rb +8 -2
  95. data/app/services/decidim/meetings/calendar/component_calendar.rb +1 -1
  96. data/app/services/decidim/meetings/close_meeting_reminder_generator.rb +7 -13
  97. data/app/services/decidim/meetings/meeting_iframe_embedder.rb +1 -1
  98. data/app/views/decidim/meetings/_calendar_modal.html.erb +19 -21
  99. data/app/views/decidim/meetings/admin/agenda/_agenda_item.html.erb +12 -12
  100. data/app/views/decidim/meetings/admin/agenda/_agenda_item_child.html.erb +8 -8
  101. data/app/views/decidim/meetings/admin/agenda/_agenda_item_child_template.html.erb +1 -1
  102. data/app/views/decidim/meetings/admin/agenda/_agenda_item_fields.html.erb +3 -3
  103. data/app/views/decidim/meetings/admin/agenda/_form.html.erb +54 -50
  104. data/app/views/decidim/meetings/admin/agenda/edit.html.erb +18 -6
  105. data/app/views/decidim/meetings/admin/agenda/new.html.erb +17 -5
  106. data/app/views/decidim/meetings/admin/invite_join_meeting_mailer/invite.html.erb +11 -2
  107. data/app/views/decidim/meetings/admin/invites/_form.html.erb +38 -28
  108. data/app/views/decidim/meetings/admin/invites/index.html.erb +77 -81
  109. data/app/views/decidim/meetings/admin/meeting_closes/_form.html.erb +26 -28
  110. data/app/views/decidim/meetings/admin/meeting_closes/edit.html.erb +17 -5
  111. data/app/views/decidim/meetings/admin/meeting_copies/new.html.erb +17 -6
  112. data/app/views/decidim/meetings/admin/meetings/_form.html.erb +76 -83
  113. data/app/views/decidim/meetings/admin/meetings/_service.html.erb +14 -10
  114. data/app/views/decidim/meetings/admin/meetings/_services.html.erb +9 -5
  115. data/app/views/decidim/meetings/admin/meetings/edit.html.erb +17 -7
  116. data/app/views/decidim/meetings/admin/meetings/index.html.erb +133 -129
  117. data/app/views/decidim/meetings/admin/meetings/new.html.erb +16 -6
  118. data/app/views/decidim/meetings/admin/poll/_answer_option.html.erb +1 -1
  119. data/app/views/decidim/meetings/admin/poll/_answer_option_template.html.erb +1 -1
  120. data/app/views/decidim/meetings/admin/poll/_form.html.erb +17 -32
  121. data/app/views/decidim/meetings/admin/poll/_question.html.erb +81 -75
  122. data/app/views/decidim/meetings/admin/poll/edit.html.erb +28 -8
  123. data/app/views/decidim/meetings/admin/registrations/_form.html.erb +32 -55
  124. data/app/views/decidim/meetings/admin/registrations/edit.html.erb +59 -26
  125. data/app/views/decidim/meetings/directory/meetings/index.html.erb +15 -20
  126. data/app/views/decidim/meetings/directory/meetings/index.js.erb +1 -23
  127. data/app/views/decidim/meetings/layouts/_aside_block.html.erb +8 -0
  128. data/app/views/decidim/meetings/layouts/live_event.html.erb +20 -19
  129. data/app/views/decidim/meetings/live_events/show.html.erb +4 -5
  130. data/app/views/decidim/meetings/meeting_closes/_form.html.erb +3 -10
  131. data/app/views/decidim/meetings/meeting_closes/edit.html.erb +17 -21
  132. data/app/views/decidim/meetings/meetings/_actions.html.erb +6 -0
  133. data/app/views/decidim/meetings/meetings/_add_to_calendar_modal.html.erb +17 -0
  134. data/app/views/decidim/meetings/meetings/_form.html.erb +26 -34
  135. data/app/views/decidim/meetings/meetings/_linked_meetings.html.erb +3 -22
  136. data/app/views/decidim/meetings/meetings/_meeting.html.erb +74 -0
  137. data/app/views/decidim/meetings/meetings/_meeting_agenda.html.erb +28 -26
  138. data/app/views/decidim/meetings/meetings/_meeting_aside.html.erb +98 -0
  139. data/app/views/decidim/meetings/meetings/_meeting_minutes.html.erb +23 -36
  140. data/app/views/decidim/meetings/meetings/edit.html.erb +17 -21
  141. data/app/views/decidim/meetings/meetings/index.html.erb +15 -33
  142. data/app/views/decidim/meetings/meetings/index.js.erb +1 -23
  143. data/app/views/decidim/meetings/meetings/new.html.erb +17 -21
  144. data/app/views/decidim/meetings/meetings/show.html.erb +8 -167
  145. data/app/views/decidim/meetings/polls/answers/_multiple_option.html.erb +9 -13
  146. data/app/views/decidim/meetings/polls/answers/_single_option.html.erb +4 -4
  147. data/app/views/decidim/meetings/polls/answers/create.js.erb +1 -1
  148. data/app/views/decidim/meetings/polls/questions/_index.html.erb +1 -1
  149. data/app/views/decidim/meetings/polls/questions/_index_admin.html.erb +5 -5
  150. data/app/views/decidim/meetings/polls/questions/_published_question.html.erb +9 -11
  151. data/app/views/decidim/meetings/polls/questions/_question.html.erb +3 -3
  152. data/app/views/decidim/meetings/polls/questions/index_admin.js.erb +1 -1
  153. data/app/views/decidim/meetings/shared/_filters.html.erb +20 -0
  154. data/app/views/decidim/meetings/shared/_index.html.erb +24 -0
  155. data/app/views/decidim/meetings/shared/_index.js.erb +16 -0
  156. data/app/views/decidim/meetings/shared/_meetings.html.erb +33 -0
  157. data/app/views/decidim/meetings/shared/_meetings_aside.html.erb +18 -0
  158. data/app/views/decidim/meetings/versions/show.html.erb +14 -4
  159. data/app/views/decidim/participatory_spaces/_conference_venues.html.erb +13 -15
  160. data/config/assets.rb +0 -2
  161. data/config/locales/ar.yml +6 -94
  162. data/config/locales/bg.yml +0 -673
  163. data/config/locales/ca.yml +52 -75
  164. data/config/locales/cs.yml +48 -71
  165. data/config/locales/de.yml +53 -76
  166. data/config/locales/el.yml +48 -51
  167. data/config/locales/en.yml +51 -74
  168. data/config/locales/es-MX.yml +50 -73
  169. data/config/locales/es-PY.yml +48 -71
  170. data/config/locales/es.yml +53 -76
  171. data/config/locales/eu.yml +53 -76
  172. data/config/locales/fi-plain.yml +46 -69
  173. data/config/locales/fi.yml +44 -67
  174. data/config/locales/fr-CA.yml +43 -69
  175. data/config/locales/fr.yml +48 -71
  176. data/config/locales/ga-IE.yml +2 -16
  177. data/config/locales/gl.yml +5 -63
  178. data/config/locales/hu.yml +6 -92
  179. data/config/locales/id-ID.yml +4 -60
  180. data/config/locales/is-IS.yml +1 -22
  181. data/config/locales/it.yml +6 -86
  182. data/config/locales/ja.yml +45 -74
  183. data/config/locales/lb.yml +6 -67
  184. data/config/locales/lt.yml +42 -65
  185. data/config/locales/lv.yml +4 -61
  186. data/config/locales/nl.yml +4 -92
  187. data/config/locales/no.yml +4 -80
  188. data/config/locales/pl.yml +2 -199
  189. data/config/locales/pt-BR.yml +4 -200
  190. data/config/locales/pt.yml +5 -85
  191. data/config/locales/ro-RO.yml +11 -81
  192. data/config/locales/ru.yml +5 -60
  193. data/config/locales/sk.yml +4 -61
  194. data/config/locales/sl.yml +0 -3
  195. data/config/locales/sr-CS.yml +0 -6
  196. data/config/locales/sv.yml +14 -94
  197. data/config/locales/tr-TR.yml +5 -78
  198. data/config/locales/uk.yml +5 -53
  199. data/config/locales/zh-CN.yml +3 -70
  200. data/config/locales/zh-TW.yml +24 -51
  201. data/db/migrate/20201016065302_fix_meetings_registration_terms.rb +1 -1
  202. data/db/migrate/20230427105701_change_types_and_registration_types_on_meetings.rb +49 -0
  203. data/lib/decidim/meetings/admin_engine.rb +2 -2
  204. data/lib/decidim/meetings/component.rb +4 -216
  205. data/lib/decidim/meetings/content_blocks/registry_manager.rb +17 -0
  206. data/lib/decidim/meetings/directory_engine.rb +4 -6
  207. data/lib/decidim/meetings/engine.rb +62 -27
  208. data/lib/decidim/meetings/meeting_serializer.rb +3 -3
  209. data/lib/decidim/meetings/seeds.rb +188 -0
  210. data/lib/decidim/meetings/test/factories.rb +124 -54
  211. data/lib/decidim/meetings/test/notifications_handling.rb +3 -3
  212. data/lib/decidim/meetings/test/translated_event.rb +1 -1
  213. data/lib/decidim/meetings/version.rb +1 -1
  214. metadata +58 -58
  215. data/app/cells/decidim/meetings/content_blocks/highlighted_meetings/elements.erb +0 -16
  216. data/app/cells/decidim/meetings/content_blocks/highlighted_meetings/heading.erb +0 -1
  217. data/app/cells/decidim/meetings/content_blocks/upcoming_meetings/show.erb +0 -26
  218. data/app/cells/decidim/meetings/content_blocks/upcoming_meetings_cell.rb +0 -63
  219. data/app/cells/decidim/meetings/join_meeting_button/registration_confirm.erb +0 -31
  220. data/app/cells/decidim/meetings/meeting_highlighted_list_item/show.erb +0 -21
  221. data/app/cells/decidim/meetings/meeting_highlighted_list_item_cell.rb +0 -10
  222. data/app/cells/decidim/meetings/meeting_list_item/show.erb +0 -14
  223. data/app/cells/decidim/meetings/meeting_list_item_cell.rb +0 -44
  224. data/app/cells/decidim/meetings/meeting_m/address.erb +0 -5
  225. data/app/cells/decidim/meetings/meeting_m/data.erb +0 -2
  226. data/app/cells/decidim/meetings/meeting_m/date.erb +0 -8
  227. data/app/cells/decidim/meetings/meeting_m/footer.erb +0 -9
  228. data/app/cells/decidim/meetings/meeting_m/multiple_dates.erb +0 -17
  229. data/app/cells/decidim/meetings/meeting_m/single_date.erb +0 -9
  230. data/app/cells/decidim/meetings/meeting_m/tags.erb +0 -1
  231. data/app/cells/decidim/meetings/meeting_m_cell.rb +0 -121
  232. data/app/cells/decidim/meetings/meeting_s/show.erb +0 -27
  233. data/app/controllers/concerns/decidim/meetings/filterable.rb +0 -27
  234. data/app/controllers/decidim/meetings/widgets_controller.rb +0 -30
  235. data/app/packs/stylesheets/decidim/meetings/_header.scss +0 -52
  236. data/app/packs/stylesheets/decidim/meetings/_main.scss +0 -178
  237. data/app/packs/stylesheets/decidim/meetings/_meetings.scss +0 -2
  238. data/app/queries/decidim/meetings/admin/invites.rb +0 -60
  239. data/app/views/decidim/meetings/admin/meeting_closes/proposals_picker.html.erb +0 -1
  240. data/app/views/decidim/meetings/directory/meetings/_filters.html.erb +0 -34
  241. data/app/views/decidim/meetings/directory/meetings/_meetings.html.erb +0 -26
  242. data/app/views/decidim/meetings/meeting_closes/proposals_picker.html.erb +0 -1
  243. data/app/views/decidim/meetings/meetings/_calendar_modal.html.erb +0 -26
  244. data/app/views/decidim/meetings/meetings/_filters.html.erb +0 -40
  245. data/app/views/decidim/meetings/meetings/_filters_small_view.html.erb +0 -18
  246. data/app/views/decidim/meetings/meetings/_meetings.html.erb +0 -48
  247. data/app/views/decidim/meetings/versions/index.html.erb +0 -8
  248. data/app/views/decidim/participatory_spaces/_upcoming_meeting_for_card.html.erb +0 -4
  249. data/config/locales/he-IL.yml +0 -1
  250. data/decidim-meetings.gemspec +0 -36
  251. data/lib/decidim/meetings/seeds/city.jpeg +0 -0
@@ -0,0 +1,47 @@
1
+ .meeting-calendar {
2
+ @apply grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 grid-rows-4 md:gap-y-6 md:gap-x-8 lg:gap-y-12 lg:gap-x-16 place-items-start;
3
+
4
+ &__selector {
5
+ @apply flex items-center gap-4;
6
+
7
+ &-container {
8
+ @apply flex justify-between items-center mb-8;
9
+ }
10
+
11
+ &-arrow {
12
+ @apply w-6 h-6 rounded-full bg-background;
13
+ }
14
+ }
15
+
16
+ &__link {
17
+ @apply flex items-center gap-2 text-secondary font-semibold;
18
+ }
19
+
20
+ &__month {
21
+ @apply text-center border-separate;
22
+
23
+ caption {
24
+ @apply text-lg text-gray-2 text-left font-semibold mb-4;
25
+ }
26
+
27
+ th {
28
+ @apply text-xs text-black uppercase font-semibold;
29
+ }
30
+
31
+ td {
32
+ @apply text-md text-gray-2 font-semibold w-9 h-9 rounded;
33
+ }
34
+
35
+ .is-today {
36
+ @apply border border-gray bg-background font-bold;
37
+ }
38
+
39
+ .is-past-event {
40
+ @apply bg-gray-2 text-white font-bold;
41
+ }
42
+
43
+ .is-upcoming-event {
44
+ @apply bg-secondary text-white font-bold;
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,177 @@
1
+ .meeting {
2
+ &__filter {
3
+ &-container {
4
+ @apply self-stretch;
5
+ }
6
+ }
7
+
8
+ &__calendar {
9
+ @apply w-14 flex flex-col justify-start rounded bg-background text-center;
10
+
11
+ &:only-child &-month {
12
+ @apply rounded-t;
13
+ }
14
+
15
+ &-container {
16
+ @apply grid grid-cols-[auto_1fr] md:grid-cols-[auto_1fr_1fr] items-center gap-0 md:gap-x-5 border-4 border-background rounded md:h-[120px] overflow-hidden;
17
+
18
+ > *:nth-child(2) {
19
+ @apply p-4 md:p-0;
20
+
21
+ &:not(:last-child) {
22
+ @apply col-span-2 md:col-auto order-2 md:order-1;
23
+ }
24
+
25
+ &:last-child {
26
+ @apply md:col-span-2 pr-4;
27
+ }
28
+ }
29
+
30
+ > *:nth-child(3) {
31
+ @apply order-1 md:order-2 h-[116px] md:h-full;
32
+ }
33
+ }
34
+
35
+ &-month {
36
+ @apply bg-primary uppercase text-white text-xs rounded-tl;
37
+ }
38
+
39
+ &-day {
40
+ @apply text-black text-2xl font-bold;
41
+ }
42
+
43
+ &-time {
44
+ @apply text-black text-xs;
45
+ }
46
+
47
+ &-month,
48
+ &-day,
49
+ &-time {
50
+ @apply inline-flex items-center justify-evenly empty:[&>span]:hidden;
51
+ }
52
+
53
+ &-separator {
54
+ @apply mx-2 font-normal text-sm;
55
+ }
56
+
57
+ &__lg {
58
+ @apply w-fit justify-center [&>*]:px-2;
59
+ }
60
+
61
+ &__lg &-month {
62
+ @apply py-1 text-md;
63
+ }
64
+
65
+ &__lg &-day {
66
+ @apply text-5xl;
67
+ }
68
+
69
+ &__lg &-time {
70
+ @apply text-md pb-2;
71
+ }
72
+ }
73
+
74
+ &__author {
75
+ @apply flex items-center gap-4;
76
+ }
77
+
78
+ &__grid {
79
+ @apply grid grid-cols-4 gap-x-12 gap-y-4;
80
+ }
81
+
82
+ &__online {
83
+ @apply bg-background flex flex-col grid place-items-center p-8 space-y-4 text-gray-2 text-center text-lg;
84
+ }
85
+
86
+ &__agenda {
87
+ &-title {
88
+ @apply flex gap-1 items-center;
89
+
90
+ svg {
91
+ @apply w-6 h-6 text-tertiary fill-current;
92
+ }
93
+ }
94
+
95
+ &-item {
96
+ @apply mt-6 bg-background rounded p-4 text-gray-2;
97
+
98
+ &__title {
99
+ @apply text-lg inline-flex gap-1 first:[&>*]:font-bold;
100
+ }
101
+
102
+ &__description {
103
+ @apply mt-2 text-md text-gray-2;
104
+ }
105
+ }
106
+
107
+ &-subitem {
108
+ @apply ml-4 mt-4;
109
+ }
110
+
111
+ &-subitem &-item__title {
112
+ @apply text-md;
113
+ }
114
+ }
115
+
116
+ &__aside {
117
+ &-progress {
118
+ @apply text-sm text-gray-2 text-center space-y-1;
119
+
120
+ progress {
121
+ @apply block w-full h-1 appearance-none rounded-full overflow-hidden bg-gray;
122
+
123
+ &::-webkit-progress-value {
124
+ @apply bg-success;
125
+ }
126
+
127
+ &::-webkit-progress-bar {
128
+ @apply bg-white;
129
+ }
130
+
131
+ &::-moz-progress-bar {
132
+ @apply bg-success;
133
+ }
134
+ }
135
+ }
136
+
137
+ &-block {
138
+ @apply bg-background rounded p-2 [&>*]:flex [&>*]:gap-1 first:[&>*>*]:flex-none last:[&>*>*]:space-y-1;
139
+
140
+ & + & {
141
+ @apply mt-4;
142
+ }
143
+
144
+ &__title {
145
+ @apply text-gray-2 text-sm font-semibold;
146
+ }
147
+
148
+ &__text {
149
+ @apply text-gray-2 text-sm;
150
+ }
151
+
152
+ &__large {
153
+ @apply text-gray-2 text-xl font-bold;
154
+ }
155
+
156
+ &__list {
157
+ @apply ml-4 list-disc text-gray-2 text-sm;
158
+ }
159
+ }
160
+
161
+ &-actions {
162
+ @apply flex flex-wrap justify-center gap-x-2;
163
+ }
164
+ }
165
+
166
+ &__registration-modal {
167
+ &__terms {
168
+ @apply text-xs text-gray-2;
169
+ }
170
+ }
171
+
172
+ &__cancelation-modal {
173
+ &__description {
174
+ @apply mt-8 mb-16 text-lg text-gray-2;
175
+ }
176
+ }
177
+ }
@@ -0,0 +1,58 @@
1
+ .meeting-list {
2
+ @apply flex items-stretch gap-4 cursor-pointer;
3
+
4
+ &__map {
5
+ /* negative main padding values */
6
+ @apply md:-ml-16 -mt-6 md:-mt-12 aspect-square md:aspect-[21/9] [&>*]:h-full [&+*]:mt-6 md:[&+*]:mt-12;
7
+ }
8
+
9
+ &__link {
10
+ @apply py-6 flex items-center justify-end gap-1 text-secondary;
11
+ }
12
+
13
+ &__modal {
14
+ @apply pr-16 pb-16;
15
+
16
+ &-title {
17
+ @apply flex items-baseline gap-2;
18
+ }
19
+
20
+ &-text {
21
+ @apply text-lg text-gray-2;
22
+ }
23
+
24
+ &-input {
25
+ @apply text-lg text-gray-2 relative;
26
+
27
+ input {
28
+ @apply w-full;
29
+ }
30
+
31
+ button {
32
+ @apply z-10 absolute top-1/2 right-2 -translate-y-1/2 text-sm;
33
+ }
34
+ }
35
+ }
36
+
37
+ &:hover h2 {
38
+ @apply underline;
39
+ }
40
+
41
+ &__block {
42
+ &-map {
43
+ @apply aspect-[2/1] md:aspect-[4/1] rounded overflow-hidden [&>*]:h-full;
44
+ }
45
+
46
+ &-list {
47
+ @apply flex flex-col md:flex-row justify-start gap-16 last:[&>*]:grow;
48
+
49
+ &-aside {
50
+ @apply flex flex-col gap-4 items-stretch;
51
+ }
52
+
53
+ &-title {
54
+ @apply text-gray-2 font-semibold uppercase;
55
+ }
56
+ }
57
+ }
58
+ }
@@ -0,0 +1,128 @@
1
+ .meeting-polls {
2
+ &__body {
3
+ @apply flex flex-col min-h-screen;
4
+ }
5
+
6
+ &__header {
7
+ @apply flex items-center justify-between p-2.5 bg-background border;
8
+ }
9
+
10
+ &__main {
11
+ @apply flex grow items-stretch;
12
+ }
13
+
14
+ &__iframe {
15
+ @apply flex grow bg-gray-2 [&>*]:grow [&>*]:border-0;
16
+ }
17
+
18
+ &__aside {
19
+ @apply flex-none bg-background-2;
20
+
21
+ counter-reset: question;
22
+
23
+ &.is-open {
24
+ @apply w-1/5 [&+div]:w-4/5;
25
+
26
+ // shrink iframe when there is two panels
27
+ & + & + div {
28
+ @apply w-3/5;
29
+ }
30
+
31
+ & + & {
32
+ @apply border-l border-l-background;
33
+ }
34
+ }
35
+ }
36
+
37
+ &__question {
38
+ @apply bg-white;
39
+
40
+ summary {
41
+ @apply p-4 cursor-pointer font-bold text-secondary text-md transition border-b border-b-background hover:bg-background;
42
+
43
+ transition: background-color 0.2s ease-in-out;
44
+
45
+ &::after {
46
+ counter-increment: question;
47
+ content: "#" counter(question);
48
+ }
49
+
50
+ & ~ * {
51
+ @apply p-4;
52
+
53
+ // dynamic content
54
+ > :first-child {
55
+ @apply font-bold;
56
+ }
57
+
58
+ label {
59
+ @apply flex items-baseline cursor-pointer;
60
+ }
61
+
62
+ label + label {
63
+ @apply mt-4;
64
+ }
65
+ // end dynamic content
66
+ }
67
+ }
68
+
69
+ &[open] .meeting-polls__answer--bar > * {
70
+ opacity: 1;
71
+ transform: translateX(0);
72
+ }
73
+
74
+ &.is-new {
75
+ animation: animateHighlight 5s ease-in-out forwards;
76
+ }
77
+
78
+ @keyframes animateHighlight {
79
+ 0%,
80
+ 80% {
81
+ background-color: rgba(var(--warning-rgb), 0.1);
82
+ }
83
+ }
84
+ }
85
+
86
+ &__question--admin {
87
+ summary ~ * {
88
+ @apply border-t border-t-background p-4 bg-background-2;
89
+
90
+ a {
91
+ @apply my-4 block text-sm underline;
92
+ }
93
+
94
+ > :first-child {
95
+ @apply font-normal;
96
+ }
97
+ }
98
+ }
99
+
100
+ &__answer {
101
+ @apply flex items-center gap-2;
102
+
103
+ &--value {
104
+ @apply w-1/5 font-bold;
105
+ }
106
+
107
+ &--bar {
108
+ @apply w-4/5 h-2.5 overflow-hidden;
109
+
110
+ > * {
111
+ @apply bg-primary h-full opacity-0;
112
+ }
113
+ }
114
+ }
115
+
116
+ // vertical flow
117
+ label + &__answer + label {
118
+ @apply mt-6;
119
+ }
120
+
121
+ &__admin-label {
122
+ @apply p-4 bg-secondary text-white font-bold text-sm;
123
+ }
124
+
125
+ &__admin-action {
126
+ @apply py-2 flex items-center border-t-background [&>*]:flex-none first:[&>*]:w-2/5 last:[&>*]:w-3/5;
127
+ }
128
+ }
@@ -0,0 +1,4 @@
1
+ @import "stylesheets/decidim/meetings/list.scss";
2
+ @import "stylesheets/decidim/meetings/item.scss";
3
+ @import "stylesheets/decidim/meetings/calendar.scss";
4
+ @import "stylesheets/decidim/meetings/live_event.scss";
@@ -4,7 +4,6 @@ module Decidim
4
4
  module Meetings
5
5
  class Permissions < Decidim::DefaultPermissions
6
6
  def permissions
7
- allow_embed_meeting?
8
7
  return permission_action unless user
9
8
 
10
9
  # Delegate the admin permission checks to the admin permissions class
@@ -58,15 +57,6 @@ module Decidim
58
57
  @question ||= context.fetch(:question, nil)
59
58
  end
60
59
 
61
- # As this is a public action, we need to run this before other checks
62
- def allow_embed_meeting?
63
- return unless permission_action.action == :embed && permission_action.subject == :meeting && meeting
64
- return disallow! if meeting.withdrawn?
65
- return allow! if meeting.published?
66
-
67
- disallow!
68
- end
69
-
70
60
  def can_join_meeting?
71
61
  meeting.can_be_joined_by?(user) &&
72
62
  authorized?(:join, resource: meeting)
@@ -78,11 +68,24 @@ module Decidim
78
68
 
79
69
  def can_decline_invitation?
80
70
  meeting.registrations_enabled? &&
81
- meeting.invites.exists?(user: user)
71
+ meeting.invites.exists?(user:)
82
72
  end
83
73
 
84
74
  def can_create_meetings?
85
- component_settings&.creation_enabled_for_participants?
75
+ component_settings&.creation_enabled_for_participants? && public_space_or_member?
76
+ end
77
+
78
+ def public_space_or_member?
79
+ participatory_space = context[:current_component].participatory_space
80
+
81
+ participatory_space.private_space? ? space_member?(participatory_space, user) : true
82
+ end
83
+
84
+ # Neither platform admins, nor space admins should be able to create meetings from the public side.
85
+ def space_member?(participatory_space, user)
86
+ return false unless user
87
+
88
+ participatory_space.participatory_space_private_users.exists?(decidim_user_id: user.id)
86
89
  end
87
90
 
88
91
  def can_update_meeting?
@@ -6,8 +6,8 @@ module Decidim
6
6
  # This class holds the logic to present a `Decidim::Meetings::Invite`
7
7
  # for the `AdminLog` log.
8
8
  #
9
- # Usage should be automatic and you shouldn't need to call this class
10
- # directly, but here's an example:
9
+ # Usage should be automatic and you should not need to call this class
10
+ # directly, but here is an example:
11
11
  #
12
12
  # action_log = Decidim::ActionLog.last
13
13
  # view_helpers # => this comes from the views
@@ -6,8 +6,8 @@ module Decidim
6
6
  # This class holds the logic to present a `Decidim::Meetings::Meeting`
7
7
  # for the `AdminLog` log.
8
8
  #
9
- # Usage should be automatic and you shouldn't need to call this class
10
- # directly, but here's an example:
9
+ # Usage should be automatic and you should not need to call this class
10
+ # directly, but here is an example:
11
11
  #
12
12
  # action_log = Decidim::ActionLog.last
13
13
  # view_helpers # => this comes from the views
@@ -15,6 +15,10 @@ module Decidim
15
15
  class MeetingPresenter < Decidim::Log::BasePresenter
16
16
  private
17
17
 
18
+ def resource_presenter
19
+ @resource_presenter ||= Decidim::Meetings::Log::ResourcePresenter.new(action_log.resource, h, action_log.extra["resource"])
20
+ end
21
+
18
22
  def diff_fields_mapping
19
23
  {
20
24
  address: :string,
@@ -6,8 +6,8 @@ module Decidim
6
6
  # This class holds the logic to present a `Decidim::Meetings::Questionnaire`
7
7
  # for the `AdminLog` log.
8
8
  #
9
- # Usage should be automatic and you shouldn't need to call this class
10
- # directly, but here's an example:
9
+ # Usage should be automatic and you should not need to call this class
10
+ # directly, but here is an example:
11
11
  #
12
12
  # action_log = Decidim::ActionLog.last
13
13
  # view_helpers # => this comes from the views
@@ -10,7 +10,7 @@ module Decidim
10
10
  def present
11
11
  return unless value
12
12
 
13
- renderer = Decidim::ContentRenderers::HashtagRenderer.new(h.decidim_escape_translated(value))
13
+ renderer = Decidim::ContentRenderers::HashtagRenderer.new(h.translated_attribute(value))
14
14
  renderer.render(links: false).html_safe
15
15
  end
16
16
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Meetings
5
+ module Log
6
+ class ResourcePresenter < Decidim::Log::ResourcePresenter
7
+ private
8
+
9
+ # Private: Presents resource name.
10
+ #
11
+ # Returns an HTML-safe String.
12
+ def present_resource_name
13
+ Decidim::Meetings::MeetingPresenter.new(resource).title
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -34,6 +34,12 @@ module Decidim
34
34
  content_handle_locale(meeting.description, all_locales, extras, links, strip_tags)
35
35
  end
36
36
 
37
+ def editor_description(all_locales: false, extras: true)
38
+ return unless meeting
39
+
40
+ editor_locales(meeting.description, all_locales, extras:)
41
+ end
42
+
37
43
  def location(all_locales: false)
38
44
  return unless meeting
39
45
 
@@ -63,7 +69,7 @@ module Decidim
63
69
 
64
70
  handle_locales(meeting.closing_report, all_locales) do |content|
65
71
  renderer = Decidim::ContentRenderers::HashtagRenderer.new(sanitized(content))
66
- renderer.render(links: links).html_safe
72
+ renderer.render(links:).html_safe
67
73
  end
68
74
  end
69
75
 
@@ -72,7 +78,7 @@ module Decidim
72
78
 
73
79
  handle_locales(meeting.registration_email_custom_content, all_locales) do |content|
74
80
  renderer = Decidim::ContentRenderers::HashtagRenderer.new(sanitized(content))
75
- renderer.render(links: links).html_safe
81
+ renderer.render(links:).html_safe
76
82
  end
77
83
  end
78
84
 
@@ -24,7 +24,7 @@ module Decidim
24
24
  #
25
25
  # Returns a collection of Meetings.
26
26
  def meetings
27
- Decidim::Meetings::Meeting.where(component: component)
27
+ Decidim::Meetings::Meeting.where(component:)
28
28
  end
29
29
 
30
30
  # Finds the component meetings.
@@ -38,15 +38,17 @@ module Decidim
38
38
 
39
39
  def send_reminders(component)
40
40
  intervals = Array(reminder_manifest.settings.attributes[:reminder_times].default)
41
+ space_admins = Decidim::ParticipatoryProcessUserRole.where(decidim_participatory_process_id: component.participatory_space_id, role: "admin").collect(&:user)
42
+ space_admins = (global_admins + space_admins).uniq
41
43
  intervals.each do |interval|
42
44
  finder_query(component.id, interval).find_each do |meeting|
43
- authors = meeting.official? ? space_admins(component) : [meeting.author]
45
+ authors = meeting.official? ? space_admins : [meeting.author]
44
46
  authors.each do |author|
45
47
  send_notif = author.notification_settings.fetch("close_meeting_reminder", "1")
46
48
  next unless send_notif == "1"
47
49
 
48
- reminder = Decidim::Reminder.find_or_create_by(user: author, component: component)
49
- record = Decidim::ReminderRecord.find_or_create_by(reminder: reminder, remindable: meeting)
50
+ reminder = Decidim::Reminder.find_or_create_by(user: author, component:)
51
+ record = Decidim::ReminderRecord.find_or_create_by(reminder:, remindable: meeting)
50
52
  record.update(state: "active") unless record.active?
51
53
  reminder.records << record
52
54
  reminder.save!
@@ -58,16 +60,8 @@ module Decidim
58
60
  end
59
61
  end
60
62
 
61
- def space_admins(component)
62
- @space_admins ||= begin
63
- space_admins = if component.participatory_space.respond_to?(:user_roles)
64
- component.participatory_space.user_roles(:admin).collect(&:user)
65
- else
66
- []
67
- end
68
- global_admins = component.organization.admins
69
- (global_admins + space_admins).uniq
70
- end
63
+ def global_admins
64
+ @global_admins ||= Decidim::User.where(admin: true).all
71
65
  end
72
66
  end
73
67
  end
@@ -5,7 +5,7 @@ require "cgi"
5
5
  module Decidim
6
6
  module Meetings
7
7
  # This class handles the streaming url to be included in the iframe present
8
- # in the live event. For some services it's required to transforma a bit
8
+ # in the live event. For some services it is required to transforma a bit
9
9
  # the structure of the URL.
10
10
  class MeetingIframeEmbedder
11
11
  # Public: Initializes the service.
@@ -1,30 +1,28 @@
1
- <button class="button button--title share-link text-center calendar" data-open="calendarShare">
1
+ <button class="button button__sm button__transparent-secondary mt-6 md:mt-12 md:self-start" data-dialog-open="calendarShare">
2
2
  <%= t(".export_calendar") %>
3
- <%= icon "share", class: "icon--after", role: "img", "aria-hidden": true %>
3
+ <%= icon "download-cloud-2-line", class: "fill-current" %>
4
4
  </button>
5
5
 
6
- <div class="reveal" id="calendarShare" data-reveal>
7
- <div class="reveal__header">
8
- <h3 class="reveal__title"><%= t(".calendar_url") %>:</h3>
9
- <button class="close-button" data-close aria-label="<%= t(".close_window") %>" type="button">
10
- <span aria-hidden="true">&times;</span>
11
- </button>
12
- </div>
6
+ <%= decidim_modal id: "calendarShare", class: "meeting-list__modal" do %>
7
+ <div class="meeting-list__modal-title">
8
+ <%= icon "share-forward-2-line", class: "w-6 h-6 text-gray fill-current flex-none" %>
9
+ <div class="space-y-8">
10
+ <h3 id="dialog-title-calendarShare" class="h3"><%= t(".calendar_url") %></h3>
13
11
 
14
- <div class="calendar-url-description"><%= t(".copy_calendar_url_description") %></div>
15
- <div class="calendar-url-explanation"><%= t(".copy_calendar_url_explanation") %></div>
12
+ <div id="dialog-desc-calendarShare" class="meeting-list__modal-text"><%= t(".copy_calendar_url_description") %></div>
13
+ <div class="meeting-list__modal-text"><%= t(".copy_calendar_url_explanation") %></div>
16
14
 
17
- <div class="input-group calendar_url_input">
18
- <input id="urlCalendarUrl" class="input-group-field" type="text" title="<%= t(".calendar_url") %>" value="<%= "#{path}" %>" readonly>
19
- <div class="input-group-button">
20
- <button class="button primary"
21
- data-clipboard-copy="#urlCalendarUrl"
22
- data-clipboard-copy-label="<%= t(".copy_calendar_url_copied") %>"
23
- data-clipboard-copy-message="<%= t(".copy_calendar_url_message") %>"
24
- aria-label="<%= t(".copy_calendar_url_clarification") %>">
25
- <%= icon "clipboard", role: "img", "aria-hidden": true %>
26
- <%= t(".copy_calendar_url") %>
15
+ <div class="meeting-list__modal-input">
16
+ <input id="urlCalendarUrl" type="text" title="<%= t(".calendar_url") %>" value="<%= "#{path}" %>" readonly>
17
+ <button
18
+ data-clipboard-copy="#urlCalendarUrl"
19
+ data-clipboard-copy-label="<%= t(".copy_calendar_url_copied") %>"
20
+ data-clipboard-copy-message="<%= t(".copy_calendar_url_message") %>"
21
+ aria-label="<%= t(".copy_calendar_url_clarification") %>">
22
+ <%= icon "file-copy-line", class: "w-5 h-6 text-secondary fill-current" %>
23
+ <span class="sr-only"><%= t(".copy_calendar_url") %></span>
27
24
  </button>
28
25
  </div>
29
26
  </div>
30
27
  </div>
28
+ <% end %>