decidim-core 0.15.2 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of decidim-core might be problematic. Click here for more details.

Files changed (354) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +14 -1
  3. data/app/assets/config/decidim_core_manifest.js +14 -12
  4. data/app/assets/images/decidim/pattern.png +0 -0
  5. data/app/assets/javascripts/decidim.js.es6 +4 -0
  6. data/app/assets/javascripts/decidim/floating_help.js.es6 +40 -0
  7. data/app/assets/javascripts/decidim/input_hashtags.js.es6 +6 -4
  8. data/app/assets/javascripts/decidim/notifications.js.es6 +1 -1
  9. data/app/assets/javascripts/decidim/tooltip_keep_on_hover.js.es6 +18 -0
  10. data/app/assets/javascripts/decidim/vizzs/areachart.js.es6 +52 -10
  11. data/app/assets/javascripts/decidim/vizzs/metrics.js.es6 +68 -22
  12. data/app/assets/javascripts/decidim/vizzs/orgchart.js.es6 +10 -13
  13. data/app/assets/stylesheets/decidim/conference-diploma.css.scss +61 -0
  14. data/app/assets/stylesheets/decidim/layouts/_home.scss +1 -1
  15. data/app/assets/stylesheets/decidim/modules/_buttons.scss +4 -0
  16. data/app/assets/stylesheets/decidim/modules/_cards.scss +17 -1
  17. data/app/assets/stylesheets/decidim/modules/_conference-programme.scss +0 -4
  18. data/app/assets/stylesheets/decidim/modules/_filters.scss +37 -2
  19. data/app/assets/stylesheets/decidim/modules/_floating-helper.scss +106 -0
  20. data/app/assets/stylesheets/decidim/modules/_forms.scss +22 -0
  21. data/app/assets/stylesheets/decidim/modules/_help.scss +4 -0
  22. data/app/assets/stylesheets/decidim/modules/_layout.scss +1 -0
  23. data/app/assets/stylesheets/decidim/modules/_margins.scss +1 -0
  24. data/app/assets/stylesheets/decidim/modules/_modules.scss +1 -1
  25. data/app/assets/stylesheets/decidim/modules/_navbar.scss +5 -1
  26. data/app/assets/stylesheets/decidim/modules/_order-by.scss +11 -1
  27. data/app/assets/stylesheets/decidim/modules/_process-header.scss +36 -38
  28. data/app/assets/stylesheets/decidim/modules/_process-nav.scss +61 -10
  29. data/app/assets/stylesheets/decidim/modules/_process-phase.scss +63 -30
  30. data/app/assets/stylesheets/decidim/modules/_share.scss +4 -0
  31. data/app/assets/stylesheets/decidim/modules/_typography.scss +17 -0
  32. data/app/assets/stylesheets/decidim/{modules → vizzs}/_orgchart.scss +2 -10
  33. data/app/cells/decidim/activities_cell.rb +6 -2
  34. data/app/cells/decidim/activity/show.erb +22 -19
  35. data/app/cells/decidim/activity_cell.rb +35 -5
  36. data/app/cells/decidim/amendable/amend_button_card/show.erb +9 -0
  37. data/app/cells/decidim/amendable/amend_button_card_cell.rb +43 -0
  38. data/app/cells/decidim/amendable/amenders_list/show.erb +18 -0
  39. data/app/cells/decidim/amendable/amenders_list_cell.rb +7 -0
  40. data/app/cells/decidim/amendable/announcement_cell.rb +58 -0
  41. data/app/cells/decidim/amendable/emendation_actions/show.erb +13 -0
  42. data/app/cells/decidim/amendable/emendation_actions_cell.rb +52 -0
  43. data/app/cells/decidim/amendable/promote_button_card/show.erb +9 -0
  44. data/app/cells/decidim/amendable/promote_button_card_cell.rb +47 -0
  45. data/app/cells/decidim/author/profile_inline.erb +23 -4
  46. data/app/cells/decidim/author/profile_minicard.erb +25 -0
  47. data/app/cells/decidim/author/show.erb +0 -1
  48. data/app/cells/decidim/author_cell.rb +6 -0
  49. data/app/cells/decidim/card_cell.rb +2 -4
  50. data/app/cells/decidim/card_m/top.erb +1 -1
  51. data/app/cells/decidim/card_m_cell.rb +3 -0
  52. data/app/cells/decidim/content_blocks/last_activity_cell.rb +1 -1
  53. data/app/cells/decidim/follow_button/show.erb +0 -1
  54. data/app/cells/decidim/follow_button_cell.rb +10 -0
  55. data/app/cells/decidim/following/show.erb +1 -1
  56. data/app/cells/decidim/following_cell.rb +1 -1
  57. data/app/cells/decidim/notifications/show.erb +1 -0
  58. data/app/cells/decidim/pad_iframe/show.erb +14 -0
  59. data/app/cells/decidim/pad_iframe_cell.rb +57 -0
  60. data/app/cells/decidim/profile/user_tabs.erb +8 -6
  61. data/app/cells/decidim/profile_cell.rb +1 -1
  62. data/app/cells/decidim/profile_sidebar/show.erb +58 -42
  63. data/app/cells/decidim/profile_sidebar_cell.rb +6 -0
  64. data/app/cells/decidim/search_results/show.erb +8 -0
  65. data/app/cells/decidim/search_results_cell.rb +38 -0
  66. data/app/cells/decidim/search_results_section/show.erb +24 -0
  67. data/app/cells/decidim/search_results_section_cell.rb +35 -0
  68. data/app/cells/decidim/user_activity/show.erb +15 -0
  69. data/app/cells/decidim/user_activity_cell.rb +17 -0
  70. data/app/cells/decidim/user_profile/header.erb +1 -16
  71. data/app/cells/decidim/user_profile/user_data.erb +16 -0
  72. data/app/cells/decidim/user_profile_cell.rb +4 -0
  73. data/app/cells/decidim/user_timeline/show.erb +15 -0
  74. data/app/cells/decidim/user_timeline_cell.rb +17 -0
  75. data/app/commands/decidim/accept_user_group_join_request.rb +1 -1
  76. data/app/commands/decidim/amendable/accept.rb +84 -0
  77. data/app/commands/decidim/amendable/create.rb +103 -0
  78. data/app/commands/decidim/amendable/promote.rb +79 -0
  79. data/app/commands/decidim/amendable/reject.rb +60 -0
  80. data/app/commands/decidim/amendable/withdraw.rb +46 -0
  81. data/app/commands/decidim/create_omniauth_registration.rb +17 -1
  82. data/app/commands/decidim/create_registration.rb +2 -0
  83. data/app/commands/decidim/demote_membership.rb +1 -1
  84. data/app/commands/decidim/invite_user.rb +1 -1
  85. data/app/commands/decidim/invite_user_to_group.rb +1 -1
  86. data/app/commands/decidim/join_user_group.rb +1 -7
  87. data/app/commands/decidim/messaging/reply_to_conversation.rb +1 -1
  88. data/app/commands/decidim/promote_membership.rb +1 -1
  89. data/app/commands/decidim/reject_user_group_join_request.rb +1 -1
  90. data/app/commands/decidim/remove_user_from_group.rb +1 -1
  91. data/app/commands/decidim/search.rb +65 -16
  92. data/app/commands/decidim/update_account.rb +1 -1
  93. data/app/commands/decidim/update_notifications_settings.rb +2 -1
  94. data/app/commands/decidim/update_user_interests.rb +35 -0
  95. data/app/controllers/concerns/decidim/amendments_controller.rb +104 -0
  96. data/app/controllers/concerns/decidim/participatory_space_context.rb +28 -6
  97. data/app/controllers/concerns/decidim/user_groups.rb +23 -0
  98. data/app/controllers/concerns/decidim/user_profile.rb +2 -4
  99. data/app/controllers/decidim/components/base_controller.rb +1 -0
  100. data/app/controllers/decidim/devise/confirmations_controller.rb +9 -0
  101. data/app/controllers/decidim/devise/omniauth_registrations_controller.rb +2 -1
  102. data/app/controllers/decidim/devise/passwords_controller.rb +6 -0
  103. data/app/controllers/decidim/devise/registrations_controller.rb +5 -0
  104. data/app/controllers/decidim/devise/sessions_controller.rb +12 -0
  105. data/app/controllers/decidim/group_admins_controller.rb +3 -0
  106. data/app/controllers/decidim/group_email_confirmations_controller.rb +32 -0
  107. data/app/controllers/decidim/group_invites_controller.rb +3 -0
  108. data/app/controllers/decidim/group_members_controller.rb +3 -0
  109. data/app/controllers/decidim/groups_controller.rb +3 -0
  110. data/app/controllers/decidim/homepage_controller.rb +10 -0
  111. data/app/controllers/decidim/last_activities_controller.rb +1 -1
  112. data/app/controllers/decidim/messaging/conversations_controller.rb +11 -2
  113. data/app/controllers/decidim/open_data_controller.rb +31 -0
  114. data/app/controllers/decidim/own_user_groups_controller.rb +3 -1
  115. data/app/controllers/decidim/pages_controller.rb +7 -15
  116. data/app/controllers/decidim/profiles_controller.rb +13 -2
  117. data/app/controllers/decidim/searches_controller.rb +11 -2
  118. data/app/controllers/decidim/user_activities_controller.rb +28 -0
  119. data/app/controllers/decidim/user_group_join_requests_controller.rb +3 -0
  120. data/app/controllers/decidim/user_interests_controller.rb +32 -0
  121. data/app/controllers/decidim/user_timeline_controller.rb +40 -0
  122. data/app/events/decidim/amendable/amendment_accepted_event.rb +23 -0
  123. data/app/events/decidim/amendable/amendment_base_event.rb +39 -0
  124. data/app/events/decidim/amendable/amendment_created_event.rb +23 -0
  125. data/app/events/decidim/amendable/amendment_rejected_event.rb +23 -0
  126. data/app/events/decidim/amendable/emendation_promoted_event.rb +23 -0
  127. data/app/events/decidim/welcome_notification_event.rb +58 -0
  128. data/app/forms/decidim/amendable/create_form.rb +54 -0
  129. data/app/forms/decidim/amendable/form.rb +22 -0
  130. data/app/forms/decidim/amendable/promote_form.rb +26 -0
  131. data/app/forms/decidim/amendable/reject_form.rb +14 -0
  132. data/app/forms/decidim/amendable/review_form.rb +35 -0
  133. data/app/forms/decidim/notifications_settings_form.rb +19 -6
  134. data/app/forms/decidim/omniauth_registration_form.rb +2 -1
  135. data/app/forms/decidim/user_group_form.rb +1 -2
  136. data/app/forms/decidim/user_interest_scope_form.rb +25 -0
  137. data/app/forms/decidim/user_interests_form.rb +22 -0
  138. data/app/helpers/decidim/amendments_helper.rb +130 -0
  139. data/app/helpers/decidim/application_helper.rb +19 -2
  140. data/app/helpers/decidim/card_helper.rb +0 -2
  141. data/app/helpers/decidim/cells_paginate_helper.rb +4 -0
  142. data/app/helpers/decidim/contextual_help_helper.rb +10 -0
  143. data/app/helpers/decidim/cta_button_helper.rb +3 -1
  144. data/app/helpers/decidim/decidim_form_helper.rb +1 -1
  145. data/app/helpers/decidim/layout_helper.rb +13 -0
  146. data/app/helpers/decidim/multi_translation_helper.rb +0 -0
  147. data/app/helpers/decidim/omniauth_helper.rb +9 -1
  148. data/app/helpers/decidim/pad_helper.rb +16 -0
  149. data/app/helpers/decidim/participatory_space_helpers.rb +15 -0
  150. data/app/helpers/decidim/searches_helper.rb +50 -6
  151. data/app/helpers/decidim/translations_helper.rb +3 -2
  152. data/app/jobs/decidim/email_notification_generator_job.rb +4 -2
  153. data/app/jobs/decidim/metric_job.rb +1 -1
  154. data/app/jobs/decidim/notification_generator_for_recipient_job.rb +2 -2
  155. data/app/jobs/decidim/notification_generator_job.rb +4 -2
  156. data/app/jobs/decidim/open_data_job.rb +16 -0
  157. data/app/mailers/decidim/messaging/conversation_mailer.rb +5 -2
  158. data/app/mailers/decidim/newsletter_mailer.rb +6 -2
  159. data/app/mailers/decidim/notification_mailer.rb +2 -2
  160. data/app/models/decidim/action_log.rb +7 -0
  161. data/app/models/decidim/amendment.rb +17 -0
  162. data/app/models/decidim/component.rb +8 -0
  163. data/app/models/decidim/contextual_help_section.rb +41 -0
  164. data/app/models/decidim/follow.rb +30 -0
  165. data/app/models/decidim/notification.rb +11 -1
  166. data/app/models/decidim/organization.rb +41 -0
  167. data/app/models/decidim/searchable_resource.rb +3 -0
  168. data/app/models/decidim/static_page.rb +11 -0
  169. data/app/models/decidim/static_page_topic.rb +12 -0
  170. data/app/models/decidim/user.rb +25 -2
  171. data/app/models/decidim/user_base_entity.rb +0 -6
  172. data/app/models/decidim/user_group.rb +29 -3
  173. data/app/permissions/decidim/permissions.rb +12 -0
  174. data/app/presenters/decidim/admin_log/organization_presenter.rb +13 -0
  175. data/app/presenters/decidim/admin_log/user_group_presenter.rb +1 -1
  176. data/app/presenters/decidim/admin_log/user_presenter.rb +1 -1
  177. data/app/presenters/decidim/hashtag_presenter.rb +7 -2
  178. data/app/presenters/decidim/metric_charts_presenter.rb +54 -21
  179. data/app/presenters/decidim/user_presenter.rb +4 -8
  180. data/app/queries/decidim/messaging/user_conversations.rb +1 -1
  181. data/app/queries/decidim/metric_manage.rb +16 -2
  182. data/app/queries/decidim/metric_measure.rb +35 -0
  183. data/app/queries/decidim/metrics/followers_metric_manage.rb +64 -0
  184. data/app/queries/decidim/metrics/participants_metric_manage.rb +72 -0
  185. data/app/queries/decidim/metrics/users_metric_manage.rb +1 -1
  186. data/app/queries/decidim/public_components.rb +32 -0
  187. data/app/resolvers/decidim/core/metric_resolver.rb +43 -11
  188. data/app/services/decidim/action_logger.rb +10 -0
  189. data/app/services/decidim/activity_search.rb +88 -13
  190. data/app/services/decidim/email_notification_generator.rb +23 -8
  191. data/app/services/decidim/events_manager.rb +9 -3
  192. data/app/services/decidim/home_activity_search.rb +80 -0
  193. data/app/services/decidim/log/diff_changeset_calculator.rb +3 -1
  194. data/app/services/decidim/notification_generator.rb +19 -7
  195. data/app/services/decidim/notification_generator_for_recipient.rb +6 -9
  196. data/app/services/decidim/open_data_exporter.rb +55 -0
  197. data/app/uploaders/decidim/open_data_uploader.rb +17 -0
  198. data/app/views/decidim/amendments/_form.html.erb +30 -0
  199. data/app/views/decidim/amendments/_review_form.html.erb +19 -0
  200. data/app/views/decidim/amendments/new.html.erb +29 -0
  201. data/app/views/decidim/amendments/review.html.erb +33 -0
  202. data/app/views/decidim/devise/registrations/new.html.erb +2 -2
  203. data/app/views/decidim/devise/sessions/new.html.erb +42 -29
  204. data/app/views/decidim/devise/shared/_links.html.erb +3 -3
  205. data/app/views/decidim/devise/shared/_omniauth_buttons.html.erb +7 -5
  206. data/app/views/decidim/follows/update_button.js.erb +1 -1
  207. data/app/views/decidim/group_members/index.html.erb +1 -1
  208. data/app/views/decidim/groups/_form.html.erb +9 -8
  209. data/app/views/decidim/groups/new.html.erb +3 -0
  210. data/app/views/decidim/{pages/home.html.erb → homepage/show.html.erb} +0 -0
  211. data/app/views/decidim/messaging/conversation_mailer/new_conversation.html.erb +6 -0
  212. data/app/views/decidim/messaging/conversation_mailer/new_message.html.erb +6 -0
  213. data/app/views/decidim/messaging/conversations/_message.html.erb +14 -0
  214. data/app/views/decidim/messaging/conversations/_reply.html.erb +11 -0
  215. data/app/views/decidim/messaging/conversations/_show.html.erb +21 -0
  216. data/app/views/decidim/messaging/conversations/_start.html.erb +12 -0
  217. data/app/views/decidim/messaging/conversations/create.js.erb +1 -1
  218. data/app/views/decidim/messaging/conversations/index.html.erb +51 -1
  219. data/app/views/decidim/messaging/conversations/new.html.erb +5 -1
  220. data/app/views/decidim/messaging/conversations/show.html.erb +9 -1
  221. data/app/views/decidim/messaging/conversations/update.js.erb +1 -1
  222. data/app/views/decidim/notification_mailer/event_received.html.erb +13 -3
  223. data/app/views/decidim/notifications/index.html.erb +5 -1
  224. data/app/views/decidim/notifications_settings/show.html.erb +19 -0
  225. data/app/views/decidim/pages/_standalone.html.erb +21 -0
  226. data/app/views/decidim/pages/_tabbed.html.erb +45 -0
  227. data/app/views/decidim/pages/index.html.erb +68 -29
  228. data/app/views/decidim/pages/show.html.erb +28 -0
  229. data/app/views/decidim/profiles/show.html.erb +1 -1
  230. data/app/views/decidim/searches/_count.html.erb +26 -1
  231. data/app/views/decidim/searches/_filters.html.erb +40 -17
  232. data/app/views/decidim/searches/index.html.erb +5 -16
  233. data/app/views/decidim/searches/index.js.erb +5 -3
  234. data/app/views/decidim/shared/_extended_navigation_bar.html.erb +50 -0
  235. data/app/views/decidim/shared/_floating_help.html.erb +30 -0
  236. data/app/views/decidim/shared/_follow_button.html.erb +1 -1
  237. data/app/views/decidim/shared/_login_modal.html.erb +35 -22
  238. data/app/views/decidim/shared/_results_per_page.html.erb +1 -1
  239. data/app/views/decidim/shared/_share_modal.html.erb +1 -1
  240. data/app/views/decidim/user_activities/index.html.erb +5 -0
  241. data/app/views/decidim/user_interests/_areas.html.erb +14 -0
  242. data/app/views/decidim/user_interests/_scopes.html.erb +15 -0
  243. data/app/views/decidim/user_interests/show.html.erb +12 -0
  244. data/app/views/decidim/user_timeline/index.html.erb +4 -0
  245. data/app/views/layouts/decidim/_user_menu.html.erb +1 -1
  246. data/app/views/layouts/decidim/_wrapper.html.erb +12 -5
  247. data/config/locales/ca.yml +199 -13
  248. data/config/locales/de.yml +200 -13
  249. data/config/locales/en.yml +200 -13
  250. data/config/locales/es-PY.yml +200 -13
  251. data/config/locales/es.yml +200 -13
  252. data/config/locales/eu.yml +200 -13
  253. data/config/locales/fi-pl.yml +200 -13
  254. data/config/locales/fi.yml +200 -13
  255. data/config/locales/fr.yml +200 -13
  256. data/config/locales/gl.yml +200 -13
  257. data/config/locales/hu.yml +200 -13
  258. data/config/locales/id-ID.yml +198 -13
  259. data/config/locales/it.yml +200 -13
  260. data/config/locales/nl.yml +200 -13
  261. data/config/locales/pl.yml +204 -13
  262. data/config/locales/pt-BR.yml +200 -13
  263. data/config/locales/pt.yml +200 -13
  264. data/config/locales/ru.yml +2 -16
  265. data/config/locales/sv.yml +200 -13
  266. data/config/locales/tr-TR.yml +200 -13
  267. data/config/locales/uk.yml +2 -16
  268. data/config/routes.rb +27 -1
  269. data/db/migrate/20171212103803_create_unique_nicknames.rb +1 -1
  270. data/db/migrate/20180221101934_fix_nickname_index.rb +1 -1
  271. data/db/migrate/20180706104107_add_nickname_to_managed_users.rb +1 -1
  272. data/db/migrate/20180720114847_create_decidim_amendments.rb +21 -0
  273. data/db/migrate/20181001124950_move_users_groups_to_users_table.rb +1 -1
  274. data/db/migrate/20181022090732_add_columns_to_pages.rb +20 -0
  275. data/db/migrate/20181023104416_add_static_page_topics.rb +15 -0
  276. data/db/migrate/20181025082245_add_timestamps_to_components.rb +12 -0
  277. data/db/migrate/20181029121244_add_welcome_notification.rb +13 -0
  278. data/db/migrate/20181108131058_add_users_registration_mode_to_organizations.rb +7 -0
  279. data/db/migrate/20181113101935_create_decidim_contextual_help_sections.rb +11 -0
  280. data/db/migrate/20181115102958_add_following_and_followers_counters_to_users.rb +26 -0
  281. data/db/migrate/20181119140636_add_columns_to_static_page_topic.rb +10 -0
  282. data/db/migrate/20181126145142_add_id_documents_fields_to_org.rb +13 -0
  283. data/db/migrate/20181204110723_remove_following_users_count_from_users.rb +17 -0
  284. data/db/migrate/20181211080834_add_scope_to_action_logs.rb +7 -0
  285. data/db/migrate/20181211090933_add_area_to_action_logs.rb +7 -0
  286. data/db/migrate/20181214101250_add_notification_types_to_users.rb +12 -0
  287. data/db/migrate/20181218171503_add_user_groups_switch_to_organizations.rb +8 -0
  288. data/db/seeds.rb +6 -1
  289. data/lib/decidim/amendable.rb +86 -0
  290. data/lib/decidim/api/component_interface.rb +4 -0
  291. data/lib/decidim/api/participatory_space_interface.rb +7 -0
  292. data/lib/decidim/api/scopable_interface.rb +1 -1
  293. data/lib/decidim/coauthorable.rb +16 -7
  294. data/lib/decidim/component_manifest.rb +3 -2
  295. data/lib/decidim/components/export_manifest.rb +13 -2
  296. data/lib/decidim/content_parsers/hashtag_parser.rb +48 -15
  297. data/lib/decidim/content_parsers/user_parser.rb +26 -10
  298. data/lib/decidim/content_renderers/hashtag_renderer.rb +46 -23
  299. data/lib/decidim/core.rb +40 -2
  300. data/lib/decidim/core/engine.rb +46 -12
  301. data/lib/decidim/core/test.rb +11 -0
  302. data/lib/decidim/core/test/factories.rb +44 -15
  303. data/lib/decidim/core/test/shared_examples/amendable/accept_amendment_examples.rb +57 -0
  304. data/lib/decidim/core/test/shared_examples/amendable/amendment_accepted_event_examples.rb +43 -0
  305. data/lib/decidim/core/test/shared_examples/amendable/amendment_created_event_examples.rb +48 -0
  306. data/lib/decidim/core/test/shared_examples/amendable/amendment_form_examples.rb +45 -0
  307. data/lib/decidim/core/test/shared_examples/amendable/amendment_promoted_event_examples.rb +43 -0
  308. data/lib/decidim/core/test/shared_examples/amendable/amendment_rejected_event_examples.rb +43 -0
  309. data/lib/decidim/core/test/shared_examples/amendable/create_amendment_examples.rb +78 -0
  310. data/lib/decidim/core/test/shared_examples/amendable/promote_amendment_examples.rb +43 -0
  311. data/lib/decidim/core/test/shared_examples/amendable/reject_amendment_examples.rb +41 -0
  312. data/lib/decidim/core/test/shared_examples/amendable/withdraw_amendment_examples.rb +29 -0
  313. data/lib/decidim/core/test/shared_examples/has_contextual_help.rb +30 -0
  314. data/lib/decidim/core/test/shared_examples/resourceable.rb +17 -0
  315. data/lib/decidim/core/test/shared_examples/searchable_results_examples.rb +1 -1
  316. data/lib/decidim/core/test/shared_examples/simple_event.rb +24 -2
  317. data/lib/decidim/core/version.rb +1 -1
  318. data/lib/decidim/events/base_event.rb +17 -12
  319. data/lib/decidim/events/simple_event.rb +21 -2
  320. data/lib/decidim/form_builder.rb +8 -0
  321. data/lib/decidim/gamification/badge_scorer.rb +3 -3
  322. data/lib/decidim/has_component.rb +1 -1
  323. data/lib/decidim/hashtag.rb +0 -2
  324. data/lib/decidim/hashtaggable.rb +2 -2
  325. data/lib/decidim/metric_manifest.rb +17 -2
  326. data/lib/decidim/metric_operation.rb +59 -0
  327. data/lib/decidim/metric_operation_manifest.rb +20 -0
  328. data/lib/decidim/metric_registry.rb +57 -19
  329. data/lib/decidim/paddable.rb +82 -0
  330. data/lib/decidim/participable.rb +24 -0
  331. data/lib/decidim/participatory_space_resourceable.rb +12 -0
  332. data/lib/decidim/query_extensions.rb +8 -1
  333. data/lib/decidim/resource_manifest.rb +5 -1
  334. data/lib/decidim/resourceable.rb +12 -0
  335. data/lib/decidim/searchable.rb +13 -4
  336. data/lib/decidim/settings_manifest.rb +2 -1
  337. data/lib/tasks/decidim_data_portability_tasks.rake +86 -0
  338. data/lib/tasks/decidim_open_data_tasks.rake +12 -0
  339. data/lib/tasks/decidim_tasks.rake +1 -83
  340. data/vendor/assets/javascripts/tribute.js +307 -145
  341. metadata +156 -22
  342. data/app/cells/decidim/conversation/show.erb +0 -18
  343. data/app/cells/decidim/conversation_cell.rb +0 -23
  344. data/app/cells/decidim/conversation_header/show.erb +0 -17
  345. data/app/cells/decidim/conversation_header_cell.rb +0 -16
  346. data/app/cells/decidim/conversations/show.erb +0 -45
  347. data/app/cells/decidim/conversations_cell.rb +0 -24
  348. data/app/cells/decidim/message/show.erb +0 -15
  349. data/app/cells/decidim/message_cell.rb +0 -23
  350. data/app/cells/decidim/new_conversation/show.erb +0 -19
  351. data/app/cells/decidim/new_conversation_cell.rb +0 -19
  352. data/app/views/decidim/pages/decidim_page.html.erb +0 -31
  353. data/app/views/decidim/searches/_results.html.erb +0 -5
  354. data/app/views/decidim/shared/_author_reference.html.erb +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2453a9bbdce8672d049e4c565544c3f809252f01710147d0792277a4a79bb650
