Skip to content

Commit 270c020

Browse files
committed
Merge pull request #192 from MartinFournier/v2-ui-key-ordering
[v2] ui: Show key + strings ordering
2 parents 32cd5b2 + 098948d commit 270c020

File tree

3 files changed

+110
-19
lines changed

3 files changed

+110
-19
lines changed

msgfmt:ui/lib/client.js

Lines changed: 64 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -209,25 +209,12 @@ Template.mfTransLang.helpers({
209209
});
210210

211211
strings = _.values(out);
212-
strings.sort(function(a, b) {
213-
if (!a.trans && b.trans)
214-
return -1;
215-
else if (a.trans && !b.trans)
216-
return 1;
217-
218-
if (!a.fuzzy && b.fuzzy)
219-
return -1;
220-
else if (b.fuzzy && !a.fuzzy)
221-
return 1;
222-
223-
return a.text - b.text;
224-
});
212+
strings = sortStrings(strings);
225213

226214
return strings;
227215
}
228216
});
229217

230-
231218
Template.mfTrans.events({
232219
'click #mfTransNewSubmit': function() {
233220
RouterLayer.go('mfTransLang', { lang: $('#mfTransNewText').val() });
@@ -244,14 +231,48 @@ Template.mfTrans.events({
244231
var unsavedDest;
245232
Template.mfTransLang.events({
246233
'click #mfTransLang tr': function(event) {
247-
changeKey(this.key);
234+
var tr = $(event.target).parents('tr');
235+
var key = tr.data('key');
236+
if (key) changeKey(key);
237+
},
238+
'click #translationShowKey': function(event) {
239+
Session.set('translationShowKey', event.currentTarget.checked);
240+
},
241+
'click #translationCaseInsensitiveOrdering': function(event) {
242+
Session.set('translationCaseInsensitiveOrdering', event.currentTarget.checked);
243+
},
244+
'click .translationSort': function(event) {
245+
var currentSort = Session.get('translationSortField');
246+
var newSort = event.currentTarget.attributes['data-sortField'].value;
247+
Session.set('translationSortField', newSort);
248+
249+
if (currentSort === newSort) {
250+
var currentOrder = Session.get('translationSortOrder');
251+
var newOrder = (currentOrder === 'asc') ? 'desc' : 'asc';
252+
Session.set('translationSortOrder', newOrder);
253+
}
248254
},
249255
'keyup #mfTransDest': function(event) {
250256
unsavedDest = event.target.value;
251257
}
252258
});
253259

254260
Template.mfTransLang.helpers({
261+
showKey: function() {
262+
return Session.get('translationShowKey');
263+
},
264+
caseInsensitiveOrdering: function() {
265+
return Session.get('caseInsensitiveOrdering');
266+
},
267+
sortOrderHeaderClass: function(headerSortField) {
268+
var classes = '';
269+
var sortField = Session.get('translationSortField');
270+
var sortOrder = Session.get('translationSortOrder');
271+
if (headerSortField === sortField) {
272+
classes += ' active-sort ' + sortOrder;
273+
}
274+
return classes
275+
},
255276
stateClass: function() {
256277
if (this.fuzzy)
257278
return 'fuzzy';
@@ -291,9 +312,37 @@ Template.mfTransLang.helpers({
291312
},
292313
encodeURIComponent : function(text) {
293314
return encodeURIComponent(text);
315+
},
316+
isCheckboxChecked: function(value) {
317+
return (value === true ? 'checked' : '');
294318
}
295319
});
296320

321+
var sortStrings = function(strings) {
322+
var sortField = Session.get('translationSortField');
323+
var sortOrder = Session.get('translationSortOrder');
324+
if (!sortField) {
325+
Session.set('translationSortField', 'orig');
326+
sortField = 'orig';
327+
}
328+
if (!sortOrder) {
329+
Session.set('translationSortOrder', 'asc');
330+
sortOrder = 'asc';
331+
}
332+
return strings.sort(function(a, b) {
333+
var first = a[sortField];
334+
var second = b[sortField];
335+
var caseInsensitiveOrdering = Session.get('translationCaseInsensitiveOrdering');
336+
if (first && caseInsensitiveOrdering) first = first.toLowerCase();
337+
if (second && caseInsensitiveOrdering) second = second.toLowerCase();
338+
if (sortOrder === 'asc') {
339+
return first > second ? 1 : (first < second ? -1 : 0);
340+
} else {
341+
return first > second ? -1 : (first < second ? 1 : 0);
342+
}
343+
});
344+
};
345+
297346
var initialRender = _.once(function() {
298347
var key = Session.get('mfTransKey'),
299348
tr = $('#mfTransLang tr[data-key="'+key+'"]');

msgfmt:ui/lib/ui.css

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ div.mfTransGraph.untrans { background: #800; border-right: 1px solid black; }
4949
#mfTransPreview table { width: 100%; table-layout:fixed; border-collapse:separate; background: white; }
5050
#mfTransPreview table thead tr { background: #ede9e3; }
5151
#mfTransPreview table thead th { width: 50%; padding: 4px 8px 4px 8px; }
52+
#mfTransPreview table thead th {
53+
border-left: 1px solid black; border-top: 1px solid black; border-bottom: 1px solid black;
54+
}
5255
#mfTransPreview table thead th:first-child {
5356
border-left: 1px solid black; border-top: 1px solid black; border-bottom: 1px solid black;
5457
border-top-left-radius: 5px;
@@ -72,6 +75,19 @@ div.mfTransGraph.untrans { background: #800; border-right: 1px solid black; }
7275
*/
7376
#mfTransPreview table tr.current { background: #5598d7; color: white;}
7477

78+
#mfTransLang .options label { margin-right: 10px; }
79+
80+
#mfTransLang th { position: relative; }
81+
#mfTransLang th.active-sort { background-color: #CCC; }
82+
#mfTransLang th.active-sort a { font-weight: 500; }
83+
#mfTransLang th.active-sort::after {
84+
font-size: 0.6em;
85+
position: absolute;
86+
top: 5px;
87+
right: 10px;
88+
}
89+
#mfTransLang th.active-sort.asc::after { content: '▲'; }
90+
#mfTransLang th.active-sort.desc::after { content: '▼'; }
7591

7692
#mfTransLang textarea {
7793
font-family: monospace;

msgfmt:ui/lib/ui.html

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,24 @@ <h2>{{mf 'mf_site_translations' 'Site Translations'}}</h2>
6666
</template>
6767

6868
<template name="mfTransLang">
69+
{{ debug }}
6970
<div class="container" id="mfTransLang">
7071

7172
<div id="mfTransPreview">
7273
<table>
7374
<thead>
7475
<tr>
75-
<th>Original String ({{origLang}})</th>
76-
<th>Translation ({{destLang}})</th>
76+
{{#if showKey}}
77+
<th class="{{sortOrderHeaderClass 'key'}}">
78+
<a href="#" class='translationSort' data-sortField="key">Key</a>
79+
</th>
80+
{{/if}}
81+
<th class="{{sortOrderHeaderClass 'orig'}}">
82+
<a href="#" class="translationSort" data-sortField="orig">Original String ({{origLang}})</a>
83+
</th>
84+
<th class="{{sortOrderHeaderClass 'trans'}}">
85+
<a href="#" class="translationSort" data-sortField="trans">Translation ({{destLang}})</a>
86+
</th>
7787
</tr>
7888
</thead>
7989
</table>
@@ -82,6 +92,9 @@ <h2>{{mf 'mf_site_translations' 'Site Translations'}}</h2>
8292
<tbody>
8393
{{#each strings}}
8494
<tr data-key="{{key}}" class="{{stateClass}} {{isCurrent}}">
95+
{{#if showKey}}
96+
<td>{{key}}</td>
97+
{{/if}}
8598
<td>{{orig}}</td>
8699
<td>{{trans}}</td>
87100
</tr>
@@ -90,7 +103,20 @@ <h2>{{mf 'mf_site_translations' 'Site Translations'}}</h2>
90103
</table>
91104
</div>
92105
</div>
93-
<p>Use ctrl-up and ctrl-down to quickly change keys</p>
106+
<p class='options'>
107+
<label>
108+
<input type="checkbox" id="translationShowKey" {{isCheckboxChecked showKey}}>
109+
Show key
110+
</label>
111+
<label>
112+
<input type='checkbox' id='translationCaseInsensitiveOrdering' {{isCheckboxChecked caseInsensitiveOrdering}}>
113+
Case insensitive ordering
114+
</label>
115+
<br />
116+
Keyboard shortcuts: Ctrl-up/down arrow (Win); Control-Command-up/down arrow (Mac)
117+
<br />
118+
Click on headers to reorder the columns.
119+
</p>
94120
<span><b>{{keyInfo.key}}</b> in {{keyInfo.file}}:{{keyInfo.line
95121
}}{{#if keyInfo.template}} (template
96122
{{#if keyInfo.routeUrl}}
@@ -117,4 +143,4 @@ <h2>{{mf 'mf_site_translations' 'Site Translations'}}</h2>
117143
<h1>{{mf 'access_denied' 'Access Denied'}}</h1>
118144
<p>{{mf 'login_and_access' 'Please ensure you are logged in and have the relevant access to add/edit translations.'}}</p>
119145
</div>
120-
</template>
146+
</template>

0 commit comments

Comments
 (0)