decidim-admin 0.20.0 → 0.23.1.rc1

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

Potentially problematic release.


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

Files changed (221) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -0
  3. data/app/assets/javascripts/decidim/admin/application.js.es6 +8 -0
  4. data/app/assets/javascripts/decidim/admin/budget_rule_toggler.component.js.es6 +52 -0
  5. data/app/assets/javascripts/decidim/admin/bundle.js +26 -32
  6. data/app/assets/javascripts/decidim/admin/bundle.js.map +1 -1
  7. data/app/assets/javascripts/decidim/admin/choose_language.js +12 -0
  8. data/app/assets/javascripts/decidim/admin/dynamic_fields.component.js.es6 +24 -5
  9. data/app/assets/javascripts/decidim/admin/form.js.es6 +24 -10
  10. data/app/assets/javascripts/decidim/admin/gallery.js.es6 +5 -0
  11. data/app/assets/javascripts/decidim/admin/newsletters.js.es6 +12 -0
  12. data/app/assets/javascripts/decidim/admin/officializations.js.es6 +20 -0
  13. data/app/assets/javascripts/decidim/admin/scope_picker_enabler.component.js.es6 +14 -0
  14. data/app/assets/stylesheets/decidim/admin/_decidim.scss +2 -0
  15. data/app/assets/stylesheets/decidim/admin/_variables.scss +2 -2
  16. data/app/assets/stylesheets/decidim/admin/extra/_action-icon.scss +6 -0
  17. data/app/assets/stylesheets/decidim/admin/extra/_cards.scss +11 -0
  18. data/app/assets/stylesheets/decidim/admin/extra/_newsletter-templates-gallery.scss +3 -0
  19. data/app/assets/stylesheets/decidim/admin/extra/_organization-appearance.scss +141 -0
  20. data/app/assets/stylesheets/decidim/admin/extra/_show_email.scss +31 -0
  21. data/app/assets/stylesheets/decidim/admin/extra/_title_bar.scss +4 -0
  22. data/app/assets/stylesheets/decidim/admin/modules/_buttons.scss +15 -1
  23. data/app/assets/stylesheets/decidim/admin/modules/_callouts.scss +11 -0
  24. data/app/assets/stylesheets/decidim/admin/modules/_cards.scss +13 -2
  25. data/app/assets/stylesheets/decidim/admin/modules/_filters.scss +78 -1
  26. data/app/assets/stylesheets/decidim/admin/modules/_forms.scss +16 -2
  27. data/app/assets/stylesheets/decidim/admin/modules/_import_result.scss +10 -0
  28. data/app/assets/stylesheets/decidim/admin/modules/_layout.scss +1 -1
  29. data/app/assets/stylesheets/decidim/admin/modules/_loading-spinner.scss +19 -0
  30. data/app/assets/stylesheets/decidim/admin/modules/_main-nav.scss +0 -1
  31. data/app/assets/stylesheets/decidim/admin/modules/_modules.scss +5 -1
  32. data/app/assets/stylesheets/decidim/admin/modules/_process-header.scss +0 -1
  33. data/app/assets/stylesheets/decidim/admin/modules/_secondary-nav.scss +5 -2
  34. data/app/assets/stylesheets/decidim/admin/modules/_table-list.scss +23 -7
  35. data/app/assets/stylesheets/decidim/admin/modules/_tabs.scss +7 -0
  36. data/app/assets/stylesheets/decidim/admin/modules/_users_statistics.scss +18 -0
  37. data/app/assets/stylesheets/decidim/admin/utils/_mixins.scss +42 -0
  38. data/app/assets/stylesheets/decidim/admin/utils/_settings.scss +4 -1
  39. data/app/cells/decidim/admin/content_block/show.erb +2 -2
  40. data/app/cells/decidim/admin/results_per_page/show.erb +16 -0
  41. data/app/cells/decidim/admin/results_per_page_cell.rb +14 -0
  42. data/app/commands/decidim/admin/create_attachment.rb +2 -2
  43. data/app/commands/decidim/admin/create_newsletter.rb +34 -9
  44. data/app/commands/decidim/admin/deliver_newsletter.rb +1 -1
  45. data/app/commands/decidim/admin/destroy_share_token.rb +46 -0
  46. data/app/commands/decidim/admin/reorder_content_blocks.rb +1 -1
  47. data/app/commands/decidim/admin/update_component.rb +27 -3
  48. data/app/commands/decidim/admin/update_content_block.rb +25 -1
  49. data/app/commands/decidim/admin/update_newsletter.rb +31 -9
  50. data/app/commands/decidim/admin/update_organization.rb +15 -1
  51. data/app/commands/decidim/admin/update_organization_appearance.rb +3 -1
  52. data/app/controllers/concerns/decidim/admin/filterable.rb +152 -0
  53. data/app/controllers/concerns/decidim/admin/officializations/filterable.rb +31 -0
  54. data/app/controllers/concerns/decidim/admin/paginable.rb +20 -0
  55. data/app/controllers/concerns/decidim/admin/participatory_space_export.rb +8 -2
  56. data/app/controllers/decidim/admin/admin_terms_controller.rb +20 -0
  57. data/app/controllers/decidim/admin/application_controller.rb +3 -0
  58. data/app/controllers/decidim/admin/authorization_workflows_controller.rb +6 -0
  59. data/app/controllers/decidim/admin/components/base_controller.rb +5 -1
  60. data/app/controllers/decidim/admin/components_controller.rb +30 -23
  61. data/app/controllers/decidim/admin/concerns/has_private_users.rb +4 -0
  62. data/app/controllers/decidim/admin/dashboard_controller.rb +33 -1
  63. data/app/controllers/decidim/admin/metrics_controller.rb +22 -0
  64. data/app/controllers/decidim/admin/newsletter_templates_controller.rb +41 -0
  65. data/app/controllers/decidim/admin/newsletters_controller.rb +43 -4
  66. data/app/controllers/decidim/admin/officializations_controller.rb +15 -6
  67. data/app/controllers/decidim/admin/organization_appearance_controller.rb +1 -0
  68. data/app/controllers/decidim/admin/organization_controller.rb +4 -3
  69. data/app/controllers/decidim/admin/organization_homepage_content_blocks_controller.rb +2 -1
  70. data/app/controllers/decidim/admin/share_tokens_controller.rb +30 -0
  71. data/app/forms/decidim/admin/attachment_form.rb +3 -0
  72. data/app/forms/decidim/admin/component_form.rb +5 -22
  73. data/app/forms/decidim/admin/newsletter_form.rb +15 -3
  74. data/app/forms/decidim/admin/organization_appearance_form.rb +7 -4
  75. data/app/forms/decidim/admin/organization_form.rb +27 -0
  76. data/app/forms/decidim/admin/participatory_space_private_user_csv_import_form.rb +14 -0
  77. data/app/forms/decidim/admin/participatory_space_private_user_form.rb +8 -2
  78. data/app/frontend/components/autocomplete.component.test.tsx +2 -1
  79. data/app/frontend/components/autocomplete.component.tsx +29 -0
  80. data/app/helpers/decidim/admin/admin_terms_helper.rb +47 -0
  81. data/app/helpers/decidim/admin/application_helper.rb +2 -0
  82. data/app/helpers/decidim/admin/dashboard_helper.rb +25 -0
  83. data/app/helpers/decidim/admin/filterable_helper.rb +129 -0
  84. data/app/helpers/decidim/admin/icon_link_helper.rb +1 -1
  85. data/app/helpers/decidim/admin/newsletters_helper.rb +20 -0
  86. data/app/helpers/decidim/admin/paginable/per_page_helper.rb +22 -0
  87. data/app/helpers/decidim/admin/resource_scope_helper.rb +43 -0
  88. data/app/helpers/decidim/admin/scopes_helper.rb +6 -0
  89. data/app/helpers/decidim/admin/settings_helper.rb +56 -47
  90. data/app/helpers/decidim/admin/uploader_image_dimensions_helper.rb +30 -0
  91. data/app/helpers/decidim/admin/user_roles_helper.rb +19 -0
  92. data/app/models/decidim/admin/fake_newsletter.rb +49 -0
  93. data/app/permissions/decidim/admin/permissions.rb +30 -7
  94. data/app/presenters/decidim/admin/dashboard_metric_charts_presenter.rb +57 -0
  95. data/app/queries/decidim/admin/active_users_counter.rb +35 -0
  96. data/app/queries/decidim/admin/newsletter_recipients.rb +20 -9
  97. data/app/views/decidim/admin/admin_terms/show.html.erb +26 -0
  98. data/app/views/decidim/admin/attachment_collections/index.html.erb +1 -1
  99. data/app/views/decidim/admin/authorization_workflows/index.html.erb +1 -0
  100. data/app/views/decidim/admin/categories/index.html.erb +1 -1
  101. data/app/views/decidim/admin/components/_component.html.erb +40 -33
  102. data/app/views/decidim/admin/components/_form.html.erb +4 -0
  103. data/app/views/decidim/admin/components/_settings_fields.html.erb +2 -2
  104. data/app/views/decidim/admin/components/index.html.erb +11 -8
  105. data/app/views/decidim/admin/dashboard/show.html.erb +49 -9
  106. data/app/views/decidim/admin/exports/_dropdown.html.erb +6 -2
  107. data/app/views/decidim/admin/impersonatable_users/index.html.erb +2 -2
  108. data/app/views/decidim/admin/metrics/_metrics.html.erb +21 -0
  109. data/app/views/decidim/admin/metrics/index.html.erb +7 -0
  110. data/app/views/decidim/admin/newsletter_templates/index.html.erb +28 -0
  111. data/app/views/decidim/admin/newsletter_templates/show.html.erb +12 -0
  112. data/app/views/decidim/admin/newsletters/_form.html.erb +1 -7
  113. data/app/views/decidim/admin/newsletters/edit.html.erb +1 -1
  114. data/app/views/decidim/admin/newsletters/index.html.erb +9 -3
  115. data/app/views/decidim/admin/newsletters/new.html.erb +1 -1
  116. data/app/views/decidim/admin/newsletters/select_recipients_to_deliver.html.erb +4 -4
  117. data/app/views/decidim/admin/officializations/_show_email_modal.html.erb +31 -0
  118. data/app/views/decidim/admin/officializations/index.html.erb +9 -41
  119. data/app/views/decidim/admin/officializations/show_email.html.erb +2 -0
  120. data/app/views/decidim/admin/organization/_form.html.erb +37 -0
  121. data/app/views/decidim/admin/organization_appearance/_form.html.erb +2 -72
  122. data/app/views/decidim/admin/organization_appearance/form/_colors.html.erb +23 -0
  123. data/app/views/decidim/admin/organization_appearance/form/_images.html.erb +38 -0
  124. data/app/views/decidim/admin/organization_appearance/form/_minimap.html.erb +46 -0
  125. data/app/views/decidim/admin/resource_permissions/_options_form.html.erb +1 -1
  126. data/app/views/decidim/admin/share_tokens/_share_tokens.html.erb +57 -0
  127. data/app/views/decidim/admin/shared/_filters.html.erb +40 -0
  128. data/app/views/decidim/admin/shared/_gallery.html.erb +21 -0
  129. data/app/views/decidim/admin/static_pages/_form.html.erb +1 -1
  130. data/app/views/decidim/admin/user_groups/index.html.erb +4 -4
  131. data/app/views/decidim/admin/users_statistics/_users_count.html.erb +39 -0
  132. data/app/views/layouts/decidim/admin/_application.html.erb +2 -1
  133. data/app/views/layouts/decidim/admin/_header.html.erb +3 -0
  134. data/app/views/layouts/decidim/admin/_title_bar.html.erb +20 -10
  135. data/app/views/layouts/decidim/admin/newsletters.erb +1 -1
  136. data/config/locales/am-ET.yml +1 -0
  137. data/config/locales/ar.yml +57 -49
  138. data/config/locales/bg-BG.yml +16 -0
  139. data/config/locales/bg.yml +135 -0
  140. data/config/locales/ca.yml +130 -50
  141. data/config/locales/cs.yml +184 -104
  142. data/config/locales/da-DK.yml +1 -0
  143. data/config/locales/da.yml +1 -0
  144. data/config/locales/de.yml +145 -47
  145. data/config/locales/el-GR.yml +1 -0
  146. data/config/locales/el.yml +819 -0
  147. data/config/locales/en.yml +127 -48
  148. data/config/locales/eo-UY.yml +0 -1
  149. data/config/locales/eo.yml +51 -0
  150. data/config/locales/es-MX.yml +128 -48
  151. data/config/locales/es-PY.yml +128 -48
  152. data/config/locales/es.yml +128 -48
  153. data/config/locales/et-EE.yml +1 -0
  154. data/config/locales/et.yml +1 -0
  155. data/config/locales/eu.yml +21 -47
  156. data/config/locales/fi-plain.yml +128 -48
  157. data/config/locales/fi.yml +141 -61
  158. data/config/locales/fr-CA.yml +849 -0
  159. data/config/locales/fr.yml +128 -48
  160. data/config/locales/ga-IE.yml +1 -0
  161. data/config/locales/gl.yml +21 -47
  162. data/config/locales/hr-HR.yml +1 -0
  163. data/config/locales/hr.yml +1 -0
  164. data/config/locales/hu.yml +112 -59
  165. data/config/locales/id-ID.yml +21 -47
  166. data/config/locales/is-IS.yml +534 -0
  167. data/config/locales/is.yml +568 -0
  168. data/config/locales/it.yml +133 -83
  169. data/config/locales/ja-JP.yml +855 -0
  170. data/config/locales/ja.yml +849 -0
  171. data/config/locales/ko-KR.yml +1 -0
  172. data/config/locales/ko.yml +1 -0
  173. data/config/locales/lt-LT.yml +1 -0
  174. data/config/locales/lt.yml +1 -0
  175. data/config/locales/lv.yml +799 -0
  176. data/config/locales/mt-MT.yml +1 -0
  177. data/config/locales/mt.yml +1 -0
  178. data/config/locales/nl.yml +103 -48
  179. data/config/locales/no.yml +603 -32
  180. data/config/locales/om-ET.yml +1 -0
  181. data/config/locales/pl.yml +364 -238
  182. data/config/locales/pt-BR.yml +22 -48
  183. data/config/locales/pt.yml +334 -237
  184. data/config/locales/ro-RO.yml +814 -0
  185. data/config/locales/ru.yml +20 -46
  186. data/config/locales/sk-SK.yml +823 -0
  187. data/config/locales/sk.yml +806 -0
  188. data/config/locales/sl.yml +166 -0
  189. data/config/locales/so-SO.yml +1 -0
  190. data/config/locales/sr-CS.yml +590 -0
  191. data/config/locales/sv.yml +134 -55
  192. data/config/locales/ti-ER.yml +1 -0
  193. data/config/locales/tr-TR.yml +21 -47
  194. data/config/locales/uk.yml +19 -48
  195. data/config/locales/vi-VN.yml +1 -0
  196. data/config/locales/vi.yml +1 -0
  197. data/config/locales/zh-CN.yml +849 -0
  198. data/config/locales/zh-TW.yml +1 -0
  199. data/config/routes.rb +20 -3
  200. data/db/migrate/20191118112040_add_accepted_admin_terms_at_field_to_users.rb +7 -0
  201. data/lib/decidim/admin.rb +17 -0
  202. data/lib/decidim/admin/engine.rb +12 -9
  203. data/lib/decidim/admin/form_builder.rb +7 -2
  204. data/lib/decidim/admin/test.rb +2 -0
  205. data/lib/decidim/admin/test/filterable_examples.rb +129 -0
  206. data/lib/decidim/admin/test/manage_attachment_collections_examples.rb +1 -1
  207. data/lib/decidim/admin/test/manage_component_permissions_examples.rb +15 -15
  208. data/lib/decidim/admin/test/manage_paginated_collection_examples.rb +22 -0
  209. data/lib/decidim/admin/version.rb +1 -1
  210. data/vendor/assets/javascripts/jquery.serializejson.js +344 -0
  211. metadata +101 -31
  212. data/app/commands/decidim/admin/create_oauth_application.rb +0 -36
  213. data/app/commands/decidim/admin/destroy_oauth_application.rb +0 -39
  214. data/app/commands/decidim/admin/update_oauth_application.rb +0 -39
  215. data/app/controllers/decidim/admin/oauth_applications_controller.rb +0 -90
  216. data/app/forms/decidim/admin/oauth_application_form.rb +0 -32
  217. data/app/views/decidim/admin/oauth_applications/_form.html.erb +0 -19
  218. data/app/views/decidim/admin/oauth_applications/edit.html.erb +0 -13
  219. data/app/views/decidim/admin/oauth_applications/index.html.erb +0 -40
  220. data/app/views/decidim/admin/oauth_applications/new.html.erb +0 -13
  221. data/app/views/decidim/admin/oauth_applications/show.html.erb +0 -27
