decidim-meetings 0.27.4 → 0.27.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/meetings/cancel_registration_meeting_button/show.erb +13 -0
  3. data/app/cells/decidim/meetings/cancel_registration_meeting_button_cell.rb +36 -0
  4. data/app/cells/decidim/meetings/content_blocks/upcoming_meetings/show.erb +1 -1
  5. data/app/cells/decidim/meetings/content_blocks/upcoming_meetings_cell.rb +10 -2
  6. data/app/cells/decidim/meetings/highlighted_meetings_for_component/show.erb +2 -2
  7. data/app/cells/decidim/meetings/join_meeting_button/show.erb +1 -15
  8. data/app/cells/decidim/meetings/meeting_s_cell.rb +1 -1
  9. data/app/controllers/decidim/meetings/widgets_controller.rb +11 -1
  10. data/app/helpers/decidim/meetings/directory/application_helper.rb +1 -1
  11. data/app/packs/src/decidim/meetings/poll.component.js +27 -0
  12. data/app/permissions/decidim/meetings/permissions.rb +10 -0
  13. data/app/services/decidim/meetings/calendar/meeting_to_event.rb +6 -1
  14. data/app/views/decidim/meetings/admin/agenda/_form.html.erb +1 -1
  15. data/app/views/decidim/meetings/layouts/live_event.html.erb +1 -1
  16. data/app/views/decidim/meetings/meetings/_meeting_agenda.html.erb +2 -2
  17. data/app/views/decidim/meetings/meetings/index.html.erb +1 -1
  18. data/app/views/decidim/meetings/meetings/show.html.erb +4 -1
  19. data/app/views/decidim/meetings/polls/answers/_multiple_option.html.erb +13 -9
  20. data/app/views/decidim/meetings/polls/answers/_single_option.html.erb +8 -8
  21. data/app/views/decidim/meetings/polls/questions/_published_question.html.erb +2 -2
  22. data/app/views/decidim/participatory_spaces/_conference_venues.html.erb +3 -0
  23. data/config/locales/ar.yml +0 -5
  24. data/config/locales/bg.yml +105 -0
  25. data/config/locales/ca.yml +11 -9
  26. data/config/locales/cs.yml +5 -3
  27. data/config/locales/de.yml +14 -9
  28. data/config/locales/el.yml +1 -6
  29. data/config/locales/en.yml +3 -1
  30. data/config/locales/es-MX.yml +12 -7
  31. data/config/locales/es-PY.yml +9 -4
  32. data/config/locales/es.yml +15 -13
  33. data/config/locales/eu.yml +105 -100
  34. data/config/locales/fi-plain.yml +9 -4
  35. data/config/locales/fi.yml +26 -21
  36. data/config/locales/fr-CA.yml +9 -4
  37. data/config/locales/fr.yml +6 -4
  38. data/config/locales/ga-IE.yml +0 -2
  39. data/config/locales/gl.yml +1 -7
  40. data/config/locales/he-IL.yml +1 -0
  41. data/config/locales/hu.yml +5 -4
  42. data/config/locales/id-ID.yml +1 -7
  43. data/config/locales/is-IS.yml +4 -3
  44. data/config/locales/it.yml +5 -8
  45. data/config/locales/ja.yml +10 -5
  46. data/config/locales/lb.yml +6 -10
  47. data/config/locales/lt.yml +25 -8
  48. data/config/locales/lv.yml +1 -7
  49. data/config/locales/nl.yml +0 -5
  50. data/config/locales/no.yml +0 -2
  51. data/config/locales/pl.yml +72 -5
  52. data/config/locales/pt-BR.yml +119 -7
  53. data/config/locales/pt.yml +1 -4
  54. data/config/locales/ro-RO.yml +2 -5
  55. data/config/locales/ru.yml +2 -8
  56. data/config/locales/sk.yml +2 -8
  57. data/config/locales/sl.yml +3 -0
  58. data/config/locales/sq-AL.yml +1 -0
  59. data/config/locales/sv.yml +5 -5
  60. data/config/locales/th-TH.yml +1 -0
  61. data/config/locales/tr-TR.yml +1 -3
  62. data/config/locales/uk.yml +2 -8
  63. data/config/locales/zh-CN.yml +0 -2
  64. data/config/locales/zh-TW.yml +0 -5
  65. data/decidim-meetings.gemspec +36 -0
  66. data/lib/decidim/meetings/component.rb +1 -1
  67. data/lib/decidim/meetings/engine.rb +4 -3
  68. data/lib/decidim/meetings/meeting_serializer.rb +2 -2
  69. data/lib/decidim/meetings/test/factories.rb +68 -30
  70. data/lib/decidim/meetings/user_answers_serializer.rb +1 -1
  71. data/lib/decidim/meetings/version.rb +1 -1
  72. metadata +25 -20
  73. data/config/environment.rb +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 82da38a1aee360d967117d670596806b11330effeb6c09822419cba4fa2485ba
