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
@@ -13,6 +13,7 @@ module Decidim
13
13
  attribute :tos_agreement, Boolean
14
14
  attribute :oauth_signature, String
15
15
  attribute :avatar_url, String
16
+ attribute :raw_data, Hash
16
17
 
17
18
  validates :email, presence: true
18
19
  validates :name, presence: true
@@ -24,7 +25,7 @@ module Decidim
24
25
  end
25
26
 
26
27
  def normalized_nickname
27
- User.nicknamize(nickname || name, organization: current_organization)
28
+ UserBaseEntity.nicknamize(nickname || name, organization: current_organization)
28
29
  end
29
30
  end
30
31
  end
@@ -16,8 +16,6 @@ module Decidim
16
16
  validates :name, presence: true
17
17
  validates :email, presence: true, 'valid_email_2/email': { disposable: true }
18
18
  validates :nickname, presence: true
19
- validates :document_number, presence: true
20
- validates :phone, presence: true
21
19
 
22
20
  validates :nickname, length: { maximum: Decidim::User.nickname_max_length, allow_blank: true }
23
21
  validates :avatar, file_size: { less_than_or_equal_to: ->(_record) { Decidim.maximum_avatar_size } }
@@ -30,6 +28,7 @@ module Decidim
30
28
  private
31
29
 
32
30
  def unique_document_number
31
+ return if document_number.blank?
33
32
  errors.add :document_number, :taken if UserGroup