@@ -11,25 +11,47 @@ module Decidim
11
11
  # user - The user that updates the newsletter.
12
12
  def initialize(newsletter, form, user)
13
13
  @newsletter = newsletter
14
+ @content_block = newsletter.template
14
15
  @form = form
15
16
  @user = user
16
17
  @organization = user.organization
17
18
  end
18
19
 
19
20
  def call
20
- return broadcast(:invalid) unless @form.valid?
21
- return broadcast(:invalid) if @newsletter.sent?
22
- return broadcast(:invalid) unless @organization == @newsletter.organization
21
+ return broadcast(:invalid) unless form.valid?
22
+ return broadcast(:invalid) if newsletter.sent?
23
+ return broadcast(:invalid) unless organization == newsletter.organization
23
24
 
25
+ transaction do
26
+ update_newsletter
27
+ update_content_block
28
+ end
29
+
30
+ broadcast(:ok, newsletter)
31
+ end
32
+
33
+ private
34
+
35
+ attr_reader :user, :newsletter, :content_block, :organization, :form
36
+
37
+ def update_newsletter
24
38
  @newsletter = Decidim.traceability.update!(
25
- @newsletter,
26
- @user,
27
- subject: @form.subject,
28
- body: @form.body,
29
- author: @user
39
+ newsletter,
40
+ user,
41
+ subject: form.subject,
42
+ author: user
30
43
  )