4
- data.tar.gz: 3535abcc9cc00433e882a19d38cf046c0ef7ce80e491df08ad1e6160a8e7aa3d
3
+ metadata.gz: ee616fce1b0a6eec4212c8fafcc567c73f610842f50698746ce2c521e35ff131
4
+ data.tar.gz: 5bfab791ea3903e692b2c5441cb6ec8f36bfbc5f9e8b6908f7703596629f8674
5
5
  SHA512:
6
- metadata.gz: f29b5b1640ab33b03b8d3b795fc3720ff7efc136afb218f8ba91fe4cf0a4ec1cb06d56596ff89d6c31f8eb8027e487096c7aa165284422eeda9b44fc5d72500f
7
- data.tar.gz: f85547fa23f5ec7c264fb19f5d3c63bee03bb807fd546ebf76ff6c3968daaaf380d843a0ef4ec1e3cc0c9fea681ba305ab5b7a317abc5caf88472c62fccbc95b
6
+ metadata.gz: 1746cf0192964b979b1ff383f47dc701cac3298ec5f5400cd650f71a0b01da9895f9feae0bb2c83b8ce294dccf8ba13d8f3a910fc4d4e19f115f74beca43e0d4
7
+ data.tar.gz: 3fc3d9659b9de30103dd076134314bbd40deac924d577f392646c387b933e1794b000b462152e473f819699d0b4044c16ad443f9929fd0a2996367702b19f72c
@@ -0,0 +1,13 @@
1
+ <div class="text-center">
2
+ <%= action_authorized_link_to(
3
+ :join,
4
+ meeting_registration_path(model),
5
+ resource: model,
6
+ method: :delete,
7
+ class: button_classes,
8
+ data: { disable: true, confirm: t("leave_confirmation", scope: "decidim.meetings.meetings.show") }
9
+ ) do %>
10
+ <%= t("leave", scope: "decidim.meetings.meetings.show") %>
11
+ <%= icon icon_name %>
12
+ <% end %>
13
+ </div>
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Meetings
5
+ # This cell renders the button to cancel a meeting registation.
6
+ class CancelRegistrationMeetingButtonCell < Decidim::ViewModel
7
+ include Decidim::IconHelper
8
+ include MeetingCellsHelper
9
+
10
+ def show
11
+ return unless model.can_be_joined_by?(current_user)
12
+ return unless model.has_registration_for?(current_user)
13
+
14
+ render
15
+ end
16
+
17
+ private
18
+
19
+ def current_component
20
+ model.component
21
+ end
22
+
23
+ def button_classes
24
+ ""
25
+ end
26
+
27
+ def icon_name
28
+ "circle-x"
29
+ end
30
+
31
+ def registration_form
32
+ @registration_form ||= Decidim::Meetings::JoinMeetingForm.new
33
+ end
34
+ end
35
+ end
36
+ end
@@ -8,7 +8,7 @@
8
8
  <% end %>
9
9
  </div>
10
10
  <div class="columns medium-6">
11
- <% if geolocation_enabled? %>
11
+ <% if show_map? %>
12
12
  <%= cell "decidim/meetings/meetings_map", upcoming_meetings %>
13
13
  <% else %>
14
14
  <% (upcoming_meetings - upcoming_meetings.first(4)).each do |event| %>
@@ -25,10 +25,18 @@ module Decidim
25
25
  .limit(limit)
26
26
  end
27
27
 
