decidim-core 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/amendable/amend_button_card/show.erb +6 -4
- data/app/cells/decidim/amendable/amend_button_card_cell.rb +8 -0
- data/app/cells/decidim/amendable/amendments/show.erb +1 -1
- data/app/cells/decidim/amendable/promote_button_card/show.erb +2 -0
- data/app/cells/decidim/author_cell.rb +1 -1
- data/app/cells/decidim/card_l/extra_data.erb +1 -0
- data/app/cells/decidim/card_metadata_cell.rb +9 -16
- data/app/cells/decidim/comments_button_cell.rb +14 -2
- data/app/cells/decidim/content_blocks/highlighted_elements_cell.rb +2 -0
- data/app/cells/decidim/content_blocks/highlighted_elements_with_cell_for_list_cell.rb +1 -1
- data/app/cells/decidim/endorsement_block/show.erb +0 -1
- data/app/cells/decidim/endorsement_block_cell.rb +6 -0
- data/app/cells/decidim/endorsement_buttons/button_content.erb +1 -1
- data/app/cells/decidim/endorsement_buttons/select_identity_button.erb +1 -1
- data/app/cells/decidim/endorsement_buttons/show.erb +7 -7
- data/app/cells/decidim/endorsement_buttons/verification_modal.erb +4 -2
- data/app/cells/decidim/endorsers_list/empty.erb +3 -0
- data/app/cells/decidim/endorsers_list/full.erb +17 -5
- data/app/cells/decidim/endorsers_list/show.erb +19 -10
- data/app/cells/decidim/endorsers_list_cell.rb +19 -6
- data/app/cells/decidim/follow_button/show.erb +1 -2
- data/app/cells/decidim/follow_button_cell.rb +5 -0
- data/app/cells/decidim/map/show.erb +3 -0
- data/app/cells/decidim/map/template.erb +14 -0
- data/app/cells/decidim/map_cell.rb +39 -0
- data/app/cells/decidim/notification_actions/buttons_cell.rb +1 -1
- data/app/cells/decidim/onboarding_action_message/show.erb +15 -0
- data/app/cells/decidim/onboarding_action_message_cell.rb +81 -0
- data/app/cells/decidim/participatory_space_private_user/show.erb +23 -0
- data/app/cells/decidim/participatory_space_private_user_cell.rb +21 -0
- data/app/cells/decidim/progress_bar/show.erb +2 -2
- data/app/cells/decidim/report_button_cell.rb +1 -0
- data/app/cells/decidim/resource_history/show.erb +20 -0
- data/app/cells/decidim/resource_history_cell.rb +66 -0
- data/app/cells/decidim/share_button_cell.rb +0 -4
- data/app/cells/decidim/share_widget/modal.erb +26 -0
- data/app/cells/decidim/share_widget/show.erb +2 -0
- data/app/cells/decidim/share_widget_cell.rb +20 -0
- data/app/cells/decidim/tags/show.erb +7 -4
- data/app/cells/decidim/tags_cell.rb +11 -72
- data/app/commands/decidim/amendable/create_draft.rb +2 -2
- data/app/commands/decidim/create_ephemeral_user.rb +52 -0
- data/app/commands/decidim/create_omniauth_registration.rb +13 -3
- data/app/commands/decidim/create_report.rb +1 -5
- data/app/commands/decidim/create_user_group.rb +6 -2
- data/app/commands/decidim/destroy_ephemeral_user.rb +47 -0
- data/app/commands/decidim/update_account.rb +11 -3
- data/app/commands/decidim/update_notifications_settings.rb +1 -0
- data/app/commands/decidim/update_resources_taxonomies.rb +67 -0
- data/app/commands/decidim/update_user_group.rb +7 -1
- data/app/constraints/decidim/current_component.rb +1 -1
- data/app/controllers/concerns/decidim/ajax_permission_handler.rb +21 -0
- data/app/controllers/concerns/decidim/devise_authentication_methods.rb +3 -6
- data/app/controllers/concerns/decidim/devise_controllers.rb +2 -0
- data/app/controllers/concerns/decidim/disable_redirection_to_external_host.rb +1 -1
- data/app/controllers/concerns/decidim/ephemeral_session_checker.rb +87 -0
- data/app/controllers/concerns/decidim/filter_resource.rb +4 -2
- data/app/controllers/concerns/decidim/has_members_page.rb +25 -0
- data/app/controllers/concerns/decidim/headers/browser_feature_permissions.rb +50 -0
- data/app/controllers/concerns/decidim/locale_switcher.rb +2 -2
- data/app/controllers/concerns/decidim/needs_password_change.rb +0 -1
- data/app/controllers/concerns/decidim/needs_permission.rb +2 -1
- data/app/controllers/concerns/decidim/needs_tos_accepted.rb +4 -5
- data/app/controllers/concerns/decidim/onboarding_action_methods.rb +52 -0
- data/app/controllers/decidim/application_controller.rb +10 -0
- data/app/controllers/decidim/authorization_modals_controller.rb +8 -2
- data/app/controllers/decidim/components/base_controller.rb +3 -7
- data/app/controllers/decidim/devise/confirmations_controller.rb +4 -0
- data/app/controllers/decidim/devise/omniauth_registrations_controller.rb +8 -1
- data/app/controllers/decidim/devise/registrations_controller.rb +1 -1
- data/app/controllers/decidim/devise/sessions_controller.rb +2 -0
- data/app/controllers/decidim/download_your_data_controller.rb +33 -2
- data/app/controllers/decidim/editor_images_controller.rb +1 -11
- data/app/controllers/decidim/follows_controller.rb +1 -1
- data/app/controllers/decidim/geolocation_controller.rb +19 -0
- data/app/controllers/decidim/homepage_controller.rb +0 -1
- data/app/controllers/decidim/open_data_controller.rb +33 -8
- data/app/controllers/decidim/user_conversations_controller.rb +1 -11
- data/app/events/decidim/soft_delete_resource_event.rb +15 -0
- data/app/forms/decidim/amendable/form.rb +4 -2
- data/app/forms/decidim/ephemeral_user_form.rb +22 -0
- data/app/forms/decidim/notifications_settings_form.rb +1 -0
- data/app/forms/decidim/omniauth_registration_form.rb +14 -1
- data/app/helpers/concerns/decidim/flash_helper_extensions.rb +17 -2
- data/app/helpers/decidim/action_authorization_helper.rb +75 -14
- data/app/helpers/decidim/amendments_helper.rb +0 -9
- data/app/helpers/decidim/application_helper.rb +6 -2
- data/app/helpers/decidim/breadcrumb_helper.rb +6 -0
- data/app/helpers/decidim/cache_helper.rb +1 -1
- data/app/helpers/decidim/check_boxes_tree_helper.rb +25 -53
- data/app/helpers/decidim/decidim_form_helper.rb +0 -44
- data/app/helpers/decidim/endorsable_helper.rb +0 -10
- data/app/helpers/decidim/layout_helper.rb +6 -0
- data/app/helpers/decidim/messaging/conversation_helper.rb +2 -3
- data/app/helpers/decidim/meta_tags_helper.rb +32 -23
- data/app/helpers/decidim/modal_helper.rb +23 -0
- data/app/helpers/decidim/omniauth_helper.rb +5 -5
- data/app/helpers/decidim/onboarding_action_helper.rb +13 -0
- data/app/helpers/decidim/orders_helper.rb +2 -1
- data/app/helpers/decidim/participatory_space_helpers.rb +1 -1
- data/app/helpers/decidim/passwords_helper.rb +2 -2
- data/app/helpers/decidim/taxonomies_helper.rb +40 -0
- data/app/jobs/decidim/download_your_data_export_job.rb +2 -19
- data/app/jobs/decidim/event_publisher_job.rb +18 -9
- data/app/jobs/decidim/export_job.rb +5 -1
- data/app/jobs/decidim/export_participatory_space_job.rb +4 -1
- data/app/jobs/decidim/hide_child_resources_job.rb +24 -0
- data/app/jobs/decidim/open_data_job.rb +4 -4
- data/app/mailers/decidim/export_mailer.rb +7 -12
- data/app/models/decidim/action_log.rb +11 -0
- data/app/models/decidim/category.rb +4 -0
- data/app/models/decidim/component.rb +25 -3
- data/app/models/decidim/metric.rb +2 -1
- data/app/models/decidim/moderation.rb +16 -0
- data/app/models/decidim/newsletter.rb +12 -8
- data/app/models/decidim/organization.rb +7 -3
- data/app/models/decidim/participatory_space_private_user.rb +20 -0
- data/app/models/decidim/private_export.rb +24 -0
- data/app/models/decidim/push_notification_message.rb +1 -1
- data/app/models/decidim/report.rb +1 -1
- data/app/models/decidim/scope.rb +4 -0
- data/app/models/decidim/share_token.rb +36 -10
- data/app/models/decidim/taxonomization.rb +23 -0
- data/app/models/decidim/taxonomy.rb +139 -0
- data/app/models/decidim/taxonomy_filter.rb +130 -0
- data/app/models/decidim/taxonomy_filter_item.rb +33 -0
- data/app/models/decidim/user.rb +9 -23
- data/app/models/decidim/user_base_entity.rb +12 -0
- data/app/models/decidim/user_moderation.rb +9 -0
- data/app/models/decidim/user_report.rb +4 -0
- data/app/packs/entrypoints/decidim_core.js +1 -0
- data/app/packs/entrypoints/decidim_geocoding.js +2 -0
- data/app/packs/images/decidim/brands/facebook.svg +10 -0
- data/app/packs/images/decidim/brands/google.svg +7 -1
- data/app/packs/images/decidim/brands/twitter-x.svg +3 -0
- data/app/packs/src/decidim/check_boxes_tree.js +0 -1
- data/app/packs/src/decidim/clipboard.js +18 -9
- data/app/packs/src/decidim/confirm.js +79 -59
- data/app/packs/src/decidim/decidim_application.js +1 -0
- data/app/packs/src/decidim/form_remote.js +1 -1
- data/app/packs/src/decidim/geocoding/reverse_geocoding.js +60 -0
- data/app/packs/src/decidim/impersonation.js +1 -1
- data/app/packs/src/decidim/index.js +11 -1
- data/app/packs/src/decidim/map/provider/here.js +1 -1
- data/app/packs/src/decidim/onboarding_pending_action.js +24 -0
- data/app/packs/src/decidim/session_timeouter.js +1 -1
- data/app/packs/src/decidim/sticky_footer.js +29 -0
- data/app/packs/src/decidim/sticky_header.js +6 -31
- data/app/packs/src/decidim/user_registrations.js +13 -0
- data/app/packs/src/decidim/utilities/dom.js +148 -0
- data/app/packs/stylesheets/decidim/_accordion.scss +30 -0
- data/app/packs/stylesheets/decidim/_buttons.scss +19 -0
- data/app/packs/stylesheets/decidim/_dropdown.scss +1 -1
- data/app/packs/stylesheets/decidim/_endorsers_list.scss +26 -20
- data/app/packs/stylesheets/decidim/_forms.scss +2 -2
- data/app/packs/stylesheets/decidim/_hashtags.scss +5 -0
- data/app/packs/stylesheets/decidim/_header.scss +5 -3
- data/app/packs/stylesheets/decidim/_layout.scss +32 -2
- data/app/packs/stylesheets/decidim/_login.scss +53 -6
- data/app/packs/stylesheets/decidim/_modal.scss +42 -0
- data/app/packs/stylesheets/decidim/_modal_tos_refuse.scss +4 -0
- data/app/packs/stylesheets/decidim/_participatory_spaces.scss +46 -0
- data/app/packs/stylesheets/decidim/_profile.scss +1 -1
- data/app/packs/stylesheets/decidim/_success_image.scss +64 -0
- data/app/packs/stylesheets/decidim/_tribute.scss +36 -0
- data/app/packs/stylesheets/decidim/application.scss +2 -0
- data/app/packs/stylesheets/decidim/geocoding_addons.scss +5 -0
- data/app/packs/stylesheets/decidim/map.scss +7 -10
- data/app/packs/stylesheets/decidim/resource_history.scss +31 -0
- data/app/permissions/decidim/permissions.rb +8 -2
- data/app/presenters/decidim/admin_log/base_user_presenter.rb +67 -0
- data/app/presenters/decidim/admin_log/component_presenter.rb +32 -3
- data/app/presenters/decidim/admin_log/moderation_presenter.rb +30 -3
- data/app/presenters/decidim/admin_log/share_token_presenter.rb +39 -0
- data/app/presenters/decidim/admin_log/taxonomy_filter_presenter.rb +57 -0
- data/app/presenters/decidim/admin_log/taxonomy_presenter.rb +48 -0
- data/app/presenters/decidim/admin_log/user_group_presenter.rb +6 -6
- data/app/presenters/decidim/admin_log/user_presenter.rb +4 -18
- data/app/presenters/decidim/log/value_types/date_presenter.rb +1 -0
- data/app/presenters/decidim/log/value_types/taxonomy_presenter.rb +29 -0
- data/app/presenters/decidim/participatory_space_private_user_presenter.rb +50 -0
- data/app/presenters/decidim/taxonomy_filter_presenter.rb +19 -0
- data/app/presenters/decidim/taxonomy_presenter.rb +14 -0
- data/app/queries/decidim/metrics/blocked_users_metric_manage.rb +2 -2
- data/app/queries/decidim/metrics/users_metric_manage.rb +2 -2
- data/app/queries/decidim/public_activities.rb +1 -12
- data/app/queries/decidim/stats_users_count.rb +2 -2
- data/app/resolvers/decidim/meta_image_url_resolver.rb +128 -0
- data/app/serializers/decidim/exporters/open_data_blocked_user_serializer.rb +25 -0
- data/app/serializers/decidim/exporters/open_data_metric_serializer.rb +22 -0
- data/app/serializers/decidim/exporters/open_data_moderation_serializer.rb +30 -0
- data/app/serializers/decidim/exporters/open_data_taxonomy_serializer.rb +30 -0
- data/app/serializers/decidim/exporters/open_data_user_group_serializer.rb +38 -0
- data/app/serializers/decidim/exporters/open_data_user_serializer.rb +39 -0
- data/app/serializers/decidim/exporters/participatory_space_serializer.rb +104 -0
- data/app/serializers/decidim/exporters/serializer.rb +25 -0
- data/app/serializers/decidim/schema_org_breadcrumb_list_serializer.rb +52 -0
- data/app/services/decidim/action_authorizer.rb +32 -3
- data/app/services/decidim/base_diff_renderer.rb +1 -1
- data/app/services/decidim/download_your_data_exporter.rb +58 -24
- data/app/services/decidim/onboarding_manager.rb +272 -0
- data/app/services/decidim/open_data_exporter.rb +139 -13
- data/app/services/decidim/traceability.rb +13 -0
- data/app/uploaders/decidim/application_uploader.rb +1 -1
- data/app/validators/etiquette_validator.rb +9 -2
- data/app/validators/passthru_validator.rb +1 -1
- data/app/validators/translated_etiquette_validator.rb +32 -0
- data/app/views/decidim/account/_password_fields.html.erb +2 -2
- data/app/views/decidim/application/_accordion_section.html.erb +14 -0
- data/app/views/decidim/application/_collection.html.erb +30 -18
- data/app/views/decidim/devise/omniauth_registrations/new.html.erb +5 -1
- data/app/views/decidim/devise/omniauth_registrations/new_tos_fields.html.erb +29 -0
- data/app/views/decidim/devise/registrations/new.html.erb +10 -22
- data/app/views/decidim/devise/sessions/new.html.erb +24 -29
- data/app/views/decidim/devise/shared/_omniauth_buttons.html.erb +2 -4
- data/app/views/decidim/devise/shared/_tos_fields.html.erb +16 -0
- data/app/views/decidim/download_your_data/_export.html.erb +15 -0
- data/app/views/decidim/download_your_data/show.html.erb +51 -5
- data/app/views/decidim/endorsements/update_buttons_and_counters.js.erb +16 -19
- data/app/views/decidim/export_mailer/download_your_data_export.html.erb +2 -2
- data/app/views/decidim/export_mailer/export.html.erb +5 -1
- data/app/views/decidim/notifications_settings/show.html.erb +22 -0
- data/app/views/decidim/open_data/_how_to_open_accordion_section.html.erb +15 -0
- data/app/views/decidim/open_data/index.html.erb +108 -0
- data/app/views/decidim/pages/show.html.erb +2 -1
- data/app/views/decidim/participatory_space_private_users/_participatory_space_private_user.html.erb +1 -0
- data/app/views/decidim/shared/_login_modal.html.erb +26 -20
- data/app/views/decidim/shared/_orders.html.erb +2 -2
- data/app/views/decidim/shared/_resource_actions.html.erb +21 -0
- data/app/views/decidim/shared/filters/_check_boxes_tree.html.erb +1 -2
- data/app/views/decidim/shared/filters/_collection.html.erb +1 -1
- data/app/views/decidim/shared/filters/_dropdown_label.html.erb +7 -4
- data/app/views/layouts/decidim/_application.html.erb +0 -1
- data/app/views/layouts/decidim/_js_configuration.html.erb +1 -0
- data/app/views/layouts/decidim/_logo.html.erb +1 -1
- data/app/views/layouts/decidim/_logo_mobile.html.erb +1 -1
- data/app/views/layouts/decidim/_meta_tags_config.html.erb +6 -11
- data/app/views/layouts/decidim/_schema_org_breadcrumb_list.html.erb +3 -0
- data/app/views/layouts/decidim/_wrapper.html.erb +15 -9
- data/app/views/layouts/decidim/footer/_main_links.html.erb +1 -1
- data/app/views/layouts/decidim/header/_close_ephemeral_session.html.erb +25 -0
- data/app/views/layouts/decidim/header/_main.html.erb +14 -10
- data/app/views/layouts/decidim/header/_menu_breadcrumb_items.html.erb +2 -0
- data/app/views/layouts/decidim/shared/_layout_item.html.erb +1 -1
- data/config/assets.rb +2 -1
- data/config/locales/ar.yml +27 -59
- data/config/locales/bg.yml +3 -64
- data/config/locales/ca.yml +370 -61
- data/config/locales/cs.yml +371 -54
- data/config/locales/de.yml +365 -54
- data/config/locales/el.yml +1 -48
- data/config/locales/en.yml +363 -54
- data/config/locales/eo.yml +0 -2
- data/config/locales/es-MX.yml +363 -57
- data/config/locales/es-PY.yml +363 -57
- data/config/locales/es.yml +367 -58
- data/config/locales/eu.yml +373 -65
- data/config/locales/fi-plain.yml +365 -57
- data/config/locales/fi.yml +370 -59
- data/config/locales/fr-CA.yml +178 -54
- data/config/locales/fr.yml +179 -52
- data/config/locales/ga-IE.yml +0 -21
- data/config/locales/gl.yml +1 -34
- data/config/locales/hu.yml +1 -53
- data/config/locales/id-ID.yml +1 -34
- data/config/locales/is-IS.yml +0 -16
- data/config/locales/it.yml +5 -60
- data/config/locales/ja.yml +215 -56
- data/config/locales/lb.yml +1 -52
- data/config/locales/lt.yml +1 -59
- data/config/locales/lv.yml +1 -40
- data/config/locales/nl.yml +1 -53
- data/config/locales/no.yml +2 -52
- data/config/locales/pl.yml +4 -66
- data/config/locales/pt-BR.yml +11 -52
- data/config/locales/pt.yml +2 -52
- data/config/locales/ro-RO.yml +219 -117
- data/config/locales/ru.yml +0 -20
- data/config/locales/sk.yml +1 -41
- data/config/locales/sv.yml +138 -59
- data/config/locales/tr-TR.yml +1 -50
- data/config/locales/uk.yml +0 -18
- data/config/locales/zh-CN.yml +1 -50
- data/config/locales/zh-TW.yml +1 -54
- data/config/routes.rb +4 -10
- data/db/migrate/20181025082245_add_timestamps_to_components.rb +2 -0
- data/db/migrate/20240628111905_add_visible_to_components.rb +7 -0
- data/db/migrate/20240704115429_create_decidim_taxonomies.rb +23 -0
- data/db/migrate/20240717093514_add_registered_only_to_decidim_share_tokens.rb +7 -0
- data/db/migrate/20240722215500_change_object_changes_on_versions.rb +39 -0
- data/db/migrate/20240806065417_create_decidim_taxonomy_filters.rb +23 -0
- data/db/migrate/20240822161348_add_deleted_at_to_decidim_components.rb +8 -0
- data/db/migrate/20240906162524_add_part_of_to_taxonomies.rb +26 -0
- data/db/migrate/20241001135825_add_role_to_participatory_space_private_users.rb +7 -0
- data/db/migrate/20241001140408_add_published_to_participatory_space_private_users.rb +7 -0
- data/db/migrate/20241022002600_create_private_exports.rb +18 -0
- data/db/migrate/20241028114430_add_component_counter_to_taxonomy_filters.rb +7 -0
- data/db/migrate/20241111104357_add_names_and_space_boolean_to_taxonomy_filters.rb +9 -0
- data/db/migrate/20241127093708_add_taxonomy_to_metrics.rb +7 -0
- data/db/migrate/20241204121445_add_participatory_space_manifests_from_taxonomy_filters.rb +9 -0
- data/decidim-core.gemspec +14 -17
- data/lib/decidim/action_authorization.rb +3 -2
- data/lib/decidim/amendable.rb +1 -1
- data/lib/decidim/api/input_filters/category_input_filter.rb +5 -3
- data/lib/decidim/api/input_filters/component_input_filter.rb +33 -20
- data/lib/decidim/api/input_filters/user_entity_input_filter.rb +53 -44
- data/lib/decidim/api/input_sorts/component_input_sort.rb +15 -13
- data/lib/decidim/api/input_sorts/user_entity_input_sort.rb +4 -4
- data/lib/decidim/api/interfaces/author_interface.rb +3 -2
- data/lib/decidim/api/interfaces/coauthorable_interface.rb +5 -5
- data/lib/decidim/api/interfaces/endorsable_interface.rb +2 -2
- data/lib/decidim/api/interfaces/participatory_space_interface.rb +5 -10
- data/lib/decidim/api/interfaces/taxonomizable_interface.rb +13 -0
- data/lib/decidim/api/types/amendment_type.rb +5 -7
- data/lib/decidim/api/types/area_api_type.rb +3 -3
- data/lib/decidim/api/types/attachment_type.rb +3 -3
- data/lib/decidim/api/types/category_type.rb +2 -2
- data/lib/decidim/api/types/decidim_type.rb +5 -1
- data/lib/decidim/api/types/fingerprint_type.rb +1 -1
- data/lib/decidim/api/types/localized_string_type.rb +1 -1
- data/lib/decidim/api/types/metric_history_type.rb +2 -0
- data/lib/decidim/api/types/metric_type.rb +1 -1
- data/lib/decidim/api/types/organization_type.rb +5 -0
- data/lib/decidim/api/types/participatory_space_link_type.rb +2 -2
- data/lib/decidim/api/types/participatory_space_manifest_type.rb +1 -1
- data/lib/decidim/api/types/quantifiable_translated_field_type.rb +1 -1
- data/lib/decidim/api/types/scope_api_type.rb +2 -3
- data/lib/decidim/api/types/session_type.rb +1 -2
- data/lib/decidim/api/types/taxonomy_type.rb +15 -0
- data/lib/decidim/api/types/trace_version_type.rb +2 -2
- data/lib/decidim/api/types/translated_field_type.rb +3 -5
- data/lib/decidim/api/types/user_group_type.rb +7 -20
- data/lib/decidim/api/types/user_type.rb +7 -20
- data/lib/decidim/asset_router/storage.rb +4 -4
- data/lib/decidim/assets/tailwind/tailwind.config.js.erb +2 -1
- data/lib/decidim/attachment_attributes.rb +1 -1
- data/lib/decidim/attribute_encryptor.rb +1 -1
- data/lib/decidim/attribute_object/nested_validator.rb +1 -1
- data/lib/decidim/attributes/integer_with_units.rb +27 -0
- data/lib/decidim/attributes.rb +2 -0
- data/lib/decidim/authorization_form_builder.rb +0 -7
- data/lib/decidim/coauthorable.rb +1 -1
- data/lib/decidim/command.rb +3 -3
- data/lib/decidim/commands/destroy_resource.rb +5 -1
- data/lib/decidim/commands/resource_handler.rb +2 -2
- data/lib/decidim/commands/restore_resource.rb +45 -0
- data/lib/decidim/commands/soft_delete_resource.rb +63 -0
- data/lib/decidim/component_manifest.rb +7 -0
- data/lib/decidim/core/api.rb +2 -0
- data/lib/decidim/core/engine.rb +21 -7
- data/lib/decidim/core/menu.rb +0 -5
- data/lib/decidim/core/seeds.rb +42 -2
- data/lib/decidim/core/test/factories.rb +105 -2
- data/lib/decidim/core/test/shared_examples/admin_resource_gallery_examples.rb +85 -0
- data/lib/decidim/core/test/shared_examples/comments_examples.rb +393 -38
- data/lib/decidim/core/test/shared_examples/components_controller_hide_shared_examples.rb +11 -0
- data/lib/decidim/core/test/shared_examples/components_controller_reorder_shared_examples.rb +21 -0
- data/lib/decidim/core/test/shared_examples/download_open_data_shared_context.rb +36 -0
- data/lib/decidim/core/test/shared_examples/download_open_data_shared_examples.rb +45 -0
- data/lib/decidim/core/test/shared_examples/download_your_data_shared_examples.rb +17 -0
- data/lib/decidim/core/test/shared_examples/etiquette_validator_examples.rb +25 -0
- data/lib/decidim/core/test/shared_examples/follows_examples.rb +43 -0
- data/lib/decidim/core/test/shared_examples/has_taxonomies.rb +94 -0
- data/lib/decidim/core/test/shared_examples/manage_share_tokens_examples.rb +237 -0
- data/lib/decidim/core/test/shared_examples/map_examples.rb +2 -0
- data/lib/decidim/core/test/shared_examples/open_data_exporter_examples.rb +102 -0
- data/lib/decidim/core/test/shared_examples/participatory_space_members_page_examples.rb +46 -0
- data/lib/decidim/core/test/shared_examples/participatory_space_search_examples.rb +98 -0
- data/lib/decidim/core/test/shared_examples/permissions.rb +7 -7
- data/lib/decidim/core/test/shared_examples/preview_with_share_token_examples.rb +94 -0
- data/lib/decidim/core/test/shared_examples/reports_examples.rb +60 -5
- data/lib/decidim/core/test/shared_examples/resource_endorsed_event_examples.rb +2 -2
- data/lib/decidim/core/test/shared_examples/resource_search_examples.rb +75 -69
- data/lib/decidim/core/test/shared_examples/searchable_resources_shared_context.rb +1 -1
- data/lib/decidim/core/test/shared_examples/simple_event.rb +33 -19
- data/lib/decidim/core/test/shared_examples/social_share_examples.rb +46 -0
- data/lib/decidim/core/test/shared_examples/softdeleteable_components_examples.rb +173 -0
- data/lib/decidim/core/test/shared_examples/system_endorse_resource_examples.rb +54 -8
- data/lib/decidim/core/test/shared_examples/taxonomizable_interface_examples.rb +20 -0
- data/lib/decidim/core/test/shared_examples/taxonomizable_resource_examples.rb +37 -0
- data/lib/decidim/core/test/shared_examples/taxonomy_settings.rb +49 -0
- data/lib/decidim/core/test/shared_examples/translated_event_examples.rb +1 -1
- data/lib/decidim/core/test/shared_examples/versions_controller_examples.rb +2 -2
- data/lib/decidim/core/test/shared_examples/with_endorsable_permissions_examples.rb +1 -1
- data/lib/decidim/core/test.rb +9 -5
- data/lib/decidim/core/version.rb +1 -1
- data/lib/decidim/core.rb +58 -0
- data/lib/decidim/download_your_data_serializers/download_your_data_identity_serializer.rb +0 -4
- data/lib/decidim/download_your_data_serializers/download_your_data_participatory_space_private_user_serializer.rb +3 -1
- data/lib/decidim/download_your_data_serializers/download_your_data_report_serializer.rb +2 -1
- data/lib/decidim/download_your_data_serializers/download_your_data_user_serializer.rb +6 -7
- data/lib/decidim/download_your_data_serializers.rb +19 -0
- data/lib/decidim/exporters/csv.rb +6 -0
- data/lib/decidim/exporters/export_manifest.rb +14 -0
- data/lib/decidim/exporters/pdf.rb +26 -22
- data/lib/decidim/filter_form_builder.rb +12 -15
- data/lib/decidim/form_builder.rb +6 -129
- data/lib/decidim/has_category.rb +5 -1
- data/lib/decidim/has_private_users.rb +4 -0
- data/lib/decidim/has_taxonomy_settings.rb +47 -0
- data/lib/decidim/has_upload_validations.rb +1 -1
- data/lib/decidim/legacy_form_builder.rb +118 -0
- data/lib/decidim/maintenance/import_models/application_record.rb +93 -0
- data/lib/decidim/maintenance/import_models/area.rb +82 -0
- data/lib/decidim/maintenance/import_models/area_type.rb +12 -0
- data/lib/decidim/maintenance/import_models/assembly_type.rb +49 -0
- data/lib/decidim/maintenance/import_models/categorization.rb +14 -0
- data/lib/decidim/maintenance/import_models/category.rb +139 -0
- data/lib/decidim/maintenance/import_models/participatory_process_type.rb +21 -0
- data/lib/decidim/maintenance/import_models/scope.rb +163 -0
- data/lib/decidim/maintenance/import_models.rb +19 -0
- data/lib/decidim/maintenance/taxonomy_importer.rb +142 -0
- data/lib/decidim/maintenance/taxonomy_plan.rb +78 -0
- data/lib/decidim/maintenance.rb +12 -0
- data/lib/decidim/map/autocomplete.rb +52 -8
- data/lib/decidim/map/dynamic_map.rb +1 -1
- data/lib/decidim/map/provider/dynamic_map/here.rb +1 -40
- data/lib/decidim/map/provider/geocoding/here.rb +9 -3
- data/lib/decidim/map.rb +3 -6
- data/lib/decidim/moderation_tools.rb +29 -5
- data/lib/decidim/newsletter_encryptor.rb +1 -1
- data/lib/decidim/paddable.rb +1 -1
- data/lib/decidim/participable.rb +10 -10
- data/lib/decidim/participatory_space_user.rb +10 -0
- data/lib/decidim/private_download_helper.rb +15 -0
- data/lib/decidim/record_encryptor.rb +51 -46
- data/lib/decidim/resourceable.rb +16 -0
- data/lib/decidim/seeds.rb +18 -20
- data/lib/decidim/settings_manifest.rb +34 -1
- data/lib/decidim/soft_deletable.rb +17 -0
- data/lib/decidim/taxonomizable.rb +72 -0
- data/lib/decidim/view_model.rb +0 -1
- data/lib/tasks/decidim_download_your_data_tasks.rake +2 -4
- data/lib/tasks/decidim_procfile.rake +6 -0
- data/lib/tasks/decidim_tasks.rake +1 -0
- data/lib/tasks/decidim_taxonomies.rake +160 -0
- data/lib/tasks/upgrade/{decidim_fix_categorization.rake → clean.rake} +25 -18
- data/lib/tasks/upgrade/clean_hidden_resources.rake +33 -0
- data/lib/tasks/upgrade/decidim_active_storage_migration_tasks.rake +1 -1
- data/lib/tasks/upgrade/migrations.rake +94 -0
- metadata +198 -103
- data/app/cells/decidim/amendable/amenders_list/show.erb +0 -0
- data/app/cells/decidim/content_blocks/base/content.erb +0 -0
- data/app/cells/decidim/endorsers_list/full_endorsers_list.erb +0 -3
- data/app/cells/decidim/endorsers_list_button/content.erb +0 -1
- data/app/cells/decidim/endorsers_list_button_cell.rb +0 -15
- data/app/cells/decidim/scopes_picker/scope_picker_prompt.erb +0 -3
- data/app/cells/decidim/scopes_picker/scope_picker_values.erb +0 -5
- data/app/cells/decidim/scopes_picker/show.erb +0 -14
- data/app/cells/decidim/scopes_picker_cell.rb +0 -92
- data/app/commands/decidim/update_user_interests.rb +0 -41
- data/app/controllers/decidim/scopes_controller.rb +0 -84
- data/app/controllers/decidim/user_interests_controller.rb +0 -30
- data/app/forms/decidim/user_interest_scope_form.rb +0 -25
- data/app/forms/decidim/user_interests_form.rb +0 -17
- data/app/helpers/decidim/categories_helper.rb +0 -26
- data/app/helpers/decidim/scopes_helper.rb +0 -105
- data/app/packs/images/decidim/vendor/leaflet/layers-2x.png +0 -0
- data/app/packs/images/decidim/vendor/leaflet/layers.png +0 -0
- data/app/packs/images/decidim/vendor/leaflet/marker-icon-2x.png +0 -0
- data/app/packs/images/decidim/vendor/leaflet/marker-icon.png +0 -0
- data/app/packs/images/decidim/vendor/leaflet/marker-shadow.png +0 -0
- data/app/packs/src/decidim/vendor/leaflet-tilelayer-here.js +0 -212
- data/app/packs/stylesheets/decidim/legacy/MarkerCluster.Default.scss +0 -67
- data/app/packs/stylesheets/decidim/legacy/MarkerCluster.scss +0 -18
- data/app/packs/stylesheets/decidim/legacy/leaflet.scss +0 -705
- data/app/validators/scope_belongs_to_component_validator.rb +0 -16
- data/app/views/decidim/account/_user_groups.html.erb +0 -0
- data/app/views/decidim/scopes/_scopes_picker_input.html.erb +0 -19
- data/app/views/decidim/scopes/picker.html.erb +0 -53
- data/app/views/decidim/shared/_comments.html.erb +0 -0
- data/app/views/decidim/shared/_share_modal.html.erb +0 -26
- data/app/views/decidim/shared/_tags.html.erb +0 -1
- data/app/views/decidim/user_interests/_areas.html.erb +0 -14
- data/app/views/decidim/user_interests/_scopes.html.erb +0 -22
- data/app/views/decidim/user_interests/show.html.erb +0 -22
- data/config/initializers/foundation_rails_helper.rb +0 -4
- data/lib/decidim/core/test/shared_examples/has_category.rb +0 -38
- data/lib/decidim/core/test/shared_examples/has_scope.rb +0 -11
- data/lib/decidim/core/test/shared_examples/manage_component_share_tokens.rb +0 -83
- data/lib/decidim/core/test/shared_examples/preview_component_with_share_token_examples.rb +0 -49
- data/lib/decidim/core/test/shared_examples/scope_helper_examples.rb +0 -93
- data/lib/decidim/seven_zip_wrapper.rb +0 -29
@@ -19,5 +19,24 @@ module Decidim
|
|
19
19
|
Decidim.participatory_space_manifests.map(&:data_portable_entities).flatten |
|
20
20
|
(Decidim::Comments.data_portable_entities.flatten if defined?(Decidim::Comments))
|
21
21
|
end
|
22
|
+
|
23
|
+
def self.help_definitions_for(user)
|
24
|
+
export_format = "CSV"
|
25
|
+
help_definition = {}
|
26
|
+
|
27
|
+
data_entities.each do |object|
|
28
|
+
klass = Object.const_get(object)
|
29
|
+
exporter = Exporters.find_exporter(export_format).new(klass.user_collection(user), klass.export_serializer)
|
30
|
+
entity = klass.model_name.route_key
|
31
|
+
headers = exporter.headers_without_locales
|
32
|
+
help_definition[entity] = {}
|
33
|
+
|
34
|
+
headers.each do |header|
|
35
|
+
help_definition[entity][header] = I18n.t("decidim.open_data.help.#{entity}.#{header}", default: I18n.t("decidim.download_your_data.help.#{entity}.#{header}"))
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
help_definition
|
40
|
+
end
|
22
41
|
end
|
23
42
|
end
|
@@ -30,6 +30,12 @@ module Decidim
|
|
30
30
|
@headers ||= processed_collection.inject([]) { |keys, resource| keys | resource.keys }
|
31
31
|
end
|
32
32
|
|
33
|
+
def headers_without_locales
|
34
|
+
return [] if collection.empty?
|
35
|
+
|
36
|
+
@headers_without_locales ||= @serializer.new(collection.first).run.keys
|
37
|
+
end
|
38
|
+
|
33
39
|
protected
|
34
40
|
|
35
41
|
def custom_sanitize(value)
|
@@ -14,6 +14,12 @@ module Decidim
|
|
14
14
|
|
15
15
|
# A setting to choose if the collection exported by this manifest should
|
16
16
|
# be included in the open data export available for all users.
|
17
|
+
#
|
18
|
+
# Optionally, you can define a specific serializer using the `open_data_serializer` method
|
19
|
+
# to have a granular control on which fields are added to the open data export.
|
20
|
+
# This is specially useful for ParticipatorySpaces, as the serializer is used for the
|
21
|
+
# export/import feature, and we do not want to publish some of the data available there
|
22
|
+
# (as the components settings).
|
17
23
|
attribute :include_in_open_data, Boolean, default: false
|
18
24
|
|
19
25
|
attr_reader :name, :manifest
|
@@ -73,6 +79,14 @@ module Decidim
|
|
73
79
|
@serializer ||= serializer || Decidim::Exporters::Serializer
|
74
80
|
end
|
75
81
|
|
82
|
+
# Public: Sets the open data serializer when an argument is provided, returns the
|
83
|
+
# stored serializer otherwise.
|
84
|
+
#
|
85
|
+
# See more information in the `serializer` method.
|
86
|
+
def open_data_serializer(serializer = nil)
|
87
|
+
@open_data_serializer ||= serializer || nil
|
88
|
+
end
|
89
|
+
|
76
90
|
DEFAULT_FORMATS = %w(CSV JSON Excel).freeze
|
77
91
|
|
78
92
|
# Public: Sets the available formats if an argument is provided and
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "
|
3
|
+
require "hexapdf"
|
4
4
|
|
5
5
|
module Decidim
|
6
6
|
module Exporters
|
@@ -10,47 +10,51 @@ module Decidim
|
|
10
10
|
# the desired template, layout and orientation.
|
11
11
|
#
|
12
12
|
class PDF < Exporter
|
13
|
+
include Decidim::TranslatableAttributes
|
14
|
+
include Decidim::SanitizeHelper
|
15
|
+
|
13
16
|
# Public: Exports a PDF version of the collection by rendering
|
14
17
|
# the template into html and then converting it to PDF.
|
15
18
|
#
|
16
19
|
# Returns an ExportData instance.
|
17
20
|
def export
|
18
|
-
|
19
|
-
template:,
|
20
|
-
layout:,
|
21
|
-
locals:
|
22
|
-
)
|
21
|
+
composer.styles(**styles)
|
23
22
|
|
24
|
-
|
23
|
+
add_data!
|
25
24
|
|
26
|
-
ExportData.new(
|
25
|
+
ExportData.new(composer.write_to_string, "pdf")
|
27
26
|
end
|
28
27
|
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
protected
|
29
|
+
|
30
|
+
delegate :document, to: :composer
|
31
|
+
delegate :layout, to: :document
|
32
|
+
|
33
|
+
def font
|
34
|
+
@font ||= load_font("source-sans-pro-v21-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-regular.ttf")
|
32
35
|
end
|
33
36
|
|
34
|
-
|
35
|
-
|
36
|
-
raise NotImplementedError
|
37
|
+
def bold_font
|
38
|
+
@bold_font ||= load_font("source-sans-pro-v21-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-700.ttf")
|
37
39
|
end
|
38
40
|
|
39
|
-
|
40
|
-
|
41
|
-
raise NotImplementedError
|
41
|
+
def load_font(path)
|
42
|
+
document.fonts.add(Decidim::Core::Engine.root.join("app/packs/fonts/decidim/").join(path))
|
42
43
|
end
|
43
44
|
|
44
|
-
|
45
|
-
|
46
|
-
{ collection: }
|
45
|
+
def composer
|
46
|
+
@composer ||= ::HexaPDF::Composer.new(page_size:, page_orientation:)
|
47
47
|
end
|
48
48
|
|
49
|
-
|
49
|
+
def page_size = :A4
|
50
50
|
|
51
|
-
def
|
51
|
+
def page_orientation = :portrait
|
52
|
+
|
53
|
+
def add_data!
|
52
54
|
raise NotImplementedError
|
53
55
|
end
|
56
|
+
|
57
|
+
def styles = {}
|
54
58
|
end
|
55
59
|
end
|
56
60
|
end
|
@@ -13,9 +13,8 @@ module Decidim
|
|
13
13
|
# if represented by an array containing a value and a name or a check_boxes_tree
|
14
14
|
# struct as defined in Decidim::CheckBoxesTreeHelper for more complex situations
|
15
15
|
# which require nested options.
|
16
|
-
# @param
|
17
|
-
# @param id [String] The id of the section.
|
18
|
-
# the section title.
|
16
|
+
# @param label [String] The title of the section.
|
17
|
+
# @param id [String] The id of the section.
|
19
18
|
# @param options [Hash] Additional options. Except :type, the rest of options are passed
|
20
19
|
# to the partial used to generate the section.
|
21
20
|
# @option options [Symbol, String] :type The type of selector to use with the collection.
|
@@ -23,7 +22,7 @@ module Decidim
|
|
23
22
|
# tree struct is passed. The default selector for arrays is radio_buttons.
|
24
23
|
#
|
25
24
|
# @return [ActionView::OutputBuffer] the HTML of the generated collection filter.
|
26
|
-
def collection_filter(method:, collection:,
|
25
|
+
def collection_filter(method:, collection:, label:, id:, **options)
|
27
26
|
type = options.delete(:type) || default_form_type_for_collection(collection)
|
28
27
|
|
29
28
|
case type.to_s
|
@@ -31,29 +30,27 @@ module Decidim
|
|
31
30
|
options.merge!(builder_type: type.to_s.pluralize)
|
32
31
|
type = "collection"
|
33
32
|
when "check_boxes_tree"
|
34
|
-
options.merge!(check_boxes_tree_id: check_boxes_tree_id(method))
|
33
|
+
options.merge!(check_boxes_tree_id: check_boxes_tree_id(method.to_s.gsub(/\[|\]/, "_"), id))
|
35
34
|
end
|
36
35
|
|
37
36
|
@template.render(
|
38
37
|
"decidim/shared/filters/#{type}",
|
39
|
-
**options
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
form: self
|
45
|
-
)
|
38
|
+
**options, method:,
|
39
|
+
collection:,
|
40
|
+
label:,
|
41
|
+
id:,
|
42
|
+
form: self
|
46
43
|
)
|
47
44
|
end
|
48
45
|
|
49
46
|
def dropdown_label(item, method, options = {})
|
50
|
-
@template.render("decidim/shared/filters/dropdown_label", **options
|
47
|
+
@template.render("decidim/shared/filters/dropdown_label", **options, item:, method:, form: self)
|
51
48
|
end
|
52
49
|
|
53
50
|
private
|
54
51
|
|
55
|
-
def check_boxes_tree_id(
|
56
|
-
|
52
|
+
def check_boxes_tree_id(*args)
|
53
|
+
args.map(&:to_s).join("_")
|
57
54
|
end
|
58
55
|
|
59
56
|
def default_form_type_for_collection(collection)
|
data/lib/decidim/form_builder.rb
CHANGED
@@ -1,11 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "foundation_rails_helper/form_builder"
|
4
|
-
|
5
3
|
module Decidim
|
6
4
|
# This custom FormBuilder adds fields needed to deal with translatable fields,
|
7
5
|
# following the conventions set on `Decidim::TranslatableAttributes`.
|
8
|
-
class FormBuilder <
|
6
|
+
class FormBuilder < LegacyFormBuilder
|
9
7
|
include ActionView::Context
|
10
8
|
include Decidim::TranslatableAttributes
|
11
9
|
include Decidim::Map::Autocomplete::FormBuilder
|
@@ -62,7 +60,7 @@ module Decidim
|
|
62
60
|
#
|
63
61
|
# Renders form fields for each locale.
|
64
62
|
def translated(type, name, options = {})
|
65
|
-
return translated_one_locale(type, name, locales.first, options.merge(label:
|
63
|
+
return translated_one_locale(type, name, locales.first, options.merge(label: options[:label] || label_for(name))) if locales.count == 1
|
66
64
|
|
67
65
|
tabs_id = sanitize_tabs_selector(options[:tabs_id] || "#{object_name}-#{name}-tabs")
|
68
66
|
|
@@ -98,7 +96,7 @@ module Decidim
|
|
98
96
|
field attribute, options do |opts|
|
99
97
|
opts[:autocomplete] ||= :off
|
100
98
|
opts[:class] ||= "input-group-field"
|
101
|
-
|
99
|
+
super(attribute, opts)
|
102
100
|
end
|
103
101
|
end
|
104
102
|
|
@@ -225,35 +223,6 @@ module Decidim
|
|
225
223
|
end
|
226
224
|
end
|
227
225
|
|
228
|
-
# Public: Generates a select field with the categories. Only leaf categories can be set as selected.
|
229
|
-
#
|
230
|
-
# name - The name of the field (usually category_id)
|
231
|
-
# collection - A collection of categories.
|
232
|
-
# options - An optional Hash with options:
|
233
|
-
# - prompt - An optional String with the text to display as prompt.
|
234
|
-
# - disable_parents - A Boolean to disable parent categories. Defaults to `true`.
|
235
|
-
# html_options - HTML options for the select
|
236
|
-
#
|
237
|
-
# Returns a String.
|
238
|
-
def categories_select(name, collection, options = {}, html_options = {})
|
239
|
-
options = {
|
240
|
-
disable_parents: true
|
241
|
-
}.merge(options)
|
242
|
-
|
243
|
-
disable_parents = options[:disable_parents]
|
244
|
-
|
245
|
-
selected = object.send(name)
|
246
|
-
selected = selected.first if selected.is_a?(Array) && selected.length > 1
|
247
|
-
categories = categories_for_select(collection)
|
248
|
-
disabled = if disable_parents
|
249
|
-
disabled_categories_for(collection)
|
250
|
-
else
|
251
|
-
[]
|
252
|
-
end
|
253
|
-
|
254
|
-
select(name, @template.options_for_select(categories, selected:, disabled:), options, html_options)
|
255
|
-
end
|
256
|
-
|
257
226
|
# Public: Generates a select field for areas.
|
258
227
|
#
|
259
228
|
# name - The name of the field (usually area_id)
|
@@ -301,46 +270,6 @@ module Decidim
|
|
301
270
|
select(name, @template.options_for_select(resources, selected: options[:selected]), options)
|
302
271
|
end
|
303
272
|
|
304
|
-
# Public: Generates a picker field for scope selection.
|
305
|
-
#
|
306
|
-
# attribute - The name of the field (usually scope_id)
|
307
|
-
# options - An optional Hash with options:
|
308
|
-
# - multiple - Multiple mode, to allow multiple scopes selection.
|
309
|
-
# - label - Show label?
|
310
|
-
# - checkboxes_on_top - Show checked picker values on top (default) or below the picker prompt (only for multiple pickers)
|
311
|
-
# - namespace - prepend a custom name to the html element's DOM id.
|
312
|
-
#
|
313
|
-
# Also it should receive a block that returns a Hash with :url and :text for each selected scope (and for null scope for prompt)
|
314
|
-
#
|
315
|
-
# Returns a String.
|
316
|
-
def scopes_picker(attribute, options = {})
|
317
|
-
id = if self.options.has_key?(:namespace)
|
318
|
-
"#{self.options[:namespace]}_#{sanitize_for_dom_selector(@object_name)}"
|
319
|
-
else
|
320
|
-
"#{sanitize_for_dom_selector(@object_name)}_#{attribute}"
|
321
|
-
end
|
322
|
-
|
323
|
-
picker_options = {
|
324
|
-
id:,
|
325
|
-
class: "picker-#{options[:multiple] ? "multiple" : "single"}",
|
326
|
-
name: "#{@object_name}[#{attribute}]"
|
327
|
-
}
|
328
|
-
|
329
|
-
picker_options[:class] += " is-invalid-input" if error?(attribute)
|
330
|
-
|
331
|
-
prompt_params = yield(nil)
|
332
|
-
scopes = selected_scopes(attribute).map { |scope| [scope, yield(scope)] }
|
333
|
-
template = ""
|
334
|
-
template += "<label>#{label_for(attribute) + required_for_attribute(attribute)}</label>" unless options[:label] == false
|
335
|
-
template += @template.render("decidim/scopes/scopes_picker_input",
|
336
|
-
picker_options:,
|
337
|
-
prompt_params:,
|
338
|
-
scopes:,
|
339
|
-
values_on_top: !options[:multiple] || options[:checkboxes_on_top])
|
340
|
-
template += error_and_help_text(attribute, options)
|
341
|
-
template.html_safe
|
342
|
-
end
|
343
|
-
|
344
273
|
# Public: Generates a picker field for selection (either simple or multiselect).
|
345
274
|
#
|
346
275
|
# attribute - The name of the object's attribute.
|
@@ -378,7 +307,7 @@ module Decidim
|
|
378
307
|
custom_label(attribute, options[:label], options[:label_options], field_before_label: true) do
|
379
308
|
options.delete(:label)
|
380
309
|
options.delete(:label_options)
|
381
|
-
|
310
|
+
super(attribute, options.except(:help_text), checked_value, unchecked_value)
|
382
311
|
end + error_and_help_text(attribute, options)
|
383
312
|
end
|
384
313
|
|
@@ -563,8 +492,6 @@ module Decidim
|
|
563
492
|
end
|
564
493
|
|
565
494
|
help_text = options.delete(:help_text)
|
566
|
-
prefix = options.delete(:prefix)
|
567
|
-
postfix = options.delete(:postfix)
|
568
495
|
|
569
496
|
class_options = extract_validations(attribute, options).merge(class_options)
|
570
497
|
|
@@ -573,7 +500,7 @@ module Decidim
|
|
573
500
|
content = content.html_safe
|
574
501
|
|
575
502
|
html = error_and_help_text(attribute, options.merge(help_text:))
|
576
|
-
html +
|
503
|
+
html + content
|
577
504
|
end
|
578
505
|
|
579
506
|
# rubocop: disable Metrics/CyclomaticComplexity
|
@@ -716,30 +643,6 @@ module Decidim
|
|
716
643
|
content_tag(:span, text, class: "form-error")
|
717
644
|
end
|
718
645
|
|
719
|
-
def categories_for_select(scope)
|
720
|
-
sorted_main_categories = scope.first_class.includes(:subcategories).sort_by do |category|
|
721
|
-
[category.weight, translated_attribute(category.name, category.participatory_space.organization)]
|
722
|
-
end
|
723
|
-
|
724
|
-
sorted_main_categories.flat_map do |category|
|
725
|
-
parent = [[translated_attribute(category.name, category.participatory_space.organization), category.id]]
|
726
|
-
|
727
|
-
sorted_subcategories = category.subcategories.sort_by do |subcategory|
|
728
|
-
[subcategory.weight, translated_attribute(subcategory.name, subcategory.participatory_space.organization)]
|
729
|
-
end
|
730
|
-
|
731
|
-
sorted_subcategories.each do |subcategory|
|
732
|
-
parent << ["- #{translated_attribute(subcategory.name, subcategory.participatory_space.organization)}", subcategory.id]
|
733
|
-
end
|
734
|
-
|
735
|
-
parent
|
736
|
-
end
|
737
|
-
end
|
738
|
-
|
739
|
-
def disabled_categories_for(scope)
|
740
|
-
scope.first_class.joins(:subcategories).pluck(:id)
|
741
|
-
end
|
742
|
-
|
743
646
|
def tab_element_class_for(type, index)
|
744
647
|
element_class = "tabs-#{type}"
|
745
648
|
element_class += " is-active" if index.zero?
|
@@ -803,15 +706,6 @@ module Decidim
|
|
803
706
|
).html_safe
|
804
707
|
end
|
805
708
|
|
806
|
-
# Private: Returns an array of scopes related to object attribute
|
807
|
-
def selected_scopes(attribute)
|
808
|
-
selected = object.send(attribute) || []
|
809
|
-
selected = selected.values if selected.is_a?(Hash)
|
810
|
-
selected = [selected] unless selected.is_a?(Array)
|
811
|
-
selected = Decidim::Scope.where(id: selected.map(&:to_i)) unless selected.first.is_a?(Decidim::Scope)
|
812
|
-
selected
|
813
|
-
end
|
814
|
-
|
815
709
|
# Private: Returns the help text and error tags at the end of the field.
|
816
710
|
# Modified to change the tag to a valid HTML tag inside the <label> element.
|
817
711
|
def error_and_help_text(attribute, options = {})
|
@@ -870,24 +764,7 @@ module Decidim
|
|
870
764
|
|
871
765
|
content_tag(:span,
|
872
766
|
content_tag(:span, options[:value], class: name),
|
873
|
-
class:
|
874
|
-
end
|
875
|
-
|
876
|
-
# Private: Wraps the prefix and postfix for the field. Overridden from
|
877
|
-
# FoundationRailsHelper to make the generated HTML valid since these
|
878
|
-
# elements are printed within <label> elements and <div>'s are not allowed
|
879
|
-
# there.
|
880
|
-
def wrap_prefix_and_postfix(block, prefix_options, postfix_options)
|
881
|
-
prefix = tag_from_options("prefix", prefix_options)
|
882
|
-
postfix = tag_from_options("postfix", postfix_options)
|
883
|
-
|
884
|
-
input_size = calculate_input_size(prefix_options, postfix_options)
|
885
|
-
klass = column_classes(input_size.marshal_dump).to_s
|
886
|
-
input = content_tag(:span, block, class: klass)
|
887
|
-
|
888
|
-
return block unless input_size.changed?
|
889
|
-
|
890
|
-
content_tag(:span, prefix + input + postfix, class: "row collapse")
|
767
|
+
class: "columns")
|
891
768
|
end
|
892
769
|
|
893
770
|
def language_selector_select(locales, tabs_id, name)
|
data/lib/decidim/has_category.rb
CHANGED
@@ -60,7 +60,11 @@ module Decidim
|
|
60
60
|
def category_belongs_to_organization
|
61
61
|
return unless category
|
62
62
|
|
63
|
-
errors.add(:category, :invalid) unless
|
63
|
+
errors.add(:category, :invalid) unless component_categories.exists?(id: category.id)
|
64
|
+
end
|
65
|
+
|
66
|
+
def component_categories
|
67
|
+
Decidim::Category.where(participatory_space: component.participatory_space)
|
64
68
|
end
|
65
69
|
end
|
66
70
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/concern"
|
4
|
+
|
5
|
+
module Decidim
|
6
|
+
module HasTaxonomySettings
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
after_save :update_components_counter_cache
|
11
|
+
after_destroy :update_components_counter_cache
|
12
|
+
|
13
|
+
def has_taxonomy_settings?
|
14
|
+
settings.respond_to?(:taxonomy_filters)
|
15
|
+
end
|
16
|
+
|
17
|
+
def available_taxonomy_filters
|
18
|
+
return Decidim::TaxonomyFilter.none unless has_taxonomy_settings?
|
19
|
+
|
20
|
+
@available_taxonomy_filters ||= Decidim::TaxonomyFilter.for(organization).where(id: settings.taxonomy_filters)
|
21
|
+
end
|
22
|
+
|
23
|
+
def available_root_taxonomies
|
24
|
+
return Decidim::Taxonomy.none unless has_taxonomy_settings?
|
25
|
+
|
26
|
+
@available_root_taxonomies ||= organization.taxonomies.roots.where(id: available_taxonomy_filters.map(&:root_taxonomy_id))
|
27
|
+
end
|
28
|
+
|
29
|
+
def available_taxonomy_ids
|
30
|
+
return [] unless has_taxonomy_settings?
|
31
|
+
|
32
|
+
@available_taxonomy_ids ||= Decidim::TaxonomyFilterItem.where(
|
33
|
+
taxonomy_filter_id: available_taxonomy_filters.where(id: settings.taxonomy_filters).pluck(:id)
|
34
|
+
).pluck(:taxonomy_item_id)
|
35
|
+
end
|
36
|
+
|
37
|
+
def update_components_counter_cache
|
38
|
+
return unless has_taxonomy_settings?
|
39
|
+
|
40
|
+
current_filters = attribute("settings")&.dig("global", "taxonomy_filters") || []
|
41
|
+
previous_filters = attribute_previously_was("settings")&.dig("global", "taxonomy_filters") || []
|
42
|
+
|
43
|
+
Decidim::TaxonomyFilter.for(organization).where(id: (current_filters + previous_filters)).each(&:update_components_count)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -25,7 +25,7 @@ module Decidim
|
|
25
25
|
def validates_avatar(attribute = :avatar, options = {})
|
26
26
|
validates_upload(
|
27
27
|
attribute,
|
28
|
-
**options
|
28
|
+
**options, max_size: ->(record) { record.maximum_avatar_size }
|
29
29
|
)
|
30
30
|
end
|
31
31
|
|
@@ -0,0 +1,118 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright (c) 2015 Sébastien Gruhier (http://xilinus.com/) - MIT LICENSE
|
4
|
+
#
|
5
|
+
# This file has been copied and modified from https://github.com/sgruhier/foundation_rails_helper/blob/master/lib/foundation_rails_helper/form_builder.rb
|
6
|
+
# We have done this so we can decouple Decidim from this dependency, which is not updated to Rails 7.1
|
7
|
+
# We also plan to fully remove Foundation CSS legacy code in the future
|
8
|
+
|
9
|
+
module Decidim
|
10
|
+
class LegacyFormBuilder < ActionView::Helpers::FormBuilder
|
11
|
+
include ActionView::Helpers::TagHelper
|
12
|
+
include ActionView::Helpers::OutputSafetyHelper
|
13
|
+
%w(file_field email_field text_field text_area url_field
|
14
|
+
number_field date_field datetime_field search_field color_field)
|
15
|
+
.each do |method_name|
|
16
|
+
define_method(method_name) do |*args|
|
17
|
+
attribute = args[0]
|
18
|
+
options = args[1] || {}
|
19
|
+
field(attribute, options) do |opts|
|
20
|
+
super(attribute, opts)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def label(attribute, text = nil, options = {})
|
26
|
+
if error?(attribute)
|
27
|
+
options[:class] ||= ""
|
28
|
+
options[:class] += " is-invalid-label"
|
29
|
+
end
|
30
|
+
|
31
|
+
super(attribute, (text || "").html_safe, options)
|
32
|
+
end
|
33
|
+
|
34
|
+
def radio_button(attribute, tag_value, options = {})
|
35
|
+
options[:label_options] ||= {}
|
36
|
+
label_options = options.delete(:label_options)&.merge!(value: tag_value)
|
37
|
+
label_text = options.delete(:label)
|
38
|
+
l = label(attribute, label_text, label_options) unless label_text == false
|
39
|
+
r = @template.radio_button(@object_name, attribute, tag_value,
|
40
|
+
objectify_options(options))
|
41
|
+
|
42
|
+
"#{r}#{l}".html_safe
|
43
|
+
end
|
44
|
+
|
45
|
+
def datetime_select(attribute, options = {}, html_options = {})
|
46
|
+
field attribute, options, html_options do |html_opts|
|
47
|
+
super(attribute, options, html_opts.merge(autocomplete: :off))
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def date_select(attribute, options = {}, html_options = {})
|
52
|
+
field attribute, options, html_options do |html_opts|
|
53
|
+
super(attribute, options, html_opts.merge(autocomplete: :off))
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def time_zone_select(attribute, priorities = nil, options = {}, html_options = {})
|
58
|
+
field attribute, options, html_options do |html_opts|
|
59
|
+
super(attribute, priorities, options,
|
60
|
+
html_opts.merge(autocomplete: :off))
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def select(attribute, choices, options = {}, html_options = {})
|
65
|
+
field attribute, options, html_options do |html_opts|
|
66
|
+
html_options[:autocomplete] ||= :off
|
67
|
+
super(attribute, choices, options, html_opts)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# rubocop:disable Metrics/ParameterLists
|
72
|
+
def collection_select(attribute, collection, value_method, text_method, options = {}, html_options = {})
|
73
|
+
field attribute, options, html_options do |html_opts|
|
74
|
+
html_options[:autocomplete] ||= :off
|
75
|
+
super(attribute, collection, value_method, text_method, options,
|
76
|
+
html_opts)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
# rubocop:enable Metrics/ParameterLists
|
80
|
+
|
81
|
+
def autocomplete(attribute, url, options = {})
|
82
|
+
field attribute, options do |opts|
|
83
|
+
opts.merge!(update_elements: opts[:update_elements],
|
84
|
+
min_length: 0, value: object.send(attribute))
|
85
|
+
autocomplete_field(attribute, url, opts)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def submit(value = nil, options = {})
|
90
|
+
options[:class] ||= "button"
|
91
|
+
super
|
92
|
+
end
|
93
|
+
|
94
|
+
def error_for(attribute, options = {})
|
95
|
+
return unless error?(attribute)
|
96
|
+
|
97
|
+
class_name = "form-error is-visible"
|
98
|
+
class_name += " #{options[:class]}" if options[:class]
|
99
|
+
|
100
|
+
error_messages = object.errors[attribute].join(", ")
|
101
|
+
error_messages = error_messages.html_safe if options[:html_safe_errors]
|
102
|
+
content_tag(:small, error_messages,
|
103
|
+
class: class_name.sub("is-invalid-input", ""))
|
104
|
+
end
|
105
|
+
|
106
|
+
private
|
107
|
+
|
108
|
+
def error?(attribute)
|
109
|
+
object.respond_to?(:errors) && object.errors[attribute].present?
|
110
|
+
end
|
111
|
+
|
112
|
+
def default_label_text(object, attribute)
|
113
|
+
return object.class.human_attribute_name(attribute) if object.class.respond_to?(:human_attribute_name)
|
114
|
+
|
115
|
+
attribute.to_s.humanize
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|