44
+ end
31
45
 
32
- broadcast(:ok, @newsletter)
46
+ def update_content_block
47
+ UpdateContentBlock.call(form, content_block, user) do
48
+ on(:ok) do |content_block|
49
+ @content_block = content_block
50
+ end
51
+ on(:invalid) do
52
+ raise "There was a problem persisting the changes to the content block"
53
+ end
54
+ end
33
55
  end
34
56
  end
35
57
  end
@@ -45,14 +45,20 @@ module Decidim
45
45
  name: form.name,
46
46
  default_locale: form.default_locale,
47
47
  reference_prefix: form.reference_prefix,
48
+ time_zone: form.time_zone,
48
49
  twitter_handler: form.twitter_handler,
49
50
  facebook_handler: form.facebook_handler,
50
51
  instagram_handler: form.instagram_handler,
51
52
  youtube_handler: form.youtube_handler,
52
53
  github_handler: form.github_handler,
53
54
  badges_enabled: form.badges_enabled,
54
- user_groups_enabled: form.user_groups_enabled
55
+ user_groups_enabled: form.user_groups_enabled,
56
+ comments_max_length: form.comments_max_length,
57
+ enable_machine_translations: form.enable_machine_translations,
58
+ admin_terms_of_use_body: form.admin_terms_of_use_body,
59
+ rich_text_editor_in_public_views: form.rich_text_editor_in_public_views
55
60
  }.merge(welcome_notification_attributes)