28
- def geolocation_enabled?
28
+ def show_map?
29
+ maps_active? && !all_online_meetings?
30
+ end
31
+
32
+ def maps_active?
29
33
  Decidim::Map.available?(:geocoding)
30
34
  end
31
35
 
36
+ def all_online_meetings?
37
+ upcoming_meetings.collect(&:type_of_meeting).all?("online")
38
+ end
39
+
32
40
  def meetings_directory_path
33
41
  Decidim::Meetings::DirectoryEngine.routes.url_helpers.root_path
34
42
  end
@@ -36,7 +44,7 @@ module Decidim
36
44
  private
37
45
 
38
46
  def limit
39
- geolocation_enabled? ? 4 : 8
47
+ maps_active? ? 4 : 8
40
48
  end
41
49
 
42
50
  def meeting_components
@@ -1,7 +1,7 @@
1
1
  <% if upcoming_meetings.any? %>
2
2
  <div class="section row collapse upcoming_meetings">
3
3
  <h3 class="section-heading">
4
- <%= translated_attribute(model.name) %> - <%= t("decidim.participatory_spaces.highlighted_meetings.upcoming_meetings") %>
4
+ <%= decidim_escape_translated(model.name) %> - <%= t("decidim.participatory_spaces.highlighted_meetings.upcoming_meetings") %>
5
5
  <a href="<%= main_component_path(model) %>" class="text-small"><%= t("decidim.participatory_spaces.highlighted_meetings.see_all", count: upcoming_meetings_count) %></a>
6
6
  </h3>
7
7
  <div class="card card--list">
@@ -18,7 +18,7 @@
18
18
  <% elsif past_meetings.any? %>
19
19
  <div class="section row collapse past_meetings">
20
20
  <h3 class="section-heading">
21
- <%= translated_attribute(model.name) %> - <%= t("decidim.participatory_spaces.highlighted_meetings.past_meetings") %> <a href="<%= main_component_path(model) %>" class="text-small"><%= t("decidim.participatory_spaces.highlighted_meetings.see_all", count: past_meetings_count) %></a>
21
+ <%= decidim_escape_translated(model.name) %> - <%= t("decidim.participatory_spaces.highlighted_meetings.past_meetings") %> <a href="<%= main_component_path(model) %>" class="text-small"><%= t("decidim.participatory_spaces.highlighted_meetings.see_all", count: past_meetings_count) %></a>
22
22
  </h3>
23
23
  <div class="card card--list">
24
24
  <% past_meetings.each do |meeting| %>
@@ -1,19 +1,5 @@
1
1
  <% if model.can_be_joined_by?(current_user) %>
2
- <% if model.has_registration_for? current_user %>
3
- <span>
4
- <%= icon("check", class: "icon--small") %>
5
- <%= t("going", scope: "decidim.meetings.meetings.show") %>
6
- </span>
7
- <%= action_authorized_button_to(
8
- :join,
9
- t("leave", scope: "decidim.meetings.meetings.show"),
10
- meeting_registration_path(model),
11
- resource: model,
12
- method: :delete,
13
- class: button_classes,
14
- data: { disable: true, confirm: t("leave_confirmation", scope: "decidim.meetings.meetings.show") }
15
- ) %>
16
- <% else %>
2
+ <% unless model.has_registration_for? current_user %>
17
3
  <% if model.registration_form_enabled? %>
