decidim-participatory_documents 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 948f2ce3751047c3b4c93d8aabae2162612947b59468315bf241504324132f0e
4
- data.tar.gz: 7ca9e90b7d71c5675f42d4a474dd951f24be9dc06f8fa192ef8bcb755ce81482
3
+ metadata.gz: d15ab2a26c0e881ac9828a12577a6eab25ba5bf170f19d35401c9a7c878e66e5
4
+ data.tar.gz: aa488aea6b962f8442807ad0d7e74f87c3a08eee861f584c0015e03dc21c13a6
5
5
  SHA512:
6
- metadata.gz: ae6c812bfb33537c0945e3d0bb1d3fa11c81a86c65d5dde2016fe2965b8f265ed719e0b167c0613e20bc2de0cd223c49dfc503353536e00ca0e963d89a86385c
7
- data.tar.gz: 23fb8126196662085bc24f3fb3a74c78ab0dcbc733c011fe3e36685b02c9acd1da5a6f1af735a4baeb1aaaba79f897f540c55f6d58be8aaca9f4b5ddeba8fa8b
6
+ metadata.gz: ca9cd0de450e692d5ea0b05d2fe2f7a19ecb43fc9e3aed8b465b6a1e8a38692782f319d31828bc23b3ddd528fe880626e973a3ed1e72c4bb776a10e5686c111b
7
+ data.tar.gz: aac05750446931a873b85b1851b0a12d089a07c7ba07d55d21ef9abc82159a72ba1be70cdf3104388e1156ca8ab2b65fcae8ab34f26dffa4474746eb6fcf0b12
@@ -36,6 +36,13 @@ jobs:
36
36
  - uses: actions/checkout@v4
37
37
  with:
38
38
  fetch-depth: 1
39
+ - uses: nanasess/setup-chromedriver@v2
40
+ with:
41
+ chromedriver-version: 119.0.6045.105
42
+
43
+ - uses: nanasess/setup-chromedriver@v2
44
+ with:
45
+ chromedriver-version: 119.0.6045.105
39
46
 
40
47
  - uses: ruby/setup-ruby@v1
41
48
  with:
data/Gemfile.lock CHANGED
@@ -1,12 +1,13 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- decidim-participatory_documents (0.2.1)
4
+ decidim-participatory_documents (0.2.2)
5
5
  decidim-core (>= 0.27.0, < 0.28)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
+ abbrev (0.1.2)
10
11
  actioncable (6.1.7.6)
11
12
  actionpack (= 6.1.7.6)
12
13
  activesupport (= 6.1.7.6)
@@ -159,53 +160,53 @@ GEM
159
160
  db-query-matchers (0.10.0)
160
161
  activesupport (>= 4.0, < 7)
161
162
  rspec (~> 3.0)
