decidim-admin 0.20.1 → 0.23.1
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.
- checksums.yaml +4 -4
- data/README.md +13 -0
- data/app/assets/javascripts/decidim/admin/application.js.es6 +8 -0
- data/app/assets/javascripts/decidim/admin/budget_rule_toggler.component.js.es6 +52 -0
- data/app/assets/javascripts/decidim/admin/bundle.js +26 -32
- data/app/assets/javascripts/decidim/admin/bundle.js.map +1 -1
- data/app/assets/javascripts/decidim/admin/choose_language.js +12 -0
- data/app/assets/javascripts/decidim/admin/dynamic_fields.component.js.es6 +24 -5
- data/app/assets/javascripts/decidim/admin/form.js.es6 +24 -10
- data/app/assets/javascripts/decidim/admin/gallery.js.es6 +5 -0
- data/app/assets/javascripts/decidim/admin/newsletters.js.es6 +12 -0
- data/app/assets/javascripts/decidim/admin/officializations.js.es6 +20 -0
- data/app/assets/javascripts/decidim/admin/scope_picker_enabler.component.js.es6 +14 -0
- data/app/assets/stylesheets/decidim/admin/_decidim.scss +2 -0
- data/app/assets/stylesheets/decidim/admin/_variables.scss +2 -2
- data/app/assets/stylesheets/decidim/admin/extra/_action-icon.scss +6 -0
- data/app/assets/stylesheets/decidim/admin/extra/_cards.scss +11 -0
- data/app/assets/stylesheets/decidim/admin/extra/_newsletter-templates-gallery.scss +3 -0
- data/app/assets/stylesheets/decidim/admin/extra/_organization-appearance.scss +141 -0
- data/app/assets/stylesheets/decidim/admin/extra/_show_email.scss +31 -0
- data/app/assets/stylesheets/decidim/admin/extra/_title_bar.scss +4 -0
- data/app/assets/stylesheets/decidim/admin/modules/_buttons.scss +15 -1
- data/app/assets/stylesheets/decidim/admin/modules/_callouts.scss +11 -0
- data/app/assets/stylesheets/decidim/admin/modules/_cards.scss +13 -2
- data/app/assets/stylesheets/decidim/admin/modules/_filters.scss +78 -1
- data/app/assets/stylesheets/decidim/admin/modules/_forms.scss +16 -2
- data/app/assets/stylesheets/decidim/admin/modules/_import_result.scss +10 -0
- data/app/assets/stylesheets/decidim/admin/modules/_layout.scss +1 -1
- data/app/assets/stylesheets/decidim/admin/modules/_loading-spinner.scss +19 -0
- data/app/assets/stylesheets/decidim/admin/modules/_main-nav.scss +0 -1
- data/app/assets/stylesheets/decidim/admin/modules/_modules.scss +5 -1
- data/app/assets/stylesheets/decidim/admin/modules/_process-header.scss +0 -1
- data/app/assets/stylesheets/decidim/admin/modules/_secondary-nav.scss +5 -2
- data/app/assets/stylesheets/decidim/admin/modules/_table-list.scss +23 -7
- data/app/assets/stylesheets/decidim/admin/modules/_tabs.scss +7 -0
- data/app/assets/stylesheets/decidim/admin/modules/_users_statistics.scss +18 -0
- data/app/assets/stylesheets/decidim/admin/utils/_mixins.scss +42 -0
- data/app/assets/stylesheets/decidim/admin/utils/_settings.scss +4 -1
- data/app/cells/decidim/admin/content_block/show.erb +2 -2
- data/app/cells/decidim/admin/results_per_page/show.erb +16 -0
- data/app/cells/decidim/admin/results_per_page_cell.rb +14 -0
- data/app/commands/decidim/admin/create_attachment.rb +2 -2
- data/app/commands/decidim/admin/create_newsletter.rb +34 -9
- data/app/commands/decidim/admin/deliver_newsletter.rb +1 -1
- data/app/commands/decidim/admin/destroy_share_token.rb +46 -0
- data/app/commands/decidim/admin/reorder_content_blocks.rb +1 -1
- data/app/commands/decidim/admin/update_component.rb +27 -3
- data/app/commands/decidim/admin/update_content_block.rb +25 -1
- data/app/commands/decidim/admin/update_newsletter.rb +31 -9
- data/app/commands/decidim/admin/update_organization.rb +15 -1
- data/app/commands/decidim/admin/update_organization_appearance.rb +3 -1
- data/app/controllers/concerns/decidim/admin/filterable.rb +152 -0
- data/app/controllers/concerns/decidim/admin/officializations/filterable.rb +31 -0
- data/app/controllers/concerns/decidim/admin/paginable.rb +20 -0
- data/app/controllers/concerns/decidim/admin/participatory_space_export.rb +8 -2
- data/app/controllers/decidim/admin/admin_terms_controller.rb +20 -0
- data/app/controllers/decidim/admin/application_controller.rb +3 -0
- data/app/controllers/decidim/admin/authorization_workflows_controller.rb +6 -0
- data/app/controllers/decidim/admin/components/base_controller.rb +5 -1
- data/app/controllers/decidim/admin/components_controller.rb +30 -23
- data/app/controllers/decidim/admin/concerns/has_private_users.rb +4 -0
- data/app/controllers/decidim/admin/dashboard_controller.rb +33 -1
- data/app/controllers/decidim/admin/metrics_controller.rb +22 -0
- data/app/controllers/decidim/admin/newsletter_templates_controller.rb +41 -0
- data/app/controllers/decidim/admin/newsletters_controller.rb +43 -4
- data/app/controllers/decidim/admin/officializations_controller.rb +15 -6
- data/app/controllers/decidim/admin/organization_appearance_controller.rb +1 -0
- data/app/controllers/decidim/admin/organization_controller.rb +4 -3
- data/app/controllers/decidim/admin/organization_homepage_content_blocks_controller.rb +2 -1
- data/app/controllers/decidim/admin/share_tokens_controller.rb +30 -0
- data/app/forms/decidim/admin/attachment_form.rb +3 -0
- data/app/forms/decidim/admin/component_form.rb +5 -22
- data/app/forms/decidim/admin/newsletter_form.rb +15 -3
- data/app/forms/decidim/admin/organization_appearance_form.rb +7 -4
- data/app/forms/decidim/admin/organization_form.rb +27 -0
- data/app/forms/decidim/admin/participatory_space_private_user_csv_import_form.rb +14 -0
- data/app/forms/decidim/admin/participatory_space_private_user_form.rb +8 -2
- data/app/frontend/components/autocomplete.component.test.tsx +2 -1
- data/app/frontend/components/autocomplete.component.tsx +29 -0
- data/app/helpers/decidim/admin/admin_terms_helper.rb +47 -0
- data/app/helpers/decidim/admin/application_helper.rb +2 -0
- data/app/helpers/decidim/admin/dashboard_helper.rb +25 -0
- data/app/helpers/decidim/admin/filterable_helper.rb +129 -0
- data/app/helpers/decidim/admin/icon_link_helper.rb +1 -1
- data/app/helpers/decidim/admin/newsletters_helper.rb +20 -0
- data/app/helpers/decidim/admin/paginable/per_page_helper.rb +22 -0
- data/app/helpers/decidim/admin/resource_scope_helper.rb +43 -0
- data/app/helpers/decidim/admin/scopes_helper.rb +6 -0
- data/app/helpers/decidim/admin/settings_helper.rb +56 -47
- data/app/helpers/decidim/admin/uploader_image_dimensions_helper.rb +30 -0
- data/app/helpers/decidim/admin/user_roles_helper.rb +19 -0
- data/app/models/decidim/admin/fake_newsletter.rb +49 -0
- data/app/permissions/decidim/admin/permissions.rb +30 -7
- data/app/presenters/decidim/admin/dashboard_metric_charts_presenter.rb +57 -0
- data/app/queries/decidim/admin/active_users_counter.rb +35 -0
- data/app/queries/decidim/admin/newsletter_recipients.rb +20 -9
- data/app/views/decidim/admin/admin_terms/show.html.erb +26 -0
- data/app/views/decidim/admin/attachment_collections/index.html.erb +1 -1
- data/app/views/decidim/admin/authorization_workflows/index.html.erb +1 -0
- data/app/views/decidim/admin/categories/index.html.erb +1 -1
- data/app/views/decidim/admin/components/_component.html.erb +40 -33
- data/app/views/decidim/admin/components/_form.html.erb +4 -0
- data/app/views/decidim/admin/components/_settings_fields.html.erb +2 -2
- data/app/views/decidim/admin/components/index.html.erb +11 -8
- data/app/views/decidim/admin/dashboard/show.html.erb +49 -9
- data/app/views/decidim/admin/exports/_dropdown.html.erb +6 -2
- data/app/views/decidim/admin/impersonatable_users/index.html.erb +2 -2
- data/app/views/decidim/admin/metrics/_metrics.html.erb +21 -0
- data/app/views/decidim/admin/metrics/index.html.erb +7 -0
- data/app/views/decidim/admin/newsletter_templates/index.html.erb +28 -0
- data/app/views/decidim/admin/newsletter_templates/show.html.erb +12 -0
- data/app/views/decidim/admin/newsletters/_form.html.erb +1 -7
- data/app/views/decidim/admin/newsletters/edit.html.erb +1 -1
- data/app/views/decidim/admin/newsletters/index.html.erb +9 -3
- data/app/views/decidim/admin/newsletters/new.html.erb +1 -1
- data/app/views/decidim/admin/newsletters/select_recipients_to_deliver.html.erb +4 -4
- data/app/views/decidim/admin/officializations/_show_email_modal.html.erb +31 -0
- data/app/views/decidim/admin/officializations/index.html.erb +9 -41
- data/app/views/decidim/admin/officializations/show_email.html.erb +2 -0
- data/app/views/decidim/admin/organization/_form.html.erb +37 -0
- data/app/views/decidim/admin/organization_appearance/_form.html.erb +2 -72
- data/app/views/decidim/admin/organization_appearance/form/_colors.html.erb +23 -0
- data/app/views/decidim/admin/organization_appearance/form/_images.html.erb +38 -0
- data/app/views/decidim/admin/organization_appearance/form/_minimap.html.erb +46 -0
- data/app/views/decidim/admin/resource_permissions/_options_form.html.erb +1 -1
- data/app/views/decidim/admin/share_tokens/_share_tokens.html.erb +57 -0
- data/app/views/decidim/admin/shared/_filters.html.erb +40 -0
- data/app/views/decidim/admin/shared/_gallery.html.erb +21 -0
- data/app/views/decidim/admin/static_pages/_form.html.erb +1 -1
- data/app/views/decidim/admin/user_groups/index.html.erb +4 -4
- data/app/views/decidim/admin/users_statistics/_users_count.html.erb +39 -0
- data/app/views/layouts/decidim/admin/_application.html.erb +2 -1
- data/app/views/layouts/decidim/admin/_header.html.erb +3 -0
- data/app/views/layouts/decidim/admin/_title_bar.html.erb +20 -10
- data/app/views/layouts/decidim/admin/newsletters.erb +1 -1
- data/config/locales/am-ET.yml +1 -0
- data/config/locales/ar.yml +52 -47
- data/config/locales/bg-BG.yml +16 -0
- data/config/locales/bg.yml +135 -0
- data/config/locales/ca.yml +127 -48
- data/config/locales/cs.yml +182 -103
- data/config/locales/da-DK.yml +1 -0
- data/config/locales/da.yml +1 -0
- data/config/locales/de.yml +145 -47
- data/config/locales/el.yml +819 -0
- data/config/locales/en.yml +127 -48
- data/config/locales/eo-UY.yml +0 -1
- data/config/locales/eo.yml +51 -0
- data/config/locales/es-MX.yml +127 -48
- data/config/locales/es-PY.yml +127 -48
- data/config/locales/es.yml +127 -48
- data/config/locales/et-EE.yml +1 -0
- data/config/locales/et.yml +1 -0
- data/config/locales/eu.yml +21 -47
- data/config/locales/fi-plain.yml +127 -48
- data/config/locales/fi.yml +140 -61
- data/config/locales/fr-CA.yml +849 -0
- data/config/locales/fr.yml +133 -53
- data/config/locales/ga-IE.yml +1 -0
- data/config/locales/gl.yml +21 -47
- data/config/locales/hr-HR.yml +1 -0
- data/config/locales/hr.yml +1 -0
- data/config/locales/hu.yml +100 -48
- data/config/locales/id-ID.yml +21 -47
- data/config/locales/is-IS.yml +19 -45
- data/config/locales/is.yml +568 -0
- data/config/locales/it.yml +132 -83
- data/config/locales/ja-JP.yml +855 -0
- data/config/locales/ja.yml +849 -0
- data/config/locales/ko-KR.yml +1 -0
- data/config/locales/ko.yml +1 -0
- data/config/locales/lt-LT.yml +1 -0
- data/config/locales/lt.yml +1 -0
- data/config/locales/lv.yml +799 -0
- data/config/locales/mt-MT.yml +1 -0
- data/config/locales/mt.yml +1 -0
- data/config/locales/nl.yml +102 -48
- data/config/locales/no.yml +147 -84
- data/config/locales/om-ET.yml +1 -0
- data/config/locales/pl.yml +364 -238
- data/config/locales/pt-BR.yml +22 -48
- data/config/locales/pt.yml +334 -237
- data/config/locales/ro-RO.yml +814 -0
- data/config/locales/ru.yml +20 -46
- data/config/locales/sk-SK.yml +823 -0
- data/config/locales/sk.yml +806 -0
- data/config/locales/sl.yml +166 -0
- data/config/locales/so-SO.yml +1 -0
- data/config/locales/sr-CS.yml +590 -0
- data/config/locales/sv.yml +140 -55
- data/config/locales/ti-ER.yml +1 -0
- data/config/locales/tr-TR.yml +21 -47
- data/config/locales/uk.yml +19 -48
- data/config/locales/vi-VN.yml +1 -0
- data/config/locales/vi.yml +1 -0
- data/config/locales/zh-CN.yml +849 -0
- data/config/locales/zh-TW.yml +1 -0
- data/config/routes.rb +20 -3
- data/db/migrate/20191118112040_add_accepted_admin_terms_at_field_to_users.rb +7 -0
- data/lib/decidim/admin.rb +17 -0
- data/lib/decidim/admin/engine.rb +12 -9
- data/lib/decidim/admin/form_builder.rb +7 -2
- data/lib/decidim/admin/test.rb +2 -0
- data/lib/decidim/admin/test/filterable_examples.rb +129 -0
- data/lib/decidim/admin/test/manage_attachment_collections_examples.rb +1 -1
- data/lib/decidim/admin/test/manage_component_permissions_examples.rb +15 -15
- data/lib/decidim/admin/test/manage_paginated_collection_examples.rb +22 -0
- data/lib/decidim/admin/version.rb +1 -1
- data/vendor/assets/javascripts/jquery.serializejson.js +344 -0
- metadata +98 -30
- data/app/commands/decidim/admin/create_oauth_application.rb +0 -36
- data/app/commands/decidim/admin/destroy_oauth_application.rb +0 -39
- data/app/commands/decidim/admin/update_oauth_application.rb +0 -39
- data/app/controllers/decidim/admin/oauth_applications_controller.rb +0 -90
- data/app/forms/decidim/admin/oauth_application_form.rb +0 -32
- data/app/views/decidim/admin/oauth_applications/_form.html.erb +0 -19
- data/app/views/decidim/admin/oauth_applications/edit.html.erb +0 -13
- data/app/views/decidim/admin/oauth_applications/index.html.erb +0 -40
- data/app/views/decidim/admin/oauth_applications/new.html.erb +0 -13
- 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(
|
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).
|
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(
|
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
|
-
@
|
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
|
-
|
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
|
-
|
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 <
|
6
|
+
class NewsletterForm < ContentBlockForm
|
7
7
|
mimic :newsletter
|
8
8
|
|
9
9
|
include TranslatableAttributes
|
10
10
|
|
11
11
|
translatable_attribute :subject, String
|
12
|
-
|
13
|
-
|
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
|
-
|
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
|
-
|
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?
|