From 2e6cb63f0016f333f43ef5b026d0b09256a5fcf7 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 16 Nov 2016 12:38:16 +0300 Subject: [PATCH 1/9] Interface customization using plugins. Need to append config->editorConfig->pluigns->UIpluginsData field with list of customizer plugins. (cherry picked from commit 7dfcc927f6630185f6518bf50e3b90a10bf0a5e6) --- apps/common/main/lib/util/utils.js | 42 ++++++++++++ .../main/app/controller/Main.js | 64 ++++++++++++------- .../main/app/controller/Main.js | 64 ++++++++++++------- .../main/app/controller/Main.js | 63 +++++++++++------- 4 files changed, 167 insertions(+), 66 deletions(-) diff --git a/apps/common/main/lib/util/utils.js b/apps/common/main/lib/util/utils.js index 8a18386d4..4940bb9f7 100644 --- a/apps/common/main/lib/util/utils.js +++ b/apps/common/main/lib/util/utils.js @@ -648,6 +648,48 @@ Common.Utils.applyCustomization = function(config, elmap) { } }; +Common.Utils.applyCustomizationPlugins = function(plugins) { + if (!plugins || plugins.length<1) return; + + var _createXMLHTTPObject = function() { + var xmlhttp; + try { + xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); + } + catch (e) { + try { + xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); + } + catch (E) { + xmlhttp = false; + } + } + if (!xmlhttp && typeof XMLHttpRequest != 'undefined') { + xmlhttp = new XMLHttpRequest(); + } + return xmlhttp; + }; + + var _getPluginCode = function(url) { + if (!url) return ''; + try { + var xhrObj = _createXMLHTTPObject(); + if (xhrObj && url) { + xhrObj.open('GET', url, false); + xhrObj.send(''); + if (xhrObj.status == 200) + eval(xhrObj.responseText); + } + } + catch (e) {} + return null; + }; + + plugins.forEach(function(url){ + if (url) _getPluginCode(url); + }); +}; + Common.Utils.fillUserInfo = function(info, lang, defname) { var _user = info || {}; !_user.id && (_user.id = ('uid-' + Date.now())); diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index ee00af621..2f55ba92e 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -147,6 +147,7 @@ define([ this.editorConfig = {}; this.appOptions = {}; this.plugins = undefined; + this.UICustomizePlugins = []; Common.Gateway.on('init', _.bind(this.loadConfig, this)); Common.Gateway.on('showmessage', _.bind(this.onExternalMessage, this)); Common.Gateway.on('opendocument', _.bind(this.loadDocument, this)); @@ -860,7 +861,7 @@ define([ application.getController('Common.Controllers.ExternalMergeEditor').setApi(this.api).loadConfig({config:this.editorConfig, customization: this.editorConfig.customization}); pluginsController.setApi(me.api); - me.updatePlugins(me.plugins); + me.updatePlugins(me.plugins, false); me.api.asc_registerCallback('asc_onPluginsInit', _.bind(me.updatePluginsList, me)); documentHolderController.setApi(me.api); @@ -905,9 +906,14 @@ define([ toolbarController.onApiCoAuthoringDisconnect(); me.api.UpdateInterfaceState(); me.fillTextArt(me.api.asc_getTextArtPreviews()); + + if (me.appOptions.canBrandingExt) + Common.NotificationCenter.trigger('document:ready', 'main'); } }, 50); - } + } else if (me.appOptions.canBrandingExt) + Common.NotificationCenter.trigger('document:ready', 'main'); + if (this.appOptions.canAnalytics && false) Common.component.Analytics.initialize('UA-12442749-13', 'Document Editor'); @@ -1013,7 +1019,9 @@ define([ params.asc_getTrial() && headerView.setDeveloperMode(true); this.appOptions.canRename && headerView.setCanRename(true); - this.appOptions.canBrandingExt = params.asc_getCanBranding() && (typeof this.editorConfig.customization == 'object'); + this.appOptions.canBrandingExt = params.asc_getCanBranding() && (typeof this.editorConfig.customization == 'object' || this.editorConfig.plugins); + if (this.appOptions.canBrandingExt) + this.updatePlugins(this.plugins, true); this.applyModeCommonElements(); this.applyModeEditorElements(); @@ -1464,13 +1472,15 @@ define([ }, hidePreloader: function() { - if (!!this.appOptions.customization && !this.appOptions.customization.done) { - this.appOptions.customization.done = true; - if (!this.appOptions.isDesktopApp) + if (!this._state.customizationDone) { + this._state.customizationDone = true; + if (this.appOptions.customization && !this.appOptions.isDesktopApp) this.appOptions.customization.about = true; Common.Utils.applyCustomization(this.appOptions.customization, mapCustomizationElements); - if (this.appOptions.canBrandingExt) + if (this.appOptions.canBrandingExt) { Common.Utils.applyCustomization(this.appOptions.customization, mapCustomizationExtElements); + Common.Utils.applyCustomizationPlugins(this.UICustomizePlugins); + } } Common.NotificationCenter.trigger('layout:changed', 'main'); @@ -1803,8 +1813,11 @@ define([ if (url) this.iframePrint.src = url; }, - updatePlugins: function(plugins) { // plugins from config - if (!plugins || !plugins.pluginsData || plugins.pluginsData.length<1) return; + updatePlugins: function(plugins, uiCustomize) { // plugins from config + if (!plugins) return; + + var pluginsData = (uiCustomize) ? plugins.UIpluginsData : plugins.pluginsData; + if (!pluginsData || pluginsData.length<1) return; var _createXMLHTTPObject = function() { var xmlhttp; @@ -1842,7 +1855,7 @@ define([ var arr = [], baseUrl = plugins.url; - plugins.pluginsData.forEach(function(item){ + pluginsData.forEach(function(item){ var url = item; if (!/(^https?:\/\/)/i.test(url) && !/(^www.)/i.test(item)) url = baseUrl + item; @@ -1855,14 +1868,14 @@ define([ autoStartGuid: plugins.autoStartGuid, url: plugins.url, pluginsData: arr - }); + }, !!uiCustomize); }, - updatePluginsList: function(plugins) { + updatePluginsList: function(plugins, uiCustomize) { var pluginStore = this.getApplication().getCollection('Common.Collections.Plugins'), isEdit = this.appOptions.isEdit; - if (pluginStore && plugins) { - var arr = []; + if (plugins) { + var arr = [], arrUI = []; plugins.pluginsData.forEach(function(item){ var variations = item.variations, variationsArr = []; @@ -1873,7 +1886,9 @@ define([ isSupported = true; break; } } - if (isSupported && (isEdit || itemVar.isViewer)) + if (isSupported && (isEdit || itemVar.isViewer)) { + var isRelativeUrl = !(/(^https?:\/\/)/i.test(itemVar.url) || /(^www.)/i.test(itemVar.url)); + item.isUICustomizer ? arrUI.push((isRelativeUrl) ? ((item.baseUrl ? item.baseUrl : plugins.url) + itemVar.url) : itemVar.url) : variationsArr.push(new Common.Models.PluginVariation({ description: itemVar.description, index: variationsArr.length, @@ -1890,10 +1905,11 @@ define([ buttons: itemVar.buttons, size: itemVar.size, initOnSelectionChanged: itemVar.initOnSelectionChanged, - isRelativeUrl: !(/(^https?:\/\/)/i.test(itemVar.url) || /(^www.)/i.test(itemVar.url)) + isRelativeUrl: isRelativeUrl })); + } }); - if (variationsArr.length>0) + if (variationsArr.length>0 && !item.isUICustomizer) arr.push(new Common.Models.Plugin({ name : item.name, guid: item.guid, @@ -1903,11 +1919,15 @@ define([ })); }); - pluginStore.reset(arr); + if (uiCustomize!==false) // from ui customizer in editor config or desktop event + this.UICustomizePlugins = arrUI; - this.appOptions.pluginsPath = (plugins.url); - this.appOptions.canPlugins = (arr.length>0); - } else { + if (!uiCustomize) { + if (pluginStore) pluginStore.reset(arr); + this.appOptions.pluginsPath = (plugins.url); + this.appOptions.canPlugins = (arr.length>0); + } + } else if (!uiCustomize){ this.appOptions.pluginsPath = ''; this.appOptions.canPlugins = false; } @@ -1916,7 +1936,7 @@ define([ if (plugins.autoStartGuid) this.api.asc_pluginRun(plugins.autoStartGuid, 0, ''); } - this.getApplication().getController('LeftMenu').enablePlugins(); + if (!uiCustomize) this.getApplication().getController('LeftMenu').enablePlugins(); }, leavePageText: 'You have unsaved changes in this document. Click \'Stay on this Page\' then \'Save\' to save them. Click \'Leave this Page\' to discard all the unsaved changes.', diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js index b0ed3b324..0ad390839 100644 --- a/apps/presentationeditor/main/app/controller/Main.js +++ b/apps/presentationeditor/main/app/controller/Main.js @@ -142,6 +142,7 @@ define([ this.editorConfig = {}; this.appOptions = {}; this.plugins = undefined; + this.UICustomizePlugins = []; Common.Gateway.on('init', _.bind(this.loadConfig, this)); Common.Gateway.on('showmessage', _.bind(this.onExternalMessage, this)); Common.Gateway.on('opendocument', _.bind(this.loadDocument, this)); @@ -639,7 +640,7 @@ define([ application.getController('Common.Controllers.ExternalDiagramEditor').setApi(this.api).loadConfig({config:this.editorConfig, customization: this.editorConfig.customization}); pluginsController.setApi(me.api); - me.updatePlugins(me.plugins); + me.updatePlugins(me.plugins, false); me.api.asc_registerCallback('asc_onPluginsInit', _.bind(me.updatePluginsList, me)); documentHolderController.setApi(me.api); @@ -686,9 +687,14 @@ define([ if (me.needToUpdateVersion) toolbarController.onApiCoAuthoringDisconnect(); me.api.UpdateInterfaceState(); + + if (me.appOptions.canBrandingExt) + Common.NotificationCenter.trigger('document:ready', 'main'); } }, 50); - } + } else if (me.appOptions.canBrandingExt) + Common.NotificationCenter.trigger('document:ready', 'main'); + if (this.appOptions.canAnalytics && false) Common.component.Analytics.initialize('UA-12442749-13', 'Presentation Editor'); @@ -778,7 +784,9 @@ define([ params.asc_getTrial() && headerView.setDeveloperMode(true); this.appOptions.canRename && headerView.setCanRename(true); - this.appOptions.canBrandingExt = params.asc_getCanBranding() && (typeof this.editorConfig.customization == 'object'); + this.appOptions.canBrandingExt = params.asc_getCanBranding() && (typeof this.editorConfig.customization == 'object' || this.editorConfig.plugins); + if (this.appOptions.canBrandingExt) + this.updatePlugins(this.plugins, true); this.applyModeCommonElements(); this.applyModeEditorElements(); @@ -1217,13 +1225,15 @@ define([ }, hidePreloader: function() { - if (!!this.appOptions.customization && !this.appOptions.customization.done) { - this.appOptions.customization.done = true; - if (!this.appOptions.isDesktopApp) + if (!this._state.customizationDone) { + this._state.customizationDone = true; + if (this.appOptions.customization && !this.appOptions.isDesktopApp) this.appOptions.customization.about = true; Common.Utils.applyCustomization(this.appOptions.customization, mapCustomizationElements); - if (this.appOptions.canBrandingExt) + if (this.appOptions.canBrandingExt) { Common.Utils.applyCustomization(this.appOptions.customization, mapCustomizationExtElements); + Common.Utils.applyCustomizationPlugins(this.UICustomizePlugins); + } } Common.NotificationCenter.trigger('layout:changed', 'main'); @@ -1581,8 +1591,11 @@ define([ } }, - updatePlugins: function(plugins) { // plugins from config - if (!plugins || !plugins.pluginsData || plugins.pluginsData.length<1) return; + updatePlugins: function(plugins, uiCustomize) { // plugins from config + if (!plugins) return; + + var pluginsData = (uiCustomize) ? plugins.UIpluginsData : plugins.pluginsData; + if (!pluginsData || pluginsData.length<1) return; var _createXMLHTTPObject = function() { var xmlhttp; @@ -1620,7 +1633,7 @@ define([ var arr = [], baseUrl = plugins.url; - plugins.pluginsData.forEach(function(item){ + pluginsData.forEach(function(item){ var url = item; if (!/(^https?:\/\/)/i.test(url) && !/(^www.)/i.test(item)) url = baseUrl + item; @@ -1633,14 +1646,14 @@ define([ autoStartGuid: plugins.autoStartGuid, url: plugins.url, pluginsData: arr - }); + }, !!uiCustomize); }, - updatePluginsList: function(plugins) { + updatePluginsList: function(plugins, uiCustomize) { var pluginStore = this.getApplication().getCollection('Common.Collections.Plugins'), isEdit = this.appOptions.isEdit; - if (pluginStore && plugins) { - var arr = []; + if (plugins) { + var arr = [], arrUI = []; plugins.pluginsData.forEach(function(item){ var variations = item.variations, variationsArr = []; @@ -1651,7 +1664,9 @@ define([ isSupported = true; break; } } - if (isSupported && (isEdit || itemVar.isViewer)) + if (isSupported && (isEdit || itemVar.isViewer)){ + var isRelativeUrl = !(/(^https?:\/\/)/i.test(itemVar.url) || /(^www.)/i.test(itemVar.url)); + item.isUICustomizer ? arrUI.push((isRelativeUrl) ? ((item.baseUrl ? item.baseUrl : plugins.url) + itemVar.url) : itemVar.url) : variationsArr.push(new Common.Models.PluginVariation({ description: itemVar.description, index: variationsArr.length, @@ -1668,10 +1683,11 @@ define([ buttons: itemVar.buttons, size: itemVar.size, initOnSelectionChanged: itemVar.initOnSelectionChanged, - isRelativeUrl: !(/(^https?:\/\/)/i.test(itemVar.url) || /(^www.)/i.test(itemVar.url)) + isRelativeUrl: isRelativeUrl })); + } }); - if (variationsArr.length>0) + if (variationsArr.length>0 && !item.isUICustomizer) arr.push(new Common.Models.Plugin({ name : item.name, guid: item.guid, @@ -1681,11 +1697,15 @@ define([ })); }); - pluginStore.reset(arr); + if (uiCustomize!==false) // from ui customizer in editor config or desktop event + this.UICustomizePlugins = arrUI; - this.appOptions.pluginsPath = (plugins.url); - this.appOptions.canPlugins = (arr.length>0); - } else { + if (!uiCustomize) { + if (pluginStore) pluginStore.reset(arr); + this.appOptions.pluginsPath = (plugins.url); + this.appOptions.canPlugins = (arr.length>0); + } + } else if (!uiCustomize){ this.appOptions.pluginsPath = ''; this.appOptions.canPlugins = false; } @@ -1694,7 +1714,7 @@ define([ if (plugins.autoStartGuid) this.api.asc_pluginRun(plugins.autoStartGuid, 0, ''); } - this.getApplication().getController('LeftMenu').enablePlugins(); + if (!uiCustomize) this.getApplication().getController('LeftMenu').enablePlugins(); }, // Translation diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index fe6cca645..088ba7d10 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -147,6 +147,7 @@ define([ // Initialize api gateway this.editorConfig = {}; this.plugins = undefined; + this.UICustomizePlugins = []; Common.Gateway.on('init', _.bind(this.loadConfig, this)); Common.Gateway.on('showmessage', _.bind(this.onExternalMessage, this)); Common.Gateway.on('opendocument', _.bind(this.loadDocument, this)); @@ -620,7 +621,7 @@ define([ if (!me.appOptions.isEditMailMerge && !me.appOptions.isEditDiagram) { pluginsController.setApi(me.api); - me.updatePlugins(me.plugins); + me.updatePlugins(me.plugins, false); me.api.asc_registerCallback('asc_onPluginsInit', _.bind(me.updatePluginsList, me)); } @@ -692,9 +693,13 @@ define([ } if (me.needToUpdateVersion) toolbarController.onApiCoAuthoringDisconnect(); + + if (me.appOptions.canBrandingExt) + Common.NotificationCenter.trigger('document:ready', 'main'); } }, 50); - } + } else if (me.appOptions.canBrandingExt) + Common.NotificationCenter.trigger('document:ready', 'main'); if (me.appOptions.canAnalytics && false) Common.component.Analytics.initialize('UA-12442749-13', 'Spreadsheet Editor'); @@ -790,7 +795,9 @@ define([ if (this.appOptions.canBranding) this.headerView.setBranding(this.editorConfig.customization); - this.appOptions.canBrandingExt = params.asc_getCanBranding() && (typeof this.editorConfig.customization == 'object'); + this.appOptions.canBrandingExt = params.asc_getCanBranding() && (typeof this.editorConfig.customization == 'object' || this.editorConfig.plugins); + if (this.appOptions.canBrandingExt) + this.updatePlugins(this.plugins, true); params.asc_getTrial() && this.headerView.setDeveloperMode(true); this.appOptions.canRename && this.headerView.setCanRename(true); @@ -1356,13 +1363,15 @@ define([ }, hidePreloader: function() { - if (!!this.appOptions.customization && !this.appOptions.customization.done) { - this.appOptions.customization.done = true; - if (!this.appOptions.isDesktopApp) + if (!this._state.customizationDone) { + this._state.customizationDone = true; + if (this.appOptions.customization && !this.appOptions.isDesktopApp) this.appOptions.customization.about = true; Common.Utils.applyCustomization(this.appOptions.customization, mapCustomizationElements); - if (this.appOptions.canBrandingExt) + if (this.appOptions.canBrandingExt) { Common.Utils.applyCustomization(this.appOptions.customization, mapCustomizationExtElements); + Common.Utils.applyCustomizationPlugins(this.UICustomizePlugins); + } } this.stackLongActions.pop({id: InitApplication, type: Asc.c_oAscAsyncActionType.BlockInteraction}); @@ -1807,8 +1816,11 @@ define([ if (url) this.iframePrint.src = url; }, - updatePlugins: function(plugins) { // plugins from config - if (!plugins || !plugins.pluginsData || plugins.pluginsData.length<1) return; + updatePlugins: function(plugins, uiCustomize) { // plugins from config + if (!plugins) return; + + var pluginsData = (uiCustomize) ? plugins.UIpluginsData : plugins.pluginsData; + if (!pluginsData || pluginsData.length<1) return; var _createXMLHTTPObject = function() { var xmlhttp; @@ -1846,7 +1858,7 @@ define([ var arr = [], baseUrl = plugins.url; - plugins.pluginsData.forEach(function(item){ + pluginsData.forEach(function(item){ var url = item; if (!/(^https?:\/\/)/i.test(url) && !/(^www.)/i.test(item)) url = baseUrl + item; @@ -1859,14 +1871,14 @@ define([ autoStartGuid: plugins.autoStartGuid, url: plugins.url, pluginsData: arr - }); + }, !!uiCustomize); }, - updatePluginsList: function(plugins) { + updatePluginsList: function(plugins, uiCustomize) { var pluginStore = this.getApplication().getCollection('Common.Collections.Plugins'), isEdit = this.appOptions.isEdit; - if (pluginStore && plugins) { - var arr = []; + if (plugins) { + var arr = [], arrUI = []; plugins.pluginsData.forEach(function(item){ var variations = item.variations, variationsArr = []; @@ -1877,7 +1889,9 @@ define([ isSupported = true; break; } } - if (isSupported && (isEdit || itemVar.isViewer)) + if (isSupported && (isEdit || itemVar.isViewer)) { + var isRelativeUrl = !(/(^https?:\/\/)/i.test(itemVar.url) || /(^www.)/i.test(itemVar.url)); + item.isUICustomizer ? arrUI.push((isRelativeUrl) ? ((item.baseUrl ? item.baseUrl : plugins.url) + itemVar.url) : itemVar.url) : variationsArr.push(new Common.Models.PluginVariation({ description: itemVar.description, index: variationsArr.length, @@ -1894,10 +1908,11 @@ define([ buttons: itemVar.buttons, size: itemVar.size, initOnSelectionChanged: itemVar.initOnSelectionChanged, - isRelativeUrl: !(/(^https?:\/\/)/i.test(itemVar.url) || /(^www.)/i.test(itemVar.url)) + isRelativeUrl: isRelativeUrl })); + } }); - if (variationsArr.length>0) + if (variationsArr.length>0 && !item.isUICustomizer) arr.push(new Common.Models.Plugin({ name : item.name, guid: item.guid, @@ -1907,11 +1922,15 @@ define([ })); }); - pluginStore.reset(arr); + if (uiCustomize!==false) // from ui customizer in editor config or desktop event + this.UICustomizePlugins = arrUI; - this.appOptions.pluginsPath = (plugins.url); - this.appOptions.canPlugins = (arr.length>0); - } else { + if (!uiCustomize) { + if (pluginStore) pluginStore.reset(arr); + this.appOptions.pluginsPath = (plugins.url); + this.appOptions.canPlugins = (arr.length>0); + } + } else if (!uiCustomize){ this.appOptions.pluginsPath = ''; this.appOptions.canPlugins = false; } @@ -1920,7 +1939,7 @@ define([ if (plugins.autoStartGuid) this.api.asc_pluginRun(plugins.autoStartGuid, 0, ''); } - this.getApplication().getController('LeftMenu').enablePlugins(); + if (!uiCustomize) this.getApplication().getController('LeftMenu').enablePlugins(); }, leavePageText: 'You have unsaved changes in this document. Click \'Stay on this Page\' then \'Save\' to save them. Click \'Leave this Page\' to discard all the unsaved changes.', From d325acee079ff4bf255ba64b27a73fdeca2b9ba7 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 1 Feb 2017 21:38:26 +0300 Subject: [PATCH 2/9] [DE] Add languages for spellchecker. --- apps/common/main/lib/util/LanguageInfo.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/common/main/lib/util/LanguageInfo.js b/apps/common/main/lib/util/LanguageInfo.js index 618868ead..25c078385 100644 --- a/apps/common/main/lib/util/LanguageInfo.js +++ b/apps/common/main/lib/util/LanguageInfo.js @@ -100,6 +100,7 @@ Common.util.LanguageInfo = new(function() { 0x0402 : ["bg-BG", "Български (България)"], 0x0003 : ["ca", "Català"], 0x0403 : ["ca-ES", "Català (Català)"], + 0x0803 : ["ca-ES-valencia", "Català (Valencià)"], 0x7804 : ["zh", "中文"], 0x0004 : ["zh-Hans", "中文(简体)"], 0x0804 : ["zh-CN", "中文(中华人民共和国)"], @@ -315,7 +316,7 @@ Common.util.LanguageInfo = new(function() { 0x181A : ["sr-Latn-BA", "Srpski (Bosna i Hercegovina)"], 0x2C1A : ["sr-Latn-ME", "Srpski (Crna Gora)"], 0x081A : ["sr-Latn-CS", "Srpski (Srbija i Crna Gora (Prethodno))"], - 0x241A : ["sr-Latn-RS", "Srpski (Srbija)"], + 0x241A : ["sr-Latn-RS", "Srpski (Srbija, Latinica)"], 0x006C : ["nso", "Sesotho sa Leboa"], 0x046C : ["nso-ZA", "Sesotho sa Leboa (Afrika Borwa)"], 0x0032 : ["tn", "Setswana"], From e09e52be9365cad66aae3bfbea242bf3b11c4ea5 Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Thu, 2 Feb 2017 18:04:42 +0300 Subject: [PATCH 3/9] [mobile] debug deployment --- build/Gruntfile.js | 29 +++++++++++++++++++++++++---- build/package.json | 2 +- build/spreadsheeteditor.json | 6 ++++++ 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/build/Gruntfile.js b/build/Gruntfile.js index 73885594d..a5dd7e8a8 100644 --- a/build/Gruntfile.js +++ b/build/Gruntfile.js @@ -247,7 +247,8 @@ module.exports = function(grunt) { }, cssmin: { - styles: { + // options: {level: { 1: { roundingPrecision: 'all=3' }}}, // to round fw7 numbers in styles. need clean-css 4.0 + target: { files: { "<%= pkg.mobile.css.ios.dist %>" : packageFile['mobile']['css']['ios']['src'], "<%= pkg.mobile.css.material.dist %>" : packageFile['mobile']['css']['material']['src'] @@ -293,6 +294,19 @@ module.exports = function(grunt) { return packageFile.version; } }] + }, + fixResourceUrl: { + src: ['<%= pkg.mobile.js.requirejs.options.out %>', + '<%= pkg.mobile.css.ios.dist %>', + '<%= pkg.mobile.css.material.dist %>'], + overwrite: true, + replacements: [{ + from: /(?:\.{2}\/){4}common\/mobile\/resources\/img/g, + to: '../img' + },{ + from: /(?:\.{2}\/){2}common\/mobile/g, + to: '../mobile' + }] } } }); @@ -367,9 +381,16 @@ module.exports = function(grunt) { grunt.registerTask('deploy-jsrsasign', ['jsrsasign-init', 'clean', 'copy']); grunt.registerTask('deploy-requirejs', ['requirejs-init', 'clean', 'uglify']); - grunt.registerTask('deploy-app-main', ['main-app-init', 'clean', 'imagemin', 'less', 'requirejs', 'concat', 'copy', 'replace:writeVersion']); - grunt.registerTask('deploy-app-mobile', ['mobile-app-init', 'clean:deploy', 'cssmin:styles', 'copy:template-backup', 'htmlmin', 'requirejs', 'concat', 'copy:template-restore', 'clean:template-backup', 'copy:localization', 'copy:index-page', 'copy:images-app', 'replace:writeVersion']); - grunt.registerTask('deploy-app-embed', ['embed-app-init', 'clean:prebuild', 'uglify', 'less', 'copy', 'clean:postbuild']); + grunt.registerTask('deploy-app-main', ['main-app-init', 'clean', 'imagemin', 'less', 'requirejs', 'concat', + 'copy', 'replace:writeVersion']); + + grunt.registerTask('deploy-app-mobile', ['mobile-app-init', 'clean:deploy', 'cssmin', 'copy:template-backup', + 'htmlmin', 'requirejs', 'concat', 'copy:template-restore', + 'clean:template-backup', 'copy:localization', 'copy:index-page', + 'copy:images-app', 'replace:writeVersion', 'replace:fixResourceUrl']); + + grunt.registerTask('deploy-app-embed', ['embed-app-init', 'clean:prebuild', 'uglify', 'less', 'copy', + 'clean:postbuild']); doRegisterInitializeAppTask('documenteditor', 'DocumentEditor', 'documenteditor.json'); diff --git a/build/package.json b/build/package.json index e11d90655..e30af30dc 100644 --- a/build/package.json +++ b/build/package.json @@ -20,7 +20,7 @@ "grunt-contrib-uglify": "^0.8.1", "grunt-contrib-concat": "^0.5.1", "grunt-contrib-imagemin": "^1.0.0", - "grunt-contrib-cssmin": "^0.12.2", + "grunt-contrib-cssmin": "^1.0.0", "grunt-contrib-htmlmin": "^2.0.0", "vinyl-fs": "2.2.1", "less-plugin-clean-css": "1.5.0" diff --git a/build/spreadsheeteditor.json b/build/spreadsheeteditor.json index cf310b5b3..29b178747 100644 --- a/build/spreadsheeteditor.json +++ b/build/spreadsheeteditor.json @@ -396,6 +396,12 @@ { "expand": true, "cwd": "../apps/spreadsheeteditor/mobile/resources/img/", + "src": "**/*.png", + "dest": "../deploy/web-apps/apps/spreadsheeteditor/mobile/resources/img/" + }, + { + "expand": true, + "cwd": "../apps/common/mobile/resources/img/", "src": "**", "dest": "../deploy/web-apps/apps/spreadsheeteditor/mobile/resources/img/" } From 15d09b07332b71dea5a49446f6a04647afb55dad Mon Sep 17 00:00:00 2001 From: Alexander Yuzhin Date: Fri, 3 Feb 2017 11:42:53 +0300 Subject: [PATCH 4/9] [DE/PE mobile] Fixed display context menu for deploy version. --- .../mobile/app/controller/DocumentHolder.js | 5 +++++ apps/documenteditor/mobile/app/view/DocumentHolder.js | 5 ++++- .../mobile/app/controller/DocumentHolder.js | 9 +++++++-- .../presentationeditor/mobile/app/view/DocumentHolder.js | 4 +++- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/apps/documenteditor/mobile/app/controller/DocumentHolder.js b/apps/documenteditor/mobile/app/controller/DocumentHolder.js index 0c171546b..2e0c9d42a 100644 --- a/apps/documenteditor/mobile/app/controller/DocumentHolder.js +++ b/apps/documenteditor/mobile/app/controller/DocumentHolder.js @@ -86,6 +86,7 @@ define([ me.api.asc_registerCallback('asc_onHideForeignCursorLabel', _.bind(me.onApiHideForeignCursorLabel, me)); me.api.asc_registerCallback('asc_onAuthParticipantsChanged',_.bind(me.onApiUsersChanged, me)); me.api.asc_registerCallback('asc_onConnectionStateChanged', _.bind(me.onApiUserConnection, me)); + me.api.asc_registerCallback('asc_onDocumentContentReady', _.bind(me.onApiDocumentContentReady, me)); me.api.asc_coAuthoringGetUsers(); }, @@ -259,6 +260,10 @@ define([ } }, + onApiDocumentContentReady: function () { + _view = this.createView('DocumentHolder').render(); + }, + // Internal _openLink: function(url) { diff --git a/apps/documenteditor/mobile/app/view/DocumentHolder.js b/apps/documenteditor/mobile/app/view/DocumentHolder.js index b4310296a..c9b3625f4 100644 --- a/apps/documenteditor/mobile/app/view/DocumentHolder.js +++ b/apps/documenteditor/mobile/app/view/DocumentHolder.js @@ -68,7 +68,10 @@ define([ // Render layout render: function() { var el = $(this.el); - el.append(this.template({})); + + if (el.length > 0 && el.find('#' + _anchorId).length < 1) { + el.append(this.template()); + } return this; }, diff --git a/apps/presentationeditor/mobile/app/controller/DocumentHolder.js b/apps/presentationeditor/mobile/app/controller/DocumentHolder.js index 4e4535f0e..34da8550d 100644 --- a/apps/presentationeditor/mobile/app/controller/DocumentHolder.js +++ b/apps/presentationeditor/mobile/app/controller/DocumentHolder.js @@ -77,8 +77,9 @@ define([ me.api = api; - me.api.asc_registerCallback('asc_onShowPopMenu', _.bind(me.onApiShowPopMenu, me)); - me.api.asc_registerCallback('asc_onHidePopMenu', _.bind(me.onApiHidePopMenu, me)); + me.api.asc_registerCallback('asc_onShowPopMenu', _.bind(me.onApiShowPopMenu, me)); + me.api.asc_registerCallback('asc_onHidePopMenu', _.bind(me.onApiHidePopMenu, me)); + me.api.asc_registerCallback('asc_onDocumentContentReady', _.bind(me.onApiDocumentContentReady, me)); }, setMode: function (mode) { @@ -161,6 +162,10 @@ define([ _view && _view.hideMenu(); }, + onApiDocumentContentReady: function () { + _view = this.createView('DocumentHolder').render(); + }, + // Internal _openLink: function(url) { diff --git a/apps/presentationeditor/mobile/app/view/DocumentHolder.js b/apps/presentationeditor/mobile/app/view/DocumentHolder.js index de46fad96..db0377eb8 100644 --- a/apps/presentationeditor/mobile/app/view/DocumentHolder.js +++ b/apps/presentationeditor/mobile/app/view/DocumentHolder.js @@ -68,7 +68,9 @@ define([ // Render layout render: function() { var el = $(this.el); - el.append(this.template({})); + if (el.length > 0 && el.find('#' + _anchorId).length < 1) { + el.append(this.template()); + } return this; }, From bd3f4930db617846d3077762add362c3e9e50adf Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Fri, 3 Feb 2017 19:15:50 +0300 Subject: [PATCH 5/9] [SSE mobile] fix bug 33903 --- apps/spreadsheeteditor/mobile/app/controller/Settings.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/spreadsheeteditor/mobile/app/controller/Settings.js b/apps/spreadsheeteditor/mobile/app/controller/Settings.js index 9f54f5e1c..f93220509 100644 --- a/apps/spreadsheeteditor/mobile/app/controller/Settings.js +++ b/apps/spreadsheeteditor/mobile/app/controller/Settings.js @@ -74,10 +74,10 @@ define([ }); }, - // setApi: function (api) { - // var me = this; - // me.api = api; - // }, + setApi: function (api) { + var me = this; + me.api = api; + }, onLaunch: function () { this.createView('Settings').render(); From 1eae40c65b90896f72a9c4d8547fc3d8a98ea539 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 6 Feb 2017 14:22:34 +0300 Subject: [PATCH 6/9] [SSE] Fix Bug 19709. --- .../main/app/controller/Statusbar.js | 6 ++++ .../main/app/controller/Toolbar.js | 1 + .../main/app/template/StatusBar.template | 4 +++ .../main/app/view/Statusbar.js | 30 ++++++++++++++++++- .../main/resources/less/statusbar.less | 3 +- 5 files changed, 42 insertions(+), 2 deletions(-) diff --git a/apps/spreadsheeteditor/main/app/controller/Statusbar.js b/apps/spreadsheeteditor/main/app/controller/Statusbar.js index 777ad7f0e..61dea8682 100644 --- a/apps/spreadsheeteditor/main/app/controller/Statusbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Statusbar.js @@ -104,6 +104,7 @@ define([ this.api.asc_registerCallback('asc_onWorksheetLocked', _.bind(this.onWorksheetLocked, this)); /** coauthoring end **/ this.api.asc_registerCallback('asc_onError', _.bind(this.onError, this)); + this.api.asc_registerCallback('asc_onFilterInfo', _.bind(this.onApiFilterInfo , this)); this.statusbar.setApi(api); }, @@ -185,6 +186,11 @@ define([ this.statusbar.updateTabbarBorders(); }, + onApiFilterInfo: function(countFilter, countRecords) { + this.statusbar.setFilteredInfo(countFilter, countRecords); + this.statusbar.updateTabbarBorders(); + }, + onApiEditCell: function(state) { var disableAdd = (state == Asc.c_oAscCellEditorState.editFormula), disable = (state != Asc.c_oAscCellEditorState.editEnd), diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js index f9460c963..3a842b476 100644 --- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js @@ -1936,6 +1936,7 @@ define([ need_disable = this._state.controlsdisabled.filters || !filterInfo || (filterInfo.asc_getIsApplyAutoFilter()!==true); toolbar.lockToolbar(SSE.enumLock.ruleDelFilter, need_disable, {array:[toolbar.btnClearAutofilter,toolbar.mnuitemClearFilter]}); + this.getApplication().getController('Statusbar').onApiFilterInfo(!need_disable); this._state.multiselect = info.asc_getFlags().asc_getMultiselect(); toolbar.lockToolbar(SSE.enumLock.multiselect, this._state.multiselect, { array: [toolbar.btnTableTemplate, toolbar.btnInsertHyperlink]}); diff --git a/apps/spreadsheeteditor/main/app/template/StatusBar.template b/apps/spreadsheeteditor/main/app/template/StatusBar.template index edf69d514..adb030fc1 100644 --- a/apps/spreadsheeteditor/main/app/template/StatusBar.template +++ b/apps/spreadsheeteditor/main/app/template/StatusBar.template @@ -39,6 +39,10 @@ +
+
+ +
diff --git a/apps/spreadsheeteditor/main/app/view/Statusbar.js b/apps/spreadsheeteditor/main/app/view/Statusbar.js index d3c237237..2d2bc1859 100644 --- a/apps/spreadsheeteditor/main/app/view/Statusbar.js +++ b/apps/spreadsheeteditor/main/app/view/Statusbar.js @@ -323,6 +323,10 @@ define([ this.labelAverage = $('#status-math-average', this.boxMath); this.boxMath.hide(); + this.boxFiltered = $('#status-filtered-box', this.el); + this.labelFiltered = $('#status-filtered-records', this.boxFiltered); + this.boxFiltered.hide(); + this.boxZoom = $('#status-zoom-box', this.el); this.boxZoom.find('.separator').css('border-left-color','transparent'); @@ -426,6 +430,23 @@ define([ },30); }, + setFilteredInfo: function(countFilter, countRecords) { + if (countFilter>0 && countRecords>0) {//filter is applied + if (!this.boxFiltered.is(':visible')) this.boxFiltered.show(); + this.labelFiltered.text(Common.Utils.String.format(this.filteredRecordsText, countFilter, countRecords)); + } else if (countFilter) {// filter mode + if (!this.boxFiltered.is(':visible')) this.boxFiltered.show(); + this.labelFiltered.text(this.filteredText); + } else { + if (this.boxFiltered.is(':visible')) this.boxFiltered.hide(); + } + + var me = this; + _.delay(function(){ + me.onTabInvisible(undefined, me.tabbar.checkInvisible(true)); + },30); + }, + /** coauthoring begin **/ onUsersClick: function() { this.panelUsers.removeClass('open'); @@ -600,6 +621,11 @@ define([ visible = true; } + if (this.boxFiltered.is(':visible')) { + right += parseInt(this.boxFiltered.css('width')); + visible = true; + } + if (this.panelUsers.is(':visible')) { right += parseInt(this.panelUsers.css('width')); visible = true; @@ -645,7 +671,9 @@ define([ tipUsers : 'Document is currently being edited by several users.', tipAccessRights : 'Manage document access rights', tipViewUsers : 'View users and manage document access rights', - txAccessRights : 'Change access rights' + txAccessRights : 'Change access rights', + filteredRecordsText : '{0} of {1} records filtered', + filteredText : 'Filter mode' }, SSE.Views.Statusbar || {})); diff --git a/apps/spreadsheeteditor/main/resources/less/statusbar.less b/apps/spreadsheeteditor/main/resources/less/statusbar.less index e2b56f51d..bbee52d60 100644 --- a/apps/spreadsheeteditor/main/resources/less/statusbar.less +++ b/apps/spreadsheeteditor/main/resources/less/statusbar.less @@ -119,7 +119,8 @@ height: 25px; } - #status-math-box { + #status-math-box, + #status-filtered-box { float: right; padding-top: 6px; padding-right: 14px; From e441f92b310ef8a35b368e3e3fa4a9a83395b192 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 6 Feb 2017 17:02:11 +0300 Subject: [PATCH 7/9] [SSE] Add alternative text for tables. --- .../main/app/template/TableSettings.template | 4 ++-- apps/spreadsheeteditor/main/app/view/TableSettings.js | 5 ++++- .../main/app/view/TableSettingsAdvanced.js | 10 +++++----- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/apps/spreadsheeteditor/main/app/template/TableSettings.template b/apps/spreadsheeteditor/main/app/template/TableSettings.template index 0e5a32083..76d313084 100644 --- a/apps/spreadsheeteditor/main/app/template/TableSettings.template +++ b/apps/spreadsheeteditor/main/app/template/TableSettings.template @@ -73,12 +73,12 @@
- +
- + diff --git a/apps/spreadsheeteditor/main/app/view/TableSettings.js b/apps/spreadsheeteditor/main/app/view/TableSettings.js index f9430b7e9..8bfa6b075 100644 --- a/apps/spreadsheeteditor/main/app/view/TableSettings.js +++ b/apps/spreadsheeteditor/main/app/view/TableSettings.js @@ -304,7 +304,10 @@ define([ handler: function(result, value) { if (result == 'ok') { if (me.api) { - // me.api.asc_setGraphicObjectProps(value.tableProps); + if (value.tableProps.altTitle) + me.api.asc_changeFormatTableInfo(me._state.TableName, Asc.c_oAscChangeTableStyleInfo.title, value.tableProps.altTitle); + if (value.tableProps.altDescription) + me.api.asc_changeFormatTableInfo(me._state.TableName, Asc.c_oAscChangeTableStyleInfo.description , value.tableProps.altDescription); } } diff --git a/apps/spreadsheeteditor/main/app/view/TableSettingsAdvanced.js b/apps/spreadsheeteditor/main/app/view/TableSettingsAdvanced.js index b49a875ee..1a7f58346 100644 --- a/apps/spreadsheeteditor/main/app/view/TableSettingsAdvanced.js +++ b/apps/spreadsheeteditor/main/app/view/TableSettingsAdvanced.js @@ -106,11 +106,11 @@ define([ 'text!spreadsheeteditor/main/app/template/TableSettingsAdvanced.temp _setDefaults: function(props) { if (props ){ - // var value = props.asc_getTitle(); - // this.inputAltTitle.setValue(value ? value : ''); - // - // value = props.asc_getDescription(); - // this.textareaAltDescription.val(value ? value : ''); + var value = props.asc_getTitle(); + this.inputAltTitle.setValue(value ? value : ''); + + value = props.asc_getDescription(); + this.textareaAltDescription.val(value ? value : ''); } }, From ead4d45e612be4bbbf7ca621e8b63f6370178255 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 6 Feb 2017 17:12:59 +0300 Subject: [PATCH 8/9] [SSE] Bug 32599. --- .../main/app/controller/DocumentHolder.js | 33 ++++++++++++++++--- .../main/app/controller/Toolbar.js | 30 +++++++++++++++-- apps/spreadsheeteditor/main/locale/en.json | 8 +++++ 3 files changed, 64 insertions(+), 7 deletions(-) diff --git a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js index cd7528c4b..c6b114db6 100644 --- a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js +++ b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js @@ -338,10 +338,31 @@ define([ onSortCells: function(menu, item) { if (this.api) { - this.api.asc_sortColFilter(item.value, '', undefined, (item.value==Asc.c_oAscSortOptions.ByColorFill) ? this.documentHolder.ssMenu.cellColor : this.documentHolder.ssMenu.fontColor); + var res = this.api.asc_sortCellsRangeExpand(); + if (res) { + var config = { + width: 500, + title: this.txtSorting, + msg: this.txtExpandSort, + iconCls: 'warn', + buttons: [ {caption: this.txtExpand, primary: true, value: 'expand'}, + {caption: this.txtSortSelected, primary: true, value: 'sort'}, + 'cancel'], + callback: _.bind(function(btn){ + if (btn == 'expand' || btn == 'sort') { + this.api.asc_sortColFilter(item.value, '', undefined, (item.value==Asc.c_oAscSortOptions.ByColorFill) ? this.documentHolder.ssMenu.cellColor : this.documentHolder.ssMenu.fontColor, btn == 'expand'); + } + Common.NotificationCenter.trigger('edit:complete', this.documentHolder); + Common.component.Analytics.trackEvent('DocumentHolder', 'Sort Cells'); + }, this) + }; + Common.UI.alert(config); + } else { + this.api.asc_sortColFilter(item.value, '', undefined, (item.value==Asc.c_oAscSortOptions.ByColorFill) ? this.documentHolder.ssMenu.cellColor : this.documentHolder.ssMenu.fontColor, res !== null); - Common.NotificationCenter.trigger('edit:complete', this.documentHolder); - Common.component.Analytics.trackEvent('DocumentHolder', 'Sort Cells'); + Common.NotificationCenter.trigger('edit:complete', this.documentHolder); + Common.component.Analytics.trackEvent('DocumentHolder', 'Sort Cells'); + } } }, @@ -2299,7 +2320,11 @@ define([ deleteText : 'Delete', deleteRowText : 'Delete Row', deleteColumnText : 'Delete Column', - txtNoChoices: 'There are no choices for filling the cell.
Only text values from the column can be selected for replacement.' + txtNoChoices: 'There are no choices for filling the cell.
Only text values from the column can be selected for replacement.', + txtExpandSort: 'The data next to the selection will not be sorted. Do you want to expand the selection to include the adjacent data or continue with sorting the currently selected cells only?', + txtExpand: 'Expand and sort', + txtSorting: 'Sorting', + txtSortSelected: 'Sort selected' }, SSE.Controllers.DocumentHolder || {})); }); \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js index 3a842b476..38d001d64 100644 --- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js @@ -839,8 +839,27 @@ define([ }, onSortType: function(type, btn) { - if (this.api) - this.api.asc_sortColFilter(type, ''); + if (this.api) { + var res = this.api.asc_sortCellsRangeExpand(); + if (res) { + var config = { + width: 500, + title: this.txtSorting, + msg: this.txtExpandSort, + iconCls: 'warn', + buttons: [ {caption: this.txtExpand, primary: true, value: 'expand'}, + {caption: this.txtSortSelected, primary: true, value: 'sort'}, + 'cancel'], + callback: _.bind(function(btn){ + if (btn == 'expand' || btn == 'sort') { + this.api.asc_sortColFilter(type, '', undefined, undefined, btn == 'expand'); + } + }, this) + }; + Common.UI.alert(config); + } else + this.api.asc_sortColFilter(type, '', undefined, undefined, res !== null); + } }, onSearch: function(type, btn) { @@ -2966,6 +2985,11 @@ define([ txtMatrix_2_2_LineBracket : 'Empty Matrix with Brackets', txtMatrix_2_2_DLineBracket : 'Empty Matrix with Brackets', txtMatrix_Flat_Round : 'Sparse Matrix', - txtMatrix_Flat_Square : 'Sparse Matrix' + txtMatrix_Flat_Square : 'Sparse Matrix', + txtExpandSort: 'The data next to the selection will not be sorted. Do you want to expand the selection to include the adjacent data or continue with sorting the currently selected cells only?', + txtExpand: 'Expand and sort', + txtSorting: 'Sorting', + txtSortSelected: 'Sort selected' + }, SSE.Controllers.Toolbar || {})); }); \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json index dc25078cd..52b663215 100644 --- a/apps/spreadsheeteditor/main/locale/en.json +++ b/apps/spreadsheeteditor/main/locale/en.json @@ -194,6 +194,10 @@ "SSE.Controllers.DocumentHolder.txtTop": "Top", "SSE.Controllers.DocumentHolder.txtUnderbar": "Bar under text", "SSE.Controllers.DocumentHolder.txtWidth": "Width", + "SSE.Controllers.DocumentHolder.txtExpandSort": "The data next to the selection will not be sorted. Do you want to expand the selection to include the adjacent data or continue with sorting the currently selected cells only?", + "SSE.Controllers.DocumentHolder.txtExpand": "Expand and sort", + "SSE.Controllers.DocumentHolder.txtSorting": "Sorting", + "SSE.Controllers.DocumentHolder.txtSortSelected": "Sort selected", "SSE.Controllers.LeftMenu.newDocumentTitle": "Unnamed spreadsheet", "SSE.Controllers.LeftMenu.textByColumns": "By columns", "SSE.Controllers.LeftMenu.textByRows": "By rows", @@ -675,6 +679,10 @@ "SSE.Controllers.Toolbar.txtSymbol_xsi": "Xi", "SSE.Controllers.Toolbar.txtSymbol_zeta": "Zeta", "SSE.Controllers.Toolbar.warnMergeLostData": "Only the data from the upper-left cell will remain in the merged cell.
Are you sure you want to continue?", + "SSE.Controllers.Toolbar.txtExpandSort": "The data next to the selection will not be sorted. Do you want to expand the selection to include the adjacent data or continue with sorting the currently selected cells only?", + "SSE.Controllers.Toolbar.txtExpand": "Expand and sort", + "SSE.Controllers.Toolbar.txtSorting": "Sorting", + "SSE.Controllers.Toolbar.txtSortSelected": "Sort selected", "SSE.Views.AutoFilterDialog.btnCustomFilter": "Custom Filter", "SSE.Views.AutoFilterDialog.cancelButtonText": "Cancel", "SSE.Views.AutoFilterDialog.okButtonText": "OK", From 345ba88cfbe2b14a0645a2ddfb5d09f98013094b Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 6 Feb 2017 17:15:19 +0300 Subject: [PATCH 9/9] [SSE] Add translation for Bug 19709. --- apps/spreadsheeteditor/main/locale/en.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json index 52b663215..ee60dbe08 100644 --- a/apps/spreadsheeteditor/main/locale/en.json +++ b/apps/spreadsheeteditor/main/locale/en.json @@ -1414,6 +1414,8 @@ "SSE.Views.Statusbar.tipZoomOut": "Zoom Out", "SSE.Views.Statusbar.txAccessRights": "Change access rights", "SSE.Views.Statusbar.zoomText": "Zoom {0}%", + "SSE.Views.Statusbar.filteredRecordsText": "{0} of {1} records filtered", + "SSE.Views.Statusbar.filteredText": "Filter mode", "SSE.Views.TableOptionsDialog.errorAutoFilterDataRange": "The operation could not be done for the selected range of cells.
Select a uniform data range different from the existing one and try again.", "SSE.Views.TableOptionsDialog.errorFTChangeTableRangeError": "Operation could not be completed for the selected cell range.
Select a range so that the first table row was on the same row
and the resulting table overlapped the current one.", "SSE.Views.TableOptionsDialog.errorFTRangeIncludedOtherTables": "Operation could not be completed for the selected cell range.
Select a range which does not include other tables.",