decidim-decidim_awesome 0.8.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +363 -0
- data/README.md +375 -100
- data/Rakefile +2 -1
- data/app/cells/concerns/decidim/decidim_awesome/global_menu_cell_override.rb +20 -0
- data/app/cells/concerns/decidim/decidim_awesome/proposal_l_cell_override.rb +26 -0
- data/app/cells/decidim/decidim_awesome/content_blocks/map/show.erb +5 -12
- data/app/cells/decidim/decidim_awesome/content_blocks/map_cell.rb +7 -7
- data/app/cells/decidim/decidim_awesome/voting/proposal_metadata_cell.rb +69 -0
- data/app/cells/decidim/decidim_awesome/voting/voting_cards_base_cell.rb +40 -0
- data/app/cells/decidim/decidim_awesome/voting/voting_cards_proposal/modal.erb +18 -0
- data/app/cells/decidim/decidim_awesome/voting/voting_cards_proposal/show.erb +40 -0
- data/app/cells/decidim/decidim_awesome/voting/voting_cards_proposal/vote_block_for.erb +16 -0
- data/app/cells/decidim/decidim_awesome/voting/voting_cards_proposal_cell.rb +90 -0
- data/app/commands/concerns/decidim/decidim_awesome/admin/needs_constraint_helpers.rb +2 -2
- data/app/commands/concerns/decidim/decidim_awesome/proposals/admin/update_proposal_override.rb +31 -0
- data/app/commands/concerns/decidim/decidim_awesome/proposals/create_collaborative_draft_override.rb +27 -0
- data/app/commands/concerns/decidim/decidim_awesome/proposals/create_proposal_override.rb +27 -0
- data/app/commands/concerns/decidim/decidim_awesome/proposals/update_collaborative_draft_override.rb +27 -0
- data/app/commands/concerns/decidim/decidim_awesome/proposals/update_proposal_override.rb +26 -0
- data/app/commands/concerns/decidim/decidim_awesome/system/create_organization_override.rb +29 -0
- data/app/commands/concerns/decidim/decidim_awesome/system/update_organization_override.rb +35 -0
- data/app/commands/concerns/decidim/decidim_awesome/update_account_override.rb +30 -0
- data/app/commands/decidim/decidim_awesome/admin/create_constraint.rb +3 -3
- data/app/commands/decidim/decidim_awesome/admin/create_custom_redirect.rb +1 -1
- data/app/commands/decidim/decidim_awesome/admin/create_menu_hack.rb +1 -1
- data/app/commands/decidim/decidim_awesome/admin/create_proposal_custom_field.rb +5 -4
- data/app/commands/decidim/decidim_awesome/admin/create_scoped_admin.rb +1 -1
- data/app/commands/decidim/decidim_awesome/admin/create_scoped_style.rb +4 -3
- data/app/commands/decidim/decidim_awesome/admin/destroy_constraint.rb +1 -1
- data/app/commands/decidim/decidim_awesome/admin/destroy_custom_redirect.rb +2 -2
- data/app/commands/decidim/decidim_awesome/admin/destroy_menu_hack.rb +2 -2
- data/app/commands/decidim/decidim_awesome/admin/destroy_proposal_custom_field.rb +7 -4
- data/app/commands/decidim/decidim_awesome/admin/destroy_scoped_admin.rb +1 -1
- data/app/commands/decidim/decidim_awesome/admin/destroy_scoped_style.rb +7 -5
- data/app/commands/decidim/decidim_awesome/admin/rename_scope_label.rb +2 -2
- data/app/commands/decidim/decidim_awesome/admin/update_config.rb +2 -3
- data/app/commands/decidim/decidim_awesome/admin/update_constraint.rb +3 -3
- data/app/commands/decidim/decidim_awesome/admin/update_custom_redirect.rb +3 -3
- data/app/commands/decidim/decidim_awesome/admin/update_menu_hack.rb +1 -1
- data/app/commands/decidim/decidim_awesome/command.rb +8 -0
- data/app/commands/decidim/decidim_awesome/create_editor_image.rb +2 -2
- data/app/controllers/concerns/decidim/decidim_awesome/admin/maintenance_context.rb +43 -0
- data/app/controllers/concerns/decidim/decidim_awesome/admin_accountability/admin/filterable.rb +67 -0
- data/app/controllers/concerns/decidim/decidim_awesome/admin_accountability/admin/filterable_helper.rb +38 -0
- data/app/controllers/concerns/decidim/decidim_awesome/check_login_authorizations.rb +60 -0
- data/app/controllers/concerns/decidim/decidim_awesome/content_security_policy.rb +34 -0
- data/app/controllers/concerns/decidim/decidim_awesome/limit_pending_amendments.rb +35 -0
- data/app/controllers/concerns/decidim/decidim_awesome/needs_awesome_config.rb +0 -2
- data/app/controllers/concerns/decidim/decidim_awesome/not_found_redirect.rb +3 -3
- data/app/controllers/concerns/decidim/decidim_awesome/proposals/memoize_extra_fields.rb +23 -0
- data/app/controllers/concerns/decidim/decidim_awesome/proposals/orderable_override.rb +94 -0
- data/app/controllers/concerns/decidim/decidim_awesome/proposals/proposal_votes_controller_override.rb +64 -0
- data/app/controllers/concerns/decidim/decidim_awesome/use_user_time_zone.rb +32 -0
- data/app/controllers/decidim/decidim_awesome/admin/admin_accountability_controller.rb +72 -0
- data/app/controllers/decidim/decidim_awesome/admin/admin_authorizations_controller.rb +122 -0
- data/app/controllers/decidim/decidim_awesome/admin/application_controller.rb +2 -0
- data/app/controllers/decidim/decidim_awesome/admin/checks_controller.rb +21 -17
- data/app/controllers/decidim/decidim_awesome/admin/config_controller.rb +17 -8
- data/app/controllers/decidim/decidim_awesome/admin/constraints_controller.rb +27 -20
- data/app/controllers/decidim/decidim_awesome/admin/custom_redirects_controller.rb +6 -8
- data/app/controllers/decidim/decidim_awesome/admin/maintenance_controller.rb +76 -0
- data/app/controllers/decidim/decidim_awesome/admin/menu_hacks_controller.rb +6 -8
- data/app/controllers/decidim/decidim_awesome/admin/proposal_custom_fields_controller.rb +14 -6
- data/app/controllers/decidim/decidim_awesome/admin/scoped_admins_controller.rb +2 -2
- data/app/controllers/decidim/decidim_awesome/admin/scoped_styles_controller.rb +14 -6
- data/app/controllers/decidim/decidim_awesome/blank_component_controller.rb +8 -3
- data/app/controllers/decidim/decidim_awesome/editor_images_controller.rb +3 -5
- data/app/controllers/decidim/decidim_awesome/iframe_component/iframe_controller.rb +18 -5
- data/app/controllers/decidim/decidim_awesome/required_authorizations_controller.rb +58 -0
- data/app/forms/concerns/decidim/decidim_awesome/account_form_override.rb +25 -0
- data/app/forms/concerns/decidim/decidim_awesome/proposals/proposal_form_customizations.rb +57 -0
- data/app/forms/concerns/decidim/decidim_awesome/proposals/proposal_form_override.rb +21 -0
- data/app/forms/concerns/decidim/decidim_awesome/system/organization_form_override.rb +34 -0
- data/app/forms/decidim/decidim_awesome/admin/config_form.rb +88 -20
- data/app/forms/decidim/decidim_awesome/admin/custom_redirect_form.rb +3 -3
- data/app/forms/decidim/decidim_awesome/admin/intergram_form.rb +4 -0
- data/app/forms/decidim/decidim_awesome/admin/menu_form.rb +5 -5
- data/app/helpers/concerns/decidim/decidim_awesome/amendments_helper_override.rb +65 -0
- data/app/helpers/concerns/decidim/decidim_awesome/breadcrumb_helper_override.rb +23 -0
- data/app/helpers/concerns/decidim/decidim_awesome/proposals/application_helper_override.rb +110 -0
- data/app/helpers/decidim/decidim_awesome/admin/config_constraints_helpers.rb +12 -29
- data/app/helpers/decidim/decidim_awesome/admin/system_checker_helpers.rb +4 -0
- data/app/helpers/decidim/decidim_awesome/map_helper.rb +38 -52
- data/app/jobs/decidim/decidim_awesome/destroy_private_data_job.rb +22 -0
- data/app/jobs/decidim/decidim_awesome/export_admin_actions_job.rb +28 -0
- data/app/models/concerns/decidim/decidim_awesome/has_proposal_extra_fields.rb +80 -0
- data/app/models/concerns/decidim/decidim_awesome/has_vote_weight.rb +30 -0
- data/app/models/decidim/decidim_awesome/awesome_config.rb +1 -2
- data/app/models/decidim/decidim_awesome/config_constraint.rb +0 -2
- data/app/models/decidim/decidim_awesome/editor_image.rb +0 -3
- data/app/models/decidim/decidim_awesome/paper_trail_version.rb +117 -0
- data/app/models/decidim/decidim_awesome/proposal_extra_field.rb +45 -0
- data/app/models/decidim/decidim_awesome/vote_weight.rb +30 -0
- data/app/overrides/decidim/account/show/add_timezone_select.html.erb.deface +3 -0
- data/app/overrides/decidim/admin/officializations/index/add_modal.html.erb.deface +3 -0
- data/app/overrides/decidim/admin/officializations/index/add_td.html.erb.deface +5 -0
- data/app/overrides/decidim/admin/officializations/index/add_th.html.erb.deface +5 -0
- data/app/overrides/decidim/proposals/admin/proposals/_form/replace_editor.html.erb.deface +3 -0
- data/app/overrides/decidim/proposals/admin/proposals/show/add_private_body.html.erb.deface +7 -0
- data/app/overrides/decidim/proposals/admin/proposals/show/replace_body.html.erb.deface +5 -0
- data/app/overrides/decidim/proposals/proposals/_proposal_aside/limit_amendments_modal.html.erb.deface +5 -0
- data/app/overrides/decidim/proposals/proposals/_vote_button/replace_vote_button.html.erb.deface +7 -0
- data/app/overrides/decidim/proposals/proposals/_votes_count/replace_counter.html.erb.deface +10 -0
- data/app/overrides/decidim/system/organizations/_advanced_settings/add_awesome_config.html.erb.deface +9 -0
- data/app/{views/layouts/decidim/_head.html.erb → overrides/layouts/decidim/_decidim_javascript/add_awesome_tags.html.erb.deface} +2 -1
- data/app/overrides/layouts/decidim/_head/add_awesome_tags.html.erb.deface +7 -0
- data/app/overrides/layouts/decidim/admin/_header/add_awesome_custom_styles.html.erb.deface +3 -0
- data/app/overrides/layouts/decidim/admin/_header/add_awesome_tags.html.erb.deface +10 -0
- data/app/packs/entrypoints/decidim_admin_decidim_awesome.js +2 -2
- data/app/packs/entrypoints/decidim_admin_decidim_awesome_global.js +4 -0
- data/app/packs/entrypoints/decidim_admin_decidim_awesome_global.scss +1 -0
- data/app/packs/entrypoints/decidim_admin_decidim_awesome_search_form.scss +1 -0
- data/app/packs/entrypoints/decidim_decidim_awesome.js +2 -2
- data/app/packs/entrypoints/decidim_decidim_awesome_map.scss +1 -1
- data/app/packs/entrypoints/decidim_editor.js +14 -0
- data/app/packs/images/decidim/decidim_awesome/handcard.svg +14 -0
- data/app/packs/images/decidim/decidim_awesome/handcheck.svg +17 -0
- data/app/packs/images/decidim/decidim_awesome/pokecode-logo.png +0 -0
- data/app/packs/src/decidim/decidim_awesome/admin/auto_edit.js +96 -69
- data/app/packs/src/decidim/decidim_awesome/admin/check_redirections.js +46 -41
- data/app/packs/src/decidim/decidim_awesome/admin/codemirror.js +3 -3
- data/app/packs/src/decidim/decidim_awesome/admin/constraint_form_events.js +115 -0
- data/app/packs/src/decidim/decidim_awesome/admin/custom_fields_builder.js +19 -14
- data/app/packs/src/decidim/decidim_awesome/admin/form_exit_warn.js +23 -11
- data/app/packs/src/decidim/decidim_awesome/admin/proposal_sortings.js +26 -0
- data/app/packs/src/decidim/decidim_awesome/admin/tabs_change.js +31 -0
- data/app/packs/src/decidim/decidim_awesome/admin/user_picker.js +34 -20
- data/app/packs/src/decidim/decidim_awesome/admin/verification_selects.js +21 -0
- data/app/packs/src/decidim/decidim_awesome/admin/verifications.js +43 -0
- data/app/packs/src/decidim/decidim_awesome/amendments/show_modal_on_limits.js +28 -0
- data/app/packs/src/decidim/decidim_awesome/awesome_admin.js +7 -16
- data/app/packs/src/decidim/decidim_awesome/awesome_admin_global.js +2 -0
- data/app/packs/src/decidim/decidim_awesome/awesome_application.js +2 -15
- data/app/packs/src/decidim/decidim_awesome/awesome_map/api/fetcher.js +48 -23
- data/app/packs/src/decidim/decidim_awesome/awesome_map/api/meetings_fetcher.js +9 -12
- data/app/packs/src/decidim/decidim_awesome/awesome_map/api/proposals_fetcher.js +28 -0
- data/app/packs/src/decidim/decidim_awesome/awesome_map/awesome_map.js +15 -15
- data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/controller.js +70 -37
- data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/meetings_controller.js +11 -7
- data/app/packs/src/decidim/decidim_awesome/awesome_map/controllers/proposals_controller.js +9 -16
- data/app/packs/src/decidim/decidim_awesome/awesome_map/controls_ui.js +75 -45
- data/app/packs/src/decidim/decidim_awesome/awesome_map/load_map.js +28 -18
- data/app/packs/src/decidim/decidim_awesome/editor/index.js +94 -0
- data/app/packs/src/decidim/decidim_awesome/forms/autosave.js +29 -28
- data/app/packs/src/decidim/decidim_awesome/forms/custom_fields_renderer.js +55 -42
- data/app/packs/src/decidim/decidim_awesome/forms/rich_text_plugin.js +30 -32
- data/app/packs/src/decidim/decidim_awesome/proposals/custom_fields.js +32 -16
- data/app/packs/src/decidim/decidim_awesome/proposals/images.js +16 -10
- data/app/packs/src/decidim/decidim_awesome/voting/voting_cards.js +72 -0
- data/app/packs/stylesheets/decidim/decidim_awesome/admin/admin_accountability.scss +67 -0
- data/app/packs/stylesheets/decidim/decidim_awesome/admin/auto_edits.scss +11 -12
- data/app/packs/stylesheets/decidim/decidim_awesome/admin/check_redirections.scss +15 -0
- data/app/packs/stylesheets/decidim/decidim_awesome/admin/codemirror.scss +24 -12
- data/app/packs/stylesheets/decidim/decidim_awesome/admin/constraints.scss +49 -29
- data/app/packs/stylesheets/decidim/decidim_awesome/admin/custom_fields.scss +28 -71
- data/app/packs/stylesheets/decidim/decidim_awesome/admin/custom_styles.scss +48 -0
- data/app/packs/stylesheets/decidim/decidim_awesome/admin/intergram_fixes.scss +11 -0
- data/app/packs/stylesheets/decidim/decidim_awesome/admin/user_picker.scss +17 -26
- data/app/packs/stylesheets/decidim/decidim_awesome/admin/verifications.scss +99 -0
- data/app/packs/stylesheets/decidim/decidim_awesome/amendments/modal.scss +5 -0
- data/app/packs/stylesheets/decidim/decidim_awesome/awesome_admin.scss +14 -49
- data/app/packs/stylesheets/decidim/decidim_awesome/awesome_admin_global.scss +20 -0
- data/app/packs/stylesheets/decidim/decidim_awesome/awesome_application.scss +4 -18
- data/app/packs/stylesheets/decidim/decidim_awesome/awesome_iframe/iframe.scss +1 -1
- data/app/packs/stylesheets/decidim/decidim_awesome/awesome_map/map.scss +41 -35
- data/app/packs/stylesheets/decidim/decidim_awesome/forms/autosave.scss +6 -6
- data/app/packs/stylesheets/decidim/decidim_awesome/forms/custom_fields.scss +118 -0
- data/app/packs/stylesheets/decidim/decidim_awesome/shared/spinner.scss +26 -0
- data/app/packs/stylesheets/decidim/decidim_awesome/voting/voting_cards.scss +205 -0
- data/app/permissions/decidim/decidim_awesome/admin/permissions.rb +57 -1
- data/app/permissions/decidim/decidim_awesome/permissions.rb +11 -6
- data/app/presenters/concerns/decidim/decidim_awesome/breadcrumb_root_menu_item_presenter_override.rb +23 -0
- data/app/presenters/{decidim → concerns/decidim}/decidim_awesome/menu_item_presenter_override.rb +10 -2
- data/app/presenters/{decidim → concerns/decidim}/decidim_awesome/menu_presenter_override.rb +8 -0
- data/app/presenters/concerns/decidim/decidim_awesome/proposals/proposal_presenter_override.rb +20 -0
- data/app/presenters/decidim/decidim_awesome/admin_log/component_presenter_override.rb +28 -0
- data/app/presenters/decidim/decidim_awesome/admin_log/user_presenter_override.rb +46 -0
- data/app/presenters/decidim/decidim_awesome/paper_trail_base_presenter.rb +28 -0
- data/app/presenters/decidim/decidim_awesome/participatory_space_role_presenter.rb +45 -0
- data/app/presenters/decidim/decidim_awesome/private_data_presenter.rb +70 -0
- data/app/presenters/decidim/decidim_awesome/role_base_presenter.rb +102 -0
- data/app/presenters/decidim/decidim_awesome/user_entity_presenter.rb +50 -0
- data/app/queries/decidim/decidim_awesome/private_data_finder.rb +19 -0
- data/app/serializers/concerns/decidim/decidim_awesome/proposals/proposal_serializer_methods.rb +72 -0
- data/app/serializers/concerns/decidim/decidim_awesome/proposals/proposal_serializer_override.rb +38 -0
- data/app/serializers/decidim/decidim_awesome/paper_trail_version_serializer.rb +37 -0
- data/app/serializers/decidim/decidim_awesome/proposals/private_proposal_serializer.rb +34 -0
- data/app/types/concerns/decidim/decidim_awesome/add_proposal_type_custom_fields.rb +59 -0
- data/app/types/concerns/decidim/decidim_awesome/add_proposal_type_vote_weights.rb +20 -0
- data/app/uploaders/decidim/decidim_awesome/image_uploader.rb +12 -0
- data/app/validators/concerns/decidim/decidim_awesome/etiquette_validator_override.rb +41 -0
- data/app/views/decidim/decidim_awesome/account/_timezone_select.html.erb +3 -0
- data/app/views/decidim/decidim_awesome/admin/admin_accountability/index.html.erb +71 -0
- data/app/views/decidim/decidim_awesome/admin/admin_authorizations/authorization.html.erb +20 -0
- data/app/views/decidim/decidim_awesome/admin/admin_authorizations/callout.html.erb +3 -0
- data/app/views/decidim/decidim_awesome/admin/admin_authorizations/conflict.html.erb +5 -0
- data/app/views/decidim/decidim_awesome/admin/admin_authorizations/edit.html.erb +41 -0
- data/app/views/decidim/decidim_awesome/admin/checks/_assets_tester.html.erb +2 -0
- data/app/views/decidim/decidim_awesome/admin/checks/index.html.erb +51 -48
- data/app/views/decidim/decidim_awesome/admin/config/_autoedit_box_label.html.erb +7 -2
- data/app/views/decidim/decidim_awesome/admin/config/_constraints.html.erb +25 -18
- data/app/views/decidim/decidim_awesome/admin/config/_form_admins.html.erb +7 -6
- data/app/views/decidim/decidim_awesome/admin/config/_form_editors.html.erb +12 -16
- data/app/views/decidim/decidim_awesome/admin/config/_form_livechat.html.erb +39 -23
- data/app/views/decidim/decidim_awesome/admin/config/_form_proposal_custom_fields.html.erb +35 -17
- data/app/views/decidim/decidim_awesome/admin/config/_form_proposal_private_custom_fields.html.erb +1 -0
- data/app/views/decidim/decidim_awesome/admin/config/_form_proposals.html.erb +92 -6
- data/app/views/decidim/decidim_awesome/admin/config/_form_scoped_admin_styles.html.erb +1 -0
- data/app/views/decidim/decidim_awesome/admin/config/_form_scoped_styles.html.erb +48 -0
- data/app/views/decidim/decidim_awesome/admin/config/_form_surveys.html.erb +16 -6
- data/app/views/decidim/decidim_awesome/admin/config/_form_verifications.html.erb +15 -0
- data/app/views/decidim/decidim_awesome/admin/config/show.html.erb +22 -12
- data/app/views/decidim/decidim_awesome/admin/constraints/_form.html.erb +1 -49
- data/app/views/decidim/decidim_awesome/admin/constraints/new.html.erb +14 -9
- data/app/views/decidim/decidim_awesome/admin/constraints/no_permissions.html.erb +6 -0
- data/app/views/decidim/decidim_awesome/admin/constraints/show.html.erb +14 -9
- data/app/views/decidim/decidim_awesome/admin/custom_redirects/_form.html.erb +20 -5
- data/app/views/decidim/decidim_awesome/admin/custom_redirects/edit.html.erb +5 -5
- data/app/views/decidim/decidim_awesome/admin/custom_redirects/index.html.erb +14 -13
- data/app/views/decidim/decidim_awesome/admin/custom_redirects/new.html.erb +5 -5
- data/app/views/decidim/decidim_awesome/admin/maintenance/_private_data.html.erb +44 -0
- data/app/views/decidim/decidim_awesome/admin/maintenance/show.html.erb +44 -0
- data/app/views/decidim/decidim_awesome/admin/menu_hacks/_form.html.erb +6 -6
- data/app/views/decidim/decidim_awesome/admin/menu_hacks/edit.html.erb +21 -12
- data/app/views/decidim/decidim_awesome/admin/menu_hacks/index.html.erb +39 -42
- data/app/views/decidim/decidim_awesome/admin/menu_hacks/new.html.erb +21 -12
- data/app/views/decidim/decidim_awesome/admin/officializations/_participants_td.html.erb +25 -0
- data/app/views/decidim/decidim_awesome/admin/officializations/_participants_th.html.erb +1 -0
- data/app/views/decidim/decidim_awesome/admin/officializations/_verification_modal.html.erb +9 -0
- data/app/views/decidim/decidim_awesome/admin/proposals/_editor.html.erb +8 -5
- data/app/views/decidim/decidim_awesome/admin/proposals/_private_body.html.erb +20 -0
- data/app/views/decidim/decidim_awesome/admin/shared/_filters_with_date.html.erb +61 -0
- data/app/views/decidim/decidim_awesome/amendments/_modal.html.erb +23 -0
- data/app/views/decidim/decidim_awesome/custom_fields/_form_render.html.erb +8 -2
- data/app/views/decidim/decidim_awesome/iframe_component/iframe/show.html.erb +7 -12
- data/app/views/decidim/decidim_awesome/map_component/map/_map_template.html.erb +53 -37
- data/app/views/decidim/decidim_awesome/map_component/map/show.html.erb +14 -5
- data/app/views/decidim/decidim_awesome/required_authorizations/index.html.erb +66 -0
- data/app/views/decidim/decidim_awesome/system/organizations/_admin_allowed_authorizations.html.erb +5 -0
- data/app/views/decidim/decidim_awesome/voting/voting_cards/_show_vote_button.html.erb +3 -0
- data/app/views/decidim/decidim_awesome/voting/voting_cards/_show_votes_count.html.erb +1 -0
- data/app/views/layouts/decidim/decidim_awesome/_awesome_config.html.erb +11 -8
- data/app/views/layouts/decidim/decidim_awesome/_custom_styles.html.erb +1 -1
- data/app/views/layouts/decidim/decidim_awesome/_intergram_widget.html.erb +9 -6
- data/app/views/layouts/decidim/decidim_awesome/admin/_base.html.erb +12 -0
- data/app/views/layouts/decidim/decidim_awesome/admin/_custom_styles.html.erb +3 -0
- data/app/views/layouts/decidim/decidim_awesome/admin/admin_authorizations.html.erb +7 -0
- data/app/views/layouts/decidim/decidim_awesome/admin/application.html.erb +3 -0
- data/app/views/layouts/decidim/decidim_awesome/admin/maintenance.html.erb +19 -0
- data/config/assets.rb +5 -34
- data/config/i18n-tasks.yml +30 -0
- data/config/locales/ca.yml +335 -26
- data/config/locales/cs.yml +331 -22
- data/config/locales/de.yml +642 -0
- data/config/locales/en.yml +403 -33
- data/config/locales/es.yml +333 -24
- data/config/locales/eu.yml +623 -20
- data/config/locales/fr.yml +282 -23
- data/config/locales/hu.yml +268 -0
- data/config/locales/it.yml +155 -24
- data/config/locales/ja.yml +334 -25
- data/config/locales/lt.yml +94 -0
- data/config/locales/nl.yml +20 -19
- data/config/locales/pt-BR.yml +31 -24
- data/config/locales/ro-RO.yml +152 -0
- data/config/locales/sv.yml +28 -12
- data/config/rubocop/disabled.yml +11 -0
- data/config/rubocop/faker.yml +480 -0
- data/config/rubocop/rails.yml +88 -0
- data/config/rubocop/rspec.yml +65 -0
- data/config/rubocop/ruby.yml +1210 -0
- data/db/migrate/20231006113837_create_decidim_awesome_vote_weights.rb +13 -0
- data/db/migrate/20231006113841_create_decidim_awesome_proposal_extra_fields.rb +14 -0
- data/db/migrate/20240306175331_rename_editor_images_awesome_config.rb +18 -0
- data/db/migrate/20240531224204_add_decidim_awesome_proposal_private_fields.rb +29 -0
- data/db/migrate/20240729164227_add_decidim_awesome_proposal_private_fields_date.rb +20 -0
- data/db/seeds.rb +4 -4
- data/lib/decidim/decidim_awesome/admin_engine.rb +41 -6
- data/lib/decidim/decidim_awesome/api/types/localized_custom_fields_type.rb +22 -0
- data/lib/decidim/decidim_awesome/api/types/translated_custom_fields_type.rb +51 -0
- data/lib/decidim/decidim_awesome/authorizator.rb +34 -0
- data/lib/decidim/decidim_awesome/awesome.rb +236 -29
- data/lib/decidim/decidim_awesome/awesome_helpers.rb +57 -17
- data/lib/decidim/decidim_awesome/checksums.yml +95 -20
- data/lib/decidim/decidim_awesome/config.rb +25 -17
- data/lib/decidim/decidim_awesome/context_analyzers/request_analyzer.rb +3 -3
- data/lib/decidim/decidim_awesome/custom_fields.rb +13 -5
- data/lib/decidim/decidim_awesome/engine.rb +250 -19
- data/lib/decidim/decidim_awesome/iframe_component/component.rb +4 -4
- data/lib/decidim/decidim_awesome/lock.rb +47 -0
- data/lib/decidim/decidim_awesome/map_component/component.rb +2 -2
- data/lib/decidim/decidim_awesome/menu.rb +201 -0
- data/lib/decidim/decidim_awesome/menu_hacker.rb +7 -5
- data/{app/middleware/decidim/decidim_awesome → lib/decidim/decidim_awesome/middleware}/current_config.rb +5 -3
- data/lib/decidim/decidim_awesome/request_memoizer.rb +16 -0
- data/lib/decidim/decidim_awesome/system_checker.rb +6 -2
- data/lib/decidim/decidim_awesome/test/factories.rb +31 -9
- data/lib/decidim/decidim_awesome/test/initializer.rb +22 -6
- data/lib/decidim/decidim_awesome/test/layouts/decidim/_head.html.erb +2 -2
- data/lib/decidim/decidim_awesome/test/layouts/decidim/admin/_header.html.erb +2 -2
- data/lib/decidim/decidim_awesome/test/shared_examples/action_log_presenter_examples.rb +61 -0
- data/lib/decidim/decidim_awesome/test/shared_examples/{box_label_editor.rb → box_label_editor_examples.rb} +22 -22
- data/lib/decidim/decidim_awesome/test/shared_examples/config_examples.rb +24 -6
- data/lib/decidim/decidim_awesome/test/shared_examples/custom_fields_examples.rb +155 -0
- data/lib/decidim/decidim_awesome/test/shared_examples/custom_redirects_contexts.rb +7 -7
- data/lib/decidim/decidim_awesome/test/shared_examples/custom_styles_examples.rb +156 -0
- data/lib/decidim/decidim_awesome/test/shared_examples/editor_examples.rb +42 -58
- data/lib/decidim/decidim_awesome/test/shared_examples/menu_hack_contexts.rb +9 -8
- data/lib/decidim/decidim_awesome/test/shared_examples/scoped_admins_examples.rb +40 -29
- data/lib/decidim/decidim_awesome/test/shared_examples/summary_examples.rb +129 -38
- data/lib/decidim/decidim_awesome/version.rb +2 -2
- data/lib/decidim/decidim_awesome/voting_manifest.rb +55 -0
- data/lib/decidim/decidim_awesome.rb +1 -3
- data/lib/tasks/decidim_awesome_upgrade_tasks.rake +9 -0
- data/lib/tasks/decidim_awesome_webpacker_tasks.rake +2 -0
- data/package.json +54 -0
- metadata +192 -86
- data/app/forms/decidim/decidim_awesome/proposals/proposal_wizard_create_step_form_override.rb +0 -38
- data/app/helpers/decidim/decidim_awesome/amendments_helper_override.rb +0 -48
- data/app/helpers/decidim/decidim_awesome/proposals/application_helper_override.rb +0 -78
- data/app/jobs/decidim/decidim_awesome/migrate_legacy_images_job.rb +0 -106
- data/app/packs/entrypoints/decidim_admin_decidim_awesome_custom_fields.js +0 -2
- data/app/packs/entrypoints/decidim_decidim_awesome_admin_form_exit_warn.js +0 -1
- data/app/packs/images/decidim/decidim_awesome/platoniq-logo.png +0 -0
- data/app/packs/src/decidim/decidim_awesome/admin/constraints.js +0 -55
- data/app/packs/src/decidim/decidim_awesome/editors/editor.js +0 -190
- data/app/packs/src/decidim/decidim_awesome/editors/tabs_focus.js +0 -22
- data/app/packs/src/vendor/image-resize.min.js +0 -1
- data/app/packs/src/vendor/image-upload.min.js +0 -6
- data/app/packs/src/vendor/leaflet.featuregroup.subgroup.js +0 -184
- data/app/packs/stylesheets/decidim/decidim_awesome/editors/markdown_editor.scss +0 -19
- data/app/packs/stylesheets/decidim/decidim_awesome/editors/quill_editor.scss +0 -58
- data/app/packs/stylesheets/vendor/select2-foundation-theme.scss +0 -348
- data/app/uploaders/decidim/cw/decidim_awesome/image_uploader.rb +0 -26
- data/app/views/decidim/decidim_awesome/admin/config/_form_styles.html.erb +0 -26
- data/app/views/decidim/decidim_awesome/admin/config/_modal.html.erb +0 -11
- data/app/views/decidim/proposals/admin/proposals/_form.html.erb +0 -101
- data/app/views/decidim/proposals/collaborative_drafts/_edit_form_fields.html.erb +0 -83
- data/app/views/decidim/proposals/collaborative_drafts/show.html.erb +0 -1
- data/app/views/layouts/decidim/admin/_header.html.erb +0 -5
- data/app/views/layouts/decidim/admin/decidim_awesome.html.erb +0 -75
- data/app/views/v0.25/decidim/proposals/collaborative_drafts/_show.html.erb +0 -128
- data/app/views/v0.25/layouts/decidim/_head.html.erb +0 -41
- data/app/views/v0.25/layouts/decidim/admin/_header.html.erb +0 -11
- data/app/views/v0.26/decidim/proposals/collaborative_drafts/_show.html.erb +0 -128
- data/app/views/v0.26/layouts/decidim/_head.html.erb +0 -45
- data/app/views/v0.26/layouts/decidim/admin/_header.html.erb +0 -11
- data/lib/decidim/decidim_awesome/content_parsers/editor_images_parser.rb +0 -39
- data/lib/tasks/decidim_awesome_active_storage_migrations_tasks.rake +0 -37
- /data/app/models/{decidim → concerns/decidim}/decidim_awesome/user_override.rb +0 -0
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
module Proposals
|
6
|
+
##
|
7
|
+
# Override Proposal Presenter to access private field.
|
8
|
+
module ProposalPresenterOverride
|
9
|
+
extend ActiveSupport::Concern
|
10
|
+
included do
|
11
|
+
def private_body(*)
|
12
|
+
return unless proposal
|
13
|
+
|
14
|
+
proposal.private_body
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
module AdminLog
|
6
|
+
module ComponentPresenterOverride
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
alias_method :decidim_original_action_string, :action_string
|
11
|
+
alias_method :decidim_original_i18n_params, :i18n_params
|
12
|
+
|
13
|
+
def action_string
|
14
|
+
return "decidim.decidim_awesome.admin_log.component.#{action}" if action == "destroy_private_data"
|
15
|
+
|
16
|
+
decidim_original_action_string
|
17
|
+
end
|
18
|
+
|
19
|
+
def i18n_params
|
20
|
+
return decidim_original_i18n_params unless action == "destroy_private_data"
|
21
|
+
|
22
|
+
decidim_original_i18n_params.merge({ count: action_log.extra["count"] })
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
module AdminLog
|
6
|
+
module UserPresenterOverride
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
alias_method :decidim_original_action_string, :action_string
|
11
|
+
alias_method :decidim_original_i18n_params, :i18n_params
|
12
|
+
alias_method :decidim_original_resource_presenter, :resource_presenter
|
13
|
+
|
14
|
+
def action_string
|
15
|
+
return "decidim.decidim_awesome.admin_log.user.#{action}" if authorization_action?
|
16
|
+
|
17
|
+
decidim_original_action_string
|
18
|
+
end
|
19
|
+
|
20
|
+
def i18n_params
|
21
|
+
return decidim_original_i18n_params unless authorization_action?
|
22
|
+
|
23
|
+
decidim_original_i18n_params.merge({
|
24
|
+
handler_name: h.content_tag(:span, action_log.extra["handler_name"], class: "logs__log__resource"),
|
25
|
+
reason: h.content_tag(:em, action_log.extra["reason"])
|
26
|
+
})
|
27
|
+
end
|
28
|
+
|
29
|
+
def resource_presenter
|
30
|
+
return decidim_original_resource_presenter unless authorization_action? && authorization_user
|
31
|
+
|
32
|
+
@resource_presenter ||= Decidim::Log::UserPresenter.new(authorization_user, h, { "name" => authorization_user.name, "nickname" => authorization_user.nickname })
|
33
|
+
end
|
34
|
+
|
35
|
+
def authorization_user
|
36
|
+
@authorization_user ||= Decidim::User.find_by(id: action_log.extra["user_id"])
|
37
|
+
end
|
38
|
+
|
39
|
+
def authorization_action?
|
40
|
+
action.in?(%w(admin_creates_authorization admin_forces_authorization admin_destroys_authorization))
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
class PaperTrailBasePresenter
|
6
|
+
attr_reader :entry, :html
|
7
|
+
|
8
|
+
def initialize(entry, html: true)
|
9
|
+
@entry = entry
|
10
|
+
@html = html
|
11
|
+
end
|
12
|
+
|
13
|
+
# try to use the object in the database if exists
|
14
|
+
# Note that "reify" does not work on "create" events
|
15
|
+
def item
|
16
|
+
@item ||= entry&.item
|
17
|
+
end
|
18
|
+
|
19
|
+
def item_type
|
20
|
+
@item_type ||= entry&.item_type
|
21
|
+
end
|
22
|
+
|
23
|
+
def item_id
|
24
|
+
@item_id ||= entry&.item_id
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
class ParticipatorySpaceRolePresenter < RoleBasePresenter
|
6
|
+
# Finds the destroyed entry if exists
|
7
|
+
def destroy_entry
|
8
|
+
@destroy_entry ||= PaperTrail::Version.find_by(item_type:, event: "destroy", item_id:)
|
9
|
+
end
|
10
|
+
|
11
|
+
# roles are in the destroyed event if the role has been removed
|
12
|
+
def role
|
13
|
+
@role ||= destroy_item&.role || item&.role
|
14
|
+
end
|
15
|
+
|
16
|
+
def role_name
|
17
|
+
type = I18n.t(role, scope: "decidim.decidim_awesome.admin.admin_accountability.roles", default: role)
|
18
|
+
return type unless html && role_class
|
19
|
+
|
20
|
+
"<span class=\"#{role_class}\">#{type}</span>".html_safe
|
21
|
+
end
|
22
|
+
|
23
|
+
def user
|
24
|
+
@user ||= Decidim::User.find_by(id: entry.changeset["decidim_user_id"]&.last)
|
25
|
+
end
|
26
|
+
|
27
|
+
# participatory spaces is in the normal entry if the role hasn't been removed
|
28
|
+
# otherwise is in the removed role log entry
|
29
|
+
def participatory_space
|
30
|
+
item&.participatory_space || destroy_item&.participatory_space
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def role_class
|
36
|
+
case role
|
37
|
+
when "admin"
|
38
|
+
"text-alert"
|
39
|
+
when "valuator"
|
40
|
+
"text-secondary"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
class PrivateDataPresenter < SimpleDelegator
|
6
|
+
include Decidim::TranslatableAttributes
|
7
|
+
include ActionView::Helpers::DateHelper
|
8
|
+
include ActionView::Helpers::TagHelper
|
9
|
+
|
10
|
+
def name
|
11
|
+
@name ||= "#{translated_attribute(participatory_space.title)} / #{translated_attribute(super)}"
|
12
|
+
end
|
13
|
+
|
14
|
+
def path
|
15
|
+
@path ||= Decidim::EngineRouter.main_proxy(self).root_path
|
16
|
+
end
|
17
|
+
|
18
|
+
def total
|
19
|
+
@total ||= Decidim::Proposals::Proposal.joins(:extra_fields)
|
20
|
+
.where(component: self)
|
21
|
+
.where.not(extra_fields: { private_body: nil })
|
22
|
+
.count.to_s
|
23
|
+
end
|
24
|
+
|
25
|
+
def last_date
|
26
|
+
@last_date ||= Decidim::Proposals::Proposal.joins(:extra_fields)
|
27
|
+
.where(component: self)
|
28
|
+
.where.not(extra_fields: { private_body: nil })
|
29
|
+
.order(private_body_updated_at: :desc)
|
30
|
+
.first&.extra_fields&.private_body_updated_at
|
31
|
+
end
|
32
|
+
|
33
|
+
def time_ago
|
34
|
+
I18n.t("decidim.decidim_awesome.admin.maintenance.private_data.time_ago", time: time_ago_in_words(last_date)) if last_date
|
35
|
+
end
|
36
|
+
|
37
|
+
def destroyable?
|
38
|
+
return false unless last_date
|
39
|
+
|
40
|
+
last_date < DecidimAwesome.private_data_expiration_time.ago
|
41
|
+
end
|
42
|
+
|
43
|
+
def locked?
|
44
|
+
Decidim::DecidimAwesome::Lock.new(organization).locked?(__getobj__)
|
45
|
+
end
|
46
|
+
|
47
|
+
def as_json(_options = nil)
|
48
|
+
{
|
49
|
+
id:,
|
50
|
+
name:,
|
51
|
+
path:,
|
52
|
+
total:,
|
53
|
+
last_date:,
|
54
|
+
time_ago:,
|
55
|
+
locked: locked?,
|
56
|
+
done:
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
def done
|
61
|
+
return content_tag("span", "", class: "loading-spinner primary") if locked?
|
62
|
+
|
63
|
+
return if destroyable?
|
64
|
+
return if last_date
|
65
|
+
|
66
|
+
I18n.t("decidim.decidim_awesome.admin.maintenance.private_data.done")
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
class RoleBasePresenter < PaperTrailBasePresenter
|
6
|
+
include TranslatableAttributes
|
7
|
+
|
8
|
+
# Finds the destroyed entry if exists
|
9
|
+
def destroy_entry
|
10
|
+
nil
|
11
|
+
end
|
12
|
+
|
13
|
+
alias destroyed? destroy_entry
|
14
|
+
|
15
|
+
# try to reconstruct a destroyed event
|
16
|
+
def destroy_item
|
17
|
+
@destroy_item ||= destroy_entry&.reify
|
18
|
+
end
|
19
|
+
|
20
|
+
def user
|
21
|
+
raise "Please implement this method to return the user object"
|
22
|
+
end
|
23
|
+
|
24
|
+
def role_name
|
25
|
+
raise "Please implement this method to return the role text"
|
26
|
+
end
|
27
|
+
|
28
|
+
def participatory_space
|
29
|
+
nil
|
30
|
+
end
|
31
|
+
|
32
|
+
def participatory_space_name
|
33
|
+
participatory_space_type.present? ? "#{participatory_space_type} > #{translated_attribute participatory_space&.title}" : ""
|
34
|
+
end
|
35
|
+
|
36
|
+
def participatory_space_type
|
37
|
+
I18n.t(participatory_space&.manifest&.name, scope: "decidim.admin.menu") if participatory_space.present?
|
38
|
+
end
|
39
|
+
|
40
|
+
# try to link to the user roles page or to the participatory space if not existing
|
41
|
+
def participatory_space_path
|
42
|
+
proxy.send("#{participatory_space.manifest.route_name}_user_roles_path")
|
43
|
+
rescue NoMethodError
|
44
|
+
begin
|
45
|
+
proxy.send("#{participatory_space.manifest.route_name}_path", participatory_space)
|
46
|
+
rescue NoMethodError
|
47
|
+
""
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def user_name
|
52
|
+
return I18n.t("missing_user", scope: "decidim.decidim_awesome.admin.admin_accountability") unless user
|
53
|
+
return I18n.t("deleted_user", scope: "decidim.decidim_awesome.admin.admin_accountability") if user.deleted?
|
54
|
+
|
55
|
+
user&.name
|
56
|
+
end
|
57
|
+
|
58
|
+
def user_email
|
59
|
+
user&.email || entry.changeset["email"]&.last
|
60
|
+
end
|
61
|
+
|
62
|
+
def created_at
|
63
|
+
entry.changeset["created_at"]&.last || entry&.created_at
|
64
|
+
end
|
65
|
+
|
66
|
+
def created_date
|
67
|
+
I18n.l(created_at, format: :short)
|
68
|
+
rescue I18n::ArgumentError
|
69
|
+
""
|
70
|
+
end
|
71
|
+
|
72
|
+
def destroyed_at
|
73
|
+
destroy_entry&.created_at
|
74
|
+
end
|
75
|
+
|
76
|
+
def removal_date
|
77
|
+
I18n.l(destroyed_at, format: :short)
|
78
|
+
rescue I18n::ArgumentError
|
79
|
+
info_text("currently_active", klass: "text-success")
|
80
|
+
end
|
81
|
+
|
82
|
+
def last_sign_in_date
|
83
|
+
I18n.l(user&.last_sign_in_at, format: :short)
|
84
|
+
rescue I18n::ArgumentError
|
85
|
+
info_text("never_logged")
|
86
|
+
end
|
87
|
+
|
88
|
+
protected
|
89
|
+
|
90
|
+
def info_text(key, klass: :muted)
|
91
|
+
text = I18n.t(key, scope: "decidim.decidim_awesome.admin.admin_accountability")
|
92
|
+
return text unless html
|
93
|
+
|
94
|
+
"<span class=\"#{klass}\">#{text}</span>".html_safe
|
95
|
+
end
|
96
|
+
|
97
|
+
def proxy
|
98
|
+
@proxy ||= Decidim::EngineRouter.admin_proxy(participatory_space)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
class UserEntityPresenter < RoleBasePresenter
|
6
|
+
# Finds the destroyed entry if exists
|
7
|
+
def destroy_entry
|
8
|
+
@destroy_entry ||= begin
|
9
|
+
query = PaperTrail::Version.where(item_type:, event: "update", item_id:)
|
10
|
+
.where("id > ?", entry.id)
|
11
|
+
if roles.include? "admin"
|
12
|
+
query.where("object_changes LIKE '%\nadmin:\n- true\n- false%'").first
|
13
|
+
else
|
14
|
+
query.where("object_changes LIKE '%\nroles:\n- - %'").first
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def roles
|
20
|
+
@roles ||= begin
|
21
|
+
rls = entry.changeset["roles"]&.last || []
|
22
|
+
rls << "admin" if entry.changeset["admin"]&.last
|
23
|
+
rls
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def role_name
|
28
|
+
types = roles.index_with { |role| I18n.t(role, scope: "decidim.decidim_awesome.admin.admin_accountability.admin_roles", default: role) }
|
29
|
+
return types.values.join(", ") unless html
|
30
|
+
|
31
|
+
types.map { |role, type| "<span class=\"#{role_class(role)}\">#{type}</span>" }.join(" ").html_safe
|
32
|
+
end
|
33
|
+
|
34
|
+
def user
|
35
|
+
@user ||= entry&.item || Decidim::User.find_by(id: entry.changeset["id"]&.last)
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def role_class(role)
|
41
|
+
case role
|
42
|
+
when "admin"
|
43
|
+
"text-alert"
|
44
|
+
when "user_manager"
|
45
|
+
"text-secondary"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
class PrivateDataFinder
|
6
|
+
def query
|
7
|
+
Component.where(id: proposals.where.not(extra_fields: { private_body: nil }))
|
8
|
+
end
|
9
|
+
|
10
|
+
def proposals
|
11
|
+
Decidim::Proposals::Proposal.select(:decidim_component_id).joins(:extra_fields)
|
12
|
+
end
|
13
|
+
|
14
|
+
def for(resources)
|
15
|
+
Component.where(id: proposals).where(id: resources)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/app/serializers/concerns/decidim/decidim_awesome/proposals/proposal_serializer_methods.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
module Proposals
|
6
|
+
# Adds one custom field per column in export if custom fields are activted
|
7
|
+
# Adds vote weights
|
8
|
+
module ProposalSerializerMethods
|
9
|
+
extend ActiveSupport::Concern
|
10
|
+
|
11
|
+
included do
|
12
|
+
include ::Decidim::DecidimAwesome::NeedsAwesomeConfig
|
13
|
+
|
14
|
+
# Override the NeedsAwesomeConfig's awesome_config_instance,
|
15
|
+
# to take context from proposal instead of controller's request.
|
16
|
+
def awesome_config_instance
|
17
|
+
return @custom_config if @custom_config
|
18
|
+
|
19
|
+
@custom_config = Config.new(proposal.organization)
|
20
|
+
@custom_config.context_from_component(proposal.component)
|
21
|
+
@custom_config
|
22
|
+
end
|
23
|
+
|
24
|
+
def serialize_custom_fields
|
25
|
+
payload = {}
|
26
|
+
custom_fields = CustomFields.new(awesome_proposal_custom_fields)
|
27
|
+
if custom_fields.present?
|
28
|
+
@proposal.body.each do |locale, body|
|
29
|
+
if body.is_a?(Hash)
|
30
|
+
body.each do |translation_locale, value|
|
31
|
+
fields_entries(custom_fields, value) do |field_key, field_value|
|
32
|
+
payload["body/#{field_key}/#{translation_locale}".to_sym] = field_value if payload["body/#{field_key}/#{translation_locale}".to_sym].blank?
|
33
|
+
end
|
34
|
+
end
|
35
|
+
else
|
36
|
+
fields_entries(custom_fields, body) do |key, value|
|
37
|
+
payload["body/#{key}/#{locale}".to_sym] = value
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
payload
|
43
|
+
end
|
44
|
+
|
45
|
+
def serialize_private_custom_fields
|
46
|
+
payload = {}
|
47
|
+
private_custom_fields = CustomFields.new(awesome_proposal_private_custom_fields)
|
48
|
+
if private_custom_fields.present?
|
49
|
+
fields_entries(private_custom_fields, proposal.private_body) do |key, value|
|
50
|
+
value = value.first if value.is_a? Array
|
51
|
+
payload["private_body/#{key}".to_sym] = value
|
52
|
+
end
|
53
|
+
end
|
54
|
+
payload
|
55
|
+
end
|
56
|
+
|
57
|
+
# Iterate on custom fields that has a label and name
|
58
|
+
# (will ignore paragraphs and title)
|
59
|
+
def fields_entries(custom_fields, body)
|
60
|
+
custom_fields.apply_xml(body)
|
61
|
+
custom_fields.fields.each do |field|
|
62
|
+
next unless field["label"].present? && field.has_key?("name")
|
63
|
+
|
64
|
+
value = field["userData"].is_a?(Array) ? field["userData"].first : field["userData"]
|
65
|
+
yield field["label"].parameterize, value
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/app/serializers/concerns/decidim/decidim_awesome/proposals/proposal_serializer_override.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
module Proposals
|
6
|
+
# Adds one custom field per column in export if custom fields are activted
|
7
|
+
# Adds vote weights
|
8
|
+
module ProposalSerializerOverride
|
9
|
+
extend ActiveSupport::Concern
|
10
|
+
|
11
|
+
included do
|
12
|
+
include ProposalSerializerMethods
|
13
|
+
|
14
|
+
alias_method :decidim_original_serialize, :serialize
|
15
|
+
|
16
|
+
def serialize
|
17
|
+
# serialize first the custom fields,
|
18
|
+
# as default serialization will strip proposal body's <xml> tags.
|
19
|
+
serialization = decidim_original_serialize
|
20
|
+
serialization.merge!(proposal_vote_weights)
|
21
|
+
serialization.merge!(serialize_custom_fields)
|
22
|
+
end
|
23
|
+
|
24
|
+
protected
|
25
|
+
|
26
|
+
def proposal_vote_weights
|
27
|
+
payload = {}
|
28
|
+
if proposal.respond_to?(:vote_weights)
|
29
|
+
proposal.update_vote_weights!
|
30
|
+
payload[:votes] = proposal.reload.vote_weights
|
31
|
+
end
|
32
|
+
payload
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
# This class serializes a AdminAccountability so can be exported to CSV, JSON or other
|
6
|
+
# formats.
|
7
|
+
class PaperTrailVersionSerializer < Decidim::Exporters::Serializer
|
8
|
+
include Decidim::ApplicationHelper
|
9
|
+
include Decidim::ResourceHelper
|
10
|
+
include Decidim::TranslationsHelper
|
11
|
+
|
12
|
+
# Public: Initializes the serializer with a admin actions.
|
13
|
+
def initialize(log_entry)
|
14
|
+
@entry = log_entry.present(html: false)
|
15
|
+
end
|
16
|
+
|
17
|
+
# Public: Exports a hash with the serialized data for this admin action.
|
18
|
+
def serialize
|
19
|
+
{
|
20
|
+
role: entry.role_name,
|
21
|
+
user_name: entry.user_name,
|
22
|
+
user_email: entry.user_email,
|
23
|
+
user_role_type: entry.entry.item_type,
|
24
|
+
participatory_space_type: entry.participatory_space_type,
|
25
|
+
participatory_space_title: translated_attribute(entry.participatory_space&.title),
|
26
|
+
last_sign_in_at: entry.last_sign_in_date,
|
27
|
+
role_created_at: entry.created_date,
|
28
|
+
role_removed_at: entry.removal_date
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
attr_reader :entry
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
module Proposals
|
6
|
+
##
|
7
|
+
# Custom serializer for Proposals with private data.
|
8
|
+
# Used to separate open-data export and admin export.
|
9
|
+
class PrivateProposalSerializer < ::Decidim::Proposals::ProposalSerializer
|
10
|
+
include ProposalSerializerMethods
|
11
|
+
|
12
|
+
def serialize
|
13
|
+
serialization = super.merge!(serialize_private_custom_fields)
|
14
|
+
serialization.merge!(serialize_private_notes)
|
15
|
+
end
|
16
|
+
|
17
|
+
def serialize_private_notes
|
18
|
+
payload = {}
|
19
|
+
notes = proposal.notes
|
20
|
+
return payload unless notes.any?
|
21
|
+
|
22
|
+
notes.each do |note|
|
23
|
+
payload["notes/#{note.id}".to_sym] = {
|
24
|
+
created_at: note.created_at,
|
25
|
+
note: note.body,
|
26
|
+
author: author_name(note.author)
|
27
|
+
}
|
28
|
+
end
|
29
|
+
payload
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
module AddProposalTypeCustomFields
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
include ::Decidim::DecidimAwesome::NeedsAwesomeConfig
|
10
|
+
|
11
|
+
field :body_fields, TranslatedCustomFieldsType, "Custom fields for this proposal", null: true
|
12
|
+
|
13
|
+
def body_fields
|
14
|
+
return if custom_fields.empty?
|
15
|
+
|
16
|
+
@body_fields ||= object.body.transform_values do |body|
|
17
|
+
sanitize_translated_fields(body)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Override the NeedsAwesomeConfig's awesome_config_instance,
|
22
|
+
# to take context from proposal instead of controller's request.
|
23
|
+
def awesome_config_instance
|
24
|
+
return @custom_config if @custom_config
|
25
|
+
|
26
|
+
@custom_config = Config.new(object.organization)
|
27
|
+
@custom_config.context_from_component(object.component)
|
28
|
+
@custom_config
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def custom_fields
|
34
|
+
@custom_fields ||= CustomFields.new(awesome_proposal_custom_fields)
|
35
|
+
end
|
36
|
+
|
37
|
+
def fields_for_xml(body)
|
38
|
+
custom_fields.apply_xml(body)
|
39
|
+
custom_fields.fields.filter_map do |field|
|
40
|
+
next unless field["label"].present? && field.has_key?("name")
|
41
|
+
|
42
|
+
field["userData"] = field["userData"].first if field["userData"].is_a?(Array)
|
43
|
+
field.dup
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def sanitize_translated_fields(body)
|
48
|
+
if body.is_a?(Hash)
|
49
|
+
body.transform_values do |value|
|
50
|
+
fields_for_xml(value)
|
51
|
+
end
|
52
|
+
else
|
53
|
+
fields_for_xml(body)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module DecidimAwesome
|
5
|
+
module AddProposalTypeVoteWeights
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
field :vote_weights, GraphQL::Types::JSON, description: "The corresponding weights count to the proposal votes", null: true
|
10
|
+
|
11
|
+
def vote_weights
|
12
|
+
current_component = object.component
|
13
|
+
return unless current_component.current_settings.respond_to?(:votes_hidden?)
|
14
|
+
|
15
|
+
object.vote_weights unless current_component.current_settings.votes_hidden?
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|