decidim-admin 0.20.0 → 0.23.1.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

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
@@ -93,8 +93,12 @@ module Decidim
93
93
  end
94
94
 
95
95
  def collection
96
+ # there's an unidentified corner case where Decidim::User
97
+ # may have been destroyed, but the related ParticipatorySpacePrivateUser
98
+ # remains in the database. That's why filtering by not null users
96
99
  @collection ||= privatable_to
97
100
  .participatory_space_private_users
101
+ .includes(:user).where.not("decidim_users.id" => nil)
98
102
  .page(params[:page])
99
103
  .per(20)
100
104
  end
@@ -6,6 +6,8 @@ module Decidim
6
6
  #
7
7
  class DashboardController < Decidim::Admin::ApplicationController
8
8
  helper_method :latest_action_logs
9
+ helper_method :users_counter
10
+ helper_method :metrics_presenter
9
11
 
10
12
  def show
11
13
  enforce_permission_to :read, :admin_dashboard
@@ -19,7 +21,37 @@ module Decidim
19
21
  .includes(:participatory_space, :user, :resource, :component, :version)
20
22
  .for_admin
21
23
  .order(created_at: :desc)
22
- .first(20)
24
+ .first(5)
25
+ end
26
+
27
+ def metrics_presenter
28
+ @metrics_presenter ||= Decidim::Admin::DashboardMetricChartsPresenter.new(
29
+ summary: true,
30
+ organization: current_organization
31
+ )
32
+ end
33
+
34
+ def users_counter
35
+ last_day = Time.zone.yesterday
36
+ last_week = Time.zone.today.prev_week
37
+ last_month = Time.zone.today.prev_month
38
+
39
+ {
40
+ total_admins_last_24: users_count(last_day, true),
41
+ total_admins_last_week: users_count(last_week, true),
42
+ total_admins_last_month: users_count(last_month, true),
43
+ total_participants_last_24: users_count(last_day, false),
44
+ total_participants_last_week: users_count(last_week, false),
45
+ total_participants_last_month: users_count(last_month, false)
46
+ }
47
+ end
48
+
49
+ def users_count(date, admin)
50
+ @users_count = Decidim::Admin::ActiveUsersCounter.new(
51
+ organization: current_organization,
52
+ date: date,
53
+ admin: admin
54
+ ).query.count
23
55
  end
24
56
  end
25
57
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ class MetricsController < Decidim::Admin::ApplicationController
6
+ helper_method :metrics_presenter
7
+
8
+ def index
9
+ enforce_permission_to :read, :metrics
10
+ end
11
+
12
+ private
13
+
14
+ def metrics_presenter
15
+ @metrics_presenter ||= Decidim::Admin::DashboardMetricChartsPresenter.new(
16
+ summary: false,
17
+ organization: current_organization
18
+ )
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ # Controller that allows managing newsletters.
6
+ class NewsletterTemplatesController < Decidim::Admin::ApplicationController
7
+ helper_method :templates, :template_manifest
8
+
9
+ layout "decidim/admin/newsletters"
10
+
11
+ def index
12
+ enforce_permission_to :index, :newsletter
13
+ end
14
+
15
+ def show; end
16
+
17
+ def preview
18
+ email = NewsletterMailer.newsletter(current_user, fake_newsletter)
19
+ Premailer::Rails::Hook.perform(email)
20
+ render html: email.html_part.body.decoded.html_safe
21
+ end
22
+
23
+ private
24
+
25
+ def templates
26
+ @templates ||= Decidim.content_blocks.for(:newsletter_template)
27
+ end
28
+
29
+ def template_manifest
30
+ @template_manifest ||= Decidim
31
+ .content_blocks
32
+ .for(:newsletter_template)
33
+ .find { |manifest| manifest.name.to_s == params[:id] }
34
+ end
35
+
36
+ def fake_newsletter
37
+ @fake_newsletter ||= Decidim::Admin::FakeNewsletter.new(current_organization, template_manifest)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -7,7 +7,7 @@ module Decidim
7
7
  include Decidim::NewslettersHelper
8
8
  include Decidim::Admin::NewslettersHelper
9
9
  include Paginable
10
- helper_method :newsletter
10
+ helper_method :newsletter, :recipients_count_query, :content_block
11
11
 
12
12
  def index
13
13
  enforce_permission_to :index, :newsletter
@@ -17,7 +17,7 @@ module Decidim
17
17
 
18
18
  def new
19
19
  enforce_permission_to :create, :newsletter