61
+ .merge(machine_translation_attributes || {})
56
62
  end
57
63
 
58
64
  def welcome_notification_attributes
@@ -62,6 +68,14 @@ module Decidim
62
68
  welcome_notification_body: form.customize_welcome_notification ? form.welcome_notification_body : nil
63
69
  }
64
70
  end
71
+
72
+ def machine_translation_attributes
73
+ return unless Decidim.config.enable_machine_translations
74
+
75
+ {
76
+ machine_translation_display_priority: form.machine_translation_display_priority
77
+ }
78
+ end
65
79
  end
66
80
  end
67
81
  end
@@ -102,7 +102,9 @@ module Decidim
102
102
  secondary: form.secondary_color,
103
103
  success: form.success_color,
104
104
  warning: form.warning_color,
105
- alert: form.alert_color
105
+ alert: form.alert_color,
106
+ highlight: form.highlight_color,
107
+ "highlight-alternative": form.highlight_alternative_color
106
108
  }
107
109
  }
108
110
  end
@@ -0,0 +1,152 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module Admin
7
+ # Common logic to filter admin resources.
8
+ module Filterable
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ include Decidim::Admin::Paginable
13
+ include Decidim::TranslatableAttributes
14
+
15
+ helper Decidim::Admin::FilterableHelper
16
+
17
+ helper_method :collection_name,
18
+ :extra_allowed_params,
19
+ :extra_filters,
20
+ :filters,
21
+ :filters_with_values,
22
+ :find_dynamic_translation,
23
+ :query,
24
+ :query_params,
25
+ :query_params_with,
26
+ :query_params_without,
27
+ :ransack_params,
28
+ :search_field_predicate
29
+
30
+ delegate :categories, to: :current_component
31
+ delegate :scopes, to: :current_organization
32
+
33
+ def query
34
+ @query ||= base_query.ransack(ransack_params)
35
+ end
36
+
37
+ private
38
+
39
+ def filtered_collection
40
+ paginate(query.result)
41
+ end
42
+
43
+ def base_query
44
+ raise NotImplementedError, "A base query is needed to filter admin resources"
45
+ end
46
+
47
+ def query_params
48
+ params.permit(*allowed_query_params).to_h.deep_symbolize_keys
49
+ end
50
+
51
+ def allowed_query_params
52
+ [*extra_allowed_params, q: {}]
53
+ end
54
+
55
+ # Non ransack params (outside :q) to be allowed in the query links.
56
+ # Also, used in FilterableHelper#applied_filters_hidden_field_tags
57
+ # to ensure that these params are kept in the search_form_for.
58
+ def extra_allowed_params
59
+ [:per_page]
60
+ end
61
+
62
+ def ransack_params
63
+ query_params[:q] || {}
64
+ end
65
+
66
+ # For injecting ransack params while keeping query params in links.
67
+ def query_params_with(hash)
68
+ query_params.merge(q: ransack_params.merge(hash))
69
+ end
70
+
71
+ # For rejecting ransack params while keeping query params in links.
72
+ def query_params_without(*filters)
73
+ query_params.merge(q: ransack_params.except(*filters))
74
+ end
75
+
76
+ # Ransack predicate to use in the search_form_for.
77
+ def search_field_predicate
78
+ :title_cont
79
+ end
80
+
81
+ # Informs which filters are being used IN the dropdown.
82
+ # Array<Symbol> of ransack params (inside :q) keys used in:
83
+ # - FilterableHelper#applied_filters_tags
84
+ # To build the tags that inform which filters are being applied and
85
+ # that allow to discard them.
86
+ # - FilterableHelper#applied_filters_hidden_field_tags
87
+ # To ensure that filters are kept in the search_form_for.
88
+ def filters
89
+ [:private_space_eq, :published_at_null]
90
+ end
91
+
92
+ # Informs which filters are being used OUTSIDE the dropdown.
93
+ # Optional Array<Symbol> of ransack params (inside :q) keys
94
+ # used in FilterableHelper#applied_filters_hidden_field_tags
95
+ # to ensure that these filters are kept in the search_form_for.
96
+ def extra_filters
97
+ []
98
+ end
99
+
100
+ # A Hash of filters as Symbol and its options as Array or Hash.
101
+ # Needed to build the tree of links used to build the dropdown submenu.
102
+ # Array values are used to build simple dropdown submenus with one level.
103
+ # Hash values are used to build nested dropdown submenus with many levels.
104
+ # By default, uses the Symbols in `filters` as keys and injects an Array
105
+ # with true and false as values. If these values fit your filtering needs,
106
+ # you won't have to declare a `filters_with_values` method in your concern.
107
+ def filters_with_values
108
+ filters.each_with_object({}) do |filter, hash|
109
+ hash[filter] = [true, false]
110
+ end
111
+ end
112
+
113
+ # Plural model name. Used in search_field placeholder.
114
+ def collection_name
115
+ query.klass.model_name.human(count: 2)
116
+ end
117
+
118
+ # A tree of Category IDs. Leaves are `nil`.
119
+ def category_ids_hash(categories)
120
+ categories.each_with_object({}) do |category, hash|
121
+ hash[category.id] = category.subcategories.any? ? category_ids_hash(category.subcategories) : nil
122
+ end
123
+ end
124
+
125
+ # A tree of Scope IDs. Leaves are `nil`.
126
+ def scope_ids_hash(scopes)
127
+ scopes.each_with_object({}) do |scope, hash|
128
+ hash[scope.id] = scope.children.any? ? scope_ids_hash(scope.children) : nil
129
+ end
130
+ end
131
+
132
+ # Array<Symbol> of filters that implement a method to find translations.
133
+ # Useful when translations cannot be found in i18n or come from a Model.
134
+ def dynamically_translated_filters
135
+ [:scope_id_eq, :category_id_eq]
136
+ end
137
+
138
+ def find_dynamic_translation(filter, value)
139
+ send("translated_#{filter}", value) if filter.in?(dynamically_translated_filters)
140
+ end
141
+
142
+ def translated_scope_id_eq(id)
143
+ translated_attribute(scopes.find_by(id: id).name)
144
+ end
145
+
146
+ def translated_category_id_eq(id)
147
+ translated_attribute(categories.find_by(id: id).name)
148
+ end
149
+ end
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module Admin
7
+ module Officializations
8
+ module Filterable
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ include Decidim::Admin::Filterable
13
+
14
+ private
15
+
16
+ def base_query
17
+ collection
18
+ end
19
+
20
+ def search_field_predicate
21
+ :name_or_nickname_or_email_cont
22
+ end
23
+
24
+ def filters
25
+ [:officialized_at_null]
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module Admin
7
+ module Paginable
8
+ # Common logic to paginate admin resources
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ include Decidim::Paginable
13
+
14
+ def per_page
15
+ params[:per_page].present? ? params[:per_page].to_i : Decidim::Admin.per_page_range.first
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -11,19 +11,25 @@ module Decidim
11
11
  def create