162
- decidim (0.27.4)
163
- decidim-accountability (= 0.27.4)
164
- decidim-admin (= 0.27.4)
165
- decidim-api (= 0.27.4)
166
- decidim-assemblies (= 0.27.4)
167
- decidim-blogs (= 0.27.4)
168
- decidim-budgets (= 0.27.4)
169
- decidim-comments (= 0.27.4)
170
- decidim-core (= 0.27.4)
171
- decidim-debates (= 0.27.4)
172
- decidim-forms (= 0.27.4)
173
- decidim-generators (= 0.27.4)
174
- decidim-meetings (= 0.27.4)
175
- decidim-pages (= 0.27.4)
176
- decidim-participatory_processes (= 0.27.4)
177
- decidim-proposals (= 0.27.4)
178
- decidim-sortitions (= 0.27.4)
179
- decidim-surveys (= 0.27.4)
180
- decidim-system (= 0.27.4)
181
- decidim-templates (= 0.27.4)
182
- decidim-verifications (= 0.27.4)
183
- decidim-accountability (0.27.4)
184
- decidim-comments (= 0.27.4)
185
- decidim-core (= 0.27.4)
186
- decidim-admin (0.27.4)
163
+ decidim (0.27.5)
164
+ decidim-accountability (= 0.27.5)
165
+ decidim-admin (= 0.27.5)
166
+ decidim-api (= 0.27.5)
167
+ decidim-assemblies (= 0.27.5)
168
+ decidim-blogs (= 0.27.5)
169
+ decidim-budgets (= 0.27.5)
170
+ decidim-comments (= 0.27.5)
171
+ decidim-core (= 0.27.5)
172
+ decidim-debates (= 0.27.5)
173
+ decidim-forms (= 0.27.5)
174
+ decidim-generators (= 0.27.5)
175
+ decidim-meetings (= 0.27.5)
176
+ decidim-pages (= 0.27.5)
177
+ decidim-participatory_processes (= 0.27.5)
178
+ decidim-proposals (= 0.27.5)
179
+ decidim-sortitions (= 0.27.5)
180
+ decidim-surveys (= 0.27.5)
181
+ decidim-system (= 0.27.5)
182
+ decidim-templates (= 0.27.5)
183
+ decidim-verifications (= 0.27.5)
184
+ decidim-accountability (0.27.5)
185
+ decidim-comments (= 0.27.5)
186
+ decidim-core (= 0.27.5)
187
+ decidim-admin (0.27.5)
187
188
  active_link_to (~> 1.0)
188
- decidim-core (= 0.27.4)
189
+ decidim-core (= 0.27.5)
189
190
  devise (~> 4.7)
190
191
  devise-i18n (~> 1.2)
191
- devise_invitable (~> 2.0)
192
- decidim-api (0.27.4)
192
+ devise_invitable (~> 2.0, >= 2.0.9)
193
+ decidim-api (0.27.5)
193
194
  graphql (~> 1.12, < 1.13)
194
195
  graphql-docs (~> 2.1.0)
195
196
  rack-cors (~> 1.0)
196
- decidim-assemblies (0.27.4)
197
- decidim-core (= 0.27.4)
198
- decidim-blogs (0.27.4)
199
- decidim-admin (= 0.27.4)
200
- decidim-comments (= 0.27.4)
201
- decidim-core (= 0.27.4)
202
- decidim-budgets (0.27.4)
203
- decidim-comments (= 0.27.4)
204
- decidim-core (= 0.27.4)
205
- decidim-comments (0.27.4)
206
- decidim-core (= 0.27.4)
197
+ decidim-assemblies (0.27.5)
198
+ decidim-core (= 0.27.5)
199
+ decidim-blogs (0.27.5)
200
+ decidim-admin (= 0.27.5)
201
+ decidim-comments (= 0.27.5)
202
+ decidim-core (= 0.27.5)
203
+ decidim-budgets (0.27.5)
204
+ decidim-comments (= 0.27.5)
205
+ decidim-core (= 0.27.5)
206
+ decidim-comments (0.27.5)
207
+ decidim-core (= 0.27.5)
207
208
  redcarpet (~> 3.5, >= 3.5.1)
208
- decidim-core (0.27.4)
209
+ decidim-core (0.27.5)
209
210
  active_link_to (~> 1.0)
210
211
  acts_as_list (~> 0.9)
211
212
  batch-loader (~> 1.2)
@@ -215,7 +216,7 @@ GEM
215
216
  cells-rails (~> 0.1.3)
216
217
  charlock_holmes (~> 0.7)
217
218
  date_validator (~> 0.12.0)
218
- decidim-api (= 0.27.4)
219
+ decidim-api (= 0.27.5)
219
220
  devise (~> 4.7)
220
221
  devise-i18n (~> 1.2)
221
222
  diffy (~> 3.3)
@@ -256,15 +257,15 @@ GEM
256
257
  webpacker (= 6.0.0.rc.5)
257
258
  webpush (~> 1.1)
