Skip to content

Commit 184da5b

Browse files
committed
mf:ui router agnosticism (#152)
1 parent 4a5c258 commit 184da5b

File tree

5 files changed

+134
-128
lines changed

5 files changed

+134
-128
lines changed

History.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ See "Differences from v0" in the README too.
77
en_US -> en -> native.
88

99
* Split off the translation UI into a separate package (#29)
10+
* mf:ui is now router agnostic via nicolaslopezj:meteor-router-layer
1011

1112
* Server now keeps track of connection locales (#83) thanks @lucazulian
1213

@@ -18,7 +19,6 @@ See "Differences from v0" in the README too.
1819
* msgfmt.setBodyDir = true (default) will set <body> direction
1920

2021

21-
2222
TODO
2323

2424
* Retrieve languages via separate JSON request, cache it

msgfmt:ui/lib/client.js

+113-103
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,33 @@
33
// Setup in msgfmt:core on server, only used on the client in msgfmt:ui
44
mfPkg.mfRevisions = new Mongo.Collection('mfRevisions');
55

6+
var ironRouter = Package['iron:router'] && Package['iron:router'].Router;
7+
68
/*
79
* Finds the name of the first route using the given template
810
*/
911
function routeNameFromTemplate(name) {
10-
var route = _.find(Router.routes, function(route) {
11-
if (route.options.template)
12-
return route.options.template == name;
13-
else
14-
return route.name == name;
15-
});
16-
return route && route.name;
12+
var route;
13+
14+
if (ironRouter) {
15+
16+
route = _.find(ironRouter.routes, function(route) {
17+
if (route.options.template)
18+
return route.options.template === name;
19+
else
20+
return route.getName() === name;
21+
});
22+
return route && route.getName();
23+
24+
}
25+
26+
// Unsupported router
27+
return;
28+
}
29+
30+
function routePathFromName(name) {
31+
if (ironRouter)
32+
return ironRouter.path(name);
1733
}
1834

1935
/*
@@ -92,103 +108,98 @@ function changeKey(newKey) {
92108
$('#mfTransDest').focus();
93109
}
94110

95-
if (Package['iron:router'])
96-
Package['iron:router'].Router.map(function() {
97-
// Main translation page, summary of all language data
98-
this.route('mfTrans', {
99-
path: '/translate',
100-
waitOn: function() {
101-
return Meteor.subscribe('mfStats');
102-
},
103-
data: function() {
104-
var data = {};
105-
data.strings = mfPkg.mfStrings.find();
106-
data.stats = mfPkg.mfMeta.findOne({_id: '__stats'});
107-
data.native = mfPkg.native;
108-
return data;
109-
}
110-
});
111+
RouterLayer.route('/translate', { template: 'mfTrans' });
112+
RouterLayer.route('/translate/:lang', { template: 'mfTransLang' });
113+
114+
Template.mfTrans.onCreated(function() {
115+
this.subscribe('mfStats');
116+
});
111117

112-
// Modify translations for a particular language
113-
this.route('mfTransLang', {
114-
path: '/translate/:lang',
115-
waitOn: function() {
116-
// Note, this is in ADDITION to the regular mfStrings sub
117-
return Meteor.subscribe('mfStrings',
118-
[mfPkg.native, this.params.lang], 0, true);
119-
},
120-
onBeforeAction: function() {
121-
if (!mfPkg.webUI.allowed.call(this) || mfPkg.webUI.denied.call(this)) {
122-
this.render('mfTransLangDenied');
123-
} else {
124-
// Temporary, only used to override preserve on dest
125-
Session.set('mfTransTrans', this.params.lang);
126-
127-
// Handle ctrl-up/ctrl-down, respectively
128-
$(window).on('keydown.mfTrans', function(event) {
129-
if (event.ctrlKey && (event.which == 38 || event.which == 40)) {
130-
event.preventDefault(); event.stopPropagation();
131-
var tr = event.which == 38
132-
? $('#mfTransLang tr.current').prev()
133-
: $('#mfTransLang tr.current').next();
134-
if (tr.length) {
135-
changeKey(tr.data('key'));
136-
mfCheckScroll(tr);
137-
}
138-
}
139-
});
140-
141-
this.subscribe('mfRevisions', this.params.lang, 10);
142-
this.next();
118+
Template.mfTransLang.onCreated(function() {
119+
// Note, this is in ADDITION to the regular mfStrings sub
120+
var lang = RouterLayer.getParam('lang');
121+
this.subscribe('mfStrings', [mfPkg.native, lang], 0, true);
122+
this.subscribe('mfRevisions', lang, 10);
123+
124+
// Temporary, only used to override preserve on dest
125+
Session.set('mfTransTrans', lang);
126+
127+
// Handle ctrl-up/ctrl-down, respectively
128+
$(window).on('keydown.mfTrans', function(event) {
129+
if (event.ctrlKey && (event.which == 38 || event.which == 40)) {
130+
event.preventDefault(); event.stopPropagation();
131+
var tr = event.which == 38
132+
? $('#mfTransLang tr.current').prev()
133+
: $('#mfTransLang tr.current').next();
134+
if (tr.length) {
135+
changeKey(tr.data('key'));
136+
mfCheckScroll(tr);
143137
}
144-
},
145-
onStop: function() {
146-
$(window).off('keydown.mfTrans');
147-
},
148-
data: function() {
149-
var data = { strings: {} };
150-
var strings, out = {};
151-
data.orig = mfPkg.native;
152-
data.trans = this.params.lang;
153-
154-
// summarise matching keys (orig + trans) to a single record
155-
strings = mfPkg.mfStrings.find({
156-
$and: [{$or: [{lang: data.orig}, {lang: this.params.lang}]},
157-
{removed: undefined}]
158-
}).fetch();
159-
_.each(strings, function(str) {
160-
if (!out[str.key])
161-
out[str.key] = { key: str.key };
162-
if (str.lang == data.orig)
163-
out[str.key].orig = str.text;
164-
else
165-
out[str.key].trans = str.text;
166-
if (str.fuzzy)
167-
out[str.key].fuzzy = true;
168-
});
169-
data.strings = _.values(out);
170-
data.strings.sort(function(a, b) {
171-
if (!a.trans && b.trans)
172-
return -1;
173-
else if (a.trans && !b.trans)
174-
return 1;
175-
176-
if (!a.fuzzy && b.fuzzy)
177-
return -1;
178-
else if (b.fuzzy && !a.fuzzy)
179-
return 1;
180-
181-
return a.text - b.text;
182-
});
183-
184-
return data;
185138
}
186139
});
187140
});
188141

142+
Template.mfTransLang.onDestroyed(function() {
143+
$(window).off('keydown.mfTrans');
144+
});
145+
146+
Template.mfTrans.helpers({
147+
strings: function() { return mfPkg.mfStrings.find(); },
148+
stats: function() { return mfPkg.mfMeta.findOne({_id: '__stats'}); },
149+
native: mfPkg.native,
150+
allowed: function() {
151+
return !mfPkg.webUI.allowed.call(this) || mfPkg.webUI.denied.call(this);
152+
}
153+
});
154+
155+
Template.mfTransLang.helpers({
156+
allowed: function() {
157+
return !mfPkg.webUI.allowed.call(this) || mfPkg.webUI.denied.call(this);
158+
},
159+
strings: function() {
160+
var orig = mfPkg.native;
161+
var lang = RouterLayer.getParam('lang');
162+
163+
// summarise matching keys (orig + trans) to a single record
164+
var out = {}, strings = mfPkg.mfStrings.find({
165+
$and: [{$or: [{lang: orig}, {lang: lang}]},
166+
{removed: undefined}]
167+
}).fetch();
168+
169+
_.each(strings, function(str) {
170+
if (!out[str.key])
171+
out[str.key] = { key: str.key };
172+
if (str.lang == orig)
173+
out[str.key].orig = str.text;
174+
else
175+
out[str.key].trans = str.text;
176+
if (str.fuzzy)
177+
out[str.key].fuzzy = true;
178+
});
179+
180+
strings = _.values(out);
181+
strings.sort(function(a, b) {
182+
if (!a.trans && b.trans)
183+
return -1;
184+
else if (a.trans && !b.trans)
185+
return 1;
186+
187+
if (!a.fuzzy && b.fuzzy)
188+
return -1;
189+
else if (b.fuzzy && !a.fuzzy)
190+
return 1;
191+
192+
return a.text - b.text;
193+
});
194+
195+
return strings;
196+
}
197+
});
198+
199+
189200
Template.mfTrans.events({
190201
'click #mfTransNewSubmit': function() {
191-
Router.go('/translate/' + $('#mfTransNewText').val());
202+
RouterLayer.go('mfTransLang', { lang: $('#mfTransNewText').val() });
192203
},
193204
'click #mfAllJs': function(event, tpl) {
194205
// Make sure we have no conflicts with iron-router
@@ -223,26 +234,25 @@ Template.mfTransLang.helpers({
223234
mfTransOrig: function() {
224235
var str = mfPkg.mfStrings.findOne({
225236
key: Session.get('mfTransKey'),
226-
lang: this.orig
237+
lang: mfPkg.native
227238
});
228239
return str ? str.text : '';
229240
},
230241
mfTransTrans: function() {
231242
var str = mfPkg.mfStrings.findOne({
232243
key: Session.get('mfTransKey'),
233-
lang: this.trans
244+
lang: RouterLayer.getParam('lang')
234245
});
235246
return str ? str.text : '';
236247
},
237248
keyInfo: function() {
238249
var str = mfPkg.mfStrings.findOne({
239250
key: Session.get('mfTransKey'),
240-
lang: this.orig
251+
lang: mfPkg.native
241252
});
242253
if (str && str.template) {
243254
var routeName = routeNameFromTemplate(str.template);
244-
if (routeName)
245-
str.routeUrl = Router.path(routeName);
255+
if (routeName) str.routeUrl = routePathFromName(routeName);
246256
}
247257
return str || {};
248258
}
@@ -257,7 +267,7 @@ var initialRender = _.once(function() {
257267
$('#mfTransDest').focus();
258268
});
259269

260-
Template.mfTransLang.rendered = function() {
270+
Template.mfTransLang.onRendered(function() {
261271
var tr, key = Session.get('mfTransKey');
262272

263273
// For unset or nonexistent key, set to first row
@@ -269,4 +279,4 @@ Template.mfTransLang.rendered = function() {
269279
var transDest = $('#mfTransDest');
270280
if (typeof transDest.tabOverride === 'function') transDest.tabOverride();
271281
initialRender();
272-
};
282+
});

msgfmt:ui/lib/common.js

-23
Original file line numberDiff line numberDiff line change
@@ -38,26 +38,3 @@ if (Meteor.isServer) {
3838
mfPkg.mfRevisions.allow({insert:mfPkg.webUI.allowed, update:mfPkg.webUI.allowed, remove:mfPkg.webUI.allowed});
3939
mfPkg.mfRevisions.deny({insert:mfPkg.webUI.denied, update:mfPkg.webUI.denied, remove:mfPkg.webUI.denied});
4040
}
41-
42-
// needs to be on client and server for routing to work properly
43-
if (Package['iron:router'])
44-
Package['iron:router'].Router.map(function() {
45-
this.route('mfAll', {
46-
path: '/translate/mfAll.js',
47-
where: 'server',
48-
action: function() {
49-
var out, meta = { exportedAt: new Date().getTime(), updatedAt: 0 };
50-
for (lang in mfPkg.strings)
51-
for (key in mfPkg.strings[lang])
52-
if (mfPkg.strings[lang][key].mtime > meta.updatedAt)
53-
meta.updatedAt = mfPkg.strings[lang][key].mtime;
54-
55-
out = 'mfPkg.syncAll('
56-
+ JSON.stringify(mfPkg.strings, null, 2)
57-
+ ', ' + JSON.stringify(meta, null, 2) + ');';
58-
//this.response.writeHead(200, {'Content-Type': 'application/javascript'});
59-
this.response.writeHead(200, {'Content-Disposition': 'attachment; filename=mfAll.js'});
60-
this.response.end(out, 'utf8');
61-
}
62-
});
63-
});

msgfmt:ui/lib/server.js

+15
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,18 @@ Meteor.publish('mfStats', function() {
7676
handle.stop();
7777
});
7878
});
79+
80+
WebApp.connectHandlers.use('/translate/mfAll.js', function(req, res, next) {
81+
var out, meta = { exportedAt: new Date().getTime(), updatedAt: 0 };
82+
for (lang in mfPkg.strings)
83+
for (key in mfPkg.strings[lang])
84+
if (mfPkg.strings[lang][key].mtime > meta.updatedAt)
85+
meta.updatedAt = mfPkg.strings[lang][key].mtime;
86+
87+
out = 'mfPkg.syncAll('
88+
+ JSON.stringify(mfPkg.strings, null, 2)
89+
+ ', ' + JSON.stringify(meta, null, 2) + ');';
90+
//res.writeHead(200, {'Content-Type': 'application/javascript'});
91+
res.writeHead(200, {'Content-Disposition': 'attachment; filename=mfAll.js'});
92+
res.end(out, 'utf8');
93+
});

msgfmt:ui/package.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ Package.describe({
88
Package.onUse(function (api) {
99
api.versionsFrom("[email protected]");
1010
api.use(['templating', 'underscore'], 'client');
11-
api.use('iron:[email protected]', ['client', 'server']);
11+
api.use('webapp', 'server');
12+
13+
//api.use('iron:[email protected]', ['client', 'server']);
14+
api.use('nicolaslopezj:[email protected]', 'client');
15+
1216
api.use('mongo');
1317
api.use('msgfmt:[email protected]');
1418

0 commit comments

Comments
 (0)