decidim-proposals 0.27.10 → 0.28.0.rc4
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/proposals/collaborative_draft_cell.rb +1 -1
- data/app/cells/decidim/proposals/collaborative_draft_l_cell.rb +16 -0
- data/app/cells/decidim/proposals/collaborative_draft_link_to_proposal/show.erb +4 -12
- data/app/cells/decidim/proposals/collaborative_draft_link_to_proposal_cell.rb +0 -29
- data/app/cells/decidim/proposals/collaborative_draft_metadata_cell.rb +30 -0
- data/app/cells/decidim/proposals/content_blocks/highlighted_proposals_cell.rb +2 -8
- data/app/cells/decidim/proposals/cost_report/show.erb +5 -34
- data/app/cells/decidim/proposals/cost_report_cell.rb +0 -13
- data/app/cells/decidim/proposals/highlighted_proposals_for_component/show.erb +29 -17
- data/app/cells/decidim/proposals/highlighted_proposals_for_component_cell.rb +34 -8
- data/app/cells/decidim/proposals/irreversible_action_modal/show.erb +9 -17
- data/app/cells/decidim/proposals/irreversible_action_modal_cell.rb +7 -9
- data/app/cells/decidim/proposals/participatory_text_proposal/buttons.erb +21 -31
- data/app/cells/decidim/proposals/participatory_text_proposal/show.erb +5 -9
- data/app/cells/decidim/proposals/participatory_text_proposal_cell.rb +0 -9
- data/app/cells/decidim/proposals/proposal_activity_cell.rb +1 -12
- data/app/cells/decidim/proposals/proposal_cell.rb +6 -1
- data/app/cells/decidim/proposals/proposal_l_cell.rb +47 -0
- data/app/cells/decidim/proposals/proposal_link_to_collaborative_draft_cell.rb +6 -4
- data/app/cells/decidim/proposals/proposal_link_to_rejected_emendation_cell.rb +9 -7
- data/app/cells/decidim/proposals/proposal_linked_resources/show.erb +3 -8
- data/app/cells/decidim/proposals/proposal_metadata_cell.rb +61 -0
- data/app/cells/decidim/proposals/proposal_s_cell.rb +21 -0
- data/app/cells/decidim/proposals/proposals_picker/show.erb +13 -13
- data/app/cells/decidim/proposals/proposals_picker_cell.rb +15 -38
- data/app/commands/decidim/proposals/accept_access_to_collaborative_draft.rb +1 -1
- data/app/commands/decidim/proposals/admin/answer_proposal.rb +1 -1
- data/app/commands/decidim/proposals/admin/assign_proposals_to_valuator.rb +3 -3
- data/app/commands/decidim/proposals/admin/create_proposal.rb +2 -2
- data/app/commands/decidim/proposals/admin/create_proposal_note.rb +4 -4
- data/app/commands/decidim/proposals/admin/discard_participatory_text.rb +1 -1
- data/app/commands/decidim/proposals/admin/import_participatory_text.rb +1 -1
- data/app/commands/decidim/proposals/admin/import_proposals.rb +2 -13
- data/app/commands/decidim/proposals/admin/merge_proposals.rb +1 -1
- data/app/commands/decidim/proposals/admin/notify_proposal_answer.rb +3 -3
- data/app/commands/decidim/proposals/admin/publish_answers.rb +1 -1
- data/app/commands/decidim/proposals/admin/publish_participatory_text.rb +2 -2
- data/app/commands/decidim/proposals/admin/split_proposals.rb +1 -1
- data/app/commands/decidim/proposals/admin/unassign_proposals_from_valuator.rb +2 -2
- data/app/commands/decidim/proposals/admin/update_participatory_text.rb +1 -1
- data/app/commands/decidim/proposals/admin/update_proposal.rb +5 -1
- data/app/commands/decidim/proposals/admin/update_proposal_scope.rb +1 -1
- data/app/commands/decidim/proposals/create_collaborative_draft.rb +13 -3
- data/app/commands/decidim/proposals/create_proposal.rb +14 -5
- data/app/commands/decidim/proposals/hashtags_methods.rb +1 -1
- data/app/commands/decidim/proposals/publish_proposal.rb +1 -1
- data/app/commands/decidim/proposals/reject_access_to_collaborative_draft.rb +1 -1
- data/app/commands/decidim/proposals/request_access_to_collaborative_draft.rb +1 -1
- data/app/commands/decidim/proposals/unvote_proposal.rb +2 -2
- data/app/commands/decidim/proposals/update_collaborative_draft.rb +12 -2
- data/app/commands/decidim/proposals/update_proposal.rb +16 -14
- data/app/commands/decidim/proposals/vote_proposal.rb +2 -2
- data/app/controllers/concerns/decidim/proposals/admin/filterable.rb +4 -13
- data/app/controllers/decidim/proposals/admin/proposal_answers_controller.rb +2 -2
- data/app/controllers/decidim/proposals/admin/proposal_notes_controller.rb +1 -1
- data/app/controllers/decidim/proposals/admin/proposals_controller.rb +2 -2
- data/app/controllers/decidim/proposals/collaborative_drafts_controller.rb +3 -9
- data/app/controllers/decidim/proposals/proposal_votes_controller.rb +3 -3
- data/app/controllers/decidim/proposals/proposals_controller.rb +42 -12
- data/app/events/decidim/proposals/accepted_proposal_event.rb +1 -1
- data/app/events/decidim/proposals/admin/proposal_note_created_event.rb +1 -1
- data/app/events/decidim/proposals/admin/update_proposal_category_event.rb +1 -1
- data/app/events/decidim/proposals/admin/update_proposal_scope_event.rb +1 -1
- data/app/events/decidim/proposals/collaborative_draft_access_accepted_event.rb +1 -1
- data/app/events/decidim/proposals/collaborative_draft_access_rejected_event.rb +1 -1
- data/app/events/decidim/proposals/collaborative_draft_access_request_event.rb +1 -1
- data/app/events/decidim/proposals/collaborative_draft_access_requested_event.rb +1 -1
- data/app/events/decidim/proposals/collaborative_draft_access_requester_accepted_event.rb +1 -1
- data/app/events/decidim/proposals/collaborative_draft_access_requester_rejected_event.rb +1 -1
- data/app/events/decidim/proposals/collaborative_draft_withdrawn_event.rb +1 -1
- data/app/events/decidim/proposals/evaluating_proposal_event.rb +1 -1
- data/app/events/decidim/proposals/proposal_endorsed_event.rb +1 -1
- data/app/events/decidim/proposals/proposal_mentioned_event.rb +1 -1
- data/app/events/decidim/proposals/publish_proposal_event.rb +1 -1
- data/app/events/decidim/proposals/rejected_proposal_event.rb +1 -1
- data/app/forms/decidim/proposals/admin/import_participatory_text_form.rb +1 -1
- data/app/forms/decidim/proposals/admin/proposal_base_form.rb +2 -2
- data/app/forms/decidim/proposals/admin/proposal_form.rb +1 -1
- data/app/forms/decidim/proposals/admin/proposals_fork_form.rb +1 -1
- data/app/forms/decidim/proposals/admin/valuation_assignment_form.rb +1 -1
- data/app/forms/decidim/proposals/proposal_form.rb +9 -27
- data/app/helpers/decidim/proposals/admin/proposal_bulk_actions_helper.rb +1 -1
- data/app/helpers/decidim/proposals/admin/proposals_helper.rb +13 -13
- data/app/helpers/decidim/proposals/application_helper.rb +80 -28
- data/app/helpers/decidim/proposals/collaborative_draft_helper.rb +44 -4
- data/app/helpers/decidim/proposals/map_helper.rb +3 -4
- data/app/helpers/decidim/proposals/participatory_texts_helper.rb +1 -9
- data/app/helpers/decidim/proposals/proposal_cells_helper.rb +1 -1
- data/app/helpers/decidim/proposals/proposal_votes_helper.rb +2 -24
- data/app/helpers/decidim/proposals/proposal_wizard_helper.rb +14 -81
- data/app/helpers/decidim/proposals/proposals_helper.rb +0 -12
- data/app/jobs/decidim/proposals/hide_all_created_by_author_job.rb +20 -0
- data/app/jobs/decidim/proposals/notify_proposals_mentioned_job.rb +1 -1
- data/app/jobs/decidim/proposals/settings_change_job.rb +2 -2
- data/app/models/decidim/proposals/collaborative_draft.rb +4 -16
- data/app/models/decidim/proposals/proposal.rb +33 -16
- data/app/models/decidim/proposals/proposal_vote.rb +3 -3
- data/app/models/decidim/proposals/valuation_assignment.rb +1 -2
- data/app/packs/documents/decidim/proposals/participatory_texts/participatory_text.md +9 -4
- data/app/packs/entrypoints/decidim_proposals.js +4 -0
- data/app/packs/entrypoints/decidim_proposals_admin.js +0 -1
- data/app/packs/images/decidim/gamification/badges/decidim_gamification_badges_accepted_proposals.svg +68 -1
- data/app/packs/images/decidim/gamification/badges/decidim_gamification_badges_proposal_votes.svg +34 -1
- data/app/packs/images/decidim/gamification/badges/decidim_gamification_badges_proposals.svg +64 -1
- data/app/packs/src/decidim/proposals/add_proposal.js +25 -39
- data/app/packs/src/decidim/proposals/admin/proposals.js +0 -7
- data/app/packs/src/decidim/proposals/choose_proposals.js +20 -0
- data/app/packs/stylesheets/decidim/proposals/proposals.scss +97 -0
- data/app/permissions/decidim/proposals/admin/permissions.rb +3 -3
- data/app/permissions/decidim/proposals/permissions.rb +1 -10
- data/app/presenters/decidim/proposals/admin_log/proposal_note_presenter.rb +2 -2
- data/app/presenters/decidim/proposals/admin_log/proposal_presenter.rb +7 -3
- data/app/presenters/decidim/proposals/admin_log/valuation_assignment_presenter.rb +2 -2
- data/app/presenters/decidim/proposals/admin_log/value_types/proposal_title_body_presenter.rb +3 -1
- data/app/presenters/decidim/proposals/log/resource_presenter.rb +22 -0
- data/app/presenters/decidim/proposals/log/valuation_assignment_presenter.rb +1 -1
- data/app/presenters/decidim/proposals/proposal_presenter.rb +6 -2
- data/app/services/decidim/proposals/diff_renderer.rb +3 -3
- data/app/services/decidim/proposals/proposal_builder.rb +6 -6
- data/app/views/decidim/proposals/admin/participatory_texts/_article-preview.html.erb +2 -4
- data/app/views/decidim/proposals/admin/participatory_texts/_bulk-actions.html.erb +2 -2
- data/app/views/decidim/proposals/admin/participatory_texts/index.html.erb +58 -46
- data/app/views/decidim/proposals/admin/participatory_texts/new_import.html.erb +31 -33
- data/app/views/decidim/proposals/admin/proposal_answers/_form.html.erb +17 -11
- data/app/views/decidim/proposals/admin/proposal_notes/_form.html.erb +5 -6
- data/app/views/decidim/proposals/admin/proposal_notes/_proposal_notes.html.erb +28 -36
- data/app/views/decidim/proposals/admin/proposals/_bulk-actions.html.erb +27 -30
- data/app/views/decidim/proposals/admin/proposals/_documents.html.erb +13 -0
- data/app/views/decidim/proposals/admin/proposals/_endorsers.html.erb +25 -0
- data/app/views/decidim/proposals/admin/proposals/_form.html.erb +70 -90
- data/app/views/decidim/proposals/admin/proposals/_meetings.html.erb +13 -0
- data/app/views/decidim/proposals/admin/proposals/_photos.html.erb +13 -0
- data/app/views/decidim/proposals/admin/proposals/_proposal-tr.html.erb +31 -25
- data/app/views/decidim/proposals/admin/proposals/bulk_actions/_assign_to_valuator.html.erb +3 -3
- data/app/views/decidim/proposals/admin/proposals/bulk_actions/_dropdown.html.erb +3 -2
- data/app/views/decidim/proposals/admin/proposals/bulk_actions/_merge.html.erb +4 -4
- data/app/views/decidim/proposals/admin/proposals/bulk_actions/_publish_answers.html.erb +3 -3
- data/app/views/decidim/proposals/admin/proposals/bulk_actions/_recategorize.html.erb +3 -3
- data/app/views/decidim/proposals/admin/proposals/bulk_actions/_scope-change.html.erb +4 -8
- data/app/views/decidim/proposals/admin/proposals/bulk_actions/_split.html.erb +3 -3
- data/app/views/decidim/proposals/admin/proposals/bulk_actions/_unassign_from_valuator.html.erb +3 -3
- data/app/views/decidim/proposals/admin/proposals/edit.html.erb +17 -7
- data/app/views/decidim/proposals/admin/proposals/index.html.erb +50 -63
- data/app/views/decidim/proposals/admin/proposals/new.html.erb +16 -6
- data/app/views/decidim/proposals/admin/proposals/publish_answers.js.erb +2 -2
- data/app/views/decidim/proposals/admin/proposals/show.html.erb +204 -162
- data/app/views/decidim/proposals/admin/proposals/update_attribute.js.erb +5 -6
- data/app/views/decidim/proposals/admin/proposals_imports/new.html.erb +48 -34
- data/app/views/decidim/proposals/collaborative_drafts/_accept_request_access_form.html.erb +1 -1
- data/app/views/decidim/proposals/collaborative_drafts/_actions.html.erb +7 -0
- data/app/views/decidim/proposals/collaborative_drafts/_collaborative_draft_aside.html.erb +53 -0
- data/app/views/decidim/proposals/collaborative_drafts/_collaborative_drafts.html.erb +12 -13
- data/app/views/decidim/proposals/collaborative_drafts/_collaborator_requests.html.erb +8 -12
- data/app/views/decidim/proposals/collaborative_drafts/_edit_form_fields.html.erb +26 -54
- data/app/views/decidim/proposals/collaborative_drafts/_reject_request_access_form.html.erb +1 -3
- data/app/views/decidim/proposals/collaborative_drafts/_request_access_form.html.erb +1 -1
- data/app/views/decidim/proposals/collaborative_drafts/edit.html.erb +23 -25
- data/app/views/decidim/proposals/collaborative_drafts/index.html.erb +30 -22
- data/app/views/decidim/proposals/collaborative_drafts/index.js.erb +0 -5
- data/app/views/decidim/proposals/collaborative_drafts/new.html.erb +22 -18
- data/app/views/decidim/proposals/collaborative_drafts/show.html.erb +39 -109
- data/app/views/decidim/proposals/proposal_votes/update_buttons_and_counters.js.erb +2 -2
- data/app/views/decidim/proposals/proposals/_actions.html.erb +13 -0
- data/app/views/decidim/proposals/proposals/_edit_form_fields.html.erb +31 -70
- data/app/views/decidim/proposals/proposals/_linked_proposals.html.erb +3 -35
- data/app/views/decidim/proposals/proposals/_proposal_aside.html.erb +40 -0
- data/app/views/decidim/proposals/proposals/_proposals.html.erb +18 -39
- data/app/views/decidim/proposals/proposals/_proposals_picker.html.erb +5 -0
- data/app/views/decidim/proposals/proposals/_remaining_votes_count.html.erb +3 -3
- data/app/views/decidim/proposals/proposals/_vote_button.html.erb +16 -17
- data/app/views/decidim/proposals/proposals/_votes_count.html.erb +3 -6
- data/app/views/decidim/proposals/proposals/_voting_rules.html.erb +28 -41
- data/app/views/decidim/proposals/proposals/_wizard_header.html.erb +19 -25
- data/app/views/decidim/proposals/proposals/compare.html.erb +17 -16
- data/app/views/decidim/proposals/proposals/complete.html.erb +26 -21
- data/app/views/decidim/proposals/proposals/edit.html.erb +32 -27
- data/app/views/decidim/proposals/proposals/edit_draft.html.erb +21 -19
- data/app/views/decidim/proposals/proposals/index.html.erb +56 -47
- data/app/views/decidim/proposals/proposals/index.js.erb +0 -5
- data/app/views/decidim/proposals/proposals/new.html.erb +30 -35
- data/app/views/decidim/proposals/proposals/participatory_texts/_proposal_vote_button.html.erb +5 -5
- data/app/views/decidim/proposals/proposals/participatory_texts/_view_index.html.erb +15 -8
- data/app/views/decidim/proposals/proposals/participatory_texts/participatory_text.html.erb +32 -15
- data/app/views/decidim/proposals/proposals/preview.html.erb +37 -34
- data/app/views/decidim/proposals/proposals/show.html.erb +90 -108
- data/app/views/decidim/proposals/versions/show.html.erb +14 -6
- data/config/assets.rb +0 -1
- data/config/brakeman.ignore +31 -56
- data/config/locales/ar.yml +23 -158
- data/config/locales/bg.yml +1 -776
- data/config/locales/ca.yml +92 -150
- data/config/locales/cs.yml +75 -135
- data/config/locales/de.yml +83 -141
- data/config/locales/el.yml +58 -121
- data/config/locales/en.yml +76 -134
- data/config/locales/es-MX.yml +77 -135
- data/config/locales/es-PY.yml +76 -134
- data/config/locales/es.yml +84 -142
- data/config/locales/eu.yml +77 -135
- data/config/locales/fi-plain.yml +68 -126
- data/config/locales/fi.yml +76 -134
- data/config/locales/fr-CA.yml +73 -132
- data/config/locales/fr.yml +77 -136
- data/config/locales/ga-IE.yml +0 -45
- data/config/locales/gl.yml +12 -131
- data/config/locales/hu.yml +45 -149
- data/config/locales/id-ID.yml +9 -114
- data/config/locales/is-IS.yml +5 -60
- data/config/locales/it.yml +14 -146
- data/config/locales/ja.yml +78 -141
- data/config/locales/lb.yml +0 -5
- data/config/locales/lt.yml +65 -126
- data/config/locales/lv.yml +13 -144
- data/config/locales/nl.yml +16 -148
- data/config/locales/no.yml +11 -134
- data/config/locales/pl.yml +16 -239
- data/config/locales/pt-BR.yml +14 -199
- data/config/locales/pt.yml +11 -142
- data/config/locales/ro-RO.yml +12 -146
- data/config/locales/ru.yml +5 -70
- data/config/locales/sk.yml +19 -145
- data/config/locales/sr-CS.yml +0 -23
- data/config/locales/sv.yml +60 -195
- data/config/locales/tr-TR.yml +16 -150
- data/config/locales/uk.yml +5 -70
- data/config/locales/zh-CN.yml +9 -135
- data/config/locales/zh-TW.yml +35 -107
- data/db/migrate/20170307085300_migrate_proposal_reports_data_to_reports.rb +1 -1
- data/db/migrate/20230427105700_change_states_on_collaborative_drafts.rb +34 -0
- data/db/migrate/20230427105700_change_states_on_proposals.rb +34 -0
- data/lib/decidim/api/proposals_type.rb +2 -2
- data/lib/decidim/proposals/component.rb +11 -289
- data/lib/decidim/proposals/doc_to_markdown.rb +0 -4
- data/lib/decidim/proposals/engine.rb +43 -7
- data/lib/decidim/proposals/import/proposal_answer_creator.rb +1 -1
- data/lib/decidim/proposals/import/proposal_creator.rb +10 -10
- data/lib/decidim/proposals/markdown_to_proposals.rb +8 -2
- data/lib/decidim/proposals/proposal_serializer.rb +4 -56
- data/lib/decidim/proposals/seeds.rb +278 -0
- data/lib/decidim/proposals/test/factories.rb +106 -85
- data/lib/decidim/proposals/valuatable.rb +1 -2
- data/lib/decidim/proposals/version.rb +1 -1
- metadata +55 -66
- data/app/cells/decidim/proposals/collaborative_draft_m/footer.erb +0 -6
- data/app/cells/decidim/proposals/collaborative_draft_m/tags.erb +0 -1
- data/app/cells/decidim/proposals/collaborative_draft_m_cell.rb +0 -44
- data/app/cells/decidim/proposals/content_blocks/highlighted_proposals/elements.erb +0 -5
- data/app/cells/decidim/proposals/content_blocks/highlighted_proposals/heading.erb +0 -1
- data/app/cells/decidim/proposals/proposal_link_to_rejected_emendation/show.erb +0 -9
- data/app/cells/decidim/proposals/proposal_m/footer.erb +0 -26
- data/app/cells/decidim/proposals/proposal_m/tags.erb +0 -1
- data/app/cells/decidim/proposals/proposal_m_cell.rb +0 -151
- data/app/cells/decidim/proposals/proposal_tags/show.erb +0 -33
- data/app/cells/decidim/proposals/proposal_tags_cell.rb +0 -35
- data/app/cells/decidim/proposals/proposals_picker/proposals.erb +0 -12
- data/app/controllers/concerns/decidim/proposals/admin/picker.rb +0 -21
- data/app/controllers/decidim/proposals/widgets_controller.rb +0 -29
- data/app/helpers/decidim/proposals/admin/filterable_helper.rb +0 -17
- data/app/helpers/decidim/proposals/admin/proposals_picker_helper.rb +0 -30
- data/app/packs/src/decidim/proposals/admin/proposals_picker.js +0 -50
- data/app/packs/stylesheets/decidim/proposals/_proposals.scss +0 -1
- data/app/packs/stylesheets/decidim/proposals/proposals/_preview.scss +0 -3
- data/app/views/decidim/proposals/collaborative_drafts/_count.html.erb +0 -1
- data/app/views/decidim/proposals/collaborative_drafts/_filters.html.erb +0 -32
- data/app/views/decidim/proposals/collaborative_drafts/_filters_small_view.html.erb +0 -18
- data/app/views/decidim/proposals/collaborative_drafts/_new_collaborative_draft_button.html.erb +0 -11
- data/app/views/decidim/proposals/collaborative_drafts/_wizard_aside.html.erb +0 -13
- data/app/views/decidim/proposals/collaborative_drafts/_wizard_header.html.erb +0 -14
- data/app/views/decidim/proposals/proposals/_count.html.erb +0 -1
- data/app/views/decidim/proposals/proposals/_dynamic_map_instructions.html.erb +0 -4
- data/app/views/decidim/proposals/proposals/_filters.html.erb +0 -48
- data/app/views/decidim/proposals/proposals/_filters_small_view.html.erb +0 -18
- data/app/views/decidim/proposals/proposals/_proposal_similar.html.erb +0 -22
- data/app/views/decidim/proposals/proposals/_wizard_aside.html.erb +0 -20
- data/app/views/decidim/proposals/proposals/participatory_texts/_index.html.erb +0 -19
- data/app/views/decidim/proposals/versions/index.html.erb +0 -16
- data/config/locales/he-IL.yml +0 -1
- data/db/migrate/20240404202756_add_valuation_assignments_count_to_decidim_proposals_proposals.rb +0 -16
- data/decidim-proposals.gemspec +0 -40
- data/lib/decidim/proposals/test/capybara_proposals_picker.rb +0 -59
@@ -20,14 +20,14 @@ module Decidim
|
|
20
20
|
# Executes the command. Broadcasts these events:
|
21
21
|
#
|
22
22
|
# - :ok when everything is valid, together with the collaborative_draft.
|
23
|
-
# - :invalid if the form
|
23
|
+
# - :invalid if the form was not valid and we could not proceed.
|
24
24
|
#
|
25
25
|
# Returns nothing.
|
26
26
|
def call
|
27
27
|
return broadcast(:invalid) if form.invalid?
|
28
28
|
return broadcast(:invalid) unless collaborative_draft.editable_by?(current_user)
|
29
29
|
|
30
|
-
|
30
|
+
with_events(with_transaction: true) do
|
31
31
|
update_collaborative_draft
|
32
32
|
end
|
33
33
|
|
@@ -38,6 +38,16 @@ module Decidim
|
|
38
38
|
|
39
39
|
attr_reader :form, :collaborative_draft, :current_user
|
40
40
|
|
41
|
+
def event_arguments
|
42
|
+
{
|
43
|
+
resource: collaborative_draft,
|
44
|
+
extra: {
|
45
|
+
event_author: form.current_user,
|
46
|
+
locale:
|
47
|
+
}
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
41
51
|
def update_collaborative_draft
|
42
52
|
Decidim.traceability.update!(
|
43
53
|
@collaborative_draft,
|
@@ -5,7 +5,6 @@ module Decidim
|
|
5
5
|
# A command with all the business logic when a user updates a proposal.
|
6
6
|
class UpdateProposal < Decidim::Command
|
7
7
|
include ::Decidim::MultipleAttachmentsMethods
|
8
|
-
include GalleryMethods
|
9
8
|
include HashtagsMethods
|
10
9
|
|
11
10
|
# Public: Initializes the command.
|
@@ -23,7 +22,7 @@ module Decidim
|
|
23
22
|
# Executes the command. Broadcasts these events:
|
24
23
|
#
|
25
24
|
# - :ok when everything is valid, together with the proposal.
|
26
|
-
# - :invalid if the form
|
25
|
+
# - :invalid if the form was not valid and we could not proceed.
|
27
26
|
#
|
28
27
|
# Returns nothing.
|
29
28
|
def call
|
@@ -34,22 +33,15 @@ module Decidim
|
|
34
33
|
return broadcast(:invalid) if attachments_invalid?
|
35
34
|
end
|
36
35
|
|
37
|
-
|
38
|
-
build_gallery
|
39
|
-
return broadcast(:invalid) if gallery_invalid?
|
40
|
-
end
|
41
|
-
|
42
|
-
transaction do
|
36
|
+
with_events(with_transaction: true) do
|
43
37
|
if @proposal.draft?
|
44
38
|
update_draft
|
45
39
|
else
|
46
40
|
update_proposal
|
47
41
|
end
|
48
42
|
|
49
|
-
|
50
|
-
document_cleanup!
|
43
|
+
document_cleanup!(include_all_attachments: true)
|
51
44
|
|
52
|
-
create_gallery if process_gallery?
|
53
45
|
create_attachments(first_weight: first_attachment_weight) if process_attachments?
|
54
46
|
end
|
55
47
|
|
@@ -60,6 +52,16 @@ module Decidim
|
|
60
52
|
|
61
53
|
attr_reader :form, :proposal, :current_user, :attachment
|
62
54
|
|
55
|
+
def event_arguments
|
56
|
+
{
|
57
|
+
resource: proposal,
|
58
|
+
extra: {
|
59
|
+
event_author: form.current_user,
|
60
|
+
locale:
|
61
|
+
}
|
62
|
+
}
|
63
|
+
end
|
64
|
+
|
63
65
|
def invalid?
|
64
66
|
form.invalid? || !proposal.editable_by?(current_user) || proposal_limit_reached?
|
65
67
|
end
|
@@ -73,7 +75,7 @@ module Decidim
|
|
73
75
|
PaperTrail.request(enabled: false) do
|
74
76
|
@proposal.update(attributes)
|
75
77
|
@proposal.coauthorships.clear
|
76
|
-
@proposal.add_coauthor(current_user, user_group:
|
78
|
+
@proposal.add_coauthor(current_user, user_group:)
|
77
79
|
end
|
78
80
|
end
|
79
81
|
|
@@ -85,7 +87,7 @@ module Decidim
|
|
85
87
|
visibility: "public-only"
|
86
88
|
)
|
87
89
|
@proposal.coauthorships.clear
|
88
|
-
@proposal.add_coauthor(current_user, user_group:
|
90
|
+
@proposal.add_coauthor(current_user, user_group:)
|
89
91
|
end
|
90
92
|
|
91
93
|
def attributes
|
@@ -123,7 +125,7 @@ module Decidim
|
|
123
125
|
end
|
124
126
|
|
125
127
|
def user_group
|
126
|
-
@user_group ||= Decidim::UserGroup.find_by(organization
|
128
|
+
@user_group ||= Decidim::UserGroup.find_by(organization:, id: form.user_group_id)
|
127
129
|
end
|
128
130
|
|
129
131
|
def organization
|
@@ -16,7 +16,7 @@ module Decidim
|
|
16
16
|
# Executes the command. Broadcasts these events:
|
17
17
|
#
|
18
18
|
# - :ok when everything is valid, together with the proposal vote.
|
19
|
-
# - :invalid if the form
|
19
|
+
# - :invalid if the form was not valid and we could not proceed.
|
20
20
|
#
|
21
21
|
# Returns nothing.
|
22
22
|
def call
|
@@ -62,7 +62,7 @@ module Decidim
|
|
62
62
|
def user_votes
|
63
63
|
@user_votes ||= ProposalVote.where(
|
64
64
|
author: @current_user,
|
65
|
-
proposal: Proposal.where(component:
|
65
|
+
proposal: Proposal.where(component:)
|
66
66
|
)
|
67
67
|
end
|
68
68
|
|
@@ -11,8 +11,6 @@ module Decidim
|
|
11
11
|
included do
|
12
12
|
include Decidim::Admin::Filterable
|
13
13
|
|
14
|
-
helper Decidim::Proposals::Admin::FilterableHelper
|
15
|
-
|
16
14
|
private
|
17
15
|
|
18
16
|
# Comment about participatory_texts_enabled.
|
@@ -35,8 +33,8 @@ module Decidim
|
|
35
33
|
def filters
|
36
34
|
[
|
37
35
|
:is_emendation_true,
|
36
|
+
:with_any_state,
|
38
37
|
:state_eq,
|
39
|
-
:state_null,
|
40
38
|
:scope_id_eq,
|
41
39
|
:category_id_eq,
|
42
40
|
:valuator_role_ids_has
|
@@ -46,14 +44,15 @@ module Decidim
|
|
46
44
|
def filters_with_values
|
47
45
|
{
|
48
46
|
is_emendation_true: %w(true false),
|
49
|
-
state_eq:
|
47
|
+
state_eq: Proposal::STATES,
|
48
|
+
with_any_state: %w(state_published state_not_published),
|
50
49
|
scope_id_eq: scope_ids_hash(scopes.top_level),
|
51
50
|
category_id_eq: category_ids_hash(categories.first_class),
|
52
51
|
valuator_role_ids_has: valuator_role_ids
|
53
52
|
}
|
54
53
|
end
|
55
54
|
|
56
|
-
#
|
55
|
+
# Cannot user `super` here, because it does not belong to a superclass
|
57
56
|
# but to a concern.
|
58
57
|
def dynamically_translated_filters
|
59
58
|
[:scope_id_eq, :category_id_eq, :valuator_role_ids_has]
|
@@ -67,14 +66,6 @@ module Decidim
|
|
67
66
|
user_role = current_participatory_space.user_roles(:valuator).find_by(id: valuator_role_id)
|
68
67
|
user_role&.user&.name
|
69
68
|
end
|
70
|
-
|
71
|
-
# An Array<Symbol> of possible values for `state_eq` filter.
|
72
|
-
# Excludes the states that cannot be filtered with the ransack predicate.
|
73
|
-
# A link to filter by "Not answered" will be added in:
|
74
|
-
# Decidim::Proposals::Admin::FilterableHelper#extra_dropdown_submenu_options_items
|
75
|
-
def proposal_states
|
76
|
-
Proposal::POSSIBLE_STATES.without("not_answered")
|
77
|
-
end
|
78
69
|
end
|
79
70
|
end
|
80
71
|
end
|
@@ -13,12 +13,12 @@ module Decidim
|
|
13
13
|
helper Decidim::Messaging::ConversationHelper
|
14
14
|
|
15
15
|
def edit
|
16
|
-
enforce_permission_to
|
16
|
+
enforce_permission_to(:create, :proposal_answer, proposal:)
|
17
17
|
@form = form(Admin::ProposalAnswerForm).from_model(proposal)
|
18
18
|
end
|
19
19
|
|
20
20
|
def update
|
21
|
-
enforce_permission_to
|
21
|
+
enforce_permission_to(:create, :proposal_answer, proposal:)
|
22
22
|
@notes_form = form(ProposalNoteForm).instance
|
23
23
|
@answer_form = form(Admin::ProposalAnswerForm).from_params(params)
|
24
24
|
|
@@ -8,7 +8,7 @@ module Decidim
|
|
8
8
|
helper_method :proposal
|
9
9
|
|
10
10
|
def create
|
11
|
-
enforce_permission_to
|
11
|
+
enforce_permission_to(:create, :proposal_note, proposal:)
|
12
12
|
@form = form(ProposalNoteForm).from_params(params)
|
13
13
|
|
14
14
|
CreateProposalNote.call(@form, proposal) do
|
@@ -122,12 +122,12 @@ module Decidim
|
|
122
122
|
end
|
123
123
|
|
124
124
|
def edit
|
125
|
-
enforce_permission_to
|
125
|
+
enforce_permission_to(:edit, :proposal, proposal:)
|
126
126
|
@form = form(Admin::ProposalForm).from_model(proposal)
|
127
127
|
end
|
128
128
|
|
129
129
|
def update
|
130
|
-
enforce_permission_to
|
130
|
+
enforce_permission_to(:edit, :proposal, proposal:)
|
131
131
|
|
132
132
|
@form = form(Admin::ProposalForm).from_params(params)
|
133
133
|
|
@@ -4,12 +4,12 @@ module Decidim
|
|
4
4
|
module Proposals
|
5
5
|
# Exposes Collaborative Drafts resource so users can view and create them.
|
6
6
|
class CollaborativeDraftsController < Decidim::Proposals::ApplicationController
|
7
|
-
helper Decidim::WidgetUrlsHelper
|
8
7
|
helper ProposalWizardHelper
|
9
8
|
helper TooltipHelper
|
10
9
|
helper UserGroupHelper
|
11
10
|
|
12
11
|
include Decidim::ApplicationHelper
|
12
|
+
include Decidim::IconHelper
|
13
13
|
include FormFactory
|
14
14
|
include Flaggable
|
15
15
|
include FilterResource
|
@@ -144,18 +144,12 @@ module Decidim
|
|
144
144
|
def default_filter_params
|
145
145
|
{
|
146
146
|
search_text_cont: "",
|
147
|
-
with_any_category:
|
147
|
+
with_any_category: nil,
|
148
148
|
with_any_state: %w(open),
|
149
|
-
with_any_scope:
|
149
|
+
with_any_scope: nil,
|
150
150
|
related_to: ""
|
151
151
|
}
|
152
152
|
end
|
153
|
-
|
154
|
-
def default_filter_category_params
|
155
|
-
return unless current_component.participatory_space.categories.any?
|
156
|
-
|
157
|
-
["without"] + current_component.participatory_space.categories.map { |category| category.id.to_s }
|
158
|
-
end
|
159
153
|
end
|
160
154
|
end
|
161
155
|
end
|
@@ -12,7 +12,7 @@ module Decidim
|
|
12
12
|
before_action :authenticate_user!
|
13
13
|
|
14
14
|
def create
|
15
|
-
enforce_permission_to
|
15
|
+
enforce_permission_to(:vote, :proposal, proposal:)
|
16
16
|
@from_proposals_list = params[:from_proposals_list] == "true"
|
17
17
|
|
18
18
|
VoteProposal.call(proposal, current_user) do
|
@@ -24,7 +24,7 @@ module Decidim
|
|
24
24
|
proposal: Proposal.where(component: current_component)
|
25
25
|
).map(&:proposal)
|
26
26
|
|
27
|
-
expose(proposals:
|
27
|
+
expose(proposals:)
|
28
28
|
render :update_buttons_and_counters
|
29
29
|
end
|
30
30
|
|
@@ -35,7 +35,7 @@ module Decidim
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def destroy
|
38
|
-
enforce_permission_to
|
38
|
+
enforce_permission_to(:unvote, :proposal, proposal:)
|
39
39
|
@from_proposals_list = params[:from_proposals_list] == "true"
|
40
40
|
|
41
41
|
UnvoteProposal.call(proposal, current_user) do
|
@@ -4,7 +4,6 @@ module Decidim
|
|
4
4
|
module Proposals
|
5
5
|
# Exposes the proposal resource so users can view and create them.
|
6
6
|
class ProposalsController < Decidim::Proposals::ApplicationController
|
7
|
-
helper Decidim::WidgetUrlsHelper
|
8
7
|
helper ProposalWizardHelper
|
9
8
|
helper ParticipatoryTextsHelper
|
10
9
|
helper UserGroupHelper
|
@@ -15,8 +14,9 @@ module Decidim
|
|
15
14
|
include FilterResource
|
16
15
|
include Decidim::Proposals::Orderable
|
17
16
|
include Paginable
|
17
|
+
include Decidim::AttachmentsHelper
|
18
18
|
|
19
|
-
helper_method :proposal_presenter, :form_presenter
|
19
|
+
helper_method :proposal_presenter, :form_presenter, :tab_panel_items
|
20
20
|
|
21
21
|
before_action :authenticate_user!, only: [:new, :create, :complete]
|
22
22
|
before_action :ensure_is_draft, only: [:compare, :complete, :preview, :publish, :edit_draft, :update_draft, :destroy_draft]
|
@@ -225,23 +225,16 @@ module Decidim
|
|
225
225
|
def default_filter_params
|
226
226
|
{
|
227
227
|
search_text_cont: "",
|
228
|
-
with_any_origin:
|
228
|
+
with_any_origin: nil,
|
229
229
|
activity: "all",
|
230
|
-
with_any_category:
|
230
|
+
with_any_category: nil,
|
231
231
|
with_any_state: %w(accepted evaluating state_not_published),
|
232
|
-
with_any_scope:
|
232
|
+
with_any_scope: nil,
|
233
233
|
related_to: "",
|
234
234
|
type: "all"
|
235
235
|
}
|
236
236
|
end
|
237
237
|
|
238
|
-
def default_filter_origin_params
|
239
|
-
filter_origin_params = %w(participants meeting)
|
240
|
-
filter_origin_params << "official" if component_settings.official_proposals_enabled
|
241
|
-
filter_origin_params << "user_group" if current_organization.user_groups_enabled?
|
242
|
-
filter_origin_params
|
243
|
-
end
|
244
|
-
|
245
238
|
def proposal_draft
|
246
239
|
Proposal.from_all_author_identities(current_user).not_hidden.only_amendables
|
247
240
|
.where(component: current_component).find_by(published_at: nil)
|
@@ -303,6 +296,43 @@ module Decidim
|
|
303
296
|
def proposal_creation_params
|
304
297
|
params[:proposal].merge(body_template: translated_proposal_body_template)
|
305
298
|
end
|
299
|
+
|
300
|
+
def tab_panel_items
|
301
|
+
@tab_panel_items ||= [
|
302
|
+
{
|
303
|
+
enabled: @proposal.linked_resources(:projects, "included_proposals").present?,
|
304
|
+
id: "included_projects",
|
305
|
+
text: t("decidim/budgets/project", scope: "activerecord.models", count: 2),
|
306
|
+
icon: resource_type_icon_key("Decidim::Budgets::Project"),
|
307
|
+
method: :cell,
|
308
|
+
args: ["decidim/linked_resources_for", @proposal, { type: :projects, link_name: "included_proposals" }]
|
309
|
+
},
|
310
|
+
{
|
311
|
+
enabled: @proposal.linked_resources(:results, "included_proposals").present?,
|
312
|
+
id: "included_results",
|
313
|
+
text: t("decidim/accountability/result", scope: "activerecord.models", count: 2),
|
314
|
+
icon: resource_type_icon_key("Decidim::Accountability::Result"),
|
315
|
+
method: :cell,
|
316
|
+
args: ["decidim/linked_resources_for", @proposal, { type: :results, link_name: "included_proposals" }]
|
317
|
+
},
|
318
|
+
{
|
319
|
+
enabled: @proposal.linked_resources(:meetings, "proposals_from_meeting").present?,
|
320
|
+
id: "included_meetings",
|
321
|
+
text: t("decidim/meetings/meeting", scope: "activerecord.models", count: 2),
|
322
|
+
icon: resource_type_icon_key("Decidim::Meetings::Meeting"),
|
323
|
+
method: :cell,
|
324
|
+
args: ["decidim/linked_resources_for", @proposal, { type: :meetings, link_name: "proposals_from_meeting" }]
|
325
|
+
},
|
326
|
+
{
|
327
|
+
enabled: @proposal.linked_resources(:proposals, "copied_from_component").present?,
|
328
|
+
id: "included_proposals",
|
329
|
+
text: t("decidim/proposals/proposal", scope: "activerecord.models", count: 2),
|
330
|
+
icon: resource_type_icon_key("Decidim::Proposals::Proposal"),
|
331
|
+
method: :cell,
|
332
|
+
args: ["decidim/linked_resources_for", @proposal, { type: :proposals, link_name: "copied_from_component" }]
|
333
|
+
}
|
334
|
+
] + attachments_tab_panel_items(@proposal)
|
335
|
+
end
|
306
336
|
end
|
307
337
|
end
|
308
338
|
end
|
@@ -21,7 +21,7 @@ module Decidim
|
|
21
21
|
validates :document, presence: true, if: :new_participatory_text?
|
22
22
|
validate :document_type_must_be_valid, if: :document
|
23
23
|
|
24
|
-
# Assume it
|
24
|
+
# Assume it is a NEW participatory_text if there are no proposals
|
25
25
|
# Validate document presence while CREATING proposals from document
|
26
26
|
# Allow skipping document validation while UPDATING title/description
|
27
27
|
def new_participatory_text?
|
@@ -101,7 +101,7 @@ module Decidim
|
|
101
101
|
end
|
102
102
|
|
103
103
|
def suggested_hashtags
|
104
|
-
downcased_suggested_hashtags = super.
|
104
|
+
downcased_suggested_hashtags = super.to_set(&:downcase)
|
105
105
|
component_suggested_hashtags.select { |hashtag| downcased_suggested_hashtags.member?(hashtag.downcase) }
|
106
106
|
end
|
107
107
|
|
@@ -119,7 +119,7 @@ module Decidim
|
|
119
119
|
|
120
120
|
private
|
121
121
|
|
122
|
-
# This method will add an error to the `attachment` field only if there
|
122
|
+
# This method will add an error to the `attachment` field only if there is
|
123
123
|
# any error in any other field. This is needed because when the form has
|
124
124
|
# an error, the attachment is lost, so we need a way to inform the user of
|
125
125
|
# this problem.
|
@@ -21,7 +21,7 @@ module Decidim
|
|
21
21
|
presenter = ProposalPresenter.new(model)
|
22
22
|
|
23
23
|
self.title = presenter.title(all_locales: title.is_a?(Hash))
|
24
|
-
self.body = presenter.
|
24
|
+
self.body = presenter.editor_body(all_locales: body.is_a?(Hash))
|
25
25
|
self.attachment = if model.documents.first.present?
|
26
26
|
{ file: model.documents.first.file, title: translated_attribute(model.documents.first.title) }
|
27
27
|
else
|
@@ -53,7 +53,7 @@ module Decidim
|
|
53
53
|
|
54
54
|
# Private: Returns the id of the target component.
|
55
55
|
#
|
56
|
-
# We receive this as ["id"] since it
|
56
|
+
# We receive this as ["id"] since it is from a select in a form.
|
57
57
|
def clean_target_component_id
|
58
58
|
target_component_id.first
|
59
59
|
end
|
@@ -17,7 +17,7 @@ module Decidim
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def valuator_role
|
20
|
-
@valuator_role ||= current_component.participatory_space.user_roles(:valuator).find_by(id:
|
20
|
+
@valuator_role ||= current_component.participatory_space.user_roles(:valuator).find_by(id:)
|
21
21
|
end
|
22
22
|
|
23
23
|
def valuator_user
|
@@ -15,15 +15,12 @@ module Decidim
|
|
15
15
|
attribute :longitude, Float
|
16
16
|
attribute :category_id, Integer
|
17
17
|
attribute :scope_id, Integer
|
18
|
-
attribute :has_address, Boolean
|
19
18
|
attribute :attachment, AttachmentForm
|
20
19
|
attribute :suggested_hashtags, Array[String]
|
21
20
|
|
22
|
-
attachments_attribute :photos
|
23
21
|
attachments_attribute :documents
|
24
22
|
|
25
23
|
validates :address, geocoding: true, if: ->(form) { form.has_address? && !form.geocoded? }
|
26
|
-
validates :address, presence: true, if: ->(form) { form.has_address? }
|
27
24
|
validates :category, presence: true, if: ->(form) { form.category_id.present? }
|
28
25
|
validates :scope, presence: true, if: ->(form) { form.scope_id.present? }
|
29
26
|
validates :scope_id, scope_belongs_to_component: true, if: ->(form) { form.scope_id.present? }
|
@@ -37,17 +34,14 @@ module Decidim
|
|
37
34
|
body = translated_attribute(model.body)
|
38
35
|
@suggested_hashtags = Decidim::ContentRenderers::HashtagRenderer.new(body).extra_hashtags.map(&:name).map(&:downcase)
|
39
36
|
|
37
|
+
presenter = ProposalPresenter.new(model)
|
38
|
+
self.body = presenter.editor_body(all_locales: body.is_a?(Hash))
|
39
|
+
|
40
40
|
# The scope attribute is with different key (decidim_scope_id), so it
|
41
41
|
# has to be manually mapped.
|
42
42
|
self.scope_id = model.scope.id if model.scope
|
43
43
|
|
44
|
-
self.
|
45
|
-
|
46
|
-
# Proposals have the "photos" field reserved for the proposal card image
|
47
|
-
# so we don't want to show all photos there. Instead, only show the
|
48
|
-
# first photo.
|
49
|
-
self.photos = [model.photo].compact.select { |p| p.weight.zero? }
|
50
|
-
self.documents = model.attachments - photos
|
44
|
+
self.documents = model.attachments
|
51
45
|
end
|
52
46
|
|
53
47
|
# Finds the Category from the category_id.
|
@@ -75,15 +69,7 @@ module Decidim
|
|
75
69
|
Decidim::Map.available?(:geocoding) && current_component.settings.geocoding_enabled?
|
76
70
|
end
|
77
71
|
|
78
|
-
def address
|
79
|
-
return unless has_address
|
80
|
-
|
81
|
-
super
|
82
|
-
end
|
83
|
-
|
84
72
|
def has_address?
|
85
|
-
return unless has_address
|
86
|
-
|
87
73
|
geocoding_enabled? && address.present?
|
88
74
|
end
|
89
75
|
|
@@ -96,7 +82,7 @@ module Decidim
|
|
96
82
|
end
|
97
83
|
|
98
84
|
def suggested_hashtags
|
99
|
-
downcased_suggested_hashtags = super.
|
85
|
+
downcased_suggested_hashtags = super.to_set(&:downcase)
|
100
86
|
component_suggested_hashtags.select { |hashtag| downcased_suggested_hashtags.member?(hashtag.downcase) }
|
101
87
|
end
|
102
88
|
|
@@ -114,15 +100,11 @@ module Decidim
|
|
114
100
|
|
115
101
|
private
|
116
102
|
|
117
|
-
# This method will add an error to the
|
118
|
-
#
|
119
|
-
#
|
120
|
-
# this problem.
|
103
|
+
# This method will add an error to the "add_documents" field only if there is any error
|
104
|
+
# in any other field. This is needed because when the form has an error, the attachment
|
105
|
+
# is lost, so we need a way to inform the user of this problem.
|
121
106
|
def notify_missing_attachment_if_errored
|
122
|
-
if errors.any?
|
123
|
-
errors.add(:add_photos, :needs_to_be_reattached) if add_photos.present?
|
124
|
-
errors.add(:add_documents, :needs_to_be_reattached) if add_documents.present?
|
125
|
-
end
|
107
|
+
errors.add(:add_documents, :needs_to_be_reattached) if errors.any? && add_documents.present?
|
126
108
|
end
|
127
109
|
|
128
110
|
def ordered_hashtag_list(string)
|
@@ -16,7 +16,7 @@ module Decidim
|
|
16
16
|
# Returns a String.
|
17
17
|
def bulk_valuators_select(participatory_space, prompt)
|
18
18
|
options_for_select = find_valuators_for_select(participatory_space)
|
19
|
-
select(:valuator_role, :id, options_for_select, prompt:
|
19
|
+
select(:valuator_role, :id, options_for_select, prompt:)
|
20
20
|
end
|
21
21
|
|
22
22
|
# Internal: A method to cache to queries to find the valuators for the
|