4
- data.tar.gz: 3b37667ec67ef19011efc303778de6d39d2757c90b97d856cabac4028ea68a6a
3
+ metadata.gz: 931fb1b72ccd0a7d3563d338a988b082dc9bc26c13e462cd03a0c9c042d205d0
4
+ data.tar.gz: 89ab2b09df5a82b23cf40d3c69b2593eb7667d0642ad13ea1697fe39d12cdd89
5
5
  SHA512:
6
- metadata.gz: bad99139ead8606062236e98a45ee804971df92adc36af58ba8e4949d93bc2a806ebec7adbcd0e7fb074eba88e914ab4c4bd81531c890d29588ebea9f836c087
7
- data.tar.gz: 0d46adbf892ec04676869d7dc63bcf961bf3f7f56c864aac726e5dc97d11ce2778cde3456d7500a9d8df1444b27418d1c4d8c892ff41ee2b5995596af823f9a1
6
+ metadata.gz: fe29ab20d8a68e4afda789588568601bd4478947955e26ccc0328b4f51182933cd26002427b3588866f735d6740d0fbdaca981a95f17fdab0e2cd0c6e52700bc
7
+ data.tar.gz: 428f907b755d91de5f357f8443c9b0af42c734cf33abda5a0e0ee46548b39c8dca5941186ddc8a6aa071efe5df1771b41b10148c91d6bdda289dbd98793b596e
data/README.md CHANGED
@@ -20,6 +20,19 @@ And then execute:
20
20
  bundle
