decidim-meetings 0.27.4 → 0.28.0.rc5

Sign up to get free protection for your applications and to get access to all the features.
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 -0
  5. data/app/cells/decidim/meetings/cancel_registration_meeting_button_cell.rb +36 -0
  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 +7 -19
  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 +10 -58
  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 -1
  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 -2
  89. data/app/presenters/decidim/meetings/admin_log/invite_presenter.rb +2 -2
  90. data/app/presenters/decidim/meetings/admin_log/meeting_presenter.rb +2 -2
  91. data/app/presenters/decidim/meetings/admin_log/questionnaire_presenter.rb +2 -2
  92. data/app/presenters/decidim/meetings/meeting_presenter.rb +8 -2
  93. data/app/services/decidim/meetings/calendar/component_calendar.rb +1 -1
  94. data/app/services/decidim/meetings/calendar/meeting_to_event.rb +6 -1
  95. data/app/services/decidim/meetings/close_meeting_reminder_generator.rb +2 -2
  96. data/app/services/decidim/meetings/meeting_iframe_embedder.rb +1 -1
  97. data/app/views/decidim/meetings/_calendar_modal.html.erb +19 -21
  98. data/app/views/decidim/meetings/admin/agenda/_agenda_item.html.erb +12 -12
  99. data/app/views/decidim/meetings/admin/agenda/_agenda_item_child.html.erb +8 -8
  100. data/app/views/decidim/meetings/admin/agenda/_agenda_item_child_template.html.erb +1 -1
  101. data/app/views/decidim/meetings/admin/agenda/_agenda_item_fields.html.erb +3 -3
  102. data/app/views/decidim/meetings/admin/agenda/_form.html.erb +54 -50
  103. data/app/views/decidim/meetings/admin/agenda/edit.html.erb +18 -6
  104. data/app/views/decidim/meetings/admin/agenda/new.html.erb +17 -5
  105. data/app/views/decidim/meetings/admin/invite_join_meeting_mailer/invite.html.erb +11 -2
  106. data/app/views/decidim/meetings/admin/invites/_form.html.erb +38 -28
  107. data/app/views/decidim/meetings/admin/invites/index.html.erb +77 -81
  108. data/app/views/decidim/meetings/admin/meeting_closes/_form.html.erb +26 -28
  109. data/app/views/decidim/meetings/admin/meeting_closes/edit.html.erb +17 -5
  110. data/app/views/decidim/meetings/admin/meeting_copies/new.html.erb +17 -6
  111. data/app/views/decidim/meetings/admin/meetings/_form.html.erb +76 -83
  112. data/app/views/decidim/meetings/admin/meetings/_service.html.erb +14 -10
  113. data/app/views/decidim/meetings/admin/meetings/_services.html.erb +9 -5
  114. data/app/views/decidim/meetings/admin/meetings/edit.html.erb +17 -7
  115. data/app/views/decidim/meetings/admin/meetings/index.html.erb +133 -129
  116. data/app/views/decidim/meetings/admin/meetings/new.html.erb +16 -6
  117. data/app/views/decidim/meetings/admin/poll/_answer_option.html.erb +2 -1
  118. data/app/views/decidim/meetings/admin/poll/_answer_option_template.html.erb +1 -1
  119. data/app/views/decidim/meetings/admin/poll/_form.html.erb +17 -32
  120. data/app/views/decidim/meetings/admin/poll/_question.html.erb +81 -75
  121. data/app/views/decidim/meetings/admin/poll/edit.html.erb +28 -8
  122. data/app/views/decidim/meetings/admin/registrations/_form.html.erb +32 -55
  123. data/app/views/decidim/meetings/admin/registrations/edit.html.erb +59 -26
  124. data/app/views/decidim/meetings/directory/meetings/index.html.erb +15 -20
  125. data/app/views/decidim/meetings/directory/meetings/index.js.erb +1 -23
  126. data/app/views/decidim/meetings/layouts/_aside_block.html.erb +8 -0
  127. data/app/views/decidim/meetings/layouts/live_event.html.erb +20 -19
  128. data/app/views/decidim/meetings/live_events/show.html.erb +4 -5
  129. data/app/views/decidim/meetings/meeting_closes/_form.html.erb +3 -10
  130. data/app/views/decidim/meetings/meeting_closes/edit.html.erb +17 -21
  131. data/app/views/decidim/meetings/meetings/_actions.html.erb +6 -0
  132. data/app/views/decidim/meetings/meetings/_add_to_calendar_modal.html.erb +17 -0
  133. data/app/views/decidim/meetings/meetings/_form.html.erb +26 -34
  134. data/app/views/decidim/meetings/meetings/_linked_meetings.html.erb +3 -22
  135. data/app/views/decidim/meetings/meetings/_meeting.html.erb +74 -0
  136. data/app/views/decidim/meetings/meetings/_meeting_agenda.html.erb +28 -26
  137. data/app/views/decidim/meetings/meetings/_meeting_aside.html.erb +98 -0
  138. data/app/views/decidim/meetings/meetings/_meeting_minutes.html.erb +23 -36
  139. data/app/views/decidim/meetings/meetings/edit.html.erb +17 -21
  140. data/app/views/decidim/meetings/meetings/index.html.erb +15 -33
  141. data/app/views/decidim/meetings/meetings/index.js.erb +1 -23
  142. data/app/views/decidim/meetings/meetings/new.html.erb +17 -21
  143. data/app/views/decidim/meetings/meetings/show.html.erb +8 -164
  144. data/app/views/decidim/meetings/polls/answers/_multiple_option.html.erb +2 -2
  145. data/app/views/decidim/meetings/polls/answers/_single_option.html.erb +6 -6
  146. data/app/views/decidim/meetings/polls/answers/create.js.erb +1 -1
  147. data/app/views/decidim/meetings/polls/questions/_index.html.erb +1 -1
  148. data/app/views/decidim/meetings/polls/questions/_index_admin.html.erb +5 -5
  149. data/app/views/decidim/meetings/polls/questions/_published_question.html.erb +7 -9
  150. data/app/views/decidim/meetings/polls/questions/_question.html.erb +3 -3
  151. data/app/views/decidim/meetings/polls/questions/index_admin.js.erb +1 -1
  152. data/app/views/decidim/meetings/shared/_filters.html.erb +20 -0
  153. data/app/views/decidim/meetings/shared/_index.html.erb +24 -0
  154. data/app/views/decidim/meetings/shared/_index.js.erb +16 -0
  155. data/app/views/decidim/meetings/shared/_meetings.html.erb +33 -0
  156. data/app/views/decidim/meetings/shared/_meetings_aside.html.erb +18 -0
  157. data/app/views/decidim/meetings/versions/show.html.erb +13 -3
  158. data/app/views/decidim/participatory_spaces/_conference_venues.html.erb +15 -14
  159. data/config/assets.rb +0 -2
  160. data/config/environment.rb +3 -0
  161. data/config/locales/ar.yml +3 -97
  162. data/config/locales/bg.yml +0 -7
  163. data/config/locales/ca.yml +49 -70
  164. data/config/locales/cs.yml +52 -73
  165. data/config/locales/de.yml +52 -70
  166. data/config/locales/el.yml +45 -54
  167. data/config/locales/en.yml +54 -75
  168. data/config/locales/es-MX.yml +50 -68
  169. data/config/locales/es-PY.yml +51 -69
  170. data/config/locales/es.yml +48 -69
  171. data/config/locales/eu.yml +131 -149
  172. data/config/locales/fi-plain.yml +49 -67
  173. data/config/locales/fi.yml +64 -82
  174. data/config/locales/fr-CA.yml +45 -66
  175. data/config/locales/fr.yml +49 -70
  176. data/config/locales/ga-IE.yml +0 -16
  177. data/config/locales/gl.yml +1 -66
  178. data/config/locales/hu.yml +3 -89
  179. data/config/locales/id-ID.yml +1 -63
  180. data/config/locales/is-IS.yml +1 -21
  181. data/config/locales/it.yml +1 -85
  182. data/config/locales/ja.yml +43 -67
  183. data/config/locales/lb.yml +1 -66
  184. data/config/locales/lt.yml +59 -66
  185. data/config/locales/lv.yml +1 -64
  186. data/config/locales/nl.yml +1 -95
  187. data/config/locales/no.yml +1 -80
  188. data/config/locales/pl.yml +10 -83
  189. data/config/locales/pt-BR.yml +1 -86
  190. data/config/locales/pt.yml +1 -85
  191. data/config/locales/ro-RO.yml +8 -82
  192. data/config/locales/ru.yml +1 -62
  193. data/config/locales/sk.yml +1 -64
  194. data/config/locales/sq-AL.yml +1 -0
  195. data/config/locales/sr-CS.yml +0 -6
  196. data/config/locales/sv.yml +7 -88
  197. data/config/locales/th-TH.yml +1 -0
  198. data/config/locales/tr-TR.yml +2 -74
  199. data/config/locales/uk.yml +1 -55
  200. data/config/locales/zh-CN.yml +1 -70
  201. data/config/locales/zh-TW.yml +21 -54
  202. data/db/migrate/20201016065302_fix_meetings_registration_terms.rb +1 -1
  203. data/db/migrate/20230427105701_change_types_and_registration_types_on_meetings.rb +49 -0
  204. data/lib/decidim/meetings/admin_engine.rb +2 -2
  205. data/lib/decidim/meetings/component.rb +5 -217
  206. data/lib/decidim/meetings/content_blocks/registry_manager.rb +17 -0
  207. data/lib/decidim/meetings/directory_engine.rb +4 -6
  208. data/lib/decidim/meetings/engine.rb +65 -29
  209. data/lib/decidim/meetings/meeting_serializer.rb +5 -5
  210. data/lib/decidim/meetings/seeds.rb +188 -0
  211. data/lib/decidim/meetings/test/factories.rb +126 -18
  212. data/lib/decidim/meetings/test/notifications_handling.rb +3 -3
  213. data/lib/decidim/meetings/test/translated_event.rb +1 -1
  214. data/lib/decidim/meetings/user_answers_serializer.rb +1 -1
  215. data/lib/decidim/meetings/version.rb +1 -1
  216. metadata +60 -55
  217. data/app/cells/decidim/meetings/content_blocks/highlighted_meetings/elements.erb +0 -16
  218. data/app/cells/decidim/meetings/content_blocks/highlighted_meetings/heading.erb +0 -1
  219. data/app/cells/decidim/meetings/content_blocks/upcoming_meetings/show.erb +0 -26
  220. data/app/cells/decidim/meetings/content_blocks/upcoming_meetings_cell.rb +0 -55
  221. data/app/cells/decidim/meetings/join_meeting_button/registration_confirm.erb +0 -31
  222. data/app/cells/decidim/meetings/meeting_highlighted_list_item/show.erb +0 -21
  223. data/app/cells/decidim/meetings/meeting_highlighted_list_item_cell.rb +0 -10
  224. data/app/cells/decidim/meetings/meeting_list_item/show.erb +0 -14
  225. data/app/cells/decidim/meetings/meeting_list_item_cell.rb +0 -44
  226. data/app/cells/decidim/meetings/meeting_m/address.erb +0 -5
  227. data/app/cells/decidim/meetings/meeting_m/data.erb +0 -2
  228. data/app/cells/decidim/meetings/meeting_m/date.erb +0 -8
  229. data/app/cells/decidim/meetings/meeting_m/footer.erb +0 -9
  230. data/app/cells/decidim/meetings/meeting_m/multiple_dates.erb +0 -17
  231. data/app/cells/decidim/meetings/meeting_m/single_date.erb +0 -9
  232. data/app/cells/decidim/meetings/meeting_m/tags.erb +0 -1
  233. data/app/cells/decidim/meetings/meeting_m_cell.rb +0 -121
  234. data/app/cells/decidim/meetings/meeting_s/show.erb +0 -27
  235. data/app/controllers/concerns/decidim/meetings/filterable.rb +0 -27
  236. data/app/controllers/decidim/meetings/widgets_controller.rb +0 -20
  237. data/app/packs/stylesheets/decidim/meetings/_header.scss +0 -52
  238. data/app/packs/stylesheets/decidim/meetings/_main.scss +0 -178
  239. data/app/packs/stylesheets/decidim/meetings/_meetings.scss +0 -2
  240. data/app/queries/decidim/meetings/admin/invites.rb +0 -60
  241. data/app/views/decidim/meetings/admin/meeting_closes/proposals_picker.html.erb +0 -1
  242. data/app/views/decidim/meetings/directory/meetings/_filters.html.erb +0 -34
  243. data/app/views/decidim/meetings/directory/meetings/_meetings.html.erb +0 -26
  244. data/app/views/decidim/meetings/meeting_closes/proposals_picker.html.erb +0 -1
  245. data/app/views/decidim/meetings/meetings/_calendar_modal.html.erb +0 -26
  246. data/app/views/decidim/meetings/meetings/_filters.html.erb +0 -40
  247. data/app/views/decidim/meetings/meetings/_filters_small_view.html.erb +0 -18
  248. data/app/views/decidim/meetings/meetings/_meetings.html.erb +0 -48
  249. data/app/views/decidim/meetings/versions/index.html.erb +0 -8
  250. data/app/views/decidim/participatory_spaces/_upcoming_meeting_for_card.html.erb +0 -4
  251. data/lib/decidim/meetings/seeds/city.jpeg +0 -0