258
259
  wisper (~> 2.0)
259
- decidim-debates (0.27.4)
260
- decidim-comments (= 0.27.4)
261
- decidim-core (= 0.27.4)
262
- decidim-dev (0.27.4)
260
+ decidim-debates (0.27.5)
261
+ decidim-comments (= 0.27.5)
262
+ decidim-core (= 0.27.5)
263
+ decidim-dev (0.27.5)
263
264
  axe-core-rspec (~> 4.1.0)
264
265
  byebug (~> 11.0)
265
266
  capybara (~> 3.24)
266
267
  db-query-matchers (~> 0.10.0)
267
- decidim (= 0.27.4)
268
+ decidim (= 0.27.5)
268
269
  erb_lint (~> 0.0.35)
269
270
  factory_bot_rails (~> 4.8)
270
271
  i18n-tasks (~> 0.9.18)
@@ -287,45 +288,45 @@ GEM
287
288
  w3c_rspec_validators (~> 0.3.0)
288
289
  webmock (~> 3.6)
289
290
  wisper-rspec (~> 1.0)
290
- decidim-forms (0.27.4)
291
- decidim-core (= 0.27.4)
291
+ decidim-forms (0.27.5)
292
+ decidim-core (= 0.27.5)
292
293
  wicked_pdf (~> 2.1)
293
294
  wkhtmltopdf-binary (~> 0.12)
294
- decidim-generators (0.27.4)
295
- decidim-core (= 0.27.4)
296
- decidim-meetings (0.27.4)
297
- decidim-core (= 0.27.4)
298
- decidim-forms (= 0.27.4)
295
+ decidim-generators (0.27.5)
296
+ decidim-core (= 0.27.5)
297
+ decidim-meetings (0.27.5)
298
+ decidim-core (= 0.27.5)
299
+ decidim-forms (= 0.27.5)
299
300
  icalendar (~> 2.5)
300
- decidim-pages (0.27.4)
301
- decidim-core (= 0.27.4)
302
- decidim-participatory_processes (0.27.4)
303
- decidim-core (= 0.27.4)
304
- decidim-proposals (0.27.4)
305
- decidim-comments (= 0.27.4)
306
- decidim-core (= 0.27.4)
301
+ decidim-pages (0.27.5)
302
+ decidim-core (= 0.27.5)
303
+ decidim-participatory_processes (0.27.5)
304
+ decidim-core (= 0.27.5)
305
+ decidim-proposals (0.27.5)
306
+ decidim-comments (= 0.27.5)
307
+ decidim-core (= 0.27.5)
307
308
  doc2text (~> 0.4.5)
308
309
  redcarpet (~> 3.5, >= 3.5.1)
309
- decidim-sortitions (0.27.4)
310
- decidim-admin (= 0.27.4)
311
- decidim-comments (= 0.27.4)
312
- decidim-core (= 0.27.4)
313
- decidim-proposals (= 0.27.4)
314
- decidim-surveys (0.27.4)
315
- decidim-core (= 0.27.4)
316
- decidim-forms (= 0.27.4)
317
- decidim-templates (= 0.27.4)
318
- decidim-system (0.27.4)
310
+ decidim-sortitions (0.27.5)
311
+ decidim-admin (= 0.27.5)
312
+ decidim-comments (= 0.27.5)
313
+ decidim-core (= 0.27.5)
314
+ decidim-proposals (= 0.27.5)
315
+ decidim-surveys (0.27.5)
316
+ decidim-core (= 0.27.5)
317
+ decidim-forms (= 0.27.5)
318
+ decidim-templates (= 0.27.5)
319
+ decidim-system (0.27.5)
319
320
  active_link_to (~> 1.0)
320
- decidim-core (= 0.27.4)
321
+ decidim-core (= 0.27.5)
321
322
  devise (~> 4.7)
322
323
  devise-i18n (~> 1.2)
