decidim-term_customizer 0.16.6 → 0.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/decidim/term_customizer/admin/translations_admin_bulk.js.es6 +113 -0
  3. data/app/commands/decidim/term_customizer/admin/destroy_translations.rb +40 -0
  4. data/app/commands/decidim/term_customizer/admin/import_set_translations.rb +139 -0
  5. data/app/controllers/decidim/term_customizer/admin/translation_sets_controller.rb +11 -0
  6. data/app/controllers/decidim/term_customizer/admin/translations_controller.rb +23 -0
  7. data/app/controllers/decidim/term_customizer/admin/translations_destroys_controller.rb +54 -0
  8. data/app/forms/decidim/term_customizer/admin/translations_destroy_form.rb +46 -0
  9. data/app/forms/decidim/term_customizer/admin/translations_import_form.rb +48 -0
  10. data/app/helpers/decidim/term_customizer/admin/translations_helper.rb +21 -0
  11. data/app/jobs/decidim/term_customizer/admin/export_job.rb +19 -0
  12. data/app/permissions/decidim/term_customizer/admin/permissions.rb +11 -1
  13. data/app/views/decidim/term_customizer/admin/add_translations/index.html.erb +26 -6
  14. data/app/views/decidim/term_customizer/admin/translation_sets/_form.html.erb +25 -1
  15. data/app/views/decidim/term_customizer/admin/translation_sets/index.html.erb +39 -33
  16. data/app/views/decidim/term_customizer/admin/translations/_export_dropdown.html.erb +8 -0
  17. data/app/views/decidim/term_customizer/admin/translations/_form.html.erb +27 -1
  18. data/app/views/decidim/term_customizer/admin/translations/bulk_actions/_destroy.html.erb +13 -0
  19. data/app/views/decidim/term_customizer/admin/translations/bulk_actions/_dropdown.html.erb +26 -0
  20. data/app/views/decidim/term_customizer/admin/translations/index.html.erb +66 -38
  21. data/app/views/decidim/term_customizer/admin/translations/new_import.html.erb +40 -0
  22. data/app/views/decidim/term_customizer/admin/translations_destroys/new.html.erb +36 -0
  23. data/config/locales/ca.yml +72 -26
  24. data/config/locales/en.yml +109 -26
  25. data/config/locales/es.yml +72 -26
  26. data/config/locales/fi.yml +72 -26
  27. data/config/locales/fr.yml +72 -26
  28. data/config/locales/sv.yml +72 -26
  29. data/lib/decidim/term_customizer.rb +4 -0
  30. data/lib/decidim/term_customizer/admin_engine.rb +11 -1
  31. data/lib/decidim/term_customizer/import.rb +12 -0
  32. data/lib/decidim/term_customizer/import/importer.rb +69 -0
  33. data/lib/decidim/term_customizer/import/importer_factory.rb +17 -0
  34. data/lib/decidim/term_customizer/import/parser.rb +49 -0
  35. data/lib/decidim/term_customizer/import/readers.rb +39 -0
  36. data/lib/decidim/term_customizer/import/readers/base.rb +36 -0
  37. data/lib/decidim/term_customizer/import/readers/csv.rb +23 -0
  38. data/lib/decidim/term_customizer/import/readers/json.rb +25 -0
  39. data/lib/decidim/term_customizer/import/readers/xls.rb +25 -0
  40. data/lib/decidim/term_customizer/translation_import_collection.rb +71 -0
  41. data/lib/decidim/term_customizer/translation_parser.rb +13 -0
  42. data/lib/decidim/term_customizer/translation_serializer.rb +28 -0
  43. data/lib/decidim/term_customizer/version.rb +2 -2
  44. metadata +39 -14
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module TermCustomizer
5
+ module Admin
6
+ # A form object to be used when admin users want to import a collection of proposals
7
+ # from a participatory text.
8
+ class TranslationsImportForm < Decidim::Form
9
+ ACCEPTED_MIME_TYPES = Decidim::TermCustomizer::Import::Readers::ACCEPTED_MIME_TYPES
10
+ MIME_TYPE_ZIP = "application/zip"
11
+
12
+ mimic :translations_import
13
+
14
+ attribute :file
15
+
16
+ validates :file, presence: true
17
+ validate :accepted_mime_type
18
+
19
+ def file_path
20
+ file&.path
21
+ end
22
+
23
+ def mime_type
24
+ file&.content_type
25
+ end
26
+
27
+ def zip_file?
28
+ mime_type == MIME_TYPE_ZIP
29
+ end
30
+
31
+ def accepted_mime_type
32
+ accepted_mime_types = ACCEPTED_MIME_TYPES.values + [MIME_TYPE_ZIP]
33
+ return if accepted_mime_types.include?(mime_type)
34
+
35
+ errors.add(
36
+ :file,
37
+ I18n.t(
38
+ "activemodel.errors.models.translations_import.attributes.file.invalid_mime_type",
39
+ valid_mime_types: ACCEPTED_MIME_TYPES.keys.map do |m|
40
+ I18n.t("decidim.term_customizer.admin.translations.new_import.accepted_mime_types.#{m}")
41
+ end.join(", ")
42
+ )
43
+ )
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module TermCustomizer
5
+ module Admin
6
+ module TranslationsHelper
7
+ # Public: A formatted collection of mime_type to be used
8
+ # in forms.
9
+ def mime_types
10
+ types = ""
11
+ accepted_mime_types = Decidim::TermCustomizer::Import::Readers::ACCEPTED_MIME_TYPES.keys
12
+ accepted_mime_types.each_with_index do |mime_type, index|
13
+ types += t(".accepted_mime_types.#{mime_type}")
14
+ types += ", " unless accepted_mime_types.length == index + 1
15
+ end
16
+ types
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module TermCustomizer
5
+ module Admin
6
+ class ExportJob < ApplicationJob
7
+ queue_as :default
8
+
9
+ def perform(user, set, name, format)
10
+ export_data = Decidim::Exporters.find_exporter(format).new(
11
+ set.translations, TranslationSerializer
12
+ ).export
13
+
14
+ ExportMailer.export(user, name, export_data).deliver_now
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -20,6 +20,7 @@ module Decidim
20
20
 
