decidim-admin 0.6.8 → 0.7.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-admin might be problematic. Click here for more details.

Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/decidim/admin/modules/_table-list.scss +1 -0
  3. data/app/commands/decidim/admin/close_session_managed_user.rb +1 -1
  4. data/app/commands/decidim/admin/reject_user_group.rb +1 -1
  5. data/app/commands/decidim/admin/update_feature.rb +1 -1
  6. data/app/commands/decidim/admin/update_organization.rb +5 -26
  7. data/app/commands/decidim/admin/update_organization_appearance.rb +72 -0
  8. data/app/commands/decidim/admin/verify_user_group.rb +1 -1
  9. data/app/controllers/decidim/admin/organization_appearance_controller.rb +32 -0
  10. data/app/controllers/decidim/admin/organization_controller.rb +1 -15
  11. data/app/controllers/decidim/admin/scopes_controller.rb +2 -2
  12. data/app/controllers/decidim/admin/static_pages_controller.rb +1 -1
  13. data/app/forms/decidim/admin/organization_appearance_form.rb +41 -0
  14. data/app/forms/decidim/admin/organization_form.rb +0 -23
  15. data/app/forms/decidim/admin/scope_form.rb +3 -2
  16. data/app/forms/decidim/admin/static_page_form.rb +2 -1
  17. data/app/jobs/decidim/admin/newsletter_delivery_job.rb +2 -0
  18. data/app/models/decidim/admin/abilities/admin_ability.rb +2 -1
  19. data/app/views/decidim/admin/exports/_dropdown.html.erb +2 -2
  20. data/app/views/decidim/admin/organization/_form.html.erb +0 -45
  21. data/app/views/decidim/admin/organization/edit.html.erb +1 -1
  22. data/app/views/decidim/admin/organization_appearance/_form.html.erb +78 -0
  23. data/app/views/decidim/admin/organization_appearance/edit.html.erb +7 -0
  24. data/app/views/layouts/decidim/admin/_title_bar.html.erb +1 -1
  25. data/app/views/layouts/decidim/admin/settings.html.erb +4 -1
  26. data/config/locales/ca.yml +25 -8
  27. data/config/locales/en.yml +22 -5
  28. data/config/locales/es.yml +24 -7
  29. data/config/locales/eu.yml +37 -20
  30. data/config/locales/fi.yml +36 -19
  31. data/config/locales/fr.yml +30 -13
  32. data/config/locales/it.yml +22 -5
  33. data/config/locales/nl.yml +22 -5
  34. data/config/locales/pl.yml +22 -5
  35. data/config/locales/ru.yml +468 -0
  36. data/config/locales/uk.yml +61 -44
  37. data/config/routes.rb +3 -1
  38. data/lib/decidim/admin/engine.rb +1 -1
  39. data/lib/decidim/admin/version.rb +10 -0
  40. metadata +19 -40
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3ccb01ac339fc58733de0b80646a81932272c0f8
4
- data.tar.gz: 4e28efb0072d97e8e479dfa5efd2184a83187ace
3
+ metadata.gz: d1eef3366bf3923dc3a182dd47ded1793fc4e45f
4
+ data.tar.gz: 3703c4263bd73e9636c2b6b6299667483282def8
5
5
  SHA512:
6
- metadata.gz: eb4b47d84eaf6f6f17e0c53db999b54582af2a63b638d50d063e323e432cbe49cbea3474890c0736569c287eb02ff7ee61e3e38782b0648bbbcefbaa14704036
7
- data.tar.gz: 3b0979b25627ee94a5f2d6b4182a360797f34bbe041973ba3e6a9d850e08c566a4ba57a61371029f7187c4c575e3818d8353a33a86ff21c3d475eb07ed16c8b6
6
+ metadata.gz: 952ea7070267a85a63cfd0d2b5622d4743eade8be84d749e6e21131a4ae7f1d58157a481c05dfaf4d5b1730dcff9def21a373879a55f8cbb4333ed8b73c5f0dc
7
+ data.tar.gz: 76a770ac9c0585b06043ce084326d5cf0d614bf400f06ea70f520a666ea8d3194333c4889557055ba647b46c886519c46add8219e34f07586826470c8400c76a
@@ -1,5 +1,6 @@
1
1
  //Override Foundation defaults
