Skip to content

Commit 5fda058

Browse files
author
Sofia Margariti
committed
Merge tag '2.3.5'
2 parents 5f26b49 + a0bcb71 commit 5fda058

File tree

10 files changed

+105
-201
lines changed

10 files changed

+105
-201
lines changed

src/app.js

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ function txApp(modules) {
2626
function appActivated() {
2727
//set settings to be accessible from everywhere
2828
io.setSettings(this.settings);
29+
io.setEmail(this.currentUser().email());
2930

3031
var ex = txutils.extractOrgFromUrl(this.settings.tx_project);
3132
this.store('page_title', ex.project_slug || 'Zendesk');

src/lib/io.js

+7
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ var SETTINGS = {},
1616
RETRIES = {},
1717
ZD_LOCALES = {},
1818
RESOURCE_ARRAY = [],
19+
ZD_USER_EMAIL = '',
1920
QUERY = '';
2021

2122
module.exports = {
@@ -26,6 +27,12 @@ module.exports = {
2627
return SETTINGS;
2728
},
2829

30+
setEmail: function(email) {
31+
ZD_USER_EMAIL = email;
32+
},
33+
getEmail: function() {
34+
return ZD_USER_EMAIL;
35+
},
2936
setFeatures: function(features) {
3037
FEATURES = features;
3138
},

src/lib/transifex-api/resource.js

+25-7
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ var resource = module.exports = {
5555
cors: true
5656
};
5757
},
58-
txResource: function(resourceName, languageCode) {
58+
txResource: function(resourceName, languageCode, entryid) {
5959
logger.debug('txResource ajax request:', resourceName + '||' + languageCode);
6060
return {
6161
url: this.tx + '/api/2/project/' + this.selected_brand.tx_project + '/resource/' + resourceName + '/translation/' + languageCode + '/',
@@ -64,6 +64,7 @@ var resource = module.exports = {
6464
beforeSend: function(jqxhr, settings) {
6565
jqxhr.resourceName = resourceName;
6666
jqxhr.languageCode = languageCode;
67+
jqxhr.entryid = entryid;
6768
},
6869
dataType: 'json',
6970
cors: true
@@ -124,16 +125,21 @@ var resource = module.exports = {
124125

125126
txResourceDone: function(data, textStatus, jqXHR) {
126127
logger.info('Transifex Resource retrieved with status:', textStatus);
127-
this.store(resource.key + jqXHR.resourceName + jqXHR.languageCode,
128-
data);
128+
var zd_locales = io.getLocales();
129+
var zdLocale = syncUtil.txLocaletoZd(jqXHR.languageCode, zd_locales);
130+
var type = this.resolveResourceType(jqXHR.resourceName);
131+
132+
this['zdUpsert<T>Translation'.replace('<T>', type)](
133+
data.content, jqXHR.entryid, zdLocale
134+
);
129135
io.popSync(resource.key + jqXHR.resourceName + jqXHR.languageCode);
130-
this.checkAsyncComplete();
131136
},
137+
132138
txResourceError: function(jqXHR, textStatus) {
133139
logger.info('Transifex Resource Retrieved with status:', textStatus);
134140
var retries = io.getRetries('txResource' + jqXHR.resourceName);
135141
if (jqXHR.status == 401 && retries < 2) {
136-
this.ajax('txResource', jqXHR.resourceName);
142+
this.ajax('txResource', jqXHR.resourceName, jqXHR.languageCode, jqXHR.entryid);
137143
io.setRetries('txResource' + jqXHR.resourceName, retries + 1);
138144
} else {
139145
io.popSync(resource.key + jqXHR.resourceName + jqXHR.languageCode);
@@ -146,16 +152,19 @@ var resource = module.exports = {
146152
txInsertResourceDone: function(data, textStatus, jqXHR) {
147153
logger.info('Transifex Resource inserted with status:', textStatus);
148154
io.popSync(resource.key + jqXHR.resourceName + 'upsert');
155+
149156
io.opSet(jqXHR.resourceName, 'success');
150157
io.pushResource(jqXHR.resourceName);
151158
this.checkAsyncComplete();
152159
},
160+
153161
txUpdateResourceDone: function(data, textStatus, jqXHR) {
154162
logger.info('Transifex Resource updated with status:', textStatus);
155163
io.popSync(resource.key + jqXHR.resourceName + 'upsert');
156164
io.opSet(jqXHR.resourceName, 'success');
157165
this.checkAsyncComplete();
158166
},
167+
159168
txUpsertResourceError: function(jqXHR, textStatus) {
160169
logger.info('Transifex Resource Retrieved with status:', textStatus);
161170
io.popSync(resource.key + jqXHR.resourceName + 'upsert');
@@ -197,10 +206,10 @@ var resource = module.exports = {
197206
io.setRetries('txResourceStats' + name, 0);
198207
this.ajax('txResourceStats', name);
199208
},
200-
asyncGetTxResource: function(name, code) {
209+
asyncGetTxResource: function(name, code, entryid) {
201210
logger.info('asyncGetTxResource:', name + code);
202211
io.pushSync(resource.key + name + code);
203-
this.ajax('txResource', name, code);
212+
this.ajax('txResource', name, code, entryid);
204213
},
205214
asyncTxUpsertResource: function(data, name) {
206215
logger.info('asyncTxUpdateResource:', name);
@@ -223,5 +232,14 @@ var resource = module.exports = {
223232
});
224233
return Math.ceil(sum / locale_count);
225234
},
235+
resolveResourceType: function(resourceName) {
236+
var t = resourceName.split('-')[1];
237+
return {
238+
'articles': 'Articles',
239+
'sections': 'Sections',
240+
'categories': 'Categories',
241+
'dynamic': 'DynamicContent'
242+
}[t];
243+
}
226244
},
227245
};

src/lib/txUtil.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*/
55

66
var TX_PROJECT_API_URL_PATTERN = /(http|https):\/\/(www\.transifex\.com|tx.loc:8000)\/api\/2\/project\/(.*)\//;
7-
var TX_PROJECT_URL_PATTERN = /(https?:\/\/)(www\.transifex\.com|tx\.loc:8000)\/(.*)\/(.*)\//;
7+
var TX_PROJECT_URL_PATTERN = /(https?:\/\/)(www\.transifex\.com|tx\.loc:8000)\/([^\/]*)\/([^\/]*)\/?/;
88

99
function convertUrlToApi(u) {
1010
if (isValidUrl(u)) {

src/lib/ui/sync-factory.js

+20-97
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ module.exports = function(T, t, api) {
2828
events: {
2929
'click [tab="<t>"]': M('ui<T>Tab'),
3030
'click .js-<t>.js-goto-page': M('ui<T>GotoPage'),
31-
'click .js-<t>.js-goto-next': M('ui<T>NextPage'),
32-
'click .js-<t>.js-goto-prev': M('ui<T>PrevPage'),
3331
'click .js-<t>.js-sortby-title': M('ui<T>SortByTitle'),
3432
'click .js-<t>.js-sortby-updated_at': M('ui<T>SortByUpdated'),
3533
'click .js-<t>[perpage]': M('ui<T>PerPage'),
@@ -245,11 +243,9 @@ module.exports = function(T, t, api) {
245243
object_ids.push(this.$(row).attr('id'));
246244
});
247245
var project = this.store(txProject.key),
248-
sourceLocale = this.getSourceLocale(project),
249246
data = this.store(zdApi.key),
250247
obj = this[M('calcResourceName<T>')](data),
251-
entry, resource, txResourceName, completedLocales,
252-
zdLocale, translation, zd_locales;
248+
entry, resource, txResourceName, completedLocales;
253249

254250
var objects = _.filter(obj[m('<t>')], function(o){
255251
return object_ids.indexOf(o.resource_name) !== -1;
@@ -258,19 +254,14 @@ module.exports = function(T, t, api) {
258254
io.opResetAll();
259255
this.loadSyncPage = this[M('ui<T>DownloadComplete')];
260256

261-
zd_locales = io.getLocales();
262257
for (var i = 0; i < objects.length; i++) {
263258
entry = objects[i];
264259
txResourceName = entry.resource_name;
265260
resource = this.store(txResource.key + txResourceName);
266261
completedLocales = this.completedLanguages(resource);
267262

268263
for (var ii = 0; ii < completedLocales.length; ii++) { // iterate through list of locales
269-
translation = this.store(txResource.key + txResourceName + completedLocales[ii]);
270-
if (typeof translation.content === 'string') {
271-
zdLocale = syncUtil.txLocaletoZd(completedLocales[ii], zd_locales);
272-
this[M('zdUpsert<T>Translation')](translation.content, entry, zdLocale);
273-
}
264+
this.asyncGetTxResource(txResourceName, completedLocales[ii], entry.id);
274265
}
275266
}
276267
},
@@ -514,34 +505,30 @@ module.exports = function(T, t, api) {
514505
this.notifyWarning('Some Transifex resources could not be loaded. Please refresh to try again.');
515506
}
516507
this.$(m('.js-<t>.js-select-all')).prop('disabled', false);
517-
this.loadSyncPage = this[M('ui<T>LanguageComplete')];
518-
this[M('syncCompletedLanguages<T>')]();
508+
this[M('ui<T>LanguageComplete')]();
519509
},
510+
520511
'ui<T>LanguageComplete': function() {
521512
logger.debug(M('ui<T>LanguageComplete'));
513+
522514
var data = this[M('calcResourceName<T>')](this.store(zdApi.key)),
523-
num = data[t].length,
524515
numLanguages = 0,
525516
resourceName = '',
526-
resource = {},
527-
languageArray = [],
528-
resourceLanguage = {};
529-
for (var i = 0; i < num; i++) {
517+
resource = {};
518+
519+
for (var i = 0; i < data[t].length; i++) {
530520
resourceName = data[t][i].resource_name;
531521
resource = this.store(txResource.key + resourceName);
532522
//TODO depends on resource typeness
533523
if (typeof resource !== 'number') {
534-
languageArray = this.completedLanguages(resource);
535-
numLanguages = languageArray.length;
536-
for (var ii = 0; ii < numLanguages; ii++) {
537-
resourceLanguage = this.store(txResource.key + resourceName + languageArray[ii]);
538-
if (resourceLanguage) {
539-
this.$('#' + resourceName).addClass('js-can-download');
540-
}
524+
numLanguages = this.completedLanguages(resource).length;
525+
if (numLanguages) {
526+
this.$('#' + resourceName).addClass('js-can-download');
541527
}
542528
}
543529
}
544530
},
531+
545532
'ui<T>GotoPage': function(event) {
546533
if (event) event.preventDefault();
547534
if (this.processing) return;
@@ -565,54 +552,7 @@ module.exports = function(T, t, api) {
565552
});
566553
this.loadSyncPage = this[M('ui<T>Init')];
567554
},
568-
'ui<T>NextPage': function(event) {
569-
if (event) event.preventDefault();
570-
if (this.processing) return;
571-
572-
logger.debug(M('ui<T>NextPage'));
573-
var page = this.$(event.target).attr("data-current-page"),
574-
nextPage = parseInt(page, 10) + 1,
575-
sorting = io.getSorting(),
576-
query = io.getQuery();
577-
factory.currentpage = nextPage;
578-
this[M('asyncGetZd<T>Full')](
579-
factory.currentpage, sorting.sortby,
580-
sorting.sortdirection, sorting.perpage, query
581-
);
582-
this.switchTo('loading_page', {
583-
page: t,
584-
page_articles: t == 'articles',
585-
page_categories: t == 'categories',
586-
page_sections: t == 'sections',
587-
page_dynamic_content: t == 'dynamic',
588-
query_term: query,
589-
});
590-
this.loadSyncPage = this[M('ui<T>Init')];
591-
},
592-
'ui<T>PrevPage': function(event) {
593-
if (event) event.preventDefault();
594-
if (this.processing) return;
595555

596-
logger.debug(M('ui<T>PrevPage'));
597-
var page = this.$(event.target).attr("data-current-page"),
598-
prevPage = parseInt(page, 10) - 1,
599-
sorting = io.getSorting(),
600-
query = io.getQuery();
601-
factory.currentpage = prevPage;
602-
this[M('asyncGetZd<T>Full')](
603-
factory.currentpage, sorting.sortby,
604-
sorting.sortdirection, sorting.perpage, query
605-
);
606-
this.switchTo('loading_page', {
607-
page: t,
608-
page_articles: t == 'articles',
609-
page_categories: t == 'categories',
610-
page_sections: t == 'sections',
611-
page_dynamic_content: t == 'dynamic',
612-
query_term: query,
613-
});
614-
this.loadSyncPage = this[M('ui<T>Init')];
615-
},
616556
'ui<T>BrandTab': function(event) {
617557
var brand;
618558
if (event && event.preventDefault) {
@@ -688,6 +628,7 @@ module.exports = function(T, t, api) {
688628
this.$('[data-locale]').removeClass('u-color-systemError u-color-systemWarning').addClass('u-color-secondary');
689629
this.$(m('.js-<t>[data-resource]')).removeClass('o-status is-error is-warning is-success').addClass('o-interactive-list__item');
690630
},
631+
691632
'end<T>Process': function() {
692633
this.processing = false;
693634
this.$(m('.js-<t>.js-refresh')).removeClass('is-disabled');
@@ -698,6 +639,7 @@ module.exports = function(T, t, api) {
698639
prop('checked', false);
699640
this[M('ui<T>UpdateButtons')]();
700641
},
642+
701643
'sync<T>Translations': function() {
702644
logger.debug(M('sync<T>Translations started'));
703645
var data = this.store(zdApi.key),
@@ -711,6 +653,7 @@ module.exports = function(T, t, api) {
711653
}
712654
}
713655
},
656+
714657
'syncResourceStats<T>': function() {
715658
logger.debug(M('syncResourceStats<T> started'));
716659
var data = this.store(zdApi.key),
@@ -724,30 +667,7 @@ module.exports = function(T, t, api) {
724667
}
725668
}
726669
},
727-
'syncCompletedLanguages<T>': function() {
728-
// Requires txProject, zdApis, and ResourceStats
729-
logger.debug(M('syncCompletedLanguages<T> started'));
730-
// Local function vars
731-
var data = this[M('calcResourceName<T>')](this.store(zdApi.key)),
732-
num = data[t].length,
733-
numLanguages = 0,
734-
resourceName = '',
735-
resource = {},
736-
languageArray = [];
737-
for (var i = 0; i < num; i++) {
738-
resourceName = data[t][i].resource_name;
739-
resource = this.store(txResource.key + resourceName);
740-
//TODO depends on resource typeness, fast n loose
741-
if (typeof resource == 'object') {
742-
languageArray = this.completedLanguages(resource);
743-
numLanguages = languageArray.length;
744-
for (var ii = 0; ii < numLanguages; ii++) {
745-
// Side effect: make api calls and load resources
746-
this.asyncGetTxResource(resourceName, languageArray[ii]);
747-
}
748-
}
749-
}
750-
},
670+
751671
'buildSyncPage<T>Data': function() {
752672
var data = this.store(zdApi.key),
753673
entries = this[M('calcResourceName<T>')](data),
@@ -798,13 +718,16 @@ module.exports = function(T, t, api) {
798718
ret = _.extend(ret, {
799719
page_prev_enabled: this.isFewer(data, currentPage),
800720
page_next_enabled: this.isMore(data, currentPage),
801-
current_page: this.getCurrentPage(data),
721+
current_page: currentPage,
722+
prev_page: currentPage - 1,
723+
next_page: currentPage + 1,
802724
pagination_visible: paginationVisible,
803725
pages: this.getPages(data)
804726
});
805727
}
806728
return ret;
807729
},
730+
808731
'handleSearch<T>': function(){
809732
if (t != 'articles') {
810733
this.$('.js-search').addClass("u-display-none");

src/lib/zendesk-api/dynamic-content.js

+9-5
Original file line numberDiff line numberDiff line change
@@ -141,26 +141,30 @@ var dynamic_content = module.exports = {
141141
},
142142
},
143143
actionHandlers: {
144-
zdUpsertDynamicContentTranslation: function(resource_data, entry, zd_locale) {
145-
logger.info('Upsert Dynamic Content with Id:' + entry.id + 'and locale:' + zd_locale);
144+
zdUpsertDynamicContentTranslation: function(resource_data, entryid, zd_locale) {
145+
logger.info('Upsert Dynamic Content with Id:' + entryid + 'and locale:' + zd_locale);
146146

147147
var data, variant, locale_id,
148148
translation_data = common.translationObjectFormat(this.$, resource_data, zd_locale),
149-
existing_locales = this.store(dynamic_content.key + entry.id + '_locales');
149+
existing_locales = this.store(dynamic_content.key + entryid + '_locales');
150150
locale_id = io.getIdFromLocale(zd_locale);
151151
data = {
152152
variant: {
153153
content: translation_data.translation.body,
154154
locale_id: locale_id
155155
}
156156
};
157+
var entry = _.findWhere(
158+
this.store(dynamic_content.key)[dynamic_content.api],
159+
{'id': entryid}
160+
);
157161
if (_.contains(existing_locales, zd_locale)) {
158162
variant = _.find(entry.variants, function(v){
159163
return v.locale_id == locale_id;
160164
});
161-
this.ajax('variantUpdate', data, entry.id, zd_locale, variant.id);
165+
this.ajax('variantUpdate', data, entryid, zd_locale, variant.id);
162166
} else {
163-
this.ajax('variantInsert', data, entry.id, zd_locale);
167+
this.ajax('variantInsert', data, entryid, zd_locale);
164168
}
165169
},
166170

0 commit comments

Comments
 (0)