21
21
  allowed_translation_set_action?
22
22
  allowed_translation_action?
23
+ allowed_translation_bulk_action?
23
24
 
24
25
  permission_action
25
26
  end
@@ -40,7 +41,7 @@ module Decidim
40
41
  case permission_action.action
41
42
  when :create, :read
42
43
  allow!
43
- when :update, :destroy
44
+ when :update, :destroy, :import, :export
44
45
  toggle_allow(translation_set.present?)
45
46
  end
46
47
  end
@@ -56,6 +57,15 @@ module Decidim
56
57
  end
57
58
  end
58
59
 
60
+ def allowed_translation_bulk_action?
61
+ return unless permission_action.subject == :translations
62
+
63
+ case permission_action.action
64
+ when :destroy
65
+ toggle_allow(translation_set.present?)
66
+ end
67
+ end
68
+
59
69
  def read_admin_dashboard_action?
60
70
  permission_action.action == :read &&
61
71
  permission_action.subject == :admin_dashboard
@@ -1,12 +1,32 @@
1
1
  <div class="card" id="add-translations-search">
2
2
  <div class="card-divider">
3
- <h2 class="card-title">
4
- <%= t "decidim.admin.titles.translations" %>
3
+ <h2 class="card-title flex--sbc">
4
+ <div>
5
+ <%= link_to t("decidim.term_customizer.menu.term_customizer"), root_path %>
6
+ &gt;
7
+ <%= link_to translated_attribute(set.name), translation_set_translations_path(set) %>
8
+ &gt;
9
+ <%= t "decidim.term_customizer.admin.titles.add_multiple_translations" %>
5
10
 
