decidim-admin 0.29.1 → 0.30.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- 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/block_user.rb +1 -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 -2
- 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 +43 -1
- 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/conflicts_controller.rb +1 -1
- data/app/controllers/decidim/admin/global_moderations_controller.rb +4 -0
- data/app/controllers/decidim/admin/impersonations_controller.rb +1 -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 -6
- 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/help_section_form.rb +1 -1
- data/app/forms/decidim/admin/impersonate_user_form.rb +5 -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/organization_appearance_form.rb +2 -2
- data/app/forms/decidim/admin/organization_form.rb +2 -2
- 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/static_page_form.rb +1 -1
- 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/forms/decidim/admin/transfer_user_form.rb +15 -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 -73
- 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/_moderations.scss +8 -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 +59 -19
- 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/conflicts/edit.html.erb +21 -11
- 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 +15 -7
- 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/newsletter_templates/index.html.erb +0 -1
- 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/shared/landing_page_content_blocks/edit.html.erb +1 -1
- 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 +91 -36
- data/config/locales/bg.yml +48 -51
- data/config/locales/bn-BD.yml +1 -0
- data/config/locales/bs-BA.yml +499 -0
- data/config/locales/ca.yml +300 -50
- data/config/locales/cs.yml +298 -46
- data/config/locales/de.yml +300 -50
- data/config/locales/el.yml +1 -50
- data/config/locales/en.yml +300 -50
- data/config/locales/es-MX.yml +298 -48
- data/config/locales/es-PY.yml +298 -48
- data/config/locales/es.yml +298 -48
- data/config/locales/eu.yml +433 -171
- data/config/locales/fi-plain.yml +298 -48
- data/config/locales/fi.yml +315 -65
- data/config/locales/fr-CA.yml +183 -47
- data/config/locales/fr.yml +183 -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 -20
- data/config/locales/is-IS.yml +0 -18
- data/config/locales/it.yml +1 -46
- data/config/locales/ja.yml +303 -55
- data/config/locales/kaa.yml +0 -10
- 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 -27
- 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 +30 -46
- data/config/locales/ro-RO.yml +35 -50
- data/config/locales/ru.yml +1 -22
- data/config/locales/sk.yml +1 -27
- data/config/locales/sl.yml +0 -7
- data/config/locales/sq-AL.yml +0 -25
- data/config/locales/sr-CS.yml +1 -27
- data/config/locales/sv.yml +297 -47
- data/config/locales/tr-TR.yml +1 -44
- data/config/locales/uk.yml +0 -20
- data/config/locales/zh-CN.yml +0 -44
- data/config/locales/zh-TW.yml +1 -50
- data/config/routes.rb +14 -13
- data/decidim-admin.gemspec +2 -2
- data/lib/decidim/admin/engine.rb +3 -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 +106 -30
- 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
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module HasTaxonomyFormAttributes
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
attribute :taxonomies, Array[Integer]
|
9
|
+
|
10
|
+
validate :taxonomies_belong_to_current_organization
|
11
|
+
|
12
|
+
# Returns the participatory space manifest for search the available filters (ie: participatory_processes, assemblies, etc)
|
13
|
+
# To implement where this concern is included.
|
14
|
+
def participatory_space_manifest
|
15
|
+
raise NotImplementedError
|
16
|
+
end
|
17
|
+
|
18
|
+
def taxonomizations
|
19
|
+
@taxonomizations ||= compact_taxonomies.map do |taxonomy_id|
|
20
|
+
Decidim::Taxonomization.new(taxonomy_id:)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def taxonomy_filters
|
25
|
+
@taxonomy_filters ||= if defined?(current_component) && current_component&.settings.respond_to?(:taxonomy_filters)
|
26
|
+
all_taxonomy_filters.where(id: current_component.settings.taxonomy_filters)
|
27
|
+
else
|
28
|
+
all_taxonomy_filters.for_manifest(participatory_space_manifest)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def all_taxonomy_filters
|
33
|
+
@all_taxonomy_filters ||= TaxonomyFilter.where(root_taxonomy: root_taxonomies)
|
34
|
+
end
|
35
|
+
|
36
|
+
def root_taxonomies
|
37
|
+
@root_taxonomies ||= current_organization.taxonomies.roots
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def taxonomies_belong_to_current_organization
|
43
|
+
return if compact_taxonomies.empty?
|
44
|
+
|
45
|
+
Decidim::Taxonomy.where(id: compact_taxonomies).find_each do |taxonomy|
|
46
|
+
next if taxonomy.decidim_organization_id == current_organization.id
|
47
|
+
|
48
|
+
errors.add(:taxonomies, :invalid)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def compact_taxonomies
|
53
|
+
@compact_taxonomies ||= taxonomies.compact
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Admin
|
5
|
+
# A form object used to block users or user groups on the admin dashboard.
|
6
|
+
class BlockUsersForm < Form
|
7
|
+
attribute :user_ids, Array[Integer]
|
8
|
+
attribute :justification, String
|
9
|
+
attribute :hide, Boolean, default: false
|
10
|
+
|
11
|
+
validates :justification, presence: true, length: { minimum: UserBlock::MINIMUM_JUSTIFICATION_LENGTH }
|
12
|
+
|
13
|
+
def users
|
14
|
+
@users ||= Decidim::UserBaseEntity.where(
|
15
|
+
id: user_ids,
|
16
|
+
organization: current_organization
|
17
|
+
)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -9,7 +9,7 @@ module Decidim
|
|
9
9
|
include TranslationsHelper
|
10
10
|
|
11
11
|
attribute :id, String
|
12
|
-
translatable_attribute :content,
|
12
|
+
translatable_attribute :content, Decidim::Attributes::RichText
|
13
13
|
|
14
14
|
def name
|
15
15
|
multi_translation("activerecord.models.#{manifest.model_class_name.underscore}.other")
|
@@ -14,6 +14,7 @@ module Decidim
|
|
14
14
|
attribute :handler_name, String
|
15
15
|
|
16
16
|
validates :user, presence: true
|
17
|
+
validates :name, presence: true, unless: :persisted_user?
|
17
18
|
validates :reason, presence: true, unless: :managed_user?
|
18
19
|
|
19
20
|
private
|
@@ -21,6 +22,10 @@ module Decidim
|
|
21
22
|
def managed_user?
|
22
23
|
user && user.managed?
|
23
24
|
end
|
25
|
+
|
26
|
+
def persisted_user?
|
27
|
+
user&.persisted?
|
28
|
+
end
|
24
29
|
end
|
25
30
|
end
|
26
31
|
end
|
@@ -32,9 +32,9 @@ module Decidim
|
|
32
32
|
attribute :tertiary_color, String
|
33
33
|
|
34
34
|
translatable_attribute :cta_button_text, String
|
35
|
-
translatable_attribute :description,
|
35
|
+
translatable_attribute :description, Decidim::Attributes::RichText
|
36
36
|
translatable_attribute :highlighted_content_banner_title, String
|
37
|
-
translatable_attribute :highlighted_content_banner_short_description,
|
37
|
+
translatable_attribute :highlighted_content_banner_short_description, Decidim::Attributes::RichText
|
38
38
|
translatable_attribute :highlighted_content_banner_action_title, String
|
39
39
|
translatable_attribute :highlighted_content_banner_action_subtitle, String
|
40
40
|
translatable_attribute :omnipresent_banner_title, String
|
@@ -31,9 +31,9 @@ module Decidim
|
|
31
31
|
attribute :customize_welcome_notification, Boolean
|
32
32
|
|
33
33
|
translatable_attribute :welcome_notification_subject, String
|
34
|
-
translatable_attribute :welcome_notification_body,
|
34
|
+
translatable_attribute :welcome_notification_body, Decidim::Attributes::RichText
|
35
35
|
|
36
|
-
translatable_attribute :admin_terms_of_service_body,
|
36
|
+
translatable_attribute :admin_terms_of_service_body, Decidim::Attributes::RichText
|
37
37
|
|
38
38
|
validates :welcome_notification_subject, :welcome_notification_body, translatable_presence: true, if: proc { |form| form.customize_welcome_notification }
|
39
39
|
|
@@ -6,10 +6,15 @@ module Decidim
|
|
6
6
|
# admin dashboard.
|
7
7
|
#
|
8
8
|
class ParticipatorySpacePrivateUserForm < Form
|
9
|
+
include TranslatableAttributes
|
10
|
+
|
9
11
|
mimic :participatory_space_private_user
|
10
12
|
|
11
13
|
attribute :name, String
|
12
14
|
attribute :email, String
|
15
|
+
attribute :published, Boolean
|
16
|
+
|
17
|
+
translatable_attribute :role, String
|
13
18
|
|
14
19
|
validates :name, :email, presence: true
|
15
20
|
|
@@ -7,33 +7,33 @@ module Decidim
|
|
7
7
|
mimic :newsletter
|
8
8
|
|
9
9
|
attribute :participatory_space_types, Array[SelectiveNewsletterParticipatorySpaceTypeForm]
|
10
|
-
attribute :
|
10
|
+
attribute :verification_types, Array[String]
|
11
11
|
attribute :send_to_all_users, Boolean
|
12
|
+
attribute :send_to_verified_users, Boolean
|
12
13
|
attribute :send_to_participants, Boolean
|
13
14
|
attribute :send_to_followers, Boolean
|
15
|
+
attribute :send_to_private_members, Boolean
|
14
16
|
|
15
|
-
validates :send_to_all_users, presence: true, unless:
|
16
|
-
validates :
|
17
|
-
validates :
|
17
|
+
validates :send_to_all_users, presence: true, unless: :other_groups_selected_for_all_users?
|
18
|
+
validates :send_to_verified_users, presence: true, unless: :other_groups_selected_for_verified_users?
|
19
|
+
validates :send_to_followers, presence: true, if: :only_followers_selected?
|
20
|
+
validates :send_to_participants, presence: true, if: :only_participants_selected?
|
21
|
+
validates :send_to_private_members, presence: true, if: :only_private_members_selected?
|
18
22
|
|
19
23
|
validate :at_least_one_participatory_space_selected
|
20
24
|
|
21
|
-
def map_model(
|
25
|
+
def map_model(newsletter)
|
22
26
|
self.participatory_space_types = Decidim.participatory_space_manifests.map do |manifest|
|
23
27
|
SelectiveNewsletterParticipatorySpaceTypeForm.from_model(manifest:)
|
24
28
|
end
|
25
|
-
end
|
26
29
|
|
27
|
-
|
28
|
-
# assume erroneously that some scope is selected.
|
29
|
-
def scope_ids
|
30
|
-
super.select(&:presence)
|
30
|
+
self.verification_types = newsletter.organization.available_authorizations
|
31
31
|
end
|
32
32
|
|
33
33
|
private
|
34
34
|
|
35
35
|
def at_least_one_participatory_space_selected
|
36
|
-
return if send_to_all_users && current_user.admin?
|
36
|
+
return if (send_to_all_users || send_to_verified_users) && current_user.admin?
|
37
37
|
|
38
38
|
errors.add(:base, :at_least_one_space) if spaces_selected.blank?
|
39
39
|
end
|
@@ -44,6 +44,41 @@ module Decidim
|
|
44
44
|
[type.manifest_name, spaces] if spaces.present?
|
45
45
|
end.compact
|
46
46
|
end
|
47
|
+
|
48
|
+
def other_groups_selected_for_all_users?
|
49
|
+
send_to_verified_users.present? ||
|
50
|
+
send_to_participants.present? ||
|
51
|
+
send_to_followers.present? ||
|
52
|
+
send_to_private_members.present?
|
53
|
+
end
|
54
|
+
|
55
|
+
def other_groups_selected_for_verified_users?
|
56
|
+
send_to_all_users.present? ||
|
57
|
+
send_to_participants.present? ||
|
58
|
+
send_to_followers.present? ||
|
59
|
+
send_to_private_members.present?
|
60
|
+
end
|
61
|
+
|
62
|
+
def only_followers_selected?
|
63
|
+
send_to_all_users.blank? &&
|
64
|
+
send_to_participants.blank? &&
|
65
|
+
send_to_private_members.blank? &&
|
66
|
+
send_to_verified_users.blank?
|
67
|
+
end
|
68
|
+
|
69
|
+
def only_participants_selected?
|
70
|
+
send_to_all_users.blank? &&
|
71
|
+
send_to_followers.blank? &&
|
72
|
+
send_to_private_members.blank? &&
|
73
|
+
send_to_verified_users.blank?
|
74
|
+
end
|
75
|
+
|
76
|
+
def only_private_members_selected?
|
77
|
+
send_to_all_users.blank? &&
|
78
|
+
send_to_followers.blank? &&
|
79
|
+
send_to_participants.blank? &&
|
80
|
+
send_to_verified_users.blank?
|
81
|
+
end
|
47
82
|
end
|
48
83
|
end
|
49
84
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Admin
|
5
|
+
class ShareTokenForm < Decidim::Form
|
6
|
+
mimic :share_token
|
7
|
+
|
8
|
+
attribute :token, String
|
9
|
+
attribute :automatic_token, Boolean, default: true
|
10
|
+
attribute :expires_at, Decidim::Attributes::TimeWithZone
|
11
|
+
attribute :no_expiration, Boolean, default: true
|
12
|
+
attribute :registered_only, Boolean, default: false
|
13
|
+
|
14
|
+
validates :token, presence: true, if: ->(form) { form.automatic_token.blank? }
|
15
|
+
validate :token_uniqueness, if: ->(form) { form.automatic_token.blank? }
|
16
|
+
|
17
|
+
validates_format_of :token, with: /\A[a-zA-Z0-9_-]+\z/, allow_blank: true
|
18
|
+
validates :expires_at, presence: true, if: ->(form) { form.no_expiration.blank? }
|
19
|
+
|
20
|
+
def map_model(model)
|
21
|
+
self.no_expiration = model.expires_at.blank?
|
22
|
+
end
|
23
|
+
|
24
|
+
def token
|
25
|
+
super.strip.upcase.gsub(/\s+/, "-") if super.present?
|
26
|
+
end
|
27
|
+
|
28
|
+
def expires_at
|
29
|
+
return nil if no_expiration.present?
|
30
|
+
|
31
|
+
super
|
32
|
+
end
|
33
|
+
|
34
|
+
def token_for
|
35
|
+
context[:resource]
|
36
|
+
end
|
37
|
+
|
38
|
+
def organization
|
39
|
+
context[:current_organization]
|
40
|
+
end
|
41
|
+
|
42
|
+
def user
|
43
|
+
context[:current_user]
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def token_uniqueness
|
49
|
+
return unless Decidim::ShareToken.where(organization:, token_for:, token:).where.not(id:).any?
|
50
|
+
|
51
|
+
errors.add(:token, :taken)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -9,7 +9,7 @@ module Decidim
|
|
9
9
|
attribute :slug, String
|
10
10
|
validates :title, translatable_presence: true
|
11
11
|
translatable_attribute :title, String
|
12
|
-
translatable_attribute :content,
|
12
|
+
translatable_attribute :content, Decidim::Attributes::RichText
|
13
13
|
attribute :changed_notably, Boolean
|
14
14
|
attribute :allow_public_access, Boolean
|
15
15
|
attribute :weight, Integer
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Admin
|
5
|
+
# A form object to create or update areas.
|
6
|
+
class TaxonomyFilterForm < Form
|
7
|
+
include TranslatableAttributes
|
8
|
+
Item = Struct.new(:name, :value, :children)
|
9
|
+
Manifest = Struct.new(:id, :name)
|
10
|
+
|
11
|
+
attribute :root_taxonomy_id, Integer
|
12
|
+
translatable_attribute :name, String
|
13
|
+
translatable_attribute :internal_name, String
|
14
|
+
attribute :participatory_space_manifests, Array, default: []
|
15
|
+
attribute :taxonomy_items, Array
|
16
|
+
|
17
|
+
mimic :taxonomy_filter
|
18
|
+
|
19
|
+
validates :root_taxonomy_id, :taxonomy_items, presence: true
|
20
|
+
validate :valid_taxonomy_items
|
21
|
+
|
22
|
+
def map_model(model)
|
23
|
+
self.root_taxonomy_id = model.root_taxonomy_id
|
24
|
+
self.taxonomy_items = model.filter_items.map(&:taxonomy_item_id)
|
25
|
+
self.name = {} if model.attributes["name"]&.compact_blank.blank?
|
26
|
+
self.internal_name = {} if model.attributes["internal_name"]&.compact_blank.blank?
|
27
|
+
end
|
28
|
+
|
29
|
+
def taxonomy_items
|
30
|
+
super.compact_blank
|
31
|
+
end
|
32
|
+
|
33
|
+
def participatory_space_manifests
|
34
|
+
super.compact_blank
|
35
|
+
end
|
36
|
+
|
37
|
+
def filter_items
|
38
|
+
taxonomy_items.map do |item|
|
39
|
+
Decidim::TaxonomyFilterItem.new(taxonomy_item_id: item)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def items_collection
|
44
|
+
return [] unless root_taxonomy
|
45
|
+
|
46
|
+
@items_collection ||= map_items_collection(root_taxonomy)
|
47
|
+
end
|
48
|
+
|
49
|
+
def root_taxonomy
|
50
|
+
@root_taxonomy ||= current_organization.taxonomies.find_by(id: root_taxonomy_id)
|
51
|
+
end
|
52
|
+
|
53
|
+
def available_participatory_space_manifests
|
54
|
+
@participatory_space_manifests ||= Decidim.participatory_space_manifests.map do |manifest|
|
55
|
+
Manifest.new(
|
56
|
+
id: manifest.name.to_s,
|
57
|
+
name: I18n.t("decidim.admin.taxonomy_filters.space_filter_for.#{manifest.name}")
|
58
|
+
)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def map_items_collection(taxonomy)
|
65
|
+
taxonomy.children.map do |item|
|
66
|
+
Item.new(
|
67
|
+
name: translated_attribute(item.name),
|
68
|
+
value: item.id,
|
69
|
+
children: map_items_collection(item)
|
70
|
+
)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def valid_taxonomy_items
|
75
|
+
return if taxonomy_items.all? do |item|
|
76
|
+
next unless root_taxonomy
|
77
|
+
|
78
|
+
root_taxonomy.all_children.map(&:id).include?(item.to_i)
|
79
|
+
end
|
80
|
+
|
81
|
+
errors.add(:taxonomy_items, :invalid)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Admin
|
5
|
+
# A form object to be used when creating or updating a taxonomy.
|
6
|
+
class TaxonomyForm < Decidim::Form
|
7
|
+
include Decidim::TranslatableAttributes
|
8
|
+
|
9
|
+
mimic :taxonomy
|
10
|
+
|
11
|
+
translatable_attribute :name, String
|
12
|
+
|
13
|
+
validates :name, translatable_presence: true
|
14
|
+
|
15
|
+
alias organization current_organization
|
16
|
+
|
17
|
+
def parent_id = nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Admin
|
5
|
+
# A form object to be used when creating or updating a taxonomy.
|
6
|
+
class TaxonomyItemForm < Decidim::Form
|
7
|
+
include Decidim::TranslatableAttributes
|
8
|
+
|
9
|
+
mimic :taxonomy
|
10
|
+
|
11
|
+
# we do not use "name" here to avoid collisions when using foundation tabs for multilingual fields tabs
|
12
|
+
# as this is used in a modal and the name identifier is used for the root taxonomy
|
13
|
+
translatable_attribute :item_name, String
|
14
|
+
attribute :parent_id, Integer
|
15
|
+
|
16
|
+
validates :item_name, translatable_presence: true
|
17
|
+
validate :validate_parent_id_within_same_root_taxonomy
|
18
|
+
|
19
|
+
alias name item_name
|
20
|
+
|
21
|
+
def map_model(model)
|
22
|
+
self.item_name = model.name
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.from_params(params, additional_params = {})
|
26
|
+
additional_params[:taxonomy] = {}
|
27
|
+
if params[:taxonomy]
|
28
|
+
params[:taxonomy].each do |key, value|
|
29
|
+
additional_params[:taxonomy][key[8..]] = value if key.start_with?("item_name_")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
super
|
33
|
+
end
|
34
|
+
|
35
|
+
def validate_parent_id_within_same_root_taxonomy
|
36
|
+
if parent
|
37
|
+
current_root_taxonomy = if parent.root?
|
38
|
+
parent
|
39
|
+
else
|
40
|
+
parent.root_taxonomy
|
41
|
+
end
|
42
|
+
|
43
|
+
errors.add(:parent_id, :invalid) unless parent.root_taxonomy.id == current_root_taxonomy.id
|
44
|
+
else
|
45
|
+
errors.add(:parent_id, :invalid)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def parent
|
50
|
+
@parent ||= Decidim::Taxonomy.find_by(id: parent_id)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -14,6 +14,21 @@ module Decidim
|
|
14
14
|
|
15
15
|
validates :current_user, presence: true
|
16
16
|
validates :conflict, presence: true
|
17
|
+
validates :email, presence: true
|
18
|
+
validate :unique_email
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def unique_email
|
23
|
+
return if conflict.blank?
|
24
|
+
return true if Decidim::UserBaseEntity.where(
|
25
|
+
organization: context.current_organization,
|
26
|
+
email:
|
27
|
+
).where.not(id: [conflict.current_user.id, conflict.managed_user_id]).empty?
|
28
|
+
|
29
|
+
errors.add :email, :taken
|
30
|
+
false
|
31
|
+
end
|
17
32
|
end
|
18
33
|
end
|
19
34
|
end
|
@@ -13,7 +13,6 @@ module Decidim
|
|
13
13
|
include Decidim::MapHelper
|
14
14
|
include Decidim::Admin::LogRenderHelper
|
15
15
|
include Decidim::Admin::UserRolesHelper
|
16
|
-
include Decidim::Admin::ResourceScopeHelper
|
17
16
|
include Decidim::Admin::SearchFormHelper
|
18
17
|
|
19
18
|
# Public: Overwrites the `cell` helper method to automatically set some
|
@@ -3,37 +3,6 @@
|
|
3
3
|
module Decidim
|
4
4
|
module Admin
|
5
5
|
module BulkActionsHelper
|
6
|
-
# Public: Generates a select field with the categories. Only leaf categories can be set as selected.
|
7
|
-
#
|
8
|
-
# categories - A collection of categories.
|
9
|
-
#
|
10
|
-
# Returns a String.
|
11
|
-
def bulk_categories_select(collection)
|
12
|
-
categories = bulk_categories_for_select collection
|
13
|
-
prompt = t("decidim.proposals.admin.proposals.index.change_category")
|
14
|
-
select(:category, :id, options_for_select(categories, selected: []), prompt:)
|
15
|
-
end
|
16
|
-
|
17
|
-
def bulk_categories_for_select(scope)
|
18
|
-
sorted_main_categories = scope.first_class.includes(:subcategories).sort_by do |category|
|
19
|
-
translated_attribute(category.name, category.participatory_space.organization)
|
20
|
-
end
|
21
|
-
|
22
|
-
sorted_main_categories.flat_map do |category|
|
23
|
-
parent = [[translated_attribute(category.name, category.participatory_space.organization), category.id]]
|
24
|
-
|
25
|
-
sorted_subcategories = category.subcategories.sort_by do |subcategory|
|
26
|
-
translated_attribute(subcategory.name, subcategory.participatory_space.organization)
|
27
|
-
end
|
28
|
-
|
29
|
-
sorted_subcategories.each do |subcategory|
|
30
|
-
parent << ["- #{translated_attribute(subcategory.name, subcategory.participatory_space.organization)}", subcategory.id]
|
31
|
-
end
|
32
|
-
|
33
|
-
parent
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
6
|
# Public: Generates a select field with the components.
|
38
7
|
#
|
39
8
|
# siblings - A collection of components.
|
@@ -14,7 +14,7 @@ module Decidim
|
|
14
14
|
def reportable_author_name(reportable)
|
15
15
|
reportable_authors = reportable.try(:authors) || [reportable.try(:normalized_author)]
|
16
16
|
content_tag :ul, class: "reportable-authors" do
|
17
|
-
reportable_authors.
|
17
|
+
reportable_authors.compact_blank.map do |author|
|
18
18
|
case author
|
19
19
|
when User
|
20
20
|
content_tag :li do
|