21
21
  ```
22
22
 
23
+ ## Amendments
24
+
25
+ Core implements an Amendment feature that can be activated in the components. As of now, it's only implemented in the proposal component.
26
+
27
+ This feature makes it possible for anyone to edit the text of an amendable resource and create a child resource as an amendment. This child resource may receive support and the author of the amendable resource may accept or reject the amendment (or child proposal). In case of rejection, the author of the rejected emendation may raise the child resource to an independent resource.
28
+
29
+ ### Key artifacts for Amendments
30
+
31
+ - `Amendable` module: A concern with the features needed when you want a model to be amendable.
32
+ - `Amendment` class: The ApplicationRecord that includes the polymorphic associations to make the model amendable.
33
+
34
+ Models that want to be amendable must include `Amendable` and declare an `amendable` configuration for the model.
35
+
23
36
  ## Global Search
24
37
 
25
38
  Core implements a Search Engine that indexes models from all modules globally.
@@ -29,7 +42,7 @@ This module also includes the following models to Decidim's Global Search:
29
42
 
30
43
  - `Users`
31
44
 
32
- ### Key artifacts
45
+ ### Key artifacts for Global Search
33
46
 
34
47
  - `Searchable` module: A concern with the features needed when you want a model to be searchable.
35
48
  - `SearchableResource` class: The ActiveRecord that finally includes PgSearch and maps the indexed documents into a model.
@@ -1,12 +1,14 @@
1
- //= link decidim/email.css
2
- //= link_directory ../fonts/decidim/
3
- //= link_tree ../images/decidim/
4
- //= link decidim/filters
5
- //= link decidim/orders
6
- //= link decidim/map.js
7
- //= link decidim/map.css
8
- //= link decidim/notifications.js
9
- //= link decidim/slug_form.js
10
- //= link_directory ../../../vendor/assets/javascripts/datepicker-locales
11
- //= link decidim/widget.js
12
- //= link decidim/impersonation.js
1
+ // = link decidim/email.css
2
+ // = link decidim/conference-diploma.css
3
+ // = link_directory ../fonts/decidim/
4
+ // = link_tree ../images/decidim/
5
+ // = link decidim/filters
6
+ // = link decidim/orders
7
+ // = link decidim/map.js
8
+ // = link decidim/map.css
9
+ // = link decidim/notifications.js
10
+ // = link decidim/slug_form.js
11
+ // = link_directory ../../../vendor/assets/javascripts/datepicker-locales
12
+ // = link decidim/widget.js
13
+ // = link decidim/impersonation.js
14
+ // = link decidim/floating_help.js
@@ -19,8 +19,12 @@
19
19
  // = require decidim/input_hashtags
20
20
  // = require decidim/ajax_modals
21
21
  // = require decidim/conferences
22
+ // = require decidim/tooltip_keep_on_hover
22
23
  // = require_tree ./decidim/vizzs
23
24
 
25
+ // = require_self
26
+ // = require decidim/floating_help
27
+
24
28
  /* globals svg4everybody */
25
29
 
26
30
  window.Decidim = window.Decidim || {};
@@ -0,0 +1,40 @@
1
+ $(function() {
2
+ if (!window.localStorage) {
3
+ return;
4
+ }
5
+
6
+ let getDismissedHelpers = () => {
7
+ let serialized = localStorage.getItem("dismissedHelpers");
8
+ if (!serialized) {
9
+ return [];
10
+ }
11
+
12
+ return serialized.split(",");
13
+ };
14
+
15
+ let addDismissedHelper = (id) => {
16
+ let dismissedHelpers = getDismissedHelpers();
17
+
18
+ if (!dismissedHelpers.includes(id)) {
19
+ localStorage.setItem(
20
+ "dismissedHelpers",
21
+ [...dismissedHelpers, id].join(",")
22
+ );
23
+ }
24
+ };
25
+
26
+ let dismissedHelpers = getDismissedHelpers();
27
+
28
+ $(".floating-helper-container").each((_index, elem) => {
29
+ let id = $(elem).data("help-id");
30
+
31
+ if (!dismissedHelpers.includes(id)) {
32
+ $(".floating-helper", elem).foundation("toggle");
33
+ $(".floating-helper__wrapper", elem).foundation("toggle");
34
+
35
+ $(".floating-helper", elem).on("off.zf.toggler", () => {
36
+ addDismissedHelper(id);
37
+ });
38
+ }
39
+ });
40
+ });
@@ -4,6 +4,11 @@ $(() => {
4
4
  const $hashtagContainer = $(".js-hashtags");
5
5
  const nodatafound = $hashtagContainer.attr("data-noresults");
6
6
 
7
+ let noMatchTemplate = null
8
+ if (nodatafound) {
9
+ noMatchTemplate = () => `<li>${nodatafound}</li>`;
10
+ }
11
+
7
12
  // Listener for the event triggered by quilljs
8
13
  let cursor = "";
9
14
  $hashtagContainer.on("quill-position", function(event) {
@@ -44,7 +49,7 @@ $(() => {
44
49
  positionMenu: true,
45
50
  menuContainer: null,
46
51
  fillAttr: "name",
47
- noMatchTemplate: () => `<li>${nodatafound}</li>`,
52
+ noMatchTemplate: noMatchTemplate,
48
53
  lookup: (item) => item.name,
49
54
  selectTemplate: function(item) {
50
55
  if (typeof item === "undefined") {
@@ -98,14 +103,11 @@ $(() => {
98
103
  });
99
104
  $hashtagContainer.on("input", (event) => {
100
105
  let $parent = $(event.target).parent();
101
- $parent.removeAttr("style");
102
106
 
103
107
  if (tribute.isActive) {
104
108
  // We need to move the container to the wrapper selected
105
109
  let $tribute = $(".tribute-container");
106
- $tribute.removeAttr("style");
107
110
  $tribute.appendTo($parent);
108
- // Remove the inline styles, relative to absolute positioning
109
111
  // Parent adaptation
110
112
  $parent.addClass("is-active");
111
113
  } else {
@@ -1,6 +1,6 @@
1
1
  $(() => {
2
2
  const $notificationsBellIcon = $(".title-bar .topbar__notifications");
3
- const $wrapper = $(".tabs-content");
3
+ const $wrapper = $(".wrapper");
4
4
  const $section = $wrapper.find("#notifications");
5
5
  const $noNotificationsText = $(".empty-notifications");
6
6
  const $pagination = $wrapper.find("ul.pagination");
@@ -0,0 +1,18 @@
1
+ /* eslint-disable no-invalid-this */
2
+
3
+ $(() => {
4
+
5
+ // Foundation requires plugins to be initializated
6
+ setTimeout(function() {
7
+
8
+ const $tooltips = $(".tooltip")
9
+
10
+ $tooltips.
11
+ on("mouseover", function() {
12
+ $(`[data-keep-on-hover='true'][data-toggle='${this.id}']`).foundation("show");
13
+ }).
14
+ on("mouseout", function() {
15
+ $(`[data-keep-on-hover='true'][data-toggle='${this.id}']`).foundation("hide");
16
+ })
17
+ }, 0);
18
+ });
@@ -1,5 +1,5 @@
1
1
  /* global d3 */
2
- /* eslint-disable id-length, no-unused-vars, multiline-ternary, no-ternary, no-nested-ternary, no-invalid-this */
2
+ /* eslint-disable id-length, no-undefined, no-unused-vars, multiline-ternary, no-ternary, no-nested-ternary, no-invalid-this */
3
3
  /* eslint prefer-reflect: ["error", { "exceptions": ["call"] }] */
4
4
  /* eslint dot-location: ["error", "property"] */
5
5
 
@@ -33,9 +33,9 @@ const areachart = (opts = {}) => {
33
33
  let objectName = opts.objectName || ""
34
34
  let container = d3.select(opts.container)
35
35
  let showAxis = opts.axis || false
36
- let ratio = opts.ratio || (4 / 3)
37
- let showTooltip = opts.tip !== "false"
38
- let cumulative = opts.cumulative || false
36
+ let ratio = (opts.ratio || "").split(":").reduce((a, b) => a / b) || (4 / 3)
37
+ let showTooltip = Object.is(opts.tip, undefined) ? true : opts.tip
38
+ let cumulative = opts.agg || false
39
39
 
40
40
  if (cumulative) {
41
41
  data = aggregate(data)
@@ -189,15 +189,57 @@ const areachart = (opts = {}) => {
189
189
  .attr("text-anchor", "start")
190
190
  .attr("transform", `translate(${titlePadding},${titlePadding})`)
191
191
 
192
- g.append("text")
193
- .attr("x", 0)
194
- .attr("y", 0)
195
- .attr("class", "title")
196
- .text(title)
192
+ let titleLines = 0
193
+
194
+ if (title.length) {
195
+ g.append("text")
196
+ .attr("x", 0)
197
+ .attr("y", 0)
198
+ .attr("class", "title")
199
+ .text(title)
200
+ .call(function(fulltext, wrapwidth, start = 0) {
201
+ fulltext.each(function() {
202
+ let text = d3.select(this)
203
+ let word = ""
204
+ let words = text.text().split(/\s+/).reverse()
205
+ let line = []
206
+ let lineNumber = 0
207
+ let lineHeight = 1.1
208
+ let _x = text.attr("x")
209
+ let _y = text.attr("y")
210
+ let dy = 0
211
+ let tspan = text.text(null)
212
+ .append("tspan")
213
+ .attr("x", _x)
214
+ .attr("y", _y)
215
+ .attr("dy", `${dy}em`)
216
+
217
+ /* eslint-disable no-cond-assign, no-plusplus */
218
+ while (word = words.pop()) {
219
+ line.push(word);
220
+ tspan.text(line.join(" "));
221
+ if (tspan.node().getComputedTextLength() > wrapwidth) {
222
+ line.pop()
223
+ tspan.text(line.join(" "))
224
+ line = [word]
225
+ tspan = text.append("tspan")
226
+ .attr("x", _x)
227
+ .attr("y", _y)
228
+ .attr("dy", `${(++lineNumber * lineHeight) + dy}em`)
229
+ .text(word);
230
+ }
231
+ }
232
+
233
+ titleLines = lineNumber * lineHeight
234
+ });
235
+ }, width - (titlePadding * 2))
236
+ }
237
+
238
+ let fontSize = parseFloat(getComputedStyle(g.node()).fontSize);
197
239
 
198
240
  g.append("text")
199
241
  .attr("x", 0)
200
- .attr("dy", titlePadding * 2)
242
+ .attr("dy", title.length ? (titlePadding * 2) + (titleLines * fontSize) : (titlePadding * 1.25))
201
243
  .attr("class", "sum")
202
244
  .text(data[data.length - 1].value.toLocaleString())
203
245
  }
@@ -1,36 +1,82 @@
1
+ /* eslint-disable no-console */
1
2
  /* global areachart */
2
3
 
4
+ const metricsData = {};
5
+
3
6
  $(() => {
4
- const query = (metrics) => {
5
- let metricsQuery = `metrics(names: [${metrics.join(" ")}]) { name history { key value } }`;
7
+
8
+ const metricsContainer = {};
9
+ const metricsParams = {};
10
+
11
+ const query = () => {
12
+ let metricsQuery = `metrics(names: [${metricsParams.names}], space_type: "${metricsParams.spaceType}", space_id: ${metricsParams.spaceId}) { name history { key value } }`;
6
13
  return {query: `{ ${metricsQuery} }`};
7
14
  }
8
15
 
9
- const fetch = (metrics) => $.post("api", query(metrics))
16
+ const parameterize = (metrics) => {
17
+ metricsParams.names = metrics.join(" ");
18
+ metricsParams.spaceType = $("#metrics #metrics-space_type").val() || null;
19
+ metricsParams.spaceId = $("#metrics #metrics-space_id").val() || null;
20
+ }
21
+
22
+ const fetch = (metrics) => $.post("/api", query(metrics));
10
23
 
11
- const metrics = {};
24
+ const downloadMetricData = (event) => {
25
+ event.preventDefault();
26
+ let metricName = $(event.target).parents(".metric-downloader").data("metric");
27
+ let csvContent = "data:text/csv;charset=utf-8,";
12
28
 
13
- $(".metric-chart:visible").each((index, container) => {
14
- metrics[$(container).data("metric")] = container;
29
+ csvContent += "key,value\r\n";
30
+ metricsData[metricName].forEach((metricData) => {
31
+ csvContent += `${metricData.key},${metricData.value}\r\n`;
32
+ });
33
+
34
+ // Required for FF
35
+ let link = document.createElement("a");
36
+ link.setAttribute("href", encodeURI(csvContent));
37
+ link.setAttribute("download", `${metricName}_metric_data.csv`);
38
+ document.body.appendChild(link);
39
+ link.click();
40
+ document.body.removeChild(link);
41
+ }
42
+
43
+ $(".metric-chart:visible").each((_index, container) => {
44
+ metricsContainer[$(container).data("metric")] = container;
45
+ });
46
+ $(".metric-downloader").each((_index, container) => {
47
+ container.onclick = downloadMetricData;
15
48
  });
16
49
 
17
- if (!$.isEmptyObject(metrics)) {
18
- fetch(Object.keys(metrics)).then((response) => {
19
- $.each(response.data.metrics, (_index, metricData) => {
20
- let container = metrics[metricData.name];
21
- if (metricData.history.length === 0) {
22
- $(container).remove();
23
- return;
24
- }
25
- let info = $(container).data("info");
26
-
27
- areachart({
28
- container: `#${container.id}`,
29
- data: metricData.history,
30
- title: info.title,
31
- objectName: info.object
50
+ if (!$.isEmptyObject(metricsContainer)) {
51
+ parameterize(Object.keys(metricsContainer))
52
+ fetch().then((response) => {
53
+ if (response.data) {
54
+ $.each(response.data.metrics, (_index, metricData) => {
55
+ let container = metricsContainer[metricData.name];
56
+ if (metricData.history.length === 0) {
57
+ $(container).remove();
58
+ return;
59
+ }
60
+ let info = $(container).data("info");
61
+ metricsData[metricData.name] = $.extend(true, [], metricData.history);
62
+ areachart({
63
+ container: `#${container.id}`,
64
+ data: metricData.history,
65
+ title: info.title,
66
+ objectName: info.object,
67
+ ...$(container).data()
68
+ });
69
+ });
70
+ } else if (response.errors) {
71
+ console.log("Something wrong happened when fetching metrics:");
72
+ $.each(response.errors, (_index, error) => {
73
+ console.log(error.message);
32
74
  });
33
- });
75
+ $("#metrics").remove();
76
+ }
77
+ }).fail((err) => {
78
+ console.log(`Something wrong happened when fetching metrics: ${err.statusText}`);
79
+ $("#metrics").remove();
34
80
  });