6
- <%= link_to t("actions.back", scope: "decidim.admin"), translation_set_translations_path(set), class: "button tiny button--title" %>
11
+ <a data-toggle="help-panel" class="label secondary">
12
+ <%= icon("info") %>
13
+ <%= t("actions.help", scope: "decidim.term_customizer.admin") %>
14
+ </a>
15
+ </div>
16
+
17
+ <div class="flex--cc flex-gap--1">
18
+ <div id="js-other-actions-wrapper">
19
+ <%= link_to t("actions.back", scope: "decidim.term_customizer.admin"), translation_set_translations_path(set), class: "button hollow tiny button--simple" %>
20
+ </div>
21
+ </div>
7
22
  </h2>
8
23
  </div>
9
24
  <div class="card-section">
25
+ <div id="help-panel" class="callout help-text hide" data-toggler=".hide">
26
+ <p><strong><%= t ".help_title" %></strong></p>
27
+ <%= t ".help_html", button_name: t(".add") %>
28
+ </div>
29
+
10
30
  <div class="filters row">
11
31
  <div class="column medium-4">
12
32
  <%= form_tag search_translation_set_add_translations_path, method: :get do %>
@@ -29,7 +49,7 @@
29
49
  <td>{{translation_key}}</td>
30
50
  <td>{{translation_term}}</td>
31
51
  <td>
32
- <input type="hidden" name="keys[]" value="{{translation_key}}">
52
+ <input type="hidden" name="keys[]" value="{{translation_key}}" />
33
53
  <%= icon_link_to "circle-x", "#", t("actions.destroy", scope: "decidim.admin"), class: "remove-translation-key action-icon--remove" %>
34
54
  </td>
35
55
  </tr>
@@ -38,8 +58,8 @@
38
58
  <table class="table-list">
39
59
  <thead>
40
60
  <tr>
41
- <th><%= t("models.translations.fields.key", scope: "decidim.admin") %></th>
42
- <th><%= t("models.translations.fields.term", scope: "decidim.admin") %></th>
61
+ <th><%= t("models.translations.fields.key", scope: "decidim.term_customizer.admin") %></th>
62
+ <th><%= t("models.translations.fields.term", scope: "decidim.term_customizer.admin") %></th>
43
63
  <th></th>
44
64
  </tr>
45
65
  </thead>
@@ -1,9 +1,33 @@
1
1
  <div class="card">
2
2
  <div class="card-divider">
3
- <h2 class="card-title"><%= t "translation_sets.form.title", scope: "decidim.term_customizer.admin" %></h2>
3
+ <h2 class="card-title flex--sbc">
4
+ <div>
5
+ <%= link_to t("decidim.term_customizer.menu.term_customizer"), root_path %>
6
+ &gt;
7
+ <%= t "translation_sets.form.title", scope: "decidim.term_customizer.admin" %>
8
+
9
+ <a data-toggle="help-panel" class="label secondary">
10
+ <%= icon("info") %>
11
+ <%= t("actions.help", scope: "decidim.term_customizer.admin") %>
12
+ </a>
13
+ </div>
14
+
15
+ <div class="flex--cc flex-gap--1">
16
+ <div id="js-other-actions-wrapper">
17
+ <%= link_to t("actions.back", scope: "decidim.term_customizer.admin"), root_path, class: "button hollow tiny button--simple" %>
18
+ </div>
19
+ </div>
20
+ </h2>
4
21
  </div>
5
22
 
6
23
  <div class="card-section">
24
+ <div id="help-panel" class="callout help-text hide" data-toggler=".hide">
25
+ <p><strong><%= t ".help_title" %></strong></p>
26
+ <%= t ".help_html" %>
27
+ <p><strong><%= t ".constraint_help_title" %></strong></p>
28
+ <%= t ".constraint_help_html" %>
29
+ </div>
30
+
7
31
  <div class="row column">
8
32
  <%= form.translated :text_field, :name, autofocus: true %>
9
33
  </div>
