decidim-admin 0.4.4 → 0.5.0

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.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/decidim/admin/application.js.es6 +3 -0
  3. data/app/assets/javascripts/decidim/admin/participatory_processes.js.es6 +12 -0
  4. data/app/assets/javascripts/decidim/admin/scopes.js.es6 +20 -0
  5. data/app/assets/javascripts/decidim/admin/select2.js.es6 +8 -0
  6. data/app/assets/stylesheets/decidim/admin/_decidim.scss +2 -0
  7. data/app/assets/stylesheets/decidim/admin/extra/_categories.scss +1 -1
  8. data/app/assets/stylesheets/decidim/admin/extra/_login.scss +1 -1
  9. data/app/assets/stylesheets/decidim/admin/extra/_sort.scss +1 -1
  10. data/app/assets/stylesheets/decidim/admin/modules/_buttons.scss +3 -0
  11. data/app/assets/stylesheets/decidim/admin/modules/_callouts.scss +0 -1
  12. data/app/assets/stylesheets/decidim/admin/modules/_cards.scss +47 -0
  13. data/app/assets/stylesheets/decidim/admin/modules/_secondary-nav.scss +2 -2
  14. data/app/assets/stylesheets/decidim/admin/modules/_typography.scss +1 -1
  15. data/app/assets/stylesheets/decidim/admin/plugins/_select2.scss +27 -0
  16. data/app/assets/stylesheets/decidim/admin/utils/_toggle-expand.scss +1 -1
  17. data/app/commands/decidim/admin/close_session_managed_user.rb +44 -0
  18. data/app/commands/decidim/admin/create_feature.rb +2 -1
  19. data/app/commands/decidim/admin/create_managed_user.rb +61 -0
  20. data/app/commands/decidim/admin/create_scope.rb +7 -2
  21. data/app/commands/decidim/admin/create_scope_type.rb +40 -0
  22. data/app/commands/decidim/admin/impersonate_managed_user.rb +61 -0
  23. data/app/commands/decidim/admin/promote_managed_user.rb +56 -0
  24. data/app/commands/decidim/admin/update_participatory_process.rb +3 -1
  25. data/app/commands/decidim/admin/update_scope.rb +4 -1
  26. data/app/commands/decidim/admin/update_scope_type.rb +45 -0
  27. data/app/controllers/decidim/admin/application_controller.rb +2 -1
  28. data/app/controllers/decidim/admin/categories_controller.rb +3 -3
  29. data/app/controllers/decidim/admin/exports_controller.rb +1 -1
  30. data/app/controllers/decidim/admin/managed_users/impersonations_controller.rb +78 -0
  31. data/app/controllers/decidim/admin/managed_users/promotions_controller.rb +43 -0
  32. data/app/controllers/decidim/admin/managed_users_controller.rb +69 -0
  33. data/app/controllers/decidim/admin/moderations_controller.rb +4 -4
  34. data/app/controllers/decidim/admin/newsletters_controller.rb +1 -1
  35. data/app/controllers/decidim/admin/participatory_processes_controller.rb +0 -5
  36. data/app/controllers/decidim/admin/scope_types_controller.rb +79 -0
  37. data/app/controllers/decidim/admin/scopes_controller.rb +22 -7
  38. data/app/controllers/decidim/admin/user_groups_controller.rb +1 -1
  39. data/app/controllers/decidim/admin/users_controller.rb +1 -2
  40. data/app/forms/decidim/admin/impersonate_managed_user_form.rb +20 -0
  41. data/app/forms/decidim/admin/managed_user_form.rb +35 -0
  42. data/app/forms/decidim/admin/managed_user_promotion_form.rb +13 -0
  43. data/app/forms/decidim/admin/participatory_process_form.rb +2 -0
  44. data/app/forms/decidim/admin/scope_form.rb +17 -6
  45. data/app/forms/decidim/admin/scope_type_form.rb +21 -0
  46. data/app/helpers/decidim/admin/scopes_helper.rb +46 -0
  47. data/app/helpers/decidim/admin/settings_helper.rb +12 -1
  48. data/app/jobs/decidim/admin/expire_impersonation_job.rb +16 -0
  49. data/app/models/decidim/admin/abilities/admin_ability.rb +17 -0
  50. data/app/models/decidim/admin/abilities/user_manager_ability.rb +30 -0
  51. data/app/views/decidim/admin/categories/_form.html.erb +1 -1
  52. data/app/views/decidim/admin/categories/edit.html.erb +1 -1
  53. data/app/views/decidim/admin/categories/index.html.erb +7 -7
  54. data/app/views/decidim/admin/categories/new.html.erb +1 -1
  55. data/app/views/decidim/admin/features/_form.html.erb +6 -3
  56. data/app/views/decidim/admin/features/_settings_fields.html.erb +2 -1
  57. data/app/views/decidim/admin/managed_users/_form.html.erb +12 -0
  58. data/app/views/decidim/admin/managed_users/impersonations/_form.html.erb +10 -0
  59. data/app/views/decidim/admin/managed_users/impersonations/index.html.erb +34 -0
  60. data/app/views/decidim/admin/managed_users/impersonations/new.html.erb +15 -0
  61. data/app/views/decidim/admin/managed_users/index.html.erb +44 -0
  62. data/app/views/decidim/admin/managed_users/new.html.erb +47 -0
  63. data/app/views/decidim/admin/managed_users/promotions/_form.html.erb +3 -0
  64. data/app/views/decidim/admin/managed_users/promotions/new.html.erb +21 -0
  65. data/app/views/decidim/admin/moderations/index.html.erb +4 -4
  66. data/app/views/decidim/admin/participatory_process_copies/_form.html.erb +1 -1
  67. data/app/views/decidim/admin/participatory_process_user_roles/edit.html.erb +1 -1
  68. data/app/views/decidim/admin/participatory_processes/_form.html.erb +13 -8
  69. data/app/views/decidim/admin/participatory_processes/index.html.erb +1 -1
  70. data/app/views/decidim/admin/scope_types/_form.html.erb +7 -0
  71. data/app/views/decidim/admin/scope_types/edit.html.erb +13 -0
  72. data/app/views/decidim/admin/scope_types/index.html.erb +40 -0
  73. data/app/views/decidim/admin/scope_types/new.html.erb +13 -0
  74. data/app/views/decidim/admin/scopes/_form.html.erb +12 -2
  75. data/app/views/decidim/admin/scopes/index.html.erb +19 -7
  76. data/app/views/decidim/admin/scopes/new.html.erb +1 -1
  77. data/app/views/decidim/admin/users/_form.html.erb +4 -0
  78. data/app/views/decidim/admin/users/index.html.erb +2 -0
  79. data/app/views/layouts/decidim/admin/newsletters.erb +1 -1
  80. data/app/views/layouts/decidim/admin/pages.html.erb +1 -1
  81. data/app/views/layouts/decidim/admin/participatory_process.html.erb +4 -4
  82. data/app/views/layouts/decidim/admin/participatory_process_groups.html.erb +1 -1
  83. data/app/views/layouts/decidim/admin/settings.html.erb +4 -1
  84. data/app/views/layouts/decidim/admin/users.html.erb +8 -3
  85. data/config/i18n-tasks.yml +2 -1
  86. data/config/locales/ca.yml +80 -3
  87. data/config/locales/en.yml +82 -2
  88. data/config/locales/es.yml +80 -3
  89. data/config/locales/eu.yml +44 -7
  90. data/config/locales/fi.yml +0 -7
  91. data/config/locales/fr.yml +21 -6
  92. data/config/locales/it.yml +0 -10
  93. data/config/locales/nl.yml +1 -1
  94. data/config/locales/pl.yml +7 -0
  95. data/config/routes.rb +24 -11
  96. data/lib/decidim/admin/engine.rb +6 -3
  97. data/lib/decidim/admin/test/manage_attachments_examples.rb +77 -79
  98. metadata +56 -9
  99. data/app/views/decidim/admin/participatory_processes/show.html.erb +0 -54
