decidim-proposals 0.31.1 → 0.31.3
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/controllers/concerns/decidim/proposals/admin/filterable.rb +3 -1
- data/app/controllers/decidim/proposals/admin/proposals_imports_controller.rb +15 -0
- data/app/controllers/decidim/proposals/proposals_controller.rb +7 -1
- data/app/forms/decidim/proposals/admin/proposal_form.rb +51 -1
- data/app/forms/decidim/proposals/admin/proposals_import_form.rb +8 -14
- data/app/helpers/decidim/proposals/admin/proposal_bulk_actions_helper.rb +2 -1
- data/app/packs/entrypoints/decidim_proposals_admin.js +1 -0
- data/app/packs/src/decidim/proposals/admin/controllers/import_proposals/controller.js +110 -0
- data/app/packs/src/decidim/proposals/admin/import_proposals.js +5 -0
- data/app/views/decidim/proposals/admin/proposals_imports/new.html.erb +10 -12
- data/app/views/decidim/proposals/collaborative_drafts/_edit_form_fields.html.erb +2 -1
- data/app/views/decidim/proposals/proposals/_edit_form_fields.html.erb +2 -2
- data/app/views/decidim/proposals/proposals/_proposal_aside.html.erb +1 -1
- data/app/views/decidim/proposals/proposals/_proposals.html.erb +1 -1
- data/app/views/decidim/proposals/proposals/index.html.erb +1 -1
- data/config/locales/ar.yml +12 -4
- data/config/locales/bg.yml +6 -2
- data/config/locales/ca-IT.yml +12 -12
- data/config/locales/ca.yml +12 -12
- data/config/locales/cs.yml +19 -4
- data/config/locales/de.yml +3 -5
- data/config/locales/el.yml +6 -2
- data/config/locales/en.yml +2 -2
- data/config/locales/es-MX.yml +11 -11
- data/config/locales/es-PY.yml +7 -7
- data/config/locales/es.yml +10 -10
- data/config/locales/eu.yml +7 -7
- data/config/locales/fi-plain.yml +6 -6
- data/config/locales/fi.yml +4 -4
- data/config/locales/fr-CA.yml +30 -12
- data/config/locales/fr.yml +30 -12
- data/config/locales/ga-IE.yml +5 -0
- data/config/locales/gl.yml +9 -5
- data/config/locales/hu.yml +8 -3
- data/config/locales/id-ID.yml +6 -4
- data/config/locales/is-IS.yml +24 -0
- data/config/locales/it.yml +11 -7
- data/config/locales/ja.yml +6 -6
- data/config/locales/lt.yml +11 -5
- data/config/locales/lv.yml +7 -3
- data/config/locales/nl.yml +12 -10
- data/config/locales/no.yml +6 -2
- data/config/locales/pl.yml +13 -7
- data/config/locales/pt-BR.yml +7 -7
- data/config/locales/pt.yml +8 -4
- data/config/locales/ro-RO.yml +11 -4
- data/config/locales/ru.yml +27 -1
- data/config/locales/sk.yml +9 -4
- data/config/locales/sl.yml +6 -0
- data/config/locales/sv.yml +146 -36
- data/config/locales/tr-TR.yml +12 -6
- data/config/locales/uk.yml +27 -1
- data/config/locales/zh-CN.yml +5 -1
- data/config/locales/zh-TW.yml +6 -3
- data/db/data/20260208135005_change_users_in_action_logs_proposals.rb +29 -0
- data/lib/decidim/proposals/admin_engine.rb +5 -2
- data/lib/decidim/proposals/version.rb +1 -1
- metadata +23 -20
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c245b1ea6ef736a9799553e7f87f5f95d5c7c7b4c3b7c3e4830f3c9c4626d650
|
|
4
|
+
data.tar.gz: a6238f6e26575eee72a3e3f1b87c07e30a8822fef9c0cb47475af9c571e6b677
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e03002daa5cfc826e8c18fbcfc60dba89d1d5aa294e4bf909db8eab8933f97b7b73d3061b94ae1190dc59750b91764e77fc0397fee6a49201efe98ebf1fa9853
|
|
7
|
+
data.tar.gz: 857327cf0f33058d2830e7b34ded7e299577c9d5e1cf30dad5ba06b78541647f9e4d7c1a885ed290354b85e5309f70001439250769136fed4fcc94ec3337b05c
|
|
@@ -51,7 +51,9 @@ module Decidim
|
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
def evaluator_role_ids
|
|
54
|
-
current_participatory_space.user_roles(:evaluator)
|
|
54
|
+
roles = current_participatory_space.user_roles(:evaluator)
|
|
55
|
+
roles = roles.order_by_name if roles.respond_to?(:order_by_name)
|
|
56
|
+
roles.pluck(:id)
|
|
55
57
|
end
|
|
56
58
|
|
|
57
59
|
def translated_evaluator_role_ids_has(evaluator_role_id)
|
|
@@ -27,6 +27,21 @@ module Decidim
|
|
|
27
27
|
end
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
|
+
|
|
31
|
+
def component_states
|
|
32
|
+
enforce_permission_to :import, :proposals
|
|
33
|
+
component = current_participatory_space.components.find_by(id: params[:origin_id])
|
|
34
|
+
|
|
35
|
+
if component
|
|
36
|
+
states = Decidim::Proposals::ProposalState
|
|
37
|
+
.where(component:)
|
|
38
|
+
.map { |s| { token: s.token, title: translated_attribute(s.title) } }
|
|
39
|
+
states << { token: "not_answered", title: I18n.t("decidim.proposals.answers.not_answered") }
|
|
40
|
+
render json: states
|
|
41
|
+
else
|
|
42
|
+
render json: []
|
|
43
|
+
end
|
|
44
|
+
end
|
|
30
45
|
end
|
|
31
46
|
end
|
|
32
47
|
end
|
|
@@ -16,7 +16,7 @@ module Decidim
|
|
|
16
16
|
include Paginable
|
|
17
17
|
include Decidim::AttachmentsHelper
|
|
18
18
|
|
|
19
|
-
helper_method :proposal_presenter, :form_presenter, :tab_panel_items
|
|
19
|
+
helper_method :proposal_presenter, :form_presenter, :tab_panel_items, :withdrawn_proposals?
|
|
20
20
|
|
|
21
21
|
before_action :authenticate_user!, only: [:new, :create]
|
|
22
22
|
before_action :ensure_is_draft, only: [:preview, :publish, :edit_draft, :update_draft, :destroy_draft]
|
|
@@ -233,6 +233,12 @@ module Decidim
|
|
|
233
233
|
@proposal_presenter ||= present(@proposal)
|
|
234
234
|
end
|
|
235
235
|
|
|
236
|
+
def withdrawn_proposals?
|
|
237
|
+
return @withdrawn_proposals if defined?(@withdrawn_proposals)
|
|
238
|
+
|
|
239
|
+
@withdrawn_proposals = Proposal.where(component: current_component).published.not_hidden.withdrawn.exists?
|
|
240
|
+
end
|
|
241
|
+
|
|
236
242
|
def form_proposal_params
|
|
237
243
|
form(ProposalForm).from_params(params)
|
|
238
244
|
end
|
|
@@ -27,12 +27,62 @@ module Decidim
|
|
|
27
27
|
|
|
28
28
|
self.title = presenter.title(all_locales: title.is_a?(Hash))
|
|
29
29
|
self.body = presenter.editor_body(all_locales: body.is_a?(Hash))
|
|
30
|
-
self.documents = model.attachments
|
|
30
|
+
self.documents = model.attachments.ids
|
|
31
|
+
self.add_documents = model.attachments.map { |att| { id: att.id, title: att.title } }
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def documents=(value)
|
|
35
|
+
case value
|
|
36
|
+
when String
|
|
37
|
+
super(parse_string_documents(value))
|
|
38
|
+
when Integer
|
|
39
|
+
super([value])
|
|
40
|
+
else
|
|
41
|
+
super
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def documents
|
|
46
|
+
result = super
|
|
47
|
+
|
|
48
|
+
if should_use_add_documents?(result)
|
|
49
|
+
extract_ids_from_add_documents
|
|
50
|
+
else
|
|
51
|
+
result.is_a?(Array) ? result : []
|
|
52
|
+
end
|
|
31
53
|
end
|
|
32
54
|
|
|
33
55
|
def notify_missing_attachment_if_errored
|
|
34
56
|
errors.add(:add_documents, :needs_to_be_reattached) if errors.any? && add_documents.present?
|
|
35
57
|
end
|
|
58
|
+
|
|
59
|
+
private
|
|
60
|
+
|
|
61
|
+
def should_use_add_documents?(result)
|
|
62
|
+
(result.blank? || result.is_a?(String)) && add_documents.present?
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def extract_ids_from_add_documents
|
|
66
|
+
add_documents
|
|
67
|
+
.select { |doc| doc.is_a?(Hash) && (doc[:id].present? || doc["id"].present?) }
|
|
68
|
+
.map { |doc| (doc[:id] || doc["id"]).to_i }
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def parse_string_documents(value)
|
|
72
|
+
return [] if value.blank?
|
|
73
|
+
|
|
74
|
+
parse_document_ids(value)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def parse_document_ids(value)
|
|
78
|
+
ids = begin
|
|
79
|
+
Array(JSON.parse(value))
|
|
80
|
+
rescue JSON::ParserError
|
|
81
|
+
value.split(",").map(&:strip)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
ids.map(&:to_i).reject(&:zero?)
|
|
85
|
+
end
|
|
36
86
|
end
|
|
37
87
|
end
|
|
38
88
|
end
|
|
@@ -10,22 +10,14 @@ module Decidim
|
|
|
10
10
|
mimic :proposals_import
|
|
11
11
|
|
|
12
12
|
attribute :origin_component_id, Integer
|
|
13
|
-
attribute :import_proposals, Boolean
|
|
14
13
|
attribute :keep_answers, Boolean
|
|
15
14
|
attribute :keep_authors, Boolean
|
|
16
|
-
attribute :states, Array
|
|
15
|
+
attribute :states, Array[String]
|
|
17
16
|
|
|
18
|
-
validates :origin_component_id, :origin_component, :
|
|
19
|
-
validates :
|
|
17
|
+
validates :origin_component_id, :origin_component, :current_component, presence: true
|
|
18
|
+
validates :states, presence: true
|
|
20
19
|
validate :valid_states
|
|
21
20
|
|
|
22
|
-
def states_collection
|
|
23
|
-
@states_collection ||= ProposalState.where(component: current_component) + [ProposalState.new(token: "not_answered",
|
|
24
|
-
title: I18n.t(
|
|
25
|
-
:not_answered, scope: "decidim.proposals.answers"
|
|
26
|
-
))]
|
|
27
|
-
end
|
|
28
|
-
|
|
29
21
|
def states
|
|
30
22
|
super.compact_blank
|
|
31
23
|
end
|
|
@@ -47,9 +39,11 @@ module Decidim
|
|
|
47
39
|
private
|
|
48
40
|
|
|
49
41
|
def valid_states
|
|
50
|
-
return
|
|
51
|
-
|
|
52
|
-
|
|
42
|
+
return unless origin_component
|
|
43
|
+
return if states.empty?
|
|
44
|
+
|
|
45
|
+
valid_tokens = Decidim::Proposals::ProposalState.where(component: origin_component).pluck(:token) + ["not_answered"]
|
|
46
|
+
return if states.all? { |state| valid_tokens.include?(state) }
|
|
53
47
|
|
|
54
48
|
errors.add(:states, :invalid)
|
|
55
49
|
end
|
|
@@ -35,7 +35,8 @@ module Decidim
|
|
|
35
35
|
|
|
36
36
|
# find the evaluators for the current space.
|
|
37
37
|
def find_evaluators_for_select(participatory_space, current_user)
|
|
38
|
-
evaluator_roles = participatory_space.user_roles(:evaluator)
|
|
38
|
+
evaluator_roles = participatory_space.user_roles(:evaluator)
|
|
39
|
+
evaluator_roles = evaluator_roles.order_by_name if evaluator_roles.respond_to?(:order_by_name)
|
|
39
40
|
evaluators = Decidim::User.where(id: evaluator_roles.pluck(:decidim_user_id)).to_a
|
|
40
41
|
|
|
41
42
|
filtered_evaluator_roles = evaluator_roles.filter do |role|
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { Controller } from "@hotwired/stimulus"
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Stimulus controller for the admin import-proposals form.
|
|
5
|
+
*
|
|
6
|
+
* Watches a `<select>` element (the origin component picker) and dynamically
|
|
7
|
+
* fetches the available proposal states for the chosen component.
|
|
8
|
+
* The retrieved states are rendered as a list of checkboxes inside a
|
|
9
|
+
* container element, so admins can easily filter which proposal states to import.
|
|
10
|
+
*
|
|
11
|
+
* Targets:
|
|
12
|
+
* - `select` – The `<select>` element used to choose the origin component.
|
|
13
|
+
* - `container` – The wrapper element where the state checkboxes are rendered.
|
|
14
|
+
*
|
|
15
|
+
* Values:
|
|
16
|
+
* - `statesUrl` {String} – Base URL of the endpoint that returns available states.
|
|
17
|
+
* - `selectedStates` {Array} – Pre-selected state tokens (populated on page load
|
|
18
|
+
* when re-rendering a previously submitted form).
|
|
19
|
+
*/
|
|
20
|
+
export default class ImportProposalsController extends Controller {
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Lifecycle callback invoked by Stimulus when the controller is connected to
|
|
24
|
+
* the DOM. Triggers an initial state fetch based on the currently selected
|
|
25
|
+
* component so that a pre-filled form displays the correct checkboxes.
|
|
26
|
+
* @returns {void}
|
|
27
|
+
*/
|
|
28
|
+
connect() {
|
|
29
|
+
this._fetchStates(this.selectTarget.value);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Triggered when the select value changes.
|
|
34
|
+
* @param {Event} event - The change event fired by the select element.
|
|
35
|
+
* @returns {void}
|
|
36
|
+
*/
|
|
37
|
+
onSelectChange(event) {
|
|
38
|
+
this._fetchStates(event.target.value);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Escapes a string for safe insertion into HTML.
|
|
43
|
+
* @param {string} str - The string to escape.
|
|
44
|
+
* @returns {string} The escaped HTML string.
|
|
45
|
+
*/
|
|
46
|
+
_escapeHtml(str) {
|
|
47
|
+
const div = document.createElement("div");
|
|
48
|
+
div.appendChild(document.createTextNode(str));
|
|
49
|
+
return div.innerHTML;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Fetches the available states for the given component ID and renders them.
|
|
54
|
+
* @param {string} componentId - The ID of the selected component to fetch states for.
|
|
55
|
+
* @returns {void}
|
|
56
|
+
*/
|
|
57
|
+
_fetchStates(componentId) {
|
|
58
|
+
const container = this.containerTarget;
|
|
59
|
+
if (!componentId) {
|
|
60
|
+
container.innerHTML = "";
|
|
61
|
+
container.style.display = "none";
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const url = `${this.statesUrlValue}?origin_id=${componentId}`;
|
|
66
|
+
fetch(url, {
|
|
67
|
+
credentials: "same-origin",
|
|
68
|
+
headers: { Accept: "application/json" }
|
|
69
|
+
}).then((res) => {
|
|
70
|
+
return res.json();
|
|
71
|
+
}).then((states) => {
|
|
72
|
+
if (!states.length) {
|
|
73
|
+
container.innerHTML = "";
|
|
74
|
+
container.style.display = "none";
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const selectedStates = this.selectedStatesValue;
|
|
79
|
+
const wrapper = document.createElement("div");
|
|
80
|
+
wrapper.className = "row column";
|
|
81
|
+
|
|
82
|
+
states.forEach((state) => {
|
|
83
|
+
const div = document.createElement("div");
|
|
84
|
+
const label = document.createElement("label");
|
|
85
|
+
const input = document.createElement("input");
|
|
86
|
+
input.type = "checkbox";
|
|
87
|
+
input.name = "proposals_import[states][]";
|
|
88
|
+
input.value = state.token;
|
|
89
|
+
input.checked = selectedStates.includes(state.token);
|
|
90
|
+
label.appendChild(input);
|
|
91
|
+
label.appendChild(document.createTextNode(` ${state.title}`));
|
|
92
|
+
div.appendChild(label);
|
|
93
|
+
wrapper.appendChild(div);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
container.innerHTML = "";
|
|
97
|
+
container.appendChild(wrapper);
|
|
98
|
+
container.style.display = "block";
|
|
99
|
+
}).catch(() => {
|
|
100
|
+
container.innerHTML = "";
|
|
101
|
+
container.style.display = "none";
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
ImportProposalsController.targets = ["select", "container"]
|
|
107
|
+
ImportProposalsController.values = {
|
|
108
|
+
statesUrl: String,
|
|
109
|
+
selectedStates: { type: Array, default: [] }
|
|
110
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Application } from "@hotwired/stimulus"
|
|
2
|
+
import ImportProposalsController from "src/decidim/proposals/admin/controllers/import_proposals/controller.js"
|
|
3
|
+
|
|
4
|
+
const application = Application.start()
|
|
5
|
+
application.register("import-proposals", ImportProposalsController)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
<% add_decidim_page_title(t(".title")) %>
|
|
2
|
+
<%= append_javascript_pack_tag "decidim_proposals_admin" %>
|
|
2
3
|
<div class="item_show__header">
|
|
3
4
|
<h1 class="item_show__header-title">
|
|
4
5
|
<%= t(".title") %>
|
|
@@ -7,21 +8,21 @@
|
|
|
7
8
|
|
|
8
9
|
<div class="item__edit item__edit-1col">
|
|
9
10
|
<div class="item__edit-form">
|
|
10
|
-
<%= decidim_form_for(@form, url: proposals_import_path, html: { class: "form form-defaults import_proposals" }) do |f| %>
|
|
11
|
+
<%= decidim_form_for(@form, url: proposals_import_path, local: true, html: { class: "form form-defaults import_proposals" }) do |f| %>
|
|
11
12
|
<% if @form.origin_components.any? %>
|
|
12
13
|
<div class="form__wrapper">
|
|
13
14
|
<div class="card pt-4">
|
|
14
|
-
<div class="card-section"
|
|
15
|
+
<div class="card-section"
|
|
16
|
+
data-controller="import-proposals"
|
|
17
|
+
data-import-proposals-states-url-value="<%= component_states_proposals_import_path %>">
|
|
15
18
|
<div class="row column">
|
|
16
|
-
<%= f.select :origin_component_id, @form.origin_components_collection, prompt: t(".select_component") %>
|
|
19
|
+
<%= f.select :origin_component_id, @form.origin_components_collection, { prompt: t(".select_component") }, { data: { import_proposals_target: "select", action: "change->import-proposals#onSelectChange" } } %>
|
|
17
20
|
</div>
|
|
18
21
|
<div class="row column">
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
</div>
|
|
24
|
-
<% end %>
|
|
22
|
+
<label class="ml-4"><%= t(".select_states") %></label>
|
|
23
|
+
<div id="states-container"
|
|
24
|
+
data-import-proposals-target="container"
|
|
25
|
+
data-import-proposals-selected-states-value="<%= @form.states.to_json %>"></div>
|
|
25
26
|
</div>
|
|
26
27
|
<div class="row column">
|
|
27
28
|
<%= f.check_box :keep_authors %>
|
|
@@ -29,9 +30,6 @@
|
|
|
29
30
|
<div class="row column">
|
|
30
31
|
<%= f.check_box :keep_answers %>
|
|
31
32
|
</div>
|
|
32
|
-
<div class="row column">
|
|
33
|
-
<%= f.check_box :import_proposals %>
|
|
34
|
-
</div>
|
|
35
33
|
</div>
|
|
36
34
|
</div>
|
|
37
35
|
</div>
|
|
@@ -21,5 +21,6 @@
|
|
|
21
21
|
button_edit_label: t("decidim.proposals.collaborative_drafts.new.edit_file"),
|
|
22
22
|
button_class: "button button__lg button__transparent-secondary w-full",
|
|
23
23
|
help_text: t("attachment_legend", scope: "decidim.proposals.collaborative_drafts.edit"),
|
|
24
|
-
help_i18n_scope: "decidim.forms.file_help.file"
|
|
24
|
+
help_i18n_scope: "decidim.forms.file_help.file",
|
|
25
|
+
paragraph: true %>
|
|
25
26
|
<% end %>
|
|
@@ -22,7 +22,6 @@
|
|
|
22
22
|
<%= filter_taxonomy_items_select_field form, :taxonomies, filter %>
|
|
23
23
|
<% end %>
|
|
24
24
|
<% end %>
|
|
25
|
-
|
|
26
25
|
<% if component_settings.attachments_allowed? && (new_proposal || @proposal) %>
|
|
27
26
|
<%= form.attachment :documents,
|
|
28
27
|
multiple: true,
|
|
@@ -31,5 +30,6 @@
|
|
|
31
30
|
button_edit_label: t("decidim.proposals.proposals.edit.edit_attachments"),
|
|
32
31
|
button_class: "button button__lg button__transparent-secondary w-full",
|
|
33
32
|
help_i18n_scope: "decidim.forms.file_help.file",
|
|
34
|
-
help_text: t("attachment_legend", scope: "decidim.proposals.proposals.edit")
|
|
33
|
+
help_text: t("attachment_legend", scope: "decidim.proposals.proposals.edit"),
|
|
34
|
+
paragraph: true %>
|
|
35
35
|
<% end %>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<% if current_settings.votes_enabled?
|
|
1
|
+
<% if current_settings.votes_enabled? %>
|
|
2
2
|
<section class="layout-aside__section">
|
|
3
3
|
<div class="proposal__aside-vote layout-aside__ctas-buttons" data-controller="sticky-buttons">
|
|
4
4
|
<%= render partial: "vote_button", locals: { proposal: @proposal, from_proposals_list: false } unless @proposal.withdrawn? %>
|
|
@@ -26,6 +26,6 @@
|
|
|
26
26
|
|
|
27
27
|
<% if params.dig("filter", "with_availability").present? && params["filter"]["with_availability"] == "withdrawn" %>
|
|
28
28
|
<%= link_to t("decidim.proposals.proposals.index.see_all"), proposals_path("filter[with_availability]" => nil), class: "button button__sm button__text-secondary" %>
|
|
29
|
-
<%
|
|
29
|
+
<% elsif withdrawn_proposals? %>
|
|
30
30
|
<%= link_to t("decidim.proposals.proposals.index.see_all_withdrawn"), proposals_path(filter: { with_availability: "withdrawn", with_any_state: [] }), class: "button button__sm button__text-secondary" %>
|
|
31
31
|
<% end %>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<% add_decidim_meta_tags(
|
|
2
|
-
description: translated_attribute(current_participatory_space.short_description),
|
|
2
|
+
description: translated_attribute(current_participatory_space.try(:short_description) || current_participatory_space.description),
|
|
3
3
|
title: t("decidim.components.pagination.page_title",
|
|
4
4
|
component_name: component_name,
|
|
5
5
|
current_page: @proposals.current_page,
|
data/config/locales/ar.yml
CHANGED
|
@@ -35,7 +35,6 @@ ar:
|
|
|
35
35
|
file: ملف
|
|
36
36
|
proposals_import:
|
|
37
37
|
import_proposals: مقترحات الاستيراد
|
|
38
|
-
keep_answers: الاحتفاظ بالحالة والإجابات
|
|
39
38
|
keep_authors: الحفاظ على المؤلفين الأصلي
|
|
40
39
|
errors:
|
|
41
40
|
models:
|
|
@@ -181,6 +180,9 @@ ar:
|
|
|
181
180
|
admin:
|
|
182
181
|
proposal_note_created:
|
|
183
182
|
email_subject: ترك شخص ملاحظة على الاقتراح %{resource_title}.
|
|
183
|
+
coauthor_invited:
|
|
184
|
+
actions:
|
|
185
|
+
accept: قبول
|
|
184
186
|
collaborative_draft_access_accepted:
|
|
185
187
|
email_intro: 'تم قبول %{requester_name} لأن يكون مسجلاً كمساهم في المسودة التعاونية <a href="%{resource_url}">%{resource_title}</a>.'
|
|
186
188
|
email_outro: لقد تلقيت هذا الإشعار لأنك مساهم مع <a href="%{resource_url}">%{resource_title}</a>.
|
|
@@ -372,7 +374,6 @@ ar:
|
|
|
372
374
|
create: مقترحات الاستيراد
|
|
373
375
|
no_components: لا توجد مكونات اقتراح أخرى في هذه المساحة التشاركية لاستيراد المقترحات منها.
|
|
374
376
|
select_component: يرجى اختيار عنصر
|
|
375
|
-
select_states: تحقق من حالة مقترحات الاستيراد
|
|
376
377
|
proposals_merges:
|
|
377
378
|
create:
|
|
378
379
|
success: دمج المقترحات بنجاح في واحدة جديدة.
|
|
@@ -433,7 +434,7 @@ ar:
|
|
|
433
434
|
all: الكل
|
|
434
435
|
amendment: تعديلات
|
|
435
436
|
open: افتح
|
|
436
|
-
published:
|
|
437
|
+
published: تم نشره
|
|
437
438
|
related_to: متعلق ب
|
|
438
439
|
search: بحث
|
|
439
440
|
state: الحالة
|
|
@@ -491,7 +492,7 @@ ar:
|
|
|
491
492
|
withdraw: سحب المشروع
|
|
492
493
|
states:
|
|
493
494
|
open: افتح
|
|
494
|
-
published:
|
|
495
|
+
published: تم نشره
|
|
495
496
|
withdrawn: سحب
|
|
496
497
|
update:
|
|
497
498
|
error: حدثت مشكلة في حفظ المسودة التعاونية.
|
|
@@ -594,6 +595,13 @@ ar:
|
|
|
594
595
|
answer: إجابة
|
|
595
596
|
changes_at_title: تعديل على "%{title}"
|
|
596
597
|
estimated_cost: التكلفة التقديرية
|
|
598
|
+
hidden_likes_count:
|
|
599
|
+
zero: و %{count} المزيد من الناس
|
|
600
|
+
one: و %{count} شخص آخر
|
|
601
|
+
two: و %{count} المزيد من الناس
|
|
602
|
+
few: و %{count} المزيد من الناس
|
|
603
|
+
many: و %{count} المزيد من الناس
|
|
604
|
+
other: و %{count} المزيد من الناس
|
|
597
605
|
link_to_collaborative_draft_help_text: هذا الاقتراح هو نتيجة لمشروع تعاوني. مراجعة التاريخ
|
|
598
606
|
link_to_collaborative_draft_text: انظر المسودة التعاونية
|
|
599
607
|
link_to_promoted_emendation_help_text: هذا الاقتراح عبارة عن تعديل مروج له
|
data/config/locales/bg.yml
CHANGED
|
@@ -43,7 +43,6 @@ bg:
|
|
|
43
43
|
origin_component_id: Компонент, от който да се копират предложенията
|
|
44
44
|
proposals_import:
|
|
45
45
|
import_proposals: Копиране на предложения
|
|
46
|
-
keep_answers: Запазете състоянието и отговорите
|
|
47
46
|
keep_authors: Запази автора на оригинала
|
|
48
47
|
errors:
|
|
49
48
|
models:
|
|
@@ -203,6 +202,9 @@ bg:
|
|
|
203
202
|
admin:
|
|
204
203
|
proposal_note_created:
|
|
205
204
|
email_subject: Някой е направил бележка в предложението %{resource_title}.
|
|
205
|
+
coauthor_invited:
|
|
206
|
+
actions:
|
|
207
|
+
accept: Приеми
|
|
206
208
|
collaborative_draft_access_accepted:
|
|
207
209
|
email_intro: '%{requester_name} получи достъп като сътрудник в съвместната чернова <a href="%{resource_url}">%{resource_title}</a>.'
|
|
208
210
|
email_outro: Получихте известие, защото сте сътрудник в <a href="%{resource_url}">%{resource_title}</a>.
|
|
@@ -456,7 +458,6 @@ bg:
|
|
|
456
458
|
create: Импортиране на предложения
|
|
457
459
|
no_components: Няма други компоненти на предложения в това пространство за участие, от които да се импортират предложенията.
|
|
458
460
|
select_component: Моля, изберете компонент
|
|
459
|
-
select_states: Проверете състоянието на предложенията за импортиране
|
|
460
461
|
title: Импортиране на предложения от друг компонент
|
|
461
462
|
proposals_merges:
|
|
462
463
|
create:
|
|
@@ -691,6 +692,9 @@ bg:
|
|
|
691
692
|
answer: Отговор
|
|
692
693
|
changes_at_title: Изменение на „%{title}“
|
|
693
694
|
estimated_cost: Предвидени разходи
|
|
695
|
+
hidden_likes_count:
|
|
696
|
+
one: и още %{count}
|
|
697
|
+
other: и още %{count} души
|
|
694
698
|
link_to_collaborative_draft_help_text: Това предложение е резултат от съвместна чернова. Прегледайте хронологията
|
|
695
699
|
link_to_collaborative_draft_text: Вижте съвместната чернова
|
|
696
700
|
link_to_promoted_emendation_help_text: Това предложение е допринасяща поправка
|
data/config/locales/ca-IT.yml
CHANGED
|
@@ -53,7 +53,7 @@ ca-IT:
|
|
|
53
53
|
file: Arxiu
|
|
54
54
|
proposals_import:
|
|
55
55
|
import_proposals: Importar propostes
|
|
56
|
-
keep_answers: Manté
|
|
56
|
+
keep_answers: Manté els estats i les respostes
|
|
57
57
|
keep_authors: Mantenir l'autoria original
|
|
58
58
|
errors:
|
|
59
59
|
models:
|
|
@@ -370,9 +370,9 @@ ca-IT:
|
|
|
370
370
|
notification_title: La teva proposta <a href="%{resource_path}">%{resource_title}</a>ha canviat el seu estat a "%{state}".
|
|
371
371
|
follower:
|
|
372
372
|
email_intro: 'La proposta "%{resource_title}" ha canviat d''estat a "%{state}". Pots llegir la resposta en aquesta pàgina:'
|
|
373
|
-
email_outro: Has rebut aquesta notificació perquè estàs seguint "%{resource_title}". Pots deixar de seguir-ho des de l'enllaç anterior.
|
|
373
|
+
email_outro: Has rebut aquesta notificació perquè estàs seguint l'espai "%{resource_title}". Pots deixar de seguir-ho des de l'enllaç anterior.
|
|
374
374
|
email_subject: Una proposta que segueixes ha canviat el seu estat (%{state})
|
|
375
|
-
notification_title: La
|
|
375
|
+
notification_title: La proposta <a href="%{resource_path}">%{resource_title}</a> ha canviat el seu estat a "%{state}".
|
|
376
376
|
proposal_update_taxonomies:
|
|
377
377
|
email_intro: 'Una administradora ha actualitzat les taxonomies de la teva proposta "%{resource_title}", fes-hi una ullada:'
|
|
378
378
|
email_outro: Has rebut aquesta notificació perquè ets l'autora de la proposta.
|
|
@@ -690,9 +690,9 @@ ca-IT:
|
|
|
690
690
|
success: El procés d'importació ha començat. T'avisarem quan hagi finalitzat.
|
|
691
691
|
new:
|
|
692
692
|
create: Importa propostes
|
|
693
|
-
no_components: No hi ha cap altre component de propostes en aquest espai
|
|
693
|
+
no_components: No hi ha cap altre component de propostes en aquest espai de participació des d'on importar-les.
|
|
694
694
|
select_component: Escull un component
|
|
695
|
-
select_states:
|
|
695
|
+
select_states: Importa només les propostes amb aquests estats. Si no s'ha seleccionat cap estat, s'importaran totes les propostes.
|
|
696
696
|
title: Importar projectes des d'un altre component
|
|
697
697
|
proposals_merges:
|
|
698
698
|
create:
|
|
@@ -771,11 +771,11 @@ ca-IT:
|
|
|
771
771
|
all: Tots
|
|
772
772
|
amendment: Esmenes
|
|
773
773
|
open: Obert
|
|
774
|
-
published:
|
|
774
|
+
published: Publicades
|
|
775
775
|
related_to: Relacionat amb
|
|
776
776
|
search: Cerca
|
|
777
777
|
state: Estat
|
|
778
|
-
withdrawn:
|
|
778
|
+
withdrawn: Retirada
|
|
779
779
|
filters_small_view:
|
|
780
780
|
close_modal: Tanca la finestra
|
|
781
781
|
filter: Filtre
|
|
@@ -805,7 +805,7 @@ ca-IT:
|
|
|
805
805
|
error: No s'ha pogut completar la teva sol·licitud, si us plau torna-ho a provar més tard.
|
|
806
806
|
success: La teva sol·licitud de contribució s'ha enviat correctament.
|
|
807
807
|
collaboration_requests:
|
|
808
|
-
accept_request:
|
|
808
|
+
accept_request: Acceptar
|
|
809
809
|
reject_request: Rebutja
|
|
810
810
|
title: Sol·licituds de col·laboració
|
|
811
811
|
rejected_request:
|
|
@@ -827,10 +827,10 @@ ca-IT:
|
|
|
827
827
|
withdraw: retira l'esborrany
|
|
828
828
|
states:
|
|
829
829
|
open: Obert
|
|
830
|
-
published:
|
|
831
|
-
withdrawn:
|
|
830
|
+
published: Publicades
|
|
831
|
+
withdrawn: Retirada
|
|
832
832
|
update:
|
|
833
|
-
error:
|
|
833
|
+
error: Hi ha hagut un error en desar l'esborrany col·laboratiu.
|
|
834
834
|
success: L'esborrany col·laboratiu s'ha actualitzat correctament.
|
|
835
835
|
wizard_aside:
|
|
836
836
|
back_from_collaborative_draft: Tornar a l'esborrany col·laboratiu
|
|
@@ -982,7 +982,7 @@ ca-IT:
|
|
|
982
982
|
edit_proposal: Editar
|
|
983
983
|
estimated_cost: Cost estimat
|
|
984
984
|
hidden_likes_count:
|
|
985
|
-
one: i %{count}
|
|
985
|
+
one: i %{count} persona més
|
|
986
986
|
other: i %{count} persones més
|
|
987
987
|
link_to_collaborative_draft_help_text: Aquesta proposta és el resultat d'un esborrany col·laboratiu. Revisa l'historial
|
|
988
988
|
link_to_collaborative_draft_text: Veure l'esborrany col·laboratiu
|