@@ -2,53 +2,59 @@
2
2
  <div class="card-divider">
3
3
  <h2 class="card-title flex--sbc">
4
4
  <div>
5
- <%= t "decidim.admin.titles.translation_sets" %>
5
+ <%= t "decidim.term_customizer.admin.titles.translation_sets" %>
6
6
  </div>
7
7
 
8
8
  <div class="flex--cc flex-gap--1">
9
9
  <div id="js-other-actions-wrapper">
10
10
  <% if allowed_to? :create, :translation_set %>
11
- <%= link_to t("actions.new_translation_set", scope: "decidim.admin"), new_translation_set_path, class: "button tiny button--simple" %>
11
+ <%= link_to t("actions.new_translation_set", scope: "decidim.term_customizer.admin"), new_translation_set_path, class: "button tiny button--simple" %>
12
12
  <% end %>
13
13
  <% if allowed_to? :update, :organization %>
14
- <%= link_to t("actions.clear_cache", scope: "decidim.admin"), clear_caches_path, method: :delete, class: "button tiny button--simple", data: { confirm: t("actions.confirm_destroy", scope: "decidim.admin") } %>
14
+ <%= link_to t("actions.clear_cache", scope: "decidim.term_customizer.admin"), clear_caches_path, method: :delete, class: "button tiny button--simple", data: { confirm: t("actions.confirm_destroy", scope: "decidim.admin") } %>
15
15
  <% end %>
16
16
  </div>
17
17
  </div>
18
18
  </h2>
19
19
  </div>
20
20
  <div class="card-section">
21
- <div class="table-scroll">
22
- <table class="table-list">
23
- <thead>
24
- <tr>
25
- <th><%= t("models.translation_sets.fields.name", scope: "decidim.admin") %></th>
26
- <th></th>
27
- </tr>
28
- </thead>
29
- <tbody>
30
- <% @sets.each do |set| %>
21
+ <% if @sets.count > 0 %>
22
+ <div class="table-scroll">
23
+ <table class="table-list">
24
+ <thead>
31
25
  <tr>
32
- <td>
33
- <% if allowed_to? :read, :translation %>
34
- <%= link_to translated_attribute(set.name), translation_set_translations_path(set) %><br />
35
- <% else %>
36
- <%= translated_attribute(set.name) %>
37
- <% end %>
38
- </td>
39
- <td class="table-list__actions">
40
- <% if allowed_to? :update, :translation_set, translation_set: set %>
41
- <%= icon_link_to "pencil", edit_translation_set_path(set), t("actions.configure", scope: "decidim.admin"), class: "action-icon--new" %>
42
- <% end %>
43
-
44
- <% if allowed_to? :destroy, :translation_set, translation_set: set %>
45
- <%= icon_link_to "circle-x", translation_set_path(set), t("actions.destroy", scope: "decidim.admin"), method: :delete, class: "action-icon--remove", data: { confirm: t("actions.confirm_destroy", scope: "decidim.admin") } %>
46
- <% end %>
47
- </td>
26
+ <th><%= t("models.translation_sets.fields.name", scope: "decidim.term_customizer.admin") %></th>
27
+ <th></th>
48
28
  </tr>