@@ -6,10 +6,15 @@ module Decidim
6
6
  #
7
7
  class ScopesController < Decidim::Admin::ApplicationController
8
8
  layout "decidim/admin/settings"
9
+ helper_method :scope, :parent_scope, :add_scope_path, :current_scopes_path
9
10
 
10
11
  def index
11
12
  authorize! :index, Scope
12
- @scopes = collection
13
+ @scopes = if parent_scope
14
+ parent_scope.children
15
+ else
16
+ collection.top_level
17
+ end
13
18
  end
14
19
 
15
20
  def new
@@ -20,11 +25,10 @@ module Decidim
20
25
  def create
21
26
  authorize! :new, Scope
22
27
  @form = form(ScopeForm).from_params(params)
23
-
24
- CreateScope.call(@form) do
28
+ CreateScope.call(@form, parent_scope) do
25
29
  on(:ok) do
26
30
  flash[:notice] = I18n.t("scopes.create.success", scope: "decidim.admin")
27
- redirect_to scopes_path
31
+ redirect_to current_scopes_path
28
32
  end
29
33
 
30
34
  on(:invalid) do
@@ -40,14 +44,13 @@ module Decidim
40
44
  end
41
45
 
42
46
  def update
43
- @scope = collection.find(params[:id])
44
47
  authorize! :update, scope
