decidim-plans 0.16.4 → 0.16.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 741276c73f6d1054bf091d66981cb44f86587445f09f7a85ba2ff7cac995a1f1
4
- data.tar.gz: c4fca20be4d12d149653fe12fd4cee859ada4833bac442b39a3968b7f64419f6
3
+ metadata.gz: '08d56d238a66eca983dbe996717bb9387525e974336ce65ab9f8943e1e3afe5e'
4
+ data.tar.gz: fe1204b85350bdea566562b75956c7eed3e989b793669b35b25be08b85cabe07
5
5
  SHA512:
6
- metadata.gz: 6c9816cbe7feb9125c40f88c39430ab9a6d23cce821180e5088dc5aa382ddca815cc3f9c8f030a243c695e92c7a27a74a8f9ad9a5beb2a52d230992b3e053c7f
7
- data.tar.gz: 67cf49151de0ee6d2415933531877fadae8ad50dbd16444ba8c4d7eddeae177f8084fadc9f6837524b3f42d1b4cac7ac995b14a9ee2d5eeb6a427d295d4bf8f0
6
+ metadata.gz: f8ac917fa65cc0f67ae41541ee8d9af242ecff01ed3b3936bba4f1dfe3b6de3d771dc830a6b9522596ab57a73d378b0ffe2be76454e9b96f530a3eb947144ed4
7
+ data.tar.gz: 17df9cff118e3dc9be17afb6408a247e600da2018cef3220078bf5885a0ebbc3da04780e14fe074935e4cbfc4966f379f4e37a6c035b65986002b1e5a4428a1a
@@ -28,9 +28,9 @@ $(function() {
28
28
  renderItem: function (item, search) {
29
29
  let sanitizedSearch = search.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
30
30
  let re = new RegExp(`(${sanitizedSearch.split(" ").join("|")})`, "gi");
31
- let title = item[0];
31
+ let title = item[0].replace(/"/g, """);
32
32
  let modelId = item[1];
33
- return `<div class="autocomplete-suggestion" data-model-id="${modelId}" data-val ="${title}">${title.replace(re, "<b>$1</b>")}</div>`;
33
+ return `<div class="autocomplete-suggestion" data-model-id="${modelId}" data-val="${title}">${title.replace(re, "<b>$1</b>")}</div>`;
34
34
  },
35
35
  onSelect: function(event, term, item) {
36
36
  let choose = $("#proposal-picker-choose");
@@ -28,7 +28,7 @@ module Decidim
28
28
  end
29
29
 
30
30
  def resource_path
31
- resource_locator(model).path
31
+ resource_locator(model).path + request_params_query
32
32
  end
33
33
 
34
34
  def current_participatory_space
@@ -14,6 +14,10 @@ module Decidim
14
14
 
15
15
  private
16
16
 
17
+ def resource_path
18
+ resource_locator(model).path + request_params_query
19
+ end
20
+
17
21
  def title
18
22
  present(model).title
19
23
  end
@@ -6,6 +6,8 @@ module Decidim
6
6
  # A command with all the business logic when an admin exports plans to a
7
7
  # single budget component.
8
8
  class ExportPlansToBudgets < Rectify::Command
9
+ include ActionView::Helpers::TextHelper
10
+
9
11
  # Public: Initializes the command.
10
12
  #
11
13
  # form - A form object with the params.
@@ -35,7 +37,7 @@ module Decidim
35
37
  next if plan_already_copied?(original_plan, target_component)
36
38
 
37
39
  project = Decidim::Budgets::Project.new
38
- project.title = original_plan.title
40
+ project.title = sanitize_localized(original_plan.title)
39
41
  project.description = project_description(original_plan)
40
42
  project.budget = form.default_budget
41
43
  project.category = original_plan.category
@@ -83,20 +85,13 @@ module Decidim
83
85
  original_plan.sections.each do |section|
84
86
  content = original_plan.contents.find_by(section: section)
85
87
  content.body.each do |locale, body_text|
86
- title = section.body[locale]
88
+ title = sanitize(section.body[locale])
87
89
  pr_desc[locale] ||= ""
88
90
  pr_desc[locale] += "<h3>#{title}</h3>\n"
89
91
 
90
- # In case the text is already HTML, append as is.
91
92
  # Wrap non-HTML strings within a <p> tag and replace newlines with
92
- # <br>.
93
- pr_desc[locale] += (
94
- if body_text =~ %r{<\/?[^>]*>}
95
- "#{body_text}\n"
96
- else
97
- "<p>#{body_text.gsub(/\n/, "<br>")}</p>\n"
98
- end
99
- )
93
+ # <br>. This also takes care of sanitization.
94
+ pr_desc[locale] += simple_format(body_text)
100
95
  end
101
96
  end
102
97
 
@@ -105,6 +100,12 @@ module Decidim
105
100
 
106
101
  pr_desc
107
102
  end
103
+
104
+ def sanitize_localized(hash)
105
+ hash.each do |locale, value|
106
+ hash[locale] = sanitize(value)
107
+ end
108
+ end
108
109
  end
109
110
  end
110
111
  end
@@ -160,22 +160,6 @@ module Decidim
160
160
  end
161
161
  end
162
162
 
163
- def reopen
164
- enforce_permission_to :close, :plan, plan: @plan
165
-
166
- ReopenPlan.call(@plan, current_user) do
167
- on(:ok) do |plan|
168
- flash[:notice] = I18n.t("reopen.success", scope: "decidim.plans.plans.plan")
169
- redirect_to Decidim::ResourceLocatorPresenter.new(plan).path
170
- end
171
-
172
- on(:invalid) do
173
- flash.now[:alert] = t("reopen.error", scope: "decidim.plans.plans.plan")
174
- redirect_to Decidim::ResourceLocatorPresenter.new(@plan).path
175
- end
176
- end
177
- end
178
-
179
163
  private
180
164
 
181
165
  def check_draft
@@ -5,6 +5,7 @@ module Decidim
5
5
  # Custom helpers, scoped to the plans engine.
6
6
  #
7
7
  module ApplicationHelper
8
+ include Decidim::Plans::LinksHelper
8
9
  include Decidim::Comments::CommentsHelper
9
10
  include PaginateHelper
10
11
  include Decidim::MapHelper
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Plans
5
+ module LinksHelper
6
+ # This is for generating the links so that they maintain the search status
7
+ def request_params(extra_params={}, exclude_params=[])
8
+ @request_params ||= request.params.except(
9
+ *(exclude_params + [
10
+ :action,
11
+ :component_id,
12
+ :controller,
13
+ :assembly_slug,
14
+ :participatory_process_slug,
15
+ :id
16
+ ])
17
+ ).merge(prepare_extra_params(extra_params))
18
+ end
19
+
20
+ def request_params_query(extra_params={}, exclude_params=[])
21
+ return "" unless request_params(extra_params, exclude_params).any?
22
+
23
+ "?#{request_params.to_query}"
24
+ end
25
+
26
+ private
27
+
28
+ # Adds the random seed to the extra parameters to maintain the ordering
29
+ # correctly across the requests.
30
+ def prepare_extra_params(extra_params)
31
+ return extra_params unless controller
32
+ return extra_params unless controller.respond_to?(:order, true)
33
+ return extra_params unless controller.respond_to?(:random_seed, true)
34
+
35
+ order = controller.send(:order)
36
+ return extra_params unless order == "random"
37
+
38
+ seed = controller.send(:random_seed)
39
+ return extra_params unless seed
40
+
41
+ extra_params.merge(random_seed: seed)
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Plans
5
+ module RichPresenter
6
+ extend ActiveSupport::Concern
7
+ include ActionView::Helpers::TextHelper
8
+
9
+ def rich_content(content)
10
+ simple_format(content, wrapper_tag: nil)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -8,17 +8,18 @@ module Decidim
8
8
  class ContentPresenter < SimpleDelegator
9
9
  include Rails.application.routes.mounted_helpers
10
10
  include TranslatableAttributes
11
+ include Plans::RichPresenter
11
12
 
12
13
  def content
13
14
  __getobj__
14
15
  end
15
16
 
16
17
  def title
17
- translated_attribute(content.title).html_safe
18
+ sanitize(translated_attribute(content.title))
18
19
  end
19
20
 
20
21
  def body
21
- translated_attribute(content.body).html_safe
22
+ rich_content(translated_attribute(content.body))
22
23
  end
23
24
  end
24
25
  end
@@ -9,6 +9,7 @@ module Decidim
9
9
  include Rails.application.routes.mounted_helpers
10
10
  include ActionView::Helpers::UrlHelper
11
11
  include TranslatableAttributes
12
+ include Plans::RichPresenter
12
13
 
13
14
  def author
14
15
  coauthorship = coauthorships.first
@@ -28,7 +29,7 @@ module Decidim
28
29
  end
29
30
 
30
31
  def title
31
- translated_attribute(plan.title).html_safe
32
+ sanitize(translated_attribute(plan.title))
32
33
  end
33
34
 
34
35
  def body
@@ -36,9 +37,9 @@ module Decidim
36
37
  content = plan.contents.find_by(section: section)
37
38
  next if content.nil?
38
39
 
39
- title = translated_attribute(content.title)
40
- body = translated_attribute(content.body)
41
- "<dt>#{title}</dt> <dd>#{body}</dd>"
40
+ section_title = sanitize(translated_attribute(content.title))
41
+ section_body = sanitize(translated_attribute(content.body))
42
+ "<dt>#{section_title}</dt> <dd>#{section_body}</dd>"
42
43
  end
43
44
 
44
45
  "<dl>#{fields.join("\n")}</dl>".html_safe
@@ -23,12 +23,16 @@ form.multipart = true
23
23
  <div class="row column">
24
24
  <%= remaining_characters("plans_title", component_settings.plan_title_length) do |opts| %>
25
25
  <% if component_settings.multilingual_answers? %>
26
- <%= form.translated :text_field, :title, opts.merge(tabs_id: "title-tabs") %>
26
+ <%= form.translated :text_field, :title, opts.merge(
27
+ tabs_id: "title-tabs",
28
+ help_text: translated_attribute(component_settings.title_help)
29
+ ) %>
27
30
  <% else %>
28
31
  <%= form.text_field(
29
32
  "title_#{current_locale}".to_sym,
30
33
  {
31
- label: form.label_for(:title)
34
+ label: form.label_for(:title),
35
+ help_text: translated_attribute(component_settings.title_help)
32
36
  }.merge(opts)
33
37
  ) %>
34
38
  <% end %>
@@ -1,6 +1,6 @@
1
1
  <div class="plan-contents">
2
2
  <% @plan.sections.each do |section| %>
3
- <%=
3
+ <%=
4
4
  render partial: "content",
5
5
  object: @plan.contents.find_by(section: section)
6
6
  %>
@@ -23,12 +23,15 @@ form.multipart = true
23
23
  <div class="field">
24
24
  <%= remaining_characters("plans_title", component_settings.plan_title_length) do |opts| %>
25
25
  <% if component_settings.multilingual_answers? %>
26
- <%= form.translated :text_field, :title, opts %>
26
+ <%= form.translated :text_field, :title, opts.merge(
27
+ help_text: translated_attribute(component_settings.title_help)
28
+ ) %>
27
29
  <% else %>
28
30
  <%= form.text_field(
29
31
  "title_#{current_locale}".to_sym,
30
32
  {
31
- label: form.label_for(:title)
33
+ label: form.label_for(:title),
34
+ help_text: translated_attribute(component_settings.title_help)
32
35
  }.merge(opts)
33
36
  ) %>
34
37
  <% end %>
@@ -12,10 +12,12 @@
12
12
  <% end %>
13
13
 
14
14
  <div class="row column view-header">
15
- <%= link_to plans_path do %>
16
- <%= icon "chevron-left", class: "icon--small" %>
17
- <%= t(".back") %>
18
- <% end %>
15
+ <p class="h5">
16
+ <%= link_to plans_path(request_params) do %>
17
+ <%= icon "chevron-left", class: "icon--small" %>
18
+ <%= t(".back") %>
19
+ <% end %>
20
+ </p>
19
21
 
20
22
  <h2 class="heading2">
21
23
  <%= present(@plan).title %>
@@ -45,12 +47,8 @@
45
47
  <% if allowed_to?(:edit, :plan, plan: @plan) %>
46
48
  <%= link_to t("edit", scope:"decidim.plans.plans.show"), edit_plan_path(@plan), class: "button secondary hollow expanded button--sc mt-s", id: "plan_edit" %>
47
49
  <% end %>
48
- <% if allowed_to?(:close, :plan, plan: @plan) %>
49
- <% if @plan.closed? %>
50
- <%= link_to t("reopen", scope:"decidim.plans.plans.show"), reopen_plan_path(@plan), method: :post, class: "button secondary hollow expanded button--sc mt-s", id: "plan_reopen", data: { confirm: t("reopen_confirm", scope:"decidim.plans.plans.show") } %>
51
- <% else %>
52
- <%= link_to t("close", scope:"decidim.plans.plans.show"), close_plan_path(@plan), method: :post, class: "button secondary hollow expanded button--sc mt-s", id: "plan_close", data: { confirm: t("close_confirm", scope:"decidim.plans.plans.show") } %>
53
- <% end %>
50
+ <% if allowed_to?(:close, :plan, plan: @plan) && !@plan.closed? %>
51
+ <%= link_to t("close", scope:"decidim.plans.plans.show"), close_plan_path(@plan), method: :post, class: "button secondary hollow expanded button--sc mt-s", id: "plan_close", data: { confirm: t("close_confirm", scope:"decidim.plans.plans.show") } %>
54
52
  <% end %>
55
53
 
56
54
  <%= render "request_access_form" %>
@@ -1,3 +1,5 @@
1
+ <% help_text = translated_attribute(component_settings.attachment_help).strip %>
2
+
1
3
  <div class="card multifield-field" id="<%= id %>-field">
2
4
  <div class="card-divider multifield-field-divider">
3
5
  <h3 class="heading6 card-title">
@@ -21,6 +23,10 @@
21
23
 
22
24
  <div class="card-section">
23
25
  <div class="row column">
26
+ <% if help_text && help_text.length > 0 %>
27
+ <p class="help-text"><%= help_text %></p>
28
+ <% end %>
29
+
24
30
  <div class="field">
25
31
  <% if form.send(:attribute_required?, :title) %>
26
32
  <%= form.text_field :title %>
@@ -34,6 +34,7 @@ en:
34
34
  global:
35
35
  announcement: Announcement
36
36
  attachments_allowed: Attachments allowed
37
+ attachment_help: Attachment help text
37
38
  categories_enabled: Categories enabled
38
39
  comments_enabled: Comments enabled
39
40
  multilingual_answers: Multilingual answers
@@ -41,6 +42,7 @@ en:
41
42
  plan_title_length: Title length
42
43
  proposal_linking_enabled: Proposal linking enabled
43
44
  scopes_enabled: Scopes enabled
45
+ title_help: Title help text
44
46
  step:
45
47
  announcement: Announcement
46
48
  comments_blocked: Comments blocked
@@ -330,57 +332,57 @@ en:
330
332
  events:
331
333
  plans:
332
334
  plan_access_accepted:
333
- email_intro: '%{requester_name} has been accepted to access as a contributor of <a href="%{resource_path}">%{resource_title}</a>.'
334
- email_outro: You have received this notification because you are a collaborator of <a href="%{resource_path}">%{resource_title}</a>.
335
+ email_intro: '%{requester_name} has been accepted to access as a contributor of <a href="%{resource_url}">%{resource_title}</a>.'
336
+ email_outro: You have received this notification because you are a collaborator of <a href="%{resource_url}">%{resource_title}</a>.
335
337
  email_subject: "%{requester_name} has been accepted to access as a contributor of %{resource_title}."
336
- notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> has been <strong>accepted to access as a contributor</strong> of <a href="%{resource_path}">%{resource_title}</a>.
338
+ notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> has been <strong>accepted to access as a contributor</strong> of <a href="%{resource_url}">%{resource_title}</a>.
337
339
  plan_access_rejected:
338
- email_intro: '%{requester_name} has been rejected to access as a contributor of <a href="%{resource_path}">%{resource_title}</a>.'
339
- email_outro: You have received this notification because you are a collaborator of <a href="%{resource_path}">%{resource_title}</a>.
340
+ email_intro: '%{requester_name} has been rejected to access as a contributor of <a href="%{resource_url}">%{resource_title}</a>.'
341
+ email_outro: You have received this notification because you are a collaborator of <a href="%{resource_url}">%{resource_title}</a>.
340
342
  email_subject: "%{requester_name} has been rejected to access as a contributor of %{resource_title}."
341
- notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> has been <strong>rejected to access as a contributor</strong> of <a href="%{resource_path}">%{resource_title}</a>.
343
+ notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> has been <strong>rejected to access as a contributor</strong> of <a href="%{resource_url}">%{resource_title}</a>.
342
344
  plan_access_requested:
343
- email_intro: '%{requester_name} requested access as a contributor. You can <strong>accept or reject the request</strong> from the <a href="%{resource_path}">%{resource_title}</a> page.'
344
- email_outro: You have received this notification because you are a collaborator of <a href="%{resource_path}">%{resource_title}</a>.
345
+ email_intro: '%{requester_name} requested access as a contributor. You can <strong>accept or reject the request</strong> from the <a href="%{resource_url}">%{resource_title}</a> page.'
346
+ email_outro: You have received this notification because you are a collaborator of <a href="%{resource_url}">%{resource_title}</a>.
345
347
  email_subject: "%{requester_name} requested access to contribute to %{resource_title}."
346
- notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> requested access to contribute to <a href="%{resource_path}">%{resource_title}</a>. Please <strong>accept or reject the request</strong>.
348
+ notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> requested access to contribute to <a href="%{resource_url}">%{resource_title}</a>. Please <strong>accept or reject the request</strong>.
347
349
  plan_access_requester_accepted:
348
- email_intro: You have been accepted to access as a contributor of <a href="%{resource_path}">%{resource_title}</a>.
349
- email_outro: You have received this notification because you requested to become a collaborator of <a href="%{resource_path}">%{resource_title}</a>.
350
+ email_intro: You have been accepted to access as a contributor of <a href="%{resource_url}">%{resource_title}</a>.
351
+ email_outro: You have received this notification because you requested to become a collaborator of <a href="%{resource_url}">%{resource_title}</a>.
350
352
  email_subject: You have been accepted as a contributor of %{resource_title}.
351
- notification_title: You have been <strong>accepted to access as a contributor</strong> of <a href="%{resource_path}">%{resource_title}</a>.
353
+ notification_title: You have been <strong>accepted to access as a contributor</strong> of <a href="%{resource_url}">%{resource_title}</a>.
352
354
  plan_access_requester_rejected:
353
- email_intro: You have been rejected to access as a contributor of <a href="%{resource_path}">%{resource_title}</a>.
354
- email_outro: You have received this notification because you requested to become a collaborator of <a href="%{resource_path}">%{resource_title}</a>.
355
+ email_intro: You have been rejected to access as a contributor of <a href="%{resource_url}">%{resource_title}</a>.
356
+ email_outro: You have received this notification because you requested to become a collaborator of <a href="%{resource_url}">%{resource_title}</a>.
355
357
  email_subject: You have been rejected as a contributor of %{resource_title}.
356
- notification_title: You have been <strong>rejected to access as a contributor</strong> of <a href="%{resource_path}">%{resource_title}</a>.
358
+ notification_title: You have been <strong>rejected to access as a contributor</strong> of <a href="%{resource_url}">%{resource_title}</a>.
357
359
  plan_accepted:
358
360
  email_intro: '"%{resource_title}" has been accepted. You can read the answer in this page:'
359
361
  email_outro: You have received this notification because you are following "%{resource_title}". You can unfollow it from the previous link.
360
362
  email_subject: A resource you're following has been accepted
361
- notification_title: <a href="%{resource_path}">%{resource_title}</a> has been accepted.
363
+ notification_title: <a href="%{resource_url}">%{resource_title}</a> has been accepted.
362
364
  plan_evaluating:
363
365
  email_intro: '"%{resource_title}" is currently being evaluated. You can check for an answer in this page:'
364
366
  email_outro: You have received this notification because you are following "%{resource_title}". You can unfollow it from the previous link.
365
367
  email_subject: A resource you're following is being evaluated
366
- notification_title: <a href="%{resource_path}">%{resource_title}</a> is being evaluated.
368
+ notification_title: <a href="%{resource_url}">%{resource_title}</a> is being evaluated.
367
369
  plan_published:
368
370
  email_intro: '"%{resource_title}" has been published. You can see it here:'
369
371
  email_outro: You have received this notification because you are following the author of "%{resource_title}". You can unfollow it from the previous link.
370
372
  email_subject: A user you're following has published a resource
371
- notification_title: <a href="%{resource_path}">%{resource_title}</a> has been published.
373
+ notification_title: <a href="%{resource_url}">%{resource_title}</a> has been published.
372
374
  plan_published_for_proposals:
373
375
  email_intro: 'A proposal you have authored has been linked to "%{resource_title}". You can see it here:'
374
376
  email_outro: You have received this notification because you are following "%{resource_title}" through the authored proposals. You can unfollow it from the previous link.
375
377
  email_subject: A proposal you have authored has been linked to new content
376
- notification_title: A proposal you have authored has been linked to <a href="%{resource_path}">%{resource_title}</a>.
378
+ notification_title: A proposal you have authored has been linked to <a href="%{resource_url}">%{resource_title}</a>.
377
379
  plan_published_for_space:
378
380
  email_intro: '"%{resource_title}" has been published. You can see it here:'
379
381
  email_outro: You have received this notification because you are following "%{resource_title}". You can unfollow it from the previous link.
380
382
  email_subject: A resource you're following has been published
381
- notification_title: <a href="%{resource_path}">%{resource_title}</a> has been published.
383
+ notification_title: <a href="%{resource_url}">%{resource_title}</a> has been published.
382
384
  plan_rejected:
383
385
  email_intro: '"%{resource_title}" has been rejected. You can read the answer in this page:'
384
386
  email_outro: You have received this notification because you are following "%{resource_title}". You can unfollow it from the previous link.
385
387
  email_subject: A resource you're following has been rejected
386
- notification_title: <a href="%{resource_path}">%{resource_title}</a> has been rejected.
388
+ notification_title: <a href="%{resource_url}">%{resource_title}</a> has been rejected.
@@ -323,57 +323,57 @@ fi:
323
323
  events:
324
324
  plans:
325
325
  plan_access_accepted:
326
- email_intro: '%{requester_name} on annettu oikeus muokata sisältöä <a href="%{resource_path}">%{resource_title}</a> osallistujana.'
327
- email_outro: Tämä ilmoitus on lähetetty sinulle, koska olet osallistunut sisällön <a href="%{resource_path}">%{resource_title}</a> muokkaukseen.
326
+ email_intro: '%{requester_name} on annettu oikeus muokata sisältöä <a href="%{resource_url}">%{resource_title}</a> osallistujana.'
327
+ email_outro: Tämä ilmoitus on lähetetty sinulle, koska olet osallistunut sisällön <a href="%{resource_url}">%{resource_title}</a> muokkaukseen.
328
328
  email_subject: "%{requester_name} on hyväksytty muokkaajaksi sisältöön %{resource_title}."
329
- notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> on <strong>hyväksytty muokkaajaksi</strong> sisältöön <a href="%{resource_path}">%{resource_title}</a>.
329
+ notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> on <strong>hyväksytty muokkaajaksi</strong> sisältöön <a href="%{resource_url}">%{resource_title}</a>.
330
330
  plan_access_rejected:
331
- email_intro: 'Käyttäjän %{requester_name} muokkausoikeudet sisältöön <a href="%{resource_path}">%{resource_title} </a> on estetty.'
332
- email_outro: Tämä ilmoitus on lähetetty sinulle, koska olet osallistunut sisällön <a href="%{resource_path}">%{resource_title}</a> muokkaukseen.
331
+ email_intro: 'Käyttäjän %{requester_name} muokkausoikeudet sisältöön <a href="%{resource_url}">%{resource_title} </a> on estetty.'
332
+ email_outro: Tämä ilmoitus on lähetetty sinulle, koska olet osallistunut sisällön <a href="%{resource_url}">%{resource_title}</a> muokkaukseen.
333
333
  email_subject: "%{requester_name} hakemus osallistua kohteen %{resource_title} muokkaukseen on hylätty."
334
- notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> <strong>pyyntö muokata sisältöä on hylätty</strong> kohteelle <a href="%{resource_path}">%{resource_title}</a>.
334
+ notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> <strong>pyyntö muokata sisältöä on hylätty</strong> kohteelle <a href="%{resource_url}">%{resource_title}</a>.
335
335
  plan_access_requested:
336
- email_intro: '%{requester_name} pyysi pääsyä osallistujaksi. Voit <strong>hyväksyä tai hylätä pyynnön</strong> sivulla <a href="%{resource_path}">%{resource_title}</a>.'
337
- email_outro: Tämä ilmoitus on lähetetty sinulle, koska olet osallistuja kohteessa <a href="%{resource_path}">%{resource_title}</a>.
336
+ email_intro: '%{requester_name} pyysi pääsyä osallistujaksi. Voit <strong>hyväksyä tai hylätä pyynnön</strong> sivulla <a href="%{resource_url}">%{resource_title}</a>.'
337
+ email_outro: Tämä ilmoitus on lähetetty sinulle, koska olet osallistuja kohteessa <a href="%{resource_url}">%{resource_title}</a>.
338
338
  email_subject: "%{requester_name} pyysi osallistumisoikeutta kohteeseen %{resource_title}."
339
- notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> pyysi saada muokata sisältöä <a href="%{resource_path}">%{resource_title}</a>. <strong>Hyväksy tai hylkää pyyntö</strong>.
339
+ notification_title: <a href="%{requester_path}">%{requester_name} %{requester_nickname}</a> pyysi saada muokata sisältöä <a href="%{resource_url}">%{resource_title}</a>. <strong>Hyväksy tai hylkää pyyntö</strong>.
340
340
  plan_access_requester_accepted:
341
- email_intro: Sinut on hyväksytty osallistujaksi sisältöön <a href="%{resource_path}">%{resource_title}</a>.
342
- email_outro: Tämä ilmoitus on lähetetty sinulle, koska olet hakenut muokkausoikeuksia sisältöön <a href="%{resource_path}">%{resource_title}</a>.
341
+ email_intro: Sinut on hyväksytty osallistujaksi sisältöön <a href="%{resource_url}">%{resource_title}</a>.
342
+ email_outro: Tämä ilmoitus on lähetetty sinulle, koska olet hakenut muokkausoikeuksia sisältöön <a href="%{resource_url}">%{resource_title}</a>.
343
343
  email_subject: Sinut on hyväksytty osallistujaksi sisältöön %{resource_title}.
344
- notification_title: Sinut on <strong>hyväksytty osallistujaksi </strong> sisältöön <a href="%{resource_path}">%{resource_title}</a>.
344
+ notification_title: Sinut on <strong>hyväksytty osallistujaksi </strong> sisältöön <a href="%{resource_url}">%{resource_title}</a>.
345
345
  plan_access_requester_rejected:
346
- email_intro: Sinua ei ole hyväksytty osallistujaksi sisältöön <a href="%{resource_path}">%{resource_title}</a>.
347
- email_outro: Tämä ilmoitus on lähetetty sinulle, koska olet pyytänyt pääsyä osallistujaksi sisältöön <a href="%{resource_path}">%{resource_title}</a>.
346
+ email_intro: Sinua ei ole hyväksytty osallistujaksi sisältöön <a href="%{resource_url}">%{resource_title}</a>.
347
+ email_outro: Tämä ilmoitus on lähetetty sinulle, koska olet pyytänyt pääsyä osallistujaksi sisältöön <a href="%{resource_url}">%{resource_title}</a>.
348
348
  email_subject: Sinua ei ole hyväksytty osallistujaksi sisältöön %{resource_title}.
349
- notification_title: Sinua <strong>ei ole hyväksytty osallistujaksi</strong> sisältöön <a href="%{resource_path}">%{resource_title}</a>.
349
+ notification_title: Sinua <strong>ei ole hyväksytty osallistujaksi</strong> sisältöön <a href="%{resource_url}">%{resource_title}</a>.
350
350
  plan_accepted:
351
351
  email_intro: '"%{resource_title}" on hyväksytty. Voit lukea vastauksen täältä:'
352
352
  email_outro: Tämä ilmoitus on lähetetty sinulle, koska seuraat kohdetta "%{resource_title}". Voit lopettaa sen seuraamisen edellä esitetyn linkin kautta.
353
353
  email_subject: Seuraamasi kohde on hyväksytty
354
- notification_title: <a href="%{resource_path}">%{resource_title}</a> on hyväksytty.
354
+ notification_title: <a href="%{resource_url}">%{resource_title}</a> on hyväksytty.
355
355
  plan_evaluating:
356
356
  email_intro: '"%{resource_title}" arvioidaan parhaillaan. Voit tarkistaa vastauksen tältä sivulla:'
357
357
  email_outro: Tämä ilmoitus on lähetetty sinulle, koska seuraat kohdetta "%{resource_title}". Voit lopettaa seuraamisen edellä esitetyn linkin kautta.
358
358
  email_subject: Seuraamasi kohde on arvioitavana
359
- notification_title: <a href="%{resource_path}">%{resource_title}</a> on arvioitavana.
359
+ notification_title: <a href="%{resource_url}">%{resource_title}</a> on arvioitavana.
360
360
  plan_published:
361
361
  email_intro: '"%{resource_title}" on julkaistu. Näet sen täältä:'
362
362
  email_outro: Tämä ilmoitus on lähetetty sinulle, koska seuraat kohteen "%{resource_title}" laatijaa. Voit lopettaa sen seuraamisen edellä esitetyn linkin kautta.
363
363
  email_subject: Seuraamasi käyttäjä on julkaissut uutta sisältöä
364
- notification_title: <a href="%{resource_path}">%{resource_title}</a> on julkaistu.
364
+ notification_title: <a href="%{resource_url}">%{resource_title}</a> on julkaistu.
365
365
  plan_published_for_proposals:
366
366
  email_intro: 'Laatimasi ehdotus on linkitetty kohteeseen "%{resource_title}". Näet sen täältä:'
367
367
  email_outro: Tämä ilmoitus on lähetetty sinulle, koska seuraat kohdetta "%{resource_title}" laatimisesi ehdotusten kautta. Voit lopettaa seuraamisen edellä esitetyn linkin kautta.
368
368
  email_subject: Laatimasi ehdotus on linkitetty uuteen sisältöön
369
- notification_title: Laatimasi ehdotus on linkitetty kohteeseen <a href="%{resource_path}">%{resource_title}</a>.
369
+ notification_title: Laatimasi ehdotus on linkitetty kohteeseen <a href="%{resource_url}">%{resource_title}</a>.
370
370
  plan_published_for_space:
371
371
  email_intro: '"%{resource_title}" on julkaistu. Näet sen täältä:'
372
372
  email_outro: Tämä ilmoitus on lähetetty sinulle, koska seuraat kohdetta "%{resource_title}". Voit lopettaa sen seuraamisen edellä esitetyn linkin kautta.
373
373
  email_subject: Seuraamasi kohde on julkaistu
374
- notification_title: <a href="%{resource_path}">%{resource_title}</a> on julkaistu.
374
+ notification_title: <a href="%{resource_url}">%{resource_title}</a> on julkaistu.
375
375
  plan_rejected:
376
376
  email_intro: '"%{resource_title}" on hylätty. Voit lukea vastauksen tällä sivulla:'
377
377
  email_outro: Tämä ilmoitus on lähetetty sinulle, koska seuraat kohdetta "%{resource_title}". Voit lopettaa sen seuraamisen edellä esitetyn linkin kautta.
378
378
  email_subject: Seuraamasi kohde on hylätty
379
- notification_title: <a href="%{resource_path}">%{resource_title}</a> on hylätty.
379
+ notification_title: <a href="%{resource_url}">%{resource_title}</a> on hylätty.