@@ -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";
@@ -68,11 +68,24 @@ module Decidim
68
68
 
69
69
  def can_decline_invitation?
70
70
  meeting.registrations_enabled? &&
71
- meeting.invites.exists?(user: user)
71
+ meeting.invites.exists?(user:)
72
72
  end
73
73
 
74
74
  def can_create_meetings?
75
- 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)
76
89
  end
77
90
 
78
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
@@ -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
@@ -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.
@@ -39,7 +39,7 @@ module Decidim
39
39
  @event.dtstart = Icalendar::Values::DateTime.new(meeting.start_time.utc, "tzid" => "UTC")
40
40
  @event.dtend = Icalendar::Values::DateTime.new(meeting.end_time.utc, "tzid" => "UTC")
41
41
  @event.summary = present(meeting).title
42
- @event.description = strip_tags(CGI.unescapeHTML(present(meeting).description))
42
+ @event.description = description_with_link
43
43
  @event.location = meeting.address
44
44
  @event.geo = [meeting.latitude, meeting.longitude]
45
45
  @event.url = url_for(meeting)
@@ -64,6 +64,11 @@ module Decidim
64
64
  def present(meeting)
65
65
  Decidim::Meetings::MeetingPresenter.new(meeting)
66
66
  end
67
+
68
+ def description_with_link
69
+ link = "\n\n#{I18n.t("read_more", scope: "decidim.meetings.calendar.meeting_to_event")} #{url_for(meeting)}"
70
+ strip_tags(CGI.unescapeHTML(present(meeting).description)) + link
71
+ end
67
72
  end