49
- <% end %>
50
- </tbody>
51
- </table>
52
- </div>
29
+ </thead>
30
+ <tbody>
31
+ <% @sets.each do |set| %>
32
+ <tr>
33
+ <td>
34
+ <% if allowed_to? :read, :translation %>
35
+ <%= link_to translated_attribute(set.name), translation_set_translations_path(set) %><br />
36
+ <% else %>
37
+ <%= translated_attribute(set.name) %>
38
+ <% end %>
39
+ </td>
40
+ <td class="table-list__actions">
41
+ <% if allowed_to? :update, :translation_set, translation_set: set %>
42
+ <%= icon_link_to "pencil", edit_translation_set_path(set), t("actions.configure", scope: "decidim.admin"), class: "action-icon--new" %>
43
+ <% end %>
44
+
45
+ <% if allowed_to? :destroy, :translation_set, translation_set: set %>
46
+ <%= icon_link_to "circle-x", translation_set_path(set), t("actions.destroy", scope: "decidim.admin"), method: :delete, class: "action-icon--remove", data: { confirm: t("actions.confirm_destroy", scope: "decidim.admin") } %>
47
+ <% end %>
48
+ </td>
49
+ </tr>
50
+ <% end %>
51
+ </tbody>
52
+ </table>
53
+ </div>
54
+ <% else %>
55
+ <div class="text-center">
56
+ <%= t ".no_records_html", new_set_link: new_translation_set_path, button_name: t("decidim.term_customizer.admin.actions.new_translation_set") %>
57
+ </div>
58
+ <% end %>
53
59
  </div>
54
60
  </div>
@@ -0,0 +1,8 @@
1
+ <span class="exports dropdown tiny button button--simple" data-toggle="export-dropdown"><%= t "actions.export", scope: "decidim.admin" %></span>
2
+ <div class="dropdown-pane" id="export-dropdown" data-dropdown data-position=bottom data-alignment=right data-auto-focus="true" data-close-on-click="true">
3
+ <ul class="vertical menu add-components">
4
+ <% %w{CSV JSON Excel}.each do |format| %>
5
+ <li class="exports--format--<%= format.downcase %> exports--translations"><%= link_to t("decidim.admin.exports.export_as", name: t("decidim.term_customizer.admin.titles.translations"), export_format: format.upcase), export_translation_set_path(set, format: format), method: :post %></li>
6
+ <% end %>
7
+ </ul>
8
+ </div>
@@ -1,9 +1,35 @@
1
1
  <div class="card">
2
2
  <div class="card-divider">
3
- <h2 class="card-title"><%= t "translations.form.title", scope: "decidim.term_customizer.admin" %></h2>
3
+ <h2 class="card-title flex--sbc">
4
+ <div>
5
+ <%= link_to t("decidim.term_customizer.menu.term_customizer"), root_path %>
6
+ &gt;
7
+ <%= link_to translated_attribute(set.name), translation_set_translations_path(set) %>
8
+ &gt;
9
+ <%= t "translations.form.title", scope: "decidim.term_customizer.admin" %>
10
+
11
+ <a data-toggle="help-panel" class="label secondary">
12
+ <%= icon("info") %>
13
+ <%= t("actions.help", scope: "decidim.term_customizer.admin") %>
14
+ </a>
15
+ </div>
16
+
17
+ <div class="flex--cc flex-gap--1">
18
+ <div id="js-other-actions-wrapper">
19
+ <%= link_to t("actions.back", scope: "decidim.term_customizer.admin"), translation_set_translations_path(set), class: "button hollow tiny button--simple" %>
20
+ </div>
21
+ </div>
22
+ </h2>
4
23
  </div>
5
24
 
6
25
  <div class="card-section">
26
+ <div id="help-panel" class="callout help-text hide" data-toggler=".hide">
27
+ <p><strong><%= t ".help_title" %></strong></p>
28
+ <%= t ".help_html" %>
29
+ <p><strong><%= t ".term_help_title" %></strong></p>
30
+ <%= t ".term_help_html" %>
31
+ </div>
32
+
7
33
  <div class="row column">
8
34
  <%= form.text_field :key, autofocus: true %>
9
35
  </div>