323
- devise_invitable (~> 2.0)
324
- decidim-templates (0.27.4)
325
- decidim-core (= 0.27.4)
326
- decidim-forms (= 0.27.4)
327
- decidim-verifications (0.27.4)
328
- decidim-core (= 0.27.4)
324
+ devise_invitable (~> 2.0, >= 2.0.9)
325
+ decidim-templates (0.27.5)
326
+ decidim-core (= 0.27.5)
327
+ decidim-forms (= 0.27.5)
328
+ decidim-verifications (0.27.5)
329
+ decidim-core (= 0.27.5)
329
330
  declarative-builder (0.1.0)
330
331
  declarative-option (< 0.2.0)
331
332
  declarative-option (0.1.0)
@@ -339,7 +340,7 @@ GEM
339
340
  warden (~> 1.2.3)
340
341
  devise-i18n (1.12.0)
341
342
  devise (>= 4.9.0)
342
- devise_invitable (2.0.8)
343
+ devise_invitable (2.0.9)
343
344
  actionmailer (>= 5.0)
344
345
  devise (>= 4.6)
345
346
  diff-lcs (1.5.0)
@@ -412,7 +413,8 @@ GEM
412
413
  sass (~> 3.4)
413
414
  hashdiff (1.0.1)
414
415
  hashie (5.0.0)
415
- highline (2.1.0)
416
+ highline (3.0.0)
417
+ abbrev
416
418
  hkdf (0.3.0)
417
419
  html-pipeline (2.14.3)
418
420
  activesupport (>= 2)
@@ -431,7 +433,7 @@ GEM
431
433
  rails-i18n
432
434
  rainbow (>= 2.2.2, < 4.0)
433
435
  terminal-table (>= 1.5.1)
434
- icalendar (2.9.0)
436
+ icalendar (2.10.1)
435
437
  ice_cube (~> 0.16)
436
438
  ice_cube (0.16.4)
437
439
  ice_nine (0.11.2)
@@ -440,7 +442,7 @@ GEM
440
442
  ruby-vips (>= 2.0.17, < 3)
441
443
  invisible_captcha (0.13.0)
442
444
  rails (>= 3.2.0)
443
- json (2.6.3)
445
+ json (2.7.1)
444
446
  jwt (2.7.1)
445
447
  kaminari (1.2.2)
446
448
  activesupport (>= 4.1.0)
@@ -571,7 +573,7 @@ GEM
571
573
  net-smtp
572
574
  premailer (~> 1.7, >= 1.7.9)
573
575
  public_suffix (5.0.3)
574
- puma (5.6.7)
576
+ puma (5.6.8)
575
577
  nio4r (~> 2.0)
576
578
  racc (1.7.1)
577
579
  rack (2.2.8)
@@ -641,9 +643,9 @@ GEM
641
643
  rspec-core (~> 3.12.0)
642
644
  rspec-expectations (~> 3.12.0)
643
645
  rspec-mocks (~> 3.12.0)
644
- rspec-cells (0.3.8)
646
+ rspec-cells (0.3.9)
645
647
  cells (>= 4.0.0, < 6.0.0)
646
- rspec-rails (>= 3.0.0, < 6.1.0)
648
+ rspec-rails (>= 3.0.0, < 6.2.0)
647
649
  rspec-core (3.12.2)
648
650
  rspec-support (~> 3.12.0)
649
651
  rspec-expectations (3.12.3)
@@ -800,8 +802,8 @@ DEPENDENCIES
800
802
  bootsnap (~> 1.7)
801
803
  byebug (~> 11.0)
802
804
  codecov
803
- decidim (= 0.27.4)
804
- decidim-dev (= 0.27.4)
805
+ decidim (= 0.27.5)
806
+ decidim-dev (= 0.27.5)
805
807
  decidim-participatory_documents!
806
808
  faker (~> 2.14)
807
809
  letter_opener_web (~> 1.3)