45
48
  @form = form(ScopeForm).from_params(params)
46
49
 
47
50
  UpdateScope.call(scope, @form) do
48
51
  on(:ok) do
49
52
  flash[:notice] = I18n.t("scopes.update.success", scope: "decidim.admin")
50
- redirect_to scopes_path
53
+ redirect_to current_scopes_path
51
54
  end
52
55
 
53
56
  on(:invalid) do
@@ -63,7 +66,7 @@ module Decidim
63
66
 
64
67
  flash[:notice] = I18n.t("scopes.destroy.success", scope: "decidim.admin")
65
68
 
66
- redirect_to scopes_path
69
+ redirect_to current_scopes_path
67
70
  end
68
71
 
69
72
  private
@@ -72,9 +75,21 @@ module Decidim
72
75
  @scope ||= collection.find(params[:id])
73
76
  end
74
77
 
78
+ def parent_scope
79
+ @parent_scope ||= @scope ? @scope.parent : collection.find_by_id(params[:scope_id])
80
+ end
81
+
75
82
  def collection
76
83
  current_organization.scopes
77
84
  end
85
+
86
+ def current_scopes_path
87
+ if parent_scope
88
+ scope_scopes_path(parent_scope)
89
+ else
90
+ scopes_path
91
+ end
92
+ end
78
93
  end
79
94
  end
80
95
  end
@@ -4,7 +4,7 @@ module Decidim
4
4
  module Admin
5
5
  # Controller that allows managing user groups at the admin panel.
6
6
  #
7
- class UserGroupsController < ApplicationController
7
+ class UserGroupsController < Decidim::Admin::ApplicationController
8
8
  layout "decidim/admin/users"
9
9
 
10
10
  def index