12
12
  enforce_permission_to :create, :export_space, participatory_space: exportable_space
13
13
 
14
- ExportParticipatorySpaceJob.perform_later(current_user, exportable_space, "participatory_processes", default_format)
14
+ ExportParticipatorySpaceJob.perform_later(current_user, exportable_space, manifest_name, default_format)
15
15
 
16
16
  flash[:notice] = t("decidim.admin.exports.notice")
17
17
 
18
18
  redirect_back(fallback_location: after_export_path)
19
19
  end
20
20
 
21
- # Public: The only method to be implemented at the controller. You need to
21
+ # Public: To be implemented at the controller. You need to
22
22
  # return the space that will be exported.
23
23
  def exportable_space
24
24
  raise NotImplementedError
25
25
  end
26
26
 
27
+ # Public: To be implemented at the controller. You need to
28
+ # return the plural of the name of the space that will be exported.
29
+ def manifest_name
30
+ raise NotImplementedError
31
+ end
32
+
27
33
  # Public: Returns a String or Object that will be passed to `redirect_to` after
28
34
  # exporing a space. By default it redirects to the root_path.
29
35
  #
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ # The controller to handle the Admin
6
+ # Terms of use agreement.
7
+ class AdminTermsController < Decidim::Admin::ApplicationController
8
+ def accept
9
+ current_user.admin_terms_accepted_at = Time.current
10
+ if current_user.save!
11
+ flash[:notice] = t("accept.success", scope: "decidim.admin.admin_terms_of_use")
12
+ redirect_to decidim_admin.root_path
13
+ else
14
+ flash[:alert] = t("accept.error", scope: "decidim.admin.admin_terms_of_use")
15
+ redirect_to decidim_admin.admin_terms_show_path
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -6,8 +6,10 @@ module Decidim
6
6
  class ApplicationController < ::DecidimController