20
- @form = form(NewsletterForm).instance
20
+ @form = form(NewsletterForm).from_model(content_block)
21
21
  end
22
22
 
23
23
  def show
@@ -36,8 +36,9 @@ module Decidim
36
36
  def create
37
37
  enforce_permission_to :create, :newsletter
38
38
  @form = form(NewsletterForm).from_params(params)
39
+ @form.images = images_block_context unless has_images_block_context?
39
40
 
40
- CreateNewsletter.call(@form, current_user) do
41
+ CreateNewsletter.call(@form, content_block, current_user) do
41
42
  on(:ok) do |newsletter|
42
43
  flash.now[:notice] = I18n.t("newsletters.create.success", scope: "decidim.admin")
43
44
  redirect_to action: :show, id: newsletter.id
@@ -53,12 +54,13 @@ module Decidim
53
54
 
54
55
  def edit
55
56
  enforce_permission_to :update, :newsletter, newsletter: newsletter
56
- @form = form(NewsletterForm).from_model(newsletter)
57
+ @form = form(NewsletterForm).from_model(content_block)
57
58
  end
58
59
 
59
60
  def update
60
61
  enforce_permission_to :update, :newsletter, newsletter: newsletter
61
62
  @form = form(NewsletterForm).from_params(params)
63
+ @form.images = images_block_context unless has_images_block_context?
62
64
 
63
65
  UpdateNewsletter.call(newsletter, @form, current_user) do
64
66
  on(:ok) do |newsletter|
@@ -96,6 +98,12 @@ module Decidim
96
98
  @form.send_to_all_users = current_user.admin?
97
99
  end
98
100
 
101
+ def recipients_count
102
+ data = params.permit(data: {}).to_h[:data]
103
+ @form = form(SelectiveNewsletterForm).from_params(data)
104
+ render plain: recipients_count_query
105
+ end
106
+
99
107
  def deliver
100
108
  enforce_permission_to :update, :newsletter, newsletter: newsletter
101
109
  @form = form(SelectiveNewsletterForm).from_params(params)
@@ -127,6 +135,37 @@ module Decidim
127
135
  def newsletter
128
136
  @newsletter ||= collection.find_by(id: params[:id])
129
137
  end
138
+
139
+ def recipients_count_query
140
+ @form ||= form(SelectiveNewsletterForm).instance
141
+ NewsletterRecipients.for(@form).size
142
+ end
143
+
144
+ def content_block
145
+ @content_block ||= content_block_for_newsletter || content_block_from_manifest
146
+ end
147
+
148
+ def content_block_from_manifest
149
+ Decidim::ContentBlock.new(
150
+ organization: current_organization,
151
+ scope_name: :newsletter_template,
152
+ manifest_name: params[:newsletter_template_id]
153
+ )
154
+ end
155
+
156
+ def content_block_for_newsletter
157
+ return nil unless @newsletter
158
+
159
+ @content_block_for_newsletter ||= @newsletter.template
160
+ end
161
+
162
+ def images_block_context
163
+ form(NewsletterForm).from_model(content_block).images
164
+ end
165
+
166
+ def has_images_block_context?
167
+ @form.images && @form.valid?
168
+ end
130
169
  end
131
170
  end
132
171
  end
@@ -5,6 +5,8 @@ module Decidim
5
5
  # Controller that allows managing user officializations at the admin panel.
6
6
  #
7
7
  class OfficializationsController < Decidim::Admin::ApplicationController
8
+ include Decidim::Admin::Officializations::Filterable
9
+
8
10
  layout "decidim/admin/users"
9
11
 
10
12
  helper_method :user
@@ -12,12 +14,7 @@ module Decidim
12
14
 
13
15
  def index
14
16
  enforce_permission_to :read, :officialization
15
- @query = params[:q]
16
- @state = params[:state]
17
-
18
- @users = Decidim::Admin::UserFilter.for(current_organization.users.not_deleted, @query, @state)
19
- .page(params[:page])
20
- .per(15)
17
+ @users = filtered_collection
21
18
  end
22
19
 
23
20
  def new
@@ -52,8 +49,20 @@ module Decidim
52
49
  end
53
50
  end
54
51
 
52
+ def show_email
53
+ enforce_permission_to :show_email, :user, user: user
54
+
55
+ Decidim.traceability.perform_action! :show_email, user, current_user
56
+
57
+ render :show_email, layout: false
58
+ end
59
+
55
60
  private
