From f1c6471d9f224d5b27d802418c6a8fa3a67ccee2 Mon Sep 17 00:00:00 2001 From: Tomas Trescak Date: Tue, 26 May 2015 17:19:44 +1000 Subject: [PATCH 1/9] Ability to show/hide the key and sort by the key --- msgfmt:ui/lib/client.js | 22 +++++++++++++++++++++- msgfmt:ui/lib/ui.css | 3 +++ msgfmt:ui/lib/ui.html | 17 ++++++++++++----- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/msgfmt:ui/lib/client.js b/msgfmt:ui/lib/client.js index b1d0bd2..068f8c2 100644 --- a/msgfmt:ui/lib/client.js +++ b/msgfmt:ui/lib/client.js @@ -244,7 +244,15 @@ Template.mfTrans.events({ var unsavedDest; Template.mfTransLang.events({ 'click #mfTransLang tr': function(event) { - changeKey(this.key); + var tr = $(event.target).parents('tr'); + var key = tr.data('key'); + if (key) changeKey(key); + }, + 'click #translationShowKey': function(event) { + Session.set('translationShowKey', event.currentTarget.checked); + }, + 'click .translationSort': function(event) { + Session.set('translationSortField', event.currentTarget.attributes['data-sortField'].value); }, 'keyup #mfTransDest': function(event) { unsavedDest = event.target.value; @@ -252,6 +260,18 @@ Template.mfTransLang.events({ }); Template.mfTransLang.helpers({ + sortedStrings: function() { + var sortField = Session.get('translationSortField'); + if (!sortField) { + Session.set('translationSortField', 'orig'); + } + return this.strings.sort(function(a, b) { + return a[sortField] > b[sortField] ? 1 : (a[sortField] < b[sortField] ? -1 : 0); + }); + }, + showKey: function() { + return Session.get('translationShowKey'); + }, stateClass: function() { if (this.fuzzy) return 'fuzzy'; diff --git a/msgfmt:ui/lib/ui.css b/msgfmt:ui/lib/ui.css index 2ce98ab..97e276e 100644 --- a/msgfmt:ui/lib/ui.css +++ b/msgfmt:ui/lib/ui.css @@ -49,6 +49,9 @@ div.mfTransGraph.untrans { background: #800; border-right: 1px solid black; } #mfTransPreview table { width: 100%; table-layout:fixed; border-collapse:separate; background: white; } #mfTransPreview table thead tr { background: #ede9e3; } #mfTransPreview table thead th { width: 50%; padding: 4px 8px 4px 8px; } +#mfTransPreview table thead th { + border-left: 1px solid black; border-top: 1px solid black; border-bottom: 1px solid black; +} #mfTransPreview table thead th:first-child { border-left: 1px solid black; border-top: 1px solid black; border-bottom: 1px solid black; border-top-left-radius: 5px; diff --git a/msgfmt:ui/lib/ui.html b/msgfmt:ui/lib/ui.html index c50063b..28e2e2e 100644 --- a/msgfmt:ui/lib/ui.html +++ b/msgfmt:ui/lib/ui.html @@ -66,22 +66,29 @@

{{mf 'mf_site_translations' 'Site Translations'}}

\ No newline at end of file + From b5b26db9a68c1a98fe75ee4690f4401a78effc62 Mon Sep 17 00:00:00 2001 From: Martin Fournier Date: Mon, 11 Jan 2016 09:00:03 -0500 Subject: [PATCH 2/9] Switch to new helpers names --- msgfmt:ui/lib/ui.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/msgfmt:ui/lib/ui.html b/msgfmt:ui/lib/ui.html index 28e2e2e..6ce6cf4 100644 --- a/msgfmt:ui/lib/ui.html +++ b/msgfmt:ui/lib/ui.html @@ -76,8 +76,8 @@

{{mf 'mf_site_translations' 'Site Translations'}}

{{#if showKey}} Key {{/if}} - Original String ({{orig}}) - Translation ({{trans}}) + Original String ({{origLang}}) + Translation ({{destLang}}) From 0f81c6870370ba6d704aed66b502907f7fd001eb Mon Sep 17 00:00:00 2001 From: Martin Fournier Date: Mon, 11 Jan 2016 09:01:29 -0500 Subject: [PATCH 3/9] Register strings as a reusable helper to prevent undefined --- msgfmt:ui/lib/client.js | 82 +++++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 39 deletions(-) diff --git a/msgfmt:ui/lib/client.js b/msgfmt:ui/lib/client.js index 068f8c2..b126ba4 100644 --- a/msgfmt:ui/lib/client.js +++ b/msgfmt:ui/lib/client.js @@ -181,49 +181,50 @@ Template.mfTrans.helpers({ } }); +Template.registerHelper('strings', function() { + var orig = mfPkg.native; + var lang = RouterLayer.getParam('lang'); + + // summarise matching keys (orig + trans) to a single record + var out = {}, strings = mfPkg.mfStrings.find({ + $and: [{$or: [{lang: orig}, {lang: lang}]}, + {removed: undefined}] + }).fetch(); + + _.each(strings, function(str) { + if (!out[str.key]) + out[str.key] = { key: str.key }; + if (str.lang == orig) + out[str.key].orig = str.text; + else + out[str.key].trans = str.text; + if (str.fuzzy) + out[str.key].fuzzy = true; + }); + + strings = _.values(out); + strings.sort(function(a, b) { + if (!a.trans && b.trans) + return -1; + else if (a.trans && !b.trans) + return 1; + + if (!a.fuzzy && b.fuzzy) + return -1; + else if (b.fuzzy && !a.fuzzy) + return 1; + + return a.text - b.text; + }); + + return strings; +}); + Template.mfTransLang.helpers({ origLang: mfPkg.native, destLang: function() { return RouterLayer.getParam('lang'); }, allowed: function() { return !mfPkg.webUI.allowed.call(this) || mfPkg.webUI.denied.call(this); - }, - strings: function() { - var orig = mfPkg.native; - var lang = RouterLayer.getParam('lang'); - - // summarise matching keys (orig + trans) to a single record - var out = {}, strings = mfPkg.mfStrings.find({ - $and: [{$or: [{lang: orig}, {lang: lang}]}, - {removed: undefined}] - }).fetch(); - - _.each(strings, function(str) { - if (!out[str.key]) - out[str.key] = { key: str.key }; - if (str.lang == orig) - out[str.key].orig = str.text; - else - out[str.key].trans = str.text; - if (str.fuzzy) - out[str.key].fuzzy = true; - }); - - strings = _.values(out); - strings.sort(function(a, b) { - if (!a.trans && b.trans) - return -1; - else if (a.trans && !b.trans) - return 1; - - if (!a.fuzzy && b.fuzzy) - return -1; - else if (b.fuzzy && !a.fuzzy) - return 1; - - return a.text - b.text; - }); - - return strings; } }); @@ -261,11 +262,14 @@ Template.mfTransLang.events({ Template.mfTransLang.helpers({ sortedStrings: function() { + var strings = Blaze._globalHelpers['strings']; + if (!strings) return; + var sortField = Session.get('translationSortField'); if (!sortField) { Session.set('translationSortField', 'orig'); } - return this.strings.sort(function(a, b) { + return strings().sort(function(a, b) { return a[sortField] > b[sortField] ? 1 : (a[sortField] < b[sortField] ? -1 : 0); }); }, From 59bdacdfa2c5ac3e64e6dafd6d69c2242c190bce Mon Sep 17 00:00:00 2001 From: Martin Fournier Date: Mon, 11 Jan 2016 09:07:33 -0500 Subject: [PATCH 4/9] Allow sort by translated string --- msgfmt:ui/lib/ui.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/msgfmt:ui/lib/ui.html b/msgfmt:ui/lib/ui.html index 6ce6cf4..f2a2525 100644 --- a/msgfmt:ui/lib/ui.html +++ b/msgfmt:ui/lib/ui.html @@ -77,7 +77,7 @@

{{mf 'mf_site_translations' 'Site Translations'}}

Key {{/if}} Original String ({{origLang}}) - Translation ({{destLang}}) + Translation ({{destLang}}) From 8e7adad2fb1d065cd02d9f285585fa9adba812dd Mon Sep 17 00:00:00 2001 From: Martin Fournier Date: Mon, 11 Jan 2016 09:25:00 -0500 Subject: [PATCH 5/9] Add sort order for strings --- msgfmt:ui/lib/client.js | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/msgfmt:ui/lib/client.js b/msgfmt:ui/lib/client.js index b126ba4..2d835cc 100644 --- a/msgfmt:ui/lib/client.js +++ b/msgfmt:ui/lib/client.js @@ -253,7 +253,15 @@ Template.mfTransLang.events({ Session.set('translationShowKey', event.currentTarget.checked); }, 'click .translationSort': function(event) { - Session.set('translationSortField', event.currentTarget.attributes['data-sortField'].value); + var currentSort = Session.get('translationSortField'); + var newSort = event.currentTarget.attributes['data-sortField'].value; + Session.set('translationSortField', newSort); + + if (currentSort === newSort) { + var currentOrder = Session.get('translationSortOrder'); + var newOrder = (currentOrder === 'asc') ? 'desc' : 'asc'; + Session.set('translationSortOrder', newOrder); + } }, 'keyup #mfTransDest': function(event) { unsavedDest = event.target.value; @@ -266,11 +274,21 @@ Template.mfTransLang.helpers({ if (!strings) return; var sortField = Session.get('translationSortField'); + var sortOrder = Session.get('translationSortOrder'); if (!sortField) { Session.set('translationSortField', 'orig'); + sortField = 'orig'; + } + if (!sortOrder) { + Session.set('translationSortOrder', 'asc'); + sortOrder = 'asc'; } return strings().sort(function(a, b) { - return a[sortField] > b[sortField] ? 1 : (a[sortField] < b[sortField] ? -1 : 0); + if (sortOrder === 'asc') { + return a[sortField] > b[sortField] ? 1 : (a[sortField] < b[sortField] ? -1 : 0); + } else { + return a[sortField] > b[sortField] ? -1 : (a[sortField] < b[sortField] ? 1 : 0); + } }); }, showKey: function() { From 1de053377e38d9dc56918d0f28a45c835b5f9f4e Mon Sep 17 00:00:00 2001 From: Martin Fournier Date: Mon, 11 Jan 2016 09:47:08 -0500 Subject: [PATCH 6/9] Add case-insensitive ordering --- msgfmt:ui/lib/client.js | 18 ++++++++++++++++-- msgfmt:ui/lib/ui.css | 1 + msgfmt:ui/lib/ui.html | 12 +++++++++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/msgfmt:ui/lib/client.js b/msgfmt:ui/lib/client.js index 2d835cc..db46015 100644 --- a/msgfmt:ui/lib/client.js +++ b/msgfmt:ui/lib/client.js @@ -252,6 +252,9 @@ Template.mfTransLang.events({ 'click #translationShowKey': function(event) { Session.set('translationShowKey', event.currentTarget.checked); }, + 'click #translationCaseInsensitiveOrdering': function(event) { + Session.set('translationCaseInsensitiveOrdering', event.currentTarget.checked); + }, 'click .translationSort': function(event) { var currentSort = Session.get('translationSortField'); var newSort = event.currentTarget.attributes['data-sortField'].value; @@ -284,16 +287,24 @@ Template.mfTransLang.helpers({ sortOrder = 'asc'; } return strings().sort(function(a, b) { + var first = a[sortField]; + var second = b[sortField]; + var caseInsensitiveOrdering = Session.get('translationCaseInsensitiveOrdering'); + if (first && caseInsensitiveOrdering) first = first.toLowerCase(); + if (second && caseInsensitiveOrdering) second = second.toLowerCase(); if (sortOrder === 'asc') { - return a[sortField] > b[sortField] ? 1 : (a[sortField] < b[sortField] ? -1 : 0); + return first > second ? 1 : (first < second ? -1 : 0); } else { - return a[sortField] > b[sortField] ? -1 : (a[sortField] < b[sortField] ? 1 : 0); + return first > second ? -1 : (first < second ? 1 : 0); } }); }, showKey: function() { return Session.get('translationShowKey'); }, + caseInsensitiveOrdering: function() { + return Session.get('caseInsensitiveOrdering'); + }, stateClass: function() { if (this.fuzzy) return 'fuzzy'; @@ -333,6 +344,9 @@ Template.mfTransLang.helpers({ }, encodeURIComponent : function(text) { return encodeURIComponent(text); + }, + isCheckboxChecked: function(value) { + return (value === true ? 'checked' : ''); } }); diff --git a/msgfmt:ui/lib/ui.css b/msgfmt:ui/lib/ui.css index 97e276e..b8c030d 100644 --- a/msgfmt:ui/lib/ui.css +++ b/msgfmt:ui/lib/ui.css @@ -75,6 +75,7 @@ div.mfTransGraph.untrans { background: #800; border-right: 1px solid black; } */ #mfTransPreview table tr.current { background: #5598d7; color: white;} +#mfTransLang .options label { margin-right: 10px; } #mfTransLang textarea { font-family: monospace; diff --git a/msgfmt:ui/lib/ui.html b/msgfmt:ui/lib/ui.html index f2a2525..18c1d74 100644 --- a/msgfmt:ui/lib/ui.html +++ b/msgfmt:ui/lib/ui.html @@ -97,7 +97,17 @@

{{mf 'mf_site_translations' 'Site Translations'}}

-

Show key, Use ctrl-up and ctrl-down to quickly change keys

+

+ + + Use ctrl-up and ctrl-down to quickly change keys +

{{keyInfo.key}} in {{keyInfo.file}}:{{keyInfo.line }}{{#if keyInfo.template}} (template {{#if keyInfo.routeUrl}} From d68064e914b84d9ed886780de52789d00ba70ace Mon Sep 17 00:00:00 2001 From: Martin Fournier Date: Mon, 11 Jan 2016 12:43:10 -0500 Subject: [PATCH 7/9] Remove global helper + replace sortedStrings --- msgfmt:ui/lib/client.js | 118 +++++++++++++++++----------------------- msgfmt:ui/lib/ui.html | 2 +- 2 files changed, 52 insertions(+), 68 deletions(-) diff --git a/msgfmt:ui/lib/client.js b/msgfmt:ui/lib/client.js index db46015..1385af4 100644 --- a/msgfmt:ui/lib/client.js +++ b/msgfmt:ui/lib/client.js @@ -181,54 +181,40 @@ Template.mfTrans.helpers({ } }); -Template.registerHelper('strings', function() { - var orig = mfPkg.native; - var lang = RouterLayer.getParam('lang'); - - // summarise matching keys (orig + trans) to a single record - var out = {}, strings = mfPkg.mfStrings.find({ - $and: [{$or: [{lang: orig}, {lang: lang}]}, - {removed: undefined}] - }).fetch(); - - _.each(strings, function(str) { - if (!out[str.key]) - out[str.key] = { key: str.key }; - if (str.lang == orig) - out[str.key].orig = str.text; - else - out[str.key].trans = str.text; - if (str.fuzzy) - out[str.key].fuzzy = true; - }); - - strings = _.values(out); - strings.sort(function(a, b) { - if (!a.trans && b.trans) - return -1; - else if (a.trans && !b.trans) - return 1; - - if (!a.fuzzy && b.fuzzy) - return -1; - else if (b.fuzzy && !a.fuzzy) - return 1; - - return a.text - b.text; - }); - - return strings; -}); - Template.mfTransLang.helpers({ origLang: mfPkg.native, destLang: function() { return RouterLayer.getParam('lang'); }, allowed: function() { return !mfPkg.webUI.allowed.call(this) || mfPkg.webUI.denied.call(this); + }, + strings: function() { + var orig = mfPkg.native; + var lang = RouterLayer.getParam('lang'); + + // summarise matching keys (orig + trans) to a single record + var out = {}, strings = mfPkg.mfStrings.find({ + $and: [{$or: [{lang: orig}, {lang: lang}]}, + {removed: undefined}] + }).fetch(); + + _.each(strings, function(str) { + if (!out[str.key]) + out[str.key] = { key: str.key }; + if (str.lang == orig) + out[str.key].orig = str.text; + else + out[str.key].trans = str.text; + if (str.fuzzy) + out[str.key].fuzzy = true; + }); + + strings = _.values(out); + strings = sortStrings(strings); + + return strings; } }); - Template.mfTrans.events({ 'click #mfTransNewSubmit': function() { RouterLayer.go('mfTransLang', { lang: $('#mfTransNewText').val() }); @@ -272,33 +258,6 @@ Template.mfTransLang.events({ }); Template.mfTransLang.helpers({ - sortedStrings: function() { - var strings = Blaze._globalHelpers['strings']; - if (!strings) return; - - var sortField = Session.get('translationSortField'); - var sortOrder = Session.get('translationSortOrder'); - if (!sortField) { - Session.set('translationSortField', 'orig'); - sortField = 'orig'; - } - if (!sortOrder) { - Session.set('translationSortOrder', 'asc'); - sortOrder = 'asc'; - } - return strings().sort(function(a, b) { - var first = a[sortField]; - var second = b[sortField]; - var caseInsensitiveOrdering = Session.get('translationCaseInsensitiveOrdering'); - if (first && caseInsensitiveOrdering) first = first.toLowerCase(); - if (second && caseInsensitiveOrdering) second = second.toLowerCase(); - if (sortOrder === 'asc') { - return first > second ? 1 : (first < second ? -1 : 0); - } else { - return first > second ? -1 : (first < second ? 1 : 0); - } - }); - }, showKey: function() { return Session.get('translationShowKey'); }, @@ -350,6 +309,31 @@ Template.mfTransLang.helpers({ } }); +var sortStrings = function(strings) { + var sortField = Session.get('translationSortField'); + var sortOrder = Session.get('translationSortOrder'); + if (!sortField) { + Session.set('translationSortField', 'orig'); + sortField = 'orig'; + } + if (!sortOrder) { + Session.set('translationSortOrder', 'asc'); + sortOrder = 'asc'; + } + return strings.sort(function(a, b) { + var first = a[sortField]; + var second = b[sortField]; + var caseInsensitiveOrdering = Session.get('translationCaseInsensitiveOrdering'); + if (first && caseInsensitiveOrdering) first = first.toLowerCase(); + if (second && caseInsensitiveOrdering) second = second.toLowerCase(); + if (sortOrder === 'asc') { + return first > second ? 1 : (first < second ? -1 : 0); + } else { + return first > second ? -1 : (first < second ? 1 : 0); + } + }); +}; + var initialRender = _.once(function() { var key = Session.get('mfTransKey'), tr = $('#mfTransLang tr[data-key="'+key+'"]'); diff --git a/msgfmt:ui/lib/ui.html b/msgfmt:ui/lib/ui.html index 18c1d74..0aa2093 100644 --- a/msgfmt:ui/lib/ui.html +++ b/msgfmt:ui/lib/ui.html @@ -84,7 +84,7 @@

{{mf 'mf_site_translations' 'Site Translations'}}

- {{#each sortedStrings}} + {{#each strings}} {{#if showKey}} From 47e2a1341614b02d8a820f23bf403b1b6bc2dff7 Mon Sep 17 00:00:00 2001 From: Martin Fournier Date: Mon, 11 Jan 2016 13:15:33 -0500 Subject: [PATCH 8/9] Clarify header ordering indicators --- msgfmt:ui/lib/client.js | 9 +++++++++ msgfmt:ui/lib/ui.css | 12 ++++++++++++ msgfmt:ui/lib/ui.html | 17 ++++++++++++----- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/msgfmt:ui/lib/client.js b/msgfmt:ui/lib/client.js index 1385af4..ba1b7d2 100644 --- a/msgfmt:ui/lib/client.js +++ b/msgfmt:ui/lib/client.js @@ -264,6 +264,15 @@ Template.mfTransLang.helpers({ caseInsensitiveOrdering: function() { return Session.get('caseInsensitiveOrdering'); }, + sortOrderHeaderClass: function(headerSortField) { + var classes = ''; + var sortField = Session.get('translationSortField'); + var sortOrder = Session.get('translationSortOrder'); + if (headerSortField === sortField) { + classes += ' active-sort ' + sortOrder; + } + return classes + }, stateClass: function() { if (this.fuzzy) return 'fuzzy'; diff --git a/msgfmt:ui/lib/ui.css b/msgfmt:ui/lib/ui.css index b8c030d..9795db6 100644 --- a/msgfmt:ui/lib/ui.css +++ b/msgfmt:ui/lib/ui.css @@ -77,6 +77,18 @@ div.mfTransGraph.untrans { background: #800; border-right: 1px solid black; } #mfTransLang .options label { margin-right: 10px; } +#mfTransLang th { position: relative; } +#mfTransLang th.active-sort { background-color: #CCC; } +#mfTransLang th.active-sort a { font-weight: 500; } +#mfTransLang th.active-sort::after { + font-size: 0.6em; + position: absolute; + top: 5px; + right: 10px; +} +#mfTransLang th.active-sort.asc::after { content: '▲'; } +#mfTransLang th.active-sort.desc::after { content: '▼'; } + #mfTransLang textarea { font-family: monospace; height: 5em; width: 100%; diff --git a/msgfmt:ui/lib/ui.html b/msgfmt:ui/lib/ui.html index 0aa2093..3f44e5a 100644 --- a/msgfmt:ui/lib/ui.html +++ b/msgfmt:ui/lib/ui.html @@ -74,10 +74,16 @@

{{mf 'mf_site_translations' 'Site Translations'}}

{{#if showKey}} - + {{/if}} - - + +
{{key}}
Key + Key + Original String ({{origLang}})Translation ({{destLang}}) + Original String ({{origLang}}) + + Translation ({{destLang}}) +
@@ -104,9 +110,10 @@

{{mf 'mf_site_translations' 'Site Translations'}}

- Use ctrl-up and ctrl-down to quickly change keys +
+ Use ctrl-up and ctrl-down to quickly change keys & click on headers to reorder the columns.

{{keyInfo.key}} in {{keyInfo.file}}:{{keyInfo.line }}{{#if keyInfo.template}} (template From 098948d07da2540ffcb9a49d389509a6ec7672a0 Mon Sep 17 00:00:00 2001 From: Max Hodges Date: Sat, 22 Aug 2015 13:45:42 +0900 Subject: [PATCH 9/9] add keyboard shortcuts for Mac --- msgfmt:ui/lib/ui.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/msgfmt:ui/lib/ui.html b/msgfmt:ui/lib/ui.html index 3f44e5a..66a4852 100644 --- a/msgfmt:ui/lib/ui.html +++ b/msgfmt:ui/lib/ui.html @@ -113,7 +113,9 @@

{{mf 'mf_site_translations' 'Site Translations'}}

Case insensitive ordering
- Use ctrl-up and ctrl-down to quickly change keys & click on headers to reorder the columns. + Keyboard shortcuts: Ctrl-up/down arrow (Win); Control-Command-up/down arrow (Mac) +
+ Click on headers to reorder the columns.

{{keyInfo.key}} in {{keyInfo.file}}:{{keyInfo.line }}{{#if keyInfo.template}} (template