decidim-proposals 0.28.5 → 0.29.0.rc1
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/README.md +1 -18
- data/app/cells/decidim/proposals/cost_report_cell.rb +0 -3
- data/app/cells/decidim/proposals/highlighted_proposals_for_component/show.erb +11 -11
- data/app/cells/decidim/proposals/highlighted_proposals_for_component_cell.rb +1 -1
- data/app/cells/decidim/proposals/participatory_text_proposal/buttons.erb +1 -1
- data/app/cells/decidim/proposals/participatory_text_proposal_cell.rb +2 -3
- data/app/cells/decidim/proposals/proposal_cell.rb +2 -0
- data/app/cells/decidim/proposals/proposal_g/show.erb +23 -0
- data/app/cells/decidim/proposals/proposal_g_cell.rb +48 -0
- data/app/cells/decidim/proposals/proposal_l_cell.rb +18 -19
- data/app/cells/decidim/proposals/proposal_metadata_cell.rb +23 -15
- data/app/commands/decidim/proposals/admin/answer_proposal.rb +2 -1
- data/app/commands/decidim/proposals/admin/assign_proposals_to_valuator.rb +7 -5
- data/app/commands/decidim/proposals/admin/create_proposal.rb +4 -6
- data/app/commands/decidim/proposals/admin/create_proposal_state.rb +15 -0
- data/app/commands/decidim/proposals/admin/destroy_proposal_state.rb +10 -0
- data/app/commands/decidim/proposals/admin/import_proposals.rb +10 -2
- data/app/commands/decidim/proposals/admin/notify_proposal_answer.rb +4 -21
- data/app/commands/decidim/proposals/admin/unassign_proposals_from_valuator.rb +6 -4
- data/app/commands/decidim/proposals/admin/update_proposal_state.rb +13 -0
- data/app/commands/decidim/proposals/create_proposal.rb +21 -2
- data/app/commands/decidim/proposals/update_proposal.rb +2 -2
- data/app/commands/decidim/proposals/vote_proposal.rb +1 -1
- data/app/commands/decidim/proposals/withdraw_proposal.rb +3 -7
- data/app/controllers/concerns/decidim/proposals/admin/filterable.rb +10 -22
- data/app/controllers/decidim/proposals/admin/proposal_states_controller.rb +86 -0
- data/app/controllers/decidim/proposals/admin/proposals_controller.rb +4 -0
- data/app/controllers/decidim/proposals/admin/valuation_assignments_controller.rb +8 -11
- data/app/controllers/decidim/proposals/proposals_controller.rb +38 -39
- data/app/events/decidim/proposals/proposal_state_changed_event.rb +37 -0
- data/app/forms/decidim/proposals/admin/proposal_answer_form.rb +8 -4
- data/app/forms/decidim/proposals/admin/proposal_form.rb +1 -1
- data/app/forms/decidim/proposals/admin/proposal_state_form.rb +22 -0
- data/app/forms/decidim/proposals/admin/proposals_fork_form.rb +1 -1
- data/app/forms/decidim/proposals/admin/proposals_import_form.rb +1 -1
- data/app/forms/decidim/proposals/admin/valuation_assignment_form.rb +12 -14
- data/app/forms/decidim/proposals/proposal_form.rb +25 -4
- data/app/forms/decidim/proposals/reject_access_to_collaborative_draft_form.rb +1 -1
- data/app/forms/decidim/proposals/request_access_to_collaborative_draft_form.rb +1 -1
- data/app/helpers/decidim/proposals/admin/proposal_bulk_actions_helper.rb +7 -17
- data/app/helpers/decidim/proposals/admin/proposals_helper.rb +13 -89
- data/app/helpers/decidim/proposals/application_helper.rb +16 -10
- data/app/helpers/decidim/proposals/map_helper.rb +1 -1
- data/app/helpers/decidim/proposals/proposal_cells_helper.rb +6 -2
- data/app/helpers/decidim/proposals/proposal_votes_helper.rb +3 -3
- data/app/helpers/decidim/proposals/proposal_wizard_helper.rb +5 -8
- data/app/helpers/decidim/proposals/proposals_helper.rb +18 -24
- data/app/models/decidim/proposals/proposal.rb +83 -29
- data/app/models/decidim/proposals/proposal_state.rb +58 -0
- data/app/packs/documents/decidim/proposals/participatory_texts/participatory_text.md +1 -3
- data/app/packs/images/decidim/proposals/proposal-placeholder-card-g.svg +15 -0
- data/app/packs/src/decidim/proposals/add_proposal.js +2 -0
- data/app/packs/src/decidim/proposals/admin/proposals.js +43 -8
- data/app/packs/stylesheets/decidim/proposals/proposals.scss +39 -1
- data/app/permissions/decidim/proposals/admin/permissions.rb +16 -4
- data/app/permissions/decidim/proposals/permissions.rb +3 -4
- data/app/presenters/decidim/proposals/admin_log/proposal_state_presenter.rb +21 -0
- data/app/presenters/decidim/proposals/proposal_presenter.rb +12 -3
- data/app/queries/decidim/proposals/metrics/endorsements_metric_manage.rb +1 -1
- data/app/queries/decidim/proposals/metrics/proposal_followers_metric_measure.rb +1 -1
- data/app/queries/decidim/proposals/metrics/proposal_participants_metric_measure.rb +4 -4
- data/app/queries/decidim/proposals/metrics/proposals_metric_manage.rb +1 -1
- data/app/queries/decidim/proposals/metrics/votes_metric_manage.rb +1 -1
- data/app/services/decidim/proposals/diff_renderer.rb +1 -3
- data/app/services/decidim/proposals/proposal_builder.rb +1 -1
- data/app/views/decidim/proposals/admin/imports/_proposals_fields.html.erb +1 -1
- data/app/views/decidim/proposals/admin/participatory_texts/index.html.erb +3 -2
- data/app/views/decidim/proposals/admin/proposal_answers/_form.html.erb +2 -2
- data/app/views/decidim/proposals/admin/proposal_notes/_proposal_notes.html.erb +3 -3
- data/app/views/decidim/proposals/admin/proposal_states/_form.html.erb +67 -0
- data/app/views/decidim/proposals/admin/proposal_states/edit.html.erb +18 -0
- data/app/views/decidim/proposals/admin/proposal_states/index.html.erb +50 -0
- data/app/views/decidim/proposals/admin/proposal_states/new.html.erb +18 -0
- data/app/views/decidim/proposals/admin/proposals/_bulk-actions.html.erb +6 -12
- data/app/views/decidim/proposals/admin/proposals/_form.html.erb +6 -6
- data/app/views/decidim/proposals/admin/proposals/_proposal-tr.html.erb +2 -2
- data/app/views/decidim/proposals/admin/proposals/bulk_actions/_assign_to_valuator.html.erb +11 -7
- data/app/views/decidim/proposals/admin/proposals/bulk_actions/_dropdown.html.erb +7 -5
- data/app/views/decidim/proposals/admin/proposals/bulk_actions/_merge.html.erb +2 -2
- data/app/views/decidim/proposals/admin/proposals/bulk_actions/_publish_answers.html.erb +2 -2
- data/app/views/decidim/proposals/admin/proposals/bulk_actions/_recategorize.html.erb +2 -2
- data/app/views/decidim/proposals/admin/proposals/bulk_actions/_scope-change.html.erb +2 -2
- data/app/views/decidim/proposals/admin/proposals/bulk_actions/_split.html.erb +2 -2
- data/app/views/decidim/proposals/admin/proposals/bulk_actions/_unassign_from_valuator.html.erb +11 -7
- data/app/views/decidim/proposals/admin/proposals/bulk_actions/_valuators_picker.html.erb +12 -0
- data/app/views/decidim/proposals/admin/proposals/index.html.erb +11 -7
- data/app/views/decidim/proposals/admin/proposals/publish_answers.js.erb +1 -1
- data/app/views/decidim/proposals/admin/proposals/show.html.erb +3 -2
- data/app/views/decidim/proposals/admin/proposals/update_attribute.js.erb +3 -3
- data/app/views/decidim/proposals/proposals/_edit_form_fields.html.erb +12 -5
- data/app/views/decidim/proposals/proposals/_proposal.html.erb +1 -1
- data/app/views/decidim/proposals/proposals/_proposal_aside.html.erb +1 -1
- data/app/views/decidim/proposals/proposals/_proposals.html.erb +9 -3
- data/app/views/decidim/proposals/proposals/_vote_button.html.erb +1 -1
- data/app/views/decidim/proposals/proposals/_voting_rules.html.erb +3 -3
- data/app/views/decidim/proposals/proposals/_wizard_header.html.erb +0 -1
- data/app/views/decidim/proposals/proposals/index.html.erb +1 -1
- data/app/views/decidim/proposals/proposals/index.js.erb +0 -12
- data/app/views/decidim/proposals/proposals/new.html.erb +2 -7
- data/app/views/decidim/proposals/proposals/participatory_texts/_proposal_vote_button.html.erb +4 -4
- data/app/views/decidim/proposals/proposals/participatory_texts/_proposal_votes_count.html.erb +8 -8
- data/app/views/decidim/proposals/proposals/preview.html.erb +1 -1
- data/app/views/decidim/proposals/proposals/show.html.erb +3 -3
- data/config/locales/ar.yml +9 -115
- data/config/locales/bg.yml +117 -111
- data/config/locales/ca.yml +86 -83
- data/config/locales/cs.yml +65 -127
- data/config/locales/de.yml +128 -125
- data/config/locales/el.yml +8 -121
- data/config/locales/en.yml +110 -107
- data/config/locales/es-MX.yml +85 -82
- data/config/locales/es-PY.yml +88 -85
- data/config/locales/es.yml +83 -80
- data/config/locales/eu.yml +166 -170
- data/config/locales/fi-plain.yml +90 -87
- data/config/locales/fi.yml +139 -136
- data/config/locales/fr-CA.yml +92 -87
- data/config/locales/fr.yml +83 -78
- data/config/locales/ga-IE.yml +1 -27
- data/config/locales/gl.yml +11 -107
- data/config/locales/he-IL.yml +0 -17
- data/config/locales/hu.yml +18 -90
- data/config/locales/id-ID.yml +6 -106
- data/config/locales/is-IS.yml +8 -33
- data/config/locales/it.yml +14 -103
- data/config/locales/ja.yml +117 -112
- data/config/locales/lb.yml +1 -0
- data/config/locales/lt.yml +6 -123
- data/config/locales/lv.yml +4 -101
- data/config/locales/nl.yml +11 -102
- data/config/locales/no.yml +7 -108
- data/config/locales/pl.yml +110 -115
- data/config/locales/pt-BR.yml +10 -84
- data/config/locales/pt.yml +9 -109
- data/config/locales/ro-RO.yml +15 -117
- data/config/locales/ru.yml +9 -53
- data/config/locales/sk.yml +5 -109
- data/config/locales/sl.yml +4 -0
- data/config/locales/sv.yml +142 -337
- data/config/locales/tr-TR.yml +64 -108
- data/config/locales/uk.yml +11 -55
- data/config/locales/zh-CN.yml +5 -100
- data/config/locales/zh-TW.yml +8 -119
- data/db/migrate/20240110203500_add_withdrawn_at_field_to_proposals.rb +27 -0
- data/db/migrate/20240110203501_create_decidim_proposals_proposal_state.rb +14 -0
- data/db/migrate/20240110203502_add_state_id_to_decidim_proposals_proposals.rb +13 -0
- data/db/migrate/20240110203503_remove_state_from_decidim_proposals_proposals.rb +11 -0
- data/db/migrate/20240110203504_create_default_proposal_states.rb +31 -0
- data/db/migrate/20240209092404_change_color_fields_on_proposals_states.rb +54 -0
- data/decidim-proposals.gemspec +3 -3
- data/lib/decidim/api/proposal_type.rb +4 -13
- data/lib/decidim/api/proposals_type.rb +3 -1
- data/lib/decidim/proposals/admin_engine.rb +8 -0
- data/lib/decidim/proposals/admin_filter.rb +37 -0
- data/lib/decidim/proposals/component.rb +8 -5
- data/lib/decidim/proposals/engine.rb +1 -15
- data/lib/decidim/proposals/import/proposal_answer_creator.rb +6 -6
- data/lib/decidim/proposals/import/proposal_creator.rb +1 -1
- data/lib/decidim/proposals/markdown_to_proposals.rb +2 -8
- data/lib/decidim/proposals/proposal_serializer.rb +8 -9
- data/lib/decidim/proposals/seeds.rb +60 -51
- data/lib/decidim/proposals/test/factories.rb +69 -14
- data/lib/decidim/proposals/version.rb +1 -1
- data/lib/decidim/proposals.rb +84 -12
- data/lib/tasks/proposals/upgrade/{decdim_proposals_upgrade_tasks.rake → decidim_proposals_upgrade_tasks.rake} +0 -13
- metadata +51 -40
- data/app/events/decidim/proposals/accepted_proposal_event.rb +0 -17
- data/app/events/decidim/proposals/evaluating_proposal_event.rb +0 -11
- data/app/events/decidim/proposals/rejected_proposal_event.rb +0 -17
- data/app/forms/decidim/proposals/proposal_wizard_create_step_form.rb +0 -44
- data/app/queries/decidim/proposals/similar_proposals.rb +0 -67
- data/app/services/decidim/proposals/collaborative_draft_diff_renderer.rb +0 -22
- data/app/views/decidim/proposals/proposals/_endorsements_card_row.html.erb +0 -0
- data/app/views/decidim/proposals/proposals/_proposal_badge.html.erb +0 -3
- data/app/views/decidim/proposals/proposals/compare.html.erb +0 -24
- data/app/views/decidim/proposals/proposals/complete.html.erb +0 -31
- data/config/locales/bn-BD.yml +0 -1
- data/config/locales/bs-BA.yml +0 -100
@@ -2,6 +2,8 @@
|
|
2
2
|
/* eslint no-unused-vars: 0 */
|
3
3
|
/* eslint id-length: ["error", { "exceptions": ["e"] }] */
|
4
4
|
|
5
|
+
import TomSelect from "tom-select/dist/cjs/tom-select.popular";
|
6
|
+
|
5
7
|
$(() => {
|
6
8
|
const selectedProposalsCount = function() {
|
7
9
|
return $(".table-list .js-check-all-proposal:checked").length
|
@@ -16,6 +18,8 @@ $(() => {
|
|
16
18
|
const selectedProposalsNotPublishedAnswer = selectedProposalsNotPublishedAnswerCount();
|
17
19
|
if (selectedProposals === 0) {
|
18
20
|
$("#js-selected-proposals-count").text("")
|
21
|
+
$("#js-assign-proposals-to-valuator-actions").addClass("hide");
|
22
|
+
$("#js-unassign-proposals-from-valuator-actions").addClass("hide");
|
19
23
|
} else {
|
20
24
|
$("#js-selected-proposals-count").text(selectedProposals);
|
21
25
|
}
|
@@ -65,7 +69,7 @@ $(() => {
|
|
65
69
|
$(".js-bulk-action-form").addClass("hide");
|
66
70
|
}
|
67
71
|
|
68
|
-
// Expose functions to make them
|
72
|
+
// Expose functions to make them available in .js.erb templates
|
69
73
|
window.selectedProposalsCount = selectedProposalsCount;
|
70
74
|
window.selectedProposalsNotPublishedAnswerCount = selectedProposalsNotPublishedAnswerCount;
|
71
75
|
window.selectedProposalsCountUpdate = selectedProposalsCountUpdate;
|
@@ -80,20 +84,36 @@ $(() => {
|
|
80
84
|
hideBulkActionForms();
|
81
85
|
$("#js-bulk-actions-button").addClass("hide");
|
82
86
|
|
83
|
-
$("#js-bulk-actions-dropdown ul li button").click(function(e) {
|
84
|
-
|
87
|
+
$("#js-bulk-actions-dropdown ul li button").click(function (e) {
|
88
|
+
$("#js-bulk-actions-dropdown").removeClass("is-open");
|
89
|
+
hideBulkActionForms();
|
90
|
+
|
85
91
|
let action = $(e.target).data("action");
|
92
|
+
const panelActions = [
|
93
|
+
"assign-proposals-to-valuator",
|
94
|
+
"unassign-proposals-from-valuator"
|
95
|
+
];
|
86
96
|
|
87
|
-
if (action) {
|
88
|
-
|
89
|
-
|
90
|
-
|
97
|
+
if (!action) {
|
98
|
+
return;
|
99
|
+
}
|
100
|
+
|
101
|
+
if (panelActions.includes(action)) {
|
102
|
+
$(`#js-form-${action}`).submit(function () {
|
103
|
+
$(".layout-content > div[data-callout-wrapper]").html("");
|
104
|
+
});
|
105
|
+
|
106
|
+
$(`#js-${action}-actions`).removeClass("hide");
|
107
|
+
} else {
|
108
|
+
$(`#js-form-${action}`).submit(function () {
|
109
|
+
$(".layout-content > div[data-callout-wrapper]").html("");
|
110
|
+
});
|
91
111
|
|
92
112
|
$(`#js-${action}-actions`).removeClass("hide");
|
93
113
|
hideBulkActionsButton(true);
|
94
114
|
hideOtherActionsButtons();
|
95
115
|
}
|
96
|
-
})
|
116
|
+
});
|
97
117
|
|
98
118
|
// select all checkboxes
|
99
119
|
$(".js-check-all").change(function() {
|
@@ -148,3 +168,18 @@ $(() => {
|
|
148
168
|
});
|
149
169
|
}
|
150
170
|
});
|
171
|
+
|
172
|
+
document.addEventListener("DOMContentLoaded", () => {
|
173
|
+
const valuatorMultiselectContainers = document.querySelectorAll(
|
174
|
+
".js-valuator-multiselect"
|
175
|
+
);
|
176
|
+
|
177
|
+
valuatorMultiselectContainers.forEach((container) => {
|
178
|
+
const config = {
|
179
|
+
plugins: ["remove_button", "dropdown_input"],
|
180
|
+
allowEmptyOption: true
|
181
|
+
};
|
182
|
+
|
183
|
+
return new TomSelect(container, config);
|
184
|
+
});
|
185
|
+
});
|
@@ -24,7 +24,7 @@
|
|
24
24
|
|
25
25
|
&__aside {
|
26
26
|
&-vote {
|
27
|
-
@apply flex flex-row-reverse md:flex-col gap-4 items-center md:items-stretch justify-
|
27
|
+
@apply flex flex-row-reverse md:flex-col gap-4 items-center md:items-stretch justify-around md:last:[&>*]:w-auto;
|
28
28
|
}
|
29
29
|
}
|
30
30
|
|
@@ -77,6 +77,44 @@
|
|
77
77
|
}
|
78
78
|
}
|
79
79
|
|
80
|
+
#proposals {
|
81
|
+
.view-layout__links {
|
82
|
+
@apply flex gap-4 items-center;
|
83
|
+
|
84
|
+
svg {
|
85
|
+
@apply inline-block w-5 h-5;
|
86
|
+
|
87
|
+
&.view-icon--disabled {
|
88
|
+
@apply fill-gray;
|
89
|
+
}
|
90
|
+
}
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
94
|
+
.card {
|
95
|
+
&__proposal-placeholder-g {
|
96
|
+
@apply w-full h-full fill-primary;
|
97
|
+
|
98
|
+
g {
|
99
|
+
path {
|
100
|
+
@apply fill-primary;
|
101
|
+
}
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
&__grid-text-title {
|
106
|
+
@apply flex justify-between flex-row md:flex-col md:items-start lg:flex-row lg:items-center;
|
107
|
+
|
108
|
+
.label {
|
109
|
+
@apply md:mt-2;
|
110
|
+
}
|
111
|
+
}
|
112
|
+
|
113
|
+
&__list-metadata {
|
114
|
+
@apply md:flex md:flex-row md:items-center md:gap-4;
|
115
|
+
}
|
116
|
+
}
|
117
|
+
|
80
118
|
/* overwrite tom-select defaults */
|
81
119
|
.ts {
|
82
120
|
&-control {
|
@@ -13,9 +13,9 @@ module Decidim
|
|
13
13
|
if valuator_assigned_to_proposal?
|
14
14
|
can_create_proposal_note?
|
15
15
|
can_create_proposal_answer?
|
16
|
+
can_assign_valuator_to_proposal?
|
16
17
|
end
|
17
18
|
can_export_proposals?
|
18
|
-
valuator_can_unassign_valuator_from_proposals?
|
19
19
|
|
20
20
|
return permission_action
|
21
21
|
end
|
@@ -49,7 +49,7 @@ module Decidim
|
|
49
49
|
allow! if permission_action.subject == :proposals && permission_action.action == :split
|
50
50
|
|
51
51
|
# Every user allowed by the space can assign proposals to a valuator
|
52
|
-
|
52
|
+
can_assign_valuator_to_proposal?
|
53
53
|
|
54
54
|
# Every user allowed by the space can unassign a valuator from proposals
|
55
55
|
can_unassign_valuator_from_proposals?
|
@@ -62,11 +62,23 @@ module Decidim
|
|
62
62
|
allow!
|
63
63
|
end
|
64
64
|
|
65
|
+
if permission_action.subject == :proposal_state
|
66
|
+
if permission_action.action == :destroy
|
67
|
+
toggle_allow(proposal_state.proposals.empty?)
|
68
|
+
else
|
69
|
+
allow!
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
65
73
|
permission_action
|
66
74
|
end
|
67
75
|
|
68
76
|
private
|
69
77
|
|
78
|
+
def proposal_state
|
79
|
+
@state ||= context.fetch(:proposal_state, nil)
|
80
|
+
end
|
81
|
+
|
70
82
|
def proposal
|
71
83
|
@proposal ||= context.fetch(:proposal, nil)
|
72
84
|
end
|
@@ -137,8 +149,8 @@ module Decidim
|
|
137
149
|
allow! if permission_action.subject == :proposals && permission_action.action == :unassign_from_valuator
|
138
150
|
end
|
139
151
|
|
140
|
-
def
|
141
|
-
|
152
|
+
def can_assign_valuator_to_proposal?
|
153
|
+
allow! if permission_action.subject == :proposals && permission_action.action == :assign_to_valuator
|
142
154
|
end
|
143
155
|
|
144
156
|
def can_export_proposals?
|
@@ -4,16 +4,15 @@ module Decidim
|
|
4
4
|
module Proposals
|
5
5
|
class Permissions < Decidim::DefaultPermissions
|
6
6
|
def permissions
|
7
|
+
return permission_action unless user
|
8
|
+
|
7
9
|
# Delegate the admin permission checks to the admin permissions class
|
8
10
|
return Decidim::Proposals::Admin::Permissions.new(user, permission_action, context).permissions if permission_action.scope == :admin
|
9
11
|
return permission_action if permission_action.scope != :public
|
10
12
|
|
11
|
-
toggle_allow(!proposal.hidden?) if permission_action.subject == :proposal && permission_action.action == :read
|
12
|
-
return permission_action unless user
|
13
|
-
|
14
13
|
case permission_action.subject
|
15
14
|
when :proposal
|
16
|
-
apply_proposal_permissions(permission_action)
|
15
|
+
apply_proposal_permissions(permission_action)
|
17
16
|
when :collaborative_draft
|
18
17
|
apply_collaborative_draft_permissions(permission_action)
|
19
18
|
else
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Proposals
|
5
|
+
module AdminLog
|
6
|
+
class ProposalStatePresenter < Decidim::Log::BasePresenter
|
7
|
+
private
|
8
|
+
|
9
|
+
def diff_fields_mapping
|
10
|
+
{
|
11
|
+
title: :i18n,
|
12
|
+
default: :boolean,
|
13
|
+
token: :string,
|
14
|
+
description: :i18n,
|
15
|
+
css_class: :string
|
16
|
+
}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -69,10 +69,10 @@ module Decidim
|
|
69
69
|
version_state_published = state_published_change.last.present? if state_published_change
|
70
70
|
|
71
71
|
if version_state_published
|
72
|
-
version.changeset["
|
72
|
+
version.changeset["decidim_proposals_proposal_state_id"] = parsed_state_change(*pending_state_change) if pending_state_change
|
73
73
|
pending_state_change = nil
|
74
|
-
elsif version.changeset["
|
75
|
-
pending_state_change = version.changeset.delete("
|
74
|
+
elsif version.changeset["decidim_proposals_proposal_state_id"]
|
75
|
+
pending_state_change = version.changeset.delete("decidim_proposals_proposal_state_id")
|
76
76
|
end
|
77
77
|
|
78
78
|
next if version.event == "update" && Decidim::Proposals::DiffRenderer.new(version).diff.empty?
|
@@ -86,6 +86,15 @@ module Decidim
|
|
86
86
|
def resource_manifest
|
87
87
|
proposal.class.resource_manifest
|
88
88
|
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
def parsed_state_change(old_state, new_state)
|
93
|
+
[
|
94
|
+
translated_attribute(Decidim::Proposals::ProposalState.find_by(id: old_state)&.title),
|
95
|
+
translated_attribute(Decidim::Proposals::ProposalState.find_by(id: new_state)&.title)
|
96
|
+
]
|
97
|
+
end
|
89
98
|
end
|
90
99
|
end
|
91
100
|
end
|
@@ -29,7 +29,7 @@ module Decidim
|
|
29
29
|
return @query if @query
|
30
30
|
|
31
31
|
components = Decidim::Component.where(participatory_space: retrieve_participatory_spaces).published
|
32
|
-
proposals = Decidim::Proposals::Proposal.where(component: components).
|
32
|
+
proposals = Decidim::Proposals::Proposal.where(component: components).not_withdrawn
|
33
33
|
join_components = "INNER JOIN decidim_components ON decidim_components.manifest_name = 'proposals' AND proposals.decidim_component_id = decidim_components.id"
|
34
34
|
join_categories = <<~EOJOINCATS
|
35
35
|
LEFT OUTER JOIN decidim_categorizations
|
@@ -5,7 +5,7 @@ module Decidim
|
|
5
5
|
module Metrics
|
6
6
|
# Searches for Participants in the following actions
|
7
7
|
# - Create a proposal (Proposals)
|
8
|
-
# -
|
8
|
+
# - Vote to a proposal (Proposals)
|
9
9
|
# - Endorse (Proposals)
|
10
10
|
class ProposalParticipantsMetricMeasure < Decidim::MetricMeasure
|
11
11
|
def valid?
|
@@ -16,12 +16,12 @@ module Decidim
|
|
16
16
|
cumulative_users = []
|
17
17
|
cumulative_users |= retrieve_votes.pluck(:decidim_author_id)
|
18
18
|
cumulative_users |= retrieve_endorsements.pluck(:decidim_author_id)
|
19
|
-
cumulative_users |= retrieve_proposals.pluck("decidim_coauthorships.decidim_author_id") # To avoid
|
19
|
+
cumulative_users |= retrieve_proposals.pluck("decidim_coauthorships.decidim_author_id") # To avoid ambiguousness must be called this way
|
20
20
|
|
21
21
|
quantity_users = []
|
22
22
|
quantity_users |= retrieve_votes(from_start: true).pluck(:decidim_author_id)
|
23
23
|
quantity_users |= retrieve_endorsements(from_start: true).pluck(:decidim_author_id)
|
24
|
-
quantity_users |= retrieve_proposals(from_start: true).pluck("decidim_coauthorships.decidim_author_id") # To avoid
|
24
|
+
quantity_users |= retrieve_proposals(from_start: true).pluck("decidim_coauthorships.decidim_author_id") # To avoid ambiguousness must be called this way
|
25
25
|
|
26
26
|
{
|
27
27
|
cumulative_users: cumulative_users.uniq,
|
@@ -42,7 +42,7 @@ module Decidim
|
|
42
42
|
]
|
43
43
|
})
|
44
44
|
.where("decidim_proposals_proposals.published_at <= ?", end_time)
|
45
|
-
.
|
45
|
+
.not_withdrawn
|
46
46
|
|
47
47
|
return @proposals.where("decidim_proposals_proposals.published_at >= ?", start_time) if from_start
|
48
48
|
|
@@ -32,7 +32,7 @@ module Decidim
|
|
32
32
|
end
|
33
33
|
@query = Decidim::Proposals::Proposal.where(component: visible_components_from_spaces(spaces)).joins(:component)
|
34
34
|
.left_outer_joins(:category)
|
35
|
-
@query = @query.where("decidim_proposals_proposals.published_at <= ?", end_time).
|
35
|
+
@query = @query.where("decidim_proposals_proposals.published_at <= ?", end_time).not_withdrawn.not_hidden
|
36
36
|
@query = @query.group("decidim_categorizations.decidim_category_id",
|
37
37
|
:participatory_space_type,
|
38
38
|
:participatory_space_id)
|
@@ -31,7 +31,7 @@ module Decidim
|
|
31
31
|
spaces = Decidim.participatory_space_manifests.flat_map do |manifest|
|
32
32
|
manifest.participatory_spaces.call(@organization).public_spaces
|
33
33
|
end
|
34
|
-
proposal_ids = Decidim::Proposals::Proposal.where(component: visible_components_from_spaces(spaces)).
|
34
|
+
proposal_ids = Decidim::Proposals::Proposal.where(component: visible_components_from_spaces(spaces)).not_withdrawn.not_hidden.pluck(:id)
|
35
35
|
@query = Decidim::Proposals::ProposalVote.joins(proposal: :component)
|
36
36
|
.left_outer_joins(proposal: :category)
|
37
37
|
.where(proposal: proposal_ids)
|
@@ -15,15 +15,13 @@ module Decidim
|
|
15
15
|
address: :string,
|
16
16
|
latitude: :string,
|
17
17
|
longitude: :string,
|
18
|
-
|
18
|
+
decidim_proposals_proposal_state_id: :string
|
19
19
|
}
|
20
20
|
end
|
21
21
|
|
22
22
|
# Parses the values before parsing the changeset.
|
23
23
|
def parse_changeset(attribute, values, type, diff)
|
24
|
-
return parse_i18n_changeset(attribute, values, type, diff) if [:i18n, :i18n_html].include?(type)
|
25
24
|
return parse_scope_changeset(attribute, values, type, diff) if type == :scope
|
26
|
-
return parse_user_group_changeset(attribute, values, type, diff) if type == :user_group
|
27
25
|
|
28
26
|
values = parse_values(attribute, values)
|
29
27
|
old_value = values[0]
|
@@ -117,7 +117,7 @@ module Decidim
|
|
117
117
|
if attachment.file.attached?
|
118
118
|
new_attachment.file = attachment.file.blob
|
119
119
|
else
|
120
|
-
new_attachment.attached_uploader(:file).remote_url = attachment.attached_uploader(:file).url
|
120
|
+
new_attachment.attached_uploader(:file).remote_url = attachment.attached_uploader(:file).url(host: original_proposal.organization.host)
|
121
121
|
end
|
122
122
|
|
123
123
|
new_attachment.save!
|
@@ -1,4 +1,5 @@
|
|
1
1
|
<% add_decidim_page_title(t(".title")) %>
|
2
|
+
<%= append_stylesheet_pack_tag "participatory_texts_admin" %>
|
2
3
|
|
3
4
|
<div class="item_show__header">
|
4
5
|
<h1 class="item_show__header-title">
|
@@ -14,7 +15,7 @@
|
|
14
15
|
<div class="card">
|
15
16
|
<div class="row column">
|
16
17
|
<p class="mt-3"><%= t(".info_1") %></p>
|
17
|
-
<ul id="participatory-text" class="draggable-list js-connect js-list-actives
|
18
|
+
<ul id="participatory-text" class="draggable-list js-connect js-list-actives mt-2.5 ml-2.5 mr-2.5"
|
18
19
|
data-component="accordion"
|
19
20
|
data-accordion
|
20
21
|
data-sort-url="#"
|
@@ -27,7 +28,7 @@
|
|
27
28
|
<a data-open="true" data-controls="article-<%= proposal.id %>">
|
28
29
|
<%= icon "arrow-right-s-line" %>
|
29
30
|
<%= preview_participatory_text_section_title(proposal) %>
|
30
|
-
<span
|
31
|
+
<span><%= icon "menu-line", class: "fill-black" %></span>
|
31
32
|
</a>
|
32
33
|
<div data-tab-content id="article-<%= proposal.id %>">
|
33
34
|
<%= render "article-preview", { form: prop_form, proposal: } %>
|
@@ -5,12 +5,12 @@
|
|
5
5
|
<h2 class="card-title"><%= t ".title", title: present(proposal).title %></h2>
|
6
6
|
</div>
|
7
7
|
|
8
|
-
<% if
|
8
|
+
<% if defined?(Decidim::Templates) %>
|
9
9
|
<%= render "decidim/templates/admin/proposal_answer_templates/template_chooser", form: f %>
|
10
10
|
<% end %>
|
11
11
|
|
12
12
|
<div class="row column flex items-center gap-x-4 my-2">
|
13
|
-
<%= f.collection_radio_buttons :internal_state,
|
13
|
+
<%= f.collection_radio_buttons :internal_state, available_states, :token, ->(a) { translated_attribute(a.title) }, prompt: true do |builder|
|
14
14
|
builder.label { builder.radio_button + builder.text } end %>
|
15
15
|
</div>
|
16
16
|
|
@@ -10,9 +10,9 @@
|
|
10
10
|
<% proposal.notes.each do |note| %>
|
11
11
|
<div class="comment">
|
12
12
|
<div class="comment__header">
|
13
|
-
<div
|
14
|
-
<div
|
15
|
-
<div class="author
|
13
|
+
<div>
|
14
|
+
<div>
|
15
|
+
<div class="author">
|
16
16
|
<strong><span class="author__name"><%= note.author.name %></span></strong>
|
17
17
|
<span><%= l note.created_at, format: :decidim_short %></span>
|
18
18
|
</div>
|
@@ -0,0 +1,67 @@
|
|
1
|
+
<div class="form__wrapper">
|
2
|
+
<div class="card pt-4">
|
3
|
+
<div class="card-section">
|
4
|
+
<div class="row column">
|
5
|
+
<%= form.translated :text_field, :title, aria: { label: :title }, data: { "text-copy" => true, "target" => "strong[data-label-preview]" } %>
|
6
|
+
</div>
|
7
|
+
<div class="row column">
|
8
|
+
<%= form.translated :text_area, :announcement_title, aria: { label: :announcement_title }, data: { "text-copy" => true, "target" => "div[data-announcement-preview] .flash__title" } %>
|
9
|
+
</div>
|
10
|
+
|
11
|
+
<div class="row column proposal-status__color">
|
12
|
+
<% Decidim::Proposals::ProposalState.colors.each do |color_key, color_values| %>
|
13
|
+
<% state_id = "proposal_state_text_color_#{color_values[:foreground].delete("#").downcase}" %>
|
14
|
+
<style>
|
15
|
+
<%= "##{state_id}" %> {
|
16
|
+
box-shadow: 0 0 0 1.5px <%= color_values[:foreground] %>, 0 0 0 6px <%= color_values[:background] %>;
|
17
|
+
accent-color: <%= color_values[:foreground] %>;
|
18
|
+
}
|
19
|
+
|
20
|
+
<%= "##{state_id}" %>:checked {
|
21
|
+
box-shadow: 0 0 0 6px <%= color_values[:foreground] %>;
|
22
|
+
}
|
23
|
+
</style>
|
24
|
+
<%= form.radio_button :text_color, color_values[:foreground],
|
25
|
+
label: color_values[:name],
|
26
|
+
class: "!mr-4",
|
27
|
+
data: {
|
28
|
+
"sync-radio-buttons" => true,
|
29
|
+
"sync-radio-buttons-value" => color_key,
|
30
|
+
"css-preview" => true,
|
31
|
+
"css-preview-updates" =>
|
32
|
+
"strong[data-label-preview]:color:#{color_values[:foreground]}; " +
|
33
|
+
"div[data-announcement-preview]:color:#{color_values[:foreground]}; " +
|
34
|
+
"div[data-announcement-preview]:borderColor:#{color_values[:foreground]}/var(--tw-border-opacity)"
|
35
|
+
} %>
|
36
|
+
|
37
|
+
<%= form.radio_button :bg_color, color_values[:background],
|
38
|
+
label: color_values[:name],
|
39
|
+
style: "display: none;",
|
40
|
+
data: {
|
41
|
+
"sync-radio-buttons-value-target" => color_key,
|
42
|
+
"css-preview" => true,
|
43
|
+
"css-preview-updates" =>
|
44
|
+
"strong[data-label-preview]:backgroundColor:#{color_values[:background]}; " +
|
45
|
+
"div[data-announcement-preview]:backgroundColor:#{color_values[:background]};"
|
46
|
+
} %>
|
47
|
+
<% end %>
|
48
|
+
|
49
|
+
<div class="mt-8">
|
50
|
+
<strong class="label" style="<%= "background-color: #{form.object.bg_color}; color: #{form.object.text_color};" %>" data-label-preview>
|
51
|
+
<%= decidim_escape_translated(form.object.title).presence || t(".preview") %>
|
52
|
+
</strong>
|
53
|
+
</div>
|
54
|
+
|
55
|
+
<div class="flash flex-col " style="<%= "background-color: #{form.object.bg_color}; color: #{form.object.text_color}; border-color: #{form.object.text_color} / var(--tw-border-opacity);" %>" data-announcement-preview>
|
56
|
+
<div class="flash__title">
|
57
|
+
<%= decidim_escape_translated(form.object.announcement_title).presence || t(".preview") %>
|
58
|
+
</div>
|
59
|
+
<div class="flash__message">
|
60
|
+
<p></p><div class="rich-text-display">Id voluptate amet optio nobis temporibus ipsam veritatis distinctio dolore.</div><p></p>
|
61
|
+
</div>
|
62
|
+
</div>
|
63
|
+
</div>
|
64
|
+
|
65
|
+
</div>
|
66
|
+
</div>
|
67
|
+
</div>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<% add_decidim_page_title(t(".title")) %>
|
2
|
+
<div class="item_show__header">
|
3
|
+
<h1 class="item_show__header-title">
|
4
|
+
<%= t(".title") %>
|
5
|
+
</h1>
|
6
|
+
</div>
|
7
|
+
<div class="item__edit item__edit-1col">
|
8
|
+
<div class="item__edit-form">
|
9
|
+
<%= decidim_form_for(@form, html: { class: "form-defaults form edit_proposal_state proposal_form_admin" }) do |f| %>
|
10
|
+
<%= render partial: "form", object: f, locals: { title: t(".title") } %>
|
11
|
+
<div class="item__edit-sticky">
|
12
|
+
<div class="item__edit-sticky-container">
|
13
|
+
<%= f.submit t(".update"), class: "button button__sm button__secondary" %>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
<% end %>
|
17
|
+
</div>
|
18
|
+
</div>
|
@@ -0,0 +1,50 @@
|
|
1
|
+
<% add_decidim_page_title(t(".title")) %>
|
2
|
+
<div class="card">
|
3
|
+
<div class="item_show__header">
|
4
|
+
<h1 class="item_show__header-title">
|
5
|
+
<%= t(".title") %>
|
6
|
+
<%= link_to t("actions.new_proposal_state", scope: "decidim.proposals"), new_proposal_state_path, class: "button button__sm button__secondary" if allowed_to? :create, :proposal_state %>
|
7
|
+
</h1>
|
8
|
+
</div>
|
9
|
+
<div class="table-scroll mt-16">
|
10
|
+
<table class="table-list">
|
11
|
+
<thead>
|
12
|
+
<tr>
|
13
|
+
<th class="!text-left">
|
14
|
+
<%= t("models.proposal_state.title", scope: "decidim.proposals") %>
|
15
|
+
</th>
|
16
|
+
<th>
|
17
|
+
<%= t("models.proposal_state.css_class", scope: "decidim.proposals") %>
|
18
|
+
</th>
|
19
|
+
<th><%= t("actions.title", scope: "decidim.proposals") %></th>
|
20
|
+
</tr>
|
21
|
+
</thead>
|
22
|
+
<tbody>
|
23
|
+
<% proposal_states.each do |state| %>
|
24
|
+
<tr>
|
25
|
+
<td>
|
26
|
+
<%= translated_attribute(state.title) %>
|
27
|
+
</td>
|
28
|
+
<td>
|
29
|
+
<strong class="label" style="<%= state.css_style %>">
|
30
|
+
<%= decidim_sanitize_translated(state.token) %>
|
31
|
+
</strong>
|
32
|
+
</td>
|
33
|
+
<td>
|
34
|
+
<% if allowed_to? :update, :proposal_state, proposal_state: state %>
|
35
|
+
<%= icon_link_to "pencil-line", edit_proposal_state_path(state), t("actions.edit_proposal_state", scope: "decidim.proposals"), class: "action-icon--edit-proposal" %>
|
36
|
+
<% else %>
|
37
|
+
<span class="action-space icon"></span>
|
38
|
+
<% end %>
|
39
|
+
<% if allowed_to?(:destroy, :proposal_state, proposal_state: state) %>
|
40
|
+
<%= icon_link_to "delete-bin-line", proposal_state_path(state), t("actions.destroy", scope: "decidim.proposals"), method: :delete, data: { confirm: t("actions.delete_proposal_state_confirm", scope: "decidim.proposals") }, class: "action-icon--delete-proposal" %>
|
41
|
+
<% end %>
|
42
|
+
</td>
|
43
|
+
</tr>
|
44
|
+
<% end %>
|
45
|
+
</tbody>
|
46
|
+
</table>
|
47
|
+
</div>
|
48
|
+
</div>
|
49
|
+
|
50
|
+
<%= decidim_paginate proposal_states %>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<% add_decidim_page_title(t(".title")) %>
|
2
|
+
<div class="item_show__header">
|
3
|
+
<h1 class="item_show__header-title">
|
4
|
+
<%= t(".title") %>
|
5
|
+
</h1>
|
6
|
+
</div>
|
7
|
+
<div class="item__edit item__edit-1col">
|
8
|
+
<div class="item__edit-form">
|
9
|
+
<%= decidim_form_for(@form, html: { class: "form-defaults form new_proposal_state proposal_form_admin" }) do |f| %>
|
10
|
+
<%= render partial: "form", object: f, locals: { title: t(".title") } %>
|
11
|
+
<div class="item__edit-sticky">
|
12
|
+
<div class="item__edit-sticky-container">
|
13
|
+
<%= f.submit t(".create"), class: "button button__sm button__secondary" %>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
<% end %>
|
17
|
+
</div>
|
18
|
+
</div>
|
@@ -10,17 +10,13 @@
|
|
10
10
|
|
11
11
|
<% if allowed_to? :import, :proposals %>
|
12
12
|
<%= import_dropdown do %>
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
<li class="imports--component imports--proposals">
|
14
|
+
<%= link_to t("actions.import", scope: "decidim.proposals", name: t("models.proposal.name", scope: "decidim.proposals.admin")), new_proposals_import_path %>
|
15
|
+
</li>
|
16
|
+
<% current_component.manifest.import_manifests.each do |import_manifest| %>
|
17
|
+
<li class="imports--file imports--<%= import_manifest.name %>">
|
18
|
+
<%= link_to import_manifest.message(:label, self), admin_imports_path(current_component, name: import_manifest.name) %>
|
16
19
|
</li>
|
17
|
-
<% current_component.manifest.import_manifests.each do |import_manifest| %>
|
18
|
-
<%= link_to admin_imports_path(current_component, name: import_manifest.name) do %>
|
19
|
-
<li class="imports--file imports--<%= import_manifest.name %>">
|
20
|
-
<%= import_manifest.message(:label, self) %>
|
21
|
-
</li>
|
22
|
-
<% end %>
|
23
|
-
<% end %>
|
24
20
|
<% end %>
|
25
21
|
<% end %>
|
26
22
|
<% end %>
|
@@ -34,6 +30,4 @@
|
|
34
30
|
<%= render partial: "decidim/proposals/admin/proposals/bulk_actions/scope-change" %>
|
35
31
|
<%= render partial: "decidim/proposals/admin/proposals/bulk_actions/merge" %>
|
36
32
|
<%= render partial: "decidim/proposals/admin/proposals/bulk_actions/split" %>
|
37
|
-
<%= render partial: "decidim/proposals/admin/proposals/bulk_actions/assign_to_valuator" %>
|
38
|
-
<%= render partial: "decidim/proposals/admin/proposals/bulk_actions/unassign_from_valuator" %>
|
39
33
|
<%= render partial: "decidim/proposals/admin/proposals/bulk_actions/publish_answers" %>
|