68
73
  end
69
74
  end
@@ -47,8 +47,8 @@ module Decidim
47
47
  send_notif = author.notification_settings.fetch("close_meeting_reminder", "1")
48
48
  next unless send_notif == "1"
49
49
 
50
- reminder = Decidim::Reminder.find_or_create_by(user: author, component: component)
51
- 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)
52
52
  record.update(state: "active") unless record.active?
53
53
  reminder.records << record
54
54
  reminder.save!
@@ -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 %>
@@ -1,42 +1,42 @@
1
1
  <% agenda_item = form.object %>
2
- <div class="card meeting-agenda-item" id="<%= tabs_id %>-field">
2
+ <div class="card meeting-agenda-item p-4" id="<%= tabs_id %>-field">
3
3
  <div class="card-divider agenda-item-divider">
4
4
  <h2 class="card-title">
5
5
  <span>
6
- <%== "#{icon("move")} #{t(".agenda_item")}" %>
6
+ <%== "#{icon("drag-move-2-fill")} #{t(".agenda_item")}" %>
7
7
  </span>
8
8
 
9
- <button class="button small alert hollow move-up-agenda-item button--title">
10
- <%== "#{icon("arrow-top")} #{t(".up")}" %>
9
+ <button class="button button__sm button__transparent-secondary small alert hollow move-up-agenda-item button--title">
10
+ <%== "#{icon("arrow-up-line")} #{t(".up")}" %>
11
11
  </button>
