decidim-proposals 0.28.2 → 0.29.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- 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_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 +0 -2
- 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 +2 -2
- 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 +30 -35
- data/app/events/decidim/proposals/proposal_state_changed_event.rb +37 -0
- data/app/forms/decidim/proposals/admin/proposal_answer_form.rb +5 -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/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 +78 -28
- 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/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 -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 +1 -1
- 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 +0 -2
- 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 +9 -5
- 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/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/show.html.erb +1 -1
- data/config/locales/ar.yml +5 -114
- data/config/locales/bg.yml +109 -106
- data/config/locales/ca.yml +80 -77
- data/config/locales/cs.yml +60 -119
- data/config/locales/de.yml +107 -104
- data/config/locales/el.yml +2 -118
- data/config/locales/en.yml +109 -106
- data/config/locales/es-MX.yml +82 -79
- data/config/locales/es-PY.yml +84 -81
- data/config/locales/es.yml +81 -78
- data/config/locales/eu.yml +100 -104
- data/config/locales/fi-plain.yml +87 -84
- data/config/locales/fi.yml +109 -106
- data/config/locales/fr-CA.yml +85 -82
- data/config/locales/fr.yml +77 -74
- data/config/locales/ga-IE.yml +1 -27
- data/config/locales/gl.yml +4 -104
- data/config/locales/he-IL.yml +0 -13
- data/config/locales/hu.yml +14 -88
- data/config/locales/id-ID.yml +1 -97
- data/config/locales/is-IS.yml +0 -33
- data/config/locales/it.yml +5 -96
- data/config/locales/ja.yml +108 -105
- data/config/locales/lb.yml +1 -0
- data/config/locales/lt.yml +2 -122
- data/config/locales/lv.yml +1 -96
- data/config/locales/nl.yml +5 -95
- data/config/locales/no.yml +2 -107
- data/config/locales/pl.yml +105 -113
- data/config/locales/pt-BR.yml +4 -81
- data/config/locales/pt.yml +4 -107
- data/config/locales/ro-RO.yml +5 -110
- data/config/locales/ru.yml +1 -53
- data/config/locales/sk.yml +1 -103
- data/config/locales/sv.yml +20 -103
- data/config/locales/tr-TR.yml +56 -103
- data/config/locales/uk.yml +2 -54
- data/config/locales/zh-CN.yml +1 -99
- data/config/locales/zh-TW.yml +2 -116
- 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 +2 -2
- data/lib/decidim/api/proposal_type.rb +4 -0
- 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 +5 -3
- data/lib/decidim/proposals/seeds.rb +60 -51
- data/lib/decidim/proposals/test/factories.rb +64 -8
- data/lib/decidim/proposals/version.rb +1 -1
- data/lib/decidim/proposals.rb +84 -12
- data/lib/tasks/proposals/upgrade/decidim_proposals_upgrade_tasks.rake +32 -0
- metadata +49 -35
- 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/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/lib/tasks/proposals/upgrade/decdim_proposal_upgrade_tasks.rake +0 -34
@@ -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?
|
@@ -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)
|
@@ -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: } %>
|
@@ -10,7 +10,7 @@
|
|
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>
|
@@ -30,6 +30,4 @@
|
|
30
30
|
<%= render partial: "decidim/proposals/admin/proposals/bulk_actions/scope-change" %>
|
31
31
|
<%= render partial: "decidim/proposals/admin/proposals/bulk_actions/merge" %>
|
32
32
|
<%= render partial: "decidim/proposals/admin/proposals/bulk_actions/split" %>
|
33
|
-
<%= render partial: "decidim/proposals/admin/proposals/bulk_actions/assign_to_valuator" %>
|
34
|
-
<%= render partial: "decidim/proposals/admin/proposals/bulk_actions/unassign_from_valuator" %>
|
35
33
|
<%= render partial: "decidim/proposals/admin/proposals/bulk_actions/publish_answers" %>
|
@@ -1,16 +1,16 @@
|
|
1
1
|
<div class="form__wrapper">
|
2
2
|
<div class="card pt-4">
|
3
3
|
<div class="card-section">
|
4
|
-
<div class="row column
|
4
|
+
<div class="row column pb-4">
|
5
5
|
<%= form.translated :text_field, :title, autofocus: true, class: "js-hashtags", hashtaggable: true, aria: { label: :title } %>
|
6
6
|
</div>
|
7
|
-
<div class="row column
|
7
|
+
<div class="row column">
|
8
8
|
<%= form.translated :editor, :body, hashtaggable: true, aria: { label: :body } %>
|
9
9
|
</div>
|
10
10
|
<% if @form.component_automatic_hashtags.any? %>
|
11
|
-
<div
|
11
|
+
<div>
|
12
12
|
<%= form.label :automatic_hashtags %>
|
13
|
-
<div class="
|
13
|
+
<div class="hashtags">
|
14
14
|
<% @form.component_automatic_hashtags.each do |hashtag| %>
|
15
15
|
<label>
|
16
16
|
<%= check_box_tag "", "", { checked: true }, { disabled: true } %>#<%= hashtag %>
|
@@ -20,9 +20,9 @@
|
|
20
20
|
</div>
|
21
21
|
<% end %>
|
22
22
|
<% if @form.component_suggested_hashtags.any? %>
|
23
|
-
<div
|
23
|
+
<div>
|
24
24
|
<%= form.label :suggested_hashtags %>
|
25
|
-
<div class="
|
25
|
+
<div class="hashtags">
|
26
26
|
<%= form.collection_check_boxes :suggested_hashtags, @form.component_suggested_hashtags.map { |hashtag| [hashtag.downcase, "##{hashtag}"] }, :first, :last do |option|
|
27
27
|
option.label { option.check_box(checked: @form.suggested_hashtag_checked?(option.value)) + option.text }
|
28
28
|
end %>
|
@@ -56,11 +56,11 @@
|
|
56
56
|
</td>
|
57
57
|
|
58
58
|
<td class="valuators-count">
|
59
|
-
<%= proposal.
|
59
|
+
<%= proposal.valuation_assignments_count %>
|
60
60
|
</td>
|
61
61
|
|
62
62
|
<td>
|
63
|
-
<strong class="label <%= proposal_state_css_class proposal %>">
|
63
|
+
<strong class="label <%= proposal_state_css_class proposal %>" style="<%= proposal_state_css_style proposal %>">
|
64
64
|
<%= t("decidim/amendment", scope: "activerecord.models", count: 1) if proposal.emendation? %>
|
65
65
|
<%= proposal_complete_state proposal %>
|
66
66
|
</strong>
|
@@ -1,15 +1,19 @@
|
|
1
|
-
<div id="js-assign-proposals-to-valuator-actions" class="
|
2
|
-
<%= form_tag(valuation_assignment_path, method: :post, id: "js-form-assign-proposals-to-valuator", class: "form form-defaults
|
3
|
-
<div class="
|
1
|
+
<div id="js-assign-proposals-to-valuator-actions" class="item_show__header__action-options js-bulk-action-form hide">
|
2
|
+
<%= form_tag(valuation_assignment_path, method: :post, id: "js-form-assign-proposals-to-valuator", class: "form form-defaults w-full") do %>
|
3
|
+
<div class="hide">
|
4
4
|
<% proposals.each do |proposal| %>
|
5
5
|
<%= check_box_tag "proposal_ids[]", proposal.id, false, class: "js-check-all-proposal js-proposal-id-#{proposal.id}" %>
|
6
6
|
<% end %>
|
7
7
|
</div>
|
8
8
|
|
9
|
-
|
9
|
+
<label class="w-full font-semibold" for="assign_valuator_role_ids">
|
10
|
+
<%= t("decidim.proposals.admin.proposals.index.assign_to_valuator") %>
|
11
|
+
<%= render partial: "decidim/proposals/admin/proposals/bulk_actions/valuators_picker", locals: { participatory_space: current_participatory_space, select_id: "assign_valuator_role_ids" } %>
|
12
|
+
</label>
|
10
13
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
+
<div class="flex justify-end gap-x-4 mt-2">
|
15
|
+
<%= submit_tag(t("decidim.proposals.admin.proposals.index.assign_to_valuator_button"), id: "js-submit-assign-proposals-to-valuator", class: "button button__sm button__secondary small button--simple float-left") %>
|
16
|
+
<button class="button button__sm button__secondary js-cancel-bulk-action" type="button"><%= t("decidim.proposals.admin.proposals.index.cancel") %></button>
|
17
|
+
</div>
|
14
18
|
<% end %>
|
15
19
|
</div>
|