35
81
  }
36
82
  });
@@ -40,6 +40,7 @@
40
40
  fakeRoot: false,
41
41
  nodeGutter: { x: 16, y: 8 },
42
42
  childrenIndicatorRadius: 15,
43
+ fakeBorderWidth: 32,
43
44
  data: null
44
45
  }
45
46
 
@@ -98,7 +99,7 @@
98
99
  let fakeRadius = (diagonal / 2)
99
100
 
100
101
  // return d3.max([attrs.nodeDistance * 3, fakeRadius])
101
- return fakeRadius * 1.2
102
+ return fakeRadius * 1.5
102
103
  })
103
104
 
104
105
  // manually set x positions (which is calculated using custom radial layout)
@@ -305,23 +306,19 @@
305
306
 
306
307
  // tick handler
307
308
  function ticked() {
309
+ const fakeBorderWidth = attrs.fakeBorderWidth
310
+ const maxXValueAvailable = (value) => Math.max(Math.min(calc.chartWidth - fakeBorderWidth, value), fakeBorderWidth)
311
+ const maxYValueAvailable = (value) => Math.max(Math.min(calc.chartHeight - fakeBorderWidth, value), fakeBorderWidth)
308
312
  // set links position
309
313
  links
310
- .attr("x1", function (d) { return d.source.x; })
311
- .attr("y1", function (d) { return d.source.y; })
312
- .attr("x2", function (d) { return d.target.x; })
313
- .attr("y2", function (d) { return d.target.y; })
314
+ .attr("x1", (d) => maxXValueAvailable(d.source.x))
315
+ .attr("y1", (d) => maxYValueAvailable(d.source.y))
316
+ .attr("x2", (d) => maxXValueAvailable(d.target.x))
317
+ .attr("y2", (d) => maxYValueAvailable(d.target.y))
314
318
 
315
319
  // set nodes position
316
320
  svg.selectAll(".node")
317
- .attr("transform", (d) => {
318
- let bounds = {
319
- x: Math.max(Math.min(calc.chartWidth, d.x), 0),
320
- y: Math.max(Math.min(calc.chartHeight, d.y), 0)
321
- }
322
-
323
- return `translate(${bounds.x},${bounds.y})`
324
- })
321
+ .attr("transform", (d) => `translate(${maxXValueAvailable(d.x)},${maxYValueAvailable(d.y)})`)
325
322
  }
