decidim-admin 0.29.2 → 0.30.0.rc2
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.
- checksums.yaml +4 -4
- data/app/cells/decidim/admin/multi_select_picker/show.erb +10 -0
- data/app/cells/decidim/admin/multi_select_picker_cell.rb +38 -0
- data/app/commands/decidim/admin/bulk_action.rb +92 -0
- data/app/commands/decidim/admin/bulk_block_users.rb +75 -0
- data/app/commands/decidim/admin/bulk_unblock_users.rb +66 -0
- data/app/commands/decidim/admin/bulk_unreport_users.rb +69 -0
- data/app/commands/decidim/admin/content_blocks/update_content_block.rb +1 -1
- data/app/commands/decidim/admin/create_participatory_space_private_user.rb +3 -1
- data/app/commands/decidim/admin/create_share_token.rb +39 -0
- data/app/commands/decidim/admin/create_taxonomy.rb +23 -0
- data/app/commands/decidim/admin/create_taxonomy_filter.rb +24 -0
- data/app/commands/decidim/admin/destroy_share_token.rb +22 -0
- data/app/commands/decidim/admin/destroy_taxonomy.rb +18 -0
- data/app/commands/decidim/admin/destroy_taxonomy_filter.rb +20 -0
- data/app/commands/decidim/admin/hide_menu_component.rb +37 -0
- data/app/commands/decidim/admin/hide_resource.rb +4 -3
- data/app/commands/decidim/admin/publish_all_participatory_space_private_users.rb +50 -0
- data/app/commands/decidim/admin/publish_component.rb +3 -0
- data/app/commands/decidim/admin/reorder_components.rb +47 -0
- data/app/commands/decidim/admin/reorder_taxonomies.rb +76 -0
- data/app/commands/decidim/admin/unhide_resource.rb +11 -3
- data/app/commands/decidim/admin/unpublish_all_participatory_space_private_users.rb +50 -0
- data/app/commands/decidim/admin/unreport_resource.rb +11 -3
- data/app/commands/decidim/admin/update_component_permissions.rb +53 -13
- data/app/commands/decidim/admin/update_participatory_space_private_user.rb +11 -0
- data/app/commands/decidim/admin/update_share_token.rb +24 -0
- data/app/commands/decidim/admin/update_taxonomy.rb +20 -0
- data/app/commands/decidim/admin/update_taxonomy_filter.rb +28 -0
- data/app/controllers/concerns/decidim/admin/component_taxonomies_helper.rb +19 -0
- data/app/controllers/concerns/decidim/admin/filterable.rb +15 -18
- data/app/controllers/concerns/decidim/admin/has_trashable_resources.rb +170 -0
- data/app/controllers/concerns/decidim/admin/needs_admin_tos_accepted.rb +2 -29
- data/app/controllers/concerns/decidim/admin/participatory_space_admin_context.rb +12 -2
- data/app/controllers/concerns/decidim/admin/taxonomies/filterable.rb +27 -0
- data/app/controllers/decidim/admin/application_controller.rb +1 -2
- data/app/controllers/decidim/admin/areas_controller.rb +1 -0
- data/app/controllers/decidim/admin/block_user_controller.rb +42 -0
- data/app/controllers/decidim/admin/component_permissions_controller.rb +2 -4
- data/app/controllers/decidim/admin/components_controller.rb +50 -9
- data/app/controllers/decidim/admin/concerns/has_private_users.rb +59 -2
- data/app/controllers/decidim/admin/global_moderations_controller.rb +4 -0
- data/app/controllers/decidim/admin/moderated_users_controller.rb +26 -0
- data/app/controllers/decidim/admin/moderations_controller.rb +18 -0
- data/app/controllers/decidim/admin/newsletters_controller.rb +50 -7
- data/app/controllers/decidim/admin/resource_permissions_controller.rb +1 -1
- data/app/controllers/decidim/admin/scopes_controller.rb +1 -0
- data/app/controllers/decidim/admin/share_tokens_controller.rb +109 -7
- data/app/controllers/decidim/admin/taxonomies_controller.rb +129 -0
- data/app/controllers/decidim/admin/taxonomy_filters_controller.rb +112 -0
- data/app/controllers/decidim/admin/taxonomy_filters_selector_controller.rb +81 -0
- data/app/controllers/decidim/admin/taxonomy_items_controller.rb +91 -0
- data/app/forms/concerns/decidim/has_taxonomy_form_attributes.rb +57 -0
- data/app/forms/decidim/admin/block_users_form.rb +21 -0
- data/app/forms/decidim/admin/import_example_form.rb +1 -1
- data/app/forms/decidim/admin/newsletter_form.rb +1 -1
- data/app/forms/decidim/admin/participatory_space_private_user_form.rb +5 -0
- data/app/forms/decidim/admin/selective_newsletter_form.rb +46 -11
- data/app/forms/decidim/admin/share_token_form.rb +55 -0
- data/app/forms/decidim/admin/taxonomy_filter_form.rb +85 -0
- data/app/forms/decidim/admin/taxonomy_form.rb +20 -0
- data/app/forms/decidim/admin/taxonomy_item_form.rb +54 -0
- data/app/helpers/decidim/admin/application_helper.rb +0 -1
- data/app/helpers/decidim/admin/bulk_actions_helper.rb +0 -31
- data/app/helpers/decidim/admin/moderations/reports_helper.rb +1 -1
- data/app/helpers/decidim/admin/moderations_helper.rb +1 -1
- data/app/helpers/decidim/admin/newsletters_helper.rb +57 -27
- data/app/helpers/decidim/admin/scopes_helper.rb +0 -6
- data/app/helpers/decidim/admin/search_form_helper.rb +1 -1
- data/app/helpers/decidim/admin/settings_helper.rb +85 -11
- data/app/jobs/decidim/admin/newsletter_job.rb +3 -1
- data/app/packs/entrypoints/decidim_admin.js +4 -0
- data/app/packs/src/decidim/admin/application.js +2 -0
- data/app/packs/src/decidim/admin/draggable-table.js +33 -0
- data/app/packs/src/decidim/admin/form.js +0 -1
- data/app/packs/src/decidim/admin/global_moderations.js +186 -0
- data/app/packs/src/decidim/admin/managed_moderated_users.js +186 -0
- data/app/packs/src/decidim/admin/newsletters.js +164 -82
- data/app/packs/src/decidim/admin/proposal_infinite_edit.js +3 -6
- data/app/packs/src/decidim/admin/sortable.js +28 -16
- data/app/packs/src/decidim/admin/taxonomy_filters.js +93 -0
- data/app/packs/stylesheets/decidim/admin/_component-show.scss +66 -5
- data/app/packs/stylesheets/decidim/admin/_legacy_foundation.scss +13 -0
- data/app/packs/stylesheets/decidim/admin/_select_picker.scss +20 -0
- data/app/packs/stylesheets/decidim/admin/_table-list.scss +22 -0
- data/app/packs/stylesheets/decidim/admin/_taxonomies.scss +74 -0
- data/app/packs/stylesheets/decidim/admin/application.scss +3 -0
- data/app/permissions/decidim/admin/permissions.rb +32 -1
- data/app/queries/decidim/admin/newsletter_recipients.rb +50 -14
- data/app/views/decidim/admin/areas/index.html.erb +3 -0
- data/app/views/decidim/admin/block_user/bulk_new.html.erb +45 -0
- data/app/views/decidim/admin/components/_actions.html.erb +50 -33
- data/app/views/decidim/admin/components/{_component.html.erb → _component_row.html.erb} +10 -5
- data/app/views/decidim/admin/components/_components_table.html.erb +18 -0
- data/app/views/decidim/admin/components/_form.html.erb +0 -12
- data/app/views/decidim/admin/components/_taxonomy_filters_drawer.html.erb +2 -0
- data/app/views/decidim/admin/components/_visibility_label.html.erb +9 -0
- data/app/views/decidim/admin/components/index.html.erb +12 -14
- data/app/views/decidim/admin/components/manage_trash.html.erb +11 -0
- data/app/views/decidim/admin/moderated_users/_bulk-actions.html.erb +6 -0
- data/app/views/decidim/admin/moderated_users/bulk_actions/_block.html.erb +20 -0
- data/app/views/decidim/admin/moderated_users/bulk_actions/_dropdown.html.erb +40 -0
- data/app/views/decidim/admin/moderated_users/bulk_actions/_unblock.html.erb +20 -0
- data/app/views/decidim/admin/moderated_users/bulk_actions/_unreport.html.erb +20 -0
- data/app/views/decidim/admin/moderated_users/index.html.erb +14 -6
- data/app/views/decidim/admin/moderations/_bulk-actions.html.erb +7 -0
- data/app/views/decidim/admin/moderations/_moderation-tr.html.erb +50 -0
- data/app/views/decidim/admin/moderations/_moderations-thead.html.erb +18 -0
- data/app/views/decidim/admin/moderations/bulk_actions/_dropdown.html.erb +43 -0
- data/app/views/decidim/admin/moderations/bulk_actions/_hide.html.erb +20 -0
- data/app/views/decidim/admin/moderations/bulk_actions/_unhide.html.erb +20 -0
- data/app/views/decidim/admin/moderations/bulk_actions/_unreport.html.erb +20 -0
- data/app/views/decidim/admin/moderations/index.html.erb +13 -81
- data/app/views/decidim/admin/newsletters/confirm_recipients.html.erb +64 -0
- data/app/views/decidim/admin/newsletters/select_recipients_to_deliver.html.erb +44 -20
- data/app/views/decidim/admin/participatory_space_private_users/_form.html.erb +6 -0
- data/app/views/decidim/admin/participatory_space_private_users/edit.html.erb +19 -0
- data/app/views/decidim/admin/participatory_space_private_users/index.html.erb +15 -1
- data/app/views/decidim/admin/resource_permissions/_options_form.html.erb +5 -0
- data/app/views/decidim/admin/resource_permissions/edit.html.erb +2 -2
- data/app/views/decidim/admin/scope_types/index.html.erb +3 -0
- data/app/views/decidim/admin/scopes/index.html.erb +3 -0
- data/app/views/decidim/admin/share_tokens/_form.html.erb +52 -0
- data/app/views/decidim/admin/share_tokens/edit.html.erb +33 -0
- data/app/views/decidim/admin/share_tokens/index.html.erb +47 -0
- data/app/views/decidim/admin/share_tokens/new.html.erb +69 -0
- data/app/views/decidim/admin/taxonomies/_filters.html.erb +19 -0
- data/app/views/decidim/admin/taxonomies/_form.html.erb +5 -0
- data/app/views/decidim/admin/taxonomies/_row.html.erb +40 -0
- data/app/views/decidim/admin/taxonomies/_row_children.html.erb +8 -0
- data/app/views/decidim/admin/taxonomies/_table.html.erb +86 -0
- data/app/views/decidim/admin/taxonomies/_taxonomy_actions.html.erb +15 -0
- data/app/views/decidim/admin/taxonomies/edit.html.erb +87 -0
- data/app/views/decidim/admin/taxonomies/index.html.erb +28 -0
- data/app/views/decidim/admin/taxonomies/new.html.erb +16 -0
- data/app/views/decidim/admin/taxonomy_filters/_check_boxes.html.erb +10 -0
- data/app/views/decidim/admin/taxonomy_filters/_form.html.erb +96 -0
- data/app/views/decidim/admin/taxonomy_filters/_table.html.erb +33 -0
- data/app/views/decidim/admin/taxonomy_filters/edit.html.erb +22 -0
- data/app/views/decidim/admin/taxonomy_filters/index.html.erb +26 -0
- data/app/views/decidim/admin/taxonomy_filters/new.html.erb +32 -0
- data/app/views/decidim/admin/taxonomy_filters_selector/_check_boxes.html.erb +7 -0
- data/app/views/decidim/admin/taxonomy_filters_selector/_component_table.html.erb +25 -0
- data/app/views/decidim/admin/taxonomy_filters_selector/_taxonomies_select.html.erb +16 -0
- data/app/views/decidim/admin/taxonomy_filters_selector/index.html.erb +1 -0
- data/app/views/decidim/admin/taxonomy_filters_selector/new.html.erb +27 -0
- data/app/views/decidim/admin/taxonomy_filters_selector/show.html.erb +18 -0
- data/app/views/decidim/admin/taxonomy_items/_form.html.erb +8 -0
- data/app/views/decidim/admin/taxonomy_items/edit.html.erb +12 -0
- data/app/views/decidim/admin/taxonomy_items/new.html.erb +12 -0
- data/app/views/layouts/decidim/admin/taxonomy_filters.html.erb +17 -0
- data/app/views/layouts/decidim/admin/taxonomy_filters_selector.html.erb +10 -0
- data/config/locales/ar.yml +45 -37
- data/config/locales/bg.yml +48 -51
- data/config/locales/bs-BA.yml +1 -27
- data/config/locales/ca.yml +301 -50
- data/config/locales/cs.yml +299 -46
- data/config/locales/de.yml +301 -50
- data/config/locales/el.yml +1 -50
- data/config/locales/en.yml +301 -50
- data/config/locales/es-MX.yml +298 -47
- data/config/locales/es-PY.yml +298 -47
- data/config/locales/es.yml +298 -47
- data/config/locales/eu.yml +302 -51
- data/config/locales/fi-plain.yml +298 -47
- data/config/locales/fi.yml +298 -47
- data/config/locales/fr-CA.yml +184 -47
- data/config/locales/fr.yml +184 -47
- data/config/locales/ga-IE.yml +0 -23
- data/config/locales/gl.yml +1 -46
- data/config/locales/hu.yml +1 -51
- data/config/locales/id-ID.yml +0 -24
- data/config/locales/is-IS.yml +0 -30
- data/config/locales/it.yml +2 -46
- data/config/locales/ja.yml +299 -50
- data/config/locales/kaa.yml +0 -7
- data/config/locales/ko.yml +0 -50
- data/config/locales/lb.yml +1 -46
- data/config/locales/lt.yml +1 -50
- data/config/locales/lv.yml +1 -28
- data/config/locales/nl.yml +1 -46
- data/config/locales/no.yml +1 -46
- data/config/locales/pl.yml +3 -51
- data/config/locales/pt-BR.yml +38 -50
- data/config/locales/pt.yml +29 -49
- data/config/locales/ro-RO.yml +38 -52
- data/config/locales/ru.yml +1 -24
- data/config/locales/sk.yml +1 -28
- data/config/locales/sl.yml +0 -5
- data/config/locales/sq-AL.yml +0 -22
- data/config/locales/sr-CS.yml +1 -27
- data/config/locales/sv.yml +296 -46
- data/config/locales/th-TH.yml +0 -10
- data/config/locales/tr-TR.yml +1 -44
- data/config/locales/uk.yml +0 -23
- data/config/locales/zh-CN.yml +0 -38
- data/config/locales/zh-TW.yml +1 -50
- data/config/routes.rb +13 -12
- data/decidim-admin.gemspec +1 -1
- data/lib/decidim/admin/engine.rb +2 -1
- data/lib/decidim/admin/import/creator.rb +2 -6
- data/lib/decidim/admin/import/readers/json.rb +1 -1
- data/lib/decidim/admin/menu.rb +9 -1
- data/lib/decidim/admin/search_form_builder.rb +1 -1
- data/lib/decidim/admin/test/destroy_admin_examples.rb +2 -2
- data/lib/decidim/admin/test/filterable_examples.rb +100 -9
- data/lib/decidim/admin/test/forms/attachment_collection_form_examples.rb +1 -1
- data/lib/decidim/admin/test/forms/attachment_form_examples.rb +1 -1
- data/lib/decidim/admin/test/invite_participatory_space_admins_shared_examples.rb +2 -4
- data/lib/decidim/admin/test/manage_component_permissions_examples.rb +5 -5
- data/lib/decidim/admin/test/manage_hide_content_examples.rb +0 -1
- data/lib/decidim/admin/test/manage_moderations_examples.rb +3 -3
- data/lib/decidim/admin/test/manage_resource_soft_deletion_examples.rb +113 -0
- data/lib/decidim/admin/test/manage_taxonomy_filters_examples.rb +127 -0
- data/lib/decidim/admin/test/taxonomy_filters_examples.rb +32 -0
- data/lib/decidim/admin/test.rb +3 -1
- data/lib/decidim/admin/version.rb +1 -1
- metadata +103 -29
- data/app/commands/decidim/admin/create_category.rb +0 -15
- data/app/commands/decidim/admin/destroy_category.rb +0 -15
- data/app/commands/decidim/admin/destroy_component.rb +0 -19
- data/app/commands/decidim/admin/update_category.rb +0 -11
- data/app/controllers/decidim/admin/categories_controller.rb +0 -98
- data/app/forms/decidim/admin/category_form.rb +0 -32
- data/app/helpers/decidim/admin/resource_scope_helper.rb +0 -52
- data/app/packs/src/decidim/admin/scope_picker_enabler.component.js +0 -12
- data/app/views/decidim/admin/categories/_form.html.erb +0 -18
- data/app/views/decidim/admin/categories/edit.html.erb +0 -19
- data/app/views/decidim/admin/categories/index.html.erb +0 -65
- data/app/views/decidim/admin/categories/new.html.erb +0 -19
- data/app/views/decidim/admin/share_tokens/_share_tokens.html.erb +0 -45
- data/lib/decidim/admin/test/commands/create_category_examples.rb +0 -74
- data/lib/decidim/admin/test/commands/destroy_category_examples.rb +0 -83
- data/lib/decidim/admin/test/commands/update_category_examples.rb +0 -76
- data/lib/decidim/admin/test/forms/category_form_examples.rb +0 -70
- data/lib/decidim/admin/test/manage_categories_examples.rb +0 -128
@@ -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, :recipients_count_query, :content_block
|
10
|
+
helper_method :newsletter, :recipients_count_query, :content_block, :selected_options, :newsletter_params
|
11
11
|
|
12
12
|
def index
|
13
13
|
enforce_permission_to :index, :newsletter
|
@@ -103,20 +103,22 @@ module Decidim
|
|
103
103
|
|
104
104
|
def select_recipients_to_deliver
|
105
105
|
enforce_permission_to(:update, :newsletter, newsletter:)
|
106
|
-
|
107
|
-
@form
|
106
|
+
|
107
|
+
@form = if newsletter_params.present?
|
108
|
+
form(SelectiveNewsletterForm).from_params(newsletter_params)
|
109
|
+
else
|
110
|
+
form(SelectiveNewsletterForm).from_model(newsletter)
|
111
|
+
end
|
108
112
|
end
|
109
113
|
|
110
114
|
def recipients_count
|
111
|
-
|
112
|
-
|
113
|
-
@form = form(SelectiveNewsletterForm).from_params(data)
|
115
|
+
@form = form(SelectiveNewsletterForm).from_params(newsletter_params)
|
114
116
|
render plain: recipients_count_query
|
115
117
|
end
|
116
118
|
|
117
119
|
def deliver
|
118
120
|
enforce_permission_to(:update, :newsletter, newsletter:)
|
119
|
-
@form = form(SelectiveNewsletterForm).from_params(
|
121
|
+
@form = form(SelectiveNewsletterForm).from_params(newsletter_params)
|
120
122
|
|
121
123
|
DeliverNewsletter.call(newsletter, @form) do
|
122
124
|
on(:ok) do
|
@@ -136,8 +138,49 @@ module Decidim
|
|
136
138
|
end
|
137
139
|
end
|
138
140
|
|
141
|
+
def confirm_recipients
|
142
|
+
enforce_permission_to(:update, :newsletter, newsletter:)
|
143
|
+
@form = form(SelectiveNewsletterForm).from_params(newsletter_params)
|
144
|
+
@recipients = NewsletterRecipients.for(@form).order(:email)
|
145
|
+
@recipients = paginate(@recipients)
|
146
|
+
|
147
|
+
render :confirm_recipients
|
148
|
+
end
|
149
|
+
|
139
150
|
private
|
140
151
|
|
152
|
+
def newsletter_params
|
153
|
+
params.fetch(:newsletter, {}).permit(
|
154
|
+
:send_to_all_users,
|
155
|
+
:send_to_verified_users,
|
156
|
+
:send_to_followers,
|
157
|
+
:send_to_participants,
|
158
|
+
:send_to_private_members,
|
159
|
+
verification_types: [],
|
160
|
+
participatory_space_types: {
|
161
|
+
assemblies: [:manifest_name, { ids: [] }],
|
162
|
+
conferences: [:manifest_name, { ids: [] }],
|
163
|
+
initiatives: [:manifest_name, { ids: [] }],
|
164
|
+
participatory_processes: [:manifest_name, { ids: [] }]
|
165
|
+
}
|
166
|
+
)
|
167
|
+
end
|
168
|
+
|
169
|
+
def selected_options(key)
|
170
|
+
@selected_options ||= {}
|
171
|
+
@selected_options[key] ||= extract_selected_ids(params[:newsletter], key)
|
172
|
+
end
|
173
|
+
|
174
|
+
def extract_selected_ids(newsletter_params, key)
|
175
|
+
return {} unless newsletter_params.present? && newsletter_params[key].present?
|
176
|
+
|
177
|
+
if newsletter_params[key].is_a?(Array)
|
178
|
+
{ key => newsletter_params[key].map(&:to_s) }
|
179
|
+
else
|
180
|
+
(newsletter_params[key] || {}).transform_values { |space| space["ids"] || [] }
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
141
184
|
def collection
|
142
185
|
@collection ||= Newsletter.where(organization: current_organization)
|
143
186
|
end
|
@@ -2,11 +2,66 @@
|
|
2
2
|
|
3
3
|
module Decidim
|
4
4
|
module Admin
|
5
|
+
# This is an abstract controller allows sharing unpublished things.
|
6
|
+
# Final implementation must inherit from this controller and implement the `resource` method.
|
5
7
|
class ShareTokensController < Decidim::Admin::ApplicationController
|
8
|
+
include Decidim::Admin::Filterable
|
9
|
+
|
10
|
+
helper_method :current_token, :resource, :resource_title, :share_tokens_path
|
11
|
+
|
12
|
+
def index
|
13
|
+
enforce_permission_to :read, :share_tokens
|
14
|
+
@share_tokens = filtered_collection
|
15
|
+
end
|
16
|
+
|
17
|
+
def new
|
18
|
+
enforce_permission_to :create, :share_tokens
|
19
|
+
@form = form(ShareTokenForm).instance
|
20
|
+
end
|
21
|
+
|
22
|
+
def create
|
23
|
+
enforce_permission_to :create, :share_tokens
|
24
|
+
@form = form(ShareTokenForm).from_params(params, resource:)
|
25
|
+
|
26
|
+
CreateShareToken.call(@form) do
|
27
|
+
on(:ok) do
|
28
|
+
flash[:notice] = I18n.t("share_tokens.create.success", scope: "decidim.admin")
|
29
|
+
redirect_to share_tokens_path
|
30
|
+
end
|
31
|
+
|
32
|
+
on(:invalid) do
|
33
|
+
flash.now[:alert] = I18n.t("share_tokens.create.invalid", scope: "decidim.admin")
|
34
|
+
render action: "new"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def edit
|
40
|
+
enforce_permission_to(:update, :share_tokens, share_token: current_token)
|
41
|
+
@form = form(ShareTokenForm).from_model(current_token)
|
42
|
+
end
|
43
|
+
|
44
|
+
def update
|
45
|
+
enforce_permission_to(:update, :share_tokens, share_token: current_token)
|
46
|
+
@form = form(ShareTokenForm).from_params(params, resource:)
|
47
|
+
|
48
|
+
UpdateShareToken.call(@form, current_token) do
|
49
|
+
on(:ok) do
|
50
|
+
flash[:notice] = I18n.t("share_tokens.update.success", scope: "decidim.admin")
|
51
|
+
redirect_to share_tokens_path
|
52
|
+
end
|
53
|
+
|
54
|
+
on(:invalid) do
|
55
|
+
flash.now[:alert] = I18n.t("share_tokens.update.error", scope: "decidim.admin")
|
56
|
+
render :edit
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
6
61
|
def destroy
|
7
|
-
enforce_permission_to(:destroy, :
|
62
|
+
enforce_permission_to(:destroy, :share_tokens, share_token: current_token)
|
8
63
|
|
9
|
-
|
64
|
+
DestroyShareToken.call(current_token, current_user) do
|
10
65
|
on(:ok) do
|
11
66
|
flash[:notice] = I18n.t("share_tokens.destroy.success", scope: "decidim.admin")
|
12
67
|
end
|
@@ -15,15 +70,62 @@ module Decidim
|
|
15
70
|
end
|
16
71
|
end
|
17
72
|
|
18
|
-
|
73
|
+
redirect_to share_tokens_path
|
19
74
|
end
|
20
75
|
|
21
76
|
private
|
22
77
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
78
|
+
# override this method in the destination controller to specify the resource associated with the shared token (ie: a component)
|
79
|
+
def resource
|
80
|
+
raise NotImplementedError
|
81
|
+
end
|
82
|
+
|
83
|
+
# Override also this method if resource does not respond to a translatable name or title
|
84
|
+
def resource_title
|
85
|
+
translated_attribute(resource.try(:name) || resource.title)
|
86
|
+
end
|
87
|
+
|
88
|
+
# sets the prefix for the route helper methods (this may vary depending on the resource type)
|
89
|
+
# This setup works fine for participatory spaces and components, override if needed
|
90
|
+
def route_name
|
91
|
+
@route_name ||= "#{resource.manifest.route_name}_"
|
92
|
+
end
|
93
|
+
|
94
|
+
def route_proxy
|
95
|
+
@route_proxy ||= EngineRouter.admin_proxy(resource.try(:participatory_space) || resource)
|
96
|
+
end
|
97
|
+
|
98
|
+
# returns the proper path for managing a share token according to the resource
|
99
|
+
# this works fine for components and participatory spaces, override if needed
|
100
|
+
def share_tokens_path(method = :index, options = {})
|
101
|
+
args = resource.is_a?(Decidim::Component) ? [resource, options] : [options]
|
102
|
+
|
103
|
+
case method
|
104
|
+
when :index, :create
|
105
|
+
route_proxy.send("#{route_name}share_tokens_path", *args)
|
106
|
+
when :new
|
107
|
+
route_proxy.send("new_#{route_name}share_token_path", *args)
|
108
|
+
when :update, :destroy
|
109
|
+
route_proxy.send("#{route_name}share_token_path", *args)
|
110
|
+
when :edit
|
111
|
+
route_proxy.send("edit_#{route_name}share_token_path", *args)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def base_query
|
116
|
+
collection
|
117
|
+
end
|
118
|
+
|
119
|
+
def collection
|
120
|
+
@collection ||= Decidim::ShareToken.where(organization: current_organization, token_for: resource)
|
121
|
+
end
|
122
|
+
|
123
|
+
def filters
|
124
|
+
[]
|
125
|
+
end
|
126
|
+
|
127
|
+
def current_token
|
128
|
+
@current_token ||= collection.find(params[:id])
|
27
129
|
end
|
28
130
|
end
|
29
131
|
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Admin
|
5
|
+
class TaxonomiesController < Decidim::Admin::ApplicationController
|
6
|
+
include Decidim::Admin::Taxonomies::Filterable
|
7
|
+
|
8
|
+
layout "decidim/admin/settings"
|
9
|
+
|
10
|
+
before_action :set_taxonomies_breadcrumb_item
|
11
|
+
before_action only: :edit do
|
12
|
+
redirect_to edit_taxonomy_path(taxonomy.parent) unless taxonomy && taxonomy.root?
|
13
|
+
end
|
14
|
+
|
15
|
+
helper_method :collection, :parent_options, :taxonomy
|
16
|
+
|
17
|
+
def index
|
18
|
+
enforce_permission_to :index, :taxonomy
|
19
|
+
@taxonomies = filtered_collection
|
20
|
+
end
|
21
|
+
|
22
|
+
def new
|
23
|
+
enforce_permission_to :create, :taxonomy
|
24
|
+
add_breadcrumb_item :new, decidim_admin.new_taxonomy_path
|
25
|
+
|
26
|
+
@form = form(Decidim::Admin::TaxonomyForm).instance
|
27
|
+
end
|
28
|
+
|
29
|
+
def create
|
30
|
+
enforce_permission_to :create, :taxonomy
|
31
|
+
add_breadcrumb_item :new, decidim_admin.new_taxonomy_path
|
32
|
+
|
33
|
+
@form = form(Decidim::Admin::TaxonomyForm).from_params(params)
|
34
|
+
CreateTaxonomy.call(@form) do
|
35
|
+
on(:ok) do
|
36
|
+
flash[:notice] = I18n.t("create.success", scope: "decidim.admin.taxonomies")
|
37
|
+
redirect_to taxonomies_path
|
38
|
+
end
|
39
|
+
|
40
|
+
on(:invalid) do
|
41
|
+
flash.now[:alert] = I18n.t("create.invalid", scope: "decidim.admin.taxonomies")
|
42
|
+
render action: "new"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def edit
|
48
|
+
enforce_permission_to(:update, :taxonomy, taxonomy:)
|
49
|
+
add_breadcrumb_item :edit, decidim_admin.edit_taxonomy_path(taxonomy)
|
50
|
+
|
51
|
+
@form = form(Decidim::Admin::TaxonomyForm).from_model(taxonomy)
|
52
|
+
@taxonomies = filtered_collection
|
53
|
+
end
|
54
|
+
|
55
|
+
def update
|
56
|
+
enforce_permission_to(:update, :taxonomy, taxonomy:)
|
57
|
+
add_breadcrumb_item :edit, decidim_admin.edit_taxonomy_path(taxonomy)
|
58
|
+
|
59
|
+
@form = form(Decidim::Admin::TaxonomyForm).from_params(params)
|
60
|
+
|
61
|
+
UpdateTaxonomy.call(@form, taxonomy) do
|
62
|
+
on(:ok) do
|
63
|
+
flash[:notice] = I18n.t("update.success", scope: "decidim.admin.taxonomies")
|
64
|
+
redirect_to taxonomies_path
|
65
|
+
end
|
66
|
+
|
67
|
+
on(:invalid) do
|
68
|
+
flash.now[:alert] = I18n.t("update.invalid", scope: "decidim.admin.taxonomies")
|
69
|
+
render action: "edit"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def destroy
|
75
|
+
enforce_permission_to(:destroy, :taxonomy, taxonomy:)
|
76
|
+
|
77
|
+
DestroyTaxonomy.call(taxonomy, current_user) do
|
78
|
+
on(:ok) do
|
79
|
+
flash[:notice] = I18n.t("destroy.success", scope: "decidim.admin.taxonomies")
|
80
|
+
end
|
81
|
+
|
82
|
+
on(:invalid) do
|
83
|
+
flash.now[:alert] = I18n.t("destroy.invalid", scope: "decidim.admin.taxonomies")
|
84
|
+
end
|
85
|
+
end
|
86
|
+
redirect_back(fallback_location: taxonomies_path)
|
87
|
+
end
|
88
|
+
|
89
|
+
def reorder
|
90
|
+
enforce_permission_to :update, :taxonomy
|
91
|
+
|
92
|
+
ReorderTaxonomies.call(current_organization, params[:ids_order], page_offset) do
|
93
|
+
on(:ok) do
|
94
|
+
head :ok
|
95
|
+
end
|
96
|
+
|
97
|
+
on(:invalid) do
|
98
|
+
head :bad_request
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
private
|
104
|
+
|
105
|
+
def collection
|
106
|
+
@collection ||= taxonomy ? taxonomy.children : root_taxonomies
|
107
|
+
end
|
108
|
+
|
109
|
+
def root_taxonomies
|
110
|
+
@root_taxonomies ||= current_organization.taxonomies.roots
|
111
|
+
end
|
112
|
+
|
113
|
+
def taxonomy
|
114
|
+
@taxonomy ||= current_organization.taxonomies.find_by(id: params[:id])
|
115
|
+
end
|
116
|
+
|
117
|
+
def set_taxonomies_breadcrumb_item
|
118
|
+
add_breadcrumb_item I18n.t("menu.taxonomies", scope: "decidim.admin"), decidim_admin.taxonomies_path
|
119
|
+
end
|
120
|
+
|
121
|
+
def add_breadcrumb_item(key, url)
|
122
|
+
controller_breadcrumb_items << {
|
123
|
+
label: I18n.t(key, scope: "decidim.admin.taxonomies.breadcrumb", default: key),
|
124
|
+
url:
|
125
|
+
}
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Admin
|
5
|
+
class TaxonomyFiltersController < Decidim::Admin::ApplicationController
|
6
|
+
include Decidim::Admin::Taxonomies::Filterable
|
7
|
+
|
8
|
+
layout "decidim/admin/settings"
|
9
|
+
|
10
|
+
before_action :set_taxonomies_breadcrumb_item
|
11
|
+
before_action only: :edit do
|
12
|
+
redirect_to taxonomy_filters_path(root_taxonomy) unless taxonomy_filter && root_taxonomy == taxonomy_filter.root_taxonomy
|
13
|
+
end
|
14
|
+
|
15
|
+
helper_method :collection, :root_taxonomy, :taxonomy_filter
|
16
|
+
|
17
|
+
# Returns non-layout views of for use in selecting filters for components or other places using a drawer.
|
18
|
+
def show
|
19
|
+
enforce_permission_to :show, :taxonomy_filter
|
20
|
+
end
|
21
|
+
|
22
|
+
def index
|
23
|
+
enforce_permission_to :index, :taxonomy_filter
|
24
|
+
end
|
25
|
+
|
26
|
+
def new
|
27
|
+
enforce_permission_to :create, :taxonomy_filter
|
28
|
+
add_breadcrumb_item :new, decidim_admin.new_taxonomy_filter_path
|
29
|
+
@form = form(Decidim::Admin::TaxonomyFilterForm).from_params(root_taxonomy_id: params[:taxonomy_id])
|
30
|
+
end
|
31
|
+
|
32
|
+
def create
|
33
|
+
enforce_permission_to :create, :taxonomy_filter
|
34
|
+
add_breadcrumb_item :new, decidim_admin.new_taxonomy_filter_path
|
35
|
+
@form = form(Decidim::Admin::TaxonomyFilterForm).from_params(params)
|
36
|
+
CreateTaxonomyFilter.call(@form) do
|
37
|
+
on(:ok) do
|
38
|
+
flash[:notice] = I18n.t("create.success", scope: "decidim.admin.taxonomy_filters")
|
39
|
+
redirect_to decidim_admin.taxonomy_filters_path(root_taxonomy)
|
40
|
+
end
|
41
|
+
|
42
|
+
on(:invalid) do
|
43
|
+
flash.now[:alert] = I18n.t("create.error", scope: "decidim.admin.taxonomy_filters")
|
44
|
+
render :new
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def edit
|
50
|
+
enforce_permission_to(:update, :taxonomy_filter, taxonomy_filter:)
|
51
|
+
add_breadcrumb_item :edit, decidim_admin.edit_taxonomy_filter_path
|
52
|
+
@form = form(Decidim::Admin::TaxonomyFilterForm).from_model(taxonomy_filter)
|
53
|
+
end
|
54
|
+
|
55
|
+
def update
|
56
|
+
enforce_permission_to(:update, :taxonomy_filter, taxonomy_filter:)
|
57
|
+
add_breadcrumb_item :edit, decidim_admin.edit_taxonomy_filter_path
|
58
|
+
@form = form(Decidim::Admin::TaxonomyFilterForm).from_params(params)
|
59
|
+
UpdateTaxonomyFilter.call(@form, taxonomy_filter) do
|
60
|
+
on(:ok) do
|
61
|
+
flash[:notice] = I18n.t("update.success", scope: "decidim.admin.taxonomy_filters")
|
62
|
+
redirect_to decidim_admin.taxonomy_filters_path(root_taxonomy)
|
63
|
+
end
|
64
|
+
on(:invalid) do
|
65
|
+
flash.now[:alert] = I18n.t("update.error", scope: "decidim.admin.taxonomy_filters")
|
66
|
+
render :edit
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def destroy
|
72
|
+
enforce_permission_to(:destroy, :taxonomy_filter, taxonomy_filter:)
|
73
|
+
DestroyTaxonomyFilter.call(taxonomy_filter, current_user) do
|
74
|
+
on(:ok) do
|
75
|
+
flash[:notice] = I18n.t("destroy.success", scope: "decidim.admin.taxonomy_filters")
|
76
|
+
end
|
77
|
+
on(:invalid) do
|
78
|
+
flash[:alert] = I18n.t("destroy.error", scope: "decidim.admin.taxonomy_filters")
|
79
|
+
end
|
80
|
+
end
|
81
|
+
redirect_back(fallback_location: decidim_admin.taxonomy_filters_path(root_taxonomy))
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
def collection
|
87
|
+
@collection ||= root_taxonomy.taxonomy_filters
|
88
|
+
end
|
89
|
+
|
90
|
+
def root_taxonomy
|
91
|
+
@root_taxonomy ||= Taxonomy.roots.find(params[:taxonomy_id])
|
92
|
+
end
|
93
|
+
|
94
|
+
def taxonomy_filter
|
95
|
+
@taxonomy_filter ||= TaxonomyFilter.find_by(id: params[:id])
|
96
|
+
end
|
97
|
+
|
98
|
+
def set_taxonomies_breadcrumb_item
|
99
|
+
add_breadcrumb_item I18n.t("menu.taxonomies", scope: "decidim.admin"), decidim_admin.taxonomies_path
|
100
|
+
add_breadcrumb_item root_taxonomy.name, decidim_admin.taxonomy_filters_path(root_taxonomy)
|
101
|
+
add_breadcrumb_item :filters, decidim_admin.taxonomy_filters_path(root_taxonomy)
|
102
|
+
end
|
103
|
+
|
104
|
+
def add_breadcrumb_item(key, url)
|
105
|
+
controller_breadcrumb_items << {
|
106
|
+
label: I18n.t(key, scope: "decidim.admin.taxonomy_filters.breadcrumb", default: key),
|
107
|
+
url:
|
108
|
+
}
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Admin
|
5
|
+
class TaxonomyFiltersSelectorController < Decidim::Admin::ApplicationController
|
6
|
+
layout "decidim/admin/taxonomy_filters_selector"
|
7
|
+
|
8
|
+
helper_method :root_taxonomy, :taxonomy_filter, :component, :field_name
|
9
|
+
|
10
|
+
# ensure component is valid
|
11
|
+
before_action do
|
12
|
+
raise Decidim::ActionForbidden unless component && component.organization == current_organization
|
13
|
+
end
|
14
|
+
|
15
|
+
before_action except: :index do
|
16
|
+
redirect_to taxonomy_filters_selector_index_path(component_id: params[:component_id]) if root_taxonomy.nil?
|
17
|
+
end
|
18
|
+
|
19
|
+
before_action except: [:index, :new, :destroy] do
|
20
|
+
redirect_to new_taxonomy_filters_selector_path(component_id: params[:component_id], taxonomy_id: params[:taxonomy_id]) if taxonomy_filter.nil?
|
21
|
+
end
|
22
|
+
|
23
|
+
# Renders "choose the taxonomy" step
|
24
|
+
def index
|
25
|
+
enforce_permission_to :index, :taxonomy_filter
|
26
|
+
end
|
27
|
+
|
28
|
+
# Renders "choose the taxonomy filter" step
|
29
|
+
def new
|
30
|
+
enforce_permission_to :create, :taxonomy_filter
|
31
|
+
end
|
32
|
+
|
33
|
+
# Updates the component with the selected taxonomy filter
|
34
|
+
def create
|
35
|
+
enforce_permission_to :create, :taxonomy_filter
|
36
|
+
|
37
|
+
update_filters!(component.settings.taxonomy_filters + [taxonomy_filter.id.to_s])
|
38
|
+
|
39
|
+
render partial: "decidim/admin/taxonomy_filters_selector/component_table"
|
40
|
+
end
|
41
|
+
|
42
|
+
# Renders the component with the selected taxonomy filter
|
43
|
+
def show
|
44
|
+
enforce_permission_to :show, :taxonomy_filter
|
45
|
+
end
|
46
|
+
|
47
|
+
# Removes the selected taxonomy filter from the component
|
48
|
+
def destroy
|
49
|
+
enforce_permission_to :destroy, :taxonomy_filter
|
50
|
+
|
51
|
+
update_filters!(component.settings.taxonomy_filters - [taxonomy_filter.id.to_s]) if taxonomy_filter
|
52
|
+
|
53
|
+
render partial: "decidim/admin/taxonomy_filters_selector/component_table"
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def update_filters!(filter_ids)
|
59
|
+
Decidim.traceability.perform_action!("update_filters", component, current_user) do
|
60
|
+
component.update!(settings: { taxonomy_filters: filter_ids.map(&:to_s).uniq })
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def field_name
|
65
|
+
"component[settings][taxonomy_filters][]"
|
66
|
+
end
|
67
|
+
|
68
|
+
def component
|
69
|
+
@component ||= Component.find_by(id: params[:component_id])
|
70
|
+
end
|
71
|
+
|
72
|
+
def root_taxonomy
|
73
|
+
@root_taxonomy ||= current_organization.taxonomies.roots.find_by(id: params[:taxonomy_id])
|
74
|
+
end
|
75
|
+
|
76
|
+
def taxonomy_filter
|
77
|
+
@taxonomy_filter ||= root_taxonomy.taxonomy_filters.find_by(id: params[:taxonomy_filter_id])
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Admin
|
5
|
+
class TaxonomyItemsController < Decidim::Admin::ApplicationController
|
6
|
+
layout false
|
7
|
+
|
8
|
+
helper_method :taxonomy, :taxonomy_item, :parent_options, :selected_parent_id
|
9
|
+
before_action do
|
10
|
+
if taxonomy_item && taxonomy_item.parent_ids.exclude?(taxonomy.id)
|
11
|
+
flash[:alert] = I18n.t("update.invalid", scope: "decidim.admin.taxonomies")
|
12
|
+
render plain: I18n.t("update.invalid", scope: "decidim.admin.taxonomies"), status: :unprocessable_entity
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def new
|
17
|
+
enforce_permission_to :create, :taxonomy_item
|
18
|
+
@form = form(Decidim::Admin::TaxonomyItemForm).instance
|
19
|
+
end
|
20
|
+
|
21
|
+
def create
|
22
|
+
enforce_permission_to :create, :taxonomy_item
|
23
|
+
@form = form(Decidim::Admin::TaxonomyItemForm).from_params(params)
|
24
|
+
CreateTaxonomy.call(@form) do
|
25
|
+
on(:ok) do
|
26
|
+
flash[:notice] = I18n.t("create.success", scope: "decidim.admin.taxonomies")
|
27
|
+
redirect_to edit_taxonomy_path(taxonomy)
|
28
|
+
end
|
29
|
+
|
30
|
+
on(:invalid) do
|
31
|
+
flash.now[:alert] = I18n.t("create.invalid", scope: "decidim.admin.taxonomies")
|
32
|
+
render action: "new"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def edit
|
38
|
+
enforce_permission_to :update, :taxonomy_item, taxonomy: taxonomy_item
|
39
|
+
@form = form(Decidim::Admin::TaxonomyItemForm).from_model(taxonomy_item)
|
40
|
+
end
|
41
|
+
|
42
|
+
def update
|
43
|
+
enforce_permission_to :update, :taxonomy_item, taxonomy: taxonomy_item
|
44
|
+
@form = form(Decidim::Admin::TaxonomyItemForm).from_params(params)
|
45
|
+
UpdateTaxonomy.call(@form, taxonomy_item) do
|
46
|
+
on(:ok) do
|
47
|
+
flash[:notice] = I18n.t("update.success", scope: "decidim.admin.taxonomies")
|
48
|
+
redirect_to edit_taxonomy_path(taxonomy)
|
49
|
+
end
|
50
|
+
|
51
|
+
on(:invalid) do
|
52
|
+
flash.now[:alert] = I18n.t("update.invalid", scope: "decidim.admin.taxonomies")
|
53
|
+
render action: "edit"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def taxonomy
|
61
|
+
@taxonomy ||= Decidim::Taxonomy.find_by(organization: current_organization, id: params[:taxonomy_id])
|
62
|
+
end
|
63
|
+
|
64
|
+
def taxonomy_item
|
65
|
+
@taxonomy_item ||= Decidim::Taxonomy.find_by(organization: current_organization, id: params[:id])
|
66
|
+
end
|
67
|
+
|
68
|
+
def selected_parent_id
|
69
|
+
@selected_parent_id ||= taxonomy_item&.parent_id || taxonomy.id
|
70
|
+
end
|
71
|
+
|
72
|
+
def parent_options
|
73
|
+
@parent_options ||= begin
|
74
|
+
options = [[I18n.t("new.none", scope: "decidim.admin.taxonomy_items"), taxonomy.id]]
|
75
|
+
taxonomy.children.each do |child|
|
76
|
+
next if child.id == taxonomy_item&.id
|
77
|
+
|
78
|
+
options << [translated_attribute(child.name).to_s, child.id]
|
79
|
+
# add children to the list with indentation
|
80
|
+
child.children.each do |grandchild|
|
81
|
+
next if grandchild.id == taxonomy_item&.id
|
82
|
+
|
83
|
+
options << [" #{translated_attribute(grandchild.name)}".html_safe, grandchild.id]
|
84
|
+
end
|
85
|
+
end
|
86
|
+
options
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|