18
4
  <%= action_authorized_link_to(
19
5
  :join,
@@ -14,7 +14,7 @@ module Decidim
14
14
  end
15
15
 
16
16
  def participatory_space_title
17
- translated_attribute model.component.participatory_space.title
17
+ decidim_escape_translated model.component.participatory_space.title
18
18
  end
19
19
 
20
20
  def participatory_space_path
@@ -6,15 +6,25 @@ module Decidim
6
6
  helper MeetingsHelper
7
7
  helper Decidim::SanitizeHelper
8
8
 
9
+ def show
10
+ enforce_permission_to :embed, :meeting, meeting: model if model
11
+
12
+ super
13
+ end
14
+
9
15
  private
10
16
 
11
17
  def model
12
- @model ||= Meeting.where(component: params[:component_id]).find(params[:meeting_id])
18
+ @model ||= Meeting.except_withdrawn.published.not_hidden.where(component: current_component).find(params[:meeting_id])
13
19
  end
14
20
 
15
21
  def iframe_url
16
22
  @iframe_url ||= meeting_widget_url(model)
17
23
  end
24
+
25
+ def permission_class_chain
26
+ [Decidim::Meetings::Permissions]
27
+ end
18
28
  end
19
29
  end
20
30
  end
@@ -92,7 +92,7 @@ module Decidim
92
92
  key_point = current_participatory_space.class.name.gsub("::", "__") + current_participatory_space.id.to_s
93
93
 
94
94
  TreeNode.new(
95
- TreePoint.new(key_point, translated_attribute(current_participatory_space.title, current_organization)),
95
+ TreePoint.new(key_point, decidim_escape_translated(current_participatory_space.title)),
96
96
  categories_values
97
97
  )
98
98
  end
@@ -1,5 +1,8 @@
1
1
  /* eslint id-length: ["error", { "exceptions": ["$"] }] */
2
2
 
3
+ import createOptionAttachedInputs from "src/decidim/forms/option_attached_inputs.component"
4
+ import createMaxChoicesAlertComponent from "src/decidim/forms/max_choices_alert.component"
5
+
3
6
  /**
4
7
  * A plain Javascript component that handles questions from polls in meetings:
5
8
  * - fetches them via Ajax
@@ -75,6 +78,7 @@ export default class PollComponent {
75
78
  this._updateCounter();
76
79
  this._setQuestionsState(this.$element);
77
80
  this._pollQuestions();
81
+ this._addValidations();
78
82
  });
79
83
  }
80
84
 
@@ -163,4 +167,27 @@ export default class PollComponent {
163
167
  this.$counter.html(`(${questionsCount})`);
164
168
  }
165
169
  }
170
+
171
+ _addValidations() {
172
+ $(".js-radio-button-collection, .js-check-box-collection").each((idx, el) => {
173
+ createOptionAttachedInputs({
174
+ wrapperField: $(el),
175
+ controllerFieldSelector: "input[type=radio], input[type=checkbox]",
176
+ dependentInputSelector: "input[type=text], input[type=hidden]"
177
+ });
178
+ });
179
+
180
+ $.unique($(".js-check-box-collection").parents(".answer")).each((idx, el) => {
181
+ const maxChoices = $(el).data("max-choices");
182
+ if (maxChoices) {
183
+ createMaxChoicesAlertComponent({
184
+ wrapperField: $(el),
185
+ controllerFieldSelector: "input[type=checkbox]",
186
+ controllerCollectionSelector: ".js-check-box-collection",
187
+ alertElement: $(el).find(".max-choices-alert"),
188
+ maxChoices: maxChoices
189
+ });
190
+ }
191
+ });
192
+ }
166
193
  }
@@ -4,6 +4,7 @@ module Decidim
4
4
  module Meetings
5
5
  class Permissions < Decidim::DefaultPermissions
6
6
  def permissions
7
+ allow_embed_meeting?
7
8
  return permission_action unless user
8
9
 
9
10
  # Delegate the admin permission checks to the admin permissions class
@@ -57,6 +58,15 @@ module Decidim
57
58
  @question ||= context.fetch(:question, nil)
58
59
  end
59
60
 
61
+ # As this is a public action, we need to run this before other checks
62
+ def allow_embed_meeting?
63
+ return unless permission_action.action == :embed && permission_action.subject == :meeting && meeting
64
+ return disallow! if meeting.withdrawn?
65
+ return allow! if meeting.published?
66
+
67
+ disallow!
68
+ end
69
+
60
70
  def can_join_meeting?
61
71
  meeting.can_be_joined_by?(user) &&
62
72
  authorized?(:join, resource: meeting)
@@ -39,7 +39,7 @@ module Decidim
39
39
  @event.dtstart = Icalendar::Values::DateTime.new(meeting.start_time.utc, "tzid" => "UTC")
40
40
  @event.dtend = Icalendar::Values::DateTime.new(meeting.end_time.utc, "tzid" => "UTC")
41
41
  @event.summary = present(meeting).title
42
- @event.description = strip_tags(CGI.unescapeHTML(present(meeting).description))
42
+ @event.description = description_with_link
43
43
  @event.location = meeting.address
44
44
  @event.geo = [meeting.latitude, meeting.longitude]
45
45
  @event.url = url_for(meeting)
@@ -64,6 +64,11 @@ module Decidim
64
64
  def present(meeting)
65
65
  Decidim::Meetings::MeetingPresenter.new(meeting)
66
66
  end
67
+
68
+ def description_with_link
69
+ link = "\n\n#{I18n.t("read_more", scope: "decidim.meetings.calendar.meeting_to_event")} #{url_for(meeting)}"
70
+ strip_tags(CGI.unescapeHTML(present(meeting).description)) + link
71
+ end
67
72
  end
68
73
  end
69
74
  end
@@ -3,7 +3,7 @@
3
3
  <h2 class="card-title">
4
4
  <div class="flex--sbc">
5
5
  <div class="grid-x align-middle">
6
- <u> <%= present(@meeting).title %> </u> &nbsp;<%= icon "arrow-right" %>&nbsp;<%= title %>
6
+ <u> <%= present(@meeting).title(html_escape: true) %> </u> &nbsp;<%= icon "arrow-right" %>&nbsp;<%= title %>
7
7
  </div>
8
8
  </div>
9
9
  </h2>
@@ -24,7 +24,7 @@
24
24
  <% end %>
25
25
 
26
26
  <div>
27
- <strong class="text-secondary"><%= current_organization.name %></strong> / <strong><%= present(meeting).title(links: true) %></strong>
27
+ <strong class="text-secondary"><%= current_organization.name %></strong> / <strong><%= present(meeting).title(links: true, html_escape: true) %></strong>
28
28
  </div>
29
29
 
30
30
  <div class="flex--cc">
@@ -11,7 +11,7 @@
11
11
  <span class="text-small"><%= display_duration_agenda_items(agenda_item.id, index, agenda_items_times) %></span>
12
12
  </h5>
13
13
  <hr class="reset m-none mb-s">
14
- <p><%= translated_attribute(agenda_item.description).html_safe %></p>
14
+ <p><%= decidim_sanitize_translated(agenda_item.description).html_safe %></p>
15
15
 
16
16
  <% if agenda_item.agenda_item_children.presence %>
17
17
  <% parent_start_time = agenda_items_times[index][:start_time] %>
@@ -22,7 +22,7 @@
22
22
  <strong><%= translated_attribute(agenda_item_child.title) %></strong>&nbsp;
23
23
  <span class="text-small"><%= display_duration_agenda_items(agenda_item_child.id, index_child, agenda_item_children_times) %></span>
24
24
  </h6>
25
- <p><%= translated_attribute(agenda_item_child.description).html_safe %></p>
25
+ <p><%= decidim_sanitize_translated(agenda_item_child.description).html_safe %></p>
26
26
  <% end %>
27
27
  <% end %>
28
28
  <% end %>
@@ -10,7 +10,7 @@
10
10
  <%= render partial: "count" %>
11
11
  </h2>
12
12
 
13
- <% if allowed_to?(:create, :meeting) %>
13
+ <% if try(:component_settings) && component_settings&.creation_enabled_for_participants? && current_component.participatory_space.can_participate?(current_user) %>
14
14
  <%= action_authorized_link_to :create, new_meeting_path, class: "title-action__action button small", data: { "redirect_url" => new_meeting_path } do %>
15
15
  <%= t("new_meeting", scope: "decidim.meetings.meetings.index") %>
16
16
  <%= icon "plus", role: "img", "aria-hidden": true %>
@@ -103,8 +103,11 @@ edit_link(
103
103
 
104
104
  <%= resource_reference(meeting) %>
105
105
  <%= resource_version(meeting, versions_path: meeting_versions_path(meeting)) %>
106
+ <%= cell "decidim/meetings/cancel_registration_meeting_button", meeting %>
106
107
  <%= render partial: "decidim/shared/share_modal" %>
107
- <%= embed_modal_for meeting_widget_url(meeting, format: :js) %>
108
+ <% if allowed_to? :embed, :meeting, meeting: @meeting %>
109
+ <%= embed_modal_for meeting_widget_url(meeting, format: :js) %>
110
+ <% end %>
108
111
  <%= render partial: "calendar_modal", locals: { ics_url: calendar_meeting_url(meeting), google_url: google_calendar_event_url(meeting) } %>
109
112
  </div>
110
113
  <div class="columns mediumlarge-8 mediumlarge-pull-4">
@@ -1,13 +1,17 @@
1
- <% question.answer_options.each_with_index do |answer_option, idx| %>
2
- <% choice = answer.choices.find { |choice| choice.decidim_answer_option_id == answer_option.id } if answer %>
1
+ <div class="answer-questionnaire__single-option js-check-box-collection">
2
+ <% question.answer_options.each_with_index do |answer_option, idx| %>
3
+ <% choice = answer.choices.find { |choice| choice.decidim_answer_option_id == answer_option.id } if answer %>
3
4
 
4
- <%= label_tag do %>
5
- <%= check_box_tag "answer[choices][#{idx}][body]",
6
- translated_attribute(answer_option.body),
7
- choice.present?, disabled: disabled %>
5
+ <div class="js-collection-input">
6
+ <%= label_tag do %>
7
+ <%= check_box_tag "answer[choices][#{idx}][body]",
8
+ translated_attribute(answer_option.body),
9
+ choice.present?, disabled: disabled %>
8
10
 
9
- <%= translated_attribute(answer_option.body) %>
11
+ <%= translated_attribute(answer_option.body) %>
10
12
 
11
- <%= hidden_field_tag "answer[choices][#{idx}][answer_option_id]", answer_option.id, disabled: disabled %>
13
+ <%= hidden_field_tag "answer[choices][#{idx}][answer_option_id]", answer_option.id, disabled: disabled %>
14
+ <% end %>
15
+ </div>
12
16
  <% end %>
13
- <% end %>
17
+ </div>
@@ -4,16 +4,16 @@
4
4
  <% choice_id = "#{field_id}_choices_#{idx}" %>
5
5
 
6
6
  <%= label_tag "#{choice_id}_body" do %>
7
- <%= radio_button_tag "answer[choices][#{idx}][body]",
8
- translated_attribute(answer_option.body),
9
- answer_option.id == choice.try(:decidim_answer_option_id),
10
- id: "#{choice_id}_body", disabled: disabled %>
7
+ <%= radio_button_tag "answer[choices][#{question.id}][body]",
8
+ translated_attribute(answer_option.body),
9
+ answer_option.id == choice.try(:decidim_answer_option_id),
10
+ id: "#{choice_id}_body", disabled: disabled %>
11
11
 
12
12
  <%= translated_attribute(answer_option.body) %>
13
13
 
14
- <%= hidden_field_tag "answer[choices][#{idx}][answer_option_id]",
15
- answer_option.id,
16
- id: "#{choice_id}_answer_option",
17
- disabled: disabled %>
14
+ <%= hidden_field_tag "answer[choices][#{question.id}][answer_option_id]",
15
+ answer_option.id,
16
+ id: "#{choice_id}_answer_option",
17
+ disabled: disabled %>
18
18
  <% end %>
19
19
  <% end %>
@@ -6,12 +6,12 @@
6
6
  <% @form = form || Decidim::Meetings::AnswerForm.new(question_id: question.id, current_user: current_user) %>
7
7
  <%= decidim_form_for(@form, url: meeting_polls_answers_path(meeting), method: :post, remote: true, html: { class: "form answer-questionnaire" }, data: { "safe-path" => meeting_live_event_path(meeting) }) do |form| %>
8
8
  <div class="row column answer question" data-max-choices="<%= question.max_choices %>">
9
+ <small class="form-error max-choices-alert"><%= t(".max_choices_alert") %></small>
10
+
9
11
  <%= render partial: "decidim/meetings/polls/answers/#{question.question_type}", locals: { answer: @form.answer, question: question, answer_form: form, disabled: question.answered_by?(current_user), field_id: question.id } %>
10
12
 
11
13
  <%= form.hidden_field :question_id %>
12
14
 
13
- <small class="form-error max-choices-alert"><%= t(".max_choices_alert") %></small>
14
-
15
15
  <% @form.errors.full_messages.each do |msg| %>
16
16
  <small class="form-error is-visible margin-top-1"><%= msg %></small>
17
17
  <% end %>
@@ -5,8 +5,11 @@
5
5
  <div class="row">
6
6
  <div class="column medium-4">
7
7
  <% meetings.each do |meeting_block| %>
8
+ <% next if meeting_block.first.empty? %>
9
+
8
10
  <% meeting_block.last.each_with_index do |meeting, index| %>
9
11
  <% next if index != 0 %>
12
+
10
13
  <%== cell("decidim/conferences/conference_address", meeting) %>
11
14
  <% end %>
12
15
  <% end %>
@@ -296,9 +296,7 @@ ar:
296
296
  select_user: اختر المشارك
297
297
  index:
298
298
  filter:
299
- accepted: وافقت
300
299
  all: الكل
301
- rejected: مرفوض
302
300
  sent: أرسلت
303
301
  filter_by: مصنف بواسطة
304
302
  invite_attendee: دعوة الحضور
@@ -339,7 +337,6 @@ ar:
339
337
  select_a_meeting_type: الرجاء تحديد نوع الاجتماع
340
338
  select_a_registration_type: الرجاء تحديد نوع التسجيل
341
339
  select_an_iframe_access_level: الرجاء تحديد مستوى الوصول إلى iframe
342
- show_embedded_iframe_help: 'يسمح عدد قليل فقط من الخدمات بتضمين الاجتماع أو الحدث المباشر من المجالات التالية: %{domains}'
343
340
  index:
344
341
  title: اجتماعات
345
342
  new:
@@ -544,7 +541,6 @@ ar:
544
541
  select_a_meeting_type: الرجاء تحديد نوع الاجتماع
545
542
  select_a_registration_type: الرجاء تحديد نوع التسجيل
546
543
  select_an_iframe_access_level: الرجاء تحديد مستوى الوصول إلى iframe
547
- show_embedded_iframe_help: 'يسمح عدد قليل فقط من الخدمات بتضمين الاجتماع أو الحدث المباشر من المجالات التالية: %{domains}'
548
544
  index:
549
545
  click_here: عرض كافة الاجتماعات
550
546
  new_meeting: اجتماع جديد
@@ -570,7 +566,6 @@ ar:
570
566
  contributions: عدد المساهمات
571
567
  date: تاريخ
572
568
  edit_meeting: تعديل الاجتماعات
573
- going: لقد قمت بالتسجيل لهذا الاجتماع
574
569
  leave: إلغاء التسجيل الخاص بك
575
570
  leave_confirmation: هل أنت متأكد من أنك تريد إلغاء تسجيلك لهذا الاجتماع؟
576
571
  link_available_soon: سيكون الرابط متوفر قريباً
@@ -1,6 +1,34 @@
1
1
  ---
2
2
  bg:
3
+ activemodel:
4
+ errors:
5
+ models:
6
+ meeting:
7
+ attributes:
8
+ iframe_embed_type:
9
+ not_embeddable: Този URL адрес не може да бъде вграден в страница за среща или събитие на живо
10
+ meeting_agenda:
11
+ attributes:
12
+ base:
13
+ too_many_minutes: Продължителността на точките надвишава продължителността на срещата с(ъс) %{count} минути
14
+ too_many_minutes_child: Продължителността на подточките надвишава продължителността на точката от дневния ред „%{parent_title}“ с(ъс) %{count} минути
15
+ meeting_registration_invite:
16
+ attributes:
17
+ email:
18
+ already_invited: На този имейл вече е изпратена покана
3
19
  decidim:
20
+ admin:
21
+ meeting_copies:
22
+ new:
23
+ select: Изберете кои данни искате да дублирате
24
+ forms:
25
+ meetings:
26
+ attendees_count_help_text: Не забравяйте да включите общия брой присъстващи на вашата среща, независимо дали те присъстват лично, онлайн или хибридно.
27
+ gamification:
28
+ badges:
29
+ attended_meetings:
30
+ unearned_another: Този участник все още не е присъствал на нито една среща.
31
+ unearned_own: Все още не сте присъствали на нито една среща.
4
32
  meetings:
5
33
  actions:
6
34
  invalid_destroy:
@@ -8,9 +36,86 @@ bg:
8
36
  one: 'Срещата не може да бъде премахната, понеже има %{count} участник свързан с нея:'
9
37
  other: 'Срещата не може да бъде премахната, понеже има %{count} участника свързани с нея:'
10
38
  admin:
39
+ agenda:
40
+ create:
41
+ invalid: Възникна проблем при създаването на този дневен ред
42
+ success: Дневният ред беше създаден успешно
43
+ update:
44
+ invalid: Възникна проблем при актуализирането на този дневен ред
45
+ success: Дневният ред беше актуализиран успешно
46
+ invites:
47
+ index:
48
+ filter_by: Филтрирай по
49
+ registrations_disabled: Не можете да поканите присъстващи, защото регистрациите са изключени.
11
50
  meetings:
51
+ close:
52
+ invalid: Възникна проблем при закриването на тази среща
53
+ success: Срещата беше закрита успешно
54
+ create:
55
+ invalid: Възникна проблем при създаването на тази среща
12
56
  destroy:
13
57
  invalid:
14
58
  proposals_count:
15
59
  one: Срещата не може да бъде премахната, понеже има %{count} участник свързан с нея
16
60
  other: Срещата не може да бъде премахната, понеже има %{count} участника свързани с нея
61
+ form:
62
+ disclaimer: 'Отказ от отговорност: Използвайки външна система за регистрация, вие сте наясно, че организаторите на %{organization} не носят отговорност за данните, предоставени от потребителите на външната услуга.'
63
+ publish:
64
+ invalid: Възникна проблем при публикуването на тази среща
65
+ success: Срещата беше публикувана успешно
66
+ unpublish:
67
+ invalid: Възникна проблем при отмяната на публикуването на тази среща
68
+ success: Публикуването на срещата беше успешно отменено
69
+ update:
70
+ invalid: Възникна проблем при актуализирането на тази среща
71
+ success: Срещата беше актуализирана успешно
72
+ meetings_poll:
73
+ update:
74
+ invalid: Възникна проблем при актуализирането на тази анкета за среща
75
+ success: Анкетата за среща бе актуализирана успешно
76
+ registrations:
77
+ form:
78
+ reserved_slots_help: Оставете 0, ако не разполагате с резервирани места
79
+ calendar_modal:
80
+ close_window: Затвори прозореца
81
+ copy_calendar_url_explanation: Моля, обърнете внимание, че експортирате селекция от срещи, тъй като има активни филтри. Ако искате да ги експортирате всички, първо нулирайте всички филтри.
82
+ content_blocks:
83
+ upcoming_meetings:
84
+ view_all_meetings: Виж всички
85
+ last_activity:
86
+ meeting_updated_at_html: "<span>Срещата беше актуализирана на: %{link}</span>"
87
+ new_meeting_at_html: "<span>Нова среща на %{link}</span>"
88
+ meeting:
89
+ not_allowed: Нямате разрешение да разглеждате тази среща
90
+ meetings:
91
+ calendar_modal:
92
+ close_window: Затвори прозореца
93
+ filters_small_view:
94
+ close_modal: Затвори прозореца
95
+ filter: Филтър
96
+ filter_by: Филтрирай по
97
+ unfold: Разгъване
98
+ form:
99
+ disclaimer: 'Отказ от отговорност: Използвайки външна система за регистрация, вие сте наясно, че организаторите на %{organization} не носят отговорност за данните, предоставени от потребителите на външната услуга.'
100
+ meeting_minutes:
101
+ related_information: Свързана информация
102
+ meetings:
103
+ no_meetings_warning: Няма срещи, които да съответстват на критериите Ви за търсене, или няма насрочени срещи.
104
+ show:
105
+ back: Обратно към списъка
106
+ view: Преглед
107
+ meetings_map:
108
+ view_meeting: Преглед на срещата
109
+ public_participants_list:
110
+ attending_participants: Присъстващи участници
111
+ registrations:
112
+ create:
113
+ success: Присъединихте се успешно към срещата. Тъй като се регистрирахте за тази среща, ще бъдете уведомявани за всички нейни актуализации.
114
+ versions:
115
+ back_to_resource: Връщане назад към срещата
116
+ withdraw:
117
+ error: Възникна грешка при оттеглянето на срещата
118
+ success: Срещата е оттеглена успешно
119
+ participatory_spaces:
120
+ highlighted_meetings:
121
+ see_all: Виж всички срещи (%{count})