56
61
 
62
+ def collection
63
+ @collection ||= current_organization.users.not_deleted
64
+ end
65
+
57
66
  def user
58
67
  @user ||= Decidim::User.find_by(
59
68
  id: params[:user_id],
@@ -5,6 +5,7 @@ module Decidim
5
5
  # Controller that allows managing the appearance of the organization.
6
6
  class OrganizationAppearanceController < Decidim::Admin::ApplicationController
7
7
  layout "decidim/admin/settings"
8
+ helper Decidim::Admin::UploaderImageDimensionsHelper
8
9
 
9
10
  def edit
10
11
  enforce_permission_to :update, :organization, organization: current_organization
@@ -37,10 +37,11 @@ module Decidim
37
37
  query = if term.start_with?("@")
38
38
  query.where("nickname ILIKE ?", "#{term.delete("@")}%")
39
39
  else
40
- query.where("name ILIKE ?", "%#{term}%")
40
+ query.where("name ILIKE ?", "%#{term}%").or(
41
+ query.where("email ILIKE ?", "%#{term}%")
42
+ )
41
43
  end
42
-
43
- render json: query.all.collect { |u| { value: u.id, label: "#{u.name} (@#{u.nickname})" } }
44
+ render json: query.all.collect { |u| { value: u.id, label: "#{u.name} (@#{u.nickname}) #{u.email}" } }
44
45
  else
45
46
  render json: []
46
47
  end
@@ -22,6 +22,7 @@ module Decidim
22
22
  redirect_to edit_organization_homepage_path
23
23
  end
24
24
  on(:invalid) do
25
+ edit # Sets the model to the view so that it can render the form
25
26
  render :edit
26
27
  end
27
28
  end
@@ -55,7 +56,7 @@ module Decidim
55
56
  def content_block_from_manifest
56
57
  Decidim::ContentBlock.create!(
57
58
  organization: current_organization,
58
- scope: :homepage,
59
+ scope_name: :homepage,
59
60
  manifest_name: params[:id]
60
61
  )
61
62
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ class ShareTokensController < Decidim::Admin::ApplicationController
6
+ def destroy
7
+ enforce_permission_to :destroy, :share_token, share_token: share_token
8
+
9
+ DestroyShareToken.call(share_token, current_user) do
10
+ on(:ok) do
11
+ flash[:notice] = I18n.t("share_tokens.destroy.success", scope: "decidim.admin")
12
+ end
13
+ on(:invalid) do
14
+ flash[:error] = I18n.t("share_tokens.destroy.error", scope: "decidim.admin")
15
+ end
16
+ end
17
+
18
+ redirect_back(fallback_location: root_path)
19
+ end
20
+
21
+ private
22
+
23
+ def share_token
24
+ @share_token ||= Decidim::ShareToken.where(
25
+ organization: current_organization
26
+ ).find(params[:id])
27
+ end
28
+ end
29
+ end
30
+ end
@@ -16,12 +16,15 @@ module Decidim
16
16
  mimic :attachment
17
17
 
18
18
  validates :file, presence: true, unless: :persisted?
19
+ validates :file, passthru: { to: Decidim::Attachment }
19
20
  validates :title, :description, translatable_presence: true
20
21
  validates :attachment_collection, presence: true, if: ->(form) { form.attachment_collection_id.present? }
21
22
  validates :attachment_collection_id, inclusion: { in: :attachment_collection_ids }, allow_blank: true
22
23
 
23
24
  delegate :attached_to, to: :context, prefix: false
24
25
 
26
+ alias organization current_organization
27
+
25
28
  def attachment_collections
26
29
  @attachment_collections ||= attached_to.attachment_collections
27
30
  end
@@ -23,8 +23,7 @@ module Decidim
23
23
  attribute :default_step_settings, Object
24
24
  attribute :step_settings, Hash[String => Object]
25
25
 
26
- validate :must_be_able_to_change_participatory_texts_setting
27
- validate :amendments_visibility_options_must_be_valid
26
+ attribute :share_tokens, Array[ShareToken]
28
27
 
29
28
  def settings?
30
29
  settings.manifest.attributes.any?
@@ -34,6 +33,10 @@ module Decidim
34
33
  default_step_settings.manifest.attributes.any?
35
34
  end
36
35
 
36
+ def map_model(model)
37
+ self.share_tokens = model.share_tokens
38
+ end
39
+
37
40
  private
38
41
 
39
42
  # Overwrites Rectify::Form#form_attributes_valid? to validate nested `step_settings` attributes.
@@ -54,26 +57,6 @@ module Decidim
54
57
  end
55
58
  validations.all?
56
59
  end
57
-
58
- # Validates setting `participatory_texts_enabled` is not changed when there are proposals for the component.
59
- def must_be_able_to_change_participatory_texts_setting
60
- return unless manifest&.name == :proposals && (component = Component.find_by(id: id))
61
- return unless settings.participatory_texts_enabled != component.settings.participatory_texts_enabled
62
-
63
- settings.errors.add(:participatory_texts_enabled) if Decidim::Proposals::Proposal.where(component: component).any?
64
- end
65
-
66
- # Validates setting `amendments_visibility` is included in Decidim::Amendment::VisibilityStepSetting.options.
67
- def amendments_visibility_options_must_be_valid
68
- return unless manifest&.name == :proposals && settings.amendments_enabled
69
-
70
- visibility_options = Decidim::Amendment::VisibilityStepSetting.options.map(&:last)
71
- step_settings.each do |step, settings|
72
- next unless visibility_options.exclude? settings[:amendments_visibility]
73
-
74
- step_settings[step].errors.add(:amendments_visibility, :inclusion)
75
- end
76
- end
77
60
  end
78
61
  end
79
62
  end
@@ -3,14 +3,26 @@
3
3
  module Decidim
4
4
  module Admin
5
5
  # The form that validates the data to construct a valid Newsletter.
6
- class NewsletterForm < Decidim::Form
6
+ class NewsletterForm < ContentBlockForm
7
7
  mimic :newsletter
8
8
 
9
9
  include TranslatableAttributes
10
10
 
11
11
  translatable_attribute :subject, String
12
- translatable_attribute :body, String
13
- validates :subject, :body, translatable_presence: true
12
+ validates :subject, translatable_presence: true
13
+
14
+ def map_model(content_block)
15
+ super(content_block)
16
+ self.subject = newsletter_for(content_block).try(:subject)
17
+ end
18
+
19
+ private
20
+
21
+ def newsletter_for(content_block)
22
+ Decidim::Newsletter
23
+ .where(organization: content_block.organization)
24
+ .find_by(id: content_block.scoped_resource_id)
25
+ end
14
26
  end
15
27
  end
16
28
  end
@@ -7,6 +7,7 @@ module Decidim
7
7
  #
8
8
  class OrganizationAppearanceForm < Form
9
9
  include TranslatableAttributes
10
+ include Decidim::HasUploadValidations
10
11
 
11
12
  mimic :organization
12
13
 
@@ -34,6 +35,8 @@ module Decidim
34
35
  attribute :success_color, String, default: "#57d685"
35
36
  attribute :warning_color, String, default: "#ffae00"
36
37
  attribute :alert_color, String, default: "#ec5840"
38
+ attribute :highlight_color, String, default: "#be6400"
39
+ attribute :highlight_alternative_color, String, default: "#ff5731"
37
40
 
38
41
  translatable_attribute :cta_button_text, String
39
42
  translatable_attribute :description, String
@@ -48,14 +51,12 @@ module Decidim
48
51
  validates :official_img_header,
49
52
  :official_img_footer,
50
53
  :logo,
51
- file_size: { less_than_or_equal_to: ->(_record) { Decidim.maximum_attachment_size } },
52
- file_content_type: { allow: ["image/jpeg", "image/png"] }
54
+ passthru: { to: Decidim::Organization }
53
55
 
54
56
  validates :highlighted_content_banner_action_url, presence: true, if: :highlighted_content_banner_enabled?
55
57
  validates :highlighted_content_banner_image,
56
58
  presence: true,
57
- file_size: { less_than_or_equal_to: ->(_record) { Decidim.maximum_attachment_size } },
58
- file_content_type: { allow: ["image/jpeg", "image/png"] },
59
+ passthru: { to: Decidim::Organization },
59
60
  if: :highlighted_content_banner_image_is_changed?
60
61
 
61
62
  validates :highlighted_content_banner_title,
@@ -74,6 +75,8 @@ module Decidim
74
75
  validates :omnipresent_banner_title, translatable_presence: true, if: :enable_omnipresent_banner?
75
76
  validates :omnipresent_banner_short_description, translatable_presence: true, if: :enable_omnipresent_banner?
76
77
 
78
+ alias organization current_organization
79
+
77
80
  private
78
81
 
79
82
  def highlighted_content_banner_enabled?