Skip to content

Commit 8baf2a9

Browse files
authored
Merge pull request #173 from prograils/add/172-add-option-to-touch-localizations
Adds #172 - Option to touch localizations
2 parents 09fe7d6 + 954f07b commit 8baf2a9

File tree

7 files changed

+86
-62
lines changed

7 files changed

+86
-62
lines changed

app/assets/stylesheets/lit/application.css

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,47 +11,47 @@
1111
*= require './backend/jquery-te-1.4.0.css'
1212
*= require_self
1313
*/
14-
.detail_wrapper{
15-
padding: 10px 0 0 50px;
14+
.detail_wrapper {
15+
padding: 10px 0 0 10px;
1616
}
17-
.detail_wrapper table tr td.locale_row{
17+
.detail_wrapper table tr td.locale_row {
1818
width: 75px;
1919
}
20-
.localization_key_row .localization_keys_options{
20+
.localization_key_row .localization_keys_options {
2121
display: none;
2222
float: right;
2323
}
24-
.localization_key_row:hover .localization_keys_options{
24+
.localization_key_row:hover .localization_keys_options {
2525
display: block;
2626
}
2727

2828
li.key_prefix .fa-chevron-right {
2929
float: right;
3030
margin-top: 2px;
3131
margin-right: -6px;
32-
opacity: .25;
32+
opacity: 0.25;
3333
}
3434

35-
.hidden{
35+
.hidden {
3636
display: none;
3737
}
38-
i.fa{
38+
i.fa {
3939
color: black;
4040
}
41-
.nav.nav-stacked>li>a {
42-
padding: 5px 7px;
41+
.nav.nav-stacked > li > a {
42+
padding: 5px 7px;
4343
}
44-
.well{
44+
.well {
4545
background-color: white;
4646
border-radius: 0px;
4747
}
48-
.well label{
48+
.well label {
4949
font-weight: normal;
5050
}
5151
.well .form-search {
5252
margin-bottom: 15px;
5353
}
54-
.localization_row em{
54+
.localization_row em {
5555
color: #bbb;
5656
}
5757
.loading {

app/controllers/lit/localization_keys_controller.rb

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
module Lit
22
class LocalizationKeysController < ::Lit::ApplicationController
3-
before_action :find_localization_scope,
4-
except: %i[destroy find_localization]
5-
before_action :find_localization_key,
6-
only: %i[star destroy change_completed restore_deleted]
3+
before_action :find_localization_scope, except: %i[destroy find_localization]
4+
before_action :find_localization_key, only: %i[star destroy change_completed restore_deleted]
75

86
def index
97
get_localization_keys
@@ -20,27 +18,19 @@ def visited_again
2018
end
2119

2220
def find_localization
23-
localization_key = Lit::LocalizationKey.find_by!(
24-
localization_key: params[:key]
25-
)
21+
localization_key = Lit::LocalizationKey.find_by!(localization_key: params[:key])
2622
locale = Lit::Locale.find_by!(locale: params[:locale])
2723
localization = localization_key.localizations.find_by(locale_id: locale)
28-
render json: {
29-
path: localization_key_localization_path(localization_key, localization)
30-
}
24+
render json: { path: localization_key_localization_path(localization_key, localization) }
3125
end
3226

3327
def starred
3428
@scope = @scope.where(is_starred: true)
3529

36-
if defined?(Kaminari) &&
37-
@scope.respond_to?(Kaminari.config.page_method_name)
30+
if defined?(Kaminari) && @scope.respond_to?(Kaminari.config.page_method_name)
3831
@scope = @scope.send(Kaminari.config.page_method_name, params[:page])
3932
end
40-
if defined?(WillPaginate) &&
41-
@scope.respond_to?(:paginate)
42-
@scope = @scope.paginate(page: params[:page])
43-
end
33+
@scope = @scope.paginate(page: params[:page]) if defined?(WillPaginate) && @scope.respond_to?(:paginate)
4434
get_localization_keys
4535
render action: :index
4636
end
@@ -66,26 +56,33 @@ def destroy
6656
respond_to :js
6757
end
6858

59+
def batch_touch
60+
get_localization_keys
61+
localization_key_ids = @scope.distinct(false).pluck(:id)
62+
if localization_key_ids.any?
63+
@scope.distinct(false).update_all updated_at: Time.current
64+
Localization.where(localization_key_id: localization_key_ids).update_all updated_at: Time.current
65+
end
66+
respond_to :js
67+
end
68+
6969
private
7070

7171
def find_localization_key
7272
@localization_key = LocalizationKey.find params[:id].to_i
7373
end
7474

7575
def find_localization_scope
76-
@search_options = if params.respond_to?(:permit)
77-
params.permit(*valid_keys)
78-
else
79-
params.slice(*valid_keys)
80-
end
81-
@scope = LocalizationKey.distinct.active
82-
.preload(localizations: :locale)
83-
.search(@search_options)
76+
@search_options = params.respond_to?(:permit) ? params.permit(*valid_keys) : params.slice(*valid_keys)
77+
@scope = LocalizationKey.distinct.active.preload(localizations: :locale).search(@search_options)
8478
end
8579

8680
def get_localization_keys
8781
key_parts = @search_options[:key_prefix].to_s.split('.').length
88-
@prefixes = @scope.reorder(nil).distinct.pluck(:localization_key).map { |lk| lk.split('.').shift(key_parts + 1).join('.') }.uniq.sort
82+
@prefixes =
83+
@scope.reorder(nil).distinct.pluck(:localization_key).map do |lk|
84+
lk.split('.').shift(key_parts + 1).join('.')
85+
end.uniq.sort
8986
if @search_options[:key_prefix].present?
9087
parts = @search_options[:key_prefix].split('.')
9188
@parent_prefix = parts[0, parts.length - 1].join('.')
@@ -104,16 +101,15 @@ def valid_keys
104101
end
105102

106103
def grouped_localizations
107-
@_grouped_localizations ||= begin
108-
{}.tap do |hash|
109-
@localization_keys.each do |lk|
110-
hash[lk] = {}
111-
lk.localizations.each do |l|
112-
hash[lk][l.locale.locale.to_sym] = l
104+
@_grouped_localizations ||=
105+
begin
106+
{}.tap do |hash|
107+
@localization_keys.each do |lk|
108+
hash[lk] = {}
109+
lk.localizations.each { |l| hash[lk][l.locale.locale.to_sym] = l }
113110
end
114111
end
115112
end
116-
end
117113
end
118114

119115
def localization_for(locale, localization_key)
@@ -136,12 +132,16 @@ def localization_for(locale, localization_key)
136132
helper_method :localization_for
137133

138134
def versions?(localization)
139-
@_versions ||= begin
140-
ids = grouped_localizations.values.map(&:values).flatten.map(&:id)
141-
Lit::Localization.active.where(id: ids).joins(:versions).group(
142-
"#{Lit::Localization.quoted_table_name}.id"
143-
).count
144-
end
135+
@_versions ||=
136+
begin
137+
ids = grouped_localizations.values.map(&:values).flatten.map(&:id)
138+
Lit::Localization
139+
.active
140+
.where(id: ids)
141+
.joins(:versions)
142+
.group("#{Lit::Localization.quoted_table_name}.id")
143+
.count
144+
end
145145
@_versions[localization.id].to_i > 0
146146
end
147147
helper_method :versions?

app/views/lit/localization_keys/_localizations_list.html.erb

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
<table class="table">
1+
<div class="col-12 text-right">
2+
<%= link_to "batch touch", lit.batch_touch_localization_keys_path(key: params[:key], key_prefix: params[:key_prefix]), method: :post, remote: true, class: 'btn btn-sm btn-primary', data: { confirm: 'This will "touch" all search results making them subject of synchronization. Proceed?'} %>
3+
</div>
4+
<table class="table mt-1">
25
<%- @localization_keys.each do |lk| %>
36
<tr class="localization_key_row" data-id="<%= lk.id %>">
47
<td>
@@ -30,26 +33,30 @@
3033
<div class="detail_wrapper">
3134
<table class="table table-bordered table-striped">
3235
<tr>
33-
<th class="col-md-8">Translation</th>
34-
<th class="col-md-2 text-center">Locale</th>
36+
<th class="col-md-1"></th>
37+
<th class="col-md-9">Translation</th>
38+
<th class="col-md-1 text-center">Locale</th>
3539
<% unless lk.is_deleted? %>
36-
<th class="col-md-2 text-center">Completed</th>
40+
<th class="col-md-1 text-center">Completed</th>
3741
<% end %>
3842
</tr>
3943
<%- available_locales.each do |locale| %>
4044
<%- localization = localization_for(locale, lk) %>
4145
<tr>
46+
<td>
47+
<% if localization %>
48+
<%= draw_icon 'clock-o', title: "Last updated at #{localization.updated_at.to_s(:db)}" %>
49+
<%= link_to lit.previous_versions_localization_key_localization_path(lk, localization, format: :js), class: "js-show_prev_versions #{'hidden' unless versions?(localization)}", remote: true do %>
50+
<%= draw_icon 'random', title: I18n.t('lit.common.previous_versions', default: 'Previous versions') %>
51+
<% end %>
52+
<% end %>
53+
</td>
4254
<td class="localization_row" data-id="<%= localization.id%>" data-edit="<%= edit_localization_key_localization_path(lk, localization, format: :js) %>" data-editing=0 data-content="">
4355
<%= render partial: 'localization_row', locals: {localization: Lit.init.cache["#{locale}.#{lk.localization_key}"]} %>
4456
</td>
4557
<td class="locale_row text-center">
4658
<%= EmojiFlag.new(locale) %>
4759
<%= locale %>
48-
<% if localization %>
49-
<%= link_to lit.previous_versions_localization_key_localization_path(lk, localization, format: :js), class: "show_prev_versions #{'hidden' unless versions?(localization)}", remote: true do %>
50-
<%= draw_icon 'random', title: I18n.t('lit.common.previous_versions', default: 'Previous versions') %>
51-
<% end %>
52-
<% end %>
5360
</td>
5461
<% unless lk.is_deleted? %>
5562
<td class="text-center">
@@ -65,7 +72,7 @@
6572
<% end %>
6673
<% if Lit.store_request_info %>
6774
<tr class="hidden request_info_row">
68-
<td colspan="2">
75+
<td colspan="3">
6976
<strong>Translation key recently displayed on following pages:</strong>
7077
<ul>
7178
<% Lit.init.cache.get_request_info(lk.localization_key).split(' ').reverse.each do |l| %>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
alert('All of search results have been marked as updated now, please retry synchronizing now');
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
var $row = $('td.localization_row[data-id="<%= @localization.id %>"]');
22
$row.data('editing', 0);
33
$row.html("<%= ejs render(:partial=>"/lit/localization_keys/localization_row", formats: ['html'], :locals=>{:localization=>@localization.translated_value }) %>");
4-
$row.siblings().find('.show_prev_versions').removeClass('hidden');
4+
$row.siblings().find('.js-show_prev_versions').removeClass('hidden');
55
$('a.change_completed_<%= @localization.id %> input[type=checkbox]').prop("checked", true);
66

config/routes.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
get :find_localization
2626
get :not_translated
2727
get :visited_again
28+
post :batch_touch
2829
end
2930
resources :localizations, only: [:edit, :update, :show] do
3031
member do

test/functional/lit/localization_keys_controller_test.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,21 @@ class LocalizationKeysControllerTest < ActionController::TestCase
7171
assert_not @localization_key.reload.is_deleted
7272
end
7373

74+
test 'touches search results in batch' do
75+
v = lit_localization_keys(:string)
76+
a = lit_localization_keys(:array)
77+
v.update_column :updated_at, 1.day.ago
78+
a.update_column :updated_at, 1.day.ago
79+
post :batch_touch, params: { key: 'value' }, format: :js
80+
assert_in_delta(v.reload.updated_at, 1.second.ago, 5)
81+
assert_in_delta(a.reload.updated_at, 1.day.ago, 5)
82+
end
83+
84+
test 'wont fail when there wont be any search results when touching in batch' do
85+
post :batch_touch, params: { key: 'valuefoobar' }, format: :js
86+
assert_response :success
87+
end
88+
7489
private
7590

7691
def with_fresh_cache

0 commit comments

Comments
 (0)