@@ -21,7 +21,6 @@ module Decidim
21
21
  default_params = {
22
22
  organization: current_organization,
23
23
  invitation_instructions: "invite_admin",
24
- admin: true,
25
24
  invited_by: current_user,
26
25
  comments_notifications: true,
27
26
  replies_notifications: true
@@ -81,7 +80,7 @@ module Decidim
81
80
  end
82
81
 
83
82
  def collection
84
- @collection ||= current_organization.admins
83
+ @collection ||= current_organization.admins.or(current_organization.users_with_any_role)
85
84
  end
86
85
  end
87
86
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ # A form object used to impersonate managed users from the admin dashboard.
6
+ #
7
+ # This form will contain a dynamic attribute for the user authorization.
8
+ # This authorization will be selected by the admin user if more than one exists.
9
+ class ImpersonateManagedUserForm < Form
10
+ def initialize(attributes)
11
+ extend(Virtus.model)
12
+
13
+ # Set the authorization dynamic attribute as a nested form class based on the handler name.
14
+ attribute(:authorization, attributes.dig(:authorization, :handler_name).classify.constantize)
15
+
16
+ super
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ # A form object used to create managed users from the admin dashboard.
6
+ #
7
+ # This form will contain a dynamic attribute for the user authorization.
8
+ # This authorization will be selected by the admin user if more than one exists.
9
+ class ManagedUserForm < Form
10
+ attribute :name, String
11
+
12
+ validates :name, presence: true
13
+ validate :authorization_uniqueness
14
+
15
+ def initialize(attributes)
16
+ extend(Virtus.model)
17
+
18
+ # Set the authorization dynamic attribute as a nested form class based on the handler name.
19
+ attribute(:authorization, attributes.dig(:authorization, :handler_name).classify.constantize)
20
+
21
+ super
22
+ end
23
+
24
+ private
25
+
26
+ def authorization_uniqueness
27
+ errors.add :authorization, :invalid if Authorization.where(
28
+ user: current_organization.users,
29
+ name: authorization.handler_name,
30
+ unique_id: authorization.unique_id
31
+ ).exists?
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ # A form object used to promote managed users from the admin dashboard.
6
+ #
7
+ class ManagedUserPromotionForm < Form
8
+ attribute :email, String
9
+
10
+ validates :email, presence: true
11
+ end
12
+ end
13
+ end
@@ -18,6 +18,7 @@ module Decidim
18
18
  translatable_attribute :target, String
19
19
  translatable_attribute :participatory_scope, String
20
20
  translatable_attribute :participatory_structure, String
21
+ translatable_attribute :announcement, String
21
22
 
22
23
  mimic :participatory_process
23
24
 
@@ -25,6 +26,7 @@ module Decidim
25
26
  attribute :slug, String
26
27
  attribute :hashtag, String
27
28
  attribute :promoted, Boolean
29
+ attribute :scopes_enabled, Boolean
28
30
  attribute :scope_id, Integer
29
31
  attribute :hero_image
30
32
  attribute :remove_hero_image
@@ -4,21 +4,32 @@ module Decidim
4
4
  module Admin
5
5
  # A form object to create or update scopes.
6
6
  class ScopeForm < Form
7
- attribute :name, String
7
+ include TranslatableAttributes
8
+
9
+ translatable_attribute :name, String
8
10
  attribute :organization, Decidim::Organization
11
+ attribute :code, String
12
+ attribute :parent_id, Integer
13
+ attribute :scope_type_id, Integer
14
+
9
15
  mimic :scope
10
16
 
11
- validates :name, :organization, presence: true
12
- validate :name, :name_uniqueness
17
+ validates :name, translatable_presence: true
18
+ validates :organization, :code, presence: true
19
+ validate :code, :code_uniqueness
13
20
 
14
21
  alias organization current_organization
15
22
 
23
+ def scope_type
24
+ Decidim::ScopeType.find_by_id(scope_type_id) if scope_type_id
25
+ end
26
+
16
27
  private
17
28
 
18
- def name_uniqueness
19
- return unless organization && organization.scopes.where(name: name).where.not(id: id).any?
29
+ def code_uniqueness
30
+ return unless organization && organization.scopes.where(code: code).where.not(id: id).any?
20
31
 
21
- errors.add(:name, :taken)
32
+ errors.add(:code, :taken)
22
33
  end
23
34
  end
24
35
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ # A form object to create or update scopes.
6
+ class ScopeTypeForm < Form
7
+ include TranslatableAttributes
8
+
9
+ translatable_attribute :name, String
10
+ translatable_attribute :plural, String
11
+ attribute :organization, Decidim::Organization
12
+
13
+ mimic :scope_type
14
+
15
+ validates :name, :plural, translatable_presence: true
16
+ validates :organization, presence: true
17
+
18
+ alias organization current_organization
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ # This module includes helpers to show scopes in admin
6
+ module ScopesHelper
7
+ Option = Struct.new(:id, :name)
8
+
9
+ # Public: This helper shows the path to the given scope, linking each ancestor.
10
+ #
11
+ # current_scope - Scope object to show
12
+ #
13
+ def scope_breadcrumbs(current_scope)
14
+ current_scope.part_of_scopes.map do |scope|
15
+ if scope == current_scope
16
+ translated_attribute(scope.name)
17
+ else
18
+ link_to translated_attribute(scope.name), scope_scopes_path(scope)
19
+ end
20
+ end
21
+ end
22
+
23
+ # Public: A formatted collection of scopes for a given organization to be used
24
+ # in forms.
25
+ #
26
+ # organization - Organization object
27
+ #
28
+ # Returns an Array.
29
+ def organization_scope_types(organization = current_organization)
30
+ [Option.new("", "-")] +
31
+ organization.scope_types.map do |scope_type|
32
+ Option.new(scope_type.id, translated_attribute(scope_type.name))
33
+ end
34
+ end
35
+
36
+ # Public: Check if the given scopable object has the scope enabled or not.
37
+ #
38
+ # scopable - A scopable object.
39
+ #
40
+ # Returns a Boolean.
41
+ def scopes_enabled?(scopable)
42
+ scopable.scopes_enabled?
43
+ end
44
+ end
45
+ end
46
+ end
@@ -23,7 +23,18 @@ module Decidim
23
23
  #
24
24
  # Returns a rendered form field.
25
25
  def settings_attribute_input(form, attribute, name, options = {})
26
- form.send(TYPES[attribute.type.to_sym], name, options)
26
+ if attribute.translated?
27
+ form.send(:translated, form_method_for_attribute(attribute), name, options.merge(tabs_id: "#{options[:tabs_prefix]}-#{name}-tabs"))
28
+ else
29
+ form.send(form_method_for_attribute(attribute), name, options)
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def form_method_for_attribute(attribute)
36
+ return :editor if attribute.type.to_sym == :text && attribute.editor?
37
+ TYPES[attribute.type.to_sym]
27
38
  end
28
39
  end
29
40
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ class ExpireImpersonationJob < ApplicationJob
6
+ queue_as :default
7
+
8
+ def perform(user, current_user)
9
+ impersonation_log = Decidim::ImpersonationLog.where(admin: current_user, user: user).active.first
10
+ return unless impersonation_log
11
+ impersonation_log.expired_at = Time.current
12
+ impersonation_log.save!
13
+ end
14
+ end
15
+ end
16
+ end
@@ -26,9 +26,20 @@ module Decidim
26
26
 
27
27
  can :manage, Feature
28
28
  can :manage, :admin_users
29
+
30
+ can :manage, :managed_users
31
+ cannot [:new, :create], :managed_users if empty_available_authorizations?
32
+ can :impersonate, Decidim::User do |user_to_impersonate|
33
+ user_to_impersonate.managed? && Decidim::ImpersonationLog.active.empty?
34
+ end
35
+ can :promote, Decidim::User do |user_to_promote|
36
+ user_to_promote.managed? && Decidim::ImpersonationLog.active.empty?
37
+ end
38
+
29
39
  can :manage, Moderation
30
40
  can :manage, Attachment
31
41
  can :manage, Scope
42
+ can :manage, ScopeType
32
43
  can :manage, Newsletter
33
44
  can [:create, :index, :new, :read, :invite], User
34
45
 
@@ -38,6 +49,12 @@ module Decidim
38
49
 
39
50
  can [:index, :verify, :reject], UserGroup
40
51
  end
52
+
53
+ private
54
+
55
+ def empty_available_authorizations?
56
+ @context[:current_organization] && @context[:current_organization].available_authorizations.empty?
57
+ end
41
58
  end
42
59
  end
43
60
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ module Abilities
6
+ # Defines the abilities for a user with role 'user_manager' in the admin section.
7
+ # Intended to be used with `cancancan`.
8
+ class UserManagerAbility < Decidim::Abilities::UserManagerAbility
9
+ def define_abilities
10
+ super
11
+
12
+ can :manage, :managed_users
13
+ cannot [:new, :create], :managed_users if empty_available_authorizations?
14
+ can :impersonate, Decidim::User do |user_to_impersonate|
15
+ user_to_impersonate.managed? && Decidim::ImpersonationLog.active.empty?
16
+ end
17
+ can :promote, Decidim::User do |user_to_promote|
18
+ user_to_promote.managed? && Decidim::ImpersonationLog.active.empty?
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def empty_available_authorizations?
25
+ @context[:current_organization] && @context[:current_organization].available_authorizations.empty?
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -17,4 +17,4 @@
17
17
  <%= select :category, :parent_id, @form.parent_categories.collect { |c| [c.name[current_organization.default_locale], c.id] }, include_blank: true %>
18
18
  </div>
19
19
  </div>
20
- </div>
20
+ </div>
@@ -1,4 +1,4 @@
1
- <%= decidim_form_for(@form, url: participatory_process_category_path(@category.participatory_process, @category), html: { class: "form edit_participatory_process_category" }) do |f| %>
1
+ <%= decidim_form_for(@form, url: category_path(@category.participatory_process, @category), html: { class: "form edit_participatory_process_category" }) do |f| %>
2
2
  <%= render partial: 'form', object: f, locals: { title: t('.title') } %>
3
3
 
4
4
  <div class="button--double form-general-submit">
@@ -3,7 +3,7 @@
3
3
  <h2 class='card-title'>
4
4
  <%= t(".categories_title") %>
5
5
  <% if can? :create, Decidim::Category %>
6
- <%= link_to t("actions.new", scope: "decidim.admin", name: t("models.category.name", scope: "decidim.admin")), new_participatory_process_category_path(current_participatory_process), class: 'button tiny button--title new' %>
6
+ <%= link_to t("actions.new", scope: "decidim.admin", name: t("models.category.name", scope: "decidim.admin")), new_category_path(current_participatory_process), class: 'button tiny button--title new' %>
7
7
  <% end %>
8
8
  </h2>
9
9
  </div>
@@ -22,16 +22,16 @@
22
22
  <% current_participatory_process.categories.first_class.each do |category| %>
23
23
  <tr>
24
24
  <td>
25
- <%= link_to translated_attribute(category.name), edit_participatory_process_category_path(current_participatory_process, category) %><br />
25
+ <%= link_to translated_attribute(category.name), edit_category_path(current_participatory_process, category) %><br />
26
26
  </td>
27
27
  <td class="table-list__actions">
28
28
  <% if can? :update, category %>
29
- <%= icon_link_to "pencil", edit_participatory_process_category_path(current_participatory_process, category), t("actions.edit", scope: "decidim.admin"), class: "action-icon--edit" %>
29
+ <%= icon_link_to "pencil", edit_category_path(current_participatory_process, category), t("actions.edit", scope: "decidim.admin"), class: "action-icon--edit" %>
30
30
  <% end %>
31
31
 
32
32
  <% if can? :destroy, category %>
33
33
  <% if category.unused? %>
34
- <%= icon_link_to "circle-x", participatory_process_category_path(current_participatory_process, category), t("actions.destroy", scope: "decidim.admin"), class: "action-icon--remove", method: :delete, data: { confirm: t("actions.confirm_destroy", scope: "decidim.admin") } %>
34
+ <%= icon_link_to "circle-x", category_path(current_participatory_process, category), t("actions.destroy", scope: "decidim.admin"), class: "action-icon--remove", method: :delete, data: { confirm: t("actions.confirm_destroy", scope: "decidim.admin") } %>
35
35
  <% else %>
36
36
  <span class="action-icon" title="<%= t('.category_used') %>" data-tooltip="true" data-disable-hover="false">
37
37
  <%= icon "circle-x", class: "action-icon action-icon--disabled" %>
@@ -43,15 +43,15 @@
43
43
  <% category.subcategories.each do |subcategory| %>
44
44
  <tr class="extra__table-list__subcategory">
45
45
  <td>
46
- <%= link_to translated_attribute(subcategory.name), edit_participatory_process_category_path(current_participatory_process, subcategory) %><br />
46
+ <%= link_to translated_attribute(subcategory.name), edit_category_path(current_participatory_process, subcategory) %><br />
47
47
  </td>
48
48
  <td class="table-list__actions">
49
49
  <% if can? :update, subcategory %>
50
- <%= icon_link_to "pencil", edit_participatory_process_category_path(current_participatory_process, subcategory), t("actions.edit", scope: "decidim.admin"), class: "action-icon--edit" %>
50
+ <%= icon_link_to "pencil", edit_category_path(current_participatory_process, subcategory), t("actions.edit", scope: "decidim.admin"), class: "action-icon--edit" %>
51
51
  <% end %>
52
52
 
53
53
  <% if can? :destroy, subcategory %>
54
- <%= icon_link_to "circle-x", participatory_process_category_path(current_participatory_process, subcategory), t("actions.destroy", scope: "decidim.admin"), class: "action-icon--remove", method: :delete, data: { confirm: t("actions.confirm_destroy", scope: "decidim.admin") } %>
54
+ <%= icon_link_to "circle-x", category_path(current_participatory_process, subcategory), t("actions.destroy", scope: "decidim.admin"), class: "action-icon--remove", method: :delete, data: { confirm: t("actions.confirm_destroy", scope: "decidim.admin") } %>
55
55
  <% end %>
56
56
  </td>
57
57
  </tr>