7
7
  include NeedsOrganization
8
8
  include NeedsPermission
9
+ include NeedsSnippets
9
10
  include FormFactory
10
11
  include LocaleSwitcher
12
+ include UseOrganizationTimeZone
11
13
  include PayloadInfo
12
14
  include HttpCachingDisabler
13
15
 
@@ -17,6 +19,7 @@ module Decidim
17
19
  helper Decidim::Admin::IconLinkHelper
18
20
  helper Decidim::Admin::MenuHelper
19
21
  helper Decidim::Admin::ScopesHelper
22
+ helper Decidim::Admin::Paginable::PerPageHelper
20
23
  helper Decidim::DecidimFormHelper
21
24
  helper Decidim::ReplaceButtonsHelper
22
25
  helper Decidim::ScopesHelper
@@ -9,6 +9,12 @@ module Decidim
9
9
  enforce_permission_to :index, :authorization_workflow
10
10
 
11
11
  @workflows = Decidim::Verifications.admin_workflows
12
+
13
+ # Decidim::Verifications::Authorizations Query
14
+ @authorizations = Decidim::Verifications::Authorizations.new(
15
+ organization: current_organization,
16
+ granted: true
17
+ ).query
12
18
  end
13
19
  end
14
20
  end
@@ -22,7 +22,7 @@ module Decidim
22
22
  :parent_path