12
12
 
13
- <button class="button small alert hollow move-down-agenda-item button--title">
14
- <%== "#{icon("arrow-bottom")} #{t(".down")}" %>
13
+ <button class="button button__sm button__transparent-secondary small alert hollow move-down-agenda-item button--title">
14
+ <%== "#{icon("arrow-down-line")} #{t(".down")}" %>
15
15
  </button>
16
16
 
17
- <button class="button small alert hollow remove-agenda-item button--title">
17
+ <button class="button button__sm button__transparent-secondary small alert hollow remove-agenda-item button--title">
18
18
  <%= t(".remove") %>
19
19
  </button>
20
20
  </h2>
21
21
  </div>
22
22
 
23
23
  <div class="card-section">
24
- <%= render "agenda_item_fields", tabs_id: tabs_id, form: form, agenda_item: agenda_item %>
24
+ <%= render "agenda_item_fields", tabs_id:, form:, agenda_item: %>
25
25
 
26
- <div class="card">
26
+ <div class="card my-4">
27
27
  <div class="card-divider">
28
28
  <h2 class="card-title"><%= t(".agenda_item_children") %></h2>
29
29
  </div>
30
- <div class="card-section">
30
+ <div class="row column">
31
31
  <div class="meeting-agenda-item-childs" data-template="<%= child_template_selector %>">