@@ -816,4 +818,4 @@ RUBY VERSION
816
818
  ruby 3.0.6p216
817
819
 
818
820
  BUNDLED WITH
819
- 2.3.20
821
+ 2.4.22
data/README.md CHANGED
@@ -41,8 +41,10 @@ Depending on your Decidim version, you can choose the corresponding version to e
41
41
 
42
42
  ## Usage
43
43
 
44
- TODO...
44
+ This module adds a new component to Decidim called `Participatory Documents` that allows to upload PDFs and define areas on top of it that will become spaces for suggestions or comments.
45
45
 
46
+ The administrator must upload a PDF file and then define areas on top of it by drawing polygons.
47
+ Each area will become a new zone that will allow users to create suggestions.
46
48
 
47
49
  ## Configuration
48
50
 
@@ -66,6 +68,14 @@ Decidim::ParticipatoryDocuments.configure do |config|
66
68
  end
67
69
  ```
68
70
 
71
+ ## Antivirus compatibility
72
+
73
+ This module has a builtin compatibility with https://github.com/mainio/decidim-module-antivirus to scan the uploaded documents (it is also possible to directly use the gem https://github.com/mainio/ratonvirus if configuring it in a initializer).
74
+
75
+ If the antivirus is not installed, the module will still work but the documents will not be scanned.
76
+
77
+ > Note: this module only checks for the existance of the class `AntivirusValidator` so it is possible to use any other antivirus validator as well (a custom one for instance).
78
+
69
79
  ## Contributing
70
80
 
71
81
  Bug reports and pull requests are welcome on GitHub at https://github.com/openpoke/decidim-module-participatory-documents.
@@ -3,5 +3,5 @@
3
3
  <strong><%= answered_at %></strong>
4
4
  <strong><%= t("suggestion_answer", scope: "decidim.participatory_documents.document") %></strong>
5
5
  </div>
6
- <%= translated_attribute(model.answer) %>
6
+ <%= sanitize translated_attribute(model.answer) %>
7
7
  </div>
@@ -21,8 +21,12 @@ module Decidim
21
21
  create_document
22
22
  end
23
23
  broadcast(:ok, document)
24
- rescue ActiveRecord::RecordInvalid
25
- form.errors.add(:file, document.errors[:file]) if document.errors.include? :file
24
+ rescue ActiveRecord::RecordInvalid => e
25
+ if document&.errors&.include? :file
26
+ form.errors.add(:file, document.errors[:file])
27
+ else
28
+ form.errors.add(:file, e.message)
29
+ end
26
30
  broadcast(:invalid)
27
31
  end
28
32
  end
@@ -22,7 +22,7 @@ module Decidim
22
22
 
23
23
  def new
24
24
  enforce_permission_to :create, :participatory_document
25
- @form = form(DocumentForm).from_params(params)
25
+ @form = form(DocumentForm).instance
26
26
  end
27
27
 
28
28
  def create
@@ -11,7 +11,8 @@ module Decidim
11
11
  helper Decidim::ParticipatoryDocuments::Admin::SuggestionHelper
12
12
  helper Decidim::Messaging::ConversationHelper
13
13
 
14
- helper_method :suggestions, :suggestion, :notes_form, :find_valuators_for_select, :suggestion_ids, :suggestion_find
14
+ helper_method :suggestions, :suggestion, :notes_form, :find_valuators_for_select, :suggestion_ids,
15
+ :suggestion_find, :valuator_assigned_to_suggestion?
15
16
 
16
17
  def show
17
18
  enforce_permission_to :show, :suggestion, suggestion: suggestion
@@ -174,6 +175,13 @@ module Decidim
174
175
  [valuator.name, role.id]
175
176
  end
176
177
  end
178
+
179
+ def valuator_assigned_to_suggestion?
180
+ @valuator_assigned_to_suggestion ||=
181
+ Decidim::ParticipatoryDocuments::ValuationAssignment
182
+ .where(suggestion: suggestion, valuator_role: valuator_roles)
183
+ .any?
184
+ end
177
185
  end
178
186
  end
179
187
  end
@@ -4,8 +4,10 @@ module Decidim
4
4
  module ParticipatoryDocuments
5
5
  module Admin
6
6
  class ValuationAssignmentsController < Admin::ApplicationController
7
+ helper_method :suggestion
8
+
7
9
  def create
8
- enforce_permission_to :assign_to_valuator, :suggestions
10
+ enforce_permission_to :assign_to_valuator, :suggestions, suggestion: suggestion
9
11
 
10
12
  @form = form(Admin::ValuationAssignmentForm).from_params(params)
11
13
 
@@ -25,7 +27,7 @@ module Decidim
25
27
  def destroy
26
28
  @form = form(Admin::ValuationAssignmentForm).from_params(destroy_params)
27
29
 
28
- enforce_permission_to :unassign_from_valuator, :suggestions, valuator: @form.valuator_user
30
+ enforce_permission_to :unassign_from_valuator, :suggestions, valuator: @form.valuator_user, suggestion: suggestion
29
31
 
30
32
  Admin::UnassignSuggestionsFromValuator.call(@form) do
31
33
  on(:ok) do |_proposal|
@@ -46,6 +48,10 @@ module Decidim
46
48
 
47
49
  private
48
50
 
51
+ def suggestion
52
+ @suggestion ||= Decidim::ParticipatoryDocuments::Suggestion.find(params[:suggestion_ids] || [params[:suggestion_id]])
53
+ end
54
+
49
55
  def destroy_params
50
56
  {
51
57
  id: params.dig(:valuator_role, :id) || params[:id],
@@ -14,16 +14,23 @@ module Decidim
14
14
 
15
15
  attribute :box_color, String, default: "#1e98d7"
16
16
  attribute :box_opacity, Integer, default: 12
17
+ attribute :organization
17
18
 
18
19
  attribute :file, Decidim::Attributes::Blob
19
20
  attribute :remove_file, Boolean, default: false
20
21
 
22
+ validates :file, passthru: { to: Document }, if: ->(form) { form.file.present? }
21
23
  validates :file, file_content_type: { allow: ["application/pdf"] }
24
+
22
25
  # ensure color and opacity are present
23
26
  def map_model(doc)
24
27
  self.box_color = doc.box_color.presence || "#1e98d7"
25
28
  self.box_opacity = doc.box_opacity.presence || 12
26
29
  end
30
+
31
+ def organization
32
+ attributes[:organization] || current_organization
33
+ end
27
34
  end
28
35
  end
29
36
  end
@@ -17,6 +17,8 @@ module Decidim
17
17
 
18
18
  has_one_attached :file
19
19
  validates_upload :file, uploader: Decidim::ParticipatoryDocuments::PdfDocumentUploader
20
+ # compatibility with ratonvirus (see https://github.com/mainio/decidim-module-antivirus)
21
+ validates :file, antivirus: true if ParticipatoryDocuments.antivirus_enabled
20
22
 
21
23
  has_many :sections, class_name: "Decidim::ParticipatoryDocuments::Section", dependent: :restrict_with_error
22
24
  has_many :suggestions, class_name: "Decidim::ParticipatoryDocuments::Suggestion", dependent: :restrict_with_error, as: :suggestable
@@ -24,6 +26,15 @@ module Decidim
24
26
 
25
27
  attr_accessor :remove_file
26
28
 
29
+ # the dynamic upload validator requires the organization,
30
+ # if the object is not created yet is assigned from the context by the UploadValidationForm using this method
31
+ attr_writer :organization
32
+
33
+ # override the delegate from HasComponent for the dynamic upload validator
34
+ def organization
35
+ component&.organization || @organization
36
+ end
37
+
27
38
  def self.log_presenter_class_for(_log)
28
39
  Decidim::ParticipatoryDocuments::AdminLog::DocumentPresenter
29
40
  end
@@ -19,11 +19,11 @@ module Decidim
19
19
  if valuator_assigned_to_suggestion?
20
20
  can_create_suggestion_note?
21
21
  can_create_suggestion_answer?
22
+ valuator_can_assign_or_unassign_valuator_from_suggestions?
22
23
  allow! if action_is_show_on_suggestion?
23
24
  elsif action_is_show_on_suggestion?
24
25
  disallow!
25
26
  end
26
- valuator_can_unassign_valuator_from_suggestions?
27
27
  end
28
28
 
29
29
  def handle_general_permissions
@@ -84,16 +84,8 @@ module Decidim
84
84
  permission_action.action == :create
85
85
  end
86
86
 
87
- def can_unassign_valuator_from_suggestions?
88
- allow! if permission_action.subject == :suggestions && permission_action.action == :unassign_from_valuator
89
- end
90
-
91
- def valuator_can_unassign_valuator_from_suggestions?
92
- can_unassign_valuator_from_suggestions? if user == context.fetch(:valuator, nil)
93
-
94
- return unless permission_action.action == :assign_to_valuator && permission_action.subject == :suggestions
95
-
96
- allow!
87
+ def valuator_can_assign_or_unassign_valuator_from_suggestions?
88
+ allow! if permission_action.action == :unassign_from_valuator || permission_action.action == :assign_to_valuator
97
89
  end
98
90
 
99
91
  def admin_suggestion_answering_is_enabled?
@@ -3,6 +3,7 @@
3
3
  <h2 class="card-title flex--sbc">
4
4
  <%= translated_attribute(current_component.name) %>
5
5
  <%= render "title", button: :back %>
6
+ <div class="flex--cc flex-gap--1"><%= preview_sections_btn %></div>
6
7
  </h2>
7
8
  </div>
8
9
  <div class="card-section pdf-viewer-container">
@@ -1,4 +1,4 @@
1
- <% if allowed_to? :assign_to_valuator, :suggestions %>
1
+ <% if valuator_assigned_to_suggestion? || current_user.admin? %>
2
2
  <div id="js-assign-suggestion-to-valuator-actions" class="form-single-suggestion"
3
3
  style="max-width:400px">
4
4
  <%= form_tag(document_valuation_assignment_path(document), method: :post, id: "js-form-assign-suggestion-to-valuator",
@@ -20,8 +20,7 @@
20
20
  presented_valuator.profile_path,
21
21
  target: :blank
22
22
  ) %>
23
-
24
- <% if allowed_to? :unassign_from_valuator, :suggestions, valuator: assignment.valuator %>
23
+ <% if valuator_assigned_to_suggestion? || current_user.admin? %>
25
24
  <%= icon_link_to(
26
25
  "circle-x",
27
26
  document_suggestion_valuation_assignment_path(document, suggestion, assignment.valuator_role),
@@ -1,7 +1,7 @@
1
1
  <% if document.present? && document.file.attached? %>
2
2
  <div class="row">
3
- <%= content_tag(:h3, translated_attribute(document.title), class: "title") if translated_attribute(document.title).present? %>
4
- <%= content_tag(:p, translated_attribute(document.description).html_safe, class: "description") if translated_attribute(document.description).present? %>
3
+ <%= content_tag(:h3, sanitize(translated_attribute(document.title)), class: "title") if translated_attribute(document.title).present? %>
4
+ <%= content_tag(:p, sanitize(translated_attribute(document.description)), class: "description") if translated_attribute(document.description).present? %>
5
5
  <% if preview_mode? %>
6
6
  <div class="callout announcement mb-sm warning cell-announcement">
7
7
  <p class="heading5"><%= t("decidim.participatory_documents.documents.preview_title") %></p>