@@ -0,0 +1,13 @@
1
+ <div id="js-destroy-translations-actions" class="hide js-bulk-action-form">
2
+ <%= form_tag(translation_set_translations_destroy_path(set), method: :delete, id: "js-form-destroy-translations", class: "flex--cc flex-gap--1") do %>
3
+ <div class="checkboxes hide">
4
+ <% translations.each do |translation| %>
5
+ <%= check_box_tag "translation_ids[]", translation.id, false, class: "js-check-all-translation js-translation-id-#{translation.id}" %>
6
+ <% end %>
7
+ </div>
8
+
9
+ <%= submit_tag(t("actions.destroy", scope: "decidim.admin"), id: "js-submit-destroy-translations", class: "button small button--simple float-left") %>
10
+
11
+ <button id="js-cancel-destroy-translations" class="button tiny clear compact js-cancel-bulk-action" type="button"><%= t("decidim.term_customizer.admin.actions.cancel") %></button>
12
+ <% end %>
13
+ </div>
@@ -0,0 +1,26 @@
1
+ <div id="js-bulk-actions-wrapper">
2
+ <button
3
+ id="js-bulk-actions-button"
4
+ class="button button--nomargin tiny success light dropdown"
5
+ type="button"
6
+ data-toggle="js-bulk-actions-dropdown">
7
+ <%= t("decidim.term_customizer.admin.translations.index.actions") %>
8
+ </button>
9
+
10
+ <div
11
+ id="js-bulk-actions-dropdown"
12
+ class="dropdown-pane"
13
+ data-position="bottom"
14
+ data-alignment="right"
15
+ data-dropdown="dropdown"
16
+ data-auto-focus="false"
17
+ data-events="resize">
18
+ <ul class="list-reset">
19
+ <li>
20
+ <button type="button" data-action="destroy-translations">
21
+ <%= t("actions.destroy", scope: "decidim.admin") %>
22
+ </button>
23
+ </li>
24
+ </ul>
25
+ </div>
26
+ </div>
@@ -2,56 +2,84 @@
2
2
  <div class="card-divider">
3
3
  <h2 class="card-title flex--sbc">
4
4
  <div>
5
- <%= t "decidim.admin.titles.translations" %>
5
+ <%= link_to t("decidim.term_customizer.menu.term_customizer"), root_path %>
6
+ &gt;
7
+ <%= translated_attribute(set.name) %>
8
+
9
+ <span id="js-selected-proposals-count" class="component-counter component-counter--inline" title="<%= t("decidim.term_customizer.admin.translations.index.selected") %>"></span>
6
10
  </div>
7
11
 
8
12
  <div class="flex--cc flex-gap--1">
13
+ <%= render partial: "decidim/term_customizer/admin/translations/bulk_actions/dropdown" %>
14
+
9
15
  <div id="js-other-actions-wrapper">
10
16
  <% if allowed_to? :create, :translation %>
11
- <%= link_to t("actions.add_multiple_translations", scope: "decidim.admin"), translation_set_add_translations_path(set), class: "button tiny button--simple" %>
12
- <%= link_to t("actions.new_translation", scope: "decidim.admin"), new_translation_set_translation_path(set), class: "button tiny button--simple" %>
17
+ <%= link_to t("actions.add_multiple_translations", scope: "decidim.term_customizer.admin"), translation_set_add_translations_path(set), class: "button tiny button--simple" %>
18
+ <%= link_to t("actions.new_translation", scope: "decidim.term_customizer.admin"), new_translation_set_translation_path(set), class: "button tiny button--simple" %>
19
+ <% end %>
20
+ <% if allowed_to? :import, :translation_set, translation_set: set %>
21
+ <%= link_to t("actions.import", scope: "decidim.term_customizer.admin"), import_translation_set_translations_path(set), class: "button tiny button--simple" %>
22
+ <% end %>
23
+ <% if allowed_to? :export, :translation_set, translation_set: set %>
24
+ <%= render partial: "export_dropdown" %>
13
25
  <% end %>
14
26
  </div>
27
+
28
+ <%= render partial: "decidim/term_customizer/admin/translations/bulk_actions/destroy" %>
15
29
  </div>
16
30
  </h2>
17
31
  </div>
18
32
  <div class="card-section">