23
23
 
24
24
  before_action except: [:index, :show] do
25
- enforce_permission_to :manage, :component, component: current_component
25
+ enforce_permission_to :manage, :component, component: current_component unless skip_manage_component_permission
26
26
  end
27
27
 
28
28
  before_action on: [:index, :show] do
@@ -59,6 +59,10 @@ module Decidim
59
59
  def parent_path
60
60
  @parent_path ||= ::Decidim::EngineRouter.admin_proxy(current_participatory_space).components_path
61
61
  end
62
+
63
+ def skip_manage_component_permission
64
+ false
65
+ end
62
66
  end
63
67
  end
64
68
  end
@@ -20,14 +20,17 @@ module Decidim
20
20
  @component = Component.new(
21
21
  name: default_name(manifest),
22
22
  manifest_name: params[:type],
23
- participatory_space: current_participatory_space
23
+ participatory_space: current_participatory_space,
24
+ settings: {
25
+ scope_id: current_participatory_space.scope.try(:id)
26
+ }
24
27
  )
25
28
 
26
- @form = form(ComponentForm).from_model(@component)
29
+ @form = form(@component.form_class).from_model(@component)
27
30
  end
28
31
 
29
32
  def create
30
- @form = form(ComponentForm).from_params(form_params)
33
+ @form = form(manifest.component_form_class).from_params(component_params)
31
34
  enforce_permission_to :create, :component