326
323
 
327
324
  // handler drag start event
@@ -0,0 +1,61 @@
1
+ .conference-diploma{
2
+ text-align: center;
3
+ }
4
+
5
+ .conference-diploma .diploma__border{
6
+ margin: 4rem;
7
+
8
+ /* Border pattern */
9
+ -moz-border-image: image-url("decidim/pattern.png") 20 repeat;
10
+ -webkit-border-image: image-url("decidim/pattern.png") 20 repeat;
11
+ -o-border-image: image-url("decidim/pattern.png") 20 repeat;
12
+ border-image: image-url("decidim/pattern.png") 20 repeat;
13
+ border-style: solid;
14
+ border-width: 1rem;
15
+ }
16
+
17
+ .conference-diploma .diploma__border .diploma__content{
18
+ padding: 3rem;
19
+ }
20
+
21
+ .conference-diploma .diploma__attendance{
22
+ text-align: center;
23
+ font-size: rem-calc(14);
24
+ }
25
+
26
+ .conference-diploma .diploma__attendance > *{
27
+ display: block;
28
+ }
29
+
30
+ .conference-diploma .diploma__name{
31
+ margin-top: 4rem;
32
+ font-size: rem-calc(18);
33
+ }
34
+
35
+ .conference-diploma .diploma__name p{
36
+ margin-top: 1rem;
37
+ }
38
+
39
+ .conference-diploma .diploma__logo{
40
+ border: 1px solid #333;
41
+ padding: 2rem;
42
+ }
43
+
44
+ @media print{
45
+ @page{
46
+ size: A4 landscape;
47
+ max-height: 100%;
48
+ max-width: 100%;
49
+ margin: 0;
50
+ }
51
+
52
+ .conference-diploma .diploma__border{
53
+ margin: 0;
54
+ -moz-border-image: image-url("decidim/pattern.png") 20 repeat;
55
+ -webkit-border-image: image-url("decidim/pattern.png") 20 repeat;
56
+ -o-border-image: image-url("decidim/pattern.png") 20 repeat;
57
+ border-image: image-url("decidim/pattern.png") 20 repeat;
58
+ border-style: solid;
59
+ border-width: 1rem;
60
+ }
61
+ }