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
@@ -4,6 +4,13 @@ module Decidim
|
|
4
4
|
module Admin
|
5
5
|
# This module includes helpers to manage newsletters in admin layout
|
6
6
|
module NewslettersHelper
|
7
|
+
def find_verification_types_for_select(organization)
|
8
|
+
available_verifications = organization.available_authorizations
|
9
|
+
available_verifications.map do |verification_type|
|
10
|
+
[t("decidim.authorization_handlers.#{verification_type}.name"), verification_type]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
7
14
|
def participatory_spaces_for_select(form_object)
|
8
15
|
content_tag :div do
|
9
16
|
@form.participatory_space_types.each do |space_type|
|
@@ -17,22 +24,32 @@ module Decidim
|
|
17
24
|
|
18
25
|
html = ""
|
19
26
|
form_object.fields_for "participatory_space_types[#{space_type.manifest_name}]", space_type do |ff|
|
27
|
+
html += participatory_space_title(space_type)
|
20
28
|
html += ff.hidden_field :manifest_name, value: space_type.manifest_name
|
21
29
|
html += select_tag_participatory_spaces(space_type.manifest_name, spaces_for_select(space_type.manifest_name.to_sym), ff)
|
22
30
|
end
|
23
31
|
html.html_safe
|
24
32
|
end
|
25
33
|
|
34
|
+
def participatory_space_title(space_type)
|
35
|
+
return unless space_type
|
36
|
+
|
37
|
+
content_tag :h4 do
|
38
|
+
t("activerecord.models.decidim/#{space_type.manifest_name.singularize}.other")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
26
42
|
def select_tag_participatory_spaces(manifest_name, spaces, child_form)
|
27
43
|
return unless spaces
|
28
44
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
45
|
+
raw(cell("decidim/admin/multi_select_picker", nil, context: {
|
46
|
+
select_id: "#{manifest_name}-spaces-select",
|
47
|
+
field_name: "#{child_form.object_name}[ids][]",
|
48
|
+
options_for_select: spaces,
|
49
|
+
selected_values: selected_options(:participatory_space_types)[manifest_name] || [],
|
50
|
+
placeholder: t("select_recipients_to_deliver.select_#{manifest_name}", scope: "decidim.admin.newsletters"),
|
51
|
+
class: "mb-2"
|
52
|
+
}))
|
36
53
|
end
|
37
54
|
|
38
55
|
def spaces_for_select(manifest_name)
|
@@ -45,21 +62,35 @@ module Decidim
|
|
45
62
|
def selective_newsletter_to(newsletter)
|
46
63
|
return content_tag(:strong, t("index.not_sent", scope: "decidim.admin.newsletters"), class: "text-warning") unless newsletter.sent?
|
47
64
|
return content_tag(:strong, t("index.all_users", scope: "decidim.admin.newsletters"), class: "text-success") if newsletter.sent? && newsletter.extended_data.blank?
|
65
|
+
return sent_to_verified_users(newsletter) if newsletter.sent_to_verified_users?
|
48
66
|
|
49
67
|
content_tag :div do
|
50
68
|
concat sent_to_users newsletter
|
51
69
|
concat sent_to_spaces newsletter
|
52
|
-
concat sent_to_scopes newsletter
|
53
70
|
end
|
54
71
|
end
|
55
72
|
|
56
73
|
def sent_to_users(newsletter)
|
57
74
|
content_tag :p, style: "margin-bottom:0;" do
|
58
75
|
concat content_tag(:strong, t("index.has_been_sent_to", scope: "decidim.admin.newsletters"), class: "text-success")
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
76
|
+
|
77
|
+
recipients = []
|
78
|
+
|
79
|
+
recipients << content_tag(:strong, t("index.all_users", scope: "decidim.admin.newsletters")) if newsletter.sent_to_all_users?
|
80
|
+
recipients << content_tag(:strong, t("index.verified_users", scope: "decidim.admin.newsletters")) if newsletter.sent_to_verified_users?
|
81
|
+
recipients << content_tag(:strong, t("index.followers", scope: "decidim.admin.newsletters")) if newsletter.sent_to_followers?
|
82
|
+
recipients << content_tag(:strong, t("index.participants", scope: "decidim.admin.newsletters")) if newsletter.sent_to_participants?
|
83
|
+
recipients << content_tag(:strong, t("index.private_members", scope: "decidim.admin.newsletters")) if newsletter.sent_to_private_members?
|
84
|
+
|
85
|
+
concat recipients.join(t("index.and", scope: "decidim.admin.newsletters")).html_safe
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def sent_to_verified_users(newsletter)
|
90
|
+
content_tag :p, style: "margin-bottom:0;" do
|
91
|
+
concat content_tag(:strong, t("index.has_been_sent_to", scope: "decidim.admin.newsletters"), class: "text-success")
|
92
|
+
concat content_tag(:strong, t("index.verified_users", scope: "decidim.admin.newsletters"))
|
93
|
+
concat content_tag(:p, t("index.verification_types", scope: "decidim.admin.newsletters", types: selected_verification_types(newsletter)))
|
63
94
|
end
|
64
95
|
end
|
65
96
|
|
@@ -68,12 +99,14 @@ module Decidim
|
|
68
99
|
newsletter.sent_to_participatory_spaces.try(:each) do |type|
|
69
100
|
next if type["ids"].blank?
|
70
101
|
|
102
|
+
ids = parse_ids(type["ids"])
|
103
|
+
|
71
104
|
html += t("index.segmented_to", scope: "decidim.admin.newsletters", subject: t("activerecord.models.decidim/#{type["manifest_name"].singularize}.other"))
|
72
|
-
if
|
105
|
+
if ids.include?("all")
|
73
106
|
html += "<strong> #{t("index.all", scope: "decidim.admin.newsletters")} </strong>"
|
74
107
|
else
|
75
108
|
Decidim.find_participatory_space_manifest(type["manifest_name"].to_sym)
|
76
|
-
.participatory_spaces.call(current_organization).where(id:
|
109
|
+
.participatory_spaces.call(current_organization).where(id: ids).each do |space|
|
77
110
|
html += "<strong>#{decidim_escape_translated(space.title)}</strong>"
|
78
111
|
end
|
79
112
|
end
|
@@ -83,19 +116,6 @@ module Decidim
|
|
83
116
|
html.html_safe
|
84
117
|
end
|
85
118
|
|
86
|
-
def sent_to_scopes(newsletter)
|
87
|
-
content_tag :p, style: "margin-bottom:0;" do
|
88
|
-
concat t("index.segmented_to", scope: "decidim.admin.newsletters", subject: nil)
|
89
|
-
if newsletter.sent_scopes.any?
|
90
|
-
newsletter.sent_scopes.each do |scope|
|
91
|
-
concat content_tag(:strong, decidim_escape_translated(scope.name).to_s)
|
92
|
-
end
|
93
|
-
else
|
94
|
-
concat content_tag(:strong, t("index.no_scopes", scope: "decidim.admin.newsletters"))
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
119
|
def organization_participatory_space(manifest_name)
|
100
120
|
@organization_participatory_spaces ||= {}
|
101
121
|
@organization_participatory_spaces[manifest_name] ||= Decidim
|
@@ -144,6 +164,16 @@ module Decidim
|
|
144
164
|
body:
|
145
165
|
}
|
146
166
|
end
|
167
|
+
|
168
|
+
def parse_ids(ids)
|
169
|
+
ids.size == 1 && ids.first.is_a?(String) ? ids.first.split.map(&:strip) : ids
|
170
|
+
end
|
171
|
+
|
172
|
+
def selected_verification_types(newsletter)
|
173
|
+
newsletter.sent_to_users_with_verification_types&.map do |type|
|
174
|
+
I18n.t("decidim.authorization_handlers.#{type}.name")
|
175
|
+
end&.join(", ")
|
176
|
+
end
|
147
177
|
end
|
148
178
|
end
|
149
179
|
end
|
@@ -32,12 +32,6 @@ module Decidim
|
|
32
32
|
Option.new(scope_type.id, translated_attribute(scope_type.name))
|
33
33
|
end
|
34
34
|
end
|
35
|
-
|
36
|
-
def organization_scope_depths(organization = current_organization)
|
37
|
-
organization.scope_types.map do |scope_type|
|
38
|
-
Option.new(scope_type.id, translated_attribute(scope_type.name))
|
39
|
-
end.reverse
|
40
|
-
end
|
41
35
|
end
|
42
36
|
end
|
43
37
|
end
|
@@ -5,8 +5,6 @@ module Decidim
|
|
5
5
|
# This class contains helpers needed in order for component settings to
|
6
6
|
# properly render.
|
7
7
|
module SettingsHelper
|
8
|
-
include Decidim::ScopesHelper
|
9
|
-
|
10
8
|
TYPES = {
|
11
9
|
boolean: :check_box,
|
12
10
|
integer: :number_field,
|
@@ -14,9 +12,10 @@ module Decidim
|
|
14
12
|
float: :number_field,
|
15
13
|
text: :text_area,
|
16
14
|
select: :select_field,
|
17
|
-
scope: :scope_field,
|
18
15
|
enum: :collection_radio_buttons,
|
19
|
-
time: :datetime_field
|
16
|
+
time: :datetime_field,
|
17
|
+
integer_with_units: :integer_with_units,
|
18
|
+
taxonomy_filters: :taxonomy_filters
|
20
19
|
}.freeze
|
21
20
|
|
22
21
|
# Renders a form field that matches a settings attribute's type.
|
@@ -52,20 +51,39 @@ module Decidim
|
|
52
51
|
if attribute.translated?
|
53
52
|
options[:tabs_id] = "#{options.delete(:tabs_prefix)}-#{name}-tabs"
|
54
53
|
form.send(:translated, form_method, name, options)
|
55
|
-
elsif form_method == :collection_radio_buttons
|
56
|
-
render_enum_form_field(form, attribute, name, i18n_scope, options)
|
57
|
-
elsif form_method == :select_field
|
58
|
-
render_select_form_field(form, attribute, name, i18n_scope, options)
|
59
|
-
elsif form_method == :scope_field
|
60
|
-
scopes_select_field(form, name)
|
61
54
|
else
|
62
|
-
|
55
|
+
render_field_form_method(form_method, form, attribute, name, i18n_scope, options)
|
63
56
|
end
|
64
57
|
end.html_safe
|
65
58
|
end
|
66
59
|
|
67
60
|
private
|
68
61
|
|
62
|
+
# rubocop:disable Metrics/ParameterLists
|
63
|
+
def render_field_form_method(form_method, form, attribute, name, i18n_scope, options)
|
64
|
+
case form_method
|
65
|
+
when :collection_radio_buttons
|
66
|
+
render_enum_form_field(form, attribute, name, i18n_scope, options)
|
67
|
+
when :select_field
|
68
|
+
render_select_form_field(form, attribute, name, i18n_scope, options)
|
69
|
+
when :integer_with_units
|
70
|
+
integer_with_units(form, attribute, name, i18n_scope, options)
|
71
|
+
when :taxonomy_filters
|
72
|
+
if TaxonomyFilter.for(current_organization).blank?
|
73
|
+
label_tag(name, t(name, scope: i18n_scope)) +
|
74
|
+
content_tag(:p) do
|
75
|
+
content_tag(:span, t("no_taxonomy_filters_found", scope: i18n_scope), class: "text-gray mr-2") +
|
76
|
+
link_to(t("define_taxonomy_filters", scope: i18n_scope), decidim_admin.taxonomies_path, class: "button button__text-secondary")
|
77
|
+
end.html_safe
|
78
|
+
else
|
79
|
+
taxonomy_filters(form, name, i18n_scope)
|
80
|
+
end
|
81
|
+
else
|
82
|
+
form.send(form_method, name, options)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
# rubocop:enable Metrics/ParameterLists
|
86
|
+
|
69
87
|
# Renders a select field collection input for the given attribute
|
70
88
|
#
|
71
89
|
# @param form (see #settings_attribute_input)
|
@@ -165,6 +183,62 @@ module Decidim
|
|
165
183
|
[t("#{name}_choices.#{choice}", scope: i18n_scope), choice]
|
166
184
|
end
|
167
185
|
end
|
186
|
+
|
187
|
+
# Renders a form field that includes an integer input and a select dropdown for units.
|
188
|
+
#
|
189
|
+
# @param form (see #settings_attribute_input)
|
190
|
+
# @param attribute [Decidim::SettingsManifest::Attribute] The attribute to be rendered
|
191
|
+
# @param name (see #settings_attribute_input)
|
192
|
+
# @param i18n_scope (see #settings_attribute_input)
|
193
|
+
# @param options (see #settings_attribute_input)
|
194
|
+
# @option options [String] :label The label text for the field
|
195
|
+
# @return [ActiveSupport::SafeBuffer] Rendered form field
|
196
|
+
def integer_with_units(form, attribute, name, i18n_scope, options)
|
197
|
+
value = form.object.send(name)
|
198
|
+
|
199
|
+
number_value = value[0].to_i
|
200
|
+
unit_value = value[1].to_s
|
201
|
+
|
202
|
+
number_field_html = form.number_field(name, options.merge(label: false,
|
203
|
+
value: number_value,
|
204
|
+
name: "#{form.field_name(name)}[0]",
|
205
|
+
style: "flex: 0 0 25%;"))
|
206
|
+
select_field_html = form.select(name,
|
207
|
+
attribute.build_units.map { |unit| [t("#{name}_units.#{unit}", scope: i18n_scope), unit] },
|
208
|
+
{ label: false, value: unit_value },
|
209
|
+
{ name: "#{form.field_name(name)}[1]", style: "flex: 1 1 75%;" })
|
210
|
+
|
211
|
+
content_tag(:label, options[:label]) + content_tag(:div, number_field_html + select_field_html, class: "flex space-x-2 items-center")
|
212
|
+
end
|
213
|
+
|
214
|
+
# Renders a form field that includes a taxonomy filters input hidden for each taxonomy filter
|
215
|
+
# and a button to open a drawer with all the available taxonomy filters with actions to manage them.
|
216
|
+
#
|
217
|
+
# @param name (see #settings_attribute_input)
|
218
|
+
# @param i18n_scope (see #settings_attribute_input)
|
219
|
+
def taxonomy_filters(form, name, i18n_scope)
|
220
|
+
current_filters = content_tag(:div, class: "js-current-filters") do
|
221
|
+
render partial: "decidim/admin/taxonomy_filters_selector/component_table",
|
222
|
+
locals: { field_name: "#{form.object_name}[#{name}][]", component: @component }
|
223
|
+
end
|
224
|
+
add_button = content_tag(:div, class: "mt-2") do
|
225
|
+
content_tag(:button,
|
226
|
+
t("#{name}_add", scope: i18n_scope),
|
227
|
+
class: "button button__xs button__transparent-secondary js-add-taxonomy-filter",
|
228
|
+
data: {
|
229
|
+
url: decidim_admin.taxonomy_filters_selector_index_path(component_id: @component.id)
|
230
|
+
})
|
231
|
+
end
|
232
|
+
container = content_tag(:div, class: "js-taxonomy-filters-container", data: { drawer: "#{name}-dialog" }) do
|
233
|
+
current_filters + add_button
|
234
|
+
end
|
235
|
+
|
236
|
+
drawer = decidim_drawer id: "#{name}-dialog" do
|
237
|
+
render partial: "decidim/admin/components/taxonomy_filters_drawer"
|
238
|
+
end
|
239
|
+
|
240
|
+
label_tag(name, t(name, scope: i18n_scope)) + container + drawer
|
241
|
+
end
|
168
242
|
end
|
169
243
|
end
|
170
244
|
end
|
@@ -33,10 +33,12 @@ module Decidim
|
|
33
33
|
def extended_data
|
34
34
|
{
|
35
35
|
send_to_all_users: @form["send_to_all_users"],
|
36
|
+
send_to_verified_users: @form["send_to_verified_users"],
|
36
37
|
send_to_followers: @form["send_to_followers"],
|
37
38
|
send_to_participants: @form["send_to_participants"],
|
39
|
+
send_to_private_members: @form["send_to_private_members"],
|
38
40
|
participatory_space_types: @form["participatory_space_types"],
|
39
|
-
|
41
|
+
verification_types: @form["verification_types"]
|
40
42
|
}
|
41
43
|
end
|
42
44
|
|
@@ -10,8 +10,11 @@ import "src/decidim/admin/newsletters"
|
|
10
10
|
import "src/decidim/admin/form"
|
11
11
|
import "src/decidim/admin/external_domain_allowlist"
|
12
12
|
import "src/decidim/admin/draggable-list"
|
13
|
+
import "src/decidim/admin/draggable-table"
|
13
14
|
import "src/decidim/admin/sortable"
|
15
|
+
import "src/decidim/admin/managed_moderated_users"
|
14
16
|
import "src/decidim/admin/moderations"
|
17
|
+
import "src/decidim/admin/global_moderations"
|
15
18
|
import "src/decidim/admin/officializations"
|
16
19
|
import "src/decidim/slug_form"
|
17
20
|
import "src/decidim/admin/admin_autocomplete"
|
@@ -20,6 +23,7 @@ import "src/decidim/admin/participatory_space_search"
|
|
20
23
|
import "src/decidim/admin/css_preview"
|
21
24
|
import "src/decidim/admin/sync_radio_buttons"
|
22
25
|
import "src/decidim/admin/text_copy"
|
26
|
+
import "src/decidim/admin/taxonomy_filters"
|
23
27
|
|
24
28
|
// CSS
|
25
29
|
import "entrypoints/decidim_admin.scss";
|
@@ -7,6 +7,8 @@ import Configuration from "src/decidim/configuration";
|
|
7
7
|
import InputCharacterCounter from "src/decidim/input_character_counter";
|
8
8
|
import managedUsersForm from "src/decidim/admin/managed_users";
|
9
9
|
|
10
|
+
import "chartkick/chart.js";
|
11
|
+
|
10
12
|
window.Decidim = window.Decidim || {};
|
11
13
|
window.Decidim.managedUsersForm = managedUsersForm;
|
12
14
|
window.Decidim.config = new Configuration();
|
@@ -0,0 +1,33 @@
|
|
1
|
+
import createSortList from "src/decidim/admin/sort_list.component"
|
2
|
+
|
3
|
+
/**
|
4
|
+
* Draggable table
|
5
|
+
*
|
6
|
+
* This script is used to make a table draggable.
|
7
|
+
* It works with two data attributes:
|
8
|
+
*
|
9
|
+
* - data-draggable-table: The table that will be draggable.
|
10
|
+
* - data-sort-url: The URL where the order will be sent.
|
11
|
+
*/
|
12
|
+
$(() => {
|
13
|
+
createSortList("[data-draggable-table]", {
|
14
|
+
onSortUpdate: ($children) => {
|
15
|
+
const children = $children.toArray();
|
16
|
+
|
17
|
+
if (children.length === 0) {
|
18
|
+
return;
|
19
|
+
}
|
20
|
+
|
21
|
+
const parent = children[0].parentNode;
|
22
|
+
const sortUrl = parent.dataset.sortUrl;
|
23
|
+
const order = children.map((child) => child.dataset.recordId);
|
24
|
+
|
25
|
+
$.ajax({
|
26
|
+
method: "PUT",
|
27
|
+
url: sortUrl,
|
28
|
+
contentType: "application/json",
|
29
|
+
data: JSON.stringify({ order_ids: order }) // eslint-disable-line camelcase
|
30
|
+
});
|
31
|
+
}
|
32
|
+
});
|
33
|
+
})
|
@@ -0,0 +1,186 @@
|
|
1
|
+
/* eslint-disable no-invalid-this */
|
2
|
+
/* eslint no-unused-vars: 0 */
|
3
|
+
/* eslint id-length: ["error", { "exceptions": ["e"] }] */
|
4
|
+
|
5
|
+
document.addEventListener("DOMContentLoaded", () => {
|
6
|
+
const selectedModerationsCount = () => {
|
7
|
+
return document.querySelectorAll(".table-list .js-check-all-moderations:checked").length;
|
8
|
+
};
|
9
|
+
|
10
|
+
const selectedModerationsCountUpdate = () => {
|
11
|
+
const selectedModerations = selectedModerationsCount();
|
12
|
+
|
13
|
+
const countElement = document.getElementById("js-selected-moderations-count");
|
14
|
+
const hideActions = document.getElementById("js-hide-global-moderations-actions");
|
15
|
+
const unhideActions = document.getElementById("js-unhide-global-moderations-actions");
|
16
|
+
const unreportActions = document.getElementById("js-unreport-global-moderations-actions");
|
17
|
+
|
18
|
+
if (selectedModerations === 0) {
|
19
|
+
countElement.textContent = "";
|
20
|
+
hideActions.classList.add("hide");
|
21
|
+
unhideActions.classList.add("hide");
|
22
|
+
unreportActions.classList.add("hide");
|
23
|
+
} else {
|
24
|
+
countElement.textContent = selectedModerations;
|
25
|
+
}
|
26
|
+
};
|
27
|
+
|
28
|
+
const showBulkActionsButton = () => {
|
29
|
+
if (selectedModerationsCount() > 0) {
|
30
|
+
document.getElementById("js-bulk-actions-button").classList.remove("hide");
|
31
|
+
}
|
32
|
+
};
|
33
|
+
|
34
|
+
const hideBulkActionsButton = (force = false) => {
|
35
|
+
const bulkActionsButton = document.getElementById("js-bulk-actions-button");
|
36
|
+
const bulkActionsDropdown = document.getElementById("js-bulk-actions-dropdown");
|
37
|
+
|
38
|
+
if (selectedModerationsCount() === 0 || force === true) {
|
39
|
+
bulkActionsButton.classList.add("hide");
|
40
|
+
bulkActionsDropdown.classList.remove("is-open");
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
const showOtherActionsButtons = () => {
|
45
|
+
document.getElementById("js-other-actions-wrapper").classList.remove("hide");
|
46
|
+
};
|
47
|
+
|
48
|
+
const hideOtherActionsButtons = () => {
|
49
|
+
document.getElementById("js-other-actions-wrapper").classList.add("hide");
|
50
|
+
};
|
51
|
+
|
52
|
+
const hideBulkActionForms = () => {
|
53
|
+
document.querySelectorAll(".js-bulk-action-form").forEach((form) => {
|
54
|
+
form.classList.add("hide");
|
55
|
+
});
|
56
|
+
}
|
57
|
+
|
58
|
+
// Expose functions to make them available in .js.erb templates
|
59
|
+
window.selectedModerationsCountUpdate = selectedModerationsCountUpdate;
|
60
|
+
window.showBulkActionsButton = showBulkActionsButton;
|
61
|
+
window.hideBulkActionsButton = hideBulkActionsButton;
|
62
|
+
window.showOtherActionsButtons = showOtherActionsButtons;
|
63
|
+
window.hideOtherActionsButtons = hideOtherActionsButtons;
|
64
|
+
window.hideBulkActionForms = hideBulkActionForms;
|
65
|
+
|
66
|
+
const bulkActionsButton = document.getElementById("js-bulk-actions-button");
|
67
|
+
|
68
|
+
if (document.querySelectorAll(".js-bulk-action-form").length) {
|
69
|
+
hideBulkActionForms();
|
70
|
+
bulkActionsButton.classList.add("hide");
|
71
|
+
|
72
|
+
document.querySelectorAll("#js-bulk-actions-dropdown ul li button").forEach((button) => {
|
73
|
+
button.addEventListener("click", (event) => {
|
74
|
+
const bulkActionsDropdown = document.getElementById("js-bulk-actions-dropdown");
|
75
|
+
bulkActionsDropdown.classList.remove("is-open");
|
76
|
+
hideBulkActionForms();
|
77
|
+
|
78
|
+
const action = event.target.dataset.action;
|
79
|
+
const panelActions = [
|
80
|
+
"hide-global-moderations",
|
81
|
+
"unreport-global-moderations",
|
82
|
+
"unhide-global-moderations"
|
83
|
+
];
|
84
|
+
|
85
|
+
if (!action) {
|
86
|
+
return;
|
87
|
+
}
|
88
|
+
|
89
|
+
const form = document.getElementById(`js-form-${action}`);
|
90
|
+
const actionElement = document.getElementById(`js-${action}-actions`);
|
91
|
+
|
92
|
+
if (panelActions.includes(action)) {
|
93
|
+
form.addEventListener("submit", () => {
|
94
|
+
document.querySelector(".layout-content > div[data-callout-wrapper]").innerHTML = "";
|
95
|
+
});
|
96
|
+
|
97
|
+
actionElement.classList.remove("hide");
|
98
|
+
} else {
|
99
|
+
form.addEventListener("submit", () => {
|
100
|
+
document.querySelector(".layout-content > div[data-callout-wrapper]").innerHTML = "";
|
101
|
+
});
|
102
|
+
|
103
|
+
actionElement.classList.remove("hide");
|
104
|
+
hideBulkActionsButton(true);
|
105
|
+
hideOtherActionsButtons();
|
106
|
+
}
|
107
|
+
});
|
108
|
+
});
|
109
|
+
|
110
|
+
// select all checkboxes
|
111
|
+
document.querySelector(".js-check-all").addEventListener("change", function () {
|
112
|
+
const isChecked = this.checked;
|
113
|
+
const checkboxes = document.querySelectorAll(".js-check-all-moderations");
|
114
|
+
|
115
|
+
checkboxes.forEach((checkbox) => {
|
116
|
+
checkbox.checked = isChecked;
|
117
|
+
const row = checkbox.closest("tr");
|
118
|
+
if (row) {
|
119
|
+
row.classList.toggle("selected", isChecked);
|
120
|
+
}
|
121
|
+
});
|
122
|
+
|
123
|
+
if (isChecked) {
|
124
|
+
showBulkActionsButton();
|
125
|
+
} else {
|
126
|
+
hideBulkActionsButton();
|
127
|
+
}
|
128
|
+
|
129
|
+
selectedModerationsCountUpdate();
|
130
|
+
});
|
131
|
+
|
132
|
+
// moderation checkbox change
|
133
|
+
document.querySelector(".table-list").addEventListener("change", (event) => {
|
134
|
+
if (!event.target.matches(".js-check-all-moderations")) {
|
135
|
+
return;
|
136
|
+
}
|
137
|
+
|
138
|
+
const checkbox = event.target;
|
139
|
+
const moderationId = checkbox.value;
|
140
|
+
const checked = checkbox.checked;
|
141
|
+
|
142
|
+
// Uncheck "select all" if one of the checkboxes is unchecked
|
143
|
+
const selectAllCheckbox = document.querySelector(".js-check-all");
|
144
|
+
if (!checked) {
|
145
|
+
selectAllCheckbox.checked = false;
|
146
|
+
}
|
147
|
+
|
148
|
+
// check "select all" if all checkbox moderations are checked
|
149
|
+
const allCheckboxes = Array.from(document.querySelectorAll(".js-check-all-moderations")).filter((checkboxItem) => checkboxItem.offsetParent !== null);
|
150
|
+
const checkedCheckboxes = Array.from(document.querySelectorAll(".js-check-all-moderations:checked")).filter((checkboxItem) => checkboxItem.offsetParent !== null);
|
151
|
+
|
152
|
+
if (allCheckboxes.length === checkedCheckboxes.length) {
|
153
|
+
selectAllCheckbox.checked = true;
|
154
|
+
showBulkActionsButton();
|
155
|
+
}
|
156
|
+
|
157
|
+
const row = checkbox.closest("tr");
|
158
|
+
if (row) {
|
159
|
+
row.classList.toggle("selected", checked);
|
160
|
+
}
|
161
|
+
|
162
|
+
if (checked) {
|
163
|
+
showBulkActionsButton();
|
164
|
+
} else {
|
165
|
+
hideBulkActionsButton();
|
166
|
+
}
|
167
|
+
|
168
|
+
if (checkedCheckboxes.length === 0) {
|
169
|
+
hideBulkActionsButton();
|
170
|
+
}
|
171
|
+
|
172
|
+
document.querySelectorAll(`.js-moderation-id-${moderationId}`).forEach((input) => {
|
173
|
+
input.checked = checked;
|
174
|
+
});
|
175
|
+
selectedModerationsCountUpdate();
|
176
|
+
});
|
177
|
+
|
178
|
+
document.querySelectorAll(".js-cancel-bulk-action").forEach((button) => {
|
179
|
+
button.addEventListener("click", () => {
|
180
|
+
hideBulkActionForms();
|
181
|
+
showBulkActionsButton();
|
182
|
+
showOtherActionsButtons();
|
183
|
+
});
|
184
|
+
});
|
185
|
+
}
|
186
|
+
});
|