From 106afacb6eb57417fc6bbcf334f75eadeca3a113 Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Tue, 23 Jan 2018 20:33:59 +0300 Subject: [PATCH 01/73] [common] added nessesary utils --- apps/common/main/lib/component/Layout.js | 7 +++++++ apps/common/main/lib/util/utils.js | 22 +++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/apps/common/main/lib/component/Layout.js b/apps/common/main/lib/component/Layout.js index bb294def8..3eb230841 100644 --- a/apps/common/main/lib/component/Layout.js +++ b/apps/common/main/lib/component/Layout.js @@ -185,6 +185,13 @@ define([ return parseInt(el.css('width')); }, + getItem: function (alias) { + for (var p in this.panels) { + var panel = this.panels[p]; + if ( panel.alias == alias ) return panel; + } + }, + onSelectStart: function(e) { if (e.preventDefault) e.preventDefault(); return false; diff --git a/apps/common/main/lib/util/utils.js b/apps/common/main/lib/util/utils.js index 45d89d50e..e8f9b7263 100644 --- a/apps/common/main/lib/util/utils.js +++ b/apps/common/main/lib/util/utils.js @@ -735,4 +735,24 @@ String.prototype.strongMatch = function(regExp){ } return false; -}; \ No newline at end of file +}; + +Common.Utils.InternalSettings = new(function() { + var settings = {}; + + var _get = function(name) { + return settings[name]; + }, + _set = function(name, value) { + settings[name] = value; + }; + + return { + get: _get, + set: _set + } +}); + +Common.Utils.InternalSettings.set('toolbar-height-compact', 32); +Common.Utils.InternalSettings.set('toolbar-height-normal', 32+67); +Common.Utils.InternalSettings.set('doc-title-height', 26); \ No newline at end of file From 826ac6aef18c9b217c2d876cc5892aca1458ea2a Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Tue, 23 Jan 2018 20:35:16 +0300 Subject: [PATCH 02/73] new design changes --- apps/common/main/lib/view/Header.js | 8 ++++++ apps/common/main/resources/less/header.less | 25 ++++++++++++++++++- .../main/app/controller/Viewport.js | 12 +++++++-- .../main/app/template/Viewport.template | 3 +++ apps/documenteditor/main/app/view/Viewport.js | 12 +++++++-- .../main/resources/less/toolbar.less | 3 ++- .../main/app/controller/Viewport.js | 10 ++++++-- .../main/app/template/Viewport.template | 3 +++ .../main/app/view/Viewport.js | 18 +++++++++---- .../main/app/controller/Viewport.js | 12 ++++++--- .../main/app/template/Viewport.template | 3 +++ .../main/app/view/Viewport.js | 18 +++++++------ 12 files changed, 104 insertions(+), 23 deletions(-) diff --git a/apps/common/main/lib/view/Header.js b/apps/common/main/lib/view/Header.js index 42fdf831c..eca408c00 100644 --- a/apps/common/main/lib/view/Header.js +++ b/apps/common/main/lib/view/Header.js @@ -414,6 +414,14 @@ define([ $html.find('#slot-btn-back').hide(); this.labelDocName.hide(); + //TODO: for new design representation only + this.labelDocName = $('#box-document-title > #title-doc-name'); + this.labelDocName.text = function (str) {this.val(str);}; + this.labelDocName.text( this.documentCaption ); + + $('.toolbar-fullview-panel').addClass('new-doctitle-offset'); + /***********/ + if ( config.isOffline ) $saveStatus = false; } else { diff --git a/apps/common/main/resources/less/header.less b/apps/common/main/resources/less/header.less index 67c665f3a..af24cab25 100644 --- a/apps/common/main/resources/less/header.less +++ b/apps/common/main/resources/less/header.less @@ -239,4 +239,27 @@ width: 20px; height: 20px; } -} \ No newline at end of file +} + +#box-document-title { + background-color: @tabs-bg-color; + + #title-doc-name { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + text-align: center; + font-size: 12px; + width: 100%; + height: 100%; + + color: #d3d9e3; + background-color: transparent; + border: 0 none; + cursor: default; + } +} + +.toolbar-fullview-panel.new-doctitle-offset { + top: @height-tabs + 26; +} diff --git a/apps/documenteditor/main/app/controller/Viewport.js b/apps/documenteditor/main/app/controller/Viewport.js index fe6907548..b34a955f8 100644 --- a/apps/documenteditor/main/app/controller/Viewport.js +++ b/apps/documenteditor/main/app/controller/Viewport.js @@ -75,7 +75,8 @@ define([ toolbar.setExtra('left', me.header.getPanel('left', config)); }, 'view:compact' : function (toolbar, state) { - me.viewport.vlayout.panels[0].height = state ? 32 : 32+67; + me.viewport.vlayout.getItem('toolbar').height = state ? + Common.Utils.InternalSettings.get('toolbar-height-compact') : Common.Utils.InternalSettings.get('toolbar-height-normal'); } } }); @@ -113,11 +114,18 @@ define([ onAppShowed: function (config) { var me = this; + me.appConfig = config; if ( !config.isEdit || ( !Common.localStorage.itemExists("de-compact-toolbar") && config.customization && config.customization.compactToolbar )) { - me.viewport.vlayout.panels[0].height = 32; + + var panel = me.viewport.vlayout.getItem('toolbar'); + if ( panel ) panel.height = Common.Utils.InternalSettings.get('toolbar-height-compact'); + } + + if ( config.isDesktopApp ) { + me.viewport.vlayout.getItem('doc-title').el.show(); } }, diff --git a/apps/documenteditor/main/app/template/Viewport.template b/apps/documenteditor/main/app/template/Viewport.template index a0d2cb205..2535307dd 100644 --- a/apps/documenteditor/main/app/template/Viewport.template +++ b/apps/documenteditor/main/app/template/Viewport.template @@ -1,5 +1,8 @@
+
+ +
diff --git a/apps/documenteditor/main/app/view/Viewport.js b/apps/documenteditor/main/app/view/Viewport.js index b4547c48a..8c4b6ba1a 100644 --- a/apps/documenteditor/main/app/view/Viewport.js +++ b/apps/documenteditor/main/app/view/Viewport.js @@ -82,10 +82,18 @@ define([ var $container = $('#viewport-vbox-layout', this.$el); this.vlayout = new Common.UI.VBoxLayout({ box: $container, - items: [{ + items: [ + { + el: $container.find(' > .layout-item#box-document-title').hide(), + alias: 'doc-title', + height: Common.Utils.InternalSettings.get('doc-title-height') + }, + { el: $container.find(' > .layout-item#toolbar'), + alias: 'toolbar', // rely: true - height: Common.localStorage.getBool('de-compact-toolbar') ? 32 : 32+67 + height: Common.localStorage.getBool('de-compact-toolbar') ? + Common.Utils.InternalSettings.get('toolbar-height-compact') : Common.Utils.InternalSettings.get('toolbar-height-normal') }, { el: $container.find(' > .layout-item.middle'), stretch: true diff --git a/apps/documenteditor/main/resources/less/toolbar.less b/apps/documenteditor/main/resources/less/toolbar.less index fd84706f4..2b1c918b5 100644 --- a/apps/documenteditor/main/resources/less/toolbar.less +++ b/apps/documenteditor/main/resources/less/toolbar.less @@ -1,5 +1,6 @@ -@tabs-bg-color: #4f6279; +//@tabs-bg-color: #4f6279; +@tabs-bg-color: #446995; #toolbar { //z-index: 101; diff --git a/apps/presentationeditor/main/app/controller/Viewport.js b/apps/presentationeditor/main/app/controller/Viewport.js index 9d90c4485..c07ca3bec 100644 --- a/apps/presentationeditor/main/app/controller/Viewport.js +++ b/apps/presentationeditor/main/app/controller/Viewport.js @@ -76,7 +76,8 @@ define([ toolbar.setExtra('left', me.header.getPanel('left', config)); }, 'view:compact' : function (toolbar, state) { - me.viewport.vlayout.panels[0].height = state ? 32 : 32+67; + me.viewport.vlayout.getItem('toolbar').height = state ? + Common.Utils.InternalSettings.get('toolbar-height-compact') : Common.Utils.InternalSettings.get('toolbar-height-normal'); } }, // Events generated by main view @@ -116,12 +117,17 @@ define([ onAppShowed: function (config) { var me = this; + me.appConfig = config; if ( !config.isEdit || ( !Common.localStorage.itemExists("pe-compact-toolbar") && config.customization && config.customization.compactToolbar )) { - me.viewport.vlayout.panels[0].height = 32; + me.viewport.vlayout.getItem('toolbar').height = Common.Utils.InternalSettings.get('toolbar-height-compact'); + } + + if ( config.isDesktopApp ) { + me.viewport.vlayout.getItem('doc-title').el.show(); } }, diff --git a/apps/presentationeditor/main/app/template/Viewport.template b/apps/presentationeditor/main/app/template/Viewport.template index 2a5121016..40c80aae5 100644 --- a/apps/presentationeditor/main/app/template/Viewport.template +++ b/apps/presentationeditor/main/app/template/Viewport.template @@ -4,6 +4,9 @@
+
+ +
diff --git a/apps/presentationeditor/main/app/view/Viewport.js b/apps/presentationeditor/main/app/view/Viewport.js index e1be9b2d2..20de5b753 100644 --- a/apps/presentationeditor/main/app/view/Viewport.js +++ b/apps/presentationeditor/main/app/view/Viewport.js @@ -85,14 +85,22 @@ define([ var items = $container.find(' > .layout-item'); this.vlayout = new Common.UI.VBoxLayout({ box: $container, - items: [{ - el: items[0], - height: Common.localStorage.getBool('pe-compact-toolbar') ? 32 : 32+67 - }, { + items: [ + { + el: $container.find(' > .layout-item#box-document-title').hide(), + alias: 'doc-title', + height: Common.Utils.InternalSettings.get('doc-title-height') + }, + { el: items[1], - stretch: true + alias: 'toolbar', + height: Common.localStorage.getBool('pe-compact-toolbar') ? + Common.Utils.InternalSettings.get('toolbar-height-compact') : Common.Utils.InternalSettings.get('toolbar-height-normal') }, { el: items[2], + stretch: true + }, { + el: items[3], height: 25 }] }); diff --git a/apps/spreadsheeteditor/main/app/controller/Viewport.js b/apps/spreadsheeteditor/main/app/controller/Viewport.js index 3d2095fc1..412d34df2 100644 --- a/apps/spreadsheeteditor/main/app/controller/Viewport.js +++ b/apps/spreadsheeteditor/main/app/controller/Viewport.js @@ -74,7 +74,8 @@ define([ toolbar.setExtra('left', me.header.getPanel('left', config)); }, 'view:compact' : function (toolbar, state) { - me.viewport.vlayout.panels[0].height = state ? 32 : 32+67; + me.viewport.vlayout.getItem('toolbar').height = state ? + Common.Utils.InternalSettings.get('toolbar-height-compact') : Common.Utils.InternalSettings.get('toolbar-height-normal'); } } }); @@ -88,15 +89,20 @@ define([ onAppShowed: function (config) { var me = this; + me.appConfig = config; if ( !config.isEdit || ( !Common.localStorage.itemExists("sse-compact-toolbar") && config.customization && config.customization.compactToolbar )) { - me.viewport.vlayout.panels[0].height = 32; + me.viewport.vlayout.getItem('toolbar').height = Common.Utils.InternalSettings.get('toolbar-height-compact'); } else if ( config.isEditDiagram || config.isEditMailMerge ) { - me.viewport.vlayout.panels[0].height = 41; + me.viewport.vlayout.getItem('toolbar').height = 41; + } + + if ( config.isDesktopApp ) { + me.viewport.vlayout.getItem('doc-title').el.show(); } }, diff --git a/apps/spreadsheeteditor/main/app/template/Viewport.template b/apps/spreadsheeteditor/main/app/template/Viewport.template index b6c6b4ce5..17a3911e8 100644 --- a/apps/spreadsheeteditor/main/app/template/Viewport.template +++ b/apps/spreadsheeteditor/main/app/template/Viewport.template @@ -1,5 +1,8 @@
+
+ +
diff --git a/apps/spreadsheeteditor/main/app/view/Viewport.js b/apps/spreadsheeteditor/main/app/view/Viewport.js index 86c059741..499bd7b9e 100644 --- a/apps/spreadsheeteditor/main/app/view/Viewport.js +++ b/apps/spreadsheeteditor/main/app/view/Viewport.js @@ -87,16 +87,20 @@ define([ box: $container, items: [ { - // el: items[0], // decorative element for view mode for desktop - // height: 5 - // }, { - el: items[0], - height: Common.localStorage.getBool('sse-compact-toolbar') ? 32 : 32+67 - }, { + el: $container.find(' > .layout-item#box-document-title').hide(), + alias: 'doc-title', + height: Common.Utils.InternalSettings.get('doc-title-height') + }, + { el: items[1], - stretch: true + alias: 'toolbar', + height: Common.localStorage.getBool('sse-compact-toolbar') ? + Common.Utils.InternalSettings.get('toolbar-height-compact') : Common.Utils.InternalSettings.get('toolbar-height-normal') }, { el: items[2], + stretch: true + }, { + el: items[3], height: 25 }] }); From bb36c63c13221b882602f66b96d3d89890efa810 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 24 Jan 2018 13:57:58 +0300 Subject: [PATCH 03/73] [DE] Added print, save, undo, redo buttons and user name to header panel. --- apps/api/documents/api.js | 2 +- apps/common/main/lib/view/Header.js | 89 ++++++++++++++++--- .../main/resources/img/header/buttons.svg | 15 ++++ apps/common/main/resources/less/header.less | 48 +++++++++- .../main/app/controller/Main.js | 1 + .../main/app/controller/Toolbar.js | 5 ++ .../main/app/template/Viewport.template | 10 ++- apps/documenteditor/main/app/view/Toolbar.js | 7 ++ 8 files changed, 161 insertions(+), 16 deletions(-) diff --git a/apps/api/documents/api.js b/apps/api/documents/api.js index 7e18427ef..0299e3a1a 100644 --- a/apps/api/documents/api.js +++ b/apps/api/documents/api.js @@ -358,7 +358,7 @@ if (!!result && result.length) { if (result[1] == 'desktop') { _config.editorConfig.targetApp = result[1]; - _config.editorConfig.canBackToFolder = false; + // _config.editorConfig.canBackToFolder = false; _config.editorConfig.canUseHistory = false; if (!_config.editorConfig.customization) _config.editorConfig.customization = {}; _config.editorConfig.customization.about = false; diff --git a/apps/common/main/lib/view/Header.js b/apps/common/main/lib/view/Header.js index eca408c00..780dda4db 100644 --- a/apps/common/main/lib/view/Header.js +++ b/apps/common/main/lib/view/Header.js @@ -260,6 +260,34 @@ define([ } } + if ( me.btnPrint ) { + me.btnPrint.updateHint(me.tipPrint + Common.Utils.String.platformKey('Ctrl+P')); + me.btnPrint.on('click', function (e) { + me.fireEvent('print', me); + }); + } + + if ( me.btnSave ) { + me.btnSave.updateHint(me.tipSave + Common.Utils.String.platformKey('Ctrl+S')); + me.btnSave.on('click', function (e) { + me.fireEvent('save', me); + }); + } + + if ( me.btnUndo ) { + me.btnUndo.updateHint(me.tipUndo + Common.Utils.String.platformKey('Ctrl+Z')); + me.btnUndo.on('click', function (e) { + me.fireEvent('undo', me); + }); + } + + if ( me.btnRedo ) { + me.btnRedo.updateHint(me.tipRedo + Common.Utils.String.platformKey('Ctrl+Y')); + me.btnRedo.on('click', function (e) { + me.fireEvent('redo', me); + }); + } + if ( !mode.isEdit ) { if ( me.btnDownload ) { me.btnDownload.updateHint(me.tipDownload); @@ -268,13 +296,6 @@ define([ }); } - if ( me.btnPrint ) { - me.btnPrint.updateHint(me.tipPrint + Common.Utils.String.platformKey('Ctrl+P')); - me.btnPrint.on('click', function (e) { - me.fireEvent('print', me); - }); - } - if ( me.btnEdit ) { me.btnEdit.updateHint(me.tipGoEdit); me.btnEdit.on('click', function (e) { @@ -325,6 +346,7 @@ define([ branding: {}, headerCaption: 'Default Caption', documentCaption: '', + userName: '', canBack: false }, @@ -344,6 +366,7 @@ define([ this.headerCaption = this.options.headerCaption; this.documentCaption = this.options.documentCaption; + this.userName = this.options.userName; this.canBack = this.options.canBack; this.branding = this.options.customization; this.isModified = false; @@ -411,7 +434,7 @@ define([ if ( config && config.isDesktopApp ) { $html.addClass('desktop'); - $html.find('#slot-btn-back').hide(); + // $html.find('#slot-btn-back').hide(); this.labelDocName.hide(); //TODO: for new design representation only @@ -419,18 +442,49 @@ define([ this.labelDocName.text = function (str) {this.val(str);}; this.labelDocName.text( this.documentCaption ); + this.labelUserName = $('#box-document-title > #title-user-name'); + this.labelUserName.text( this.userName ); + + if ( config.canPrint ) { + this.btnPrint = new Common.UI.Button({ + cls: 'btn-header', + iconCls: 'svgicon svg-btn-print' + }); + + this.btnPrint.render($('#box-document-title #slot-btn-dt-print')); + } + + this.btnSave = new Common.UI.Button({ + cls: 'btn-header', + iconCls: 'svgicon svg-btn-save' + }); + this.btnSave.render($('#box-document-title #slot-btn-dt-save')); + + this.btnUndo = new Common.UI.Button({ + cls: 'btn-header', + iconCls: 'svgicon svg-btn-undo' + }); + this.btnUndo.render($('#box-document-title #slot-btn-dt-undo')); + + this.btnRedo = new Common.UI.Button({ + cls: 'btn-header', + iconCls: 'svgicon svg-btn-redo' + }); + this.btnRedo.render($('#box-document-title #slot-btn-dt-redo')); + $('.toolbar-fullview-panel').addClass('new-doctitle-offset'); /***********/ if ( config.isOffline ) $saveStatus = false; - } else { + } + // else { if ( this.canBack === true ) { this.btnGoBack.render($html.find('#slot-btn-back')); } else { $html.find('#slot-btn-back').hide(); } - } + // } if ( !config.isEdit ) { if ( (config.canDownload || config.canDownloadOrigin) && !config.isOffline ) { @@ -576,6 +630,16 @@ define([ } }, + setUserName: function (value) { + this.userName = value.fullname; + return value; + }, + + getButton: function(type) { + if (type == 'save') + return this.btnSave; + }, + textBack: 'Go to Documents', txtRename: 'Rename', textSaveBegin: 'Saving...', @@ -588,7 +652,10 @@ define([ tipViewUsers: 'View users and manage document access rights', tipDownload: 'Download file', tipPrint: 'Print file', - tipGoEdit: 'Edit current file' + tipGoEdit: 'Edit current file', + tipSave: 'Save', + tipUndo: 'Undo', + tipRedo: 'Redo' } }(), Common.Views.Header || {})) }); diff --git a/apps/common/main/resources/img/header/buttons.svg b/apps/common/main/resources/img/header/buttons.svg index 28656d8d3..369f84b66 100644 --- a/apps/common/main/resources/img/header/buttons.svg +++ b/apps/common/main/resources/img/header/buttons.svg @@ -32,4 +32,19 @@ + + + + + + + + + + + + diff --git a/apps/common/main/resources/less/header.less b/apps/common/main/resources/less/header.less index af24cab25..4f2db9623 100644 --- a/apps/common/main/resources/less/header.less +++ b/apps/common/main/resources/less/header.less @@ -243,16 +243,62 @@ #box-document-title { background-color: @tabs-bg-color; + display: flex; + + .btn-slot { + display: inline-block; + } + + .btn-header { + height: 26px; + padding: 3px 6px; + + &[disabled], + &.disabled { + opacity: 0.65; + } + + &:hover { + &:not(.disabled) { + background-color: rgba(255,255,255,0.2); + } + } + + &:active { + &:not(.disabled) { + background-color: rgba(0,0,0,0.2); + } + } + } + + svg.icon { + fill: #fff; + } #title-doc-name { + flex-grow: 1; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; text-align: center; font-size: 12px; - width: 100%; height: 100%; + color: #d3d9e3; + background-color: transparent; + border: 0 none; + cursor: default; + } + #title-user-name { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + text-align: right; + font-size: 12px; + width: 150px; + height: 100%; + padding: 4px 12px 4px 0; + color: #d3d9e3; background-color: transparent; border: 0 none; diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index e6ff4095c..ea85aeee7 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -290,6 +290,7 @@ define([ appHeader = this.getApplication().getController('Viewport').getView('Common.Views.Header'); appHeader.setCanBack(this.appOptions.canBackToFolder === true); + appHeader.setUserName(this.appOptions.user); if (this.editorConfig.lang) this.api.asc_setLocale(this.editorConfig.lang); diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index 5175353b7..fc1ca9983 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -119,6 +119,11 @@ define([ var _main = this.getApplication().getController('Main'); _main.onPrint(); }, + 'save': function (opts) { + this.api.asc_Save(); + }, + 'undo': this.onUndo, + 'redo': this.onRedo, 'downloadas': function (opts) { var _main = this.getApplication().getController('Main'); var _file_type = _main.document.fileType, diff --git a/apps/documenteditor/main/app/template/Viewport.template b/apps/documenteditor/main/app/template/Viewport.template index 2535307dd..1a2830b4a 100644 --- a/apps/documenteditor/main/app/template/Viewport.template +++ b/apps/documenteditor/main/app/template/Viewport.template @@ -1,10 +1,14 @@
+
+
+
+
+
+
-
-
- +
diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index 7750149ba..66bbf7273 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -2037,6 +2037,13 @@ define([ this.toolbarControls.push(btnsave); btnsave.setDisabled(this.btnsSave[0].isDisabled()); } + + btnsave = DE.getController('Viewport').getView('Common.Views.Header').getButton('save'); + if (btnsave && this.btnsSave) { + this.btnsSave.push(btnsave); + this.toolbarControls.push(btnsave); + btnsave.setDisabled(this.btnsSave[0].isDisabled()); + } }, onToolbarAfterRender: function(toolbar) { From fc6504f5acc675dc2d401f71dcbda964b0205dcd Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 24 Jan 2018 14:10:33 +0300 Subject: [PATCH 04/73] [PE][SSE] Added print, save, undo, redo buttons and user name to header panel. --- apps/presentationeditor/main/app/controller/Main.js | 1 + .../main/app/controller/Toolbar.js | 5 +++++ .../main/app/template/Viewport.template | 7 +++++++ apps/presentationeditor/main/app/view/Toolbar.js | 6 ++++++ apps/spreadsheeteditor/main/app/controller/Main.js | 1 + .../main/app/controller/Toolbar.js | 5 +++++ .../main/app/template/Viewport.template | 13 ++++++++++--- apps/spreadsheeteditor/main/app/view/Toolbar.js | 5 +++++ 8 files changed, 40 insertions(+), 3 deletions(-) diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js index 7df2dbad6..766a46523 100644 --- a/apps/presentationeditor/main/app/controller/Main.js +++ b/apps/presentationeditor/main/app/controller/Main.js @@ -284,6 +284,7 @@ define([ appHeader = this.getApplication().getController('Viewport').getView('Common.Views.Header'); appHeader.setCanBack(this.appOptions.canBackToFolder === true); + appHeader.setUserName(this.appOptions.user); if (this.editorConfig.lang) this.api.asc_setLocale(this.editorConfig.lang); diff --git a/apps/presentationeditor/main/app/controller/Toolbar.js b/apps/presentationeditor/main/app/controller/Toolbar.js index 96c767fd0..9f6e10f44 100644 --- a/apps/presentationeditor/main/app/controller/Toolbar.js +++ b/apps/presentationeditor/main/app/controller/Toolbar.js @@ -132,6 +132,11 @@ define([ var _main = this.getApplication().getController('Main'); _main.onPrint(); }, + 'save': function (opts) { + this.api.asc_Save(); + }, + 'undo': this.onUndo, + 'redo': this.onRedo, 'downloadas': function (opts) { var _main = this.getApplication().getController('Main'); var _file_type = _main.document.fileType, diff --git a/apps/presentationeditor/main/app/template/Viewport.template b/apps/presentationeditor/main/app/template/Viewport.template index 40c80aae5..faff999e6 100644 --- a/apps/presentationeditor/main/app/template/Viewport.template +++ b/apps/presentationeditor/main/app/template/Viewport.template @@ -5,7 +5,14 @@
+
+
+
+
+
+
+
diff --git a/apps/presentationeditor/main/app/view/Toolbar.js b/apps/presentationeditor/main/app/view/Toolbar.js index d2c80229a..c2778d251 100644 --- a/apps/presentationeditor/main/app/view/Toolbar.js +++ b/apps/presentationeditor/main/app/view/Toolbar.js @@ -1411,6 +1411,12 @@ define([ this.lockControls.push(btnsave); btnsave.setDisabled(this.btnsSave[0].isDisabled()); } + btnsave = PE.getController('Viewport').getView('Common.Views.Header').getButton('save'); + if (btnsave && this.btnsSave) { + this.btnsSave.push(btnsave); + this.lockControls.push(btnsave); + btnsave.setDisabled(this.btnsSave[0].isDisabled()); + } /** coauthoring begin **/ this.showSynchTip = !Common.localStorage.getBool('pe-hide-synch'); diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index 3c2c2ec8a..3b5f02e14 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -305,6 +305,7 @@ define([ this.headerView = this.getApplication().getController('Viewport').getView('Common.Views.Header'); this.headerView.setCanBack(this.appOptions.canBackToFolder === true); + this.headerView.setUserName(this.appOptions.user); var value = Common.localStorage.getItem("sse-settings-reg-settings"); if (value!==null) diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js index 947e2db9d..a55351eb3 100644 --- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js @@ -83,6 +83,11 @@ define([ var _main = this.getApplication().getController('Main'); _main.onPrint(); }, + 'save': function (opts) { + this.api.asc_Save(); + }, + 'undo': this.onUndo, + 'redo': this.onRedo, 'downloadas': function (opts) { var _main = this.getApplication().getController('Main'); var _file_type = _main.appOptions.spreadsheet.fileType, diff --git a/apps/spreadsheeteditor/main/app/template/Viewport.template b/apps/spreadsheeteditor/main/app/template/Viewport.template index 17a3911e8..2f7e2e59b 100644 --- a/apps/spreadsheeteditor/main/app/template/Viewport.template +++ b/apps/spreadsheeteditor/main/app/template/Viewport.template @@ -1,11 +1,18 @@
-
- -
+
+
+
+
+
+
+
+ + +
diff --git a/apps/spreadsheeteditor/main/app/view/Toolbar.js b/apps/spreadsheeteditor/main/app/view/Toolbar.js index ee92da09a..751c842b1 100644 --- a/apps/spreadsheeteditor/main/app/view/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/view/Toolbar.js @@ -1723,6 +1723,11 @@ define([ this.btnsSave.push(btnsave); btnsave.setDisabled(this.btnsSave[0].isDisabled()); } + btnsave = SSE.getController('Viewport').getView('Common.Views.Header').getButton('save'); + if (btnsave && this.btnsSave) { + this.btnsSave.push(btnsave); + btnsave.setDisabled(this.btnsSave[0].isDisabled()); + } }, onToolbarAfterRender: function(toolbar) { From 1cdc4f1e6dd403ed3459eadcf72ff7d91ad8686e Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 24 Jan 2018 17:31:47 +0300 Subject: [PATCH 05/73] [DE] Fix bug with file menu. --- apps/documenteditor/main/app/template/Viewport.template | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/documenteditor/main/app/template/Viewport.template b/apps/documenteditor/main/app/template/Viewport.template index 1a2830b4a..d0c9b55e8 100644 --- a/apps/documenteditor/main/app/template/Viewport.template +++ b/apps/documenteditor/main/app/template/Viewport.template @@ -1,5 +1,8 @@
+
+ +
From 26eae05fa79e8848f13185de06c093b023b3c646 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 24 Jan 2018 17:35:28 +0300 Subject: [PATCH 06/73] Update icons in header. --- .../main/resources/img/header/buttons.svg | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/apps/common/main/resources/img/header/buttons.svg b/apps/common/main/resources/img/header/buttons.svg index 369f84b66..7ee0aa6aa 100644 --- a/apps/common/main/resources/img/header/buttons.svg +++ b/apps/common/main/resources/img/header/buttons.svg @@ -33,18 +33,17 @@ c0.391,0.391,0.391,1.023,0,1.414L15.273,8.598z"/> - - + + + - - + - - + From c5da1082bb19bbba20465b695046b780334d6dfa Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Thu, 25 Jan 2018 11:22:47 +0300 Subject: [PATCH 07/73] set button "back to documents" visible --- apps/api/documents/index.html.desktop | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/api/documents/index.html.desktop b/apps/api/documents/index.html.desktop index 454ad8a28..3b6a293bd 100644 --- a/apps/api/documents/index.html.desktop +++ b/apps/api/documents/index.html.desktop @@ -91,6 +91,9 @@ function getEditorConfig(urlParams) { return { + customization : { + goback: { url:"https://onlyoffice.com" } + }, mode : urlParams["mode"] || 'edit', lang : urlParams["lang"] || 'en', user: { From f328e83a4f1010fcc11d76617f11abd835f2a953 Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Sat, 3 Feb 2018 16:10:38 +0300 Subject: [PATCH 08/73] refactoring --- apps/common/main/lib/view/Header.js | 184 ++++++++---------- apps/common/main/resources/less/header.less | 5 - .../main/app/controller/Main.js | 4 +- .../main/app/controller/Viewport.js | 7 +- .../main/app/template/Viewport.template | 11 +- apps/documenteditor/main/app/view/Viewport.js | 4 +- .../main/app/controller/Main.js | 4 +- .../main/app/controller/Viewport.js | 7 +- .../main/app/template/Viewport.template | 11 +- .../main/app/view/Viewport.js | 4 +- .../main/app/controller/Main.js | 4 +- .../main/app/controller/Viewport.js | 7 +- .../main/app/template/Viewport.template | 11 +- .../main/app/view/Viewport.js | 4 +- 14 files changed, 108 insertions(+), 159 deletions(-) diff --git a/apps/common/main/lib/view/Header.js b/apps/common/main/lib/view/Header.js index 3f94ab154..f19778d6f 100644 --- a/apps/common/main/lib/view/Header.js +++ b/apps/common/main/lib/view/Header.js @@ -71,7 +71,7 @@ define([ var templateRightBox = '
' + '
' + - '' + + '' + '
' + '<%= textSaveEnd %>' + '
' + @@ -102,6 +102,17 @@ define([ '' + '
'; + var templateTitleBox = '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '' + + '' + + '
'; + function onAddUser(model, collection, opts) { if ( $userList ) { var $ul = $userList.find('ul'); @@ -346,9 +357,7 @@ define([ return { options: { branding: {}, - headerCaption: 'Default Caption', documentCaption: '', - userName: '', canBack: false }, @@ -366,10 +375,7 @@ define([ var me = this; this.options = this.options ? _({}).extend(this.options, options) : options; - this.headerCaption = this.options.headerCaption; this.documentCaption = this.options.documentCaption; - this.userName = this.options.userName; - this.canBack = this.options.canBack; this.branding = this.options.customization; this.isModified = false; @@ -399,6 +405,15 @@ define([ }, getPanel: function (role, config) { + var me = this; + + function createTitleButton(iconid, slot) { + return (new Common.UI.Button({ + cls: 'btn-header', + iconCls: 'svgicon ' + iconid + })).render(slot); + } + if ( role == 'left' && (!config || !config.isDesktopApp)) { $html = $(templateLeftBox); this.logo = $html.find('#header-logo'); @@ -417,103 +432,41 @@ define([ textSaveEnd: this.textSaveEnd })); - if ( this.labelDocName ) this.labelDocName.off(); - this.labelDocName = $html.find('#rib-doc-name'); - // this.labelDocName.attr('maxlength', 50); - this.labelDocName.text = function (text) { - this.val(text).attr('size', text.length); - } + if ( !me.labelDocName ) { + me.labelDocName = $html.find('#rib-doc-name'); + // this.labelDocName.attr('maxlength', 50); + me.labelDocName.text = function (text) { + this.val(text).attr('size', text.length); + } - if ( this.documentCaption ) { - this.labelDocName.text( this.documentCaption ); + if ( me.documentCaption ) { + me.labelDocName.text(me.documentCaption); + } } if ( !_.isUndefined(this.options.canRename) ) { this.setCanRename(this.options.canRename); } - $saveStatus = $html.find('#rib-save-status'); - $saveStatus.hide(); + // $saveStatus = $html.find('#rib-save-status'); + $html.find('#rib-save-status').hide(); + // if ( config.isOffline ) $saveStatus = false; - if ( config && config.isDesktopApp ) { - $html.addClass('desktop'); - // $html.find('#slot-btn-back').hide(); - this.labelDocName.hide(); - - //TODO: for new design representation only - this.labelDocName = $('#box-document-title > #title-doc-name'); - this.labelDocName.text = function (str) {this.val(str);}; - this.labelDocName.text( this.documentCaption ); - - this.labelUserName = $('#box-document-title > #title-user-name'); - this.labelUserName.text( this.userName ); - - if ( config.canPrint ) { - this.btnPrint = new Common.UI.Button({ - cls: 'btn-header', - iconCls: 'svgicon svg-btn-print' - }); - - this.btnPrint.render($('#box-document-title #slot-btn-dt-print')); - } - - this.btnSave = new Common.UI.Button({ - cls: 'btn-header', - iconCls: 'svgicon svg-btn-save' - }); - this.btnSave.render($('#box-document-title #slot-btn-dt-save')); - - this.btnUndo = new Common.UI.Button({ - cls: 'btn-header', - iconCls: 'svgicon svg-btn-undo' - }); - this.btnUndo.render($('#box-document-title #slot-btn-dt-undo')); - - this.btnRedo = new Common.UI.Button({ - cls: 'btn-header', - iconCls: 'svgicon svg-btn-redo' - }); - this.btnRedo.render($('#box-document-title #slot-btn-dt-redo')); - - $('.toolbar-fullview-panel').addClass('new-doctitle-offset'); - /***********/ - - if ( config.isOffline ) - $saveStatus = false; + if ( this.options.canBack === true ) { + me.btnGoBack.render($html.find('#slot-btn-back')); + } else { + $html.find('#slot-btn-back').hide(); } - // else { - if ( this.canBack === true ) { - this.btnGoBack.render($html.find('#slot-btn-back')); - } else { - $html.find('#slot-btn-back').hide(); - } - // } if ( !config.isEdit ) { - if ( (config.canDownload || config.canDownloadOrigin) && !config.isOffline ) { - this.btnDownload = new Common.UI.Button({ - cls: 'btn-header', - iconCls: 'svgicon svg-btn-download' - }); + if ( (config.canDownload || config.canDownloadOrigin) && !config.isOffline ) + this.btnDownload = createTitleButton('svg-btn-download', $html.find('#slot-hbtn-download')); - this.btnDownload.render($html.find('#slot-hbtn-download')); - } + if ( config.canPrint ) + this.btnPrint = createTitleButton('svg-btn-print', $html.find('#slot-hbtn-print')); - if ( config.canPrint ) { - this.btnPrint = new Common.UI.Button({ - cls: 'btn-header', - iconCls: 'svgicon svg-btn-print' - }); - - this.btnPrint.render($html.find('#slot-hbtn-print')); - } - - if ( config.canEdit && config.canRequestEditRights ) { - (this.btnEdit = new Common.UI.Button({ - cls: 'btn-header', - iconCls: 'svgicon svg-btn-edit' - })).render($html.find('#slot-hbtn-edit')); - } + if ( config.canEdit && config.canRequestEditRights ) + this.btnEdit = createTitleButton('svg-btn-edit', $html.find('#slot-hbtn-edit')); } $userList = $html.find('.cousers-list'); @@ -522,6 +475,27 @@ define([ $panelUsers.hide(); + return $html; + } else + if ( role == 'title' ) { + var $html = $(_.template(templateTitleBox)()); + + !!me.labelDocName && me.labelDocName.hide().off(); // hide document title if it was created in right box + me.labelDocName = $html.find('> #title-doc-name'); + me.labelDocName.text = function (str) {this.val(str);}; // redefine text function to lock temporaly rename docuemnt option + me.labelDocName.text( me.documentCaption ); + + me.labelUserName = $('> #title-user-name', $html); + me.setUserName(me.options.userName); + + if ( config.canPrint && config.isEdit ) { + me.btnPrint = createTitleButton('svg-btn-print', $('#slot-btn-dt-print', $html)); + } + + me.btnSave = createTitleButton('svg-btn-save', $('#slot-btn-dt-save', $html)); + me.btnUndo = createTitleButton('svg-btn-undo', $('#slot-btn-dt-undo', $html)); + me.btnRedo = createTitleButton('svg-btn-redo', $('#slot-btn-dt-redo', $html)); + return $html; } }, @@ -546,16 +520,6 @@ define([ } }, - setHeaderCaption: function (value) { - this.headerCaption = value; - - return value; - }, - - getHeaderCaption: function () { - return this.headerCaption; - }, - setDocumentCaption: function(value) { !value && (value = ''); @@ -585,13 +549,14 @@ define([ }, setCanBack: function (value) { - this.canBack = value; - + this.options.canBack = value; this.btnGoBack[value ? 'show' : 'hide'](); + + return this; }, getCanBack: function () { - return this.canBack; + return this.options.canBack; }, setCanRename: function (rename) { @@ -642,9 +607,16 @@ define([ } }, - setUserName: function (value) { - this.userName = value.fullname; - return value; + setUserName: function(name) { + if ( !!this.labelUserName ) { + if ( !!name ) { + this.labelUserName.text(name).show(); + } else this.labelUserName.hide(); + } else { + this.options.userName = name; + } + + return this; }, getButton: function(type) { diff --git a/apps/common/main/resources/less/header.less b/apps/common/main/resources/less/header.less index 943f95fb9..ae854c85d 100644 --- a/apps/common/main/resources/less/header.less +++ b/apps/common/main/resources/less/header.less @@ -53,11 +53,6 @@ &.right { flex-grow: 1; min-width: 100px; - - .desktop { - padding: 10px 0; - text-align: right; - } } .status-label { diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index 707d43910..173cce5c6 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -306,8 +306,8 @@ define([ this.plugins = this.editorConfig.plugins; appHeader = this.getApplication().getController('Viewport').getView('Common.Views.Header'); - appHeader.setCanBack(this.appOptions.canBackToFolder === true); - appHeader.setUserName(this.appOptions.user); + appHeader.setCanBack(this.appOptions.canBackToFolder === true) + .setUserName(this.appOptions.user.fullname); if (this.editorConfig.lang) this.api.asc_setLocale(this.editorConfig.lang); diff --git a/apps/documenteditor/main/app/controller/Viewport.js b/apps/documenteditor/main/app/controller/Viewport.js index b34a955f8..ad5398e82 100644 --- a/apps/documenteditor/main/app/controller/Viewport.js +++ b/apps/documenteditor/main/app/controller/Viewport.js @@ -124,8 +124,11 @@ define([ if ( panel ) panel.height = Common.Utils.InternalSettings.get('toolbar-height-compact'); } - if ( config.isDesktopApp ) { - me.viewport.vlayout.getItem('doc-title').el.show(); + if ( config.isDesktopApp && config.isEdit ) { + var $title = me.viewport.vlayout.getItem('title').el; + $title.html(me.header.getPanel('title', config)).show(); + + $('.toolbar-fullview-panel').addClass('new-doctitle-offset'); } }, diff --git a/apps/documenteditor/main/app/template/Viewport.template b/apps/documenteditor/main/app/template/Viewport.template index d0c9b55e8..7b9070236 100644 --- a/apps/documenteditor/main/app/template/Viewport.template +++ b/apps/documenteditor/main/app/template/Viewport.template @@ -3,16 +3,7 @@
-
-
-
-
-
-
-
- - -
+
diff --git a/apps/documenteditor/main/app/view/Viewport.js b/apps/documenteditor/main/app/view/Viewport.js index 8c4b6ba1a..061d4771e 100644 --- a/apps/documenteditor/main/app/view/Viewport.js +++ b/apps/documenteditor/main/app/view/Viewport.js @@ -84,8 +84,8 @@ define([ box: $container, items: [ { - el: $container.find(' > .layout-item#box-document-title').hide(), - alias: 'doc-title', + el: $container.find('> .layout-item#title').hide(), + alias: 'title', height: Common.Utils.InternalSettings.get('doc-title-height') }, { diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js index 0f41bddf4..c1c12a7f6 100644 --- a/apps/presentationeditor/main/app/controller/Main.js +++ b/apps/presentationeditor/main/app/controller/Main.js @@ -287,8 +287,8 @@ define([ this.plugins = this.editorConfig.plugins; appHeader = this.getApplication().getController('Viewport').getView('Common.Views.Header'); - appHeader.setCanBack(this.appOptions.canBackToFolder === true); - appHeader.setUserName(this.appOptions.user); + appHeader.setCanBack(this.appOptions.canBackToFolder === true) + .setUserName(this.appOptions.user.fullname); if (this.editorConfig.lang) this.api.asc_setLocale(this.editorConfig.lang); diff --git a/apps/presentationeditor/main/app/controller/Viewport.js b/apps/presentationeditor/main/app/controller/Viewport.js index c07ca3bec..5a3b09f68 100644 --- a/apps/presentationeditor/main/app/controller/Viewport.js +++ b/apps/presentationeditor/main/app/controller/Viewport.js @@ -126,8 +126,11 @@ define([ me.viewport.vlayout.getItem('toolbar').height = Common.Utils.InternalSettings.get('toolbar-height-compact'); } - if ( config.isDesktopApp ) { - me.viewport.vlayout.getItem('doc-title').el.show(); + if ( config.isDesktopApp && config.isEdit ) { + var $title = me.viewport.vlayout.getItem('title').el; + $title.html(me.header.getPanel('title', config)).show(); + + $('.toolbar-fullview-panel').addClass('new-doctitle-offset'); } }, diff --git a/apps/presentationeditor/main/app/template/Viewport.template b/apps/presentationeditor/main/app/template/Viewport.template index faff999e6..064d0a777 100644 --- a/apps/presentationeditor/main/app/template/Viewport.template +++ b/apps/presentationeditor/main/app/template/Viewport.template @@ -4,16 +4,7 @@
-
-
-
-
-
-
-
- - -
+
diff --git a/apps/presentationeditor/main/app/view/Viewport.js b/apps/presentationeditor/main/app/view/Viewport.js index 20de5b753..521065fb7 100644 --- a/apps/presentationeditor/main/app/view/Viewport.js +++ b/apps/presentationeditor/main/app/view/Viewport.js @@ -87,8 +87,8 @@ define([ box: $container, items: [ { - el: $container.find(' > .layout-item#box-document-title').hide(), - alias: 'doc-title', + el: $container.find('> .layout-item#title').hide(), + alias: 'title', height: Common.Utils.InternalSettings.get('doc-title-height') }, { diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index 96ac05d7f..299461f04 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -309,8 +309,8 @@ define([ this.plugins = this.editorConfig.plugins; this.headerView = this.getApplication().getController('Viewport').getView('Common.Views.Header'); - this.headerView.setCanBack(this.appOptions.canBackToFolder === true); - this.headerView.setUserName(this.appOptions.user); + this.headerView.setCanBack(this.appOptions.canBackToFolder === true) + .setUserName(this.appOptions.user.fullname); var value = Common.localStorage.getItem("sse-settings-reg-settings"); if (value!==null) diff --git a/apps/spreadsheeteditor/main/app/controller/Viewport.js b/apps/spreadsheeteditor/main/app/controller/Viewport.js index 412d34df2..e6f334054 100644 --- a/apps/spreadsheeteditor/main/app/controller/Viewport.js +++ b/apps/spreadsheeteditor/main/app/controller/Viewport.js @@ -101,8 +101,11 @@ define([ me.viewport.vlayout.getItem('toolbar').height = 41; } - if ( config.isDesktopApp ) { - me.viewport.vlayout.getItem('doc-title').el.show(); + if ( config.isDesktopApp && config.isEdit ) { + var $title = me.viewport.vlayout.getItem('title').el; + $title.html(me.header.getPanel('title', config)).show(); + + $('.toolbar-fullview-panel').addClass('new-doctitle-offset'); } }, diff --git a/apps/spreadsheeteditor/main/app/template/Viewport.template b/apps/spreadsheeteditor/main/app/template/Viewport.template index 2f7e2e59b..90a065c83 100644 --- a/apps/spreadsheeteditor/main/app/template/Viewport.template +++ b/apps/spreadsheeteditor/main/app/template/Viewport.template @@ -3,16 +3,7 @@
-
-
-
-
-
-
-
- - -
+
diff --git a/apps/spreadsheeteditor/main/app/view/Viewport.js b/apps/spreadsheeteditor/main/app/view/Viewport.js index 499bd7b9e..70f2e5c3d 100644 --- a/apps/spreadsheeteditor/main/app/view/Viewport.js +++ b/apps/spreadsheeteditor/main/app/view/Viewport.js @@ -87,8 +87,8 @@ define([ box: $container, items: [ { - el: $container.find(' > .layout-item#box-document-title').hide(), - alias: 'doc-title', + el: $container.find('> .layout-item#title').hide(), + alias: 'title', height: Common.Utils.InternalSettings.get('doc-title-height') }, { From d3b23c19f89692fa482c2f35a9bbb2e81ed6e97c Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Tue, 6 Feb 2018 01:01:29 +0300 Subject: [PATCH 09/73] implement changes according to draft design --- apps/common/main/lib/util/utils.js | 2 +- apps/common/main/resources/less/header.less | 76 ++++++++++---------- apps/common/main/resources/less/toolbar.less | 1 + 3 files changed, 38 insertions(+), 41 deletions(-) diff --git a/apps/common/main/lib/util/utils.js b/apps/common/main/lib/util/utils.js index 3dcb5bf85..aa22b54be 100644 --- a/apps/common/main/lib/util/utils.js +++ b/apps/common/main/lib/util/utils.js @@ -772,4 +772,4 @@ Common.Utils.InternalSettings = new(function() { Common.Utils.InternalSettings.set('toolbar-height-compact', 32); Common.Utils.InternalSettings.set('toolbar-height-normal', 32+67); -Common.Utils.InternalSettings.set('doc-title-height', 26); \ No newline at end of file +Common.Utils.InternalSettings.set('doc-title-height', 28); \ No newline at end of file diff --git a/apps/common/main/resources/less/header.less b/apps/common/main/resources/less/header.less index ae854c85d..14e60c00b 100644 --- a/apps/common/main/resources/less/header.less +++ b/apps/common/main/resources/less/header.less @@ -43,7 +43,6 @@ line-height: 20px; height: 100%; display: flex; - align-items: center; } &.left { @@ -80,7 +79,7 @@ #box-doc-name { flex-grow: 1; - text-align: center; + display: flex; } #rib-doc-name { @@ -146,7 +145,6 @@ } #tlb-box-users { - height: @height-tabs; } #tlb-change-rights { @@ -154,9 +152,11 @@ } .btn-users { - display: inline-flex; + display: flex; + align-items: center; cursor: pointer; - padding: 6px 12px; + padding: 0 12px; + height: 100%; .icon { display: inline-block; @@ -230,50 +230,52 @@ .hedset { font-size: 0; + display: flex; } .btn-header { - border: 0 none; - height: @height-tabs; + height: 100%; background-color: transparent; - padding: 6px 12px; + width: 40px; .icon { width: 20px; height: 20px; } + + svg.icon { + display: inline-block; + vertical-align: middle; + } + + .btn&[disabled], + &.disabled { + opacity: 0.65; + } + + &:hover { + &:not(.disabled) { + background-color: rgba(255,255,255,0.2); + } + } + + &:active { + &:not(.disabled) { + background-color: rgba(0,0,0,0.2); + } + } } #box-document-title { background-color: @tabs-bg-color; display: flex; + height: 100%; + color:#fff; .btn-slot { display: inline-block; } - .btn-header { - height: 26px; - padding: 3px 6px; - - &[disabled], - &.disabled { - opacity: 0.65; - } - - &:hover { - &:not(.disabled) { - background-color: rgba(255,255,255,0.2); - } - } - - &:active { - &:not(.disabled) { - background-color: rgba(0,0,0,0.2); - } - } - } - svg.icon { fill: #fff; } @@ -286,8 +288,6 @@ text-align: center; font-size: 12px; height: 100%; - - color: #d3d9e3; background-color: transparent; border: 0 none; cursor: default; @@ -297,15 +297,11 @@ text-overflow: ellipsis; overflow: hidden; text-align: right; - font-size: 12px; - width: 150px; + font-size: 11px; + max-width: 50%; height: 100%; - padding: 4px 12px 4px 0; - - color: #d3d9e3; - background-color: transparent; - border: 0 none; - cursor: default; + padding: 0 12px; + line-height: @height-title; } } diff --git a/apps/common/main/resources/less/toolbar.less b/apps/common/main/resources/less/toolbar.less index 5fc463277..00a4ce170 100644 --- a/apps/common/main/resources/less/toolbar.less +++ b/apps/common/main/resources/less/toolbar.less @@ -1,3 +1,4 @@ +@height-title: 28px; @height-tabs: 32px; @height-controls: 67px; From 14c19f8369b9561cdfdeb4cad10b292cd91a214a Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Wed, 7 Feb 2018 00:55:24 +0300 Subject: [PATCH 10/73] changed toolbar's markup --- apps/common/main/lib/component/Mixtbar.js | 2 +- apps/common/main/resources/less/toolbar.less | 159 +++++++++--------- .../main/app/template/Toolbar.template | 1 - .../main/app/template/Toolbar.template | 1 - .../main/app/template/Toolbar.template | 1 - 5 files changed, 83 insertions(+), 81 deletions(-) diff --git a/apps/common/main/lib/component/Mixtbar.js b/apps/common/main/lib/component/Mixtbar.js index 0edc4d482..89f646ce0 100644 --- a/apps/common/main/lib/component/Mixtbar.js +++ b/apps/common/main/lib/component/Mixtbar.js @@ -257,7 +257,7 @@ define([ return config.tabs[index].action; } - var _tabTemplate = _.template(''); + var _tabTemplate = _.template(''); config.tabs[after + 1] = tab; var _after_action = _get_tab_action(after); diff --git a/apps/common/main/resources/less/toolbar.less b/apps/common/main/resources/less/toolbar.less index 00a4ce170..50d1f9741 100644 --- a/apps/common/main/resources/less/toolbar.less +++ b/apps/common/main/resources/less/toolbar.less @@ -22,11 +22,11 @@ } &:not(.expanded):not(.cover){ - .ribtab.active { - > a { - font-weight: normal; + .ribtab.active { + > a { + font-weight: normal; + } } - } } } @@ -59,90 +59,73 @@ overflow: hidden; display: flex; - > ul { - padding: 0; - margin: 0; - white-space: nowrap; - overflow: hidden; - list-style: none; - font-size: 0; - } - - li { - display: inline-block; - height: 100%; - //background-color: #a6c995; - - position: relative; - .tab-bg { - position: absolute; - height: 28px; - width: 100%; - top: 4px; - background-color: @tabs-bg-color; + > ul { + padding: 4px 0 0; + margin: 0; + white-space: nowrap; + overflow: hidden; + list-style: none; + font-size: 0; } - &:hover { - .tab-bg { + li { + display: inline-flex; + align-items: center; + height: 100%; + + &:hover { background-color: rgba(255,255,255,0.2); } - } - &.active { - .tab-bg { + &.active { background-color: @gray-light; } + + + > a { + display: inline-block; + padding: 0 12px; + text-decoration: none; + cursor: default; + font-size: 12px; + text-align: center; + color: #fff; + } + + &.active { + > a { + color: #444; + } + } } - - > a { - display: inline-block; - line-height: @height-tabs; - height: 100%; - padding: 1px 12px; - text-decoration: none; - cursor: default; - font-size: 12px; - text-align: center; - color: #fff; - - position: relative; - } - - &.active { - > a { - color: #444; + &:not(.short) { + .scroll { + display: none; + } + } + + .scroll { + line-height: @height-tabs; + min-width: 20px; + text-align: center; + z-index: 1; + cursor: pointer; + color: #fff; + + &:hover { + text-decoration: none; + } + + &.left{ + box-shadow: 5px 0 20px 5px @tabs-bg-color + } + &.right{ + box-shadow: -5px 0 20px 5px @tabs-bg-color + } } - } } - &:not(.short) { - .scroll { - display: none; - } - } - - .scroll { - line-height: @height-tabs; - min-width: 20px; - text-align: center; - z-index: 1; - cursor: pointer; - color: #fff; - - &:hover { - text-decoration: none; - } - - &.left{ - box-shadow: 5px 0 20px 5px @tabs-bg-color - } - &.right{ - box-shadow: -5px 0 20px 5px @tabs-bg-color - } - } - } - .box-controls { //height: @height-controls; // button has strange offset in IE when odd height padding: 10px 0; @@ -230,11 +213,33 @@ margin-top: 3px; } } + + .top-title > & { + &:not(.folded) { + height: 28 + @height-controls; + } + + &.folded { + height: 28px; + + &.expanded { + height: 28 + @height-controls; + } + } + + .tabs > ul { + padding-top: 0; + } + + .box-tabs { + height: 28px; + } + } + } .toolbar-fullview-panel { position: absolute; - top: @height-tabs; bottom: 0; width: 100%; z-index: 1041; diff --git a/apps/documenteditor/main/app/template/Toolbar.template b/apps/documenteditor/main/app/template/Toolbar.template index 0cb15cfe0..14e1db5aa 100644 --- a/apps/documenteditor/main/app/template/Toolbar.template +++ b/apps/documenteditor/main/app/template/Toolbar.template @@ -8,7 +8,6 @@
    <% for(var i in tabs) { %>
  • -
  • <% } %> diff --git a/apps/presentationeditor/main/app/template/Toolbar.template b/apps/presentationeditor/main/app/template/Toolbar.template index a66ccad0e..7cae88f91 100644 --- a/apps/presentationeditor/main/app/template/Toolbar.template +++ b/apps/presentationeditor/main/app/template/Toolbar.template @@ -8,7 +8,6 @@
      <% for(var i in tabs) { %>
    • -
    • <% } %> diff --git a/apps/spreadsheeteditor/main/app/template/Toolbar.template b/apps/spreadsheeteditor/main/app/template/Toolbar.template index b4c6605f6..6fc9e087c 100644 --- a/apps/spreadsheeteditor/main/app/template/Toolbar.template +++ b/apps/spreadsheeteditor/main/app/template/Toolbar.template @@ -8,7 +8,6 @@
        <% for(var i in tabs) { %>
      • -
      • <% } %> From c3260dfc385abf968510eb2e2a6562ccc6d52154 Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Wed, 7 Feb 2018 01:37:23 +0300 Subject: [PATCH 11/73] initialized app's strart params --- apps/common/main/lib/util/utils.js | 10 +++++++--- apps/common/main/resources/less/header.less | 4 ---- .../main/app/controller/Viewport.js | 17 +++++++++++++++-- apps/documenteditor/main/app/view/Viewport.js | 8 +++----- .../main/app/controller/Viewport.js | 17 +++++++++++++++-- .../main/app/view/Viewport.js | 8 +++----- .../main/app/controller/Viewport.js | 17 +++++++++++++++-- .../spreadsheeteditor/main/app/view/Viewport.js | 8 +++----- 8 files changed, 61 insertions(+), 28 deletions(-) diff --git a/apps/common/main/lib/util/utils.js b/apps/common/main/lib/util/utils.js index aa22b54be..0619142f6 100644 --- a/apps/common/main/lib/util/utils.js +++ b/apps/common/main/lib/util/utils.js @@ -770,6 +770,10 @@ Common.Utils.InternalSettings = new(function() { } }); -Common.Utils.InternalSettings.set('toolbar-height-compact', 32); -Common.Utils.InternalSettings.set('toolbar-height-normal', 32+67); -Common.Utils.InternalSettings.set('doc-title-height', 28); \ No newline at end of file +Common.Utils.InternalSettings.set('toolbar-height-tabs', 32); +Common.Utils.InternalSettings.set('toolbar-height-tabs-top-title', 28); +Common.Utils.InternalSettings.set('toolbar-height-controls', 67); +Common.Utils.InternalSettings.set('document-title-height', 28); + +Common.Utils.InternalSettings.set('toolbar-height-compact', Common.Utils.InternalSettings.get('toolbar-height-tabs')); +Common.Utils.InternalSettings.set('toolbar-height-normal', Common.Utils.InternalSettings.get('toolbar-height-tabs') + Common.Utils.InternalSettings.get('toolbar-height-controls')); diff --git a/apps/common/main/resources/less/header.less b/apps/common/main/resources/less/header.less index 14e60c00b..73243b7f6 100644 --- a/apps/common/main/resources/less/header.less +++ b/apps/common/main/resources/less/header.less @@ -304,7 +304,3 @@ line-height: @height-title; } } - -.toolbar-fullview-panel.new-doctitle-offset { - top: @height-tabs + 26; -} diff --git a/apps/documenteditor/main/app/controller/Viewport.js b/apps/documenteditor/main/app/controller/Viewport.js index ad5398e82..98281ba0a 100644 --- a/apps/documenteditor/main/app/controller/Viewport.js +++ b/apps/documenteditor/main/app/controller/Viewport.js @@ -116,19 +116,32 @@ define([ var me = this; me.appConfig = config; + var _intvars = Common.Utils.InternalSettings; + var $filemenu = $('.toolbar-fullview-panel'); + $filemenu.css('top', _intvars.get('toolbar-height-tabs')); + if ( !config.isEdit || ( !Common.localStorage.itemExists("de-compact-toolbar") && config.customization && config.customization.compactToolbar )) { var panel = me.viewport.vlayout.getItem('toolbar'); - if ( panel ) panel.height = Common.Utils.InternalSettings.get('toolbar-height-compact'); + if ( panel ) panel.height = _intvars.get('toolbar-height-tabs'); } if ( config.isDesktopApp && config.isEdit ) { var $title = me.viewport.vlayout.getItem('title').el; $title.html(me.header.getPanel('title', config)).show(); - $('.toolbar-fullview-panel').addClass('new-doctitle-offset'); + var toolbar = me.viewport.vlayout.getItem('toolbar'); + toolbar.el.addClass('top-title'); + toolbar.height -= _intvars.get('toolbar-height-tabs') - _intvars.get('toolbar-height-tabs-top-title'); + + var _tabs_new_height = _intvars.get('toolbar-height-tabs-top-title'); + _intvars.set('toolbar-height-tabs', _tabs_new_height); + _intvars.set('toolbar-height-compact', _tabs_new_height); + _intvars.set('toolbar-height-normal', _tabs_new_height + _intvars.get('toolbar-height-controls')); + + $filemenu.css('top', _tabs_new_height + _intvars.get('document-title-height')); } }, diff --git a/apps/documenteditor/main/app/view/Viewport.js b/apps/documenteditor/main/app/view/Viewport.js index 061d4771e..fb1fd87d8 100644 --- a/apps/documenteditor/main/app/view/Viewport.js +++ b/apps/documenteditor/main/app/view/Viewport.js @@ -82,13 +82,11 @@ define([ var $container = $('#viewport-vbox-layout', this.$el); this.vlayout = new Common.UI.VBoxLayout({ box: $container, - items: [ - { + items: [{ el: $container.find('> .layout-item#title').hide(), alias: 'title', - height: Common.Utils.InternalSettings.get('doc-title-height') - }, - { + height: Common.Utils.InternalSettings.get('document-title-height') + }, { el: $container.find(' > .layout-item#toolbar'), alias: 'toolbar', // rely: true diff --git a/apps/presentationeditor/main/app/controller/Viewport.js b/apps/presentationeditor/main/app/controller/Viewport.js index 5a3b09f68..046d7550b 100644 --- a/apps/presentationeditor/main/app/controller/Viewport.js +++ b/apps/presentationeditor/main/app/controller/Viewport.js @@ -119,18 +119,31 @@ define([ var me = this; me.appConfig = config; + var _intvars = Common.Utils.InternalSettings; + var $filemenu = $('.toolbar-fullview-panel'); + $filemenu.css('top', _intvars.get('toolbar-height-tabs')); + if ( !config.isEdit || ( !Common.localStorage.itemExists("pe-compact-toolbar") && config.customization && config.customization.compactToolbar )) { - me.viewport.vlayout.getItem('toolbar').height = Common.Utils.InternalSettings.get('toolbar-height-compact'); + me.viewport.vlayout.getItem('toolbar').height = _intvars.get('toolbar-height-compact'); } if ( config.isDesktopApp && config.isEdit ) { var $title = me.viewport.vlayout.getItem('title').el; $title.html(me.header.getPanel('title', config)).show(); - $('.toolbar-fullview-panel').addClass('new-doctitle-offset'); + var toolbar = me.viewport.vlayout.getItem('toolbar'); + toolbar.el.addClass('top-title'); + toolbar.height -= _intvars.get('toolbar-height-tabs') - _intvars.get('toolbar-height-tabs-top-title'); + + var _tabs_new_height = _intvars.get('toolbar-height-tabs-top-title'); + _intvars.set('toolbar-height-tabs', _tabs_new_height); + _intvars.set('toolbar-height-compact', _tabs_new_height); + _intvars.set('toolbar-height-normal', _tabs_new_height + _intvars.get('toolbar-height-controls')); + + $filemenu.css('top', _tabs_new_height + _intvars.get('document-title-height')); } }, diff --git a/apps/presentationeditor/main/app/view/Viewport.js b/apps/presentationeditor/main/app/view/Viewport.js index 521065fb7..926a4ef3a 100644 --- a/apps/presentationeditor/main/app/view/Viewport.js +++ b/apps/presentationeditor/main/app/view/Viewport.js @@ -85,13 +85,11 @@ define([ var items = $container.find(' > .layout-item'); this.vlayout = new Common.UI.VBoxLayout({ box: $container, - items: [ - { + items: [{ el: $container.find('> .layout-item#title').hide(), alias: 'title', - height: Common.Utils.InternalSettings.get('doc-title-height') - }, - { + height: Common.Utils.InternalSettings.get('document-title-height') + }, { el: items[1], alias: 'toolbar', height: Common.localStorage.getBool('pe-compact-toolbar') ? diff --git a/apps/spreadsheeteditor/main/app/controller/Viewport.js b/apps/spreadsheeteditor/main/app/controller/Viewport.js index e6f334054..dd05bf1ed 100644 --- a/apps/spreadsheeteditor/main/app/controller/Viewport.js +++ b/apps/spreadsheeteditor/main/app/controller/Viewport.js @@ -91,11 +91,15 @@ define([ var me = this; me.appConfig = config; + var _intvars = Common.Utils.InternalSettings; + var $filemenu = $('.toolbar-fullview-panel'); + $filemenu.css('top', _intvars.get('toolbar-height-tabs')); + if ( !config.isEdit || ( !Common.localStorage.itemExists("sse-compact-toolbar") && config.customization && config.customization.compactToolbar )) { - me.viewport.vlayout.getItem('toolbar').height = Common.Utils.InternalSettings.get('toolbar-height-compact'); + me.viewport.vlayout.getItem('toolbar').height = _intvars.get('toolbar-height-compact'); } else if ( config.isEditDiagram || config.isEditMailMerge ) { me.viewport.vlayout.getItem('toolbar').height = 41; @@ -105,7 +109,16 @@ define([ var $title = me.viewport.vlayout.getItem('title').el; $title.html(me.header.getPanel('title', config)).show(); - $('.toolbar-fullview-panel').addClass('new-doctitle-offset'); + var toolbar = me.viewport.vlayout.getItem('toolbar'); + toolbar.el.addClass('top-title'); + toolbar.height -= _intvars.get('toolbar-height-tabs') - _intvars.get('toolbar-height-tabs-top-title'); + + var _tabs_new_height = _intvars.get('toolbar-height-tabs-top-title'); + _intvars.set('toolbar-height-tabs', _tabs_new_height); + _intvars.set('toolbar-height-compact', _tabs_new_height); + _intvars.set('toolbar-height-normal', _tabs_new_height + _intvars.get('toolbar-height-controls')); + + $filemenu.css('top', _tabs_new_height + _intvars.get('document-title-height')); } }, diff --git a/apps/spreadsheeteditor/main/app/view/Viewport.js b/apps/spreadsheeteditor/main/app/view/Viewport.js index 70f2e5c3d..416239c73 100644 --- a/apps/spreadsheeteditor/main/app/view/Viewport.js +++ b/apps/spreadsheeteditor/main/app/view/Viewport.js @@ -85,13 +85,11 @@ define([ var items = $container.find(' > .layout-item'); this.vlayout = new Common.UI.VBoxLayout({ box: $container, - items: [ - { + items: [{ el: $container.find('> .layout-item#title').hide(), alias: 'title', - height: Common.Utils.InternalSettings.get('doc-title-height') - }, - { + height: Common.Utils.InternalSettings.get('document-title-height') + },{ el: items[1], alias: 'toolbar', height: Common.localStorage.getBool('sse-compact-toolbar') ? From 472e5edcb71dc1c1c03f75b8e74e51ce36c0b66e Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Wed, 7 Feb 2018 01:37:40 +0300 Subject: [PATCH 12/73] debug --- apps/spreadsheeteditor/main/app/controller/Main.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index 299461f04..3fd553372 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -913,8 +913,7 @@ define([ statusbarView = app.getController('Statusbar').getView('Statusbar'); if (this.headerView) { - this.headerView.setHeaderCaption(this.appOptions.isEdit ? 'Spreadsheet Editor' : 'Spreadsheet Viewer'); - this.headerView.setVisible(!this.appOptions.nativeApp && !value && !this.appOptions.isEditMailMerge && + this.headerView.setVisible(!this.appOptions.nativeApp && !value && !this.appOptions.isEditMailMerge && !this.appOptions.isDesktopApp && !this.appOptions.isEditDiagram); } From b5a5c9773544180caa1ca1e845bb16df98651d80 Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Wed, 7 Feb 2018 18:30:45 +0300 Subject: [PATCH 13/73] hide some buttons for desktop mode --- .../main/app/controller/Toolbar.js | 21 +++++++++++++----- .../main/app/controller/Toolbar.js | 22 ++++++++++++++----- .../main/app/controller/Toolbar.js | 22 ++++++++++++++----- 3 files changed, 50 insertions(+), 15 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index 765074d53..8343f7f10 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -2768,12 +2768,23 @@ define([ if ( $panel ) me.toolbar.addTab(tab, $panel, 4); - if (config.isDesktopApp && config.isOffline) { - tab = {action: 'protect', caption: me.toolbar.textTabProtect}; - $panel = me.getApplication().getController('Common.Controllers.Protection').createToolbarPanel(); + if ( config.isDesktopApp ) { + // hide 'print' and 'save' buttons group and next separator + me.toolbar.btnPrint.$el.parents('.group').hide().next().hide(); - if ( $panel ) - me.toolbar.addTab(tab, $panel, 5); + // hide 'undo' and 'redo' buttons and get container + var $box = me.toolbar.btnUndo.$el.hide().next().hide().parent(); + + // move 'paste' button to the container instead of 'undo' and 'redo' + me.toolbar.btnPaste.$el.detach().appendTo($box); + me.toolbar.btnCopy.$el.removeClass('split'); + + if ( config.isOffline ) { + tab = {action: 'protect', caption: me.toolbar.textTabProtect}; + $panel = me.getApplication().getController('Common.Controllers.Protection').createToolbarPanel(); + + if ($panel) me.toolbar.addTab(tab, $panel, 5); + } } var links = me.getApplication().getController('Links'); diff --git a/apps/presentationeditor/main/app/controller/Toolbar.js b/apps/presentationeditor/main/app/controller/Toolbar.js index 913546750..4ffa5d50f 100644 --- a/apps/presentationeditor/main/app/controller/Toolbar.js +++ b/apps/presentationeditor/main/app/controller/Toolbar.js @@ -2091,11 +2091,23 @@ define([ if ( $panel ) me.toolbar.addTab(tab, $panel, 3); - if (config.isDesktopApp && config.isOffline) { - tab = {action: 'protect', caption: me.toolbar.textTabProtect}; - $panel = me.getApplication().getController('Common.Controllers.Protection').createToolbarPanel(); - if ( $panel ) - me.toolbar.addTab(tab, $panel, 4); + if ( config.isDesktopApp ) { + // hide 'print' and 'save' buttons group and next separator + me.toolbar.btnPrint.$el.parents('.group').hide().next().hide(); + + // hide 'undo' and 'redo' buttons and get container + var $box = me.toolbar.btnUndo.$el.hide().next().hide().parent(); + + // move 'paste' button to the container instead of 'undo' and 'redo' + me.toolbar.btnPaste.$el.detach().appendTo($box); + me.toolbar.btnCopy.$el.removeClass('split'); + + if ( config.isOffline ) { + tab = {action: 'protect', caption: me.toolbar.textTabProtect}; + $panel = me.getApplication().getController('Common.Controllers.Protection').createToolbarPanel(); + if ($panel) + me.toolbar.addTab(tab, $panel, 4); + } } } }, diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js index 173d7d9b3..0f6d1d44a 100644 --- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js @@ -3054,11 +3054,23 @@ define([ if ( $panel ) me.toolbar.addTab(tab, $panel, 4); - if (config.isDesktopApp && config.isOffline) { - tab = {action: 'protect', caption: me.toolbar.textTabProtect}; - var $panel = me.getApplication().getController('Common.Controllers.Protection').createToolbarPanel(); - if ( $panel ) - me.toolbar.addTab(tab, $panel, 5); + if ( config.isDesktopApp ) { + // hide 'print' and 'save' buttons group and next separator + me.toolbar.btnPrint.$el.parents('.group').hide().next().hide(); + + // hide 'undo' and 'redo' buttons and get container + var $box = me.toolbar.btnUndo.$el.hide().next().hide().parent(); + + // move 'paste' button to the container instead of 'undo' and 'redo' + me.toolbar.btnPaste.$el.detach().appendTo($box); + me.toolbar.btnCopy.$el.removeClass('split'); + + if ( config.isOffline ) { + tab = {action: 'protect', caption: me.toolbar.textTabProtect}; + var $panel = me.getApplication().getController('Common.Controllers.Protection').createToolbarPanel(); + if ($panel) + me.toolbar.addTab(tab, $panel, 5); + } } } } From 753afc350df953316c2b1d1af26939add9465fff Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Tue, 13 Feb 2018 11:23:53 +0300 Subject: [PATCH 14/73] refactoring. send commands to desktop app --- apps/api/documents/index.html.desktop | 24 +++++++++++++++++-- .../main/app/controller/Main.js | 14 +++++++---- .../main/app/controller/Main.js | 18 +++++++++----- .../main/app/controller/Main.js | 14 +++++++---- 4 files changed, 54 insertions(+), 16 deletions(-) diff --git a/apps/api/documents/index.html.desktop b/apps/api/documents/index.html.desktop index 3b6a293bd..03edba6c1 100644 --- a/apps/api/documents/index.html.desktop +++ b/apps/api/documents/index.html.desktop @@ -55,7 +55,12 @@ height: '100%', documentType: urlParams['doctype'] || 'text', document: doc, - editorConfig: cfg + editorConfig: cfg, + events: { + onInternalMessage: onInternalMessage, + onDocumentReady: onDocumentReady + + } }); @@ -92,7 +97,7 @@ function getEditorConfig(urlParams) { return { customization : { - goback: { url:"https://onlyoffice.com" } + goback: { url: "callback" } }, mode : urlParams["mode"] || 'edit', lang : urlParams["lang"] || 'en', @@ -147,6 +152,21 @@ } }; + function onInternalMessage(event) { + let info = event.data; + if ( info.type == 'goback' ) { + if ( window.AscDesktopEditor ) { + window.AscDesktopEditor.execCommand('go:folder', info.data.status); + } + } + }; + + function onDocumentReady() { + if ( window.AscDesktopEditor ) { + window.AscDesktopEditor.execCommand('doc:onready', ''); + } + } + if (isMobile()){ window.addEventListener('load', fixSize); window.addEventListener('resize', fixSize); diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index 173cce5c6..e167c20db 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -582,11 +582,17 @@ define([ }, goBack: function(blank) { - var href = this.appOptions.customization.goback.url; - if (blank) { - window.open(href, "_blank"); + var me = this; + if ( me.appOptions.customization.goback.url == 'callback' ) { + Common.Gateway.internalMessage( 'goback', + {status: me.appOptions.isOffline ? 'offline' : 'online'} ); } else { - parent.location.href = href; + var href = this.appOptions.customization.goback.url; + if (blank) { + window.open(href, "_blank"); + } else { + parent.location.href = href; + } } }, diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js index c1c12a7f6..56a972c43 100644 --- a/apps/presentationeditor/main/app/controller/Main.js +++ b/apps/presentationeditor/main/app/controller/Main.js @@ -393,12 +393,18 @@ define([ }, goBack: function(blank) { - var href = this.appOptions.customization.goback.url; - if (blank) { - window.open(href, "_blank"); - } else { - parent.location.href = href; - } + var me = this; + if ( me.appOptions.customization.goback.url == 'callback' ) { + Common.Gateway.internalMessage( 'goback', + {status: me.appOptions.isOffline ? 'offline' : 'online'} ); + } else { + var href = me.appOptions.customization.goback.url; + if (blank) { + window.open(href, "_blank"); + } else { + parent.location.href = href; + } + } }, onEditComplete: function(cmp) { diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index 3fd553372..23444269e 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -428,11 +428,17 @@ define([ }, goBack: function(blank) { - var href = this.appOptions.customization.goback.url; - if (blank) { - window.open(href, "_blank"); + var me = this; + if ( me.appOptions.customization.goback.url == 'callback' ) { + Common.Gateway.internalMessage( 'goback', + {status: me.appOptions.isOffline ? 'offline' : 'online'} ); } else { - parent.location.href = href; + var href = me.appOptions.customization.goback.url; + if (blank) { + window.open(href, "_blank"); + } else { + parent.location.href = href; + } } }, From 0fb072b9fab0eca92064f28ea39a2af4802aa3b5 Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Tue, 13 Feb 2018 17:37:22 +0300 Subject: [PATCH 15/73] refactoring. created controller for set of buttons --- apps/common/main/lib/component/Button.js | 59 +++++++++++++++++ .../main/app/controller/Toolbar.js | 24 +++---- apps/documenteditor/main/app/view/Toolbar.js | 35 +++-------- .../main/app/controller/Toolbar.js | 6 +- .../main/app/view/Toolbar.js | 63 +++---------------- .../main/app/view/Toolbar.js | 20 ++---- 6 files changed, 87 insertions(+), 120 deletions(-) diff --git a/apps/common/main/lib/component/Button.js b/apps/common/main/lib/component/Button.js index e55b50942..013f7f78e 100644 --- a/apps/common/main/lib/component/Button.js +++ b/apps/common/main/lib/component/Button.js @@ -119,6 +119,65 @@ define([ ], function () { 'use strict'; + window.createButtonSet = function() { + function ButtonsArray(args) {}; + ButtonsArray.prototype = new Array; + ButtonsArray.prototype.constructor = ButtonsArray; + + var _disabled = false; + + ButtonsArray.prototype.add = function(button) { + button.setDisabled(_disabled); + this.push(button); + }; + + ButtonsArray.prototype.setDisabled = function(disable) { + if ( _disabled != disable ) { + _disabled = disable; + + this.forEach( function(button) { + button.setDisabled(disable); + }); + } + }; + + ButtonsArray.prototype.toggle = function(state, suppress) { + this.forEach(function(button) { + button.toggle(state, suppress); + }); + }; + + ButtonsArray.prototype.pressed = function() { + return this.some(function(button) { + return button.pressed; + }); + }; + + ButtonsArray.prototype.contains = function(id) { + return this.some(function(button) { + return button.id == id; + }); + }; + + ButtonsArray.prototype.concat = function () { + var args = Array.prototype.slice.call(arguments); + var result = Array.prototype.slice.call(this); + + args.forEach(function(sub){ + Array.prototype.push.apply(result, sub); + }); + + return result; + } + + var _out_array = Object.create(ButtonsArray.prototype); + for ( var i in arguments ) { + _out_array.add(arguments[i]); + } + + return _out_array; + }; + var templateBtnIcon = '<% if ( iconImg ) { %>' + '' + diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index 8343f7f10..b50f5e651 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -734,7 +734,7 @@ define([ toolbar.mnuInsertPageNum.setDisabled(need_disable); need_disable = paragraph_locked || header_locked || in_header || in_image || in_equation && !btn_eq_state || this.api.asc_IsCursorInFootnote() || in_control; - toolbar.btnsPageBreak.disable(need_disable); + toolbar.btnsPageBreak.setDisabled(need_disable); need_disable = paragraph_locked || header_locked || !can_add_image || in_equation || control_plain; toolbar.btnInsertImage.setDisabled(need_disable); @@ -767,10 +767,8 @@ define([ toolbar.listStylesAdditionalMenuItem.setDisabled(frame_pr===undefined); need_disable = (paragraph_locked || header_locked) && this.api.can_AddQuotedComment() || image_locked; - if (this.btnsComment && this.btnsComment.length>0 && need_disable != this.btnsComment[0].isDisabled()) - _.each (this.btnsComment, function(item){ - item.setDisabled(need_disable); - }, this); + if ( this.btnsComment && this.btnsComment.length > 0 ) + this.btnsComment.setDisabled(need_disable); this._state.in_equation = in_equation; }, @@ -922,11 +920,7 @@ define([ this.api.asc_Save(); } - toolbar.btnsSave.forEach(function(button) { - if ( button ) { - button.setDisabled(!toolbar.mode.forcesave); - } - }); + toolbar.btnsSave.setDisabled(!toolbar.mode.forcesave); Common.NotificationCenter.trigger('edit:complete', toolbar); @@ -2707,11 +2701,7 @@ define([ toolbar._state.previewmode = reviewmode && disable; if (reviewmode) { - toolbar._state.previewmode && toolbar.btnsSave.forEach(function(button) { - if ( button ) { - button.setDisabled(true); - } - }); + toolbar._state.previewmode && toolbar.btnsSave.setDisabled(true); if (toolbar.needShowSynchTip) { toolbar.needShowSynchTip = false; @@ -2797,7 +2787,7 @@ define([ var me = this; if ( config.canCoAuthoring && config.canComments ) { - this.btnsComment = []; + this.btnsComment = createButtonSet(); var slots = me.toolbar.$el.find('.slot-comment'); slots.each(function(index, el) { var _cls = 'btn-toolbar'; @@ -2810,7 +2800,7 @@ define([ caption: me.toolbar.capBtnComment }).render( slots.eq(index) ); - me.btnsComment.push(button); + me.btnsComment.add(button); }); if ( this.btnsComment.length ) { diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index 56b3daa6b..4fecc3cd1 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -123,7 +123,7 @@ define([ iconCls: 'no-mask ' + this.btnSaveCls }); this.toolbarControls.push(this.btnSave); - this.btnsSave = [this.btnSave]; + me.btnsSave = createButtonSet( me.btnSave ); this.btnUndo = new Common.UI.Button({ id: 'id-toolbar-btn-undo', @@ -1300,12 +1300,7 @@ define([ +function injectBreakButtons() { var me = this; - me.btnsPageBreak = []; - me.btnsPageBreak.disable = function(status) { - this.forEach(function(btn) { - btn.setDisabled(status); - }); - }; + me.btnsPageBreak = createButtonSet(); var $slots = $host.find('.btn-slot.btn-pagebreak'); $slots.each(function(index, el) { @@ -1320,7 +1315,7 @@ define([ menu: true }).render( $slots.eq(index) ); - me.btnsPageBreak.push(button); + me.btnsPageBreak.add(button); }); Array.prototype.push.apply(me.paragraphControls, me.btnsPageBreak); @@ -1965,16 +1960,14 @@ define([ var btnsave = DE.getController('LeftMenu').getView('LeftMenu').getMenu('file').getButton('save'); if (btnsave && this.btnsSave) { - this.btnsSave.push(btnsave); + this.btnsSave.add(btnsave); this.toolbarControls.push(btnsave); - btnsave.setDisabled(this.btnsSave[0].isDisabled()); } btnsave = DE.getController('Viewport').getView('Common.Views.Header').getButton('save'); if (btnsave && this.btnsSave) { - this.btnsSave.push(btnsave); + this.btnsSave.add(btnsave); this.toolbarControls.push(btnsave); - btnsave.setDisabled(this.btnsSave[0].isDisabled()); } }, @@ -2059,11 +2052,7 @@ define([ setMode: function (mode) { if (mode.isDisconnected) { - this.btnsSave.forEach(function(button) { - if ( button ) { - button.setDisabled(true); - } - }); + this.btnsSave.setDisabled(true); if (mode.disableDownload) this.btnPrint.setDisabled(true); } @@ -2154,11 +2143,7 @@ define([ this.btnSave.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); } - this.btnsSave.forEach(function(button) { - if ( button ) { - button.setDisabled(false); - } - }); + this.btnsSave.setDisabled(false); Common.Gateway.collaborativeChanges(); }, @@ -2189,11 +2174,7 @@ define([ if (this.synchTooltip) this.synchTooltip.hide(); this.btnSave.updateHint(this.btnSaveTip); - this.btnsSave.forEach(function(button) { - if ( button ) { - button.setDisabled(!me.mode.forcesave); - } - }); + this.btnsSave.setDisabled(!me.mode.forcesave); this._state.hasCollaborativeChanges = false; } } diff --git a/apps/presentationeditor/main/app/controller/Toolbar.js b/apps/presentationeditor/main/app/controller/Toolbar.js index 4ffa5d50f..cdd8f02e6 100644 --- a/apps/presentationeditor/main/app/controller/Toolbar.js +++ b/apps/presentationeditor/main/app/controller/Toolbar.js @@ -915,11 +915,7 @@ define([ this.api.asc_Save(); } - toolbar.btnsSave.forEach(function(button) { - if ( button ) { - button.setDisabled(!toolbar.mode.forcesave); - } - }); + toolbar.btnsSave.setDisabled(!toolbar.mode.forcesave); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('Save'); diff --git a/apps/presentationeditor/main/app/view/Toolbar.js b/apps/presentationeditor/main/app/view/Toolbar.js index f6abc374f..6bb2695e6 100644 --- a/apps/presentationeditor/main/app/view/Toolbar.js +++ b/apps/presentationeditor/main/app/view/Toolbar.js @@ -83,45 +83,6 @@ define([ commentLock: 'can-comment' }; - var buttonsArray = function (opts) { - var arr = []; - arr.push.apply(arr, arguments); - arr.__proto__ = buttonsArray.prototype; - return arr; - }; - - buttonsArray.prototype = new Array; - - buttonsArray.prototype.disable = function (state) { - this.forEach(function(btn) { - btn.setDisabled(state); - }); - }; - - buttonsArray.prototype.toggle = function (state, suppress) { - this.forEach(function(btn) { - btn.toggle(state, suppress); - }); - }; - - buttonsArray.prototype.pressed = function () { - return this.some(function(btn) { - return btn.pressed; - }); - }; - - buttonsArray.prototype.on = function (event, func) { - this.forEach(function(btn) { - btn.on.apply(btn, arguments); - }); - }; - - buttonsArray.prototype.contains = function (id) { - return this.some(function(btn) { - return btn.id == id; - }); - }; - PE.Views.Toolbar = Common.UI.Mixtbar.extend(_.extend((function(){ return { @@ -211,7 +172,7 @@ define([ iconCls : 'no-mask ' + me.btnSaveCls, lock : [_set.lostConnect] }); - me.btnsSave = [me.btnSave]; + me.btnsSave = createButtonSet(me.btnSave); me.btnUndo = new Common.UI.Button({ id : 'id-toolbar-btn-undo', @@ -983,7 +944,7 @@ define([ _injectComponent('#slot-btn-settings', this.btnAdvSettings); function _injectBtns(opts) { - var array = new buttonsArray; + var array = createButtonSet(); var $slots = $host.find(opts.slot); var id = opts.btnconfig.id; $slots.each(function(index, el) { @@ -992,7 +953,7 @@ define([ var button = new Common.UI.Button(opts.btnconfig); button.render( $slots.eq(index) ); - array.push(button); + array.add(button); }); return array; @@ -1381,15 +1342,13 @@ define([ var btnsave = PE.getController('LeftMenu').getView('LeftMenu').getMenu('file').getButton('save'); if (btnsave && this.btnsSave) { - this.btnsSave.push(btnsave); + this.btnsSave.add(btnsave); this.lockControls.push(btnsave); - btnsave.setDisabled(this.btnsSave[0].isDisabled()); } btnsave = PE.getController('Viewport').getView('Common.Views.Header').getButton('save'); if (btnsave && this.btnsSave) { - this.btnsSave.push(btnsave); + this.btnsSave.add(btnsave); this.lockControls.push(btnsave); - btnsave.setDisabled(this.btnsSave[0].isDisabled()); } /** coauthoring begin **/ @@ -1540,11 +1499,7 @@ define([ this.btnSave.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); } - this.btnsSave.forEach(function(button) { - if ( button ) { - button.setDisabled(false); - } - }); + this.btnsSave.setDisabled(false); Common.Gateway.collaborativeChanges(); }, @@ -1575,11 +1530,7 @@ define([ if (this.synchTooltip) this.synchTooltip.hide(); this.btnSave.updateHint(this.btnSaveTip); - this.btnsSave.forEach(function(button) { - if ( button ) { - button.setDisabled(!me.mode.forcesave); - } - }); + this.btnsSave.setDisabled(!me.mode.forcesave); this._state.hasCollaborativeChanges = false; } diff --git a/apps/spreadsheeteditor/main/app/view/Toolbar.js b/apps/spreadsheeteditor/main/app/view/Toolbar.js index 95a1dc88b..24c851321 100644 --- a/apps/spreadsheeteditor/main/app/view/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/view/Toolbar.js @@ -372,7 +372,7 @@ define([ cls : 'btn-toolbar', iconCls : 'no-mask ' + me.btnSaveCls }); - me.btnsSave = [me.btnSave]; + me.btnsSave = createButtonSet(me.btnSave); me.btnIncFontSize = new Common.UI.Button({ id : 'id-toolbar-btn-incfont', @@ -1709,13 +1709,11 @@ define([ var btnsave = SSE.getController('LeftMenu').getView('LeftMenu').getMenu('file').getButton('save'); if (btnsave && this.btnsSave) { - this.btnsSave.push(btnsave); - btnsave.setDisabled(this.btnsSave[0].isDisabled()); + this.btnsSave.add(btnsave); } btnsave = SSE.getController('Viewport').getView('Common.Views.Header').getButton('save'); if (btnsave && this.btnsSave) { - this.btnsSave.push(btnsave); - btnsave.setDisabled(this.btnsSave[0].isDisabled()); + this.btnsSave.add(btnsave); } }, @@ -1853,11 +1851,7 @@ define([ this.btnSave.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); } - this.btnsSave.forEach(function(button) { - if ( button ) { - button.setDisabled(false); - } - }); + this.btnsSave.setDisabled(false); Common.Gateway.collaborativeChanges(); }, @@ -1888,11 +1882,7 @@ define([ if (this.synchTooltip) this.synchTooltip.hide(); this.btnSave.updateHint(this.btnSaveTip); - this.btnsSave.forEach(function(button) { - if ( button ) { - button.setDisabled(!me.mode.forcesave); - } - }); + this.btnsSave.setDisabled(!me.mode.forcesave); this._state.hasCollaborativeChanges = false; } From 6d385730b197f3305a4095eb0206d6215879b5c1 Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Fri, 16 Feb 2018 02:46:45 +0300 Subject: [PATCH 16/73] [Common] make created buttons disabled --- apps/common/main/lib/view/Header.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/apps/common/main/lib/view/Header.js b/apps/common/main/lib/view/Header.js index 083b94536..a77543b9d 100644 --- a/apps/common/main/lib/view/Header.js +++ b/apps/common/main/lib/view/Header.js @@ -408,10 +408,11 @@ define([ getPanel: function (role, config) { var me = this; - function createTitleButton(iconid, slot) { + function createTitleButton(iconid, slot, disabled) { return (new Common.UI.Button({ cls: 'btn-header', - iconCls: 'svgicon ' + iconid + iconCls: 'svgicon ' + iconid, + disabled: disabled === true })).render(slot); } @@ -493,9 +494,9 @@ define([ me.btnPrint = createTitleButton('svg-btn-print', $('#slot-btn-dt-print', $html)); } - me.btnSave = createTitleButton('svg-btn-save', $('#slot-btn-dt-save', $html)); - me.btnUndo = createTitleButton('svg-btn-undo', $('#slot-btn-dt-undo', $html)); - me.btnRedo = createTitleButton('svg-btn-redo', $('#slot-btn-dt-redo', $html)); + me.btnSave = createTitleButton('svg-btn-save', $('#slot-btn-dt-save', $html), true); + me.btnUndo = createTitleButton('svg-btn-undo', $('#slot-btn-dt-undo', $html), true); + me.btnRedo = createTitleButton('svg-btn-redo', $('#slot-btn-dt-redo', $html), true); return $html; } From cb82ea8230b0dfa202153383606a1f6b284612bb Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Fri, 16 Feb 2018 02:52:44 +0300 Subject: [PATCH 17/73] [DE PE] refactoring --- apps/documenteditor/main/app/controller/Main.js | 4 +--- apps/documenteditor/main/app/controller/Toolbar.js | 2 +- apps/presentationeditor/main/app/controller/Main.js | 9 +++------ 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index 4f46209dd..63cd85a79 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -1543,9 +1543,7 @@ define([ /** coauthoring end **/ }, onDocumentCanSaveChanged: function (isCanSave) { - var application = this.getApplication(), - toolbarController = application.getController('Toolbar'), - toolbarView = toolbarController.getView(); + var toolbarView = this.getApplication().getController('Toolbar').getView(); if (toolbarView && this.api && !toolbarView._state.previewmode) { var isSyncButton = $('.icon', toolbarView.btnSave.cmpEl).hasClass('btn-synch'), diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index b50f5e651..3f82fca07 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -2762,7 +2762,7 @@ define([ // hide 'print' and 'save' buttons group and next separator me.toolbar.btnPrint.$el.parents('.group').hide().next().hide(); - // hide 'undo' and 'redo' buttons and get container + // hide 'undo' and 'redo' buttons and retrieve parent container var $box = me.toolbar.btnUndo.$el.hide().next().hide().parent(); // move 'paste' button to the container instead of 'undo' and 'redo' diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js index a248695e2..e33d95aa6 100644 --- a/apps/presentationeditor/main/app/controller/Main.js +++ b/apps/presentationeditor/main/app/controller/Main.js @@ -409,8 +409,7 @@ define([ onEditComplete: function(cmp) { var application = this.getApplication(), - toolbarController = application.getController('Toolbar'), - toolbarView = toolbarController.getView('Toolbar'); + toolbarView = application.getController('Toolbar').getView('Toolbar'); application.getController('DocumentHolder').getView('DocumentHolder').focus(); if (this.api && this.api.asc_isDocumentCanSave) { @@ -1281,10 +1280,8 @@ define([ } }, onDocumentCanSaveChanged: function (isCanSave) { - var application = this.getApplication(), - toolbarController = application.getController('Toolbar'), - toolbarView = toolbarController.getView('Toolbar'); - if (toolbarView) { + var toolbarView = this.getApplication().getController('Toolbar').getView('Toolbar'); + if ( toolbarView ) { var isSyncButton = $('.icon', toolbarView.btnSave.cmpEl).hasClass('btn-synch'), forcesave = this.appOptions.forcesave, isDisabled = !isCanSave && !isSyncButton && !forcesave || this._state.isDisconnected || this._state.fastCoauth && this._state.usersCount>1 && !forcesave; From 5f1b2918861f7c41641effe390b36f19f3e9233f Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Fri, 16 Feb 2018 02:56:17 +0300 Subject: [PATCH 18/73] [DE][PE][SSE] synchronize extra buttons state through events --- apps/common/main/lib/component/Button.js | 7 +++++ .../main/app/controller/LeftMenu.js | 7 ++++- .../main/app/controller/Main.js | 21 ++------------ .../main/app/controller/Toolbar.js | 14 ++++++++-- .../main/app/controller/Viewport.js | 12 ++++++++ apps/documenteditor/main/app/view/Toolbar.js | 28 ++++++------------- .../main/app/controller/LeftMenu.js | 8 +++++- .../main/app/controller/Main.js | 21 ++------------ .../main/app/controller/Toolbar.js | 17 +++++++++-- .../main/app/controller/Viewport.js | 13 +++++++++ .../main/app/view/Toolbar.js | 25 ++++++----------- .../main/app/controller/LeftMenu.js | 7 ++++- .../main/app/controller/Main.js | 14 ++-------- .../main/app/controller/Toolbar.js | 13 +++++++++ .../main/app/controller/Viewport.js | 12 ++++++++ .../main/app/view/Toolbar.js | 27 ++++++------------ 16 files changed, 136 insertions(+), 110 deletions(-) diff --git a/apps/common/main/lib/component/Button.js b/apps/common/main/lib/component/Button.js index 013f7f78e..2315c167a 100644 --- a/apps/common/main/lib/component/Button.js +++ b/apps/common/main/lib/component/Button.js @@ -595,6 +595,13 @@ define([ } } } + + if ( !!me.options.signals ) { + var opts = me.options.signals; + if ( !(opts.indexOf('disabled') < 0) ) { + me.trigger('disabled', me, disabled); + } + } } this.disabled = disabled; diff --git a/apps/documenteditor/main/app/controller/LeftMenu.js b/apps/documenteditor/main/app/controller/LeftMenu.js index 2180cc6f9..06bf7e080 100644 --- a/apps/documenteditor/main/app/controller/LeftMenu.js +++ b/apps/documenteditor/main/app/controller/LeftMenu.js @@ -91,7 +91,8 @@ define([ 'Toolbar': { 'file:settings': _.bind(this.clickToolbarSettings,this), 'file:open': this.clickToolbarTab.bind(this, 'file'), - 'file:close': this.clickToolbarTab.bind(this, 'other') + 'file:close': this.clickToolbarTab.bind(this, 'other'), + 'save:disabled': this.changeToolbarSaveState.bind(this) }, 'SearchDialog': { 'hide': _.bind(this.onSearchDlgHide, this), @@ -398,6 +399,10 @@ define([ this.leftMenu.menuFile.hide(); }, + changeToolbarSaveState: function (state) { + this.leftMenu.menuFile.getButton('save').setDisabled(state); + }, + /** coauthoring begin **/ clickStatusbarUsers: function() { this.leftMenu.menuFile.panels['rights'].changeAccessRights(); diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index 63cd85a79..5e0e20d50 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -622,12 +622,7 @@ define([ forcesave = this.appOptions.forcesave, isSyncButton = $('.icon', toolbarView.btnSave.cmpEl).hasClass('btn-synch'), isDisabled = !cansave && !isSyncButton && !forcesave || this._state.isDisconnected || this._state.fastCoauth && this._state.usersCount>1 && !forcesave; - if (toolbarView.btnSave.isDisabled() !== isDisabled) - toolbarView.btnsSave.forEach(function(button) { - if ( button ) { - button.setDisabled(isDisabled); - } - }); + toolbarView.btnSave.setDisabled(isDisabled); } }, @@ -1528,12 +1523,7 @@ define([ var isSyncButton = $('.icon', toolbarView.btnSave.cmpEl).hasClass('btn-synch'), forcesave = this.appOptions.forcesave, isDisabled = !isModified && !isSyncButton && !forcesave || this._state.isDisconnected || this._state.fastCoauth && this._state.usersCount>1 && !forcesave; - if (toolbarView.btnSave.isDisabled() !== isDisabled) - toolbarView.btnsSave.forEach(function(button) { - if ( button ) { - button.setDisabled(isDisabled); - } - }); + toolbarView.btnSave.setDisabled(isDisabled); } /** coauthoring begin **/ @@ -1549,12 +1539,7 @@ define([ var isSyncButton = $('.icon', toolbarView.btnSave.cmpEl).hasClass('btn-synch'), forcesave = this.appOptions.forcesave, isDisabled = !isCanSave && !isSyncButton && !forcesave || this._state.isDisconnected || this._state.fastCoauth && this._state.usersCount>1 && !forcesave; - if (toolbarView.btnSave.isDisabled() !== isDisabled) - toolbarView.btnsSave.forEach(function(button) { - if ( button ) { - button.setDisabled(isDisabled); - } - }); + toolbarView.btnSave.setDisabled(isDisabled); } }, diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index 3f82fca07..1611b09fa 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -231,8 +231,11 @@ define([ toolbar.btnPrint.on('click', _.bind(this.onPrint, this)); toolbar.btnSave.on('click', _.bind(this.onSave, this)); + toolbar.btnSave.on('disabled', _.bind(this.onBtnChangeState, this, 'save:disabled')); toolbar.btnUndo.on('click', _.bind(this.onUndo, this)); + toolbar.btnUndo.on('disabled', _.bind(this.onBtnChangeState, this, 'undo:disabled')); toolbar.btnRedo.on('click', _.bind(this.onRedo, this)); + toolbar.btnRedo.on('disabled', _.bind(this.onBtnChangeState, this, 'redo:disabled')); toolbar.btnCopy.on('click', _.bind(this.onCopyPaste, this, true)); toolbar.btnPaste.on('click', _.bind(this.onCopyPaste, this, false)); toolbar.btnIncFontSize.on('click', _.bind(this.onIncrease, this)); @@ -920,7 +923,7 @@ define([ this.api.asc_Save(); } - toolbar.btnsSave.setDisabled(!toolbar.mode.forcesave); + toolbar.btnSave.setDisabled(!toolbar.mode.forcesave); Common.NotificationCenter.trigger('edit:complete', toolbar); @@ -928,6 +931,13 @@ define([ Common.component.Analytics.trackEvent('ToolBar', 'Save'); }, + onBtnChangeState: function(prop) { + if ( /\:disabled$/.test(prop) ) { + var _is_disabled = arguments[2]; + this.toolbar.fireEvent(prop, [_is_disabled]); + } + }, + onUndo: function(btn, e) { if (this.api) this.api.Undo(); @@ -2701,7 +2711,7 @@ define([ toolbar._state.previewmode = reviewmode && disable; if (reviewmode) { - toolbar._state.previewmode && toolbar.btnsSave.setDisabled(true); + toolbar._state.previewmode && toolbar.btnSave.setDisabled(true); if (toolbar.needShowSynchTip) { toolbar.needShowSynchTip = false; diff --git a/apps/documenteditor/main/app/controller/Viewport.js b/apps/documenteditor/main/app/controller/Viewport.js index 98281ba0a..83097ded2 100644 --- a/apps/documenteditor/main/app/controller/Viewport.js +++ b/apps/documenteditor/main/app/controller/Viewport.js @@ -77,6 +77,18 @@ define([ 'view:compact' : function (toolbar, state) { me.viewport.vlayout.getItem('toolbar').height = state ? Common.Utils.InternalSettings.get('toolbar-height-compact') : Common.Utils.InternalSettings.get('toolbar-height-normal'); + }, + 'undo:disabled' : function (state) { + if ( me.header.btnUndo ) + me.header.btnUndo.setDisabled(state); + }, + 'redo:disabled' : function (state) { + if ( me.header.btnRedo ) + me.header.btnRedo.setDisabled(state); + }, + 'save:disabled' : function (state) { + if ( me.header.btnSave ) + me.header.btnSave.setDisabled(state); } } }); diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index 4fecc3cd1..6125c2e9d 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -120,22 +120,24 @@ define([ this.btnSave = new Common.UI.Button({ id: 'id-toolbar-btn-save', cls: 'btn-toolbar', - iconCls: 'no-mask ' + this.btnSaveCls + iconCls: 'no-mask ' + this.btnSaveCls, + signals: ['disabled'] }); this.toolbarControls.push(this.btnSave); - me.btnsSave = createButtonSet( me.btnSave ); this.btnUndo = new Common.UI.Button({ id: 'id-toolbar-btn-undo', cls: 'btn-toolbar', - iconCls: 'btn-undo' + iconCls: 'btn-undo', + signals: ['disabled'] }); this.toolbarControls.push(this.btnUndo); this.btnRedo = new Common.UI.Button({ id: 'id-toolbar-btn-redo', cls: 'btn-toolbar', - iconCls: 'btn-redo' + iconCls: 'btn-redo', + signals: ['disabled'] }); this.toolbarControls.push(this.btnRedo); @@ -1957,18 +1959,6 @@ define([ maxRows: 8, maxColumns: 10 }); - - var btnsave = DE.getController('LeftMenu').getView('LeftMenu').getMenu('file').getButton('save'); - if (btnsave && this.btnsSave) { - this.btnsSave.add(btnsave); - this.toolbarControls.push(btnsave); - } - - btnsave = DE.getController('Viewport').getView('Common.Views.Header').getButton('save'); - if (btnsave && this.btnsSave) { - this.btnsSave.add(btnsave); - this.toolbarControls.push(btnsave); - } }, onToolbarAfterRender: function(toolbar) { @@ -2052,7 +2042,7 @@ define([ setMode: function (mode) { if (mode.isDisconnected) { - this.btnsSave.setDisabled(true); + this.btnSave.setDisabled(true); if (mode.disableDownload) this.btnPrint.setDisabled(true); } @@ -2143,7 +2133,7 @@ define([ this.btnSave.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); } - this.btnsSave.setDisabled(false); + this.btnSave.setDisabled(false); Common.Gateway.collaborativeChanges(); }, @@ -2174,7 +2164,7 @@ define([ if (this.synchTooltip) this.synchTooltip.hide(); this.btnSave.updateHint(this.btnSaveTip); - this.btnsSave.setDisabled(!me.mode.forcesave); + this.btnSave.setDisabled(!me.mode.forcesave); this._state.hasCollaborativeChanges = false; } } diff --git a/apps/presentationeditor/main/app/controller/LeftMenu.js b/apps/presentationeditor/main/app/controller/LeftMenu.js index 3590306ae..81aa86c15 100644 --- a/apps/presentationeditor/main/app/controller/LeftMenu.js +++ b/apps/presentationeditor/main/app/controller/LeftMenu.js @@ -89,7 +89,8 @@ define([ 'Toolbar': { 'file:settings': _.bind(this.clickToolbarSettings,this), 'file:open': this.clickToolbarTab.bind(this, 'file'), - 'file:close': this.clickToolbarTab.bind(this, 'other') + 'file:close': this.clickToolbarTab.bind(this, 'other'), + 'save:disabled' : this.changeToolbarSaveState.bind(this) }, 'SearchDialog': { 'hide': _.bind(this.onSearchDlgHide, this), @@ -311,6 +312,11 @@ define([ this.leftMenu.menuFile.hide(); }, + changeToolbarSaveState: function (state) { + this.leftMenu.menuFile.getButton('save').setDisabled(state); + console.log('save: ' + state); + }, + /** coauthoring begin **/ clickStatusbarUsers: function() { this.leftMenu.menuFile.panels['rights'].changeAccessRights(); diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js index e33d95aa6..150a04afa 100644 --- a/apps/presentationeditor/main/app/controller/Main.js +++ b/apps/presentationeditor/main/app/controller/Main.js @@ -417,12 +417,7 @@ define([ forcesave = this.appOptions.forcesave, isSyncButton = $('.icon', toolbarView.btnSave.cmpEl).hasClass('btn-synch'), isDisabled = !cansave && !isSyncButton && !forcesave || this._state.isDisconnected || this._state.fastCoauth && this._state.usersCount>1 && !forcesave; - if (toolbarView.btnSave.isDisabled() !== isDisabled) - toolbarView.btnsSave.forEach(function(button) { - if ( button ) { - button.setDisabled(isDisabled); - } - }); + toolbarView.btnSave.setDisabled(isDisabled); } }, @@ -1271,12 +1266,7 @@ define([ var isSyncButton = $('.icon', toolbarView.btnSave.cmpEl).hasClass('btn-synch'), forcesave = this.appOptions.forcesave, isDisabled = !isModified && !isSyncButton && !forcesave || this._state.isDisconnected || this._state.fastCoauth && this._state.usersCount>1 && !forcesave; - if (toolbarView.btnSave.isDisabled() !== isDisabled) - toolbarView.btnsSave.forEach(function(button) { - if ( button ) { - button.setDisabled(isDisabled); - } - }); + toolbarView.btnSave.setDisabled(isDisabled); } }, onDocumentCanSaveChanged: function (isCanSave) { @@ -1285,12 +1275,7 @@ define([ var isSyncButton = $('.icon', toolbarView.btnSave.cmpEl).hasClass('btn-synch'), forcesave = this.appOptions.forcesave, isDisabled = !isCanSave && !isSyncButton && !forcesave || this._state.isDisconnected || this._state.fastCoauth && this._state.usersCount>1 && !forcesave; - if (toolbarView.btnSave.isDisabled() !== isDisabled) - toolbarView.btnsSave.forEach(function(button) { - if ( button ) { - button.setDisabled(isDisabled); - } - }); + toolbarView.btnSave.setDisabled(isDisabled); } }, diff --git a/apps/presentationeditor/main/app/controller/Toolbar.js b/apps/presentationeditor/main/app/controller/Toolbar.js index cdd8f02e6..4099bc566 100644 --- a/apps/presentationeditor/main/app/controller/Toolbar.js +++ b/apps/presentationeditor/main/app/controller/Toolbar.js @@ -217,10 +217,14 @@ define([ }, onLaunch: function() { - // Create toolbar view - this.toolbar = this.createView('Toolbar'); - var me = this; + + // Create toolbar view + me.toolbar = me.createView('Toolbar'); + me.toolbar.btnSave.on('disabled', _.bind(this.onBtnChangeState, this, 'save:disabled')); + me.toolbar.btnUndo.on('disabled', _.bind(this.onBtnChangeState, this, 'undo:disabled')); + me.toolbar.btnRedo.on('disabled', _.bind(this.onBtnChangeState, this, 'redo:disabled')); + Common.NotificationCenter.on('app:ready', me.onAppReady.bind(me)); Common.NotificationCenter.on('app:face', me.onAppShowed.bind(me)); @@ -922,6 +926,13 @@ define([ Common.component.Analytics.trackEvent('ToolBar', 'Save'); }, + onBtnChangeState: function(prop) { + if ( /\:disabled$/.test(prop) ) { + var _is_disabled = arguments[2]; + this.toolbar.fireEvent(prop, [_is_disabled]); + } + }, + onUndo: function(btn, e) { if (this.api) { this.api.Undo(); diff --git a/apps/presentationeditor/main/app/controller/Viewport.js b/apps/presentationeditor/main/app/controller/Viewport.js index 046d7550b..298096677 100644 --- a/apps/presentationeditor/main/app/controller/Viewport.js +++ b/apps/presentationeditor/main/app/controller/Viewport.js @@ -78,6 +78,19 @@ define([ 'view:compact' : function (toolbar, state) { me.viewport.vlayout.getItem('toolbar').height = state ? Common.Utils.InternalSettings.get('toolbar-height-compact') : Common.Utils.InternalSettings.get('toolbar-height-normal'); + }, + 'undo:disabled' : function (state) { + if ( me.header.btnUndo ) + me.header.btnUndo.setDisabled(state); + }, + 'redo:disabled' : function (state) { + if ( me.header.btnRedo ) + me.header.btnRedo.setDisabled(state); + }, + 'save:disabled' : function (state) { + if ( me.header.btnSave ) + me.header.btnSave.setDisabled(state); + console.log('header save: ' + state); } }, // Events generated by main view diff --git a/apps/presentationeditor/main/app/view/Toolbar.js b/apps/presentationeditor/main/app/view/Toolbar.js index 6bb2695e6..fd1afe929 100644 --- a/apps/presentationeditor/main/app/view/Toolbar.js +++ b/apps/presentationeditor/main/app/view/Toolbar.js @@ -170,15 +170,16 @@ define([ id : 'id-toolbar-btn-save', cls : 'btn-toolbar', iconCls : 'no-mask ' + me.btnSaveCls, - lock : [_set.lostConnect] + lock : [_set.lostConnect], + signals : ['disabled'] }); - me.btnsSave = createButtonSet(me.btnSave); me.btnUndo = new Common.UI.Button({ id : 'id-toolbar-btn-undo', cls : 'btn-toolbar', iconCls : 'btn-undo', - lock : [_set.undoLock, _set.slideDeleted, _set.lostConnect, _set.disableOnStart] + lock : [_set.undoLock, _set.slideDeleted, _set.lostConnect, _set.disableOnStart], + signals : ['disabled'] }); me.slideOnlyControls.push(me.btnUndo); @@ -186,7 +187,8 @@ define([ id : 'id-toolbar-btn-redo', cls : 'btn-toolbar', iconCls : 'btn-redo', - lock : [_set.redoLock, _set.slideDeleted, _set.lostConnect, _set.disableOnStart] + lock : [_set.redoLock, _set.slideDeleted, _set.lostConnect, _set.disableOnStart], + signals : ['disabled'] }); me.slideOnlyControls.push(me.btnRedo); @@ -1340,17 +1342,6 @@ define([ // // Enable none paragraph components this.lockToolbar(PE.enumLock.disableOnStart, false, {array: this.slideOnlyControls.concat(this.shapeControls)}); - var btnsave = PE.getController('LeftMenu').getView('LeftMenu').getMenu('file').getButton('save'); - if (btnsave && this.btnsSave) { - this.btnsSave.add(btnsave); - this.lockControls.push(btnsave); - } - btnsave = PE.getController('Viewport').getView('Common.Views.Header').getButton('save'); - if (btnsave && this.btnsSave) { - this.btnsSave.add(btnsave); - this.lockControls.push(btnsave); - } - /** coauthoring begin **/ this.showSynchTip = !Common.localStorage.getBool('pe-hide-synch'); this.needShowSynchTip = false; @@ -1499,7 +1490,7 @@ define([ this.btnSave.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); } - this.btnsSave.setDisabled(false); + this.btnSave.setDisabled(false); Common.Gateway.collaborativeChanges(); }, @@ -1530,7 +1521,7 @@ define([ if (this.synchTooltip) this.synchTooltip.hide(); this.btnSave.updateHint(this.btnSaveTip); - this.btnsSave.setDisabled(!me.mode.forcesave); + this.btnSave.setDisabled(!me.mode.forcesave); this._state.hasCollaborativeChanges = false; } diff --git a/apps/spreadsheeteditor/main/app/controller/LeftMenu.js b/apps/spreadsheeteditor/main/app/controller/LeftMenu.js index d64fe5f54..bb40abea2 100644 --- a/apps/spreadsheeteditor/main/app/controller/LeftMenu.js +++ b/apps/spreadsheeteditor/main/app/controller/LeftMenu.js @@ -79,7 +79,8 @@ define([ 'Toolbar': { 'file:settings': _.bind(this.clickToolbarSettings,this), 'file:open': this.clickToolbarTab.bind(this, 'file'), - 'file:close': this.clickToolbarTab.bind(this, 'other') + 'file:close': this.clickToolbarTab.bind(this, 'other'), + 'save:disabled' : this.changeToolbarSaveState.bind(this) }, 'SearchDialog': { 'hide': _.bind(this.onSearchDlgHide, this), @@ -348,6 +349,10 @@ define([ this.leftMenu.menuFile.hide(); }, + changeToolbarSaveState: function (state) { + this.leftMenu.menuFile.getButton('save').setDisabled(state); + }, + /** coauthoring begin **/ clickStatusbarUsers: function() { this.leftMenu.menuFile.panels['rights'].changeAccessRights(); diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index 2d1744f0e..9d5505a6d 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -1417,12 +1417,7 @@ define([ forcesave = this.appOptions.forcesave, cansave = this.api.asc_isDocumentCanSave(), isDisabled = !cansave && !isSyncButton && !forcesave || this._state.isDisconnected || this._state.fastCoauth && this._state.usersCount>1 && !forcesave; - if (this.toolbarView.btnSave.isDisabled() !== isDisabled) - this.toolbarView.btnsSave.forEach(function(button) { - if ( button ) { - button.setDisabled(isDisabled); - } - }); + this.toolbarView.btnSave.setDisabled(isDisabled); } }, @@ -1431,12 +1426,7 @@ define([ var isSyncButton = $('.icon', this.toolbarView.btnSave.cmpEl).hasClass('btn-synch'), forcesave = this.appOptions.forcesave, isDisabled = !isCanSave && !isSyncButton && !forcesave || this._state.isDisconnected || this._state.fastCoauth && this._state.usersCount>1 && !forcesave; - if (this.toolbarView.btnSave.isDisabled() !== isDisabled) - this.toolbarView.btnsSave.forEach(function(button) { - if ( button ) { - button.setDisabled(isDisabled); - } - }); + this.toolbarView.btnSave.setDisabled(isDisabled); } }, diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js index 0f6d1d44a..f1474829c 100644 --- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js @@ -247,8 +247,11 @@ define([ } else { toolbar.btnPrint.on('click', _.bind(this.onPrint, this)); toolbar.btnSave.on('click', _.bind(this.onSave, this)); + toolbar.btnSave.on('disabled', _.bind(this.onBtnChangeState, this, 'save:disabled')); toolbar.btnUndo.on('click', _.bind(this.onUndo, this)); + toolbar.btnUndo.on('disabled', _.bind(this.onBtnChangeState, this, 'undo:disabled')); toolbar.btnRedo.on('click', _.bind(this.onRedo, this)); + toolbar.btnRedo.on('disabled', _.bind(this.onBtnChangeState, this, 'redo:disabled')); toolbar.btnCopy.on('click', _.bind(this.onCopyPaste, this, true)); toolbar.btnPaste.on('click', _.bind(this.onCopyPaste, this, false)); toolbar.btnIncFontSize.on('click', _.bind(this.onIncreaseFontSize, this)); @@ -396,6 +399,13 @@ define([ Common.component.Analytics.trackEvent('ToolBar', 'Save'); }, + onBtnChangeState: function(prop) { + if ( /\:disabled$/.test(prop) ) { + var _is_disabled = arguments[2]; + this.toolbar.fireEvent(prop, [_is_disabled]); + } + }, + onUndo: function(btn, e) { if (this.api) this.api.asc_Undo(); @@ -3039,6 +3049,9 @@ define([ me.toolbar.setMode(config); if ( config.isEdit ) { + me.toolbar.btnSave && me.toolbar.btnSave.on('disabled', _.bind(me.onBtnChangeState, me, 'save:disabled')); + me.toolbar.btnUndo && me.toolbar.btnUndo.on('disabled', _.bind(me.onBtnChangeState, me, 'undo:disabled')); + me.toolbar.btnRedo && me.toolbar.btnRedo.on('disabled', _.bind(me.onBtnChangeState, me, 'redo:disabled')); me.toolbar.setApi(me.api); if ( !config.isEditDiagram && !config.isEditMailMerge ) { diff --git a/apps/spreadsheeteditor/main/app/controller/Viewport.js b/apps/spreadsheeteditor/main/app/controller/Viewport.js index dd05bf1ed..dadd49ec1 100644 --- a/apps/spreadsheeteditor/main/app/controller/Viewport.js +++ b/apps/spreadsheeteditor/main/app/controller/Viewport.js @@ -76,6 +76,18 @@ define([ 'view:compact' : function (toolbar, state) { me.viewport.vlayout.getItem('toolbar').height = state ? Common.Utils.InternalSettings.get('toolbar-height-compact') : Common.Utils.InternalSettings.get('toolbar-height-normal'); + }, + 'undo:disabled' : function (state) { + if ( me.header.btnUndo ) + me.header.btnUndo.setDisabled(state); + }, + 'redo:disabled' : function (state) { + if ( me.header.btnRedo ) + me.header.btnRedo.setDisabled(state); + }, + 'save:disabled' : function (state) { + if ( me.header.btnSave ) + me.header.btnSave.setDisabled(state); } } }); diff --git a/apps/spreadsheeteditor/main/app/view/Toolbar.js b/apps/spreadsheeteditor/main/app/view/Toolbar.js index 24c851321..f627aafb7 100644 --- a/apps/spreadsheeteditor/main/app/view/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/view/Toolbar.js @@ -157,7 +157,8 @@ define([ cls : 'btn-toolbar', iconCls : 'btn-undo', disabled : true, - lock : [_set.lostConnect] + lock : [_set.lostConnect], + signals : ['disabled'] }); me.btnRedo = new Common.UI.Button({ @@ -165,7 +166,8 @@ define([ cls : 'btn-toolbar', iconCls : 'btn-redo', disabled : true, - lock : [_set.lostConnect] + lock : [_set.lostConnect], + signals : ['disabled'] }); return this; @@ -370,9 +372,9 @@ define([ me.btnSave = new Common.UI.Button({ id : 'id-toolbar-btn-save', cls : 'btn-toolbar', - iconCls : 'no-mask ' + me.btnSaveCls + iconCls : 'no-mask ' + me.btnSaveCls, + signals : ['disabled'] }); - me.btnsSave = createButtonSet(me.btnSave); me.btnIncFontSize = new Common.UI.Button({ id : 'id-toolbar-btn-incfont', @@ -1233,7 +1235,7 @@ define([ me.cmbNumberFormat, me.btnBorders, me.btnInsertImage, me.btnInsertHyperlink, me.btnInsertChart, me.btnColorSchemas, me.btnAutofilter, me.btnCopy, me.btnPaste, me.btnSettings, me.listStyles, me.btnPrint, me.btnShowMode, - /*me.btnSave, */me.btnClearStyle, me.btnCopyStyle + me.btnSave, me.btnClearStyle, me.btnCopyStyle ]; var _temp_array = [me.cmbFontName, me.cmbFontSize, me.btnAlignLeft,me.btnAlignCenter,me.btnAlignRight,me.btnAlignJust,me.btnAlignTop, @@ -1706,15 +1708,6 @@ define([ itemTemplate: _.template('
        ') }); } - - var btnsave = SSE.getController('LeftMenu').getView('LeftMenu').getMenu('file').getButton('save'); - if (btnsave && this.btnsSave) { - this.btnsSave.add(btnsave); - } - btnsave = SSE.getController('Viewport').getView('Common.Views.Header').getButton('save'); - if (btnsave && this.btnsSave) { - this.btnsSave.add(btnsave); - } }, onToolbarAfterRender: function(toolbar) { @@ -1758,8 +1751,6 @@ define([ this.lockToolbar( SSE.enumLock.lostConnect, true ); this.lockToolbar( SSE.enumLock.lostConnect, true, {array:[this.btnEditChart,this.btnUndo,this.btnRedo]} ); - this.lockToolbar( SSE.enumLock.lostConnect, true, - {array:this.btnsSave} ); this.lockToolbar(SSE.enumLock.cantPrint, !mode.canPrint || mode.disableDownload, {array: [this.btnPrint]}); } else { this.mode = mode; @@ -1851,7 +1842,7 @@ define([ this.btnSave.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); } - this.btnsSave.setDisabled(false); + this.btnSave.setDisabled(false); Common.Gateway.collaborativeChanges(); }, @@ -1882,7 +1873,7 @@ define([ if (this.synchTooltip) this.synchTooltip.hide(); this.btnSave.updateHint(this.btnSaveTip); - this.btnsSave.setDisabled(!me.mode.forcesave); + this.btnSave.setDisabled(!me.mode.forcesave); this._state.hasCollaborativeChanges = false; } From 0b18b030600e937cd0a7f851207176da1ff59084 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 19 Feb 2018 14:56:44 +0300 Subject: [PATCH 19/73] [DE] Add bookmarks. --- .../less/advanced-settings-window.less | 6 +- apps/common/main/resources/less/toolbar.less | 1 + .../main/app/controller/Links.js | 18 +- .../main/app/template/Toolbar.template | 1 + .../main/app/view/BookmarksDialog.js | 210 ++++++++++++++++++ apps/documenteditor/main/app/view/Links.js | 19 +- .../main/resources/less/rightmenu.less | 4 + 7 files changed, 255 insertions(+), 4 deletions(-) create mode 100644 apps/documenteditor/main/app/view/BookmarksDialog.js diff --git a/apps/common/main/resources/less/advanced-settings-window.less b/apps/common/main/resources/less/advanced-settings-window.less index 58375bb9e..42c801961 100644 --- a/apps/common/main/resources/less/advanced-settings-window.less +++ b/apps/common/main/resources/less/advanced-settings-window.less @@ -36,12 +36,16 @@ } .footer { - padding-top: 15px; + padding: 15px 15px 0; &.center { text-align: center; } + &.right { + text-align: right; + } + &.justify { padding-left: 30px; padding-right: 30px; diff --git a/apps/common/main/resources/less/toolbar.less b/apps/common/main/resources/less/toolbar.less index 964fd49d2..96baf8e3f 100644 --- a/apps/common/main/resources/less/toolbar.less +++ b/apps/common/main/resources/less/toolbar.less @@ -311,3 +311,4 @@ .button-normal-icon(~'x-huge .btn-contents', 53, @toolbar-big-icon-size); .button-normal-icon(btn-controls, 54, @toolbar-big-icon-size); .button-normal-icon(~'x-huge .btn-select-pivot', 55, @toolbar-big-icon-size); +.button-normal-icon(~'x-huge .btn-bookmarks', 56, @toolbar-big-icon-size); diff --git a/apps/documenteditor/main/app/controller/Links.js b/apps/documenteditor/main/app/controller/Links.js index 272074446..001b4fd64 100644 --- a/apps/documenteditor/main/app/controller/Links.js +++ b/apps/documenteditor/main/app/controller/Links.js @@ -44,7 +44,8 @@ define([ 'documenteditor/main/app/view/Links', 'documenteditor/main/app/view/NoteSettingsDialog', 'documenteditor/main/app/view/HyperlinkSettingsDialog', - 'documenteditor/main/app/view/TableOfContentsSettings' + 'documenteditor/main/app/view/TableOfContentsSettings', + 'documenteditor/main/app/view/BookmarksDialog' ], function () { 'use strict'; @@ -64,7 +65,8 @@ define([ 'links:contents': this.onTableContents, 'links:update': this.onTableContentsUpdate, 'links:notes': this.onNotesClick, - 'links:hyperlink': this.onHyperlinkClick + 'links:hyperlink': this.onHyperlinkClick, + 'links:bookmarks': this.onBookmarksClick }, 'DocumentHolder': { 'links:contents': this.onTableContents, @@ -306,6 +308,18 @@ define([ }, 50); break; } + }, + + onBookmarksClick: function(btn) { + var me = this; + (new DE.Views.BookmarksDialog({ + handler: function (result, settings) { + if (settings) { + } + Common.NotificationCenter.trigger('edit:complete', me.toolbar); + }, + props: {} + })).show(); } }, DE.Controllers.Links || {})); diff --git a/apps/documenteditor/main/app/template/Toolbar.template b/apps/documenteditor/main/app/template/Toolbar.template index e1f406f59..75f5398ae 100644 --- a/apps/documenteditor/main/app/template/Toolbar.template +++ b/apps/documenteditor/main/app/template/Toolbar.template @@ -171,6 +171,7 @@
        +
        diff --git a/apps/documenteditor/main/app/view/BookmarksDialog.js b/apps/documenteditor/main/app/view/BookmarksDialog.js new file mode 100644 index 000000000..d2169905c --- /dev/null +++ b/apps/documenteditor/main/app/view/BookmarksDialog.js @@ -0,0 +1,210 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2017 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, + * EU, LV-1021. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ + +/** + * BookmarksDialog.js.js + * + * Created by Julia Radzhabova on 15.02.2018 + * Copyright (c) 2017 Ascensio System SIA. All rights reserved. + * + */ + +define([ + 'common/main/lib/util/utils', + 'common/main/lib/component/ListView', + 'common/main/lib/component/InputField', + 'common/main/lib/component/Button', + 'common/main/lib/component/RadioBox', + 'common/main/lib/view/AdvancedSettingsWindow' +], function () { 'use strict'; + + DE.Views.BookmarksDialog = Common.Views.AdvancedSettingsWindow.extend(_.extend({ + options: { + contentWidth: 300, + height: 340 + }, + + initialize : function(options) { + var me = this; + + _.extend(this.options, { + title: this.textTitle, + template: [ + '
        ', + '
        ', + '
        ', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '
        ', + '', + '
        ', + '
        ', + '', + '
        ', + '', + '
        ', + '
        ', + '
        ', + '
        ', + '
        ', + '', + '', + '
        ', + '
        ', + '
        ', + '
        ', + '' + ].join('') + }, options); + + this.api = options.api; + this.handler = options.handler; + this.props = options.props; + + Common.Views.AdvancedSettingsWindow.prototype.initialize.call(this, this.options); + }, + + render: function() { + Common.Views.AdvancedSettingsWindow.prototype.render.call(this); + var me = this; + + this.txtName = new Common.UI.InputField({ + el : $('#bookmarks-txt-name'), + allowBlank : true, + validateOnChange: true, + validateOnBlur: false, + style : 'width: 195px;', + value : '' + }).on ('changing', function (input, value) { + }); + + this.radioName = new Common.UI.RadioBox({ + el: $('#bookmarks-radio-name'), + labelText: this.textName, + name: 'asc-radio-bookmark-sort', + checked: true + }); + // this.radioName.on('change', _.bind(this.onRadioNameChange, this)); + + this.radioLocation = new Common.UI.RadioBox({ + el: $('#bookmarks-radio-location'), + labelText: this.textLocation, + name: 'asc-radio-bookmark-sort' + }); + // this.radioName.on('change', _.bind(this.onRadioNameChange, this)); + + this.bookmarksList = new Common.UI.ListView({ + el: $('#bookmarks-list', this.$window), + store: new Common.UI.DataViewStore() + }); + this.bookmarksList.store.comparator = function(rec) { + return (me.radioName.getValue() ? rec.get("name") : rec.get("location")); + }; + // this.bookmarksList.on('item:dblclick', _.bind(this.onDblClickFunction, this)); + // this.bookmarksList.on('entervalue', _.bind(this.onPrimary, this)); + // this.bookmarksList.on('item:select', _.bind(this.onSelectBookmark, this)); + + this.btnAdd = new Common.UI.Button({ + el: $('#bookmarks-btn-add') + }); + this.$window.find('#bookmarks-btn-add').on('click', _.bind(this.onDlgBtnClick, this)); + + this.btnGoto = new Common.UI.Button({ + el: $('#bookmarks-btn-goto') + }); + + this.btnDelete = new Common.UI.Button({ + el: $('#bookmarks-btn-delete') + }); + + this.afterRender(); + }, + + afterRender: function() { + this._setDefaults(this.props); + }, + + show: function() { + Common.Views.AdvancedSettingsWindow.prototype.show.apply(this, arguments); + }, + + _setDefaults: function (props) { + if (props) { + } + }, + + getSettings: function () { + return {}; + }, + + onDlgBtnClick: function(event) { + var state = (typeof(event) == 'object') ? event.currentTarget.attributes['result'].value : event; + if (state == 'add') { + this.handler && this.handler.call(this, state, (state == 'add') ? this.getSettings() : undefined); + } + + this.close(); + }, + + onPrimary: function() { + return true; + }, + + textTitle: 'Bookmarks', + textLocation: 'Location', + textBookmarkName: 'Bookmark name', + textSort: 'Sort by', + textName: 'Name', + textAdd: 'Add', + textGoto: 'Go to', + textDelete: 'Delete', + textClose: 'Close' + + }, DE.Views.BookmarksDialog || {})) +}); \ No newline at end of file diff --git a/apps/documenteditor/main/app/view/Links.js b/apps/documenteditor/main/app/view/Links.js index a40710f1f..6bb9f6525 100644 --- a/apps/documenteditor/main/app/view/Links.js +++ b/apps/documenteditor/main/app/view/Links.js @@ -91,6 +91,10 @@ define([ me.fireEvent('links:hyperlink'); }); }); + + this.btnBookmarks.on('click', function (b, e) { + me.fireEvent('links:bookmarks'); + }); } return { @@ -151,6 +155,15 @@ define([ _injectComponent('#slot-btn-contents-update', this.btnContentsUpdate); this.paragraphControls.push(this.btnContentsUpdate); + this.btnBookmarks = new Common.UI.Button({ + cls: 'btn-toolbar x-huge icon-top', + iconCls: 'btn-bookmarks', + caption: this.capBtnBookmarks, + disabled: true + }); + _injectComponent('#slot-btn-bookmarks', this.btnBookmarks); + this.paragraphControls.push(this.btnBookmarks); + this._state = {disabled: false}; Common.NotificationCenter.on('app:ready', this.onAppReady.bind(this)); }, @@ -229,6 +242,8 @@ define([ btn.updateHint(me.tipInsertHyperlink + Common.Utils.String.platformKey('Ctrl+K')); }); + me.btnBookmarks.updateHint(me.tipBookmarks); + setEvents.call(me); }); }, @@ -267,7 +282,9 @@ define([ capBtnInsFootnote: 'Footnotes', confirmDeleteFootnotes: 'Do you want to delete all footnotes?', capBtnInsLink: 'Hyperlink', - tipInsertHyperlink: 'Add Hyperlink' + tipInsertHyperlink: 'Add Hyperlink', + capBtnBookmarks: 'Bookmark', + tipBookmarks: 'Create a bookmark' } }()), DE.Views.Links || {})); }); \ No newline at end of file diff --git a/apps/documenteditor/main/resources/less/rightmenu.less b/apps/documenteditor/main/resources/less/rightmenu.less index 90b026654..12a2b1681 100644 --- a/apps/documenteditor/main/resources/less/rightmenu.less +++ b/apps/documenteditor/main/resources/less/rightmenu.less @@ -31,6 +31,10 @@ display: block; } + .padding-extra-small { + padding-bottom: 2px; + } + .padding-small { padding-bottom: 8px; } From dcd1589adc65d36abb8207b313caf65752f413bc Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Thu, 22 Feb 2018 02:23:32 +0300 Subject: [PATCH 20/73] [common] added 'Desktop' controller --- apps/api/documents/index.html.desktop | 4 +- apps/common/main/lib/controller/Desktop.js | 77 +++++++++++++++++++ apps/documenteditor/main/app.js | 1 + .../main/app/controller/Main.js | 8 +- apps/documenteditor/main/app_dev.js | 1 + apps/documenteditor/main/index.html.deploy | 4 + apps/presentationeditor/main/app.js | 1 + .../main/app/controller/Main.js | 7 +- apps/presentationeditor/main/app_dev.js | 1 + .../presentationeditor/main/index.html.deploy | 4 + apps/spreadsheeteditor/main/app.js | 1 + .../main/app/controller/Main.js | 6 +- apps/spreadsheeteditor/main/app_dev.js | 1 + apps/spreadsheeteditor/main/index.html.deploy | 4 + 14 files changed, 104 insertions(+), 16 deletions(-) create mode 100644 apps/common/main/lib/controller/Desktop.js diff --git a/apps/api/documents/index.html.desktop b/apps/api/documents/index.html.desktop index 03edba6c1..28857deae 100644 --- a/apps/api/documents/index.html.desktop +++ b/apps/api/documents/index.html.desktop @@ -58,8 +58,6 @@ editorConfig: cfg, events: { onInternalMessage: onInternalMessage, - onDocumentReady: onDocumentReady - } }); @@ -97,7 +95,7 @@ function getEditorConfig(urlParams) { return { customization : { - goback: { url: "callback" } + goback: { url: "onlyoffice.com" } }, mode : urlParams["mode"] || 'edit', lang : urlParams["lang"] || 'en', diff --git a/apps/common/main/lib/controller/Desktop.js b/apps/common/main/lib/controller/Desktop.js new file mode 100644 index 000000000..a395d131a --- /dev/null +++ b/apps/common/main/lib/controller/Desktop.js @@ -0,0 +1,77 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2018 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, + * EU, LV-1021. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ +/** + * Controller wraps up interaction with desktop app + * + * Created by Maxim.Kadushkin on 2/16/2018. + */ + +define([ + 'core' +], function () { + 'use strict'; + + var Desktop = function () { + var config = {}; + var app = window.AscDesktopEditor; + + // if ( app ) { + // app.execCommand('doc:onload', ''); + // } + + return { + init: function (opts) { + _.extend(config, opts); + + if ( config.isDesktopApp ) { + Common.NotificationCenter.on('app:ready', function (config) { + !!app && app.execCommand('doc:onready', ''); + }); + } + }, + process: function (opts) { + if ( opts == 'goback' ) { + if ( config.isDesktopApp && !!app ) { + app.execCommand('go:folder', + config.isOffline ? 'offline' : config.customization.goback.url); + return true; + } + + return false; + } + } + }; + }; + + Common.Controllers.Desktop = new Desktop(); +}); \ No newline at end of file diff --git a/apps/documenteditor/main/app.js b/apps/documenteditor/main/app.js index 1c13c3c9b..67777e15e 100644 --- a/apps/documenteditor/main/app.js +++ b/apps/documenteditor/main/app.js @@ -203,6 +203,7 @@ require([ ,'common/main/lib/controller/ExternalMergeEditor' ,'common/main/lib/controller/ReviewChanges' ,'common/main/lib/controller/Protection' + ,'common/main/lib/controller/Desktop' ], function() { app.start(); }); diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index 5e0e20d50..8e94441c9 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -314,6 +314,8 @@ define([ if (this.appOptions.location == 'us' || this.appOptions.location == 'ca') Common.Utils.Metric.setDefaultMetric(Common.Utils.Metric.c_MetricUnits.inch); + + Common.Controllers.Desktop.init(this.appOptions); }, loadDocument: function(data) { @@ -582,11 +584,7 @@ define([ }, goBack: function(blank) { - var me = this; - if ( me.appOptions.customization.goback.url == 'callback' ) { - Common.Gateway.internalMessage( 'goback', - {status: me.appOptions.isOffline ? 'offline' : 'online'} ); - } else { + if ( !Common.Controllers.Desktop.process('goback') ) { var href = this.appOptions.customization.goback.url; if (blank) { window.open(href, "_blank"); diff --git a/apps/documenteditor/main/app_dev.js b/apps/documenteditor/main/app_dev.js index 9450b3f55..2648611ab 100644 --- a/apps/documenteditor/main/app_dev.js +++ b/apps/documenteditor/main/app_dev.js @@ -193,6 +193,7 @@ require([ ,'common/main/lib/controller/ExternalMergeEditor' ,'common/main/lib/controller/ReviewChanges' ,'common/main/lib/controller/Protection' + ,'common/main/lib/controller/Desktop' ], function() { window.compareVersions = true; app.start(); diff --git a/apps/documenteditor/main/index.html.deploy b/apps/documenteditor/main/index.html.deploy index 1feaf1eb7..eaeb02bfa 100644 --- a/apps/documenteditor/main/index.html.deploy +++ b/apps/documenteditor/main/index.html.deploy @@ -217,6 +217,10 @@ .replace(/>/g, '>'); } + if ( window.AscDesktopEditor ) { + window.AscDesktopEditor.execCommand('doc:onload', ''); + } + var params = getUrlParams(), lang = (params["lang"] || 'en').split(/[\-\_]/)[0], customer = params["customer"] ? ('
        ' + encodeUrlParam(params["customer"]) + '
        ') : '', diff --git a/apps/presentationeditor/main/app.js b/apps/presentationeditor/main/app.js index 88c9a9a38..330f222e6 100644 --- a/apps/presentationeditor/main/app.js +++ b/apps/presentationeditor/main/app.js @@ -190,6 +190,7 @@ require([ 'common/main/lib/controller/ExternalDiagramEditor' ,'common/main/lib/controller/ReviewChanges' ,'common/main/lib/controller/Protection' + ,'common/main/lib/controller/Desktop' ], function() { app.start(); }); diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js index 150a04afa..387287540 100644 --- a/apps/presentationeditor/main/app/controller/Main.js +++ b/apps/presentationeditor/main/app/controller/Main.js @@ -295,6 +295,8 @@ define([ if (this.appOptions.location == 'us' || this.appOptions.location == 'ca') Common.Utils.Metric.setDefaultMetric(Common.Utils.Metric.c_MetricUnits.inch); + + Common.Controllers.Desktop.init(this.appOptions); }, loadDocument: function(data) { @@ -394,10 +396,7 @@ define([ goBack: function(blank) { var me = this; - if ( me.appOptions.customization.goback.url == 'callback' ) { - Common.Gateway.internalMessage( 'goback', - {status: me.appOptions.isOffline ? 'offline' : 'online'} ); - } else { + if ( !Common.Controllers.Desktop.process('goback') ) { var href = me.appOptions.customization.goback.url; if (blank) { window.open(href, "_blank"); diff --git a/apps/presentationeditor/main/app_dev.js b/apps/presentationeditor/main/app_dev.js index d23302912..f87f4a08d 100644 --- a/apps/presentationeditor/main/app_dev.js +++ b/apps/presentationeditor/main/app_dev.js @@ -181,6 +181,7 @@ require([ 'common/main/lib/controller/ExternalDiagramEditor' ,'common/main/lib/controller/ReviewChanges' ,'common/main/lib/controller/Protection' + ,'common/main/lib/controller/Desktop' ], function() { window.compareVersions = true; app.start(); diff --git a/apps/presentationeditor/main/index.html.deploy b/apps/presentationeditor/main/index.html.deploy index a07952daa..cdb86c3cf 100644 --- a/apps/presentationeditor/main/index.html.deploy +++ b/apps/presentationeditor/main/index.html.deploy @@ -217,6 +217,10 @@ .replace(/>/g, '>'); } + if ( window.AscDesktopEditor ) { + window.AscDesktopEditor.execCommand('doc:onload', ''); + } + var params = getUrlParams(), lang = (params["lang"] || 'en').split(/[\-\_]/)[0], customer = params["customer"] ? ('
        ' + encodeUrlParam(params["customer"]) + '
        ') : '', diff --git a/apps/spreadsheeteditor/main/app.js b/apps/spreadsheeteditor/main/app.js index 6a342e504..13f09bb8f 100644 --- a/apps/spreadsheeteditor/main/app.js +++ b/apps/spreadsheeteditor/main/app.js @@ -196,6 +196,7 @@ require([ 'common/main/lib/controller/Plugins' ,'common/main/lib/controller/ReviewChanges' ,'common/main/lib/controller/Protection' + ,'common/main/lib/controller/Desktop' ], function() { app.start(); }); diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index 9d5505a6d..e84b3f6aa 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -335,6 +335,7 @@ define([ Common.Utils.Metric.setDefaultMetric(Common.Utils.Metric.c_MetricUnits.inch); this.isFrameClosed = (this.appOptions.isEditDiagram || this.appOptions.isEditMailMerge); + Common.Controllers.Desktop.init(this.appOptions); }, loadDocument: function(data) { @@ -429,10 +430,7 @@ define([ goBack: function(blank) { var me = this; - if ( me.appOptions.customization.goback.url == 'callback' ) { - Common.Gateway.internalMessage( 'goback', - {status: me.appOptions.isOffline ? 'offline' : 'online'} ); - } else { + if ( !Common.Controllers.Desktop.process('goback') ) { var href = me.appOptions.customization.goback.url; if (blank) { window.open(href, "_blank"); diff --git a/apps/spreadsheeteditor/main/app_dev.js b/apps/spreadsheeteditor/main/app_dev.js index 6971b85b8..e0e30a0b4 100644 --- a/apps/spreadsheeteditor/main/app_dev.js +++ b/apps/spreadsheeteditor/main/app_dev.js @@ -186,6 +186,7 @@ require([ 'common/main/lib/controller/Plugins' ,'common/main/lib/controller/ReviewChanges' ,'common/main/lib/controller/Protection' + ,'common/main/lib/controller/Desktop' ], function() { window.compareVersions = true; app.start(); diff --git a/apps/spreadsheeteditor/main/index.html.deploy b/apps/spreadsheeteditor/main/index.html.deploy index 2d9f8e90a..c64dfce31 100644 --- a/apps/spreadsheeteditor/main/index.html.deploy +++ b/apps/spreadsheeteditor/main/index.html.deploy @@ -216,6 +216,10 @@ .replace(/>/g, '>'); } + if ( window.AscDesktopEditor ) { + window.AscDesktopEditor.execCommand('doc:onload', ''); + } + var params = getUrlParams(), lang = (params["lang"] || 'en').split(/[\-\_]/)[0], customer = params["customer"] ? ('
        ' + encodeUrlParam(params["customer"]) + '
        ') : '', From 39f29c5ef8f20b3dbd51497874bf9a46f911fdbb Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Fri, 23 Feb 2018 00:19:40 +0300 Subject: [PATCH 21/73] [common] lock/unlock header buttons on file menu events --- apps/common/main/lib/view/Header.js | 29 +++++++++++++++++++ apps/common/main/resources/less/header.less | 11 +++++++ .../main/app/controller/Viewport.js | 23 +++++++++++++-- .../main/app/controller/Viewport.js | 26 ++++++++++++++--- .../main/app/controller/Viewport.js | 26 ++++++++++++++--- 5 files changed, 104 insertions(+), 11 deletions(-) diff --git a/apps/common/main/lib/view/Header.js b/apps/common/main/lib/view/Header.js index 21263f6da..38e2729e0 100644 --- a/apps/common/main/lib/view/Header.js +++ b/apps/common/main/lib/view/Header.js @@ -630,6 +630,35 @@ define([ return this.btnSave; }, + lockHeaderBtns: function (alias, lock) { + var me = this; + if ( alias == 'users' ) { + if ( lock ) + $btnUsers.addClass('disabled').attr('disabled', 'disabled'); else + $btnUsers.removeClass('disabled').attr('disabled', ''); + } else { + function _lockButton(btn) { + if ( btn ) { + if ( lock ) { + btn.keepState = { + disabled: btn.isDisabled() + }; + } else { + btn.setDisabled( btn.keepState.disabled ); + delete me.btnUndo.keepState; + } + } + } + + if ( alias == 'undo' ) { + _lockButton(me.btnUndo); + } else + if ( alias == 'redo' ) { + _lockButton(me.btnRedo); + } + } + }, + textBack: 'Go to Documents', txtRename: 'Rename', textSaveBegin: 'Saving...', diff --git a/apps/common/main/resources/less/header.less b/apps/common/main/resources/less/header.less index 73243b7f6..e53a67037 100644 --- a/apps/common/main/resources/less/header.less +++ b/apps/common/main/resources/less/header.less @@ -168,6 +168,11 @@ cursor: pointer; font-size: 14px; } + + &.disabled { + opacity: 0.65; + pointer-events: none; + } } .cousers-menu { @@ -180,6 +185,12 @@ width: 285px; font-size: 12px; + z-index: 1042; + + .top-title & { + top: @height-title + @height-tabs - 8px; + } + > label { white-space: normal; } diff --git a/apps/documenteditor/main/app/controller/Viewport.js b/apps/documenteditor/main/app/controller/Viewport.js index 83097ded2..c1cc0ea62 100644 --- a/apps/documenteditor/main/app/controller/Viewport.js +++ b/apps/documenteditor/main/app/controller/Viewport.js @@ -68,6 +68,10 @@ define([ var me = this; this.addListeners({ + 'FileMenu': { + 'menu:hide': me.onFileMenu.bind(me, 'hide'), + 'menu:show': me.onFileMenu.bind(me, 'show') + }, 'Toolbar': { 'render:before' : function (toolbar) { var config = DE.getController('Main').appOptions; @@ -79,12 +83,17 @@ define([ Common.Utils.InternalSettings.get('toolbar-height-compact') : Common.Utils.InternalSettings.get('toolbar-height-normal'); }, 'undo:disabled' : function (state) { - if ( me.header.btnUndo ) - me.header.btnUndo.setDisabled(state); + if ( me.header.btnUndo ) { + if ( me.header.btnUndo.keepState ) + me.header.btnUndo.keepState.disabled = state; + else me.header.btnUndo.setDisabled(state); + } }, 'redo:disabled' : function (state) { if ( me.header.btnRedo ) - me.header.btnRedo.setDisabled(state); + if ( me.header.btnRedo.keepState ) + me.header.btnRedo.keepState.disabled = state; + else me.header.btnRedo.setDisabled(state); }, 'save:disabled' : function (state) { if ( me.header.btnSave ) @@ -197,6 +206,14 @@ define([ onWindowResize: function(e) { this.onLayoutChanged('window'); Common.NotificationCenter.trigger('window:resize'); + }, + + onFileMenu: function (opts) { + var me = this; + var _need_disable = opts == 'show'; + + me.header.lockHeaderBtns( 'undo', _need_disable ); + me.header.lockHeaderBtns( 'redo', _need_disable ); } }); }); diff --git a/apps/presentationeditor/main/app/controller/Viewport.js b/apps/presentationeditor/main/app/controller/Viewport.js index 298096677..6d80c3200 100644 --- a/apps/presentationeditor/main/app/controller/Viewport.js +++ b/apps/presentationeditor/main/app/controller/Viewport.js @@ -69,6 +69,10 @@ define([ // This most important part when we will tell our controller what events should be handled this.addListeners({ + 'FileMenu': { + 'menu:hide': me.onFileMenu.bind(me, 'hide'), + 'menu:show': me.onFileMenu.bind(me, 'show') + }, 'Toolbar': { 'render:before' : function (toolbar) { var config = PE.getController('Main').appOptions; @@ -80,12 +84,18 @@ define([ Common.Utils.InternalSettings.get('toolbar-height-compact') : Common.Utils.InternalSettings.get('toolbar-height-normal'); }, 'undo:disabled' : function (state) { - if ( me.header.btnUndo ) - me.header.btnUndo.setDisabled(state); + if ( me.header.btnUndo ) { + if ( me.header.btnUndo.keepState ) + me.header.btnUndo.keepState.disabled = state; + else me.header.btnUndo.setDisabled(state); + } }, 'redo:disabled' : function (state) { - if ( me.header.btnRedo ) - me.header.btnRedo.setDisabled(state); + if ( me.header.btnRedo ) { + if ( me.header.btnRedo.keepState ) + me.header.btnRedo.keepState.disabled = state; + else me.header.btnRedo.setDisabled(state); + } }, 'save:disabled' : function (state) { if ( me.header.btnSave ) @@ -236,6 +246,14 @@ define([ element.msRequestFullscreen(); } } + }, + + onFileMenu: function (opts) { + var me = this; + var _need_disable = opts == 'show'; + + me.header.lockHeaderBtns( 'undo', _need_disable ); + me.header.lockHeaderBtns( 'redo', _need_disable ); } }); }); diff --git a/apps/spreadsheeteditor/main/app/controller/Viewport.js b/apps/spreadsheeteditor/main/app/controller/Viewport.js index dadd49ec1..9998b0722 100644 --- a/apps/spreadsheeteditor/main/app/controller/Viewport.js +++ b/apps/spreadsheeteditor/main/app/controller/Viewport.js @@ -67,6 +67,10 @@ define([ // This most important part when we will tell our controller what events should be handled this.addListeners({ + 'FileMenu': { + 'menu:hide': me.onFileMenu.bind(me, 'hide'), + 'menu:show': me.onFileMenu.bind(me, 'show') + }, 'Toolbar': { 'render:before' : function (toolbar) { var config = SSE.getController('Main').appOptions; @@ -78,12 +82,18 @@ define([ Common.Utils.InternalSettings.get('toolbar-height-compact') : Common.Utils.InternalSettings.get('toolbar-height-normal'); }, 'undo:disabled' : function (state) { - if ( me.header.btnUndo ) - me.header.btnUndo.setDisabled(state); + if ( me.header.btnUndo ) { + if ( me.header.btnUndo.keepState ) + me.header.btnUndo.keepState.disabled = state; + else me.header.btnUndo.setDisabled(state); + } }, 'redo:disabled' : function (state) { - if ( me.header.btnRedo ) - me.header.btnRedo.setDisabled(state); + if ( me.header.btnRedo ) { + if ( me.header.btnRedo.keepState ) + me.header.btnRedo.keepState.disabled = state; + else me.header.btnRedo.setDisabled(state); + } }, 'save:disabled' : function (state) { if ( me.header.btnSave ) @@ -205,6 +215,14 @@ define([ onWindowResize: function(e) { this.onLayoutChanged('window'); Common.NotificationCenter.trigger('window:resize'); + }, + + onFileMenu: function (opts) { + var me = this; + var _need_disable = opts == 'show'; + + me.header.lockHeaderBtns( 'undo', _need_disable ); + me.header.lockHeaderBtns( 'redo', _need_disable ); } }); }); From e239437015b5c96e724f3e0c1554885e08dabb3c Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Fri, 23 Feb 2018 01:01:00 +0300 Subject: [PATCH 22/73] [SSE] updated toolbar color --- apps/spreadsheeteditor/main/resources/less/toolbar.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/spreadsheeteditor/main/resources/less/toolbar.less b/apps/spreadsheeteditor/main/resources/less/toolbar.less index 934805ee3..ebacaa1d5 100644 --- a/apps/spreadsheeteditor/main/resources/less/toolbar.less +++ b/apps/spreadsheeteditor/main/resources/less/toolbar.less @@ -1,4 +1,4 @@ -@tabs-bg-color: #48795c; +@tabs-bg-color: #40865c; .toolbar { &:not(.cover) { From fc6c6c2cb8e531de167bf92300bb7207a83fb79a Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Sun, 25 Feb 2018 01:19:36 +0300 Subject: [PATCH 23/73] refactoring --- .../main/app/controller/Toolbar.js | 24 +++++++------------ apps/documenteditor/main/app/view/Toolbar.js | 20 +++++++--------- .../main/app/view/Toolbar.js | 20 +++++++--------- .../main/app/controller/Toolbar.js | 2 +- .../main/app/view/Toolbar.js | 19 ++++++--------- 5 files changed, 32 insertions(+), 53 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index 49455e079..0bbb5b629 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -524,14 +524,9 @@ define([ var btnHorizontalAlign = this.toolbar.btnHorizontalAlign; - if (btnHorizontalAlign.rendered) { - var iconEl = $('.icon', btnHorizontalAlign.cmpEl); - - if (iconEl) { - iconEl.removeClass(btnHorizontalAlign.options.icls); - btnHorizontalAlign.options.icls = align; - iconEl.addClass(btnHorizontalAlign.options.icls); - } + if ( btnHorizontalAlign.rendered && btnHorizontalAlign.$icon ) { + btnHorizontalAlign.$icon.removeClass(btnHorizontalAlign.options.icls).addClass(align); + btnHorizontalAlign.options.icls = align; } if (v === null || v===undefined) { @@ -917,7 +912,7 @@ define([ var toolbar = this.toolbar; if (this.api) { var isModified = this.api.asc_isDocumentCanSave(); - var isSyncButton = $('.icon', toolbar.btnSave.cmpEl).hasClass('btn-synch'); + var isSyncButton = toolbar.btnSave.$icon.hasClass('btn-synch'); if (!isModified && !isSyncButton && !toolbar.mode.forcesave) return; @@ -1077,14 +1072,11 @@ define([ onMenuHorizontalAlignSelect: function(menu, item) { this._state.pralign = undefined; - var btnHorizontalAlign = this.toolbar.btnHorizontalAlign, - iconEl = $('.icon', btnHorizontalAlign.cmpEl); + var btnHorizontalAlign = this.toolbar.btnHorizontalAlign; - if (iconEl) { - iconEl.removeClass(btnHorizontalAlign.options.icls); - btnHorizontalAlign.options.icls = !item.checked ? 'btn-align-left' : item.options.icls; - iconEl.addClass(btnHorizontalAlign.options.icls); - } + btnHorizontalAlign.$icon.removeClass(btnHorizontalAlign.options.icls); + btnHorizontalAlign.options.icls = !item.checked ? 'btn-align-left' : item.options.icls; + btnHorizontalAlign.$icon.addClass(btnHorizontalAlign.options.icls); if (this.api && item.checked) this.api.put_PrAlign(item.value); diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index 7f2985549..93474165f 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -1323,6 +1323,8 @@ define([ Array.prototype.push.apply(me.paragraphControls, me.btnsPageBreak); }.call(this); + this.btnSave.$icon = $('.icon', this.btnSave.cmpEl); + this.btnHorizontalAlign.$icon = $('.icon', this.btnHorizontalAlign.cmpEl); return $host; }, @@ -2122,9 +2124,7 @@ define([ } this._state.hasCollaborativeChanges = true; - var iconEl = $('.icon', this.btnSave.cmpEl); - iconEl.removeClass(this.btnSaveCls); - iconEl.addClass('btn-synch'); + this.btnSave.$icon.removeClass(this.btnSaveCls).addClass('btn-synch'); if (this.showSynchTip) { this.btnSave.updateHint(''); if (this.synchTooltip === undefined) @@ -2157,12 +2157,10 @@ define([ synchronizeChanges: function () { if (!this._state.previewmode && this.btnSave.rendered) { - var iconEl = $('.icon', this.btnSave.cmpEl), - me = this; + var me = this; - if (iconEl.hasClass('btn-synch')) { - iconEl.removeClass('btn-synch'); - iconEl.addClass(this.btnSaveCls); + if ( me.btnSave.$icon.hasClass('btn-synch') ) { + me.btnSave.$icon.removeClass('btn-synch').addClass(me.btnSaveCls); if (this.synchTooltip) this.synchTooltip.hide(); this.btnSave.updateHint(this.btnSaveTip); @@ -2184,10 +2182,8 @@ define([ if (cls !== this.btnSaveCls && this.btnSave.rendered) { this.btnSaveTip = ((length > 1) ? this.tipSaveCoauth : this.tipSave ) + Common.Utils.String.platformKey('Ctrl+S'); - var iconEl = $('.icon', this.btnSave.cmpEl); - if (!iconEl.hasClass('btn-synch')) { - iconEl.removeClass(this.btnSaveCls); - iconEl.addClass(cls); + if ( !this.btnSave.$icon.hasClass('btn-synch') ) { + this.btnSave.$icon.removeClass(this.btnSaveCls).addClass(cls); this.btnSave.updateHint(this.btnSaveTip); } this.btnSaveCls = cls; diff --git a/apps/presentationeditor/main/app/view/Toolbar.js b/apps/presentationeditor/main/app/view/Toolbar.js index f20a8aa58..0ad878eaf 100644 --- a/apps/presentationeditor/main/app/view/Toolbar.js +++ b/apps/presentationeditor/main/app/view/Toolbar.js @@ -1012,6 +1012,8 @@ define([ } }); + me.btnSave.$icon = $('.icon', me.btnSave.cmpEl); + var created = me.btnsInsertImage.concat(me.btnsInsertText, me.btnsInsertShape, me.btnsAddSlide); this.lockToolbar(PE.enumLock.disableOnStart, true, {array: created}); @@ -1479,9 +1481,7 @@ define([ } this._state.hasCollaborativeChanges = true; - var iconEl = $('.icon', this.btnSave.cmpEl); - iconEl.removeClass(this.btnSaveCls); - iconEl.addClass('btn-synch'); + this.btnSave.$icon.removeClass(this.btnSaveCls).addClass('btn-synch'); if (this.showSynchTip) { this.btnSave.updateHint(''); if (this.synchTooltip === undefined) @@ -1514,12 +1514,10 @@ define([ synchronizeChanges: function () { if (this.btnSave.rendered) { - var iconEl = $('.icon', this.btnSave.cmpEl), - me = this; + var me = this; - if (iconEl.hasClass('btn-synch')) { - iconEl.removeClass('btn-synch'); - iconEl.addClass(this.btnSaveCls); + if ( me.btnSave.$icon.hasClass('btn-synch') ) { + me.btnSave.$icon.removeClass('btn-synch').addClass(this.btnSaveCls); if (this.synchTooltip) this.synchTooltip.hide(); this.btnSave.updateHint(this.btnSaveTip); @@ -1542,10 +1540,8 @@ define([ if (cls !== this.btnSaveCls && this.btnSave.rendered) { this.btnSaveTip = ((length > 1) ? this.tipSaveCoauth : this.tipSave ) + Common.Utils.String.platformKey('Ctrl+S'); - var iconEl = $('.icon', this.btnSave.cmpEl); - if (!iconEl.hasClass('btn-synch')) { - iconEl.removeClass(this.btnSaveCls); - iconEl.addClass(cls); + if ( !this.btnSave.$icon.hasClass('btn-synch') ) { + this.btnSave.$icon.removeClass(this.btnSaveCls).addClass(cls); this.btnSave.updateHint(this.btnSaveTip); } this.btnSaveCls = cls; diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js index 4a28083c3..f21ff9169 100644 --- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js @@ -386,7 +386,7 @@ define([ onSave: function(e) { if (this.api) { var isModified = this.api.asc_isDocumentCanSave(); - var isSyncButton = $('.icon', this.toolbar.btnSave.cmpEl).hasClass('btn-synch'); + var isSyncButton = this.toolbar.btnSave.$icon.hasClass('btn-synch'); if (!isModified && !isSyncButton && !this.toolbar.mode.forcesave) return; diff --git a/apps/spreadsheeteditor/main/app/view/Toolbar.js b/apps/spreadsheeteditor/main/app/view/Toolbar.js index f627aafb7..7b0f621d8 100644 --- a/apps/spreadsheeteditor/main/app/view/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/view/Toolbar.js @@ -1388,6 +1388,7 @@ define([ // replacePlacholder('#id-toolbar-short-placeholder-btn-valign', this.btnVerticalAlign); // replacePlacholder('#id-toolbar-short-placeholder-btn-filter', this.btnAutofilter); + this.btnSave.$icon = $('.icon', this.btnSave.cmpEl); return $host; }, @@ -1828,9 +1829,7 @@ define([ } this._state.hasCollaborativeChanges = true; - var iconEl = $('.icon', this.btnSave.cmpEl); - iconEl.removeClass(this.btnSaveCls); - iconEl.addClass('btn-synch'); + this.btnSave.$icon.removeClass(this.btnSaveCls).addClass('btn-synch'); if (this.showSynchTip){ this.btnSave.updateHint(''); @@ -1864,12 +1863,10 @@ define([ synchronizeChanges: function() { if (this.btnSave.rendered) { - var iconEl = $('.icon', this.btnSave.cmpEl), - me = this; + var me = this; - if (iconEl.hasClass('btn-synch')) { - iconEl.removeClass('btn-synch'); - iconEl.addClass(this.btnSaveCls); + if ( me.btnSave.$icon.hasClass('btn-synch') ) { + me.btnSave.$icon.removeClass('btn-synch').addClass(this.btnSaveCls); if (this.synchTooltip) this.synchTooltip.hide(); this.btnSave.updateHint(this.btnSaveTip); @@ -1892,10 +1889,8 @@ define([ if (cls !== this.btnSaveCls && this.btnSave.rendered) { this.btnSaveTip = ((length>1) ? this.tipSaveCoauth : this.tipSave )+ Common.Utils.String.platformKey('Ctrl+S'); - var iconEl = $('.icon', this.btnSave.cmpEl); - if (!iconEl.hasClass('btn-synch')) { - iconEl.removeClass(this.btnSaveCls); - iconEl.addClass(cls); + if ( !this.btnSave.$icon.hasClass('btn-synch') ) { + this.btnSave.$icon.removeClass(this.btnSaveCls).addClass(cls); this.btnSave.updateHint(this.btnSaveTip); } this.btnSaveCls = cls; From b6ec334a7dc6edeb58246fc00ea53519091a0651 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 26 Feb 2018 15:59:38 +0300 Subject: [PATCH 24/73] [DE] Fix Bug 35612 --- apps/documenteditor/main/app/view/ImageSettings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/documenteditor/main/app/view/ImageSettings.js b/apps/documenteditor/main/app/view/ImageSettings.js index fe6551062..bb9f0f1b5 100644 --- a/apps/documenteditor/main/app/view/ImageSettings.js +++ b/apps/documenteditor/main/app/view/ImageSettings.js @@ -318,7 +318,7 @@ define([ if (this.api) { var section = this.api.asc_GetSectionProps(), ratio = (this._state.Height>0) ? this._state.Width/this._state.Height : 1, - pagew = section.get_W() - section.get_LeftMargin() - section.get_RightMargin(), + pagew = this.api.asc_GetCurrentColumnWidth(), pageh = section.get_H() - section.get_TopMargin() - section.get_BottomMargin(), pageratio = pagew/pageh, w, h; From 6d0a353d7891faf7f7a5925a23b3131f6b23f896 Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Mon, 26 Feb 2018 16:23:07 +0300 Subject: [PATCH 25/73] [Common] refactoring. defined $icon element for a button --- apps/common/main/lib/component/Button.js | 1 + apps/documenteditor/main/app/view/Toolbar.js | 2 - .../main/app/controller/Toolbar.js | 46 ++++------ .../main/app/view/Toolbar.js | 2 - .../main/app/controller/Toolbar.js | 83 ++++++------------- .../main/app/view/Toolbar.js | 1 - 6 files changed, 43 insertions(+), 92 deletions(-) diff --git a/apps/common/main/lib/component/Button.js b/apps/common/main/lib/component/Button.js index 2315c167a..71a4c74f4 100644 --- a/apps/common/main/lib/component/Button.js +++ b/apps/common/main/lib/component/Button.js @@ -350,6 +350,7 @@ define([ me.menu.render(me.cmpEl); parentEl.html(me.cmpEl); + me.$icon = me.$el.find('.icon'); } } diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index 93474165f..7dfe2dbf9 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -1323,8 +1323,6 @@ define([ Array.prototype.push.apply(me.paragraphControls, me.btnsPageBreak); }.call(this); - this.btnSave.$icon = $('.icon', this.btnSave.cmpEl); - this.btnHorizontalAlign.$icon = $('.icon', this.btnHorizontalAlign.cmpEl); return $host; }, diff --git a/apps/presentationeditor/main/app/controller/Toolbar.js b/apps/presentationeditor/main/app/controller/Toolbar.js index 4099bc566..956aded7f 100644 --- a/apps/presentationeditor/main/app/controller/Toolbar.js +++ b/apps/presentationeditor/main/app/controller/Toolbar.js @@ -514,14 +514,9 @@ define([ btnHorizontalAlign.menu.clearAll(); } - if (btnHorizontalAlign.rendered) { - var iconEl = $('.icon', btnHorizontalAlign.cmpEl); - - if (iconEl) { - iconEl.removeClass(btnHorizontalAlign.options.icls); - btnHorizontalAlign.options.icls = align; - iconEl.addClass(btnHorizontalAlign.options.icls); - } + if ( btnHorizontalAlign.rendered && btnHorizontalAlign.$icon ) { + btnHorizontalAlign.$icon.removeClass(btnHorizontalAlign.options.icls).addClass(align); + btnHorizontalAlign.options.icls = align; } } }, @@ -547,14 +542,9 @@ define([ btnVerticalAlign.menu.clearAll(); } - if (btnVerticalAlign.rendered) { - var iconEl = $('.icon', btnVerticalAlign.cmpEl); - - if (iconEl) { - iconEl.removeClass(btnVerticalAlign.options.icls); - btnVerticalAlign.options.icls = align; - iconEl.addClass(btnVerticalAlign.options.icls); - } + if ( btnVerticalAlign.rendered && btnVerticalAlign.$icon ) { + btnVerticalAlign.$icon.removeClass(btnVerticalAlign.options.icls).addClass(align); + btnVerticalAlign.options.icls = align; } } }, @@ -912,7 +902,7 @@ define([ var toolbar = this.toolbar; if (this.api && this.api.asc_isDocumentCanSave) { var isModified = this.api.asc_isDocumentCanSave(); - var isSyncButton = $('.icon', this.toolbar.btnSave.cmpEl).hasClass('btn-synch'); + var isSyncButton = this.toolbar.btnSave.$icon.hasClass('btn-synch'); if (!isModified && !isSyncButton && !this.toolbar.mode.forcesave) return; @@ -1046,14 +1036,11 @@ define([ onMenuHorizontalAlignSelect: function(menu, item) { this._state.pralign = undefined; - var btnHorizontalAlign = this.toolbar.btnHorizontalAlign, - iconEl = $('.icon', btnHorizontalAlign.cmpEl); + var btnHorizontalAlign = this.toolbar.btnHorizontalAlign; - if (iconEl) { - iconEl.removeClass(btnHorizontalAlign.options.icls); - btnHorizontalAlign.options.icls = !item.checked ? 'btn-align-left' : item.options.icls; - iconEl.addClass(btnHorizontalAlign.options.icls); - } + btnHorizontalAlign.$icon.removeClass(btnHorizontalAlign.options.icls); + btnHorizontalAlign.options.icls = !item.checked ? 'btn-align-left' : item.options.icls; + btnHorizontalAlign.$icon.addClass(btnHorizontalAlign.options.icls); if (this.api && item.checked) this.api.put_PrAlign(item.value); @@ -1063,14 +1050,11 @@ define([ }, onMenuVerticalAlignSelect: function(menu, item) { - var btnVerticalAlign = this.toolbar.btnVerticalAlign, - iconEl = $('.icon', btnVerticalAlign.cmpEl); + var btnVerticalAlign = this.toolbar.btnVerticalAlign; - if (iconEl) { - iconEl.removeClass(btnVerticalAlign.options.icls); - btnVerticalAlign.options.icls = !item.checked ? 'btn-align-middle' : item.options.icls; - iconEl.addClass(btnVerticalAlign.options.icls); - } + btnVerticalAlign.$icon.removeClass(btnVerticalAlign.options.icls); + btnVerticalAlign.options.icls = !item.checked ? 'btn-align-middle' : item.options.icls; + btnVerticalAlign.$icon.addClass(btnVerticalAlign.options.icls); this._state.vtextalign = undefined; if (this.api && item.checked) diff --git a/apps/presentationeditor/main/app/view/Toolbar.js b/apps/presentationeditor/main/app/view/Toolbar.js index 0ad878eaf..84023b454 100644 --- a/apps/presentationeditor/main/app/view/Toolbar.js +++ b/apps/presentationeditor/main/app/view/Toolbar.js @@ -1012,8 +1012,6 @@ define([ } }); - me.btnSave.$icon = $('.icon', me.btnSave.cmpEl); - var created = me.btnsInsertImage.concat(me.btnsInsertText, me.btnsInsertShape, me.btnsAddSlide); this.lockToolbar(PE.enumLock.disableOnStart, true, {array: created}); diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js index f21ff9169..6c6ed4809 100644 --- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js @@ -495,8 +495,7 @@ define([ }, onSubscriptMenu: function(menu, item) { - var btnSubscript = this.toolbar.btnSubscript, - iconEl = $('.icon', btnSubscript.cmpEl); + var btnSubscript = this.toolbar.btnSubscript; if (item.value == 'sub') { this._state.subscript = undefined; @@ -506,9 +505,8 @@ define([ this.api.asc_setCellSuperscript(item.checked); } if (item.checked) { - iconEl.removeClass(btnSubscript.options.icls); + btnSubscript.$icon.removeClass(btnSubscript.options.icls).addClass(item.options.icls); btnSubscript.options.icls = item.options.icls; - iconEl.addClass(btnSubscript.options.icls); } Common.NotificationCenter.trigger('edit:complete', this.toolbar); @@ -612,14 +610,9 @@ define([ bordersWidth = btnBorders.options.borderswidth, bordersColor = btnBorders.options.borderscolor; - if (btnBorders.rendered) { - var iconEl = $('.icon', btnBorders.cmpEl); - - if (iconEl) { - iconEl.removeClass(btnBorders.options.icls); - btnBorders.options.icls = item.options.icls; - iconEl.addClass(btnBorders.options.icls); - } + if ( btnBorders.rendered ) { + btnBorders.$icon.removeClass(btnBorders.options.icls).addClass(item.options.icls); + btnBorders.options.icls = item.options.icls; } btnBorders.options.borderId = item.options.borderId; @@ -681,14 +674,11 @@ define([ }, onHorizontalAlignMenu: function(menu, item) { - var btnHorizontalAlign = this.toolbar.btnHorizontalAlign, - iconEl = $('.icon', btnHorizontalAlign.cmpEl); + var btnHorizontalAlign = this.toolbar.btnHorizontalAlign; - if (iconEl) { - iconEl.removeClass(btnHorizontalAlign.options.icls); - btnHorizontalAlign.options.icls = !item.checked ? 'btn-align-left' : item.options.icls; - iconEl.addClass(btnHorizontalAlign.options.icls); - } + btnHorizontalAlign.$icon.removeClass(btnHorizontalAlign.options.icls); + btnHorizontalAlign.options.icls = !item.checked ? 'btn-align-left' : item.options.icls; + btnHorizontalAlign.$icon.addClass(btnHorizontalAlign.options.icls); this._state.pralign = undefined; if (this.api) @@ -701,14 +691,11 @@ define([ }, onVerticalAlignMenu: function(menu, item) { - var btnVerticalAlign = this.toolbar.btnVerticalAlign, - iconEl = $('.icon', btnVerticalAlign.cmpEl); + var btnVerticalAlign = this.toolbar.btnVerticalAlign; - if (iconEl) { - iconEl.removeClass(btnVerticalAlign.options.icls); - btnVerticalAlign.options.icls = !item.checked ? 'btn-valign-bottom' : item.options.icls; - iconEl.addClass(btnVerticalAlign.options.icls); - } + btnVerticalAlign.$icon.removeClass(btnVerticalAlign.options.icls); + btnVerticalAlign.options.icls = !item.checked ? 'btn-valign-bottom' : item.options.icls; + btnVerticalAlign.$icon.addClass(btnVerticalAlign.options.icls); this._state.valign = undefined; if (this.api) @@ -1792,13 +1779,10 @@ define([ btnSubscript.menu.clearAll(); } else { btnSubscript.menu.items[index].setChecked(true); - if (btnSubscript.rendered) { - var iconEl = $('.icon', btnSubscript.cmpEl); - if (iconEl) { - iconEl.removeClass(btnSubscript.options.icls); - btnSubscript.options.icls = btnSubscript.menu.items[index].options.icls; - iconEl.addClass(btnSubscript.options.icls); - } + if ( btnSubscript.rendered && btnSubscript.$icon ) { + btnSubscript.$icon.removeClass(btnSubscript.options.icls); + btnSubscript.options.icls = btnSubscript.menu.items[index].options.icls; + btnSubscript.$icon.addClass(btnSubscript.options.icls); } } @@ -1933,13 +1917,10 @@ define([ btnSubscript.menu.clearAll(); } else { btnSubscript.menu.items[index].setChecked(true); - if (btnSubscript.rendered) { - var iconEl = $('.icon', btnSubscript.cmpEl); - if (iconEl) { - iconEl.removeClass(btnSubscript.options.icls); - btnSubscript.options.icls = btnSubscript.menu.items[index].options.icls; - iconEl.addClass(btnSubscript.options.icls); - } + if ( btnSubscript.rendered ) { + btnSubscript.$icon.removeClass(btnSubscript.options.icls); + btnSubscript.options.icls = btnSubscript.menu.items[index].options.icls; + btnSubscript.$icon.addClass(btnSubscript.options.icls); } } @@ -2068,14 +2049,9 @@ define([ } var btnHorizontalAlign = this.toolbar.btnHorizontalAlign; - if (btnHorizontalAlign.rendered) { - var hIconEl = $('.icon', btnHorizontalAlign.cmpEl); - - if (hIconEl) { - hIconEl.removeClass(btnHorizontalAlign.options.icls); - btnHorizontalAlign.options.icls = align; - hIconEl.addClass(btnHorizontalAlign.options.icls); - } + if ( btnHorizontalAlign.rendered ) { + btnHorizontalAlign.$icon.removeClass(btnHorizontalAlign.options.icls).addClass(align); + btnHorizontalAlign.options.icls = align; } } @@ -2103,14 +2079,9 @@ define([ toolbar.btnVerticalAlign.menu.items[index].setChecked(true, false); var btnVerticalAlign = this.toolbar.btnVerticalAlign; - if (btnVerticalAlign.rendered) { - var vIconEl = $('.icon', btnVerticalAlign.cmpEl); - - if (vIconEl) { - vIconEl.removeClass(btnVerticalAlign.options.icls); - btnVerticalAlign.options.icls = align; - vIconEl.addClass(btnVerticalAlign.options.icls); - } + if ( btnVerticalAlign.rendered ) { + btnVerticalAlign.$icon.removeClass(btnVerticalAlign.options.icls).addClass(align); + btnVerticalAlign.options.icls = align; } } } diff --git a/apps/spreadsheeteditor/main/app/view/Toolbar.js b/apps/spreadsheeteditor/main/app/view/Toolbar.js index 7b0f621d8..537958d85 100644 --- a/apps/spreadsheeteditor/main/app/view/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/view/Toolbar.js @@ -1388,7 +1388,6 @@ define([ // replacePlacholder('#id-toolbar-short-placeholder-btn-valign', this.btnVerticalAlign); // replacePlacholder('#id-toolbar-short-placeholder-btn-filter', this.btnAutofilter); - this.btnSave.$icon = $('.icon', this.btnSave.cmpEl); return $host; }, From 09b99470511956058bbc3acb4fb3def3cf56e53e Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Mon, 26 Feb 2018 16:31:34 +0300 Subject: [PATCH 26/73] [DE] defined button to indicate coauth changes --- .../main/app/controller/Toolbar.js | 2 +- apps/documenteditor/main/app/view/Toolbar.js | 38 ++++++++++--------- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index 0bbb5b629..42eee2857 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -912,7 +912,7 @@ define([ var toolbar = this.toolbar; if (this.api) { var isModified = this.api.asc_isDocumentCanSave(); - var isSyncButton = toolbar.btnSave.$icon.hasClass('btn-synch'); + var isSyncButton = toolbar.btnCollabChanges.$icon.hasClass('btn-synch'); if (!isModified && !isSyncButton && !toolbar.mode.forcesave) return; diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index 7dfe2dbf9..76dc2a073 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -124,6 +124,7 @@ define([ signals: ['disabled'] }); this.toolbarControls.push(this.btnSave); + this.btnCollabChanges = this.btnSave; this.btnUndo = new Common.UI.Button({ id: 'id-toolbar-btn-undo', @@ -2116,21 +2117,21 @@ define([ /** coauthoring begin **/ onCollaborativeChanges: function () { if (this._state.hasCollaborativeChanges) return; - if (!this.btnSave.rendered || this._state.previewmode) { + if (!this.btnCollabChanges.rendered || this._state.previewmode) { this.needShowSynchTip = true; return; } this._state.hasCollaborativeChanges = true; - this.btnSave.$icon.removeClass(this.btnSaveCls).addClass('btn-synch'); + this.btnCollabChanges.$icon.removeClass(this.btnSaveCls).addClass('btn-synch'); if (this.showSynchTip) { - this.btnSave.updateHint(''); + this.btnCollabChanges.updateHint(''); if (this.synchTooltip === undefined) this.createSynchTip(); this.synchTooltip.show(); } else { - this.btnSave.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); + this.btnCollabChanges.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); } this.btnSave.setDisabled(false); @@ -2139,29 +2140,30 @@ define([ createSynchTip: function () { this.synchTooltip = new Common.UI.SynchronizeTip({ - target: $('#id-toolbar-btn-save') + target: this.btnCollabChanges.$el }); this.synchTooltip.on('dontshowclick', function () { this.showSynchTip = false; this.synchTooltip.hide(); - this.btnSave.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); + this.btnCollabChanges.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); Common.localStorage.setItem("de-hide-synch", 1); }, this); this.synchTooltip.on('closeclick', function () { this.synchTooltip.hide(); - this.btnSave.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); + this.btnCollabChanges.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); }, this); }, synchronizeChanges: function () { - if (!this._state.previewmode && this.btnSave.rendered) { + if ( !this._state.previewmode && this.btnCollabChanges.rendered ) { var me = this; - if ( me.btnSave.$icon.hasClass('btn-synch') ) { - me.btnSave.$icon.removeClass('btn-synch').addClass(me.btnSaveCls); + if ( me.btnCollabChanges.$icon.hasClass('btn-synch') ) { + me.btnCollabChanges.$icon.removeClass('btn-synch').addClass(me.btnSaveCls); if (this.synchTooltip) this.synchTooltip.hide(); - this.btnSave.updateHint(this.btnSaveTip); + this.btnCollabChanges.updateHint(this.btnSaveTip); + this.btnSave.setDisabled(!me.mode.forcesave); this._state.hasCollaborativeChanges = false; } @@ -2175,16 +2177,18 @@ define([ editusers.push(item); }); + var me = this; var length = _.size(editusers); var cls = (length > 1) ? 'btn-save-coauth' : 'btn-save'; - if (cls !== this.btnSaveCls && this.btnSave.rendered) { - this.btnSaveTip = ((length > 1) ? this.tipSaveCoauth : this.tipSave ) + Common.Utils.String.platformKey('Ctrl+S'); + if ( cls !== me.btnSaveCls && me.btnCollabChanges.rendered ) { + me.btnSaveTip = ((length > 1) ? me.tipSaveCoauth : me.tipSave ) + Common.Utils.String.platformKey('Ctrl+S'); + + if ( !me.btnCollabChanges.$icon.hasClass('btn-synch') ) { + me.btnCollabChanges.$icon.removeClass(me.btnSaveCls).addClass(cls); + me.btnCollabChanges.updateHint(me.btnSaveTip); - if ( !this.btnSave.$icon.hasClass('btn-synch') ) { - this.btnSave.$icon.removeClass(this.btnSaveCls).addClass(cls); - this.btnSave.updateHint(this.btnSaveTip); } - this.btnSaveCls = cls; + me.btnSaveCls = cls; } }, From 9d1bf1199bc21aec5a69f0936ab2abedd9e960d5 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 26 Feb 2018 17:38:35 +0300 Subject: [PATCH 27/73] [DE] Bug 36827 --- apps/documenteditor/main/app/controller/Toolbar.js | 7 +++++++ apps/documenteditor/main/app/view/Toolbar.js | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index df514da94..2dc5e520a 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -354,6 +354,7 @@ define([ this.api.asc_registerCallback('asc_onColumnsProps', _.bind(this.onColumnsProps, this)); this.api.asc_registerCallback('asc_onSectionProps', _.bind(this.onSectionProps, this)); this.api.asc_registerCallback('asc_onContextMenu', _.bind(this.onContextMenu, this)); + this.api.asc_registerCallback('asc_onShowParaMarks', _.bind(this.onShowParaMarks, this)); }, onChangeCompactView: function(view, compact) { @@ -611,6 +612,12 @@ define([ } }, + onShowParaMarks: function(v) { + this.toolbar.mnuNonPrinting.items[0].setChecked(v, true); + this.toolbar.btnShowHidenChars.toggle(v, true); + Common.localStorage.setItem("de-show-hiddenchars", v); + }, + onApiFocusObject: function(selectedObjects) { if (!this.editMode) return; diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index 4af179fbc..a9b5f2e61 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -1516,7 +1516,7 @@ define([ this.btnDecLeftOffset.updateHint(this.tipDecPrLeft + Common.Utils.String.platformKey('Ctrl+Shift+M')); this.btnIncLeftOffset.updateHint(this.tipIncPrLeft + Common.Utils.String.platformKey('Ctrl+M')); this.btnLineSpace.updateHint(this.tipLineSpace); - this.btnShowHidenChars.updateHint(this.tipShowHiddenChars); + this.btnShowHidenChars.updateHint(this.tipShowHiddenChars + Common.Utils.String.platformKey('Ctrl+*')); this.btnMarkers.updateHint(this.tipMarkers); this.btnNumbers.updateHint(this.tipNumbers); this.btnMultilevels.updateHint(this.tipMultilevels); From 7cbbdeccc99aa784e8dcd0d4a26d3591abbe65a4 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 27 Feb 2018 14:55:58 +0300 Subject: [PATCH 28/73] [DE] Change hyperlink settings. --- apps/common/main/resources/less/buttons.less | 7 +++ .../main/app/view/HyperlinkSettingsDialog.js | 58 +++++++++++++++++-- 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/apps/common/main/resources/less/buttons.less b/apps/common/main/resources/less/buttons.less index 90545b262..f38daee66 100644 --- a/apps/common/main/resources/less/buttons.less +++ b/apps/common/main/resources/less/buttons.less @@ -512,6 +512,12 @@ border: 1px solid @input-border; .border-radius(@border-radius-small); + &.auto { + width: auto; + padding-left: 10px; + padding-right: 10px; + } + &:hover:not(.disabled), .over:not(.disabled) { background-color: @secondary !important; @@ -520,6 +526,7 @@ &:active:not(.disabled), &.active:not(.disabled) { background-color: @primary !important; + border-color: @primary; color: white; } diff --git a/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js b/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js index bd2efee0b..5840bfced 100644 --- a/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js +++ b/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js @@ -42,6 +42,11 @@ if (Common === undefined) var Common = {}; +var c_oHyperlinkType = { + InternalLink:0, + WebLink: 1 +}; + define([ 'common/main/lib/util/utils', 'common/main/lib/component/InputField', @@ -61,11 +66,20 @@ define([ }, options || {}); this.template = [ - '
        ', - '
        ', - '', + '
        ', + '
        ', + '', + '', + '
        ', + '', + '', - '', '
        ', '', '
        ', @@ -94,6 +108,23 @@ define([ var me = this, $window = this.getChild(); + me.btnExternal = new Common.UI.Button({ + el: $('#id-dlg-hyperlink-external'), + enableToggle: true, + toggleGroup: 'hyperlink-type', + allowDepress: false, + pressed: true + }); + me.btnExternal.on('click', _.bind(me.onLinkTypeClick, me, c_oHyperlinkType.WebLink)); + + me.btnInternal = new Common.UI.Button({ + el: $('#id-dlg-hyperlink-internal'), + enableToggle: true, + toggleGroup: 'hyperlink-type', + allowDepress: false + }); + me.btnInternal.on('click', _.bind(me.onLinkTypeClick, me, c_oHyperlinkType.InternalLink)); + me.inputUrl = new Common.UI.InputField({ el : $('#id-dlg-hyperlink-url'), allowBlank : false, @@ -124,6 +155,17 @@ define([ $window.find('.dlg-btn').on('click', _.bind(this.onBtnClick, this)); $window.find('input').on('keypress', _.bind(this.onKeyPress, this)); + me.externalPanel = $window.find('#id-external-link'); + me.internalPanel = $window.find('#id-internal-link'); + }, + + ShowHideElem: function(value) { + this.externalPanel.toggleClass('hidden', value !== c_oHyperlinkType.WebLink); + this.internalPanel.toggleClass('hidden', value !== c_oHyperlinkType.InternalLink); + }, + + onLinkTypeClick: function(type, btn, event) { + this.ShowHideElem(type); }, show: function() { @@ -139,6 +181,10 @@ define([ if (props) { var me = this; + var type = c_oHyperlinkType.WebLink;//props.get_Type(); + (type == c_oHyperlinkType.WebLink) ? me.btnExternal.toggle(true) : me.btnInternal.toggle(true); + me.ShowHideElem(type); + if (props.get_Value()) { me.inputUrl.setValue(props.get_Value().replace(new RegExp(" ",'g'), "%20")); } else { @@ -225,6 +271,8 @@ define([ txtNotUrl: 'This field should be a URL in the format \"http://www.example.com\"', textTooltip: 'ScreenTip text', textDefault: 'Selected text', - textTitle: 'Hyperlink Settings' + textTitle: 'Hyperlink Settings', + textExternal: 'External Link', + textInternal: 'Place in Document' }, DE.Views.HyperlinkSettingsDialog || {})) }); \ No newline at end of file From 6cf3ee7fb99e3778429c82825c5a48a4dc78af55 Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Wed, 28 Feb 2018 16:17:53 +0300 Subject: [PATCH 29/73] [SE PE] absract 'save' button --- .../main/app/controller/Toolbar.js | 2 +- .../main/app/view/Toolbar.js | 31 ++++++++-------- .../main/app/controller/Toolbar.js | 2 +- .../main/app/view/Toolbar.js | 35 ++++++++++--------- 4 files changed, 36 insertions(+), 34 deletions(-) diff --git a/apps/presentationeditor/main/app/controller/Toolbar.js b/apps/presentationeditor/main/app/controller/Toolbar.js index 956aded7f..15bc3e532 100644 --- a/apps/presentationeditor/main/app/controller/Toolbar.js +++ b/apps/presentationeditor/main/app/controller/Toolbar.js @@ -902,7 +902,7 @@ define([ var toolbar = this.toolbar; if (this.api && this.api.asc_isDocumentCanSave) { var isModified = this.api.asc_isDocumentCanSave(); - var isSyncButton = this.toolbar.btnSave.$icon.hasClass('btn-synch'); + var isSyncButton = this.toolbar.btnCollabChanges.$icon.hasClass('btn-synch'); if (!isModified && !isSyncButton && !this.toolbar.mode.forcesave) return; diff --git a/apps/presentationeditor/main/app/view/Toolbar.js b/apps/presentationeditor/main/app/view/Toolbar.js index 84023b454..ae8c0d90c 100644 --- a/apps/presentationeditor/main/app/view/Toolbar.js +++ b/apps/presentationeditor/main/app/view/Toolbar.js @@ -173,6 +173,7 @@ define([ lock : [_set.lostConnect], signals : ['disabled'] }); + me.btnCollabChanges = me.btnSave; me.btnUndo = new Common.UI.Button({ id : 'id-toolbar-btn-undo', @@ -1467,7 +1468,7 @@ define([ /** coauthoring begin **/ onCollaborativeChanges: function () { if (this._state.hasCollaborativeChanges) return; - if (!this.btnSave.rendered) { + if (!this.btnCollabChanges.rendered) { this.needShowSynchTip = true; return; } @@ -1479,15 +1480,15 @@ define([ } this._state.hasCollaborativeChanges = true; - this.btnSave.$icon.removeClass(this.btnSaveCls).addClass('btn-synch'); + this.btnCollabChanges.$icon.removeClass(this.btnSaveCls).addClass('btn-synch'); if (this.showSynchTip) { - this.btnSave.updateHint(''); + this.btnCollabChanges.updateHint(''); if (this.synchTooltip === undefined) this.createSynchTip(); this.synchTooltip.show(); } else { - this.btnSave.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); + this.btnCollabChanges.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); } this.btnSave.setDisabled(false); @@ -1496,29 +1497,29 @@ define([ createSynchTip: function () { this.synchTooltip = new Common.UI.SynchronizeTip({ - target: $('#id-toolbar-btn-save') + target: this.btnCollabChanges.$el }); this.synchTooltip.on('dontshowclick', function () { this.showSynchTip = false; this.synchTooltip.hide(); - this.btnSave.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); + this.btnCollabChanges.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); Common.localStorage.setItem("pe-hide-synch", 1); }, this); this.synchTooltip.on('closeclick', function () { this.synchTooltip.hide(); - this.btnSave.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); + this.btnCollabChanges.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); }, this); }, synchronizeChanges: function () { - if (this.btnSave.rendered) { + if (this.btnCollabChanges.rendered) { var me = this; - if ( me.btnSave.$icon.hasClass('btn-synch') ) { - me.btnSave.$icon.removeClass('btn-synch').addClass(this.btnSaveCls); + if ( me.btnCollabChanges.$icon.hasClass('btn-synch') ) { + me.btnCollabChanges.$icon.removeClass('btn-synch').addClass(this.btnSaveCls); if (this.synchTooltip) this.synchTooltip.hide(); - this.btnSave.updateHint(this.btnSaveTip); + this.btnCollabChanges.updateHint(this.btnSaveTip); this.btnSave.setDisabled(!me.mode.forcesave); this._state.hasCollaborativeChanges = false; @@ -1535,12 +1536,12 @@ define([ var length = _.size(editusers); var cls = (length > 1) ? 'btn-save-coauth' : 'btn-save'; - if (cls !== this.btnSaveCls && this.btnSave.rendered) { + if (cls !== this.btnSaveCls && this.btnCollabChanges.rendered) { this.btnSaveTip = ((length > 1) ? this.tipSaveCoauth : this.tipSave ) + Common.Utils.String.platformKey('Ctrl+S'); - if ( !this.btnSave.$icon.hasClass('btn-synch') ) { - this.btnSave.$icon.removeClass(this.btnSaveCls).addClass(cls); - this.btnSave.updateHint(this.btnSaveTip); + if ( !this.btnCollabChanges.$icon.hasClass('btn-synch') ) { + this.btnCollabChanges.$icon.removeClass(this.btnSaveCls).addClass(cls); + this.btnCollabChanges.updateHint(this.btnSaveTip); } this.btnSaveCls = cls; } diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js index 6c6ed4809..87b9d0c06 100644 --- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js @@ -386,7 +386,7 @@ define([ onSave: function(e) { if (this.api) { var isModified = this.api.asc_isDocumentCanSave(); - var isSyncButton = this.toolbar.btnSave.$icon.hasClass('btn-synch'); + var isSyncButton = this.toolbar.btnCollabChanges.$icon.hasClass('btn-synch'); if (!isModified && !isSyncButton && !this.toolbar.mode.forcesave) return; diff --git a/apps/spreadsheeteditor/main/app/view/Toolbar.js b/apps/spreadsheeteditor/main/app/view/Toolbar.js index 537958d85..ad33156ae 100644 --- a/apps/spreadsheeteditor/main/app/view/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/view/Toolbar.js @@ -375,6 +375,7 @@ define([ iconCls : 'no-mask ' + me.btnSaveCls, signals : ['disabled'] }); + me.btnCollabChanges = me.btnSave; me.btnIncFontSize = new Common.UI.Button({ id : 'id-toolbar-btn-incfont', @@ -1221,7 +1222,7 @@ define([ var hidetip = Common.localStorage.getItem("sse-hide-synch"); me.showSynchTip = !(hidetip && parseInt(hidetip) == 1); - me.needShowSynchTip = false; + // me.needShowSynchTip = false; } me.lockControls = [ @@ -1822,22 +1823,22 @@ define([ onApiCollaborativeChanges: function() { if (this._state.hasCollaborativeChanges) return; - if (!this.btnSave.rendered) { - this.needShowSynchTip = true; + if (!this.btnCollabChanges.rendered) { + // this.needShowSynchTip = true; return; } this._state.hasCollaborativeChanges = true; - this.btnSave.$icon.removeClass(this.btnSaveCls).addClass('btn-synch'); + this.btnCollabChanges.$icon.removeClass(this.btnSaveCls).addClass('btn-synch'); if (this.showSynchTip){ - this.btnSave.updateHint(''); + this.btnCollabChanges.updateHint(''); if (this.synchTooltip===undefined) this.createSynchTip(); this.synchTooltip.show(); } else { - this.btnSave.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); + this.btnCollabChanges.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); } this.btnSave.setDisabled(false); @@ -1846,29 +1847,29 @@ define([ createSynchTip: function () { this.synchTooltip = new Common.UI.SynchronizeTip({ - target : $('#id-toolbar-btn-save') + target: this.btnCollabChanges.$el }); this.synchTooltip.on('dontshowclick', function() { this.showSynchTip = false; this.synchTooltip.hide(); - this.btnSave.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); + this.btnCollabChanges.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); Common.localStorage.setItem('sse-hide-synch', 1); }, this); this.synchTooltip.on('closeclick', function() { this.synchTooltip.hide(); - this.btnSave.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); + this.btnCollabChanges.updateHint(this.tipSynchronize + Common.Utils.String.platformKey('Ctrl+S')); }, this); }, synchronizeChanges: function() { - if (this.btnSave.rendered) { + if (this.btnCollabChanges.rendered) { var me = this; - if ( me.btnSave.$icon.hasClass('btn-synch') ) { - me.btnSave.$icon.removeClass('btn-synch').addClass(this.btnSaveCls); + if ( me.btnCollabChanges.$icon.hasClass('btn-synch') ) { + me.btnCollabChanges.$icon.removeClass('btn-synch').addClass(this.btnSaveCls); if (this.synchTooltip) this.synchTooltip.hide(); - this.btnSave.updateHint(this.btnSaveTip); + this.btnCollabChanges.updateHint(this.btnSaveTip); this.btnSave.setDisabled(!me.mode.forcesave); this._state.hasCollaborativeChanges = false; @@ -1885,12 +1886,12 @@ define([ var length = _.size(editusers); var cls = (length>1) ? 'btn-save-coauth' : 'btn-save'; - if (cls !== this.btnSaveCls && this.btnSave.rendered) { + if (cls !== this.btnSaveCls && this.btnCollabChanges.rendered) { this.btnSaveTip = ((length>1) ? this.tipSaveCoauth : this.tipSave )+ Common.Utils.String.platformKey('Ctrl+S'); - if ( !this.btnSave.$icon.hasClass('btn-synch') ) { - this.btnSave.$icon.removeClass(this.btnSaveCls).addClass(cls); - this.btnSave.updateHint(this.btnSaveTip); + if ( !this.btnCollabChanges.$icon.hasClass('btn-synch') ) { + this.btnCollabChanges.$icon.removeClass(this.btnSaveCls).addClass(cls); + this.btnCollabChanges.updateHint(this.btnSaveTip); } this.btnSaveCls = cls; } From 8a9c221eb3e430d900a870d83b3dd3417fef3b8f Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Wed, 28 Feb 2018 16:22:14 +0300 Subject: [PATCH 30/73] redefine 'save' button for desktop app --- apps/documenteditor/main/app/controller/Viewport.js | 3 +++ apps/presentationeditor/main/app/controller/Viewport.js | 4 +++- apps/spreadsheeteditor/main/app/controller/Viewport.js | 5 +++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/documenteditor/main/app/controller/Viewport.js b/apps/documenteditor/main/app/controller/Viewport.js index c1cc0ea62..b0118523e 100644 --- a/apps/documenteditor/main/app/controller/Viewport.js +++ b/apps/documenteditor/main/app/controller/Viewport.js @@ -163,6 +163,9 @@ define([ _intvars.set('toolbar-height-normal', _tabs_new_height + _intvars.get('toolbar-height-controls')); $filemenu.css('top', _tabs_new_height + _intvars.get('document-title-height')); + + toolbar = me.getApplication().getController('Toolbar').getView(); + toolbar.btnCollabChanges = me.header.btnSave; } }, diff --git a/apps/presentationeditor/main/app/controller/Viewport.js b/apps/presentationeditor/main/app/controller/Viewport.js index 6d80c3200..bd7495fea 100644 --- a/apps/presentationeditor/main/app/controller/Viewport.js +++ b/apps/presentationeditor/main/app/controller/Viewport.js @@ -100,7 +100,6 @@ define([ 'save:disabled' : function (state) { if ( me.header.btnSave ) me.header.btnSave.setDisabled(state); - console.log('header save: ' + state); } }, // Events generated by main view @@ -167,6 +166,9 @@ define([ _intvars.set('toolbar-height-normal', _tabs_new_height + _intvars.get('toolbar-height-controls')); $filemenu.css('top', _tabs_new_height + _intvars.get('document-title-height')); + + toolbar = me.getApplication().getController('Toolbar').getView('Toolbar'); + toolbar.btnCollabChanges = me.header.btnSave; } }, diff --git a/apps/spreadsheeteditor/main/app/controller/Viewport.js b/apps/spreadsheeteditor/main/app/controller/Viewport.js index 9998b0722..93ddc559a 100644 --- a/apps/spreadsheeteditor/main/app/controller/Viewport.js +++ b/apps/spreadsheeteditor/main/app/controller/Viewport.js @@ -76,6 +76,11 @@ define([ var config = SSE.getController('Main').appOptions; toolbar.setExtra('right', me.header.getPanel('right', config)); toolbar.setExtra('left', me.header.getPanel('left', config)); + + if ( me.appConfig && me.appConfig.isDesktopApp && + me.appConfig.isEdit && toolbar.btnCollabChanges ) + toolbar.btnCollabChanges = me.header.btnSave; + }, 'view:compact' : function (toolbar, state) { me.viewport.vlayout.getItem('toolbar').height = state ? From 9dcf65d8dfe731d3bc99d1a2c465cd11e993d380 Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Wed, 28 Feb 2018 16:24:48 +0300 Subject: [PATCH 31/73] [common] added coauth icons to header's 'save' button --- apps/common/main/lib/view/Header.js | 13 +++++++++++++ .../main/resources/img/header/buttons.svg | 18 +++++++++++++++++- apps/common/main/resources/less/header.less | 19 +++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/apps/common/main/lib/view/Header.js b/apps/common/main/lib/view/Header.js index 38e2729e0..e8c86e103 100644 --- a/apps/common/main/lib/view/Header.js +++ b/apps/common/main/lib/view/Header.js @@ -496,6 +496,19 @@ define([ me.btnUndo = createTitleButton('svg-btn-undo', $('#slot-btn-dt-undo', $html), true); me.btnRedo = createTitleButton('svg-btn-redo', $('#slot-btn-dt-redo', $html), true); + if ( me.btnSave.$icon.is('svg') ) { + me.btnSave.$icon.addClass('icon-save'); + var _create_use = function (extid, intid) { + var _use = document.createElementNS('http://www.w3.org/2000/svg', 'use'); + _use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', extid); + _use.setAttribute('id', intid); + + return $(_use); + }; + + _create_use('#svg-btn-save-coauth', 'coauth').appendTo(me.btnSave.$icon); + _create_use('#svg-btn-save-sync', 'sync').appendTo(me.btnSave.$icon); + } return $html; } }, diff --git a/apps/common/main/resources/img/header/buttons.svg b/apps/common/main/resources/img/header/buttons.svg index f55f3ea4f..8bb39193b 100644 --- a/apps/common/main/resources/img/header/buttons.svg +++ b/apps/common/main/resources/img/header/buttons.svg @@ -35,9 +35,25 @@ - + + + + + + + + + + + + + + diff --git a/apps/common/main/resources/less/header.less b/apps/common/main/resources/less/header.less index e53a67037..1e6988336 100644 --- a/apps/common/main/resources/less/header.less +++ b/apps/common/main/resources/less/header.less @@ -289,6 +289,25 @@ svg.icon { fill: #fff; + + &.icon-save { + &.btn-save-coauth, &.btn-synch { + use:first-child { + display: none; + } + } + + &:not(.btn-save-coauth) { + use#coauth { + display: none; + } + } + &:not(.btn-synch) { + use#sync { + display: none; + } + } + } } #title-doc-name { From 19b0d197929e5356611b88262c5c545b63d9fb71 Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Wed, 28 Feb 2018 16:31:59 +0300 Subject: [PATCH 32/73] [common] centered document title --- apps/common/main/lib/view/Header.js | 1 + apps/common/main/resources/less/header.less | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/common/main/lib/view/Header.js b/apps/common/main/lib/view/Header.js index e8c86e103..bdf17cd8e 100644 --- a/apps/common/main/lib/view/Header.js +++ b/apps/common/main/lib/view/Header.js @@ -109,6 +109,7 @@ define([ '
        ' + '
        ' + '
        ' + + '
        ' + '' + '' + ''; diff --git a/apps/common/main/resources/less/header.less b/apps/common/main/resources/less/header.less index 1e6988336..fe8398aee 100644 --- a/apps/common/main/resources/less/header.less +++ b/apps/common/main/resources/less/header.less @@ -282,6 +282,7 @@ display: flex; height: 100%; color:#fff; + position: relative; .btn-slot { display: inline-block; @@ -311,13 +312,14 @@ } #title-doc-name { - flex-grow: 1; + position: absolute; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; text-align: center; font-size: 12px; height: 100%; + width: 100%; background-color: transparent; border: 0 none; cursor: default; @@ -333,4 +335,8 @@ padding: 0 12px; line-height: @height-title; } + + .lr-separator { + flex-grow: 1; + } } From 794d08ea9cae7bb60db217403bf87a10daf796b1 Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Wed, 28 Feb 2018 16:33:04 +0300 Subject: [PATCH 33/73] [common] changed synchronize tooltip markup --- .../main/resources/less/synchronize-tip.less | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/apps/common/main/resources/less/synchronize-tip.less b/apps/common/main/resources/less/synchronize-tip.less index df5b141c9..b018a7aff 100644 --- a/apps/common/main/resources/less/synchronize-tip.less +++ b/apps/common/main/resources/less/synchronize-tip.less @@ -9,16 +9,19 @@ } &.right { - margin: -32px 0 0 15px; + margin: 0 0 0 15px; .tip-arrow { left: -15px; - top: 20px; - width: 15px; - height: 30px; + top: 0; + width: 16px; + height: 15px; + .box-shadow(0 -5px 8px -5px rgba(0, 0, 0, 0.2)); + &:after { - top: 5px; - left: 8px; + top: -7px; + left: 6px; + width: 16px; } } } @@ -42,13 +45,15 @@ margin: 0 -32px 15px 0; .tip-arrow { - right: 15px; + right: 0; bottom: -15px; - width: 30px; + width: 15px; height: 15px; + .box-shadow(5px 0 8px -5px rgba(0, 0, 0, 0.2)); + &:after { top: -8px; - left: 5px; + left: 8px; } } } @@ -60,6 +65,14 @@ background-color: #fcfed7; overflow: visible; + .right & { + border-top-left-radius: 0; + } + + .top & { + border-bottom-right-radius: 0; + } + .box-shadow(0 4px 15px -2px rgba(0, 0, 0, 0.5)); font-size: 11px; } From 590a2e6d0cac0c0b255ec968caeb8cf6bc758f2c Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 28 Feb 2018 17:45:00 +0300 Subject: [PATCH 34/73] [Common] Window: bug in checking if the window is modal --- apps/common/main/lib/component/Window.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/common/main/lib/component/Window.js b/apps/common/main/lib/component/Window.js index e4387beaa..e3f503b68 100644 --- a/apps/common/main/lib/component/Window.js +++ b/apps/common/main/lib/component/Window.js @@ -785,7 +785,7 @@ define([ isLocked: function() { return this.$window.hasClass('dethrone') || - (!this.options.modal && this.$window.parent().find('.asc-window.modal:visible').length); + (!this.initConfig.modal && this.$window.parent().find('.asc-window.modal:visible').length); }, getChild: function(selector) { From 68ae26ac5d4e7f865bdcd9af8e6607afae46009a Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 28 Feb 2018 18:04:11 +0300 Subject: [PATCH 35/73] Fix Bug 36870 --- apps/common/main/lib/controller/ExternalDiagramEditor.js | 7 ++++++- apps/common/main/lib/view/ExternalDiagramEditor.js | 4 +--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/common/main/lib/controller/ExternalDiagramEditor.js b/apps/common/main/lib/controller/ExternalDiagramEditor.js index ad90550a1..518b24e76 100644 --- a/apps/common/main/lib/controller/ExternalDiagramEditor.js +++ b/apps/common/main/lib/controller/ExternalDiagramEditor.js @@ -141,7 +141,12 @@ define([ handler: function(result, value) { if (this.isHandlerCalled) return; this.isHandlerCalled = true; - externalEditor && externalEditor.serviceCommand('queryClose',{mr:result}); + if (this.diagramEditorView._isExternalDocReady) + externalEditor && externalEditor.serviceCommand('queryClose',{mr:result}); + else { + this.diagramEditorView.hide(); + this.isHandlerCalled = false; + } }, setChartData: function() { diff --git a/apps/common/main/lib/view/ExternalDiagramEditor.js b/apps/common/main/lib/view/ExternalDiagramEditor.js index 511fe6585..29f6e8021 100644 --- a/apps/common/main/lib/view/ExternalDiagramEditor.js +++ b/apps/common/main/lib/view/ExternalDiagramEditor.js @@ -82,11 +82,9 @@ define([ disabled: true }); this.btnCancel = new Common.UI.Button({ - el: $('#id-btn-diagram-editor-cancel'), - disabled: true + el: $('#id-btn-diagram-editor-cancel') }); - this.$window.find('.tool.close').addClass('disabled'); this.$window.find('.dlg-btn').on('click', _.bind(this.onDlgBtnClick, this)); }, From 5f9bb6a7e7b0599dfd3b838894b5fe4f77d27797 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 2 Mar 2018 11:52:15 +0300 Subject: [PATCH 36/73] [SSE] Fix Bug 37041 --- apps/spreadsheeteditor/main/app/view/CellEditor.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/spreadsheeteditor/main/app/view/CellEditor.js b/apps/spreadsheeteditor/main/app/view/CellEditor.js index 9cb0fbd79..b5678ed54 100644 --- a/apps/spreadsheeteditor/main/app/view/CellEditor.js +++ b/apps/spreadsheeteditor/main/app/view/CellEditor.js @@ -81,8 +81,11 @@ define([ this.$btnfunc = $('#ce-func-label', this.el); var me = this; - this.$cellname.on('focusin', function(e){ - me.$cellname.select().one('mouseup', function (e) {e.preventDefault();}); + this.$cellname.on('focus', function(e){ + var txt = me.$cellname[0]; + txt.selectionStart = 0; + txt.selectionEnd = txt.value.length; + txt.scrollLeft = txt.scrollWidth; }); this.$btnfunc.addClass('disabled'); From 321a92bf7f7e6b5e664d85459187aeab42d8e1f2 Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Sun, 4 Mar 2018 23:23:26 +0300 Subject: [PATCH 37/73] [DE] refactoring --- apps/documenteditor/main/app/controller/Main.js | 2 +- apps/presentationeditor/main/app/controller/LeftMenu.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index 937e55832..15d935a67 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -1512,7 +1512,7 @@ define([ var toolbarView = this.getApplication().getController('Toolbar').getView(); if (toolbarView && !toolbarView._state.previewmode) { - var isSyncButton = $('.icon', toolbarView.btnSave.cmpEl).hasClass('btn-synch'), + var isSyncButton = toolbarView.btnSave.$icon.hasClass('btn-synch'), forcesave = this.appOptions.forcesave, isDisabled = !isModified && !isSyncButton && !forcesave || this._state.isDisconnected || this._state.fastCoauth && this._state.usersCount>1 && !forcesave; toolbarView.btnSave.setDisabled(isDisabled); diff --git a/apps/presentationeditor/main/app/controller/LeftMenu.js b/apps/presentationeditor/main/app/controller/LeftMenu.js index 0682a1652..6b036422a 100644 --- a/apps/presentationeditor/main/app/controller/LeftMenu.js +++ b/apps/presentationeditor/main/app/controller/LeftMenu.js @@ -308,7 +308,6 @@ define([ changeToolbarSaveState: function (state) { this.leftMenu.menuFile.getButton('save').setDisabled(state); - console.log('save: ' + state); }, /** coauthoring begin **/ From 9f289a6392c4757bcf20589851d4f84812b69f7a Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Sun, 4 Mar 2018 23:25:00 +0300 Subject: [PATCH 38/73] [DE] button 'save' disabled in wrong way --- apps/documenteditor/main/app/controller/Toolbar.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index 42eee2857..b5dc426f7 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -231,7 +231,6 @@ define([ toolbar.btnPrint.on('click', _.bind(this.onPrint, this)); toolbar.btnSave.on('click', _.bind(this.onSave, this)); - toolbar.btnSave.on('disabled', _.bind(this.onBtnChangeState, this, 'save:disabled')); toolbar.btnUndo.on('click', _.bind(this.onUndo, this)); toolbar.btnUndo.on('disabled', _.bind(this.onBtnChangeState, this, 'undo:disabled')); toolbar.btnRedo.on('click', _.bind(this.onRedo, this)); @@ -2762,6 +2761,8 @@ define([ me.toolbar.addTab(tab, $panel, 4); if ( config.isDesktopApp ) { + me.toolbar.btnSave.on('disabled', _.bind(me.onBtnChangeState, me, 'save:disabled')); + // hide 'print' and 'save' buttons group and next separator me.toolbar.btnPrint.$el.parents('.group').hide().next().hide(); From 217e7afeaaf37667298b6c6c3ac31eb5b469a0f1 Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Fri, 9 Mar 2018 00:48:47 +0300 Subject: [PATCH 39/73] [DE] unlocked version history for desktop app --- apps/api/documents/api.js | 1 - apps/documenteditor/main/app/controller/Main.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/api/documents/api.js b/apps/api/documents/api.js index 2d8544be1..631c20c73 100644 --- a/apps/api/documents/api.js +++ b/apps/api/documents/api.js @@ -363,7 +363,6 @@ if (result[1] == 'desktop') { _config.editorConfig.targetApp = result[1]; // _config.editorConfig.canBackToFolder = false; - _config.editorConfig.canUseHistory = false; if (!_config.editorConfig.customization) _config.editorConfig.customization = {}; _config.editorConfig.customization.about = false; } diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index 15d935a67..6ab590526 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -1065,7 +1065,7 @@ define([ (!this.appOptions.isReviewOnly || this.appOptions.canLicense); // if isReviewOnly==true -> canLicense must be true this.appOptions.isEdit = this.appOptions.canLicense && this.appOptions.canEdit && this.editorConfig.mode !== 'view'; this.appOptions.canReview = this.permissions.review === true && this.appOptions.canLicense && this.appOptions.isEdit; - this.appOptions.canUseHistory = this.appOptions.canLicense && this.editorConfig.canUseHistory && this.appOptions.canCoAuthoring && !this.appOptions.isDesktopApp; + this.appOptions.canUseHistory = this.appOptions.canLicense && this.editorConfig.canUseHistory && this.appOptions.canCoAuthoring; this.appOptions.canHistoryClose = this.editorConfig.canHistoryClose; this.appOptions.canHistoryRestore= this.editorConfig.canHistoryRestore && !!this.permissions.changeHistory; this.appOptions.canUseMailMerge= this.appOptions.canLicense && this.appOptions.canEdit && !this.appOptions.isOffline; From b50749f5721fe5f092d77b840c301fdc62702554 Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Fri, 9 Mar 2018 01:01:28 +0300 Subject: [PATCH 40/73] element with id=title inserted in some data views --- apps/documenteditor/main/app/template/Viewport.template | 2 +- apps/documenteditor/main/app/view/Viewport.js | 2 +- apps/presentationeditor/main/app/template/Viewport.template | 2 +- apps/presentationeditor/main/app/view/Viewport.js | 2 +- apps/spreadsheeteditor/main/app/template/Viewport.template | 2 +- apps/spreadsheeteditor/main/app/view/Viewport.js | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/documenteditor/main/app/template/Viewport.template b/apps/documenteditor/main/app/template/Viewport.template index 7b9070236..40c1ea100 100644 --- a/apps/documenteditor/main/app/template/Viewport.template +++ b/apps/documenteditor/main/app/template/Viewport.template @@ -3,7 +3,7 @@
        -
        +
        diff --git a/apps/documenteditor/main/app/view/Viewport.js b/apps/documenteditor/main/app/view/Viewport.js index fb1fd87d8..08de444b8 100644 --- a/apps/documenteditor/main/app/view/Viewport.js +++ b/apps/documenteditor/main/app/view/Viewport.js @@ -83,7 +83,7 @@ define([ this.vlayout = new Common.UI.VBoxLayout({ box: $container, items: [{ - el: $container.find('> .layout-item#title').hide(), + el: $container.find('> .layout-item#app-title').hide(), alias: 'title', height: Common.Utils.InternalSettings.get('document-title-height') }, { diff --git a/apps/presentationeditor/main/app/template/Viewport.template b/apps/presentationeditor/main/app/template/Viewport.template index 064d0a777..960edecea 100644 --- a/apps/presentationeditor/main/app/template/Viewport.template +++ b/apps/presentationeditor/main/app/template/Viewport.template @@ -4,7 +4,7 @@
        -
        +
        diff --git a/apps/presentationeditor/main/app/view/Viewport.js b/apps/presentationeditor/main/app/view/Viewport.js index 926a4ef3a..421a73793 100644 --- a/apps/presentationeditor/main/app/view/Viewport.js +++ b/apps/presentationeditor/main/app/view/Viewport.js @@ -86,7 +86,7 @@ define([ this.vlayout = new Common.UI.VBoxLayout({ box: $container, items: [{ - el: $container.find('> .layout-item#title').hide(), + el: $container.find('> .layout-item#app-title').hide(), alias: 'title', height: Common.Utils.InternalSettings.get('document-title-height') }, { diff --git a/apps/spreadsheeteditor/main/app/template/Viewport.template b/apps/spreadsheeteditor/main/app/template/Viewport.template index 90a065c83..e9dd6ee38 100644 --- a/apps/spreadsheeteditor/main/app/template/Viewport.template +++ b/apps/spreadsheeteditor/main/app/template/Viewport.template @@ -3,7 +3,7 @@
        -
        +
        diff --git a/apps/spreadsheeteditor/main/app/view/Viewport.js b/apps/spreadsheeteditor/main/app/view/Viewport.js index 416239c73..66f1e1ace 100644 --- a/apps/spreadsheeteditor/main/app/view/Viewport.js +++ b/apps/spreadsheeteditor/main/app/view/Viewport.js @@ -86,7 +86,7 @@ define([ this.vlayout = new Common.UI.VBoxLayout({ box: $container, items: [{ - el: $container.find('> .layout-item#title').hide(), + el: $container.find('> .layout-item#app-title').hide(), alias: 'title', height: Common.Utils.InternalSettings.get('document-title-height') },{ From 0ee904ab39a2147edb554c1ad71176032bd0f061 Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Wed, 14 Mar 2018 17:54:25 +0300 Subject: [PATCH 41/73] [ALL] removed event for desktop --- apps/common/main/lib/controller/Desktop.js | 4 ---- apps/documenteditor/main/index.html.deploy | 4 ---- apps/presentationeditor/main/index.html.deploy | 4 ---- apps/spreadsheeteditor/main/index.html.deploy | 4 ---- 4 files changed, 16 deletions(-) diff --git a/apps/common/main/lib/controller/Desktop.js b/apps/common/main/lib/controller/Desktop.js index a395d131a..add4de842 100644 --- a/apps/common/main/lib/controller/Desktop.js +++ b/apps/common/main/lib/controller/Desktop.js @@ -45,10 +45,6 @@ define([ var config = {}; var app = window.AscDesktopEditor; - // if ( app ) { - // app.execCommand('doc:onload', ''); - // } - return { init: function (opts) { _.extend(config, opts); diff --git a/apps/documenteditor/main/index.html.deploy b/apps/documenteditor/main/index.html.deploy index c400cc771..9c673db2f 100644 --- a/apps/documenteditor/main/index.html.deploy +++ b/apps/documenteditor/main/index.html.deploy @@ -217,10 +217,6 @@ .replace(/>/g, '>'); } - if ( window.AscDesktopEditor ) { - window.AscDesktopEditor.execCommand('doc:onload', ''); - } - var params = getUrlParams(), lang = (params["lang"] || 'en').split(/[\-\_]/)[0], customer = params["customer"] ? ('
        ' + encodeUrlParam(params["customer"]) + '
        ') : '', diff --git a/apps/presentationeditor/main/index.html.deploy b/apps/presentationeditor/main/index.html.deploy index e53735d94..8ee29fc49 100644 --- a/apps/presentationeditor/main/index.html.deploy +++ b/apps/presentationeditor/main/index.html.deploy @@ -217,10 +217,6 @@ .replace(/>/g, '>'); } - if ( window.AscDesktopEditor ) { - window.AscDesktopEditor.execCommand('doc:onload', ''); - } - var params = getUrlParams(), lang = (params["lang"] || 'en').split(/[\-\_]/)[0], customer = params["customer"] ? ('
        ' + encodeUrlParam(params["customer"]) + '
        ') : '', diff --git a/apps/spreadsheeteditor/main/index.html.deploy b/apps/spreadsheeteditor/main/index.html.deploy index f1bcef03e..9f4009e4d 100644 --- a/apps/spreadsheeteditor/main/index.html.deploy +++ b/apps/spreadsheeteditor/main/index.html.deploy @@ -216,10 +216,6 @@ .replace(/>/g, '>'); } - if ( window.AscDesktopEditor ) { - window.AscDesktopEditor.execCommand('doc:onload', ''); - } - var params = getUrlParams(), lang = (params["lang"] || 'en').split(/[\-\_]/)[0], customer = params["customer"] ? ('
        ' + encodeUrlParam(params["customer"]) + '
        ') : '', From 958355cf4a1d5123c80c39f3079932f92e5b1dae Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Wed, 14 Mar 2018 17:55:34 +0300 Subject: [PATCH 42/73] [ALL] notify desktop about event --- apps/api/documents/api.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/api/documents/api.js b/apps/api/documents/api.js index 631c20c73..aba6e716c 100644 --- a/apps/api/documents/api.js +++ b/apps/api/documents/api.js @@ -365,6 +365,8 @@ // _config.editorConfig.canBackToFolder = false; if (!_config.editorConfig.customization) _config.editorConfig.customization = {}; _config.editorConfig.customization.about = false; + + if ( window.AscDesktopEditor ) window.AscDesktopEditor.execCommand('webapps:events', 'loading'); } } })(); From c6e79c712ff9dc04d76c2539a3689b26a524ac01 Mon Sep 17 00:00:00 2001 From: nekurill Date: Thu, 15 Mar 2018 13:13:52 +0300 Subject: [PATCH 43/73] Have moved the icon "user". --- .../img/controls/common-controls@2x.png | Bin 30251 -> 18230 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/common/main/resources/img/controls/common-controls@2x.png b/apps/common/main/resources/img/controls/common-controls@2x.png index 4af0c3e62f3c6404b6db1e0b7adf24cd321249f6..86c6e0c1312d763960037c430d88899cef786f53 100755 GIT binary patch literal 18230 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 From a2afa4b7fec2d78a6d3a0be57003d871cdfff9c4 Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Wed, 21 Mar 2018 14:11:03 +0300 Subject: [PATCH 44/73] [Common] added 'settings' button --- apps/common/main/lib/view/Header.js | 30 +++++++++++++++---- .../main/resources/img/header/buttons.svg | 9 ++++-- apps/common/main/resources/less/header.less | 19 +++++++++++- 3 files changed, 49 insertions(+), 9 deletions(-) diff --git a/apps/common/main/lib/view/Header.js b/apps/common/main/lib/view/Header.js index 8032fcdba..64d3d6ae6 100644 --- a/apps/common/main/lib/view/Header.js +++ b/apps/common/main/lib/view/Header.js @@ -95,6 +95,7 @@ define([ '
        ' + '
        ' + '
        ' + + '
        ' + '
        ' + ''; @@ -216,6 +217,8 @@ define([ } } + function onAppShowed(config) {} + function onAppReady(mode) { appConfig = mode; @@ -318,6 +321,9 @@ define([ }); } } + + if ( me.btnOptions ) + me.btnOptions.updateHint(me.tipViewSettings); } function onDocNameKeyDown(e) { @@ -393,9 +399,18 @@ define([ reset : onResetUsers }); + me.btnOptions = new Common.UI.Button({ + cls: 'btn-header no-caret', + iconCls: 'svgicon svg-btn-options', + menu: true + }); + Common.NotificationCenter.on('app:ready', function(mode) { Common.Utils.asyncCall(onAppReady, me, mode); }); + Common.NotificationCenter.on('app:face', function(mode) { + Common.Utils.asyncCall(onAppShowed, me, mode); + }); }, render: function (el, role) { @@ -468,6 +483,8 @@ define([ if ( config.canEdit && config.canRequestEditRights ) this.btnEdit = createTitleButton('svg-btn-edit', $html.find('#slot-hbtn-edit')); + } else { + me.btnOptions.render($html.find('#slot-btn-options')); } $userList = $html.find('.cousers-list'); @@ -657,18 +674,19 @@ define([ btn.keepState = { disabled: btn.isDisabled() }; + btn.setDisabled( true ); } else { btn.setDisabled( btn.keepState.disabled ); - delete me.btnUndo.keepState; + delete btn.keepState; } } } - if ( alias == 'undo' ) { - _lockButton(me.btnUndo); - } else - if ( alias == 'redo' ) { - _lockButton(me.btnRedo); + switch ( alias ) { + case 'undo': _lockButton(me.btnUndo); break; + case 'redo': _lockButton(me.btnRedo); break; + case 'opts': _lockButton(me.btnOptions); break; + default: break; } } }, diff --git a/apps/common/main/resources/img/header/buttons.svg b/apps/common/main/resources/img/header/buttons.svg index 8bb39193b..637a73f15 100644 --- a/apps/common/main/resources/img/header/buttons.svg +++ b/apps/common/main/resources/img/header/buttons.svg @@ -59,7 +59,12 @@ c0.845-1.277,2.313-2.215,3.99-2.215c2.461,0,5.405,1.78,5.694,4.119C17.601,10.291,14.966,7.625,11.355,7.625z"/> - + + + + + + diff --git a/apps/common/main/resources/less/header.less b/apps/common/main/resources/less/header.less index fe8398aee..782457e60 100644 --- a/apps/common/main/resources/less/header.less +++ b/apps/common/main/resources/less/header.less @@ -62,6 +62,12 @@ color: #fff; } + .dropdown-menu { + label { + color: @gray-deep; + } + } + .btn-users, .btn-header { &:hover { @@ -70,7 +76,7 @@ } } - &:active { + &:active, &.active { &:not(.disabled) { background-color: rgba(0,0,0,0.2); } @@ -242,6 +248,11 @@ .hedset { font-size: 0; display: flex; + + .btn-group { + height: 100%; + } + } .btn-header { @@ -275,6 +286,12 @@ background-color: rgba(0,0,0,0.2); } } + + &.no-caret { + .inner-box-caret { + display: none; + } + } } #box-document-title { From dbf06b62fe4fd0210a0266e9d689673a923e6ad6 Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Wed, 21 Mar 2018 14:28:28 +0300 Subject: [PATCH 45/73] [ALL] added menu for 'options' button --- apps/common/main/lib/view/Header.js | 18 +- .../main/app/controller/LeftMenu.js | 1 + .../main/app/controller/Statusbar.js | 10 + .../main/app/controller/Toolbar.js | 78 +------- .../main/app/controller/Viewport.js | 151 +++++++++++++- .../main/app/template/Toolbar.template | 11 +- apps/documenteditor/main/app/view/Toolbar.js | 104 +--------- apps/documenteditor/main/locale/en.json | 26 ++- .../main/app/controller/LeftMenu.js | 1 + .../main/app/controller/Statusbar.js | 10 + .../main/app/controller/Toolbar.js | 91 +-------- .../main/app/controller/Viewport.js | 149 +++++++++++++- .../main/app/template/Toolbar.template | 11 +- .../main/app/view/Toolbar.js | 105 +--------- apps/presentationeditor/main/locale/en.json | 26 ++- .../main/app/controller/CellEditor.js | 7 + .../main/app/controller/LeftMenu.js | 1 + .../main/app/controller/Toolbar.js | 84 +------- .../main/app/controller/Viewport.js | 187 +++++++++++++++++- .../main/app/template/Toolbar.template | 11 +- .../main/app/view/Toolbar.js | 121 +----------- apps/spreadsheeteditor/main/locale/en.json | 26 ++- 22 files changed, 600 insertions(+), 629 deletions(-) diff --git a/apps/common/main/lib/view/Header.js b/apps/common/main/lib/view/Header.js index 64d3d6ae6..405e63780 100644 --- a/apps/common/main/lib/view/Header.js +++ b/apps/common/main/lib/view/Header.js @@ -405,6 +405,8 @@ define([ menu: true }); + me.mnuZoom = {options: {value: 100}}; + Common.NotificationCenter.on('app:ready', function(mode) { Common.Utils.asyncCall(onAppReady, me, mode); }); @@ -691,6 +693,14 @@ define([ } }, + fakeMenuItem: function() { + return { + conf: {checked: false}, + setChecked: function (val) { this.conf.checked = val; }, + isChecked: function () { return this.conf.checked; } + }; + }, + textBack: 'Go to Documents', txtRename: 'Rename', textSaveBegin: 'Saving...', @@ -706,7 +716,13 @@ define([ tipGoEdit: 'Edit current file', tipSave: 'Save', tipUndo: 'Undo', - tipRedo: 'Redo' + tipRedo: 'Redo', + textCompactView: 'Hide Toolbar', + textHideStatusBar: 'Hide Status Bar', + textHideLines: 'Hide Rulers', + textZoom: 'Zoom', + textAdvSettings: 'Advanced Settings', + tipViewSettings: 'View Settings' } }(), Common.Views.Header || {})) }); diff --git a/apps/documenteditor/main/app/controller/LeftMenu.js b/apps/documenteditor/main/app/controller/LeftMenu.js index a3a5d020a..2be1b2a1c 100644 --- a/apps/documenteditor/main/app/controller/LeftMenu.js +++ b/apps/documenteditor/main/app/controller/LeftMenu.js @@ -62,6 +62,7 @@ define([ }, 'Common.Views.Header': { 'click:users': _.bind(this.clickStatusbarUsers, this), + 'file:settings': _.bind(this.clickToolbarSettings,this), 'history:show': function () { if ( !this.leftMenu.panelHistory.isVisible() ) this.clickMenuFileItem('header', 'history'); diff --git a/apps/documenteditor/main/app/controller/Statusbar.js b/apps/documenteditor/main/app/controller/Statusbar.js index d195a7620..35237e80c 100644 --- a/apps/documenteditor/main/app/controller/Statusbar.js +++ b/apps/documenteditor/main/app/controller/Statusbar.js @@ -55,6 +55,7 @@ define([ ], initialize: function() { + var me = this; this.addListeners({ 'Statusbar': { 'langchanged': this.onLangMenu, @@ -62,6 +63,15 @@ define([ this.api.zoom(value); Common.NotificationCenter.trigger('edit:complete', this.statusbar); }.bind(this) + }, + 'Common.Views.Header': { + 'statusbar:hide': function (view, status) { + me.statusbar.setVisible(!status); + Common.localStorage.setBool('de-hidden-status', status); + + Common.NotificationCenter.trigger('layout:changed', 'status'); + Common.NotificationCenter.trigger('edit:complete', this.statusbar); + } } }); }, diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index 349989085..87bbe2826 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -114,6 +114,7 @@ define([ 'menu:show': this.onFileMenu.bind(this, 'show') }, 'Common.Views.Header': { + 'toolbar:setcompact': this.onChangeCompactView.bind(this), 'print': function (opts) { var _main = this.getApplication().getController('Main'); _main.onPrint(); @@ -296,7 +297,6 @@ define([ toolbar.btnPageMargins.menu.on('item:click', _.bind(this.onPageMarginsSelect, this)); toolbar.btnClearStyle.on('click', _.bind(this.onClearStyleClick, this)); toolbar.btnCopyStyle.on('toggle', _.bind(this.onCopyStyleToggle, this)); - toolbar.btnAdvSettings.on('click', _.bind(this.onAdvSettingsClick, this)); toolbar.mnuPageSize.on('item:click', _.bind(this.onPageSizeClick, this)); toolbar.mnuColorSchema.on('item:click', _.bind(this.onColorSchemaClick, this)); toolbar.btnMailRecepients.on('click', _.bind(this.onSelectRecepientsClick, this)); @@ -308,13 +308,6 @@ define([ toolbar.listStyles.on('click', _.bind(this.onListStyleSelect, this)); toolbar.listStyles.on('contextmenu', _.bind(this.onListStyleContextMenu, this)); toolbar.styleMenu.on('hide:before', _.bind(this.onListStyleBeforeHide, this)); - toolbar.mnuitemHideStatusBar.on('toggle', _.bind(this.onHideStatusBar, this)); - toolbar.mnuitemHideRulers.on('toggle', _.bind(this.onHideRulers, this)); - toolbar.mnuitemCompactToolbar.on('toggle', _.bind(this.onChangeCompactView, this)); - toolbar.btnFitPage.on('toggle', _.bind(this.onZoomToPageToggle, this)); - toolbar.btnFitWidth.on('toggle', _.bind(this.onZoomToWidthToggle, this)); - toolbar.mnuZoomIn.on('click', _.bind(this.onZoomInClick, this)); - toolbar.mnuZoomOut.on('click', _.bind(this.onZoomOutClick, this)); toolbar.btnInsertEquation.on('click', _.bind(this.onInsertEquationClick, this)); $('#id-save-style-plus, #id-save-style-link', toolbar.$el).on('click', this.onMenuSaveStyle.bind(this)); @@ -379,7 +372,6 @@ define([ var me = this; setTimeout(function () { me.onChangeCompactView(null, !me.toolbar.isCompact()); - me.toolbar.mnuitemCompactToolbar.setChecked(me.toolbar.isCompact(), true); }, 0); } }, @@ -845,12 +837,7 @@ define([ this.toolbar.mnuInsertPageNum.setDisabled(false); }, - onApiZoomChange: function(percent, type) { - this.toolbar.btnFitPage.setChecked(type == 2, true); - this.toolbar.btnFitWidth.setChecked(type == 1, true); - this.toolbar.mnuZoom.options.value = percent; - $('.menu-zoom .zoom', this.toolbar.el).html(percent + '%'); - }, + onApiZoomChange: function(percent, type) {}, onApiStartHighlight: function(pressed) { this.toolbar.btnHighlightColor.toggle(pressed, true); @@ -1415,11 +1402,6 @@ define([ this.modeAlwaysSetStyle = state; }, - onAdvSettingsClick: function(btn, e) { - this.toolbar.fireEvent('file:settings', this); - btn.cmpEl.blur(); - }, - onPageSizeClick: function(menu, item, state) { if (this.api && state) { this._state.pgsize = [0, 0]; @@ -1993,61 +1975,6 @@ define([ // Common.NotificationCenter.trigger('edit:complete', this.toolbar); // }, - onHideStatusBar: function(item, checked) { - var headerView = this.getApplication().getController('Statusbar').getView('Statusbar'); - headerView && headerView.setVisible(!checked); - - Common.localStorage.setBool('de-hidden-status', checked); - - Common.NotificationCenter.trigger('layout:changed', 'status'); - Common.NotificationCenter.trigger('edit:complete', this.toolbar); - }, - - onHideRulers: function(item, checked) { - if (this.api) { - this.api.asc_SetViewRulers(!checked); - } - - Common.localStorage.setBool('de-hidden-rulers', checked); - - Common.NotificationCenter.trigger('layout:changed', 'rulers'); - Common.NotificationCenter.trigger('edit:complete', this.toolbar); - }, - - onZoomToPageToggle: function(item, state) { - if (this.api) { - if (state) - this.api.zoomFitToPage(); - else - this.api.zoomCustomMode(); - } - Common.NotificationCenter.trigger('edit:complete', this.toolbar); - }, - - onZoomToWidthToggle: function(item, state) { - if (this.api) { - if (state) - this.api.zoomFitToWidth(); - else - this.api.zoomCustomMode(); - } - Common.NotificationCenter.trigger('edit:complete', this.toolbar); - }, - - onZoomInClick: function(btn) { - if (this.api) - this.api.zoomIn(); - - Common.NotificationCenter.trigger('edit:complete', this.toolbar); - }, - - onZoomOutClick: function(btn) { - if (this.api) - this.api.zoomOut(); - - Common.NotificationCenter.trigger('edit:complete', this.toolbar); - }, - _clearBullets: function() { this.toolbar.btnMarkers.toggle(false, true); this.toolbar.btnNumbers.toggle(false, true); @@ -2716,7 +2643,6 @@ define([ disable = disable || (reviewmode ? toolbar_mask.length>0 : group_mask.length>0); toolbar.$el.find('.toolbar').toggleClass('masked', disable); - toolbar.btnHide.setDisabled(disable); if ( toolbar.synchTooltip ) toolbar.synchTooltip.hide(); diff --git a/apps/documenteditor/main/app/controller/Viewport.js b/apps/documenteditor/main/app/controller/Viewport.js index 93bb5defd..0c889b7c0 100644 --- a/apps/documenteditor/main/app/controller/Viewport.js +++ b/apps/documenteditor/main/app/controller/Viewport.js @@ -79,6 +79,7 @@ define([ toolbar.setExtra('left', me.header.getPanel('left', config)); }, 'view:compact' : function (toolbar, state) { + me.header.mnuitemCompactToolbar.setChecked(state, true); me.viewport.vlayout.getItem('toolbar').height = state ? Common.Utils.InternalSettings.get('toolbar-height-compact') : Common.Utils.InternalSettings.get('toolbar-height-normal'); }, @@ -105,6 +106,7 @@ define([ setApi: function(api) { this.api = api; + this.api.asc_registerCallback('asc_onZoomChange', this.onApiZoomChange.bind(this)); }, @@ -130,7 +132,11 @@ define([ this.boxSdk = $('#editor_sdk'); this.boxSdk.css('border-left', 'none'); + this.header.mnuitemFitPage = this.header.fakeMenuItem(); + this.header.mnuitemFitWidth = this.header.fakeMenuItem(); + Common.NotificationCenter.on('app:face', this.onAppShowed.bind(this)); + Common.NotificationCenter.on('app:ready', this.onAppReady.bind(this)); }, onAppShowed: function (config) { @@ -169,6 +175,111 @@ define([ } }, + onAppReady: function (config) { + var me = this; + if ( me.header.btnOptions ) { + var compactview = !config.isEdit; + if ( config.isEdit ) { + if ( Common.localStorage.itemExists("de-compact-toolbar") ) { + compactview = Common.localStorage.getBool("de-compact-toolbar"); + } else + if ( config.customization && config.customization.compactToolbar ) + compactview = true; + } + + me.header.mnuitemCompactToolbar = new Common.UI.MenuItem({ + caption: me.header.textCompactView, + checked: compactview, + checkable: true, + value: 'toolbar' + }); + + var mnuitemHideStatusBar = new Common.UI.MenuItem({ + caption: me.header.textHideStatusBar, + checked: Common.localStorage.getBool("de-hidden-status"), + checkable: true, + value: 'statusbar' + }); + + if ( config.canBrandingExt && config.customization && config.customization.statusBar === false ) + mnuitemHideStatusBar.hide(); + + var mnuitemHideRulers = new Common.UI.MenuItem({ + caption: me.header.textHideLines, + checked: Common.localStorage.getBool("de-hidden-rulers"), + checkable: true, + value: 'rulers' + }); + + me.header.mnuitemFitPage = new Common.UI.MenuItem({ + caption: me.textFitPage, + checkable: true, + checked: me.header.mnuitemFitPage.isChecked(), + value: 'zoom:page' + }); + + me.header.mnuitemFitWidth = new Common.UI.MenuItem({ + caption: me.textFitWidth, + checkable: true, + checked: me.header.mnuitemFitWidth.isChecked(), + value: 'zoom:width' + }); + + me.header.mnuZoom = new Common.UI.MenuItem({ + template: _.template([ + '' + ].join('')), + stopPropagation: true, + value: me.header.mnuZoom.options.value + }); + + me.header.btnOptions.setMenu(new Common.UI.Menu({ + cls: 'pull-right', + style: 'min-width: 180px;', + items: [ + me.header.mnuitemCompactToolbar, + mnuitemHideStatusBar, + mnuitemHideRulers, + {caption:'--'}, + me.header.mnuitemFitPage, + me.header.mnuitemFitWidth, + me.header.mnuZoom, + {caption:'--'}, + new Common.UI.MenuItem({ + caption: me.header.textAdvSettings, + value: 'advanced' + }) + ] + }) + ); + + var _on_btn_zoom = function (btn) { + btn == 'up' ? me.api.zoomIn() : me.api.zoomOut(); + Common.NotificationCenter.trigger('edit:complete', me.header); + }; + + (new Common.UI.Button({ + el : $('#hdr-menu-zoom-out', me.header.mnuZoom.$el), + cls : 'btn-toolbar' + })).on('click', _on_btn_zoom.bind(me, 'down')); + + (new Common.UI.Button({ + el : $('#hdr-menu-zoom-in', me.header.mnuZoom.$el), + cls : 'btn-toolbar' + })).on('click', _on_btn_zoom.bind(me, 'up')); + + me.header.btnOptions.menu.on('item:click', me.onOptionsItemClick.bind(this)); + } + }, + onLayoutChanged: function(area) { switch (area) { default: @@ -217,6 +328,42 @@ define([ me.header.lockHeaderBtns( 'undo', _need_disable ); me.header.lockHeaderBtns( 'redo', _need_disable ); - } - }); + me.header.lockHeaderBtns( 'opts', _need_disable ); + }, + + onApiZoomChange: function(percent, type) { + this.header.mnuitemFitPage.setChecked(type == 2, true); + this.header.mnuitemFitWidth.setChecked(type == 1, true); + this.header.mnuZoom.options.value = percent; + + if ( this.header.mnuZoom.$el ) + $('.menu-zoom label.zoom', this.header.mnuZoom.$el).html(percent + '%'); + }, + + onOptionsItemClick: function (menu, item, e) { + var me = this; + + switch ( item.value ) { + case 'toolbar': me.header.fireEvent('toolbar:setcompact', [menu, item.isChecked()]); break; + case 'statusbar': me.header.fireEvent('statusbar:hide', [item, item.isChecked()]); break; + case 'rulers': + me.api.asc_SetViewRulers(!item.isChecked()); + Common.localStorage.setBool('de-hidden-rulers', item.isChecked()); + Common.NotificationCenter.trigger('layout:changed', 'rulers'); + Common.NotificationCenter.trigger('edit:complete', me.header); + break; + case 'zoom:page': + item.isChecked() ? me.api.zoomFitToPage() : me.api.zoomCustomMode(); + Common.NotificationCenter.trigger('edit:complete', me.header); + break; + case 'zoom:width': + item.isChecked() ? me.api.zoomFitToWidth() : me.api.zoomCustomMode(); + Common.NotificationCenter.trigger('edit:complete', me.header); + break; + case 'advanced': me.header.fireEvent('file:settings', me.header); break; + } + }, + + textFitPage: 'Fit to Page', + textFitWidth: 'Fit to Width' }); diff --git a/apps/documenteditor/main/app/template/Toolbar.template b/apps/documenteditor/main/app/template/Toolbar.template index 1c6d10506..6e9d81d96 100644 --- a/apps/documenteditor/main/app/template/Toolbar.template +++ b/apps/documenteditor/main/app/template/Toolbar.template @@ -92,16 +92,7 @@
        -
        -
        -
        -
        - -
        -
        - -
        -
        +
        diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index 15a7c2f74..fc879aaf5 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -944,33 +944,6 @@ define([ iconCls: 'btn-mailrecepients' }); - this.btnHide = new Common.UI.Button({ - id: 'id-toolbar-btn-hidebars', - cls: 'btn-toolbar', - iconCls: 'btn-hidebars no-mask', - menu: true - }); - this.toolbarControls.push(this.btnHide); - - this.btnFitPage = { - conf: {checked: false}, - setChecked: function (val) { - this.conf.checked = val; - }, - isChecked: function () { - return this.conf.checked; - } - }; - this.btnFitWidth = clone(this.btnFitPage); - this.mnuZoom = {options: {value: 100}}; - - this.btnAdvSettings = new Common.UI.Button({ - id: 'id-toolbar-btn-settings', - cls: 'btn-toolbar', - iconCls: 'btn-settings no-mask' - }); - this.toolbarControls.push(this.btnAdvSettings); - me.btnImgAlign = new Common.UI.Button({ cls: 'btn-toolbar x-huge icon-top', iconCls: 'btn-img-align', @@ -1198,9 +1171,9 @@ define([ } }); + me.setTab('home'); if ( me.isCompactView ) - me.setFolded(true); else - me.setTab('home'); + me.setFolded(true); var top = Common.localStorage.getItem("de-pgmargins-top"), left = Common.localStorage.getItem("de-pgmargins-left"), @@ -1291,8 +1264,6 @@ define([ _injectComponent('#slot-btn-clearstyle', this.btnClearStyle); _injectComponent('#slot-btn-copystyle', this.btnCopyStyle); _injectComponent('#slot-btn-colorschemas', this.btnColorSchemas); - _injectComponent('#slot-btn-hidebars', this.btnHide); - _injectComponent('#slot-btn-settings', this.btnAdvSettings); _injectComponent('#slot-btn-paracolor', this.btnParagraphColor); _injectComponent('#slot-field-styles', this.listStyles); _injectComponent('#slot-btn-halign', this.btnHorizontalAlign); @@ -1539,67 +1510,14 @@ define([ this.btnCopyStyle.updateHint(this.tipCopyStyle + Common.Utils.String.platformKey('Ctrl+Shift+C')); this.btnColorSchemas.updateHint(this.tipColorSchemas); this.btnMailRecepients.updateHint(this.tipMailRecepients); - this.btnHide.updateHint(this.tipViewSettings); - this.btnAdvSettings.updateHint(this.tipAdvSettings); // set menus var me = this; - this.btnHide.setMenu(new Common.UI.Menu({ - cls: 'pull-right', - style: 'min-width: 180px;', - items: [ - this.mnuitemCompactToolbar = new Common.UI.MenuItem({ - caption: this.textCompactView, - checked: me.isCompactView, - checkable: true - }), - this.mnuitemHideStatusBar = new Common.UI.MenuItem({ - caption: this.textHideStatusBar, - checked: Common.localStorage.getBool("de-hidden-status"), - checkable: true - }), - this.mnuitemHideRulers = new Common.UI.MenuItem({ - caption: this.textHideLines, - checked: Common.localStorage.getBool("de-hidden-rulers"), - checkable: true - }), - {caption: '--'}, - this.btnFitPage = new Common.UI.MenuItem({ - caption: this.textFitPage, - checkable: true, - checked: this.btnFitPage.isChecked() - }), - this.btnFitWidth = new Common.UI.MenuItem({ - caption: this.textFitWidth, - checkable: true, - checked: this.btnFitWidth.isChecked() - }), - this.mnuZoom = new Common.UI.MenuItem({ - template: _.template([ - '' - ].join('')), - stopPropagation: true, - value: this.mnuZoom.options.value - }) - ] - }) - ); // if (this.mode.isDesktopApp || this.mode.canBrandingExt && this.mode.customization && this.mode.customization.header === false) // this.mnuitemHideTitleBar.hide(); - if (this.mode.canBrandingExt && this.mode.customization && this.mode.customization.statusBar===false) - this.mnuitemHideStatusBar.hide(); - this.btnMarkers.setMenu( new Common.UI.Menu({ style: 'min-width: 139px', @@ -1657,15 +1575,6 @@ define([ this.paragraphControls.push(this.mnuPageNumCurrentPos); this.paragraphControls.push(this.mnuInsertPageCount); - this.mnuZoomOut = new Common.UI.Button({ - el: $('#id-menu-zoom-out'), - cls: 'btn-toolbar' - }); - this.mnuZoomIn = new Common.UI.Button({ - el: $('#id-menu-zoom-in'), - cls: 'btn-toolbar' - }); - // set dataviews var _conf = this.mnuMarkersPicker.conf; @@ -2305,15 +2214,6 @@ define([ tipInsertText: 'Insert Text', tipInsertTextArt: 'Insert Text Art', tipHAligh: 'Horizontal Align', - tipViewSettings: 'View Settings', - tipAdvSettings: 'Advanced Settings', - textCompactView: 'Hide Toolbar', - textHideTitleBar: 'Hide Title Bar', - textHideStatusBar: 'Hide Status Bar', - textHideLines: 'Hide Rulers', - textFitPage: 'Fit to Page', - textFitWidth: 'Fit to Width', - textZoom: 'Zoom', mniEditDropCap: 'Drop Cap Settings', textNone: 'None', textInText: 'In Text', diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index c87840c5d..7f15075c5 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -153,6 +153,12 @@ "Common.Views.Header.tipViewUsers": "View users and manage document access rights", "Common.Views.Header.txtAccessRights": "Change access rights", "Common.Views.Header.txtRename": "Rename", + "Common.Views.Header.textAdvSettings": "Advanced settings", + "Common.Views.Header.textCompactView": "Hide Toolbar", + "Common.Views.Header.textHideStatusBar": "Hide Status Bar", + "Common.Views.Header.textZoom": "Zoom", + "Common.Views.Header.tipViewSettings": "View settings", + "Common.Views.Header.textHideLines": "Hide Rulers", "Common.Views.History.textCloseHistory": "Close History", "Common.Views.History.textHide": "Collapse", "Common.Views.History.textHideAll": "Hide detailed changes", @@ -779,6 +785,8 @@ "DE.Controllers.Toolbar.txtSymbol_vdots": "Vertical ellipsis", "DE.Controllers.Toolbar.txtSymbol_xsi": "Xi", "DE.Controllers.Toolbar.txtSymbol_zeta": "Zeta", + "DE.Controllers.Viewport.textFitPage": "Fit to Page", + "DE.Controllers.Viewport.textFitWidth": "Fit to Width", "DE.Views.ChartSettings.textAdvanced": "Show advanced settings", "DE.Views.ChartSettings.textArea": "Area", "DE.Views.ChartSettings.textBar": "Bar", @@ -1744,14 +1752,14 @@ "DE.Views.Toolbar.textColumnsRight": "Right", "DE.Views.Toolbar.textColumnsThree": "Three", "DE.Views.Toolbar.textColumnsTwo": "Two", - "DE.Views.Toolbar.textCompactView": "Hide Toolbar", + "del_DE.Views.Toolbar.textCompactView": "Hide Toolbar", "DE.Views.Toolbar.textContPage": "Continuous Page", "DE.Views.Toolbar.textEvenPage": "Even Page", - "DE.Views.Toolbar.textFitPage": "Fit to Page", - "DE.Views.Toolbar.textFitWidth": "Fit to Width", - "DE.Views.Toolbar.textHideLines": "Hide Rulers", - "DE.Views.Toolbar.textHideStatusBar": "Hide Status Bar", - "DE.Views.Toolbar.textHideTitleBar": "Hide Title Bar", + "del_DE.Views.Toolbar.textFitPage": "Fit to Page", + "del_DE.Views.Toolbar.textFitWidth": "Fit to Width", + "del_DE.Views.Toolbar.textHideLines": "Hide Rulers", + "del_DE.Views.Toolbar.textHideStatusBar": "Hide Status Bar", + "del_DE.Views.Toolbar.textHideTitleBar": "Hide Title Bar", "DE.Views.Toolbar.textInMargin": "In Margin", "DE.Views.Toolbar.textInsColumnBreak": "Insert Column Break", "DE.Views.Toolbar.textInsertPageCount": "Insert number of pages", @@ -1805,8 +1813,8 @@ "DE.Views.Toolbar.textToCurrent": "To current position", "DE.Views.Toolbar.textTop": "Top: ", "DE.Views.Toolbar.textUnderline": "Underline", - "DE.Views.Toolbar.textZoom": "Zoom", - "DE.Views.Toolbar.tipAdvSettings": "Advanced settings", + "del_DE.Views.Toolbar.textZoom": "Zoom", + "del_DE.Views.Toolbar.tipAdvSettings": "Advanced settings", "DE.Views.Toolbar.tipAlignCenter": "Align center", "DE.Views.Toolbar.tipAlignJust": "Justified", "DE.Views.Toolbar.tipAlignLeft": "Align left", @@ -1862,7 +1870,7 @@ "DE.Views.Toolbar.tipShowHiddenChars": "Nonprinting characters", "DE.Views.Toolbar.tipSynchronize": "The document has been changed by another user. Please click to save your changes and reload the updates.", "DE.Views.Toolbar.tipUndo": "Undo", - "DE.Views.Toolbar.tipViewSettings": "View settings", + "del_DE.Views.Toolbar.tipViewSettings": "View settings", "DE.Views.Toolbar.txtScheme1": "Office", "DE.Views.Toolbar.txtScheme10": "Median", "DE.Views.Toolbar.txtScheme11": "Metro", diff --git a/apps/presentationeditor/main/app/controller/LeftMenu.js b/apps/presentationeditor/main/app/controller/LeftMenu.js index eaed9b725..ce96b2837 100644 --- a/apps/presentationeditor/main/app/controller/LeftMenu.js +++ b/apps/presentationeditor/main/app/controller/LeftMenu.js @@ -61,6 +61,7 @@ define([ 'hide': _.bind(this.onHideChat, this) }, 'Common.Views.Header': { + 'file:settings': _.bind(this.clickToolbarSettings,this), 'click:users': _.bind(this.clickStatusbarUsers, this) }, 'Common.Views.Plugins': { diff --git a/apps/presentationeditor/main/app/controller/Statusbar.js b/apps/presentationeditor/main/app/controller/Statusbar.js index 00b0364c8..87ef91725 100644 --- a/apps/presentationeditor/main/app/controller/Statusbar.js +++ b/apps/presentationeditor/main/app/controller/Statusbar.js @@ -56,12 +56,22 @@ define([ ], initialize: function() { + var me = this; this.addListeners({ 'FileMenu': { 'settings:apply': _.bind(this.applySettings, this) }, 'Statusbar': { 'langchanged': this.onLangMenu + }, + 'Common.Views.Header': { + 'statusbar:hide': function (view, status) { + me.statusbar.setVisible(!status); + Common.localStorage.setBool('pe-hidden-status', status); + + Common.NotificationCenter.trigger('layout:changed', 'status'); + Common.NotificationCenter.trigger('edit:complete', this.statusbar); + } } }); this._state = { diff --git a/apps/presentationeditor/main/app/controller/Toolbar.js b/apps/presentationeditor/main/app/controller/Toolbar.js index 51cb88ead..da523a4e6 100644 --- a/apps/presentationeditor/main/app/controller/Toolbar.js +++ b/apps/presentationeditor/main/app/controller/Toolbar.js @@ -129,6 +129,7 @@ define([ 'menu:show': this.onFileMenu.bind(this, 'show') }, 'Common.Views.Header': { + 'toolbar:setcompact': this.onChangeCompactView.bind(this), 'print': function (opts) { var _main = this.getApplication().getController('Main'); _main.onPrint(); @@ -293,18 +294,10 @@ define([ toolbar.btnInsertTable.menu.on('item:click', _.bind(this.onInsertTableClick, this)); toolbar.btnClearStyle.on('click', _.bind(this.onClearStyleClick, this)); toolbar.btnCopyStyle.on('toggle', _.bind(this.onCopyStyleToggle, this)); - toolbar.btnAdvSettings.on('click', _.bind(this.onAdvSettingsClick, this)); toolbar.btnColorSchemas.menu.on('item:click', _.bind(this.onColorSchemaClick, this)); toolbar.btnSlideSize.menu.on('item:click', _.bind(this.onSlideSize, this)); toolbar.mnuInsertChartPicker.on('item:click', _.bind(this.onSelectChart, this)); toolbar.listTheme.on('click', _.bind(this.onListThemeSelect, this)); - toolbar.mnuitemHideStatusBar.on('toggle', _.bind(this.onHideStatusBar, this)); - toolbar.mnuitemHideRulers.on('toggle', _.bind(this.onHideRulers, this)); - toolbar.mnuitemCompactToolbar.on('toggle', _.bind(this.onChangeCompactView, this)); - toolbar.btnFitPage.on('toggle', _.bind(this.onZoomToPageToggle, this)); - toolbar.btnFitWidth.on('toggle', _.bind(this.onZoomToWidthToggle, this)); - toolbar.mnuZoomIn.on('click', _.bind(this.onZoomInClick, this)); - toolbar.mnuZoomOut.on('click', _.bind(this.onZoomOutClick, this)); toolbar.btnInsertEquation.on('click', _.bind(this.onInsertEquationClick, this)); }, @@ -369,7 +362,6 @@ define([ var me = this; Common.Utils.asyncCall(function () { me.onChangeCompactView(null, !me.toolbar.isCompact()); - me.toolbar.mnuitemCompactToolbar.setChecked(me.toolbar.isCompact(), true); }); } }, @@ -775,18 +767,7 @@ define([ this.editMode = false; }, - onApiZoomChange: function(percent, type) { - if (this._state.zoom_type !== type) { - this.toolbar.btnFitPage.setChecked(type == 2, true); - this.toolbar.btnFitWidth.setChecked(type == 1, true); - this._state.zoom_type = type; - } - if (this._state.zoom_percent !== percent) { - $('.menu-zoom .zoom', this.toolbar.el).html(percent + '%'); - this._state.zoom_percent = percent; - } - this.toolbar.mnuZoom.options.value = percent; - }, + onApiZoomChange: function(percent, type) {}, onApiInitEditorStyles: function(themes) { if (themes) { @@ -1441,11 +1422,6 @@ define([ this.modeAlwaysSetStyle = state; }, - onAdvSettingsClick: function(btn, e) { - this.toolbar.fireEvent('file:settings', this); - btn.cmpEl.blur(); - }, - onColorSchemaClick: function(menu, item) { if (this.api) { this.api.ChangeColorScheme(item.value); @@ -1559,69 +1535,6 @@ define([ Common.NotificationCenter.trigger('edit:complete', this.toolbar); }, - onHideStatusBar: function(item, checked) { - var headerView = this.getApplication().getController('Statusbar').getView('Statusbar'); - headerView && headerView.setVisible(!checked); - - Common.localStorage.setBool('pe-hidden-status', checked); - - Common.NotificationCenter.trigger('layout:changed', 'status'); - Common.NotificationCenter.trigger('edit:complete', this.toolbar); - }, - - onHideRulers: function(item, checked) { - if (this.api) { - this.api.asc_SetViewRulers(!checked); - } - - Common.localStorage.setBool('pe-hidden-rulers', checked); - - Common.NotificationCenter.trigger('layout:changed', 'rulers'); - Common.NotificationCenter.trigger('edit:complete', this.toolbar); - }, - - onZoomToPageToggle: function(item, state) { - if (this.api) { - this._state.zoom_type = undefined; - this._state.zoom_percent = undefined; - if (state) - this.api.zoomFitToPage(); - else - this.api.zoomCustomMode(); - } - Common.NotificationCenter.trigger('edit:complete', this.toolbar); - }, - - onZoomToWidthToggle: function(item, state) { - if (this.api) { - this._state.zoom_type = undefined; - this._state.zoom_percent = undefined; - if (state) - this.api.zoomFitToWidth(); - else - this.api.zoomCustomMode(); - } - Common.NotificationCenter.trigger('edit:complete', this.toolbar); - }, - - onZoomInClick: function(btn) { - this._state.zoom_type = undefined; - this._state.zoom_percent = undefined; - if (this.api) - this.api.zoomIn(); - - Common.NotificationCenter.trigger('edit:complete', this.toolbar); - }, - - onZoomOutClick: function(btn) { - this._state.zoom_type = undefined; - this._state.zoom_percent = undefined; - if (this.api) - this.api.zoomOut(); - - Common.NotificationCenter.trigger('edit:complete', this.toolbar); - }, - _clearBullets: function() { this.toolbar.btnMarkers.toggle(false, true); this.toolbar.btnNumbers.toggle(false, true); diff --git a/apps/presentationeditor/main/app/controller/Viewport.js b/apps/presentationeditor/main/app/controller/Viewport.js index 0ae30080e..6ae3dbbe9 100644 --- a/apps/presentationeditor/main/app/controller/Viewport.js +++ b/apps/presentationeditor/main/app/controller/Viewport.js @@ -112,6 +112,7 @@ define([ setApi: function(api) { this.api = api; + this.api.asc_registerCallback('asc_onZoomChange', this.onApiZoomChange.bind(this)); }, @@ -134,7 +135,11 @@ define([ Common.localStorage.setItem('pe-mainmenu-width',leftPanel.width()); }, this); + this.header.mnuitemFitPage = this.header.fakeMenuItem(); + this.header.mnuitemFitWidth = this.header.fakeMenuItem(); + Common.NotificationCenter.on('app:face', this.onAppShowed.bind(this)); + Common.NotificationCenter.on('app:ready', this.onAppReady.bind(this)); }, onAppShowed: function (config) { @@ -172,6 +177,110 @@ define([ } }, + onAppReady: function (config) { + var me = this; + if ( me.header.btnOptions ) { + var compactview = !config.isEdit; + if ( config.isEdit ) { + if ( Common.localStorage.itemExists("pe-compact-toolbar") ) { + compactview = Common.localStorage.getBool("pe-compact-toolbar"); + } else + if ( config.customization && config.customization.compactToolbar ) + compactview = true; + } + + me.header.mnuitemCompactToolbar = new Common.UI.MenuItem({ + caption: me.header.textCompactView, + checked: compactview, + checkable: true, + value: 'toolbar' + }); + + var mnuitemHideStatusBar = new Common.UI.MenuItem({ + caption: me.header.textHideStatusBar, + checked: Common.localStorage.getBool("pe-hidden-status"), + checkable: true, + value: 'statusbar' + }); + + if ( config.canBrandingExt && config.customization && config.customization.statusBar === false ) + mnuitemHideStatusBar.hide(); + + var mnuitemHideRulers = new Common.UI.MenuItem({ + caption: me.header.textHideLines, + checked: Common.localStorage.getBool("pe-hidden-rulers"), + checkable: true, + value: 'rulers' + }); + + me.header.mnuitemFitPage = new Common.UI.MenuItem({ + caption: me.textFitPage, + checkable: true, + checked: me.header.mnuitemFitPage.isChecked(), + value: 'zoom:page' + }); + + me.header.mnuitemFitWidth = new Common.UI.MenuItem({ + caption: me.textFitWidth, + checkable: true, + checked: me.header.mnuitemFitWidth.isChecked(), + value: 'zoom:width' + }); + + me.header.mnuZoom = new Common.UI.MenuItem({ + template: _.template([ + '' + ].join('')), + stopPropagation: true, + value: me.header.mnuZoom.options.value + }); + + me.header.btnOptions.setMenu(new Common.UI.Menu({ + cls: 'pull-right', + style: 'min-width: 180px;', + items: [ + me.header.mnuitemCompactToolbar, + mnuitemHideStatusBar, + mnuitemHideRulers, + {caption:'--'}, + me.header.mnuitemFitPage, + me.header.mnuitemFitWidth, + me.header.mnuZoom, + {caption:'--'}, + new Common.UI.MenuItem({ + caption: me.header.textAdvSettings, + value: 'advanced' + }) + ] + }) + ); + + var _on_btn_zoom = function (btn) { + btn == 'up' ? me.api.zoomIn() : me.api.zoomOut(); + Common.NotificationCenter.trigger('edit:complete', me.header); + }; + + (new Common.UI.Button({ + el : $('#hdr-menu-zoom-out', me.header.mnuZoom.$el), + cls : 'btn-toolbar' + })).on('click', _on_btn_zoom.bind(me, 'down')); + + (new Common.UI.Button({ + el : $('#hdr-menu-zoom-in', me.header.mnuZoom.$el), + cls : 'btn-toolbar' + })).on('click', _on_btn_zoom.bind(me, 'up')); + + me.header.btnOptions.menu.on('item:click', me.onOptionsItemClick.bind(this)); + } + }, onLayoutChanged: function(area) { switch (area) { @@ -256,6 +365,42 @@ define([ me.header.lockHeaderBtns( 'undo', _need_disable ); me.header.lockHeaderBtns( 'redo', _need_disable ); - } - }); + me.header.lockHeaderBtns( 'opts', _need_disable ); + }, + + onApiZoomChange: function(percent, type) { + this.header.mnuitemFitPage.setChecked(type == 2, true); + this.header.mnuitemFitWidth.setChecked(type == 1, true); + this.header.mnuZoom.options.value = percent; + + if ( this.header.mnuZoom.$el ) + $('.menu-zoom label.zoom', this.header.mnuZoom.$el).html(percent + '%'); + }, + + onOptionsItemClick: function (menu, item, e) { + var me = this; + + switch ( item.value ) { + case 'toolbar': me.header.fireEvent('toolbar:setcompact', [menu, item.isChecked()]); break; + case 'statusbar': me.header.fireEvent('statusbar:hide', [item, item.isChecked()]); break; + case 'rulers': + me.api.asc_SetViewRulers(!item.isChecked()); + Common.localStorage.setBool('pe-hidden-rulers', item.isChecked()); + Common.NotificationCenter.trigger('layout:changed', 'rulers'); + Common.NotificationCenter.trigger('edit:complete', me.header); + break; + case 'zoom:page': + item.isChecked() ? me.api.zoomFitToPage() : me.api.zoomCustomMode(); + Common.NotificationCenter.trigger('edit:complete', me.header); + break; + case 'zoom:width': + item.isChecked() ? me.api.zoomFitToWidth() : me.api.zoomCustomMode(); + Common.NotificationCenter.trigger('edit:complete', me.header); + break; + case 'advanced': me.header.fireEvent('file:settings', me.header); break; + } + }, + + textFitPage: 'Fit to Page', + textFitWidth: 'Fit to Width' }); diff --git a/apps/presentationeditor/main/app/template/Toolbar.template b/apps/presentationeditor/main/app/template/Toolbar.template index 7cae88f91..0cb5f81ec 100644 --- a/apps/presentationeditor/main/app/template/Toolbar.template +++ b/apps/presentationeditor/main/app/template/Toolbar.template @@ -110,16 +110,7 @@
        -
        -
        -
        -
        - -
        -
        - -
        -
        +
        diff --git a/apps/presentationeditor/main/app/view/Toolbar.js b/apps/presentationeditor/main/app/view/Toolbar.js index bafa319e4..6a308131f 100644 --- a/apps/presentationeditor/main/app/view/Toolbar.js +++ b/apps/presentationeditor/main/app/view/Toolbar.js @@ -576,31 +576,6 @@ define([ }); me.slideOnlyControls.push(me.btnColorSchemas); - me.btnHide = new Common.UI.Button({ - id : 'id-toolbar-btn-hidebars', - cls : 'btn-toolbar', - iconCls : 'btn-hidebars no-mask', - lock : [_set.menuFileOpen, _set.slideDeleted, _set.disableOnStart], - menu : true - }); - me.slideOnlyControls.push(me.btnHide); - - this.btnFitPage = { - conf: {checked:false}, - setChecked: function(val) { this.conf.checked = val;}, - isChecked: function () { return this.conf.checked; } - }; - this.btnFitWidth = clone(this.btnFitPage); - this.mnuZoom = {options: {value: 100}}; - - me.btnAdvSettings = new Common.UI.Button({ - id : 'id-toolbar-btn-settings', - cls : 'btn-toolbar', - iconCls : 'btn-settings no-mask', - lock : [_set.slideDeleted, _set.disableOnStart] - }); - me.slideOnlyControls.push(me.btnAdvSettings); - me.btnShapeAlign = new Common.UI.Button({ id : 'id-toolbar-btn-shape-align', cls : 'btn-toolbar', @@ -875,9 +850,9 @@ define([ } }); + me.setTab('home'); if ( me.isCompactView ) - me.setFolded(true); else - me.setTab('home'); + me.setFolded(true); return this; }, @@ -943,8 +918,6 @@ define([ _injectComponent('#slot-btn-colorschemas', this.btnColorSchemas); _injectComponent('#slot-btn-slidesize', this.btnSlideSize); _injectComponent('#slot-field-styles', this.listTheme); - _injectComponent('#slot-btn-hidebars', this.btnHide); - _injectComponent('#slot-btn-settings', this.btnAdvSettings); function _injectBtns(opts) { var array = createButtonSet(); @@ -1105,8 +1078,6 @@ define([ this.btnInsertHyperlink.updateHint(this.tipInsertHyperlink + Common.Utils.String.platformKey('Ctrl+K')); this.btnInsertTextArt.updateHint(this.tipInsertTextArt); this.btnColorSchemas.updateHint(this.tipColorSchemas); - this.btnHide.updateHint(this.tipViewSettings); - this.btnAdvSettings.updateHint(this.tipAdvSettings); this.btnShapeAlign.updateHint(this.tipShapeAlign); this.btnShapeArrange.updateHint(this.tipShapeArrange); this.btnSlideSize.updateHint(this.tipSlideSize); @@ -1115,66 +1086,6 @@ define([ var me = this; - this.btnHide.setMenu( - new Common.UI.Menu({ - cls: 'pull-right', - style: 'min-width: 180px;', - items: [ - this.mnuitemCompactToolbar = new Common.UI.MenuItem({ - caption: this.textCompactView, - checkable: true, - checked: me.isCompactView - }), - this.mnuitemHideStatusBar = new Common.UI.MenuItem({ - caption: this.textHideStatusBar, - checkable: true - }), - this.mnuitemHideRulers = new Common.UI.MenuItem({ - caption: this.textHideLines, - checkable: true - }), - {caption: '--'}, - this.btnFitPage = new Common.UI.MenuItem({ - caption: this.textFitPage, - checkable: true, - checked: this.btnFitPage.isChecked() - }), - this.btnFitWidth = new Common.UI.MenuItem({ - caption: this.textFitWidth, - checkable: true, - checked: this.btnFitWidth.isChecked() - }), - this.mnuZoom = new Common.UI.MenuItem({ - template: _.template([ - '' - ].join('')), - stopPropagation: true, - value: this.mnuZoom.options.value - }) - ] - }) - ); - if (this.mode.canBrandingExt && this.mode.customization && this.mode.customization.statusBar === false) - this.mnuitemHideStatusBar.hide(); - - this.mnuZoomOut = new Common.UI.Button({ - el: $('#id-menu-zoom-out'), - cls: 'btn-toolbar' - }); - this.mnuZoomIn = new Common.UI.Button({ - el: $('#id-menu-zoom-in'), - cls: 'btn-toolbar' - }); - this.btnMarkers.setMenu( new Common.UI.Menu({ style: 'min-width: 139px', @@ -1339,9 +1250,6 @@ define([ me.mnuChangeSlidePicker._needRecalcSlideLayout = true; }); - this.mnuitemHideStatusBar.setChecked(Common.localStorage.getBool('pe-hidden-status'), true); - this.mnuitemHideRulers.setChecked(Common.localStorage.getBool("pe-hidden-rulers", true), true); - // // Enable none paragraph components this.lockToolbar(PE.enumLock.disableOnStart, false, {array: this.slideOnlyControls.concat(this.shapeControls)}); @@ -1747,15 +1655,6 @@ define([ mniSlideWide: 'Widescreen (16:9)', mniSlideAdvanced: 'Advanced Settings', tipSlideSize: 'Select Slide Size', - tipViewSettings: 'View Settings', - tipAdvSettings: 'Advanced Settings', - textCompactView: 'Hide Toolbar', - textHideTitleBar: 'Hide Title Bar', - textHideStatusBar: 'Hide Status Bar', - textHideLines: 'Hide Rulers', - textFitPage: 'Fit to Slide', - textFitWidth: 'Fit to Width', - textZoom: 'Zoom', tipInsertChart: 'Insert Chart', textLine: 'Line', textColumn: 'Column', diff --git a/apps/presentationeditor/main/locale/en.json b/apps/presentationeditor/main/locale/en.json index a60255b37..eb8605858 100644 --- a/apps/presentationeditor/main/locale/en.json +++ b/apps/presentationeditor/main/locale/en.json @@ -92,6 +92,12 @@ "Common.Views.Header.tipViewUsers": "View users and manage document access rights", "Common.Views.Header.txtAccessRights": "Change access rights", "Common.Views.Header.txtRename": "Rename", + "Common.Views.Header.textAdvSettings": "Advanced settings", + "Common.Views.Header.textCompactView": "Hide Toolbar", + "Common.Views.Header.textHideStatusBar": "Hide Status Bar", + "Common.Views.Header.textZoom": "Zoom", + "Common.Views.Header.tipViewSettings": "View settings", + "Common.Views.Header.textHideLines": "Hide Rulers", "Common.Views.ImageFromUrlDialog.cancelButtonText": "Cancel", "Common.Views.ImageFromUrlDialog.okButtonText": "OK", "Common.Views.ImageFromUrlDialog.textUrl": "Paste an image URL:", @@ -700,6 +706,8 @@ "PE.Controllers.Toolbar.txtSymbol_vdots": "Vertical ellipsis", "PE.Controllers.Toolbar.txtSymbol_xsi": "Xi", "PE.Controllers.Toolbar.txtSymbol_zeta": "Zeta", + "PE.Controllers.Viewport.textFitPage": "Fit to Slide", + "PE.Controllers.Viewport.textFitWidth": "Fit to Width", "PE.Views.ChartSettings.textAdvanced": "Show advanced settings", "PE.Views.ChartSettings.textArea": "Area", "PE.Views.ChartSettings.textBar": "Bar", @@ -1405,12 +1413,12 @@ "PE.Views.Toolbar.textCancel": "Cancel", "PE.Views.Toolbar.textCharts": "Charts", "PE.Views.Toolbar.textColumn": "Column", - "PE.Views.Toolbar.textCompactView": "Hide Toolbar", - "PE.Views.Toolbar.textFitPage": "Fit to Slide", - "PE.Views.Toolbar.textFitWidth": "Fit to Width", - "PE.Views.Toolbar.textHideLines": "Hide Rulers", - "PE.Views.Toolbar.textHideStatusBar": "Hide Status Bar", - "PE.Views.Toolbar.textHideTitleBar": "Hide Title Bar", + "del_PE.Views.Toolbar.textCompactView": "Hide Toolbar", + "del_PE.Views.Toolbar.textFitPage": "Fit to Slide", + "del_PE.Views.Toolbar.textFitWidth": "Fit to Width", + "del_PE.Views.Toolbar.textHideLines": "Hide Rulers", + "del_PE.Views.Toolbar.textHideStatusBar": "Hide Status Bar", + "del_PE.Views.Toolbar.textHideTitleBar": "Hide Title Bar", "PE.Views.Toolbar.textItalic": "Italic", "PE.Views.Toolbar.textLine": "Line", "PE.Views.Toolbar.textNewColor": "Custom Color", @@ -1439,9 +1447,9 @@ "PE.Views.Toolbar.textTabProtect": "Protection", "PE.Views.Toolbar.textTitleError": "Error", "PE.Views.Toolbar.textUnderline": "Underline", - "PE.Views.Toolbar.textZoom": "Zoom", + "del_PE.Views.Toolbar.textZoom": "Zoom", "PE.Views.Toolbar.tipAddSlide": "Add slide", - "PE.Views.Toolbar.tipAdvSettings": "Advanced settings", + "del_PE.Views.Toolbar.tipAdvSettings": "Advanced settings", "PE.Views.Toolbar.tipBack": "Back", "PE.Views.Toolbar.tipChangeChart": "Change chart type", "PE.Views.Toolbar.tipChangeSlide": "Change slide layout", @@ -1454,7 +1462,7 @@ "PE.Views.Toolbar.tipFontName": "Font", "PE.Views.Toolbar.tipFontSize": "Font size", "PE.Views.Toolbar.tipHAligh": "Horizontal align", - "PE.Views.Toolbar.tipHideBars": "Hide Title bar & Status bar", + "del_PE.Views.Toolbar.tipHideBars": "Hide Title bar & Status bar", "PE.Views.Toolbar.tipIncPrLeft": "Increase indent", "PE.Views.Toolbar.tipInsertChart": "Insert chart", "PE.Views.Toolbar.tipInsertEquation": "Insert equation", diff --git a/apps/spreadsheeteditor/main/app/controller/CellEditor.js b/apps/spreadsheeteditor/main/app/controller/CellEditor.js index ab413d942..7c9c69def 100644 --- a/apps/spreadsheeteditor/main/app/controller/CellEditor.js +++ b/apps/spreadsheeteditor/main/app/controller/CellEditor.js @@ -67,6 +67,13 @@ define([ 'CellEditor': {}, 'Viewport': { 'layout:resizedrag': _.bind(this.onLayoutResize, this) + }, + 'Common.Views.Header': { + 'formulabar:hide': function (state) { + this.editor.setVisible(!state); + Common.localStorage.setBool('sse-hidden-formula', state); + Common.NotificationCenter.trigger('layout:changed', 'celleditor', state?'hidden':'showed'); + }.bind(this) } }); }, diff --git a/apps/spreadsheeteditor/main/app/controller/LeftMenu.js b/apps/spreadsheeteditor/main/app/controller/LeftMenu.js index c472d4f92..c6fa3a093 100644 --- a/apps/spreadsheeteditor/main/app/controller/LeftMenu.js +++ b/apps/spreadsheeteditor/main/app/controller/LeftMenu.js @@ -55,6 +55,7 @@ define([ 'hide': _.bind(this.onHidePlugins, this) }, 'Common.Views.Header': { + 'file:settings': _.bind(this.clickToolbarSettings,this), 'click:users': _.bind(this.clickStatusbarUsers, this) }, 'LeftMenu': { diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js index 7e6a09000..59beebf6a 100644 --- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js @@ -80,6 +80,7 @@ define([ 'settings:apply': _.bind(this.applyFormulaSettings, this) }, 'Common.Views.Header': { + 'toolbar:setcompact': this.onChangeViewMode.bind(this), 'print': function (opts) { var _main = this.getApplication().getController('Main'); _main.onPrint(); @@ -305,7 +306,6 @@ define([ toolbar.btnDecDecimal.on('click', _.bind(this.onDecrement, this)); toolbar.btnIncDecimal.on('click', _.bind(this.onIncrement, this)); toolbar.btnInsertFormula.on('click', _.bind(this.onInsertFormulaMenu, this)); - toolbar.btnSettings.on('click', _.bind(this.onAdvSettingsClick, this)); toolbar.btnInsertFormula.menu.on('item:click', _.bind(this.onInsertFormulaMenu, this)); toolbar.btnNamedRange.menu.on('item:click', _.bind(this.onNamedRangeMenu, this)); toolbar.btnNamedRange.menu.on('show:after', _.bind(this.onNamedRangeMenuOpen, this)); @@ -326,16 +326,12 @@ define([ toolbar.cmbFontSize.on('hide:after', _.bind(this.onHideMenus, this)); toolbar.cmbFontSize.on('combo:blur', _.bind(this.onComboBlur, this)); toolbar.cmbFontSize.on('combo:focusin', _.bind(this.onComboOpen, this, false)); - if (toolbar.mnuZoomIn) toolbar.mnuZoomIn.on('click', _.bind(this.onZoomInClick, this)); - if (toolbar.mnuZoomOut) toolbar.mnuZoomOut.on('click', _.bind(this.onZoomOutClick, this)); - if (toolbar.btnShowMode.rendered) toolbar.btnShowMode.menu.on('item:click', _.bind(this.onHideMenu, this)); toolbar.listStyles.on('click', _.bind(this.onListStyleSelect, this)); toolbar.cmbNumberFormat.on('selected', _.bind(this.onNumberFormatSelect, this)); toolbar.cmbNumberFormat.on('show:before', _.bind(this.onNumberFormatOpenBefore, this, true)); if (toolbar.cmbNumberFormat.cmpEl) toolbar.cmbNumberFormat.cmpEl.on('click', '#id-toolbar-mnu-item-more-formats a', _.bind(this.onNumberFormatSelect, this)); toolbar.btnCurrencyStyle.menu.on('item:click', _.bind(this.onNumberFormatMenu, this)); - if (toolbar.mnuitemCompactToolbar) toolbar.mnuitemCompactToolbar.on('toggle', _.bind(this.onChangeViewMode, this)); $('#id-toolbar-menu-new-fontcolor').on('click', _.bind(this.onNewTextColor, this)); $('#id-toolbar-menu-new-paracolor').on('click', _.bind(this.onNewBackColor, this)); $('#id-toolbar-menu-new-bordercolor').on('click', _.bind(this.onNewBorderColor, this)); @@ -1361,53 +1357,6 @@ define([ } }, - onAdvSettingsClick: function(btn, e) { - this.toolbar.fireEvent('file:settings', this); - btn.cmpEl.blur(); - }, - - onZoomInClick: function(btn) { - if (this.api) { - var f = Math.floor(this.api.asc_getZoom() * 10)/10; - f += .1; - if (f > 0 && !(f > 2.)) { - this.api.asc_setZoom(f); - } - } - - Common.NotificationCenter.trigger('edit:complete', this.toolbar); - }, - - onZoomOutClick: function(btn) { - if (this.api) { - var f = Math.ceil(this.api.asc_getZoom() * 10)/10; - f -= .1; - if (!(f < .5)) { - this.api.asc_setZoom(f); - } - } - - Common.NotificationCenter.trigger('edit:complete', this.toolbar); - }, - - onHideMenu: function(menu, item) { - var params = {}, - option; - - switch(item.value) { - case 'title': params.title = item.checked; option = 'sse-hidden-title'; break; - case 'formula': params.formula = item.checked; option = 'sse-hidden-formula'; break; - case 'headings': params.headings = item.checked; break; - case 'gridlines': params.gridlines = item.checked; break; - case 'freezepanes': params.freezepanes = item.checked; break; - } - - this.hideElements(params); - option && Common.localStorage.setBool(option, item.checked); - - Common.NotificationCenter.trigger('edit:complete', this.toolbar); - }, - onListStyleSelect: function(combo, record) { this._state.prstyle = undefined; if (this.api) { @@ -1513,7 +1462,6 @@ define([ if ( from != 'file' ) { Common.Utils.asyncCall(function () { this.onChangeViewMode(null, !this.toolbar.isCompact()); - this.toolbar.mnuitemCompactToolbar.setChecked(this.toolbar.isCompact(), true); }, this); } }, @@ -1711,26 +1659,9 @@ define([ this.checkInsertAutoshape({action:'cancel'}); }, - onApiZoomChange: function(zf, type){ - switch (type) { - case 1: // FitWidth - case 2: // FitPage - case 0: - default: { - this.toolbar.mnuZoom.options.value = Math.floor((zf + .005) * 100); - $('.menu-zoom .zoom', this.toolbar.el).html(Math.floor((zf + .005) * 100) + '%'); - } - } - }, + onApiZoomChange: function(zf, type){}, - onApiSheetChanged: function() { - if ( this.api && !this.appConfig.isEditDiagram && !this.appConfig.isEditMailMerge ) { - var params = this.api.asc_getSheetViewSettings(); - this.toolbar.mnuitemHideHeadings.setChecked(!params.asc_getShowRowColHeaders()); - this.toolbar.mnuitemHideGridlines.setChecked(!params.asc_getShowGridLines()); - this.toolbar.mnuitemFreezePanes.setChecked(params.asc_getIsFreezePane()); - } - }, + onApiSheetChanged: function() {}, onApiEditorSelectionChanged: function(fontobj) { if (!this.editMode) return; @@ -2411,13 +2342,6 @@ define([ }, hideElements: function(opts) { - if (!_.isUndefined(opts.title)) { - var headerView = this.getApplication().getController('Viewport').getView('Common.Views.Header'); - headerView && headerView.setVisible(!opts.title); - - Common.NotificationCenter.trigger('layout:changed', 'header'); - } - if (!_.isUndefined(opts.compact)) { this.onChangeViewMode(opts.compact); } @@ -2981,7 +2905,7 @@ define([ var toolbar = this.toolbar; toolbar.$el.find('.toolbar').toggleClass('masked', disable); - this.toolbar.lockToolbar(SSE.enumLock.menuFileOpen, disable, {array: [toolbar.btnShowMode]}); + this.toolbar.lockToolbar(SSE.enumLock.menuFileOpen, disable); if(disable) { mask = $("
        ").appendTo(toolbar.$el.find('.toolbar')); Common.util.Shortcuts.suspendEvents('command+l, ctrl+l, command+shift+l, ctrl+shift+l, command+k, ctrl+k, command+alt+h, ctrl+alt+h, command+1, ctrl+1'); diff --git a/apps/spreadsheeteditor/main/app/controller/Viewport.js b/apps/spreadsheeteditor/main/app/controller/Viewport.js index a88a191c1..ce517338f 100644 --- a/apps/spreadsheeteditor/main/app/controller/Viewport.js +++ b/apps/spreadsheeteditor/main/app/controller/Viewport.js @@ -71,6 +71,9 @@ define([ 'menu:hide': me.onFileMenu.bind(me, 'hide'), 'menu:show': me.onFileMenu.bind(me, 'show') }, + 'Statusbar': { + 'sheet:changed': me.onApiSheetChanged.bind(me) + }, 'Toolbar': { 'render:before' : function (toolbar) { var config = SSE.getController('Main').appOptions; @@ -83,6 +86,7 @@ define([ }, 'view:compact' : function (toolbar, state) { + me.header.mnuitemCompactToolbar.setChecked(state, true); me.viewport.vlayout.getItem('toolbar').height = state ? Common.Utils.InternalSettings.get('toolbar-height-compact') : Common.Utils.InternalSettings.get('toolbar-height-normal'); }, @@ -108,10 +112,16 @@ define([ }); Common.NotificationCenter.on('app:face', this.onAppShowed.bind(this)); + Common.NotificationCenter.on('app:ready', this.onAppReady.bind(this)); + Common.NotificationCenter.on('cells:range', this.onCellsRange.bind(this)); }, setApi: function(api) { this.api = api; + this.api.asc_registerCallback('asc_onZoomChanged', this.onApiZoomChange.bind(this)); + this.api.asc_registerCallback('asc_onSheetsChanged', this.onApiSheetChanged.bind(this)); + this.api.asc_registerCallback('asc_onUpdateSheetViewSettings', this.onApiSheetChanged.bind(this)); + this.api.asc_registerCallback('asc_onEditCell', this.onApiEditCell.bind(this)); }, onAppShowed: function (config) { @@ -149,6 +159,123 @@ define([ } }, + onAppReady: function (config) { + var me = this; + if ( me.header.btnOptions ) { + var compactview = !config.isEdit; + if ( config.isEdit && !config.isEditDiagram && !config.isEditMailMerge ) { + if ( Common.localStorage.itemExists("sse-compact-toolbar") ) { + compactview = Common.localStorage.getBool("sse-compact-toolbar"); + } else + if ( config.customization && config.customization.compactToolbar ) + compactview = true; + } + + me.header.mnuitemCompactToolbar = new Common.UI.MenuItem({ + caption : me.header.textCompactView, + checked : compactview, + checkable : true, + value : 'toolbar' + }); + + var mnuitemHideFormulaBar = new Common.UI.MenuItem({ + caption : me.textHideFBar, + checked : Common.localStorage.getBool('sse-hidden-formula'), + checkable : true, + value : 'formula' + }); + + me.header.mnuitemHideHeadings = new Common.UI.MenuItem({ + caption : me.textHideHeadings, + checkable : true, + checked : me.header.mnuitemHideHeadings.isChecked(), + value : 'headings' + }); + + me.header.mnuitemHideGridlines = new Common.UI.MenuItem({ + caption : me.textHideGridlines, + checkable : true, + checked : me.header.mnuitemHideGridlines.isChecked(), + value : 'gridlines' + }); + + me.header.mnuitemFreezePanes = new Common.UI.MenuItem({ + caption : me.textFreezePanes, + checkable : true, + checked : me.header.mnuitemFreezePanes.isChecked(), + value : 'freezepanes' + }); + + me.header.mnuZoom = new Common.UI.MenuItem({ + template: _.template([ + '' + ].join('')), + stopPropagation: true, + value: me.header.mnuZoom.options.value + }); + + var mnuitemAdvSettings = new Common.UI.MenuItem({ + caption: me.header.textAdvSettings, + value: 'advanced' + }); + + me.header.btnOptions.setMenu(new Common.UI.Menu({ + cls: 'pull-right', + style: 'min-width: 180px;', + items: [ + me.header.mnuitemCompactToolbar, + mnuitemHideFormulaBar, + {caption:'--'}, + me.header.mnuitemHideHeadings, + me.header.mnuitemHideGridlines, + {caption:'--'}, + me.header.mnuitemFreezePanes, + {caption:'--'}, + me.header.mnuZoom, + {caption:'--'}, + mnuitemAdvSettings + ] + }) + ); + + var _on_btn_zoom = function (btn) { + if ( btn == 'up' ) { + var _f = Math.floor(this.api.asc_getZoom() * 10)/10; + _f += .1; + if (_f > 0 && !(_f > 2.)) + this.api.asc_setZoom(_f); + } else { + _f = Math.ceil(this.api.asc_getZoom() * 10)/10; + _f -= .1; + if (!(_f < .5)) + this.api.asc_setZoom(_f); + } + + Common.NotificationCenter.trigger('edit:complete', me.header); + }; + + (new Common.UI.Button({ + el : $('#hdr-menu-zoom-out', me.header.mnuZoom.$el), + cls : 'btn-toolbar' + })).on('click', _on_btn_zoom.bind(me, 'down')); + + (new Common.UI.Button({ + el : $('#hdr-menu-zoom-in', me.header.mnuZoom.$el), + cls : 'btn-toolbar' + })).on('click', _on_btn_zoom.bind(me, 'up')); + + me.header.btnOptions.menu.on('item:click', me.onOptionsItemClick.bind(this)); + } + }, + // When our application is ready, lets get started onLaunch: function() { // Create and render main view @@ -176,6 +303,10 @@ define([ this.boxFormula = $('#cell-editing-box'); this.boxSdk.css('border-left', 'none'); this.boxFormula.css('border-left', 'none'); + + this.header.mnuitemHideHeadings = this.header.fakeMenuItem(); + this.header.mnuitemHideGridlines = this.header.fakeMenuItem(); + this.header.mnuitemFreezePanes = this.header.fakeMenuItem(); }, onLayoutChanged: function(area) { @@ -228,6 +359,58 @@ define([ me.header.lockHeaderBtns( 'undo', _need_disable ); me.header.lockHeaderBtns( 'redo', _need_disable ); - } - }); + me.header.lockHeaderBtns( 'opts', _need_disable ); + }, + + onApiZoomChange: function(zf, type){ + switch (type) { + case 1: // FitWidth + case 2: // FitPage + case 0: + default: { + this.header.mnuZoom.options.value = Math.floor((zf + .005) * 100); + $('.menu-zoom .zoom', this.header.mnuZoom.$el).html(Math.floor((zf + .005) * 100) + '%'); + } + } + }, + + onApiSheetChanged: function() { + var me = this; + var appConfig = me.viewport.mode; + if ( !!appConfig && !appConfig.isEditDiagram && !appConfig.isEditMailMerge ) { + var params = me.api.asc_getSheetViewSettings(); + me.header.mnuitemHideHeadings.setChecked(!params.asc_getShowRowColHeaders()); + me.header.mnuitemHideGridlines.setChecked(!params.asc_getShowGridLines()); + me.header.mnuitemFreezePanes.setChecked(params.asc_getIsFreezePane()); + } + }, + + onApiEditCell: function(state) { + if ( state == Asc.c_oAscCellEditorState.editStart ) + this.header.lockHeaderBtns('opts', true); else + if ( state == Asc.c_oAscCellEditorState.editEnd ) + this.header.lockHeaderBtns('opts', false); + }, + + onCellsRange: function(status) { + this.onApiEditCell(status != Asc.c_oAscSelectionDialogType.None ? Asc.c_oAscCellEditorState.editStart : Asc.c_oAscCellEditorState.editEnd); + }, + + onOptionsItemClick: function (menu, item, e) { + var me = this; + + switch ( item.value ) { + case 'toolbar': me.header.fireEvent('toolbar:setcompact', [menu, item.isChecked()]); break; + case 'formula': me.header.fireEvent('formulabar:hide', [item.isChecked()]); break; + case 'headings': me.api.asc_setDisplayHeadings(!item.isChecked()); break; + case 'gridlines': me.api.asc_setDisplayGridlines(!item.isChecked()); break; + case 'freezepanes': me.api.asc_freezePane(); break; + case 'advanced': me.header.fireEvent('file:settings', me.header); break; + } + }, + + textHideFBar: 'Hide Formula Bar', + textHideHeadings: 'Hide Headings', + textHideGridlines: 'Hide Gridlines', + textFreezePanes: 'Freeze Panes' }); diff --git a/apps/spreadsheeteditor/main/app/template/Toolbar.template b/apps/spreadsheeteditor/main/app/template/Toolbar.template index 6fc9e087c..5bb2ae135 100644 --- a/apps/spreadsheeteditor/main/app/template/Toolbar.template +++ b/apps/spreadsheeteditor/main/app/template/Toolbar.template @@ -131,16 +131,7 @@
        -
        -
        -
        -
        - -
        -
        - -
        -
        +
        diff --git a/apps/spreadsheeteditor/main/app/view/Toolbar.js b/apps/spreadsheeteditor/main/app/view/Toolbar.js index ed56ec308..23f6cd580 100644 --- a/apps/spreadsheeteditor/main/app/view/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/view/Toolbar.js @@ -1048,41 +1048,6 @@ define([ }) }); - me.mnuZoomIn = dummyCmp(); - me.mnuZoomOut = dummyCmp(); - - var clone = function(source) { - var obj = {}; - for (var prop in source) - obj[prop] = (typeof(source[prop])=='object') ? clone(source[prop]) : source[prop]; - return obj; - }; - - this.mnuitemHideHeadings = { - conf: {checked:false}, - setChecked: function(val) { this.conf.checked = val;}, - isChecked: function () { return this.conf.checked; } - }; - this.mnuitemHideGridlines = clone(this.mnuitemHideHeadings); - this.mnuitemFreezePanes = clone(this.mnuitemHideHeadings); - this.mnuZoom = { - options: {value: 100} - }; - - me.btnShowMode = new Common.UI.Button({ - id : 'id-toolbar-btn-showmode', - cls : 'btn-toolbar', - iconCls : 'btn-showmode no-mask', - lock : [_set.menuFileOpen, _set.editCell], - menu : true - }); - - me.btnSettings = new Common.UI.Button({ - id : 'id-toolbar-btn-settings', - cls : 'btn-toolbar', - iconCls : 'btn-settings no-mask' - }); - // Is unique for the short view me.btnHorizontalAlign = new Common.UI.Button({ @@ -1235,7 +1200,7 @@ define([ me.btnTableTemplate, me.btnPercentStyle, me.btnCurrencyStyle, me.btnDecDecimal, me.btnAddCell, me.btnDeleteCell, me.cmbNumberFormat, me.btnBorders, me.btnInsertImage, me.btnInsertHyperlink, me.btnInsertChart, me.btnColorSchemas, - me.btnAutofilter, me.btnCopy, me.btnPaste, me.btnSettings, me.listStyles, me.btnPrint, me.btnShowMode, + me.btnAutofilter, me.btnCopy, me.btnPaste, me.listStyles, me.btnPrint, me.btnSave, me.btnClearStyle, me.btnCopyStyle ]; @@ -1244,8 +1209,8 @@ define([ me.btnInsertImage, me.btnInsertText, me.btnInsertTextArt, me.btnInsertShape, me.btnInsertEquation, me.btnIncFontSize, me.btnDecFontSize, me.btnBold, me.btnItalic, me.btnUnderline, me.btnStrikeout, me.btnSubscript, me.btnTextColor, me.btnBackColor, me.btnInsertHyperlink, me.btnBorders, me.btnTextOrient, me.btnPercentStyle, me.btnCurrencyStyle, me.btnColorSchemas, - me.btnSettings, me.btnInsertFormula, me.btnNamedRange, me.btnDecDecimal, me.btnIncDecimal, me.cmbNumberFormat, me.btnWrap, - me.btnInsertChart, me.btnMerge, me.btnAddCell, me.btnDeleteCell, me.btnShowMode, me.btnPrint, + me.btnInsertFormula, me.btnNamedRange, me.btnDecDecimal, me.btnIncDecimal, me.cmbNumberFormat, me.btnWrap, + me.btnInsertChart, me.btnMerge, me.btnAddCell, me.btnDeleteCell, me.btnPrint, me.btnAutofilter, me.btnSortUp, me.btnSortDown, me.btnTableTemplate, me.btnSetAutofilter, me.btnClearAutofilter, me.btnSave, me.btnClearStyle, me.btnCopyStyle, me.btnCopy, me.btnPaste]; @@ -1294,9 +1259,9 @@ define([ } }); + me.setTab('home'); if ( me.isCompactView ) - me.setFolded(true); else - me.setTab('home'); + me.setFolded(true); return this; }, @@ -1379,8 +1344,6 @@ define([ _injectComponent('#slot-btn-cell-ins', this.btnAddCell); _injectComponent('#slot-btn-cell-del', this.btnDeleteCell); _injectComponent('#slot-btn-colorschemas', this.btnColorSchemas); - _injectComponent('#slot-btn-hidebars', this.btnShowMode); - _injectComponent('#slot-btn-settings', this.btnSettings); _injectComponent('#slot-btn-search', this.btnSearch); _injectComponent('#slot-btn-inschart', this.btnInsertChart); _injectComponent('#slot-field-styles', this.listStyles); @@ -1450,77 +1413,11 @@ define([ _updateHint(this.btnAddCell, this.tipInsertOpt); _updateHint(this.btnDeleteCell, this.tipDeleteOpt); _updateHint(this.btnColorSchemas, this.tipColorSchemas); - _updateHint(this.btnShowMode, this.tipViewSettings); - _updateHint(this.btnSettings, this.tipAdvSettings); _updateHint(this.btnHorizontalAlign, this.tipHAligh); _updateHint(this.btnVerticalAlign, this.tipVAligh); _updateHint(this.btnAutofilter, this.tipAutofilter); // set menus - if ( this.btnShowMode && this.btnShowMode.rendered ) { - this.btnShowMode.setMenu(new Common.UI.Menu({ - items: [ - this.mnuitemCompactToolbar = new Common.UI.MenuItem({ - caption : this.textCompactToolbar, - checkable : true, - checked : this.isCompactView, - value : 'compact' - }), - this.mnuitemHideFormulaBar = new Common.UI.MenuItem({ - caption : this.textHideFBar, - checkable : true, - checked : Common.localStorage.getBool('sse-hidden-formula'), - value : 'formula' - }), - {caption: '--'}, - this.mnuitemHideHeadings = new Common.UI.MenuItem({ - caption : this.textHideHeadings, - checkable : true, - checked : this.mnuitemHideHeadings.isChecked(), - value : 'headings' - }), - this.mnuitemHideGridlines = new Common.UI.MenuItem({ - caption : this.textHideGridlines, - checkable : true, - checked : this.mnuitemHideGridlines.isChecked(), - value : 'gridlines' - }), - {caption: '--'}, - this.mnuitemFreezePanes = new Common.UI.MenuItem({ - caption : this.textFreezePanes, - checkable : true, - checked : this.mnuitemFreezePanes.isChecked(), - value : 'freezepanes' - }), - {caption: '--'}, - this.mnuZoom = new Common.UI.MenuItem({ - template: _.template([ - '' - ].join('')), - stopPropagation: true, - value: this.mnuZoom.options.value - }) - ] - })); - - this.mnuZoomOut = new Common.UI.Button({ - el : $('#id-menu-zoom-out'), - cls : 'btn-toolbar' - }); - this.mnuZoomIn = new Common.UI.Button({ - el : $('#id-menu-zoom-in'), - cls : 'btn-toolbar' - }); - } - if (this.btnBorders && this.btnBorders.rendered) { this.btnBorders.setMenu( new Common.UI.Menu({ items: [ @@ -1991,8 +1888,6 @@ define([ tipDigStylePercent: 'Percent Style', // tipDigStyleCurrency:'Currency Style', tipDigStyleAccounting: 'Accounting Style', - tipViewSettings: 'View Settings', - tipAdvSettings: 'Advanced Settings', tipTextOrientation: 'Orientation', tipInsertOpt: 'Insert Cells', tipDeleteOpt: 'Delete Cells', @@ -2035,12 +1930,6 @@ define([ textDelLeft: 'Shift Cells Left', textDelUp: 'Shift Cells Up', textZoom: 'Zoom', - textCompactToolbar: 'Hide Toolbar', - textHideTBar: 'Hide Title Bar', - textHideFBar: 'Hide Formula Bar', - textHideHeadings: 'Hide Headings', - textHideGridlines: 'Hide Gridlines', - textFreezePanes: 'Freeze Panes', txtScheme1: 'Office', txtScheme2: 'Grayscale', txtScheme3: 'Apex', diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json index 5835da0a8..dfdd89c35 100644 --- a/apps/spreadsheeteditor/main/locale/en.json +++ b/apps/spreadsheeteditor/main/locale/en.json @@ -86,6 +86,12 @@ "Common.Views.Header.tipViewUsers": "View users and manage document access rights", "Common.Views.Header.txtAccessRights": "Change access rights", "Common.Views.Header.txtRename": "Rename", + "Common.Views.Header.textAdvSettings": "Advanced settings", + "Common.Views.Header.textCompactView": "Hide Toolbar", + "Common.Views.Header.textHideStatusBar": "Hide Status Bar", + "Common.Views.Header.textZoom": "Zoom", + "Common.Views.Header.tipViewSettings": "View settings", + "Common.Views.Header.textHideLines": "Hide Rulers", "Common.Views.ImageFromUrlDialog.cancelButtonText": "Cancel", "Common.Views.ImageFromUrlDialog.okButtonText": "OK", "Common.Views.ImageFromUrlDialog.textUrl": "Paste an image URL:", @@ -835,6 +841,10 @@ "SSE.Controllers.Toolbar.txtSymbol_zeta": "Zeta", "SSE.Controllers.Toolbar.warnLongOperation": "The operation you are about to perform might take rather much time to complete.
        Are you sure you want to continue?", "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.Viewport.textHideFBar": "Hide Formula Bar", + "SSE.Controllers.Viewport.textHideGridlines": "Hide Gridlines", + "SSE.Controllers.Viewport.textHideHeadings": "Hide Headings", + "SSE.Controllers.Viewport.textFreezePanes": "Freeze Panes", "SSE.Views.AutoFilterDialog.btnCustomFilter": "Custom Filter", "SSE.Views.AutoFilterDialog.cancelButtonText": "Cancel", "SSE.Views.AutoFilterDialog.okButtonText": "OK", @@ -1790,7 +1800,7 @@ "SSE.Views.Toolbar.textClockwise": "Angle Clockwise", "SSE.Views.Toolbar.textColumn": "Column", "SSE.Views.Toolbar.textColumnSpark": "Column", - "SSE.Views.Toolbar.textCompactToolbar": "Hide Toolbar", + "del_SSE.Views.Toolbar.textCompactToolbar": "Hide Toolbar", "SSE.Views.Toolbar.textCounterCw": "Angle Counterclockwise", "SSE.Views.Toolbar.textDelLeft": "Shift Cells Left", "SSE.Views.Toolbar.textDelUp": "Shift Cells Up", @@ -1798,11 +1808,11 @@ "SSE.Views.Toolbar.textDiagUpBorder": "Diagonal Up Border", "SSE.Views.Toolbar.textEntireCol": "Entire Column", "SSE.Views.Toolbar.textEntireRow": "Entire Row", - "SSE.Views.Toolbar.textFreezePanes": "Freeze Panes", - "SSE.Views.Toolbar.textHideFBar": "Hide Formula Bar", - "SSE.Views.Toolbar.textHideGridlines": "Hide Gridlines", - "SSE.Views.Toolbar.textHideHeadings": "Hide Headings", - "SSE.Views.Toolbar.textHideTBar": "Hide Title Bar", + "del_SSE.Views.Toolbar.textFreezePanes": "Freeze Panes", + "del_SSE.Views.Toolbar.textHideFBar": "Hide Formula Bar", + "del_SSE.Views.Toolbar.textHideGridlines": "Hide Gridlines", + "del_SSE.Views.Toolbar.textHideHeadings": "Hide Headings", + "del_SSE.Views.Toolbar.textHideTBar": "Hide Title Bar", "SSE.Views.Toolbar.textHorizontal": "Horizontal Text", "SSE.Views.Toolbar.textInsDown": "Shift Cells Down", "SSE.Views.Toolbar.textInsideBorders": "Inside Borders", @@ -1839,7 +1849,7 @@ "SSE.Views.Toolbar.textUnderline": "Underline", "SSE.Views.Toolbar.textWinLossSpark": "Win/Loss", "SSE.Views.Toolbar.textZoom": "Zoom", - "SSE.Views.Toolbar.tipAdvSettings": "Advanced settings", + "del_SSE.Views.Toolbar.tipAdvSettings": "Advanced settings", "SSE.Views.Toolbar.tipAlignBottom": "Align bottom", "SSE.Views.Toolbar.tipAlignCenter": "Align center", "SSE.Views.Toolbar.tipAlignJust": "Justified", @@ -1890,7 +1900,7 @@ "SSE.Views.Toolbar.tipTextOrientation": "Orientation", "SSE.Views.Toolbar.tipUndo": "Undo", "SSE.Views.Toolbar.tipVAligh": "Vertical Alignment", - "SSE.Views.Toolbar.tipViewSettings": "View settings", + "del_SSE.Views.Toolbar.tipViewSettings": "View settings", "SSE.Views.Toolbar.tipWrap": "Wrap text", "SSE.Views.Toolbar.txtAccounting": "Accounting", "SSE.Views.Toolbar.txtAdditional": "Additional", From 456f4dcc2d8a3b73cc98a5f25c96ce0547e6ab80 Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Wed, 21 Mar 2018 14:28:52 +0300 Subject: [PATCH 46/73] refactoring --- apps/common/main/lib/component/DataView.js | 7 ++++--- apps/spreadsheeteditor/main/app/controller/Main.js | 5 +---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/apps/common/main/lib/component/DataView.js b/apps/common/main/lib/component/DataView.js index 64c0533c0..f57da14cf 100644 --- a/apps/common/main/lib/component/DataView.js +++ b/apps/common/main/lib/component/DataView.js @@ -140,9 +140,10 @@ define([ el.html(this.template(this.model.toJSON())); el.addClass('item'); el.toggleClass('selected', this.model.get('selected') && this.model.get('allowSelected')); - el.off('click').on('click', _.bind(this.onClick, this)); - el.off('dblclick').on('dblclick', _.bind(this.onDblClick, this)); - el.off('contextmenu').on('contextmenu', _.bind(this.onContextMenu, this)); + el.off('click dblclick contextmenu'); + el.on({ 'click': _.bind(this.onClick, this), + 'dblclick': _.bind(this.onDblClick, this), + 'contextmenu': _.bind(this.onContextMenu, this) }); el.toggleClass('disabled', !!this.model.get('disabled')); if (!_.isUndefined(this.model.get('cls'))) diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index b85ff59f2..3134f6892 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -909,15 +909,12 @@ define([ applyModeCommonElements: function() { window.editor_elements_prepared = true; - var value = Common.localStorage.getItem("sse-hidden-title"); - value = this.appOptions.isEdit && (value!==null && parseInt(value) == 1); - var app = this.getApplication(), viewport = app.getController('Viewport').getView('Viewport'), statusbarView = app.getController('Statusbar').getView('Statusbar'); if (this.headerView) { - this.headerView.setVisible(!this.appOptions.nativeApp && !value && !this.appOptions.isEditMailMerge && + this.headerView.setVisible(!this.appOptions.nativeApp && !this.appOptions.isEditMailMerge && !this.appOptions.isDesktopApp && !this.appOptions.isEditDiagram); } From ff8f958d0b6f777e4dab99912a79c811ef36397a Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Wed, 21 Mar 2018 14:29:43 +0300 Subject: [PATCH 47/73] [ALL] applied translation for Viewport controller --- apps/documenteditor/main/app/controller/Viewport.js | 3 ++- apps/presentationeditor/main/app/controller/Viewport.js | 3 ++- apps/spreadsheeteditor/main/app/controller/Viewport.js | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Viewport.js b/apps/documenteditor/main/app/controller/Viewport.js index 0c889b7c0..43b07abda 100644 --- a/apps/documenteditor/main/app/controller/Viewport.js +++ b/apps/documenteditor/main/app/controller/Viewport.js @@ -49,7 +49,7 @@ define([ ], function (Viewport) { 'use strict'; - DE.Controllers.Viewport = Backbone.Controller.extend({ + DE.Controllers.Viewport = Backbone.Controller.extend(_.assign({ // Specifying a Viewport model models: [], @@ -366,4 +366,5 @@ define([ textFitPage: 'Fit to Page', textFitWidth: 'Fit to Width' + }, DE.Controllers.Viewport)); }); diff --git a/apps/presentationeditor/main/app/controller/Viewport.js b/apps/presentationeditor/main/app/controller/Viewport.js index 6ae3dbbe9..053110bc2 100644 --- a/apps/presentationeditor/main/app/controller/Viewport.js +++ b/apps/presentationeditor/main/app/controller/Viewport.js @@ -49,7 +49,7 @@ define([ ], function (Viewport) { 'use strict'; - PE.Controllers.Viewport = Backbone.Controller.extend({ + PE.Controllers.Viewport = Backbone.Controller.extend(_.assign({ // Specifying a Viewport model models: [], @@ -403,4 +403,5 @@ define([ textFitPage: 'Fit to Page', textFitWidth: 'Fit to Width' + }, PE.Controllers.Viewport)); }); diff --git a/apps/spreadsheeteditor/main/app/controller/Viewport.js b/apps/spreadsheeteditor/main/app/controller/Viewport.js index ce517338f..fc3a06846 100644 --- a/apps/spreadsheeteditor/main/app/controller/Viewport.js +++ b/apps/spreadsheeteditor/main/app/controller/Viewport.js @@ -48,7 +48,7 @@ define([ ], function (Viewport) { 'use strict'; - SSE.Controllers.Viewport = Backbone.Controller.extend({ + SSE.Controllers.Viewport = Backbone.Controller.extend(_.assign({ // Specifying a Viewport model models: [], @@ -413,4 +413,5 @@ define([ textHideHeadings: 'Hide Headings', textHideGridlines: 'Hide Gridlines', textFreezePanes: 'Freeze Panes' + }, SSE.Controllers.Viewport)); }); From 4bc206543c0385797f479dbb986c0b561159951f Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Tue, 27 Mar 2018 13:39:29 +0300 Subject: [PATCH 48/73] [SSE] fix bug 36623 --- apps/spreadsheeteditor/main/app/controller/Viewport.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/spreadsheeteditor/main/app/controller/Viewport.js b/apps/spreadsheeteditor/main/app/controller/Viewport.js index fc3a06846..aacac3680 100644 --- a/apps/spreadsheeteditor/main/app/controller/Viewport.js +++ b/apps/spreadsheeteditor/main/app/controller/Viewport.js @@ -142,7 +142,7 @@ define([ me.viewport.vlayout.getItem('toolbar').height = 41; } - if ( config.isDesktopApp && config.isEdit ) { + if ( config.isDesktopApp && config.isEdit && !config.isEditDiagram && !config.isEditMailMerge ) { var $title = me.viewport.vlayout.getItem('title').el; $title.html(me.header.getPanel('title', config)).show(); From 0808629f4a41b7983ec79434d8047762ea58ae5b Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 27 Mar 2018 15:21:15 +0300 Subject: [PATCH 49/73] [DE] Load and sort bookmarks. --- .../main/app/controller/Links.js | 5 ++- .../main/app/view/BookmarksDialog.js | 45 +++++++++++++++++-- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Links.js b/apps/documenteditor/main/app/controller/Links.js index 148632a4a..cadc512f2 100644 --- a/apps/documenteditor/main/app/controller/Links.js +++ b/apps/documenteditor/main/app/controller/Links.js @@ -316,12 +316,13 @@ define([ onBookmarksClick: function(btn) { var me = this; (new DE.Views.BookmarksDialog({ + api: me.api, + props: me.api.asc_GetBookmarksManager(), handler: function (result, settings) { if (settings) { } Common.NotificationCenter.trigger('edit:complete', me.toolbar); - }, - props: {} + } })).show(); }, diff --git a/apps/documenteditor/main/app/view/BookmarksDialog.js b/apps/documenteditor/main/app/view/BookmarksDialog.js index d2169905c..3a41364c6 100644 --- a/apps/documenteditor/main/app/view/BookmarksDialog.js +++ b/apps/documenteditor/main/app/view/BookmarksDialog.js @@ -130,21 +130,21 @@ define([ name: 'asc-radio-bookmark-sort', checked: true }); - // this.radioName.on('change', _.bind(this.onRadioNameChange, this)); + this.radioName.on('change', _.bind(this.onRadioSort, this)); this.radioLocation = new Common.UI.RadioBox({ el: $('#bookmarks-radio-location'), labelText: this.textLocation, name: 'asc-radio-bookmark-sort' }); - // this.radioName.on('change', _.bind(this.onRadioNameChange, this)); + this.radioLocation.on('change', _.bind(this.onRadioSort, this)); this.bookmarksList = new Common.UI.ListView({ el: $('#bookmarks-list', this.$window), store: new Common.UI.DataViewStore() }); this.bookmarksList.store.comparator = function(rec) { - return (me.radioName.getValue() ? rec.get("name") : rec.get("location")); + return (me.radioName.getValue() ? rec.get("value") : rec.get("location")); }; // this.bookmarksList.on('item:dblclick', _.bind(this.onDblClickFunction, this)); // this.bookmarksList.on('entervalue', _.bind(this.onPrimary, this)); @@ -158,10 +158,12 @@ define([ this.btnGoto = new Common.UI.Button({ el: $('#bookmarks-btn-goto') }); + this.btnGoto.on('click', _.bind(this.gotoBookmark, this)); this.btnDelete = new Common.UI.Button({ el: $('#bookmarks-btn-delete') }); + this.btnDelete.on('click', _.bind(this.deleteBookmark, this)); this.afterRender(); }, @@ -176,6 +178,19 @@ define([ _setDefaults: function (props) { if (props) { + var store = this.bookmarksList.store, + count = props.get_Count(), + arr = []; + for (var i=0; i0) { + // this.api.gotoBookmark(rec.get('value')); + } + }, + + deleteBookmark: function(btn, eOpts){ + var rec = this.bookmarksList.getSelectedRec(); + if (rec.length>0) { + // this.api.deleteBookmark(rec.get('value')); + var store = this.bookmarksList.store; + var idx = _.indexOf(store.models, rec[0]); + store.remove(rec[0]); + } + }, + + onRadioSort: function(field, newValue, eOpts) { + if (newValue) { + this.bookmarksList.store.sort(); + this.bookmarksList.onResetItems(); + } + }, + textTitle: 'Bookmarks', textLocation: 'Location', textBookmarkName: 'Bookmark name', From 4be5400530553c174d9ca0178d6838dc5197d7bd Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 28 Mar 2018 12:01:24 +0300 Subject: [PATCH 50/73] [DE] Goto, Remove bookmarks --- apps/documenteditor/main/app/view/BookmarksDialog.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/documenteditor/main/app/view/BookmarksDialog.js b/apps/documenteditor/main/app/view/BookmarksDialog.js index 3a41364c6..1f9ce9b0f 100644 --- a/apps/documenteditor/main/app/view/BookmarksDialog.js +++ b/apps/documenteditor/main/app/view/BookmarksDialog.js @@ -179,12 +179,12 @@ define([ _setDefaults: function (props) { if (props) { var store = this.bookmarksList.store, - count = props.get_Count(), + count = props.asc_GetCount(), arr = []; for (var i=0; i0) { - // this.api.gotoBookmark(rec.get('value')); + this.props.asc_GoToBookmark(rec[0].get('value')); } }, deleteBookmark: function(btn, eOpts){ var rec = this.bookmarksList.getSelectedRec(); if (rec.length>0) { - // this.api.deleteBookmark(rec.get('value')); + this.props.asc_RemoveBookmark(rec[0].get('value')); var store = this.bookmarksList.store; var idx = _.indexOf(store.models, rec[0]); store.remove(rec[0]); From 59b6193f2458bd813cc69c71eafb65c0d1c97e9b Mon Sep 17 00:00:00 2001 From: Maxim Kadushkin Date: Wed, 28 Mar 2018 13:37:41 +0300 Subject: [PATCH 51/73] [DE] refactoring --- apps/common/main/lib/view/Header.js | 2 +- apps/documenteditor/main/app/collection/ShapeGroups.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/common/main/lib/view/Header.js b/apps/common/main/lib/view/Header.js index 405e63780..1bf226196 100644 --- a/apps/common/main/lib/view/Header.js +++ b/apps/common/main/lib/view/Header.js @@ -379,7 +379,7 @@ define([ initialize: function (options) { var me = this; - this.options = this.options ? _({}).extend(this.options, options) : options; + this.options = this.options ? _.extend(this.options, options) : options; this.documentCaption = this.options.documentCaption; this.branding = this.options.customization; diff --git a/apps/documenteditor/main/app/collection/ShapeGroups.js b/apps/documenteditor/main/app/collection/ShapeGroups.js index f453d8f93..40ae2e80f 100644 --- a/apps/documenteditor/main/app/collection/ShapeGroups.js +++ b/apps/documenteditor/main/app/collection/ShapeGroups.js @@ -46,6 +46,7 @@ define([ var Common = {}; Common.Collections = Common.Collections || {}; + DE.Collections = DE.Collections || {}; DE.Collections.ShapeGroups = Backbone.Collection.extend({ model: DE.Models.ShapeGroup From ffad293a2e6f98ddd15f2a82f402ab21d527a971 Mon Sep 17 00:00:00 2001 From: Alexander Yuzhin Date: Wed, 28 Mar 2018 15:40:38 +0300 Subject: [PATCH 52/73] [ALL] Fixed build mobile version --- build/Gruntfile.js | 4 +++- build/common.json | 2 +- build/documenteditor.json | 10 +++++++++- build/presentationeditor.json | 10 +++++++++- build/spreadsheeteditor.json | 10 +++++++++- 5 files changed, 31 insertions(+), 5 deletions(-) diff --git a/build/Gruntfile.js b/build/Gruntfile.js index 3cdcd80ec..b2d7c1496 100644 --- a/build/Gruntfile.js +++ b/build/Gruntfile.js @@ -322,7 +322,9 @@ module.exports = function(grunt) { files: packageFile['mobile']['copy']['index-page'] }, 'images-app': { - files: packageFile['mobile']['copy']['images-app'] + files:[] + .concat(packageFile['mobile']['copy']['images-app']) + .concat(packageFile['mobile']['copy']['images-common']) } }, diff --git a/build/common.json b/build/common.json index b835d4ece..67e3bc2ea 100644 --- a/build/common.json +++ b/build/common.json @@ -1,7 +1,7 @@ { "name": "common", "version": "4.3.0", - "build": 32, + "build": 35, "homepage": "http://www.onlyoffice.com", "private": true, "sdk": { diff --git a/build/documenteditor.json b/build/documenteditor.json index a1df0f41a..9d3e536f1 100644 --- a/build/documenteditor.json +++ b/build/documenteditor.json @@ -1,7 +1,7 @@ { "name": "documenteditor", "version": "4.3.0", - "build": 1143, + "build": 1146, "homepage": "http://www.onlyoffice.com", "private": true, "main": { @@ -337,6 +337,14 @@ "src": "**", "dest": "../deploy/web-apps/apps/documenteditor/mobile/resources/img/" } + ], + "images-common": [ + { + "expand": true, + "cwd": "../apps/common/mobile/resources/img/", + "src": "**", + "dest": "../deploy/web-apps/apps/documenteditor/mobile/resources/img/" + } ] } }, diff --git a/build/presentationeditor.json b/build/presentationeditor.json index 124dd93ef..ce9cf3ab6 100644 --- a/build/presentationeditor.json +++ b/build/presentationeditor.json @@ -1,7 +1,7 @@ { "name": "presentationeditor", "version": "4.3.0", - "build": 778, + "build": 780, "homepage": "http://www.onlyoffice.com", "private": true, "main": { @@ -346,6 +346,14 @@ "src": "**", "dest": "../deploy/web-apps/apps/presentationeditor/mobile/resources/img/" } + ], + "images-common": [ + { + "expand": true, + "cwd": "../apps/common/mobile/resources/img/", + "src": "**", + "dest": "../deploy/web-apps/apps/presentationeditor/mobile/resources/img/" + } ] } }, diff --git a/build/spreadsheeteditor.json b/build/spreadsheeteditor.json index e7f64f934..63c60b2b2 100644 --- a/build/spreadsheeteditor.json +++ b/build/spreadsheeteditor.json @@ -1,7 +1,7 @@ { "name": "spreadsheeteditor", "version": "4.3.0", - "build": 881, + "build": 884, "homepage": "http://www.onlyoffice.com", "private": true, "main": { @@ -354,6 +354,14 @@ "src": "**", "dest": "../deploy/web-apps/apps/spreadsheeteditor/mobile/resources/img/" } + ], + "images-common": [ + { + "expand": true, + "cwd": "../apps/common/mobile/resources/img/about", + "src": "**", + "dest": "../deploy/web-apps/apps/spreadsheeteditor/mobile/resources/img/about" + } ] } }, From 685c3073f16b3cd06fd7dbc10195a5c7568a7361 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 28 Mar 2018 15:50:41 +0300 Subject: [PATCH 53/73] [DE] Add hidden bookmarks --- .../main/app/view/BookmarksDialog.js | 93 +++++++++++++------ 1 file changed, 67 insertions(+), 26 deletions(-) diff --git a/apps/documenteditor/main/app/view/BookmarksDialog.js b/apps/documenteditor/main/app/view/BookmarksDialog.js index 1f9ce9b0f..1b8def99e 100644 --- a/apps/documenteditor/main/app/view/BookmarksDialog.js +++ b/apps/documenteditor/main/app/view/BookmarksDialog.js @@ -51,7 +51,7 @@ define([ DE.Views.BookmarksDialog = Common.Views.AdvancedSettingsWindow.extend(_.extend({ options: { contentWidth: 300, - height: 340 + height: 360 }, initialize : function(options) { @@ -88,11 +88,16 @@ define([ '', '', '', - '', + '', '', '', '', '', + '', + '', + '
        ', + '', + '', '', '
        ', '
        ', @@ -120,9 +125,9 @@ define([ validateOnChange: true, validateOnBlur: false, style : 'width: 195px;', - value : '' - }).on ('changing', function (input, value) { - }); + value : '', + maxLength: 40 + }).on('changing', _.bind(this.onNameChanging, this)); this.radioName = new Common.UI.RadioBox({ el: $('#bookmarks-radio-name'), @@ -141,14 +146,15 @@ define([ this.bookmarksList = new Common.UI.ListView({ el: $('#bookmarks-list', this.$window), - store: new Common.UI.DataViewStore() + store: new Common.UI.DataViewStore(), + itemTemplate: _.template('
        <%= value %>
        ') }); this.bookmarksList.store.comparator = function(rec) { return (me.radioName.getValue() ? rec.get("value") : rec.get("location")); }; - // this.bookmarksList.on('item:dblclick', _.bind(this.onDblClickFunction, this)); - // this.bookmarksList.on('entervalue', _.bind(this.onPrimary, this)); - // this.bookmarksList.on('item:select', _.bind(this.onSelectBookmark, this)); + this.bookmarksList.on('item:dblclick', _.bind(this.onDblClickBookmark, this)); + this.bookmarksList.on('entervalue', _.bind(this.onPrimary, this)); + this.bookmarksList.on('item:select', _.bind(this.onSelectBookmark, this)); this.btnAdd = new Common.UI.Button({ el: $('#bookmarks-btn-add') @@ -165,6 +171,12 @@ define([ }); this.btnDelete.on('click', _.bind(this.deleteBookmark, this)); + this.chHidden = new Common.UI.CheckBox({ + el: $('#bookmarks-checkbox-hidden'), + labelText: this.textHidden + }); + this.chHidden.on('change', _.bind(this.onChangeHidden, this)); + this.afterRender(); }, @@ -177,21 +189,8 @@ define([ }, _setDefaults: function (props) { - if (props) { - var store = this.bookmarksList.store, - count = props.asc_GetCount(), - arr = []; - for (var i=0; i0) { @@ -218,6 +244,10 @@ define([ } }, + onDblClickBookmark: function(listView, itemView, record) { + this.props.asc_GoToBookmark(record.get('value')); + }, + deleteBookmark: function(btn, eOpts){ var rec = this.bookmarksList.getSelectedRec(); if (rec.length>0) { @@ -235,6 +265,16 @@ define([ } }, + onChangeHidden: function(field, newValue, oldValue, eOpts){ + this.refreshBookmarks(); + }, + + onNameChanging: function (input, value) { + this.bookmarksList.deselectAll(); + // this.btnGoto.setDisabled(true); + // this.btnDelete.setDisabled(true); + }, + textTitle: 'Bookmarks', textLocation: 'Location', textBookmarkName: 'Bookmark name', @@ -243,7 +283,8 @@ define([ textAdd: 'Add', textGoto: 'Go to', textDelete: 'Delete', - textClose: 'Close' + textClose: 'Close', + textHidden: 'Hidden bookmarks' }, DE.Views.BookmarksDialog || {})) }); \ No newline at end of file From 9f77f3d7920b4df769b00b349793ae6efce95d12 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 28 Mar 2018 17:44:38 +0300 Subject: [PATCH 54/73] [DE] Refactoring bookmarks --- .../main/app/view/BookmarksDialog.js | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/apps/documenteditor/main/app/view/BookmarksDialog.js b/apps/documenteditor/main/app/view/BookmarksDialog.js index 1b8def99e..923177ad6 100644 --- a/apps/documenteditor/main/app/view/BookmarksDialog.js +++ b/apps/documenteditor/main/app/view/BookmarksDialog.js @@ -157,17 +157,20 @@ define([ this.bookmarksList.on('item:select', _.bind(this.onSelectBookmark, this)); this.btnAdd = new Common.UI.Button({ - el: $('#bookmarks-btn-add') + el: $('#bookmarks-btn-add'), + disabled: true }); this.$window.find('#bookmarks-btn-add').on('click', _.bind(this.onDlgBtnClick, this)); this.btnGoto = new Common.UI.Button({ - el: $('#bookmarks-btn-goto') + el: $('#bookmarks-btn-goto'), + disabled: true }); this.btnGoto.on('click', _.bind(this.gotoBookmark, this)); this.btnDelete = new Common.UI.Button({ - el: $('#bookmarks-btn-delete') + el: $('#bookmarks-btn-delete'), + disabled: true }); this.btnDelete.on('click', _.bind(this.deleteBookmark, this)); @@ -215,17 +218,19 @@ define([ if (this.props) { var store = this.bookmarksList.store, count = this.props.asc_GetCount(), + showHidden = this.chHidden.getValue()=='checked', arr = []; for (var i=0; i Date: Thu, 29 Mar 2018 11:53:42 +0300 Subject: [PATCH 55/73] [DE] Bookmarks: save option for hidden bookmarks --- apps/documenteditor/main/app/view/BookmarksDialog.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/apps/documenteditor/main/app/view/BookmarksDialog.js b/apps/documenteditor/main/app/view/BookmarksDialog.js index 923177ad6..8c0f0c2b1 100644 --- a/apps/documenteditor/main/app/view/BookmarksDialog.js +++ b/apps/documenteditor/main/app/view/BookmarksDialog.js @@ -176,7 +176,8 @@ define([ this.chHidden = new Common.UI.CheckBox({ el: $('#bookmarks-checkbox-hidden'), - labelText: this.textHidden + labelText: this.textHidden, + value: Common.Utils.InternalSettings.get("de-bookmarks-hidden") || false }); this.chHidden.on('change', _.bind(this.onChangeHidden, this)); @@ -191,6 +192,11 @@ define([ Common.Views.AdvancedSettingsWindow.prototype.show.apply(this, arguments); }, + close: function() { + Common.Views.AdvancedSettingsWindow.prototype.close.apply(this, arguments); + Common.Utils.InternalSettings.set("de-bookmarks-hidden", this.chHidden.getValue()=='checked'); + }, + _setDefaults: function (props) { this.refreshBookmarks(); this.bookmarksList.scrollToRecord(this.bookmarksList.selectByIndex(0)); @@ -204,7 +210,6 @@ define([ var state = (typeof(event) == 'object') ? event.currentTarget.attributes['result'].value : event; if (state == 'add') { this.props.asc_AddBookmark(this.txtName.getValue()); - // this.handler && this.handler.call(this, state, (state == 'add') ? this.getSettings() : undefined); } this.close(); From d5444d9c4dac1895784b857c6fbb65590921204e Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Thu, 29 Mar 2018 15:22:58 +0300 Subject: [PATCH 56/73] [DE] Add internal hyperlink --- .../main/app/view/HyperlinkSettingsDialog.js | 148 +++++++++++++++--- 1 file changed, 130 insertions(+), 18 deletions(-) diff --git a/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js b/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js index 65440c651..233adfac9 100644 --- a/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js +++ b/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js @@ -78,7 +78,7 @@ define([ '', '
        ', '', '
        ', '', @@ -98,6 +98,7 @@ define([ this.options.tpl = _.template(this.template)(this.options); this.api = this.options.api; this._originalProps = null; + this.linkType = c_oHyperlinkType.WebLink; Common.UI.Window.prototype.initialize.call(this, this.options); }, @@ -153,6 +154,12 @@ define([ maxLength : Asc.c_oAscMaxTooltipLength }); + me.internalList = new Common.UI.TreeView({ + el: $('#id-dlg-hyperlink-list'), + store: new Common.UI.TreeViewStore(), + enableKeyEvents: false + }); + $window.find('.dlg-btn').on('click', _.bind(this.onBtnClick, this)); $window.find('input').on('keypress', _.bind(this.onKeyPress, this)); me.externalPanel = $window.find('#id-external-link'); @@ -162,6 +169,81 @@ define([ ShowHideElem: function(value) { this.externalPanel.toggleClass('hidden', value !== c_oHyperlinkType.WebLink); this.internalPanel.toggleClass('hidden', value !== c_oHyperlinkType.InternalLink); + var store = this.internalList.store; + if (value==c_oHyperlinkType.InternalLink && store.length<1) { + var anchors = this.api.asc_GetHyperlinkAnchors(), + count = anchors.length, + prev_level = 0, + header_level = 0, + arr = []; + arr.push(new Common.UI.TreeViewModel({ + name : this.txtBeginning, + level: 0, + index: 0, + hasParent: false, + isEmptyItem: false, + isNotHeader: true, + hasSubItems: false + })); + arr.push(new Common.UI.TreeViewModel({ + name : this.txtHeadings, + level: 0, + index: 1, + hasParent: false, + isEmptyItem: false, + isNotHeader: false, + hasSubItems: false + })); + + for (var i=0; iprev_level) + arr[arr.length-1].set('hasSubItems', true); + if (level<=header_level) { + header_level = level; + hasParent = false; + } + arr.push(new Common.UI.TreeViewModel({ + name : anchor.asc_GetHeadingText(), + level: level, + index: i+2, + hasParent: hasParent + })); + prev_level = level; + } + } + arr.push(new Common.UI.TreeViewModel({ + name : this.txtBookmarks, + level: 0, + index: arr.length, + hasParent: false, + isEmptyItem: false, + isNotHeader: false, + hasSubItems: false + })); + + prev_level = 0; + for (var i=0; i0) { + props.put_Bookmark(rec[0].get('name')); + if (rec[0].get('index')==0) + props.put_TopOfDocument(); + } + } if (!me.inputDisplay.isDisabled() && ( this.isTextChanged || _.isEmpty(me.inputDisplay.getValue()))) { if (_.isEmpty(me.inputDisplay.getValue())) @@ -245,13 +350,17 @@ define([ _handleInput: function(state) { if (this.options.handler) { if (state == 'ok') { - var checkurl = this.inputUrl.checkValidate(), - checkdisp = this.inputDisplay.checkValidate(); - if (checkurl !== true) { - this.inputUrl.cmpEl.find('input').focus(); - return; + if (this.linkType == c_oHyperlinkType.WebLink) { + if (this.inputUrl.checkValidate() !== true) { + this.inputUrl.cmpEl.find('input').focus(); + return; + } + } else { + var rec = this.internalList.getSelectedRec(); + if (rec.length<1 || rec[0].get('level')==0 && rec[0].get('index')>0) + return; } - if (checkdisp !== true) { + if (this.inputDisplay.checkValidate() !== true) { this.inputDisplay.cmpEl.find('input').focus(); return; } @@ -273,6 +382,9 @@ define([ textDefault: 'Selected text', textTitle: 'Hyperlink Settings', textExternal: 'External Link', - textInternal: 'Place in Document' + textInternal: 'Place in Document', + txtBeginning: 'Beginning of document', + txtHeadings: 'Headings', + txtBookmarks: 'Bookmarks' }, DE.Views.HyperlinkSettingsDialog || {})) }); \ No newline at end of file From 29212eadfe7330fcfd8d6a58a169b92bb2741a8e Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Thu, 29 Mar 2018 15:31:03 +0300 Subject: [PATCH 57/73] [DE] Refactoring hyperlinks --- .../main/app/view/HyperlinkSettingsDialog.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js b/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js index 233adfac9..6f3fc2cf7 100644 --- a/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js +++ b/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js @@ -302,7 +302,8 @@ define([ getSettings: function () { var me = this, - props = new Asc.CHyperlinkProperty(); + props = new Asc.CHyperlinkProperty(), + display = ''; if (this.linkType == c_oHyperlinkType.WebLink) { var url = $.trim(me.inputUrl.getValue()); @@ -313,18 +314,20 @@ define([ url = url.replace(new RegExp("%20",'g')," "); props.put_Value(url); props.put_Bookmark(null); + display = url; } else { var rec = this.internalList.getSelectedRec(); if (rec.length>0) { props.put_Bookmark(rec[0].get('name')); if (rec[0].get('index')==0) props.put_TopOfDocument(); + display = rec[0].get('name'); } } if (!me.inputDisplay.isDisabled() && ( this.isTextChanged || _.isEmpty(me.inputDisplay.getValue()))) { if (_.isEmpty(me.inputDisplay.getValue())) - me.inputDisplay.setValue(url); + me.inputDisplay.setValue(display); props.put_Text(me.inputDisplay.getValue()); } else { props.put_Text(null); From c23422465e60b6cf0fe705b3e2eff102ccd96781 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Thu, 29 Mar 2018 16:02:54 +0300 Subject: [PATCH 58/73] [DE] Hyperlink refactoring --- .../main/app/view/HyperlinkSettingsDialog.js | 152 ++++++++++-------- 1 file changed, 84 insertions(+), 68 deletions(-) diff --git a/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js b/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js index 6f3fc2cf7..ef7595db9 100644 --- a/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js +++ b/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js @@ -157,7 +157,12 @@ define([ me.internalList = new Common.UI.TreeView({ el: $('#id-dlg-hyperlink-list'), store: new Common.UI.TreeViewStore(), - enableKeyEvents: false + enableKeyEvents: true + }); + me.internalList.on('item:select', _.bind(this.onSelectItem, this)); + + me.btnOk = new Common.UI.Button({ + el: $window.find('.primary') }); $window.find('.dlg-btn').on('click', _.bind(this.onBtnClick, this)); @@ -170,79 +175,86 @@ define([ this.externalPanel.toggleClass('hidden', value !== c_oHyperlinkType.WebLink); this.internalPanel.toggleClass('hidden', value !== c_oHyperlinkType.InternalLink); var store = this.internalList.store; - if (value==c_oHyperlinkType.InternalLink && store.length<1) { - var anchors = this.api.asc_GetHyperlinkAnchors(), - count = anchors.length, - prev_level = 0, - header_level = 0, - arr = []; - arr.push(new Common.UI.TreeViewModel({ - name : this.txtBeginning, - level: 0, - index: 0, - hasParent: false, - isEmptyItem: false, - isNotHeader: true, - hasSubItems: false - })); - arr.push(new Common.UI.TreeViewModel({ - name : this.txtHeadings, - level: 0, - index: 1, - hasParent: false, - isEmptyItem: false, - isNotHeader: false, - hasSubItems: false - })); + if (value==c_oHyperlinkType.InternalLink) { + if (store.length<1) { + var anchors = this.api.asc_GetHyperlinkAnchors(), + count = anchors.length, + prev_level = 0, + header_level = 0, + arr = []; + arr.push(new Common.UI.TreeViewModel({ + name : this.txtBeginning, + level: 0, + index: 0, + hasParent: false, + isEmptyItem: false, + isNotHeader: true, + hasSubItems: false + })); + arr.push(new Common.UI.TreeViewModel({ + name : this.txtHeadings, + level: 0, + index: 1, + hasParent: false, + isEmptyItem: false, + isNotHeader: false, + hasSubItems: false + })); - for (var i=0; iprev_level) - arr[arr.length-1].set('hasSubItems', true); - if (level<=header_level) { - header_level = level; - hasParent = false; + for (var i=0; iprev_level) + arr[arr.length-1].set('hasSubItems', true); + if (level<=header_level) { + header_level = level; + hasParent = false; + } + arr.push(new Common.UI.TreeViewModel({ + name : anchor.asc_GetHeadingText(), + level: level, + index: i+2, + hasParent: hasParent + })); + prev_level = level; } - arr.push(new Common.UI.TreeViewModel({ - name : anchor.asc_GetHeadingText(), - level: level, - index: i+2, - hasParent: hasParent - })); - prev_level = level; } - } - arr.push(new Common.UI.TreeViewModel({ - name : this.txtBookmarks, - level: 0, - index: arr.length, - hasParent: false, - isEmptyItem: false, - isNotHeader: false, - hasSubItems: false - })); + arr.push(new Common.UI.TreeViewModel({ + name : this.txtBookmarks, + level: 0, + index: arr.length, + hasParent: false, + isEmptyItem: false, + isNotHeader: false, + hasSubItems: false + })); - prev_level = 0; - for (var i=0; i0); + + } else + this.btnOk.setDisabled(false); + this.linkType = value; }, @@ -250,6 +262,10 @@ define([ this.ShowHideElem(type); }, + onSelectItem: function(picker, item, record, e){ + this.btnOk.setDisabled(record.get('level')==0 && record.get('index')>0); + }, + show: function() { Common.UI.Window.prototype.show.apply(this, arguments); From 35aaba094e004e2568e106384f2498bd6378d463 Mon Sep 17 00:00:00 2001 From: Alexander Trofimov Date: Thu, 29 Mar 2018 18:07:24 +0300 Subject: [PATCH 59/73] [changelog] Add changelog Create CHANGELOG.md for hotfix/v5.1.1 --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..9737a044d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,13 @@ +# Change log +## 5.1.1 +### All Editors +* + +### Document Editor +* + +### Spreadsheet Editor +* + +### Presentation Editor +* From 7cc3171649e2fa810618a8cd93246567a2b93cff Mon Sep 17 00:00:00 2001 From: Alexander Trofimov Date: Thu, 29 Mar 2018 18:22:28 +0300 Subject: [PATCH 60/73] [changelog] Add to develop Add changelog to develop --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9737a044d..09ff5ffd7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,5 @@ # Change log -## 5.1.1 +## develop ### All Editors * From 469d3c1db11bca4694e370e6c382efe79b6598c9 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 30 Mar 2018 15:43:48 +0300 Subject: [PATCH 61/73] [DE] Refactoring hyperlinks to headings. --- .../main/app/view/HyperlinkSettingsDialog.js | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js b/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js index ef7595db9..cb1073a77 100644 --- a/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js +++ b/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js @@ -216,7 +216,9 @@ define([ name : anchor.asc_GetHeadingText(), level: level, index: i+2, - hasParent: hasParent + hasParent: hasParent, + type: Asc.c_oAscHyperlinkAnchor.Heading, + headingParagraph: anchor.asc_GetHeadingParagraph() })); prev_level = level; } @@ -242,7 +244,8 @@ define([ name : anchor.asc_GetBookmarkName(), level: 1, index: arr.length, - hasParent: false + hasParent: false, + type: Asc.c_oAscHyperlinkAnchor.Bookmark })); prev_level = 1; } @@ -294,8 +297,13 @@ define([ } else { if (props.is_TopOfDocument()) this.internalList.selectByIndex(0); - else { - var rec = this.internalList.store.findWhere({name: bookmark}); + else if (props.is_Heading()) { + var heading = props.get_Heading(), + rec = this.internalList.store.findWhere({type: Asc.c_oAscHyperlinkAnchor.Heading, headingParagraph: heading }); + if (rec) + this.internalList.scrollToRecord(this.internalList.selectRecord(rec)); + } else { + var rec = this.internalList.store.findWhere({type: Asc.c_oAscHyperlinkAnchor.Bookmark, name: bookmark}); if (rec) this.internalList.scrollToRecord(this.internalList.selectRecord(rec)); } @@ -337,6 +345,9 @@ define([ props.put_Bookmark(rec[0].get('name')); if (rec[0].get('index')==0) props.put_TopOfDocument(); + var para = rec[0].get('headingParagraph'); + if (para) + props.put_Heading(para); display = rec[0].get('name'); } } From f95abd902caea1599471f70ef25cda857c122cd9 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 2 Apr 2018 13:58:55 +0300 Subject: [PATCH 62/73] Fix Bug 37377 --- apps/documenteditor/main/app/controller/Main.js | 1 + apps/presentationeditor/main/app/controller/Main.js | 1 + apps/spreadsheeteditor/main/app/controller/Main.js | 1 + 3 files changed, 3 insertions(+) diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index 9c5477232..18cae6ad0 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -1908,6 +1908,7 @@ define([ this._state.fastCoauth = false; Common.localStorage.setItem("de-settings-showchanges-strict", 'last'); this.api.SetCollaborativeMarksShowType(Asc.c_oAscCollaborativeMarksShowType.LastChanges); + this.getApplication().getController('Common.Controllers.ReviewChanges').applySettings(); } this.onEditComplete(); }, this) diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js index 2423b3e5a..45108c655 100644 --- a/apps/presentationeditor/main/app/controller/Main.js +++ b/apps/presentationeditor/main/app/controller/Main.js @@ -1625,6 +1625,7 @@ define([ Common.localStorage.setItem("pe-settings-coauthmode", 0); this.api.asc_SetFastCollaborative(false); Common.Utils.InternalSettings.set("pe-settings-coauthmode", false); + this.getApplication().getController('Common.Controllers.ReviewChanges').applySettings(); this._state.fastCoauth = false; } this.onEditComplete(); diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index 0534ef5b9..da65b7a95 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -1854,6 +1854,7 @@ define([ Common.localStorage.setItem("sse-settings-coauthmode", 0); this.api.asc_SetFastCollaborative(false); Common.Utils.InternalSettings.set("sse-settings-coauthmode", false); + this.getApplication().getController('Common.Controllers.ReviewChanges').applySettings(); this._state.fastCoauth = false; } this.onEditComplete(); From bcfa677bf068b11a58929887cda6a2ea00f3c624 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 2 Apr 2018 16:56:14 +0300 Subject: [PATCH 63/73] [DE] Add translation for bookmarks --- apps/documenteditor/main/locale/en.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index fb020e770..17607887e 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -779,6 +779,16 @@ "DE.Controllers.Toolbar.txtSymbol_vdots": "Vertical ellipsis", "DE.Controllers.Toolbar.txtSymbol_xsi": "Xi", "DE.Controllers.Toolbar.txtSymbol_zeta": "Zeta", + "DE.Views.BookmarksDialog.textTitle": "Bookmarks", + "DE.Views.BookmarksDialog.textLocation": "Location", + "DE.Views.BookmarksDialog.textBookmarkName": "Bookmark name", + "DE.Views.BookmarksDialog.textSort": "Sort by", + "DE.Views.BookmarksDialog.textName": "Name", + "DE.Views.BookmarksDialog.textAdd": "Add", + "DE.Views.BookmarksDialog.textGoto": "Go to", + "DE.Views.BookmarksDialog.textDelete": "Delete", + "DE.Views.BookmarksDialog.textClose": "Close", + "DE.Views.BookmarksDialog.textHidden": "Hidden bookmarks", "DE.Views.ChartSettings.textAdvanced": "Show advanced settings", "DE.Views.ChartSettings.textArea": "Area", "DE.Views.ChartSettings.textBar": "Bar", @@ -1169,6 +1179,11 @@ "DE.Views.HyperlinkSettingsDialog.textUrl": "Link to", "DE.Views.HyperlinkSettingsDialog.txtEmpty": "This field is required", "DE.Views.HyperlinkSettingsDialog.txtNotUrl": "This field should be a URL in the \"http://www.example.com\" format", + "DE.Views.HyperlinkSettingsDialog.textExternal": "External Link", + "DE.Views.HyperlinkSettingsDialog.textInternal": "Place in Document", + "DE.Views.HyperlinkSettingsDialog.txtBeginning": "Beginning of document", + "DE.Views.HyperlinkSettingsDialog.txtHeadings": "Headings", + "DE.Views.HyperlinkSettingsDialog.txtBookmarks": "Bookmarks", "DE.Views.ImageSettings.textAdvanced": "Show advanced settings", "DE.Views.ImageSettings.textEdit": "Edit", "DE.Views.ImageSettings.textEditObject": "Edit Object", @@ -1283,6 +1298,8 @@ "DE.Views.Links.tipContentsUpdate": "Refresh table of contents", "DE.Views.Links.tipInsertHyperlink": "Add hyperlink", "DE.Views.Links.tipNotes": "Insert or edit footnotes", + "DE.Views.Links.capBtnBookmarks": "Bookmark", + "DE.Views.Links.tipBookmarks": "Create a bookmark", "DE.Views.MailMergeEmailDlg.cancelButtonText": "Cancel", "DE.Views.MailMergeEmailDlg.filePlaceholder": "PDF", "DE.Views.MailMergeEmailDlg.okButtonText": "Send", From 4998d4b774e9752558e66b0a672b2a19fb1de2dd Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 2 Apr 2018 17:06:10 +0300 Subject: [PATCH 64/73] [DE] Edit changelog (create bookmarks and internal hyperlinks). --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2515725c..b5569ea41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,8 @@ * ### Document Editor -* +* Create and manage bookmarks +* Create internal hyperlinks to bookmarks and headings ### Spreadsheet Editor * Support Spanish in formulas From 23a49167f10e0a6a49431cb177e868fb3c8d3808 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 3 Apr 2018 13:22:24 +0300 Subject: [PATCH 65/73] [PE][SSE] Change interface for creating hyperlinks. --- .../main/app/view/HyperlinkSettingsDialog.js | 7 +- .../main/app/view/HyperlinkSettingsDialog.js | 60 ++++++++------- apps/presentationeditor/main/locale/en.json | 2 +- .../main/app/view/HyperlinkSettingsDialog.js | 76 +++++++++++-------- apps/spreadsheeteditor/main/locale/en.json | 2 +- 5 files changed, 78 insertions(+), 69 deletions(-) diff --git a/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js b/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js index cb1073a77..739f09689 100644 --- a/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js +++ b/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js @@ -98,7 +98,6 @@ define([ this.options.tpl = _.template(this.template)(this.options); this.api = this.options.api; this._originalProps = null; - this.linkType = c_oHyperlinkType.WebLink; Common.UI.Window.prototype.initialize.call(this, this.options); }, @@ -257,8 +256,6 @@ define([ } else this.btnOk.setDisabled(false); - - this.linkType = value; }, onLinkTypeClick: function(type, btn, event) { @@ -329,7 +326,7 @@ define([ props = new Asc.CHyperlinkProperty(), display = ''; - if (this.linkType == c_oHyperlinkType.WebLink) { + if (this.btnExternal.isActive()) {//WebLink var url = $.trim(me.inputUrl.getValue()); if (! /(((^https?)|(^ftp)):\/\/)|(^mailto:)/i.test(url) ) @@ -380,7 +377,7 @@ define([ _handleInput: function(state) { if (this.options.handler) { if (state == 'ok') { - if (this.linkType == c_oHyperlinkType.WebLink) { + if (this.btnExternal.isActive()) {//WebLink if (this.inputUrl.checkValidate() !== true) { this.inputUrl.cmpEl.find('input').focus(); return; diff --git a/apps/presentationeditor/main/app/view/HyperlinkSettingsDialog.js b/apps/presentationeditor/main/app/view/HyperlinkSettingsDialog.js index 31cbe3712..796a8e1c9 100644 --- a/apps/presentationeditor/main/app/view/HyperlinkSettingsDialog.js +++ b/apps/presentationeditor/main/app/view/HyperlinkSettingsDialog.js @@ -69,14 +69,14 @@ define([ }, options || {}); this.template = [ - '
        ', - '
        ', - '', + '
        ', + '
        ', + '', + '', '
        ', - '', '', @@ -89,11 +89,11 @@ define([ '', '
        ', '
        ', - '', + '', '
        ', '', '
        ', - '', + '', '
        ', '', '
        ', @@ -116,23 +116,22 @@ define([ var me = this, $window = this.getChild(); - me._arrTypeSrc = [ - {displayValue: me.textInternalLink, value: c_oHyperlinkType.InternalLink}, - {displayValue: me.textExternalLink, value: c_oHyperlinkType.WebLink} - ]; - - me.cmbLinkType = new Common.UI.ComboBox({ - el: $('#id-dlg-hyperlink-type'), - cls: 'input-group-nr', - style: 'width: 100%;', - menuStyle: 'min-width: 318px;', - editable: false, - data: this._arrTypeSrc + me.btnExternal = new Common.UI.Button({ + el: $('#id-dlg-hyperlink-external'), + enableToggle: true, + toggleGroup: 'hyperlink-type', + allowDepress: false, + pressed: true }); - me.cmbLinkType.setValue(me._arrTypeSrc[1].value); - me.cmbLinkType.on('selected', _.bind(function(combo, record) { - this.ShowHideElem(record.value); - }, me)); + me.btnExternal.on('click', _.bind(me.onLinkTypeClick, me, c_oHyperlinkType.WebLink)); + + me.btnInternal = new Common.UI.Button({ + el: $('#id-dlg-hyperlink-internal'), + enableToggle: true, + toggleGroup: 'hyperlink-type', + allowDepress: false + }); + me.btnInternal.on('click', _.bind(me.onLinkTypeClick, me, c_oHyperlinkType.InternalLink)); me.inputUrl = new Common.UI.InputField({ el : $('#id-dlg-hyperlink-url'), @@ -217,7 +216,7 @@ define([ var me = this; var type = me.parseUrl(props.get_Value()); - me.cmbLinkType.setValue(type); + (type == c_oHyperlinkType.WebLink) ? me.btnExternal.toggle(true) : me.btnInternal.toggle(true); me.ShowHideElem(type); if (props.get_Text()!==null) { @@ -239,7 +238,7 @@ define([ var me = this, props = new Asc.CHyperlinkProperty(); var def_display = ''; - if (me.cmbLinkType.getValue() == c_oHyperlinkType.InternalLink) { + if (this.btnInternal.isActive()) {//InternalLink var url = "ppaction://hlink"; var tip = ''; var txttip = me.inputTip.getValue(); @@ -298,7 +297,7 @@ define([ _handleInput: function(state) { if (this.options.handler) { if (state == 'ok') { - var checkurl = (this.cmbLinkType.getValue() == c_oHyperlinkType.WebLink) ? this.inputUrl.checkValidate() : true, + var checkurl = (this.btnExternal.isActive()) ? this.inputUrl.checkValidate() : true, checkdisp = this.inputDisplay.checkValidate(); if (checkurl !== true) { this.inputUrl.cmpEl.find('input').focus(); @@ -321,6 +320,10 @@ define([ this.internalPanel.toggleClass('hidden', value !== c_oHyperlinkType.InternalLink); }, + onLinkTypeClick: function(type, btn, event) { + this.ShowHideElem(type); + }, + parseUrl: function(url) { if (url===null || url===undefined || url=='' ) return c_oHyperlinkType.WebLink; @@ -364,13 +367,12 @@ define([ }, textTitle: 'Hyperlink Settings', - textInternalLink: 'Place In This Document', - textExternalLink: 'File or Web Page', + textInternalLink: 'Slide In This Presentation', + textExternalLink: 'External Link', textEmptyLink: 'Enter link here', textEmptyDesc: 'Enter caption here', textEmptyTooltip: 'Enter tooltip here', txtSlide: 'Slide', - textLinkType: 'Link Type', strDisplay: 'Display', textTipText: 'Screen Tip Text', strLinkTo: 'Link To', diff --git a/apps/presentationeditor/main/locale/en.json b/apps/presentationeditor/main/locale/en.json index a60255b37..6aba18f05 100644 --- a/apps/presentationeditor/main/locale/en.json +++ b/apps/presentationeditor/main/locale/en.json @@ -980,7 +980,7 @@ "PE.Views.HyperlinkSettingsDialog.textEmptyTooltip": "Enter tooltip here", "PE.Views.HyperlinkSettingsDialog.textExternalLink": "External Link", "PE.Views.HyperlinkSettingsDialog.textInternalLink": "Slide In This Presentation", - "PE.Views.HyperlinkSettingsDialog.textLinkType": "Link Type", + "del_PE.Views.HyperlinkSettingsDialog.textLinkType": "Link Type", "PE.Views.HyperlinkSettingsDialog.textTipText": "ScreenTip Text", "PE.Views.HyperlinkSettingsDialog.textTitle": "Hyperlink Settings", "PE.Views.HyperlinkSettingsDialog.txtEmpty": "This field is required", diff --git a/apps/spreadsheeteditor/main/app/view/HyperlinkSettingsDialog.js b/apps/spreadsheeteditor/main/app/view/HyperlinkSettingsDialog.js index 4dd36c427..8fb87634e 100644 --- a/apps/spreadsheeteditor/main/app/view/HyperlinkSettingsDialog.js +++ b/apps/spreadsheeteditor/main/app/view/HyperlinkSettingsDialog.js @@ -63,18 +63,17 @@ define([ this.template = [ '
        ', - '
        ', - '', + '
        ', + '', + '', '
        ', - '', - '