32
32
  <div class="meeting-agenda-item-childs-list">
33
33
  <% agenda_item.agenda_item_children.each do |agenda_item_child| %>
34
34
  <%= fields_for "meeting_agenda[agenda_items][#{agenda_item.to_param}][agenda_item_children][]", agenda_item_child do |agenda_item_child_form| %>
35
- <%= render "agenda_item_child", form: agenda_item_child_form, tabs_id: tabs_id, tabs_id_child: tabs_id_for_agenda_item_child(agenda_item_child), editable: true %>
35
+ <%= render "agenda_item_child", form: agenda_item_child_form, tabs_id:, tabs_id_child: tabs_id_for_agenda_item_child(agenda_item_child), editable: true %>
36
36
  <% end %>
37
37
  <% end %>
38
38
  </div>
39
- <button class="button add-agenda-item-child"><%= t(".add_agenda_item_child") %></button>
39
+ <button class="button button__sm button__secondary add-agenda-item-child"><%= t(".add_agenda_item_child") %></button>
40
40
  </div>
41
41
  </div>
42
42
  </div>
@@ -1,26 +1,26 @@
1
1
  <% agenda_item_child = form.object %>
2
- <div class="card meeting-agenda-item-child" id="<%= tabs_id %>-child-<%= tabs_id_child %>-field">
2
+ <div class="card meeting-agenda-item-child p-4" id="<%= tabs_id %>-child-<%= tabs_id_child %>-field">
3
3
  <div class="card-divider agenda-item-child-divider">
4
4
  <h2 class="card-title">
5
5
  <span>
6
- <%== "#{icon("move")} #{t(".agenda_item_child")}" %>
6
+ <%== "#{icon("drag-move-2-fill")} #{t(".agenda_item_child")}" %>
7
7
  </span>
8
8
 
9
- <button class="button small alert hollow move-up-agenda-item-child button--title">
10
- <%== "#{icon("arrow-top")} #{t(".up")}" %>
9
+ <button class="button button__sm button__transparent-secondary small alert hollow move-up-agenda-item-child button--title">
10
+ <%== "#{icon("arrow-up-line")} #{t(".up")}" %>
11
11
  </button>
12
12
 
13
- <button class="button small alert hollow move-down-agenda-item-child button--title">
14
- <%== "#{icon("arrow-bottom")} #{t(".down")}" %>
13
+ <button class="button button__sm button__transparent-secondary small alert hollow move-down-agenda-item-child button--title">
14
+ <%== "#{icon("arrow-down-line")} #{t(".down")}" %>
15
15
  </button>
16
16
 
17
- <button class="button small alert hollow remove-agenda-item-child button--title">
17
+ <button class="button button__sm button__transparent-secondary small alert hollow remove-agenda-item-child button--title">
18
18
  <%= t(".remove") %>
19
19
  </button>
20
20
  </h2>
21
21
  </div>
22
22
 
23
23
  <div class="card-section">
24
- <%= render "agenda_item_fields", tabs_id: tabs_id_child, form: form, agenda_item: agenda_item_child %>
24
+ <%= render "agenda_item_fields", tabs_id: tabs_id_child, form:, agenda_item: agenda_item_child %>
25
25
  </div>
26
26
  </div>
@@ -2,6 +2,6 @@
2
2
 
3
3
  <script type="text/template" class="decidim-template" id="<%= template_id %>">
4
4
  <%= fields_for "meeting_agenda[agenda_items][#{agenda_item.to_param}][agenda_item_children][#{blank_agenda_item.to_param_child}]", blank_agenda_item do |agenda_item_child_form| %>
5
- <%= render "agenda_item_child", form: agenda_item_child_form, tabs_id: tabs_id_for_agenda_item(blank_agenda_item), tabs_id_child: tabs_id_for_agenda_item_child(blank_agenda_item), editable: editable %>
5
+ <%= render "agenda_item_child", form: agenda_item_child_form, tabs_id: tabs_id_for_agenda_item(blank_agenda_item), tabs_id_child: tabs_id_for_agenda_item_child(blank_agenda_item), editable: %>
6
6
  <% end %>
7
7
  </script>