19
- <div class="table-scroll">
20
- <table class="table-list">
21
- <thead>
22
- <tr>
23
- <th><%= t("models.translations.fields.key", scope: "decidim.admin") %></th>
24
- <th><%= t("models.translations.fields.original_term", scope: "decidim.admin") %></th>
25
- <th><%= t("models.translations.fields.term", scope: "decidim.admin") %></th>
26
- <th></th>
27
- </tr>
28
- </thead>
29
- <tbody>
30
- <% @translations.each do |translation| %>
33
+ <% if @translations.count > 0 %>
34
+ <div class="table-scroll">
35
+ <table class="table-list">
36
+ <thead>
31
37
  <tr>
32
- <td>
33
- <%= translation.key %>
34
- </td>
35
- <td>
36
- <%= @directory.translations.term(translation.key) %>
37
- </td>
38
- <td>
39
- <%= translation.value %>
40
- </td>
41
- <td class="table-list__actions">
42
- <% if allowed_to? :update, :translation, translation: translation %>
43
- <%= icon_link_to "pencil", edit_translation_set_translation_path(set, translation), t("actions.configure", scope: "decidim.admin"), class: "action-icon--new" %>
44
- <% end %>
45
-
46
- <% if allowed_to? :destroy, :translation, translation: translation %>
47
- <%= icon_link_to "circle-x", translation_set_translation_path(set, translation), t("actions.destroy", scope: "decidim.admin"), method: :delete, class: "action-icon--remove", data: { confirm: t("actions.confirm_destroy", scope: "decidim.admin") } %>
48
- <% end %>
49
- </td>
38
+ <th>
39
+ <%= check_box_tag "translations_bulk", "all", false, class: "js-check-all" %>
40
+ </th>
41
+ <th><%= t("models.translations.fields.key", scope: "decidim.term_customizer.admin") %></th>
42
+ <th><%= t("models.translations.fields.original_term", scope: "decidim.term_customizer.admin") %></th>
43
+ <th><%= t("models.translations.fields.term", scope: "decidim.term_customizer.admin") %></th>
44
+ <th></th>
50
45
  </tr>
51
- <% end %>
52
- </tbody>
53
- </table>
54
- <%= paginate @translations, theme: "decidim" %>
55
- </div>
46
+ </thead>
47
+ <tbody>
48
+ <% @translations.each do |translation| %>
49
+ <tr>
50
+ <td>
51
+ <%= check_box_tag "translation_ids_s[]", translation.id, false, class: "js-check-all-translation js-translation-list-check js-translation-id-#{translation.id}" %><br />
52
+ </td>
53
+ <td>
54
+ <%= translation.key %>
55
+ </td>
56
+ <td>
57
+ <%= @directory.translations.term(translation.key) %>
58
+ </td>
59
+ <td>
60
+ <%= translation.value %>
61
+ </td>
62
+ <td class="table-list__actions">
63
+ <% if allowed_to? :update, :translation, translation: translation %>
64
+ <%= icon_link_to "pencil", edit_translation_set_translation_path(set, translation), t("actions.configure", scope: "decidim.admin"), class: "action-icon--new" %>
65
+ <% end %>
66
+
67
+ <% if allowed_to? :destroy, :translation, translation: translation %>
68
+ <%= icon_link_to "circle-x", translation_set_translation_path(set, translation), t("actions.destroy", scope: "decidim.admin"), method: :delete, class: "action-icon--remove", data: { confirm: t("actions.confirm_destroy", scope: "decidim.admin") } %>
69
+ <% end %>
70
+ </td>
71
+ </tr>
72
+ <% end %>
73
+ </tbody>
74
+ </table>
75
+ <%= paginate @translations, theme: "decidim" %>
76
+ </div>
77
+ <% else %>
78
+ <div class="text-center">
79
+ <%= t ".no_records_html", add_multiple_link: translation_set_add_translations_path(set), button_name: t("decidim.term_customizer.admin.actions.add_multiple_translations") %>
80
+ </div>
81
+ <% end %>
56
82
  </div>
57
83
  </div>
84
+
85
+ <%= javascript_include_tag "decidim/term_customizer/admin/translations_admin_bulk" %>