decidim-templates 0.27.4 → 0.28.0.rc5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/commands/decidim/templates/admin/apply_questionnaire_template.rb +1 -1
- data/app/commands/decidim/templates/admin/copy_proposal_answer_template.rb +21 -0
- data/app/commands/decidim/templates/admin/copy_questionnaire_template.rb +3 -33
- data/app/commands/decidim/templates/admin/copy_template.rb +43 -0
- data/app/commands/decidim/templates/admin/create_block_user_template.rb +15 -0
- data/app/commands/decidim/templates/admin/create_proposal_answer_template.rb +47 -0
- data/app/commands/decidim/templates/admin/create_questionnaire_template.rb +6 -19
- data/app/commands/decidim/templates/admin/create_template.rb +54 -0
- data/app/commands/decidim/templates/admin/destroy_questionnaire_template.rb +22 -0
- data/app/commands/decidim/templates/admin/update_proposal_answer_template.rb +51 -0
- data/app/commands/decidim/templates/admin/update_template.rb +6 -0
- data/app/controllers/decidim/templates/admin/application_controller.rb +0 -8
- data/app/controllers/decidim/templates/admin/block_user_templates_controller.rb +124 -0
- data/app/controllers/decidim/templates/admin/concerns/templatable.rb +1 -1
- data/app/controllers/decidim/templates/admin/proposal_answer_templates_controller.rb +173 -0
- data/app/controllers/decidim/templates/admin/questionnaire_templates_controller.rb +4 -6
- data/app/forms/decidim/templates/admin/proposal_answer_template_form.rb +23 -0
- data/app/helpers/decidim/templates/admin/application_helper.rb +18 -0
- data/app/models/decidim/templates/template.rb +0 -6
- data/app/packs/entrypoints/decidim_templates_admin.js +2 -0
- data/app/packs/src/decidim/templates/admin/block_user_template_chooser.js +20 -0
- data/app/packs/src/decidim/templates/admin/choose_template.js +4 -10
- data/app/packs/src/decidim/templates/admin/proposal_answer_template_chooser.js +31 -0
- data/app/packs/stylesheets/decidim/templates/templates.scss +3 -12
- data/app/presenters/decidim/templates/admin_log/template_presenter.rb +2 -2
- data/app/views/decidim/templates/admin/block_user_templates/_form.html.erb +13 -0
- data/app/views/decidim/templates/admin/block_user_templates/_template_chooser.html.erb +12 -0
- data/app/views/decidim/templates/admin/block_user_templates/edit.html.erb +18 -0
- data/app/views/decidim/templates/admin/block_user_templates/index.html.erb +45 -0
- data/app/views/decidim/templates/admin/block_user_templates/new.html.erb +18 -0
- data/app/views/decidim/templates/admin/proposal_answer_templates/_form.html.erb +38 -0
- data/app/views/decidim/templates/admin/proposal_answer_templates/_template_chooser.html.erb +16 -0
- data/app/views/decidim/templates/admin/proposal_answer_templates/edit.html.erb +18 -0
- data/app/views/decidim/templates/admin/proposal_answer_templates/index.html.erb +51 -0
- data/app/views/decidim/templates/admin/proposal_answer_templates/new.html.erb +18 -0
- data/app/views/decidim/templates/admin/questionnaire_templates/_choose.html.erb +35 -35
- data/app/views/decidim/templates/admin/questionnaire_templates/_form.html.erb +9 -12
- data/app/views/decidim/templates/admin/questionnaire_templates/_preview.html.erb +52 -60
- data/app/views/decidim/templates/admin/questionnaire_templates/edit.html.erb +31 -16
- data/app/views/decidim/templates/admin/questionnaire_templates/index.html.erb +6 -8
- data/app/views/decidim/templates/admin/questionnaire_templates/new.html.erb +18 -7
- data/app/views/decidim/templates/admin/questionnaire_templates/preview.js.erb +3 -0
- data/app/views/layouts/decidim/admin/templates.html.erb +1 -9
- data/config/assets.rb +2 -1
- data/config/environment.rb +3 -0
- data/config/locales/ar.yml +8 -2
- data/config/locales/ca.yml +47 -8
- data/config/locales/cs.yml +47 -8
- data/config/locales/de.yml +47 -8
- data/config/locales/en.yml +47 -8
- data/config/locales/es-MX.yml +47 -8
- data/config/locales/es-PY.yml +47 -8
- data/config/locales/es.yml +47 -8
- data/config/locales/eu.yml +53 -14
- data/config/locales/fi-plain.yml +47 -8
- data/config/locales/fi.yml +47 -8
- data/config/locales/fr-CA.yml +33 -8
- data/config/locales/fr.yml +47 -8
- data/config/locales/ga-IE.yml +6 -2
- data/config/locales/gl.yml +6 -10
- data/config/locales/hu.yml +6 -10
- data/config/locales/it.yml +6 -10
- data/config/locales/ja.yml +28 -8
- data/config/locales/kaa.yml +4 -1
- data/config/locales/lt.yml +19 -8
- data/config/locales/nl.yml +6 -11
- data/config/locales/no.yml +6 -10
- data/config/locales/pl.yml +6 -10
- data/config/locales/pt-BR.yml +6 -10
- data/config/locales/pt.yml +6 -10
- data/config/locales/ro-RO.yml +18 -8
- data/config/locales/sq-AL.yml +1 -0
- data/config/locales/sv.yml +6 -2
- data/config/locales/th-TH.yml +1 -0
- data/config/locales/tr-TR.yml +8 -10
- data/config/locales/zh-CN.yml +6 -11
- data/config/locales/zh-TW.yml +18 -8
- data/db/migrate/20221006055954_add_field_values_and_target_to_decidim_templates.rb +21 -0
- data/db/seeds.rb +6 -6
- data/lib/decidim/templates/admin_engine.rb +23 -24
- data/lib/decidim/templates/engine.rb +4 -0
- data/lib/decidim/templates/menu.rb +48 -0
- data/lib/decidim/templates/test/factories.rb +16 -1
- data/lib/decidim/templates/test/shared_examples/copies_all_questionnaire_contents_examples.rb +3 -3
- data/lib/decidim/templates/test/shared_examples/uses_questionnaire_templates.rb +8 -6
- data/lib/decidim/templates/version.rb +1 -1
- metadata +49 -16
@@ -0,0 +1,173 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Templates
|
5
|
+
module Admin
|
6
|
+
class ProposalAnswerTemplatesController < Decidim::Templates::Admin::ApplicationController
|
7
|
+
include Decidim::TranslatableAttributes
|
8
|
+
include Decidim::Paginable
|
9
|
+
|
10
|
+
helper_method :availability_option_as_text, :availability_options_for_select
|
11
|
+
|
12
|
+
def new
|
13
|
+
enforce_permission_to :create, :template
|
14
|
+
@form = form(ProposalAnswerTemplateForm).instance
|
15
|
+
end
|
16
|
+
|
17
|
+
def edit
|
18
|
+
enforce_permission_to(:update, :template, template:)
|
19
|
+
@form = form(ProposalAnswerTemplateForm).from_model(template)
|
20
|
+
end
|
21
|
+
|
22
|
+
def create
|
23
|
+
enforce_permission_to :create, :template
|
24
|
+
|
25
|
+
@form = form(ProposalAnswerTemplateForm).from_params(params)
|
26
|
+
|
27
|
+
CreateProposalAnswerTemplate.call(@form) do
|
28
|
+
on(:ok) do |_template|
|
29
|
+
flash[:notice] = I18n.t("templates.create.success", scope: "decidim.admin")
|
30
|
+
redirect_to proposal_answer_templates_path
|
31
|
+
end
|
32
|
+
|
33
|
+
on(:invalid) do
|
34
|
+
flash.now[:alert] = I18n.t("templates.create.error", scope: "decidim.admin")
|
35
|
+
render :new
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def destroy
|
41
|
+
enforce_permission_to(:destroy, :template, template:)
|
42
|
+
|
43
|
+
DestroyTemplate.call(template, current_user) do
|
44
|
+
on(:ok) do
|
45
|
+
flash[:notice] = I18n.t("templates.destroy.success", scope: "decidim.admin")
|
46
|
+
redirect_to action: :index
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def fetch
|
52
|
+
enforce_permission_to(:read, :template, template:)
|
53
|
+
|
54
|
+
response_object = {
|
55
|
+
state: template.field_values["internal_state"],
|
56
|
+
template: populate_template_interpolations(proposal)
|
57
|
+
}
|
58
|
+
|
59
|
+
respond_to do |format|
|
60
|
+
format.json do
|
61
|
+
render json: response_object.to_json
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def update
|
67
|
+
enforce_permission_to(:update, :template, template:)
|
68
|
+
@form = form(ProposalAnswerTemplateForm).from_params(params)
|
69
|
+
UpdateProposalAnswerTemplate.call(template, @form, current_user) do
|
70
|
+
on(:ok) do |_questionnaire_template|
|
71
|
+
flash[:notice] = I18n.t("templates.update.success", scope: "decidim.admin")
|
72
|
+
redirect_to proposal_answer_templates_path
|
73
|
+
end
|
74
|
+
|
75
|
+
on(:invalid) do |template|
|
76
|
+
@template = template
|
77
|
+
flash.now[:error] = I18n.t("templates.update.error", scope: "decidim.admin")
|
78
|
+
render action: :edit
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def copy
|
84
|
+
enforce_permission_to :copy, :template
|
85
|
+
|
86
|
+
CopyProposalAnswerTemplate.call(template, current_user) do
|
87
|
+
on(:ok) do
|
88
|
+
flash[:notice] = I18n.t("templates.copy.success", scope: "decidim.admin")
|
89
|
+
redirect_to action: :index
|
90
|
+
end
|
91
|
+
|
92
|
+
on(:invalid) do
|
93
|
+
flash[:alert] = I18n.t("templates.copy.error", scope: "decidim.admin")
|
94
|
+
redirect_to action: :index
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def index
|
100
|
+
enforce_permission_to :index, :templates
|
101
|
+
@templates = collection
|
102
|
+
|
103
|
+
respond_to do |format|
|
104
|
+
format.html { render :index }
|
105
|
+
format.json do
|
106
|
+
term = params[:term]
|
107
|
+
|
108
|
+
@templates = search(term)
|
109
|
+
|
110
|
+
render json: @templates.map { |t| { value: t.id, label: translated_attribute(t.name) } }
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
private
|
116
|
+
|
117
|
+
def populate_template_interpolations(proposal)
|
118
|
+
template.description.to_h do |language, value|
|
119
|
+
value.gsub!("%{organization}", proposal.organization.name)
|
120
|
+
value.gsub!("%{name}", author_name(proposal))
|
121
|
+
value.gsub!("%{admin}", current_user.name)
|
122
|
+
|
123
|
+
[language, value]
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def author_name(proposal)
|
128
|
+
proposal.creator_author.try(:title) || proposal.creator_author.try(:name)
|
129
|
+
end
|
130
|
+
|
131
|
+
def proposal
|
132
|
+
@proposal ||= Decidim::Proposals::Proposal.find(params[:proposalId])
|
133
|
+
end
|
134
|
+
|
135
|
+
def availability_option_as_text(template)
|
136
|
+
return unless template.templatable_type
|
137
|
+
return t("global_scope", scope: "decidim.templates.admin.proposal_answer_templates.index") if template.templatable == current_organization
|
138
|
+
|
139
|
+
avaliablity_options.select { |a| a.last == template.templatable_id }&.flatten&.first || t("templates.missing_resource", scope: "decidim.admin")
|
140
|
+
end
|
141
|
+
|
142
|
+
def availability_options_for_select
|
143
|
+
avaliablity_options
|
144
|
+
end
|
145
|
+
|
146
|
+
def avaliablity_options
|
147
|
+
@avaliablity_options = []
|
148
|
+
@avaliablity_options.push [t("global_scope", scope: "decidim.templates.admin.proposal_answer_templates.index"), 0]
|
149
|
+
|
150
|
+
Decidim::Component.includes(:participatory_space).where(manifest_name: [:proposals])
|
151
|
+
.select { |a| a.participatory_space.decidim_organization_id == current_organization.id }.each do |component|
|
152
|
+
@avaliablity_options.push [formatted_name(component), component.id]
|
153
|
+
end
|
154
|
+
|
155
|
+
@avaliablity_options
|
156
|
+
end
|
157
|
+
|
158
|
+
def formatted_name(component)
|
159
|
+
space_type = t(component.participatory_space.class.name.underscore, scope: "activerecord.models", count: 1)
|
160
|
+
"#{space_type}: #{translated_attribute(component.participatory_space.title)} > #{translated_attribute(component.name)}"
|
161
|
+
end
|
162
|
+
|
163
|
+
def template
|
164
|
+
@template ||= Template.find_by(id: params[:id])
|
165
|
+
end
|
166
|
+
|
167
|
+
def collection
|
168
|
+
@collection ||= paginate(current_organization.templates.where(target: :proposal_answer).order(:id))
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
@@ -8,8 +8,6 @@ module Decidim
|
|
8
8
|
class QuestionnaireTemplatesController < Decidim::Templates::Admin::ApplicationController
|
9
9
|
include Decidim::TranslatableAttributes
|
10
10
|
|
11
|
-
skip_before_action :verify_authenticity_token, only: :preview
|
12
|
-
|
13
11
|
helper_method :template
|
14
12
|
|
15
13
|
def index
|
@@ -68,13 +66,13 @@ module Decidim
|
|
68
66
|
end
|
69
67
|
|
70
68
|
def edit
|
71
|
-
enforce_permission_to
|
69
|
+
enforce_permission_to(:update, :template, template:)
|
72
70
|
@form = form(TemplateForm).from_model(template)
|
73
71
|
@preview_form = form(Decidim::Forms::QuestionnaireForm).from_model(template.templatable)
|
74
72
|
end
|
75
73
|
|
76
74
|
def update
|
77
|
-
enforce_permission_to
|
75
|
+
enforce_permission_to(:update, :template, template:)
|
78
76
|
@form = form(TemplateForm).from_params(params)
|
79
77
|
UpdateTemplate.call(template, @form, current_user) do
|
80
78
|
on(:ok) do |questionnaire_template|
|
@@ -91,9 +89,9 @@ module Decidim
|
|
91
89
|
end
|
92
90
|
|
93
91
|
def destroy
|
94
|
-
enforce_permission_to
|
92
|
+
enforce_permission_to(:destroy, :template, template:)
|
95
93
|
|
96
|
-
|
94
|
+
DestroyQuestionnaireTemplate.call(template, current_user) do
|
97
95
|
on(:ok) do
|
98
96
|
flash[:notice] = I18n.t("templates.destroy.success", scope: "decidim.admin")
|
99
97
|
redirect_to action: :index
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Templates
|
5
|
+
module Admin
|
6
|
+
class ProposalAnswerTemplateForm < TemplateForm
|
7
|
+
attribute :internal_state, String
|
8
|
+
attribute :component_constraint, Integer
|
9
|
+
|
10
|
+
validates :internal_state, presence: true
|
11
|
+
|
12
|
+
def map_model(model)
|
13
|
+
self.internal_state = model.field_values["internal_state"]
|
14
|
+
self.component_constraint = if model.templatable_type == "Decidim::Organization"
|
15
|
+
0
|
16
|
+
else
|
17
|
+
model.templatable&.id
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Templates
|
5
|
+
# Custom helpers, scoped to the templates engine.
|
6
|
+
#
|
7
|
+
module Admin
|
8
|
+
module ApplicationHelper
|
9
|
+
def block_user_templates
|
10
|
+
Decidim::Templates::Template.where(
|
11
|
+
target: :user_block,
|
12
|
+
templatable: [current_organization]
|
13
|
+
).order(:templatable_id)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -19,18 +19,12 @@ module Decidim
|
|
19
19
|
|
20
20
|
belongs_to :templatable, foreign_type: "templatable_type", polymorphic: true, optional: true
|
21
21
|
|
22
|
-
before_destroy :destroy_templatable
|
23
|
-
|
24
22
|
validates :name, presence: true
|
25
23
|
|
26
24
|
def resource_name
|
27
25
|
[templatable_type.demodulize.tableize.singularize, "templates"].join("_")
|
28
26
|
end
|
29
27
|
|
30
|
-
def destroy_templatable
|
31
|
-
templatable.destroy
|
32
|
-
end
|
33
|
-
|
34
28
|
def self.log_presenter_class_for(_log)
|
35
29
|
Decidim::Templates::AdminLog::TemplatePresenter
|
36
30
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
// Choose a Block User Message template, get it by AJAX and add the Template in the justification textarea
|
2
|
+
document.addEventListener("DOMContentLoaded", () => {
|
3
|
+
const blockTemplateChooser = document.getElementById("block_template_chooser");
|
4
|
+
if (blockTemplateChooser) {
|
5
|
+
blockTemplateChooser.addEventListener("change", () => {
|
6
|
+
const dropdown = document.getElementById("block_template_chooser");
|
7
|
+
const url = dropdown.getAttribute("data-url");
|
8
|
+
const templateId = dropdown.value;
|
9
|
+
|
10
|
+
if (templateId === "") {
|
11
|
+
return;
|
12
|
+
}
|
13
|
+
fetch(`${new URL(url).pathname}?${new URLSearchParams({ id: templateId })}`).
|
14
|
+
then((response) => response.json()).
|
15
|
+
then((data) => {
|
16
|
+
document.getElementById("block_user_justification").value = data.template;
|
17
|
+
})
|
18
|
+
});
|
19
|
+
}
|
20
|
+
});
|
@@ -13,16 +13,10 @@ $(() => {
|
|
13
13
|
return;
|
14
14
|
}
|
15
15
|
const params = new URLSearchParams({ id: id });
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
const script = document.createElement("script");
|
21
|
-
script.type = "text/javascript";
|
22
|
-
script.innerHTML = data;
|
23
|
-
document.getElementsByTagName("head")[0].appendChild(script);
|
24
|
-
}).catch((error) => {
|
25
|
-
console.error(error); // eslint-disable-line no-console
|
16
|
+
Rails.ajax({
|
17
|
+
url: `${previewURL}?${params.toString()}`,
|
18
|
+
type: "GET",
|
19
|
+
error: (data) => (console.error(data))
|
26
20
|
});
|
27
21
|
}
|
28
22
|
|
@@ -0,0 +1,31 @@
|
|
1
|
+
// Choose a Proposal Answer template, get it by AJAX and add the Template in the Proposal Answer textarea
|
2
|
+
document.addEventListener("DOMContentLoaded", () => {
|
3
|
+
const proposalAnswerTemplateChooser = document.getElementById("proposal_answer_template_chooser");
|
4
|
+
if (proposalAnswerTemplateChooser) {
|
5
|
+
|
6
|
+
proposalAnswerTemplateChooser.addEventListener("change", () => {
|
7
|
+
const dropdown = document.getElementById("proposal_answer_template_chooser");
|
8
|
+
const url = dropdown.getAttribute("data-url");
|
9
|
+
const templateId = dropdown.value;
|
10
|
+
const proposalId = dropdown.dataset.proposal;
|
11
|
+
|
12
|
+
if (templateId === "") {
|
13
|
+
return;
|
14
|
+
}
|
15
|
+
fetch(`${new URL(url).pathname}?${new URLSearchParams({ id: templateId, proposalId: proposalId })}`).
|
16
|
+
then((response) => response.json()).
|
17
|
+
then((data) => {
|
18
|
+
document.getElementById(`proposal_answer_internal_state_${data.state}`).click();
|
19
|
+
|
20
|
+
let editorContainer = null;
|
21
|
+
for (const [key, value] of Object.entries(data.template)) {
|
22
|
+
editorContainer = document.querySelector(`[name="proposal_answer[answer_${key}]"]`).nextElementSibling;
|
23
|
+
let editor = editorContainer.querySelector(".ProseMirror").editor;
|
24
|
+
|
25
|
+
editor.commands.setContent(value, true);
|
26
|
+
}
|
27
|
+
})
|
28
|
+
});
|
29
|
+
|
30
|
+
}
|
31
|
+
});
|
@@ -1,14 +1,5 @@
|
|
1
|
-
.questionnaire-template-preview{
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
.card{
|
6
|
-
width: 75%;
|
7
|
-
margin: auto;
|
8
|
-
border: none;
|
1
|
+
.questionnaire-template-preview {
|
2
|
+
.card {
|
3
|
+
@apply w-full m-auto border-0;
|
9
4
|
}
|
10
5
|
}
|
11
|
-
|
12
|
-
.choose-template-preview{
|
13
|
-
min-height: 10rem;
|
14
|
-
}
|
@@ -6,8 +6,8 @@ module Decidim
|
|
6
6
|
# This class holds the logic to present a `Decidim::Template`
|
7
7
|
# for the `AdminLog` log.
|
8
8
|
#
|
9
|
-
# Usage should be automatic and you
|
10
|
-
# directly, but here
|
9
|
+
# Usage should be automatic and you should not need to call this class
|
10
|
+
# directly, but here is an example:
|
11
11
|
#
|
12
12
|
# action_log = Decidim::ActionLog.last
|
13
13
|
# view_helpers # => this comes from the views
|
@@ -0,0 +1,13 @@
|
|
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, :name, aria: { label: :name } %>
|
6
|
+
</div>
|
7
|
+
|
8
|
+
<div class="row column">
|
9
|
+
<%= form.translated :text_area, :description, rows: 3, aria: { label: :description } %>
|
10
|
+
</div>
|
11
|
+
</div>
|
12
|
+
</div>
|
13
|
+
</div>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<% if block_user_templates.any? %>
|
2
|
+
<div class="row column">
|
3
|
+
<%= append_javascript_pack_tag "decidim_templates_admin" %>
|
4
|
+
|
5
|
+
<select id="block_template_chooser" data-locale="en" data-url="<%= decidim_admin_templates.fetch_block_user_templates_url %>">
|
6
|
+
<option value=""><%= t(".select_template") %></option>
|
7
|
+
<% block_user_templates.each do |template| %>
|
8
|
+
<option value="<%= template.id %>"><%= translated_attribute(template.name) %></option>
|
9
|
+
<% end %>
|
10
|
+
</select>
|
11
|
+
</div>
|
12
|
+
<% end %>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<% add_decidim_page_title(t(".title")) %>
|
2
|
+
<div class="item_show__header">
|
3
|
+
<h2 class="item_show__header-title">
|
4
|
+
<%= t(".title") %>
|
5
|
+
</h2>
|
6
|
+
</div>
|
7
|
+
<div class="item__edit item__edit-1col">
|
8
|
+
<div class="item__edit-form">
|
9
|
+
<%= decidim_form_for(@form, url: block_user_template_path, html: { class: "form-defaults form edit_user_block_template" }) do |f| %>
|
10
|
+
<%= render partial: "form", object: f %>
|
11
|
+
<div class="item__edit-sticky">
|
12
|
+
<div class="item__edit-sticky-container">
|
13
|
+
<%= f.submit t("save", scope: "decidim.templates.admin.block_user_templates.form"), class: "button button__sm button__secondary" %>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
<% end %>
|
17
|
+
</div>
|
18
|
+
</div>
|
@@ -0,0 +1,45 @@
|
|
1
|
+
<% add_decidim_page_title(t(".title")) %>
|
2
|
+
<div class="card">
|
3
|
+
<div class="item_show__header">
|
4
|
+
<h2 class="item_show__header-title">
|
5
|
+
<%= t ".title" %>
|
6
|
+
<% if allowed_to?(:create, :template) %>
|
7
|
+
<%= link_to t("actions.new_template", scope: "decidim.admin.templates"), [:new, :block_user_template], class: "button button__sm button__secondary new" %>
|
8
|
+
<% end %>
|
9
|
+
</h2>
|
10
|
+
</div>
|
11
|
+
<% if @templates.any? %>
|
12
|
+
<div class="table-scroll">
|
13
|
+
<table class="table-list user_block-templates">
|
14
|
+
<thead>
|
15
|
+
<tr>
|
16
|
+
<th><%= t("template.name", scope: "decidim.models") %></th>
|
17
|
+
<th><%= t("template.fields.created_at", scope: "decidim.models") %></th>
|
18
|
+
<th></th>
|
19
|
+
</tr>
|
20
|
+
</thead>
|
21
|
+
<tbody>
|
22
|
+
<% @templates.each do |template| %>
|
23
|
+
<tr data-questionnaire_template-id="<%= template.id %>">
|
24
|
+
<td><%= link_to translated_attribute(template.name), edit_block_user_template_path(template) %></td>
|
25
|
+
<td><%= l template.created_at, format: :long %></td>
|
26
|
+
<td class="table-list__actions">
|
27
|
+
<% if allowed_to?(:update, :template, questionnaire_template: template) %>
|
28
|
+
<%= icon_link_to "pencil-line", edit_block_user_template_path(template), t("actions.edit", scope: "decidim.admin"), class: "edit" %>
|
29
|
+
<% end %>
|
30
|
+
<% if allowed_to?(:copy, :template, questionnaire_template: template) %>
|
31
|
+
<%= icon_link_to "file-copy-line", copy_block_user_template_path(template), t("actions.duplicate", scope: "decidim.admin"), method: :post %>
|
32
|
+
<% end %>
|
33
|
+
<% if allowed_to?(:destroy, :template, questionnaire_template: template) %>
|
34
|
+
<%= icon_link_to "delete-bin-line", block_user_template_path(template), t("actions.destroy", scope: "decidim.admin"), method: :delete, data: { confirm: t(".confirm_delete") }, class: "action-icon--remove" %>
|
35
|
+
<% end %>
|
36
|
+
</td>
|
37
|
+
</tr>
|
38
|
+
<% end %>
|
39
|
+
</tbody>
|
40
|
+
</table>
|
41
|
+
</div>
|
42
|
+
<% else %>
|
43
|
+
<%= t("templates.empty", scope: "decidim.admin") %>
|
44
|
+
<% end %>
|
45
|
+
</div>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<% add_decidim_page_title(t(".title")) %>
|
2
|
+
<div class="item_show__header">
|
3
|
+
<h2 class="item_show__header-title">
|
4
|
+
<%= t(".title") %>
|
5
|
+
</h2>
|
6
|
+
</div>
|
7
|
+
<div class="item__edit item__edit-1col">
|
8
|
+
<div class="item__edit-form">
|
9
|
+
<%= decidim_form_for(@form, url: block_user_templates_path, html: { class: "form-defaults form new_user_block_template" }) do |f| %>
|
10
|
+
<%= render partial: "form", object: f %>
|
11
|
+
<div class="item__edit-sticky">
|
12
|
+
<div class="item__edit-sticky-container">
|
13
|
+
<%= f.submit t("save", scope: "decidim.templates.admin.block_user_templates.form"), class: "button button__sm button__secondary" %>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
<% end %>
|
17
|
+
</div>
|
18
|
+
</div>
|
@@ -0,0 +1,38 @@
|
|
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, :name, aria: { label: :name } %>
|
6
|
+
</div>
|
7
|
+
|
8
|
+
<div class="row column">
|
9
|
+
<%= form.translated :editor, :description, rows: 3, aria: { label: :description } %>
|
10
|
+
<%= t(".hint_html") %>
|
11
|
+
<ul>
|
12
|
+
<li><%= t(".hint1_html") %></li>
|
13
|
+
<li><%= t(".hint2_html") %></li>
|
14
|
+
<li><%= t(".hint3_html") %></li>
|
15
|
+
</ul>
|
16
|
+
</div>
|
17
|
+
|
18
|
+
<div class="row column">
|
19
|
+
<%= form.label :internal_state %>
|
20
|
+
<div class="flex items-center gap-x-4 my-2">
|
21
|
+
<%= form.collection_radio_buttons :internal_state,
|
22
|
+
Decidim::Proposals::Proposal::STATES.keys - [:withdrawn],
|
23
|
+
:to_s,
|
24
|
+
->(mode) { t(mode, scope: "decidim.proposals.admin.proposal_answers.form") },
|
25
|
+
prompt: true do |builder|
|
26
|
+
builder.label { builder.radio_button + builder.text }
|
27
|
+
end %>
|
28
|
+
</div>
|
29
|
+
</div>
|
30
|
+
|
31
|
+
<div class="row column">
|
32
|
+
<%= form.select :component_constraint, availability_options_for_select,
|
33
|
+
sselected: form.object.component_constraint,
|
34
|
+
help_text: t(".component_constraint_help") %>
|
35
|
+
</div>
|
36
|
+
</div>
|
37
|
+
</div>
|
38
|
+
</div>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<% templates = Decidim::Templates::Template.where(
|
2
|
+
target: :proposal_answer,
|
3
|
+
templatable: [current_organization, current_component]
|
4
|
+
).order(:templatable_id) %>
|
5
|
+
<% if templates.any? %>
|
6
|
+
<div class="row column">
|
7
|
+
<%= append_javascript_pack_tag "decidim_templates_admin" %>
|
8
|
+
|
9
|
+
<select id="proposal_answer_template_chooser" data-locale="en" data-proposal="<%= proposal.id %>" data-url="<%= decidim_admin_templates.fetch_proposal_answer_templates_url %>">
|
10
|
+
<option value=""><%= t(".select_template") %></option>
|
11
|
+
<% templates.each do |template| %>
|
12
|
+
<option value="<%= template.id %>"><%= translated_attribute(template.name) %></option>
|
13
|
+
<% end %>
|
14
|
+
</select>
|
15
|
+
</div>
|
16
|
+
<% end %>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<% add_decidim_page_title(t(".title")) %>
|
2
|
+
<div class="item_show__header">
|
3
|
+
<h2 class="item_show__header-title">
|
4
|
+
<%= t(".title") %>
|
5
|
+
</h2>
|
6
|
+
</div>
|
7
|
+
<div class="item__edit item__edit-1col">
|
8
|
+
<div class="item__edit-form">
|
9
|
+
<%= decidim_form_for(@form, url: proposal_answer_template_path, html: { class: "form-defaults form edit_proposal_answer_template" }) do |f| %>
|
10
|
+
<%= render partial: "form", object: f %>
|
11
|
+
<div class="item__edit-sticky">
|
12
|
+
<div class="item__edit-sticky-container">
|
13
|
+
<%= f.submit t("save", scope: "decidim.templates.admin.proposal_answer_templates.form"), class: "button button__sm button__secondary" %>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
<% end %>
|
17
|
+
</div>
|
18
|
+
</div>
|
@@ -0,0 +1,51 @@
|
|
1
|
+
<% add_decidim_page_title(t(".title")) %>
|
2
|
+
|
3
|
+
<div class="card">
|
4
|
+
<div class="item_show__header">
|
5
|
+
<h2 class="item_show__header-title">
|
6
|
+
<%= t ".title" %>
|
7
|
+
<% if allowed_to?(:create, :template) %>
|
8
|
+
<%= link_to t("actions.new_template", scope: "decidim.admin.templates"), [:new, :proposal_answer_template], class: "button button__sm button__secondary new" %>
|
9
|
+
<% end %>
|
10
|
+
</h2>
|
11
|
+
</div>
|
12
|
+
<% if @templates.any? %>
|
13
|
+
<div class="table-scroll">
|
14
|
+
<table class="table-list">
|
15
|
+
<thead>
|
16
|
+
<tr>
|
17
|
+
<th><%= t("template.name", scope: "decidim.models") %></th>
|
18
|
+
<th><%= t(".internal_state") %></th>
|
19
|
+
<th><%= t(".component_constraint") %></th>
|
20
|
+
<th><%= t("template.fields.created_at", scope: "decidim.models") %></th>
|
21
|
+
<th></th>
|
22
|
+
</tr>
|
23
|
+
</thead>
|
24
|
+
<tbody>
|
25
|
+
<% @templates.each do |template| %>
|
26
|
+
<tr data-proposal_answer-id="<%= template.id %>">
|
27
|
+
<td><%= link_to_if allowed_to?(:update, :template, template:) , translated_attribute(template.name), edit_proposal_answer_template_path(template) %></td>
|
28
|
+
<td> <%= t(template.field_values.dig("internal_state"), scope: "decidim.proposals.admin.proposal_answers.form") %></td>
|
29
|
+
<td><%= availability_option_as_text(template) %></td>
|
30
|
+
<td><%= l template.created_at, format: :long %></td>
|
31
|
+
|
32
|
+
<td class="table-list__actions">
|
33
|
+
<% if allowed_to?(:update, :template, template:) %>
|
34
|
+
<%= icon_link_to "pencil-line", edit_proposal_answer_template_path(template), t("actions.edit", scope: "decidim.admin"), class: "edit" %>
|
35
|
+
<% end %>
|
36
|
+
<% if allowed_to?(:copy, :template, template:) %>
|
37
|
+
<%= icon_link_to "file-copy-line", copy_proposal_answer_template_path(template), t("actions.duplicate", scope: "decidim.admin"), method: :post %>
|
38
|
+
<% end %>
|
39
|
+
<% if allowed_to?(:destroy, :template, template:) %>
|
40
|
+
<%= icon_link_to "delete-bin-line", proposal_answer_template_path(template), t("actions.destroy", scope: "decidim.admin"), method: :delete, data: { confirm: t(".confirm_delete") }, class: "action-icon--remove" %>
|
41
|
+
<% end %>
|
42
|
+
</td>
|
43
|
+
</tr>
|
44
|
+
<% end %>
|
45
|
+
</tbody>
|
46
|
+
</table>
|
47
|
+
</div>
|
48
|
+
<% else %>
|
49
|
+
<%= t("templates.empty", scope: "decidim.admin") %>
|
50
|
+
<% end %>
|
51
|
+
</div>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<% add_decidim_page_title(t(".title")) %>
|
2
|
+
<div class="item_show__header">
|
3
|
+
<h2 class="item_show__header-title">
|
4
|
+
<%= t(".title") %>
|
5
|
+
</h2>
|
6
|
+
</div>
|
7
|
+
<div class="item__edit item__edit-1col">
|
8
|
+
<div class="item__edit-form">
|
9
|
+
<%= decidim_form_for(@form, url: proposal_answer_templates_path, html: { class: "form-defaults form new_proposal_answer_template" }) do |f| %>
|
10
|
+
<%= render partial: "form", object: f %>
|
11
|
+
<div class="item__edit-sticky">
|
12
|
+
<div class="item__edit-sticky-container">
|
13
|
+
<%= f.submit t("save", scope: "decidim.templates.admin.proposal_answer_templates.form"), class: "button button__sm button__secondary" %>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
<% end %>
|
17
|
+
</div>
|
18
|
+
</div>
|