32
35
 
33
36
  CreateComponent.call(@form) do
@@ -47,12 +50,12 @@ module Decidim
47
50
  @component = query_scope.find(params[:id])
48
51
  enforce_permission_to :update, :component, component: @component
49
52
 
50
- @form = form(ComponentForm).from_model(@component)
53
+ @form = form(@component.form_class).from_model(@component)
51
54
  end
52
55
 
53
56
  def update
54
57
  @component = query_scope.find(params[:id])
55
- @form = form(ComponentForm).from_params(form_params)
58
+ @form = form(@component.form_class).from_params(component_params)
56
59
  enforce_permission_to :update, :component, component: @component
57
60
 
58
61
  UpdateComponent.call(@form, @component) do
@@ -111,30 +114,34 @@ module Decidim
111
114
  end
112
115
  end
113
116
 
114
- private
117
+ def share
118
+ @component = query_scope.find(params[:id])
119
+ share_token = @component.share_tokens.create!(user: current_user, organization: current_organization)
115
120
 
116
- # Returns a Class with the attributes sanitized, coerced and filtered
117
- # to the right type. See Decidim::SettingsManifest#schema.
118
- def new_settings_schema(name, data)
119
- manifest.settings(name).schema.new(data, current_organization.default_locale)
121
+ redirect_to share_token.url
120
122
  end
121
123
 
122
- # Processes the component params so Decidim::Admin::ComponentForm
124
+ private
125
+
126
+ # Processes the component params so the form object defined in the manifest (component_form_class_name)
123
127
  # can assign and validate the attributes when using #from_params.
124
- def form_params
125
- form_params = params[:component].permit!
126
- form_params[:id] = params[:id]
127
- form_params[:manifest] = manifest
128
- form_params[:participatory_space] = current_participatory_space
129
- form_params[:settings] = new_settings_schema(:global, form_params[:settings])
130
- if form_params[:default_step_settings]
131
- form_params[:default_step_settings] = new_settings_schema(:step, form_params[:default_step_settings])
132
- else
133
- form_params[:step_settings].each do |key, value|
134
- form_params[:step_settings][key] = new_settings_schema(:step, value)
128
+ def component_params
129
+ new_settings = proc { |name, data| Component.build_settings(manifest, name, data, current_organization) }
130
+
131
+ params[:component].permit!.tap do |hsh|
132
+ hsh[:id] = params[:id]
133
+ hsh[:manifest] = manifest
134
+ hsh[:participatory_space] = current_participatory_space
135
+ hsh[:settings] = new_settings.call(:global, hsh[:settings])
136
+ if hsh[:default_step_settings]
137
+ hsh[:default_step_settings] = new_settings.call(:step, hsh[:default_step_settings])
138
+ else
139
+ hsh[:step_settings] ||= {}
140
+ hsh[:step_settings].each do |key, value|
141
+ hsh[:step_settings][key] = new_settings.call(:step, value)
142
+ end
135
143
  end
136
144
  end
137
- form_params
138
145
  end
139
146
 
140
147
  def query_scope