34
33
  .with_document_number(
35
34
  context.current_organization,
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # The form object that handles the data behind updating a user's
5
+ # interests in her profile page.
6
+ class UserInterestScopeForm < Form
7
+ mimic :scope
8
+
9
+ attribute :name, String
10
+ attribute :checked, Boolean
11
+ attribute :children, Array[UserInterestScopeForm]
12
+
13
+ def map_model(model_hash)
14
+ scope = model_hash[:scope]
15
+ user = model_hash[:user]
16
+
17
+ self.id = scope.id
18
+ self.name = scope.name
19
+ self.checked = user.interested_scopes_ids.include?(scope.id)
20
+ self.children = scope.children.map do |children_scope|
21
+ UserInterestScopeForm.from_model(scope: children_scope, user: user)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # The form object that handles the data behind updating a user's
5
+ # interests in her profile page.
6
+ class UserInterestsForm < Form
7
+ mimic :user
8
+
9
+ attribute :scopes, Array[UserInterestScopeForm]
10
+
11
+ def newsletter_notifications_at
12
+ return nil unless newsletter_notifications
13
+ Time.current
14
+ end
15
+
16
+ def map_model(user)
17
+ self.scopes = user.organization.scopes.top_level.map do |scope|
18
+ UserInterestScopeForm.from_model(scope: scope, user: user)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,130 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # A Helper to render and link amendments to resources.
5
+ module AmendmentsHelper
6
+ def amendments_enabled?
7
+ current_component.settings.amendments_enabled
8
+ end
9
+
10
+ def amend_button_for(amendable)
11
+ cell "decidim/amendable/amend_button_card", amendable if amendable.amendable?
12
+ end
13
+
14
+ # Renders the emendations of a amendable resource that includes the
15
+ # Amendable concern.
16
+ #
17
+ # amendable - The resource that has emendations.
18
+ #
19
+ # Returns Html grid of CardM.
20
+ def amendments_for(amendable)
21
+ return unless amendments_enabled? && amendable.emendations.count
22
+ return if amendable.emendation?
23
+ content = content_tag :h2, class: "section-heading", id: "amendments" do
24
+ t("section_heading", scope: "decidim.amendments.amendable", count: amendable.emendations.count)
25
+ end
26
+
27
+ content += if amendable.emendations.count.positive?
28
+ cell(
29
+ "decidim/collapsible_list",
30
+ amendable.emendations,
31
+ cell_options: { context: { current_user: current_user } },
32
+ list_class: "row small-up-1 medium-up-2 card-grid",
33
+ size: 4
34
+ ).to_s
35
+ else
36
+ t("no_amendments", scope: "decidim.amendments.amendable", count: amendable.emendations.count)
37
+ end
38
+
39
+ content_tag :div, content.html_safe, class: "section"
40
+ end
41
+
42
+ def amenders_for(amendable)
43
+ amendable.amendments.map { |amendment| present(amendment.amender) }.uniq
44
+ end
45
+
46
+ def amenders_list_for(amendable)
47
+ cell "decidim/amendable/amenders_list", amenders_for(amendable), context: { current_user: current_user } if amendable.amendable?
48
+ end
49
+
50
+ # Renders the state of an emendation
51
+ #
52
+ # emendation - The resource that is an emendation.
53
+ #
54
+ # Returns Html callout.
55
+ def emendation_announcement_for(emendation)
56
+ cell "decidim/amendable/announcement", emendation if emendation.emendation?
57
+ end
58
+
59
+ # Returns Html action button cards: accept/reject or promote
60
+ #
61
+ # emendation - The resource that is an emendation.
62
+ def emendation_actions_for(emendation)
63
+ return unless allowed_to_react_to_emendation?(emendation)
64
+ return accept_and_reject_buttons_for(emendation) if allowed_to_accept_and_reject?(emendation)
65
+ return promote_button_for(emendation) if allowed_to_promote?(emendation)
66
+ end
67
+
68
+ # Renders the buttons to accept/reject an emendation
69
+ def accept_and_reject_buttons_for(emendation)
70
+ cell("decidim/amendable/emendation_actions", emendation)
71
+ end
72
+
73
+ # Renders the button to promote an emendation
74
+ def promote_button_for(emendation)
75
+ cell("decidim/amendable/promote_button_card", emendation)
76
+ end
77
+
78
+ # Checks if current_user can react to the emendation
79
+ #
80
+ # Returns true or false
81
+ def allowed_to_react_to_emendation?(emendation)
82
+ return unless emendation.emendation?
83
+ return unless current_user
84
+ true
85
+ end
86
+
87
+ # Checks if current_user can accept and reject the emendation
88
+ #
89
+ # Returns true or false
90
+ def allowed_to_accept_and_reject?(emendation)
91
+ return unless emendation.amendment.evaluating?
92
+ emendation.amendable.created_by?(current_user) || current_user.admin
93
+ end
94
+
95
+ # Checks if current_user can promote the emendation
96
+ #
97
+ # Returns true or false
98
+ def allowed_to_promote?(emendation)
99
+ return unless emendation.state == "rejected"
100
+ return unless emendation.created_by?(current_user)
101
+ not_yet_promoted(emendation)
102
+ end
103
+
104
+ # Checks whether the ActionLog created in the promote command exists.
105
+ #
106
+ # Returns true or false
107
+ def not_yet_promoted(emendation)
108
+ logs = Decidim::ActionLog.where(decidim_component_id: emendation.component)
109
+ .where(decidim_user_id: emendation.creator_author)
110
+ .where(action: "promote")
111
+ logs.select { |l| l.extra["promoted_from"] == emendation.id }.empty?
112
+ end
113
+
114
+ def user_group_select_field(form, name)
115
+ selected = @form.user_group_id.presence
116
+ form.select(
117
+ name,
118
+ current_user.user_groups.verified.map { |g| [g.name, g.id] },
119
+ selected: selected,
120
+ include_blank: current_user.name,
121
+ label: t("new.amendment_author", scope: "decidim.amendments")
122
+ )
123
+ end
124
+
125
+ def emendation_ignored_field_value(key)
126
+ 0 if @form.emendation_type.constantize.columns_hash[key.to_s].type == :integer
127
+ nil if key == :id
128
+ end
129
+ end
130
+ end
@@ -5,6 +5,8 @@ module Decidim
5
5
  module ApplicationHelper
6
6
  include Decidim::OmniauthHelper
7
7
  include Decidim::ScopesHelper
8
+ include Decidim::ContextualHelpHelper
9
+ include Decidim::AmendmentsHelper
8
10
 
9
11
  # Truncates a given text respecting its HTML tags.
10
12
  #
@@ -25,8 +27,9 @@ module Decidim
25
27
  Truncato.truncate(text, options)
26
28
  end
27
29
 
28
- def present(object)
29
- presenter = "#{object.class.name}Presenter".constantize.new(object)
30
+ def present(object, presenter_class: nil)
31
+ presenter_class ||= "#{object.class.name}Presenter".constantize
32
+ presenter = presenter_class.new(object)
30
33
 
31
34
  yield(presenter) if block_given?
32
35
 
@@ -50,5 +53,19 @@ module Decidim
50
53
 
51
54
  content_for(:edit_link, link)
52
55
  end
56
+
57
+ # Public: Overwrites the `cell` helper method to automatically set some
58
+ # common context.
59
+ #
60
+ # name - the name of the cell to render
61
+ # model - the cell model
62
+ # options - a Hash with options
63
+ #
64
+ # Renders the cell contents.
65
+ def cell(name, model, options = {}, &block)
66
+ options = { context: { current_user: current_user } }.deep_merge(options)
67
+
68
+ super(name, model, options, &block)
69
+ end
53
70
  end
54
71
  end
@@ -10,8 +10,6 @@ module Decidim
10
10
  #
11
11
  # Returns an HTML.
12
12
  def card_for(model, options = {})
13
- options = { context: { current_user: current_user } }.deep_merge(options)
14
-
15
13
  cell "decidim/card", model, options
16
14
  end
17
15
  end
@@ -12,5 +12,9 @@ module Decidim
12
12
  options = options.reverse_merge(views_prefix: "../views/")
13
13
  super
14
14
  end
15
+
16
+ def per_page
17
+ params[:per_page] || Decidim::Paginable::OPTIONS.first
18
+ end
15
19
  end
16
20
  end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # Helper to print layout elements for the different help elements available on the pages.
5
+ module ContextualHelpHelper
6
+ def floating_help(id, &block)
7
+ render partial: "decidim/shared/floating_help", locals: { content: capture(&block), id: id }
8
+ end
9
+ end
10
+ end
@@ -19,8 +19,10 @@ module Decidim
19
19
  decidim_participatory_processes.participatory_processes_path
20
20
  elsif current_user
21
21
  decidim.account_path
22
- else
22
+ elsif current_organization.sign_up_enabled?
23
23
  decidim.new_user_registration_path
24
+ else
25
+ decidim.new_user_session_path
24
26
  end
25
27
  end
26
28
  end
@@ -103,7 +103,7 @@ module Decidim
103
103
  return safe_join [field_label, field_input]
104
104
  end
105
105
 
106
- tabs_id = options[:tabs_id] || "#{object_name}-#{name}-tabs"
106
+ tabs_id = options[:tabs_id] || "#{object_name}-#{name}-tabs".underscore
107
107
  enabled_tabs = options[:enable_tabs].nil? ? true : options[:enable_tabs]
108
108
  tabs_panels_data = enabled_tabs ? { tabs: true } : {}
109
109
 
@@ -66,5 +66,18 @@ module Decidim
66
66
  classes += [options[:class]]
67
67
  classes.compact
68
68
  end
69
+
70
+ def extended_navigation_bar(items, max_items: 5)
71
+ return unless items.any?
72
+ extra_items = items.slice((max_items + 1)..-1) || []
73
+ active_item = items.find { |item| item[:active] }
74
+
75
+ render partial: "decidim/shared/extended_navigation_bar", locals: {
76
+ items: items,
77
+ extra_items: extra_items,
78
+ active_item: active_item,
79
+ max_items: max_items
80
+ }
81
+ end
69
82
  end
70
83
  end
@@ -23,8 +23,16 @@ module Decidim
23
23
 
24
24
  # Public: icon for omniauth buttons
25
25
  def oauth_icon(provider)
26
- name = provider == :developer ? "phone" : normalize_provider_name(provider)
26
+ info = Rails.application.secrets.dig(:omniauth, provider.to_sym)
27
27
 
28
+ if info
29
+ icon_path = info[:icon_path]
30
+ return external_icon(icon_path) if icon_path
31
+
32
+ name = info[:icon]
33
+ end
34
+
35
+ name ||= normalize_provider_name(provider)
28
36
  icon(name)
29
37
  end
30
38
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # A Helper to render an Etherpad iframe.
5
+ module PadHelper
6
+ # Renders an iframe with the pad of a model that includes the
7
+ # Paddable concern.
8
+ #
9
+ # paddable - The model to render the pad from.
10
+ #
11
+ # Returns nothing.
12
+ def pad_iframe_for(paddable)
13
+ cell "decidim/pad_iframe", paddable
14
+ end
15
+ end
16
+ end
@@ -26,5 +26,20 @@ module Decidim
26
26
 
27
27
  @participatory_space_helpers = klass.new(self)
28
28
  end
29
+
30
+ def participatory_space_floating_help
31
+ return if help_section.blank?
32
+
33
+ content_tag "div", class: "row collapse" do
34
+ floating_help(help_id) { translated_attribute(help_section).html_safe }
35
+ end
36
+ end
37
+
38
+ def participatory_space_wrapper(&block)
39
+ content_tag :main, class: "wrapper" do
40
+ concat(participatory_space_floating_help)
41
+ concat(capture(&block))
42
+ end
43
+ end
29
44
  end
30
45
  end
@@ -3,15 +3,59 @@
3
3
  module Decidim
4
4
  # A Helper to render and link to searchables.
5
5
  module SearchesHelper
6
- # @param count: (optional) the number of resources so that the I18n backend can decide to translate into singluar or plural form.
7
- def searchable_resource_human_name(resource, count: 1)
6
+ # Renders the human name of the given class name.
7
+ #
8
+ # klass_name - a String representing the class name of the resource to render
9
+ # count - (optional) the number of resources so that the I18n backend
10
+ # can decide to translate into singluar or plural form.
11
+ def searchable_resource_human_name(resource, count: 5)
12
+ resource = if resource.is_a?(String)
13
+ resource.constantize
14
+ else
15
+ resource
16
+ end
17
+
8
18
  resource.model_name.human(count: count)
9
19
  end
10
20
 
11
- def searchable_resources_as_options(all_label)
12
- [["", all_label]] + Decidim::Searchable.searchable_resources.values.collect do |r|
13
- [r.name, searchable_resource_human_name(r, count: 2)]
14
- end.sort
21
+ # Generates a link to filter the current search by the given type. If no
22
+ # type is given, it generates a link to the main results page.
23
+ #
24
+ # resource_type - An optional String with the name of the model class to filter
25
+ # space_state - An optional String with the name of the state of the space
26
+ def search_path_by(resource_type: nil, space_state: nil)
27
+ new_params = {
28
+ utf8: params[:utf8],
29
+ filter: {
30
+ decidim_scope_id: params.dig(:filter, :decidim_scope_id),
31
+ term: params[:term] || params.dig(:filter, :term)
32
+ }
33
+ }
34
+ new_params[:filter][:resource_type] = resource_type if resource_type.present?
35
+ new_params[:filter][:space_state] = space_state if space_state.present?
36
+ decidim.search_path(new_params)
37
+ end
38
+
39
+ # Generates the path to the main results page (the one without any filter
40
+ # active), only the `term` one.
41
+ def main_search_path
42
+ search_path_by
43
+ end
44
+
45
+ # Generates the path to filter by resource type, considering the other filters.
46
+ def search_path_by_resource_type(resource_type)
47
+ search_path_by(space_state: params.dig(:filter, :space_state), resource_type: resource_type)
48
+ end
49
+
50
+ # Generates the path and link to filter by space state, taking into account
51
+ # the other filters applied.
52
+ def search_path_by_state_link(state)
53
+ path = search_path_by(resource_type: params.dig(:filter, :resource_type), space_state: state)
54
+ is_active = params.dig(:filter, :space_state).to_s == state.to_s
55
+
56
+ link_to path, class: "order-by__tab#{" is-active" if is_active}" do
57
+ content_tag(:strong, t(state || :all, scope: "decidim.searches.filters.state"))
58
+ end
15
59
  end
16
60
  end
17
61
  end