2
2
  .table-scroll table{
3
+ border-collapse: unset;
3
4
  width: 100%;
4
5
  }
5
6
 
@@ -20,7 +20,7 @@ module Decidim
20
20
  #
21
21
  # Returns nothing.
22
22
  def call
23
- return broadcast(:invalid) unless impersonation_log.present?
23
+ return broadcast(:invalid) if impersonation_log.blank?
24
24
 
25
25
  close_session
26
26
 
@@ -26,7 +26,7 @@ module Decidim
26
26
  private
27
27
 
28
28
  def reject_user_group
29
- @user_group.update_attributes(rejected_at: Time.current, verified_at: nil)
29
+ @user_group.update_attributes!(rejected_at: Time.current, verified_at: nil)
30
30
  end
31
31
  end
32
32
  end
@@ -33,7 +33,7 @@ module Decidim
33
33
  private
34
34
 
35
35
  def update_feature
36
- @feature.update_attributes(
36
+ @feature.update_attributes!(
37
37
  name: form.name,
38
38
  settings: form.settings,
39
39
  default_step_settings: form.default_step_settings,
@@ -23,15 +23,8 @@ module Decidim
23
23
  def call
24
24
  return broadcast(:invalid) if form.invalid?
25
25
 
26
- update_organization
27
-
28
- if @organization.valid?
29
- broadcast(:ok, @organization)
30
- else
31
- form.errors.add(:official_img_header, @organization.errors[:official_img_header]) if @organization.errors.include? :official_img_header
32
- form.errors.add(:official_img_footer, @organization.errors[:official_img_footer]) if @organization.errors.include? :official_img_footer
33
- broadcast(:invalid)
34
- end
26
+ return broadcast(:ok, @organization) if update_organization
27
+ broadcast(:invalid)
35
28
  end
36
29
 
37
30
  private
@@ -46,27 +39,13 @@ module Decidim
46
39
  def attributes
47
40
  {
48
41
  name: form.name,
42
+ default_locale: form.default_locale,
43
+ reference_prefix: form.reference_prefix,
49
44
  twitter_handler: form.twitter_handler,
50
45
  facebook_handler: form.facebook_handler,
51
46
  instagram_handler: form.instagram_handler,
52
47
  youtube_handler: form.youtube_handler,
53
- github_handler: form.github_handler,
54
- description: form.description,
55
- welcome_text: form.welcome_text,
56
- homepage_image: form.homepage_image,
57
- remove_homepage_image: form.remove_homepage_image,
58
- logo: form.logo,
59
- remove_logo: form.remove_logo,
60
- favicon: form.favicon,
61
- remove_favicon: form.remove_favicon,
62
- default_locale: form.default_locale,
63
- official_img_header: form.official_img_header,
64
- remove_official_img_header: form.remove_official_img_header,
65
- official_img_footer: form.official_img_footer,
66
- remove_official_img_footer: form.remove_official_img_footer,
67
- official_url: form.official_url,
68
- header_snippets: form.header_snippets,
69
- show_statistics: form.show_statistics
48
+ github_handler: form.github_handler
70
49
  }
71
50
  end
72
51
  end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ # A command with all the business logic for updating the current
6
+ # organization appearance.
7
+ class UpdateOrganizationAppearance < Rectify::Command
8
+ # Public: Initializes the command.
9
+ #
10
+ # organization - The Organization that will be updated.
11
+ # form - A form object with the params.
12
+ def initialize(organization, form)
13
+ @organization = organization
14
+ @form = form
15
+ end
16
+
17
+ # Executes the command. Broadcasts these events:
18
+ #
19
+ # - :ok when everything is valid.
20
+ # - :invalid if the form wasn't valid and we couldn't proceed.
21
+ #
22
+ # Returns nothing.
23
+ def call
24
+ return broadcast(:invalid) if form.invalid?
25
+
26
+ update_organization
27
+
28
+ if @organization.valid?
29
+ broadcast(:ok, @organization)
30
+ else
31
+ form.errors.add(:official_img_header, @organization.errors[:official_img_header]) if @organization.errors.include? :official_img_header
32
+ form.errors.add(:official_img_footer, @organization.errors[:official_img_footer]) if @organization.errors.include? :official_img_footer
33
+ broadcast(:invalid)
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ attr_reader :form, :organization
40
+
41
+ def update_organization
42
+ @organization.assign_attributes(attributes)
43
+ @organization.save! if @organization.valid?
44
+ end
45
+
46
+ def attributes
47
+ {
48
+ cta_button_path: form.cta_button_path,
49
+ cta_button_text: form.cta_button_text,
50
+ description: form.description,
51
+ welcome_text: form.welcome_text,
52
+ homepage_image: form.homepage_image,
53
+ remove_homepage_image: form.remove_homepage_image,
54
+ logo: form.logo,
55
+ remove_logo: form.remove_logo,
56
+ favicon: form.favicon,
57
+ remove_favicon: form.remove_favicon,
58
+ official_img_header: form.official_img_header,
59
+ remove_official_img_header: form.remove_official_img_header,
60
+ official_img_footer: form.official_img_footer,
61
+ remove_official_img_footer: form.remove_official_img_footer,
62
+ official_url: form.official_url,
63
+ show_statistics: form.show_statistics
64
+ }.tap do |attributes|
65
+ if Decidim.enable_html_header_snippets
66
+ attributes[:header_snippets] = form.header_snippets
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -25,7 +25,7 @@ module Decidim
25
25
  private
26
26
 
27
27
  def verify_user_group
28
- @user_group.update_attributes(verified_at: Time.current, rejected_at: nil)
28
+ @user_group.update_attributes!(verified_at: Time.current, rejected_at: nil)
29
29
  end
30
30
  end
31
31
  end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ # Controller that allows managing the appearance of the organization.
6
+ class OrganizationAppearanceController < Decidim::Admin::ApplicationController
7
+ layout "decidim/admin/settings"
8
+
9
+ def edit
10
+ authorize! :update, current_organization
11
+ @form = form(OrganizationAppearanceForm).from_model(current_organization)
12
+ end
13
+
14
+ def update
15
+ authorize! :update, current_organization
16
+ @form = form(OrganizationAppearanceForm).from_params(params)
17
+
18
+ UpdateOrganizationAppearance.call(current_organization, @form) do
19
+ on(:ok) do
20
+ flash[:notice] = I18n.t("organization.update.success", scope: "decidim.admin")
21
+ redirect_to edit_organization_appearance_path
22
+ end
23
+
24
+ on(:invalid) do
25
+ flash.now[:alert] = I18n.t("organization.update.error", scope: "decidim.admin")
26
+ render :edit
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -14,7 +14,7 @@ module Decidim
14
14
 
15
15
  def update
16
16
  authorize! :update, current_organization
17
- @form = form(OrganizationForm).from_params(organization_params)
17
+ @form = form(OrganizationForm).from_params(params)
18
18
 
19
19
  UpdateOrganization.call(current_organization, @form) do
20
20
  on(:ok) do
@@ -28,20 +28,6 @@ module Decidim
28
28
  end
29
29
  end
30
30
  end
31
-
32
- private
33
-
34
- def organization_params
35
- params[:organization] ||= {}
36
- params[:organization][:id] ||= current_organization.id
37
- {
38
- homepage_image: current_organization.homepage_image,
39
- logo: current_organization.logo,
40
- favicon: current_organization.favicon,
41
- official_img_header: current_organization.official_img_header,
42
- official_img_footer: current_organization.official_img_footer
43
- }.merge(params[:organization].to_unsafe_h)
44
- end
45
31
  end
46
32
  end
47
33
  end
@@ -73,12 +73,12 @@ module Decidim
73
73
 
74
74
  def parent_scope
75
75
  return @parent_scope if defined?(@parent_scope)
76
- @parent_scope = scope ? scope.parent : organization_scopes.find_by_id(params[:scope_id])
76
+ @parent_scope = scope ? scope.parent : organization_scopes.find_by(id: params[:scope_id])
77
77
  end
78
78
 
79
79
  def scope
80
80
  return @scope if defined?(@scope)
81
- @scope = organization_scopes.find_by_id(params[:id])
81
+ @scope = organization_scopes.find_by(id: params[:id])
82
82
  end
83
83
 
84
84
  def children_scopes
@@ -84,7 +84,7 @@ module Decidim
84
84
  end
85
85
 
86
86
  def page
87
- @page ||= collection.find_by_slug(params[:id])
87
+ @page ||= collection.find_by(slug: params[:id])
88
88
  end
89
89
 
90
90
  def collection
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ # A form object used to update the current organization appearance from the admin
6
+ # dashboard.
7
+ #
8
+ class OrganizationAppearanceForm < Form
9
+ include TranslatableAttributes
10
+
11
+ mimic :organization_appearance
12
+
13
+ attribute :homepage_image
14
+ attribute :remove_homepage_image
15
+ attribute :logo
16
+ attribute :remove_logo
17
+ attribute :favicon
18
+ attribute :remove_favicon
19
+ attribute :official_img_header
20
+ attribute :remove_official_img_header
21
+ attribute :official_img_footer
22
+ attribute :remove_official_img_footer
23
+ attribute :official_url
24
+ attribute :show_statistics, Boolean
25
+ attribute :header_snippets, String
26
+ attribute :cta_button_path, String
27
+
28
+ translatable_attribute :cta_button_text, String
29
+ translatable_attribute :description, String
30
+ translatable_attribute :welcome_text, String
31
+
32
+ validates :cta_button_path, format: { with: %r{\A[a-zA-Z]+[a-zA-Z0-9-/]+\z} }, allow_blank: true
33
+ validates :official_img_header,
34
+ :official_img_footer,
35
+ :homepage_image,
36
+ :logo,
37
+ file_size: { less_than_or_equal_to: ->(_record) { Decidim.maximum_attachment_size } },
38
+ file_content_type: { allow: ["image/jpeg", "image/png"] }
39
+ end
40
+ end
41
+ end
@@ -18,34 +18,11 @@ module Decidim
18
18
  attribute :youtube_handler, String
19
19
  attribute :github_handler, String
20
20
  attribute :default_locale, String
21
- attribute :homepage_image
22
- attribute :remove_homepage_image
23
- attribute :logo
24
- attribute :remove_logo
25
- attribute :favicon
26
- attribute :remove_favicon
27
- attribute :official_url
28
- attribute :official_img_header
29
- attribute :remove_official_img_header
30
- attribute :official_img_footer
31
- attribute :remove_official_img_footer
32
- attribute :show_statistics
33
- attribute :header_snippets, String
34
-
35
- translatable_attribute :description, String
36
- translatable_attribute :welcome_text, String
37
21
 
38
22
  validates :name, presence: true
39
23
  validates :default_locale, presence: true
40
24
  validates :default_locale, inclusion: { in: :available_locales }
41
25
 
42
- validates :official_img_header,
43
- file_size: { less_than_or_equal_to: ->(_record) { Decidim.maximum_attachment_size } },
44
- file_content_type: { allow: ["image/jpeg", "image/png"] }
45
- validates :official_img_footer,
46
- file_size: { less_than_or_equal_to: ->(_record) { Decidim.maximum_attachment_size } },
47
- file_content_type: { allow: ["image/jpeg", "image/png"] }
48
-
49
26
  private
50
27
 
51
28
  def available_locales
@@ -21,13 +21,14 @@ module Decidim
21
21
  alias organization current_organization
22
22
 
23
23
  def scope_type
24
- Decidim::ScopeType.find_by_id(scope_type_id) if scope_type_id
24
+ Decidim::ScopeType.find_by(id: scope_type_id) if scope_type_id
25
25
  end
26
26
 
27
27
  private
28
28
 
29
29
  def code_uniqueness
30
- return unless organization && organization.scopes.where(code: code).where.not(id: id).any?
30
+ return unless organization
31
+ return unless organization.scopes.where(code: code).where.not(id: id).any?
31
32
 
32
33
  errors.add(:code, :taken)
33
34
  end
@@ -27,7 +27,8 @@ module Decidim
27
27
  private
28
28
 
29
29
  def slug_uniqueness
30
- return unless organization && organization.static_pages.where(slug: slug).where.not(id: id).any?
30
+ return unless organization
31
+ return unless organization.static_pages.where(slug: slug).where.not(id: id).any?
31
32
 
32
33
  errors.add(:slug, :taken)
33
34
  end
@@ -10,9 +10,11 @@ module Decidim
10
10
  def perform(user, newsletter)
11
11
  NewsletterMailer.newsletter(user, newsletter).deliver_now
12
12
 
13
+ # rubocop:disable Rails/SkipsModelValidations
13
14
  newsletter.with_lock do
14
15
  newsletter.increment!(:total_deliveries)
15
16
  end
17
+ # rubocop:enable Rails/SkipsModelValidations
16
18
  end
17
19
  end
18
20
  end
@@ -50,7 +50,8 @@ module Decidim
50
50
  private
51
51
 
52
52
  def empty_available_authorizations?
53
- @context[:current_organization] && @context[:current_organization].available_authorizations.empty?
53
+ return unless @context[:current_organization]
54
+ @context[:current_organization].available_authorizations.empty?
54
55
  end
55
56
  end
56
57
  end
@@ -2,8 +2,8 @@
2
2
  <div class="dropdown-pane" id="export-dropdown" data-dropdown data-auto-focus="true" data-close-on-click="true">
3
3
  <ul class="vertical menu add-features">
4
4
  <% feature.manifest.export_manifests.each do |manifest| %>
5
- <% %w{csv json}.each do |format| %>
6
- <li class="exports--format--<%= format %> exports--<%= manifest.name %>"><%= link_to t("decidim.admin.exports.export_as", name: t("decidim.#{feature.manifest.name}.admin.exports.#{manifest.name}"), export_format: format.upcase), exports_path(feature, id: manifest.name, format: format), method: :post %></li>
5
+ <% %w{CSV JSON Excel}.each do |format| %>
6
+ <li class="exports--format--<%= format.downcase %> exports--<%= manifest.name %>"><%= link_to t("decidim.admin.exports.export_as", name: t("decidim.#{feature.manifest.name}.admin.exports.#{manifest.name}"), export_format: format.upcase), exports_path(feature, id: manifest.name, format: format), method: :post %></li>
7
7
  <% end %>
8
8
  <% end %>
9
9
  </ul>
@@ -28,57 +28,12 @@
28
28
  </div>
29
29
  </div>
30
30
 
31
- <div class="row column">
32
- <%= form.translated :editor, :description %>
33
- </div>
34
-
35
- <div class="row column">
36
- <%= form.translated :text_area, :welcome_text %>
37
- </div>
38
-
39
31
  <div class="row column">
40
32
  <%= form.collection_select :default_locale, localized_locales(current_organization.available_locales), :id, :name %>
41
33
  </div>
42
34
 
43
- <div class="row">
44
- <div class="columns xlarge-4">
45
- <%= form.upload :homepage_image %>
46
- </div>
47
-
48
- <div class="columns xlarge-4">
49
- <%= form.upload :logo %>
50
- </div>
51
-
52
- <div class="columns xlarge-4">
53
- <%= form.upload :favicon %>
54
- </div>
55
- </div>
56
-
57
- <div class="row">
58
- <div class="columns xlarge-6">
59
- <%= form.upload :official_img_header %>
60
- </div>
61
-
62
- <div class="columns xlarge-6">
63
- <%= form.upload :official_img_footer %>
64
- </div>
65
- </div>
66
-
67
35
  <div class="row">
68
36
  <div class="columns xlarge-6">
69
37
  <%= form.text_field :reference_prefix %>
70
38
  </div>
71
-
72
- <div class="columns xlarge-6">
73
- <%= form.text_field :official_url %>
74
- </div>
75
- </div>
76
-
77
- <div class="row column">
78
- <%= form.check_box :show_statistics %>
79
- </div>
80
-
81
- <div class="row column">
82
- <%= form.text_area :header_snippets %>
83
- <p class="help-text"><%= t(".header_snippets_help") %></p>
84
39
  </div>