From f49404e8b5b78b02f8e5d58f0dfcf6ff228fde05 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 27 Nov 2017 14:15:10 +0300 Subject: [PATCH 01/86] Feature/new toolbar signature --- .../main/lib/component/ComboBoxFonts.js | 4 + apps/common/main/lib/util/utils.js | 3 +- apps/common/main/lib/view/SignDialog.js | 347 ++++++++++++++++++ .../main/lib/view/SignSettingsDialog.js | 203 ++++++++++ .../main/app/controller/LeftMenu.js | 41 ++- .../main/app/controller/Main.js | 1 + .../main/app/controller/RightMenu.js | 20 +- .../main/app/template/FileMenu.template | 2 + .../main/app/template/RightMenu.template | 3 + .../app/template/SignatureSettings.template | 27 ++ .../main/app/view/DocumentHolder.js | 33 ++ apps/documenteditor/main/app/view/FileMenu.js | 17 +- .../main/app/view/FileMenuPanels.js | 132 +++++++ .../documenteditor/main/app/view/RightMenu.js | 20 +- .../main/app/view/SignatureSettings.js | 288 +++++++++++++++ apps/documenteditor/main/locale/en.json | 43 +++ .../main/resources/img/toolbar-menu.png | Bin 16375 -> 15274 bytes .../main/resources/img/toolbar-menu@2x.png | Bin 54548 -> 37112 bytes .../main/resources/less/leftmenu.less | 28 ++ .../main/resources/less/rightmenu.less | 1 + .../main/resources/less/toolbar.less | 11 - .../main/app/controller/LeftMenu.js | 29 +- .../main/app/controller/Main.js | 1 + .../main/app/controller/RightMenu.js | 14 +- .../main/app/template/FileMenu.template | 2 + .../main/app/template/RightMenu.template | 3 + .../app/template/SignatureSettings.template | 19 + .../main/app/view/DocumentHolder.js | 32 ++ .../main/app/view/FileMenu.js | 17 +- .../main/app/view/FileMenuPanels.js | 98 +++++ .../main/app/view/RightMenu.js | 22 +- .../main/app/view/SignatureSettings.js | 207 +++++++++++ .../main/app/view/Viewport.js | 2 +- apps/presentationeditor/main/locale/en.json | 38 ++ .../main/resources/img/toolbar-menu.png | Bin 12696 -> 13359 bytes .../main/resources/img/toolbar-menu@2x.png | Bin 33313 -> 35079 bytes .../main/resources/less/leftmenu.less | 28 ++ .../main/resources/less/rightmenu.less | 3 + .../main/app/controller/DocumentHolder.js | 33 ++ .../main/app/controller/LeftMenu.js | 47 ++- .../main/app/controller/Main.js | 1 + .../main/app/controller/RightMenu.js | 22 +- .../main/app/template/FileMenu.template | 2 + .../main/app/template/RightMenu.template | 3 + .../app/template/SignatureSettings.template | 27 ++ .../main/app/view/FileMenu.js | 18 +- .../main/app/view/FileMenuPanels.js | 132 +++++++ .../main/app/view/RightMenu.js | 23 +- .../main/app/view/SignatureSettings.js | 288 +++++++++++++++ .../main/app/view/Viewport.js | 2 +- apps/spreadsheeteditor/main/locale/en.json | 43 +++ .../main/resources/img/toolbar-menu.png | Bin 13889 -> 14618 bytes .../main/resources/img/toolbar-menu@2x.png | Bin 35078 -> 37209 bytes .../main/resources/less/leftmenu.less | 28 ++ .../main/resources/less/rightmenu.less | 3 + 55 files changed, 2360 insertions(+), 51 deletions(-) create mode 100644 apps/common/main/lib/view/SignDialog.js create mode 100644 apps/common/main/lib/view/SignSettingsDialog.js create mode 100644 apps/documenteditor/main/app/template/SignatureSettings.template create mode 100644 apps/documenteditor/main/app/view/SignatureSettings.js create mode 100644 apps/presentationeditor/main/app/template/SignatureSettings.template create mode 100644 apps/presentationeditor/main/app/view/SignatureSettings.js create mode 100644 apps/spreadsheeteditor/main/app/template/SignatureSettings.template create mode 100644 apps/spreadsheeteditor/main/app/view/SignatureSettings.js diff --git a/apps/common/main/lib/component/ComboBoxFonts.js b/apps/common/main/lib/component/ComboBoxFonts.js index c1bf141bd..7ea19885f 100644 --- a/apps/common/main/lib/component/ComboBoxFonts.js +++ b/apps/common/main/lib/component/ComboBoxFonts.js @@ -113,6 +113,8 @@ define([ this._input.on('keyup', _.bind(this.onInputKeyUp, this)); this._input.on('keydown', _.bind(this.onInputKeyDown, this)); + this._modalParents = this.cmpEl.closest('.asc-window'); + return this; }, @@ -319,6 +321,8 @@ define([ var name = (_.isFunction(font.get_Name) ? font.get_Name() : font.asc_getName()); if (this.getRawValue() !== name) { + if (this._modalParents.length > 0) return; + var record = this.store.findWhere({ name: name }); diff --git a/apps/common/main/lib/util/utils.js b/apps/common/main/lib/util/utils.js index da546a159..45d89d50e 100644 --- a/apps/common/main/lib/util/utils.js +++ b/apps/common/main/lib/util/utils.js @@ -101,7 +101,8 @@ Common.Utils = _.extend(new(function() { Shape : 5, Slide : 6, Chart : 7, - MailMerge : 8 + MailMerge : 8, + Signature : 9 }, isMobile = /android|avantgo|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od|ad)|iris|kindle|lge |maemo|midp|mmp|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent || navigator.vendor || window.opera), me = this, diff --git a/apps/common/main/lib/view/SignDialog.js b/apps/common/main/lib/view/SignDialog.js new file mode 100644 index 000000000..c44c3bd1e --- /dev/null +++ b/apps/common/main/lib/view/SignDialog.js @@ -0,0 +1,347 @@ +/* + * + * (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 + * +*/ +/** + * SignDialog.js + * + * Created by Julia Radzhabova on 5/19/17 + * Copyright (c) 2017 Ascensio System SIA. All rights reserved. + * + */ + + +if (Common === undefined) + var Common = {}; + +define([ + 'common/main/lib/util/utils', + 'common/main/lib/component/InputField', + 'common/main/lib/component/Window', + 'common/main/lib/component/ComboBoxFonts' +], function () { 'use strict'; + + Common.Views.SignDialog = Common.UI.Window.extend(_.extend({ + options: { + width: 350, + style: 'min-width: 350px;', + cls: 'modal-dlg' + }, + + initialize : function(options) { + _.extend(this.options, { + title: this.textTitle + }, options || {}); + + this.api = this.options.api; + this.signType = this.options.signType || 'invisible'; + this.signSize = this.options.signSize || {width: 0, height: 0}; + this.certificateId = null; + this.signObject = null; + this.fontStore = this.options.fontStore; + this.font = { + size: 11, + name: 'Arial', + bold: false, + italic: false + }; + + this.template = [ + '
', + '
', + '
', + '', + '
', + '
', + '
', + '
', + '
', + '', + '
', + '
', + '
', + '
', + '
','
', + '
', + '', + '
', + '', + '
', + '', + '
', + '
', + '
', + '', + '', + '' + + '', + '', + '', + '
', + '
', + '' + ].join(''); + + this.templateCertificate = _.template([ + '', + '' + ].join('')); + + this.options.tpl = _.template(this.template)(this.options); + + Common.UI.Window.prototype.initialize.call(this, this.options); + }, + + render: function() { + Common.UI.Window.prototype.render.call(this); + + var me = this, + $window = this.getChild(); + + me.inputPurpose = new Common.UI.InputField({ + el : $('#id-dlg-sign-purpose'), + style : 'width: 100%;' + }); + + me.inputName = new Common.UI.InputField({ + el : $('#id-dlg-sign-name'), + style : 'width: 100%;', + validateOnChange: true + }).on ('changing', _.bind(me.onChangeName, me)); + + me.cmbFonts = new Common.UI.ComboBoxFonts({ + el : $('#id-dlg-sign-fonts'), + cls : 'input-group-nr', + style : 'width: 214px;', + menuCls : 'scrollable-menu', + menuStyle : 'min-width: 55px;max-height: 270px;', + store : new Common.Collections.Fonts(), + recent : 0, + hint : me.tipFontName + }).on('selected', function(combo, record) { + if (me.signObject) { + me.signObject.setText(me.inputName.getValue(), record.name, me.font.size, me.font.italic, me.font.bold); + } + me.font.name = record.name; + }); + + this.cmbFontSize = new Common.UI.ComboBox({ + el: $('#id-dlg-sign-font-size'), + cls: 'input-group-nr', + style: 'width: 55px;', + menuCls : 'scrollable-menu', + menuStyle: 'min-width: 55px;max-height: 270px;', + hint: this.tipFontSize, + data: [ + { value: 8, displayValue: "8" }, + { value: 9, displayValue: "9" }, + { value: 10, displayValue: "10" }, + { value: 11, displayValue: "11" }, + { value: 12, displayValue: "12" }, + { value: 14, displayValue: "14" }, + { value: 16, displayValue: "16" }, + { value: 18, displayValue: "18" }, + { value: 20, displayValue: "20" }, + { value: 22, displayValue: "22" }, + { value: 24, displayValue: "24" }, + { value: 26, displayValue: "26" }, + { value: 28, displayValue: "28" }, + { value: 36, displayValue: "36" }, + { value: 48, displayValue: "48" }, + { value: 72, displayValue: "72" } + ] + }).on('selected', function(combo, record) { + if (me.signObject) { + me.signObject.setText(me.inputName.getValue(), me.font.name, record.value, me.font.italic, me.font.bold); + } + me.font.size = record.value; + }); + this.cmbFontSize.setValue(this.font.size); + + me.btnBold = new Common.UI.Button({ + cls: 'btn-toolbar', + iconCls: 'btn-bold', + enableToggle: true, + hint: me.textBold + }); + me.btnBold.render($('#id-dlg-sign-bold')) ; + me.btnBold.on('click', function(btn, e) { + if (me.signObject) { + me.signObject.setText(me.inputName.getValue(), me.font.name, me.font.size, me.font.italic, btn.pressed); + } + me.font.bold = btn.pressed; + }); + + me.btnItalic = new Common.UI.Button({ + cls: 'btn-toolbar', + iconCls: 'btn-italic', + enableToggle: true, + hint: me.textItalic + }); + me.btnItalic.render($('#id-dlg-sign-italic')) ; + me.btnItalic.on('click', function(btn, e) { + if (me.signObject) { + me.signObject.setText(me.inputName.getValue(), me.font.name, me.font.size, btn.pressed, me.font.bold); + } + me.font.italic = btn.pressed; + }); + + me.btnSelectImage = new Common.UI.Button({ + el: '#id-dlg-sign-image' + }); + me.btnSelectImage.on('click', _.bind(me.onSelectImage, me)); + + me.btnChangeCertificate = new Common.UI.Button({ + el: '#id-dlg-sign-change' + }); + me.btnChangeCertificate.on('click', _.bind(me.onChangeCertificate, me)); + + me.cntCertificate = $('#id-dlg-sign-certificate'); + me.cntVisibleSign = $('#id-dlg-sign-visible'); + me.cntInvisibleSign = $('#id-dlg-sign-invisible'); + + (me.signType == 'visible') ? me.cntInvisibleSign.addClass('hidden') : me.cntVisibleSign.addClass('hidden'); + + $window.find('.dlg-btn').on('click', _.bind(me.onBtnClick, me)); + $window.find('input').on('keypress', _.bind(me.onKeyPress, me)); + + me.afterRender(); + }, + + show: function() { + Common.UI.Window.prototype.show.apply(this, arguments); + + var me = this; + _.delay(function(){ + ((me.signType == 'visible') ? me.inputName : me.inputPurpose).cmpEl.find('input').focus(); + },500); + }, + + hide: function() { + Common.UI.Window.prototype.hide.apply(this, arguments); + + if (this.signObject) + this.signObject.destroy(); + }, + + afterRender: function () { + if (this.api) { + this.api.asc_unregisterCallback('on_signature_defaultcertificate_ret', _.bind(this.onCertificateChanged, this)); + this.api.asc_registerCallback('on_signature_defaultcertificate_ret', _.bind(this.onCertificateChanged, this)); + this.api.asc_unregisterCallback('on_signature_selectsertificate_ret', _.bind(this.onCertificateChanged, this)); + this.api.asc_registerCallback('on_signature_selectsertificate_ret', _.bind(this.onCertificateChanged, this)); + this.api.asc_GetDefaultCertificate(); + } + + if (this.signType == 'visible') { + this.cmbFonts.fillFonts(this.fontStore); + this.cmbFonts.selectRecord(this.fontStore.findWhere({name: this.font.name}) || this.fontStore.at(0)); + + this.signObject = new AscCommon.CSignatureDrawer('signature-preview-img', this.api, this.signSize.width, this.signSize.height); + } + }, + + getSettings: function () { + var props = {}; + props.certificateId = this.certificateId; + if (this.signType == 'invisible') { + props.purpose = this.inputPurpose.getValue(); + } else { + props.images = this.signObject ? this.signObject.getImages() : [null, null]; + } + + return props; + }, + + onBtnClick: function(event) { + this._handleInput(event.currentTarget.attributes['result'].value); + }, + + onKeyPress: function(event) { + if (event.keyCode == Common.UI.Keys.RETURN) { + this._handleInput('ok'); + return false; + } + }, + + _handleInput: function(state) { + if (this.options.handler) { + if (state == 'ok' && this.signObject && !this.signObject.isValid()) + return; + + this.options.handler.call(this, this, state); + } + this.close(); + }, + + onChangeCertificate: function() { + this.api.asc_SelectCertificate(); + }, + + onCertificateChanged: function(certificate) { + this.certificateId = certificate.id; + var date = certificate.date, + arr_date = (typeof date == 'string') ? date.split(' - ') : ['', '']; + this.cntCertificate.html(this.templateCertificate({name: certificate.name, valid: this.textValid.replace('%1', arr_date[0]).replace('%2', arr_date[1])})); + }, + + onSelectImage: function() { + if (!this.signObject) return; + this.signObject.selectImage(); + this.inputName.setValue(''); + }, + + onChangeName: function (input, value) { + if (!this.signObject) return; + this.signObject.setText(value, this.font.name, this.font.size, this.font.italic, this.font.bold); + }, + + textTitle: 'Sign Document', + textPurpose: 'Purpose for signing this document', + textCertificate: 'Certificate', + textValid: 'Valid from %1 to %2', + textChange: 'Change', + cancelButtonText: 'Cancel', + okButtonText: 'Ok', + textInputName: 'Input signer name', + textUseImage: 'or click \'Select Image\' to use a picture as signature', + textSelectImage: 'Select Image', + textSignature: 'Signature looks as', + tipFontName: 'Font Name', + tipFontSize: 'Font Size', + textBold: 'Bold', + textItalic: 'Italic' + + }, Common.Views.SignDialog || {})) +}); \ No newline at end of file diff --git a/apps/common/main/lib/view/SignSettingsDialog.js b/apps/common/main/lib/view/SignSettingsDialog.js new file mode 100644 index 000000000..20f718568 --- /dev/null +++ b/apps/common/main/lib/view/SignSettingsDialog.js @@ -0,0 +1,203 @@ +/* + * + * (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 + * +*/ +/** + * SignSettingsDialog.js + * + * Created by Julia Radzhabova on 5/19/17 + * Copyright (c) 2017 Ascensio System SIA. All rights reserved. + * + */ + + +if (Common === undefined) + var Common = {}; + +define([ + 'common/main/lib/util/utils', + 'common/main/lib/component/InputField', + 'common/main/lib/component/CheckBox', + 'common/main/lib/component/Window' +], function () { 'use strict'; + + Common.Views.SignSettingsDialog = Common.UI.Window.extend(_.extend({ + options: { + width: 350, + style: 'min-width: 350px;', + cls: 'modal-dlg' + }, + + initialize : function(options) { + _.extend(this.options, { + title: this.textTitle + }, options || {}); + + this.template = [ + '
', + '
', + '', + '
', + '
', + '', + '
', + '
', + '
', + '', + '
', + '
', + '
', + '', + '
', + '
', + '
', + '', + '
', + '', + '
', + '
', + '' + ].join(''); + + this.options.tpl = _.template(this.template)(this.options); + this.api = this.options.api; + + Common.UI.Window.prototype.initialize.call(this, this.options); + }, + + render: function() { + Common.UI.Window.prototype.render.call(this); + + var me = this, + $window = this.getChild(); + + me.inputName = new Common.UI.InputField({ + el : $('#id-dlg-sign-settings-name'), + style : 'width: 100%;' + }); + + me.inputTitle = new Common.UI.InputField({ + el : $('#id-dlg-sign-settings-title'), + style : 'width: 100%;' + }); + + me.inputEmail = new Common.UI.InputField({ + el : $('#id-dlg-sign-settings-email'), + style : 'width: 100%;' + }); + + me.textareaInstructions = this.$window.find('textarea'); + me.textareaInstructions.keydown(function (event) { + if (event.keyCode == Common.UI.Keys.RETURN) { + event.stopPropagation(); + } + }); + + this.chDate = new Common.UI.CheckBox({ + el: $('#id-dlg-sign-settings-date'), + labelText: this.textShowDate + }); + + $window.find('.dlg-btn').on('click', _.bind(this.onBtnClick, this)); + $window.find('input').on('keypress', _.bind(this.onKeyPress, this)); + }, + + show: function() { + Common.UI.Window.prototype.show.apply(this, arguments); + + var me = this; + _.delay(function(){ + me.inputName.cmpEl.find('input').focus(); + },500); + }, + + setSettings: function (props) { + if (props) { + var me = this; + + // var value = props.asc_getSigner1(); + // me.inputName.setValue(value ? value : ''); + // value = props.asc_getSigner2(); + // me.inputTitle.setValue(value ? value : ''); + // value = props.asc_getEmail(); + // me.inputEmail.setValue(value ? value : ''); + // value = props.asc_getInstructions(); + // me.textareaInstructions.val(value ? value : ''); + // me.chDate.setValue(props.asc_getShowDate()); + } + }, + + getSettings: function () { + var me = this, + props = new AscCommon.asc_CSignatureLine(); + + props.asc_setSigner1(me.inputName.getValue()); + props.asc_setSigner2(me.inputTitle.getValue()); + props.asc_setEmail(me.inputEmail.getValue()); + props.asc_setInstructions(me.textareaInstructions.val()); + props.asc_setShowDate(me.chDate.getValue()=='checked'); + + return props; + }, + + onBtnClick: function(event) { + this._handleInput(event.currentTarget.attributes['result'].value); + }, + + onKeyPress: function(event) { + if (event.keyCode == Common.UI.Keys.RETURN) { + this._handleInput('ok'); + return false; + } + }, + + _handleInput: function(state) { + if (this.options.handler) + this.options.handler.call(this, this, state); + this.close(); + }, + + textInfo: 'Signer Info', + textInfoName: 'Name', + textInfoTitle: 'Signer Title', + textInfoEmail: 'E-mail', + textInstructions: 'Instructions for Signer', + cancelButtonText: 'Cancel', + okButtonText: 'Ok', + txtEmpty: 'This field is required', + textAllowComment: 'Allow signer to add comment in the signature dialog', + textShowDate: 'Show sign date in signature line', + textTitle: 'Signature Settings' + }, Common.Views.SignSettingsDialog || {})) +}); \ No newline at end of file diff --git a/apps/documenteditor/main/app/controller/LeftMenu.js b/apps/documenteditor/main/app/controller/LeftMenu.js index a05ae62e0..884c3baad 100644 --- a/apps/documenteditor/main/app/controller/LeftMenu.js +++ b/apps/documenteditor/main/app/controller/LeftMenu.js @@ -43,6 +43,8 @@ define([ 'core', 'common/main/lib/util/Shortcuts', + 'common/main/lib/view/SignSettingsDialog', + 'common/main/lib/view/SignDialog', 'documenteditor/main/app/view/LeftMenu', 'documenteditor/main/app/view/FileMenu' ], function () { @@ -85,7 +87,9 @@ define([ 'saveas:format': _.bind(this.clickSaveAsFormat, this), 'settings:apply': _.bind(this.applySettings, this), 'create:new': _.bind(this.onCreateNew, this), - 'recent:open': _.bind(this.onOpenRecent, this) + 'recent:open': _.bind(this.onOpenRecent, this), + 'signature:visible': _.bind(this.addVisibleSign, this), + 'signature:invisible': _.bind(this.addInvisibleSign, this) }, 'Toolbar': { 'file:settings': _.bind(this.clickToolbarSettings,this), @@ -676,6 +680,41 @@ define([ Common.Gateway.requestHistory(); }, + addVisibleSign: function(menu) { + var me = this, + win = new Common.Views.SignSettingsDialog({ + handler: function(dlg, result) { + if (result == 'ok') { + me.api.asc_AddSignatureLine2(dlg.getSettings()); + } + Common.NotificationCenter.trigger('edit:complete', me); + } + }); + + win.show(); + + menu.hide(); + }, + + addInvisibleSign: function(menu) { + var me = this, + win = new Common.Views.SignDialog({ + api: me.api, + signType: 'invisible', + handler: function(dlg, result) { + if (result == 'ok') { + var props = dlg.getSettings(); + me.api.asc_Sign(props.certificateId); + } + Common.NotificationCenter.trigger('edit:complete', me); + } + }); + + win.show(); + + menu.hide(); + }, + textNoTextFound : 'Text not found', newDocumentTitle : 'Unnamed document', requestEditRightsText : 'Requesting editing rights...', diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index d0fe09077..17d3bf213 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -1015,6 +1015,7 @@ define([ this.appOptions.forcesave = this.appOptions.canForcesave; this.appOptions.canEditComments= this.appOptions.isOffline || !(typeof (this.editorConfig.customization) == 'object' && this.editorConfig.customization.commentAuthorOnly); this.appOptions.trialMode = params.asc_getLicenseMode(); + this.appOptions.canProtect = this.appOptions.isDesktopApp && this.api.asc_isSignaturesSupport(); if ( this.appOptions.isLightVersion ) { this.appOptions.canUseHistory = diff --git a/apps/documenteditor/main/app/controller/RightMenu.js b/apps/documenteditor/main/app/controller/RightMenu.js index 67e8afae1..c56a64f5a 100644 --- a/apps/documenteditor/main/app/controller/RightMenu.js +++ b/apps/documenteditor/main/app/controller/RightMenu.js @@ -78,7 +78,8 @@ define([ this._settings[Common.Utils.documentSettingsType.Shape] = {panelId: "id-shape-settings", panel: rightMenu.shapeSettings, btn: rightMenu.btnShape, hidden: 1, locked: false}; this._settings[Common.Utils.documentSettingsType.TextArt] = {panelId: "id-textart-settings", panel: rightMenu.textartSettings, btn: rightMenu.btnTextArt, hidden: 1, locked: false}; this._settings[Common.Utils.documentSettingsType.Chart] = {panelId: "id-chart-settings", panel: rightMenu.chartSettings, btn: rightMenu.btnChart, hidden: 1, locked: false}; - this._settings[Common.Utils.documentSettingsType.MailMerge] = {panelId: "id-mail-merge-settings", panel: rightMenu.mergeSettings, btn: rightMenu.btnMailMerge, hidden: 1, props: {}, locked: false}; + this._settings[Common.Utils.documentSettingsType.MailMerge] = {panelId: "id-mail-merge-settings", panel: rightMenu.mergeSettings, btn: rightMenu.btnMailMerge, hidden: 1, props: {}, locked: false}; + this._settings[Common.Utils.documentSettingsType.Signature] = {panelId: "id-signature-settings", panel: rightMenu.signatureSettings, btn: rightMenu.btnSignature, hidden: (rightMenu.signatureSettings) ? 0 : 1, props: {}, locked: false}; }, setApi: function(api) { @@ -96,7 +97,7 @@ define([ var panel = this._settings[type].panel; var props = this._settings[type].props; if (props && panel) - panel.ChangeSettings.call(panel, (type==Common.Utils.documentSettingsType.MailMerge) ? undefined : props); + panel.ChangeSettings.call(panel, (type==Common.Utils.documentSettingsType.MailMerge || type==Common.Utils.documentSettingsType.Signature) ? undefined : props); } else if (minimized && type==Common.Utils.documentSettingsType.MailMerge) { this.rightmenu.mergeSettings.disablePreviewMode(); } @@ -112,13 +113,14 @@ define([ in_equation = false, needhide = true; for (var i=0; i
  • +
  • @@ -30,4 +31,5 @@
    +
    \ No newline at end of file diff --git a/apps/documenteditor/main/app/template/RightMenu.template b/apps/documenteditor/main/app/template/RightMenu.template index a0226ef70..6605f9949 100644 --- a/apps/documenteditor/main/app/template/RightMenu.template +++ b/apps/documenteditor/main/app/template/RightMenu.template @@ -16,6 +16,8 @@
    +
    +
    @@ -27,5 +29,6 @@ +
    \ No newline at end of file diff --git a/apps/documenteditor/main/app/template/SignatureSettings.template b/apps/documenteditor/main/app/template/SignatureSettings.template new file mode 100644 index 000000000..5a4fa0157 --- /dev/null +++ b/apps/documenteditor/main/app/template/SignatureSettings.template @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + +
    \ No newline at end of file diff --git a/apps/documenteditor/main/app/view/DocumentHolder.js b/apps/documenteditor/main/app/view/DocumentHolder.js index 51c8c2c72..b09e538cf 100644 --- a/apps/documenteditor/main/app/view/DocumentHolder.js +++ b/apps/documenteditor/main/app/view/DocumentHolder.js @@ -49,6 +49,7 @@ define([ 'common/main/lib/component/Menu', 'common/main/lib/view/InsertTableDialog', 'common/main/lib/view/CopyWarningDialog', + 'common/main/lib/view/SignDialog', 'documenteditor/main/app/view/DropcapSettingsAdvanced', 'documenteditor/main/app/view/HyperlinkSettingsDialog', 'documenteditor/main/app/view/ParagraphSettingsAdvanced', @@ -80,6 +81,7 @@ define([ me._currentMathObj = undefined; me._currentParaObjDisabled = false; me._isDisabled = false; + me._currentSignGuid = null; var showPopupMenu = function(menu, value, event, docElement, eOpts){ if (!_.isUndefined(menu) && menu !== null){ @@ -724,6 +726,36 @@ define([ me.mode.isEdit = false; }; + var onSignatureClick = function(guid, width, height) { + if (_.isUndefined(me.fontStore)) { + me.fontStore = new Common.Collections.Fonts(); + var fonts = DE.getController('Toolbar').getView('Toolbar').cmbFontName.store.toJSON(); + var arr = []; + _.each(fonts, function(font, index){ + if (!font.cloneid) { + arr.push(_.clone(font)); + } + }); + me.fontStore.add(arr); + } + + var win = new Common.Views.SignDialog({ + api: me.api, + signType: 'visible', + fontStore: me.fontStore, + signSize: {width: width, height: height}, + handler: function(dlg, result) { + if (result == 'ok') { + var props = dlg.getSettings(); + me.api.asc_Sign(props.certificateId, guid, props.images[0], props.images[1]); + } + Common.NotificationCenter.trigger('edit:complete'); + } + }); + + win.show(); + }; + var onTextLanguage = function(langid) { me._currLang.id = langid; }; @@ -1528,6 +1560,7 @@ define([ this.api.asc_registerCallback('asc_onShowSpecialPasteOptions', _.bind(onShowSpecialPasteOptions, this)); this.api.asc_registerCallback('asc_onHideSpecialPasteOptions', _.bind(onHideSpecialPasteOptions, this)); + this.api.asc_registerCallback('asc_onSignatureClick', _.bind(onSignatureClick, this)); } return this; diff --git a/apps/documenteditor/main/app/view/FileMenu.js b/apps/documenteditor/main/app/view/FileMenu.js index 542e822a5..9be53947c 100644 --- a/apps/documenteditor/main/app/view/FileMenu.js +++ b/apps/documenteditor/main/app/view/FileMenu.js @@ -168,6 +168,12 @@ define([ this.miSaveAs, this.miPrint, this.miRename, + new Common.UI.MenuItem({ + el : $('#fm-btn-protect',this.el), + action : 'protect', + caption : this.btnProtectCaption, + canFocused: false + }), this.miRecent, this.miNew, new Common.UI.MenuItem({ @@ -234,7 +240,8 @@ define([ applyMode: function() { this.miPrint[this.mode.canPrint?'show':'hide'](); this.miRename[(this.mode.canRename && !this.mode.isDesktopApp) ?'show':'hide'](); - this.miRename.$el.find('+.devider')[!this.mode.isDisconnected?'show':'hide'](); + this.items[7][(this.mode.canProtect) ?'show':'hide'](); + this.items[7].$el.find('+.devider')[!this.mode.isDisconnected?'show':'hide'](); this.miRecent[this.mode.canOpenRecent?'show':'hide'](); this.miNew[this.mode.canCreateNew?'show':'hide'](); this.miNew.$el.find('+.devider')[this.mode.canCreateNew?'show':'hide'](); @@ -270,8 +277,10 @@ define([ } } - if (this.mode.isDesktopApp) { + if (this.mode.canProtect) { // this.$el.find('#fm-btn-back').hide(); + this.panels['protect'] = (new DE.Views.FileMenuPanels.ProtectDoc({menu:this})).render(); + this.panels['protect'].setMode(this.mode); } if (this.mode.canDownload) { @@ -302,6 +311,7 @@ define([ setApi: function(api) { this.api = api; this.panels['info'].setApi(api); + if (this.panels['protect']) this.panels['protect'].setApi(api); }, loadDocument: function(data) { @@ -360,6 +370,7 @@ define([ btnSaveAsCaption : 'Save as', textDownload : 'Download', btnRenameCaption : 'Rename...', - btnCloseMenuCaption : 'Close Menu' + btnCloseMenuCaption : 'Close Menu', + btnProtectCaption: 'Protect\\Sign' }, DE.Views.FileMenu || {})); }); diff --git a/apps/documenteditor/main/app/view/FileMenuPanels.js b/apps/documenteditor/main/app/view/FileMenuPanels.js index 8ef6e6458..c10a95fc8 100644 --- a/apps/documenteditor/main/app/view/FileMenuPanels.js +++ b/apps/documenteditor/main/app/view/FileMenuPanels.js @@ -1097,4 +1097,136 @@ define([ } } }); + + DE.Views.FileMenuPanels.ProtectDoc = Common.UI.BaseView.extend(_.extend({ + el: '#panel-protect', + menu: undefined, + + template: _.template([ + '', + '', + '', + '
    ', + '
    ', + '
    ' + ].join('')), + + initialize: function(options) { + Common.UI.BaseView.prototype.initialize.call(this,arguments); + + this.menu = options.menu; + + this.templateRequested = _.template([ + '', + '', + '<% _.each(signatures, function(item) { %>', + '', + '', + '', + '<% }); %>', + '
    <%= Common.Utils.String.htmlEncode(item) %>
    ' + ].join('')); + + this.templateValid = _.template([ + '', + '', + '<% _.each(signatures, function(item) { %>', + '', + '', + '', + '', + '<% }); %>', + '
    <%= Common.Utils.String.htmlEncode(item.name) %><%= Common.Utils.String.htmlEncode(item.date) %>
    ' + ].join('')); + }, + + render: function() { + $(this.el).html(this.template({scope: this})); + + this.btnAddInvisibleSign = new Common.UI.Button({ + el: '#fms-btn-invisible-sign' + }); + this.btnAddInvisibleSign.on('click', _.bind(this.addInvisibleSign, this)); + + this.btnAddVisibleSign = new Common.UI.Button({ + el: '#fms-btn-visible-sign' + }); + this.btnAddVisibleSign.on('click', _.bind(this.addVisibleSign, this)); + + this.lblSignHeader = $('#id-fms-lbl-sign-header', this.$el); + + this.cntRequestedSign = $('#id-fms-requested-sign'); + this.cntValidSign = $('#id-fms-valid-sign'); + this.cntInvalidSign = $('#id-fms-invalid-sign'); + + if (_.isUndefined(this.scroller)) { + this.scroller = new Common.UI.Scroller({ + el: $(this.el), + suppressScrollX: true + }); + } + + return this; + }, + + show: function() { + Common.UI.BaseView.prototype.show.call(this,arguments); + this.updateSignatures(); + }, + + setMode: function(mode) { + this.mode = mode; + if (!this.mode.isEdit) { + this.btnAddInvisibleSign.setVisible(false); + this.btnAddVisibleSign.setVisible(false); + this.lblSignHeader.html(this.strSignature); + } + }, + + setApi: function(o) { + this.api = o; + return this; + }, + + addInvisibleSign: function() { + if (this.menu) + this.menu.fireEvent('signature:invisible', [this.menu]); + }, + + addVisibleSign: function() { + if (this.menu) + this.menu.fireEvent('signature:visible', [this.menu]); + }, + + updateSignatures: function(){ + var requested = this.api.asc_getRequestSignatures(), + requested_arr = [], + valid = this.api.asc_getSignatures(), + valid_arr = [], invalid_arr = []; + + _.each(requested, function(item, index){ + requested_arr.push(item.asc_getSigner1()); + }); + _.each(valid, function(item, index){ + var sign = {name: item.asc_getSigner1(), date: '18/05/2017'}; + (item.asc_getValid()==0) ? valid_arr.push(sign) : invalid_arr.push(sign); + }); + this.cntRequestedSign.html(this.templateRequested({signatures: requested_arr, header: this.strRequested})); + this.cntValidSign.html(this.templateValid({signatures: valid_arr, header: this.strValid})); + this.cntInvalidSign.html(this.templateValid({signatures: invalid_arr, header: this.strInvalid})); + // this.cntRequestedSign.html(this.templateRequested({signatures: ['Hammish Mitchell', 'Someone Somewhere', 'Mary White', 'John Black'], header: this.strRequested})); + // this.cntValidSign.html(this.templateValid({signatures: [{name: 'Hammish Mitchell', date: '18/05/2017'}, {name: 'Someone Somewhere', date: '18/05/2017'}], header: this.strValid})); + // this.cntInvalidSign.html(this.templateValid({signatures: [{name: 'Mary White', date: '18/05/2017'}, {name: 'John Black', date: '18/05/2017'}], header: this.strInvalid})); + }, + + strProtect: 'Protect Document', + strInvisibleSign: 'Add invisible digital signature', + strVisibleSign: 'Add visible signature', + strRequested: 'Requested signatures', + strValid: 'Valid signatures', + strInvalid: 'Invalid signatures', + strSignature: 'Signature' + + }, DE.Views.FileMenuPanels.ProtectDoc || {})); + }); diff --git a/apps/documenteditor/main/app/view/RightMenu.js b/apps/documenteditor/main/app/view/RightMenu.js index 0d52aace0..453cd508e 100644 --- a/apps/documenteditor/main/app/view/RightMenu.js +++ b/apps/documenteditor/main/app/view/RightMenu.js @@ -57,6 +57,7 @@ define([ 'documenteditor/main/app/view/ShapeSettings', 'documenteditor/main/app/view/MailMergeSettings', 'documenteditor/main/app/view/TextArtSettings', + 'documenteditor/main/app/view/SignatureSettings', 'common/main/lib/component/Scroller' ], function (menuTemplate, $, _, Backbone) { 'use strict'; @@ -194,6 +195,21 @@ define([ this.mergeSettings = new DE.Views.MailMergeSettings(); } + if (mode && mode.canProtect) { + this.btnSignature = new Common.UI.Button({ + hint: this.txtSignatureSettings, + asctype: Common.Utils.documentSettingsType.Signature, + enableToggle: true, + disabled: true, + toggleGroup: 'tabpanelbtnsGroup' + }); + this._settings[Common.Utils.documentSettingsType.Signature] = {panel: "id-signature-settings", btn: this.btnSignature}; + + this.btnSignature.el = $('#id-right-menu-signature'); this.btnSignature.render().setVisible(true); + this.btnSignature.on('click', _.bind(this.onBtnMenuClick, this)); + this.signatureSettings = new DE.Views.SignatureSettings(); + } + if (_.isUndefined(this.scroller)) { this.scroller = new Common.UI.Scroller({ el: $(this.el).find('.right-panel'), @@ -223,6 +239,7 @@ define([ this.shapeSettings.setApi(api).on('editcomplete', _.bind( fire, this)); this.textartSettings.setApi(api).on('editcomplete', _.bind( fire, this)); if (this.mergeSettings) this.mergeSettings.setApi(api).on('editcomplete', _.bind( fire, this)); + if (this.signatureSettings) this.signatureSettings.setApi(api).on('editcomplete', _.bind( fire, this)); }, setMode: function(mode) { @@ -303,6 +320,7 @@ define([ txtShapeSettings: 'Shape Settings', txtTextArtSettings: 'Text Art Settings', txtChartSettings: 'Chart Settings', - txtMailMergeSettings: 'Mail Merge Settings' + txtMailMergeSettings: 'Mail Merge Settings', + txtSignatureSettings: 'Signature Settings' }, DE.Views.RightMenu || {})); }); \ No newline at end of file diff --git a/apps/documenteditor/main/app/view/SignatureSettings.js b/apps/documenteditor/main/app/view/SignatureSettings.js new file mode 100644 index 000000000..d05122ec3 --- /dev/null +++ b/apps/documenteditor/main/app/view/SignatureSettings.js @@ -0,0 +1,288 @@ +/* + * + * (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 + * +*/ +/** + * SignatureSettings.js + * + * Created by Julia Radzhabova on 5/24/17 + * Copyright (c) 2017 Ascensio System SIA. All rights reserved. + * + */ + +define([ + 'text!documenteditor/main/app/template/SignatureSettings.template', + 'jquery', + 'underscore', + 'backbone', + 'common/main/lib/component/Button', + 'common/main/lib/view/SignDialog', + 'common/main/lib/view/SignSettingsDialog' +], function (menuTemplate, $, _, Backbone) { + 'use strict'; + + DE.Views.SignatureSettings = Backbone.View.extend(_.extend({ + el: '#id-signature-settings', + + // Compile our stats template + template: _.template(menuTemplate), + + // Delegated events for creating new items, and clearing completed ones. + events: { + }, + + options: { + alias: 'SignatureSettings' + }, + + initialize: function () { + var me = this; + + this._initSettings = true; + + this._state = { + DisabledControls: false, + requestedSignatures: undefined, + validSignatures: undefined, + invalidSignatures: undefined + }; + this._locked = false; + this.lockedControls = []; + + this._noApply = false; + this._originalProps = null; + + this.templateRequested = _.template([ + '', + '', + '', + '<% _.each(signatures, function(item) { %>', + '', + '', + '', + '', + '<% }); %>', + '
    ', + '' + ].join('')); + + this.templateValid = _.template([ + '', + '', + '', + '<% _.each(signatures, function(item) { %>', + '', + '', + '', + '', + '', + '<% }); %>', + '
    <%= Common.Utils.String.htmlEncode(item.name) %>
    <%= Common.Utils.String.htmlEncode(item.date) %>
    ', + '' + ].join('')); + + this.render(); + }, + + render: function () { + this.$el.html(this.template({ + scope: this + })); + + this.btnAddInvisibleSign = new Common.UI.Button({ + el: this.$el.find('#signature-invisible-sign') + }); + this.btnAddInvisibleSign.on('click', _.bind(this.addInvisibleSign, this)); + this.lockedControls.push(this.btnAddInvisibleSign); + + this.btnAddVisibleSign = new Common.UI.Button({ + el: this.$el.find('#signature-visible-sign') + }); + this.btnAddVisibleSign.on('click', _.bind(this.addVisibleSign, this)); + this.lockedControls.push(this.btnAddVisibleSign); + + this.cntRequestedSign = $('#signature-requested-sign'); + this.cntValidSign = $('#signature-valid-sign'); + this.cntInvalidSign = $('#signature-invalid-sign'); + }, + + setApi: function(api) { + this.api = api; + if (this.api) { + this.api.asc_registerCallback('asc_onUpdateSignatures', _.bind(this.onUpdateSignatures, this)); + } + return this; + }, + + createDelayedControls: function() { + this._initSettings = false; + }, + + ChangeSettings: function(props) { + if (this._initSettings) + this.createDelayedControls(); + + if (!this._state.requestedSignatures || !this._state.validSignatures || !this._state.invalidSignatures) { + this.onUpdateSignatures(this.api.asc_getSignatures(), this.api.asc_getRequestSignatures()); + } + + this.disableControls(this._locked); + }, + + setLocked: function (locked) { + this._locked = locked; + }, + + disableControls: function(disable) { + if (this._initSettings) return; + + if (this._state.DisabledControls!==disable) { + this._state.DisabledControls = disable; + _.each(this.lockedControls, function(item) { + item.setDisabled(disable); + }); + this.$linksSign.toggleClass('disabled', disable); + this.$linksView.toggleClass('disabled', disable); + } + }, + + setMode: function(mode) { + this.mode = mode; + }, + + onUpdateSignatures: function(valid, requested){ + var me = this; + me._state.requestedSignatures = []; + me._state.validSignatures = []; + me._state.invalidSignatures = []; + + _.each(requested, function(item, index){ + me._state.requestedSignatures.push({name: item.asc_getSigner1(), guid: item.asc_getGuid()}); + }); + _.each(valid, function(item, index){ + var sign = {name: item.asc_getSigner1(), guid: item.asc_getId(), date: '18/05/2017'}; + (item.asc_getValid()==0) ? me._state.validSignatures.push(sign) : me._state.invalidSignatures.push(sign); + }); + this.cntRequestedSign.html(this.templateRequested({signatures: me._state.requestedSignatures, header: this.strRequested})); + this.cntValidSign.html(this.templateValid({signatures: me._state.validSignatures, header: this.strValid})); + this.cntInvalidSign.html(this.templateValid({signatures: me._state.invalidSignatures, header: this.strInvalid})); + // this.cntRequestedSign.html(this.templateRequested({signatures: [{name: 'Hammish Mitchell', guid: '123'}, {name: 'Someone Somewhere', guid: '123'}, {name: 'Mary White', guid: '123'}, {name: 'John Black', guid: '123'}], header: this.strRequested})); + // this.cntValidSign.html(this.templateValid({signatures: [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}], header: this.strValid})); + // this.cntInvalidSign.html(this.templateValid({signatures: [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}], header: this.strInvalid})); + + this.$linksSign = $('.signature-sign-link', this.$el); + this.$linksView = $('.signature-view-link', this.$el); + this.$el.on('click', '.signature-sign-link', _.bind(this.onSign, this)); + this.$el.on('click', '.signature-view-link', _.bind(this.onViewSignature, this)); + }, + + addVisibleSign: function(btn) { + var me = this, + win = new Common.Views.SignSettingsDialog({ + handler: function(dlg, result) { + if (result == 'ok') { + me.api.asc_AddSignatureLine2(dlg.getSettings()); + } + me.fireEvent('editcomplete', me); + } + }); + + win.show(); + }, + + addInvisibleSign: function(btn) { + var me = this, + win = new Common.Views.SignDialog({ + api: me.api, + signType: 'invisible', + handler: function(dlg, result) { + if (result == 'ok') { + var props = dlg.getSettings(); + me.api.asc_Sign(props.certificateId); + } + me.fireEvent('editcomplete', me); + } + }); + + win.show(); + }, + + onSign: function(event) { + var me = this, + target = $(event.currentTarget); + + if (target.hasClass('disabled')) return; + + if (_.isUndefined(me.fontStore)) { + me.fontStore = new Common.Collections.Fonts(); + var fonts = DE.getController('Toolbar').getView('Toolbar').cmbFontName.store.toJSON(); + var arr = []; + _.each(fonts, function(font, index){ + if (!font.cloneid) { + arr.push(_.clone(font)); + } + }); + me.fontStore.add(arr); + } + + var win = new Common.Views.SignDialog({ + api: me.api, + signType: 'visible', + fontStore: me.fontStore, + handler: function(dlg, result) { + if (result == 'ok') { + var props = dlg.getSettings(); + me.api.asc_Sign(props.certificateId, target.attr('data-value'), props.images[0], props.images[1]); + } + me.fireEvent('editcomplete', me); + } + }); + win.show(); + }, + + onViewSignature: function(event) { + var target = $(event.currentTarget); + if (target.hasClass('disabled')) return; + + this.api.asc_ViewCertificate(target.attr('data-value')); + }, + + strSignature: 'Signature', + strInvisibleSign: 'Add invisible digital signature', + strVisibleSign: 'Add visible signature', + strRequested: 'Requested signatures', + strValid: 'Valid signatures', + strInvalid: 'Invalid signatures', + strSign: 'Sign', + strView: 'View' + + }, DE.Views.SignatureSettings || {})); +}); \ No newline at end of file diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index 630f89fa0..4b4e0df75 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -228,6 +228,32 @@ "Common.Views.ReviewChangesDialog.txtReject": "Reject", "Common.Views.ReviewChangesDialog.txtRejectAll": "Reject All Changes", "Common.Views.ReviewChangesDialog.txtRejectCurrent": "Reject Current Change", + "Common.Views.SignDialog.textTitle": "Sign Document", + "Common.Views.SignDialog.textPurpose": "Purpose for signing this document", + "Common.Views.SignDialog.textCertificate": "Certificate", + "Common.Views.SignDialog.textValid": "Valid from %1 to %2", + "Common.Views.SignDialog.textChange": "Change", + "Common.Views.SignDialog.cancelButtonText": "Cancel", + "Common.Views.SignDialog.okButtonText": "Ok", + "Common.Views.SignDialog.textInputName": "Input signer name", + "Common.Views.SignDialog.textUseImage": "or click 'Select Image' to use a picture as signature", + "Common.Views.SignDialog.textSelectImage": "Select Image", + "Common.Views.SignDialog.textSignature": "Signature looks as", + "Common.Views.SignDialog.tipFontName": "Font Name", + "Common.Views.SignDialog.tipFontSize": "Font Size", + "Common.Views.SignDialog.textBold": "Bold", + "Common.Views.SignDialog.textItalic": "Italic", + "Common.Views.SignSettingsDialog.textInfo": "Signer Info", + "Common.Views.SignSettingsDialog.textInfoName": "Name", + "Common.Views.SignSettingsDialog.textInfoTitle": "Signer Title", + "Common.Views.SignSettingsDialog.textInfoEmail": "E-mail", + "Common.Views.SignSettingsDialog.textInstructions": "Instructions for Signer", + "Common.Views.SignSettingsDialog.cancelButtonText": "Cancel", + "Common.Views.SignSettingsDialog.okButtonText": "Ok", + "Common.Views.SignSettingsDialog.txtEmpty": "This field is required", + "Common.Views.SignSettingsDialog.textAllowComment": "Allow signer to add comment in the signature dialog", + "Common.Views.SignSettingsDialog.textShowDate": "Show sign date in signature line", + "Common.Views.SignSettingsDialog.textTitle": "Signature Settings", "DE.Controllers.LeftMenu.leavePageText": "All unsaved changes in this document will be lost.
    Click \"Cancel\" then \"Save\" to save them. Click \"OK\" to discard all the unsaved changes.", "DE.Controllers.LeftMenu.newDocumentTitle": "Unnamed document", "DE.Controllers.LeftMenu.notcriticalErrorTitle": "Warning", @@ -963,6 +989,7 @@ "DE.Views.FileMenu.btnSettingsCaption": "Advanced Settings...", "DE.Views.FileMenu.btnToEditCaption": "Edit Document", "DE.Views.FileMenu.textDownload": "Download", + "DE.Views.FileMenu.btnProtectCaption": "Protect\\Sign", "DE.Views.FileMenuPanels.CreateNew.fromBlankText": "From Blank", "DE.Views.FileMenuPanels.CreateNew.fromTemplateText": "From Template", "DE.Views.FileMenuPanels.CreateNew.newDescriptionText": "Create a new blank text document which you will be able to style and format after it is created during the editing. Or choose one of the templates to start a document of a certain type or purpose where some styles have already been pre-applied.", @@ -1029,6 +1056,13 @@ "DE.Views.HeaderFooterSettings.textBottomCenter": "Bottom center", "DE.Views.HeaderFooterSettings.textBottomLeft": "Bottom left", "DE.Views.HeaderFooterSettings.textBottomRight": "Bottom right", + "DE.Views.FileMenuPanels.ProtectDoc.strProtect": "Protect Document", + "DE.Views.FileMenuPanels.ProtectDoc.strInvisibleSign": "Add invisible digital signature", + "DE.Views.FileMenuPanels.ProtectDoc.strVisibleSign": "Add visible signature", + "DE.Views.FileMenuPanels.ProtectDoc.strRequested": "Requested signatures", + "DE.Views.FileMenuPanels.ProtectDoc.strValid": "Valid signatures", + "DE.Views.FileMenuPanels.ProtectDoc.strInvalid": "Invalid signatures", + "DE.Views.FileMenuPanels.ProtectDoc.strSignature": "Signature", "DE.Views.HeaderFooterSettings.textDiffFirst": "Different first page", "DE.Views.HeaderFooterSettings.textDiffOdd": "Different odd and even pages", "DE.Views.HeaderFooterSettings.textHeaderFromBottom": "Footer from Bottom", @@ -1307,6 +1341,7 @@ "DE.Views.RightMenu.txtShapeSettings": "Shape settings", "DE.Views.RightMenu.txtTableSettings": "Table settings", "DE.Views.RightMenu.txtTextArtSettings": "Text Art settings", + "DE.Views.RightMenu.txtSignatureSettings": "Signature Settings", "DE.Views.ShapeSettings.strBackground": "Background color", "DE.Views.ShapeSettings.strChange": "Change Autoshape", "DE.Views.ShapeSettings.strColor": "Color", @@ -1357,6 +1392,14 @@ "DE.Views.ShapeSettings.txtTight": "Tight", "DE.Views.ShapeSettings.txtTopAndBottom": "Top and bottom", "DE.Views.ShapeSettings.txtWood": "Wood", + "DE.Views.SignatureSettings.strSignature": "Signature", + "DE.Views.SignatureSettings.strInvisibleSign": "Add invisible digital signature", + "DE.Views.SignatureSettings.strVisibleSign": "Add visible signature", + "DE.Views.SignatureSettings.strRequested": "Requested signatures", + "DE.Views.SignatureSettings.strValid": "Valid signatures", + "DE.Views.SignatureSettings.strInvalid": "Invalid signatures", + "DE.Views.SignatureSettings.strSign": "Sign", + "DE.Views.SignatureSettings.strView": "View", "DE.Views.Statusbar.goToPageText": "Go to Page", "DE.Views.Statusbar.pageIndexText": "Page {0} of {1}", "DE.Views.Statusbar.tipFitPage": "Fit to page", diff --git a/apps/documenteditor/main/resources/img/toolbar-menu.png b/apps/documenteditor/main/resources/img/toolbar-menu.png index 8eda1c7d83ea6fba5c34446026b5b6221d9ae4cf..c7d05082ff704b8dbc924b1982c857170e727579 100644 GIT binary patch literal 15274 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 E0HALQ82|tP literal 54548 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 Ur?{>SH-LZg(n?Y#FARMDKj0co00000 diff --git a/apps/documenteditor/main/resources/less/leftmenu.less b/apps/documenteditor/main/resources/less/leftmenu.less index ee490c488..faf5a8bc4 100644 --- a/apps/documenteditor/main/resources/less/leftmenu.less +++ b/apps/documenteditor/main/resources/less/leftmenu.less @@ -77,4 +77,32 @@ button.notify .btn-menu-comments {background-position: -0*@toolbar-icon-size -60 -webkit-transform: rotate(180deg); -o-transform: rotate(180deg); transform: rotate(180deg); +} + +#panel-protect { + #file-menu-panel & { + padding: 30px 30px; + } + + + button { + display: block; + width: auto; + margin-top: 20px; + } + + label { + font: 12px tahoma, arial, verdana, sans-serif; + } + + .header { + font-weight: bold; + margin: 30px 0 10px; + } + + table { + td { + padding: 5px 5px; + } + } } \ 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 2983c04f0..f4ea5aab2 100644 --- a/apps/documenteditor/main/resources/less/rightmenu.less +++ b/apps/documenteditor/main/resources/less/rightmenu.less @@ -105,6 +105,7 @@ /*menuTextArt*/ .button-normal-icon(btn-menu-textart, 54, @toolbar-icon-size); +.button-normal-icon(btn-menu-signature, 78, @toolbar-icon-size); .button-otherstates-icon2(btn-category, @toolbar-icon-size); diff --git a/apps/documenteditor/main/resources/less/toolbar.less b/apps/documenteditor/main/resources/less/toolbar.less index 171114fe6..af45fb7fb 100644 --- a/apps/documenteditor/main/resources/less/toolbar.less +++ b/apps/documenteditor/main/resources/less/toolbar.less @@ -312,12 +312,6 @@ .button-normal-icon(mmerge-first, 74, @toolbar-icon-size); //.button-normal-icon(btn-columns, 75, @toolbar-icon-size); //.button-normal-icon(btn-pagemargins, 76, @toolbar-icon-size); -//.button-normal-icon(btn-img-frwd, 83, @toolbar-icon-size); -//.button-normal-icon(btn-img-bkwd, 84, @toolbar-icon-size); -//.button-normal-icon(btn-img-wrap, 85, @toolbar-icon-size); -//.button-normal-icon(btn-img-group, 86, @toolbar-icon-size); -//.button-normal-icon(btn-img-align, 87, @toolbar-icon-size); -.button-normal-icon(btn-goback, 88, @toolbar-icon-size); //.button-normal-icon(btn-insertimage, 17, @toolbar-icon-size); //.button-normal-icon(btn-inserttable, 18, @toolbar-icon-size); @@ -328,11 +322,6 @@ //.button-normal-icon(btn-insertequation, 53, @toolbar-icon-size); //.button-normal-icon(btn-dropcap, 50, @toolbar-icon-size); //.button-normal-icon(btn-ic-doclang, 67, @toolbar-icon-size); -//.button-normal-icon(btn-notes, 78, @toolbar-icon-size); -//.button-normal-icon(review-prev, 79, @toolbar-icon-size); -//.button-normal-icon(review-next, 80, @toolbar-icon-size); -//.button-normal-icon(review-save, 81, @toolbar-icon-size); -//.button-normal-icon(review-deny, 82, @toolbar-icon-size); @menu-icon-size: 22px; .menu-icon-normal(mnu-wrap-inline, 0, @menu-icon-size); diff --git a/apps/presentationeditor/main/app/controller/LeftMenu.js b/apps/presentationeditor/main/app/controller/LeftMenu.js index 45e4e9550..2edbc567b 100644 --- a/apps/presentationeditor/main/app/controller/LeftMenu.js +++ b/apps/presentationeditor/main/app/controller/LeftMenu.js @@ -43,6 +43,7 @@ define([ 'core', 'common/main/lib/util/Shortcuts', + 'common/main/lib/view/SignDialog', 'presentationeditor/main/app/view/LeftMenu', 'presentationeditor/main/app/view/FileMenu' ], function () { @@ -83,7 +84,8 @@ define([ 'saveas:format': _.bind(this.clickSaveAsFormat, this), 'settings:apply': _.bind(this.applySettings, this), 'create:new': _.bind(this.onCreateNew, this), - 'recent:open': _.bind(this.onOpenRecent, this) + 'recent:open': _.bind(this.onOpenRecent, this), + 'signature:invisible': _.bind(this.addInvisibleSign, this) }, 'Toolbar': { 'file:settings': _.bind(this.clickToolbarSettings,this), @@ -533,18 +535,37 @@ define([ }, onPluginOpen: function(panel, type, action) { - if ( type == 'onboard' ) { - if ( action == 'open' ) { + if (type == 'onboard') { + if (action == 'open') { this.leftMenu.close(); this.leftMenu.btnThumbs.toggle(false, false); this.leftMenu.panelPlugins.show(); - this.leftMenu.onBtnMenuClick({pressed:true, options: {action: 'plugins'}}); + this.leftMenu.onBtnMenuClick({pressed: true, options: {action: 'plugins'}}); } else { this.leftMenu.close(); } } }, + addInvisibleSign: function(menu) { + var me = this, + win = new Common.Views.SignDialog({ + api: me.api, + signType: 'invisible', + handler: function(dlg, result) { + if (result == 'ok') { + var props = dlg.getSettings(); + me.api.asc_Sign(props.certificateId); + } + Common.NotificationCenter.trigger('edit:complete', me); + } + }); + + win.show(); + + menu.hide(); + }, + textNoTextFound : 'Text not found', newDocumentTitle : 'Unnamed document', requestEditRightsText : 'Requesting editing rights...' diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js index 9412332c1..4b1c88f24 100644 --- a/apps/presentationeditor/main/app/controller/Main.js +++ b/apps/presentationeditor/main/app/controller/Main.js @@ -787,6 +787,7 @@ define([ this.appOptions.forcesave = this.appOptions.canForcesave; this.appOptions.canEditComments= this.appOptions.isOffline || !(typeof (this.editorConfig.customization) == 'object' && this.editorConfig.customization.commentAuthorOnly); this.appOptions.trialMode = params.asc_getLicenseMode(); + this.appOptions.canProtect = this.appOptions.isDesktopApp && this.api.asc_isSignaturesSupport(); this._state.licenseWarning = (licType===Asc.c_oLicenseResult.Connections) && this.appOptions.canEdit && this.editorConfig.mode !== 'view'; diff --git a/apps/presentationeditor/main/app/controller/RightMenu.js b/apps/presentationeditor/main/app/controller/RightMenu.js index a625e3887..b9aa0bf20 100644 --- a/apps/presentationeditor/main/app/controller/RightMenu.js +++ b/apps/presentationeditor/main/app/controller/RightMenu.js @@ -79,6 +79,7 @@ define([ this._settings[Common.Utils.documentSettingsType.Shape] = {panelId: "id-shape-settings", panel: rightMenu.shapeSettings, btn: rightMenu.btnShape, hidden: 1, locked: false}; this._settings[Common.Utils.documentSettingsType.TextArt] = {panelId: "id-textart-settings", panel: rightMenu.textartSettings, btn: rightMenu.btnTextArt, hidden: 1, locked: false}; this._settings[Common.Utils.documentSettingsType.Chart] = {panelId: "id-chart-settings", panel: rightMenu.chartSettings, btn: rightMenu.btnChart, hidden: 1, locked: false}; + this._settings[Common.Utils.documentSettingsType.Signature] = {panelId: "id-signature-settings", panel: rightMenu.signatureSettings, btn: rightMenu.btnSignature, hidden: (rightMenu.signatureSettings) ? 0 : 1, props: {}, locked: false}; }, setApi: function(api) { @@ -97,7 +98,7 @@ define([ var panel = this._settings[type].panel; var props = this._settings[type].props; if (props && panel) - panel.ChangeSettings.call(panel, props); + panel.ChangeSettings.call(panel, (type==Common.Utils.documentSettingsType.Signature) ? undefined : props); } Common.NotificationCenter.trigger('layout:changed', 'rightmenu'); this.rightmenu.fireEvent('editcomplete', this.rightmenu); @@ -109,12 +110,14 @@ define([ var needhide = true; for (var i=0; i0) ? 0 : 1; + this._settings[Common.Utils.documentSettingsType.Signature].locked = false; for (i=0; i
  • +
  • @@ -29,4 +30,5 @@
    +
    \ No newline at end of file diff --git a/apps/presentationeditor/main/app/template/RightMenu.template b/apps/presentationeditor/main/app/template/RightMenu.template index baba70c3e..f4cfb2d7b 100644 --- a/apps/presentationeditor/main/app/template/RightMenu.template +++ b/apps/presentationeditor/main/app/template/RightMenu.template @@ -14,6 +14,8 @@
    +
    +
    @@ -24,5 +26,6 @@ +
    \ No newline at end of file diff --git a/apps/presentationeditor/main/app/template/SignatureSettings.template b/apps/presentationeditor/main/app/template/SignatureSettings.template new file mode 100644 index 000000000..b5b986dc7 --- /dev/null +++ b/apps/presentationeditor/main/app/template/SignatureSettings.template @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + +
    + +
    + +
    \ No newline at end of file diff --git a/apps/presentationeditor/main/app/view/DocumentHolder.js b/apps/presentationeditor/main/app/view/DocumentHolder.js index af797dd8c..7e5cd5083 100644 --- a/apps/presentationeditor/main/app/view/DocumentHolder.js +++ b/apps/presentationeditor/main/app/view/DocumentHolder.js @@ -38,6 +38,7 @@ define([ 'common/main/lib/util/utils', 'common/main/lib/component/Menu', 'common/main/lib/view/CopyWarningDialog', + 'common/main/lib/view/SignDialog', 'presentationeditor/main/app/view/HyperlinkSettingsDialog', // 'common/main/lib/view/InsertTableDialog', 'presentationeditor/main/app/view/ParagraphSettingsAdvanced', @@ -678,6 +679,36 @@ define([ } }; + var onSignatureClick = function(guid, width, height) { + if (_.isUndefined(me.fontStore)) { + me.fontStore = new Common.Collections.Fonts(); + var fonts = PE.getController('Toolbar').getView('Toolbar').cmbFontName.store.toJSON(); + var arr = []; + _.each(fonts, function(font, index){ + if (!font.cloneid) { + arr.push(_.clone(font)); + } + }); + me.fontStore.add(arr); + } + + var win = new Common.Views.SignDialog({ + api: me.api, + signType: 'visible', + fontStore: me.fontStore, + signSize: {width: width, height: height}, + handler: function(dlg, result) { + if (result == 'ok') { + var props = dlg.getSettings(); + me.api.asc_Sign(props.certificateId, guid, props.images[0], props.images[1]); + } + me.fireEvent('editcomplete', me); + } + }); + + win.show(); + }; + var onTextLanguage = function(langid) { me._currLang.id = langid; }; @@ -1518,6 +1549,7 @@ define([ me.api.asc_registerCallback('asc_onUpdateThemeIndex', _.bind(onApiUpdateThemeIndex, me)); me.api.asc_registerCallback('asc_onLockDocumentTheme', _.bind(onApiLockDocumentTheme, me)); me.api.asc_registerCallback('asc_onUnLockDocumentTheme', _.bind(onApiUnLockDocumentTheme, me)); + me.api.asc_registerCallback('asc_onSignatureClick', _.bind(onSignatureClick, me)); } return me; diff --git a/apps/presentationeditor/main/app/view/FileMenu.js b/apps/presentationeditor/main/app/view/FileMenu.js index e6d79d23d..d8c9fd30c 100644 --- a/apps/presentationeditor/main/app/view/FileMenu.js +++ b/apps/presentationeditor/main/app/view/FileMenu.js @@ -164,6 +164,12 @@ define([ this.miSaveAs, this.miPrint, this.miRename, + new Common.UI.MenuItem({ + el : $('#fm-btn-protect',this.el), + action : 'protect', + caption : this.btnProtectCaption, + canFocused: false + }), this.miRecent, this.miNew, new Common.UI.MenuItem({ @@ -228,7 +234,8 @@ define([ applyMode: function() { this.miPrint[this.mode.canPrint?'show':'hide'](); this.miRename[(this.mode.canRename && !this.mode.isDesktopApp) ?'show':'hide'](); - this.miRename.$el.find('+.devider')[!this.mode.isDisconnected?'show':'hide'](); + this.items[7][(this.mode.canProtect) ?'show':'hide'](); + this.items[7].$el.find('+.devider')[!this.mode.isDisconnected?'show':'hide'](); this.miRecent[this.mode.canOpenRecent?'show':'hide'](); this.miNew[this.mode.canCreateNew?'show':'hide'](); this.miNew.$el.find('+.devider')[this.mode.canCreateNew?'show':'hide'](); @@ -264,8 +271,10 @@ define([ } } - if (this.mode.targetApp == 'desktop') { + if (this.mode.canProtect) { this.$el.find('#fm-btn-create, #fm-btn-back, #fm-btn-create+.devider').hide(); + this.panels['protect'] = (new PE.Views.FileMenuPanels.ProtectDoc({menu:this})).render(); + this.panels['protect'].setMode(this.mode); } this.panels['help'].setLangConfig(this.mode.lang); @@ -288,6 +297,7 @@ define([ setApi: function(api) { this.api = api; + if (this.panels['protect']) this.panels['protect'].setApi(api); this.api.asc_registerCallback('asc_onDocumentName', _.bind(this.onDocumentName, this)); }, @@ -354,6 +364,7 @@ define([ btnSettingsCaption : 'Advanced Settings...', btnSaveAsCaption : 'Save as', btnRenameCaption : 'Rename...', - btnCloseMenuCaption : 'Close Menu' + btnCloseMenuCaption : 'Close Menu', + btnProtectCaption: 'Protect\\Sign' }, PE.Views.FileMenu || {})); }); diff --git a/apps/presentationeditor/main/app/view/FileMenuPanels.js b/apps/presentationeditor/main/app/view/FileMenuPanels.js index 4aae8916d..22b38dbbf 100644 --- a/apps/presentationeditor/main/app/view/FileMenuPanels.js +++ b/apps/presentationeditor/main/app/view/FileMenuPanels.js @@ -866,4 +866,102 @@ define([ } } }); + + PE.Views.FileMenuPanels.ProtectDoc = Common.UI.BaseView.extend(_.extend({ + el: '#panel-protect', + menu: undefined, + + template: _.template([ + '', + '', + '
    ', + '
    ' + ].join('')), + + initialize: function(options) { + Common.UI.BaseView.prototype.initialize.call(this,arguments); + + this.menu = options.menu; + + this.templateValid = _.template([ + '', + '', + '<% _.each(signatures, function(item) { %>', + '', + '', + '', + '', + '<% }); %>', + '
    <%= Common.Utils.String.htmlEncode(item.name) %><%= Common.Utils.String.htmlEncode(item.date) %>
    ' + ].join('')); + }, + + render: function() { + $(this.el).html(this.template({scope: this})); + + this.btnAddInvisibleSign = new Common.UI.Button({ + el: '#fms-btn-invisible-sign' + }); + this.btnAddInvisibleSign.on('click', _.bind(this.addInvisibleSign, this)); + + this.lblSignHeader = $('#id-fms-lbl-sign-header', this.$el); + + this.cntValidSign = $('#id-fms-valid-sign'); + this.cntInvalidSign = $('#id-fms-invalid-sign'); + + if (_.isUndefined(this.scroller)) { + this.scroller = new Common.UI.Scroller({ + el: $(this.el), + suppressScrollX: true + }); + } + + return this; + }, + + show: function() { + Common.UI.BaseView.prototype.show.call(this,arguments); + this.updateSignatures(); + }, + + setMode: function(mode) { + this.mode = mode; + if (!this.mode.isEdit) { + this.btnAddInvisibleSign.setVisible(false); + this.lblSignHeader.html(this.strSignature); + } + }, + + setApi: function(o) { + this.api = o; + return this; + }, + + addInvisibleSign: function() { + if (this.menu) + this.menu.fireEvent('signature:invisible', [this.menu]); + }, + + updateSignatures: function(){ + var valid = this.api.asc_getSignatures(), + valid_arr = [], invalid_arr = []; + + _.each(valid, function(item, index){ + var sign = {name: item.asc_getSigner1(), date: '18/05/2017'}; + (item.asc_getValid()==0) ? valid_arr.push(sign) : invalid_arr.push(sign); + }); + this.cntValidSign.html(this.templateValid({signatures: valid_arr, header: this.strValid})); + this.cntInvalidSign.html(this.templateValid({signatures: invalid_arr, header: this.strInvalid})); + // this.cntValidSign.html(this.templateValid({signatures: [{name: 'Hammish Mitchell', date: '18/05/2017'}, {name: 'Someone Somewhere', date: '18/05/2017'}], header: this.strValid})); + // this.cntInvalidSign.html(this.templateValid({signatures: [{name: 'Mary White', date: '18/05/2017'}, {name: 'John Black', date: '18/05/2017'}], header: this.strInvalid})); + }, + + strProtect: 'Protect Document', + strInvisibleSign: 'Add invisible digital signature', + strValid: 'Valid signatures', + strInvalid: 'Invalid signatures', + strSignature: 'Signature' + + }, PE.Views.FileMenuPanels.ProtectDoc || {})); + }); diff --git a/apps/presentationeditor/main/app/view/RightMenu.js b/apps/presentationeditor/main/app/view/RightMenu.js index fe1d4583a..9f12f3b79 100644 --- a/apps/presentationeditor/main/app/view/RightMenu.js +++ b/apps/presentationeditor/main/app/view/RightMenu.js @@ -56,6 +56,7 @@ define([ 'presentationeditor/main/app/view/ShapeSettings', 'presentationeditor/main/app/view/SlideSettings', 'presentationeditor/main/app/view/TextArtSettings', + 'presentationeditor/main/app/view/SignatureSettings', 'common/main/lib/component/Scroller' ], function (menuTemplate, $, _, Backbone) { 'use strict'; @@ -143,7 +144,7 @@ define([ return this; }, - render: function () { + render: function (mode) { var el = $(this.el); this.trigger('render:before', this); @@ -178,6 +179,21 @@ define([ this.shapeSettings = new PE.Views.ShapeSettings(); this.textartSettings = new PE.Views.TextArtSettings(); + if (mode && mode.canProtect) { + this.btnSignature = new Common.UI.Button({ + hint: this.txtSignatureSettings, + asctype: Common.Utils.documentSettingsType.Signature, + enableToggle: true, + disabled: true, + toggleGroup: 'tabpanelbtnsGroup' + }); + this._settings[Common.Utils.documentSettingsType.Signature] = {panel: "id-signature-settings", btn: this.btnSignature}; + + this.btnSignature.el = $('#id-right-menu-signature'); this.btnSignature.render().setVisible(true); + this.btnSignature.on('click', _.bind(this.onBtnMenuClick, this)); + this.signatureSettings = new PE.Views.SignatureSettings(); + } + if (_.isUndefined(this.scroller)) { this.scroller = new Common.UI.Scroller({ el: $(this.el).find('.right-panel'), @@ -206,6 +222,7 @@ define([ this.tableSettings.setApi(api).on('editcomplete', _.bind( fire, this)); this.shapeSettings.setApi(api).on('editcomplete', _.bind( fire, this)); this.textartSettings.setApi(api).on('editcomplete', _.bind( fire, this)); + if (this.signatureSettings) this.signatureSettings.setApi(api).on('editcomplete', _.bind( fire, this)); }, setMode: function(mode) { @@ -299,6 +316,7 @@ define([ txtShapeSettings: 'Shape Settings', txtTextArtSettings: 'Text Art Settings', txtSlideSettings: 'Slide Settings', - txtChartSettings: 'Chart Settings' + txtChartSettings: 'Chart Settings', + txtSignatureSettings: 'Signature Settings' }, PE.Views.RightMenu || {})); }); \ No newline at end of file diff --git a/apps/presentationeditor/main/app/view/SignatureSettings.js b/apps/presentationeditor/main/app/view/SignatureSettings.js new file mode 100644 index 000000000..7a9a52228 --- /dev/null +++ b/apps/presentationeditor/main/app/view/SignatureSettings.js @@ -0,0 +1,207 @@ +/* + * + * (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 + * +*/ +/** + * SignatureSettings.js + * + * Created by Julia Radzhabova on 5/24/17 + * Copyright (c) 2017 Ascensio System SIA. All rights reserved. + * + */ + +define([ + 'text!presentationeditor/main/app/template/SignatureSettings.template', + 'jquery', + 'underscore', + 'backbone', + 'common/main/lib/component/Button', + 'common/main/lib/view/SignDialog' +], function (menuTemplate, $, _, Backbone) { + 'use strict'; + + PE.Views.SignatureSettings = Backbone.View.extend(_.extend({ + el: '#id-signature-settings', + + // Compile our stats template + template: _.template(menuTemplate), + + // Delegated events for creating new items, and clearing completed ones. + events: { + }, + + options: { + alias: 'SignatureSettings' + }, + + initialize: function () { + var me = this; + + this._initSettings = true; + + this._state = { + DisabledControls: false, + validSignatures: undefined, + invalidSignatures: undefined + }; + this._locked = false; + this.lockedControls = []; + + this._noApply = false; + this._originalProps = null; + + this.templateValid = _.template([ + '', + '', + '', + '<% _.each(signatures, function(item) { %>', + '', + '', + '', + '', + '', + '<% }); %>', + '
    <%= Common.Utils.String.htmlEncode(item.name) %>
    <%= Common.Utils.String.htmlEncode(item.date) %>
    ', + '' + ].join('')); + + this.render(); + }, + + render: function () { + this.$el.html(this.template({ + scope: this + })); + + this.btnAddInvisibleSign = new Common.UI.Button({ + el: this.$el.find('#signature-invisible-sign') + }); + this.btnAddInvisibleSign.on('click', _.bind(this.addInvisibleSign, this)); + this.lockedControls.push(this.btnAddInvisibleSign); + + this.cntValidSign = $('#signature-valid-sign'); + this.cntInvalidSign = $('#signature-invalid-sign'); + }, + + setApi: function(api) { + this.api = api; + if (this.api) { + this.api.asc_registerCallback('asc_onUpdateSignatures', _.bind(this.onUpdateSignatures, this)); + } + return this; + }, + + createDelayedControls: function() { + this._initSettings = false; + }, + + ChangeSettings: function(props) { + if (this._initSettings) + this.createDelayedControls(); + + if (!this._state.validSignatures || !this._state.invalidSignatures) { + this.onUpdateSignatures(this.api.asc_getSignatures()); + } + + this.disableControls(this._locked); + }, + + setLocked: function (locked) { + this._locked = locked; + }, + + disableControls: function(disable) { + if (this._initSettings) return; + + if (this._state.DisabledControls!==disable) { + this._state.DisabledControls = disable; + _.each(this.lockedControls, function(item) { + item.setDisabled(disable); + }); + this.$linksSign.toggleClass('disabled', disable); + this.$linksView.toggleClass('disabled', disable); + } + }, + + setMode: function(mode) { + this.mode = mode; + }, + + onUpdateSignatures: function(valid){ + var me = this; + me._state.validSignatures = []; + me._state.invalidSignatures = []; + + _.each(valid, function(item, index){ + var sign = {name: item.asc_getSigner1(), guid: item.asc_getId(), date: '18/05/2017'}; + (item.asc_getValid()==0) ? me._state.validSignatures.push(sign) : me._state.invalidSignatures.push(sign); + }); + this.cntValidSign.html(this.templateValid({signatures: me._state.validSignatures, header: this.strValid})); + this.cntInvalidSign.html(this.templateValid({signatures: me._state.invalidSignatures, header: this.strInvalid})); + // this.cntValidSign.html(this.templateValid({signatures: [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}], header: this.strValid})); + // this.cntInvalidSign.html(this.templateValid({signatures: [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}], header: this.strInvalid})); + + this.$linksView = $('.signature-view-link', this.$el); + this.$el.on('click', '.signature-view-link', _.bind(this.onViewSignature, this)); + }, + + addInvisibleSign: function(btn) { + var me = this, + win = new Common.Views.SignDialog({ + api: me.api, + signType: 'invisible', + handler: function(dlg, result) { + if (result == 'ok') { + var props = dlg.getSettings(); + me.api.asc_Sign(props.certificateId); + } + me.fireEvent('editcomplete', me); + } + }); + + win.show(); + }, + + onViewSignature: function(event) { + var target = $(event.currentTarget); + if (target.hasClass('disabled')) return; + + this.api.asc_ViewCertificate(target.attr('data-value')); + }, + + strSignature: 'Signature', + strInvisibleSign: 'Add invisible digital signature', + strValid: 'Valid signatures', + strInvalid: 'Invalid signatures', + strView: 'View' + + }, PE.Views.SignatureSettings || {})); +}); \ No newline at end of file diff --git a/apps/presentationeditor/main/app/view/Viewport.js b/apps/presentationeditor/main/app/view/Viewport.js index e7da2ea5f..e1be9b2d2 100644 --- a/apps/presentationeditor/main/app/view/Viewport.js +++ b/apps/presentationeditor/main/app/view/Viewport.js @@ -123,7 +123,7 @@ define([ }, applyEditorMode: function() { - PE.getController('RightMenu').getView('RightMenu').render(); + PE.getController('RightMenu').getView('RightMenu').render(this.mode); if ( Common.localStorage.getBool('pe-hidden-status') ) PE.getController('Statusbar').getView('Statusbar').setVisible(false); diff --git a/apps/presentationeditor/main/locale/en.json b/apps/presentationeditor/main/locale/en.json index 30ef68240..72032e2bf 100644 --- a/apps/presentationeditor/main/locale/en.json +++ b/apps/presentationeditor/main/locale/en.json @@ -126,6 +126,32 @@ "Common.Views.RenameDialog.okButtonText": "Ok", "Common.Views.RenameDialog.textName": "File name", "Common.Views.RenameDialog.txtInvalidName": "The file name cannot contain any of the following characters: ", + "Common.Views.SignDialog.textTitle": "Sign Document", + "Common.Views.SignDialog.textPurpose": "Purpose for signing this document", + "Common.Views.SignDialog.textCertificate": "Certificate", + "Common.Views.SignDialog.textValid": "Valid from %1 to %2", + "Common.Views.SignDialog.textChange": "Change", + "Common.Views.SignDialog.cancelButtonText": "Cancel", + "Common.Views.SignDialog.okButtonText": "Ok", + "Common.Views.SignDialog.textInputName": "Input signer name", + "Common.Views.SignDialog.textUseImage": "or click 'Select Image' to use a picture as signature", + "Common.Views.SignDialog.textSelectImage": "Select Image", + "Common.Views.SignDialog.textSignature": "Signature looks as", + "Common.Views.SignDialog.tipFontName": "Font Name", + "Common.Views.SignDialog.tipFontSize": "Font Size", + "Common.Views.SignDialog.textBold": "Bold", + "Common.Views.SignDialog.textItalic": "Italic", + "Common.Views.SignSettingsDialog.textInfo": "Signer Info", + "Common.Views.SignSettingsDialog.textInfoName": "Name", + "Common.Views.SignSettingsDialog.textInfoTitle": "Signer Title", + "Common.Views.SignSettingsDialog.textInfoEmail": "E-mail", + "Common.Views.SignSettingsDialog.textInstructions": "Instructions for Signer", + "Common.Views.SignSettingsDialog.cancelButtonText": "Cancel", + "Common.Views.SignSettingsDialog.okButtonText": "Ok", + "Common.Views.SignSettingsDialog.txtEmpty": "This field is required", + "Common.Views.SignSettingsDialog.textAllowComment": "Allow signer to add comment in the signature dialog", + "Common.Views.SignSettingsDialog.textShowDate": "Show sign date in signature line", + "Common.Views.SignSettingsDialog.textTitle": "Signature Settings", "PE.Controllers.LeftMenu.newDocumentTitle": "Unnamed presentation", "PE.Controllers.LeftMenu.requestEditRightsText": "Requesting editing rights...", "PE.Controllers.LeftMenu.textNoTextFound": "The data you have been searching for could not be found. Please adjust your search options.", @@ -817,6 +843,7 @@ "PE.Views.FileMenu.btnSaveCaption": "Save", "PE.Views.FileMenu.btnSettingsCaption": "Advanced Settings...", "PE.Views.FileMenu.btnToEditCaption": "Edit Presentation", + "PE.Views.FileMenu.btnProtectCaption": "Protect\\Sign", "PE.Views.FileMenuPanels.CreateNew.fromBlankText": "From Blank", "PE.Views.FileMenuPanels.CreateNew.fromTemplateText": "From Template", "PE.Views.FileMenuPanels.CreateNew.newDescriptionText": "Create a new blank presentation which you will be able to style and format after it is created during the editing. Or choose one of the templates to start a presentation of a certain type or purpose where some styles have already been pre-applied.", @@ -865,6 +892,11 @@ "PE.Views.FileMenuPanels.Settings.txtLast": "View Last", "PE.Views.FileMenuPanels.Settings.txtPt": "Point", "PE.Views.FileMenuPanels.Settings.txtSpellCheck": "Spell Checking", + "PE.Views.FileMenuPanels.ProtectDoc.strProtect": "Protect Document", + "PE.Views.FileMenuPanels.ProtectDoc.strInvisibleSign": "Add invisible digital signature", + "PE.Views.FileMenuPanels.ProtectDoc.strValid": "Valid signatures", + "PE.Views.FileMenuPanels.ProtectDoc.strInvalid": "Invalid signatures", + "PE.Views.FileMenuPanels.ProtectDoc.strSignature": "Signature", "PE.Views.HyperlinkSettingsDialog.cancelButtonText": "Cancel", "PE.Views.HyperlinkSettingsDialog.okButtonText": "OK", "PE.Views.HyperlinkSettingsDialog.strDisplay": "Display", @@ -964,6 +996,7 @@ "PE.Views.RightMenu.txtSlideSettings": "Slide settings", "PE.Views.RightMenu.txtTableSettings": "Table settings", "PE.Views.RightMenu.txtTextArtSettings": "Text Art settings", + "PE.Views.RightMenu.txtSignatureSettings": "Signature Settings", "PE.Views.ShapeSettings.strBackground": "Background color", "PE.Views.ShapeSettings.strChange": "Change Autoshape", "PE.Views.ShapeSettings.strColor": "Color", @@ -1006,6 +1039,11 @@ "PE.Views.ShapeSettings.txtNoBorders": "No Line", "PE.Views.ShapeSettings.txtPapyrus": "Papyrus", "PE.Views.ShapeSettings.txtWood": "Wood", + "PE.Views.SignatureSettings.strSignature": "Signature", + "PE.Views.SignatureSettings.strInvisibleSign": "Add invisible digital signature", + "PE.Views.SignatureSettings.strValid": "Valid signatures", + "PE.Views.SignatureSettings.strInvalid": "Invalid signatures", + "PE.Views.SignatureSettings.strView": "View", "PE.Views.ShapeSettingsAdvanced.cancelButtonText": "Cancel", "PE.Views.ShapeSettingsAdvanced.okButtonText": "OK", "PE.Views.ShapeSettingsAdvanced.strColumns": "Columns", diff --git a/apps/presentationeditor/main/resources/img/toolbar-menu.png b/apps/presentationeditor/main/resources/img/toolbar-menu.png index 2c5504c88d64abf71b6a93898099263ada2bb170..9e974f07a30b8bbde7b00ce2890de55dab181351 100644 GIT binary patch literal 13359 zcmY*=2S5`|x3-2FdXe6wi}a32QIU>dh0uwB^xiw61*L-qcqtJ9Q2_}>inP#CkSZbc zgen3OdN2Y0==**5-v8|G%yZ71o!KdS=FDvJ{JyC^JqUt) zQ<6|0bEWI0ONz&acW*xqo!wrreGxBrCH4UaM`R$Ex6-ez^lrI>vPZjj>HW2+UkVMr zcLQ!Nje)a8(pEsz%p4iBtZIwC3=R$sn1z+5%XD-^CnRzvND(1HPe(^rNUg>!Cntxq zR$b05*$^?z7BOUgu=3m84D*A?dm0OYKvr&&?i44ZOm{-Q4b&oKuDx6=m<8fSy&io&VjGD&`RL2u7Luq5gEKVrxpVh7ui<%GmlZEJdvlEYA%nA45zBW z*yu;i+ePoI;fY~U!#4T4fCiY20W;wCXQ3e|O;jP|$c@)wbS=t2)`H6tiaqG1nuJ9U zZ9E)Wyu?ddooS^$3?y}h!~-P1JN95&^8qP8Ya4wH4IBsoPaF;co?wt03UXx73kfeg zFDj#89nqXnI6 zg=fTHJjtL?!jknH!+UP8P&`(XdFt*!AgRmoOSY9i0m(`SCHk1O&@AG8a$(?=a#`t~ ze%ebH?^N3EP=+z9SeU(ET;ZbBq-gAWcEq2-bZ3wqcZR#+Xl9&Kf86kLj%Sf^?jLe_ zgtoq{^vgvs zw&1No6dMD4vI-H-*Jz8L%<#)x7}*HvG>}p z#1(`}B&hD8C!d<7X#N?H37J1w{7dQcl^ctL6mplF6;Z$)Bcyi*` zlI}_jQ!|;(<^%A~0it|`H=4gOu&`$h(IJXE@P#z{Olj$0Hn0G{r4La_$TdW++BkY)m&q03xAO=vwF5veLCysO9V}{bmLLc?E@Ux-pb~T_iA;mqH0-D2bld3@K zig;hhN|U@M^+G>cfP?IhI~@3|`S64tfOechaelvV{`_p#*F`L7fnv-{o?9JTd@*c zWN?50B+99kzKy3idk?SI(}F1XRE@32{-}a%bva_i<&xlo!R@L4VMfL4irm_Wf$_o^ zf6gz`jq>#LxJqd{j_NqHj8&rZ(chYXVB7C`9)bk5_24g(=6Y^Au!V4D)Cd+*2>Zd5 zaRRuw-s5Q47&V@%?P_g1TvRFDS+g(`&F@4b{iLYugbT2dUv_NS$x)ND=mKox<$p`1 zOm4@(7++NQcHZ3gny1qT_jeM4@rIS|$*^;C@%O>ok9SNTdgbozKS|O_t7u?wf%ixd zhP|vjFgG#LKd+zV?2)+<-d6^$@2!fuWqvlQsRrNfWaxPS+dJHnQ%b9_hk{$V|F&-t-zS8wr&Il4-W?8x-^<_hA!; zu1F>-_C5@7c<-5yFW14yg7aPZ&92Ygv)S}hA3%tNErqI+&5QlwG26HnQ_$w4S=9Mh zuYdB?*x5;=$l|(jb;SY0^Bq2^icjS8g0=1OYYnhiO_n)LjM2fSjV~MQ{C-!=Ewzww&%^NHM16!k{EBU^ctxe^$u@emTdubG)j)WNe1Wr zK}c>Jg?Ld-+g9*_TBBoKj-`MjR8?6*38#loZhk-yx@-&}^GV1^=9zM2Lx|w;zq?zW z+6P7E#4U*#IS=)L;1gYJl&@`4k0gppx|z2n^nSk_;R#e<5$HXgTRr2({+JBgT8--Y zRDL5};_H&wuC`#4i*=?C}XvAx4h-uLb&YrBll;t`4yF4K)T0$oJ_HVQJR z`?DTE(2if@0_66L(rjPQQD%s9yl100u8Gz3_*2sariTl^EolO@jlsWMB(~3_5?kQq zawqjyNCT*Qe)J)lU`Z1}O5FXM7(f<#CN-6;dQ$&bc#)Kv7D`G}UjFvK!o@#AQf|u2 zJAZ^te>MLKNt&w5z<=9U2JxuHdO12Kls}U8oF)cZ)0N{uh&iO}-{0c&5!XN+mWZq%Jg^X77M#%f}I;c7sc zNS~fjXM**$mGX{LfvbJ!OTvCdn%UMp3 zqUm5XOIlzhY$5&eZkUsvrnudn9Pml+xjKS3nj3$HJHkGE@6CGT=%~Y zshC?CT`(l5rkx&~iv(4-OAlB8gxil*PMXTPEkHMOzaVb)*Q*|sb?4}u@0o;Zr?M`> zsar+l=1JJZKSpRf8|iE7kZ)xN6YYkPTd<5s;m~Kk5BfhH4g)e47&)A6j6)=FpnNNf zxh0`zK##Cd-rwxw6TVAxEFh?KAX_@51gkZ61(eu6Xa#0F7V=1Zf(ClCCB5pCapGF{ zcCMwhOloP3s-?|e^zoV;IsB*R=bdN8J-_cfqp5D?M~!{n0@IVg+cEVjhMnZ&ZC`Pyvyd_0-;IAq7bVdJuk8dWf#?9hgq!Ty1nFRSO~;|1WK z2!9k51&+#nM4?3=0%cLLkJK7lnfXbh?meud;l8ge*{TW!z z^Pb$xlKkscF@0>HmTb%Kp&Ta4KbA+%e%M@P6S$5 z{hezlnq5KRe%$vR2Pd$>d%rWr+!snDK%inz63`r#rsSp)?NV;L9=cL`n{M+`A|1`SIyw#j*xfjtG zP!P=PRM1FCYMDRg#Na9sM%8VfI*?Lb`t<$U+=86E?f8L)lejSTEj%$e93cTu($mstOcYCU~JAABTB%ry5 zz-#I=w152`sp0?hKyA+}_8Fl?=`Z$m4Iz;NZImOyL`HZ;Nr-4?(oi)U3`yvU!EhlU zpSmBmJn@yxpxJV0os~>Q#%;#CCdMBfRN-hgXyBH%l98ncymquhycP3@7vPOlzqw?{ zwb?cD_cp84GF7ym)psnYGle+DC<2?Ng62O5HHIMp&r$_X#6qsdB?=fYK==JC zJBp5XG~SZ*BCOu*5OYnU z_#>;Z#KrY_+2O>xXK&BPrBgjyWha8bPIFONA8Cc>ex?N0;3C>%44YA%GQ`$dfh%GU zyE9qDgt{}WdPpaeWl!eU3DU_lI6-O_d%`cUCTc=)Jm^nw)Ep?l_~?@ox%(#a)Dru< z8aDi-?X&MMb6No8xc%0fDA`O`3(`ZfY1yEoKv)xLQq3k#LZ#0xt_lgAuLmvcbWJ0L znWv>O+;~E9NCYn6E^OCe^y@y~rln^AOOdHsP(( zWC-w{+uPko{zkF}P}FW*pzE2IV0$j#*Z#r%=i7Hx?2h4srcRDdr@T35a&-{Tw%mJ8 zEA5{CTb2)JIA}#2TZ@-T%G4i zM|7LIRUC4#2OHh&rXdu1O?dWBz zA27BFfvW*y_2wHxXO@+f%6+WcJomW&nW&KN@Yz!oj4WlG$mv%7eN|H;@(trePxl~T zqV)d+O}&kW`BHQ=@VGgaItj3oWA~s~Le@Q?Fb|7f<5kb{H6JT|VIiSqAFB=&fOFxc zoK6ADvp_a;5Vq0j4(FGba@jN|)WR?pJt@)o?8hLmq;$+A3o|o*axvUsP&MP1Y1_oSxo0IXpaUkU8EgQt#EZCD%@@ z>B)V<(REOel$XbTx}@>4k($vSzUEfhC0omGekR)NT25yyN5?e+5#0{;8~`8s z0j0nLjyD-fGaNCZKa$>q5>Ou@KAD@Z)Z!Hekg9`+MuoTY9WfAvZ~Y2^{`7^{C&dv! z>HBF|L9&Xkhd|Few2vJ_2aysAe2LEu^e?L?&`9lws$~?1(p)6g|8VC4%^LgiYwle+ zr*#>hQb9C?AZb=HR>R%?Hq6fwCUJtlUZz(V5duOrd#Nk1I`hvN@~-cUVvpp6Q*Yqa ztzJVLavg2*kh@Q1>om5?F?vc@dlYc3=oG2ZaEWGS`auMp2H!!}vnuOk_p({abjK=} zqAYv}Z?DM~^V@f|#X)+@OMXm>I;p;Nwwhak-9hi})W``F6=uOKi~SN+cZ^?_rZ{7A z#~E^PDyCpIt2ey1Qe+vo**`l1VA$(rrL@XsWsS3edhy^eiZ)qI9aaxS_Jk#9lflt zUT5OE!GRx0PNAJRW^}!!0jV|wTyWZ>DBK8CN>?90LoZ$2%k{cZr0lWHZuAaFU9B~Yc{O7sP zm+;#F!io461zp>4r>do_uLIn^z>4bl^waw&2e+K}U#KHbGZ5*dV>@5EeIvBY85O~x zZ}lyFCi~w)Vduy9V4Pb_+2^<#TJ`#241%ODcnb%?%-qbTj{liHxq+0Pm7P@{L^Q;Hy&@-ea(` zdwCSAxgo*wJ2{*%L7*2>9?MEP>R2e?9SA+++!*^SpyeaKW;u> zdM#a5OVqt}W2e*2OP!`$FD8G)df+5Jf2s3UuooIKqrwMSc>r_bi<@b^oGf|rD~i^t zI9$t|$&FK&cFyVFhR(jI)y7co>O6Oe=02xZ2I=!Umd@5$ydCd?Vk52W@ONR4oMaJgWMdno5zZBU%13g#a zjGb%WGQi)iYqLV_{&NkNq*r{}*&WcYp0Pp&JWt~a)e#;g+GB4x77gshlV9{lM%VL% ztyjGM3UbkU_RmGXPlAUtdBuv3V^L9_qs-88#Im`>m++nAOU~1yp zs_LG0Iz6iE*c}T0}{fwQ%xsR%}&D7J!#0o?-Vy7-QVf{%0mO6Sx z=f(LX+v5pE;YH)o)KFQ?!Fl7k4n_{~Pyv4a{itTOE&>jhyaa6}38yhq$2|I0pA=$l zbDuWfss#aW9MK-i@H!vaS|2vMx9?F_b(oX&vhml6!W0vt3y749+ zV~VS)^qTkoWtcu_pT4Q0d-4wE#^v7~r~(xCmHmB{^;98-H%F?+v>P~|qBVH8V_0CI zjLE)Is_TA(-Uk!tQ~A$xfhgjxRr3X4^J#BWEm*wBAL#jP@5^Y&b~Cx ziXl1HpWG(1ztuRZZs|(Ri3ik0p}yRCeZCr=t^^O7xbLOdeHMw@biDC53Xs=tru2wH zwG8?5*lpF1*uv&;a`2#z^oMipfrfEwOUN3(`Zc@HB3=7FnCa#jf7u1WuKi;WLJ-6fDZCZlf^kC>p|iA1*`#T%Y5`$K|UFN%J`l@7Vw(yup+!vlUePw*Q4 zIB2%`=M8lfzg~=KiG{yKELXq1*23F(9EIGVqT7!$P$566IPaZ4fmI< zSe8$v{ndUT2&#Tx)#cVA$G}9MrWIE(kJ_(C=8(18v)YC~wk_Qkjf@uNnW83;qnNeW z-}E>d7Pr~PXk8>-pq80NeQK9<-Hwt=*)1oE)8JRV-woV_r%e1D2YnjMKK3M%KbvxV zGpg&xmJ9|=lxfoEFeyHMZ9R6OSXs*!hEAGFx7e)eH(v$wnBU~5v`>^6?0;;-)>nIU zPtC{1dXwe1SRwRqgGi)F^N?H^YID$t8_PNt&t&y;S0aBG^6dK4cX2p&ktK&BnzH&l~N@+&m&Vvf+5(=)+G>u!vv^B=nmc6S+_ z&$)AvRO3CaTab7`fWTeG(rPM(q)6{4gYvWf_t#jO`J>VrJKixe{}-IjUmu%w^+==1 zMc#bi)W8OIN&YVw+)$z2NozdLTVugLnRjnkcwwPK9?jOo?bWnAl{xAqMaktAFNZps z91J^zopveMa|-zij+8bHGr~^0Ge@O4B*%=_=e|UK+_IiLsWs*I2|Rsg(7fwdq_LP> zzz3h3zAu$w?0j|J$Xn+;WIvS5JBT`x=bWU6tY)US*^!s_ut5>l^eU@^p*`y-N3ewHiu23UsyUDkRs^QP{FfKmNm*OL zv70`1d!r}|N|OI^1*3JcB5D@X*?PfY-O=!(R<^6?qWZVHjR1j#7;=5QYriGvmUA83 zGB`h~kMH_8@Cb2kV*H0jU0UFi{x$2`@U>{uq4s|+B4LCZ(kK4f@G0U(!~D=$r1=3! zLH6Xp^4CU#Omqu;)L*+|intc7HFQ=8i)bkv{cz#dRJ4~dXM1a2WJlJjX!3W}{Cn+_ z{TuM3fsEBJBFFlb0agMVrzaaW3>)>UhDu=o%#gFzMnmE60NKg|%YE`FJbbcld$fgj z#APNm`Qk=(igvf3HcWWig8j_4Y#G?LS#J?lKSS_H8gmQ1>=zlU!qM5e4m@L;jiDfv z{&^W6zBcmg2lhIDww!$=t*ut}hNZv{aOKf@xu$Y2*2mtYm!;R~tHut@K7ZYjBltDI zHcMiX#%(E)7z;kArM-C{@^SE`TVliRAB*N*G?NF>Y6iSl*b&~TA6Iup_cYJAv={gp z+#w`trWQn@TDhPi4fbf=Yjn7idZ&p3(5{%~~I_=i$*w-*$6W*A`SCV5HyC`RUHX z$jzc@tA6Krg&W6Rpqvir{W501JZF!Fq{D>gDfC%1PG!f&{S#VWe>r!Oo$vNfuzs2~ zHTp9W;PR$R?4=pTL_Pi7T-xrs;H$**i`K>V%%Z=Kr2Pgab9 zN6A4JjB8d6_AAaLKRmr$6C8DiXJEoMQ{vHXZ6G{zU_v_U`lADo`uB?R9#E z;%wpvf9JH8-cz0v1`aE6%rSAqY_a6I$uwezep}}vP3q;?_mrIl%&$)8`q87BpWC{y)Lh7w0&F}xKp;@s8 z`dfV~|J6E*y=3ox>tyL<{X?R^JeT}*`aXi$-hpj7{r16sz^E)wIVi634i!x2%M+GB z;r%jAeg)UJuLP0bI9@85e@^4^ZHbIYi_xzC8eOtpYy1hFC9yBhw9;$-SRL_il*k zGO6(iBbXL!0R@s7UC|mz<}$KwKt)Qz9;a1HTbbs@#PtVBbW6DneH$a`GK9!tWQt_!-8gwyv~5V+$$U!t%+a~)pMvYox^^jX4IJd z8`j-o##fsE+bE=P|M?HLhLly`>^F9hM=|~4rL}`E6mVo}3GbOHqAx+^l;0plLCO4C zaS4CDjon0l6C>M?wYo`#&Zxn_dAIx}EhqI~4Z}VH4{aA= z-u*yeAxGET#5XlT$bnF(^>wArDBman6;ep=8BM@&f;ys_zZ?B$RGaN;yhx?asN>hw zOVGD0H%L>!iM6G)B?ElATL)9F;qIE~2S0{9+Ot4ID}|^FUvzeBjllyjS0c$?xo+^H z4?-`eJ2o0SjIL0qrO(Jf(%@23dOj7%e&T)JUaPWZa@c8!TJk3Y(iX@;*t>4I3Z$Mj zRU1?_YlQ_gtB%oZd(NASoIn8-<@ibaCFSkHrWpEZv z8?ELzGog%F;4&^P95v)wi!_~m$Fxy)WKDHu2dr87O3f&351oM~Z`qz6U8Q(*Z z#jBlbFp{%Ogw36!#++MP_L+#6PsBhS<}gOmh^0P{jbN3smmGqEi04m5lf*z;Ca|V@ zV3hVU%PbwwKom?kQv2GS0LPh^h!r9rHNru}ZYt5gtt2i+n zRL?~ekNq33CqMm1yvjPP8zsMGQ;f(u+yLJERxS`w5H(HMXLzu#LilJht*6vIS)`Ai zf5uZGQ}WHL(eEddRkvO(y|G$AK@hbxHq{Fy*q~Zy*4jrvFn^`?y3q1WP`CpP6X0iG zBj7N}84Z;Bk!4dOX9oZ2OyjLLws~UNpAt{I%t6;e(X5d2R%e!=^RU~Bo0#>Dp6yLtYJJ2*H)1}^0M^vN4Yjie( zQo9C?{2dp&>g=pLkv`bD%NJ%fUDjHVC6W^Y@}bW@78h1k!yL47ubi2y#|Pg&r*l{d zSKDA+rkkZWRg6vB5_F5%_y0z-?{dkxEZ4&UntSNQ+*#(6f)_pebX9f}Fls8PiZrc6 zir1$&A45A~7Qb$E zct5u@08U!cdUnqhBPHH-EkUX000p>4abFsD+=(ESqmURUJY`6(yRp6z4XMa{R!BXF z^e!+3erLalyE2i=dYKEI#te%w^`!i$`+`}GEns~7WG<#hy(|=E*rg4ogJH_au`E;n zhZpVixuEY`402MZw;dC3wDB(BKM8DRTkspiHg5XmoA#Io4wT3>-BSgeAg`=CfUiJW zF>(qx0yQ9{3+xnoUP#u|D^&JI{ROhL_DLK(`6|xU^A$#1h{ zj*<=S*+Q@F>fM9q>VFL=kZ!`VC?XPe;w7U#N&6mZ406W6Cza04_a@1;`t`-8=JHt8)^XEF$1u|eVu|o;;p#N#Uj{{ z^|WSkiWQx2WK9Q^y}5MZ@0?BvR#w)+?r?R!#Lv`>_w`C-x>uf$`2VORxuHQ^ui8R( z`o6>-KMl`r-woXU7Y0z0R{o?FKMVS^_W8H0bvoVVUPx(S0ZaY31Qa9X9#@BG2G5D7bf}@$HZ`iC9Jsai=MA3C?X*s#KQ#q@)oW}dMzcIk5HDFgz-k%K)`J(8;OazoPhI{-@TZ|qyUs&UJ=`CG@We9AFuL$xDh+%7)-^o-KaL zG^_e3=I{JZ^15@^P`TRoVWU0{d28HgjY{liyZJ{WTZWmky0yiq1R(3O*tAE}uzzGU z*}W0Sx3FpCgW_@}GIt01$WxyltKV8xP*|=#W?lB*;i);{ul<^u35~tfcNTkxjF4#9 zyH{F5(7y}JF(})3YYQMWwPqAkqLAG9efp{hH%(kKFJP;-fnaoBZVP!HZCJKwK|;**B3HM^Dm5|m>1RR*4sQVNAGe5 zff4)zG(mBG_#-IPLpBf^UauUBi z*TBR2{(N;2C_skCdy&>lvN^~z!qHq}P98KejF*-t58CR>a*!#T;Rq%>uzBVvu|ICb z&q&9Irf#QSvC;dVNR!RBd`1GN*1HF~Yu}Wr<7gN&0%;XWQgC}Ah8WDaj(8mX7^3Sj zm$|M|m}1NFTO`;rNl9SiX>Nknb6c3;H!n5XdeOs&!;L(a`9?1CKrY4g7%=OsVw&M# zp8Q1$vc&oNsLSgFUe{p@P-6PNmxK)4nss&uqsQNw#@245!Dx?$q2%`4n%7FJ1YZfe zEg}vwIV**4D{^1tPyX9po-Y5 zYVc{mS5CaYrpxwKUf{sVN@l0rfSwxfOCCc5nFUju3OoloCgElTT+rt5KQlkPhCawyg;r4GZKT|4VZeeZaC4*TFPuGljA{Z^lW*F@1M4q+`c*F-0ogV%ZIhlnDeEl zbSQ73cg!3nc=gnTHe$KykVd3A?`rzBUYh7_ja6DUf6|K^A&>pm5K)`r)cp> zD@R#dZj6JYcG9wvySxDDCG^-XH!cX0l`hhXTQWq3WTq@A9Ca{iv*4oe%tTW_N4(88 z?EOg;==VX))?pi?nc=>chQbesev)6=C;dpFgGPNTuKp|(|K9WAR(`i{^;#4AH(*++ zl=*soQc;}r3TexraOMxr*9RtY4gU2{xMF-~x`W{-3w#KPQf;_)^R~~=@@ObDkC5xd zjs7JgJ-h^g+MLt9-t+l|)QP?vXXidhoN5;PzY|ty^5-u zz+ps&UzrHyy6sk#n}Uu?OI>^{je6|)XB6DvFbxWep%n#7mEN^;OA3WIa3l0I>9d3q z$6#{wb+CQNjPX!dmHTimVx{nSLgC`|a7-NU9P*xLJ>%DH@xfa9`Cb+4xV(fB-)Mnn zmL8Ewfaw#kC5jtff;@@>!JMC7p8d=h%2`sxsF6B0LdCB~G8{!2DVbKpYE z|KrDQc)80SJH&a!?5lj@h`^xW+qIh0(Sa#KIN?ybxjhGRh(MPknqlL7l~AEzqWj## zMO5uYfiD2Mm#Kqh;qAMp2I&bM#GVErg|0k(uF)ap>9UEI24|G8_&jwSMEn;EJ&xJe zowEV9az@GXmxIZc(s%HJjZbOPUk42$n;dUOCs*gi2~$tO3$b}G9-7={%}=o$qU#I*pxlJx$3zQ>5o8{40TQK Ke!Sxl_x}JmOFakx literal 12696 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�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 YFS&Cb?+(#ZzcQ|Cs_NY>Q-;F-4@Aah{r~^~ literal 33313 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
  • +
  • @@ -29,4 +30,5 @@
    +
    \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/app/template/RightMenu.template b/apps/spreadsheeteditor/main/app/template/RightMenu.template index 1f7d9abf6..24c8de9ca 100644 --- a/apps/spreadsheeteditor/main/app/template/RightMenu.template +++ b/apps/spreadsheeteditor/main/app/template/RightMenu.template @@ -12,6 +12,8 @@
    +
    +
    @@ -21,5 +23,6 @@ +
    \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/app/template/SignatureSettings.template b/apps/spreadsheeteditor/main/app/template/SignatureSettings.template new file mode 100644 index 000000000..5a4fa0157 --- /dev/null +++ b/apps/spreadsheeteditor/main/app/template/SignatureSettings.template @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + +
    \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/app/view/FileMenu.js b/apps/spreadsheeteditor/main/app/view/FileMenu.js index f1067ae56..674408d44 100644 --- a/apps/spreadsheeteditor/main/app/view/FileMenu.js +++ b/apps/spreadsheeteditor/main/app/view/FileMenu.js @@ -158,6 +158,12 @@ define([ this.miSaveAs, this.miPrint, this.miRename, + new Common.UI.MenuItem({ + el : $('#fm-btn-protect',this.el), + action : 'protect', + caption : this.btnProtectCaption, + canFocused: false + }), this.miRecent, this.miNew, new Common.UI.MenuItem({ @@ -217,7 +223,8 @@ define([ applyMode: function() { this.miPrint[this.mode.canPrint?'show':'hide'](); this.miRename[(this.mode.canRename && !this.mode.isDesktopApp) ?'show':'hide'](); - this.miRename.$el.find('+.devider')[!this.mode.isDisconnected?'show':'hide'](); + this.items[7][(this.mode.canProtect) ?'show':'hide'](); + this.items[7].$el.find('+.devider')[!this.mode.isDisconnected?'show':'hide'](); this.miRecent[this.mode.canOpenRecent?'show':'hide'](); this.miNew[this.mode.canCreateNew?'show':'hide'](); this.miNew.$el.find('+.devider')[this.mode.canCreateNew?'show':'hide'](); @@ -255,6 +262,11 @@ define([ } } + if (this.mode.canProtect) { + this.panels['protect'] = (new SSE.Views.FileMenuPanels.ProtectDoc({menu:this})).render(); + this.panels['protect'].setMode(this.mode); + } + this.panels['help'].setLangConfig(this.mode.lang); }, @@ -276,6 +288,7 @@ define([ setApi: function(api) { this.api = api; if (this.panels['opts']) this.panels['opts'].setApi(api); + if (this.panels['protect']) this.panels['protect'].setApi(api); this.api.asc_registerCallback('asc_onDocumentName', _.bind(this.onDocumentName, this)); }, @@ -333,6 +346,7 @@ define([ btnSettingsCaption : 'Advanced Settings...', btnSaveAsCaption : 'Save as', btnRenameCaption : 'Rename...', - btnCloseMenuCaption : 'Close Menu' + btnCloseMenuCaption : 'Close Menu', + btnProtectCaption: 'Protect\\Sign' }, SSE.Views.FileMenu || {})); }); diff --git a/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js b/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js index 8f765ea10..73d97b9ee 100644 --- a/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js +++ b/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js @@ -1333,4 +1333,136 @@ define([ } } }); + + SSE.Views.FileMenuPanels.ProtectDoc = Common.UI.BaseView.extend(_.extend({ + el: '#panel-protect', + menu: undefined, + + template: _.template([ + '', + '', + '', + '
    ', + '
    ', + '
    ' + ].join('')), + + initialize: function(options) { + Common.UI.BaseView.prototype.initialize.call(this,arguments); + + this.menu = options.menu; + + this.templateRequested = _.template([ + '', + '', + '<% _.each(signatures, function(item) { %>', + '', + '', + '', + '<% }); %>', + '
    <%= Common.Utils.String.htmlEncode(item) %>
    ' + ].join('')); + + this.templateValid = _.template([ + '', + '', + '<% _.each(signatures, function(item) { %>', + '', + '', + '', + '', + '<% }); %>', + '
    <%= Common.Utils.String.htmlEncode(item.name) %><%= Common.Utils.String.htmlEncode(item.date) %>
    ' + ].join('')); + }, + + render: function() { + $(this.el).html(this.template({scope: this})); + + this.btnAddInvisibleSign = new Common.UI.Button({ + el: '#fms-btn-invisible-sign' + }); + this.btnAddInvisibleSign.on('click', _.bind(this.addInvisibleSign, this)); + + this.btnAddVisibleSign = new Common.UI.Button({ + el: '#fms-btn-visible-sign' + }); + this.btnAddVisibleSign.on('click', _.bind(this.addVisibleSign, this)); + + this.lblSignHeader = $('#id-fms-lbl-sign-header', this.$el); + + this.cntRequestedSign = $('#id-fms-requested-sign'); + this.cntValidSign = $('#id-fms-valid-sign'); + this.cntInvalidSign = $('#id-fms-invalid-sign'); + + if (_.isUndefined(this.scroller)) { + this.scroller = new Common.UI.Scroller({ + el: $(this.el), + suppressScrollX: true + }); + } + + return this; + }, + + show: function() { + Common.UI.BaseView.prototype.show.call(this,arguments); + this.updateSignatures(); + }, + + setMode: function(mode) { + this.mode = mode; + if (!this.mode.isEdit) { + this.btnAddInvisibleSign.setVisible(false); + this.btnAddVisibleSign.setVisible(false); + this.lblSignHeader.html(this.strSignature); + } + }, + + setApi: function(o) { + this.api = o; + return this; + }, + + addInvisibleSign: function() { + if (this.menu) + this.menu.fireEvent('signature:invisible', [this.menu]); + }, + + addVisibleSign: function() { + if (this.menu) + this.menu.fireEvent('signature:visible', [this.menu]); + }, + + updateSignatures: function(){ + var requested = this.api.asc_getRequestSignatures(), + requested_arr = [], + valid = this.api.asc_getSignatures(), + valid_arr = [], invalid_arr = []; + + _.each(requested, function(item, index){ + requested_arr.push(item.asc_getSigner1()); + }); + _.each(valid, function(item, index){ + var sign = {name: item.asc_getSigner1(), date: '18/05/2017'}; + (item.asc_getValid()==0) ? valid_arr.push(sign) : invalid_arr.push(sign); + }); + this.cntRequestedSign.html(this.templateRequested({signatures: requested_arr, header: this.strRequested})); + this.cntValidSign.html(this.templateValid({signatures: valid_arr, header: this.strValid})); + this.cntInvalidSign.html(this.templateValid({signatures: invalid_arr, header: this.strInvalid})); + // this.cntRequestedSign.html(this.templateRequested({signatures: ['Hammish Mitchell', 'Someone Somewhere', 'Mary White', 'John Black'], header: this.strRequested})); + // this.cntValidSign.html(this.templateValid({signatures: [{name: 'Hammish Mitchell', date: '18/05/2017'}, {name: 'Someone Somewhere', date: '18/05/2017'}], header: this.strValid})); + // this.cntInvalidSign.html(this.templateValid({signatures: [{name: 'Mary White', date: '18/05/2017'}, {name: 'John Black', date: '18/05/2017'}], header: this.strInvalid})); + }, + + strProtect: 'Protect Document', + strInvisibleSign: 'Add invisible digital signature', + strVisibleSign: 'Add visible signature', + strRequested: 'Requested signatures', + strValid: 'Valid signatures', + strInvalid: 'Invalid signatures', + strSignature: 'Signature' + + }, SSE.Views.FileMenuPanels.ProtectDoc || {})); + }); diff --git a/apps/spreadsheeteditor/main/app/view/RightMenu.js b/apps/spreadsheeteditor/main/app/view/RightMenu.js index c685e418a..fe331911a 100644 --- a/apps/spreadsheeteditor/main/app/view/RightMenu.js +++ b/apps/spreadsheeteditor/main/app/view/RightMenu.js @@ -55,6 +55,7 @@ define([ 'spreadsheeteditor/main/app/view/ShapeSettings', 'spreadsheeteditor/main/app/view/TextArtSettings', 'spreadsheeteditor/main/app/view/TableSettings', + 'spreadsheeteditor/main/app/view/SignatureSettings', 'common/main/lib/component/Scroller' ], function (menuTemplate, $, _, Backbone) { 'use strict'; @@ -134,7 +135,7 @@ define([ return this; }, - render: function () { + render: function (mode) { var el = $(this.el); this.trigger('render:before', this); @@ -166,6 +167,21 @@ define([ this.textartSettings = new SSE.Views.TextArtSettings(); this.tableSettings = new SSE.Views.TableSettings(); + if (mode && mode.canProtect) { + this.btnSignature = new Common.UI.Button({ + hint: this.txtSignatureSettings, + asctype: Common.Utils.documentSettingsType.Signature, + enableToggle: true, + disabled: true, + toggleGroup: 'tabpanelbtnsGroup' + }); + this._settings[Common.Utils.documentSettingsType.Signature] = {panel: "id-signature-settings", btn: this.btnSignature}; + + this.btnSignature.el = $('#id-right-menu-signature'); this.btnSignature.render().setVisible(true); + this.btnSignature.on('click', _.bind(this.onBtnMenuClick, this)); + this.signatureSettings = new SSE.Views.SignatureSettings(); + } + if (_.isUndefined(this.scroller)) { this.scroller = new Common.UI.Scroller({ el: $(this.el).find('.right-panel'), @@ -187,7 +203,7 @@ define([ this.shapeSettings.setApi(api); this.textartSettings.setApi(api); this.tableSettings.setApi(api); - + if (this.signatureSettings) this.signatureSettings.setApi(api); return this; }, @@ -264,6 +280,7 @@ define([ txtTextArtSettings: 'Text Art Settings', txtChartSettings: 'Chart Settings', txtSparklineSettings: 'Sparkline Settings', - txtTableSettings: 'Table Settings' + txtTableSettings: 'Table Settings', + txtSignatureSettings: 'Signature Settings' }, SSE.Views.RightMenu || {})); }); \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js new file mode 100644 index 000000000..32241a8c5 --- /dev/null +++ b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js @@ -0,0 +1,288 @@ +/* + * + * (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 + * +*/ +/** + * SignatureSettings.js + * + * Created by Julia Radzhabova on 5/24/17 + * Copyright (c) 2017 Ascensio System SIA. All rights reserved. + * + */ + +define([ + 'text!spreadsheeteditor/main/app/template/SignatureSettings.template', + 'jquery', + 'underscore', + 'backbone', + 'common/main/lib/component/Button', + 'common/main/lib/view/SignDialog', + 'common/main/lib/view/SignSettingsDialog' +], function (menuTemplate, $, _, Backbone) { + 'use strict'; + + SSE.Views.SignatureSettings = Backbone.View.extend(_.extend({ + el: '#id-signature-settings', + + // Compile our stats template + template: _.template(menuTemplate), + + // Delegated events for creating new items, and clearing completed ones. + events: { + }, + + options: { + alias: 'SignatureSettings' + }, + + initialize: function () { + var me = this; + + this._initSettings = true; + + this._state = { + DisabledControls: false, + requestedSignatures: undefined, + validSignatures: undefined, + invalidSignatures: undefined + }; + this._locked = false; + this.lockedControls = []; + + this._noApply = false; + this._originalProps = null; + + this.templateRequested = _.template([ + '', + '', + '', + '<% _.each(signatures, function(item) { %>', + '', + '', + '', + '', + '<% }); %>', + '
    ', + '' + ].join('')); + + this.templateValid = _.template([ + '', + '', + '', + '<% _.each(signatures, function(item) { %>', + '', + '', + '', + '', + '', + '<% }); %>', + '
    <%= Common.Utils.String.htmlEncode(item.name) %>
    <%= Common.Utils.String.htmlEncode(item.date) %>
    ', + '' + ].join('')); + + this.render(); + }, + + render: function () { + this.$el.html(this.template({ + scope: this + })); + + this.btnAddInvisibleSign = new Common.UI.Button({ + el: this.$el.find('#signature-invisible-sign') + }); + this.btnAddInvisibleSign.on('click', _.bind(this.addInvisibleSign, this)); + this.lockedControls.push(this.btnAddInvisibleSign); + + this.btnAddVisibleSign = new Common.UI.Button({ + el: this.$el.find('#signature-visible-sign') + }); + this.btnAddVisibleSign.on('click', _.bind(this.addVisibleSign, this)); + this.lockedControls.push(this.btnAddVisibleSign); + + this.cntRequestedSign = $('#signature-requested-sign'); + this.cntValidSign = $('#signature-valid-sign'); + this.cntInvalidSign = $('#signature-invalid-sign'); + }, + + setApi: function(api) { + this.api = api; + if (this.api) { + this.api.asc_registerCallback('asc_onUpdateSignatures', _.bind(this.onUpdateSignatures, this)); + } + return this; + }, + + createDelayedControls: function() { + this._initSettings = false; + }, + + ChangeSettings: function(props) { + if (this._initSettings) + this.createDelayedControls(); + + if (!this._state.requestedSignatures || !this._state.validSignatures || !this._state.invalidSignatures) { + this.onUpdateSignatures(this.api.asc_getSignatures(), this.api.asc_getRequestSignatures()); + } + + this.disableControls(this._locked); + }, + + setLocked: function (locked) { + this._locked = locked; + }, + + disableControls: function(disable) { + if (this._initSettings) return; + + if (this._state.DisabledControls!==disable) { + this._state.DisabledControls = disable; + _.each(this.lockedControls, function(item) { + item.setDisabled(disable); + }); + this.$linksSign.toggleClass('disabled', disable); + this.$linksView.toggleClass('disabled', disable); + } + }, + + setMode: function(mode) { + this.mode = mode; + }, + + onUpdateSignatures: function(valid, requested){ + var me = this; + me._state.requestedSignatures = []; + me._state.validSignatures = []; + me._state.invalidSignatures = []; + + _.each(requested, function(item, index){ + me._state.requestedSignatures.push({name: item.asc_getSigner1(), guid: item.asc_getGuid()}); + }); + _.each(valid, function(item, index){ + var sign = {name: item.asc_getSigner1(), guid: item.asc_getId(), date: '18/05/2017'}; + (item.asc_getValid()==0) ? me._state.validSignatures.push(sign) : me._state.invalidSignatures.push(sign); + }); + this.cntRequestedSign.html(this.templateRequested({signatures: me._state.requestedSignatures, header: this.strRequested})); + this.cntValidSign.html(this.templateValid({signatures: me._state.validSignatures, header: this.strValid})); + this.cntInvalidSign.html(this.templateValid({signatures: me._state.invalidSignatures, header: this.strInvalid})); + // this.cntRequestedSign.html(this.templateRequested({signatures: [{name: 'Hammish Mitchell', guid: '123'}, {name: 'Someone Somewhere', guid: '123'}, {name: 'Mary White', guid: '123'}, {name: 'John Black', guid: '123'}], header: this.strRequested})); + // this.cntValidSign.html(this.templateValid({signatures: [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}], header: this.strValid})); + // this.cntInvalidSign.html(this.templateValid({signatures: [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}], header: this.strInvalid})); + + this.$linksSign = $('.signature-sign-link', this.$el); + this.$linksView = $('.signature-view-link', this.$el); + this.$el.on('click', '.signature-sign-link', _.bind(this.onSign, this)); + this.$el.on('click', '.signature-view-link', _.bind(this.onViewSignature, this)); + }, + + addVisibleSign: function(btn) { + var me = this, + win = new Common.Views.SignSettingsDialog({ + handler: function(dlg, result) { + if (result == 'ok') { + me.api.asc_AddSignatureLine2(dlg.getSettings()); + } + me.fireEvent('editcomplete', me); + } + }); + + win.show(); + }, + + addInvisibleSign: function(btn) { + var me = this, + win = new Common.Views.SignDialog({ + api: me.api, + signType: 'invisible', + handler: function(dlg, result) { + if (result == 'ok') { + var props = dlg.getSettings(); + me.api.asc_Sign(props.certificateId); + } + me.fireEvent('editcomplete', me); + } + }); + + win.show(); + }, + + onSign: function(event) { + var me = this, + target = $(event.currentTarget); + + if (target.hasClass('disabled')) return; + + if (_.isUndefined(me.fontStore)) { + me.fontStore = new Common.Collections.Fonts(); + var fonts = SSE.getController('Toolbar').getView('Toolbar').cmbFontName.store.toJSON(); + var arr = []; + _.each(fonts, function(font, index){ + if (!font.cloneid) { + arr.push(_.clone(font)); + } + }); + me.fontStore.add(arr); + } + + var win = new Common.Views.SignDialog({ + api: me.api, + signType: 'visible', + fontStore: me.fontStore, + handler: function(dlg, result) { + if (result == 'ok') { + var props = dlg.getSettings(); + me.api.asc_Sign(props.certificateId, target.attr('data-value'), props.images[0], props.images[1]); + } + me.fireEvent('editcomplete', me); + } + }); + win.show(); + }, + + onViewSignature: function(event) { + var target = $(event.currentTarget); + if (target.hasClass('disabled')) return; + + this.api.asc_ViewCertificate(target.attr('data-value')); + }, + + strSignature: 'Signature', + strInvisibleSign: 'Add invisible digital signature', + strVisibleSign: 'Add visible signature', + strRequested: 'Requested signatures', + strValid: 'Valid signatures', + strInvalid: 'Invalid signatures', + strSign: 'Sign', + strView: 'View' + + }, SSE.Views.SignatureSettings || {})); +}); \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/app/view/Viewport.js b/apps/spreadsheeteditor/main/app/view/Viewport.js index 341b4a1e1..86c059741 100644 --- a/apps/spreadsheeteditor/main/app/view/Viewport.js +++ b/apps/spreadsheeteditor/main/app/view/Viewport.js @@ -147,7 +147,7 @@ define([ var me = this, rightMenuView = SSE.getController('RightMenu').getView('RightMenu'); - me._rightMenu = rightMenuView.render(); + me._rightMenu = rightMenuView.render(this.mode); }, setMode: function(mode, delay) { diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json index 63c2602d6..e21627e7d 100644 --- a/apps/spreadsheeteditor/main/locale/en.json +++ b/apps/spreadsheeteditor/main/locale/en.json @@ -112,6 +112,32 @@ "Common.Views.RenameDialog.okButtonText": "Ok", "Common.Views.RenameDialog.textName": "File name", "Common.Views.RenameDialog.txtInvalidName": "The file name cannot contain any of the following characters: ", + "Common.Views.SignDialog.textTitle": "Sign Document", + "Common.Views.SignDialog.textPurpose": "Purpose for signing this document", + "Common.Views.SignDialog.textCertificate": "Certificate", + "Common.Views.SignDialog.textValid": "Valid from %1 to %2", + "Common.Views.SignDialog.textChange": "Change", + "Common.Views.SignDialog.cancelButtonText": "Cancel", + "Common.Views.SignDialog.okButtonText": "Ok", + "Common.Views.SignDialog.textInputName": "Input signer name", + "Common.Views.SignDialog.textUseImage": "or click 'Select Image' to use a picture as signature", + "Common.Views.SignDialog.textSelectImage": "Select Image", + "Common.Views.SignDialog.textSignature": "Signature looks as", + "Common.Views.SignDialog.tipFontName": "Font Name", + "Common.Views.SignDialog.tipFontSize": "Font Size", + "Common.Views.SignDialog.textBold": "Bold", + "Common.Views.SignDialog.textItalic": "Italic", + "Common.Views.SignSettingsDialog.textInfo": "Signer Info", + "Common.Views.SignSettingsDialog.textInfoName": "Name", + "Common.Views.SignSettingsDialog.textInfoTitle": "Signer Title", + "Common.Views.SignSettingsDialog.textInfoEmail": "E-mail", + "Common.Views.SignSettingsDialog.textInstructions": "Instructions for Signer", + "Common.Views.SignSettingsDialog.cancelButtonText": "Cancel", + "Common.Views.SignSettingsDialog.okButtonText": "Ok", + "Common.Views.SignSettingsDialog.txtEmpty": "This field is required", + "Common.Views.SignSettingsDialog.textAllowComment": "Allow signer to add comment in the signature dialog", + "Common.Views.SignSettingsDialog.textShowDate": "Show sign date in signature line", + "Common.Views.SignSettingsDialog.textTitle": "Signature Settings", "SSE.Controllers.DocumentHolder.alignmentText": "Alignment", "SSE.Controllers.DocumentHolder.centerText": "Center", "SSE.Controllers.DocumentHolder.deleteColumnText": "Delete Column", @@ -1077,6 +1103,7 @@ "SSE.Views.FileMenu.btnSaveCaption": "Save", "SSE.Views.FileMenu.btnSettingsCaption": "Advanced Settings...", "SSE.Views.FileMenu.btnToEditCaption": "Edit Spreadsheet", + "SSE.Views.FileMenu.btnProtectCaption": "Protect\\Sign", "SSE.Views.FileMenuPanels.CreateNew.fromBlankText": "From Blank", "SSE.Views.FileMenuPanels.CreateNew.fromTemplateText": "From Template", "SSE.Views.FileMenuPanels.CreateNew.newDescriptionText": "Create a new blank spreadsheet which you will be able to style and format after it is created during the editing. Or choose one of the templates to start a spreadsheet of a certain type or purpose where some styles have already been pre-applied.", @@ -1131,6 +1158,13 @@ "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtWin": "as Windows", "SSE.Views.FileMenuPanels.Settings.txtGeneral": "General", "SSE.Views.FileMenuPanels.Settings.txtPageSettings": "Page Settings", + "SSE.Views.FileMenuPanels.ProtectDoc.strProtect": "Protect Document", + "SSE.Views.FileMenuPanels.ProtectDoc.strInvisibleSign": "Add invisible digital signature", + "SSE.Views.FileMenuPanels.ProtectDoc.strVisibleSign": "Add visible signature", + "SSE.Views.FileMenuPanels.ProtectDoc.strRequested": "Requested signatures", + "SSE.Views.FileMenuPanels.ProtectDoc.strValid": "Valid signatures", + "SSE.Views.FileMenuPanels.ProtectDoc.strInvalid": "Invalid signatures", + "SSE.Views.FileMenuPanels.ProtectDoc.strSignature": "Signature", "SSE.Views.FormatSettingsDialog.textCancel": "Cancel", "SSE.Views.FormatSettingsDialog.textCategory": "Category", "SSE.Views.FormatSettingsDialog.textDecimal": "Decimal", @@ -1380,6 +1414,7 @@ "SSE.Views.RightMenu.txtSparklineSettings": "Sparkline Settings", "SSE.Views.RightMenu.txtTableSettings": "Table settings", "SSE.Views.RightMenu.txtTextArtSettings": "Text Art settings", + "SSE.Views.RightMenu.txtSignatureSettings": "Signature Settings", "SSE.Views.SetValueDialog.cancelButtonText": "Cancel", "SSE.Views.SetValueDialog.okButtonText": "OK", "SSE.Views.SetValueDialog.txtMaxText": "The maximum value for this field is {0}", @@ -1427,6 +1462,14 @@ "SSE.Views.ShapeSettings.txtNoBorders": "No Line", "SSE.Views.ShapeSettings.txtPapyrus": "Papyrus", "SSE.Views.ShapeSettings.txtWood": "Wood", + "SSE.Views.SignatureSettings.strSignature": "Signature", + "SSE.Views.SignatureSettings.strInvisibleSign": "Add invisible digital signature", + "SSE.Views.SignatureSettings.strVisibleSign": "Add visible signature", + "SSE.Views.SignatureSettings.strRequested": "Requested signatures", + "SSE.Views.SignatureSettings.strValid": "Valid signatures", + "SSE.Views.SignatureSettings.strInvalid": "Invalid signatures", + "SSE.Views.SignatureSettings.strSign": "Sign", + "SSE.Views.SignatureSettings.strView": "View", "SSE.Views.ShapeSettingsAdvanced.cancelButtonText": "Cancel", "SSE.Views.ShapeSettingsAdvanced.okButtonText": "OK", "SSE.Views.ShapeSettingsAdvanced.strColumns": "Columns", diff --git a/apps/spreadsheeteditor/main/resources/img/toolbar-menu.png b/apps/spreadsheeteditor/main/resources/img/toolbar-menu.png index 91577a92e983f0c6c59a983902fc9a20e8c4d5c7..2f165110cae48ec7ad22890eb7899f8d615e0a9e 100644 GIT binary patch literal 14618 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

    YPt!a^ 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 literal 13889 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 Zu}<22P{PX$_-Po8sgc#?H-Etr{trx3@&Et; diff --git a/apps/spreadsheeteditor/main/resources/img/toolbar-menu@2x.png b/apps/spreadsheeteditor/main/resources/img/toolbar-menu@2x.png index 0b67bd39ba25d17e8ac615180e57501e2bebc929..12c20e083294f792756568fc3314dbe4aa1040e5 100644 GIT binary patch literal 37209 zcmb@t2{@G9A3tnOC4`V{p-{|7i+xG9BqZ6#7Aje1#2EWTD9ezwh@w)-kaa9EB@7da zvJNwtAz@4-%UH&H>sfx!)AN7d>w2&2?{eSgdzLx(Ip;p-yL`Ui`|c$R6P~??_Oh_B z@R*)AybPqF0C{-#E`Y-Lk0r9Oq#rgl)V~rsGLL0tWntOfdbqVLS}s=HpBrewa;4W- zqEv35k-K>G-CN&nzuCSBd}f(eR`tx_>=RWFlcl}Q33-hf%6)BCb?ur5QWEQ;Cj@VE z_&+BEP1NNF#RuxDKaI=j8(Bpxnn7H>1EUSdC#zSWyy5v?eAg8q2|7KM38$)CIHYhC z_PftwN`@w!LUIr74ZSDP?3M8H$<|x9I5p9Uwn+q20M$nV?vK2KW*DaP`QExuQF|pV znr=q2PpnuSyCUyW(~R62bANqFu+yfoYJVV7>a|Zz&CNT=8179s=h8A8#eMVT3DT90 zAnUU0(j=jtI;j^UU1zb1`RQM8KDepKz7cMc+TplhRRiaa?&S)_zB#4R>3-AI-S>iiJ5X-^0x?L`LJsZQsh!5t7cQe;W5CiP8k*FCGdLT+Zfa zcbSYcH3%pgKRL;C`Ehq9e!MEIT&1^4MC7}PX7Aw4xvldv8aYS4p!jJlVrwxxyZG58 z-C{qDy6tz5=EJ3Nd4?wP)5L`$&fY=9#mv0eA0{--zXC^0UBW&zUC5uoLN=GgbCaSA zrV3{>OFpH7uAv^9Ywc6FxzQn9Wzzjzg1YGPB*p1t>X~q&7nXa|ec)=y^I@X|R%Kd( zL(=erYa&34!ndm|_lva$Yp)-D6SG^!Df`oHoJ{Ne;xxg=IN59kGh7hQ|JgEZ+He~;r{B~A~sPOWrptG0p)Bl*^hrrkda`=6y| z@&uKL?>+!OOZ7b%5`Os8dY+;kW&(aEU(Eeo19^^|7%{>b)%E->da}Zq9t<UR;DI1U$H4iO1`wxv_`{Z8ZHZU1a`FfEACX1Z8*g7#MUR+V@lve2V{FSRUi%h_K# zr>h=J^MynE@IE%~(k)=iv{Rb{Z_GCwRV>S7l*ogWJ+OG9X05ktMi!{>4&=rhdNe>{ zwE7M#1jP0XJE6eIYjP}*W%otW;r+Q-4q%FVF1oP^{z>lp_u51>Zim(z`)8!6Hg*?m zti|!sQ8_+j)nWhI;UKA&l6D;{|MZlP{^{}-GSs`Uq>tUgh{=M3q2}@y@7~~idA0;s9yODduh2n3- z-vGuVt*HwP&fqk1&&T~bQB4O8Zk=;uYY81TN@;IRh;UVvE7F;spGQhXW7Yz6@|z=~ zpBhx#zDId^+-G{`V_CCN*pvfHTs>70GR%%Ue!PV572`KaekbSYch{uWOrkhTqDj4q zYfn`yh8fM;5o#!{%V?=bdQ-m@1swe0`i{|yca*Ke$1f$&6Q>8y)?%*p*d;#7sWJA? zDUj-tefUvtv;(x8wwG5V^3&wjd0o7D;nC=ut30;LlGj_%mua#LCAG-x&6i5JmWc54 zWGVau`Y`Mf%83%5pS0Ij_VO9sn_`PNa z$%9d9oiYhy=9M^p_GrWA9+`w;b4LX|hlh(($dC--F3StO9qbEo-C1fmwMAU#{ESAM z^j4RQNAA@kqQ?UbcT(5+>BxW&*g_u3wW@dQu9SqiM5Gju`AkB(9spNFj$EMyPIdW|s%h(xaJ`qWMNQn=x{!p@vhWX1 z59-*8*>b)t2r`bULgk0s>)J5~m|F~%bbKpagI-rj;%1e}Nuab+=H`h>bR&z<-mgRl zScdub5Qj`aRtjOUeqGDVzj9Wp@CJD&(^xnvaVYmJxenKOsvY#U#qk6qU>4awl}&UV zE2R_r*h@Obx=ZN~?>5~F>HwLH`Y&xw`4`M_)OWv~3~C1oz}%bktQoC$lOu|{J_J~G z-AIHTb-JGSek@g}PzPPOy05-}dV5Z8wa{K4qPI8;D^Xh8$sMT+RtIV?F+%dT?_Gk9 zd4y4>RxmBF{uvw5L7nGzx?pZ*m$_d3D~#kQEi7mAannb0J^SXGJ`D9uPM16&X!5j; z{L3}b;q%Yvdo*N-V9WH;($qOgE$ik{8CM0qy8?rH9YU}n89m7(=;&0=zo}t*udge^ zIel_{Cam6aIA%}!nO@F4PWWM2p91cscJoAEs9Zl zQp1`C2i#Z7ihyhQ*QA?ePwh&C6dkDhjyqa<@0aTNzugZRMqBy=g1vZNY>~-Zu=|s| zn(DsBF}3k62}pDhS-?Rp2d4oVFO-t%HSt|wZmxyuUiDd>>F8MEcWTnpEB-9Ey102d zxpPZvhyJk`@lTPf9{uTBqrSn^81da>F|P+teo%WQPPh7BuElP_aBZW9H#!(%8TOGK4HOG2yV?@ZCK|H`m;(c+0yLdKv9QMN) z^G`7x;HBKha!}VCq%84e^y(OcTZIvh{#n59d%k1F#*_H&)&`b149U=H zSf>iExhG*Kvdeeh1X2?t0(RYUIIVnlL*CEAN|KPi+NJFe@s$2ze|=XOy#s4!JB|WE zcsRHk{PI6c?TCwsA`2@zBP&p%jD-VZVf#L~nr%Nx(_v3e=ElTX-o|3hC9 zCuus?n_^OJV;-}HWC);(g=7NX2Up&Pm~gY4H8_{kWCz~8F7yeED2MD1m2d%HH*&@d zcExXA`-Cme;w0{CVD@ANBb>i*LsM{NbW9AiJVO>%stqQsYmH2TGq{YMFfR3Gy2nH~ zl1CNco${31F;Kn?MRFHQ>!}>8NlgbRyP*1n!1+;ff2H!bqiMCBC0?#Hv%}qY8#p8V zXi2%wVw*D8Oc+VIMk$*YhSPjvsd8^G3%}-RU|Q5Y33eyPN=V&{cq`Yol~zsR4u4zm z;LQJa-yc*=?W6mZ4yxqM$0a{~vpJVy(Jjv^fr&scE{r(w^tbvgtUvxtp?RFTN>@p% zI6s*4C%eUPvT8l}Tj{EH{l)PEk)bX^5x*|oGn4Nh$tHNoexpUCif7A^X%QHRC?Yf} zg>XcQd;NRluXJ;4;u*~J%LHQvW(eMMXzf?h!1PZKMnrrmo6+NtEC>fAyxSb2vUSO} z{wR&sWaGa_TU%K%SyMaORu|+dahi6W(og@YKS;Ephail-rmBrMzS6k&*q+bGiK1IW%x6Qbh%sTwNNw}9#N3p%MrN@eiKQ& ze!Dpgl~X4&@cYsNc~bNW-|QWqN{OBDkW0OASlF>O>1$s28JBvaZ{E*H;d%YXw{2*B)%wGM z%}y?tOx=o4`&|kf2PrxHh7KnRO0WF(=k zv);d;<@Iq`t3q33UjE!P!%V8a2&+rgptGp;a%LHYOzi5|cZ1u(h#WsLm8wGI)P zZ(uw=!VQn6cO1H1Y$)loJ5>PjT3X$ZEOWWa%}Pcj{UK+PKz-ur&u$bPz}h={mQg%_ z1PDP#`=()-Z@9=wzFcYolLay@{;D6HMk51drK!j0bJGfSwHqYkbA(vRxhnsHPgJZA zgwXl+yIHLU?V)LVWS;MZyg}m9A7!=@81dDml?w%PsW2PS9h!bX?3EwmI1eN>yheK{ z{=4^Z!ngdzK}N#2>eacA2DjdC1h1dtUB96}xqc&7*D({rOw2-MO9Ki4W9qq4kCfU` z7!!~HOC9Ek`Fj56$S0sW%8|2X+l8NV8@2-eYy$$?%$Ackq5V73V7~?gQkNDjv+as# z5r6T{aFFTKpM-w-;Q--Gu1#?&3EMufKkr1SZHlS|3 z9#t;n1pKJn5AnLr zR?W)vGsB$oB;$d&oLCvxPe5ZsXt7dP7a4E$btwJYjVOP>d=75CN}hl zsYT9>bS!w1e?B?g{>k;wg{A%zeF=Rm2GN^;nxCY-$?L73GWI}_9AJHtg~Yd9U(#zX z&6E2+mnGmBO&oGG!vy*(HZ{kmudsrL!uDJw)k?hjcuOVcNyz`w*XH*_Bwx+v7)b1E z(qFMWY}g|H-HpUk8O^q>6|Mv;VN=f5so??Zo%Imwa*)50a(&SGd+4EJk z4s2ErKhgPFJ^ZuGCt!V`QXUv~Msp2B4oLHwYksqgcUF+UTz3>yp0SDx=p^FZhto#M ztCR$aAFN%yw?@0wG<1xvi9l^;Z@v}J=KOcvdY%j_JExNsQ3^RW2Yb+@?*g{GKQ^U3 zcz402VwB=h`MC(?G+!XsTX#;kzrDhmyg*kOKK_rQ= z%!}5$=qe2263CXm>(p~CMgt~O!nM-WTa3cKrDTY*RHhHvfG)2Z32*vURqeiIo)LX{ zZ%AX4!wP<;(}!#h)IABOXgdU4Cv89;2XsB7r>RWq5XQr!RYN?JMw_v#^=FBhW)x|U zkKvfNtIUh49h0>xG&T{kCgL_BJQ=b2#%=~w*4$t%LOss?rgNO{dG#9REycvsLtAjl z#Y;kUID9%&SgNjWGf_O}OTZcX#Aho7!(S(-o_8@E*hh`u!6_)u-Xl`mv*Jk5<(y6Q zX8QaC@|4~q4cao@xIX&*VEjo=Vbw2^1vGK_>wq0Ac9YLCG&LiLb6~r6SoI4vgC@>3 zvu|^d{^i3q*LHx${bMv&ytQD$+BV4KBxkds`5Hl3K{yDI8Lxx*j59}kf$ z{Q9P_+Gn{#fwHfDz(}`6P|thtJId;wD6A|gB1%505B*iDICBj4Bq_r11@?@4ddqiN zlRXeYVMZxnhheFGe1q$_Cv2lFd}*%G^xh zs*+Q>z{D4EuB3~>%qpt?v4g~ORo%qD5yZ&@O-dpxW`w2?r3k)fzS*- z&v&Yvdz(7BDqZr}I9i0Vmyu9tU&V(lJ732{jpkVP`2=U`__U*>*Mh6#VvFRm>ZR3`u&@Lw2p#mr{ zK{OMNb2DEyVBhOr&J6Mz)4mL@8nwHn?K{gQORekBnF7$r=xr;Dg+P0~?bC=BrOXqvwRtOUM+N#}E*Hvuys=dYEmS z=KY+`uuikqdAZ?p%|xAPaFWhl@9=Dl-g`hu9c89Y7!T+C`0}Xv15t&buyGRIqH$LbT4&hvlJdU8{BFK- z1>3U>KSl&06Ib6dOfwyRL|Y@cp4)hu|Aij>&Fn@b?7~WafHhkuml6zvZD$wOfVeGj z0(X+W2qGn4Sc&#Hsma)aTNpEF6jfkku{&Rn-qQ7Q4>HJvX{T{UI*^LvboNFrnKbvx zm^=|@=q8EZfsug@4p4AX>DFu}%*1>Fb$W!TE?uWmF_0YYX-C54d^P-uix$+T6FE>3 zrfWEQ`QeWArsLp1j!vE|lyylgaNtrvEa zgyP|ywhgRCr;0N^n_G0zi&&Wu(Dq{L15B9ZA+AW z75^j-Bjy?1zC4(55b&w;{9 zwa;`|Hlc70c`GvY&Z=^=Gvp_Jdz6%5W9H%M1h71Q#?vXgx9!2qa|z`f`FxJ(EJBGN z(wV${)b)%-({-{YBMl;}=dm5taGD4wCx>u^q;Ka$d{zHZkUmE?fTe6EZ*6$bGEy(P zG+)lmpomU=XmlPwQl8$Mv9+=|YPQ6KqlWCN#Z@APOvrw8+E|mFa=Oo$hwex_R@gyx zh98j!V9<+S&B%@#T_&TVq2eN)8D!l?M7gdD_@{`fpA!k%WJ%RQ&V?&wZ~LL%YUt1~ z1o_nh?6Qt9emk2}4Stw*dymWNk~%{seEv;6yPkUIB6n}4d)V9jY!zB;#%423N$mL` z-Wzyvmh_GH{eHR44uD8otB#w|C4`jiI=M?1G*Qo2=Uj?RM)H}4QX_o_Z~FIOmCKI0 zZNQ~E52|}Jey(|tO?DbWwdceeRw< znXz3xd>T;qZbn_H97Fo}J>R*-V>4p0-Ufk8Y|5U#S*)o6pn(1%DaK<3lT{6K?gH1* z6G+h_(V{&c!%sAt&T|RoZULNk{BK=&M|v~pHBYC zSYq1W`o8&Jy!0=pNdjmD3HliRxLb?x4%<55OQ0xDr*pOf2$3Sl5zf67GTNl5B^p|0 zBzD7noHY;b$HiV=b7KnZs)ACoAAPr6_o=Ac&wadJb@9E$E*G!Q1D&xUr-=HhmIi1* zgS8R%dn6vjxVPb3aN7pxv&6AF&vRA1d_2#0+#2XsuO9!ttj=zhmC9uI9SO^u35PB6 z?i#nGRtC;3*o4J2ZnNaox(G*DQpesctC^!K0@X%KZz;pKT~rsY<;{d?)bvY<_GA-l zVmxjxeMAQzp`q6z!-umcYoAy_R5k) zjdvW^^bY>r)niR{`6TNQKu`Fst5w#h^M{N<3KM!*z>L}PH7r z)GSdauMiKz8?d94GsyAqfHW;<(gOYA*?`~LtLrmiE|NItBw(~e+#C0v#M3_ z1|j*}6(5#;TO*p^bi!P$J_X?gCdBe$*B@``mx?rbmWxZX`YgLSuZ@e40`+W$L6#k- zV{}lS_^bK56>flIwUJRVL1ESP4IT3bZitxR&}&0{VuX%6d3g~K%$Pq>f;9EM+guk+ z0CQ7$*P#=z#z<({ai#Boo7D&rFyX zg|E~`^a=?t%ONUW=WXDf=2wJlb`{7i)}^89v8WMZbf&f9K5g^y0BNZpq*P7IwnB+5 zhWQ-FDGa;I-GpQI8nFsO2J!_h7Ddn}PJ%FdmHg7hkq9kX`joIC<}me^SK{qikU z{0=q%%cVY>nn4BFK*$#6DjEy=Xs7&fMK*hO&dbI9`x5{Ee9Bb^sUvUB~;ZDLpgyLe0H0c1a46_5Cj zUoD@P2qvH9G65Jty3#Mt_HR@8#RGxq|9eBRur*cm;9#k46}i3U|cmU%mVhFu;fW^I5=40l4vRPf8Wam38># zYW&^!ikb6#;BGmr(ppgIArN|10Pt0+SmbpJ0qJk&1bE(`4#`x#Us&63%l6j*{v*35 zRX!KK=8ot}lF1Nr6V?-kE_rdP@7+i@--T~+KcZdJJn7|twN!9$d zg=~Jefd1}#X{mBE>Oa5y>#Y2DLV~&0AuB`w2bn=St`!L@_Vt7n&zr4bTLAx7{gA?j zzyMLa-f-Yly*2+_}6#St5Jy6O6kecO(Ptuq|Q9m?FmS#pj2 zoqo@<_KN<1jXl$9!h0aJ;@TPx$+kMMPfEksO{7j-!|)&XvjB}CTiS>XwfRXhtc7+k za}#PQxFSi*g?xdn5i@0kKJqK$i?p6x$JMiyd{|Bo;Esa3S`hz?E0^Y}uicGY5}*_{X#NRU4PE3D=TRI66BrHBF5`+T9TKsA&- zXA1V`L4RkNC$TqbWd2h@#E5T;c-KLA?7Zb}f^vcN0}LV!`qg3Uf4$4yk#Ea5 z>C}D;tum_@qlGz3KKeIKAL1sD!7_XC4CDY&3GrsY`R%2;^6aW2CBkDP&}Od2p|BHY z3Hl-{9@7f3tOKs)MxdrXah@?T8MM*DGPm=^s*PzoiNT_khS|5^pPR3y9KW;@ezxB8 z4k5nono6yqRZ8o*1`{53nAA=*e83-}xcUp>CuZ`6_9 z8xsB9sOg8xvn*fFdb{$Z8~t5S#UXQgxr@|iOGWd=Z}fV*0FB8k3MOk_&Y}AK_$8>b zTd|rWLt2!t-^HRC4lB>DUhHsx1FmlaMaxin!YiA<95kGk*wA&Q|3L-d)kHxwgX z^oF8V^o_pSY&~TYhc8FapBV-jA-;^8a9;)nM(CU943nSYRZW?hT%Q<;#8fBt5Z>}0kl&K>Q@&hxuuq*+VwjXmD?hH_2p%9B)(nrODjPMN2@%YoS; zScW@*s6)LLzXeL1_77-HJZLAWstHL*aw-r8`6C>wG14f|#w-Q3EhFx<(vO$gHd3#h zFR@$s;rc^AMz3~$56qY0AMHCVNFJiMF^4MU$#1+YKX~8^5<9YWkf|WWKrBW#@B?t+ zFhDOwZJ_8)5s*J)swEKW$2yG)>VtSeL8MJ#i-%&b>9+=fbdFMOXA$1LeE}Sa3527| zC~3I8v-V)dr*Krds|RLslueMem6gJ>;pfDPD32c6u0-6NnO zzs~33w~yIsFSbgSYM(4wFr*e1;I{zdCot@MKs7c+;4@oJg4gf-UM?^hOG*38rgq`V ze)VHV{*o0Gx1AyY(c(4!hln7ZKx%j;>@X&h#ow?yqk0$s@l*g1uW&!cmA4b(o3^zF z!0>{0FuZ?B-2LCz?PmwyU1-s@T@SA4D@SE*YudBwek0~e)7p0rzWe@(Ys-u+|3U^$ zo3&Z>;g2g1S$YA5!t$0q^%kj}WA+y5E-xOCH3p{*ekuU-s-82-X*FzgxutQDIcH?T z{%;l+S3{S~d&!I!@R zb;nAF72o=Bs0c45Vk};?LAgZQfg=M+l2RJcZoFPFg$zIjPkp$x)|89=(*#MkC z8T753Ik7E7`7IGr7u;d80q0=ZxhIg)s04K;`^tYcKYb0IF@MOoG2vT$`kW``i?pWu zH$Yru;H1$SnJ=fCRyYu)-RFZs-h~cr$fCvH1)xz9QG< zl?jWC%-nI7{W5{r|IqXT-)B+pA~6##G6Ti9wsq|qqi&Mg2j80*6X+$FrCwn$M;BtN<=(lPR2EDDla#CFBB;3s;W8%^21 z?-|a0Y&qmHbA*$(B0@LtHN}i?^Re%d^*c|2_{CnX)EYo*O&G0+v6TN`1Hz32QzW}m zA)oklhCoP0yW`oh!TSq<47OlW%n0TeoOS=wUv{?G-@rMb)yhNr9ywv9YTQ|)3DgWK zUD>mUakK0y$DJCD5PI|xpA#kYXdgaD#A#@j&TTI2nWNp3 z&5IXtlU~i(E_A}UBZ5H^*~*{J^`sH+%fg^L8PYjPxtxKMSUQF6pIiqsIrbRPH!65s zIixb{5Bj#Q&t)xNT-lX6KV_UeKNSyL#z}wC1hG)e3RKp31!@3X#YX=(Xj{VBO!mRs zpB1dQ0k|C`^g(V|ucgUK(R`22G^J9KxC(l?)# zr4ZFJW$XjdNSH@)ocSDg1#|lJ2IW+qs{C2fWx{20UsDHO1Q&TzqDZ_>y#Dm!4?1V1 z2i`8#DHZY%9wW?;qJsAbZWV8TJLJE~Z?_W1d4m zaPKaK)hob{yn*KdQx#mZuiHr2N3Y&bawaq&%Cuk8vHs2FoiAZ`Hro11 z$Th4k?>JpEtSNg}lb%_2`jqaQpLSAcB;WPF;d%^pZ-1zv3yB$-*3>(_(Zb4x!f_K? z`0lTE-rg2FLgS|r$6!eF=%_gC_80OS*9ykC=wX`P8N|GZ=Q}NSj^?6HkMdeZPs;w# zkXb0ZYHt8VpOvi_tmA)Hc+*z$z+qa{vySc>gn!mp78h9OniM0kd+BOkNbY73V-F&- zggr;H3Kd}}+%)uDLT(!pbJ2ehjbpJ%dKKYDg2N4d<|*{?yIiu{kFp`dPf&) zMt!{OOxQ;+f#A5?ioPSq9caf8+ zdAf<2gY}Wq9lix3Hv8A4Jl`EsI~{H9GPCkPDuYw`)nQsh<08WUMze+F!pei3A?*(M z>A*L6M@-0qFtoYWg^-+Sr<*9^;njsJq^oMCsW^EuBrha$9^74bMc6lOBjk9X%KXUB zQ8Fu)Q{~xd;vQAvRgE%Pq#2jm_?ey{i(oPL$Va;&nwTGGXhG1c(cN=%hNQlCDNF5$ z9&jDMYKb*cjA~OKU1m6I!<2w$&c*R^N_xdADZ4WM&Z8UcC@wVu&+Hg6T3u&~`;h?> zQ;0C~7VLvWRr7N>P4Tq>m4XtJab**NijPxs>Mq?Uw(ohqauXtye0iwX$V92dZAJR1yuIh~*<4c3yudF28N3mmns2-C=0T5rwm5;*D~nC)AAide7eN= zNq0sL{jqIf3lCE7SfO7OEP0Ex+<0-Cd}`Mp30V_s3o zy0Snbm*fnySCs)1zke-V3|pTqNf0Ya!K;<0xTuG@*nYr9pE+dbf44T`-iBQH_6#<21LBPrk*#>d zJu}slwsel87NZ3rOx={Z;Fi?b+EznJ;vbp>!=Zey@9syQ***%UmXqI{;Xhh&)n#&$ zd0~WpXE!8ulsQ+8t74>&XM4nJ$a2U|DaklsT#vz-w9+^m-eqgF67#(I<{eKRNFrpdvEwx(hzC? zs~aS>8%(wOHSYqDS|g@5LWRwV@C;04p5d3N&;~-AF{m{RKijAfOx1y4vNM+c$!WgL z5XQ#NiV&9yR-2slqg_+Q6lfasft{Iys1_o1C2~ctu`*N|jbiqN8jqzS&f6}u4V*_bRqbA zJ4YsEwr#3~>>(>RPQ##Or7_5ydYp*izD+q1L{5`-pZCiE0pWVLoaCyA6~Fx=h&$Ua zvFGKRTdbHPM$JlncNYT=?A`DY(deUhSK*R&)WPm4XYwOqjXpcORCqevk-Q(-EjpXN z6wR2&Tqc{vM*c6wUM4@-iJCwKr^9h(w<9Be+KV6(nvPr`$))Ewk<|f@p{oNBtTUGf7@D1HWQ zFI$OWkCgfu7!y02E(@_(`*xWebldrlw1`7e4;F(3(~GGl>S4uzKU1m(=j0iX2^7hQ zFe=oMc_!mZy*(1@()4SH5Gr<0dX6J7!G$*_^|(B;!@H==DFqQkhPL7m3O4VWDt^2o zX)`ftb7g19CdRVcjKXckXw@zYRD{I~?25P!nBF4;tB`8{E}8;?1eIb|Y-@pG*&Rri zWmb>*P!^TwsWuX)&W-o7XxML+k<<+=4&VPa`0sGJ-3k35z40LD6b}XmMw*PUpwryGWo1`9C zwKSK~xJe$>BP!6a3n?pmg7!o56Ujc7tO5RfPbEF?T17k%g`8Z|$Y z#9t>q+?|7ryMd4`F~Un}NIM3nFX)~8Y)`>0Cqw5l5^Yi;y%^@Sxs0s_y(u3VeJNGz zE=~`3aE*(C$w=IcO`cnfhY?H-o29Rl5U{ApbTmSgy*Fb?5Ou2?k74rOuM$ArlDP6O z0O^18{Y8=HiX$R#U3Fz?k)3Fee6+^4Cb4I5`P&B(tfd78-NEyyA+A*-BXP9TOdW_k z#5`(>YwgTP%$pG4y_;iFiLr5xqofW@*~0j{ zBzigeeXt8VIUGMzlYFE9*f3*N+=*OsFGU6kCo)A1-|3 zy@(TEyC$;G4rOyy<|6aZL-IoWd+s!TklDJ(eD7aam4`h=sJ2mE;1*?fy_y~+7cI@* zGi**0^&dH&w{i!F{CRHFVATA{U#d9|JLW&~Qgz{bK5~0p=B-Whs6SE1#ck`+aiUkh zZmtTA==8L%3y#0t*unj}#hTLSJHmAe-GW!@)1YfNM*dJo`jKxfU3bLH!t#tXtqQKy zMJqRU?1rr9BW^s$^ix!mZWU>p3varFuM73qm6QOK+@LT75 zE0`;Ar+3|uW2+MKwE54{Iwqt+r~Kv0kFp^|{6mhYD@?*PqU(9&X@g(o!d)AQN}&!J zSX5WxsJ7*BHR_su^mT{)JWwV)eGKlXQ85Nj+H#(CUGQsL*l2#z8M#=o(QL;Hfh9y7 z?g&;;@_i@vkg&?@KznqxbAWR@xU7m zl;icb)U*^R!F>sRf2^K;4((rm0iC5q4xO(+*mY6~$YA0D#4CtG4t`x7T!*mCvaZ}! zn-m&prz%&h6B2^PKGb%Kva{G5K0gmZo{7{$M7~#jRnhcTWrheSNb_GD)hkh6kJ$s=yQ?Wh^&B(YJ$%+~K zJZYMv!--i+l^yKe$UdaVNMw*;K{#5cJItHJWxt1c_zb(G!nB_(>%jqG9%YWw=xM}KZMx^u`?)O8#DWEO9q7Yh)Jh(x1?uTFx1ipYTVVlZOXba#Iufr@ncVGl?zAB8(vB@ znrg5uf?Dh}KS9qbI`yb7S}wfd!@oVnG42#qe(Uj6jBs5(m+y8x$-N#PzpPf%iA;U# zD4xBAOcf)4any9+wTbHGwRxT~bBVI*8BgK9^`f%v$>dRb9_%`|6?~*g`OTAKiXk}q zPDzP4>QP(MO71*8TB7r_8UF0B=J=0xo<6drZ(BHeEHWrSXh#?!NZ>>J+5OIRi6&V z3QK7fyOVWmp8F=D7FL!3AK>iY(Tg$I`uDqbLwK{41DO@TAz@Znv6XPpkyCMiD{=VG zP>B+8^+Ob_3J}zJY7;O))jGRF8nr&{9|IBprge;5j^sQP={%Os_WvUS(|t9z*x$%R zN7$M7r(Tqr=_)9Vuk!%~tGa-P>Dx4#HuxYT&i5#B0Ut?cbH5rf?~AM=pMiyGRG2r~ z_PjbtYZ=v^BOjxxn2c1%Z`SPvf-05liE`*rb z#Wt!9c;AOH99}_P1VShq2A>Dt8NyZGiD*gMh^hZ=z;S&@3uiL{a5lrgXey67WCO!5yMcKETvjswH|W*)CYcD(!4!d-#{dq; zb`}V{2R{1#(=Ba*;V`6PXLDizKzi%){#gKT_I3xp+}^KhM)GwBSTuufhD`Vd+$R!l zG#Yzhq#MLF9Z9fnFOc{rOaFDplZF`QT+_5ZPOf}KS_HNjN9j}7wuiO&6kgtITEMgL z?1S$5z{=r8@G|XEGU&;@qaS$QgYC|fG4V(*A{+(w_guQ|o7=6C>>lfDsBia~r)lGm zyWlk|4i$l2SxjbdPf+hmYvRIaWMk zl)#KodxfkGjCxLo6dwz%9g9(>DLoVAfDYQj?mTKWMU6Siu8j zfOUE|{Z<9)!(Uf(Ry16k&7Up*jS7?}(dYQ3_M>3dmfh+#D$tt5@HdGmKf=X>dzEjS z`(1>9CS5M#q&iKv0$aN8HMV^SHXu-pd=pzZ^o3YAFTcv3lcJdkJEE^+e}D$zB9S&< zj7o0Q>o$HXEdpyA;g^SvPzI2U)odSa$=TS~57+dwiP@!klA`~hpGkPmg48e_N8VE6 z*K(iM5%x=EOgft5$Af?cSj_!kN0Yz$Damy^rwYj>v+5cRD#qGe1*Oe|Op_4Bem$74NCL3AiD%Ng7 z->ttqeZCYZjbC1OHzA*kaRf=0y9sx3k*3n+lTJ1aqaihGmMlLj)~ZiC-QPU=ljx#@Di72;P6$r+*Ra<3`@f$02nnZ>xyl1$o$#{e0|6AacWY~ zZ0r=^^-0b@-Y@g7l6}tt?3<#hSf;N+doQnEENxPdE$yn-c&r%@4uPF(8)?%B<#sty zde>A-)JwwJ%jwW12?G%=4az*! z`o(+3gA`l;d{swk9_`RK*3EZ^)Jsze;2(6hy?;z~#b{ZGfmY2!d4940hdkdXw=Xp} zBC=);>IG?Gj@;150Dg0!deWb!;P;ato}paawyMlUtBIkFv6aCiFA^?)xa;BcBZnXE zCmK`E8Mk=g#@jiM$?SVihHN*zJ~%tIFXyrB4%%BiZmI%ZP895@ofJ*XbDO%=$i0`v zzgMtD7;PD<;g@%(e*vt(g3+rXd*?kR;U&==m&Bx#?tfB3Cq_mO)P)98+Ad&KMAR2>g1d2fq3J78Dhti z2)+4d$yCT2R_8O4Sy#0M1D8Om`)X^7zSz3e@81?ty}HQHIC;L&F?Mw9Yx8T#H+j^+^EDVn?S1ahJnAb6|Ax8r z>;2Axs$;=-5~P*<`yUmrKRMbF&>$x4*AN@NQ{pV*I(n^+9ilJ0Al?g5Nl5~IJwF=! zgvDt0exBR+Vsr1P$KciWxnn=9){e!!#H636IuA)U3ZHVZyo-8oDSffc=5-V%@=Rjh z$CSn0K3KoB{{#CycM0b@;qQ;%!_Zpa^Z!)#9$-yuTmNuE@1YmzAiWFHdsU<=z4u;1 z?+|)#3W9>56cOniq$NNAK}AFXsUd)%)KDb!FX}n>f6smI`##UdGnuUQo0ZL;*?VTM zw)Yf5{%q;k7PI-d7G{{wERGH|I+kaos-rG6UX`o9emzsHUZCloywM&O#rdCL0L2(Jdw;cuR0U;vXX@mKBl zxKUqdFhYHbV<+){&PON(A~T9)OUIm^wZt9_Q{7+NJ3|S4a|}VPVfbG*=ZMLOVzeR3 z1yzyrBS{x~btpScDxC*6^ztlSgtAnCh2CQQ2YezW0G!;(&enO1bREi-9U=u<_bVc4 zkb(=ZA<6f%jTCTXQ@R0I z_!kL1W@NMBQxw8G(CCx;vM9Jqi`}8tW41ukXLC`UcG6S58w0;B29_I2hg+{~!6&Li zCyIVN^}E#RtV6B*N zHjqZ*{jkzdriW*^OrR621Z&8|`OvFUj0yzS&x%dYZDEBj^WoNOL9Z=|tg<0Ry-*>F z{TcYP1E_UEqYG8N2()u!`de%_f&F`Ks~Cvigl>|YRr1#1mpolUFdc_i6WPpG4d2_p z$c-AlrInXB7jXK{30iEr!Lx@(+zYP6Fpbc+$A>_=cma@gp!~uiMZ0>W1X(?rMdZJ* zkH}3*LG__cQc%1F+^`i@BH^(UtXW7mn~2pNn8v9MpenZJIL#acp<3xH8@xS!f+fwc zDV94cTIM9`1*kGg*!L(q%4*F!(e_0M;F{7}qGFH~Yaf$LW+=<-!wb3QTN1t!w%8vT+9M&@ zSAx&Omon%d`R6&4vJGlz%z99o_qy@yI}nFKnoA%VtWy_MCXzxEz3T8Fo6%j9ZLf&gy5I1d z={rpYHpLlF_brNGZbhjZVOm`Y=W07Aw&|>cd!!a;cnJzg65%#HIlvQgL@&2Z13V~2 zH^>cDs>)KS2H7UsmDoAyLaw8G8y@$G3_Rx4wOTTi>|STOpxKc->(E>Q=Rd9*OPS}k zN$PBHTM2rMD8Uka$wDbYy)ng6A%-&=TyHByI);<*j8{>PC|S-uO!m9qod^yjx7*61 zx6%IGtK;?4vd!c#6NQ~Ma8PxrOY!u>hBh3uW|Q}#8{z)!t7G_3CQPa-J2jOtGf84D zW6I*djFE<^tgVxacFeLYUuuXFk-Ooj(U8)E z6+g{|JH7K+c&=HRlc4m~qYQLBl4=MWzNbIybKY2Pc=R10Zb4i_J7ItkwG!!_*F=AB z=MSPS3GkiN90$3hC>C~RujlD(g!>fYYAa*zFj_CiHBU4Xbeem4c&eT)50Ul=>O1rp z3l6xMcfWTBPrzAz)FXw5*}RgXBc?QGT+6m&D@}GIAogd2DZcOxx%Ux#NKg2D&bJ*+ zV#&*1%Gh=X%2kwnwra$^FgYw|g{)@F@xthL!=Vz$WKVGS$l8Qkj=q>hF6_%`Z69Ou{y(EHJC2yKB09WYfE~&%;=jN zs2bF%FzR_HMTO+U=%R9!>B>2_Ew_bL!JgJ!6_&}b~LSIv2~<^ z=RkoQctGSAlTjik_C0k|?CqF1b3&K%gAVSB>-g1?iq-T;9a&HS5ku%JbaBE+ z1?`U5_t1GNX49(T&Co|9saeUC+_LqQAQ}*bEnl<+Q&lpPZs0p1zp`@Icj_Yxyzgd= z);$&;f%sQXO!SOt6^vz=PS(Z|r~K~*jktmxIxW5Eod|ac@Y6{-Rjs}DyR6Xm3#LlN zw|2F71FWIri8B#q!k-Ip1lp~nd0k*Jeot{@Dy+A`uo(4$xR?N}Ar}zw)uJQqMRLjn ze=v;IJ^7{}I%2t5oXkEuVxhTQEn4^D36^DWmIta-tbIEpbkOVTDQGcJ>S59D*u13N zP51fQY0?-zgm+5^PLH?bkE9X0e(%SO%h{=%%&WsEf%zAY(T#XN8;R5;jL~Phw6-j< z@V!Ub<^Qyvkr(c!J>NQk-TbArtg)qM@QLJe2jUQwUD<4SU9%;fTvd zJ_q{gP`We`nua71jai9`>I3tpXk-vZW9j1P1%;i30p|64$mICazbLNx*(iCXdk;yj zdga>0$}`O5d#Y@`gI$xySVZDYM~LsUCEP8pPzhi2_9N(k&yt;kP*rf(6#Ue`j>P74 zz*mmtaO=d0MMktgk$b(Ui>slKWN>dD8;wXyPYaU#d4G|+M&e~hP^4bryuwdF4 z4W{psev`)!+;e#z@{e0wHjZd7U-u|m75JCKu^jsYd5XZkpQpnbcq_pdoDIqhGI?LW zQZ6t8zcr$X{C=EO%a2CTJ1-K9N+L=snGL01zw=hAY0C_K=H(L}V#5 z?dprTnToJy)O1nhX5VjsAPp1(G?q%2>y0Rk82U4(M{!g>)kM%~{?4d4{%Lzv=VnM+ zzJZdIwZy?YmG&LJE8UINGEnek{>~3yw&ekdCuQe*Y#<1}#>tAqq1(x_3JUKRT#jzVwD=;6oXlw(gt~6w;W60jv@u>o6L)Z=Uc|>!Y7g zeDis1Rwp5n@SI8|?l3@PTf;~NCD3+fONE=E_`st<_BD{3Lo% z83;nhxqR0hU-2Bf^!0+Tp0WSyTRre3?^qE@FXG6i7ldIq#;t{iSlf7vNa{Ma*HyQU zA2@5)%?$Xj@Fpj}sU>$+wb}P2jD+=bUEp3H5Y6L|pL;9gEnL!eYpS_eTn0KkFj1Mf^>lCw?G^AKE)RoN(W|{cEdPkB?gSF$lS$Q z5H3RGXQfdC=IXR+UP=Ufg1>8Nmn zZE)=D$=h_CVnBn6XQqVEBA|D)*fnp(;x=&KMOgszQ#^O6h#sE}thq+&J*j7wgis}{ z*7USH-IVVA8^HZ+z)l&*r+RgZ&*QzVBjr*wxxqM}K2+l%Ca~sWF!k%t`Psq(h@t&R zG<~m9Wo{z8$L9gS+ls<{gncJZ8xT$R+*=#vGSn^q7paLMZ92ptk_vD}3P*lmXixh@ zm|JY@fK5eI4L)?W?ecxtRwXh=^Lrgj!#uz{CZHi9u($Pc3Y-6SQIHyDCb|h0YQ!`9 zfmCSm>mK&-3kpz5suGKz_NxLV_lBlokzE$5W$TDy*_wv|lTq*!AVS0u8IvlV|FS^~ z`VZbW@nu*603joW+FiWyE}UqFimpG$-MdymS}-UFqY^_ZV&5JGxu)T7fkZbPK?fCY9W&mqRI zz-YD7c69FmL)FwvED$0`00(p~Js6)pClW6k%#*^3J$l_>!%yOuoznYdJoHT`0oz1Y zsuH6gzwWiR&`(<~MJ$L^x~IdZFKID#QOpzb@MlaS{|S@+g5`yNW>59eZdmzs6b3Gm z7ii2)D#GeBX!loqX>#}GEzX#wzcq~An$4fYQaq~TIEb>m*RR%NV1)_E60BCwV$l#!CGV;(Qp4hkRwpF5qb)eB3S9_nZ_BvVK)qa_f5JajT!1we zS&WW;2e7=~Yw#@}IS8jbd1TwBen&M3fRwn$etH? zHLZ)c=@4xHZUCNrRPIE;^{hMS5ineHtUPyyUXC-_Tyb^P3p>!754UY~pd+=0X?bRT zzhf>P@KM;rgUVEfrLiqFf9}CWL|*gk{K8ul#GCtS`bi~qBO~1U&pX&{ik&)&nkeKlFmD^;drXVlg_^qSv!A3_XD-hgPKm>z2x4WG(c= z+i(Lpp7euI#mCne@rFO*2jTxG8}sMr^0MmpyN;VgKDsF4|3-Lz zA%nO&etNV(IZQ=N=r(^8*GhTOJ-dn&?5Ary!c2;nzC1N6=~gD*aB51IoERYjfictM zakj4`1udbeuB+0g4N*IBMVufo>*+{Q-spV5dU-AZt z)xa$sg+HsH)@HOW3A(C6yMs}(L%IzOXB7UnC^D273f?erMsWZ@ja@IC{oOF|-ieLW zlav7AjOGae$B6B}Z2ihG=Kh@NZc zMOpW4HT0&A@%-`bA*4v`5~?~xpk0*fgrWmeMZb;tZa0jhE_kvBpGtHOwp|tm;>N6E z^i>1nBK+kB*ipy%wK~PGRVgrjyZ<7K`7stZ0&HU)#=mcBS`x0%|K`@e?0&$+0|3)N zl&X9~v3LiwTA!Kxw)8(di{XRMii|m)ZUUozmOBXm*oU;0XvhBK8BS=cAFazP0 z*23WG@s^+uxvhy?G=uvR|1Pq|pC^4!yl(`Y*=e(2yzoGt(%!N)@T8`P1yLf{H-Tmu zyp0U^GxgI)-AVAC{Iu9`5Z)Qx3%@4;(e1Q}8ZsuT=wu!Eru99is$*-6lun7vE{1M` zk7I%fCG6d{sY|v(_6MV@E!E~+s;r~!eJi$*4)l5w3Z@9dP@OlNc^pp^+c^=-mUs0-$?4%pCuJ~7vnnKB$cL`Jv&z?T-m z`ta`7*psYVC3KcGtOzSI=^*F42UVm!w* zYFT)<8sS?VLGVuFb>29u(F{NSoE;%%w61sK>%Blq}2;+ ziI6vVm%Wg;i6E5cc}BazG;f}BUG&_lZf0WhnFbY?FrK*prjmSPZzf@Eo|TEs!W!mM zvh+^o41>>WTdd@{FPBu!`$N!$M!}ax3}md2zM1oSmZXnVxRtFIhI%lp>u566bIWF> zRy{WS;FP!GU$&ZXYmDKQeqiU**9&~R#;R8yJ2qE*$q(}7;Jw|~n zZW=;1$xE1ywzd>2bzOCo&ncj5AI)(_tc|G2&Y&%*akkjhH`;P3P%n|5w-e^H? zJW&4G`~L`6ZB+~9pZ(u=XHsf3=I*+)Ma%}Ccn*Ex*r_jx(LTFm5V#oJr_2|QB%A-|O`qX={R*Upfi0=JU12&{i+~Jf;wiF)5;xm!qx{uzY+)(Tr}fP7Yr%`{r}qUyUZc67V3&)`2lpTm7`o}fif^&S zz;R9Hk{8(hB6IFO;F`=fWYq|AF;5A&*4yrh#!&Z{dHk)FlocD+=%5NfMWY|Yh!OxR z|1mCDA7XlXIlvE!;lY=|CpkSE;O~e@#;8gwT=TaPR!{s%G1Onr&CNzk9HrYWcoJhh z{r%jG!WQnhM^=}Pc__NjT_$apVH~Ws2Lxy^#y;fAhCG-75u^G54Z>Wj4f0r5Q5e*e z1z1(j`l0&(H`IoYL2EOtTD8v}8BRpun2U7)Yg8&7#9(k$ul!Bs=l+TVwCvq-%8174y@bdX zbdK4~GR>&`2#cbiFmK)|BT5=$IGHdQJm$*@(;Mm*#hpDIx_nlwOq_E(d^(!V?!z3{ zDtw~cE|GWe;}PmKR)*LZkuk8G1IKV-%3Q!gf;Vv&7E2LI!| zmD*4*H^$YO6kGWBX3s2Q9klFMQ@=M};N$eZhjc6qKjuLNyvb%#%6;lGhz_l#TC3>0 z|JiB&jv%3l4o*_`gujgr5^b-IrYv*zbr*7i1i+WChaBPQX)*^NL)Md0u0i{0&90ql zL)QiO*e7NhszSvOG|tOH9c)(1B2C|g=)mb%KNv+Vc99OTCRqF3Kp`XO9$t$9FdMhk z4!F!Ljp)Y4@8J!EGRI=?5-@=UfK-igm~QY@qn`&1-Qxp^;+roHo#2pk7NJWZz!0*t zU#2qwMWf;*1&3W!8K)8SEMX)99z)a5L~a)~u-c34PqQT>Xp}Jyiw(_>fpU#0Ap#FT z($D^msX+*5$HwkUZ6#EJg=kaNC&0N zWA#LnI#lK(pS&=x*JbDzf!owp0%6_{hWGBlwPBz2ftWTro=rDqy+6L_olpm=UEh@) zn8u&>x6Ej~`@*Om&-!3axxcs>&)PrdcrcYvfM(5LuX~FI!6uOWn4hdA+O3)hJc?bj zhz#beWj;Y@wg_mUX|o|A>GPS5!A*_?+R`@9LRW4x^0q_^N#0 zN#dD%i@ArSd&=l!q#s1?Ypy_rQL)zmna=m(3*pL^ zwg@HV3dsrZIbf~=>l)a+uX8=oSNM*X<9!y9!a2W?5J%?T*>~)hXB?j-Og+B+P`*z* zvo}fev`aSU^T2ULV4_RC33nU#lEs=3DtDl;OCSHbooFe>am$tD^&Efbb!OCp7@o1X z0ES9-A$whB*nWNPD=!gXK$F>gxg4|l;z|5#x4a!Hu;f)PzPM%KyOb`vhGQJ*qP<_N zwxz=^+*1J)yFg{j7k(XZ(tOw33EQ{~2^n}kR`_mzK5cSmSC8I^;Soc$rP!Or#|bL= zVoz3DXjZS%zrSTmJokNmJa}nJ?Xmu&?fcu070Vd!RcZ7!GYvn&O9GdH_xFDDn2|DP%@MoY+;7fSgX=XgEv z)}MWoS%sa!6OfL==_RQ-3aXi1hW*H?xpU3;Vt%f8{#KMr9s~w+-J0yvprR#|iCPMW z9ah%TuJ25@4-GAm-8R(gUzE{PkiZvwAiZ*VL?9z#S9A7E8ynA{lKIYjeXsVLz5&Rw z6me0mNj0whqYErO)O3Gz>q99h-_qGkw#fmWG~Dv~Y*L#BCqvErK2z5kohX^}UB9)5 zwovIjE_m*}KA;r;#@hl?0Jz-0B=Rc&05Z^vu9_7`Buu}db?;EG+A+G(IB7A%u|wPH zH7bIE=OC?zgy2U_n$JgxtX z23iK)#pF1(bW_lMQZQ2rYRC1nUyMIigR1r5ZzV&LLqXFZAn1UF1lk0cd=r8Lqz5=! zoMf>9uNWMZ9WZwYVRP2wSy-2$;&-`rU3$^uRgPR z@&Psiu{|;+$J;7Z<7+DcwE}S#d!N5-3YNGjhS{ z!Nj^^TS^W3Xx^##jhxQ)82gptT~w!LdEWchAL6zgRlI58YI`$31WUO4?q57WStCcp zpy3Qkr4-8|OM+J!onKc&ZU@rpQ`z!eRilMbtMqog8Kn~`dvw0EF`5h8sO}rGsruxl z+=>{FK%^L+S&N$l{90Z9 z)8z41ocqYVA&mDr?V9}3irF6h9B<1W6@(lgnxe23*iFnm!n}Rwjll&4$^=z28lm3v z2}Y3wO5;=z?9+>U5-N*{CiRLwR5Xly8u|jwiL67K=ANX4R>pIZ99N|i`z>mwY>_YP zF3>1NAj3;CjNfphZme0?9ek~|(!2m5F03PM7;HHYz4H#AhSqa+GN7;_haspiuE*l) z7k|LYEz?SvH8+cewhTnkvKV(8)(+?ZjP=8#gz`@O@W)gn(C+kjT;dVb}&G`DgaZY1qAWc{9xGb+TE1 z-)n!{V^@z7+r}}0i|rqw7Lk7f7cV_=vjR5xeJFjQ^;uPLEkqSXJJ7vn1~i^B*ht@G z5Lq31JCbkUCA)6^MA|V`!(e-{Rqj%<{G~i(hsP$_TL$jIdLZ4vIz7YKB*bG`ValdI z9JFrnQ8r*-X{dDA_ZM4rH&lE*!VCCrj(z*}W2`m5_C16*4{cOL3)%gno1aSq`JObn2fQ^V|5N{@0r{cK;G#{O~>SLrpxCVnLiWq zZ7q5cYr$53FSnm8ta+cr_@!>A6xKU?6ip>{R?Hd=FK6;CIm@^RPAC(tExVqzQa*kd zsJxaD_!V!VrS;ONeC(HzGg|gePx4RvqRN8Tmw#+5RmvO?$qbPf5blnCO_EoMF((?k zgu|=PafsKSJ?|Zq=v^3ij6I}+a!R+JcFKD~B_e`7{42iEZlYvNJ7#3zW3M#Lk5W#b z@nsu(m!{9>+S)@$Zo#}TV`=!)#;>1JYdiu73%@ja!W+@hY3p9@O!A6p8`tz#{6dEh zw{{B8=o!<_em0)XmNuYKkI}%qp_Kmt#)1?0u53#3Dl6coH{wg7q@(7qSVm)<_>jy+ zoz7VA$H{>Dmb2>S0FGbm-Hc6{jt?uxHB%*zYCbu64J7vSth2u3t9lmzI`|XJs5Ckr zSK&Kci1*T%0k!CxqmX$s95uzaCLGonA9GJ>S{-@H1N!hz>+ktZN~Pu3qX6g|PTlnh zy&qQ<04${*>X|wr$g+uJKq%RPx4z%x9<{*xUre*NKFU{?l`g6g9~z(QYyVVd@-id` zLzkU{o5EWEL^aqgCy%Fg`@gUNOtnr{B%a8EC&d$EX@g$?nLhS8 z=v8yBbK03$8PmJj)7|*UZjDjOM7uYowCQ>k_En~T#Wsl5Se;HIb>7JCk5tsyVlw4` zI)Q=&k!6l52r6ct%4e?^SkXr7(T=YlKF9|O{|;W*TO!g)btfIvy2caD@$<)jhb`=< zfe5e9;X;CRS^nTlP4_w}s)M+gdkEqyp%)@(OcaY7G7G}Q!gf14on5JvxAC1A!6$OF z%`I3t-cW0b%wlifH*!w)Q;RCenBax^Y+%U86-@AgR&ufKlhk6@f~1_#dccY#Cgm(0 zV;r>q3T12)@=49zelqW}=oL8vC0^pP5h+P$k1*{dv){_)#@{<`L`5}7e-cK8qpbX% zbqZJ|Hy+=ia&Oqk+#4TyG!*YB*$2{GxV6E!?5H_2qj@sP(aRbZ+55&{Xtx~hp>%)_ z4{}zWGd0cOd5~H#A(^(Pxg}4ur!lKp@z!X6y(JUbJt><#5JAyS;eLxI`qYcU!c_os z^I!BwYX0r8`mKUT4+S)b>d{WTMar1V^Q2?)#fmY`KKTCyrcwWpG0#<1;1RgrxZ$Kh zbX;6}=S9gQ8ot?pW{$*gJ(CK9iMMIg+rNbpxbDA7ZoK)c;NOX7!IQo@!r>8!_}ZOV zP%~|k;^@I?VPFs<`>tufFv}yX!c8-BwE9RKfLj(*tt$So{~vWT3H{Hf{%Sf8+KG)ZV=r@7(f!1g!dO9iUD2#{{l$AwLOmZVBDru5%H<6jcLfq(zW|MbiMH{li+`XKnN*`C={2N zo`}AYEC*v-K2lZqtH=Y4v!3qb74RJ66~}hFhA5O|uLE0SpwSZ}2LRbL5EX`2{6)_x z*_CcMh5>e18)puiY z@GS8~+nk4qcn!PWF6zPz+5W5SjqhH@60lEn!AG&Y1}#7FdwOh2Ka zdq{W^o?RD^CyhaAO7M4|^zqNURJni{dE|9=JgJWZ&kyA)vaxVwRolW5A3n2{aL?42 zc6vryOn{GF%}@~4?~`MD$CvWyrMO$kttV&ECGd&e#82hsX7Mux3lbt*l9-0*6W1SSF$C=EjkFk0EQp0!1TSMj3c6k|Yz)bCvU5j+KOydt z_E@#qK~IaN@2lxtASz&wZiIGu!RYN=R<6WQU+%{9+}`*96o(q|{fr<>NiF4x)>hGb zh2W(Vq6hm>YuzBHQqsT3iz_x5<~0>U3+Cc=MCe?I%1@c_SoKGLuxP{!(Rp|MW`fPf zCia#h0J_Bl$dVW)XrPV3^GiJ*r|0tDP{6YISdvs>z@fcTM;%xNT$I(6G~T zRFut>PKMzVZK6yv2}UsY5qtRMf@%`5>mG&_FBdJ%DWJY{uDe{Lfw#tm`zdQY#0;$mwdn&4x?Tmv?N=QphCqE(cqwcZIF{Q|OKdk)_0 zN=&1UL%FSIxY%8I{poFd%MdoLD=TU``n5Y2msoKmTM^T$36YM}w7gDr(LhyNhJOs@ z|9J8wb}VY9_p>c=DL&luTzC(zSWN9HXZD$75W0#BEkNJ-kn{LMo_04?n3h~m^lfCd zw61GVUxT02U~VwO!F1;b|%BO zOu0&gZOY>XZZx{&i9J|=b1w)%rr4L*N;r1&%Q9^EK?lLlYc1gn_rM(hz2s1Ay$^hE zqWOgmyp$QVJJQ4-BR=34o1i36%6>D{&Vj~ZIUO|4x2v1I0av#m^6Wm11~%A#wDt>U zK-j?W%V1-?vHNpQE6Z}&%EGiK9R@ZrdHFQ@A{~ulNYlw5Hw1&tSBJC=eiq)c%b@5_ zGnuh#8fWEEjB6gr3!AX!^!c)4fthFEJd^j}Bi-aDN!iW@U-hrHg4jcJaP8@>sxkGi zTr;5fvf9w6@mo@)&iX=CIo1$SF8xT%8wK9V;i9_7FxlMXFNcQdswH^SX%`X54SwWpv(s*_Id&qJ=K)+x#AZ$d|Mz}a>GRTt%S~GMn zm+oXiD(>HOlK&iALO*Enpj=gJ870?(C}X(yJ*8znrv*{OXcZGv`_Q36hE%3O^S&D? zE$k-s$>;)Pu|EVHkrMMH9?P3)L*3F{t;R|T#q1aHiXx`ElUbzV_!VFw8Y$=hGy{DP zz7xv+KH_p82|N8IaP89cNy3kAIiK-nADvyuI&i`KLU-s=JL)GvNDkTtj9EGi?7EX) z8B?hk(G&dz$pz>Z1R?a0<|%SoQ9q5lq*7V2I{VY`3n8SVMHJU}^})+GqX`gK{491@ zl5D=3M?4tcog$JLxQpc%Le&U7wHnetFvQGFsA{8oAI>TNy>cIj?8OAZGGoVei^Q;=UI5DgUdr3_Is;; z;5&O9t#tcud`EX!A(XfYGuceXV`6%*irX%5JpH4?R;yO^J@V-hF2qD(e!3?t)E8Zd z_Px_EpqL$KDvNW$Aoha}n|>f-aAYV(Eu7|O*v;-w?1;B_*WF69wai+guLuY9?vc)_ zo={1pU11Lt?Vrj=E)~;)zb;BSC0qhwy68w2MLKIG%ZY|C&B;S@MUv8F&BZ`oh$;I8 zz9BB^bW$16pt=v*593u-x

    GV2c!1JQ>(XR|U$Gt(>d`;FV_MV1+Wp?M>|tYHMKu z7g$&Bm7R+!Hjv@&TasU~DTcr{X0U)4v^Ywy-kS^b(h?w|32Z$8HdI6iE`n=9#hI1E zK4pN2%D(=77g^~EE>AE6y&a85??{dN$Fdi*a_U#9EPRx_D@0JQ2h`CpwX;7C){)8x^w~AZ)V(!{v zkV%D(v;w#6Cy&Z*6$6v{d3NvHm8}Nr1it&Y%X+Q;M%)UR)c5~DWwU&A>7C#t0q8!H zpK)wz7VeokJ|+QuF=v%2s0;HF2v@1}ng=?@!dZA$NWH8#3$#1XmLm8UzL)%TTG+yV zJX+Sfd~;&=HqyE)3STqTgF3AM(|g1s99P1A-t16mioNAK@kDd@wToJ|>PObdIaP=s z$5MYT&T$LKtUKE#3!RAcNd&BZFUNKNVU0Cynpg74V(lZ=_x>z&Dd#ASU6jUmzB&yu zp`5F&ly;MTEGS-zNUB9er)lg_3wexWTrt*k^8U5zn-NNj3oY`H(#{4DG^K&=n)oft zJvS7q%I7F#pCW*>FMFC_MB5FOnPSQDArw19f+ywrX`}N7lb@VPDIVJ_v0a6X%Ee5A zklaSfeA8LNSs1W(&$XM)e*8nKL*-ZGF2PTHvm(~ZsHX1f$_K1n^mc=wz2V^I}9F&b~d1W zNDruMATKB-ziRvt=(CKMhYy+*qrsdkA5!StbMTX}=~0l#D!ed%atH-zG{ggwMSvy! zEmBaKj6hWJgm(FbN(nWQUF5D%pIW>;A2k%c@FjtX(k@DCeJ3SC(~6GZ4;lWOWIn(e zsv|d*!?T(V)AO27Li={&71z#2enEPtTqRjT6Q6Cg<#7*95Rrj#7*G?qcxK79M^*-q zpwZ3O%mA`GvIu3GBfKC?`iI1N25pQ=&x1&urPRjBe4Gsb->L$iBG#Vz?4~xBrpzye zz&-eO4~hM48te?$PF?ATqI9l9QMwC*Qg%Hrn+dfjhl%`bsZRDu=^LtbM&{4IN^|`XU>Lb`FC15>0BqXQnHSOc=HQ*PpY0PI~_>Phw`2q$sP3L(MPN4@g*Xe^S>Lqkmg zvNJ`S*aXazq$c==cfLNg>|smlV4VZbckyHQt~rgoze!%iq)rNi3@ zzkB3z3zY00iQP?SjaM_yN@Gk%%VlD8iwwWx!U}jc>;=CT9Cxeg)2r4|@!>Cy5B(;r z97KC9VH9RoF|}y|VH> z=R4*whS8SsAiBCJk->M=VJ>VF!ZX&bKYK}n_zpg^PuyaKWV7u-j7DZ0mA?V^DV&7f zM9+oD1cm~7ZiIDLjZQI#Swsa+GIIfTv*ks?Hp}F+0Sl~QHU}RyIvxYj{;ZI4;c!ht z>mzIyfR^=92IZSgd@Er4XAKcjzt{I!ouc@l)!I=x$CZF8{$rKtRs>+Rv2_!p0=Pl^ z%q)%yB_t)F!;bgsT69DB#uTh0lO-on(qrhf@qg#j{_y?&8<7EJobQDUugj9Fynw@R zt2;cy6h#yhmOCDc8p~i5eNrf|FIjMq`dJT}JbKw;z-YZuA}1ZETUp7+tY@tF^^tIK zX=mMMI3CD)Ul7%9lumlpf8NA*=@8FjpAdPEWTC;KXUXO&hL!V}^zr6cEak_|G_dq!8sk$ia%r0Iqj*z?1E>7X~ z(W{4caa6C`1FPmH5>M}i5pe(8vUP}x?$=8D8?1el<-;oiI8;nAN~Yk8ODovq2_ZK+ z0B{jeUcSCY{C$%MDI1@QM(t3ReX^c!Bb8;iO&Ocs00y!vx z*3^x7++C~hPfND@bq0tTPU-8uLd3`$gc*1FXfypzwxO_LR zr@!`5zs{S>f|UvKTd2?u(;EN!qn5LGU2NHMzx(yL7JEEsTA};#NWCjF`fBOqV$`Bt zd@h=mLVoR~3mtin=jrz4DdoD}%_^ZM@B3p)BuD#|`kW-MqyJpdY(sExSzJph(FY%2WzL*3J*PYI^0G*G z;ytjxe?mbiqW(I!RG}2a7kY>VE5asP>QUZ@DK3*si*#;)LVn^W zJ8^W3tycZUEgJcv@nmuxu$`#!t6oXo*(G(e-k(2+e|0fTrY z@UuiOqOAW$;v6x-*R>8h%7@D~>UZ?@A|iAiJ)U!-_3(9h+WMKh#UMg_s>1E6%J1J~N&n zd&a|6Ob>$LQ1vjo$2tjr{hEa{YSk?Mj5|?$4%1csZhXift83_FK+$0c@oMX|aJbLB z>dnZQDuv~TS3dT|oeNGdH6L@##~G%kql}sCe4qU_AZ(XkEEX;AusJ+{`_gKi>elWUp^^|dhIzqW;o2LZ~M;l z*hu?EP^D+zkEWMA&+D`n{N&Sa;^<2R!FqxiezdUoji7iRk{_r)pnE67fM5BA9VyMC zNkjb&ZMaWGp8QJDB<-g9y)%P-Dlqr!?0k;Yvzt-8p=5b#W~>70GJ%C*P?o@UP4N?EOd&uS>j8tSXl`* ziO#)%a?T96W^Q8jZYIUgH*0caMvYzCZJ|HBbpTc2X15OSSvLy5*OC7s`7-x`f?(K> zSRzT&YTCQKnS^ZLqTW^$OPcz~_mYxZH;!;s@y=Rxp^hY#17R!$#btH@>zbby0F$^8 zmIsTHin_P7yXJ?h?rOfB+KGJXl;`CLtG?>J%XqK-%_P2Jdn)_nXO``7^Q;rLHTI*9?F$-vK5Cb; z&oAFPuWAqoj|6Y4etziRg5pT9%G#Mte5J7gR-_(wyiG|ke@g}z_K3iq8Am{n&rD_X z7nxAoxOQ=zIKZ@4c7v$btI$f$3#xYnO(l^M2Ne^rFSEJ8PCc{o&Eh#o zl2u9PW)1f1$eA+xW=Uc5v)M%-2S?(36LZQZ>AKn1ythYmH&<3qi?9;yc~!88(qD)& zXhiG!aO0G+C2X*DQV5`^aQ4oOc6A6&aoFYY*`*w~qT_NxqGV&9y)cNidMB>Eljv+< zhMcKf7a-ua=fc^V#Pe}xL6jB-Xb3RidwRAcD2fTydPYWBB? z8cB$Hd#}=>`P!dT;iO6olZ+^OsmocBzyd~pb|UUI;XY%#nLAv#GMk*~mYmMMCgT(l zc{OZLW1;*)|AwQ5qmW6N%&@Ax4fifgacGqng7`>%UfxkA?!PaIbFEHt-b5TF4hEgG zvuFVmnC76ava2S6nq*5!nD@IUUCt)%a z?IuT}E{?jyw7&@WSDZ4ej!*F?d;}7u=f-n=Q)rl>vLb-pxjgfkrSs31@lp_pk_z@8J5{+^2zNC3raSze8Um@NGGDIqi-caRdcrrSBan$0S z=Spoxx9h8>nEB~`bMZyj$YyGfIR8VGz;5ui^bYJjK7B!^ z0hI!ab?o;n<|-WSYxwNK%h0P%`Z$@a@pJ^{y~dwc9SEK{_H^K=MwXWLJ>(1Y>q{n- zyr>?*M=AJcp6DeY1c`~F$(K22Lif}OP*KrmKVQ;*&017Q%$20>!PSyo>L!jG6yyyh z&I;@ap-Vt3Dn+G>ze6oaI8F^NOB`{Hh5B?4$HiUyMh^#AE^o|yEZ|-35{j6dhNENR zQZo<5uS)F%He4^BRA;r*Ufjl6e~j5Dn8_&h>Q);#1;Dyu|SD z%`NvSi>{l0ig$iQ#+AYnX-oUN=%=7B{tRtvF&&4AY0d*Y4!@MLyBd1x^{RGp{~tWn BjX(eZ literal 35078 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 UGIKoh>#EbesehwJ!y)qj0WWPJK>z>% diff --git a/apps/spreadsheeteditor/main/resources/less/leftmenu.less b/apps/spreadsheeteditor/main/resources/less/leftmenu.less index 100eaaa2d..36a0aed6c 100644 --- a/apps/spreadsheeteditor/main/resources/less/leftmenu.less +++ b/apps/spreadsheeteditor/main/resources/less/leftmenu.less @@ -537,4 +537,32 @@ -webkit-transform: rotate(180deg); -o-transform: rotate(180deg); transform: rotate(180deg); +} + +#panel-protect { + #file-menu-panel & { + padding: 30px 30px; + } + + + button { + display: block; + width: auto; + margin-top: 20px; + } + + label { + font: 12px tahoma, arial, verdana, sans-serif; + } + + .header { + font-weight: bold; + margin: 30px 0 10px; + } + + table { + td { + padding: 5px 5px; + } + } } \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/resources/less/rightmenu.less b/apps/spreadsheeteditor/main/resources/less/rightmenu.less index d50c9bf07..ea2ef2037 100644 --- a/apps/spreadsheeteditor/main/resources/less/rightmenu.less +++ b/apps/spreadsheeteditor/main/resources/less/rightmenu.less @@ -23,6 +23,9 @@ /*menuTable*/ .toolbar-btn-icon(btn-menu-table, 80, @toolbar-icon-size); + + /**menuSignature*/ + .toolbar-btn-icon(btn-menu-signature, 83, @toolbar-icon-size); } } From efa385f924efbfed572a41091610012daceecaeb Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 23 Oct 2017 10:26:38 +0300 Subject: [PATCH 02/86] Bug with view signature settings. --- apps/documenteditor/main/app/view/SignatureSettings.js | 5 +++-- apps/presentationeditor/main/app/view/SignatureSettings.js | 3 ++- apps/spreadsheeteditor/main/app/view/SignatureSettings.js | 5 +++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/apps/documenteditor/main/app/view/SignatureSettings.js b/apps/documenteditor/main/app/view/SignatureSettings.js index d05122ec3..6803cdcb3 100644 --- a/apps/documenteditor/main/app/view/SignatureSettings.js +++ b/apps/documenteditor/main/app/view/SignatureSettings.js @@ -132,6 +132,9 @@ define([ this.cntRequestedSign = $('#signature-requested-sign'); this.cntValidSign = $('#signature-valid-sign'); this.cntInvalidSign = $('#signature-invalid-sign'); + + this.$el.on('click', '.signature-sign-link', _.bind(this.onSign, this)); + this.$el.on('click', '.signature-view-link', _.bind(this.onViewSignature, this)); }, setApi: function(api) { @@ -200,8 +203,6 @@ define([ this.$linksSign = $('.signature-sign-link', this.$el); this.$linksView = $('.signature-view-link', this.$el); - this.$el.on('click', '.signature-sign-link', _.bind(this.onSign, this)); - this.$el.on('click', '.signature-view-link', _.bind(this.onViewSignature, this)); }, addVisibleSign: function(btn) { diff --git a/apps/presentationeditor/main/app/view/SignatureSettings.js b/apps/presentationeditor/main/app/view/SignatureSettings.js index 7a9a52228..f0d85fb1d 100644 --- a/apps/presentationeditor/main/app/view/SignatureSettings.js +++ b/apps/presentationeditor/main/app/view/SignatureSettings.js @@ -109,6 +109,8 @@ define([ this.cntValidSign = $('#signature-valid-sign'); this.cntInvalidSign = $('#signature-invalid-sign'); + + this.$el.on('click', '.signature-view-link', _.bind(this.onViewSignature, this)); }, setApi: function(api) { @@ -170,7 +172,6 @@ define([ // this.cntInvalidSign.html(this.templateValid({signatures: [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}], header: this.strInvalid})); this.$linksView = $('.signature-view-link', this.$el); - this.$el.on('click', '.signature-view-link', _.bind(this.onViewSignature, this)); }, addInvisibleSign: function(btn) { diff --git a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js index 32241a8c5..c11eaf545 100644 --- a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js +++ b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js @@ -132,6 +132,9 @@ define([ this.cntRequestedSign = $('#signature-requested-sign'); this.cntValidSign = $('#signature-valid-sign'); this.cntInvalidSign = $('#signature-invalid-sign'); + + this.$el.on('click', '.signature-sign-link', _.bind(this.onSign, this)); + this.$el.on('click', '.signature-view-link', _.bind(this.onViewSignature, this)); }, setApi: function(api) { @@ -200,8 +203,6 @@ define([ this.$linksSign = $('.signature-sign-link', this.$el); this.$linksView = $('.signature-view-link', this.$el); - this.$el.on('click', '.signature-sign-link', _.bind(this.onSign, this)); - this.$el.on('click', '.signature-view-link', _.bind(this.onViewSignature, this)); }, addVisibleSign: function(btn) { From d1bdace072e0d0e5026b88f394beaaaf3e618245 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Thu, 2 Nov 2017 12:14:53 +0300 Subject: [PATCH 03/86] Signature settings refactoring. --- .../main/app/view/SignatureSettings.js | 12 +++++++++--- .../main/resources/less/rightmenu.less | 6 ++++++ .../main/app/view/SignatureSettings.js | 7 +++++-- .../main/resources/less/rightmenu.less | 6 ++++++ .../main/app/view/SignatureSettings.js | 12 +++++++++--- .../main/resources/less/rightmenu.less | 8 +++++++- 6 files changed, 42 insertions(+), 9 deletions(-) diff --git a/apps/documenteditor/main/app/view/SignatureSettings.js b/apps/documenteditor/main/app/view/SignatureSettings.js index 6803cdcb3..9e089fdd0 100644 --- a/apps/documenteditor/main/app/view/SignatureSettings.js +++ b/apps/documenteditor/main/app/view/SignatureSettings.js @@ -86,7 +86,7 @@ define([ '', '<% _.each(signatures, function(item) { %>', '', - '', + '', '', '', '<% }); %>', @@ -100,10 +100,10 @@ define([ '', '<% _.each(signatures, function(item) { %>', '', - '

    <%= Common.Utils.String.htmlEncode(item.name) %>
    ', + '
    <%= Common.Utils.String.htmlEncode(item.name) %>
    ', '', '', - '<%= Common.Utils.String.htmlEncode(item.date) %>', + '', '<% }); %>', '', '' @@ -202,7 +202,13 @@ define([ // this.cntInvalidSign.html(this.templateValid({signatures: [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}], header: this.strInvalid})); this.$linksSign = $('.signature-sign-link', this.$el); + var width = this.$linksSign.width(); + $('.signature-sign-name', this.cntRequestedSign).css('max-width', 170-width); + this.$linksView = $('.signature-view-link', this.$el); + width = this.$linksView.width(); + $('.signature-sign-name', this.cntValidSign).css('max-width', 170-width); + $('.signature-sign-name', this.cntInvalidSign).css('max-width', 170-width); }, addVisibleSign: function(btn) { diff --git a/apps/documenteditor/main/resources/less/rightmenu.less b/apps/documenteditor/main/resources/less/rightmenu.less index f4ea5aab2..c458f8274 100644 --- a/apps/documenteditor/main/resources/less/rightmenu.less +++ b/apps/documenteditor/main/resources/less/rightmenu.less @@ -269,3 +269,9 @@ button:active:not(.disabled) .btn-change-shape {background-position: -56px - .gradient-radial-center { background-position: -100px -150px; } + +.signature-sign-name { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} \ No newline at end of file diff --git a/apps/presentationeditor/main/app/view/SignatureSettings.js b/apps/presentationeditor/main/app/view/SignatureSettings.js index f0d85fb1d..28b6af1a6 100644 --- a/apps/presentationeditor/main/app/view/SignatureSettings.js +++ b/apps/presentationeditor/main/app/view/SignatureSettings.js @@ -84,10 +84,10 @@ define([ '', '<% _.each(signatures, function(item) { %>', '', - '
    <%= Common.Utils.String.htmlEncode(item.name) %>
    ', + '
    <%= Common.Utils.String.htmlEncode(item.name) %>
    ', '', '', - '<%= Common.Utils.String.htmlEncode(item.date) %>', + '', '<% }); %>', '', '' @@ -172,6 +172,9 @@ define([ // this.cntInvalidSign.html(this.templateValid({signatures: [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}], header: this.strInvalid})); this.$linksView = $('.signature-view-link', this.$el); + var width = this.$linksView.width(); + $('.signature-sign-name', this.cntValidSign).css('max-width', 170-width); + $('.signature-sign-name', this.cntInvalidSign).css('max-width', 170-width); }, addInvisibleSign: function(btn) { diff --git a/apps/presentationeditor/main/resources/less/rightmenu.less b/apps/presentationeditor/main/resources/less/rightmenu.less index ede64e887..f48935637 100644 --- a/apps/presentationeditor/main/resources/less/rightmenu.less +++ b/apps/presentationeditor/main/resources/less/rightmenu.less @@ -204,4 +204,10 @@ button:active:not(.disabled) .btn-change-shape {background-position: -56px - .gradient-radial-center { background-position: -100px -150px; +} + +.signature-sign-name { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js index c11eaf545..4bebf984a 100644 --- a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js +++ b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js @@ -86,7 +86,7 @@ define([ '', '<% _.each(signatures, function(item) { %>', '', - '', + '', '', '', '<% }); %>', @@ -100,10 +100,10 @@ define([ '', '<% _.each(signatures, function(item) { %>', '', - '
    <%= Common.Utils.String.htmlEncode(item.name) %>
    ', + '
    <%= Common.Utils.String.htmlEncode(item.name) %>
    ', '', '', - '<%= Common.Utils.String.htmlEncode(item.date) %>', + '', '<% }); %>', '', '' @@ -202,7 +202,13 @@ define([ // this.cntInvalidSign.html(this.templateValid({signatures: [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}], header: this.strInvalid})); this.$linksSign = $('.signature-sign-link', this.$el); + var width = this.$linksSign.width(); + $('.signature-sign-name', this.cntRequestedSign).css('max-width', 170-width); + this.$linksView = $('.signature-view-link', this.$el); + width = this.$linksView.width(); + $('.signature-sign-name', this.cntValidSign).css('max-width', 170-width); + $('.signature-sign-name', this.cntInvalidSign).css('max-width', 170-width); }, addVisibleSign: function(btn) { diff --git a/apps/spreadsheeteditor/main/resources/less/rightmenu.less b/apps/spreadsheeteditor/main/resources/less/rightmenu.less index ea2ef2037..6ef9f2f54 100644 --- a/apps/spreadsheeteditor/main/resources/less/rightmenu.less +++ b/apps/spreadsheeteditor/main/resources/less/rightmenu.less @@ -332,6 +332,12 @@ button:active:not(.disabled) .btn-change-shape {background-position: -56px - background-position: -150px -300px; } -#table-combo-template .combo-dataview{ +#table-combo-template .combo-dataview { .combo-template(60px); +} + +.signature-sign-name { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } \ No newline at end of file From 5623c7dd3e7fed820a95002944d443961f65501e Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 8 Nov 2017 17:35:23 +0300 Subject: [PATCH 04/86] SynchronizeTip: added 'left' placement, added option for changing link text and visibility. Bug with creating several synchronize tips. --- .../common/main/lib/component/SynchronizeTip.js | 17 +++++++++++++---- .../main/resources/less/synchronize-tip.less | 15 +++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/apps/common/main/lib/component/SynchronizeTip.js b/apps/common/main/lib/component/SynchronizeTip.js index c8146b1cc..e981782d3 100644 --- a/apps/common/main/lib/component/SynchronizeTip.js +++ b/apps/common/main/lib/component/SynchronizeTip.js @@ -43,7 +43,8 @@ define([ options : { target : $(document.body), text : '', - placement: 'right' + placement: 'right', + showLink: true }, template: _.template([ @@ -54,7 +55,9 @@ define([ '
    <%= scope.text %>
    ', '
    ', '
    ', - '', + '<% if ( scope.showLink ) { %>', + '', + '<% } %>', '', '' ].join('')), @@ -65,7 +68,9 @@ define([ Common.UI.BaseView.prototype.initialize.call(this, options); this.target = this.options.target; this.text = !_.isEmpty(this.options.text) ? this.options.text : this.textSynchronize; + this.textLink = !_.isEmpty(this.options.textLink) ? this.options.textLink : this.textDontShow; this.placement = this.options.placement; + this.showLink = this.options.showLink; }, render: function() { @@ -95,8 +100,12 @@ define([ applyPlacement: function () { var showxy = this.target.offset(); - (this.placement == 'top') ? this.cmpEl.css({bottom : Common.Utils.innerHeight() - showxy.top + 'px', right: Common.Utils.innerWidth() - showxy.left - this.target.width()/2 + 'px'}) - : this.cmpEl.css({top : showxy.top + this.target.height()/2 + 'px', left: showxy.left + this.target.width() + 'px'}); + if (this.placement == 'top') + this.cmpEl.css({bottom : Common.Utils.innerHeight() - showxy.top + 'px', right: Common.Utils.innerWidth() - showxy.left - this.target.width()/2 + 'px'}); + else if (this.placement == 'left') + this.cmpEl.css({top : showxy.top + this.target.height()/2 + 'px', right: Common.Utils.innerWidth() - showxy.left - 5 + 'px'}); + else // right + this.cmpEl.css({top : showxy.top + this.target.height()/2 + 'px', left: showxy.left + this.target.width() + 'px'}); }, isVisible: function() { diff --git a/apps/common/main/resources/less/synchronize-tip.less b/apps/common/main/resources/less/synchronize-tip.less index 6de6e6e41..df5b141c9 100644 --- a/apps/common/main/resources/less/synchronize-tip.less +++ b/apps/common/main/resources/less/synchronize-tip.less @@ -23,6 +23,21 @@ } } + &.left { + margin: -32px 15px 0 0; + + .tip-arrow { + right: -15px; + top: 20px; + width: 15px; + height: 30px; + &:after { + top: 5px; + left: -8px; + } + } + } + &.top { margin: 0 -32px 15px 0; From 0ccdf8b4e2e238dd4e1144b0ef8258ff4bb46d06 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 28 Nov 2017 14:20:54 +0300 Subject: [PATCH 05/86] [DE] Show tooltip and disable editing when document is signed. --- .../main/app/controller/Main.js | 6 +- .../main/app/controller/RightMenu.js | 4 +- .../main/app/view/FileMenuPanels.js | 11 ++- .../main/app/view/SignatureSettings.js | 78 +++++++++++++++---- 4 files changed, 73 insertions(+), 26 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index 17d3bf213..512311ef5 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -909,14 +909,12 @@ define([ me.api.UpdateInterfaceState(); me.fillTextArt(me.api.asc_getTextArtPreviews()); - if (me.appOptions.canBrandingExt) - Common.NotificationCenter.trigger('document:ready', 'main'); + Common.NotificationCenter.trigger('document:ready', 'main'); } }, 50); } else { documentHolderController.getView().createDelayedElementsViewer(); - if (me.appOptions.canBrandingExt) - Common.NotificationCenter.trigger('document:ready', 'main'); + Common.NotificationCenter.trigger('document:ready', 'main'); } if (this.appOptions.canAnalytics && false) diff --git a/apps/documenteditor/main/app/controller/RightMenu.js b/apps/documenteditor/main/app/controller/RightMenu.js index c56a64f5a..7126bab2e 100644 --- a/apps/documenteditor/main/app/controller/RightMenu.js +++ b/apps/documenteditor/main/app/controller/RightMenu.js @@ -325,7 +325,7 @@ define([ } }, - SetDisabled: function(disabled, allowMerge) { + SetDisabled: function(disabled, allowMerge, allowSignature) { this.setMode({isEdit: !disabled}); if (this.rightmenu) { this.rightmenu.paragraphSettings.disableControls(disabled); @@ -340,7 +340,7 @@ define([ } this.rightmenu.chartSettings.disableControls(disabled); - if (this.rightmenu.signatureSettings) { + if (!allowSignature && this.rightmenu.signatureSettings) { this.rightmenu.signatureSettings.disableControls(disabled); this.rightmenu.btnSignature.setDisabled(disabled); } diff --git a/apps/documenteditor/main/app/view/FileMenuPanels.js b/apps/documenteditor/main/app/view/FileMenuPanels.js index c10a95fc8..14b0852b3 100644 --- a/apps/documenteditor/main/app/view/FileMenuPanels.js +++ b/apps/documenteditor/main/app/view/FileMenuPanels.js @@ -1211,12 +1211,17 @@ define([ var sign = {name: item.asc_getSigner1(), date: '18/05/2017'}; (item.asc_getValid()==0) ? valid_arr.push(sign) : invalid_arr.push(sign); }); + + // requested_arr = ['Hammish Mitchell', 'Someone Somewhere', 'Mary White', 'John Black']; + // valid_arr = [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]; + // invalid_arr = [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}]; + this.cntRequestedSign.html(this.templateRequested({signatures: requested_arr, header: this.strRequested})); this.cntValidSign.html(this.templateValid({signatures: valid_arr, header: this.strValid})); this.cntInvalidSign.html(this.templateValid({signatures: invalid_arr, header: this.strInvalid})); - // this.cntRequestedSign.html(this.templateRequested({signatures: ['Hammish Mitchell', 'Someone Somewhere', 'Mary White', 'John Black'], header: this.strRequested})); - // this.cntValidSign.html(this.templateValid({signatures: [{name: 'Hammish Mitchell', date: '18/05/2017'}, {name: 'Someone Somewhere', date: '18/05/2017'}], header: this.strValid})); - // this.cntInvalidSign.html(this.templateValid({signatures: [{name: 'Mary White', date: '18/05/2017'}, {name: 'John Black', date: '18/05/2017'}], header: this.strInvalid})); + + this.btnAddInvisibleSign.setDisabled(valid_arr.length>0 || invalid_arr.length>0); + this.btnAddVisibleSign.setDisabled(valid_arr.length>0 || invalid_arr.length>0); }, strProtect: 'Protect Document', diff --git a/apps/documenteditor/main/app/view/SignatureSettings.js b/apps/documenteditor/main/app/view/SignatureSettings.js index 9e089fdd0..51cfde54d 100644 --- a/apps/documenteditor/main/app/view/SignatureSettings.js +++ b/apps/documenteditor/main/app/view/SignatureSettings.js @@ -66,10 +66,9 @@ define([ initialize: function () { var me = this; - this._initSettings = true; - this._state = { DisabledControls: false, + DisabledInsertControls: false, requestedSignatures: undefined, validSignatures: undefined, invalidSignatures: undefined @@ -142,17 +141,11 @@ define([ if (this.api) { this.api.asc_registerCallback('asc_onUpdateSignatures', _.bind(this.onUpdateSignatures, this)); } + Common.NotificationCenter.on('document:ready', _.bind(this.onDocumentReady, this)); return this; }, - createDelayedControls: function() { - this._initSettings = false; - }, - ChangeSettings: function(props) { - if (this._initSettings) - this.createDelayedControls(); - if (!this._state.requestedSignatures || !this._state.validSignatures || !this._state.invalidSignatures) { this.onUpdateSignatures(this.api.asc_getSignatures(), this.api.asc_getRequestSignatures()); } @@ -165,15 +158,20 @@ define([ }, disableControls: function(disable) { - if (this._initSettings) return; - if (this._state.DisabledControls!==disable) { this._state.DisabledControls = disable; + this.$linksSign && this.$linksSign.toggleClass('disabled', disable); + this.$linksView && this.$linksView.toggleClass('disabled', disable); + } + this.disableInsertControls(disable); + }, + + disableInsertControls: function(disable) { + if (this._state.DisabledInsertControls!==disable) { + this._state.DisabledInsertControls = disable; _.each(this.lockedControls, function(item) { item.setDisabled(disable); }); - this.$linksSign.toggleClass('disabled', disable); - this.$linksView.toggleClass('disabled', disable); } }, @@ -194,12 +192,14 @@ define([ var sign = {name: item.asc_getSigner1(), guid: item.asc_getId(), date: '18/05/2017'}; (item.asc_getValid()==0) ? me._state.validSignatures.push(sign) : me._state.invalidSignatures.push(sign); }); + + // me._state.requestedSignatures = [{name: 'Hammish Mitchell', guid: '123'}, {name: 'Someone Somewhere', guid: '123'}, {name: 'Mary White', guid: '123'}, {name: 'John Black', guid: '123'}]; + // me._state.validSignatures = [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]; + // me._state.invalidSignatures = [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}]; + this.cntRequestedSign.html(this.templateRequested({signatures: me._state.requestedSignatures, header: this.strRequested})); this.cntValidSign.html(this.templateValid({signatures: me._state.validSignatures, header: this.strValid})); this.cntInvalidSign.html(this.templateValid({signatures: me._state.invalidSignatures, header: this.strInvalid})); - // this.cntRequestedSign.html(this.templateRequested({signatures: [{name: 'Hammish Mitchell', guid: '123'}, {name: 'Someone Somewhere', guid: '123'}, {name: 'Mary White', guid: '123'}, {name: 'John Black', guid: '123'}], header: this.strRequested})); - // this.cntValidSign.html(this.templateValid({signatures: [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}], header: this.strValid})); - // this.cntInvalidSign.html(this.templateValid({signatures: [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}], header: this.strInvalid})); this.$linksSign = $('.signature-sign-link', this.$el); var width = this.$linksSign.width(); @@ -282,6 +282,47 @@ define([ this.api.asc_ViewCertificate(target.attr('data-value')); }, + onDocumentReady: function() { + this.ChangeSettings(); + + var me = this, + hasSigned = (me._state.validSignatures.length>0 || me._state.invalidSignatures.length>0), + hasRequested = (me._state.requestedSignatures.length>0); + + hasSigned && this.disableEditing(hasSigned); + + if (!this._state.tip && (hasSigned || hasRequested)) { + this._state.tip = new Common.UI.SynchronizeTip({ + target : DE.getController('RightMenu').getView('RightMenu').btnSignature.btnEl, + text : (hasSigned) ? this.txtSignedDocument : this.txtRequestedSignatures, + showLink: hasSigned, + textLink: this.txtContinueEditing, + placement: 'left' + }); + this._state.tip.on({ + 'dontshowclick': function() { + me._state.tip.hide(); + // me.api.editSingedDoc(); + me.disableEditing(false); + }, + 'closeclick': function() { + me._state.tip.hide(); + } + }); + this._state.tip.show(); + } + }, + + disableEditing: function(disable) { + disable && DE.getController('RightMenu').getView('RightMenu').clearSelection(); + DE.getController('Toolbar').DisableToolbar(disable, disable); + DE.getController('RightMenu').SetDisabled(disable, false, true); + DE.getController('Statusbar').getView('Statusbar').SetDisabled(disable); + DE.getController('Common.Controllers.ReviewChanges').SetDisabled(disable); + DE.getController('LeftMenu').SetDisabled(disable, true); + this.disableInsertControls(disable); + }, + strSignature: 'Signature', strInvisibleSign: 'Add invisible digital signature', strVisibleSign: 'Add visible signature', @@ -289,7 +330,10 @@ define([ strValid: 'Valid signatures', strInvalid: 'Invalid signatures', strSign: 'Sign', - strView: 'View' + strView: 'View', + txtSignedDocument: 'This document has been signed. It should not be edited.', + txtRequestedSignatures: 'This document has requested signatures.', + txtContinueEditing: 'Edit anyway' }, DE.Views.SignatureSettings || {})); }); \ No newline at end of file From 92b3dd01a237975cf338c06930bcf84ae80bd981 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Thu, 9 Nov 2017 16:56:41 +0300 Subject: [PATCH 06/86] [DE] Enable chat panel for signed document. --- apps/documenteditor/main/app.js | 1 + apps/documenteditor/main/app/view/SignatureSettings.js | 9 ++++++++- apps/documenteditor/main/app_dev.js | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/apps/documenteditor/main/app.js b/apps/documenteditor/main/app.js index 471759e72..a8ae63fe6 100644 --- a/apps/documenteditor/main/app.js +++ b/apps/documenteditor/main/app.js @@ -183,6 +183,7 @@ require([ 'documenteditor/main/app/view/TableSettings', 'documenteditor/main/app/view/ShapeSettings', 'documenteditor/main/app/view/TextArtSettings', + 'documenteditor/main/app/view/SignatureSettings', 'common/main/lib/util/utils', 'common/main/lib/util/LocalStorage', 'common/main/lib/controller/Fonts', diff --git a/apps/documenteditor/main/app/view/SignatureSettings.js b/apps/documenteditor/main/app/view/SignatureSettings.js index 51cfde54d..58c2042c3 100644 --- a/apps/documenteditor/main/app/view/SignatureSettings.js +++ b/apps/documenteditor/main/app/view/SignatureSettings.js @@ -319,7 +319,14 @@ define([ DE.getController('RightMenu').SetDisabled(disable, false, true); DE.getController('Statusbar').getView('Statusbar').SetDisabled(disable); DE.getController('Common.Controllers.ReviewChanges').SetDisabled(disable); - DE.getController('LeftMenu').SetDisabled(disable, true); + + var leftMenu = DE.getController('LeftMenu').leftMenu; + leftMenu.btnComments.setDisabled(disable); + if (disable) leftMenu.close(); + var comments = DE.getController('Common.Controllers.Comments'); + if (comments) + comments.setPreviewMode(disable); + this.disableInsertControls(disable); }, diff --git a/apps/documenteditor/main/app_dev.js b/apps/documenteditor/main/app_dev.js index ff894fd0b..8e102a689 100644 --- a/apps/documenteditor/main/app_dev.js +++ b/apps/documenteditor/main/app_dev.js @@ -173,6 +173,7 @@ require([ 'documenteditor/main/app/view/TableSettings', 'documenteditor/main/app/view/ShapeSettings', 'documenteditor/main/app/view/TextArtSettings', + 'documenteditor/main/app/view/SignatureSettings', 'common/main/lib/util/utils', 'common/main/lib/util/LocalStorage', 'common/main/lib/controller/Fonts', From c2561b8d18aa0163719f2a42a8cb1f309a500e10 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 10 Nov 2017 10:45:52 +0300 Subject: [PATCH 07/86] [DE] Show viewer context menu when document is signed. --- apps/documenteditor/main/app/view/SignatureSettings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/documenteditor/main/app/view/SignatureSettings.js b/apps/documenteditor/main/app/view/SignatureSettings.js index 58c2042c3..ae3e59125 100644 --- a/apps/documenteditor/main/app/view/SignatureSettings.js +++ b/apps/documenteditor/main/app/view/SignatureSettings.js @@ -319,10 +319,10 @@ define([ DE.getController('RightMenu').SetDisabled(disable, false, true); DE.getController('Statusbar').getView('Statusbar').SetDisabled(disable); DE.getController('Common.Controllers.ReviewChanges').SetDisabled(disable); + DE.getController('DocumentHolder').getView().SetDisabled(disable); var leftMenu = DE.getController('LeftMenu').leftMenu; leftMenu.btnComments.setDisabled(disable); - if (disable) leftMenu.close(); var comments = DE.getController('Common.Controllers.Comments'); if (comments) comments.setPreviewMode(disable); From 4a5d78f36ef4ae212ae0970a2bd53474b91704f1 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 28 Nov 2017 14:25:08 +0300 Subject: [PATCH 08/86] [SSE] Show tooltip and disable editing when document is signed. --- apps/spreadsheeteditor/main/app.js | 1 + .../main/app/controller/DocumentHolder.js | 20 +++-- .../main/app/controller/Main.js | 6 +- .../main/app/controller/RightMenu.js | 8 +- .../main/app/controller/Statusbar.js | 6 +- .../main/app/controller/Toolbar.js | 5 +- .../main/app/view/FileMenuPanels.js | 11 ++- .../main/app/view/SignatureSettings.js | 85 +++++++++++++++---- apps/spreadsheeteditor/main/app_dev.js | 1 + 9 files changed, 108 insertions(+), 35 deletions(-) diff --git a/apps/spreadsheeteditor/main/app.js b/apps/spreadsheeteditor/main/app.js index d38cfe1ac..da07862ec 100644 --- a/apps/spreadsheeteditor/main/app.js +++ b/apps/spreadsheeteditor/main/app.js @@ -180,6 +180,7 @@ require([ 'spreadsheeteditor/main/app/view/ChartSettings', 'spreadsheeteditor/main/app/view/ShapeSettings', 'spreadsheeteditor/main/app/view/TextArtSettings', + 'spreadsheeteditor/main/app/view/SignatureSettings', 'common/main/lib/util/utils', 'common/main/lib/util/LocalStorage', 'common/main/lib/controller/Fonts', diff --git a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js index 559e87d97..01b009f37 100644 --- a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js +++ b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js @@ -82,6 +82,7 @@ define([ me.namedrange_locked = false; me._currentMathObj = undefined; me._currentParaObjDisabled = false; + me._isDisabled = false; /** coauthoring begin **/ this.wrapEvents = { @@ -1224,14 +1225,14 @@ define([ showObjectMenu: function(event){ if (this.api && !this.mouse.isLeftButtonDown && !this.rangeSelectionMode){ - (this.permissions.isEdit) ? this.fillMenuProps(this.api.asc_getCellInfo(), true, event) : this.fillViewMenuProps(this.api.asc_getCellInfo(), true, event); + (this.permissions.isEdit && !this._isDisabled) ? this.fillMenuProps(this.api.asc_getCellInfo(), true, event) : this.fillViewMenuProps(this.api.asc_getCellInfo(), true, event); } }, onSelectionChanged: function(info){ if (!this.mouse.isLeftButtonDown && !this.rangeSelectionMode && this.currentMenu && this.currentMenu.isVisible()){ - (this.permissions.isEdit) ? this.fillMenuProps(info, true) : this.fillViewMenuProps(info, true); + (this.permissions.isEdit && !this._isDisabled) ? this.fillMenuProps(info, true) : this.fillViewMenuProps(info, true); } }, @@ -1494,12 +1495,15 @@ define([ iscellmenu = (seltype==Asc.c_oAscSelectionType.RangeCells) && !this.permissions.isEditMailMerge && !this.permissions.isEditDiagram, iscelledit = this.api.isCellEdited; + if (!documentHolder.viewModeMenu) + documentHolder.createDelayedElementsViewer(); + if (!showMenu && !documentHolder.viewModeMenu.isVisible()) return; - documentHolder.menuViewUndo.setVisible(this.permissions.canCoAuthoring && this.permissions.canComments); - documentHolder.menuViewUndo.setDisabled(!this.api.asc_getCanUndo()); - documentHolder.menuViewCopySeparator.setVisible(iscellmenu && !iscelledit && this.permissions.canCoAuthoring && this.permissions.canComments); - documentHolder.menuViewAddComment.setVisible(iscellmenu && !iscelledit && this.permissions.canCoAuthoring && this.permissions.canComments); + documentHolder.menuViewUndo.setVisible(this.permissions.canCoAuthoring && this.permissions.canComments && !this._isDisabled); + documentHolder.menuViewUndo.setDisabled(!this.api.asc_getCanUndo() && !this._isDisabled); + documentHolder.menuViewCopySeparator.setVisible(iscellmenu && !iscelledit && this.permissions.canCoAuthoring && this.permissions.canComments && !this._isDisabled); + documentHolder.menuViewAddComment.setVisible(iscellmenu && !iscelledit && this.permissions.canCoAuthoring && this.permissions.canComments && !this._isDisabled); documentHolder.setMenuItemCommentCaptionMode(documentHolder.menuViewAddComment, cellinfo.asc_getComments().length < 1, this.permissions.canEditComments); commentsController && commentsController.blockPopover(true); documentHolder.menuViewAddComment.setDisabled(isCellLocked || isTableLocked); @@ -2467,6 +2471,10 @@ define([ win.show(); }, + SetDisabled: function(state) { + this._isDisabled = state; + }, + guestText : 'Guest', textCtrlClick : 'Press CTRL and click link', txtHeight : 'Height', diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index ddd2693f9..5a304170c 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -705,14 +705,12 @@ define([ if (me.needToUpdateVersion) toolbarController.onApiCoAuthoringDisconnect(); - if (me.appOptions.canBrandingExt) - Common.NotificationCenter.trigger('document:ready', 'main'); + Common.NotificationCenter.trigger('document:ready', 'main'); } }, 50); } else { documentHolderView.createDelayedElementsViewer(); - if (me.appOptions.canBrandingExt) - Common.NotificationCenter.trigger('document:ready', 'main'); + Common.NotificationCenter.trigger('document:ready', 'main'); } if (me.appOptions.canAnalytics && false) diff --git a/apps/spreadsheeteditor/main/app/controller/RightMenu.js b/apps/spreadsheeteditor/main/app/controller/RightMenu.js index 9a5c5acf2..0a0ea5b8e 100644 --- a/apps/spreadsheeteditor/main/app/controller/RightMenu.js +++ b/apps/spreadsheeteditor/main/app/controller/RightMenu.js @@ -122,7 +122,8 @@ define([ SelectedObjects = this.api.asc_getGraphicObjectProps(); } - if (SelectedObjects.length<=0 && !formatTableInfo && !sparkLineInfo && !this.rightmenu.minimizedMode) { + if (SelectedObjects.length<=0 && !formatTableInfo && !sparkLineInfo && !this.rightmenu.minimizedMode && + this.rightmenu.GetActivePane() !== 'id-signature-settings') { this.rightmenu.clearSelection(); this._openRightMenu = true; } @@ -323,7 +324,8 @@ define([ } }, - SetDisabled: function(disabled) { + SetDisabled: function(disabled, allowSignature) { + this.setMode({isEdit: !disabled}); if (this.rightmenu) { this.rightmenu.paragraphSettings.disableControls(disabled); this.rightmenu.shapeSettings.disableControls(disabled); @@ -331,7 +333,7 @@ define([ this.rightmenu.chartSettings.disableControls(disabled); this.rightmenu.tableSettings.disableControls(disabled); - if (this.rightmenu.signatureSettings) { + if (!allowSignature && this.rightmenu.signatureSettings) { this.rightmenu.signatureSettings.disableControls(disabled); this.rightmenu.btnSignature.setDisabled(disabled); } diff --git a/apps/spreadsheeteditor/main/app/controller/Statusbar.js b/apps/spreadsheeteditor/main/app/controller/Statusbar.js index aa26addaf..f895802e4 100644 --- a/apps/spreadsheeteditor/main/app/controller/Statusbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Statusbar.js @@ -138,7 +138,11 @@ define([ }, onApiDisconnect: function() { - this.statusbar.setMode({isDisconnected: true}); + this.SetDisabled(true); + }, + + SetDisabled: function(state) { + this.statusbar.setMode({isDisconnected: state}); this.statusbar.update(); }, diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js index 4412ec225..c0a025568 100644 --- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js @@ -2868,7 +2868,10 @@ define([ this._state.namedrange_locked = (state == Asc.c_oAscDefinedNameReason.LockDefNameManager); }, - DisableToolbar: function(disable) { + DisableToolbar: function(disable, viewMode) { + if (viewMode!==undefined) this.editMode = !viewMode; + disable = disable || !this.editMode; + var mask = $('.toolbar-mask'); if (disable && mask.length>0 || !disable && mask.length==0) return; diff --git a/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js b/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js index 73d97b9ee..c2ce55f42 100644 --- a/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js +++ b/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js @@ -1447,12 +1447,17 @@ define([ var sign = {name: item.asc_getSigner1(), date: '18/05/2017'}; (item.asc_getValid()==0) ? valid_arr.push(sign) : invalid_arr.push(sign); }); + + // requested_arr = ['Hammish Mitchell', 'Someone Somewhere', 'Mary White', 'John Black']; + // valid_arr = [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]; + // invalid_arr = [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}]; + this.cntRequestedSign.html(this.templateRequested({signatures: requested_arr, header: this.strRequested})); this.cntValidSign.html(this.templateValid({signatures: valid_arr, header: this.strValid})); this.cntInvalidSign.html(this.templateValid({signatures: invalid_arr, header: this.strInvalid})); - // this.cntRequestedSign.html(this.templateRequested({signatures: ['Hammish Mitchell', 'Someone Somewhere', 'Mary White', 'John Black'], header: this.strRequested})); - // this.cntValidSign.html(this.templateValid({signatures: [{name: 'Hammish Mitchell', date: '18/05/2017'}, {name: 'Someone Somewhere', date: '18/05/2017'}], header: this.strValid})); - // this.cntInvalidSign.html(this.templateValid({signatures: [{name: 'Mary White', date: '18/05/2017'}, {name: 'John Black', date: '18/05/2017'}], header: this.strInvalid})); + + this.btnAddInvisibleSign.setDisabled(valid_arr.length>0 || invalid_arr.length>0); + this.btnAddVisibleSign.setDisabled(valid_arr.length>0 || invalid_arr.length>0); }, strProtect: 'Protect Document', diff --git a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js index 4bebf984a..3c6be4178 100644 --- a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js +++ b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js @@ -66,10 +66,9 @@ define([ initialize: function () { var me = this; - this._initSettings = true; - this._state = { DisabledControls: false, + DisabledInsertControls: false, requestedSignatures: undefined, validSignatures: undefined, invalidSignatures: undefined @@ -142,17 +141,11 @@ define([ if (this.api) { this.api.asc_registerCallback('asc_onUpdateSignatures', _.bind(this.onUpdateSignatures, this)); } + Common.NotificationCenter.on('document:ready', _.bind(this.onDocumentReady, this)); return this; }, - createDelayedControls: function() { - this._initSettings = false; - }, - ChangeSettings: function(props) { - if (this._initSettings) - this.createDelayedControls(); - if (!this._state.requestedSignatures || !this._state.validSignatures || !this._state.invalidSignatures) { this.onUpdateSignatures(this.api.asc_getSignatures(), this.api.asc_getRequestSignatures()); } @@ -165,15 +158,20 @@ define([ }, disableControls: function(disable) { - if (this._initSettings) return; - if (this._state.DisabledControls!==disable) { this._state.DisabledControls = disable; + this.$linksSign && this.$linksSign.toggleClass('disabled', disable); + this.$linksView && this.$linksView.toggleClass('disabled', disable); + } + this.disableInsertControls(disable); + }, + + disableInsertControls: function(disable) { + if (this._state.DisabledInsertControls!==disable) { + this._state.DisabledInsertControls = disable; _.each(this.lockedControls, function(item) { item.setDisabled(disable); }); - this.$linksSign.toggleClass('disabled', disable); - this.$linksView.toggleClass('disabled', disable); } }, @@ -194,12 +192,14 @@ define([ var sign = {name: item.asc_getSigner1(), guid: item.asc_getId(), date: '18/05/2017'}; (item.asc_getValid()==0) ? me._state.validSignatures.push(sign) : me._state.invalidSignatures.push(sign); }); + + // me._state.requestedSignatures = [{name: 'Hammish Mitchell', guid: '123'}, {name: 'Someone Somewhere', guid: '123'}, {name: 'Mary White', guid: '123'}, {name: 'John Black', guid: '123'}]; + // me._state.validSignatures = [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]; + // me._state.invalidSignatures = [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}]; + this.cntRequestedSign.html(this.templateRequested({signatures: me._state.requestedSignatures, header: this.strRequested})); this.cntValidSign.html(this.templateValid({signatures: me._state.validSignatures, header: this.strValid})); this.cntInvalidSign.html(this.templateValid({signatures: me._state.invalidSignatures, header: this.strInvalid})); - // this.cntRequestedSign.html(this.templateRequested({signatures: [{name: 'Hammish Mitchell', guid: '123'}, {name: 'Someone Somewhere', guid: '123'}, {name: 'Mary White', guid: '123'}, {name: 'John Black', guid: '123'}], header: this.strRequested})); - // this.cntValidSign.html(this.templateValid({signatures: [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}], header: this.strValid})); - // this.cntInvalidSign.html(this.templateValid({signatures: [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}], header: this.strInvalid})); this.$linksSign = $('.signature-sign-link', this.$el); var width = this.$linksSign.width(); @@ -282,6 +282,54 @@ define([ this.api.asc_ViewCertificate(target.attr('data-value')); }, + onDocumentReady: function() { + this.ChangeSettings(); + + var me = this, + hasSigned = (me._state.validSignatures.length>0 || me._state.invalidSignatures.length>0), + hasRequested = (me._state.requestedSignatures.length>0); + + hasSigned && this.disableEditing(hasSigned); + + if (!this._state.tip && (hasSigned || hasRequested)) { + this._state.tip = new Common.UI.SynchronizeTip({ + target : SSE.getController('RightMenu').getView('RightMenu').btnSignature.btnEl, + text : (hasSigned) ? this.txtSignedDocument : this.txtRequestedSignatures, + showLink: hasSigned, + textLink: this.txtContinueEditing, + placement: 'left' + }); + this._state.tip.on({ + 'dontshowclick': function() { + me._state.tip.hide(); + // me.api.editSingedDoc(); + me.disableEditing(false); + }, + 'closeclick': function() { + me._state.tip.hide(); + } + }); + this._state.tip.show(); + } + }, + + disableEditing: function(disable) { + disable && SSE.getController('RightMenu').getView('RightMenu').clearSelection(); + SSE.getController('Toolbar').DisableToolbar(disable, disable); + SSE.getController('RightMenu').SetDisabled(disable, true); + SSE.getController('Common.Controllers.ReviewChanges').SetDisabled(disable); + SSE.getController('DocumentHolder').SetDisabled(disable); + SSE.getController('Statusbar').SetDisabled(disable); + + var leftMenu = SSE.getController('LeftMenu').leftMenu; + leftMenu.btnComments.setDisabled(disable); + var comments = SSE.getController('Common.Controllers.Comments'); + if (comments) + comments.setPreviewMode(disable); + + this.disableInsertControls(disable); + }, + strSignature: 'Signature', strInvisibleSign: 'Add invisible digital signature', strVisibleSign: 'Add visible signature', @@ -289,7 +337,10 @@ define([ strValid: 'Valid signatures', strInvalid: 'Invalid signatures', strSign: 'Sign', - strView: 'View' + strView: 'View', + txtSignedDocument: 'This document has been signed. It should not be edited.', + txtRequestedSignatures: 'This document has requested signatures.', + txtContinueEditing: 'Edit anyway' }, SSE.Views.SignatureSettings || {})); }); \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/app_dev.js b/apps/spreadsheeteditor/main/app_dev.js index f541535a3..533f55cc5 100644 --- a/apps/spreadsheeteditor/main/app_dev.js +++ b/apps/spreadsheeteditor/main/app_dev.js @@ -170,6 +170,7 @@ require([ 'spreadsheeteditor/main/app/view/ChartSettings', 'spreadsheeteditor/main/app/view/ShapeSettings', 'spreadsheeteditor/main/app/view/TextArtSettings', + 'spreadsheeteditor/main/app/view/SignatureSettings', 'common/main/lib/util/utils', 'common/main/lib/util/LocalStorage', 'common/main/lib/controller/Fonts', From 580903591a34baba5154191f3f70c33b1da85bef Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 28 Nov 2017 14:32:48 +0300 Subject: [PATCH 09/86] [PE] Show tooltip and disable editing when document is signed. --- apps/presentationeditor/main/app.js | 1 + .../main/app/controller/Main.js | 6 +- .../main/app/controller/RightMenu.js | 5 ++ .../main/app/controller/Toolbar.js | 5 +- .../main/app/view/DocumentHolder.js | 30 ++++--- .../main/app/view/FileMenuPanels.js | 8 +- .../main/app/view/RightMenu.js | 8 +- .../main/app/view/SignatureSettings.js | 80 +++++++++++++++---- .../main/app/view/Statusbar.js | 1 + apps/presentationeditor/main/app_dev.js | 1 + 10 files changed, 110 insertions(+), 35 deletions(-) diff --git a/apps/presentationeditor/main/app.js b/apps/presentationeditor/main/app.js index 0cb25efb3..682961b67 100644 --- a/apps/presentationeditor/main/app.js +++ b/apps/presentationeditor/main/app.js @@ -175,6 +175,7 @@ require([ 'presentationeditor/main/app/view/SlideSettings', 'presentationeditor/main/app/view/TableSettings', 'presentationeditor/main/app/view/TextArtSettings', + 'presentationeditor/main/app/view/SignatureSettings', 'common/main/lib/util/utils', 'common/main/lib/util/LocalStorage', 'common/main/lib/controller/Fonts' diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js index 4b1c88f24..62093fd07 100644 --- a/apps/presentationeditor/main/app/controller/Main.js +++ b/apps/presentationeditor/main/app/controller/Main.js @@ -693,14 +693,12 @@ define([ toolbarController.onApiCoAuthoringDisconnect(); me.api.UpdateInterfaceState(); - if (me.appOptions.canBrandingExt) - Common.NotificationCenter.trigger('document:ready', 'main'); + Common.NotificationCenter.trigger('document:ready', 'main'); } }, 50); } else { documentHolderController.getView('DocumentHolder').createDelayedElementsViewer(); - if (me.appOptions.canBrandingExt) - Common.NotificationCenter.trigger('document:ready', 'main'); + Common.NotificationCenter.trigger('document:ready', 'main'); } if (this.appOptions.canAnalytics && false) diff --git a/apps/presentationeditor/main/app/controller/RightMenu.js b/apps/presentationeditor/main/app/controller/RightMenu.js index b9aa0bf20..46a9cd588 100644 --- a/apps/presentationeditor/main/app/controller/RightMenu.js +++ b/apps/presentationeditor/main/app/controller/RightMenu.js @@ -211,6 +211,11 @@ define([ this.setMode({isEdit: false}); }, + SetDisabled: function(disabled, allowSignature) { + this.setMode({isEdit: !disabled}); + this.rightmenu.SetDisabled('', disabled, true, allowSignature); + }, + onInsertTable: function() { this._settings[Common.Utils.documentSettingsType.Table].needShow = true; }, diff --git a/apps/presentationeditor/main/app/controller/Toolbar.js b/apps/presentationeditor/main/app/controller/Toolbar.js index 9e98c59df..cb5a20bfb 100644 --- a/apps/presentationeditor/main/app/controller/Toolbar.js +++ b/apps/presentationeditor/main/app/controller/Toolbar.js @@ -2041,7 +2041,10 @@ define([ this._state.activated = true; }, - DisableToolbar: function(disable) { + DisableToolbar: function(disable, viewMode) { + if (viewMode!==undefined) this.editMode = !viewMode; + disable = disable || !this.editMode; + var mask = $('.toolbar-mask'); if (disable && mask.length>0 || !disable && mask.length==0) return; diff --git a/apps/presentationeditor/main/app/view/DocumentHolder.js b/apps/presentationeditor/main/app/view/DocumentHolder.js index 7e5cd5083..f83972591 100644 --- a/apps/presentationeditor/main/app/view/DocumentHolder.js +++ b/apps/presentationeditor/main/app/view/DocumentHolder.js @@ -68,7 +68,8 @@ define([ me._currentSpellObj = undefined; me._currLang = {}; me._state = {}; - + me._isDisabled = false; + /** coauthoring begin **/ var usersStore = PE.getCollection('Common.Collections.Users'); /** coauthoring end **/ @@ -187,6 +188,9 @@ define([ var fillViewMenuProps = function(selectedElements) { if (!selectedElements || !_.isArray(selectedElements)) return; + if (!me.viewModeMenu) + me.createDelayedElementsViewer(); + var menu_props = {}, menu_to_show = null; _.each(selectedElements, function(element, index) { @@ -210,7 +214,7 @@ define([ var showObjectMenu = function(event, docElement, eOpts){ if (me.api){ - var obj = (me.mode.isEdit) ? fillMenuProps(me.api.getSelectedElements()) : fillViewMenuProps(me.api.getSelectedElements()); + var obj = (me.mode.isEdit && !me._isDisabled) ? fillMenuProps(me.api.getSelectedElements()) : fillViewMenuProps(me.api.getSelectedElements()); if (obj) showPopupMenu(obj.menu_to_show, obj.menu_props, event, docElement, eOpts); } }; @@ -218,7 +222,7 @@ define([ var onContextMenu = function(event){ _.delay(function(){ if (event.get_Type() == Asc.c_oAscContextMenuTypes.Thumbnails) { - showPopupMenu.call(me, me.slideMenu, {isSlideSelect: event.get_IsSlideSelect(), isSlideHidden: event.get_IsSlideHidden(), fromThumbs: true}, event); + !me._isDisabled && showPopupMenu.call(me, me.slideMenu, {isSlideSelect: event.get_IsSlideSelect(), isSlideHidden: event.get_IsSlideHidden(), fromThumbs: true}, event); } else { showObjectMenu.call(me, event); } @@ -228,7 +232,7 @@ define([ var onFocusObject = function(selectedElements) { if (me.currentMenu && me.currentMenu.isVisible()){ if (me.api.asc_getCurrentFocusObject() === 0 ){ // thumbnails - if (me.slideMenu===me.currentMenu) { + if (me.slideMenu===me.currentMenu && !me._isDisabled) { var isHidden = false; _.each(selectedElements, function(element, index) { if (Asc.c_oAscTypeSelectElement.Slide == element.get_ObjectType()) { @@ -240,7 +244,7 @@ define([ me.currentMenu.alignPosition(); } } else { - var obj = (me.mode.isEdit) ? fillMenuProps(selectedElements) : fillViewMenuProps(selectedElements); + var obj = (me.mode.isEdit && !me._isDisabled) ? fillMenuProps(selectedElements) : fillViewMenuProps(selectedElements); if (obj) { if (obj.menu_to_show===me.currentMenu) { me.currentMenu.options.initMenu(obj.menu_props); @@ -575,7 +579,7 @@ define([ var onDialogAddHyperlink = function() { var win, props, text; - if (me.api && me.mode.isEdit){ + if (me.api && me.mode.isEdit && !me._isDisabled){ var handlerDlg = function(dlg, result) { if (result == 'ok') { props = dlg.getSettings(); @@ -668,7 +672,7 @@ define([ }; var onDoubleClickOnChart = function(chart) { - if (me.mode.isEdit) { + if (me.mode.isEdit && !me._isDisabled) { var diagramEditor = PE.getController('Common.Controllers.ExternalDiagramEditor').getView('Common.Views.ExternalDiagramEditor'); if (diagramEditor && chart) { @@ -1739,10 +1743,10 @@ define([ this.viewModeMenu = new Common.UI.Menu({ initMenu: function (value) { - menuViewUndo.setVisible(me.mode.canCoAuthoring && me.mode.canComments); - menuViewUndo.setDisabled(!me.api.asc_getCanUndo()); - menuViewCopySeparator.setVisible(!value.isChart && me.api.can_AddQuotedComment() !== false && me.mode.canCoAuthoring && me.mode.canComments); - menuViewAddComment.setVisible(!value.isChart && me.api.can_AddQuotedComment() !== false && me.mode.canCoAuthoring && me.mode.canComments); + menuViewUndo.setVisible(me.mode.canCoAuthoring && me.mode.canComments && !me._isDisabled); + menuViewUndo.setDisabled(!me.api.asc_getCanUndo() && !me._isDisabled); + menuViewCopySeparator.setVisible(!value.isChart && me.api.can_AddQuotedComment() !== false && me.mode.canCoAuthoring && me.mode.canComments && !me._isDisabled); + menuViewAddComment.setVisible(!value.isChart && me.api.can_AddQuotedComment() !== false && me.mode.canCoAuthoring && me.mode.canComments && !me._isDisabled); menuViewAddComment.setDisabled(value.locked); }, items: [ @@ -3159,6 +3163,10 @@ define([ } }, + SetDisabled: function(state) { + this._isDisabled = state; + }, + insertRowAboveText : 'Row Above', insertRowBelowText : 'Row Below', insertColumnLeftText : 'Column Left', diff --git a/apps/presentationeditor/main/app/view/FileMenuPanels.js b/apps/presentationeditor/main/app/view/FileMenuPanels.js index 22b38dbbf..5ece4139a 100644 --- a/apps/presentationeditor/main/app/view/FileMenuPanels.js +++ b/apps/presentationeditor/main/app/view/FileMenuPanels.js @@ -950,10 +950,14 @@ define([ var sign = {name: item.asc_getSigner1(), date: '18/05/2017'}; (item.asc_getValid()==0) ? valid_arr.push(sign) : invalid_arr.push(sign); }); + + // valid_arr = [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]; + // invalid_arr = [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}]; + this.cntValidSign.html(this.templateValid({signatures: valid_arr, header: this.strValid})); this.cntInvalidSign.html(this.templateValid({signatures: invalid_arr, header: this.strInvalid})); - // this.cntValidSign.html(this.templateValid({signatures: [{name: 'Hammish Mitchell', date: '18/05/2017'}, {name: 'Someone Somewhere', date: '18/05/2017'}], header: this.strValid})); - // this.cntInvalidSign.html(this.templateValid({signatures: [{name: 'Mary White', date: '18/05/2017'}, {name: 'John Black', date: '18/05/2017'}], header: this.strInvalid})); + + this.btnAddInvisibleSign.setDisabled(valid_arr.length>0 || invalid_arr.length>0); }, strProtect: 'Protect Document', diff --git a/apps/presentationeditor/main/app/view/RightMenu.js b/apps/presentationeditor/main/app/view/RightMenu.js index 9f12f3b79..28dfdf324 100644 --- a/apps/presentationeditor/main/app/view/RightMenu.js +++ b/apps/presentationeditor/main/app/view/RightMenu.js @@ -280,7 +280,7 @@ define([ return (this.minimizedMode) ? null : this.$el.find(".settings-panel.active")[0].id; }, - SetDisabled: function(id, disabled, all) { + SetDisabled: function(id, disabled, all, allowSignature) { if (all) { this.slideSettings.SetSlideDisabled(disabled, disabled, disabled); this.paragraphSettings.disableControls(disabled); @@ -288,6 +288,12 @@ define([ this.tableSettings.disableControls(disabled); this.imageSettings.disableControls(disabled); this.chartSettings.disableControls(disabled); + + if (!allowSignature && this.signatureSettings) { + this.signatureSettings.disableControls(disabled); + this.btnSignature.setDisabled(disabled); + } + } else { var cmp = $("#" + id); if (disabled !== cmp.hasClass('disabled')) { diff --git a/apps/presentationeditor/main/app/view/SignatureSettings.js b/apps/presentationeditor/main/app/view/SignatureSettings.js index 28b6af1a6..80bac26ee 100644 --- a/apps/presentationeditor/main/app/view/SignatureSettings.js +++ b/apps/presentationeditor/main/app/view/SignatureSettings.js @@ -65,10 +65,9 @@ define([ initialize: function () { var me = this; - this._initSettings = true; - this._state = { DisabledControls: false, + DisabledInsertControls: false, validSignatures: undefined, invalidSignatures: undefined }; @@ -118,17 +117,11 @@ define([ if (this.api) { this.api.asc_registerCallback('asc_onUpdateSignatures', _.bind(this.onUpdateSignatures, this)); } + Common.NotificationCenter.on('document:ready', _.bind(this.onDocumentReady, this)); return this; }, - createDelayedControls: function() { - this._initSettings = false; - }, - ChangeSettings: function(props) { - if (this._initSettings) - this.createDelayedControls(); - if (!this._state.validSignatures || !this._state.invalidSignatures) { this.onUpdateSignatures(this.api.asc_getSignatures()); } @@ -141,15 +134,19 @@ define([ }, disableControls: function(disable) { - if (this._initSettings) return; - if (this._state.DisabledControls!==disable) { this._state.DisabledControls = disable; + this.$linksView && this.$linksView.toggleClass('disabled', disable); + } + this.disableInsertControls(disable); + }, + + disableInsertControls: function(disable) { + if (this._state.DisabledInsertControls!==disable) { + this._state.DisabledInsertControls = disable; _.each(this.lockedControls, function(item) { item.setDisabled(disable); }); - this.$linksSign.toggleClass('disabled', disable); - this.$linksView.toggleClass('disabled', disable); } }, @@ -166,10 +163,12 @@ define([ var sign = {name: item.asc_getSigner1(), guid: item.asc_getId(), date: '18/05/2017'}; (item.asc_getValid()==0) ? me._state.validSignatures.push(sign) : me._state.invalidSignatures.push(sign); }); + + // me._state.validSignatures = [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]; + // me._state.invalidSignatures = [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}]; + this.cntValidSign.html(this.templateValid({signatures: me._state.validSignatures, header: this.strValid})); this.cntInvalidSign.html(this.templateValid({signatures: me._state.invalidSignatures, header: this.strInvalid})); - // this.cntValidSign.html(this.templateValid({signatures: [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}], header: this.strValid})); - // this.cntInvalidSign.html(this.templateValid({signatures: [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}], header: this.strInvalid})); this.$linksView = $('.signature-view-link', this.$el); var width = this.$linksView.width(); @@ -201,11 +200,60 @@ define([ this.api.asc_ViewCertificate(target.attr('data-value')); }, + onDocumentReady: function() { + this.ChangeSettings(); + + var me = this, + hasSigned = (me._state.validSignatures.length>0 || me._state.invalidSignatures.length>0); + + hasSigned && this.disableEditing(hasSigned); + + if (!this._state.tip && hasSigned) { + this._state.tip = new Common.UI.SynchronizeTip({ + target : PE.getController('RightMenu').getView('RightMenu').btnSignature.btnEl, + text : this.txtSignedDocument, + showLink: hasSigned, + textLink: this.txtContinueEditing, + placement: 'left' + }); + this._state.tip.on({ + 'dontshowclick': function() { + me._state.tip.hide(); + // me.api.editSingedDoc(); + me.disableEditing(false); + }, + 'closeclick': function() { + me._state.tip.hide(); + } + }); + this._state.tip.show(); + } + }, + + disableEditing: function(disable) { + disable && PE.getController('RightMenu').getView('RightMenu').clearSelection(); + PE.getController('RightMenu').SetDisabled(disable, true); + PE.getController('Toolbar').DisableToolbar(disable, disable); + PE.getController('Statusbar').getView('Statusbar').SetDisabled(disable); + PE.getController('Common.Controllers.ReviewChanges').SetDisabled(disable); + PE.getController('DocumentHolder').getView('DocumentHolder').SetDisabled(disable); + + var leftMenu = PE.getController('LeftMenu').leftMenu; + leftMenu.btnComments.setDisabled(disable); + var comments = PE.getController('Common.Controllers.Comments'); + if (comments) + comments.setPreviewMode(disable); + + this.disableInsertControls(disable); + }, + strSignature: 'Signature', strInvisibleSign: 'Add invisible digital signature', strValid: 'Valid signatures', strInvalid: 'Invalid signatures', - strView: 'View' + strView: 'View', + txtSignedDocument: 'This document has been signed. It should not be edited.', + txtContinueEditing: 'Edit anyway' }, PE.Views.SignatureSettings || {})); }); \ No newline at end of file diff --git a/apps/presentationeditor/main/app/view/Statusbar.js b/apps/presentationeditor/main/app/view/Statusbar.js index 13a9ad775..553c3f7d7 100644 --- a/apps/presentationeditor/main/app/view/Statusbar.js +++ b/apps/presentationeditor/main/app/view/Statusbar.js @@ -369,6 +369,7 @@ define([ var langs = this.langMenu.items.length>0; this.btnLanguage.setDisabled(disable || !langs || this._state.no_paragraph); this.btnDocLanguage.setDisabled(disable || !langs); + this.mode.isEdit = !disable; }, onApiFocusObject: function(selectedObjects) { diff --git a/apps/presentationeditor/main/app_dev.js b/apps/presentationeditor/main/app_dev.js index af1cdf9fa..eef9aa9c7 100644 --- a/apps/presentationeditor/main/app_dev.js +++ b/apps/presentationeditor/main/app_dev.js @@ -166,6 +166,7 @@ require([ 'presentationeditor/main/app/view/SlideSettings', 'presentationeditor/main/app/view/TableSettings', 'presentationeditor/main/app/view/TextArtSettings', + 'presentationeditor/main/app/view/SignatureSettings', 'common/main/lib/util/utils', 'common/main/lib/util/LocalStorage', 'common/main/lib/controller/Fonts' From b3a3c0992bc931ce1611458c0fb29abbff7edc61 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 10 Nov 2017 15:41:56 +0300 Subject: [PATCH 10/86] SynchronizeTip: added close method. --- apps/common/main/lib/component/SynchronizeTip.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/common/main/lib/component/SynchronizeTip.js b/apps/common/main/lib/component/SynchronizeTip.js index e981782d3..cb1aa968c 100644 --- a/apps/common/main/lib/component/SynchronizeTip.js +++ b/apps/common/main/lib/component/SynchronizeTip.js @@ -98,6 +98,10 @@ define([ if (this.cmpEl) this.cmpEl.hide(); }, + close: function() { + if (this.cmpEl) this.cmpEl.remove(); + }, + applyPlacement: function () { var showxy = this.target.offset(); if (this.placement == 'top') From f81a69c3b6929891801530e411c0a534b5a5835c Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 10 Nov 2017 15:44:12 +0300 Subject: [PATCH 11/86] [DE] Signature refactoring (show tip when signature is signed). --- .../main/app/view/SignatureSettings.js | 90 +++++++++++-------- 1 file changed, 52 insertions(+), 38 deletions(-) diff --git a/apps/documenteditor/main/app/view/SignatureSettings.js b/apps/documenteditor/main/app/view/SignatureSettings.js index ae3e59125..2a6741de2 100644 --- a/apps/documenteditor/main/app/view/SignatureSettings.js +++ b/apps/documenteditor/main/app/view/SignatureSettings.js @@ -71,7 +71,9 @@ define([ DisabledInsertControls: false, requestedSignatures: undefined, validSignatures: undefined, - invalidSignatures: undefined + invalidSignatures: undefined, + DisabledEditing: false, + ready: false }; this._locked = false; this.lockedControls = []; @@ -139,16 +141,15 @@ define([ setApi: function(api) { this.api = api; if (this.api) { - this.api.asc_registerCallback('asc_onUpdateSignatures', _.bind(this.onUpdateSignatures, this)); + this.api.asc_registerCallback('asc_onUpdateSignatures', _.bind(this.onApiUpdateSignatures, this)); } Common.NotificationCenter.on('document:ready', _.bind(this.onDocumentReady, this)); return this; }, ChangeSettings: function(props) { - if (!this._state.requestedSignatures || !this._state.validSignatures || !this._state.invalidSignatures) { - this.onUpdateSignatures(this.api.asc_getSignatures(), this.api.asc_getRequestSignatures()); - } + if (!this._state.requestedSignatures || !this._state.validSignatures || !this._state.invalidSignatures) + this.updateSignatures(this.api.asc_getSignatures(), this.api.asc_getRequestSignatures()); this.disableControls(this._locked); }, @@ -179,7 +180,14 @@ define([ this.mode = mode; }, - onUpdateSignatures: function(valid, requested){ + onApiUpdateSignatures: function(valid, requested){ + if (!this._state.ready) return; + + this.updateSignatures(valid, requested); + this.showSignatureTooltip(this._state.validSignatures.length>0 || this._state.invalidSignatures.length>0); + }, + + updateSignatures: function(valid, requested){ var me = this; me._state.requestedSignatures = []; me._state.validSignatures = []; @@ -209,6 +217,8 @@ define([ width = this.$linksView.width(); $('.signature-sign-name', this.cntValidSign).css('max-width', 170-width); $('.signature-sign-name', this.cntInvalidSign).css('max-width', 170-width); + + me.disableEditing(me._state.validSignatures.length>0 || me._state.invalidSignatures.length>0); }, addVisibleSign: function(btn) { @@ -283,51 +293,55 @@ define([ }, onDocumentReady: function() { - this.ChangeSettings(); + this._state.ready = true; + + this.updateSignatures(this.api.asc_getSignatures(), this.api.asc_getRequestSignatures()); + this.showSignatureTooltip(this._state.validSignatures.length>0 || this._state.invalidSignatures.length>0, this._state.requestedSignatures.length>0); + }, + + showSignatureTooltip: function(hasSigned, hasRequested) { + if (!hasSigned && !hasRequested) return; var me = this, - hasSigned = (me._state.validSignatures.length>0 || me._state.invalidSignatures.length>0), - hasRequested = (me._state.requestedSignatures.length>0); - - hasSigned && this.disableEditing(hasSigned); - - if (!this._state.tip && (hasSigned || hasRequested)) { - this._state.tip = new Common.UI.SynchronizeTip({ + tip = new Common.UI.SynchronizeTip({ target : DE.getController('RightMenu').getView('RightMenu').btnSignature.btnEl, text : (hasSigned) ? this.txtSignedDocument : this.txtRequestedSignatures, showLink: hasSigned, textLink: this.txtContinueEditing, placement: 'left' }); - this._state.tip.on({ - 'dontshowclick': function() { - me._state.tip.hide(); - // me.api.editSingedDoc(); - me.disableEditing(false); - }, - 'closeclick': function() { - me._state.tip.hide(); - } - }); - this._state.tip.show(); - } + tip.on({ + 'dontshowclick': function() { + tip.close(); + // me.api.editSingedDoc(); + me.disableEditing(false); + }, + 'closeclick': function() { + tip.close(); + } + }); + tip.show(); }, disableEditing: function(disable) { - disable && DE.getController('RightMenu').getView('RightMenu').clearSelection(); - DE.getController('Toolbar').DisableToolbar(disable, disable); - DE.getController('RightMenu').SetDisabled(disable, false, true); - DE.getController('Statusbar').getView('Statusbar').SetDisabled(disable); - DE.getController('Common.Controllers.ReviewChanges').SetDisabled(disable); - DE.getController('DocumentHolder').getView().SetDisabled(disable); + if (this._state.DisabledEditing != disable) { + this._state.DisabledEditing = disable; - var leftMenu = DE.getController('LeftMenu').leftMenu; - leftMenu.btnComments.setDisabled(disable); - var comments = DE.getController('Common.Controllers.Comments'); - if (comments) - comments.setPreviewMode(disable); + disable && DE.getController('RightMenu').getView('RightMenu').clearSelection(); + DE.getController('Toolbar').DisableToolbar(disable, disable); + DE.getController('RightMenu').SetDisabled(disable, false, true); + DE.getController('Statusbar').getView('Statusbar').SetDisabled(disable); + DE.getController('Common.Controllers.ReviewChanges').SetDisabled(disable); + DE.getController('DocumentHolder').getView().SetDisabled(disable); - this.disableInsertControls(disable); + var leftMenu = DE.getController('LeftMenu').leftMenu; + leftMenu.btnComments.setDisabled(disable); + var comments = DE.getController('Common.Controllers.Comments'); + if (comments) + comments.setPreviewMode(disable); + + this.disableInsertControls(disable); + } }, strSignature: 'Signature', From ecafc6fcf243414822f64a989da6d9f45a4a6389 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 10 Nov 2017 16:37:56 +0300 Subject: [PATCH 12/86] [SSE] Signature refactoring (show tip when signature is signed). --- .../main/app/view/SignatureSettings.js | 90 +++++++++++-------- 1 file changed, 52 insertions(+), 38 deletions(-) diff --git a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js index 3c6be4178..625126e66 100644 --- a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js +++ b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js @@ -71,7 +71,9 @@ define([ DisabledInsertControls: false, requestedSignatures: undefined, validSignatures: undefined, - invalidSignatures: undefined + invalidSignatures: undefined, + DisabledEditing: false, + ready: false }; this._locked = false; this.lockedControls = []; @@ -139,16 +141,15 @@ define([ setApi: function(api) { this.api = api; if (this.api) { - this.api.asc_registerCallback('asc_onUpdateSignatures', _.bind(this.onUpdateSignatures, this)); + this.api.asc_registerCallback('asc_onUpdateSignatures', _.bind(this.onApiUpdateSignatures, this)); } Common.NotificationCenter.on('document:ready', _.bind(this.onDocumentReady, this)); return this; }, ChangeSettings: function(props) { - if (!this._state.requestedSignatures || !this._state.validSignatures || !this._state.invalidSignatures) { - this.onUpdateSignatures(this.api.asc_getSignatures(), this.api.asc_getRequestSignatures()); - } + if (!this._state.requestedSignatures || !this._state.validSignatures || !this._state.invalidSignatures) + this.updateSignatures(this.api.asc_getSignatures(), this.api.asc_getRequestSignatures()); this.disableControls(this._locked); }, @@ -179,7 +180,14 @@ define([ this.mode = mode; }, - onUpdateSignatures: function(valid, requested){ + onApiUpdateSignatures: function(valid, requested){ + if (!this._state.ready) return; + + this.updateSignatures(valid, requested); + this.showSignatureTooltip(this._state.validSignatures.length>0 || this._state.invalidSignatures.length>0); + }, + + updateSignatures: function(valid, requested){ var me = this; me._state.requestedSignatures = []; me._state.validSignatures = []; @@ -209,6 +217,8 @@ define([ width = this.$linksView.width(); $('.signature-sign-name', this.cntValidSign).css('max-width', 170-width); $('.signature-sign-name', this.cntInvalidSign).css('max-width', 170-width); + + me.disableEditing(me._state.validSignatures.length>0 || me._state.invalidSignatures.length>0); }, addVisibleSign: function(btn) { @@ -283,51 +293,55 @@ define([ }, onDocumentReady: function() { - this.ChangeSettings(); + this._state.ready = true; + + this.updateSignatures(this.api.asc_getSignatures(), this.api.asc_getRequestSignatures()); + this.showSignatureTooltip(this._state.validSignatures.length>0 || this._state.invalidSignatures.length>0, this._state.requestedSignatures.length>0); + }, + + showSignatureTooltip: function(hasSigned, hasRequested) { + if (!hasSigned && !hasRequested) return; var me = this, - hasSigned = (me._state.validSignatures.length>0 || me._state.invalidSignatures.length>0), - hasRequested = (me._state.requestedSignatures.length>0); - - hasSigned && this.disableEditing(hasSigned); - - if (!this._state.tip && (hasSigned || hasRequested)) { - this._state.tip = new Common.UI.SynchronizeTip({ + tip = new Common.UI.SynchronizeTip({ target : SSE.getController('RightMenu').getView('RightMenu').btnSignature.btnEl, text : (hasSigned) ? this.txtSignedDocument : this.txtRequestedSignatures, showLink: hasSigned, textLink: this.txtContinueEditing, placement: 'left' }); - this._state.tip.on({ - 'dontshowclick': function() { - me._state.tip.hide(); - // me.api.editSingedDoc(); - me.disableEditing(false); - }, - 'closeclick': function() { - me._state.tip.hide(); - } - }); - this._state.tip.show(); - } + tip.on({ + 'dontshowclick': function() { + tip.close(); + // me.api.editSingedDoc(); + me.disableEditing(false); + }, + 'closeclick': function() { + tip.close(); + } + }); + tip.show(); }, disableEditing: function(disable) { - disable && SSE.getController('RightMenu').getView('RightMenu').clearSelection(); - SSE.getController('Toolbar').DisableToolbar(disable, disable); - SSE.getController('RightMenu').SetDisabled(disable, true); - SSE.getController('Common.Controllers.ReviewChanges').SetDisabled(disable); - SSE.getController('DocumentHolder').SetDisabled(disable); - SSE.getController('Statusbar').SetDisabled(disable); + if (this._state.DisabledEditing != disable) { + this._state.DisabledEditing = disable; - var leftMenu = SSE.getController('LeftMenu').leftMenu; - leftMenu.btnComments.setDisabled(disable); - var comments = SSE.getController('Common.Controllers.Comments'); - if (comments) - comments.setPreviewMode(disable); + disable && SSE.getController('RightMenu').getView('RightMenu').clearSelection(); + SSE.getController('Toolbar').DisableToolbar(disable, disable); + SSE.getController('RightMenu').SetDisabled(disable, true); + SSE.getController('Common.Controllers.ReviewChanges').SetDisabled(disable); + SSE.getController('DocumentHolder').SetDisabled(disable); + SSE.getController('Statusbar').SetDisabled(disable); - this.disableInsertControls(disable); + var leftMenu = SSE.getController('LeftMenu').leftMenu; + leftMenu.btnComments.setDisabled(disable); + var comments = SSE.getController('Common.Controllers.Comments'); + if (comments) + comments.setPreviewMode(disable); + + this.disableInsertControls(disable); + } }, strSignature: 'Signature', From 1ec82af44a7e924e326f5bde2b57c8e250d2cc2a Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 10 Nov 2017 16:38:48 +0300 Subject: [PATCH 13/86] [PE] Signature refactoring (show tip when signature is signed). --- .../main/app/controller/RightMenu.js | 32 ++++++- .../main/app/view/RightMenu.js | 23 ----- .../main/app/view/SignatureSettings.js | 89 +++++++++++-------- 3 files changed, 81 insertions(+), 63 deletions(-) diff --git a/apps/presentationeditor/main/app/controller/RightMenu.js b/apps/presentationeditor/main/app/controller/RightMenu.js index 46a9cd588..1a9a0b599 100644 --- a/apps/presentationeditor/main/app/controller/RightMenu.js +++ b/apps/presentationeditor/main/app/controller/RightMenu.js @@ -206,14 +206,40 @@ define([ }, onCoAuthoringDisconnect: function() { - if (this.rightmenu) - this.rightmenu.SetDisabled('', true, true); + this.SetDisabled(true); this.setMode({isEdit: false}); }, SetDisabled: function(disabled, allowSignature) { this.setMode({isEdit: !disabled}); - this.rightmenu.SetDisabled('', disabled, true, allowSignature); + if (this.rightmenu) { + this.rightmenu.slideSettings.SetSlideDisabled(disabled, disabled, disabled); + this.rightmenu.paragraphSettings.disableControls(disabled); + this.rightmenu.shapeSettings.disableControls(disabled); + this.rightmenu.textartSettings.disableControls(disabled); + this.rightmenu.tableSettings.disableControls(disabled); + this.rightmenu.imageSettings.disableControls(disabled); + this.rightmenu.chartSettings.disableControls(disabled); + + if (!allowSignature && this.rightmenu.signatureSettings) { + this.rightmenu.signatureSettings.disableControls(disabled); + this.rightmenu.btnSignature.setDisabled(disabled); + } + + if (disabled) { + this.rightmenu.btnSlide.setDisabled(disabled); + this.rightmenu.btnText.setDisabled(disabled); + this.rightmenu.btnTable.setDisabled(disabled); + this.rightmenu.btnImage.setDisabled(disabled); + this.rightmenu.btnShape.setDisabled(disabled); + this.rightmenu.btnTextArt.setDisabled(disabled); + this.rightmenu.btnChart.setDisabled(disabled); + } else { + var selectedElements = this.api.getSelectedElements(); + if (selectedElements.length > 0) + this.onFocusObject(selectedElements); + } + } }, onInsertTable: function() { diff --git a/apps/presentationeditor/main/app/view/RightMenu.js b/apps/presentationeditor/main/app/view/RightMenu.js index 28dfdf324..0551372cf 100644 --- a/apps/presentationeditor/main/app/view/RightMenu.js +++ b/apps/presentationeditor/main/app/view/RightMenu.js @@ -280,29 +280,6 @@ define([ return (this.minimizedMode) ? null : this.$el.find(".settings-panel.active")[0].id; }, - SetDisabled: function(id, disabled, all, allowSignature) { - if (all) { - this.slideSettings.SetSlideDisabled(disabled, disabled, disabled); - this.paragraphSettings.disableControls(disabled); - this.shapeSettings.disableControls(disabled); - this.tableSettings.disableControls(disabled); - this.imageSettings.disableControls(disabled); - this.chartSettings.disableControls(disabled); - - if (!allowSignature && this.signatureSettings) { - this.signatureSettings.disableControls(disabled); - this.btnSignature.setDisabled(disabled); - } - - } else { - var cmp = $("#" + id); - if (disabled !== cmp.hasClass('disabled')) { - cmp.toggleClass('disabled', disabled); - (disabled) ? cmp.attr({disabled: disabled}) : cmp.removeAttr('disabled'); - } - } - }, - clearSelection: function() { var target_pane = $(".right-panel"); target_pane.find('> .active').removeClass('active'); diff --git a/apps/presentationeditor/main/app/view/SignatureSettings.js b/apps/presentationeditor/main/app/view/SignatureSettings.js index 80bac26ee..5f3f943c3 100644 --- a/apps/presentationeditor/main/app/view/SignatureSettings.js +++ b/apps/presentationeditor/main/app/view/SignatureSettings.js @@ -69,7 +69,9 @@ define([ DisabledControls: false, DisabledInsertControls: false, validSignatures: undefined, - invalidSignatures: undefined + invalidSignatures: undefined, + DisabledEditing: false, + ready: false }; this._locked = false; this.lockedControls = []; @@ -115,16 +117,15 @@ define([ setApi: function(api) { this.api = api; if (this.api) { - this.api.asc_registerCallback('asc_onUpdateSignatures', _.bind(this.onUpdateSignatures, this)); + this.api.asc_registerCallback('asc_onUpdateSignatures', _.bind(this.onApiUpdateSignatures, this)); } Common.NotificationCenter.on('document:ready', _.bind(this.onDocumentReady, this)); return this; }, ChangeSettings: function(props) { - if (!this._state.validSignatures || !this._state.invalidSignatures) { - this.onUpdateSignatures(this.api.asc_getSignatures()); - } + if (!this._state.validSignatures || !this._state.invalidSignatures) + this.updateSignatures(this.api.asc_getSignatures()); this.disableControls(this._locked); }, @@ -154,7 +155,14 @@ define([ this.mode = mode; }, - onUpdateSignatures: function(valid){ + onApiUpdateSignatures: function(valid){ + if (!this._state.ready) return; + + this.updateSignatures(valid); + this.showSignatureTooltip(this._state.validSignatures.length>0 || this._state.invalidSignatures.length>0); + }, + + updateSignatures: function(valid){ var me = this; me._state.validSignatures = []; me._state.invalidSignatures = []; @@ -174,6 +182,8 @@ define([ var width = this.$linksView.width(); $('.signature-sign-name', this.cntValidSign).css('max-width', 170-width); $('.signature-sign-name', this.cntInvalidSign).css('max-width', 170-width); + + me.disableEditing(me._state.validSignatures.length>0 || me._state.invalidSignatures.length>0); }, addInvisibleSign: function(btn) { @@ -201,50 +211,55 @@ define([ }, onDocumentReady: function() { - this.ChangeSettings(); + this._state.ready = true; + + this.updateSignatures(this.api.asc_getSignatures()); + this.showSignatureTooltip(this._state.validSignatures.length>0 || this._state.invalidSignatures.length>0); + }, + + showSignatureTooltip: function(hasSigned) { + if (!hasSigned) return; var me = this, - hasSigned = (me._state.validSignatures.length>0 || me._state.invalidSignatures.length>0); - - hasSigned && this.disableEditing(hasSigned); - - if (!this._state.tip && hasSigned) { - this._state.tip = new Common.UI.SynchronizeTip({ + tip = new Common.UI.SynchronizeTip({ target : PE.getController('RightMenu').getView('RightMenu').btnSignature.btnEl, text : this.txtSignedDocument, showLink: hasSigned, textLink: this.txtContinueEditing, placement: 'left' }); - this._state.tip.on({ - 'dontshowclick': function() { - me._state.tip.hide(); - // me.api.editSingedDoc(); - me.disableEditing(false); - }, - 'closeclick': function() { - me._state.tip.hide(); - } - }); - this._state.tip.show(); - } + tip.on({ + 'dontshowclick': function() { + tip.close(); + // me.api.editSingedDoc(); + me.disableEditing(false); + }, + 'closeclick': function() { + tip.close(); + } + }); + tip.show(); }, disableEditing: function(disable) { - disable && PE.getController('RightMenu').getView('RightMenu').clearSelection(); - PE.getController('RightMenu').SetDisabled(disable, true); - PE.getController('Toolbar').DisableToolbar(disable, disable); - PE.getController('Statusbar').getView('Statusbar').SetDisabled(disable); - PE.getController('Common.Controllers.ReviewChanges').SetDisabled(disable); - PE.getController('DocumentHolder').getView('DocumentHolder').SetDisabled(disable); + if (this._state.DisabledEditing != disable) { + this._state.DisabledEditing = disable; - var leftMenu = PE.getController('LeftMenu').leftMenu; - leftMenu.btnComments.setDisabled(disable); - var comments = PE.getController('Common.Controllers.Comments'); - if (comments) - comments.setPreviewMode(disable); + disable && PE.getController('RightMenu').getView('RightMenu').clearSelection(); + PE.getController('RightMenu').SetDisabled(disable, true); + PE.getController('Toolbar').DisableToolbar(disable, disable); + PE.getController('Statusbar').getView('Statusbar').SetDisabled(disable); + PE.getController('Common.Controllers.ReviewChanges').SetDisabled(disable); + PE.getController('DocumentHolder').getView('DocumentHolder').SetDisabled(disable); - this.disableInsertControls(disable); + var leftMenu = PE.getController('LeftMenu').leftMenu; + leftMenu.btnComments.setDisabled(disable); + var comments = PE.getController('Common.Controllers.Comments'); + if (comments) + comments.setPreviewMode(disable); + + this.disableInsertControls(disable); + } }, strSignature: 'Signature', From f40757d3f0e7a5c47d5703f138ebd91f7370eb3a Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 10 Nov 2017 17:11:58 +0300 Subject: [PATCH 14/86] Don't close signature settings when document has been signed. --- apps/documenteditor/main/app/view/SignatureSettings.js | 6 ++++-- apps/presentationeditor/main/app/view/SignatureSettings.js | 6 ++++-- apps/spreadsheeteditor/main/app/view/SignatureSettings.js | 6 ++++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/apps/documenteditor/main/app/view/SignatureSettings.js b/apps/documenteditor/main/app/view/SignatureSettings.js index 2a6741de2..8d2e0613f 100644 --- a/apps/documenteditor/main/app/view/SignatureSettings.js +++ b/apps/documenteditor/main/app/view/SignatureSettings.js @@ -327,9 +327,11 @@ define([ if (this._state.DisabledEditing != disable) { this._state.DisabledEditing = disable; - disable && DE.getController('RightMenu').getView('RightMenu').clearSelection(); + var rightMenuController = DE.getController('RightMenu'); + if (disable && rightMenuController.rightmenu.GetActivePane() !== 'id-signature-settings') + rightMenuController.rightmenu.clearSelection(); + rightMenuController.SetDisabled(disable, false, true); DE.getController('Toolbar').DisableToolbar(disable, disable); - DE.getController('RightMenu').SetDisabled(disable, false, true); DE.getController('Statusbar').getView('Statusbar').SetDisabled(disable); DE.getController('Common.Controllers.ReviewChanges').SetDisabled(disable); DE.getController('DocumentHolder').getView().SetDisabled(disable); diff --git a/apps/presentationeditor/main/app/view/SignatureSettings.js b/apps/presentationeditor/main/app/view/SignatureSettings.js index 5f3f943c3..242b38386 100644 --- a/apps/presentationeditor/main/app/view/SignatureSettings.js +++ b/apps/presentationeditor/main/app/view/SignatureSettings.js @@ -245,8 +245,10 @@ define([ if (this._state.DisabledEditing != disable) { this._state.DisabledEditing = disable; - disable && PE.getController('RightMenu').getView('RightMenu').clearSelection(); - PE.getController('RightMenu').SetDisabled(disable, true); + var rightMenuController = PE.getController('RightMenu'); + if (disable && rightMenuController.rightmenu.GetActivePane() !== 'id-signature-settings') + rightMenuController.rightmenu.clearSelection(); + rightMenuController.SetDisabled(disable, true); PE.getController('Toolbar').DisableToolbar(disable, disable); PE.getController('Statusbar').getView('Statusbar').SetDisabled(disable); PE.getController('Common.Controllers.ReviewChanges').SetDisabled(disable); diff --git a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js index 625126e66..fe96271f5 100644 --- a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js +++ b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js @@ -327,9 +327,11 @@ define([ if (this._state.DisabledEditing != disable) { this._state.DisabledEditing = disable; - disable && SSE.getController('RightMenu').getView('RightMenu').clearSelection(); + var rightMenuController = SSE.getController('RightMenu'); + if (disable && rightMenuController.rightmenu.GetActivePane() !== 'id-signature-settings') + rightMenuController.rightmenu.clearSelection(); + rightMenuController.SetDisabled(disable, true); SSE.getController('Toolbar').DisableToolbar(disable, disable); - SSE.getController('RightMenu').SetDisabled(disable, true); SSE.getController('Common.Controllers.ReviewChanges').SetDisabled(disable); SSE.getController('DocumentHolder').SetDisabled(disable); SSE.getController('Statusbar').SetDisabled(disable); From 9e458a51f8a454151d1748d2bcee2ab471d5164c Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 28 Nov 2017 15:23:37 +0300 Subject: [PATCH 15/86] [DE] Added Protection tab with the ability to encrypt and sign document. --- apps/common/main/lib/controller/Protection.js | 240 ++++++++++++++++++ apps/common/main/lib/view/PasswordDialog.js | 178 +++++++++++++ apps/common/main/lib/view/Protection.js | 233 +++++++++++++++++ apps/documenteditor/main/app.js | 2 + .../main/app/controller/Main.js | 3 + .../main/app/controller/Toolbar.js | 9 +- .../main/app/view/DocumentHolder.js | 32 --- .../main/app/view/SignatureSettings.js | 2 +- apps/documenteditor/main/app/view/Toolbar.js | 3 +- apps/documenteditor/main/app_dev.js | 2 + .../main/app/view/SignatureSettings.js | 2 +- .../main/app/view/SignatureSettings.js | 2 +- 12 files changed, 671 insertions(+), 37 deletions(-) create mode 100644 apps/common/main/lib/controller/Protection.js create mode 100644 apps/common/main/lib/view/PasswordDialog.js create mode 100644 apps/common/main/lib/view/Protection.js diff --git a/apps/common/main/lib/controller/Protection.js b/apps/common/main/lib/controller/Protection.js new file mode 100644 index 000000000..39b259554 --- /dev/null +++ b/apps/common/main/lib/controller/Protection.js @@ -0,0 +1,240 @@ +/* + * + * (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 + * + */ + +/** + * Protection.js + * + * Created by Julia Radzhabova on 14.11.2017 + * Copyright (c) 2017 Ascensio System SIA. All rights reserved. + * + */ + +if (Common === undefined) + var Common = {}; +Common.Controllers = Common.Controllers || {}; + +define([ + 'core', + 'common/main/lib/view/Protection', + 'common/main/lib/view/PasswordDialog', + 'common/main/lib/view/SignDialog', + 'common/main/lib/view/SignSettingsDialog' +], function () { + 'use strict'; + + Common.Controllers.Protection = Backbone.Controller.extend(_.extend({ + models : [], + collections : [ + ], + views : [ + 'Common.Views.Protection' + ], + sdkViewName : '#id_main', + + initialize: function () { + + this.addListeners({ + 'Common.Views.Protection': { + 'protect:password': _.bind(this.onPasswordClick, this), + 'protect:signature': _.bind(this.onSignatureClick, this) + } + }); + }, + onLaunch: function () { + this._state = {}; + + Common.NotificationCenter.on('app:ready', this.onAppReady.bind(this)); + Common.NotificationCenter.on('api:disconnect', _.bind(this.SetDisabled, this)); + }, + setConfig: function (data, api) { + this.setApi(api); + + if (data) { + this.sdkViewName = data['sdkviewname'] || this.sdkViewName; + } + }, + setApi: function (api) { + if (api) { + this.api = api; + + if (this.appConfig.isDesktopApp && this.appConfig.isOffline) { + this.api.asc_registerCallback('asc_onDocumentPassword', _.bind(this.onDocumentPassword, this)); + if (this.appConfig.canProtect) { + this.api.asc_registerCallback('asc_onSignatureClick', _.bind(this.onApiSignatureClick, this)); + // this.api.asc_registerCallback('asc_onUpdateSignatures', _.bind(this.onApiUpdateSignatures, this)); + } + } + this.api.asc_registerCallback('asc_onCoAuthoringDisconnect',_.bind(this.SetDisabled, this)); + } + }, + + setMode: function(mode) { + this.appConfig = mode; + + this.view = this.createView('Common.Views.Protection', { + mode: mode + }); + + return this; + }, + + onDocumentPassword: function(hasPassword) { + if (!this.view) return; + this.view.btnAddPwd.setVisible(!hasPassword); + this.view.btnPwd.setVisible(hasPassword); + }, + + SetDisabled: function(state) { + // if (this.dlgChanges) + // this.dlgChanges.close(); + this.view && this.view.SetDisabled(state); + }, + + onPasswordClick: function(btn, opts){ + switch (opts) { + case 'add': this.addPassword(); break; + // case 'delete': this.deletePassword(); break; + } + + Common.NotificationCenter.trigger('edit:complete', this.view); + }, + + onSignatureClick: function(btn, opts){ + switch (opts) { + case 'invisible': this.addInvisibleSignature(); break; + case 'visible': this.addVisibleSignature(); break; + } + }, + + createToolbarPanel: function() { + return this.view.getPanel(); + }, + + getView: function(name) { + return !name && this.view ? + this.view : Backbone.Controller.prototype.getView.call(this, name); + }, + + onAppReady: function (config) { + var me = this; + }, + + addPassword: function() { + var me = this, + win = new Common.Views.PasswordDialog({ + api: me.api, + signType: 'invisible', + handler: function(result, props) { + if (result == 'ok') { + me.api.setCurrentPassword(props); + } + Common.NotificationCenter.trigger('edit:complete'); + } + }); + + win.show(); + }, + + deletePassword: function() { + this.api.resetPassword(); + }, + + addInvisibleSignature: function(btn) { + var me = this, + win = new Common.Views.SignDialog({ + api: me.api, + signType: 'invisible', + handler: function(dlg, result) { + if (result == 'ok') { + var props = dlg.getSettings(); + me.api.asc_Sign(props.certificateId); + } + Common.NotificationCenter.trigger('edit:complete'); + } + }); + + win.show(); + }, + + addVisibleSignature: function(btn) { + var me = this, + win = new Common.Views.SignSettingsDialog({ + handler: function(dlg, result) { + if (result == 'ok') { + me.api.asc_AddSignatureLine2(dlg.getSettings()); + } + Common.NotificationCenter.trigger('edit:complete'); + } + }); + + win.show(); + }, + + signVisibleSignature: function(guid, width, height) { + var me = this; + if (_.isUndefined(me.fontStore)) { + me.fontStore = new Common.Collections.Fonts(); + var fonts = me.getApplication().getController('Toolbar').getView('Toolbar').cmbFontName.store.toJSON(); + var arr = []; + _.each(fonts, function(font, index){ + if (!font.cloneid) { + arr.push(_.clone(font)); + } + }); + me.fontStore.add(arr); + } + + var win = new Common.Views.SignDialog({ + api: me.api, + signType: 'visible', + fontStore: me.fontStore, + signSize: {width: width || 0, height: height || 0}, + handler: function(dlg, result) { + if (result == 'ok') { + var props = dlg.getSettings(); + me.api.asc_Sign(props.certificateId, guid, props.images[0], props.images[1]); + } + Common.NotificationCenter.trigger('edit:complete'); + } + }); + + win.show(); + }, + + onApiSignatureClick: function(guid, width, height) { + this.signVisibleSignature(guid, width, height); + } + + + }, Common.Controllers.Protection || {})); +}); \ No newline at end of file diff --git a/apps/common/main/lib/view/PasswordDialog.js b/apps/common/main/lib/view/PasswordDialog.js new file mode 100644 index 000000000..9f240b7fd --- /dev/null +++ b/apps/common/main/lib/view/PasswordDialog.js @@ -0,0 +1,178 @@ +/* + * + * (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 + * +*/ +/** + * OpenDialog.js + * + * Select Codepage for open CSV/TXT format file. + * + * Created by Alexey.Musinov on 29/04/14 + * Copyright (c) 2014 Ascensio System SIA. All rights reserved. + * + */ + +define([ + 'common/main/lib/component/Window' +], function () { + 'use strict'; + + Common.Views.PasswordDialog = Common.UI.Window.extend(_.extend({ + + applyFunction: undefined, + + initialize : function (options) { + var t = this, + _options = {}; + + _.extend(_options, { + closable: false, + width : 350, + height : 220, + header : true, + cls : 'modal-dlg', + contentTemplate : '', + title : t.txtTitle + + }, options); + + this.template = options.template || [ + '
    ', + '
    ', + '', + '
    ', + '
    ', + '', + '
    ', + '
    ', + '
    ', + '', + '
    ', + '
    ', + + // '
    ', + // '', + // '', + // '
    ', + // '', + // '
    ', + // '
    ', + '
    ', + '
    ', + '' + ].join(''); + + this.handler = options.handler; + this.settings = options.settings; + + _options.tpl = _.template(this.template)(_options); + + Common.UI.Window.prototype.initialize.call(this, _options); + }, + render: function () { + Common.UI.Window.prototype.render.call(this); + + if (this.$window) { + var me = this; + this.$window.find('.tool').hide(); + this.$window.find('.dlg-btn').on('click', _.bind(this.onBtnClick, this)); + this.inputPwd = new Common.UI.InputField({ + el: $('#id-password-txt'), + type: 'password', + allowBlank : false, + style : 'width: 100%;', + validateOnBlur: false + }); + this.repeatPwd = new Common.UI.InputField({ + el: $('#id-repeat-txt'), + type: 'password', + allowBlank : false, + style : 'width: 100%;', + validateOnBlur: false, + validation : function(value) { + return me.txtIncorrectPwd; + } + }); + this.$window.find('input').on('keypress', _.bind(this.onKeyPress, this)); + } + }, + + show: function() { + Common.UI.Window.prototype.show.apply(this, arguments); + + var me = this; + setTimeout(function(){ + me.inputPwd.cmpEl.find('input').focus(); + }, 500); + }, + + onKeyPress: function(event) { + if (event.keyCode == Common.UI.Keys.RETURN) { + this._handleInput('ok'); + } + }, + + onBtnClick: function(event) { + this._handleInput(event.currentTarget.attributes['result'].value); + }, + + _handleInput: function(state) { + if (this.handler) { + if (state == 'ok') { + if (this.inputPwd.checkValidate() !== true) { + this.inputPwd.cmpEl.find('input').focus(); + return; + } + if (this.inputPwd.getValue() !== this.repeatPwd.getValue()) { + this.repeatPwd.checkValidate(); + this.repeatPwd.cmpEl.find('input').focus(); + return; + } + } + this.handler.call(this, state, this.inputPwd.getValue()); + } + + this.close(); + }, + + okButtonText : "OK", + cancelButtonText : "Cancel", + txtTitle : "Set Password", + txtPassword : "Password", + txtDescription : "A Password is required to open this document", + txtRepeat: 'Repeat password', + txtIncorrectPwd: 'Confirmation password is not identical' + + }, Common.Views.Password || {})); +}); \ No newline at end of file diff --git a/apps/common/main/lib/view/Protection.js b/apps/common/main/lib/view/Protection.js new file mode 100644 index 000000000..d9ced8498 --- /dev/null +++ b/apps/common/main/lib/view/Protection.js @@ -0,0 +1,233 @@ +/* + * + * (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 + * + */ + +/** + * Protection.js + * + * Created by Julia Radzhabova on 14.11.2017 + * Copyright (c) 2017 Ascensio System SIA. All rights reserved. + * + */ + +if (Common === undefined) + var Common = {}; + +Common.Views = Common.Views || {}; + +define([ + 'common/main/lib/util/utils', + 'common/main/lib/component/BaseView', + 'common/main/lib/component/Layout', + 'common/main/lib/component/Window' +], function (template) { + 'use strict'; + + Common.Views.Protection = Common.UI.BaseView.extend(_.extend((function(){ + var template = + '
    ' + + '
    ' + + '' + + '' + + '' + + '
    ' + + '
    '; + + function setEvents() { + var me = this; + + if ( me.appConfig.isDesktopApp && me.appConfig.isOffline ) { + this.btnAddPwd.on('click', function (e) { + me.fireEvent('protect:password', [me.btnAddPwd, 'add']); + }); + + this.btnPwd.menu.on('item:click', function (menu, item, e) { + me.fireEvent('protect:password', [menu, item.value]); + }); + + if (me.appConfig.canProtect) { + this.btnSignature.menu.on('item:click', function (menu, item, e) { + me.fireEvent('protect:signature', [menu, item.value]); + }); + + this.btnsInvisibleSignature.forEach(function(button) { + button.on('click', function (b, e) { + me.fireEvent('protect:signature', [b, 'invisible']); + }); + }); + } + } + } + + return { + + options: {}, + + initialize: function (options) { + Common.UI.BaseView.prototype.initialize.call(this, options); + + this.appConfig = options.mode; + + if ( this.appConfig.isDesktopApp && this.appConfig.isOffline ) { + this.btnAddPwd = new Common.UI.Button({ + cls: 'btn-toolbar x-huge icon-top', + iconCls: 'review-prev', + caption: this.txtEncrypt + }); + + this.btnPwd = new Common.UI.Button({ + cls: 'btn-toolbar x-huge icon-top', + iconCls: 'btn-ic-reviewview', + caption: this.txtEncrypt, + menu: true + }); + + if (this.appConfig.canProtect) + this.btnSignature = new Common.UI.Button({ + cls: 'btn-toolbar x-huge icon-top', + iconCls: 'btn-ic-reviewview', + caption: this.txtSignature, + menu: true + }); + } + + this.btnsInvisibleSignature = []; + + var filter = Common.localStorage.getKeysFilter(); + this.appPrefix = (filter && filter.length) ? filter.split(',')[0] : ''; + + Common.NotificationCenter.on('app:ready', this.onAppReady.bind(this)); + }, + + render: function (el) { + this.boxSdk = $('#editor_sdk'); + if ( el ) el.html( this.getPanel() ); + + return this; + }, + + onAppReady: function (config) { + var me = this; + (new Promise(function (accept, reject) { + accept(); + })).then(function(){ + if ( config.isDesktopApp && config.isOffline) { + me.btnAddPwd.updateHint(me.hintAddPwd); + me.btnPwd.updateHint(me.hintPwd); + + me.btnPwd.setMenu( + new Common.UI.Menu({ + items: [ + { + caption: me.txtChangePwd, + value: 'add' + }, + { + caption: me.txtDeletePwd, + value: 'delete' + } + ] + }) + ); + + if (me.btnSignature) { + me.btnSignature.updateHint(me.hintSignature); + me.btnSignature.setMenu( + new Common.UI.Menu({ + items: [ + { + caption: me.txtInvisibleSignature, + value: 'invisible' + }, + { + caption: me.txtSignatureLine, + value: 'visible' + } + ] + }) + ); + } + Common.NotificationCenter.trigger('tab:visible', 'protect', true); + } + + setEvents.call(me); + }); + }, + + getPanel: function () { + this.$el = $(_.template(template)( {} )); + + if ( this.appConfig.isDesktopApp && this.appConfig.isOffline ) { + this.btnAddPwd.render(this.$el.find('#slot-btn-add-password')); + this.btnPwd.render(this.$el.find('#slot-btn-change-password')); + this.btnPwd.setVisible(false); + this.btnSignature && this.btnSignature.render(this.$el.find('#slot-btn-signature')); + } + return this.$el; + }, + + show: function () { + Common.UI.BaseView.prototype.show.call(this); + this.fireEvent('show', this); + }, + + getButton: function(type, parent) { + if ( type == 'signature' ) { + var button = new Common.UI.Button({}); + this.btnsInvisibleSignature.push(button); + + return button; + } + }, + + SetDisabled: function (state, langs) { + this.btnsInvisibleSignature && this.btnsInvisibleSignature.forEach(function(button) { + if ( button ) { + button.setDisabled(state); + } + }, this); + this.btnSignature && this.btnSignature.setDisabled(state); + }, + + txtEncrypt: 'Encrypt', + txtSignature: 'Signature', + hintAddPwd: 'Encrypt with password', + hintPwd: 'Change or delete password', + hintSignature: 'Add digital signature or signature line', + txtChangePwd: 'Change password', + txtDeletePwd: 'Delete password', + txtInvisibleSignature: 'Add digital signature', + txtSignatureLine: 'Signature line' + + } + }()), Common.Views.Protection || {})); +}); \ No newline at end of file diff --git a/apps/documenteditor/main/app.js b/apps/documenteditor/main/app.js index a8ae63fe6..bc6d337c9 100644 --- a/apps/documenteditor/main/app.js +++ b/apps/documenteditor/main/app.js @@ -163,6 +163,7 @@ require([ ,'Common.Controllers.ExternalDiagramEditor' ,'Common.Controllers.ExternalMergeEditor' ,'Common.Controllers.ReviewChanges' + ,'Common.Controllers.Protection' ] }); @@ -197,6 +198,7 @@ require([ ,'common/main/lib/controller/ExternalDiagramEditor' ,'common/main/lib/controller/ExternalMergeEditor' ,'common/main/lib/controller/ReviewChanges' + ,'common/main/lib/controller/Protection' ], function() { app.start(); }); diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index 512311ef5..27065437a 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -1106,6 +1106,9 @@ define([ reviewController.setMode(me.appOptions).setConfig({config: me.editorConfig}, me.api); + if (this.appOptions.isDesktopApp && this.appOptions.isOffline) + application.getController('Common.Controllers.Protection').setMode(me.appOptions).setConfig({config: me.editorConfig}, me.api); + var viewport = this.getApplication().getController('Viewport').getView('Viewport'); viewport.applyEditorMode(); diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index f28badea1..fad73f29e 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -2849,8 +2849,15 @@ define([ var tab = {action: 'review', caption: me.toolbar.textTabReview}; var $panel = DE.getController('Common.Controllers.ReviewChanges').createToolbarPanel(); - if ( $panel ) { + if ( $panel ) me.toolbar.addTab(tab, $panel, 3); + + if (config.isDesktopApp && config.isOffline) { + tab = {action: 'protect', caption: me.toolbar.textTabProtect}; + var $panel = this.getApplication().getController('Common.Controllers.Protection').createToolbarPanel(); + + if ( $panel ) + me.toolbar.addTab(tab, $panel, 4); } } }, diff --git a/apps/documenteditor/main/app/view/DocumentHolder.js b/apps/documenteditor/main/app/view/DocumentHolder.js index b09e538cf..9133b1b37 100644 --- a/apps/documenteditor/main/app/view/DocumentHolder.js +++ b/apps/documenteditor/main/app/view/DocumentHolder.js @@ -726,36 +726,6 @@ define([ me.mode.isEdit = false; }; - var onSignatureClick = function(guid, width, height) { - if (_.isUndefined(me.fontStore)) { - me.fontStore = new Common.Collections.Fonts(); - var fonts = DE.getController('Toolbar').getView('Toolbar').cmbFontName.store.toJSON(); - var arr = []; - _.each(fonts, function(font, index){ - if (!font.cloneid) { - arr.push(_.clone(font)); - } - }); - me.fontStore.add(arr); - } - - var win = new Common.Views.SignDialog({ - api: me.api, - signType: 'visible', - fontStore: me.fontStore, - signSize: {width: width, height: height}, - handler: function(dlg, result) { - if (result == 'ok') { - var props = dlg.getSettings(); - me.api.asc_Sign(props.certificateId, guid, props.images[0], props.images[1]); - } - Common.NotificationCenter.trigger('edit:complete'); - } - }); - - win.show(); - }; - var onTextLanguage = function(langid) { me._currLang.id = langid; }; @@ -1559,8 +1529,6 @@ define([ this.api.asc_registerCallback('asc_onFocusObject', _.bind(onFocusObject, this)); this.api.asc_registerCallback('asc_onShowSpecialPasteOptions', _.bind(onShowSpecialPasteOptions, this)); this.api.asc_registerCallback('asc_onHideSpecialPasteOptions', _.bind(onHideSpecialPasteOptions, this)); - - this.api.asc_registerCallback('asc_onSignatureClick', _.bind(onSignatureClick, this)); } return this; diff --git a/apps/documenteditor/main/app/view/SignatureSettings.js b/apps/documenteditor/main/app/view/SignatureSettings.js index 8d2e0613f..818b1c99d 100644 --- a/apps/documenteditor/main/app/view/SignatureSettings.js +++ b/apps/documenteditor/main/app/view/SignatureSettings.js @@ -314,7 +314,7 @@ define([ 'dontshowclick': function() { tip.close(); // me.api.editSingedDoc(); - me.disableEditing(false); + // me.disableEditing(false); // call in the asc_onUpdateSignatures event callback. }, 'closeclick': function() { tip.close(); diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index 7f63b5438..0cf7d3d98 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -2520,7 +2520,8 @@ define([ capImgWrapping: 'Wrapping', capBtnComment: 'Comment', textColumnsCustom: 'Custom Columns', - textSurface: 'Surface' + textSurface: 'Surface', + textTabProtect: 'Protection' } })(), DE.Views.Toolbar || {})); }); diff --git a/apps/documenteditor/main/app_dev.js b/apps/documenteditor/main/app_dev.js index 8e102a689..6e444ed4c 100644 --- a/apps/documenteditor/main/app_dev.js +++ b/apps/documenteditor/main/app_dev.js @@ -153,6 +153,7 @@ require([ ,'Common.Controllers.ExternalDiagramEditor' ,'Common.Controllers.ExternalMergeEditor' ,'Common.Controllers.ReviewChanges' + ,'Common.Controllers.Protection' ] }); @@ -187,6 +188,7 @@ require([ ,'common/main/lib/controller/ExternalDiagramEditor' ,'common/main/lib/controller/ExternalMergeEditor' ,'common/main/lib/controller/ReviewChanges' + ,'common/main/lib/controller/Protection' ], function() { window.compareVersions = true; app.start(); diff --git a/apps/presentationeditor/main/app/view/SignatureSettings.js b/apps/presentationeditor/main/app/view/SignatureSettings.js index 242b38386..ca732edca 100644 --- a/apps/presentationeditor/main/app/view/SignatureSettings.js +++ b/apps/presentationeditor/main/app/view/SignatureSettings.js @@ -232,7 +232,7 @@ define([ 'dontshowclick': function() { tip.close(); // me.api.editSingedDoc(); - me.disableEditing(false); + // me.disableEditing(false); // call in the asc_onUpdateSignatures event callback.me.disableEditing(false); }, 'closeclick': function() { tip.close(); diff --git a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js index fe96271f5..b40296ea2 100644 --- a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js +++ b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js @@ -314,7 +314,7 @@ define([ 'dontshowclick': function() { tip.close(); // me.api.editSingedDoc(); - me.disableEditing(false); + // me.disableEditing(false); // call in the asc_onUpdateSignatures event callback. }, 'closeclick': function() { tip.close(); From abdaa3ede69940e417d644490463563e0ab78365 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 28 Nov 2017 15:25:06 +0300 Subject: [PATCH 16/86] [DE] Update translations. --- apps/common/main/lib/controller/Protection.js | 2 -- apps/common/main/lib/view/PasswordDialog.js | 10 +--------- apps/common/main/lib/view/Protection.js | 1 - apps/documenteditor/main/locale/en.json | 17 +++++++++++++++++ 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/apps/common/main/lib/controller/Protection.js b/apps/common/main/lib/controller/Protection.js index 39b259554..47cce75de 100644 --- a/apps/common/main/lib/controller/Protection.js +++ b/apps/common/main/lib/controller/Protection.js @@ -234,7 +234,5 @@ define([ onApiSignatureClick: function(guid, width, height) { this.signVisibleSignature(guid, width, height); } - - }, Common.Controllers.Protection || {})); }); \ No newline at end of file diff --git a/apps/common/main/lib/view/PasswordDialog.js b/apps/common/main/lib/view/PasswordDialog.js index 9f240b7fd..c88765c2e 100644 --- a/apps/common/main/lib/view/PasswordDialog.js +++ b/apps/common/main/lib/view/PasswordDialog.js @@ -77,14 +77,6 @@ define([ '', '
    ', '
    ', - - // '
    ', - // '', - // '', - // '
    ', - // '', - // '
    ', - // '
    ', '', '
    ', '', '' ].join(''); - this.options.tpl = _.template(this.template)(this.options); this.api = this.options.api; + this.type = this.options.type || 'edit'; + this.options.tpl = _.template(this.template)(this.options); Common.UI.Window.prototype.initialize.call(this, this.options); }, @@ -104,17 +108,20 @@ define([ me.inputName = new Common.UI.InputField({ el : $('#id-dlg-sign-settings-name'), - style : 'width: 100%;' + style : 'width: 100%;', + disabled : this.type=='view' }); me.inputTitle = new Common.UI.InputField({ el : $('#id-dlg-sign-settings-title'), - style : 'width: 100%;' + style : 'width: 100%;', + disabled : this.type=='view' }); me.inputEmail = new Common.UI.InputField({ el : $('#id-dlg-sign-settings-email'), - style : 'width: 100%;' + style : 'width: 100%;', + disabled : this.type=='view' }); me.textareaInstructions = this.$window.find('textarea'); @@ -123,10 +130,13 @@ define([ event.stopPropagation(); } }); + (this.type=='view') ? this.textareaInstructions.attr('disabled', 'disabled') : this.textareaInstructions.removeAttr('disabled'); + this.textareaInstructions.toggleClass('disabled', this.type=='view'); this.chDate = new Common.UI.CheckBox({ el: $('#id-dlg-sign-settings-date'), - labelText: this.textShowDate + labelText: this.textShowDate, + disabled: this.type=='view' }); $window.find('.dlg-btn').on('click', _.bind(this.onBtnClick, this)); @@ -146,15 +156,15 @@ define([ if (props) { var me = this; - // var value = props.asc_getSigner1(); - // me.inputName.setValue(value ? value : ''); - // value = props.asc_getSigner2(); - // me.inputTitle.setValue(value ? value : ''); - // value = props.asc_getEmail(); - // me.inputEmail.setValue(value ? value : ''); - // value = props.asc_getInstructions(); - // me.textareaInstructions.val(value ? value : ''); - // me.chDate.setValue(props.asc_getShowDate()); + var value = props.asc_getSigner1(); + me.inputName.setValue(value ? value : ''); + value = props.asc_getSigner2(); + me.inputTitle.setValue(value ? value : ''); + value = props.asc_getEmail(); + me.inputEmail.setValue(value ? value : ''); + value = props.asc_getInstructions(); + me.textareaInstructions.val(value ? value : ''); + me.chDate.setValue(props.asc_getShowDate()); } }, diff --git a/apps/documenteditor/main/app/template/SignatureSettings.template b/apps/documenteditor/main/app/template/SignatureSettings.template index dc38301ad..c4ee01174 100644 --- a/apps/documenteditor/main/app/template/SignatureSettings.template +++ b/apps/documenteditor/main/app/template/SignatureSettings.template @@ -9,14 +9,33 @@
    - - + + + + - - + + +
    + - - + + + + + + + +
    + + + + + + + + +
    \ No newline at end of file diff --git a/apps/documenteditor/main/app/view/SignatureSettings.js b/apps/documenteditor/main/app/view/SignatureSettings.js index f24becfdf..8c371897b 100644 --- a/apps/documenteditor/main/app/view/SignatureSettings.js +++ b/apps/documenteditor/main/app/view/SignatureSettings.js @@ -120,12 +120,58 @@ define([ this.btnAddInvisibleSign = protection.getButton('signature'); this.btnAddInvisibleSign.render(this.$el.find('#signature-invisible-sign')); - this.cntRequestedSign = $('#signature-requested-sign'); - this.cntValidSign = $('#signature-valid-sign'); - this.cntInvalidSign = $('#signature-invalid-sign'); + this.viewRequestedList = new Common.UI.DataView({ + el: $('#signature-requested-sign'), + enableKeyEvents: false, + itemTemplate: _.template([ + '
    ', + '
    ', + '
    <%= Common.Utils.String.htmlEncode(name) %>
    ', + '
    ', + '
    ' + ].join('')) + }); - this.$el.on('click', '.signature-sign-link', _.bind(this.onSign, this)); - this.$el.on('click', '.signature-view-link', _.bind(this.onViewSignature, this)); + this.viewValidList = new Common.UI.DataView({ + el: $('#signature-valid-sign'), + enableKeyEvents: false, + itemTemplate: _.template([ + '
    ', + '
    ', + '
    <%= Common.Utils.String.htmlEncode(name) %>
    ', + '
    <%= Common.Utils.String.htmlEncode(date) %>
    ', + '
    ', + '' + ].join('')) + }); + + this.viewInvalidList = new Common.UI.DataView({ + el: $('#signature-invalid-sign'), + enableKeyEvents: false, + itemTemplate: _.template([ + '
    ', + '
    ', + '
    <%= Common.Utils.String.htmlEncode(name) %>
    ', + '
    <%= Common.Utils.String.htmlEncode(date) %>
    ', + '
    ', + '' + ].join('')) + }); + + this.viewRequestedList.on('item:click', _.bind(this.onSelectSignature, this)); + this.viewValidList.on('item:click', _.bind(this.onSelectSignature, this)); + this.viewInvalidList.on('item:click', _.bind(this.onSelectSignature, this)); + + this.signatureMenu = new Common.UI.Menu({ + menuAlign : 'tr-br', + items: [ + { caption: this.strSign, value: 0 }, + { caption: this.strDetails,value: 1 }, + { caption: this.strSetup, value: 2 }, + { caption: this.strDelete, value: 3 } + ] + }); + this.signatureMenu.on('item:click', _.bind(this.onMenuSignatureClick, this)); }, setApi: function(api) { @@ -174,45 +220,108 @@ define([ me._state.invalidSignatures = []; _.each(requested, function(item, index){ - me._state.requestedSignatures.push({name: item.asc_getSigner1(), guid: item.asc_getGuid()}); + me._state.requestedSignatures.push({name: item.asc_getSigner1(), guid: item.asc_getGuid(), requested: true}); }); _.each(valid, function(item, index){ var sign = {name: item.asc_getSigner1(), guid: item.asc_getId(), date: '18/05/2017'}; (item.asc_getValid()==0) ? me._state.validSignatures.push(sign) : me._state.invalidSignatures.push(sign); }); - // me._state.requestedSignatures = [{name: 'Hammish Mitchell', guid: '123'}, {name: 'Someone Somewhere', guid: '123'}, {name: 'Mary White', guid: '123'}, {name: 'John Black', guid: '123'}]; + // me._state.requestedSignatures = [{name: 'Hammish Mitchell', guid: '123', requested: true}, {name: 'Someone Somewhere', guid: '123', requested: true}, {name: 'Mary White', guid: '123', requested: true}, {name: 'John Black', guid: '123', requested: true}]; // me._state.validSignatures = [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]; // me._state.invalidSignatures = [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}]; - this.cntRequestedSign.html(this.templateRequested({signatures: me._state.requestedSignatures, header: this.strRequested})); - this.cntValidSign.html(this.templateValid({signatures: me._state.validSignatures, header: this.strValid})); - this.cntInvalidSign.html(this.templateValid({signatures: me._state.invalidSignatures, header: this.strInvalid})); + this.viewRequestedList.store.reset(me._state.requestedSignatures); + this.viewValidList.store.reset(me._state.validSignatures); + this.viewInvalidList.store.reset(me._state.invalidSignatures); - this.$linksSign = $('.signature-sign-link', this.$el); - var width = this.$linksSign.width(); - $('.signature-sign-name', this.cntRequestedSign).css('max-width', 170-width); - - this.$linksView = $('.signature-view-link', this.$el); - width = this.$linksView.width(); - $('.signature-sign-name', this.cntValidSign).css('max-width', 170-width); - $('.signature-sign-name', this.cntInvalidSign).css('max-width', 170-width); + this.$el.find('.requested').toggleClass('hidden', me._state.requestedSignatures.length<1); + this.$el.find('.valid').toggleClass('hidden', me._state.validSignatures.length<1); + this.$el.find('.invalid').toggleClass('hidden', me._state.invalidSignatures.length<1); me.disableEditing(me._state.validSignatures.length>0 || me._state.invalidSignatures.length>0); }, - onSign: function(event) { - var target = $(event.currentTarget); - if (target.hasClass('disabled')) return; + onSelectSignature: function(picker, item, record, e){ + if (!record) return; - Common.NotificationCenter.trigger('protect:sign', target.attr('data-value')); + var btn = $(e.target); + if (btn && btn.hasClass('caret')) { + var menu = this.signatureMenu; + if (menu.isVisible()) { + menu.hide(); + return; + } + + var showPoint, me = this, + currentTarget = $(e.currentTarget), + parent = $(this.el), + offset = currentTarget.offset(), + offsetParent = parent.offset(); + + showPoint = [offset.left - offsetParent.left + currentTarget.width(), offset.top - offsetParent.top + currentTarget.height()/2]; + + var menuContainer = parent.find('#menu-signature-container'); + if (!menu.rendered) { + if (menuContainer.length < 1) { + menuContainer = $('', menu.id); + parent.append(menuContainer); + } + menu.render(menuContainer); + menu.cmpEl.attr({tabindex: "-1"}); + + menu.on({ + 'show:after': function(cmp) { + if (cmp && cmp.menuAlignEl) + cmp.menuAlignEl.toggleClass('over', true); + }, + 'hide:after': function(cmp) { + if (cmp && cmp.menuAlignEl) + cmp.menuAlignEl.toggleClass('over', false); + } + }); + } + var requested = record.get('requested'), + signed = (this._state.validSignatures.length>0 || this._state.invalidSignatures.length>0); + menu.items[0].setVisible(requested); + menu.items[1].setVisible(!requested); + menu.items[3].setVisible(!requested); + menu.items[0].setDisabled(this._locked); + menu.items[3].setDisabled(this._locked); + menu.items[2].cmpEl.attr('data-value', signed ? 1 : 0); // view or edit signature settings + menu.cmpEl.attr('data-value', record.get('guid')); + + menuContainer.css({left: showPoint[0], top: showPoint[1]}); + + menu.menuAlignEl = currentTarget; + menu.setOffset(-20, -currentTarget.height()/2 + 3); + menu.show(); + _.delay(function() { + menu.cmpEl.focus(); + }, 10); + e.stopPropagation(); + e.preventDefault(); + } else { + this.api.asc_gotoSignature(record.get('guid')); + } }, - onViewSignature: function(event) { - var target = $(event.currentTarget); - if (target.hasClass('disabled')) return; - - this.api.asc_ViewCertificate(target.attr('data-value')); + onMenuSignatureClick: function(menu, item) { + var guid = menu.cmpEl.attr('data-value'); + switch (item.value) { + case 0: + Common.NotificationCenter.trigger('protect:sign', guid); + break; + case 1: + this.api.asc_ViewCertificate(guid); + break; + case 2: + Common.NotificationCenter.trigger('protect:signature', 'visible', !!parseInt(item.cmpEl.attr('data-value')), guid);// can edit settings for requested signature + break; + case 3: + this.api.asc_DeleteSign(guid); + break; + } }, onDocumentReady: function() { @@ -285,13 +394,15 @@ define([ strValid: 'Valid signatures', strInvalid: 'Invalid signatures', strSign: 'Sign', - strView: 'View', + strDetails: 'Signature Details', + strSetup: 'Signature Setup', txtSigned: 'Valid signatures has been added to the document. The document is protected from editing.', txtSignedInvalid: 'Some of the digital signatures in document are invalid or could not be verified. The document is protected from editing.', txtRequestedSignatures: 'This document needs to be signed.', txtContinueEditing: 'Edit anyway', notcriticalErrorTitle: 'Warning', - txtEditWarning: 'Editing will remove the signatures from the document.
    Are you sure you want to continue?' + txtEditWarning: 'Editing will remove the signatures from the document.
    Are you sure you want to continue?', + strDelete: 'Remove Signature' }, DE.Views.SignatureSettings || {})); }); \ No newline at end of file diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index 43de40c8e..627b00928 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -1418,7 +1418,9 @@ "DE.Views.SignatureSettings.strValid": "Valid signatures", "DE.Views.SignatureSettings.strInvalid": "Invalid signatures", "DE.Views.SignatureSettings.strSign": "Sign", - "DE.Views.SignatureSettings.strView": "View", + "DE.Views.SignatureSettings.strDetails": "Signature Details", + "DE.Views.SignatureSettings.strDelete": "Remove Signature", + "DE.Views.SignatureSettings.strSetup": "Signature Setup", "DE.Views.SignatureSettings.txtSigned": "Valid signatures has been added to the document. The document is protected from editing.", "DE.Views.SignatureSettings.txtSignedInvalid": "Some of the digital signatures in document are invalid or could not be verified. The document is protected from editing.", "DE.Views.SignatureSettings.txtRequestedSignatures": "This document needs to be signed.", diff --git a/apps/documenteditor/main/resources/less/rightmenu.less b/apps/documenteditor/main/resources/less/rightmenu.less index c458f8274..1a2c28945 100644 --- a/apps/documenteditor/main/resources/less/rightmenu.less +++ b/apps/documenteditor/main/resources/less/rightmenu.less @@ -270,8 +270,54 @@ button:active:not(.disabled) .btn-change-shape {background-position: -56px - background-position: -100px -150px; } -.signature-sign-name { +#signature-requested-sign, +#signature-valid-sign, +#signature-invalid-sign { + height: 100%; overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; + margin: 0 -10px 0 -15px; + + .item { + display: block; + border: none; + width: 100%; + .box-shadow(none); + margin: 0; + + &:hover, + &.over { + background-color: @secondary; + } + } + + .signature-item { + padding: 5px 2px 5px 15px; + text-overflow: ellipsis; + + .name { + width: 100%; + white-space: nowrap; + overflow: hidden; + cursor: pointer; + max-width: 160px; + text-overflow: ellipsis; + } + + .caret { + width: 23px; + height: 14px; + border: 0; + background-position: -43px -150px; + margin: 8px 15px; + display: inline-block; + position: absolute; + right: 0; + } + + &.requested { + .caret { + margin: 0 15px; + } + } + } } \ No newline at end of file From 3c7b6c2553df9ffdaa9b5f13eaa7930d3f84c309 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Thu, 16 Nov 2017 16:37:37 +0300 Subject: [PATCH 23/86] [DE] Change remove signature method. --- apps/documenteditor/main/app/view/SignatureSettings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/documenteditor/main/app/view/SignatureSettings.js b/apps/documenteditor/main/app/view/SignatureSettings.js index 8c371897b..a5064f017 100644 --- a/apps/documenteditor/main/app/view/SignatureSettings.js +++ b/apps/documenteditor/main/app/view/SignatureSettings.js @@ -319,7 +319,7 @@ define([ Common.NotificationCenter.trigger('protect:signature', 'visible', !!parseInt(item.cmpEl.attr('data-value')), guid);// can edit settings for requested signature break; case 3: - this.api.asc_DeleteSign(guid); + this.api.asc_RemoveSignature(guid); break; } }, From 981ce99e64a51f8f722609e8d5015fdb6f51690b Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Thu, 16 Nov 2017 17:03:05 +0300 Subject: [PATCH 24/86] [DE] View signatures in the right panel. --- apps/documenteditor/main/app/view/FileMenuPanels.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/documenteditor/main/app/view/FileMenuPanels.js b/apps/documenteditor/main/app/view/FileMenuPanels.js index 5dbf4eb74..0d4d5e269 100644 --- a/apps/documenteditor/main/app/view/FileMenuPanels.js +++ b/apps/documenteditor/main/app/view/FileMenuPanels.js @@ -1220,8 +1220,8 @@ define([ }, onView: function() { - this.menu && this.menu.hide(); + DE.getController('RightMenu').rightmenu.SetActivePane(Common.Utils.documentSettingsType.Signature, true); }, updateSignatures: function(){ From ab99ce6adb07f32ffc4cbfe8c3468e01fe9e742b Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 28 Nov 2017 15:32:07 +0300 Subject: [PATCH 25/86] [DE] Disable protect settings when review mode is changed. --- .../main/lib/controller/ReviewChanges.js | 2 + .../main/app/controller/RightMenu.js | 1 - apps/documenteditor/main/app/view/FileMenu.js | 31 +++++++------ .../main/app/view/SignatureSettings.js | 43 ------------------- 4 files changed, 21 insertions(+), 56 deletions(-) diff --git a/apps/common/main/lib/controller/ReviewChanges.js b/apps/common/main/lib/controller/ReviewChanges.js index 42df2d3f3..bbd021515 100644 --- a/apps/common/main/lib/controller/ReviewChanges.js +++ b/apps/common/main/lib/controller/ReviewChanges.js @@ -534,6 +534,8 @@ define([ if (comments) comments.setPreviewMode(disable); + leftMenu.getMenu('file').miProtect.setDisabled(disable); + if (this.view) { this.view.$el.find('.no-group-mask').css('opacity', 1); } diff --git a/apps/documenteditor/main/app/controller/RightMenu.js b/apps/documenteditor/main/app/controller/RightMenu.js index 006e88424..864364079 100644 --- a/apps/documenteditor/main/app/controller/RightMenu.js +++ b/apps/documenteditor/main/app/controller/RightMenu.js @@ -357,7 +357,6 @@ define([ this.rightmenu.chartSettings.disableControls(disabled); if (!allowSignature && this.rightmenu.signatureSettings) { - this.rightmenu.signatureSettings.disableControls(disabled); this.rightmenu.btnSignature.setDisabled(disabled); } diff --git a/apps/documenteditor/main/app/view/FileMenu.js b/apps/documenteditor/main/app/view/FileMenu.js index ae01b716f..19fa85f47 100644 --- a/apps/documenteditor/main/app/view/FileMenu.js +++ b/apps/documenteditor/main/app/view/FileMenu.js @@ -126,6 +126,13 @@ define([ canFocused: false }); + this.miProtect = new Common.UI.MenuItem({ + el : $('#fm-btn-protect',this.el), + action : 'protect', + caption : this.btnProtectCaption, + canFocused: false + }); + this.miRecent = new Common.UI.MenuItem({ el : $('#fm-btn-recent',this.el), action : 'recent', @@ -168,12 +175,7 @@ define([ this.miSaveAs, this.miPrint, this.miRename, - new Common.UI.MenuItem({ - el : $('#fm-btn-protect',this.el), - action : 'protect', - caption : this.btnProtectCaption, - canFocused: false - }), + this.miProtect, this.miRecent, this.miNew, new Common.UI.MenuItem({ @@ -221,10 +223,11 @@ define([ show: function(panel, opts) { if (this.isVisible() && panel===undefined) return; + var defPanel = (this.mode.canDownload && (!this.mode.isDesktopApp || !this.mode.isOffline)) ? 'saveas' : 'info'; if (!panel) - panel = this.active || ((this.mode.canDownload && (!this.mode.isDesktopApp || !this.mode.isOffline)) ? 'saveas' : 'info'); + panel = this.active || defPanel; this.$el.show(); - this.selectMenu(panel, opts); + this.selectMenu(panel, opts, defPanel); this.api.asc_enableKeyEvents(false); this.fireEvent('menu:show', [this]); @@ -240,8 +243,8 @@ define([ applyMode: function() { this.miPrint[this.mode.canPrint?'show':'hide'](); this.miRename[(this.mode.canRename && !this.mode.isDesktopApp) ?'show':'hide'](); - this.items[7][(this.mode.isEdit && this.mode.isDesktopApp && this.mode.isOffline) ?'show':'hide'](); - this.items[7].$el.find('+.devider')[!this.mode.isDisconnected?'show':'hide'](); + this.miProtect[(this.mode.isEdit && this.mode.isDesktopApp && this.mode.isOffline) ?'show':'hide'](); + this.miProtect.$el.find('+.devider')[!this.mode.isDisconnected?'show':'hide'](); this.miRecent[this.mode.canOpenRecent?'show':'hide'](); this.miNew[this.mode.canCreateNew?'show':'hide'](); this.miNew.$el.find('+.devider')[this.mode.canCreateNew?'show':'hide'](); @@ -318,10 +321,14 @@ define([ this.document = data.doc; }, - selectMenu: function(menu, opts) { + selectMenu: function(menu, opts, defMenu) { if ( menu ) { - var item = this._getMenuItem(menu), + var item = this._getMenuItem(menu), panel = this.panels[menu]; + if ( item.isDisabled() ) { + item = this._getMenuItem(defMenu); + panel = this.panels[defMenu]; + } if ( item && panel ) { $('.fm-btn',this.el).removeClass('active'); item.$el.addClass('active'); diff --git a/apps/documenteditor/main/app/view/SignatureSettings.js b/apps/documenteditor/main/app/view/SignatureSettings.js index a5064f017..b1456e142 100644 --- a/apps/documenteditor/main/app/view/SignatureSettings.js +++ b/apps/documenteditor/main/app/view/SignatureSettings.js @@ -67,8 +67,6 @@ define([ var me = this; this._state = { - DisabledControls: false, - DisabledInsertControls: false, requestedSignatures: undefined, validSignatures: undefined, invalidSignatures: undefined, @@ -76,37 +74,6 @@ define([ ready: false }; this._locked = false; - this._noApply = false; - this._originalProps = null; - - this.templateRequested = _.template([ - '', - '', - '', - '<% _.each(signatures, function(item) { %>', - '', - '', - '', - '', - '<% }); %>', - '
    ', - '' - ].join('')); - - this.templateValid = _.template([ - '', - '', - '', - '<% _.each(signatures, function(item) { %>', - '', - '', - '', - '', - '', - '<% }); %>', - '
    <%= Common.Utils.String.htmlEncode(item.name) %>
    ', - '' - ].join('')); this.render(); }, @@ -186,22 +153,12 @@ define([ ChangeSettings: function(props) { if (!this._state.requestedSignatures || !this._state.validSignatures || !this._state.invalidSignatures) this.updateSignatures(this.api.asc_getSignatures(), this.api.asc_getRequestSignatures()); - - this.disableControls(this._locked); }, setLocked: function (locked) { this._locked = locked; }, - disableControls: function(disable) { - if (this._state.DisabledControls!==disable) { - this._state.DisabledControls = disable; - this.$linksSign && this.$linksSign.toggleClass('disabled', disable); - this.$linksView && this.$linksView.toggleClass('disabled', disable); - } - }, - setMode: function(mode) { this.mode = mode; }, From 259d8852d934abbf8edb5f7eb2365efec02a5235 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 17 Nov 2017 10:39:23 +0300 Subject: [PATCH 26/86] [DE] Change registering for signature update event. --- apps/documenteditor/main/app/controller/RightMenu.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/apps/documenteditor/main/app/controller/RightMenu.js b/apps/documenteditor/main/app/controller/RightMenu.js index 864364079..0019a658e 100644 --- a/apps/documenteditor/main/app/controller/RightMenu.js +++ b/apps/documenteditor/main/app/controller/RightMenu.js @@ -84,6 +84,7 @@ define([ setApi: function(api) { this.api = api; + this.api.asc_registerCallback('asc_onUpdateSignatures', _.bind(this.onApiUpdateSignatures, this)); this.api.asc_registerCallback('asc_onCoAuthoringDisconnect',_.bind(this.onCoAuthoringDisconnect, this)); Common.NotificationCenter.on('api:disconnect', _.bind(this.onCoAuthoringDisconnect, this)); }, @@ -270,11 +271,6 @@ define([ this.rightmenu.mergeSettings.setDocumentName(this.getApplication().getController('Viewport').getView('Common.Views.Header').getDocumentCaption()); this.api.asc_registerCallback('asc_onStartMailMerge', _.bind(this.onStartMailMerge, this)); } - - if (this.rightmenu.signatureSettings) { - this.api.asc_registerCallback('asc_onUpdateSignatures', _.bind(this.onApiUpdateSignatures, this)); - } - this.api.asc_registerCallback('asc_onError', _.bind(this.onError, this)); } @@ -334,6 +330,8 @@ define([ }, onApiUpdateSignatures: function(valid, requested){ + if (!this.rightmenu.signatureSettings) return; + var disabled = (!valid || valid.length<1) && (!requested || requested.length<1), type = Common.Utils.documentSettingsType.Signature; this._settings[type].hidden = disabled ? 1 : 0; From 9fcd4314dd54311bcd761add374fbe28dadde56e Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 17 Nov 2017 11:02:29 +0300 Subject: [PATCH 27/86] [DE] Refactoring sing dialog. --- apps/common/main/lib/view/SignDialog.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/apps/common/main/lib/view/SignDialog.js b/apps/common/main/lib/view/SignDialog.js index c44c3bd1e..cc298bc78 100644 --- a/apps/common/main/lib/view/SignDialog.js +++ b/apps/common/main/lib/view/SignDialog.js @@ -248,8 +248,11 @@ define([ },500); }, - hide: function() { - Common.UI.Window.prototype.hide.apply(this, arguments); + close: function() { + this.api.asc_unregisterCallback('on_signature_defaultcertificate_ret', this.binding.certificateChanged); + this.api.asc_unregisterCallback('on_signature_selectsertificate_ret', this.binding.certificateChanged); + + Common.UI.Window.prototype.close.apply(this, arguments); if (this.signObject) this.signObject.destroy(); @@ -257,10 +260,11 @@ define([ afterRender: function () { if (this.api) { - this.api.asc_unregisterCallback('on_signature_defaultcertificate_ret', _.bind(this.onCertificateChanged, this)); - this.api.asc_registerCallback('on_signature_defaultcertificate_ret', _.bind(this.onCertificateChanged, this)); - this.api.asc_unregisterCallback('on_signature_selectsertificate_ret', _.bind(this.onCertificateChanged, this)); - this.api.asc_registerCallback('on_signature_selectsertificate_ret', _.bind(this.onCertificateChanged, this)); + this.binding = { + certificateChanged: _.bind(this.onCertificateChanged, this) + }; + this.api.asc_registerCallback('on_signature_defaultcertificate_ret', this.binding.certificateChanged); + this.api.asc_registerCallback('on_signature_selectsertificate_ret', this.binding.certificateChanged); this.api.asc_GetDefaultCertificate(); } From 046aad655997047a4577dfb31ed88b7d9900a015 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 17 Nov 2017 11:20:15 +0300 Subject: [PATCH 28/86] [Common] Color button is visible by default. --- apps/common/main/lib/component/ColorButton.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/common/main/lib/component/ColorButton.js b/apps/common/main/lib/component/ColorButton.js index 5fb4933d1..4572aa358 100644 --- a/apps/common/main/lib/component/ColorButton.js +++ b/apps/common/main/lib/component/ColorButton.js @@ -41,7 +41,8 @@ define([ Common.UI.ColorButton = Common.UI.Button.extend({ options : { hint: false, - enableToggle: false + enableToggle: false, + visible: true }, template: _.template([ From 227138f3c3aa67ed123f7055f19eb816a16648c4 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 17 Nov 2017 11:44:36 +0300 Subject: [PATCH 29/86] [DE] Request signature before sign document. --- apps/common/main/lib/controller/Protection.js | 16 ++++++++++------ .../main/app/view/DocumentHolder.js | 1 - .../main/app/view/SignatureSettings.js | 4 +--- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/apps/common/main/lib/controller/Protection.js b/apps/common/main/lib/controller/Protection.js index 002037024..8179f6c1e 100644 --- a/apps/common/main/lib/controller/Protection.js +++ b/apps/common/main/lib/controller/Protection.js @@ -90,9 +90,9 @@ define([ if (this.appConfig.isDesktopApp && this.appConfig.isOffline) { this.api.asc_registerCallback('asc_onDocumentPassword', _.bind(this.onDocumentPassword, this)); if (this.appConfig.canProtect) { - this.api.asc_registerCallback('asc_onSignatureClick', _.bind(this.onApiSignatureClick, this)); - Common.NotificationCenter.on('protect:sign', _.bind(this.onApiSignatureClick, this)); - Common.NotificationCenter.on('protect:signature', _.bind(this.onSignatureClick, this)); + Common.NotificationCenter.on('protect:sign', _.bind(this.onSignatureRequest, this)); + Common.NotificationCenter.on('protect:signature', _.bind(this.onSignatureClick, this)); + this.api.asc_registerCallback('asc_onSignatureClick', _.bind(this.onSignatureSign, this)); this.api.asc_registerCallback('asc_onUpdateSignatures', _.bind(this.onApiUpdateSignatures, this)); } } @@ -127,9 +127,13 @@ define([ Common.NotificationCenter.trigger('edit:complete', this.view); }, + onSignatureRequest: function(guid){ + this.api.asc_RequestSign(guid); + }, + onSignatureClick: function(type, signed, guid){ switch (type) { - case 'invisible': this.addInvisibleSignature(); break; + case 'invisible': this.onSignatureRequest('invisibleAdd'); break; case 'visible': this.addVisibleSignature(signed, guid); break; } }, @@ -242,8 +246,8 @@ define([ win.show(); }, - onApiSignatureClick: function(guid, width, height) { - this.signVisibleSignature(guid, width, height); + onSignatureSign: function(guid, width, height, isVisible) { + (isVisible) ? this.signVisibleSignature(guid, width, height) : this.addInvisibleSignature(); }, onApiUpdateSignatures: function(valid, requested){ diff --git a/apps/documenteditor/main/app/view/DocumentHolder.js b/apps/documenteditor/main/app/view/DocumentHolder.js index 9133b1b37..f4c2ea216 100644 --- a/apps/documenteditor/main/app/view/DocumentHolder.js +++ b/apps/documenteditor/main/app/view/DocumentHolder.js @@ -49,7 +49,6 @@ define([ 'common/main/lib/component/Menu', 'common/main/lib/view/InsertTableDialog', 'common/main/lib/view/CopyWarningDialog', - 'common/main/lib/view/SignDialog', 'documenteditor/main/app/view/DropcapSettingsAdvanced', 'documenteditor/main/app/view/HyperlinkSettingsDialog', 'documenteditor/main/app/view/ParagraphSettingsAdvanced', diff --git a/apps/documenteditor/main/app/view/SignatureSettings.js b/apps/documenteditor/main/app/view/SignatureSettings.js index b1456e142..ad0aba026 100644 --- a/apps/documenteditor/main/app/view/SignatureSettings.js +++ b/apps/documenteditor/main/app/view/SignatureSettings.js @@ -43,9 +43,7 @@ define([ 'jquery', 'underscore', 'backbone', - 'common/main/lib/component/Button', - 'common/main/lib/view/SignDialog', - 'common/main/lib/view/SignSettingsDialog' + 'common/main/lib/component/Button' ], function (menuTemplate, $, _, Backbone) { 'use strict'; From e53e185f36c08c0b9bfbca43b63cfc2888535138 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 17 Nov 2017 12:08:40 +0300 Subject: [PATCH 30/86] [Common] Sign dialog: don't sign when certificate in undefined. --- apps/common/main/lib/view/SignDialog.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/apps/common/main/lib/view/SignDialog.js b/apps/common/main/lib/view/SignDialog.js index cc298bc78..8ea486e68 100644 --- a/apps/common/main/lib/view/SignDialog.js +++ b/apps/common/main/lib/view/SignDialog.js @@ -104,7 +104,7 @@ define([ '' + '', '', - '
    ', + '', '' ].join('')) }); @@ -102,10 +99,9 @@ define([ enableKeyEvents: false, itemTemplate: _.template([ '
    ', - '
    ', - '
    <%= Common.Utils.String.htmlEncode(name) %>
    ', - '
    <%= Common.Utils.String.htmlEncode(date) %>
    ', - '
    ', + '
    ', + '
    <%= Common.Utils.String.htmlEncode(name) %>
    ', + '
    <%= Common.Utils.String.htmlEncode(date) %>
    ', '
    ' ].join('')) }); @@ -115,10 +111,9 @@ define([ enableKeyEvents: false, itemTemplate: _.template([ '
    ', - '
    ', - '
    <%= Common.Utils.String.htmlEncode(name) %>
    ', - '
    <%= Common.Utils.String.htmlEncode(date) %>
    ', - '
    ', + '
    ', + '
    <%= Common.Utils.String.htmlEncode(name) %>
    ', + '
    <%= Common.Utils.String.htmlEncode(date) %>
    ', '' ].join('')) }); @@ -178,12 +173,12 @@ define([ me._state.requestedSignatures.push({name: item.asc_getSigner1(), guid: item.asc_getGuid(), requested: true}); }); _.each(valid, function(item, index){ - var sign = {name: item.asc_getSigner1(), guid: item.asc_getId(), date: '18/05/2017'}; + var sign = {name: item.asc_getSigner1(), guid: item.asc_getId(), date: '18/05/2017', invisible: !item.asc_getVisible()}; (item.asc_getValid()==0) ? me._state.validSignatures.push(sign) : me._state.invalidSignatures.push(sign); }); // me._state.requestedSignatures = [{name: 'Hammish Mitchell', guid: '123', requested: true}, {name: 'Someone Somewhere', guid: '123', requested: true}, {name: 'Mary White', guid: '123', requested: true}, {name: 'John Black', guid: '123', requested: true}]; - // me._state.validSignatures = [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]; + // me._state.validSignatures = [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017', invisible: true}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]; // me._state.invalidSignatures = [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}]; this.viewRequestedList.store.reset(me._state.requestedSignatures); @@ -240,6 +235,7 @@ define([ signed = (this._state.validSignatures.length>0 || this._state.invalidSignatures.length>0); menu.items[0].setVisible(requested); menu.items[1].setVisible(!requested); + menu.items[2].setVisible(requested || !record.get('invisible')); menu.items[3].setVisible(!requested); menu.items[0].setDisabled(this._locked); menu.items[3].setDisabled(this._locked); From b612b7b9b53d7c52bc66fd6d733f9e8a04ddd034 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 28 Nov 2017 15:39:36 +0300 Subject: [PATCH 33/86] [PE] Added Protection tab. Changed signature settings in the right and left menu. --- apps/presentationeditor/main/app.js | 2 + .../main/app/controller/LeftMenu.js | 23 +- .../main/app/controller/Main.js | 3 + .../main/app/controller/RightMenu.js | 16 +- .../main/app/controller/Toolbar.js | 9 + .../app/template/SignatureSettings.template | 22 +- .../main/app/view/DocumentHolder.js | 1 - .../main/app/view/FileMenu.js | 34 ++- .../main/app/view/FileMenuPanels.js | 139 ++++++++--- .../main/app/view/SignatureSettings.js | 226 +++++++++++------- .../main/app/view/Toolbar.js | 3 +- apps/presentationeditor/main/app_dev.js | 2 + apps/presentationeditor/main/locale/en.json | 49 +++- .../main/resources/less/leftmenu.less | 47 ++-- .../main/resources/less/rightmenu.less | 52 +++- 15 files changed, 411 insertions(+), 217 deletions(-) diff --git a/apps/presentationeditor/main/app.js b/apps/presentationeditor/main/app.js index 682961b67..49e47f0ce 100644 --- a/apps/presentationeditor/main/app.js +++ b/apps/presentationeditor/main/app.js @@ -155,6 +155,7 @@ require([ /** coauthoring end **/ ,'Common.Controllers.Plugins' ,'Common.Controllers.ExternalDiagramEditor' + ,'Common.Controllers.Protection' ] }); @@ -186,6 +187,7 @@ require([ 'common/main/lib/controller/Plugins', 'presentationeditor/main/app/view/ChartSettings', 'common/main/lib/controller/ExternalDiagramEditor' + ,'common/main/lib/controller/Protection' ], function() { app.start(); }); diff --git a/apps/presentationeditor/main/app/controller/LeftMenu.js b/apps/presentationeditor/main/app/controller/LeftMenu.js index 2edbc567b..70185b0b5 100644 --- a/apps/presentationeditor/main/app/controller/LeftMenu.js +++ b/apps/presentationeditor/main/app/controller/LeftMenu.js @@ -43,7 +43,6 @@ define([ 'core', 'common/main/lib/util/Shortcuts', - 'common/main/lib/view/SignDialog', 'presentationeditor/main/app/view/LeftMenu', 'presentationeditor/main/app/view/FileMenu' ], function () { @@ -84,8 +83,7 @@ define([ 'saveas:format': _.bind(this.clickSaveAsFormat, this), 'settings:apply': _.bind(this.applySettings, this), 'create:new': _.bind(this.onCreateNew, this), - 'recent:open': _.bind(this.onOpenRecent, this), - 'signature:invisible': _.bind(this.addInvisibleSign, this) + 'recent:open': _.bind(this.onOpenRecent, this) }, 'Toolbar': { 'file:settings': _.bind(this.clickToolbarSettings,this), @@ -547,25 +545,6 @@ define([ } }, - addInvisibleSign: function(menu) { - var me = this, - win = new Common.Views.SignDialog({ - api: me.api, - signType: 'invisible', - handler: function(dlg, result) { - if (result == 'ok') { - var props = dlg.getSettings(); - me.api.asc_Sign(props.certificateId); - } - Common.NotificationCenter.trigger('edit:complete', me); - } - }); - - win.show(); - - menu.hide(); - }, - textNoTextFound : 'Text not found', newDocumentTitle : 'Unnamed document', requestEditRightsText : 'Requesting editing rights...' diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js index 62093fd07..1db8d850f 100644 --- a/apps/presentationeditor/main/app/controller/Main.js +++ b/apps/presentationeditor/main/app/controller/Main.js @@ -860,6 +860,9 @@ define([ rightmenuController && rightmenuController.setApi(me.api); + if (me.appOptions.isDesktopApp && me.appOptions.isOffline) + application.getController('Common.Controllers.Protection').setMode(me.appOptions).setConfig({config: me.editorConfig}, me.api); + var viewport = this.getApplication().getController('Viewport').getView('Viewport'); viewport.applyEditorMode(); diff --git a/apps/presentationeditor/main/app/controller/RightMenu.js b/apps/presentationeditor/main/app/controller/RightMenu.js index 1a9a0b599..c65425414 100644 --- a/apps/presentationeditor/main/app/controller/RightMenu.js +++ b/apps/presentationeditor/main/app/controller/RightMenu.js @@ -79,11 +79,12 @@ define([ this._settings[Common.Utils.documentSettingsType.Shape] = {panelId: "id-shape-settings", panel: rightMenu.shapeSettings, btn: rightMenu.btnShape, hidden: 1, locked: false}; this._settings[Common.Utils.documentSettingsType.TextArt] = {panelId: "id-textart-settings", panel: rightMenu.textartSettings, btn: rightMenu.btnTextArt, hidden: 1, locked: false}; this._settings[Common.Utils.documentSettingsType.Chart] = {panelId: "id-chart-settings", panel: rightMenu.chartSettings, btn: rightMenu.btnChart, hidden: 1, locked: false}; - this._settings[Common.Utils.documentSettingsType.Signature] = {panelId: "id-signature-settings", panel: rightMenu.signatureSettings, btn: rightMenu.btnSignature, hidden: (rightMenu.signatureSettings) ? 0 : 1, props: {}, locked: false}; + this._settings[Common.Utils.documentSettingsType.Signature] = {panelId: "id-signature-settings", panel: rightMenu.signatureSettings, btn: rightMenu.btnSignature, hidden: 1, props: {}, locked: false}; }, setApi: function(api) { this.api = api; + this.api.asc_registerCallback('asc_onUpdateSignatures', _.bind(this.onApiUpdateSignatures, this)); this.api.asc_registerCallback('asc_onCountPages', _.bind(this.onApiCountPages, this)); this.api.asc_registerCallback('asc_onCoAuthoringDisconnect',_.bind(this.onCoAuthoringDisconnect, this)); Common.NotificationCenter.on('api:disconnect', _.bind(this.onCoAuthoringDisconnect, this)); @@ -222,7 +223,6 @@ define([ this.rightmenu.chartSettings.disableControls(disabled); if (!allowSignature && this.rightmenu.signatureSettings) { - this.rightmenu.signatureSettings.disableControls(disabled); this.rightmenu.btnSignature.setDisabled(disabled); } @@ -289,6 +289,8 @@ define([ this.onFocusObject(selectedElements, !Common.localStorage.getBool("pe-hide-right-settings")); } } + //remove after sdk send event + // this.onApiUpdateSignatures([{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]); }, onDoubleClickOnObject: function(obj) { @@ -305,6 +307,16 @@ define([ } }, + onApiUpdateSignatures: function(valid){ + if (!this.rightmenu.signatureSettings) return; + + var disabled = (!valid || valid.length<1), + type = Common.Utils.documentSettingsType.Signature; + this._settings[type].hidden = disabled ? 1 : 0; + this._settings[type].btn.setDisabled(disabled); + this._settings[type].panel.setLocked(this._settings[type].locked); + }, + onApiCountPages: function(count) { if (this._state.no_slides !== (count<=0) && this.editMode) { this._state.no_slides = (count<=0); diff --git a/apps/presentationeditor/main/app/controller/Toolbar.js b/apps/presentationeditor/main/app/controller/Toolbar.js index cb5a20bfb..96c767fd0 100644 --- a/apps/presentationeditor/main/app/controller/Toolbar.js +++ b/apps/presentationeditor/main/app/controller/Toolbar.js @@ -2079,6 +2079,15 @@ define([ } me.toolbar.render(_.extend({compactview: compactview}, config)); + + if ( config.isEdit ) { + if (config.isDesktopApp && config.isOffline) { + var tab = {action: 'protect', caption: me.toolbar.textTabProtect}; + var $panel = me.getApplication().getController('Common.Controllers.Protection').createToolbarPanel(); + if ( $panel ) + me.toolbar.addTab(tab, $panel, 3); + } + } }, onAppReady: function (config) { diff --git a/apps/presentationeditor/main/app/template/SignatureSettings.template b/apps/presentationeditor/main/app/template/SignatureSettings.template index b5b986dc7..8f0461e4f 100644 --- a/apps/presentationeditor/main/app/template/SignatureSettings.template +++ b/apps/presentationeditor/main/app/template/SignatureSettings.template @@ -6,14 +6,26 @@ - +
    - - + + + + - - + + +
    + + + + + + + + +
    \ No newline at end of file diff --git a/apps/presentationeditor/main/app/view/DocumentHolder.js b/apps/presentationeditor/main/app/view/DocumentHolder.js index f83972591..3e8b7fa97 100644 --- a/apps/presentationeditor/main/app/view/DocumentHolder.js +++ b/apps/presentationeditor/main/app/view/DocumentHolder.js @@ -38,7 +38,6 @@ define([ 'common/main/lib/util/utils', 'common/main/lib/component/Menu', 'common/main/lib/view/CopyWarningDialog', - 'common/main/lib/view/SignDialog', 'presentationeditor/main/app/view/HyperlinkSettingsDialog', // 'common/main/lib/view/InsertTableDialog', 'presentationeditor/main/app/view/ParagraphSettingsAdvanced', diff --git a/apps/presentationeditor/main/app/view/FileMenu.js b/apps/presentationeditor/main/app/view/FileMenu.js index d8c9fd30c..6d88796be 100644 --- a/apps/presentationeditor/main/app/view/FileMenu.js +++ b/apps/presentationeditor/main/app/view/FileMenu.js @@ -129,6 +129,13 @@ define([ canFocused: false }); + this.miProtect = new Common.UI.MenuItem({ + el : $('#fm-btn-protect',this.el), + action : 'protect', + caption : this.btnProtectCaption, + canFocused: false + }); + this.miRecent = new Common.UI.MenuItem({ el : $('#fm-btn-recent',this.el), action : 'recent', @@ -164,12 +171,7 @@ define([ this.miSaveAs, this.miPrint, this.miRename, - new Common.UI.MenuItem({ - el : $('#fm-btn-protect',this.el), - action : 'protect', - caption : this.btnProtectCaption, - canFocused: false - }), + this.miProtect, this.miRecent, this.miNew, new Common.UI.MenuItem({ @@ -216,10 +218,12 @@ define([ show: function(panel) { if (this.isVisible() && panel===undefined) return; + var defPanel = (this.mode.canDownload && (!this.mode.isDesktopApp || !this.mode.isOffline)) ? 'saveas' : 'info'; if (!panel) - panel = this.active || ((this.mode.canDownload && (!this.mode.isDesktopApp || !this.mode.isOffline)) ? 'saveas' : 'info'); + panel = this.active || defPanel; this.$el.show(); - this.selectMenu(panel); + this.selectMenu(panel, defPanel); + this.api.asc_enableKeyEvents(false); this.fireEvent('menu:show', [this]); @@ -234,8 +238,8 @@ define([ applyMode: function() { this.miPrint[this.mode.canPrint?'show':'hide'](); this.miRename[(this.mode.canRename && !this.mode.isDesktopApp) ?'show':'hide'](); - this.items[7][(this.mode.canProtect) ?'show':'hide'](); - this.items[7].$el.find('+.devider')[!this.mode.isDisconnected?'show':'hide'](); + this.miProtect[(this.mode.isEdit && this.mode.isDesktopApp && this.mode.isOffline) ?'show':'hide'](); + this.miProtect.$el.find('+.devider')[!this.mode.isDisconnected?'show':'hide'](); this.miRecent[this.mode.canOpenRecent?'show':'hide'](); this.miNew[this.mode.canCreateNew?'show':'hide'](); this.miNew.$el.find('+.devider')[this.mode.canCreateNew?'show':'hide'](); @@ -271,7 +275,7 @@ define([ } } - if (this.mode.canProtect) { + if (this.mode.isDesktopApp && this.mode.isOffline) { this.$el.find('#fm-btn-create, #fm-btn-back, #fm-btn-create+.devider').hide(); this.panels['protect'] = (new PE.Views.FileMenuPanels.ProtectDoc({menu:this})).render(); this.panels['protect'].setMode(this.mode); @@ -305,10 +309,14 @@ define([ this.document = data.doc; }, - selectMenu: function(menu) { + selectMenu: function(menu, defMenu) { if ( menu ) { - var item = this._getMenuItem(menu), + var item = this._getMenuItem(menu), panel = this.panels[menu]; + if ( item.isDisabled() ) { + item = this._getMenuItem(defMenu); + panel = this.panels[defMenu]; + } if ( item && panel ) { $('.fm-btn',this.el).removeClass('active'); item.$el.addClass('active'); diff --git a/apps/presentationeditor/main/app/view/FileMenuPanels.js b/apps/presentationeditor/main/app/view/FileMenuPanels.js index 5ece4139a..33e8dae36 100644 --- a/apps/presentationeditor/main/app/view/FileMenuPanels.js +++ b/apps/presentationeditor/main/app/view/FileMenuPanels.js @@ -872,10 +872,25 @@ define([ menu: undefined, template: _.template([ - '', - '', - '
    ', - '
    ' + '', + '
    ', + '', + '
    ', + '', + '', + '', + '', + '', + '', + '', + '', + '
    <%= scope.txtEncrypted %>
    ', + '
    ', + '
    ', + '', + '
    ', + '
    ', + '
    ' ].join('')), initialize: function(options) { @@ -883,15 +898,16 @@ define([ this.menu = options.menu; - this.templateValid = _.template([ - '', - '', - '<% _.each(signatures, function(item) { %>', - '', - '', - '', - '', - '<% }); %>', + var me = this; + this.templateSignature = _.template([ + '
    <%= Common.Utils.String.htmlEncode(item.name) %><%= Common.Utils.String.htmlEncode(item.date) %>
    ', + '', + '', + '', + '', + '', + '', + '', '
    <%= tipText %>
    ' ].join('')); }, @@ -899,16 +915,28 @@ define([ render: function() { $(this.el).html(this.template({scope: this})); - this.btnAddInvisibleSign = new Common.UI.Button({ - el: '#fms-btn-invisible-sign' - }); - this.btnAddInvisibleSign.on('click', _.bind(this.addInvisibleSign, this)); + var protection = PE.getController('Common.Controllers.Protection').getView(); - this.lblSignHeader = $('#id-fms-lbl-sign-header', this.$el); + this.btnAddPwd = protection.getButton('add-password'); + this.btnAddPwd.render(this.$el.find('#fms-btn-add-pwd')); + this.btnAddPwd.on('click', _.bind(this.closeMenu, this)); - this.cntValidSign = $('#id-fms-valid-sign'); - this.cntInvalidSign = $('#id-fms-invalid-sign'); + this.btnChangePwd = protection.getButton('change-password'); + this.btnChangePwd.render(this.$el.find('#fms-btn-change-pwd')); + this.btnChangePwd.on('click', _.bind(this.closeMenu, this)); + this.btnDeletePwd = protection.getButton('del-password'); + this.btnDeletePwd.render(this.$el.find('#fms-btn-delete-pwd')); + this.btnDeletePwd.on('click', _.bind(this.closeMenu, this)); + + this.cntPassword = $('#id-fms-view-pwd'); + + this.btnAddInvisibleSign = protection.getButton('signature'); + this.btnAddInvisibleSign.render(this.$el.find('#fms-btn-invisible-sign')); + this.btnAddInvisibleSign.on('click', _.bind(this.closeMenu, this)); + + this.cntSignature = $('#id-fms-signature'); + this.cntSignatureView = $('#id-fms-signature-view'); if (_.isUndefined(this.scroller)) { this.scroller = new Common.UI.Scroller({ el: $(this.el), @@ -916,20 +944,21 @@ define([ }); } + this.$el.on('click', '.signature-edit-link', _.bind(this.onEdit, this)); + this.$el.on('click', '.signature-view-link', _.bind(this.onView, this)); + return this; }, show: function() { Common.UI.BaseView.prototype.show.call(this,arguments); this.updateSignatures(); + this.updateEncrypt(); }, setMode: function(mode) { this.mode = mode; - if (!this.mode.isEdit) { - this.btnAddInvisibleSign.setVisible(false); - this.lblSignHeader.html(this.strSignature); - } + this.cntSignature.toggleClass('hidden', !this.mode.canProtect); }, setApi: function(o) { @@ -937,34 +966,66 @@ define([ return this; }, - addInvisibleSign: function() { - if (this.menu) - this.menu.fireEvent('signature:invisible', [this.menu]); + closeMenu: function() { + this.menu && this.menu.hide(); + }, + + onEdit: function() { + this.menu && this.menu.hide(); + + var me = this; + Common.UI.warning({ + title: this.notcriticalErrorTitle, + msg: this.txtEditWarning, + buttons: ['ok', 'cancel'], + primary: 'ok', + callback: function(btn) { + if (btn == 'ok') { + me.api.asc_RemoveAllSignatures(); + } + } + }); + + }, + + onView: function() { + this.menu && this.menu.hide(); + PE.getController('RightMenu').rightmenu.SetActivePane(Common.Utils.documentSettingsType.Signature, true); }, updateSignatures: function(){ var valid = this.api.asc_getSignatures(), - valid_arr = [], invalid_arr = []; + hasValid = false, + hasInvalid = false; _.each(valid, function(item, index){ - var sign = {name: item.asc_getSigner1(), date: '18/05/2017'}; - (item.asc_getValid()==0) ? valid_arr.push(sign) : invalid_arr.push(sign); + if (item.asc_getValid()==0) + hasValid = true; + else + hasInvalid = true; }); - // valid_arr = [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]; - // invalid_arr = [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}]; + // hasValid = true; + // hasInvalid = true; - this.cntValidSign.html(this.templateValid({signatures: valid_arr, header: this.strValid})); - this.cntInvalidSign.html(this.templateValid({signatures: invalid_arr, header: this.strInvalid})); + var tipText = (hasInvalid) ? this.txtSignedInvalid : (hasValid ? this.txtSigned : ""); + this.cntSignatureView.html(this.templateSignature({tipText: tipText, hasSigned: (hasValid || hasInvalid)})); + }, - this.btnAddInvisibleSign.setDisabled(valid_arr.length>0 || invalid_arr.length>0); + updateEncrypt: function() { + this.cntPassword.toggleClass('hidden', this.btnAddPwd.isVisible()); }, strProtect: 'Protect Document', - strInvisibleSign: 'Add invisible digital signature', - strValid: 'Valid signatures', - strInvalid: 'Invalid signatures', - strSignature: 'Signature' + strSignature: 'Signature', + txtView: 'View signatures', + txtEdit: 'Edit document', + txtSigned: 'Valid signatures has been added to the document. The document is protected from editing.', + txtSignedInvalid: 'Some of the digital signatures in document are invalid or could not be verified. The document is protected from editing.', + notcriticalErrorTitle: 'Warning', + txtEditWarning: 'Editing will remove the signatures from the document.
    Are you sure you want to continue?', + strEncrypt: 'Password', + txtEncrypted: 'This document has been protected by password' }, PE.Views.FileMenuPanels.ProtectDoc || {})); diff --git a/apps/presentationeditor/main/app/view/SignatureSettings.js b/apps/presentationeditor/main/app/view/SignatureSettings.js index ca732edca..03057fd2d 100644 --- a/apps/presentationeditor/main/app/view/SignatureSettings.js +++ b/apps/presentationeditor/main/app/view/SignatureSettings.js @@ -43,8 +43,7 @@ define([ 'jquery', 'underscore', 'backbone', - 'common/main/lib/component/Button', - 'common/main/lib/view/SignDialog' + 'common/main/lib/component/Button' ], function (menuTemplate, $, _, Backbone) { 'use strict'; @@ -63,36 +62,14 @@ define([ }, initialize: function () { - var me = this; - this._state = { - DisabledControls: false, - DisabledInsertControls: false, + requestedSignatures: undefined, validSignatures: undefined, invalidSignatures: undefined, DisabledEditing: false, ready: false }; this._locked = false; - this.lockedControls = []; - - this._noApply = false; - this._originalProps = null; - - this.templateValid = _.template([ - '', - '', - '', - '<% _.each(signatures, function(item) { %>', - '', - '', - '', - '', - '', - '<% }); %>', - '
    <%= Common.Utils.String.htmlEncode(item.name) %>
    ', - '' - ].join('')); this.render(); }, @@ -102,16 +79,45 @@ define([ scope: this })); - this.btnAddInvisibleSign = new Common.UI.Button({ - el: this.$el.find('#signature-invisible-sign') + var protection = PE.getController('Common.Controllers.Protection').getView(); + this.btnAddInvisibleSign = protection.getButton('signature'); + this.btnAddInvisibleSign.render(this.$el.find('#signature-invisible-sign')); + + this.viewValidList = new Common.UI.DataView({ + el: $('#signature-valid-sign'), + enableKeyEvents: false, + itemTemplate: _.template([ + '
    ', + '
    ', + '
    <%= Common.Utils.String.htmlEncode(name) %>
    ', + '
    <%= Common.Utils.String.htmlEncode(date) %>
    ', + '
    ' + ].join('')) }); - this.btnAddInvisibleSign.on('click', _.bind(this.addInvisibleSign, this)); - this.lockedControls.push(this.btnAddInvisibleSign); - this.cntValidSign = $('#signature-valid-sign'); - this.cntInvalidSign = $('#signature-invalid-sign'); + this.viewInvalidList = new Common.UI.DataView({ + el: $('#signature-invalid-sign'), + enableKeyEvents: false, + itemTemplate: _.template([ + '
    ', + '
    ', + '
    <%= Common.Utils.String.htmlEncode(name) %>
    ', + '
    <%= Common.Utils.String.htmlEncode(date) %>
    ', + '
    ' + ].join('')) + }); - this.$el.on('click', '.signature-view-link', _.bind(this.onViewSignature, this)); + this.viewValidList.on('item:click', _.bind(this.onSelectSignature, this)); + this.viewInvalidList.on('item:click', _.bind(this.onSelectSignature, this)); + + this.signatureMenu = new Common.UI.Menu({ + menuAlign : 'tr-br', + items: [ + { caption: this.strDetails,value: 1 }, + { caption: this.strDelete, value: 3 } + ] + }); + this.signatureMenu.on('item:click', _.bind(this.onMenuSignatureClick, this)); }, setApi: function(api) { @@ -126,31 +132,12 @@ define([ ChangeSettings: function(props) { if (!this._state.validSignatures || !this._state.invalidSignatures) this.updateSignatures(this.api.asc_getSignatures()); - - this.disableControls(this._locked); }, setLocked: function (locked) { this._locked = locked; }, - disableControls: function(disable) { - if (this._state.DisabledControls!==disable) { - this._state.DisabledControls = disable; - this.$linksView && this.$linksView.toggleClass('disabled', disable); - } - this.disableInsertControls(disable); - }, - - disableInsertControls: function(disable) { - if (this._state.DisabledInsertControls!==disable) { - this._state.DisabledInsertControls = disable; - _.each(this.lockedControls, function(item) { - item.setDisabled(disable); - }); - } - }, - setMode: function(mode) { this.mode = mode; }, @@ -159,7 +146,7 @@ define([ if (!this._state.ready) return; this.updateSignatures(valid); - this.showSignatureTooltip(this._state.validSignatures.length>0 || this._state.invalidSignatures.length>0); + this.showSignatureTooltip(this._state.validSignatures.length>0, this._state.invalidSignatures.length>0); }, updateSignatures: function(valid){ @@ -172,67 +159,119 @@ define([ (item.asc_getValid()==0) ? me._state.validSignatures.push(sign) : me._state.invalidSignatures.push(sign); }); - // me._state.validSignatures = [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]; + // me._state.validSignatures = [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017', invisible: true}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]; // me._state.invalidSignatures = [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}]; - this.cntValidSign.html(this.templateValid({signatures: me._state.validSignatures, header: this.strValid})); - this.cntInvalidSign.html(this.templateValid({signatures: me._state.invalidSignatures, header: this.strInvalid})); + this.viewValidList.store.reset(me._state.validSignatures); + this.viewInvalidList.store.reset(me._state.invalidSignatures); - this.$linksView = $('.signature-view-link', this.$el); - var width = this.$linksView.width(); - $('.signature-sign-name', this.cntValidSign).css('max-width', 170-width); - $('.signature-sign-name', this.cntInvalidSign).css('max-width', 170-width); + this.$el.find('.valid').toggleClass('hidden', me._state.validSignatures.length<1); + this.$el.find('.invalid').toggleClass('hidden', me._state.invalidSignatures.length<1); me.disableEditing(me._state.validSignatures.length>0 || me._state.invalidSignatures.length>0); }, - addInvisibleSign: function(btn) { - var me = this, - win = new Common.Views.SignDialog({ - api: me.api, - signType: 'invisible', - handler: function(dlg, result) { - if (result == 'ok') { - var props = dlg.getSettings(); - me.api.asc_Sign(props.certificateId); - } - me.fireEvent('editcomplete', me); - } - }); + onSelectSignature: function(picker, item, record, e){ + if (!record) return; - win.show(); + var btn = $(e.target); + if (btn && btn.hasClass('caret')) { + var menu = this.signatureMenu; + if (menu.isVisible()) { + menu.hide(); + return; + } + + var showPoint, me = this, + currentTarget = $(e.currentTarget), + parent = $(this.el), + offset = currentTarget.offset(), + offsetParent = parent.offset(); + + showPoint = [offset.left - offsetParent.left + currentTarget.width(), offset.top - offsetParent.top + currentTarget.height()/2]; + + var menuContainer = parent.find('#menu-signature-container'); + if (!menu.rendered) { + if (menuContainer.length < 1) { + menuContainer = $('', menu.id); + parent.append(menuContainer); + } + menu.render(menuContainer); + menu.cmpEl.attr({tabindex: "-1"}); + + menu.on({ + 'show:after': function(cmp) { + if (cmp && cmp.menuAlignEl) + cmp.menuAlignEl.toggleClass('over', true); + }, + 'hide:after': function(cmp) { + if (cmp && cmp.menuAlignEl) + cmp.menuAlignEl.toggleClass('over', false); + } + }); + } + menu.items[1].setDisabled(this._locked); + menu.cmpEl.attr('data-value', record.get('guid')); + + menuContainer.css({left: showPoint[0], top: showPoint[1]}); + + menu.menuAlignEl = currentTarget; + menu.setOffset(-20, -currentTarget.height()/2 + 3); + menu.show(); + _.delay(function() { + menu.cmpEl.focus(); + }, 10); + e.stopPropagation(); + e.preventDefault(); + } }, - onViewSignature: function(event) { - var target = $(event.currentTarget); - if (target.hasClass('disabled')) return; - - this.api.asc_ViewCertificate(target.attr('data-value')); + onMenuSignatureClick: function(menu, item) { + var guid = menu.cmpEl.attr('data-value'); + switch (item.value) { + case 1: + this.api.asc_ViewCertificate(guid); + break; + case 3: + this.api.asc_RemoveSignature(guid); + break; + } }, onDocumentReady: function() { this._state.ready = true; - this.updateSignatures(this.api.asc_getSignatures()); - this.showSignatureTooltip(this._state.validSignatures.length>0 || this._state.invalidSignatures.length>0); + this.updateSignatures(this.api.asc_getSignatures(), this.api.asc_getRequestSignatures()); + this.showSignatureTooltip(this._state.validSignatures.length>0, this._state.invalidSignatures.length>0); }, - showSignatureTooltip: function(hasSigned) { - if (!hasSigned) return; + showSignatureTooltip: function(hasValid, hasInvalid) { + if (!hasValid && !hasInvalid) return; + + var tipText = (hasInvalid) ? this.txtSignedInvalid : (hasValid ? this.txtSigned : ""); var me = this, tip = new Common.UI.SynchronizeTip({ target : PE.getController('RightMenu').getView('RightMenu').btnSignature.btnEl, - text : this.txtSignedDocument, - showLink: hasSigned, + text : tipText, + showLink: hasValid || hasInvalid, textLink: this.txtContinueEditing, placement: 'left' }); tip.on({ 'dontshowclick': function() { - tip.close(); - // me.api.editSingedDoc(); - // me.disableEditing(false); // call in the asc_onUpdateSignatures event callback.me.disableEditing(false); + Common.UI.warning({ + title: me.notcriticalErrorTitle, + msg: me.txtEditWarning, + buttons: ['ok', 'cancel'], + primary: 'ok', + callback: function(btn) { + if (btn == 'ok') { + tip.close(); + me.api.asc_RemoveAllSignatures(); + } + } + }); }, 'closeclick': function() { tip.close(); @@ -259,18 +298,19 @@ define([ var comments = PE.getController('Common.Controllers.Comments'); if (comments) comments.setPreviewMode(disable); - - this.disableInsertControls(disable); } }, strSignature: 'Signature', - strInvisibleSign: 'Add invisible digital signature', strValid: 'Valid signatures', strInvalid: 'Invalid signatures', - strView: 'View', - txtSignedDocument: 'This document has been signed. It should not be edited.', - txtContinueEditing: 'Edit anyway' + strDetails: 'Signature Details', + txtSigned: 'Valid signatures has been added to the document. The document is protected from editing.', + txtSignedInvalid: 'Some of the digital signatures in document are invalid or could not be verified. The document is protected from editing.', + txtContinueEditing: 'Edit anyway', + notcriticalErrorTitle: 'Warning', + txtEditWarning: 'Editing will remove the signatures from the document.
    Are you sure you want to continue?', + strDelete: 'Remove Signature' }, PE.Views.SignatureSettings || {})); }); \ No newline at end of file diff --git a/apps/presentationeditor/main/app/view/Toolbar.js b/apps/presentationeditor/main/app/view/Toolbar.js index e376a6345..d2c80229a 100644 --- a/apps/presentationeditor/main/app/view/Toolbar.js +++ b/apps/presentationeditor/main/app/view/Toolbar.js @@ -1855,7 +1855,8 @@ define([ textTabHome: 'Home', textTabInsert: 'Insert', textSurface: 'Surface', - textShowPresenterView: 'Show presenter view' + textShowPresenterView: 'Show presenter view', + textTabProtect: 'Protection' } }()), PE.Views.Toolbar || {})); }); \ No newline at end of file diff --git a/apps/presentationeditor/main/app_dev.js b/apps/presentationeditor/main/app_dev.js index eef9aa9c7..bcff3a631 100644 --- a/apps/presentationeditor/main/app_dev.js +++ b/apps/presentationeditor/main/app_dev.js @@ -146,6 +146,7 @@ require([ /** coauthoring end **/ ,'Common.Controllers.Plugins' ,'Common.Controllers.ExternalDiagramEditor' + ,'Common.Controllers.Protection' ] }); @@ -177,6 +178,7 @@ require([ 'common/main/lib/controller/Plugins', 'presentationeditor/main/app/view/ChartSettings', 'common/main/lib/controller/ExternalDiagramEditor' + ,'common/main/lib/controller/Protection' ], function() { window.compareVersions = true; app.start(); diff --git a/apps/presentationeditor/main/locale/en.json b/apps/presentationeditor/main/locale/en.json index 72032e2bf..a60ba825f 100644 --- a/apps/presentationeditor/main/locale/en.json +++ b/apps/presentationeditor/main/locale/en.json @@ -116,12 +116,29 @@ "Common.Views.OpenDialog.txtPassword": "Password", "Common.Views.OpenDialog.txtTitle": "Choose %1 options", "Common.Views.OpenDialog.txtTitleProtected": "Protected File", + "Common.Views.PasswordDialog.cancelButtonText": "Cancel", + "Common.Views.PasswordDialog.okButtonText": "OK", + "Common.Views.PasswordDialog.txtPassword": "Password", + "Common.Views.PasswordDialog.txtTitle": "Set Password", + "Common.Views.PasswordDialog.txtDescription": "A Password is required to open this document", + "Common.Views.PasswordDialog.txtRepeat": "Repeat password", + "Common.Views.PasswordDialog.txtIncorrectPwd": "Confirmation password is not identical", "Common.Views.PluginDlg.textLoading": "Loading", "Common.Views.Plugins.groupCaption": "Plugins", "Common.Views.Plugins.strPlugins": "Plugins", "Common.Views.Plugins.textLoading": "Loading", "Common.Views.Plugins.textStart": "Start", "Common.Views.Plugins.textStop": "Stop", + "Common.Views.Protection.txtAddPwd": "Add password", + "Common.Views.Protection.txtEncrypt": "Encrypt", + "Common.Views.Protection.txtSignature": "Signature", + "Common.Views.Protection.hintAddPwd": "Encrypt with password", + "Common.Views.Protection.hintPwd": "Change or delete password", + "Common.Views.Protection.hintSignature": "Add digital signature or signature line", + "Common.Views.Protection.txtChangePwd": "Change password", + "Common.Views.Protection.txtDeletePwd": "Delete password", + "Common.Views.Protection.txtInvisibleSignature": "Add digital signature", + "Common.Views.Protection.txtSignatureLine": "Signature line", "Common.Views.RenameDialog.cancelButtonText": "Cancel", "Common.Views.RenameDialog.okButtonText": "Ok", "Common.Views.RenameDialog.textName": "File name", @@ -857,6 +874,16 @@ "PE.Views.FileMenuPanels.DocumentInfo.txtTitle": "Presentation Title", "PE.Views.FileMenuPanels.DocumentRights.txtBtnAccessRights": "Change access rights", "PE.Views.FileMenuPanels.DocumentRights.txtRights": "Persons who have rights", + "PE.Views.FileMenuPanels.ProtectDoc.strProtect": "Protect Document", + "PE.Views.FileMenuPanels.ProtectDoc.strSignature": "Signature", + "PE.Views.FileMenuPanels.ProtectDoc.txtView": "View signatures", + "PE.Views.FileMenuPanels.ProtectDoc.txtEdit": "Edit document", + "PE.Views.FileMenuPanels.ProtectDoc.txtSigned": "Valid signatures has been added to the document. The document is protected from editing.", + "PE.Views.FileMenuPanels.ProtectDoc.txtSignedInvalid": "Some of the digital signatures in document are invalid or could not be verified. The document is protected from editing.", + "PE.Views.FileMenuPanels.ProtectDoc.notcriticalErrorTitle": "Warning", + "PE.Views.FileMenuPanels.ProtectDoc.txtEditWarning": "Editing will remove the signatures from the document.
    Are you sure you want to continue?", + "PE.Views.FileMenuPanels.ProtectDoc.strEncrypt": "Password", + "PE.Views.FileMenuPanels.ProtectDoc.txtEncrypted": "This document has been protected by password", "PE.Views.FileMenuPanels.Settings.okButtonText": "Apply", "PE.Views.FileMenuPanels.Settings.strAlignGuides": "Turn on alignment guides", "PE.Views.FileMenuPanels.Settings.strAutoRecover": "Turn on autorecover", @@ -892,11 +919,6 @@ "PE.Views.FileMenuPanels.Settings.txtLast": "View Last", "PE.Views.FileMenuPanels.Settings.txtPt": "Point", "PE.Views.FileMenuPanels.Settings.txtSpellCheck": "Spell Checking", - "PE.Views.FileMenuPanels.ProtectDoc.strProtect": "Protect Document", - "PE.Views.FileMenuPanels.ProtectDoc.strInvisibleSign": "Add invisible digital signature", - "PE.Views.FileMenuPanels.ProtectDoc.strValid": "Valid signatures", - "PE.Views.FileMenuPanels.ProtectDoc.strInvalid": "Invalid signatures", - "PE.Views.FileMenuPanels.ProtectDoc.strSignature": "Signature", "PE.Views.HyperlinkSettingsDialog.cancelButtonText": "Cancel", "PE.Views.HyperlinkSettingsDialog.okButtonText": "OK", "PE.Views.HyperlinkSettingsDialog.strDisplay": "Display", @@ -1039,11 +1061,6 @@ "PE.Views.ShapeSettings.txtNoBorders": "No Line", "PE.Views.ShapeSettings.txtPapyrus": "Papyrus", "PE.Views.ShapeSettings.txtWood": "Wood", - "PE.Views.SignatureSettings.strSignature": "Signature", - "PE.Views.SignatureSettings.strInvisibleSign": "Add invisible digital signature", - "PE.Views.SignatureSettings.strValid": "Valid signatures", - "PE.Views.SignatureSettings.strInvalid": "Invalid signatures", - "PE.Views.SignatureSettings.strView": "View", "PE.Views.ShapeSettingsAdvanced.cancelButtonText": "Cancel", "PE.Views.ShapeSettingsAdvanced.okButtonText": "OK", "PE.Views.ShapeSettingsAdvanced.strColumns": "Columns", @@ -1078,6 +1095,17 @@ "PE.Views.ShapeSettingsAdvanced.textWeightArrows": "Weights & Arrows", "PE.Views.ShapeSettingsAdvanced.textWidth": "Width", "PE.Views.ShapeSettingsAdvanced.txtNone": "None", + "PE.Views.SignatureSettings.strSignature": "Signature", + "PE.Views.SignatureSettings.strValid": "Valid signatures", + "PE.Views.SignatureSettings.strInvalid": "Invalid signatures", + "PE.Views.SignatureSettings.strSign": "Sign", + "PE.Views.SignatureSettings.strDetails": "Signature Details", + "PE.Views.SignatureSettings.strDelete": "Remove Signature", + "PE.Views.SignatureSettings.txtSigned": "Valid signatures has been added to the document. The document is protected from editing.", + "PE.Views.SignatureSettings.txtSignedInvalid": "Some of the digital signatures in document are invalid or could not be verified. The document is protected from editing.", + "PE.Views.SignatureSettings.txtContinueEditing": "Edit anyway", + "PE.Views.SignatureSettings.notcriticalErrorTitle": "Warning", + "PE.Views.SignatureSettings.txtEditWarning": "Editing will remove the signatures from the document.
    Are you sure you want to continue?", "PE.Views.SlideSettings.strBackground": "Background color", "PE.Views.SlideSettings.strColor": "Color", "PE.Views.SlideSettings.strDelay": "Delay", @@ -1352,6 +1380,7 @@ "PE.Views.Toolbar.textTabFile": "File", "PE.Views.Toolbar.textTabHome": "Home", "PE.Views.Toolbar.textTabInsert": "Insert", + "PE.Views.Toolbar.textTabProtect": "Protection", "PE.Views.Toolbar.textTitleError": "Error", "PE.Views.Toolbar.textUnderline": "Underline", "PE.Views.Toolbar.textZoom": "Zoom", diff --git a/apps/presentationeditor/main/resources/less/leftmenu.less b/apps/presentationeditor/main/resources/less/leftmenu.less index 92711e3a2..fd3b60426 100644 --- a/apps/presentationeditor/main/resources/less/leftmenu.less +++ b/apps/presentationeditor/main/resources/less/leftmenu.less @@ -451,6 +451,25 @@ font: 12px tahoma, arial, verdana, sans-serif; } } + + #panel-protect { + label, span { + font-size: 12px; + } + + padding: 30px 30px; + + .header { + font-weight: bold; + margin: 30px 0 10px; + } + + table { + td { + padding: 5px 0; + } + } + } } } @@ -468,32 +487,4 @@ -webkit-transform: rotate(180deg); -o-transform: rotate(180deg); transform: rotate(180deg); -} - -#panel-protect { - #file-menu-panel & { - padding: 30px 30px; - } - - - button { - display: block; - width: auto; - margin-top: 20px; - } - - label { - font: 12px tahoma, arial, verdana, sans-serif; - } - - .header { - font-weight: bold; - margin: 30px 0 10px; - } - - table { - td { - padding: 5px 5px; - } - } } \ No newline at end of file diff --git a/apps/presentationeditor/main/resources/less/rightmenu.less b/apps/presentationeditor/main/resources/less/rightmenu.less index f48935637..e70ca5ebc 100644 --- a/apps/presentationeditor/main/resources/less/rightmenu.less +++ b/apps/presentationeditor/main/resources/less/rightmenu.less @@ -206,8 +206,54 @@ button:active:not(.disabled) .btn-change-shape {background-position: -56px - background-position: -100px -150px; } -.signature-sign-name { +#signature-requested-sign, +#signature-valid-sign, +#signature-invalid-sign { + height: 100%; overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; + margin: 0 -10px 0 -15px; + + .item { + display: block; + border: none; + width: 100%; + .box-shadow(none); + margin: 0; + + &:hover, + &.over { + background-color: @secondary; + } + } + + .signature-item { + padding: 5px 2px 5px 15px; + text-overflow: ellipsis; + + .name { + width: 100%; + white-space: nowrap; + overflow: hidden; + cursor: pointer; + max-width: 160px; + text-overflow: ellipsis; + } + + .caret { + width: 23px; + height: 14px; + border: 0; + background-position: -43px -150px; + margin: 8px 15px; + display: inline-block; + position: absolute; + right: 0; + } + + &.requested { + .caret { + margin: 0 15px; + } + } + } } \ No newline at end of file From 4f9f366631d68a143516c7ee9b847e73e2d6d49a Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 28 Nov 2017 15:48:24 +0300 Subject: [PATCH 34/86] [SSE] Added Protection tab. Changed signature settings in the right and left menu. --- apps/spreadsheeteditor/main/app.js | 2 + .../main/app/controller/DocumentHolder.js | 33 -- .../main/app/controller/LeftMenu.js | 41 +-- .../main/app/controller/Main.js | 3 + .../main/app/controller/RightMenu.js | 17 +- .../app/template/SignatureSettings.template | 38 +- .../main/app/view/FileMenu.js | 34 +- .../main/app/view/FileMenuPanels.js | 173 +++++---- .../main/app/view/SignatureSettings.js | 335 +++++++++--------- .../main/app/view/Toolbar.js | 4 +- apps/spreadsheeteditor/main/app_dev.js | 2 + apps/spreadsheeteditor/main/locale/en.json | 44 ++- .../main/resources/less/leftmenu.less | 47 +-- .../main/resources/less/rightmenu.less | 52 ++- 14 files changed, 446 insertions(+), 379 deletions(-) diff --git a/apps/spreadsheeteditor/main/app.js b/apps/spreadsheeteditor/main/app.js index da07862ec..d4960e083 100644 --- a/apps/spreadsheeteditor/main/app.js +++ b/apps/spreadsheeteditor/main/app.js @@ -159,6 +159,7 @@ require([ 'Common.Controllers.Chat', 'Common.Controllers.Comments', 'Common.Controllers.Plugins' + ,'Common.Controllers.Protection' ] }); @@ -187,6 +188,7 @@ require([ 'common/main/lib/controller/Comments', 'common/main/lib/controller/Chat', 'common/main/lib/controller/Plugins' + ,'common/main/lib/controller/Protection' ], function() { app.start(); }); diff --git a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js index 01b009f37..db8e16580 100644 --- a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js +++ b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js @@ -44,7 +44,6 @@ define([ 'core', 'common/main/lib/util/utils', 'common/main/lib/view/CopyWarningDialog', - 'common/main/lib/view/SignDialog', 'spreadsheeteditor/main/app/view/DocumentHolder', 'spreadsheeteditor/main/app/view/HyperlinkSettingsDialog', 'spreadsheeteditor/main/app/view/ParagraphSettingsAdvanced', @@ -269,7 +268,6 @@ define([ this.api.asc_registerCallback('asc_onShowSpecialPasteOptions', _.bind(this.onShowSpecialPasteOptions, this)); this.api.asc_registerCallback('asc_onHideSpecialPasteOptions', _.bind(this.onHideSpecialPasteOptions, this)); } - this.api.asc_registerCallback('asc_onSignatureClick', _.bind(this.onSignatureClick, this)); return this; }, @@ -2440,37 +2438,6 @@ define([ _conf && view.paraBulletsPicker.selectRecord(_conf.rec, true); }, - onSignatureClick: function(guid, width, height) { - var me = this; - if (_.isUndefined(me.fontStore)) { - me.fontStore = new Common.Collections.Fonts(); - var fonts = SSE.getController('Toolbar').getView('Toolbar').cmbFontName.store.toJSON(); - var arr = []; - _.each(fonts, function(font, index){ - if (!font.cloneid) { - arr.push(_.clone(font)); - } - }); - me.fontStore.add(arr); - } - - var win = new Common.Views.SignDialog({ - api: me.api, - signType: 'visible', - fontStore: me.fontStore, - signSize: {width: width, height: height}, - handler: function(dlg, result) { - if (result == 'ok') { - var props = dlg.getSettings(); - me.api.asc_Sign(props.certificateId, guid, props.images[0], props.images[1]); - } - Common.NotificationCenter.trigger('edit:complete', me.documentHolder); - } - }); - - win.show(); - }, - SetDisabled: function(state) { this._isDisabled = state; }, diff --git a/apps/spreadsheeteditor/main/app/controller/LeftMenu.js b/apps/spreadsheeteditor/main/app/controller/LeftMenu.js index 2401b5cfa..8019f8848 100644 --- a/apps/spreadsheeteditor/main/app/controller/LeftMenu.js +++ b/apps/spreadsheeteditor/main/app/controller/LeftMenu.js @@ -33,8 +33,6 @@ define([ 'core', 'common/main/lib/util/Shortcuts', - 'common/main/lib/view/SignSettingsDialog', - 'common/main/lib/view/SignDialog', 'spreadsheeteditor/main/app/view/LeftMenu', 'spreadsheeteditor/main/app/view/FileMenu' ], function () { @@ -75,9 +73,7 @@ define([ 'saveas:format': _.bind(this.clickSaveAsFormat, this), 'settings:apply': _.bind(this.applySettings, this), 'create:new': _.bind(this.onCreateNew, this), - 'recent:open': _.bind(this.onOpenRecent, this), - 'signature:visible': _.bind(this.addVisibleSign, this), - 'signature:invisible': _.bind(this.addInvisibleSign, this) + 'recent:open': _.bind(this.onOpenRecent, this) }, 'Toolbar': { 'file:settings': _.bind(this.clickToolbarSettings,this), @@ -768,41 +764,6 @@ define([ } }, - addVisibleSign: function(menu) { - var me = this, - win = new Common.Views.SignSettingsDialog({ - handler: function(dlg, result) { - if (result == 'ok') { - me.api.asc_AddSignatureLine2(dlg.getSettings()); - } - Common.NotificationCenter.trigger('edit:complete', me); - } - }); - - win.show(); - - menu.hide(); - }, - - addInvisibleSign: function(menu) { - var me = this, - win = new Common.Views.SignDialog({ - api: me.api, - signType: 'invisible', - handler: function(dlg, result) { - if (result == 'ok') { - var props = dlg.getSettings(); - me.api.asc_Sign(props.certificateId); - } - Common.NotificationCenter.trigger('edit:complete', me); - } - }); - - win.show(); - - menu.hide(); - }, - textNoTextFound : 'Text not found', newDocumentTitle : 'Unnamed document', textItemEntireCell : 'Entire cell contents', diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index 5a304170c..1e3b2146a 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -927,6 +927,9 @@ define([ rightmenuController && rightmenuController.setApi(me.api); + if (me.appOptions.isDesktopApp && me.appOptions.isOffline) + application.getController('Common.Controllers.Protection').setMode(me.appOptions).setConfig({config: me.editorConfig}, me.api); + if (statusbarController) { statusbarController.getView('Statusbar').changeViewMode(true); } diff --git a/apps/spreadsheeteditor/main/app/controller/RightMenu.js b/apps/spreadsheeteditor/main/app/controller/RightMenu.js index 0a0ea5b8e..743acb127 100644 --- a/apps/spreadsheeteditor/main/app/controller/RightMenu.js +++ b/apps/spreadsheeteditor/main/app/controller/RightMenu.js @@ -85,11 +85,12 @@ define([ this._settings[Common.Utils.documentSettingsType.TextArt] = {panelId: "id-textart-settings", panel: rightMenu.textartSettings, btn: rightMenu.btnTextArt, hidden: 1, locked: false}; this._settings[Common.Utils.documentSettingsType.Chart] = {panelId: "id-chart-settings", panel: rightMenu.chartSettings, btn: rightMenu.btnChart, hidden: 1, locked: false}; this._settings[Common.Utils.documentSettingsType.Table] = {panelId: "id-table-settings", panel: rightMenu.tableSettings, btn: rightMenu.btnTable, hidden: 1, locked: false}; - this._settings[Common.Utils.documentSettingsType.Signature] = {panelId: "id-signature-settings", panel: rightMenu.signatureSettings, btn: rightMenu.btnSignature, hidden: (rightMenu.signatureSettings) ? 0 : 1, props: {}, locked: false}; + this._settings[Common.Utils.documentSettingsType.Signature] = {panelId: "id-signature-settings", panel: rightMenu.signatureSettings, btn: rightMenu.btnSignature, hidden: 1, props: {}, locked: false}; }, setApi: function(api) { this.api = api; + this.api.asc_registerCallback('asc_onUpdateSignatures', _.bind(this.onApiUpdateSignatures, this)); this.api.asc_registerCallback('asc_onCoAuthoringDisconnect',_.bind(this.onCoAuthoringDisconnect, this)); Common.NotificationCenter.on('api:disconnect', _.bind(this.onCoAuthoringDisconnect, this)); Common.NotificationCenter.on('cells:range', _.bind(this.onCellsRange, this)); @@ -290,6 +291,9 @@ define([ this.rightmenu.shapeSettings.createDelayedElements(); this.onSelectionChanged(this.api.asc_getCellInfo()); } + + //remove after sdk send event + // this.onApiUpdateSignatures([{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]); }, onDoubleClickOnObject: function(obj) { @@ -324,6 +328,16 @@ define([ } }, + onApiUpdateSignatures: function(valid, requested){ + if (!this.rightmenu.signatureSettings) return; + + var disabled = (!valid || valid.length<1) && (!requested || requested.length<1), + type = Common.Utils.documentSettingsType.Signature; + this._settings[type].hidden = disabled ? 1 : 0; + this._settings[type].btn.setDisabled(disabled); + this._settings[type].panel.setLocked(this._settings[type].locked); + }, + SetDisabled: function(disabled, allowSignature) { this.setMode({isEdit: !disabled}); if (this.rightmenu) { @@ -334,7 +348,6 @@ define([ this.rightmenu.tableSettings.disableControls(disabled); if (!allowSignature && this.rightmenu.signatureSettings) { - this.rightmenu.signatureSettings.disableControls(disabled); this.rightmenu.btnSignature.setDisabled(disabled); } diff --git a/apps/spreadsheeteditor/main/app/template/SignatureSettings.template b/apps/spreadsheeteditor/main/app/template/SignatureSettings.template index 5a4fa0157..c4ee01174 100644 --- a/apps/spreadsheeteditor/main/app/template/SignatureSettings.template +++ b/apps/spreadsheeteditor/main/app/template/SignatureSettings.template @@ -4,24 +4,38 @@ - - - - - - +
    - - + + + + - - + + +
    + - - + + + + + + + +
    + + + + + + + + +
    \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/app/view/FileMenu.js b/apps/spreadsheeteditor/main/app/view/FileMenu.js index 674408d44..b0ab91eff 100644 --- a/apps/spreadsheeteditor/main/app/view/FileMenu.js +++ b/apps/spreadsheeteditor/main/app/view/FileMenu.js @@ -116,6 +116,13 @@ define([ canFocused: false }); + this.miProtect = new Common.UI.MenuItem({ + el : $('#fm-btn-protect',this.el), + action : 'protect', + caption : this.btnProtectCaption, + canFocused: false + }); + this.miRecent = new Common.UI.MenuItem({ el : $('#fm-btn-recent',this.el), action : 'recent', @@ -158,12 +165,7 @@ define([ this.miSaveAs, this.miPrint, this.miRename, - new Common.UI.MenuItem({ - el : $('#fm-btn-protect',this.el), - action : 'protect', - caption : this.btnProtectCaption, - canFocused: false - }), + this.miProtect, this.miRecent, this.miNew, new Common.UI.MenuItem({ @@ -205,10 +207,12 @@ define([ show: function(panel) { if (this.isVisible() && panel===undefined) return; + var defPanel = (this.mode.canDownload && (!this.mode.isDesktopApp || !this.mode.isOffline)) ? 'saveas' : 'info'; if (!panel) - panel = this.active || ((this.mode.canDownload && (!this.mode.isDesktopApp || !this.mode.isOffline)) ? 'saveas' : 'info'); + panel = this.active || defPanel; this.$el.show(); - this.selectMenu(panel); + this.selectMenu(panel, defPanel); + this.api.asc_enableKeyEvents(false); this.fireEvent('menu:show', [this]); @@ -223,8 +227,8 @@ define([ applyMode: function() { this.miPrint[this.mode.canPrint?'show':'hide'](); this.miRename[(this.mode.canRename && !this.mode.isDesktopApp) ?'show':'hide'](); - this.items[7][(this.mode.canProtect) ?'show':'hide'](); - this.items[7].$el.find('+.devider')[!this.mode.isDisconnected?'show':'hide'](); + this.miProtect[(this.mode.isEdit && this.mode.isDesktopApp && this.mode.isOffline) ?'show':'hide'](); + this.miProtect.$el.find('+.devider')[!this.mode.isDisconnected?'show':'hide'](); this.miRecent[this.mode.canOpenRecent?'show':'hide'](); this.miNew[this.mode.canCreateNew?'show':'hide'](); this.miNew.$el.find('+.devider')[this.mode.canCreateNew?'show':'hide'](); @@ -262,7 +266,7 @@ define([ } } - if (this.mode.canProtect) { + if (this.mode.isDesktopApp && this.mode.isOffline) { this.panels['protect'] = (new SSE.Views.FileMenuPanels.ProtectDoc({menu:this})).render(); this.panels['protect'].setMode(this.mode); } @@ -296,10 +300,14 @@ define([ this.document = data.doc; }, - selectMenu: function(menu) { + selectMenu: function(menu, defMenu) { if ( menu ) { - var item = this._getMenuItem(menu), + var item = this._getMenuItem(menu), panel = this.panels[menu]; + if ( item.isDisabled() ) { + item = this._getMenuItem(defMenu); + panel = this.panels[defMenu]; + } if ( item && panel ) { $('.fm-btn',this.el).removeClass('active'); item.$el.addClass('active'); diff --git a/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js b/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js index c2ce55f42..8d0b8265e 100644 --- a/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js +++ b/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js @@ -1339,12 +1339,25 @@ define([ menu: undefined, template: _.template([ - '', - '', - '', - '
    ', - '
    ', - '
    ' + '', + '
    ', + '', + '
    ', + '', + '', + '', + '', + '', + '', + '', + '', + '
    <%= scope.txtEncrypted %>
    ', + '
    ', + '
    ', + '', + '
    ', + '
    ', + '
    ' ].join('')), initialize: function(options) { @@ -1352,26 +1365,16 @@ define([ this.menu = options.menu; - this.templateRequested = _.template([ - '', - '', - '<% _.each(signatures, function(item) { %>', - '', - '', - '', - '<% }); %>', - '
    <%= Common.Utils.String.htmlEncode(item) %>
    ' - ].join('')); - - this.templateValid = _.template([ - '', - '', - '<% _.each(signatures, function(item) { %>', - '', - '', - '', - '', - '<% }); %>', + var me = this; + this.templateSignature = _.template([ + '
    <%= Common.Utils.String.htmlEncode(item.name) %><%= Common.Utils.String.htmlEncode(item.date) %>
    ', + '', + '', + '', + '', + '', + '', + '', '
    <%= tipText %>
    ' ].join('')); }, @@ -1379,22 +1382,28 @@ define([ render: function() { $(this.el).html(this.template({scope: this})); - this.btnAddInvisibleSign = new Common.UI.Button({ - el: '#fms-btn-invisible-sign' - }); - this.btnAddInvisibleSign.on('click', _.bind(this.addInvisibleSign, this)); + var protection = SSE.getController('Common.Controllers.Protection').getView(); - this.btnAddVisibleSign = new Common.UI.Button({ - el: '#fms-btn-visible-sign' - }); - this.btnAddVisibleSign.on('click', _.bind(this.addVisibleSign, this)); + this.btnAddPwd = protection.getButton('add-password'); + this.btnAddPwd.render(this.$el.find('#fms-btn-add-pwd')); + this.btnAddPwd.on('click', _.bind(this.closeMenu, this)); - this.lblSignHeader = $('#id-fms-lbl-sign-header', this.$el); + this.btnChangePwd = protection.getButton('change-password'); + this.btnChangePwd.render(this.$el.find('#fms-btn-change-pwd')); + this.btnChangePwd.on('click', _.bind(this.closeMenu, this)); - this.cntRequestedSign = $('#id-fms-requested-sign'); - this.cntValidSign = $('#id-fms-valid-sign'); - this.cntInvalidSign = $('#id-fms-invalid-sign'); + this.btnDeletePwd = protection.getButton('del-password'); + this.btnDeletePwd.render(this.$el.find('#fms-btn-delete-pwd')); + this.btnDeletePwd.on('click', _.bind(this.closeMenu, this)); + this.cntPassword = $('#id-fms-view-pwd'); + + this.btnAddInvisibleSign = protection.getButton('signature'); + this.btnAddInvisibleSign.render(this.$el.find('#fms-btn-invisible-sign')); + this.btnAddInvisibleSign.on('click', _.bind(this.closeMenu, this)); + + this.cntSignature = $('#id-fms-signature'); + this.cntSignatureView = $('#id-fms-signature-view'); if (_.isUndefined(this.scroller)) { this.scroller = new Common.UI.Scroller({ el: $(this.el), @@ -1402,21 +1411,21 @@ define([ }); } + this.$el.on('click', '.signature-edit-link', _.bind(this.onEdit, this)); + this.$el.on('click', '.signature-view-link', _.bind(this.onView, this)); + return this; }, show: function() { Common.UI.BaseView.prototype.show.call(this,arguments); this.updateSignatures(); + this.updateEncrypt(); }, setMode: function(mode) { this.mode = mode; - if (!this.mode.isEdit) { - this.btnAddInvisibleSign.setVisible(false); - this.btnAddVisibleSign.setVisible(false); - this.lblSignHeader.html(this.strSignature); - } + this.cntSignature.toggleClass('hidden', !this.mode.canProtect); }, setApi: function(o) { @@ -1424,49 +1433,73 @@ define([ return this; }, - addInvisibleSign: function() { - if (this.menu) - this.menu.fireEvent('signature:invisible', [this.menu]); + closeMenu: function() { + this.menu && this.menu.hide(); }, - addVisibleSign: function() { - if (this.menu) - this.menu.fireEvent('signature:visible', [this.menu]); + onEdit: function() { + this.menu && this.menu.hide(); + + var me = this; + Common.UI.warning({ + title: this.notcriticalErrorTitle, + msg: this.txtEditWarning, + buttons: ['ok', 'cancel'], + primary: 'ok', + callback: function(btn) { + if (btn == 'ok') { + me.api.asc_RemoveAllSignatures(); + } + } + }); + + }, + + onView: function() { + this.menu && this.menu.hide(); + SSE.getController('RightMenu').rightmenu.SetActivePane(Common.Utils.documentSettingsType.Signature, true); }, updateSignatures: function(){ var requested = this.api.asc_getRequestSignatures(), - requested_arr = [], valid = this.api.asc_getSignatures(), - valid_arr = [], invalid_arr = []; + hasRequested = requested && requested.length>0, + hasValid = false, + hasInvalid = false; - _.each(requested, function(item, index){ - requested_arr.push(item.asc_getSigner1()); - }); _.each(valid, function(item, index){ - var sign = {name: item.asc_getSigner1(), date: '18/05/2017'}; - (item.asc_getValid()==0) ? valid_arr.push(sign) : invalid_arr.push(sign); + if (item.asc_getValid()==0) + hasValid = true; + else + hasInvalid = true; }); - // requested_arr = ['Hammish Mitchell', 'Someone Somewhere', 'Mary White', 'John Black']; - // valid_arr = [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]; - // invalid_arr = [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}]; + // hasRequested = true; + // hasValid = true; + // hasInvalid = true; - this.cntRequestedSign.html(this.templateRequested({signatures: requested_arr, header: this.strRequested})); - this.cntValidSign.html(this.templateValid({signatures: valid_arr, header: this.strValid})); - this.cntInvalidSign.html(this.templateValid({signatures: invalid_arr, header: this.strInvalid})); + var tipText = (hasInvalid) ? this.txtSignedInvalid : (hasValid ? this.txtSigned : ""); + if (hasRequested) + tipText = this.txtRequestedSignatures + (tipText!="" ? "

    " : "")+ tipText; - this.btnAddInvisibleSign.setDisabled(valid_arr.length>0 || invalid_arr.length>0); - this.btnAddVisibleSign.setDisabled(valid_arr.length>0 || invalid_arr.length>0); + this.cntSignatureView.html(this.templateSignature({tipText: tipText, hasSigned: (hasValid || hasInvalid), hasRequested: hasRequested})); + }, + + updateEncrypt: function() { + this.cntPassword.toggleClass('hidden', this.btnAddPwd.isVisible()); }, strProtect: 'Protect Document', - strInvisibleSign: 'Add invisible digital signature', - strVisibleSign: 'Add visible signature', - strRequested: 'Requested signatures', - strValid: 'Valid signatures', - strInvalid: 'Invalid signatures', - strSignature: 'Signature' + strSignature: 'Signature', + txtView: 'View signatures', + txtEdit: 'Edit document', + txtSigned: 'Valid signatures has been added to the document. The document is protected from editing.', + txtSignedInvalid: 'Some of the digital signatures in document are invalid or could not be verified. The document is protected from editing.', + txtRequestedSignatures: 'This document needs to be signed.', + notcriticalErrorTitle: 'Warning', + txtEditWarning: 'Editing will remove the signatures from the document.
    Are you sure you want to continue?', + strEncrypt: 'Password', + txtEncrypted: 'This document has been protected by password' }, SSE.Views.FileMenuPanels.ProtectDoc || {})); diff --git a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js index b40296ea2..ceefef983 100644 --- a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js +++ b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js @@ -43,9 +43,7 @@ define([ 'jquery', 'underscore', 'backbone', - 'common/main/lib/component/Button', - 'common/main/lib/view/SignDialog', - 'common/main/lib/view/SignSettingsDialog' + 'common/main/lib/component/Button' ], function (menuTemplate, $, _, Backbone) { 'use strict'; @@ -64,11 +62,7 @@ define([ }, initialize: function () { - var me = this; - this._state = { - DisabledControls: false, - DisabledInsertControls: false, requestedSignatures: undefined, validSignatures: undefined, invalidSignatures: undefined, @@ -76,39 +70,6 @@ define([ ready: false }; this._locked = false; - this.lockedControls = []; - - this._noApply = false; - this._originalProps = null; - - this.templateRequested = _.template([ - '', - '', - '', - '<% _.each(signatures, function(item) { %>', - '', - '', - '', - '', - '<% }); %>', - '
    ', - '' - ].join('')); - - this.templateValid = _.template([ - '', - '', - '', - '<% _.each(signatures, function(item) { %>', - '', - '', - '', - '', - '', - '<% }); %>', - '
    <%= Common.Utils.String.htmlEncode(item.name) %>
    ', - '' - ].join('')); this.render(); }, @@ -118,24 +79,59 @@ define([ scope: this })); - this.btnAddInvisibleSign = new Common.UI.Button({ - el: this.$el.find('#signature-invisible-sign') + var protection = SSE.getController('Common.Controllers.Protection').getView(); + this.btnAddInvisibleSign = protection.getButton('signature'); + this.btnAddInvisibleSign.render(this.$el.find('#signature-invisible-sign')); + + this.viewRequestedList = new Common.UI.DataView({ + el: $('#signature-requested-sign'), + enableKeyEvents: false, + itemTemplate: _.template([ + '
    ', + '
    ', + '
    <%= Common.Utils.String.htmlEncode(name) %>
    ', + '
    ' + ].join('')) }); - this.btnAddInvisibleSign.on('click', _.bind(this.addInvisibleSign, this)); - this.lockedControls.push(this.btnAddInvisibleSign); - this.btnAddVisibleSign = new Common.UI.Button({ - el: this.$el.find('#signature-visible-sign') + this.viewValidList = new Common.UI.DataView({ + el: $('#signature-valid-sign'), + enableKeyEvents: false, + itemTemplate: _.template([ + '
    ', + '
    ', + '
    <%= Common.Utils.String.htmlEncode(name) %>
    ', + '
    <%= Common.Utils.String.htmlEncode(date) %>
    ', + '
    ' + ].join('')) }); - this.btnAddVisibleSign.on('click', _.bind(this.addVisibleSign, this)); - this.lockedControls.push(this.btnAddVisibleSign); - this.cntRequestedSign = $('#signature-requested-sign'); - this.cntValidSign = $('#signature-valid-sign'); - this.cntInvalidSign = $('#signature-invalid-sign'); + this.viewInvalidList = new Common.UI.DataView({ + el: $('#signature-invalid-sign'), + enableKeyEvents: false, + itemTemplate: _.template([ + '
    ', + '
    ', + '
    <%= Common.Utils.String.htmlEncode(name) %>
    ', + '
    <%= Common.Utils.String.htmlEncode(date) %>
    ', + '
    ' + ].join('')) + }); - this.$el.on('click', '.signature-sign-link', _.bind(this.onSign, this)); - this.$el.on('click', '.signature-view-link', _.bind(this.onViewSignature, this)); + this.viewRequestedList.on('item:click', _.bind(this.onSelectSignature, this)); + this.viewValidList.on('item:click', _.bind(this.onSelectSignature, this)); + this.viewInvalidList.on('item:click', _.bind(this.onSelectSignature, this)); + + this.signatureMenu = new Common.UI.Menu({ + menuAlign : 'tr-br', + items: [ + { caption: this.strSign, value: 0 }, + { caption: this.strDetails,value: 1 }, + { caption: this.strSetup, value: 2 }, + { caption: this.strDelete, value: 3 } + ] + }); + this.signatureMenu.on('item:click', _.bind(this.onMenuSignatureClick, this)); }, setApi: function(api) { @@ -150,32 +146,12 @@ define([ ChangeSettings: function(props) { if (!this._state.requestedSignatures || !this._state.validSignatures || !this._state.invalidSignatures) this.updateSignatures(this.api.asc_getSignatures(), this.api.asc_getRequestSignatures()); - - this.disableControls(this._locked); }, setLocked: function (locked) { this._locked = locked; }, - disableControls: function(disable) { - if (this._state.DisabledControls!==disable) { - this._state.DisabledControls = disable; - this.$linksSign && this.$linksSign.toggleClass('disabled', disable); - this.$linksView && this.$linksView.toggleClass('disabled', disable); - } - this.disableInsertControls(disable); - }, - - disableInsertControls: function(disable) { - if (this._state.DisabledInsertControls!==disable) { - this._state.DisabledInsertControls = disable; - _.each(this.lockedControls, function(item) { - item.setDisabled(disable); - }); - } - }, - setMode: function(mode) { this.mode = mode; }, @@ -184,7 +160,7 @@ define([ if (!this._state.ready) return; this.updateSignatures(valid, requested); - this.showSignatureTooltip(this._state.validSignatures.length>0 || this._state.invalidSignatures.length>0); + this.showSignatureTooltip(this._state.validSignatures.length>0, this._state.invalidSignatures.length>0); }, updateSignatures: function(valid, requested){ @@ -194,127 +170,147 @@ define([ me._state.invalidSignatures = []; _.each(requested, function(item, index){ - me._state.requestedSignatures.push({name: item.asc_getSigner1(), guid: item.asc_getGuid()}); + me._state.requestedSignatures.push({name: item.asc_getSigner1(), guid: item.asc_getGuid(), requested: true}); }); _.each(valid, function(item, index){ - var sign = {name: item.asc_getSigner1(), guid: item.asc_getId(), date: '18/05/2017'}; + var sign = {name: item.asc_getSigner1(), guid: item.asc_getId(), date: '18/05/2017', invisible: !item.asc_getVisible()}; (item.asc_getValid()==0) ? me._state.validSignatures.push(sign) : me._state.invalidSignatures.push(sign); }); - // me._state.requestedSignatures = [{name: 'Hammish Mitchell', guid: '123'}, {name: 'Someone Somewhere', guid: '123'}, {name: 'Mary White', guid: '123'}, {name: 'John Black', guid: '123'}]; - // me._state.validSignatures = [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]; + // me._state.requestedSignatures = [{name: 'Hammish Mitchell', guid: '123', requested: true}, {name: 'Someone Somewhere', guid: '123', requested: true}, {name: 'Mary White', guid: '123', requested: true}, {name: 'John Black', guid: '123', requested: true}]; + // me._state.validSignatures = [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017', invisible: true}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]; // me._state.invalidSignatures = [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}]; - this.cntRequestedSign.html(this.templateRequested({signatures: me._state.requestedSignatures, header: this.strRequested})); - this.cntValidSign.html(this.templateValid({signatures: me._state.validSignatures, header: this.strValid})); - this.cntInvalidSign.html(this.templateValid({signatures: me._state.invalidSignatures, header: this.strInvalid})); + this.viewRequestedList.store.reset(me._state.requestedSignatures); + this.viewValidList.store.reset(me._state.validSignatures); + this.viewInvalidList.store.reset(me._state.invalidSignatures); - this.$linksSign = $('.signature-sign-link', this.$el); - var width = this.$linksSign.width(); - $('.signature-sign-name', this.cntRequestedSign).css('max-width', 170-width); - - this.$linksView = $('.signature-view-link', this.$el); - width = this.$linksView.width(); - $('.signature-sign-name', this.cntValidSign).css('max-width', 170-width); - $('.signature-sign-name', this.cntInvalidSign).css('max-width', 170-width); + this.$el.find('.requested').toggleClass('hidden', me._state.requestedSignatures.length<1); + this.$el.find('.valid').toggleClass('hidden', me._state.validSignatures.length<1); + this.$el.find('.invalid').toggleClass('hidden', me._state.invalidSignatures.length<1); me.disableEditing(me._state.validSignatures.length>0 || me._state.invalidSignatures.length>0); }, - addVisibleSign: function(btn) { - var me = this, - win = new Common.Views.SignSettingsDialog({ - handler: function(dlg, result) { - if (result == 'ok') { - me.api.asc_AddSignatureLine2(dlg.getSettings()); - } - me.fireEvent('editcomplete', me); + onSelectSignature: function(picker, item, record, e){ + if (!record) return; + + var btn = $(e.target); + if (btn && btn.hasClass('caret')) { + var menu = this.signatureMenu; + if (menu.isVisible()) { + menu.hide(); + return; + } + + var showPoint, me = this, + currentTarget = $(e.currentTarget), + parent = $(this.el), + offset = currentTarget.offset(), + offsetParent = parent.offset(); + + showPoint = [offset.left - offsetParent.left + currentTarget.width(), offset.top - offsetParent.top + currentTarget.height()/2]; + + var menuContainer = parent.find('#menu-signature-container'); + if (!menu.rendered) { + if (menuContainer.length < 1) { + menuContainer = $('', menu.id); + parent.append(menuContainer); } - }); + menu.render(menuContainer); + menu.cmpEl.attr({tabindex: "-1"}); - win.show(); - }, - - addInvisibleSign: function(btn) { - var me = this, - win = new Common.Views.SignDialog({ - api: me.api, - signType: 'invisible', - handler: function(dlg, result) { - if (result == 'ok') { - var props = dlg.getSettings(); - me.api.asc_Sign(props.certificateId); + menu.on({ + 'show:after': function(cmp) { + if (cmp && cmp.menuAlignEl) + cmp.menuAlignEl.toggleClass('over', true); + }, + 'hide:after': function(cmp) { + if (cmp && cmp.menuAlignEl) + cmp.menuAlignEl.toggleClass('over', false); } - me.fireEvent('editcomplete', me); - } - }); + }); + } + var requested = record.get('requested'), + signed = (this._state.validSignatures.length>0 || this._state.invalidSignatures.length>0); + menu.items[0].setVisible(requested); + menu.items[1].setVisible(!requested); + menu.items[2].setVisible(requested || !record.get('invisible')); + menu.items[3].setVisible(!requested); + menu.items[0].setDisabled(this._locked); + menu.items[3].setDisabled(this._locked); + menu.items[2].cmpEl.attr('data-value', signed ? 1 : 0); // view or edit signature settings + menu.cmpEl.attr('data-value', record.get('guid')); - win.show(); + menuContainer.css({left: showPoint[0], top: showPoint[1]}); + + menu.menuAlignEl = currentTarget; + menu.setOffset(-20, -currentTarget.height()/2 + 3); + menu.show(); + _.delay(function() { + menu.cmpEl.focus(); + }, 10); + e.stopPropagation(); + e.preventDefault(); + } else { + this.api.asc_gotoSignature(record.get('guid')); + } }, - onSign: function(event) { - var me = this, - target = $(event.currentTarget); - - if (target.hasClass('disabled')) return; - - if (_.isUndefined(me.fontStore)) { - me.fontStore = new Common.Collections.Fonts(); - var fonts = SSE.getController('Toolbar').getView('Toolbar').cmbFontName.store.toJSON(); - var arr = []; - _.each(fonts, function(font, index){ - if (!font.cloneid) { - arr.push(_.clone(font)); - } - }); - me.fontStore.add(arr); - } - - var win = new Common.Views.SignDialog({ - api: me.api, - signType: 'visible', - fontStore: me.fontStore, - handler: function(dlg, result) { - if (result == 'ok') { - var props = dlg.getSettings(); - me.api.asc_Sign(props.certificateId, target.attr('data-value'), props.images[0], props.images[1]); - } - me.fireEvent('editcomplete', me); - } - }); - win.show(); - }, - - onViewSignature: function(event) { - var target = $(event.currentTarget); - if (target.hasClass('disabled')) return; - - this.api.asc_ViewCertificate(target.attr('data-value')); + onMenuSignatureClick: function(menu, item) { + var guid = menu.cmpEl.attr('data-value'); + switch (item.value) { + case 0: + Common.NotificationCenter.trigger('protect:sign', guid); + break; + case 1: + this.api.asc_ViewCertificate(guid); + break; + case 2: + Common.NotificationCenter.trigger('protect:signature', 'visible', !!parseInt(item.cmpEl.attr('data-value')), guid);// can edit settings for requested signature + break; + case 3: + this.api.asc_RemoveSignature(guid); + break; + } }, onDocumentReady: function() { this._state.ready = true; this.updateSignatures(this.api.asc_getSignatures(), this.api.asc_getRequestSignatures()); - this.showSignatureTooltip(this._state.validSignatures.length>0 || this._state.invalidSignatures.length>0, this._state.requestedSignatures.length>0); + this.showSignatureTooltip(this._state.validSignatures.length>0, this._state.invalidSignatures.length>0, this._state.requestedSignatures.length>0); }, - showSignatureTooltip: function(hasSigned, hasRequested) { - if (!hasSigned && !hasRequested) return; + showSignatureTooltip: function(hasValid, hasInvalid, hasRequested) { + if (!hasValid && !hasInvalid && !hasRequested) return; + + var tipText = (hasInvalid) ? this.txtSignedInvalid : (hasValid ? this.txtSigned : ""); + if (hasRequested) + tipText = this.txtRequestedSignatures + "

    " + tipText; var me = this, tip = new Common.UI.SynchronizeTip({ target : SSE.getController('RightMenu').getView('RightMenu').btnSignature.btnEl, - text : (hasSigned) ? this.txtSignedDocument : this.txtRequestedSignatures, - showLink: hasSigned, + text : tipText, + showLink: hasValid || hasInvalid, textLink: this.txtContinueEditing, placement: 'left' }); tip.on({ 'dontshowclick': function() { - tip.close(); - // me.api.editSingedDoc(); - // me.disableEditing(false); // call in the asc_onUpdateSignatures event callback. + Common.UI.warning({ + title: me.notcriticalErrorTitle, + msg: me.txtEditWarning, + buttons: ['ok', 'cancel'], + primary: 'ok', + callback: function(btn) { + if (btn == 'ok') { + tip.close(); + me.api.asc_RemoveAllSignatures(); + } + } + }); }, 'closeclick': function() { tip.close(); @@ -332,31 +328,32 @@ define([ rightMenuController.rightmenu.clearSelection(); rightMenuController.SetDisabled(disable, true); SSE.getController('Toolbar').DisableToolbar(disable, disable); + SSE.getController('Statusbar').SetDisabled(disable); SSE.getController('Common.Controllers.ReviewChanges').SetDisabled(disable); SSE.getController('DocumentHolder').SetDisabled(disable); - SSE.getController('Statusbar').SetDisabled(disable); var leftMenu = SSE.getController('LeftMenu').leftMenu; leftMenu.btnComments.setDisabled(disable); var comments = SSE.getController('Common.Controllers.Comments'); if (comments) comments.setPreviewMode(disable); - - this.disableInsertControls(disable); } }, strSignature: 'Signature', - strInvisibleSign: 'Add invisible digital signature', - strVisibleSign: 'Add visible signature', strRequested: 'Requested signatures', strValid: 'Valid signatures', strInvalid: 'Invalid signatures', strSign: 'Sign', - strView: 'View', - txtSignedDocument: 'This document has been signed. It should not be edited.', - txtRequestedSignatures: 'This document has requested signatures.', - txtContinueEditing: 'Edit anyway' + strDetails: 'Signature Details', + strSetup: 'Signature Setup', + txtSigned: 'Valid signatures has been added to the document. The document is protected from editing.', + txtSignedInvalid: 'Some of the digital signatures in document are invalid or could not be verified. The document is protected from editing.', + txtRequestedSignatures: 'This document needs to be signed.', + txtContinueEditing: 'Edit anyway', + notcriticalErrorTitle: 'Warning', + txtEditWarning: 'Editing will remove the signatures from the document.
    Are you sure you want to continue?', + strDelete: 'Remove Signature' }, SSE.Views.SignatureSettings || {})); }); \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/app/view/Toolbar.js b/apps/spreadsheeteditor/main/app/view/Toolbar.js index dda3a9cc8..92a515643 100644 --- a/apps/spreadsheeteditor/main/app/view/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/view/Toolbar.js @@ -2078,6 +2078,8 @@ define([ textTabFile: 'File', textTabHome: 'Home', textTabInsert: 'Insert', - textSurface: 'Surface' + textSurface: 'Surface', + tipChangeChart: 'Change Chart Type', + textTabProtect: 'Protection' }, SSE.Views.Toolbar || {})); }); \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/app_dev.js b/apps/spreadsheeteditor/main/app_dev.js index 533f55cc5..13231fae2 100644 --- a/apps/spreadsheeteditor/main/app_dev.js +++ b/apps/spreadsheeteditor/main/app_dev.js @@ -149,6 +149,7 @@ require([ 'Common.Controllers.Chat', 'Common.Controllers.Comments', 'Common.Controllers.Plugins' + ,'Common.Controllers.Protection' ] }); @@ -177,6 +178,7 @@ require([ 'common/main/lib/controller/Comments', 'common/main/lib/controller/Chat', 'common/main/lib/controller/Plugins' + ,'common/main/lib/controller/Protection' ], function() { window.compareVersions = true; app.start(); diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json index e21627e7d..776d04f2c 100644 --- a/apps/spreadsheeteditor/main/locale/en.json +++ b/apps/spreadsheeteditor/main/locale/en.json @@ -102,12 +102,29 @@ "Common.Views.OpenDialog.txtTab": "Tab", "Common.Views.OpenDialog.txtTitle": "Choose %1 options", "Common.Views.OpenDialog.txtTitleProtected": "Protected File", + "Common.Views.PasswordDialog.cancelButtonText": "Cancel", + "Common.Views.PasswordDialog.okButtonText": "OK", + "Common.Views.PasswordDialog.txtPassword": "Password", + "Common.Views.PasswordDialog.txtTitle": "Set Password", + "Common.Views.PasswordDialog.txtDescription": "A Password is required to open this document", + "Common.Views.PasswordDialog.txtRepeat": "Repeat password", + "Common.Views.PasswordDialog.txtIncorrectPwd": "Confirmation password is not identical", "Common.Views.PluginDlg.textLoading": "Loading", "Common.Views.Plugins.groupCaption": "Plugins", "Common.Views.Plugins.strPlugins": "Plugins", "Common.Views.Plugins.textLoading": "Loading", "Common.Views.Plugins.textStart": "Start", "Common.Views.Plugins.textStop": "Stop", + "Common.Views.Protection.txtAddPwd": "Add password", + "Common.Views.Protection.txtEncrypt": "Encrypt", + "Common.Views.Protection.txtSignature": "Signature", + "Common.Views.Protection.hintAddPwd": "Encrypt with password", + "Common.Views.Protection.hintPwd": "Change or delete password", + "Common.Views.Protection.hintSignature": "Add digital signature or signature line", + "Common.Views.Protection.txtChangePwd": "Change password", + "Common.Views.Protection.txtDeletePwd": "Delete password", + "Common.Views.Protection.txtInvisibleSignature": "Add digital signature", + "Common.Views.Protection.txtSignatureLine": "Signature line", "Common.Views.RenameDialog.cancelButtonText": "Cancel", "Common.Views.RenameDialog.okButtonText": "Ok", "Common.Views.RenameDialog.textName": "File name", @@ -1159,12 +1176,16 @@ "SSE.Views.FileMenuPanels.Settings.txtGeneral": "General", "SSE.Views.FileMenuPanels.Settings.txtPageSettings": "Page Settings", "SSE.Views.FileMenuPanels.ProtectDoc.strProtect": "Protect Document", - "SSE.Views.FileMenuPanels.ProtectDoc.strInvisibleSign": "Add invisible digital signature", - "SSE.Views.FileMenuPanels.ProtectDoc.strVisibleSign": "Add visible signature", - "SSE.Views.FileMenuPanels.ProtectDoc.strRequested": "Requested signatures", - "SSE.Views.FileMenuPanels.ProtectDoc.strValid": "Valid signatures", - "SSE.Views.FileMenuPanels.ProtectDoc.strInvalid": "Invalid signatures", "SSE.Views.FileMenuPanels.ProtectDoc.strSignature": "Signature", + "SSE.Views.FileMenuPanels.ProtectDoc.txtView": "View signatures", + "SSE.Views.FileMenuPanels.ProtectDoc.txtEdit": "Edit document", + "SSE.Views.FileMenuPanels.ProtectDoc.txtSigned": "Valid signatures has been added to the document. The document is protected from editing.", + "SSE.Views.FileMenuPanels.ProtectDoc.txtSignedInvalid": "Some of the digital signatures in document are invalid or could not be verified. The document is protected from editing.", + "SSE.Views.FileMenuPanels.ProtectDoc.txtRequestedSignatures": "This document needs to be signed.", + "SSE.Views.FileMenuPanels.ProtectDoc.notcriticalErrorTitle": "Warning", + "SSE.Views.FileMenuPanels.ProtectDoc.txtEditWarning": "Editing will remove the signatures from the document.
    Are you sure you want to continue?", + "SSE.Views.FileMenuPanels.ProtectDoc.strEncrypt": "Password", + "SSE.Views.FileMenuPanels.ProtectDoc.txtEncrypted": "This document has been protected by password", "SSE.Views.FormatSettingsDialog.textCancel": "Cancel", "SSE.Views.FormatSettingsDialog.textCategory": "Category", "SSE.Views.FormatSettingsDialog.textDecimal": "Decimal", @@ -1463,13 +1484,19 @@ "SSE.Views.ShapeSettings.txtPapyrus": "Papyrus", "SSE.Views.ShapeSettings.txtWood": "Wood", "SSE.Views.SignatureSettings.strSignature": "Signature", - "SSE.Views.SignatureSettings.strInvisibleSign": "Add invisible digital signature", - "SSE.Views.SignatureSettings.strVisibleSign": "Add visible signature", "SSE.Views.SignatureSettings.strRequested": "Requested signatures", "SSE.Views.SignatureSettings.strValid": "Valid signatures", "SSE.Views.SignatureSettings.strInvalid": "Invalid signatures", "SSE.Views.SignatureSettings.strSign": "Sign", - "SSE.Views.SignatureSettings.strView": "View", + "SSE.Views.SignatureSettings.strDetails": "Signature Details", + "SSE.Views.SignatureSettings.strDelete": "Remove Signature", + "SSE.Views.SignatureSettings.strSetup": "Signature Setup", + "SSE.Views.SignatureSettings.txtSigned": "Valid signatures has been added to the document. The document is protected from editing.", + "SSE.Views.SignatureSettings.txtSignedInvalid": "Some of the digital signatures in document are invalid or could not be verified. The document is protected from editing.", + "SSE.Views.SignatureSettings.txtRequestedSignatures": "This document needs to be signed.", + "SSE.Views.SignatureSettings.txtContinueEditing": "Edit anyway", + "SSE.Views.SignatureSettings.notcriticalErrorTitle": "Warning", + "SSE.Views.SignatureSettings.txtEditWarning": "Editing will remove the signatures from the document.
    Are you sure you want to continue?", "SSE.Views.ShapeSettingsAdvanced.cancelButtonText": "Cancel", "SSE.Views.ShapeSettingsAdvanced.okButtonText": "OK", "SSE.Views.ShapeSettingsAdvanced.strColumns": "Columns", @@ -1695,6 +1722,7 @@ "SSE.Views.Toolbar.textTabFile": "File", "SSE.Views.Toolbar.textTabHome": "Home", "SSE.Views.Toolbar.textTabInsert": "Insert", + "SSE.Views.Toolbar.textTabProtect": "Protection", "SSE.Views.Toolbar.textTopBorders": "Top Borders", "SSE.Views.Toolbar.textUnderline": "Underline", "SSE.Views.Toolbar.textWinLossSpark": "Win/Loss", diff --git a/apps/spreadsheeteditor/main/resources/less/leftmenu.less b/apps/spreadsheeteditor/main/resources/less/leftmenu.less index 36a0aed6c..42acd0549 100644 --- a/apps/spreadsheeteditor/main/resources/less/leftmenu.less +++ b/apps/spreadsheeteditor/main/resources/less/leftmenu.less @@ -520,6 +520,25 @@ font: 12px tahoma, arial, verdana, sans-serif; } } + + #panel-protect { + label, span { + font-size: 12px; + } + + padding: 30px 30px; + + .header { + font-weight: bold; + margin: 30px 0 10px; + } + + table { + td { + padding: 5px 0; + } + } + } } } @@ -538,31 +557,3 @@ -o-transform: rotate(180deg); transform: rotate(180deg); } - -#panel-protect { - #file-menu-panel & { - padding: 30px 30px; - } - - - button { - display: block; - width: auto; - margin-top: 20px; - } - - label { - font: 12px tahoma, arial, verdana, sans-serif; - } - - .header { - font-weight: bold; - margin: 30px 0 10px; - } - - table { - td { - padding: 5px 5px; - } - } -} \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/resources/less/rightmenu.less b/apps/spreadsheeteditor/main/resources/less/rightmenu.less index 6ef9f2f54..852de385e 100644 --- a/apps/spreadsheeteditor/main/resources/less/rightmenu.less +++ b/apps/spreadsheeteditor/main/resources/less/rightmenu.less @@ -336,8 +336,54 @@ button:active:not(.disabled) .btn-change-shape {background-position: -56px - .combo-template(60px); } -.signature-sign-name { +#signature-requested-sign, +#signature-valid-sign, +#signature-invalid-sign { + height: 100%; overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; + margin: 0 -10px 0 -15px; + + .item { + display: block; + border: none; + width: 100%; + .box-shadow(none); + margin: 0; + + &:hover, + &.over { + background-color: @secondary; + } + } + + .signature-item { + padding: 5px 2px 5px 15px; + text-overflow: ellipsis; + + .name { + width: 100%; + white-space: nowrap; + overflow: hidden; + cursor: pointer; + max-width: 160px; + text-overflow: ellipsis; + } + + .caret { + width: 23px; + height: 14px; + border: 0; + background-position: -43px -150px; + margin: 8px 15px; + display: inline-block; + position: absolute; + right: 0; + } + + &.requested { + .caret { + margin: 0 15px; + } + } + } } \ No newline at end of file From 0a50b3ac3d49ba8d72edebcd2d22b37885e6d3c8 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Sun, 19 Nov 2017 10:38:37 +0300 Subject: [PATCH 35/86] [PE] Don't add visible signature for presentation editor. --- apps/common/main/lib/view/Protection.js | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/apps/common/main/lib/view/Protection.js b/apps/common/main/lib/view/Protection.js index 9be9d087a..f7859644d 100644 --- a/apps/common/main/lib/view/Protection.js +++ b/apps/common/main/lib/view/Protection.js @@ -83,9 +83,10 @@ define([ }); if (me.appConfig.canProtect) { - this.btnSignature.menu.on('item:click', function (menu, item, e) { - me.fireEvent('protect:signature', [item.value, false]); - }); + if (this.btnSignature.menu) + this.btnSignature.menu.on('item:click', function (menu, item, e) { + me.fireEvent('protect:signature', [item.value, false]); + }); this.btnsInvisibleSignature.forEach(function(button) { button.on('click', function (b, e) { @@ -112,6 +113,9 @@ define([ this._state = {disabled: false, hasPassword: false}; + var filter = Common.localStorage.getKeysFilter(); + this.appPrefix = (filter && filter.length) ? filter.split(',')[0] : ''; + if ( this.appConfig.isDesktopApp && this.appConfig.isOffline ) { this.btnAddPwd = new Common.UI.Button({ cls: 'btn-toolbar x-huge icon-top', @@ -128,18 +132,18 @@ define([ visible: false }); - if (this.appConfig.canProtect) + if (this.appConfig.canProtect) { this.btnSignature = new Common.UI.Button({ cls: 'btn-toolbar x-huge icon-top', iconCls: 'btn-ic-reviewview', caption: this.txtSignature, - menu: true + menu: (this.appPrefix !== 'pe-') }); + if (!this.btnSignature.menu) + this.btnsInvisibleSignature.push(this.btnSignature); + } } - var filter = Common.localStorage.getKeysFilter(); - this.appPrefix = (filter && filter.length) ? filter.split(',')[0] : ''; - Common.NotificationCenter.on('app:ready', this.onAppReady.bind(this)); }, @@ -175,8 +179,8 @@ define([ ); if (me.btnSignature) { - me.btnSignature.updateHint(me.hintSignature); - me.btnSignature.setMenu( + me.btnSignature.updateHint((me.btnSignature.menu) ? me.hintSignature : me.txtInvisibleSignature); + me.btnSignature.menu && me.btnSignature.setMenu( new Common.UI.Menu({ items: [ { From b255446ec2b544e3708e560f433b72561493e32a Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Sun, 19 Nov 2017 11:02:09 +0300 Subject: [PATCH 36/86] [PE][SSE] Update translations. --- .../main/app/view/FileMenuPanels.js | 12 +++++----- .../main/app/view/SignatureSettings.js | 6 ++--- apps/presentationeditor/main/locale/en.json | 18 +++++++-------- .../main/app/view/FileMenuPanels.js | 14 ++++++------ .../main/app/view/SignatureSettings.js | 8 +++---- apps/spreadsheeteditor/main/locale/en.json | 22 +++++++++---------- 6 files changed, 40 insertions(+), 40 deletions(-) diff --git a/apps/presentationeditor/main/app/view/FileMenuPanels.js b/apps/presentationeditor/main/app/view/FileMenuPanels.js index 33e8dae36..5ba05a4f0 100644 --- a/apps/presentationeditor/main/app/view/FileMenuPanels.js +++ b/apps/presentationeditor/main/app/view/FileMenuPanels.js @@ -1016,16 +1016,16 @@ define([ this.cntPassword.toggleClass('hidden', this.btnAddPwd.isVisible()); }, - strProtect: 'Protect Document', + strProtect: 'Protect Presentation', strSignature: 'Signature', txtView: 'View signatures', - txtEdit: 'Edit document', - txtSigned: 'Valid signatures has been added to the document. The document is protected from editing.', - txtSignedInvalid: 'Some of the digital signatures in document are invalid or could not be verified. The document is protected from editing.', + txtEdit: 'Edit presentation', + txtSigned: 'Valid signatures has been added to the presentation. The presentation is protected from editing.', + txtSignedInvalid: 'Some of the digital signatures in presentation are invalid or could not be verified. The presentation is protected from editing.', notcriticalErrorTitle: 'Warning', - txtEditWarning: 'Editing will remove the signatures from the document.
    Are you sure you want to continue?', + txtEditWarning: 'Editing will remove the signatures from the presentation.
    Are you sure you want to continue?', strEncrypt: 'Password', - txtEncrypted: 'This document has been protected by password' + txtEncrypted: 'This presentation has been protected by password' }, PE.Views.FileMenuPanels.ProtectDoc || {})); diff --git a/apps/presentationeditor/main/app/view/SignatureSettings.js b/apps/presentationeditor/main/app/view/SignatureSettings.js index 03057fd2d..805e93ea3 100644 --- a/apps/presentationeditor/main/app/view/SignatureSettings.js +++ b/apps/presentationeditor/main/app/view/SignatureSettings.js @@ -305,11 +305,11 @@ define([ strValid: 'Valid signatures', strInvalid: 'Invalid signatures', strDetails: 'Signature Details', - txtSigned: 'Valid signatures has been added to the document. The document is protected from editing.', - txtSignedInvalid: 'Some of the digital signatures in document are invalid or could not be verified. The document is protected from editing.', + txtSigned: 'Valid signatures has been added to the presentation. The presentation is protected from editing.', + txtSignedInvalid: 'Some of the digital signatures in presentation are invalid or could not be verified. The presentation is protected from editing.', txtContinueEditing: 'Edit anyway', notcriticalErrorTitle: 'Warning', - txtEditWarning: 'Editing will remove the signatures from the document.
    Are you sure you want to continue?', + txtEditWarning: 'Editing will remove the signatures from the presentation.
    Are you sure you want to continue?', strDelete: 'Remove Signature' }, PE.Views.SignatureSettings || {})); diff --git a/apps/presentationeditor/main/locale/en.json b/apps/presentationeditor/main/locale/en.json index a60ba825f..33d2ac95e 100644 --- a/apps/presentationeditor/main/locale/en.json +++ b/apps/presentationeditor/main/locale/en.json @@ -874,16 +874,16 @@ "PE.Views.FileMenuPanels.DocumentInfo.txtTitle": "Presentation Title", "PE.Views.FileMenuPanels.DocumentRights.txtBtnAccessRights": "Change access rights", "PE.Views.FileMenuPanels.DocumentRights.txtRights": "Persons who have rights", - "PE.Views.FileMenuPanels.ProtectDoc.strProtect": "Protect Document", + "PE.Views.FileMenuPanels.ProtectDoc.strProtect": "Protect Presentation", "PE.Views.FileMenuPanels.ProtectDoc.strSignature": "Signature", "PE.Views.FileMenuPanels.ProtectDoc.txtView": "View signatures", - "PE.Views.FileMenuPanels.ProtectDoc.txtEdit": "Edit document", - "PE.Views.FileMenuPanels.ProtectDoc.txtSigned": "Valid signatures has been added to the document. The document is protected from editing.", - "PE.Views.FileMenuPanels.ProtectDoc.txtSignedInvalid": "Some of the digital signatures in document are invalid or could not be verified. The document is protected from editing.", + "PE.Views.FileMenuPanels.ProtectDoc.txtEdit": "Edit presentation", + "PE.Views.FileMenuPanels.ProtectDoc.txtSigned": "Valid signatures has been added to the presentation. The presentation is protected from editing.", + "PE.Views.FileMenuPanels.ProtectDoc.txtSignedInvalid": "Some of the digital signatures in presentation are invalid or could not be verified. The presentation is protected from editing.", "PE.Views.FileMenuPanels.ProtectDoc.notcriticalErrorTitle": "Warning", - "PE.Views.FileMenuPanels.ProtectDoc.txtEditWarning": "Editing will remove the signatures from the document.
    Are you sure you want to continue?", + "PE.Views.FileMenuPanels.ProtectDoc.txtEditWarning": "Editing will remove the signatures from the presentation.
    Are you sure you want to continue?", "PE.Views.FileMenuPanels.ProtectDoc.strEncrypt": "Password", - "PE.Views.FileMenuPanels.ProtectDoc.txtEncrypted": "This document has been protected by password", + "PE.Views.FileMenuPanels.ProtectDoc.txtEncrypted": "This presentation has been protected by password", "PE.Views.FileMenuPanels.Settings.okButtonText": "Apply", "PE.Views.FileMenuPanels.Settings.strAlignGuides": "Turn on alignment guides", "PE.Views.FileMenuPanels.Settings.strAutoRecover": "Turn on autorecover", @@ -1101,11 +1101,11 @@ "PE.Views.SignatureSettings.strSign": "Sign", "PE.Views.SignatureSettings.strDetails": "Signature Details", "PE.Views.SignatureSettings.strDelete": "Remove Signature", - "PE.Views.SignatureSettings.txtSigned": "Valid signatures has been added to the document. The document is protected from editing.", - "PE.Views.SignatureSettings.txtSignedInvalid": "Some of the digital signatures in document are invalid or could not be verified. The document is protected from editing.", + "PE.Views.SignatureSettings.txtSigned": "Valid signatures has been added to the presentation. The presentation is protected from editing.", + "PE.Views.SignatureSettings.txtSignedInvalid": "Some of the digital signatures in presentation are invalid or could not be verified. The presentation is protected from editing.", "PE.Views.SignatureSettings.txtContinueEditing": "Edit anyway", "PE.Views.SignatureSettings.notcriticalErrorTitle": "Warning", - "PE.Views.SignatureSettings.txtEditWarning": "Editing will remove the signatures from the document.
    Are you sure you want to continue?", + "PE.Views.SignatureSettings.txtEditWarning": "Editing will remove the signatures from the presentation.
    Are you sure you want to continue?", "PE.Views.SlideSettings.strBackground": "Background color", "PE.Views.SlideSettings.strColor": "Color", "PE.Views.SlideSettings.strDelay": "Delay", diff --git a/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js b/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js index 8d0b8265e..3b02fbfb8 100644 --- a/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js +++ b/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js @@ -1489,17 +1489,17 @@ define([ this.cntPassword.toggleClass('hidden', this.btnAddPwd.isVisible()); }, - strProtect: 'Protect Document', + strProtect: 'Protect Workbook', strSignature: 'Signature', txtView: 'View signatures', - txtEdit: 'Edit document', - txtSigned: 'Valid signatures has been added to the document. The document is protected from editing.', - txtSignedInvalid: 'Some of the digital signatures in document are invalid or could not be verified. The document is protected from editing.', - txtRequestedSignatures: 'This document needs to be signed.', + txtEdit: 'Edit workbook', + txtSigned: 'Valid signatures has been added to the workbook. The workbook is protected from editing.', + txtSignedInvalid: 'Some of the digital signatures in workbook are invalid or could not be verified. The workbook is protected from editing.', + txtRequestedSignatures: 'This workbook needs to be signed.', notcriticalErrorTitle: 'Warning', - txtEditWarning: 'Editing will remove the signatures from the document.
    Are you sure you want to continue?', + txtEditWarning: 'Editing will remove the signatures from the workbook.
    Are you sure you want to continue?', strEncrypt: 'Password', - txtEncrypted: 'This document has been protected by password' + txtEncrypted: 'This workbook has been protected by password' }, SSE.Views.FileMenuPanels.ProtectDoc || {})); diff --git a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js index ceefef983..c5fb272f2 100644 --- a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js +++ b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js @@ -347,12 +347,12 @@ define([ strSign: 'Sign', strDetails: 'Signature Details', strSetup: 'Signature Setup', - txtSigned: 'Valid signatures has been added to the document. The document is protected from editing.', - txtSignedInvalid: 'Some of the digital signatures in document are invalid or could not be verified. The document is protected from editing.', - txtRequestedSignatures: 'This document needs to be signed.', + txtSigned: 'Valid signatures has been added to the workbook. The workbook is protected from editing.', + txtSignedInvalid: 'Some of the digital signatures in workbook are invalid or could not be verified. The workbook is protected from editing.', + txtRequestedSignatures: 'This workbook needs to be signed.', txtContinueEditing: 'Edit anyway', notcriticalErrorTitle: 'Warning', - txtEditWarning: 'Editing will remove the signatures from the document.
    Are you sure you want to continue?', + txtEditWarning: 'Editing will remove the signatures from the workbook.
    Are you sure you want to continue?', strDelete: 'Remove Signature' }, SSE.Views.SignatureSettings || {})); diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json index 776d04f2c..4f4c2f1aa 100644 --- a/apps/spreadsheeteditor/main/locale/en.json +++ b/apps/spreadsheeteditor/main/locale/en.json @@ -1175,17 +1175,17 @@ "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtWin": "as Windows", "SSE.Views.FileMenuPanels.Settings.txtGeneral": "General", "SSE.Views.FileMenuPanels.Settings.txtPageSettings": "Page Settings", - "SSE.Views.FileMenuPanels.ProtectDoc.strProtect": "Protect Document", + "SSE.Views.FileMenuPanels.ProtectDoc.strProtect": "Protect Workbook", "SSE.Views.FileMenuPanels.ProtectDoc.strSignature": "Signature", "SSE.Views.FileMenuPanels.ProtectDoc.txtView": "View signatures", - "SSE.Views.FileMenuPanels.ProtectDoc.txtEdit": "Edit document", - "SSE.Views.FileMenuPanels.ProtectDoc.txtSigned": "Valid signatures has been added to the document. The document is protected from editing.", - "SSE.Views.FileMenuPanels.ProtectDoc.txtSignedInvalid": "Some of the digital signatures in document are invalid or could not be verified. The document is protected from editing.", - "SSE.Views.FileMenuPanels.ProtectDoc.txtRequestedSignatures": "This document needs to be signed.", + "SSE.Views.FileMenuPanels.ProtectDoc.txtEdit": "Edit workbook", + "SSE.Views.FileMenuPanels.ProtectDoc.txtSigned": "Valid signatures has been added to the workbook. The workbook is protected from editing.", + "SSE.Views.FileMenuPanels.ProtectDoc.txtSignedInvalid": "Some of the digital signatures in workbook are invalid or could not be verified. The workbook is protected from editing.", + "SSE.Views.FileMenuPanels.ProtectDoc.txtRequestedSignatures": "This workbook needs to be signed.", "SSE.Views.FileMenuPanels.ProtectDoc.notcriticalErrorTitle": "Warning", - "SSE.Views.FileMenuPanels.ProtectDoc.txtEditWarning": "Editing will remove the signatures from the document.
    Are you sure you want to continue?", + "SSE.Views.FileMenuPanels.ProtectDoc.txtEditWarning": "Editing will remove the signatures from the workbook.
    Are you sure you want to continue?", "SSE.Views.FileMenuPanels.ProtectDoc.strEncrypt": "Password", - "SSE.Views.FileMenuPanels.ProtectDoc.txtEncrypted": "This document has been protected by password", + "SSE.Views.FileMenuPanels.ProtectDoc.txtEncrypted": "This workbook has been protected by password", "SSE.Views.FormatSettingsDialog.textCancel": "Cancel", "SSE.Views.FormatSettingsDialog.textCategory": "Category", "SSE.Views.FormatSettingsDialog.textDecimal": "Decimal", @@ -1491,12 +1491,12 @@ "SSE.Views.SignatureSettings.strDetails": "Signature Details", "SSE.Views.SignatureSettings.strDelete": "Remove Signature", "SSE.Views.SignatureSettings.strSetup": "Signature Setup", - "SSE.Views.SignatureSettings.txtSigned": "Valid signatures has been added to the document. The document is protected from editing.", - "SSE.Views.SignatureSettings.txtSignedInvalid": "Some of the digital signatures in document are invalid or could not be verified. The document is protected from editing.", - "SSE.Views.SignatureSettings.txtRequestedSignatures": "This document needs to be signed.", + "SSE.Views.SignatureSettings.txtSigned": "Valid signatures has been added to the workbook. The workbook is protected from editing.", + "SSE.Views.SignatureSettings.txtSignedInvalid": "Some of the digital signatures in workbook are invalid or could not be verified. The workbook is protected from editing.", + "SSE.Views.SignatureSettings.txtRequestedSignatures": "This workbook needs to be signed.", "SSE.Views.SignatureSettings.txtContinueEditing": "Edit anyway", "SSE.Views.SignatureSettings.notcriticalErrorTitle": "Warning", - "SSE.Views.SignatureSettings.txtEditWarning": "Editing will remove the signatures from the document.
    Are you sure you want to continue?", + "SSE.Views.SignatureSettings.txtEditWarning": "Editing will remove the signatures from the workbook.
    Are you sure you want to continue?", "SSE.Views.ShapeSettingsAdvanced.cancelButtonText": "Cancel", "SSE.Views.ShapeSettingsAdvanced.okButtonText": "OK", "SSE.Views.ShapeSettingsAdvanced.strColumns": "Columns", From 707a6258c3b7200319861a79738ac30702c8297a Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 20 Nov 2017 14:06:23 +0300 Subject: [PATCH 37/86] Signature refactoring: use certificateId for viewing certificate. --- apps/documenteditor/main/app/view/SignatureSettings.js | 7 +++++-- apps/presentationeditor/main/app/view/SignatureSettings.js | 6 ++++-- apps/spreadsheeteditor/main/app/view/SignatureSettings.js | 7 +++++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/apps/documenteditor/main/app/view/SignatureSettings.js b/apps/documenteditor/main/app/view/SignatureSettings.js index 4fa7f30cc..570dd08c5 100644 --- a/apps/documenteditor/main/app/view/SignatureSettings.js +++ b/apps/documenteditor/main/app/view/SignatureSettings.js @@ -173,7 +173,7 @@ define([ me._state.requestedSignatures.push({name: item.asc_getSigner1(), guid: item.asc_getGuid(), requested: true}); }); _.each(valid, function(item, index){ - var sign = {name: item.asc_getSigner1(), guid: item.asc_getId(), date: '18/05/2017', invisible: !item.asc_getVisible()}; + var sign = {name: item.asc_getSigner1(), certificateId: item.asc_getId(), guid: item.asc_getGuid(), date: item.asc_getDate(), invisible: !item.asc_getVisible()}; (item.asc_getValid()==0) ? me._state.validSignatures.push(sign) : me._state.invalidSignatures.push(sign); }); @@ -237,8 +237,11 @@ define([ menu.items[1].setVisible(!requested); menu.items[2].setVisible(requested || !record.get('invisible')); menu.items[3].setVisible(!requested); + menu.items[0].setDisabled(this._locked); menu.items[3].setDisabled(this._locked); + + menu.items[1].cmpEl.attr('data-value', record.get('certificateId')); // view certificate menu.items[2].cmpEl.attr('data-value', signed ? 1 : 0); // view or edit signature settings menu.cmpEl.attr('data-value', record.get('guid')); @@ -264,7 +267,7 @@ define([ Common.NotificationCenter.trigger('protect:sign', guid); break; case 1: - this.api.asc_ViewCertificate(guid); + this.api.asc_ViewCertificate(item.cmpEl.attr('data-value')); break; case 2: Common.NotificationCenter.trigger('protect:signature', 'visible', !!parseInt(item.cmpEl.attr('data-value')), guid);// can edit settings for requested signature diff --git a/apps/presentationeditor/main/app/view/SignatureSettings.js b/apps/presentationeditor/main/app/view/SignatureSettings.js index 805e93ea3..111532dcf 100644 --- a/apps/presentationeditor/main/app/view/SignatureSettings.js +++ b/apps/presentationeditor/main/app/view/SignatureSettings.js @@ -155,7 +155,7 @@ define([ me._state.invalidSignatures = []; _.each(valid, function(item, index){ - var sign = {name: item.asc_getSigner1(), guid: item.asc_getId(), date: '18/05/2017'}; + var sign = {name: item.asc_getSigner1(), certificateId: item.asc_getId(), guid: item.asc_getGuid(), date: item.asc_getDate()}; (item.asc_getValid()==0) ? me._state.validSignatures.push(sign) : me._state.invalidSignatures.push(sign); }); @@ -211,6 +211,8 @@ define([ }); } menu.items[1].setDisabled(this._locked); + + menu.items[0].cmpEl.attr('data-value', record.get('certificateId')); // view certificate menu.cmpEl.attr('data-value', record.get('guid')); menuContainer.css({left: showPoint[0], top: showPoint[1]}); @@ -230,7 +232,7 @@ define([ var guid = menu.cmpEl.attr('data-value'); switch (item.value) { case 1: - this.api.asc_ViewCertificate(guid); + this.api.asc_ViewCertificate(item.cmpEl.attr('data-value')); break; case 3: this.api.asc_RemoveSignature(guid); diff --git a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js index c5fb272f2..753c0185a 100644 --- a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js +++ b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js @@ -173,7 +173,7 @@ define([ me._state.requestedSignatures.push({name: item.asc_getSigner1(), guid: item.asc_getGuid(), requested: true}); }); _.each(valid, function(item, index){ - var sign = {name: item.asc_getSigner1(), guid: item.asc_getId(), date: '18/05/2017', invisible: !item.asc_getVisible()}; + var sign = {name: item.asc_getSigner1(), certificateId: item.asc_getId(), guid: item.asc_getGuid(), date: item.asc_getDate(), invisible: !item.asc_getVisible()}; (item.asc_getValid()==0) ? me._state.validSignatures.push(sign) : me._state.invalidSignatures.push(sign); }); @@ -237,8 +237,11 @@ define([ menu.items[1].setVisible(!requested); menu.items[2].setVisible(requested || !record.get('invisible')); menu.items[3].setVisible(!requested); + menu.items[0].setDisabled(this._locked); menu.items[3].setDisabled(this._locked); + + menu.items[1].cmpEl.attr('data-value', record.get('certificateId')); // view certificate menu.items[2].cmpEl.attr('data-value', signed ? 1 : 0); // view or edit signature settings menu.cmpEl.attr('data-value', record.get('guid')); @@ -264,7 +267,7 @@ define([ Common.NotificationCenter.trigger('protect:sign', guid); break; case 1: - this.api.asc_ViewCertificate(guid); + this.api.asc_ViewCertificate(item.cmpEl.attr('data-value')); break; case 2: Common.NotificationCenter.trigger('protect:signature', 'visible', !!parseInt(item.cmpEl.attr('data-value')), guid);// can edit settings for requested signature From ea6ca8e602d18385bf06b475940b4388a6f805aa Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 21 Nov 2017 11:34:38 +0300 Subject: [PATCH 38/86] Signature refactoring. --- apps/common/main/lib/view/SignDialog.js | 4 +- .../main/app/view/SignatureSettings.js | 133 +++++++++++------- .../main/resources/less/rightmenu.less | 8 +- .../main/app/view/SignatureSettings.js | 113 +++++++++------ .../main/resources/less/rightmenu.less | 8 +- .../main/app/view/SignatureSettings.js | 133 +++++++++++------- .../main/resources/less/rightmenu.less | 8 +- 7 files changed, 240 insertions(+), 167 deletions(-) diff --git a/apps/common/main/lib/view/SignDialog.js b/apps/common/main/lib/view/SignDialog.js index 8ea486e68..2ce0863ac 100644 --- a/apps/common/main/lib/view/SignDialog.js +++ b/apps/common/main/lib/view/SignDialog.js @@ -323,8 +323,8 @@ define([ var date = certificate.date, arr_date = (typeof date == 'string') ? date.split(' - ') : ['', '']; this.cntCertificate.html(this.templateCertificate({name: certificate.name, valid: this.textValid.replace('%1', arr_date[0]).replace('%2', arr_date[1])})); - this.cntCertificate.toggleClass('hidden', this.certificateId<0); - this.btnOk.setDisabled(this.certificateId<0); + this.cntCertificate.toggleClass('hidden', _.isEmpty(this.certificateId) || this.certificateId<0); + this.btnOk.setDisabled(_.isEmpty(this.certificateId) || this.certificateId<0); }, onSelectImage: function() { diff --git a/apps/documenteditor/main/app/view/SignatureSettings.js b/apps/documenteditor/main/app/view/SignatureSettings.js index 570dd08c5..5f7f9375f 100644 --- a/apps/documenteditor/main/app/view/SignatureSettings.js +++ b/apps/documenteditor/main/app/view/SignatureSettings.js @@ -63,11 +63,12 @@ define([ initialize: function () { this._state = { - requestedSignatures: undefined, - validSignatures: undefined, - invalidSignatures: undefined, DisabledEditing: false, - ready: false + ready: false, + hasValid: false, + hasInvalid: false, + hasRequested: false, + tip: undefined }; this._locked = false; @@ -88,7 +89,7 @@ define([ enableKeyEvents: false, itemTemplate: _.template([ '
    ', - '
    ', + '
    ', '
    <%= Common.Utils.String.htmlEncode(name) %>
    ', '
    ' ].join('')) @@ -99,7 +100,7 @@ define([ enableKeyEvents: false, itemTemplate: _.template([ '
    ', - '
    ', + '
    ' + 'nomargin' + '<% } %>">
    ', '
    <%= Common.Utils.String.htmlEncode(name) %>
    ', '
    <%= Common.Utils.String.htmlEncode(date) %>
    ', '
    ' @@ -111,7 +112,7 @@ define([ enableKeyEvents: false, itemTemplate: _.template([ '
    ', - '
    ', + '
    ' + 'nomargin' + '<% } %>">
    ', '
    <%= Common.Utils.String.htmlEncode(name) %>
    ', '
    <%= Common.Utils.String.htmlEncode(date) %>
    ', '
    ' @@ -144,7 +145,7 @@ define([ }, ChangeSettings: function(props) { - if (!this._state.requestedSignatures || !this._state.validSignatures || !this._state.invalidSignatures) + if (!this._state.hasRequested && !this._state.hasValid && !this._state.hasInvalid) this.updateSignatures(this.api.asc_getSignatures(), this.api.asc_getRequestSignatures()); }, @@ -160,36 +161,41 @@ define([ if (!this._state.ready) return; this.updateSignatures(valid, requested); - this.showSignatureTooltip(this._state.validSignatures.length>0, this._state.invalidSignatures.length>0); + this.showSignatureTooltip(this._state.hasValid, this._state.hasInvalid); }, updateSignatures: function(valid, requested){ - var me = this; - me._state.requestedSignatures = []; - me._state.validSignatures = []; - me._state.invalidSignatures = []; + var me = this, + requestedSignatures = [], + validSignatures = [], + invalidSignatures = []; _.each(requested, function(item, index){ - me._state.requestedSignatures.push({name: item.asc_getSigner1(), guid: item.asc_getGuid(), requested: true}); + requestedSignatures.push({name: item.asc_getSigner1(), guid: item.asc_getGuid(), requested: true}); }); _.each(valid, function(item, index){ - var sign = {name: item.asc_getSigner1(), certificateId: item.asc_getId(), guid: item.asc_getGuid(), date: item.asc_getDate(), invisible: !item.asc_getVisible()}; - (item.asc_getValid()==0) ? me._state.validSignatures.push(sign) : me._state.invalidSignatures.push(sign); + var item_date = item.asc_getDate(); + var sign = {name: item.asc_getSigner1(), certificateId: item.asc_getId(), guid: item.asc_getGuid(), date: (!_.isEmpty(item_date)) ? new Date(item_date).toLocaleString() : '', invisible: !item.asc_getVisible()}; + (item.asc_getValid()==0) ? validSignatures.push(sign) : invalidSignatures.push(sign); }); - // me._state.requestedSignatures = [{name: 'Hammish Mitchell', guid: '123', requested: true}, {name: 'Someone Somewhere', guid: '123', requested: true}, {name: 'Mary White', guid: '123', requested: true}, {name: 'John Black', guid: '123', requested: true}]; - // me._state.validSignatures = [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017', invisible: true}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]; - // me._state.invalidSignatures = [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}]; + // requestedSignatures = [{name: 'Hammish Mitchell', guid: '123', requested: true}, {name: 'Someone Somewhere', guid: '123', requested: true}, {name: 'Mary White', guid: '123', requested: true}, {name: 'John Black', guid: '123', requested: true}]; + // validSignatures = [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017', invisible: true}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]; + // invalidSignatures = [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}]; - this.viewRequestedList.store.reset(me._state.requestedSignatures); - this.viewValidList.store.reset(me._state.validSignatures); - this.viewInvalidList.store.reset(me._state.invalidSignatures); + me._state.hasValid = validSignatures.length>0; + me._state.hasInvalid = invalidSignatures.length>0; + me._state.hasRequested = requestedSignatures.length>0; - this.$el.find('.requested').toggleClass('hidden', me._state.requestedSignatures.length<1); - this.$el.find('.valid').toggleClass('hidden', me._state.validSignatures.length<1); - this.$el.find('.invalid').toggleClass('hidden', me._state.invalidSignatures.length<1); + this.viewRequestedList.store.reset(requestedSignatures); + this.viewValidList.store.reset(validSignatures); + this.viewInvalidList.store.reset(invalidSignatures); - me.disableEditing(me._state.validSignatures.length>0 || me._state.invalidSignatures.length>0); + this.$el.find('.requested').toggleClass('hidden', !me._state.hasRequested); + this.$el.find('.valid').toggleClass('hidden', !me._state.hasValid); + this.$el.find('.invalid').toggleClass('hidden', !me._state.hasInvalid); + + me.disableEditing(me._state.hasValid || me._state.hasInvalid); }, onSelectSignature: function(picker, item, record, e){ @@ -232,7 +238,7 @@ define([ }); } var requested = record.get('requested'), - signed = (this._state.validSignatures.length>0 || this._state.invalidSignatures.length>0); + signed = (this._state.hasValid || this._state.hasInvalid); menu.items[0].setVisible(requested); menu.items[1].setVisible(!requested); menu.items[2].setVisible(requested || !record.get('invisible')); @@ -282,44 +288,63 @@ define([ this._state.ready = true; this.updateSignatures(this.api.asc_getSignatures(), this.api.asc_getRequestSignatures()); - this.showSignatureTooltip(this._state.validSignatures.length>0, this._state.invalidSignatures.length>0, this._state.requestedSignatures.length>0); + this.showSignatureTooltip(this._state.hasValid, this._state.hasInvalid, this._state.hasRequested); }, showSignatureTooltip: function(hasValid, hasInvalid, hasRequested) { - if (!hasValid && !hasInvalid && !hasRequested) return; - - var tipText = (hasInvalid) ? this.txtSignedInvalid : (hasValid ? this.txtSigned : ""); - if (hasRequested) - tipText = this.txtRequestedSignatures + "

    " + tipText; - var me = this, + tip = me._state.tip; + + if (!hasValid && !hasInvalid && !hasRequested) { + if (tip && tip.isVisible()) { + tip.close(); + me._state.tip = undefined; + } + return; + } + + var showLink = hasValid || hasInvalid, + tipText = (hasInvalid) ? me.txtSignedInvalid : (hasValid ? me.txtSigned : ""); + if (hasRequested) + tipText = me.txtRequestedSignatures + "

    " + tipText; + + if (tip && tip.isVisible() && (tipText !== tip.text || showLink !== tip.showLink)) { + tip.close(); + me._state.tip = undefined; + } + + if (!me._state.tip) { tip = new Common.UI.SynchronizeTip({ target : DE.getController('RightMenu').getView('RightMenu').btnSignature.btnEl, text : tipText, - showLink: hasValid || hasInvalid, + showLink: showLink, textLink: this.txtContinueEditing, placement: 'left' }); - tip.on({ - 'dontshowclick': function() { - Common.UI.warning({ - title: me.notcriticalErrorTitle, - msg: me.txtEditWarning, - buttons: ['ok', 'cancel'], - primary: 'ok', - callback: function(btn) { - if (btn == 'ok') { - tip.close(); - me.api.asc_RemoveAllSignatures(); + tip.on({ + 'dontshowclick': function() { + Common.UI.warning({ + title: me.notcriticalErrorTitle, + msg: me.txtEditWarning, + buttons: ['ok', 'cancel'], + primary: 'ok', + callback: function(btn) { + if (btn == 'ok') { + tip.close(); + me._state.tip = undefined; + me.api.asc_RemoveAllSignatures(); + } } - } - }); - }, - 'closeclick': function() { - tip.close(); - } - }); - tip.show(); + }); + }, + 'closeclick': function() { + tip.close(); + me._state.tip = undefined; + } + }); + me._state.tip = tip; + tip.show(); + } }, disableEditing: function(disable) { diff --git a/apps/documenteditor/main/resources/less/rightmenu.less b/apps/documenteditor/main/resources/less/rightmenu.less index 1a2c28945..90b026654 100644 --- a/apps/documenteditor/main/resources/less/rightmenu.less +++ b/apps/documenteditor/main/resources/less/rightmenu.less @@ -293,6 +293,7 @@ button:active:not(.disabled) .btn-change-shape {background-position: -56px - .signature-item { padding: 5px 2px 5px 15px; text-overflow: ellipsis; + min-height: 25px; .name { width: 100%; @@ -312,11 +313,10 @@ button:active:not(.disabled) .btn-change-shape {background-position: -56px - display: inline-block; position: absolute; right: 0; - } - &.requested { - .caret { - margin: 0 15px; + &.nomargin { + margin-top: 0; + margin-bottom: 0; } } } diff --git a/apps/presentationeditor/main/app/view/SignatureSettings.js b/apps/presentationeditor/main/app/view/SignatureSettings.js index 111532dcf..0d9deec6a 100644 --- a/apps/presentationeditor/main/app/view/SignatureSettings.js +++ b/apps/presentationeditor/main/app/view/SignatureSettings.js @@ -63,11 +63,11 @@ define([ initialize: function () { this._state = { - requestedSignatures: undefined, - validSignatures: undefined, - invalidSignatures: undefined, DisabledEditing: false, - ready: false + ready: false, + hasValid: false, + hasInvalid: false, + tip: undefined }; this._locked = false; @@ -88,7 +88,7 @@ define([ enableKeyEvents: false, itemTemplate: _.template([ '
    ', - '
    ', + '
    ' + 'nomargin' + '<% } %>">
    ', '
    <%= Common.Utils.String.htmlEncode(name) %>
    ', '
    <%= Common.Utils.String.htmlEncode(date) %>
    ', '
    ' @@ -100,7 +100,7 @@ define([ enableKeyEvents: false, itemTemplate: _.template([ '
    ', - '
    ', + '
    ' + 'nomargin' + '<% } %>">
    ', '
    <%= Common.Utils.String.htmlEncode(name) %>
    ', '
    <%= Common.Utils.String.htmlEncode(date) %>
    ', '
    ' @@ -130,7 +130,7 @@ define([ }, ChangeSettings: function(props) { - if (!this._state.validSignatures || !this._state.invalidSignatures) + if (!this._state.hasValid && !this._state.hasInvalid) this.updateSignatures(this.api.asc_getSignatures()); }, @@ -146,29 +146,33 @@ define([ if (!this._state.ready) return; this.updateSignatures(valid); - this.showSignatureTooltip(this._state.validSignatures.length>0, this._state.invalidSignatures.length>0); + this.showSignatureTooltip(this._state.hasValid, this._state.hasInvalid); }, updateSignatures: function(valid){ - var me = this; - me._state.validSignatures = []; - me._state.invalidSignatures = []; + var me = this, + validSignatures = [], + invalidSignatures = []; _.each(valid, function(item, index){ - var sign = {name: item.asc_getSigner1(), certificateId: item.asc_getId(), guid: item.asc_getGuid(), date: item.asc_getDate()}; - (item.asc_getValid()==0) ? me._state.validSignatures.push(sign) : me._state.invalidSignatures.push(sign); + var item_date = item.asc_getDate(); + var sign = {name: item.asc_getSigner1(), certificateId: item.asc_getId(), guid: item.asc_getGuid(), date: (!_.isEmpty(item_date)) ? new Date(item_date).toLocaleString() : '', invisible: !item.asc_getVisible()}; + (item.asc_getValid()==0) ? validSignatures.push(sign) : invalidSignatures.push(sign); }); - // me._state.validSignatures = [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017', invisible: true}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]; - // me._state.invalidSignatures = [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}]; + // validSignatures = [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017', invisible: true}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]; + // invalidSignatures = [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}]; - this.viewValidList.store.reset(me._state.validSignatures); - this.viewInvalidList.store.reset(me._state.invalidSignatures); + me._state.hasValid = validSignatures.length>0; + me._state.hasInvalid = invalidSignatures.length>0; - this.$el.find('.valid').toggleClass('hidden', me._state.validSignatures.length<1); - this.$el.find('.invalid').toggleClass('hidden', me._state.invalidSignatures.length<1); + this.viewValidList.store.reset(validSignatures); + this.viewInvalidList.store.reset(invalidSignatures); - me.disableEditing(me._state.validSignatures.length>0 || me._state.invalidSignatures.length>0); + this.$el.find('.valid').toggleClass('hidden', !me._state.hasValid); + this.$el.find('.invalid').toggleClass('hidden', !me._state.hasInvalid); + + me.disableEditing(me._state.hasValid || me._state.hasInvalid); }, onSelectSignature: function(picker, item, record, e){ @@ -244,42 +248,61 @@ define([ this._state.ready = true; this.updateSignatures(this.api.asc_getSignatures(), this.api.asc_getRequestSignatures()); - this.showSignatureTooltip(this._state.validSignatures.length>0, this._state.invalidSignatures.length>0); + this.showSignatureTooltip(this._state.hasValid, this._state.hasInvalid); }, showSignatureTooltip: function(hasValid, hasInvalid) { - if (!hasValid && !hasInvalid) return; - - var tipText = (hasInvalid) ? this.txtSignedInvalid : (hasValid ? this.txtSigned : ""); - var me = this, + tip = me._state.tip; + + if (!hasValid && !hasInvalid) { + if (tip && tip.isVisible()) { + tip.close(); + me._state.tip = undefined; + } + return; + } + + var showLink = hasValid || hasInvalid, + tipText = (hasInvalid) ? me.txtSignedInvalid : (hasValid ? me.txtSigned : ""); + + if (tip && tip.isVisible() && (tipText !== tip.text || showLink !== tip.showLink)) { + tip.close(); + me._state.tip = undefined; + } + + if (!me._state.tip) { tip = new Common.UI.SynchronizeTip({ target : PE.getController('RightMenu').getView('RightMenu').btnSignature.btnEl, text : tipText, - showLink: hasValid || hasInvalid, + showLink: showLink, textLink: this.txtContinueEditing, placement: 'left' }); - tip.on({ - 'dontshowclick': function() { - Common.UI.warning({ - title: me.notcriticalErrorTitle, - msg: me.txtEditWarning, - buttons: ['ok', 'cancel'], - primary: 'ok', - callback: function(btn) { - if (btn == 'ok') { - tip.close(); - me.api.asc_RemoveAllSignatures(); + tip.on({ + 'dontshowclick': function() { + Common.UI.warning({ + title: me.notcriticalErrorTitle, + msg: me.txtEditWarning, + buttons: ['ok', 'cancel'], + primary: 'ok', + callback: function(btn) { + if (btn == 'ok') { + tip.close(); + me._state.tip = undefined; + me.api.asc_RemoveAllSignatures(); + } } - } - }); - }, - 'closeclick': function() { - tip.close(); - } - }); - tip.show(); + }); + }, + 'closeclick': function() { + tip.close(); + me._state.tip = undefined; + } + }); + me._state.tip = tip; + tip.show(); + } }, disableEditing: function(disable) { diff --git a/apps/presentationeditor/main/resources/less/rightmenu.less b/apps/presentationeditor/main/resources/less/rightmenu.less index e70ca5ebc..e80606dc1 100644 --- a/apps/presentationeditor/main/resources/less/rightmenu.less +++ b/apps/presentationeditor/main/resources/less/rightmenu.less @@ -229,6 +229,7 @@ button:active:not(.disabled) .btn-change-shape {background-position: -56px - .signature-item { padding: 5px 2px 5px 15px; text-overflow: ellipsis; + min-height: 25px; .name { width: 100%; @@ -248,11 +249,10 @@ button:active:not(.disabled) .btn-change-shape {background-position: -56px - display: inline-block; position: absolute; right: 0; - } - &.requested { - .caret { - margin: 0 15px; + &.nomargin { + margin-top: 0; + margin-bottom: 0; } } } diff --git a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js index 753c0185a..ec674e937 100644 --- a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js +++ b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js @@ -63,11 +63,12 @@ define([ initialize: function () { this._state = { - requestedSignatures: undefined, - validSignatures: undefined, - invalidSignatures: undefined, DisabledEditing: false, - ready: false + ready: false, + hasValid: false, + hasInvalid: false, + hasRequested: false, + tip: undefined }; this._locked = false; @@ -88,7 +89,7 @@ define([ enableKeyEvents: false, itemTemplate: _.template([ '
    ', - '
    ', + '
    ', '
    <%= Common.Utils.String.htmlEncode(name) %>
    ', '
    ' ].join('')) @@ -99,7 +100,7 @@ define([ enableKeyEvents: false, itemTemplate: _.template([ '
    ', - '
    ', + '
    ' + 'nomargin' + '<% } %>">
    ', '
    <%= Common.Utils.String.htmlEncode(name) %>
    ', '
    <%= Common.Utils.String.htmlEncode(date) %>
    ', '
    ' @@ -111,7 +112,7 @@ define([ enableKeyEvents: false, itemTemplate: _.template([ '
    ', - '
    ', + '
    ' + 'nomargin' + '<% } %>">
    ', '
    <%= Common.Utils.String.htmlEncode(name) %>
    ', '
    <%= Common.Utils.String.htmlEncode(date) %>
    ', '
    ' @@ -144,7 +145,7 @@ define([ }, ChangeSettings: function(props) { - if (!this._state.requestedSignatures || !this._state.validSignatures || !this._state.invalidSignatures) + if (!this._state.hasRequested && !this._state.hasValid && !this._state.hasInvalid) this.updateSignatures(this.api.asc_getSignatures(), this.api.asc_getRequestSignatures()); }, @@ -160,36 +161,41 @@ define([ if (!this._state.ready) return; this.updateSignatures(valid, requested); - this.showSignatureTooltip(this._state.validSignatures.length>0, this._state.invalidSignatures.length>0); + this.showSignatureTooltip(this._state.hasValid, this._state.hasInvalid); }, updateSignatures: function(valid, requested){ - var me = this; - me._state.requestedSignatures = []; - me._state.validSignatures = []; - me._state.invalidSignatures = []; + var me = this, + requestedSignatures = [], + validSignatures = [], + invalidSignatures = []; _.each(requested, function(item, index){ - me._state.requestedSignatures.push({name: item.asc_getSigner1(), guid: item.asc_getGuid(), requested: true}); + requestedSignatures.push({name: item.asc_getSigner1(), guid: item.asc_getGuid(), requested: true}); }); _.each(valid, function(item, index){ - var sign = {name: item.asc_getSigner1(), certificateId: item.asc_getId(), guid: item.asc_getGuid(), date: item.asc_getDate(), invisible: !item.asc_getVisible()}; - (item.asc_getValid()==0) ? me._state.validSignatures.push(sign) : me._state.invalidSignatures.push(sign); + var item_date = item.asc_getDate(); + var sign = {name: item.asc_getSigner1(), certificateId: item.asc_getId(), guid: item.asc_getGuid(), date: (!_.isEmpty(item_date)) ? new Date(item_date).toLocaleString() : '', invisible: !item.asc_getVisible()}; + (item.asc_getValid()==0) ? validSignatures.push(sign) : invalidSignatures.push(sign); }); - // me._state.requestedSignatures = [{name: 'Hammish Mitchell', guid: '123', requested: true}, {name: 'Someone Somewhere', guid: '123', requested: true}, {name: 'Mary White', guid: '123', requested: true}, {name: 'John Black', guid: '123', requested: true}]; - // me._state.validSignatures = [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017', invisible: true}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]; - // me._state.invalidSignatures = [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}]; + // requestedSignatures = [{name: 'Hammish Mitchell', guid: '123', requested: true}, {name: 'Someone Somewhere', guid: '123', requested: true}, {name: 'Mary White', guid: '123', requested: true}, {name: 'John Black', guid: '123', requested: true}]; + // validSignatures = [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017', invisible: true}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]; + // invalidSignatures = [{name: 'Mary White', guid: '111', date: '18/05/2017'}, {name: 'John Black', guid: '456', date: '18/05/2017'}]; - this.viewRequestedList.store.reset(me._state.requestedSignatures); - this.viewValidList.store.reset(me._state.validSignatures); - this.viewInvalidList.store.reset(me._state.invalidSignatures); + me._state.hasValid = validSignatures.length>0; + me._state.hasInvalid = invalidSignatures.length>0; + me._state.hasRequested = requestedSignatures.length>0; - this.$el.find('.requested').toggleClass('hidden', me._state.requestedSignatures.length<1); - this.$el.find('.valid').toggleClass('hidden', me._state.validSignatures.length<1); - this.$el.find('.invalid').toggleClass('hidden', me._state.invalidSignatures.length<1); + this.viewRequestedList.store.reset(requestedSignatures); + this.viewValidList.store.reset(validSignatures); + this.viewInvalidList.store.reset(invalidSignatures); - me.disableEditing(me._state.validSignatures.length>0 || me._state.invalidSignatures.length>0); + this.$el.find('.requested').toggleClass('hidden', !me._state.hasRequested); + this.$el.find('.valid').toggleClass('hidden', !me._state.hasValid); + this.$el.find('.invalid').toggleClass('hidden', !me._state.hasInvalid); + + me.disableEditing(me._state.hasValid || me._state.hasInvalid); }, onSelectSignature: function(picker, item, record, e){ @@ -232,7 +238,7 @@ define([ }); } var requested = record.get('requested'), - signed = (this._state.validSignatures.length>0 || this._state.invalidSignatures.length>0); + signed = (this._state.hasValid || this._state.hasInvalid); menu.items[0].setVisible(requested); menu.items[1].setVisible(!requested); menu.items[2].setVisible(requested || !record.get('invisible')); @@ -282,44 +288,63 @@ define([ this._state.ready = true; this.updateSignatures(this.api.asc_getSignatures(), this.api.asc_getRequestSignatures()); - this.showSignatureTooltip(this._state.validSignatures.length>0, this._state.invalidSignatures.length>0, this._state.requestedSignatures.length>0); + this.showSignatureTooltip(this._state.hasValid, this._state.hasInvalid, this._state.hasRequested); }, showSignatureTooltip: function(hasValid, hasInvalid, hasRequested) { - if (!hasValid && !hasInvalid && !hasRequested) return; - - var tipText = (hasInvalid) ? this.txtSignedInvalid : (hasValid ? this.txtSigned : ""); - if (hasRequested) - tipText = this.txtRequestedSignatures + "

    " + tipText; - var me = this, + tip = me._state.tip; + + if (!hasValid && !hasInvalid && !hasRequested) { + if (tip && tip.isVisible()) { + tip.close(); + me._state.tip = undefined; + } + return; + } + + var showLink = hasValid || hasInvalid, + tipText = (hasInvalid) ? me.txtSignedInvalid : (hasValid ? me.txtSigned : ""); + if (hasRequested) + tipText = me.txtRequestedSignatures + "

    " + tipText; + + if (tip && tip.isVisible() && (tipText !== tip.text || showLink !== tip.showLink)) { + tip.close(); + me._state.tip = undefined; + } + + if (!me._state.tip) { tip = new Common.UI.SynchronizeTip({ target : SSE.getController('RightMenu').getView('RightMenu').btnSignature.btnEl, text : tipText, - showLink: hasValid || hasInvalid, + showLink: showLink, textLink: this.txtContinueEditing, placement: 'left' }); - tip.on({ - 'dontshowclick': function() { - Common.UI.warning({ - title: me.notcriticalErrorTitle, - msg: me.txtEditWarning, - buttons: ['ok', 'cancel'], - primary: 'ok', - callback: function(btn) { - if (btn == 'ok') { - tip.close(); - me.api.asc_RemoveAllSignatures(); + tip.on({ + 'dontshowclick': function() { + Common.UI.warning({ + title: me.notcriticalErrorTitle, + msg: me.txtEditWarning, + buttons: ['ok', 'cancel'], + primary: 'ok', + callback: function(btn) { + if (btn == 'ok') { + tip.close(); + me._state.tip = undefined; + me.api.asc_RemoveAllSignatures(); + } } - } - }); - }, - 'closeclick': function() { - tip.close(); - } - }); - tip.show(); + }); + }, + 'closeclick': function() { + tip.close(); + me._state.tip = undefined; + } + }); + me._state.tip = tip; + tip.show(); + } }, disableEditing: function(disable) { diff --git a/apps/spreadsheeteditor/main/resources/less/rightmenu.less b/apps/spreadsheeteditor/main/resources/less/rightmenu.less index 852de385e..36f49d237 100644 --- a/apps/spreadsheeteditor/main/resources/less/rightmenu.less +++ b/apps/spreadsheeteditor/main/resources/less/rightmenu.less @@ -359,6 +359,7 @@ button:active:not(.disabled) .btn-change-shape {background-position: -56px - .signature-item { padding: 5px 2px 5px 15px; text-overflow: ellipsis; + min-height: 25px; .name { width: 100%; @@ -378,11 +379,10 @@ button:active:not(.disabled) .btn-change-shape {background-position: -56px - display: inline-block; position: absolute; right: 0; - } - &.requested { - .caret { - margin: 0 15px; + &.nomargin { + margin-top: 0; + margin-bottom: 0; } } } From 64ae0da22b80e2dc09dabef67f3c3205f0c239cd Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 22 Nov 2017 11:41:47 +0300 Subject: [PATCH 39/86] [DE][SSE] Added context menu for signatures. --- apps/common/main/lib/component/Mixtbar.js | 2 +- .../main/app/view/DocumentHolder.js | 84 +++++++++++++++++-- .../main/app/view/SignatureSettings.js | 2 +- apps/documenteditor/main/locale/en.json | 4 + .../main/app/controller/DocumentHolder.js | 78 +++++++++++++++-- .../main/app/view/DocumentHolder.js | 24 +++++- .../main/app/view/SignatureSettings.js | 2 +- apps/spreadsheeteditor/main/locale/en.json | 4 + 8 files changed, 184 insertions(+), 16 deletions(-) diff --git a/apps/common/main/lib/component/Mixtbar.js b/apps/common/main/lib/component/Mixtbar.js index cbee01232..8b01fcf06 100644 --- a/apps/common/main/lib/component/Mixtbar.js +++ b/apps/common/main/lib/component/Mixtbar.js @@ -57,7 +57,7 @@ define([ if ( sv || opts == 'right' ) { $boxTabs.animate({scrollLeft: opts == 'left' ? sv - 100 : sv + 100}, 200); } - } + }; function onTabDblclick(e) { this.fireEvent('change:compact', [$(e.target).data('tab')]); diff --git a/apps/documenteditor/main/app/view/DocumentHolder.js b/apps/documenteditor/main/app/view/DocumentHolder.js index f4c2ea216..e30c4778c 100644 --- a/apps/documenteditor/main/app/view/DocumentHolder.js +++ b/apps/documenteditor/main/app/view/DocumentHolder.js @@ -80,7 +80,6 @@ define([ me._currentMathObj = undefined; me._currentParaObjDisabled = false; me._isDisabled = false; - me._currentSignGuid = null; var showPopupMenu = function(menu, value, event, docElement, eOpts){ if (!_.isUndefined(menu) && menu !== null){ @@ -1814,14 +1813,39 @@ define([ caption: me.addCommentText }).on('click', _.bind(me.addComment, me)); + var menuSignatureViewSign = new Common.UI.MenuItem({caption: this.strSign, value: 0 }).on('click', _.bind(me.onSignatureClick, me)); + var menuSignatureDetails = new Common.UI.MenuItem({caption: this.strDetails, value: 1 }).on('click', _.bind(me.onSignatureClick, me)); + var menuSignatureViewSetup = new Common.UI.MenuItem({caption: this.strSetup, value: 2 }).on('click', _.bind(me.onSignatureClick, me)); + var menuSignatureRemove = new Common.UI.MenuItem({caption: this.strDelete, value: 3 }).on('click', _.bind(me.onSignatureClick, me)); + var menuViewSignSeparator = new Common.UI.MenuItem({caption: '--' }); + this.viewModeMenu = new Common.UI.Menu({ initMenu: function (value) { - var isInChart = (value.imgProps && value.imgProps.value && !_.isNull(value.imgProps.value.get_ChartProperties())); + var isInChart = (value.imgProps && value.imgProps.value && !_.isNull(value.imgProps.value.get_ChartProperties())), + signGuid = (value.imgProps && value.imgProps.value && me.mode.canProtect) ? value.imgProps.value.get_SignatureGuid() : undefined, + signProps = (signGuid) ? me.api.asc_getLineInfo(signGuid) : null, + isInSign = !!signProps && me._canProtect, + canComment = !isInChart && me.api.can_AddQuotedComment() !== false && me.mode.canCoAuthoring && me.mode.canComments && !me._isDisabled; menuViewUndo.setVisible(me.mode.canCoAuthoring && me.mode.canComments && !me._isDisabled); menuViewUndo.setDisabled(!me.api.asc_getCanUndo() && !me._isDisabled); - menuViewCopySeparator.setVisible(!isInChart && me.api.can_AddQuotedComment() !== false && me.mode.canCoAuthoring && me.mode.canComments && !me._isDisabled); - menuViewAddComment.setVisible(!isInChart && me.api.can_AddQuotedComment() !== false && me.mode.canCoAuthoring && me.mode.canComments && !me._isDisabled); + menuViewCopySeparator.setVisible(isInSign); + + var isRequested = (signProps) ? signProps.asc_getRequested() : false; + menuSignatureViewSign.setVisible(isInSign && isRequested); + menuSignatureDetails.setVisible(isInSign && !isRequested); + menuSignatureViewSetup.setVisible(isInSign); + menuSignatureRemove.setVisible(isInSign && !isRequested); + menuViewSignSeparator.setVisible(canComment); + + if (isInSign) { + menuSignatureViewSign.cmpEl.attr('data-value', signGuid); // sign + menuSignatureDetails.cmpEl.attr('data-value', signProps.asc_getCertificateId()); // view certificate + menuSignatureViewSetup.cmpEl.attr('data-value', signGuid); // view signature settings + menuSignatureRemove.cmpEl.attr('data-value', signGuid); + } + + menuViewAddComment.setVisible(canComment); menuViewAddComment.setDisabled(value.paraProps && value.paraProps.locked === true); var cancopy = me.api && me.api.can_CopyCut(); @@ -1831,6 +1855,11 @@ define([ menuViewCopy, menuViewUndo, menuViewCopySeparator, + menuSignatureViewSign, + menuSignatureDetails, + menuSignatureViewSetup, + menuSignatureRemove, + menuViewSignSeparator, menuViewAddComment ] }).on('hide:after', function (menu, e, isFromInputControl) { @@ -2150,6 +2179,10 @@ define([ value : 'cut' }).on('click', _.bind(me.onCutCopyPaste, me)); + var menuSignatureEditSign = new Common.UI.MenuItem({caption: this.strSign, value: 0 }).on('click', _.bind(me.onSignatureClick, me)); + var menuSignatureEditSetup = new Common.UI.MenuItem({caption: this.strSetup, value: 2 }).on('click', _.bind(me.onSignatureClick, me)); + var menuEditSignSeparator = new Common.UI.MenuItem({ caption: '--' }); + this.pictureMenu = new Common.UI.Menu({ initMenu: function(value){ if (_.isUndefined(value.imgProps)) @@ -2210,7 +2243,7 @@ define([ me.menuOriginalSize.setVisible(_.isNull(value.imgProps.value.get_ChartProperties()) && _.isNull(value.imgProps.value.get_ShapeProperties()) && !onlyCommonProps); - me.pictureMenu.items[7].setVisible(menuChartEdit.isVisible() || me.menuOriginalSize.isVisible()); + me.pictureMenu.items[10].setVisible(menuChartEdit.isVisible() || me.menuOriginalSize.isVisible()); var islocked = value.imgProps.locked || (value.headerProps!==undefined && value.headerProps.locked); if (menuChartEdit.isVisible()) @@ -2233,12 +2266,26 @@ define([ menuImgCopy.setDisabled(!cancopy); menuImgCut.setDisabled(islocked || !cancopy); menuImgPaste.setDisabled(islocked); + + var signGuid = (value.imgProps && value.imgProps.value && me.mode.canProtect) ? value.imgProps.value.get_SignatureGuid() : undefined, + isInSign = (signGuid !== undefined); + menuSignatureEditSign.setVisible(isInSign); + menuSignatureEditSetup.setVisible(isInSign); + menuEditSignSeparator.setVisible(isInSign); + + if (isInSign) { + menuSignatureEditSign.cmpEl.attr('data-value', signGuid); // sign + menuSignatureEditSetup.cmpEl.attr('data-value', signGuid); // edit signature settings + } }, items: [ menuImgCut, menuImgCopy, menuImgPaste, { caption: '--' }, + menuSignatureEditSign, + menuSignatureEditSetup, + menuEditSignSeparator, menuImageArrange, menuImageAlign, me.menuImageWrap, @@ -3298,13 +3345,32 @@ define([ } }, + onSignatureClick: function(menu, item) { + var datavalue = item.cmpEl.attr('data-value'); + switch (item.value) { + case 0: + Common.NotificationCenter.trigger('protect:sign', datavalue); //guid + break; + case 1: + this.api.asc_ViewCertificate(datavalue); //certificate id + break; + case 2: + Common.NotificationCenter.trigger('protect:signature', 'visible', !this._isDisabled, datavalue);//guid, can edit settings for requested signature + break; + case 3: + this.api.asc_RemoveSignature(datavalue); //guid + break; + } + }, + focus: function() { var me = this; _.defer(function(){ me.cmpEl.focus(); }, 50); }, - SetDisabled: function(state) { + SetDisabled: function(state, canProtect) { this._isDisabled = state; + this._canProtect = canProtect; }, alignmentText : 'Alignment', @@ -3476,7 +3542,11 @@ define([ txtDeleteChars: 'Delete enclosing characters', txtDeleteCharsAndSeparators: 'Delete enclosing characters and separators', txtKeepTextOnly: 'Keep text only', - textUndo: 'Undo' + textUndo: 'Undo', + strSign: 'Sign', + strDetails: 'Signature Details', + strSetup: 'Signature Setup', + strDelete: 'Remove Signature' }, DE.Views.DocumentHolder || {})); }); \ No newline at end of file diff --git a/apps/documenteditor/main/app/view/SignatureSettings.js b/apps/documenteditor/main/app/view/SignatureSettings.js index 5f7f9375f..265249083 100644 --- a/apps/documenteditor/main/app/view/SignatureSettings.js +++ b/apps/documenteditor/main/app/view/SignatureSettings.js @@ -358,7 +358,7 @@ define([ DE.getController('Toolbar').DisableToolbar(disable, disable); DE.getController('Statusbar').getView('Statusbar').SetDisabled(disable); DE.getController('Common.Controllers.ReviewChanges').SetDisabled(disable); - DE.getController('DocumentHolder').getView().SetDisabled(disable); + DE.getController('DocumentHolder').getView().SetDisabled(disable, true); var leftMenu = DE.getController('LeftMenu').leftMenu; leftMenu.btnComments.setDisabled(disable); diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index 627b00928..7193178fd 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -945,6 +945,10 @@ "DE.Views.DocumentHolder.txtUngroup": "Ungroup", "DE.Views.DocumentHolder.updateStyleText": "Update %1 style", "DE.Views.DocumentHolder.vertAlignText": "Vertical Alignment", + "DE.Views.DocumentHolder.strSign": "Sign", + "DE.Views.DocumentHolder.strDetails": "Signature Details", + "DE.Views.DocumentHolder.strSetup": "Signature Setup", + "DE.Views.DocumentHolder.strDelete": "Remove Signature", "DE.Views.DropcapSettingsAdvanced.cancelButtonText": "Cancel", "DE.Views.DropcapSettingsAdvanced.okButtonText": "Ok", "DE.Views.DropcapSettingsAdvanced.strBorders": "Borders & Fill", diff --git a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js index db8e16580..8cbd59ab0 100644 --- a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js +++ b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js @@ -190,10 +190,16 @@ define([ view.mnuChartEdit.on('click', _.bind(me.onChartEdit, me)); view.mnuImgAdvanced.on('click', _.bind(me.onImgAdvanced, me)); view.textInShapeMenu.on('render:after', _.bind(me.onTextInShapeAfterRender, me)); + view.menuSignatureEditSign.on('click', _.bind(me.onSignatureClick, me)); + view.menuSignatureEditSetup.on('click', _.bind(me.onSignatureClick, me)); } else { view.menuViewCopy.on('click', _.bind(me.onCopyPaste, me)); view.menuViewUndo.on('click', _.bind(me.onUndo, me)); view.menuViewAddComment.on('click', _.bind(me.onAddComment, me)); + view.menuSignatureViewSign.on('click', _.bind(me.onSignatureClick, me)); + view.menuSignatureDetails.on('click', _.bind(me.onSignatureClick, me)); + view.menuSignatureViewSetup.on('click', _.bind(me.onSignatureClick, me)); + view.menuSignatureRemove.on('click', _.bind(me.onSignatureClick, me)); } var documentHolderEl = view.cmpEl; @@ -1268,7 +1274,8 @@ define([ if (!showMenu && !documentHolder.imgMenu.isVisible()) return; isimagemenu = isshapemenu = ischartmenu = false; - var has_chartprops = false; + var has_chartprops = false, + signGuid; var selectedObjects = this.api.asc_getGraphicObjectProps(); for (var i = 0; i < selectedObjects.length; i++) { if (selectedObjects[i].asc_getObjectType() == Asc.c_oAscTypeSelectElement.Image) { @@ -1290,6 +1297,8 @@ define([ documentHolder.mnuImgAdvanced.imageInfo = elValue; isimagemenu = true; } + if (this.permissions.canProtect) + signGuid = elValue.get_SignatureGuid(); } } @@ -1303,6 +1312,16 @@ define([ documentHolder.pmiImgPaste.setDisabled(isObjLocked); documentHolder.mnuImgAdvanced.setVisible(isimagemenu && !isshapemenu && !ischartmenu); documentHolder.mnuImgAdvanced.setDisabled(isObjLocked); + + var isInSign = (signGuid !== undefined); + documentHolder.menuSignatureEditSign.setVisible(isInSign); + documentHolder.menuSignatureEditSetup.setVisible(isInSign); + documentHolder.menuEditSignSeparator.setVisible(isInSign); + if (isInSign) { + documentHolder.menuSignatureEditSign.cmpEl.attr('data-value', signGuid); // sign + documentHolder.menuSignatureEditSetup.cmpEl.attr('data-value', signGuid); // edit signature settings + } + if (showMenu) this.showPopupMenu(documentHolder.imgMenu, {}, event); documentHolder.mnuShapeSeparator.setVisible(documentHolder.mnuShapeAdvanced.isVisible() || documentHolder.mnuChartEdit.isVisible() || documentHolder.mnuImgAdvanced.isVisible()); } else if (istextshapemenu || istextchartmenu) { @@ -1491,17 +1510,47 @@ define([ isTableLocked = cellinfo.asc_getLockedTable()===true, commentsController = this.getApplication().getController('Common.Controllers.Comments'), iscellmenu = (seltype==Asc.c_oAscSelectionType.RangeCells) && !this.permissions.isEditMailMerge && !this.permissions.isEditDiagram, - iscelledit = this.api.isCellEdited; + iscelledit = this.api.isCellEdited, + isimagemenu = (seltype==Asc.c_oAscSelectionType.RangeImage) && !this.permissions.isEditMailMerge && !this.permissions.isEditDiagram, + signGuid; if (!documentHolder.viewModeMenu) documentHolder.createDelayedElementsViewer(); if (!showMenu && !documentHolder.viewModeMenu.isVisible()) return; + if (isimagemenu && this.permissions.canProtect) { + var selectedObjects = this.api.asc_getGraphicObjectProps(); + for (var i = 0; i < selectedObjects.length; i++) { + if (selectedObjects[i].asc_getObjectType() == Asc.c_oAscTypeSelectElement.Image) { + signGuid = selectedObjects[i].asc_getObjectValue().get_SignatureGuid(); + } + } + } + + var signProps = (signGuid) ? this.api.asc_getLineInfo(signGuid) : null, + isInSign = !!signProps && this._canProtect, + canComment = iscellmenu && !iscelledit && this.permissions.canCoAuthoring && this.permissions.canComments && !this._isDisabled; + documentHolder.menuViewUndo.setVisible(this.permissions.canCoAuthoring && this.permissions.canComments && !this._isDisabled); documentHolder.menuViewUndo.setDisabled(!this.api.asc_getCanUndo() && !this._isDisabled); - documentHolder.menuViewCopySeparator.setVisible(iscellmenu && !iscelledit && this.permissions.canCoAuthoring && this.permissions.canComments && !this._isDisabled); - documentHolder.menuViewAddComment.setVisible(iscellmenu && !iscelledit && this.permissions.canCoAuthoring && this.permissions.canComments && !this._isDisabled); + documentHolder.menuViewCopySeparator.setVisible(isInSign); + + var isRequested = (signProps) ? signProps.asc_getRequested() : false; + documentHolder.menuSignatureViewSign.setVisible(isInSign && isRequested); + documentHolder.menuSignatureDetails.setVisible(isInSign && !isRequested); + documentHolder.menuSignatureViewSetup.setVisible(isInSign); + documentHolder.menuSignatureRemove.setVisible(isInSign && !isRequested); + documentHolder.menuViewSignSeparator.setVisible(canComment); + + if (isInSign) { + documentHolder.menuSignatureViewSign.cmpEl.attr('data-value', signGuid); // sign + documentHolder.menuSignatureDetails.cmpEl.attr('data-value', signProps.asc_getCertificateId()); // view certificate + documentHolder.menuSignatureViewSetup.cmpEl.attr('data-value', signGuid); // view signature settings + documentHolder.menuSignatureRemove.cmpEl.attr('data-value', signGuid); + } + + documentHolder.menuViewAddComment.setVisible(canComment); documentHolder.setMenuItemCommentCaptionMode(documentHolder.menuViewAddComment, cellinfo.asc_getComments().length < 1, this.permissions.canEditComments); commentsController && commentsController.blockPopover(true); documentHolder.menuViewAddComment.setDisabled(isCellLocked || isTableLocked); @@ -2438,8 +2487,27 @@ define([ _conf && view.paraBulletsPicker.selectRecord(_conf.rec, true); }, - SetDisabled: function(state) { + onSignatureClick: function(menu, item) { + var datavalue = item.cmpEl.attr('data-value'); + switch (item.value) { + case 0: + Common.NotificationCenter.trigger('protect:sign', datavalue); //guid + break; + case 1: + this.api.asc_ViewCertificate(datavalue); //certificate id + break; + case 2: + Common.NotificationCenter.trigger('protect:signature', 'visible', !this._isDisabled, datavalue);//guid, can edit settings for requested signature + break; + case 3: + this.api.asc_RemoveSignature(datavalue); //guid + break; + } + }, + + SetDisabled: function(state, canProtect) { this._isDisabled = state; + this._canProtect = canProtect; }, guestText : 'Guest', diff --git a/apps/spreadsheeteditor/main/app/view/DocumentHolder.js b/apps/spreadsheeteditor/main/app/view/DocumentHolder.js index 000161939..02ea139ef 100644 --- a/apps/spreadsheeteditor/main/app/view/DocumentHolder.js +++ b/apps/spreadsheeteditor/main/app/view/DocumentHolder.js @@ -107,11 +107,22 @@ define([ caption: me.txtAddComment }); + me.menuSignatureViewSign = new Common.UI.MenuItem({caption: this.strSign, value: 0 }); + me.menuSignatureDetails = new Common.UI.MenuItem({caption: this.strDetails, value: 1 }); + me.menuSignatureViewSetup = new Common.UI.MenuItem({caption: this.strSetup, value: 2 }); + me.menuSignatureRemove = new Common.UI.MenuItem({caption: this.strDelete, value: 3 }); + me.menuViewSignSeparator = new Common.UI.MenuItem({caption: '--' }); + this.viewModeMenu = new Common.UI.Menu({ items: [ me.menuViewCopy, me.menuViewUndo, me.menuViewCopySeparator, + me.menuSignatureViewSign, + me.menuSignatureDetails, + me.menuSignatureViewSetup, + me.menuSignatureRemove, + me.menuViewSignSeparator, me.menuViewAddComment ] }); @@ -474,12 +485,19 @@ define([ value : 'paste' }); + me.menuSignatureEditSign = new Common.UI.MenuItem({caption: this.strSign, value: 0 }); + me.menuSignatureEditSetup = new Common.UI.MenuItem({caption: this.strSetup, value: 2 }); + me.menuEditSignSeparator = new Common.UI.MenuItem({ caption: '--' }); + this.imgMenu = new Common.UI.Menu({ items: [ me.pmiImgCut, me.pmiImgCopy, me.pmiImgPaste, {caption: '--'}, + me.menuSignatureEditSign, + me.menuSignatureEditSetup, + me.menuEditSignSeparator, { caption : this.textArrangeFront, iconCls : 'mnu-arrange-front', @@ -788,7 +806,11 @@ define([ advancedImgText: 'Image Advanced Settings', textNone: 'None', bulletsText: 'Bullets and Numbering', - textUndo: 'Undo' + textUndo: 'Undo', + strSign: 'Sign', + strDetails: 'Signature Details', + strSetup: 'Signature Setup', + strDelete: 'Remove Signature' }, SSE.Views.DocumentHolder || {})); }); \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js index ec674e937..7618382e3 100644 --- a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js +++ b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js @@ -358,7 +358,7 @@ define([ SSE.getController('Toolbar').DisableToolbar(disable, disable); SSE.getController('Statusbar').SetDisabled(disable); SSE.getController('Common.Controllers.ReviewChanges').SetDisabled(disable); - SSE.getController('DocumentHolder').SetDisabled(disable); + SSE.getController('DocumentHolder').SetDisabled(disable, true); var leftMenu = SSE.getController('LeftMenu').leftMenu; leftMenu.btnComments.setDisabled(disable); diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json index 4f4c2f1aa..128b5a678 100644 --- a/apps/spreadsheeteditor/main/locale/en.json +++ b/apps/spreadsheeteditor/main/locale/en.json @@ -1105,6 +1105,10 @@ "SSE.Views.DocumentHolder.txtUngroup": "Ungroup", "SSE.Views.DocumentHolder.txtWidth": "Width", "SSE.Views.DocumentHolder.vertAlignText": "Vertical Alignment", + "SSE.Views.DocumentHolder.strSign": "Sign", + "SSE.Views.DocumentHolder.strDetails": "Signature Details", + "SSE.Views.DocumentHolder.strSetup": "Signature Setup", + "SSE.Views.DocumentHolder.strDelete": "Remove Signature", "SSE.Views.FileMenu.btnBackCaption": "Go to Documents", "SSE.Views.FileMenu.btnCloseMenuCaption": "Close Menu", "SSE.Views.FileMenu.btnCreateNewCaption": "Create New", From dbc71821aedc82904480896b45d9682ca39130be Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Thu, 23 Nov 2017 14:29:41 +0300 Subject: [PATCH 40/86] Refactoring contex menu for signature. --- apps/common/main/lib/controller/Protection.js | 7 ------- apps/documenteditor/main/app/view/DocumentHolder.js | 8 ++++---- .../main/app/controller/DocumentHolder.js | 8 ++++---- 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/apps/common/main/lib/controller/Protection.js b/apps/common/main/lib/controller/Protection.js index a0e07a6c4..0bde39832 100644 --- a/apps/common/main/lib/controller/Protection.js +++ b/apps/common/main/lib/controller/Protection.js @@ -204,13 +204,6 @@ define([ win.show(); - // var props = new AscCommon.asc_CSignatureLine(); - // props.asc_setSigner1("s1"); - // props.asc_setSigner2("s2"); - // props.asc_setEmail('email'); - // props.asc_setInstructions('instructions'); - // props.asc_setShowDate(true); - if (guid) win.setSettings(this.api.asc_getSignatureSetup(guid)); }, diff --git a/apps/documenteditor/main/app/view/DocumentHolder.js b/apps/documenteditor/main/app/view/DocumentHolder.js index e30c4778c..58081844e 100644 --- a/apps/documenteditor/main/app/view/DocumentHolder.js +++ b/apps/documenteditor/main/app/view/DocumentHolder.js @@ -1822,8 +1822,8 @@ define([ this.viewModeMenu = new Common.UI.Menu({ initMenu: function (value) { var isInChart = (value.imgProps && value.imgProps.value && !_.isNull(value.imgProps.value.get_ChartProperties())), - signGuid = (value.imgProps && value.imgProps.value && me.mode.canProtect) ? value.imgProps.value.get_SignatureGuid() : undefined, - signProps = (signGuid) ? me.api.asc_getLineInfo(signGuid) : null, + signGuid = (value.imgProps && value.imgProps.value && me.mode.canProtect) ? value.imgProps.value.asc_getSignatureId() : undefined, + signProps = (signGuid) ? me.api.asc_getSignatureSetup(signGuid) : null, isInSign = !!signProps && me._canProtect, canComment = !isInChart && me.api.can_AddQuotedComment() !== false && me.mode.canCoAuthoring && me.mode.canComments && !me._isDisabled; @@ -1840,7 +1840,7 @@ define([ if (isInSign) { menuSignatureViewSign.cmpEl.attr('data-value', signGuid); // sign - menuSignatureDetails.cmpEl.attr('data-value', signProps.asc_getCertificateId()); // view certificate + menuSignatureDetails.cmpEl.attr('data-value', signProps.asc_getId()); // view certificate menuSignatureViewSetup.cmpEl.attr('data-value', signGuid); // view signature settings menuSignatureRemove.cmpEl.attr('data-value', signGuid); } @@ -2267,7 +2267,7 @@ define([ menuImgCut.setDisabled(islocked || !cancopy); menuImgPaste.setDisabled(islocked); - var signGuid = (value.imgProps && value.imgProps.value && me.mode.canProtect) ? value.imgProps.value.get_SignatureGuid() : undefined, + var signGuid = (value.imgProps && value.imgProps.value && me.mode.canProtect) ? value.imgProps.value.asc_getSignatureId() : undefined, isInSign = (signGuid !== undefined); menuSignatureEditSign.setVisible(isInSign); menuSignatureEditSetup.setVisible(isInSign); diff --git a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js index 8cbd59ab0..bdb29ff9c 100644 --- a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js +++ b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js @@ -1298,7 +1298,7 @@ define([ isimagemenu = true; } if (this.permissions.canProtect) - signGuid = elValue.get_SignatureGuid(); + signGuid = elValue.asc_getSignatureId(); } } @@ -1523,12 +1523,12 @@ define([ var selectedObjects = this.api.asc_getGraphicObjectProps(); for (var i = 0; i < selectedObjects.length; i++) { if (selectedObjects[i].asc_getObjectType() == Asc.c_oAscTypeSelectElement.Image) { - signGuid = selectedObjects[i].asc_getObjectValue().get_SignatureGuid(); + signGuid = selectedObjects[i].asc_getObjectValue().asc_getSignatureId(); } } } - var signProps = (signGuid) ? this.api.asc_getLineInfo(signGuid) : null, + var signProps = (signGuid) ? this.api.asc_getSignatureSetup(signGuid) : null, isInSign = !!signProps && this._canProtect, canComment = iscellmenu && !iscelledit && this.permissions.canCoAuthoring && this.permissions.canComments && !this._isDisabled; @@ -1545,7 +1545,7 @@ define([ if (isInSign) { documentHolder.menuSignatureViewSign.cmpEl.attr('data-value', signGuid); // sign - documentHolder.menuSignatureDetails.cmpEl.attr('data-value', signProps.asc_getCertificateId()); // view certificate + documentHolder.menuSignatureDetails.cmpEl.attr('data-value', signProps.asc_getId()); // view certificate documentHolder.menuSignatureViewSetup.cmpEl.attr('data-value', signGuid); // view signature settings documentHolder.menuSignatureRemove.cmpEl.attr('data-value', signGuid); } From 16c1af8a2b173371c5e0606be30fb99fbcef4437 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Thu, 23 Nov 2017 16:29:05 +0300 Subject: [PATCH 41/86] Refactoring signatures: enable adding invisible signature when document is signed. --- apps/common/main/lib/controller/Protection.js | 17 +++++++++-------- .../common/main/lib/controller/ReviewChanges.js | 8 ++++++-- apps/common/main/lib/view/Protection.js | 12 ++++++++---- .../main/app/controller/RightMenu.js | 3 --- .../main/app/controller/RightMenu.js | 2 -- .../main/app/controller/RightMenu.js | 3 --- 6 files changed, 23 insertions(+), 22 deletions(-) diff --git a/apps/common/main/lib/controller/Protection.js b/apps/common/main/lib/controller/Protection.js index 0bde39832..99e8ac821 100644 --- a/apps/common/main/lib/controller/Protection.js +++ b/apps/common/main/lib/controller/Protection.js @@ -74,7 +74,7 @@ define([ this._state = {}; Common.NotificationCenter.on('app:ready', this.onAppReady.bind(this)); - Common.NotificationCenter.on('api:disconnect', _.bind(this.SetDisabled, this)); + Common.NotificationCenter.on('api:disconnect', _.bind(this.onCoAuthoringDisconnect, this)); }, setConfig: function (data, api) { this.setApi(api); @@ -96,7 +96,7 @@ define([ this.api.asc_registerCallback('asc_onUpdateSignatures', _.bind(this.onApiUpdateSignatures, this)); } } - this.api.asc_registerCallback('asc_onCoAuthoringDisconnect',_.bind(this.SetDisabled, this)); + this.api.asc_registerCallback('asc_onCoAuthoringDisconnect',_.bind(this.onCoAuthoringDisconnect, this)); } }, @@ -114,8 +114,8 @@ define([ this.view && this.view.onDocumentPassword(hasPassword); }, - SetDisabled: function(state) { - this.view && this.view.SetDisabled(state); + SetDisabled: function(state, canProtect) { + this.view && this.view.SetDisabled(state, canProtect); }, onPasswordClick: function(btn, opts){ @@ -148,9 +148,6 @@ define([ }, onAppReady: function (config) { - var me = this; - // this.onApiUpdateSignatures([{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}], [{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]); - // this.onDocumentPassword(true); }, addPassword: function() { @@ -244,7 +241,11 @@ define([ }, onApiUpdateSignatures: function(valid, requested){ - this.SetDisabled(valid && valid.length>0); + this.SetDisabled(valid && valid.length>0, true);// can add invisible signature + }, + + onCoAuthoringDisconnect: function() { + this.SetDisabled(true); } }, Common.Controllers.Protection || {})); diff --git a/apps/common/main/lib/controller/ReviewChanges.js b/apps/common/main/lib/controller/ReviewChanges.js index bbd021515..d7188a89b 100644 --- a/apps/common/main/lib/controller/ReviewChanges.js +++ b/apps/common/main/lib/controller/ReviewChanges.js @@ -94,7 +94,7 @@ define([ Common.NotificationCenter.on('reviewchanges:turn', this.onTurnPreview.bind(this)); Common.NotificationCenter.on('spelling:turn', this.onTurnSpelling.bind(this)); Common.NotificationCenter.on('app:ready', this.onAppReady.bind(this)); - Common.NotificationCenter.on('api:disconnect', _.bind(this.SetDisabled, this)); + Common.NotificationCenter.on('api:disconnect', _.bind(this.onCoAuthoringDisconnect, this)); }, setConfig: function (data, api) { this.setApi(api); @@ -111,7 +111,7 @@ define([ this.api.asc_registerCallback('asc_onShowRevisionsChange', _.bind(this.onApiShowChange, this)); this.api.asc_registerCallback('asc_onUpdateRevisionsChangesPosition', _.bind(this.onApiUpdateChangePosition, this)); } - this.api.asc_registerCallback('asc_onCoAuthoringDisconnect',_.bind(this.SetDisabled, this)); + this.api.asc_registerCallback('asc_onCoAuthoringDisconnect',_.bind(this.onCoAuthoringDisconnect, this)); } }, @@ -626,6 +626,10 @@ define([ })).show(); }, + onCoAuthoringDisconnect: function() { + this.SetDisabled(true); + }, + textInserted: 'Inserted:', textDeleted: 'Deleted:', textParaInserted: 'Paragraph Inserted ', diff --git a/apps/common/main/lib/view/Protection.js b/apps/common/main/lib/view/Protection.js index f7859644d..16f55fb20 100644 --- a/apps/common/main/lib/view/Protection.js +++ b/apps/common/main/lib/view/Protection.js @@ -189,7 +189,8 @@ define([ }, { caption: me.txtSignatureLine, - value: 'visible' + value: 'visible', + disabled: me._state.disabled } ] }) @@ -265,14 +266,17 @@ define([ } }, - SetDisabled: function (state) { + SetDisabled: function (state, canProtect) { this._state.disabled = state; this.btnsInvisibleSignature && this.btnsInvisibleSignature.forEach(function(button) { if ( button ) { - button.setDisabled(state); + button.setDisabled(state && !canProtect); } }, this); - this.btnSignature && this.btnSignature.setDisabled(state); + if (this.btnSignature && this.btnSignature.menu) { + this.btnSignature.menu.items && this.btnSignature.menu.items[1].setDisabled(state); // disable adding signature line + this.btnSignature.setDisabled(state && !canProtect); // disable adding any signature + } this.btnsAddPwd.concat(this.btnsDelPwd, this.btnsChangePwd).forEach(function(button) { if ( button ) { button.setDisabled(state); diff --git a/apps/documenteditor/main/app/controller/RightMenu.js b/apps/documenteditor/main/app/controller/RightMenu.js index 0019a658e..e8f72db52 100644 --- a/apps/documenteditor/main/app/controller/RightMenu.js +++ b/apps/documenteditor/main/app/controller/RightMenu.js @@ -281,9 +281,6 @@ define([ this.onFocusObject(selectedElements, !Common.localStorage.getBool("de-hide-right-settings")); } } - - //remove after sdk send event - // this.onApiUpdateSignatures([{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]); }, onDoubleClickOnObject: function(obj) { diff --git a/apps/presentationeditor/main/app/controller/RightMenu.js b/apps/presentationeditor/main/app/controller/RightMenu.js index c65425414..6b7c8e5d2 100644 --- a/apps/presentationeditor/main/app/controller/RightMenu.js +++ b/apps/presentationeditor/main/app/controller/RightMenu.js @@ -289,8 +289,6 @@ define([ this.onFocusObject(selectedElements, !Common.localStorage.getBool("pe-hide-right-settings")); } } - //remove after sdk send event - // this.onApiUpdateSignatures([{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]); }, onDoubleClickOnObject: function(obj) { diff --git a/apps/spreadsheeteditor/main/app/controller/RightMenu.js b/apps/spreadsheeteditor/main/app/controller/RightMenu.js index 743acb127..ef5aa9818 100644 --- a/apps/spreadsheeteditor/main/app/controller/RightMenu.js +++ b/apps/spreadsheeteditor/main/app/controller/RightMenu.js @@ -291,9 +291,6 @@ define([ this.rightmenu.shapeSettings.createDelayedElements(); this.onSelectionChanged(this.api.asc_getCellInfo()); } - - //remove after sdk send event - // this.onApiUpdateSignatures([{name: 'Hammish Mitchell', guid: '123', date: '18/05/2017'}, {name: 'Someone Somewhere', guid: '345', date: '18/05/2017'}]); }, onDoubleClickOnObject: function(obj) { From 26aa0afc45f6949088290df81bc925efaf5266b2 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 24 Nov 2017 14:47:48 +0300 Subject: [PATCH 42/86] Signature refactoring. --- apps/common/main/lib/view/Protection.js | 6 +++--- apps/common/main/resources/less/toolbar.less | 2 ++ apps/documenteditor/main/app/view/DocumentHolder.js | 6 +++--- .../spreadsheeteditor/main/app/controller/DocumentHolder.js | 6 +++--- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/apps/common/main/lib/view/Protection.js b/apps/common/main/lib/view/Protection.js index 16f55fb20..b66853b11 100644 --- a/apps/common/main/lib/view/Protection.js +++ b/apps/common/main/lib/view/Protection.js @@ -119,14 +119,14 @@ define([ if ( this.appConfig.isDesktopApp && this.appConfig.isOffline ) { this.btnAddPwd = new Common.UI.Button({ cls: 'btn-toolbar x-huge icon-top', - iconCls: 'review-prev', + iconCls: 'btn-ic-protect', caption: this.txtEncrypt }); this.btnsAddPwd.push(this.btnAddPwd); this.btnPwd = new Common.UI.Button({ cls: 'btn-toolbar x-huge icon-top', - iconCls: 'btn-ic-reviewview', + iconCls: 'btn-ic-protect', caption: this.txtEncrypt, menu: true, visible: false @@ -135,7 +135,7 @@ define([ if (this.appConfig.canProtect) { this.btnSignature = new Common.UI.Button({ cls: 'btn-toolbar x-huge icon-top', - iconCls: 'btn-ic-reviewview', + iconCls: 'btn-ic-signature', caption: this.txtSignature, menu: (this.appPrefix !== 'pe-') }); diff --git a/apps/common/main/resources/less/toolbar.less b/apps/common/main/resources/less/toolbar.less index 5b02b5eff..20e3e8246 100644 --- a/apps/common/main/resources/less/toolbar.less +++ b/apps/common/main/resources/less/toolbar.less @@ -275,6 +275,8 @@ .button-normal-icon(~'x-huge .btn-ic-docspell', 12, @toolbar-big-icon-size); .button-normal-icon(~'x-huge .btn-ic-review', 13, @toolbar-big-icon-size); .button-normal-icon(~'x-huge .btn-ic-reviewview', 30, @toolbar-big-icon-size); +.button-normal-icon(~'x-huge .btn-ic-protect', 35, @toolbar-big-icon-size); +.button-normal-icon(~'x-huge .btn-ic-signature', 36, @toolbar-big-icon-size); .button-normal-icon(review-save, 14, @toolbar-big-icon-size); .button-normal-icon(review-deny, 15, @toolbar-big-icon-size); .button-normal-icon(review-next, 16, @toolbar-big-icon-size); diff --git a/apps/documenteditor/main/app/view/DocumentHolder.js b/apps/documenteditor/main/app/view/DocumentHolder.js index 58081844e..4aefe7708 100644 --- a/apps/documenteditor/main/app/view/DocumentHolder.js +++ b/apps/documenteditor/main/app/view/DocumentHolder.js @@ -2268,7 +2268,7 @@ define([ menuImgPaste.setDisabled(islocked); var signGuid = (value.imgProps && value.imgProps.value && me.mode.canProtect) ? value.imgProps.value.asc_getSignatureId() : undefined, - isInSign = (signGuid !== undefined); + isInSign = !!signGuid; menuSignatureEditSign.setVisible(isInSign); menuSignatureEditSetup.setVisible(isInSign); menuEditSignSeparator.setVisible(isInSign); @@ -3345,7 +3345,7 @@ define([ } }, - onSignatureClick: function(menu, item) { + onSignatureClick: function(item) { var datavalue = item.cmpEl.attr('data-value'); switch (item.value) { case 0: @@ -3355,7 +3355,7 @@ define([ this.api.asc_ViewCertificate(datavalue); //certificate id break; case 2: - Common.NotificationCenter.trigger('protect:signature', 'visible', !this._isDisabled, datavalue);//guid, can edit settings for requested signature + Common.NotificationCenter.trigger('protect:signature', 'visible', this._isDisabled, datavalue);//guid, can edit settings for requested signature break; case 3: this.api.asc_RemoveSignature(datavalue); //guid diff --git a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js index bdb29ff9c..86453cbff 100644 --- a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js +++ b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js @@ -1313,7 +1313,7 @@ define([ documentHolder.mnuImgAdvanced.setVisible(isimagemenu && !isshapemenu && !ischartmenu); documentHolder.mnuImgAdvanced.setDisabled(isObjLocked); - var isInSign = (signGuid !== undefined); + var isInSign = !!signGuid; documentHolder.menuSignatureEditSign.setVisible(isInSign); documentHolder.menuSignatureEditSetup.setVisible(isInSign); documentHolder.menuEditSignSeparator.setVisible(isInSign); @@ -2487,7 +2487,7 @@ define([ _conf && view.paraBulletsPicker.selectRecord(_conf.rec, true); }, - onSignatureClick: function(menu, item) { + onSignatureClick: function(item) { var datavalue = item.cmpEl.attr('data-value'); switch (item.value) { case 0: @@ -2497,7 +2497,7 @@ define([ this.api.asc_ViewCertificate(datavalue); //certificate id break; case 2: - Common.NotificationCenter.trigger('protect:signature', 'visible', !this._isDisabled, datavalue);//guid, can edit settings for requested signature + Common.NotificationCenter.trigger('protect:signature', 'visible', this._isDisabled, datavalue);//guid, can edit settings for requested signature break; case 3: this.api.asc_RemoveSignature(datavalue); //guid From ed738d411df1499934c2ffc0451b016c63125013 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 28 Nov 2017 16:26:11 +0300 Subject: [PATCH 43/86] Add method for getting application prefix. --- apps/common/main/lib/util/LocalStorage.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/common/main/lib/util/LocalStorage.js b/apps/common/main/lib/util/LocalStorage.js index 8b3b1daa8..1b0a86888 100644 --- a/apps/common/main/lib/util/LocalStorage.js +++ b/apps/common/main/lib/util/LocalStorage.js @@ -125,6 +125,9 @@ define(['gateway'], function () { setKeysFilter: function(value) { _filter = value; }, + getKeysFilter: function() { + return _filter; + }, itemExists: _getItemExists, sync: _refresh, save: _save From 94aa389f1c39f26c17517187bb8fd0cc68a5a4d2 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 28 Nov 2017 16:26:31 +0300 Subject: [PATCH 44/86] Added icons for Protection tab. --- .../resources/img/controls/toolbarbig.png | Bin 8942 -> 11880 bytes .../resources/img/controls/toolbarbig@2x.png | Bin 19591 -> 26782 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/common/main/resources/img/controls/toolbarbig.png b/apps/common/main/resources/img/controls/toolbarbig.png index d5bbddcaee3656390307754ed89d161a8a7f2559..21d0714b4e25f346215a2a3915714df42413f253 100644 GIT binary patch literal 11880 zcmZ9yby!=?6E+;YK#>;r3NE1(cUp==u;NZ}4FvZVFC}d$PJ+7?cX!v~L4pO}|ydk2LO0MwfF|kyrPr?-Ti%-3R5%gVh zQg4UCI%YVaJjQUv1m0&+bRVKhLQ)$vK(WmNU9n_>Kcu~*`UhNV#|b0#tX4=y(r9pl z4n|rGVkEicK9h4;ad!^tgXO95T)$wAeM^4~JHy6&q)5u%ruzuv^G_D6k6MVPkUjal zEz03Ng`^p#rqZBUpYc4&qzmIki2eT>;j25Gs3iAo;%l;R&IrsKOtKp1KZ5YyA8&{@asQF>QhEFz zrss|F-Uz}yP@)HN^6lYKV>ny#ceWATzQvZ;x1U}HyoDx*62rFJlb}!ye(iUuo6*q3Z zALT7@2olwS3>T%Efo5+0U)R5fuFJO+2zTCJ9X$2CSa|z?QcVq})XkNEgT2og``q}B zN&DpaDk})p#)A!|1*=YzAtu!|J8=jj{JGu7pRYY|iH>%SgLoS?@}^TR5chA#yaAuq zr2ucb{Q+OFG(Tc}yD*O9dQucGvS`D>VYif*n@Lo}t~ACx$kGTVAgGYil*O23b6_`@ znce5A&4TJDRZ!IKSx*|Xto(E-s5wP;ajYyF+N%Le(Vgr*G$H`~CE z4CIcUCtN)@=Khe|@k%A`EI8`S+0W12s`XyRj=KW?!>X{z*pZuGNe~olW&kZwQE1Ui zg68tN$02aPh(wAmqzwl4;j<g#J3k|7%EOx z-pO2ZSpyN~(L@(sC!1c@l#+thMt6zhYK>mWa_VXeNX4ai$AQq_MI2P3Qx#j#O}sb6 z(n>Z%*2q^K5ie6X>e=dXgy_a(6vJy`YEu zJG)v8I=u4Z)Wa5P+vn=@4W#jtO&QDzVAd--=c`Vk-ycoQ5#D^tcmfa@WU%4Cn0F|i zLq1(e%r}0aW)I64y{*^k&cU%YrdI4?8jO_ech&9euSYCSF&*p~2b z{5|uh^s0Gvap&OjJ)AQK?vx4CcZ#@Pwuya5fB|}+_0_~fE4((*&^%pjaCxrL6ar)U zd{GgZ%>q45g^=aoh-gX|>|02p+^J^wksi0}-GY28y-?53p>W5#g)zZj98k~7M1NH(ocoG;3-_(=+l4XWSF)Q}B%zUI9`Q8971h#QEC^9m zl}iH$TRI+W!kImrqU#zD{YJ2@NWT@&t0@xz%7ef#`GDS5L-~0}^wn?2?*wNTv>|h6 zZ^PxT_GIlFwu5#hZdu!%3&H_;$*e(oMgv`@4!8-|bx^7W7(!cpX{H8mwB z2bOv~=kA}UYlVA1rp8Cm9dZbZXydJFShsG#H|YC~ehvwHfb;281!+l9XUFBDjGj3~ zoKCZ{W`XAw2H{06XN97PzqS3?8&}m(IJe7X(f}Jedm(D16C0MsBXD-k$hnvuuR9w+ zo%p7IIMccF!>F} z2#ILIaVY0E-_f=FW|8)YIWi;yXohId|2BwR8s78I+P4koy_L0O8AuVz4Lv#HQ?M+@6{)?wPQS9|Dwz9IST9l8_mY;U5aG) zQS^^&=sCCKz!sTAUDVIxF5eRM`>XJqNNiB7cTW!4vC&!Kwd{yqHjg?)lVidPi=@0N zL$~#hBnd~V-L9R$RbYb#ZeuAV(Vszf^5MsWvYsiGf$duGYjFG>qL-%4wp6>8d#=%y zhRB^j@IE*sl>|@cirOyIL?;*C_)~wA((KYC_&9DQ4&VF2Bmd=rb>_?1DOQsP`@X%R z97^Eqv>>`?$HgMV%`Slrl^K>$NeDNLN_Fsno;b?{9p7)z4V7A9?Im3LkH{awTKAb#?Px>^T@ zyw_?CO!ki7c0*ularmCNMIJx%0DDtm`_8qyA#F|i+$kCbv9XDmi^Ww!qn~`Vxw>V9 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 z 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 literal 8942 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 QzGDF>$wOb2zcdZ{e-vJ%F8}}l diff --git a/apps/common/main/resources/img/controls/toolbarbig@2x.png b/apps/common/main/resources/img/controls/toolbarbig@2x.png index 63d5f5de20293c3ac401c3aebe28ff4287402f09..cb65c79b236d317fc53be64da1eeb36a87f1e57d 100644 GIT binary patch literal 26782 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�F)I1l2=xTS=@j&3M5Y-I8vhBrPL# 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 From bea598c4f07486ab11591e7026be1fdb51cb8433 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 28 Nov 2017 17:35:51 +0300 Subject: [PATCH 45/86] [PE][SSE] Debug signature settings. --- .../main/app/view/SignatureSettings.js | 1 - .../spreadsheeteditor/main/app/controller/Toolbar.js | 12 +++++++++++- .../main/app/view/SignatureSettings.js | 1 - 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/apps/presentationeditor/main/app/view/SignatureSettings.js b/apps/presentationeditor/main/app/view/SignatureSettings.js index 0d9deec6a..eba5cf84b 100644 --- a/apps/presentationeditor/main/app/view/SignatureSettings.js +++ b/apps/presentationeditor/main/app/view/SignatureSettings.js @@ -315,7 +315,6 @@ define([ rightMenuController.SetDisabled(disable, true); PE.getController('Toolbar').DisableToolbar(disable, disable); PE.getController('Statusbar').getView('Statusbar').SetDisabled(disable); - PE.getController('Common.Controllers.ReviewChanges').SetDisabled(disable); PE.getController('DocumentHolder').getView('DocumentHolder').SetDisabled(disable); var leftMenu = PE.getController('LeftMenu').leftMenu; diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js index c0a025568..e091d727e 100644 --- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js @@ -2916,8 +2916,18 @@ define([ Common.Utils.asyncCall(function () { me.toolbar.setMode(config); - if ( config.isEdit ) + if ( config.isEdit ) { me.toolbar.setApi(me.api); + + if ( !config.isEditDiagram && !config.isEditMailMerge ) { + if (config.isDesktopApp && config.isOffline) { + var tab = {action: 'protect', caption: me.toolbar.textTabProtect}; + var $panel = me.getApplication().getController('Common.Controllers.Protection').createToolbarPanel(); + if ( $panel ) + me.toolbar.addTab(tab, $panel, 3); + } + } + } }); }, diff --git a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js index 7618382e3..beb5b59c9 100644 --- a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js +++ b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js @@ -357,7 +357,6 @@ define([ rightMenuController.SetDisabled(disable, true); SSE.getController('Toolbar').DisableToolbar(disable, disable); SSE.getController('Statusbar').SetDisabled(disable); - SSE.getController('Common.Controllers.ReviewChanges').SetDisabled(disable); SSE.getController('DocumentHolder').SetDisabled(disable, true); var leftMenu = SSE.getController('LeftMenu').leftMenu; From 288e14ff2f84da90cdaa7e2fc0649710b04c128a Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 29 Nov 2017 10:07:01 +0300 Subject: [PATCH 46/86] [PE] Debug signature settings. --- .../main/app/view/DocumentHolder.js | 31 ------------------- 1 file changed, 31 deletions(-) diff --git a/apps/presentationeditor/main/app/view/DocumentHolder.js b/apps/presentationeditor/main/app/view/DocumentHolder.js index 3e8b7fa97..03ea554d7 100644 --- a/apps/presentationeditor/main/app/view/DocumentHolder.js +++ b/apps/presentationeditor/main/app/view/DocumentHolder.js @@ -682,36 +682,6 @@ define([ } }; - var onSignatureClick = function(guid, width, height) { - if (_.isUndefined(me.fontStore)) { - me.fontStore = new Common.Collections.Fonts(); - var fonts = PE.getController('Toolbar').getView('Toolbar').cmbFontName.store.toJSON(); - var arr = []; - _.each(fonts, function(font, index){ - if (!font.cloneid) { - arr.push(_.clone(font)); - } - }); - me.fontStore.add(arr); - } - - var win = new Common.Views.SignDialog({ - api: me.api, - signType: 'visible', - fontStore: me.fontStore, - signSize: {width: width, height: height}, - handler: function(dlg, result) { - if (result == 'ok') { - var props = dlg.getSettings(); - me.api.asc_Sign(props.certificateId, guid, props.images[0], props.images[1]); - } - me.fireEvent('editcomplete', me); - } - }); - - win.show(); - }; - var onTextLanguage = function(langid) { me._currLang.id = langid; }; @@ -1552,7 +1522,6 @@ define([ me.api.asc_registerCallback('asc_onUpdateThemeIndex', _.bind(onApiUpdateThemeIndex, me)); me.api.asc_registerCallback('asc_onLockDocumentTheme', _.bind(onApiLockDocumentTheme, me)); me.api.asc_registerCallback('asc_onUnLockDocumentTheme', _.bind(onApiUnLockDocumentTheme, me)); - me.api.asc_registerCallback('asc_onSignatureClick', _.bind(onSignatureClick, me)); } return me; From f3fb154676452482b7cf38f5e5887ab8cd452fbd Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Thu, 30 Nov 2017 13:43:47 +0300 Subject: [PATCH 47/86] Use "Signer" name when signature signer name is empty. --- apps/documenteditor/main/app/view/SignatureSettings.js | 9 ++++++--- apps/documenteditor/main/locale/en.json | 1 + .../spreadsheeteditor/main/app/view/SignatureSettings.js | 9 ++++++--- apps/spreadsheeteditor/main/locale/en.json | 1 + 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/apps/documenteditor/main/app/view/SignatureSettings.js b/apps/documenteditor/main/app/view/SignatureSettings.js index 265249083..73f3229b7 100644 --- a/apps/documenteditor/main/app/view/SignatureSettings.js +++ b/apps/documenteditor/main/app/view/SignatureSettings.js @@ -168,10 +168,12 @@ define([ var me = this, requestedSignatures = [], validSignatures = [], - invalidSignatures = []; + invalidSignatures = [], + name_index = 1; _.each(requested, function(item, index){ - requestedSignatures.push({name: item.asc_getSigner1(), guid: item.asc_getGuid(), requested: true}); + var name = item.asc_getSigner1(); + requestedSignatures.push({name: (name !== "") ? name : (me.strSigner + " " + name_index++) , guid: item.asc_getGuid(), requested: true}); }); _.each(valid, function(item, index){ var item_date = item.asc_getDate(); @@ -381,7 +383,8 @@ define([ txtContinueEditing: 'Edit anyway', notcriticalErrorTitle: 'Warning', txtEditWarning: 'Editing will remove the signatures from the document.
    Are you sure you want to continue?', - strDelete: 'Remove Signature' + strDelete: 'Remove Signature', + strSigner: 'Signer' }, DE.Views.SignatureSettings || {})); }); \ No newline at end of file diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index 7193178fd..8096bb0a3 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -1418,6 +1418,7 @@ "DE.Views.ShapeSettings.txtTopAndBottom": "Top and bottom", "DE.Views.ShapeSettings.txtWood": "Wood", "DE.Views.SignatureSettings.strSignature": "Signature", + "DE.Views.SignatureSettings.strSigner": "Signer", "DE.Views.SignatureSettings.strRequested": "Requested signatures", "DE.Views.SignatureSettings.strValid": "Valid signatures", "DE.Views.SignatureSettings.strInvalid": "Invalid signatures", diff --git a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js index beb5b59c9..35e010379 100644 --- a/apps/spreadsheeteditor/main/app/view/SignatureSettings.js +++ b/apps/spreadsheeteditor/main/app/view/SignatureSettings.js @@ -168,10 +168,12 @@ define([ var me = this, requestedSignatures = [], validSignatures = [], - invalidSignatures = []; + invalidSignatures = [], + name_index = 1; _.each(requested, function(item, index){ - requestedSignatures.push({name: item.asc_getSigner1(), guid: item.asc_getGuid(), requested: true}); + var name = item.asc_getSigner1(); + requestedSignatures.push({name: (name !== "") ? name : (me.strSigner + " " + name_index++) , guid: item.asc_getGuid(), requested: true}); }); _.each(valid, function(item, index){ var item_date = item.asc_getDate(); @@ -380,7 +382,8 @@ define([ txtContinueEditing: 'Edit anyway', notcriticalErrorTitle: 'Warning', txtEditWarning: 'Editing will remove the signatures from the workbook.
    Are you sure you want to continue?', - strDelete: 'Remove Signature' + strDelete: 'Remove Signature', + strSigner: 'Signer' }, SSE.Views.SignatureSettings || {})); }); \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json index 128b5a678..51619c002 100644 --- a/apps/spreadsheeteditor/main/locale/en.json +++ b/apps/spreadsheeteditor/main/locale/en.json @@ -1488,6 +1488,7 @@ "SSE.Views.ShapeSettings.txtPapyrus": "Papyrus", "SSE.Views.ShapeSettings.txtWood": "Wood", "SSE.Views.SignatureSettings.strSignature": "Signature", + "SSE.Views.SignatureSettings.strSigner": "Signer", "SSE.Views.SignatureSettings.strRequested": "Requested signatures", "SSE.Views.SignatureSettings.strValid": "Valid signatures", "SSE.Views.SignatureSettings.strInvalid": "Invalid signatures", From a8a7a4f917a338e978ae51d98699639e2aeb92c4 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 5 Dec 2017 16:58:01 +0300 Subject: [PATCH 48/86] [SSE] Fix Bug 26581. --- .../main/app/controller/Toolbar.js | 115 +++++++++++++++++- .../main/app/template/Toolbar.template | 2 + .../main/app/view/Toolbar.js | 52 +++++++- apps/spreadsheeteditor/main/locale/en.json | 4 + .../main/resources/img/popupmenu-btns.png | Bin 6024 -> 6362 bytes .../main/resources/img/popupmenu-btns@2x.png | Bin 15103 -> 15639 bytes .../main/resources/img/toolbar-menu.png | Bin 13889 -> 15093 bytes .../main/resources/img/toolbar-menu@2x.png | Bin 35078 -> 38448 bytes .../main/resources/less/toolbar.less | 10 +- 9 files changed, 178 insertions(+), 5 deletions(-) diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js index 4412ec225..f702fa061 100644 --- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js @@ -120,6 +120,9 @@ define([ bold: undefined, italic: undefined, underline: undefined, + strikeout: undefined, + subscript: undefined, + superscript: undefined, wrap: undefined, merge: undefined, angle: undefined, @@ -247,6 +250,9 @@ define([ toolbar.btnBold.on('click', _.bind(this.onBold, this)); toolbar.btnItalic.on('click', _.bind(this.onItalic, this)); toolbar.btnUnderline.on('click', _.bind(this.onUnderline, this)); + toolbar.btnStrikeout.on('click', _.bind(this.onStrikeout, this)); + toolbar.btnSubscript.on('click', _.bind(this.onSubscript, this)); + toolbar.btnSubscript.menu.on('item:click', _.bind(this.onSubscriptMenu, this)); toolbar.btnTextColor.on('click', _.bind(this.onTextColor, this)); toolbar.btnBackColor.on('click', _.bind(this.onBackColor, this)); toolbar.mnuTextColorPicker.on('select', _.bind(this.onTextColorSelect, this)); @@ -463,6 +469,51 @@ define([ Common.component.Analytics.trackEvent('ToolBar', 'Underline'); }, + onStrikeout: function(btn, e) { + this._state.strikeout = undefined; + if (this.api) + this.api.asc_setCellStrikeout(btn.pressed); + + Common.NotificationCenter.trigger('edit:complete', this.toolbar, {restorefocus:true}); + Common.component.Analytics.trackEvent('ToolBar', 'Strikeout'); + }, + + onSubscriptMenu: function(menu, item) { + var btnSubscript = this.toolbar.btnSubscript, + iconEl = $('.icon', btnSubscript.cmpEl); + + if (item.value == 'sub') { + this._state.subscript = undefined; + this.api.asc_setCellSubscript(item.checked); + } else { + this._state.superscript = undefined; + this.api.asc_setCellSuperscript(item.checked); + } + if (item.checked) { + iconEl.removeClass(btnSubscript.options.icls); + btnSubscript.options.icls = item.options.icls; + iconEl.addClass(btnSubscript.options.icls); + } + + Common.NotificationCenter.trigger('edit:complete', this.toolbar); + Common.component.Analytics.trackEvent('ToolBar', (item.value == 'sub') ? 'Subscript' : 'Superscript'); + }, + + onSubscript: function(btn, e) { + var subscript = (btn.options.icls == 'btn-subscript'); + + if (subscript) { + this._state.subscript = undefined; + this.api.asc_setCellSubscript(btn.pressed); + } else { + this._state.superscript = undefined; + this.api.asc_setCellSuperscript(btn.pressed); + } + + Common.NotificationCenter.trigger('edit:complete', this.toolbar); + Common.component.Analytics.trackEvent('ToolBar', (subscript) ? 'Subscript' : 'Superscript'); + }, + onTextColor: function() { this.toolbar.mnuTextColorPicker.trigger('select', this.toolbar.mnuTextColorPicker, this.toolbar.mnuTextColorPicker.currentColor, true); }, @@ -1648,7 +1699,7 @@ define([ toolbar.lockToolbar(SSE.enumLock.editFormula, is_formula, { array: [toolbar.cmbFontName, toolbar.cmbFontSize, toolbar.btnIncFontSize, toolbar.btnDecFontSize, - toolbar.btnBold, toolbar.btnItalic, toolbar.btnUnderline, toolbar.btnTextColor]}); + toolbar.btnBold, toolbar.btnItalic, toolbar.btnUnderline, toolbar.btnStrikeout, toolbar.btnSubscript, toolbar.btnTextColor]}); toolbar.lockToolbar(SSE.enumLock.editText, is_text, {array:[toolbar.btnInsertFormula]}); } this._state.coauthdisable = undefined; @@ -1706,6 +1757,37 @@ define([ toolbar.btnUnderline.toggle(val === true, true); this._state.underline = val; } + val = fontobj.asc_getStrikeout(); + if (this._state.strikeout !== val) { + toolbar.btnStrikeout.toggle(val === true, true); + this._state.strikeout = val; + } + + var subsc = fontobj.asc_getSubscript(), + supersc = fontobj.asc_getSuperscript(); + + if (this._state.subscript !== subsc || this._state.superscript !== supersc) { + var index = (subsc) ? 0 : (supersc ? 1 : -1), + btnSubscript = toolbar.btnSubscript; + + btnSubscript.toggle(index>-1, true); + if (index < 0) { + this._clearChecked(btnSubscript.menu); + } 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); + } + } + } + + this._state.subscript = subsc; + this._state.superscript = supersc; + } } /* read font size */ @@ -1816,6 +1898,37 @@ define([ toolbar.btnUnderline.toggle(val === true, true); this._state.underline = val; } + val = fontobj.asc_getStrikeout(); + if (this._state.strikeout !== val) { + toolbar.btnStrikeout.toggle(val === true, true); + this._state.strikeout = val; + } + + var subsc = fontobj.asc_getSubscript(), + supersc = fontobj.asc_getSuperscript(); + + if (this._state.subscript !== subsc || this._state.superscript !== supersc) { + var index = (subsc) ? 0 : (supersc ? 1 : -1), + btnSubscript = toolbar.btnSubscript; + + btnSubscript.toggle(index>-1, true); + if (index < 0) { + this._clearChecked(btnSubscript.menu); + } 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); + } + } + } + + this._state.subscript = subsc; + this._state.superscript = supersc; + } } /* read font color */ diff --git a/apps/spreadsheeteditor/main/app/template/Toolbar.template b/apps/spreadsheeteditor/main/app/template/Toolbar.template index 669121df3..b4c6605f6 100644 --- a/apps/spreadsheeteditor/main/app/template/Toolbar.template +++ b/apps/spreadsheeteditor/main/app/template/Toolbar.template @@ -56,6 +56,8 @@ + + diff --git a/apps/spreadsheeteditor/main/app/view/Toolbar.js b/apps/spreadsheeteditor/main/app/view/Toolbar.js index dda3a9cc8..40fa31d76 100644 --- a/apps/spreadsheeteditor/main/app/view/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/view/Toolbar.js @@ -411,6 +411,46 @@ define([ enableToggle: true }); + me.btnStrikeout = new Common.UI.Button({ + id: 'id-toolbar-btn-strikeout', + cls: 'btn-toolbar', + iconCls: 'btn-strikeout', + lock : [_set.selImage, _set.editFormula, _set.selRange, _set.coAuth, _set.coAuthText, _set.lostConnect], + enableToggle: true + }); + + me.btnSubscript = new Common.UI.Button({ + id : 'id-toolbar-btn-subscript', + cls : 'btn-toolbar', + iconCls : 'btn-subscript', + icls : 'btn-subscript', + split : true, + enableToggle: true, + lock : [_set.selImage, _set.editFormula, _set.selRange, _set.coAuth, _set.coAuthText, _set.lostConnect], + menu : new Common.UI.Menu({ + items: [ + { + caption : me.textSubscript, + iconCls : 'mnu-text-subscript', + icls : 'btn-subscript', + checkable : true, + allowDepress: true, + toggleGroup : 'textsubscriptgroup', + value : 'sub' + }, + { + caption : me.textSuperscript, + iconCls : 'mnu-text-superscript', + icls : 'btn-superscript', + checkable : true, + allowDepress: true, + toggleGroup : 'textsubscriptgroup', + value : 'super' + } + ] + }) + }); + me.mnuTextColorPicker = dummyCmp(); me.btnTextColor = new Common.UI.Button({ id : 'id-toolbar-btn-fontcolor', @@ -1199,7 +1239,7 @@ define([ me.lockControls = [ me.cmbFontName, me.cmbFontSize, me.btnIncFontSize, me.btnDecFontSize, me.btnBold, - me.btnItalic, me.btnUnderline, me.btnTextColor, me.btnHorizontalAlign, me.btnAlignLeft, + me.btnItalic, me.btnUnderline, me.btnStrikeout, me.btnSubscript, me.btnTextColor, me.btnHorizontalAlign, me.btnAlignLeft, me.btnAlignCenter,me.btnAlignRight,me.btnAlignJust, me.btnVerticalAlign, me.btnAlignTop, me.btnAlignMiddle, me.btnAlignBottom, me.btnWrap, me.btnTextOrient, me.btnBackColor, me.btnMerge, me.btnInsertFormula, me.btnNamedRange, me.btnIncDecimal, me.btnInsertShape, me.btnInsertEquation, @@ -1214,7 +1254,7 @@ define([ var _temp_array = [me.cmbFontName, me.cmbFontSize, me.btnAlignLeft,me.btnAlignCenter,me.btnAlignRight,me.btnAlignJust,me.btnAlignTop, me.btnAlignMiddle, me.btnAlignBottom, me.btnHorizontalAlign, me.btnVerticalAlign, me.btnInsertImage, me.btnInsertText, me.btnInsertTextArt, me.btnInsertShape, me.btnInsertEquation, me.btnIncFontSize, - me.btnDecFontSize, me.btnBold, me.btnItalic, me.btnUnderline, me.btnTextColor, me.btnBackColor, + 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, @@ -1309,6 +1349,8 @@ define([ _injectComponent('#slot-btn-bold', this.btnBold); _injectComponent('#slot-btn-italic', this.btnItalic); _injectComponent('#slot-btn-underline', this.btnUnderline); + _injectComponent('#slot-btn-strikeout', this.btnStrikeout); + _injectComponent('#slot-btn-subscript', this.btnSubscript); _injectComponent('#slot-btn-fontcolor', this.btnTextColor); _injectComponent('#slot-btn-fillparag', this.btnBackColor); _injectComponent('#slot-btn-borders', this.btnBorders); @@ -1377,6 +1419,8 @@ define([ _updateHint(this.btnBold, this.textBold + Common.Utils.String.platformKey('Ctrl+B')); _updateHint(this.btnItalic, this.textItalic + Common.Utils.String.platformKey('Ctrl+I')); _updateHint(this.btnUnderline, this.textUnderline + Common.Utils.String.platformKey('Ctrl+U')); + _updateHint(this.btnStrikeout, this.textStrikeout); + _updateHint(this.btnSubscript, this.textSubSuperscript); _updateHint(this.btnTextColor, this.tipFontColor); _updateHint(this.btnBackColor, this.tipPrColor); _updateHint(this.btnBorders, this.tipBorders); @@ -1890,6 +1934,10 @@ define([ textBold: 'Bold', textItalic: 'Italic', textUnderline: 'Underline', + textStrikeout: 'Strikeout', + textSuperscript: 'Superscript', + textSubscript: 'Subscript', + textSubSuperscript: 'Subscript/Superscript', tipFontName: 'Font Name', tipFontSize: 'Font Size', tipCellStyle: 'Cell Style', diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json index 75138eb95..304ca1554 100644 --- a/apps/spreadsheeteditor/main/locale/en.json +++ b/apps/spreadsheeteditor/main/locale/en.json @@ -1655,6 +1655,10 @@ "SSE.Views.Toolbar.textTabInsert": "Insert", "SSE.Views.Toolbar.textTopBorders": "Top Borders", "SSE.Views.Toolbar.textUnderline": "Underline", + "SSE.Views.Toolbar.textStrikeout": "Strikeout", + "SSE.Views.Toolbar.textSuperscript": "Superscript", + "SSE.Views.Toolbar.textSubscript": "Subscript", + "SSE.Views.Toolbar.textSubSuperscript": "Subscript/Superscript", "SSE.Views.Toolbar.textWinLossSpark": "Win/Loss", "SSE.Views.Toolbar.textZoom": "Zoom", "SSE.Views.Toolbar.tipAdvSettings": "Advanced settings", diff --git a/apps/spreadsheeteditor/main/resources/img/popupmenu-btns.png b/apps/spreadsheeteditor/main/resources/img/popupmenu-btns.png index 497177a43d056c37483a80b487cdc5102ff78519..c0c39cc2815b631e9be71baa501691c99a334714 100644 GIT binary patch literal 6362 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 literal 6024 zcmZ`-2|Sct+n*VOiNQT(FS!j`WX)0%X2v8UTeitQgdSU22H6>mB|?OXRF;qo8G|f| zkhNrA%2HWF6q0;H@AJOT`+dJ}e!scTnRCvyod5Y>=eq8RG0;2D!6wKCfj~I4weUua z76*Ya;Sns19{kg$GX%n?uZ_nV`#~4R6mPkj0MRSj*V@_J*khCuueDyo9s0)Y>)Urb-NFZofNyWzM<&E zlVK7x0gyTQ@1mLvl6>G$IFNszG+b)ySafn9@g)z-+qw^(?2fcEMIUaZb=sg-<|q*q zvzB)t+N9?aO5&k?2qFwo5{Z?3u3mr$Agkie6(El49M#d_1CV`LoruYMX{s>*iFWT2 zJMIFubWoC30)@x9^~(koB6xDp#^hK7l*FzOkKGI`yxEaTaOJ(*+^-l4X)LzuAKc)1 z%SG(E%!colcZ-tk_OFprN#qyTZ;imc(amAy5dO* z^h-lBwtx~F+d3-x(~We9tcn)-@yBdRZmg^~^d+%;P*N$bHizL^H4A|8R*japMZ178 zR*PmsfT0kggiM9y>2UhvPn$@f{`bnj^5ndSFl6Q1!6nZ6Uq77KC@W5?SK-$^+cycI zp7W+Zd_|-Ex&Zh!WMRl|scxGUvoK!cL0@|7RE9a!>p6y)%uIVEFD!VTc2@4U%3{v- zk)TARP00FGSV)Vopa?%}quGFiC#vwNgocm2M)UcmR|evXsPnfMQ0x6mD1y~geryRfzr@AT z;;o|f)hcKB^{bziCvyirY_1<#aU4>fyiN8Zr-%c?PVS+$e~!SB>catseiY^1$Iz{6 zZC6nD^J@!3JtyO*oH3FIz(BC$zdab(|CfZhYnSJYzXb%pKJvPWwRmGB6au5D0ZKYN z3}#^lB?+z!W-uV{+(mwu3&6ZB^;uS{?Dmfh)Yj8=_22r#nK!l`mcM?3chB1E^d)JR zGvS@zEkIEj3cVNzL#8P{76L1L1$m*Na!M}O43#=6r0yJOXIOgcc)9a)&ye6Q+=0qrg@OEwe4WI3K@4P~ zYEa16b`FBdR0zP}k96uXe1+mMZ@fb(S{Zu4iLe67S~P>9kO_x2;=$_B0>mE(mExYd zFf`c+=~ky-eX?KvgkrA~D`ms0;9Gt-_pT0dr_r8SB^}<89%lHS)IsEK%P>oS*lMs+ z-AyaBUibIvi<^#)HG@@}tX%lmfWOSe0GP3<-A7|va!i?M_&Guetp zHe&Vrwa3PUR4`3P-~E~=z!+PM0bSE1b|p*y;IS8-e^93Uf=pBoN>2@P5S5OOfuB=% zl0io=BhJ5#-4kVix5@Iz1nJ~2 z?@9jc*|MYUPe*(?i_8K>-hspGHGz}-LH_NMndexZ*bxA?&JYX9w_)?2C4llkz$!*R zs|}1&o@J5qklKens(Zbc29_aptFJj>RKp8jJ@d=7dm*ZV)ZUfN${Pq5HKwTNRr}y5DxqUh=}H_u6zQoiu>~^VqS~$di`fc z7}@%?k6;)V8wa+@#Oe^i-mvv5;2is_$$ zL9dxoU%bzBON=lO6>u}F!fk}+Hu5?8yZckOn{E~^F0LbvF4uOvB*rsml;x^SeCD6p zd}yPbDl4yf_-O0N-P7HjXEv)Hs3oFviFiQ$*SCOz;^KEc#@j2WLY4^0PE={?@y8Yo zp2a6JK+|H&3~L#ix_cax=VD51Y$FgEvRGrAR?sM;2W#8O66RxwvF&7@0A15T*M}H< zQzEJu^^zs52Q!F|poI2Z@Z<<4)jsw|Q_h0O!%FDqt{;?V-c@T1$U3(!pT&yd=$f8D zFsXD}qQ6(jHx=2`y`@cZJUg~htM3vmAn(L%mDiarFuwhmcYZeEuJ+-E?xhshH)l29 z-wI4nT;yMws}YV?|G74xxW!Mcn?@Jca;5TFaW+cPELOL#p|WZE-xxEJKzN`tz+ZXAxH<@Oy-?@g>c$)lCl>Uu(qTS-a?-x-jI+cTJ>$6_j!SSUl$JJTG=*^#7 zu%{7!Y}YiC;uf7aSSP@1R);-xB?fdBJVJgcPFJ_Otj-EwuNF(S*XyqA*J{R2#$xUwBrB3#M35Y5 zCsG=S#}uf+*td(59xTRkHZtrpOzPbU>}D~nzgi?4JULAa9klXP5g=Q*K2sB7JSzte z@4C2Myi(6cj<^=L$UE{kWLAC32v$@_CJe_{JOmm!UKB!wokb(zKPg&oC6xm34aC*+ za7iV9JiYnHTrZZsyT{|adpq7Po&XOq)B&6iFSDnf(A`wkFT;Ez>3+|+n)B|3TYlf0 zrLu3|46F@N!9N$fj{$v`3l7=7S;`mF*XfG+jv5ma62IU7QA95V83UE`?4ZjAPS3~& zzUQA8!POp-deuSjB4S6$YA;Ul0|M$Rwn&Q5a+il_hRjfZJS8{z&MNatSBp*Fhs{d0 zUuSRMF(X&1{UlbP3{6aU>b8#mmFIHc#cHnKx=ts>PtQ{mNeR(T)B0(lt0|2I)7TE4I+=` zy)gHQ9Ty#x|FyPv=h{G)P4uk1(^Dn1goK2~2WW&n=Ik+Lww+~a@)pCWrYC^}T)%D- zt!X(@hSd_4K6Hu>_E3rx>RNPvOf#cf#H$&dW#5}ek~@b)i47m^Ccdw$OTDJhjmmO_ zMSt!8_ZjWddTK{*_n0#)z5;2|QtbAxFCt`WSJYP3+PB4a(nisQyZ-V+xyeJx%2a(oH)eA_f^<1`l*9l8yjWNG7XOGK< zp`K}3Y`mR%9bI^({jtuCr#(~iOO4Y{dih0(stfzOwUwA|)d+|Z?X_jJGaUHZQj$N| zW1a&+JKNp$PZ}>vz{`$yMY8#TP)%*Zg!!xzW z`k?a-1}?RRpFLusat7~MlW9+;osm^$Viu0pcVs9^_p2k1_vYoBjQ(O~e-+Df!nny{ zDdw(FQ%-V#SZ?W}3`|QqXPq!Ews}C$^M!*zys@^(se5%|OTS-ivNtLS@MuIOB0Yka ztGYbQ5ktw|w*ry+I&|I|uP2d!SG>8|Nz->`?=;I&9S*XKe6}4T7}tFjEYlfGGU)Mv zYc5{;vBrs589+Ty(J!-Z)S|#v$_|0iH~Dj&IM{OxfcXn0@*y&xzW(A6Ta@cS!o$ns zBLH(Qj?x@e)t6CRP&*CG1~5t-`M>v$E7nW&aYyRy6FRp)xt$?hQpx=h%L2QyDN=fg zRaTmMDs)qTN&PL~XNkjb34_{ly@iTc!S4qOm)TgtPAwc8oDVR-X177!>Ye0+&|VLy zXkk=2n+%S>YJc;l7c$N*_sGWS?B_Tl-5&b@8NvopdOaYJSY;{#UNHPnnWTGLq40=z zebOkvgcEixBx*|ag-5cV`^05+h1QagUEpl%6(v63GCJb_-Z}BGidsCsqNYz)SGagYt2N03?vas1Kc(Xy z+BNd*)|Vi6nXBPJr4f&jO^GQT34!DJGg~qy<9S?}ukiEphobd1-v8C3n-636A9vz7 z^nM_!KZJAjpo-4#PCwW}d-6o`nCy@|?%Ty2{m{O~On=87usdOf6g>>*{b)?z>b2nO-{|v``5G(SXzk!f=yc5hLUO6$PlwCN& z5GQ9mLdNwrbi*y&vNH{NMsG9J_;?H1u(`nt9e5V!<_ zDS{Kt%>+*)-b5Th)bouL>F?gxs{hVt2pGb`LA=6iP|3(`N0rcP;=fmlI4B#ADy^TBZI?O{-DwfdkC0Z&DCP_0LL7ou9(Q~XKQ*%Q zFm7Mtp9C@ywwHst1^2QS<<84vm0zaxs`qo-iO>RaV((;>JGxXoP0btEzVo||*RBlj zD?|442R{Ai?Q@TkN`1^WYfabkWOJ7t6B^0L%fh}p&4NF7-UCH+u3nzsp7L$gM+kY`Tswrp_CFv39@)IRi}ET-7bE=+64 z0OO$jaf{*y5O7S?N7LEKSY2Q#&{BTw*Ux~eZ9gR*xFcQf_SptO)PQY?m)iSLDnd}a>*Xz5s&Z}#lyUF*4)+y<-V39KTG#FCr2LZl(7%(;c7B7HNC1`l3SHFBMG#8q)j;)WG;2X zs3)d7XmojXSxmugL*+-wnoAvbBAJQutr0*Lk%wGKf*2*90-c0 zNpJ(_i3(?#gM1O}O}4+@31ze(?yt;kFD6QO4z*BN#gA%CdnTZi&H|_ygCDNI%P1(3 zgPk4!CW@H|?LW{-I)sql&UZ^M?S!o;^y@p&?6C?g6w|&VWZzfNRfn+zXwHEb)r{hj z*hjv015L*rjk1^_aU*n>^JMu_GJx?z^H$UZ7*!eL8ogMZKBKK2r8S-aO{(JBatn0V z@z~cBlf@{@Ow_Y(EtU(4L~oV4I2=w0H@tR+^WGOmk#qUgACB&oNDDhqAh`b;Kr4%P zo8}u!m)V+sB)BRP^Q=MfN`5Kux$1_FqEd*u_%E&@{kx^94FHkR9mxX_!E ze@#vwj|``$T<>4jabn7OBdr*hmoB+d82ipt~11Mg$`7@0; zyLJoKJpx&{ChnGu(jG!hA*_h!2I&%2X(XXA>F79KnSR#8M%V{QE1k)z8GOcfw4~EI zl64)!oQJD5oQDg8%*&ojN?Jaru)u^T$4oqnrt@4uT-x)b;uBSZ_cb|hTN>1kdB)R) zP6j&o&31C(+DZ3&?`x_(=>rwqhq}~$dS2WattC8cALfUeP42r`W9#4mP1@cPK(K24 zZfHH$#)58NFTxfGAJM;GBFd!R&i1hBb)Y(vombl@egSbRI9v>E%yw?D+Ru(VA08=t zWq7UUp^zp{0YN~*o$Gfhloe!o%)fv^7L2Ur?Y z9ewGiNCSQqg5Rv(&3VDm!#*8T@STm6;`Gqbz;*@ zljG5c+cSUOyc<>m|(d*};pxtoK`b+>TIc zp>}+XAxjU?0Q3B7PsJHHV+;vrqqsmP0vQuCFB}DNakT1AI5j_v@vjtP83dObhJo6F zr5H;l#FtqmW_Z?e0U!v4F_FVc zT7wdB8q`Y~b!Vu8x1E>M+*rcgPECzYRNFdv=R`+3SLOZm#krF#j5i|O?j8A`_n_Sv z7f=zpyFfZ4?LT<+ukI0+h07Y^x)HBCXDV10)@GXv6xE>d78!kCj@rDxz&=d6UsGPx zeZbIfvAslXDe^8d`EG_9ZtO9m=1B|fz`~wDz z9Cy!hkS-m*6U2M(`@aABzV&CV%$YN1&zU{DJbTZXxv#6OcAWAgB?JOFuA#1~ z4_*ln2yzUC1Z%0wJKYe7{D_9C(q*r~`L75EQ;p>2Wkp-truKaPG#gu_INL*k$CfJ+ zXAXb&?FSf+%Tm?9|M7bIhC+R%*G^w{`HpY;prHoeNpD5DxQ+6W>YJ4w9ds$nHRV_5 zPM$P*>!ILMWqT1xxNx2mZqY7DNp!)X72X+1K{+vSLLdOJd8X_P-&D^&AFN)Y4y^CI zk1@sFAmd6AR>5t)Z}bl?t@*{K>VF#oBPtfypimp!pD+xjtg8ENbSTVrXFMlZ*krb8 zV**=lwgJH2&9+<{2vk+kBs6dqt2WD;N(Li3<%1o6j~D$&`S$ABwo@2M+Hh-H{DlWKslhg(QyF5`^pHp>SZ!ff<%| z;J{pr#stoagJXe%AC9{-AOTlB7?5ya#z7vDxGQguw`>EM-zPDD#6x#eEu0W8#Q?Gk<`jTiO9UC4av%7f4@%_TN3hGie~n4>jqH+DCWixTB=LanM-d$kCy64B z%A+wLJo&u*WA9nX;*Y%^9ljkGD2O*6D5GkgBItmBNg?M*3Tq@OJmt=l1Uej;7ov`X zGm|=03-2e)^NM-Nos+1797kpt4D}>QL=F$(dQ6g9%D<(?n(9uVLSa@0BtV(}trZv- zJJ9##i(vQ}kL%Lr1r{*nm>Y$8fzfT+P#Sfo>&K2LmwaayBcl3B&=dDNz4mn<2BLfe z0xCNu*KrU~E&o$=LxOzb*5mT2!j)njuh--|{bgRAdjc5U z{<#t6-5klrF|r%EK~=I=UQ*#M<3G_Lw)l2*^R6a_-HgWcYOkXcRPTV=%X@FTRv5n- zlAkR!XKHj)3NK^OHy&Rce!FdZGZTwVWC*J&+urE5&DYfR>dRG|aXB1LW>^Wyt@?MohkWY;w3pxrjbXcHu8 zeI$c8vg~kr%2Sv_t?`hIi}r&}W?-~QAIa!YyyT%gSKqM!TlED;TFTpHHYm{7Ig=qs zbh5qFaj~-FX}KqOOBp$0duh+w`AmlPx}^1w_JIP@lcsQiGa2P6;#ZW`#I678?FoNF z$%VCUy%PEsJqZaXBYD{BbbKJ{w;vMPw4Wq7T`Cj*aw=5K(S2^a_Fd4^0I$}~-u1cB z?d*8x>!Y>_CVh-WsBy;Da;qoOB~9B59f3Y8Vxw-^z2ouj4VlD=+JK*K zxM}Pv`3+N>(pCrzg$ew_A;}3ZP*R`}5`%^~^%xQixDC9qz_q-){o5HxAjTT#3c*3T z{fp7i?mNE)&C@)xmTx1!P$tT(xLzi@zQ#Yg80!(049e6k zr{;@DS+|D25xIFO>AP*y<)qVJ2EyOm_DK+5e+_nsJGi(eW&K0yddE}2xs7|z#n&5d z%2&T-Hn7>dckNIg$k5BcS2UVAxW5l%{E++qEb3^^sm;Pk_zh~eMV%9xY5@Z05rm4! z#ZjWlJcNG(JghG9qBTXw8#s(uGZ%w_<+KG6t3d#OLI2ZZOT|yLL6@@YpplQ`Lg56PgSy`F!9H%@KGzmWDRxf-6jk~gkmcQmH!1J3c+Gx4K=`jbEbU6 zKY{yBWEaTU!M`}WKq+Lpa5L|VMP0* zu+$^{99lsjB<+B;p7AiYfGEu!LXSF%Ef-i$1E6sW{2kl|K=wYM(c)ro5dZ0JtmL#| zTc7w|pVh0XnHwbk^Y(wlj|^pEg292`4sZnUsu+?lfl_d>ZY7z^tYY&L;vYjqkdY$z zks;Qa-u;&$QX*CPo0r(?$ziCd74O)bfd5uB4l>>p%VL0oSRMxRKZXDYC4V^PZ!Hj$ z-O=WMAP>eY!1FicW#Mow|AM^3J_Xrf4HxmKIQh`(7(*N+&lEW38|y59VOS@QQ(J4{ZHs>fQ5w!AsW(@ZmKkxyn{#jr&DVHII zP*CAdl3>bzLMS+?ryhIe4^1o4=r?au@SGl?>9VVWDqtnny!5pM@M>Gz{~xL#fhpqu zp$a?fkt!%bWB@a*-+6|Hz9N|A5dNql_9(AP(Nee?klMVif;q+UHmAr1eJ~d50p8;w zR%Mv9s9gk3m1FBzU<-ETe?9UaA^dkuMtKIsM#_n-H$h-J9O}la=pZO3i3OeyphKiu zh{z!b!{rP|25Z^7-kBG=)yh$C-u~BFkd3;?IWm$<9u7}bTw#RdmG-Su|F>_TFvCyX ztSM2L-&x=vjK>{ubYw~0?vdkvau;0;cgR0^-w70|Y@Ys4j&*4JAS=;^0s#I~^U^ii zw`c#D=c8SB80OdRllncF_>lE~&-j0ghfq>oxp(}?c#nSrF+mse8!?YC0r5|61y=tU z1|bl{1aaR^Que&kc`VSdpCMNWC_sQp|9=kohvZ25g@@9|{}UWQ>4Ve#onMQ{k!Joo zILrnFEs(VtC%IVM_1GWWLoSn&C_`+%_^xwYU%NRAx%l{w&x@>we5_BCs;6tsET1=$B45p zeV~AkV>M3bpj+VxJz7SdJ_te$|1N$&8-iPn=MW8ZZ40y9EG!Cm8QtD-d7|#SV5WD! zaF1m7CyUn0F)+=))E=ePL zRf|R(2p+^=I>zg;v|e`NZnqpJ(C%P!-JNtw3 z#P5qSKYKgo)TVPH@cnb|U%k&#*)r){mT%=FX%TcQ(7XO#JP>IAWki;}9+-mcj&iBF z!K~XaBRa~Fzm1kS+m#0)vfW}(rF-mv|81#UOZ1-fs$&8_`H3|K!$tr;v-BkfrsJxn z1W%s$7~C?`Aq?&IAI~Ga@zhYUrm$X&$!Mar9pyb9s9vdg5=P_mL=wTZBVrFxeXG)Z zSJ0zP4w3fEWaP+HEM4BzrvIt;78&)~UQh6F>@AWm0jKcq;57K;cLMZxjHt_++eOc} zXU(;s=WDX&rfn@2nd?#K=?bzlU)ovqdOSXp8{mZY5I)urWc+jN6GG@npNF&BJUGU6 zE<^9Rt+oTzr0-{5T9(>79HtAir`KnvJ|K)!5#zs@~LJ#I@^2+>p zoB7VP%Y6Uxc>nU`YR(K+`um3BGIJ-#Ee&9Dv0LyC~tT^$hND+Es+p!5^Ix0w9F%Mm43f$@hoAOCby%NOl?wltf z;(j8kXD}I^A$AlEUPV-Cy~l~mBtKO8R~qw3l$xt_1^!~}+xV*4Y&!PP6Vfe&@ ze5WtlHZ!&7Ufg+?C0FP_ur+b5YJWHI(^g;)W5w=S1=G9xHf*~0O0%%Hw-p;^IkxjU zM#Emu*?0PVSo+=>@aEwTu)cAiZM2cNo^lkCzk&8oS}^>M$O0*(JmpVBzIccZu(Z7( zFaq8?7kcof)58;ez%CBKlY98<_uj%%|Hz`AQ!Dq;otan;J}0b**njQF{>{e)H1BEZ z?MRMqK6@skU*=^3w_hx7>Qy~_PNv6kq0;I}m>>07GON1!Dvtez%mkSDxaFwa$6N0r z$Vx2}Tp`lZa#UlRy{-^G?ZkOU)|wNOt`OnCQcoju;kh(6WT@}EN<8OnIV$wl_aDZ$ z$yE09vJQsrE!6jls;{3Tm?59^e%T-U^sAW`1|{SXnn;)KrVA`&P(tUzT3M1}NzcsP zrq#m=-;YgIw%^}I>JGmQ9j2DV{iB>R^%9u0{F752E)tJ&N>WmFxZGMZR~S(s^tPrc zwa*x23I_bDBUPRh(Hd_MQ;F73AzXo6cuP1}6ju~ylofBTO@r=bG!%f+L(xX`CsZJ+ z@birTga$`b1DvPXtO)0MP%~o#*CmKe>5=GY4rw6gAu0@qbV_>Sa2#A0E_UPp&tp~< z3x1=yl5DlJ0dw~z#3cTWw@0}WY338`Hhvk5K+e5-lQ53mSw02)=1%@TFPw{-8^HzV zMsgwQ#eM%H!B0QRDi1%_;s0cnhq3_^_kY3G-$Cd9Qh5X}#h;P#+JCTbGG+9HHW{V~ zYkr%dVRMGeB?x5GYPa01INW&Ep!pD76kqtk9Y%~KDB&@T3HdLj_cM5GTF zBmVl=>L8q6U+nMIfeYL&I*i*SEK~Td>;N z+MYSn0#@7GF$MCyhTLb)pgNRQMts-;1SJFqe^hELX-^tAk#PUf2OqUW7-2;0hw4?2DgMH^Uv$JLt_CHKJSR85n+Ebv7hX{wQmzKS z$=->zOlMcLiey!=HLN73lH&t}2R+;D6U04JEf`*bi)jau(ivx6pC+@TW^nG3Ro zdt-cnpQ}Maw8?m>4+^untL&y(=&^c?*k9^ZZ(MjM#3|rypOY=3Go4`dYpghwrkD z@>K_JBBjsv+7AU5>nMkFPJA$$l3cm%4-t22Mb}S=;~h0GYKv#-(Pd1X3sqOYB$26; zA~i5DV7t`f>JMG!clxoYZQ@<1z+{Eiiyw|QP4RtVj%(*-K?6HA48%8<;hbhFCKVjG zr323bufUc9L@~l@wReHD89>7xjxSLV7w2&?yX+45O~G*ShU<2x=g83|G6e*SkEhHN zP6I*}Rx2lozrJo;!~>?8or&V_Z=#jz2Mayk zbKok15{zi1!S9u8l>nS5ID1ptE#;KA;LU|p|LCge*&V)y7b|dY!L6nWWRQ|YN0ix* zg=1N#bE#x=f-G8FTd69H2k(AgAP4R)qfKKT)K9M+7DwvKJaoe+=}U(;r43zl;`f ze|Uq5otrNvViN8~b04=hE8UPN|IF4j>BZ{wLiqzSSoPxi)br#dqq8kfE)vF#-2RF< z#e+R>7O{FW9ol`f%jI!$@*_H}{@XQT1qT+e6t@(9%+k(?YPRD`vv)nU{?{d2IOvpt!^@nq3_bPjIJ zv!dfZztBQqwNhl==_$39hf}MoETL^JJ0Fk-W+A^sKMdIEaIwe;V)1sLG74nx?h-7Q ztED_+O19lMndWX7m**Lm-tex1;zyUc+|GtV4;WN;>Zd~OJk7az(<9h=Cp276)>@5@ zKR-3A)2@T5unr?MOw~LdLmwBEHFVgGedeo$S%`1!+d8gF%u_Lvr#M*~HU3?2RW*jk_J&M69Oly*Up4rQ+Z@-?xGo1O4=H&g^0x%2MdTwDy6f zT@J=x$Tf^kvvf4$HP>-r7K852^md7Jzh!oYg1Jy!VJ2_=`uB*+n8Ef zQ$U;J>;m99QT!_^{-bMQEsgHqtDjX+=(09gFG%h>I^ns!p{gZS!EPNMc6~)UV*)kj z{3l)+<$B3hEB3E#KYe5}rk)I`#pg^7xqTPCm<{3o>#?RxPL!H!1h$s*>BWpOR^=j&KO%J|jYFKIN`R01Y&4X0gK56IC zIEM5KW5WTM#5BHd%Xc<=&JcH_eS_Wi(x(z!pNrz?T{51e$UWrl{u$A@rIw1zo$*Gf z8W_9h_GrqP2r2N}w^3#XNGCF>+G;sc-zQjUBN2?5^8=GM~xJj%1zD(^LcHjPj9ViwrYpo)F)p zyH?-&MmBG@RLdUI4_Vfl9Ph$x%B?#nNktyiCH6mpU@Shj=EC*0j6-L+zhQfX%$2OF=xEEsq32<&>aNzLiE!4kwbOOXB$5F737 zryjJ#dKsSsz=UFaGZ2@dx`?lDAj2n3bXs=KM8qiZU(BAPmF|`j z7EY2{MKe&q?*>;-+~>*)>5z9L>?L=6P-6q6WbM!JHbU@w$=z*MmoC_5SPnFl709s5 z_=fXiaz_gazcN!@bNOWJ^aNJd(LeKSIxshK7qKOmm_xJNifdt7Ty2;(zoEvHApST5 zAt7i)PDk5VA+glp*WNfF^8P3p5eSe@etkAf*vwzbH33ZIpfKKqrGt(v}R8z8C8Ffjc5T#(ynUV%T5TD>9 z;~SY7_N6*GsY?@iGQXP;@#ykQ1YavTn9Dp)4Rv1)PcI8DlJ1p>uV;6oKxC}j^dvq&SK;VT#KKiF~fNSje#{8 zA9kmvwBzK}gl?Rjx;~u(oGcb4%eYt?{Ec)LCK-2R?rk?ett7oCv?{K%umJSZ2}=uSUH z={48H6#NB;xSlDiIwZOvOV(y`9v8I>l4bj$C&`;Ww`%J=@sTR15f;UN*H0#SMFy=Qo@ zdgpy8jsIs|SJP&HjqT)*s~=3*Fuj_{G@56>?wr#o5lF+=EShv{mB&#vw3XVjcuPm7 z#8bk<@VWZb9O7z`>}P~{rZf=~S4|D>nLWIFQ&PbdoKtEK`lx>WUi%*Vh zu{OeCz7>mPmp%7QGLRTozK`<_-Z#v2BpXzGgls4kID?+6NhKr}znY?Vny5hC$H_m~ zA5AJ=vGdX80^E~gDEusrHC(pGxkSclJu|61m7GM@F#T?b7q(1#okBlsIgSa_<^NFn zLd&GXN|An`-RL`ND?-r2NeUCsp8`l!gW^4Ff~hnQV+>qXVa<`(hm_~1Lu%9G4duVF z%DW}bB|e=rT4m6HO`KS}!ZZ4P@V>0S5-niTeGRK_?!LCijX)vsXR-I*l!)p^-uK`a z*PsPXbYGKKH@9Eg6F?G|c*%%M;QpkmK1SIDkHX@nm~2@Q=}?+W6;iclsLV2>k?`%x z?1#+FjWKv4cXLdiY(dntK3*m^x@C?=9#K?4&914AoX{a8J#n|?NarQfYqx((C=Sub zyPSD;%*8(8)^X3Hq}D{Lt3?MC+gl$J%z ziA^(j&}Ytojt!hDoMxYq`V>p^YKwhxv1@IN<9Lie3=BDyo<0Et7Xe6FEzkj-fu@Kc|x5 zm)V)@tkU6~5TMP#yEuADr?aIjSsM0!BBG9!b%Go4$WvQ2;`>~|DYY^ZQZ@K--Py+$Rga>CU1411ut*r;AN)7%&9dFg}d#!!x6QK)Rv9S zVCY|=BQ{N~$W+xRsF_?L_1XUl!%v#*A+6qR3?Cyzi^EsgVk&3MFgy{Q(TiiU8xT%= zv?XxEA2F{m%14Qkr!l@e%bvTj3w{-+#q;ZkKzusiYQVW(@j_{g>jF`h2xa^d6vYus zj@z_V->i#;(bQ2A3KRU#lu3CT@Ibn=Z*!dS9H)Jp7$eAz+6_Jb2xh1x1Tby+t0d24 z^k^W`>=Qm#(0(`_?{qH75Tom|pqFKM;XbR%3!zE-83y)l~+yL^$0jp-8^Ni2EU{?da!7vVuRPjVQA%$&}x&v!2DelrjR zB9altffauRTMpXEqs&$p5v4_)j&=U2uDw>17d3ogP$;-fTGaf+ZSCYsXCgOE zkO$C+QX^!mbhT3Ucl^tfTW3FjskGjVy^yTIc42|*+eq8Zehu5bCgJJN-+La3EmQ#O zJy>pO;_LL=><~+1dX`s@4dg{H|Ng&A(*@s$XlWeB_phK7K5d49h#{ zIX71frUgM^b>*#V!#)uQ3)WKFUlP02xbk*_Uood}rT7g^CZ$J$OmK;r2& z6O4-~7b9k#ZbCWHd5w-(6|DArkDLzO&|EQgM;o)GI%bt4qqBY-wX0YH7ihWXBZBMa zYe4)OcE%W&o^T)gsU09F%aUSmWK^1QVn0ejOYtWoV4D1lG0D`G`Q}jPw^u7rAw^w}AhOUf*Khc>(fJXL-L# z`P^5J8Sf2-ZXyW6Lk^9nA31R_271Q%{fHd^b8puZ;CjFrHzr+Ck00058J%G_{P8$o zsnCzd9_^~&4U-M2NZu9My7jr+FbMlXK*$E&o#8H8V7YqraeT59?PL9Rm+h`Ee;Gv8 zJn8)Evw_$T%rJT{64L~Pd@zr`{itnR<(iVO?k9G_cQG~~rM!uHH-Z+f`58WPa0Z5RJ(m8h8RR1l&5|F506on_Bk_?C;%yId4l7_p!BeYuiVk{<{yT6RSBE7bdQ- zmsGv+Ei>)2H|xCxR(F#G{fEt3>OVs0#dwtH#cqKA2Bj=+Jbx^584U*}gPCmZfSayV zflRx>f|$V92dC|&GiT_Dm0GKxM)Kge*n_yjgdPKWRm6EfmEt_DDx%R2(@RgZA}6OQ z{Q&>(gC#_q9uT62R0U5ev;?DA6Sq)-{2YnTp74^T`MXRDP)t-^A7f)08Fbgjn2GkK z9NXnDp(Li@M=5 z_V3}zB=BV7N8+%Y8|*E5HwVS_myeL2!a7!bU+QV{5W_*l`?YNS2W232@2N0N15A-o6cp3sZ?bBnOpnz^IB=mxK?yqv&j4RF7(hjgHczJ+usxCA`Vr1<*;52Sms ztAo*J1Hz-39|HAq9FkJIJtWn<>d-z|>}Wbv>^Rhx_ek_$#9;MS=i8x#ysylD=SE~{ z4u+q#&sS}y<^T0^Zta8AX~*sUL_xNOAr611*3*LRb&Z-GJ1PFWZ18a`;&!kV+3FUPk*2IN0BZ@Dsy8&0`Qoa?yZSj(xf?~8G?`Rsd)?8} zpZeF=R!gLOtb~{`v}T>+ceW^0IA;BTyBZBtxfQaSDt~D2v@Z za(hcI;j#EBD7?8VQf%znuBo;7*e5z`WtW8{(dOh#<>l5(0s7CZ(68a*yJLaSNgprxcw}nt@%nT z{Xm8|WpGFMX9s2)rgI)q5gxOHZIUI0s#b;v9VG%o5?o@em#o7a(ZL;BZ(z0JrgYR~ zluQnn1VQG_8|!gUWNZL%-x|dhrzsz(j#8m(u1OiiqCC;UdQANMq8NFLvChTg1hUY# z_VWypN^n$Us&z?<*qw(p7&3UXOY|{h0A^yQ1YLiHRpqm6a84*^_2tTK>V4)=(U)SX ziDz`TpfuQKSG33sx^~h4I*}J)VHX+2c@`5Iags42wdf0l3MKA_Gh8L_G*T2Z(T-JS z%6^sN98nh-lWT)!lVxBUG(LWJzE_TtjLWL6rdwJubTf_;Na;5{?;PwSM&Kk{{e-)e zAS-wGMoqweG|fvg^!#<5G+ZJ%dQGbIQlt_WF}cu&iC_tkTkWUu<_QNsummV3Boc-# z*y=H~4O|I%QYqau6B-Fvb;R->HTHSj+rH=D3#J<)0q&-7X+I?T5qd)EUUkdX9YRZ< ztl~F}ZzCD%;2V^%$d59kRJQvban6`hSyRbNNEnftjwz%k#23?l(g%zO2MslqUgZ{o zzdLQELHUtZ1RJ(*l&S~K74bn`R=iBgJm@`+RZ?g3@?Nk5=`D5wsIX6=Gjjb7aUz&x z-(``M2uLW8$xw1++;@N;1Xr0h=2NQuk$pf07Gp zkOQLROb)HDg1ux3saaX_Y`8>ri`);ZR9v+)GMyQxYAjZxoq_ufbQ}Q#wUSa&#g<;P zd6^Z#>Pw@Z<_STNV6FJefY)vrC;BZO+Q~-)Z`Rc_qCk5oz5(6gec)jeyHBK+2de&& zm&hB8;&xiFJ<8H+;cL{gslL)!-i{brZn8`@2!p=DiB_{PJ%y_4S~5rHRISo9HG-{M zoM<^qQ!bSJ^gIxHMJmi1q_D6X4Na{`J05%)V69JrBJX2z_k|KJMk)yssj<$^KUhx6 zAiXiHVj!9n-5k735MvE>eTE54O?s2#TpvhnTwi(_FnnL4#ommeg;(^Xfx&nTZFfY;;wGVPI$xU#TgFOz|_wfs^^FhmG3H16IgwD z6lq$I(l=~C%lzBGgStM&E6>sFaZG{+FCSbQlh00rvONCnB52(71T@`E3qZQHIfobf9J3jB$D2jbn6`SQY3Tc! z)GpVLI_?9<&C(t@!i3FtOxJ^_x-ZN<&IPs{OO;Vz!^yKM>sh-e_nT}*H>XhQzBn&# zd_uE2PV_V(4f5_m`e^Gl<-Ir8!gLc)Z`qo!WnPdrj#OUisKU82s&O*I-EN@HpVb9J z-wPd&z%;xr_3YenjjBU#JyFH)eLGUWNZJhmQ=D z69IaXkn=uy7%tr@vJgW6-6*K6XYUR=50tV{k=JJ?=h*kX6OQ_lW`LC3#xb*TwV!i|BV-w^_<*8=}0g1zzkeV-Ci7F%@Zc~8LA^0){S^!6AT%C&4B`q^M%N&?vf1q9wj zjT1(YqqM{f>#6S((^Z%ru%=>wwcH#0RrIhrwh+=tD_!Izw#P`^WwY<)@dl0Y|3szs ztB4To=&^%0C=j)JFR)VEH`+i7E=GRU;1|v8tjf#5S{XQ?oB!5am#E1$dD+hzJ#~;$ z=vbMw#o#cNNgzMr+(0$=7wSANH!ZZj!2s+9? z3$`M4FK;0pd3Euz2*>EnrYx|i(#FvIc%3534p-x31^?hR@BZ$m9SIV+26e6cK}umq z$1KnQ3ybo=)=%JX<@$dcoj3mb4 z{ty?*Ih64+BThd|{0*jSF7?fu4}~X#$9%%?Ba}Q{7(;PmI|@9(UXjLt$cxJsmjsD= zlc$=D0soCXYE)J8(;GmhK3%klfH#w7*uq37anX_6Xz2W?Qa!LZbb+?yAsx^?gj{F0 z!@vjVRjg${;a-?uc6TpOvP{6~GSw$a0<(-Z2CArEFJdjw?zBp=`aMxasd+_`R|StZ zys&&}rG*uI`&W>-Z$$Ef?gJ9It}o~9-lL*kim6R<;d0+TROm0Qczb+M zq}8!?leNh%`!WjUKrt(KUn?r9O_iCX|H~;#yclWau+H!{li-L!uK%wx` zLY+7J_ioP@TjS07{k%Ws%Z|18h*p0mgO4&qE3nRNJ-41^<>{N|N_giRRN82pq~(}+ zwy1DAo>=w})wUy*zP9(i3U_C=x6MrJazax^MnrZkYp;cH%Ff!HHu9|ZV0(XY&~r(T zP#qww`-8Vq;#oxDbS|-MkD^Uhig|5sKvC%qW#v8~dfbp@dGn?i$F}!_jvMBf>2?$K z9BhMVR;}^=<|Au9rprsKgX=8q&plXtgK#HgB^^)K)xEwZJus8@)y_TmV4+T7U|#kv z#SQC^eKbMN&-k%(qjg}%wFPy#| zQ#Id~92I5j_1Cz)bD_Ob$MB+`nT?QXzR)lGsx!8oJB>w#!9`x^l=>~Q2iKo(LtJH( zI84WKf5D7>yc>pP3B26ruQC3d(8&KA>^kr;bLXFpn$DMut^ ziwyS_oDQcwC&79__A@#0{rB|{hQ4MC;X1PsCuf7Ue4YW!Qof{_xm}T~AG()o{7K2p zj-;r!(Jn3&Kgb#$Ni`Bzt?d-p+p;Gp4V?~j@bNd__6Yp^Z3I95mvr3?i8X`I(q%~rMu`aho-Prv{G literal 15103 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

    H2 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 ZANK>zOEe5s!0W6;M*60DbyuC@{}0=z!X5ws literal 13889 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 Zu}<22P{PX$_-Po8sgc#?H-Etr{trx3@&Et; diff --git a/apps/spreadsheeteditor/main/resources/img/toolbar-menu@2x.png b/apps/spreadsheeteditor/main/resources/img/toolbar-menu@2x.png index 0b67bd39ba25d17e8ac615180e57501e2bebc929..523941d68b94bfa283dad214ba38fb6fe8ac7651 100644 GIT binary patch literal 38448 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 UGIKoh>#EbesehwJ!y)qj0WWPJK>z>% diff --git a/apps/spreadsheeteditor/main/resources/less/toolbar.less b/apps/spreadsheeteditor/main/resources/less/toolbar.less index 4dbf880eb..1f18561a5 100644 --- a/apps/spreadsheeteditor/main/resources/less/toolbar.less +++ b/apps/spreadsheeteditor/main/resources/less/toolbar.less @@ -30,7 +30,7 @@ } .font-attr-top { - width: 186px; + width: 243px; > .btn-slot { float: left; @@ -167,6 +167,9 @@ .toolbar-btn-icon(btn-named-range, 77, @toolbar-icon-size); //.toolbar-btn-icon(btn-insertequation, 82, @toolbar-icon-size); +.toolbar-btn-icon(btn-strikeout, 84, @toolbar-icon-size); +.toolbar-btn-icon(btn-subscript, 85, @toolbar-icon-size); +.toolbar-btn-icon(btn-superscript, 86, @toolbar-icon-size); @menu-icon-size: 22px; .menu-btn-icon(mnu-align-center, 0, @menu-icon-size); @@ -206,6 +209,9 @@ // .menu-btn-icon(mnu-border-diagup, 36, @menu-icon-size); .menu-btn-icon(mnu-border-diagdown, 37, @menu-icon-size); +// +.menu-btn-icon(mnu-text-subscript, 38, @menu-icon-size); +.menu-btn-icon(mnu-text-superscript, 39, @menu-icon-size); .username-tip { background-color: #ee3525; @@ -246,7 +252,7 @@ } #slot-field-fontname { - width: 91px; + width: 148px; } #slot-field-fontsize { From 91fb911ba348f64b385989c6ac173c85475da403 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 5 Dec 2017 17:40:52 +0300 Subject: [PATCH 49/86] Fixed opening view mode. --- apps/documenteditor/main/app/controller/Main.js | 2 +- apps/documenteditor/main/app/view/FileMenu.js | 2 +- apps/presentationeditor/main/app/controller/Main.js | 2 +- apps/presentationeditor/main/app/view/FileMenu.js | 6 ++++-- apps/spreadsheeteditor/main/app/controller/Main.js | 2 +- apps/spreadsheeteditor/main/app/view/FileMenu.js | 2 +- 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index 27065437a..d3370f7ee 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -1013,7 +1013,7 @@ define([ this.appOptions.forcesave = this.appOptions.canForcesave; this.appOptions.canEditComments= this.appOptions.isOffline || !(typeof (this.editorConfig.customization) == 'object' && this.editorConfig.customization.commentAuthorOnly); this.appOptions.trialMode = params.asc_getLicenseMode(); - this.appOptions.canProtect = this.appOptions.isDesktopApp && this.api.asc_isSignaturesSupport(); + this.appOptions.canProtect = this.appOptions.isEdit && this.appOptions.isDesktopApp && this.api.asc_isSignaturesSupport(); if ( this.appOptions.isLightVersion ) { this.appOptions.canUseHistory = diff --git a/apps/documenteditor/main/app/view/FileMenu.js b/apps/documenteditor/main/app/view/FileMenu.js index 19fa85f47..8dbc5f775 100644 --- a/apps/documenteditor/main/app/view/FileMenu.js +++ b/apps/documenteditor/main/app/view/FileMenu.js @@ -280,7 +280,7 @@ define([ } } - if (this.mode.isDesktopApp && this.mode.isOffline) { + if (this.mode.isEdit && this.mode.isDesktopApp && this.mode.isOffline) { // this.$el.find('#fm-btn-back').hide(); this.panels['protect'] = (new DE.Views.FileMenuPanels.ProtectDoc({menu:this})).render(); this.panels['protect'].setMode(this.mode); diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js index 1db8d850f..8050bdbc8 100644 --- a/apps/presentationeditor/main/app/controller/Main.js +++ b/apps/presentationeditor/main/app/controller/Main.js @@ -785,7 +785,7 @@ define([ this.appOptions.forcesave = this.appOptions.canForcesave; this.appOptions.canEditComments= this.appOptions.isOffline || !(typeof (this.editorConfig.customization) == 'object' && this.editorConfig.customization.commentAuthorOnly); this.appOptions.trialMode = params.asc_getLicenseMode(); - this.appOptions.canProtect = this.appOptions.isDesktopApp && this.api.asc_isSignaturesSupport(); + this.appOptions.canProtect = this.appOptions.isEdit && this.appOptions.isDesktopApp && this.api.asc_isSignaturesSupport(); this._state.licenseWarning = (licType===Asc.c_oLicenseResult.Connections) && this.appOptions.canEdit && this.editorConfig.mode !== 'view'; diff --git a/apps/presentationeditor/main/app/view/FileMenu.js b/apps/presentationeditor/main/app/view/FileMenu.js index 6d88796be..2485c8398 100644 --- a/apps/presentationeditor/main/app/view/FileMenu.js +++ b/apps/presentationeditor/main/app/view/FileMenu.js @@ -277,8 +277,10 @@ define([ if (this.mode.isDesktopApp && this.mode.isOffline) { this.$el.find('#fm-btn-create, #fm-btn-back, #fm-btn-create+.devider').hide(); - this.panels['protect'] = (new PE.Views.FileMenuPanels.ProtectDoc({menu:this})).render(); - this.panels['protect'].setMode(this.mode); + if (this.mode.isEdit) { + this.panels['protect'] = (new PE.Views.FileMenuPanels.ProtectDoc({menu:this})).render(); + this.panels['protect'].setMode(this.mode); + } } this.panels['help'].setLangConfig(this.mode.lang); diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index 1e3b2146a..3efaae235 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -806,7 +806,7 @@ define([ this.appOptions.canChat = this.appOptions.canLicense && !this.appOptions.isOffline && !((typeof (this.editorConfig.customization) == 'object') && this.editorConfig.customization.chat===false); this.appOptions.canRename = !!this.permissions.rename; this.appOptions.trialMode = params.asc_getLicenseMode(); - this.appOptions.canProtect = this.appOptions.isDesktopApp && this.api.asc_isSignaturesSupport(); + this.appOptions.canProtect = this.appOptions.isEdit && this.appOptions.isDesktopApp && this.api.asc_isSignaturesSupport(); this.appOptions.canBranding = (licType === Asc.c_oLicenseResult.Success) && (typeof this.editorConfig.customization == 'object'); if (this.appOptions.canBranding) diff --git a/apps/spreadsheeteditor/main/app/view/FileMenu.js b/apps/spreadsheeteditor/main/app/view/FileMenu.js index b0ab91eff..4e9c51558 100644 --- a/apps/spreadsheeteditor/main/app/view/FileMenu.js +++ b/apps/spreadsheeteditor/main/app/view/FileMenu.js @@ -266,7 +266,7 @@ define([ } } - if (this.mode.isDesktopApp && this.mode.isOffline) { + if (this.mode.isEdit && this.mode.isDesktopApp && this.mode.isOffline) { this.panels['protect'] = (new SSE.Views.FileMenuPanels.ProtectDoc({menu:this})).render(); this.panels['protect'].setMode(this.mode); } From efbcc8653f96d37257af76b6fac1fa5e36ae0a39 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 5 Dec 2017 18:04:30 +0300 Subject: [PATCH 50/86] [DE][PE] Changes for Bug 35358 (show text in the loader mask). --- apps/documenteditor/main/app/controller/Main.js | 2 +- apps/presentationeditor/main/app/controller/Main.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index d3370f7ee..3b231fc6f 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -646,7 +646,7 @@ define([ case Asc.c_oAscAsyncAction['ForceSaveButton']: clearTimeout(this._state.timerSave); force = true; - title = (!this.appOptions.isOffline) ? this.saveTitleText : ''; + title = this.saveTitleText; text = (!this.appOptions.isOffline) ? this.saveTextText : ''; break; diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js index 8050bdbc8..473a01bae 100644 --- a/apps/presentationeditor/main/app/controller/Main.js +++ b/apps/presentationeditor/main/app/controller/Main.js @@ -458,7 +458,7 @@ define([ case Asc.c_oAscAsyncAction['ForceSaveButton']: clearTimeout(this._state.timerSave); force = true; - title = (!this.appOptions.isOffline) ? this.saveTitleText : ''; + title = this.saveTitleText; text = (!this.appOptions.isOffline) ? this.saveTextText : ''; break; From d7b0a40b996cebf3f6d2b61ced4da828eb114423 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 6 Dec 2017 10:06:45 +0300 Subject: [PATCH 51/86] Fix chart editing in the desktop. --- apps/common/main/lib/controller/ExternalDiagramEditor.js | 2 +- apps/common/main/lib/controller/ExternalMergeEditor.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/common/main/lib/controller/ExternalDiagramEditor.js b/apps/common/main/lib/controller/ExternalDiagramEditor.js index 3a2275a84..ac1f0fc14 100644 --- a/apps/common/main/lib/controller/ExternalDiagramEditor.js +++ b/apps/common/main/lib/controller/ExternalDiagramEditor.js @@ -60,7 +60,7 @@ define([ height : '100%', documentType: 'spreadsheet', document : { - url : '_offline_', + url : '_chart_', permissions : { edit : true, download: false diff --git a/apps/common/main/lib/controller/ExternalMergeEditor.js b/apps/common/main/lib/controller/ExternalMergeEditor.js index 9c17a31b8..7dc992ce7 100644 --- a/apps/common/main/lib/controller/ExternalMergeEditor.js +++ b/apps/common/main/lib/controller/ExternalMergeEditor.js @@ -60,7 +60,7 @@ define([ height : '100%', documentType: 'spreadsheet', document : { - url : '_offline_', + url : '_chart_', permissions : { edit : true, download: false From 654585df8e2ba0a7acdaf6f3d44533339560fe19 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 6 Dec 2017 14:25:29 +0300 Subject: [PATCH 52/86] Fix hiding left plugins panel in the desktop app. --- apps/common/main/lib/view/Plugins.js | 5 +++++ apps/documenteditor/main/app/controller/LeftMenu.js | 7 ++++++- apps/presentationeditor/main/app/controller/LeftMenu.js | 7 ++++++- apps/spreadsheeteditor/main/app/controller/LeftMenu.js | 7 ++++++- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/apps/common/main/lib/view/Plugins.js b/apps/common/main/lib/view/Plugins.js index cdadc1bf8..cf1f0967e 100644 --- a/apps/common/main/lib/view/Plugins.js +++ b/apps/common/main/lib/view/Plugins.js @@ -331,6 +331,11 @@ define([ return btn; }, + hide: function () { + Common.UI.BaseView.prototype.hide.call(this,arguments); + this.fireEvent('hide', this ); + }, + strPlugins: 'Plugins', textLoading: 'Loading', textStart: 'Start', diff --git a/apps/documenteditor/main/app/controller/LeftMenu.js b/apps/documenteditor/main/app/controller/LeftMenu.js index a05ae62e0..2a269feee 100644 --- a/apps/documenteditor/main/app/controller/LeftMenu.js +++ b/apps/documenteditor/main/app/controller/LeftMenu.js @@ -72,7 +72,8 @@ define([ 'hide': _.bind(this.aboutShowHide, this, true) }, 'Common.Views.Plugins': { - 'plugin:open': _.bind(this.onPluginOpen, this) + 'plugin:open': _.bind(this.onPluginOpen, this), + 'hide': _.bind(this.onHidePlugins, this) }, 'LeftMenu': { 'comments:show': _.bind(this.commentsShowHide, this, 'show'), @@ -381,6 +382,10 @@ define([ $(this.leftMenu.btnChat.el).blur(); Common.NotificationCenter.trigger('layout:changed', 'leftmenu'); }, + + onHidePlugins: function() { + Common.NotificationCenter.trigger('layout:changed', 'leftmenu'); + }, /** coauthoring end **/ onQuerySearch: function(d, w, opts) { diff --git a/apps/presentationeditor/main/app/controller/LeftMenu.js b/apps/presentationeditor/main/app/controller/LeftMenu.js index 70185b0b5..28797f344 100644 --- a/apps/presentationeditor/main/app/controller/LeftMenu.js +++ b/apps/presentationeditor/main/app/controller/LeftMenu.js @@ -64,7 +64,8 @@ define([ 'click:users': _.bind(this.clickStatusbarUsers, this) }, 'Common.Views.Plugins': { - 'plugin:open': _.bind(this.onPluginOpen, this) + 'plugin:open': _.bind(this.onPluginOpen, this), + 'hide': _.bind(this.onHidePlugins, this) }, 'Common.Views.About': { 'show': _.bind(this.aboutShowHide, this, false), @@ -307,6 +308,10 @@ define([ $(this.leftMenu.btnChat.el).blur(); Common.NotificationCenter.trigger('layout:changed', 'leftmenu'); }, + + onHidePlugins: function() { + Common.NotificationCenter.trigger('layout:changed', 'leftmenu'); + }, /** coauthoring end **/ onQuerySearch: function(d, w, opts) { diff --git a/apps/spreadsheeteditor/main/app/controller/LeftMenu.js b/apps/spreadsheeteditor/main/app/controller/LeftMenu.js index 8019f8848..b88a580f1 100644 --- a/apps/spreadsheeteditor/main/app/controller/LeftMenu.js +++ b/apps/spreadsheeteditor/main/app/controller/LeftMenu.js @@ -51,7 +51,8 @@ define([ 'hide': _.bind(this.onHideChat, this) }, 'Common.Views.Plugins': { - 'plugin:open': _.bind(this.onPluginOpen, this) + 'plugin:open': _.bind(this.onPluginOpen, this), + 'hide': _.bind(this.onHidePlugins, this) }, 'Common.Views.Header': { 'click:users': _.bind(this.clickStatusbarUsers, this) @@ -342,6 +343,10 @@ define([ $(this.leftMenu.btnChat.el).blur(); Common.NotificationCenter.trigger('layout:changed', 'leftmenu'); }, + + onHidePlugins: function() { + Common.NotificationCenter.trigger('layout:changed', 'leftmenu'); + }, /** coauthoring end **/ onQuerySearch: function(d, w, opts) { From 7d3e75e131f1fe375b0b04dfd9214509eb053a1e Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 6 Dec 2017 14:37:06 +0300 Subject: [PATCH 53/86] Update translations for protection in the left menu. --- apps/documenteditor/main/app/view/FileMenu.js | 2 +- apps/documenteditor/main/app/view/FileMenuPanels.js | 4 ++-- apps/documenteditor/main/locale/en.json | 6 +++--- apps/presentationeditor/main/app/view/FileMenu.js | 2 +- apps/presentationeditor/main/app/view/FileMenuPanels.js | 4 ++-- apps/presentationeditor/main/locale/en.json | 6 +++--- apps/spreadsheeteditor/main/app/view/FileMenu.js | 2 +- apps/spreadsheeteditor/main/app/view/FileMenuPanels.js | 4 ++-- apps/spreadsheeteditor/main/locale/en.json | 6 +++--- 9 files changed, 18 insertions(+), 18 deletions(-) diff --git a/apps/documenteditor/main/app/view/FileMenu.js b/apps/documenteditor/main/app/view/FileMenu.js index 8dbc5f775..f15050312 100644 --- a/apps/documenteditor/main/app/view/FileMenu.js +++ b/apps/documenteditor/main/app/view/FileMenu.js @@ -378,6 +378,6 @@ define([ textDownload : 'Download', btnRenameCaption : 'Rename...', btnCloseMenuCaption : 'Close Menu', - btnProtectCaption: 'Protect\\Sign' + btnProtectCaption: 'Protect' }, DE.Views.FileMenu || {})); }); diff --git a/apps/documenteditor/main/app/view/FileMenuPanels.js b/apps/documenteditor/main/app/view/FileMenuPanels.js index 0d4d5e269..93fe8106d 100644 --- a/apps/documenteditor/main/app/view/FileMenuPanels.js +++ b/apps/documenteditor/main/app/view/FileMenuPanels.js @@ -1254,7 +1254,7 @@ define([ }, strProtect: 'Protect Document', - strSignature: 'Signature', + strSignature: 'With Signature', txtView: 'View signatures', txtEdit: 'Edit document', txtSigned: 'Valid signatures has been added to the document. The document is protected from editing.', @@ -1262,7 +1262,7 @@ define([ txtRequestedSignatures: 'This document needs to be signed.', notcriticalErrorTitle: 'Warning', txtEditWarning: 'Editing will remove the signatures from the document.
    Are you sure you want to continue?', - strEncrypt: 'Password', + strEncrypt: 'With Password', txtEncrypted: 'This document has been protected by password' }, DE.Views.FileMenuPanels.ProtectDoc || {})); diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index 8096bb0a3..8242e6bf5 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -1010,7 +1010,7 @@ "DE.Views.FileMenu.btnSettingsCaption": "Advanced Settings...", "DE.Views.FileMenu.btnToEditCaption": "Edit Document", "DE.Views.FileMenu.textDownload": "Download", - "DE.Views.FileMenu.btnProtectCaption": "Protect\\Sign", + "DE.Views.FileMenu.btnProtectCaption": "Protect", "DE.Views.FileMenuPanels.CreateNew.fromBlankText": "From Blank", "DE.Views.FileMenuPanels.CreateNew.fromTemplateText": "From Template", "DE.Views.FileMenuPanels.CreateNew.newDescriptionText": "Create a new blank text document which you will be able to style and format after it is created during the editing. Or choose one of the templates to start a document of a certain type or purpose where some styles have already been pre-applied.", @@ -1032,7 +1032,7 @@ "DE.Views.FileMenuPanels.DocumentRights.txtBtnAccessRights": "Change access rights", "DE.Views.FileMenuPanels.DocumentRights.txtRights": "Persons who have rights", "DE.Views.FileMenuPanels.ProtectDoc.strProtect": "Protect Document", - "DE.Views.FileMenuPanels.ProtectDoc.strSignature": "Signature", + "DE.Views.FileMenuPanels.ProtectDoc.strSignature": "With Signature", "DE.Views.FileMenuPanels.ProtectDoc.txtView": "View signatures", "DE.Views.FileMenuPanels.ProtectDoc.txtEdit": "Edit document", "DE.Views.FileMenuPanels.ProtectDoc.txtSigned": "Valid signatures has been added to the document. The document is protected from editing.", @@ -1040,7 +1040,7 @@ "DE.Views.FileMenuPanels.ProtectDoc.txtRequestedSignatures": "This document needs to be signed.", "DE.Views.FileMenuPanels.ProtectDoc.notcriticalErrorTitle": "Warning", "DE.Views.FileMenuPanels.ProtectDoc.txtEditWarning": "Editing will remove the signatures from the document.
    Are you sure you want to continue?", - "DE.Views.FileMenuPanels.ProtectDoc.strEncrypt": "Password", + "DE.Views.FileMenuPanels.ProtectDoc.strEncrypt": "With Password", "DE.Views.FileMenuPanels.ProtectDoc.txtEncrypted": "This document has been protected by password", "DE.Views.FileMenuPanels.Settings.okButtonText": "Apply", "DE.Views.FileMenuPanels.Settings.strAlignGuides": "Turn on alignment guides", diff --git a/apps/presentationeditor/main/app/view/FileMenu.js b/apps/presentationeditor/main/app/view/FileMenu.js index 2485c8398..bc10f274a 100644 --- a/apps/presentationeditor/main/app/view/FileMenu.js +++ b/apps/presentationeditor/main/app/view/FileMenu.js @@ -375,6 +375,6 @@ define([ btnSaveAsCaption : 'Save as', btnRenameCaption : 'Rename...', btnCloseMenuCaption : 'Close Menu', - btnProtectCaption: 'Protect\\Sign' + btnProtectCaption: 'Protect' }, PE.Views.FileMenu || {})); }); diff --git a/apps/presentationeditor/main/app/view/FileMenuPanels.js b/apps/presentationeditor/main/app/view/FileMenuPanels.js index 5ba05a4f0..95a2a4dbb 100644 --- a/apps/presentationeditor/main/app/view/FileMenuPanels.js +++ b/apps/presentationeditor/main/app/view/FileMenuPanels.js @@ -1017,14 +1017,14 @@ define([ }, strProtect: 'Protect Presentation', - strSignature: 'Signature', + strSignature: 'With Signature', txtView: 'View signatures', txtEdit: 'Edit presentation', txtSigned: 'Valid signatures has been added to the presentation. The presentation is protected from editing.', txtSignedInvalid: 'Some of the digital signatures in presentation are invalid or could not be verified. The presentation is protected from editing.', notcriticalErrorTitle: 'Warning', txtEditWarning: 'Editing will remove the signatures from the presentation.
    Are you sure you want to continue?', - strEncrypt: 'Password', + strEncrypt: 'With Password', txtEncrypted: 'This presentation has been protected by password' }, PE.Views.FileMenuPanels.ProtectDoc || {})); diff --git a/apps/presentationeditor/main/locale/en.json b/apps/presentationeditor/main/locale/en.json index 33d2ac95e..11567d3f5 100644 --- a/apps/presentationeditor/main/locale/en.json +++ b/apps/presentationeditor/main/locale/en.json @@ -860,7 +860,7 @@ "PE.Views.FileMenu.btnSaveCaption": "Save", "PE.Views.FileMenu.btnSettingsCaption": "Advanced Settings...", "PE.Views.FileMenu.btnToEditCaption": "Edit Presentation", - "PE.Views.FileMenu.btnProtectCaption": "Protect\\Sign", + "PE.Views.FileMenu.btnProtectCaption": "Protect", "PE.Views.FileMenuPanels.CreateNew.fromBlankText": "From Blank", "PE.Views.FileMenuPanels.CreateNew.fromTemplateText": "From Template", "PE.Views.FileMenuPanels.CreateNew.newDescriptionText": "Create a new blank presentation which you will be able to style and format after it is created during the editing. Or choose one of the templates to start a presentation of a certain type or purpose where some styles have already been pre-applied.", @@ -875,14 +875,14 @@ "PE.Views.FileMenuPanels.DocumentRights.txtBtnAccessRights": "Change access rights", "PE.Views.FileMenuPanels.DocumentRights.txtRights": "Persons who have rights", "PE.Views.FileMenuPanels.ProtectDoc.strProtect": "Protect Presentation", - "PE.Views.FileMenuPanels.ProtectDoc.strSignature": "Signature", + "PE.Views.FileMenuPanels.ProtectDoc.strSignature": "With Signature", "PE.Views.FileMenuPanels.ProtectDoc.txtView": "View signatures", "PE.Views.FileMenuPanels.ProtectDoc.txtEdit": "Edit presentation", "PE.Views.FileMenuPanels.ProtectDoc.txtSigned": "Valid signatures has been added to the presentation. The presentation is protected from editing.", "PE.Views.FileMenuPanels.ProtectDoc.txtSignedInvalid": "Some of the digital signatures in presentation are invalid or could not be verified. The presentation is protected from editing.", "PE.Views.FileMenuPanels.ProtectDoc.notcriticalErrorTitle": "Warning", "PE.Views.FileMenuPanels.ProtectDoc.txtEditWarning": "Editing will remove the signatures from the presentation.
    Are you sure you want to continue?", - "PE.Views.FileMenuPanels.ProtectDoc.strEncrypt": "Password", + "PE.Views.FileMenuPanels.ProtectDoc.strEncrypt": "With Password", "PE.Views.FileMenuPanels.ProtectDoc.txtEncrypted": "This presentation has been protected by password", "PE.Views.FileMenuPanels.Settings.okButtonText": "Apply", "PE.Views.FileMenuPanels.Settings.strAlignGuides": "Turn on alignment guides", diff --git a/apps/spreadsheeteditor/main/app/view/FileMenu.js b/apps/spreadsheeteditor/main/app/view/FileMenu.js index 4e9c51558..bd54b5d3e 100644 --- a/apps/spreadsheeteditor/main/app/view/FileMenu.js +++ b/apps/spreadsheeteditor/main/app/view/FileMenu.js @@ -355,6 +355,6 @@ define([ btnSaveAsCaption : 'Save as', btnRenameCaption : 'Rename...', btnCloseMenuCaption : 'Close Menu', - btnProtectCaption: 'Protect\\Sign' + btnProtectCaption: 'Protect' }, SSE.Views.FileMenu || {})); }); diff --git a/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js b/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js index 3b02fbfb8..dced1dda8 100644 --- a/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js +++ b/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js @@ -1490,7 +1490,7 @@ define([ }, strProtect: 'Protect Workbook', - strSignature: 'Signature', + strSignature: 'With Signature', txtView: 'View signatures', txtEdit: 'Edit workbook', txtSigned: 'Valid signatures has been added to the workbook. The workbook is protected from editing.', @@ -1498,7 +1498,7 @@ define([ txtRequestedSignatures: 'This workbook needs to be signed.', notcriticalErrorTitle: 'Warning', txtEditWarning: 'Editing will remove the signatures from the workbook.
    Are you sure you want to continue?', - strEncrypt: 'Password', + strEncrypt: 'With Password', txtEncrypted: 'This workbook has been protected by password' }, SSE.Views.FileMenuPanels.ProtectDoc || {})); diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json index 51619c002..0a626e334 100644 --- a/apps/spreadsheeteditor/main/locale/en.json +++ b/apps/spreadsheeteditor/main/locale/en.json @@ -1124,7 +1124,7 @@ "SSE.Views.FileMenu.btnSaveCaption": "Save", "SSE.Views.FileMenu.btnSettingsCaption": "Advanced Settings...", "SSE.Views.FileMenu.btnToEditCaption": "Edit Spreadsheet", - "SSE.Views.FileMenu.btnProtectCaption": "Protect\\Sign", + "SSE.Views.FileMenu.btnProtectCaption": "Protect", "SSE.Views.FileMenuPanels.CreateNew.fromBlankText": "From Blank", "SSE.Views.FileMenuPanels.CreateNew.fromTemplateText": "From Template", "SSE.Views.FileMenuPanels.CreateNew.newDescriptionText": "Create a new blank spreadsheet which you will be able to style and format after it is created during the editing. Or choose one of the templates to start a spreadsheet of a certain type or purpose where some styles have already been pre-applied.", @@ -1180,7 +1180,7 @@ "SSE.Views.FileMenuPanels.Settings.txtGeneral": "General", "SSE.Views.FileMenuPanels.Settings.txtPageSettings": "Page Settings", "SSE.Views.FileMenuPanels.ProtectDoc.strProtect": "Protect Workbook", - "SSE.Views.FileMenuPanels.ProtectDoc.strSignature": "Signature", + "SSE.Views.FileMenuPanels.ProtectDoc.strSignature": "With Signature", "SSE.Views.FileMenuPanels.ProtectDoc.txtView": "View signatures", "SSE.Views.FileMenuPanels.ProtectDoc.txtEdit": "Edit workbook", "SSE.Views.FileMenuPanels.ProtectDoc.txtSigned": "Valid signatures has been added to the workbook. The workbook is protected from editing.", @@ -1188,7 +1188,7 @@ "SSE.Views.FileMenuPanels.ProtectDoc.txtRequestedSignatures": "This workbook needs to be signed.", "SSE.Views.FileMenuPanels.ProtectDoc.notcriticalErrorTitle": "Warning", "SSE.Views.FileMenuPanels.ProtectDoc.txtEditWarning": "Editing will remove the signatures from the workbook.
    Are you sure you want to continue?", - "SSE.Views.FileMenuPanels.ProtectDoc.strEncrypt": "Password", + "SSE.Views.FileMenuPanels.ProtectDoc.strEncrypt": "With Password", "SSE.Views.FileMenuPanels.ProtectDoc.txtEncrypted": "This workbook has been protected by password", "SSE.Views.FormatSettingsDialog.textCancel": "Cancel", "SSE.Views.FormatSettingsDialog.textCategory": "Category", From ea06c24422fe68de29943f71ca7043459bdfefe5 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 6 Dec 2017 14:40:18 +0300 Subject: [PATCH 54/86] Change font size in the password fields. --- apps/common/main/resources/less/input.less | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/common/main/resources/less/input.less b/apps/common/main/resources/less/input.less index 6ac804fb7..60220b42f 100644 --- a/apps/common/main/resources/less/input.less +++ b/apps/common/main/resources/less/input.less @@ -76,3 +76,7 @@ input.error { ::-ms-clear { display: none; } + +input[type="password"] { + font-size: 16px; +} From 160b6ddfeee259405045f637afc55462a2bade45 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Thu, 7 Dec 2017 15:02:19 +0300 Subject: [PATCH 55/86] Added event for reset plugins list. --- apps/documenteditor/main/app/controller/Main.js | 5 +++++ apps/presentationeditor/main/app/controller/Main.js | 5 +++++ apps/spreadsheeteditor/main/app/controller/Main.js | 9 +++++++-- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index d06f3754b..37690a766 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -861,6 +861,7 @@ define([ pluginsController.setApi(me.api); me.requestPlugins('../../../../plugins.json'); me.api.asc_registerCallback('asc_onPluginsInit', _.bind(me.updatePluginsList, me)); + me.api.asc_registerCallback('asc_onPluginsReset', _.bind(me.resetPluginsList, me)); documentHolderController.setApi(me.api); documentHolderController.createDelayedElements(); @@ -2013,6 +2014,10 @@ define([ if (!uiCustomize) this.getApplication().getController('LeftMenu').enablePlugins(); }, + resetPluginsList: function() { + this.getApplication().getCollection('Common.Collections.Plugins').reset(); + }, + leavePageText: 'You have unsaved changes in this document. Click \'Stay on this Page\' then \'Save\' to save them. Click \'Leave this Page\' to discard all the unsaved changes.', defaultTitleText: 'ONLYOFFICE Document Editor', criticalErrorTitle: 'Error', diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js index a3e4cd3e1..c67c6ebc3 100644 --- a/apps/presentationeditor/main/app/controller/Main.js +++ b/apps/presentationeditor/main/app/controller/Main.js @@ -642,6 +642,7 @@ define([ pluginsController.setApi(me.api); me.requestPlugins('../../../../plugins.json'); me.api.asc_registerCallback('asc_onPluginsInit', _.bind(me.updatePluginsList, me)); + me.api.asc_registerCallback('asc_onPluginsReset', _.bind(me.resetPluginsList, me)); documentHolderController.setApi(me.api); documentHolderController.createDelayedElements(); @@ -1785,6 +1786,10 @@ define([ if (!uiCustomize) this.getApplication().getController('LeftMenu').enablePlugins(); }, + resetPluginsList: function() { + this.getApplication().getCollection('Common.Collections.Plugins').reset(); + }, + // Translation leavePageText: 'You have unsaved changes in this document. Click \'Stay on this Page\' then \'Save\' to save them. Click \'Leave this Page\' to discard all the unsaved changes.', defaultTitleText: 'ONLYOFFICE Presentation Editor', diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index fc2ba9bf3..64a3d867f 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -631,7 +631,8 @@ define([ pluginsController.setApi(me.api); me.requestPlugins('../../../../plugins.json'); me.api.asc_registerCallback('asc_onPluginsInit', _.bind(me.updatePluginsList, me)); - } + me.api.asc_registerCallback('asc_onPluginsReset', _.bind(me.resetPluginsList, me)); + } leftMenuView.disableMenu('all',false); @@ -1980,7 +1981,11 @@ define([ } if (!uiCustomize) this.getApplication().getController('LeftMenu').enablePlugins(); }, - + + resetPluginsList: function() { + this.getApplication().getCollection('Common.Collections.Plugins').reset(); + }, + leavePageText: 'You have unsaved changes in this document. Click \'Stay on this Page\' then \'Save\' to save them. Click \'Leave this Page\' to discard all the unsaved changes.', criticalErrorTitle: 'Error', notcriticalErrorTitle: 'Warning', From 4b4bef4e0b63b20ed82535091822a9dee7cdee77 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Thu, 7 Dec 2017 17:46:13 +0300 Subject: [PATCH 56/86] Added groups for plugins. --- apps/common/main/lib/controller/Plugins.js | 11 ++++++++++- apps/common/main/lib/model/Plugin.js | 4 +++- .../documenteditor/main/app/controller/Main.js | 18 +++++++++++++++--- .../main/app/controller/Main.js | 18 +++++++++++++++--- .../main/app/controller/Main.js | 18 +++++++++++++++--- 5 files changed, 58 insertions(+), 11 deletions(-) diff --git a/apps/common/main/lib/controller/Plugins.js b/apps/common/main/lib/controller/Plugins.js index c5d98ef50..be37b5b57 100644 --- a/apps/common/main/lib/controller/Plugins.js +++ b/apps/common/main/lib/controller/Plugins.js @@ -192,13 +192,22 @@ define([ if ( me.$toolbarPanelPlugins ) { me.$toolbarPanelPlugins.empty(); - var _group = $('

    '); + var _group = $('
    '), + rank = -1; collection.each(function (model) { + var new_rank = model.get('groupRank'); + if (new_rank!==rank && rank>-1) { + _group.appendTo(me.$toolbarPanelPlugins); + $('
    ').appendTo(me.$toolbarPanelPlugins); + _group = $('
    '); + } + var btn = me.panelPlugins.createPluginButton(model); if (btn) { var $slot = $('').appendTo(_group); btn.render($slot); } + rank = new_rank; }); _group.appendTo(me.$toolbarPanelPlugins); } diff --git a/apps/common/main/lib/model/Plugin.js b/apps/common/main/lib/model/Plugin.js index 8069a9c29..2b1b73602 100644 --- a/apps/common/main/lib/model/Plugin.js +++ b/apps/common/main/lib/model/Plugin.js @@ -84,7 +84,9 @@ define([ pluginObj: undefined, allowSelected: false, selected: false, - visible: true + visible: true, + groupName: '', + groupRank: 0 } } }); diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index 17ae18aea..6794bfd05 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -1994,15 +1994,27 @@ define([ baseUrl : item.baseUrl, variations: variationsArr, currentVariation: 0, - visible: pluginVisible + visible: pluginVisible, + groupName: (item.group) ? item.group.name : '', + groupRank: (item.group) ? item.group.rank : 0 })); }); if ( uiCustomize!==false ) // from ui customizer in editor config or desktop event this.UICustomizePlugins = arrUI; - if ( !uiCustomize ) { - if (pluginStore) pluginStore.add(arr); + if ( !uiCustomize && pluginStore) { + arr = pluginStore.models.concat(arr); + arr.sort(function(a, b){ + var rank_a = a.get('groupRank'), + rank_b = b.get('groupRank'); + if (rank_a < rank_b) + return (rank_a==0) ? 1 : -1; + if (rank_a > rank_b) + return (rank_b==0) ? -1 : 1; + return 0; + }); + pluginStore.reset(arr); this.appOptions.canPlugins = !pluginStore.isEmpty(); } } else if (!uiCustomize){ diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js index dfa2c8e2c..1fc3d1ff7 100644 --- a/apps/presentationeditor/main/app/controller/Main.js +++ b/apps/presentationeditor/main/app/controller/Main.js @@ -1766,15 +1766,27 @@ define([ baseUrl : item.baseUrl, variations: variationsArr, currentVariation: 0, - visible: pluginVisible + visible: pluginVisible, + groupName: (item.group) ? item.group.name : '', + groupRank: (item.group) ? item.group.rank : 0 })); }); if (uiCustomize!==false) // from ui customizer in editor config or desktop event this.UICustomizePlugins = arrUI; - if ( !uiCustomize ) { - if (pluginStore) pluginStore.add(arr); + if ( !uiCustomize && pluginStore) { + arr = pluginStore.models.concat(arr); + arr.sort(function(a, b){ + var rank_a = a.get('groupRank'), + rank_b = b.get('groupRank'); + if (rank_a < rank_b) + return (rank_a==0) ? 1 : -1; + if (rank_a > rank_b) + return (rank_b==0) ? -1 : 1; + return 0; + }); + pluginStore.reset(arr); this.appOptions.canPlugins = !pluginStore.isEmpty(); } } else if (!uiCustomize){ diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index 1729e2d0e..28bdbc31f 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -1962,15 +1962,27 @@ define([ baseUrl : item.baseUrl, variations: variationsArr, currentVariation: 0, - visible: pluginVisible + visible: pluginVisible, + groupName: (item.group) ? item.group.name : '', + groupRank: (item.group) ? item.group.rank : 0 })); }); if (uiCustomize!==false) // from ui customizer in editor config or desktop event this.UICustomizePlugins = arrUI; - if (!uiCustomize) { - if (pluginStore) pluginStore.add(arr); + if ( !uiCustomize && pluginStore) { + arr = pluginStore.models.concat(arr); + arr.sort(function(a, b){ + var rank_a = a.get('groupRank'), + rank_b = b.get('groupRank'); + if (rank_a < rank_b) + return (rank_a==0) ? 1 : -1; + if (rank_a > rank_b) + return (rank_b==0) ? -1 : 1; + return 0; + }); + pluginStore.reset(arr); this.appOptions.canPlugins = !pluginStore.isEmpty(); } } else if (!uiCustomize){ From 72da619d3ffff6f40a918571fa343234a1b45b80 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 8 Dec 2017 14:01:56 +0300 Subject: [PATCH 57/86] [SSE] Fixed loading formula description in the desktop. --- apps/spreadsheeteditor/main/app/view/FormulaLang.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/spreadsheeteditor/main/app/view/FormulaLang.js b/apps/spreadsheeteditor/main/app/view/FormulaLang.js index 5625516d7..189a22f30 100644 --- a/apps/spreadsheeteditor/main/app/view/FormulaLang.js +++ b/apps/spreadsheeteditor/main/app/view/FormulaLang.js @@ -97,7 +97,8 @@ define([ if (xhrObj && lang) { xhrObj.open('GET', 'resources/formula-lang/' + lang + '_desc.json', false); xhrObj.send(''); - if (xhrObj.status == 200) + if (xhrObj.status==200 || + (xhrObj.status==0 && !!xhrObj.responseURL && xhrObj.responseURL.startsWith('file://'))) langDescJson[lang] = eval("(" + xhrObj.responseText + ")"); else { xhrObj.open('GET', 'resources/formula-lang/en_desc.json', false); From e860c0150ae43a9d8d987cff2a84240f7c846e0b Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 11 Dec 2017 14:29:27 +0300 Subject: [PATCH 58/86] Update translations. --- apps/documenteditor/main/locale/en.json | 117 +++++++++++-------- apps/documenteditor/main/locale/it.json | 103 ++++++++++++++++- apps/documenteditor/main/locale/ru.json | 95 ++++++++++++++++ apps/presentationeditor/main/locale/en.json | 76 ++++++------- apps/presentationeditor/main/locale/it.json | 75 +++++++++++- apps/presentationeditor/main/locale/ru.json | 68 +++++++++++ apps/spreadsheeteditor/main/locale/en.json | 110 +++++++++--------- apps/spreadsheeteditor/main/locale/it.json | 119 ++++++++++++++++---- apps/spreadsheeteditor/main/locale/ru.json | 76 +++++++++++++ 9 files changed, 672 insertions(+), 167 deletions(-) diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index 7fc02d70e..1b527836a 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -22,7 +22,7 @@ "Common.Controllers.ReviewChanges.textColor": "Font color", "Common.Controllers.ReviewChanges.textContextual": "Don't add interval between paragraphs of the same style", "Common.Controllers.ReviewChanges.textDeleted": "Deleted:", - "Common.Controllers.ReviewChanges.textDStrikeout": "Double strikeout", + "Common.Controllers.ReviewChanges.textDStrikeout": "Double strikethrough", "Common.Controllers.ReviewChanges.textEquation": "Equation", "Common.Controllers.ReviewChanges.textExact": "exactly", "Common.Controllers.ReviewChanges.textFirstLine": "First line", @@ -58,7 +58,7 @@ "Common.Controllers.ReviewChanges.textSpacing": "Spacing", "Common.Controllers.ReviewChanges.textSpacingAfter": "Spacing after", "Common.Controllers.ReviewChanges.textSpacingBefore": "Spacing before", - "Common.Controllers.ReviewChanges.textStrikeout": "Strikeout", + "Common.Controllers.ReviewChanges.textStrikeout": "Strikethrough", "Common.Controllers.ReviewChanges.textSubScript": "Subscript", "Common.Controllers.ReviewChanges.textSuperScript": "Superscript", "Common.Controllers.ReviewChanges.textTabs": "Change tabs", @@ -185,26 +185,26 @@ "Common.Views.OpenDialog.txtTitleProtected": "Protected File", "Common.Views.PasswordDialog.cancelButtonText": "Cancel", "Common.Views.PasswordDialog.okButtonText": "OK", - "Common.Views.PasswordDialog.txtPassword": "Password", - "Common.Views.PasswordDialog.txtTitle": "Set Password", - "Common.Views.PasswordDialog.txtDescription": "A Password is required to open this document", - "Common.Views.PasswordDialog.txtRepeat": "Repeat password", + "Common.Views.PasswordDialog.txtDescription": "A password is required to open this document", "Common.Views.PasswordDialog.txtIncorrectPwd": "Confirmation password is not identical", + "Common.Views.PasswordDialog.txtPassword": "Password", + "Common.Views.PasswordDialog.txtRepeat": "Repeat password", + "Common.Views.PasswordDialog.txtTitle": "Set Password", "Common.Views.PluginDlg.textLoading": "Loading", "Common.Views.Plugins.groupCaption": "Plugins", "Common.Views.Plugins.strPlugins": "Plugins", "Common.Views.Plugins.textLoading": "Loading", "Common.Views.Plugins.textStart": "Start", "Common.Views.Plugins.textStop": "Stop", - "Common.Views.Protection.txtAddPwd": "Add password", - "Common.Views.Protection.txtEncrypt": "Encrypt", - "Common.Views.Protection.txtSignature": "Signature", "Common.Views.Protection.hintAddPwd": "Encrypt with password", "Common.Views.Protection.hintPwd": "Change or delete password", "Common.Views.Protection.hintSignature": "Add digital signature or signature line", + "Common.Views.Protection.txtAddPwd": "Add password", "Common.Views.Protection.txtChangePwd": "Change password", "Common.Views.Protection.txtDeletePwd": "Delete password", + "Common.Views.Protection.txtEncrypt": "Encrypt", "Common.Views.Protection.txtInvisibleSignature": "Add digital signature", + "Common.Views.Protection.txtSignature": "Signature", "Common.Views.Protection.txtSignatureLine": "Signature line", "Common.Views.RenameDialog.cancelButtonText": "Cancel", "Common.Views.RenameDialog.okButtonText": "Ok", @@ -245,32 +245,32 @@ "Common.Views.ReviewChangesDialog.txtReject": "Reject", "Common.Views.ReviewChangesDialog.txtRejectAll": "Reject All Changes", "Common.Views.ReviewChangesDialog.txtRejectCurrent": "Reject Current Change", - "Common.Views.SignDialog.textTitle": "Sign Document", - "Common.Views.SignDialog.textPurpose": "Purpose for signing this document", - "Common.Views.SignDialog.textCertificate": "Certificate", - "Common.Views.SignDialog.textValid": "Valid from %1 to %2", - "Common.Views.SignDialog.textChange": "Change", "Common.Views.SignDialog.cancelButtonText": "Cancel", "Common.Views.SignDialog.okButtonText": "Ok", + "Common.Views.SignDialog.textBold": "Bold", + "Common.Views.SignDialog.textCertificate": "Certificate", + "Common.Views.SignDialog.textChange": "Change", "Common.Views.SignDialog.textInputName": "Input signer name", - "Common.Views.SignDialog.textUseImage": "or click 'Select Image' to use a picture as signature", + "Common.Views.SignDialog.textItalic": "Italic", + "Common.Views.SignDialog.textPurpose": "Purpose for signing this document", "Common.Views.SignDialog.textSelectImage": "Select Image", "Common.Views.SignDialog.textSignature": "Signature looks as", + "Common.Views.SignDialog.textTitle": "Sign Document", + "Common.Views.SignDialog.textUseImage": "or click 'Select Image' to use a picture as signature", + "Common.Views.SignDialog.textValid": "Valid from %1 to %2", "Common.Views.SignDialog.tipFontName": "Font Name", "Common.Views.SignDialog.tipFontSize": "Font Size", - "Common.Views.SignDialog.textBold": "Bold", - "Common.Views.SignDialog.textItalic": "Italic", - "Common.Views.SignSettingsDialog.textInfo": "Signer Info", - "Common.Views.SignSettingsDialog.textInfoName": "Name", - "Common.Views.SignSettingsDialog.textInfoTitle": "Signer Title", - "Common.Views.SignSettingsDialog.textInfoEmail": "E-mail", - "Common.Views.SignSettingsDialog.textInstructions": "Instructions for Signer", "Common.Views.SignSettingsDialog.cancelButtonText": "Cancel", "Common.Views.SignSettingsDialog.okButtonText": "Ok", - "Common.Views.SignSettingsDialog.txtEmpty": "This field is required", "Common.Views.SignSettingsDialog.textAllowComment": "Allow signer to add comment in the signature dialog", + "Common.Views.SignSettingsDialog.textInfo": "Signer Info", + "Common.Views.SignSettingsDialog.textInfoEmail": "E-mail", + "Common.Views.SignSettingsDialog.textInfoName": "Name", + "Common.Views.SignSettingsDialog.textInfoTitle": "Signer Title", + "Common.Views.SignSettingsDialog.textInstructions": "Instructions for Signer", "Common.Views.SignSettingsDialog.textShowDate": "Show sign date in signature line", "Common.Views.SignSettingsDialog.textTitle": "Signature Settings", + "Common.Views.SignSettingsDialog.txtEmpty": "This field is required", "DE.Controllers.LeftMenu.leavePageText": "All unsaved changes in this document will be lost.
    Click \"Cancel\" then \"Save\" to save them. Click \"OK\" to discard all the unsaved changes.", "DE.Controllers.LeftMenu.newDocumentTitle": "Unnamed document", "DE.Controllers.LeftMenu.notcriticalErrorTitle": "Warning", @@ -360,19 +360,30 @@ "DE.Controllers.Main.titleLicenseExp": "License expired", "DE.Controllers.Main.titleServerVersion": "Editor updated", "DE.Controllers.Main.titleUpdateVersion": "Version changed", + "DE.Controllers.Main.txtAbove": "above", "DE.Controllers.Main.txtArt": "Your text here", "DE.Controllers.Main.txtBasicShapes": "Basic Shapes", + "DE.Controllers.Main.txtBelow": "below", + "DE.Controllers.Main.txtBookmarkError": "Error! Bookmark not defined.", "DE.Controllers.Main.txtButtons": "Buttons", "DE.Controllers.Main.txtCallouts": "Callouts", "DE.Controllers.Main.txtCharts": "Charts", "DE.Controllers.Main.txtDiagramTitle": "Chart Title", "DE.Controllers.Main.txtEditingMode": "Set editing mode...", "DE.Controllers.Main.txtErrorLoadHistory": "History loading failed", + "DE.Controllers.Main.txtEvenPage": "Even Page ", "DE.Controllers.Main.txtFiguredArrows": "Figured Arrows", + "DE.Controllers.Main.txtFirstPage": "First Page ", + "DE.Controllers.Main.txtFooter": "Footer", + "DE.Controllers.Main.txtHeader": "Header", "DE.Controllers.Main.txtLines": "Lines", "DE.Controllers.Main.txtMath": "Math", "DE.Controllers.Main.txtNeedSynchronize": "You have updates", + "DE.Controllers.Main.txtOddPage": "Odd Page ", + "DE.Controllers.Main.txtOnPage": "on page ", "DE.Controllers.Main.txtRectangles": "Rectangles", + "DE.Controllers.Main.txtSameAsPrev": "Same as Previous", + "DE.Controllers.Main.txtSection": " -Section ", "DE.Controllers.Main.txtSeries": "Series", "DE.Controllers.Main.txtStarsRibbons": "Stars & Ribbons", "DE.Controllers.Main.txtStyle_Heading_1": "Heading 1", @@ -840,6 +851,10 @@ "DE.Views.DocumentHolder.spellcheckText": "Spellcheck", "DE.Views.DocumentHolder.splitCellsText": "Split Cell...", "DE.Views.DocumentHolder.splitCellTitleText": "Split Cell", + "DE.Views.DocumentHolder.strDelete": "Remove Signature", + "DE.Views.DocumentHolder.strDetails": "Signature Details", + "DE.Views.DocumentHolder.strSetup": "Signature Setup", + "DE.Views.DocumentHolder.strSign": "Sign", "DE.Views.DocumentHolder.styleText": "Formatting as Style", "DE.Views.DocumentHolder.tableText": "Table", "DE.Views.DocumentHolder.textAlign": "Align", @@ -946,10 +961,6 @@ "DE.Views.DocumentHolder.txtUngroup": "Ungroup", "DE.Views.DocumentHolder.updateStyleText": "Update %1 style", "DE.Views.DocumentHolder.vertAlignText": "Vertical Alignment", - "DE.Views.DocumentHolder.strSign": "Sign", - "DE.Views.DocumentHolder.strDetails": "Signature Details", - "DE.Views.DocumentHolder.strSetup": "Signature Setup", - "DE.Views.DocumentHolder.strDelete": "Remove Signature", "DE.Views.DropcapSettingsAdvanced.cancelButtonText": "Cancel", "DE.Views.DropcapSettingsAdvanced.okButtonText": "Ok", "DE.Views.DropcapSettingsAdvanced.strBorders": "Borders & Fill", @@ -1002,6 +1013,7 @@ "DE.Views.FileMenu.btnHistoryCaption": "Version History", "DE.Views.FileMenu.btnInfoCaption": "Document Info...", "DE.Views.FileMenu.btnPrintCaption": "Print", + "DE.Views.FileMenu.btnProtectCaption": "Protect", "DE.Views.FileMenu.btnRecentFilesCaption": "Open Recent...", "DE.Views.FileMenu.btnRenameCaption": "Rename...", "DE.Views.FileMenu.btnReturnCaption": "Back to Document", @@ -1011,7 +1023,6 @@ "DE.Views.FileMenu.btnSettingsCaption": "Advanced Settings...", "DE.Views.FileMenu.btnToEditCaption": "Edit Document", "DE.Views.FileMenu.textDownload": "Download", - "DE.Views.FileMenu.btnProtectCaption": "Protect", "DE.Views.FileMenuPanels.CreateNew.fromBlankText": "From Blank", "DE.Views.FileMenuPanels.CreateNew.fromTemplateText": "From Template", "DE.Views.FileMenuPanels.CreateNew.newDescriptionText": "Create a new blank text document which you will be able to style and format after it is created during the editing. Or choose one of the templates to start a document of a certain type or purpose where some styles have already been pre-applied.", @@ -1032,17 +1043,22 @@ "DE.Views.FileMenuPanels.DocumentInfo.txtWords": "Words", "DE.Views.FileMenuPanels.DocumentRights.txtBtnAccessRights": "Change access rights", "DE.Views.FileMenuPanels.DocumentRights.txtRights": "Persons who have rights", + "DE.Views.FileMenuPanels.ProtectDoc.notcriticalErrorTitle": "Warning", + "DE.Views.FileMenuPanels.ProtectDoc.strEncrypt": "With password", + "del_DE.Views.FileMenuPanels.ProtectDoc.strInvalid": "Invalid signatures", + "del_DE.Views.FileMenuPanels.ProtectDoc.strInvisibleSign": "Add invisible digital signature", "DE.Views.FileMenuPanels.ProtectDoc.strProtect": "Protect Document", - "DE.Views.FileMenuPanels.ProtectDoc.strSignature": "With Signature", - "DE.Views.FileMenuPanels.ProtectDoc.txtView": "View signatures", + "del_DE.Views.FileMenuPanels.ProtectDoc.strRequested": "Requested signatures", + "DE.Views.FileMenuPanels.ProtectDoc.strSignature": "With signature", + "del_DE.Views.FileMenuPanels.ProtectDoc.strValid": "Valid signatures", + "del_DE.Views.FileMenuPanels.ProtectDoc.strVisibleSign": "Add visible signature", "DE.Views.FileMenuPanels.ProtectDoc.txtEdit": "Edit document", + "DE.Views.FileMenuPanels.ProtectDoc.txtEditWarning": "Editing will remove the signatures from the document.
    Are you sure you want to continue?", + "DE.Views.FileMenuPanels.ProtectDoc.txtEncrypted": "This document has been protected by password", + "DE.Views.FileMenuPanels.ProtectDoc.txtRequestedSignatures": "This document needs to be signed.", "DE.Views.FileMenuPanels.ProtectDoc.txtSigned": "Valid signatures has been added to the document. The document is protected from editing.", "DE.Views.FileMenuPanels.ProtectDoc.txtSignedInvalid": "Some of the digital signatures in document are invalid or could not be verified. The document is protected from editing.", - "DE.Views.FileMenuPanels.ProtectDoc.txtRequestedSignatures": "This document needs to be signed.", - "DE.Views.FileMenuPanels.ProtectDoc.notcriticalErrorTitle": "Warning", - "DE.Views.FileMenuPanels.ProtectDoc.txtEditWarning": "Editing will remove the signatures from the document.
    Are you sure you want to continue?", - "DE.Views.FileMenuPanels.ProtectDoc.strEncrypt": "With Password", - "DE.Views.FileMenuPanels.ProtectDoc.txtEncrypted": "This document has been protected by password", + "DE.Views.FileMenuPanels.ProtectDoc.txtView": "View signatures", "DE.Views.FileMenuPanels.Settings.okButtonText": "Apply", "DE.Views.FileMenuPanels.Settings.strAlignGuides": "Turn on alignment guides", "DE.Views.FileMenuPanels.Settings.strAutoRecover": "Turn on autorecover", @@ -1326,7 +1342,7 @@ "DE.Views.ParagraphSettingsAdvanced.strStrike": "Strikethrough", "DE.Views.ParagraphSettingsAdvanced.strSubscript": "Subscript", "DE.Views.ParagraphSettingsAdvanced.strSuperscript": "Superscript", - "DE.Views.ParagraphSettingsAdvanced.strTabs": "Tab", + "DE.Views.ParagraphSettingsAdvanced.strTabs": "Tabs", "DE.Views.ParagraphSettingsAdvanced.textAlign": "Alignment", "DE.Views.ParagraphSettingsAdvanced.textBackColor": "Background Color", "DE.Views.ParagraphSettingsAdvanced.textBorderColor": "Border Color", @@ -1365,9 +1381,9 @@ "DE.Views.RightMenu.txtMailMergeSettings": "Mail merge settings", "DE.Views.RightMenu.txtParagraphSettings": "Paragraph settings", "DE.Views.RightMenu.txtShapeSettings": "Shape settings", + "DE.Views.RightMenu.txtSignatureSettings": "Signature Settings", "DE.Views.RightMenu.txtTableSettings": "Table settings", "DE.Views.RightMenu.txtTextArtSettings": "Text Art settings", - "DE.Views.RightMenu.txtSignatureSettings": "Signature Settings", "DE.Views.ShapeSettings.strBackground": "Background color", "DE.Views.ShapeSettings.strChange": "Change Autoshape", "DE.Views.ShapeSettings.strColor": "Color", @@ -1418,21 +1434,24 @@ "DE.Views.ShapeSettings.txtTight": "Tight", "DE.Views.ShapeSettings.txtTopAndBottom": "Top and bottom", "DE.Views.ShapeSettings.txtWood": "Wood", + "DE.Views.SignatureSettings.notcriticalErrorTitle": "Warning", + "DE.Views.SignatureSettings.strDelete": "Remove Signature", + "DE.Views.SignatureSettings.strDetails": "Signature Details", + "DE.Views.SignatureSettings.strInvalid": "Invalid signatures", + "del_DE.Views.SignatureSettings.strInvisibleSign": "Add invisible digital signature", + "DE.Views.SignatureSettings.strRequested": "Requested signatures", + "DE.Views.SignatureSettings.strSetup": "Signature Setup", + "DE.Views.SignatureSettings.strSign": "Sign", "DE.Views.SignatureSettings.strSignature": "Signature", "DE.Views.SignatureSettings.strSigner": "Signer", - "DE.Views.SignatureSettings.strRequested": "Requested signatures", "DE.Views.SignatureSettings.strValid": "Valid signatures", - "DE.Views.SignatureSettings.strInvalid": "Invalid signatures", - "DE.Views.SignatureSettings.strSign": "Sign", - "DE.Views.SignatureSettings.strDetails": "Signature Details", - "DE.Views.SignatureSettings.strDelete": "Remove Signature", - "DE.Views.SignatureSettings.strSetup": "Signature Setup", + "del_DE.Views.SignatureSettings.strView": "View", + "del_DE.Views.SignatureSettings.strVisibleSign": "Add visible signature", + "DE.Views.SignatureSettings.txtContinueEditing": "Edit anyway", + "DE.Views.SignatureSettings.txtEditWarning": "Editing will remove the signatures from the document.
    Are you sure you want to continue?", + "DE.Views.SignatureSettings.txtRequestedSignatures": "This document needs to be signed.", "DE.Views.SignatureSettings.txtSigned": "Valid signatures has been added to the document. The document is protected from editing.", "DE.Views.SignatureSettings.txtSignedInvalid": "Some of the digital signatures in document are invalid or could not be verified. The document is protected from editing.", - "DE.Views.SignatureSettings.txtRequestedSignatures": "This document needs to be signed.", - "DE.Views.SignatureSettings.txtContinueEditing": "Edit anyway", - "DE.Views.SignatureSettings.notcriticalErrorTitle": "Warning", - "DE.Views.SignatureSettings.txtEditWarning": "Editing will remove the signatures from the document.
    Are you sure you want to continue?", "DE.Views.Statusbar.goToPageText": "Go to Page", "DE.Views.Statusbar.pageIndexText": "Page {0} of {1}", "DE.Views.Statusbar.tipFitPage": "Fit to page", @@ -1673,7 +1692,7 @@ "DE.Views.Toolbar.textPortrait": "Portrait", "DE.Views.Toolbar.textRight": "Right: ", "DE.Views.Toolbar.textStock": "Stock", - "DE.Views.Toolbar.textStrikeout": "Strikeout", + "DE.Views.Toolbar.textStrikeout": "Strikethrough", "DE.Views.Toolbar.textStyleMenuDelete": "Delete style", "DE.Views.Toolbar.textStyleMenuDeleteAll": "Delete all custom styles", "DE.Views.Toolbar.textStyleMenuNew": "New style from selection", @@ -1687,8 +1706,8 @@ "DE.Views.Toolbar.textTabHome": "Home", "DE.Views.Toolbar.textTabInsert": "Insert", "DE.Views.Toolbar.textTabLayout": "Layout", - "DE.Views.Toolbar.textTabReview": "Review", "DE.Views.Toolbar.textTabProtect": "Protection", + "DE.Views.Toolbar.textTabReview": "Review", "DE.Views.Toolbar.textTitleError": "Error", "DE.Views.Toolbar.textToCurrent": "To current position", "DE.Views.Toolbar.textTop": "Top: ", diff --git a/apps/documenteditor/main/locale/it.json b/apps/documenteditor/main/locale/it.json index 251ffedd7..874052af3 100644 --- a/apps/documenteditor/main/locale/it.json +++ b/apps/documenteditor/main/locale/it.json @@ -183,12 +183,29 @@ "Common.Views.OpenDialog.txtPassword": "Password", "Common.Views.OpenDialog.txtTitle": "Seleziona parametri %1", "Common.Views.OpenDialog.txtTitleProtected": "File protetto", + "Common.Views.PasswordDialog.cancelButtonText": "Annulla", + "Common.Views.PasswordDialog.okButtonText": "OK", + "Common.Views.PasswordDialog.txtDescription": "É richiesta la password per aprire il documento", + "Common.Views.PasswordDialog.txtIncorrectPwd": "la password di conferma non corrisponde", + "Common.Views.PasswordDialog.txtPassword": "Password", + "Common.Views.PasswordDialog.txtRepeat": "Ripeti password", + "Common.Views.PasswordDialog.txtTitle": "Imposta password", "Common.Views.PluginDlg.textLoading": "Caricamento", "Common.Views.Plugins.groupCaption": "Componenti Aggiuntivi", "Common.Views.Plugins.strPlugins": "Plugin", "Common.Views.Plugins.textLoading": "Caricamento", "Common.Views.Plugins.textStart": "Avvio", "Common.Views.Plugins.textStop": "Termina", + "Common.Views.Protection.hintAddPwd": "Crittografa con password", + "Common.Views.Protection.hintPwd": "Modifica o rimuovi password", + "Common.Views.Protection.hintSignature": "Aggiungi firma digitale o riga di firma", + "Common.Views.Protection.txtAddPwd": "Aggiungi password", + "Common.Views.Protection.txtChangePwd": "Modifica password", + "Common.Views.Protection.txtDeletePwd": "Elimina password", + "Common.Views.Protection.txtEncrypt": "Crittografare", + "Common.Views.Protection.txtInvisibleSignature": "Aggiungi firma digitale", + "Common.Views.Protection.txtSignature": "Firma", + "Common.Views.Protection.txtSignatureLine": "Riga della firma", "Common.Views.RenameDialog.cancelButtonText": "Annulla", "Common.Views.RenameDialog.okButtonText": "Ok", "Common.Views.RenameDialog.textName": "Nome del file", @@ -228,6 +245,32 @@ "Common.Views.ReviewChangesDialog.txtReject": "Respingi", "Common.Views.ReviewChangesDialog.txtRejectAll": "Annulla tutte le modifiche", "Common.Views.ReviewChangesDialog.txtRejectCurrent": "Annulla la modifica attuale", + "Common.Views.SignDialog.cancelButtonText": "Annulla", + "Common.Views.SignDialog.okButtonText": "OK", + "Common.Views.SignDialog.textBold": "Grassetto", + "Common.Views.SignDialog.textCertificate": "Certificato", + "Common.Views.SignDialog.textChange": "Cambia", + "Common.Views.SignDialog.textInputName": "Inserisci nome firmatario", + "Common.Views.SignDialog.textItalic": "Corsivo", + "Common.Views.SignDialog.textPurpose": "Motivo della firma del documento", + "Common.Views.SignDialog.textSelectImage": "Seleziona Immagine", + "Common.Views.SignDialog.textSignature": "La firma appare come", + "Common.Views.SignDialog.textTitle": "Firma Documento", + "Common.Views.SignDialog.textUseImage": "oppure clicca 'Scegli immagine' per utilizzare u'immagine come firma", + "Common.Views.SignDialog.textValid": "Valido dal %1 al %2", + "Common.Views.SignDialog.tipFontName": "Nome carattere", + "Common.Views.SignDialog.tipFontSize": "Dimensione carattere", + "Common.Views.SignSettingsDialog.cancelButtonText": "Annulla", + "Common.Views.SignSettingsDialog.okButtonText": "OK", + "Common.Views.SignSettingsDialog.textAllowComment": "Consenti al firmatario di aggiungere commenti nella finestra di firma", + "Common.Views.SignSettingsDialog.textInfo": "Informazioni sul Firmatario", + "Common.Views.SignSettingsDialog.textInfoEmail": "E-mail", + "Common.Views.SignSettingsDialog.textInfoName": "Nome", + "Common.Views.SignSettingsDialog.textInfoTitle": "Titolo del Firmatario", + "Common.Views.SignSettingsDialog.textInstructions": "Istruzioni per i Firmatari", + "Common.Views.SignSettingsDialog.textShowDate": "Mostra la data nella riga di Firma", + "Common.Views.SignSettingsDialog.textTitle": "Impostazioni della Firma", + "Common.Views.SignSettingsDialog.txtEmpty": "Campo obbligatorio", "DE.Controllers.LeftMenu.leavePageText": "Tutte le modifiche non salvate nel documento verranno perse.
    Clicca \"Annulla\" e poi \"Salva\" per salvarle. Clicca \"OK\" per annullare tutte le modifiche non salvate.", "DE.Controllers.LeftMenu.newDocumentTitle": "Documento senza nome", "DE.Controllers.LeftMenu.notcriticalErrorTitle": "Warning", @@ -310,26 +353,37 @@ "DE.Controllers.Main.textCloseTip": "Clicca per chiudere il consiglio", "DE.Controllers.Main.textContactUs": "Contatta il team di vendite", "DE.Controllers.Main.textLoadingDocument": "Caricamento del documento", - "DE.Controllers.Main.textNoLicenseTitle": "Versione open source di ONLYOFFICE", + "DE.Controllers.Main.textNoLicenseTitle": "ONLYOFFICE® limite connessione", "DE.Controllers.Main.textShape": "Forma", "DE.Controllers.Main.textStrict": "Modalità Rigorosa", "DE.Controllers.Main.textTryUndoRedo": "Le funzioni Annulla/Ripristina sono disabilitate per la Modalità di Co-editing Veloce.
    Clicca il pulsante 'Modalità Rigorosa' per passare alla Modalità di Co-editing Rigorosa per poter modificare il file senza l'interferenza di altri utenti e inviare le modifiche solamente dopo averle salvate. Puoi passare da una modalità all'altra di co-editing utilizzando le Impostazioni avanzate dell'editor.", "DE.Controllers.Main.titleLicenseExp": "La licenza è scaduta", "DE.Controllers.Main.titleServerVersion": "L'editor è stato aggiornato", "DE.Controllers.Main.titleUpdateVersion": "Version changed", + "DE.Controllers.Main.txtAbove": "Sopra", "DE.Controllers.Main.txtArt": "Your text here", "DE.Controllers.Main.txtBasicShapes": "Figure di base", + "DE.Controllers.Main.txtBelow": "sotto", + "DE.Controllers.Main.txtBookmarkError": "Errore! Segnalibro non definito.", "DE.Controllers.Main.txtButtons": "Bottoni", "DE.Controllers.Main.txtCallouts": "Chiamate", "DE.Controllers.Main.txtCharts": "Grafici", "DE.Controllers.Main.txtDiagramTitle": "Titolo diagramma", "DE.Controllers.Main.txtEditingMode": "Impostazione modo di modifica...", "DE.Controllers.Main.txtErrorLoadHistory": "History loading failed", + "DE.Controllers.Main.txtEvenPage": "Pagina pari", "DE.Controllers.Main.txtFiguredArrows": "Frecce decorate", + "DE.Controllers.Main.txtFirstPage": "Prima Pagina", + "DE.Controllers.Main.txtFooter": "Piè di pagina", + "DE.Controllers.Main.txtHeader": "Intestazione", "DE.Controllers.Main.txtLines": "Linee", "DE.Controllers.Main.txtMath": "Matematica", "DE.Controllers.Main.txtNeedSynchronize": "Ci sono aggiornamenti disponibili", + "DE.Controllers.Main.txtOddPage": "Pagina dispari", + "DE.Controllers.Main.txtOnPage": "sulla pagina", "DE.Controllers.Main.txtRectangles": "Rettangoli", + "DE.Controllers.Main.txtSameAsPrev": "come in precedenza", + "DE.Controllers.Main.txtSection": "Sezione", "DE.Controllers.Main.txtSeries": "Serie", "DE.Controllers.Main.txtStarsRibbons": "Stelle e nastri", "DE.Controllers.Main.txtStyle_Heading_1": "Titolo 1", @@ -360,7 +414,8 @@ "DE.Controllers.Main.warnBrowserIE9": "L'applicazione è poco compatibile con IE9. Usa IE10 o più recente", "DE.Controllers.Main.warnBrowserZoom": "Le impostazioni correnti di zoom del tuo browser non sono completamente supportate. Per favore, ritorna allo zoom predefinito premendo Ctrl+0.", "DE.Controllers.Main.warnLicenseExp": "La tua licenza è scaduta.
    Si prega di aggiornare la licenza e ricaricare la pagina.", - "DE.Controllers.Main.warnNoLicense": "Stai utilizzando una versione open source di ONLYOFFICE. La versione presenta delle limitazioni per le connessioni simultanee al server dei documenti (20 connessioni alla volta).
    Per poterne avere di più, considera l'acquisto di una licenza commerciale.", + "DE.Controllers.Main.warnNoLicense": "Questa versione di ONLYOFFICE® Editors presenta delle limitazioni per le connessioni simultanee al server dei documenti.
    Se necessiti di avere di più, considera l'acquisto di una licenza commerciale.", + "DE.Controllers.Main.warnNoLicenseUsers": "Questa versione di ONLYOFFICE Editors presenta alcune limitazioni per gli utenti simultanei.
    Se hai bisogno di più, ti preghiamo di considerare l'aggiornamento della tua licenza attuale o l'acquisto di una licenza commerciale.", "DE.Controllers.Main.warnProcessRightsChange": "Ci stato negato il diritto alla modifica del file.", "DE.Controllers.Statusbar.textHasChanges": "New changes have been tracked", "DE.Controllers.Statusbar.textTrackChanges": "The document is opened with the Track Changes mode enabled", @@ -796,6 +851,10 @@ "DE.Views.DocumentHolder.spellcheckText": "Controllo ortografia", "DE.Views.DocumentHolder.splitCellsText": "Dividi cella...", "DE.Views.DocumentHolder.splitCellTitleText": "Dividi cella", + "DE.Views.DocumentHolder.strDelete": "Rimuovi Firma", + "DE.Views.DocumentHolder.strDetails": "Dettagli firma", + "DE.Views.DocumentHolder.strSetup": "Impostazioni firma", + "DE.Views.DocumentHolder.strSign": "Firma", "DE.Views.DocumentHolder.styleText": "Formatting as Style", "DE.Views.DocumentHolder.tableText": "Tabella", "DE.Views.DocumentHolder.textAlign": "Allinea", @@ -954,6 +1013,7 @@ "DE.Views.FileMenu.btnHistoryCaption": "Cronologia delle versioni", "DE.Views.FileMenu.btnInfoCaption": "Informazioni documento...", "DE.Views.FileMenu.btnPrintCaption": "Stampa", + "DE.Views.FileMenu.btnProtectCaption": "Proteggi", "DE.Views.FileMenu.btnRecentFilesCaption": "Apri recenti...", "DE.Views.FileMenu.btnRenameCaption": "Rinomina...", "DE.Views.FileMenu.btnReturnCaption": "Torna al documento", @@ -983,6 +1043,22 @@ "DE.Views.FileMenuPanels.DocumentInfo.txtWords": "Parole", "DE.Views.FileMenuPanels.DocumentRights.txtBtnAccessRights": "Cambia diritti di accesso", "DE.Views.FileMenuPanels.DocumentRights.txtRights": "Persone con diritti", + "DE.Views.FileMenuPanels.ProtectDoc.notcriticalErrorTitle": "Avviso", + "DE.Views.FileMenuPanels.ProtectDoc.strEncrypt": "con Password", + "DE.Views.FileMenuPanels.ProtectDoc.strInvalid": "Firme non valide", + "DE.Views.FileMenuPanels.ProtectDoc.strInvisibleSign": "Aggiungi firma digitale invisibile", + "DE.Views.FileMenuPanels.ProtectDoc.strProtect": "Proteggi Documento", + "DE.Views.FileMenuPanels.ProtectDoc.strRequested": "Firme Richieste", + "DE.Views.FileMenuPanels.ProtectDoc.strSignature": "con Firma", + "DE.Views.FileMenuPanels.ProtectDoc.strValid": "Firme valide", + "DE.Views.FileMenuPanels.ProtectDoc.strVisibleSign": "Aggiungi firma visibile", + "DE.Views.FileMenuPanels.ProtectDoc.txtEdit": "Modifica documento", + "DE.Views.FileMenuPanels.ProtectDoc.txtEditWarning": "la modifica eliminerà le firme dal documento.
    Sei sicuro di voler continuare?", + "DE.Views.FileMenuPanels.ProtectDoc.txtEncrypted": "Questo documento è protetto con password", + "DE.Views.FileMenuPanels.ProtectDoc.txtRequestedSignatures": "Questo documento necessita di essere firmato", + "DE.Views.FileMenuPanels.ProtectDoc.txtSigned": "Le firme valide sono state aggiunte al documento. Il documento è protetto dalla modifica.", + "DE.Views.FileMenuPanels.ProtectDoc.txtSignedInvalid": "Alcune delle firme digitali preseti nel documento non sono valide o non possono essere verificate. Il documento è protetto dalla modifica.", + "DE.Views.FileMenuPanels.ProtectDoc.txtView": "Mostra firme", "DE.Views.FileMenuPanels.Settings.okButtonText": "Applica", "DE.Views.FileMenuPanels.Settings.strAlignGuides": "Abilita guide di allineamento", "DE.Views.FileMenuPanels.Settings.strAutoRecover": "Attiva il ripristino automatico", @@ -994,6 +1070,7 @@ "DE.Views.FileMenuPanels.Settings.strFontRender": "Hinting dei caratteri", "DE.Views.FileMenuPanels.Settings.strForcesave": "Salva sempre sul server (altrimenti salva sul server alla chiusura del documento)", "DE.Views.FileMenuPanels.Settings.strInputMode": "Attiva geroglifici", + "DE.Views.FileMenuPanels.Settings.strInputSogou": "Attiva l'input Sogou Pinyin", "DE.Views.FileMenuPanels.Settings.strLiveComment": "Attivare visualizzazione dei commenti", "DE.Views.FileMenuPanels.Settings.strResolvedComment": "Attiva la visualizzazione dei commenti risolti", "DE.Views.FileMenuPanels.Settings.strShowChanges": "Evidenzia modifiche di collaborazione", @@ -1144,6 +1221,7 @@ "DE.Views.LeftMenu.tipSupport": "Feedback & Support", "DE.Views.LeftMenu.tipTitles": "Titoli", "DE.Views.LeftMenu.txtDeveloper": "MODALITÀ SVILUPPATORE", + "DE.Views.LeftMenu.txtTrial": "Modalità di prova", "DE.Views.MailMergeEmailDlg.cancelButtonText": "Annulla", "DE.Views.MailMergeEmailDlg.filePlaceholder": "PDF", "DE.Views.MailMergeEmailDlg.okButtonText": "Send", @@ -1303,6 +1381,7 @@ "DE.Views.RightMenu.txtMailMergeSettings": "Mail Merge Settings", "DE.Views.RightMenu.txtParagraphSettings": "Impostazioni paragrafo", "DE.Views.RightMenu.txtShapeSettings": "Impostazioni forma", + "DE.Views.RightMenu.txtSignatureSettings": "Impostazioni della Firma", "DE.Views.RightMenu.txtTableSettings": "Impostazioni tabella", "DE.Views.RightMenu.txtTextArtSettings": "Text Art Settings", "DE.Views.ShapeSettings.strBackground": "Colore sfondo", @@ -1355,6 +1434,23 @@ "DE.Views.ShapeSettings.txtTight": "Ravvicinato", "DE.Views.ShapeSettings.txtTopAndBottom": "Sopra e sotto", "DE.Views.ShapeSettings.txtWood": "Legno", + "DE.Views.SignatureSettings.notcriticalErrorTitle": "Avviso", + "DE.Views.SignatureSettings.strDelete": "Rimuovi Firma", + "DE.Views.SignatureSettings.strDetails": "Dettagli firma", + "DE.Views.SignatureSettings.strInvalid": "Firme non valide", + "DE.Views.SignatureSettings.strInvisibleSign": "Aggiungi firma digitale invisibile", + "DE.Views.SignatureSettings.strRequested": "Firme Richieste", + "DE.Views.SignatureSettings.strSetup": "Impostazioni firma", + "DE.Views.SignatureSettings.strSign": "Firma", + "DE.Views.SignatureSettings.strSignature": "Firma", + "DE.Views.SignatureSettings.strValid": "Firme valide", + "DE.Views.SignatureSettings.strView": "Visualizza", + "DE.Views.SignatureSettings.strVisibleSign": "Aggiungi firma visibile", + "DE.Views.SignatureSettings.txtContinueEditing": "Modifica comunque", + "DE.Views.SignatureSettings.txtEditWarning": "la modifica eliminerà le firme dal documento.
    Sei sicuro di voler continuare?", + "DE.Views.SignatureSettings.txtRequestedSignatures": "Questo documento necessita di essere firmato", + "DE.Views.SignatureSettings.txtSigned": "Le firme valide sono state aggiunte al documento. Il documento è protetto dalla modifica.", + "DE.Views.SignatureSettings.txtSignedInvalid": "Alcune delle firme digitali preseti nel documento non sono valide o non possono essere verificate. Il documento è protetto dalla modifica.", "DE.Views.Statusbar.goToPageText": "Va' alla pagina", "DE.Views.Statusbar.pageIndexText": "Pagina {0} di {1}", "DE.Views.Statusbar.tipFitPage": "Adatta alla pagina", @@ -1524,7 +1620,7 @@ "DE.Views.Toolbar.capBtnInsShape": "Forma", "DE.Views.Toolbar.capBtnInsTable": "Tabella", "DE.Views.Toolbar.capBtnInsTextart": "Text Art", - "DE.Views.Toolbar.capBtnInsTextbox": "Testo", + "DE.Views.Toolbar.capBtnInsTextbox": "Casella di testo", "DE.Views.Toolbar.capBtnMargins": "Margini", "DE.Views.Toolbar.capBtnPageOrient": "Orientamento", "DE.Views.Toolbar.capBtnPageSize": "Dimensione", @@ -1609,6 +1705,7 @@ "DE.Views.Toolbar.textTabHome": "Home", "DE.Views.Toolbar.textTabInsert": "Inserisci", "DE.Views.Toolbar.textTabLayout": "Layout di Pagina", + "DE.Views.Toolbar.textTabProtect": "Protezione", "DE.Views.Toolbar.textTabReview": "Revisione", "DE.Views.Toolbar.textTitleError": "Errore", "DE.Views.Toolbar.textToCurrent": "Alla posizione corrente", diff --git a/apps/documenteditor/main/locale/ru.json b/apps/documenteditor/main/locale/ru.json index ee0487045..1c02b10ba 100644 --- a/apps/documenteditor/main/locale/ru.json +++ b/apps/documenteditor/main/locale/ru.json @@ -183,12 +183,29 @@ "Common.Views.OpenDialog.txtPassword": "Пароль", "Common.Views.OpenDialog.txtTitle": "Выбрать параметры %1", "Common.Views.OpenDialog.txtTitleProtected": "Защищенный файл", + "Common.Views.PasswordDialog.cancelButtonText": "Отмена", + "Common.Views.PasswordDialog.okButtonText": "OK", + "Common.Views.PasswordDialog.txtDescription": "Для открытия этого документа требуется пароль", + "Common.Views.PasswordDialog.txtIncorrectPwd": "Пароль и его подтверждение не совпадают", + "Common.Views.PasswordDialog.txtPassword": "Пароль", + "Common.Views.PasswordDialog.txtRepeat": "Повторить пароль", + "Common.Views.PasswordDialog.txtTitle": "Установка пароля", "Common.Views.PluginDlg.textLoading": "Загрузка", "Common.Views.Plugins.groupCaption": "Плагины", "Common.Views.Plugins.strPlugins": "Плагины", "Common.Views.Plugins.textLoading": "Загрузка", "Common.Views.Plugins.textStart": "Запустить", "Common.Views.Plugins.textStop": "Остановить", + "Common.Views.Protection.hintAddPwd": "Зашифровать с помощью пароля", + "Common.Views.Protection.hintPwd": "Изменить или удалить пароль", + "Common.Views.Protection.hintSignature": "Добавить цифровую подпись или строку подписи", + "Common.Views.Protection.txtAddPwd": "Добавить пароль", + "Common.Views.Protection.txtChangePwd": "Изменить пароль", + "Common.Views.Protection.txtDeletePwd": "Удалить пароль", + "Common.Views.Protection.txtEncrypt": "Шифровать", + "Common.Views.Protection.txtInvisibleSignature": "Добавить цифровую подпись", + "Common.Views.Protection.txtSignature": "Подпись", + "Common.Views.Protection.txtSignatureLine": "Строка подписи", "Common.Views.RenameDialog.cancelButtonText": "Отмена", "Common.Views.RenameDialog.okButtonText": "Ok", "Common.Views.RenameDialog.textName": "Имя файла", @@ -228,6 +245,32 @@ "Common.Views.ReviewChangesDialog.txtReject": "Отклонить", "Common.Views.ReviewChangesDialog.txtRejectAll": "Отклонить все изменения", "Common.Views.ReviewChangesDialog.txtRejectCurrent": "Отклонить текущее изменение", + "Common.Views.SignDialog.cancelButtonText": "Отмена", + "Common.Views.SignDialog.okButtonText": "Ok", + "Common.Views.SignDialog.textBold": "Жирный", + "Common.Views.SignDialog.textCertificate": "Сертификат", + "Common.Views.SignDialog.textChange": "Изменить", + "Common.Views.SignDialog.textInputName": "Введите имя подписывающего", + "Common.Views.SignDialog.textItalic": "Курсив", + "Common.Views.SignDialog.textPurpose": "Цель подписания документа", + "Common.Views.SignDialog.textSelectImage": "Выбрать изображение", + "Common.Views.SignDialog.textSignature": "Как выглядит подпись:", + "Common.Views.SignDialog.textTitle": "Подписание документа", + "Common.Views.SignDialog.textUseImage": "или нажмите 'Выбрать изображение', чтобы использовать изображение в качестве подписи", + "Common.Views.SignDialog.textValid": "Действителен с %1 по %2", + "Common.Views.SignDialog.tipFontName": "Шрифт", + "Common.Views.SignDialog.tipFontSize": "Размер шрифта", + "Common.Views.SignSettingsDialog.cancelButtonText": "Отмена", + "Common.Views.SignSettingsDialog.okButtonText": "Ok", + "Common.Views.SignSettingsDialog.textAllowComment": "Разрешить подписывающему добавлять примечания в окне подписи", + "Common.Views.SignSettingsDialog.textInfo": "Сведения о подписывающем", + "Common.Views.SignSettingsDialog.textInfoEmail": "Адрес электронной почты", + "Common.Views.SignSettingsDialog.textInfoName": "Имя", + "Common.Views.SignSettingsDialog.textInfoTitle": "Должность подписывающего", + "Common.Views.SignSettingsDialog.textInstructions": "Инструкции для подписывающего", + "Common.Views.SignSettingsDialog.textShowDate": "Показывать дату подписи в строке подписи", + "Common.Views.SignSettingsDialog.textTitle": "Настройка подписи", + "Common.Views.SignSettingsDialog.txtEmpty": "Это поле необходимо заполнить", "DE.Controllers.LeftMenu.leavePageText": "Все несохраненные изменения в этом документе будут потеряны.
    Нажмите кнопку \"Отмена\", а затем нажмите кнопку \"Сохранить\", чтобы сохранить их. Нажмите кнопку \"OK\", чтобы сбросить все несохраненные изменения.", "DE.Controllers.LeftMenu.newDocumentTitle": "Документ без имени", "DE.Controllers.LeftMenu.notcriticalErrorTitle": "Внимание", @@ -317,19 +360,30 @@ "DE.Controllers.Main.titleLicenseExp": "Истек срок действия лицензии", "DE.Controllers.Main.titleServerVersion": "Редактор обновлен", "DE.Controllers.Main.titleUpdateVersion": "Версия изменилась", + "DE.Controllers.Main.txtAbove": "выше", "DE.Controllers.Main.txtArt": "Введите ваш текст", "DE.Controllers.Main.txtBasicShapes": "Основные фигуры", + "DE.Controllers.Main.txtBelow": "ниже", + "DE.Controllers.Main.txtBookmarkError": "Ошибка! Закладка не определена.", "DE.Controllers.Main.txtButtons": "Кнопки", "DE.Controllers.Main.txtCallouts": "Выноски", "DE.Controllers.Main.txtCharts": "Схемы", "DE.Controllers.Main.txtDiagramTitle": "Заголовок диаграммы", "DE.Controllers.Main.txtEditingMode": "Установка режима редактирования...", "DE.Controllers.Main.txtErrorLoadHistory": "Не удалось загрузить историю", + "DE.Controllers.Main.txtEvenPage": "Четная страница", "DE.Controllers.Main.txtFiguredArrows": "Фигурные стрелки", + "DE.Controllers.Main.txtFirstPage": "Первая страница", + "DE.Controllers.Main.txtFooter": "Нижний колонтитул", + "DE.Controllers.Main.txtHeader": "Верхний колонтитул", "DE.Controllers.Main.txtLines": "Линии", "DE.Controllers.Main.txtMath": "Математические знаки", "DE.Controllers.Main.txtNeedSynchronize": "Есть обновления", + "DE.Controllers.Main.txtOddPage": "Нечетная страница", + "DE.Controllers.Main.txtOnPage": "на странице", "DE.Controllers.Main.txtRectangles": "Прямоугольники", + "DE.Controllers.Main.txtSameAsPrev": "Как в предыдущем", + "DE.Controllers.Main.txtSection": "-Раздел", "DE.Controllers.Main.txtSeries": "Ряд", "DE.Controllers.Main.txtStarsRibbons": "Звезды и ленты", "DE.Controllers.Main.txtStyle_Heading_1": "Заголовок 1", @@ -361,6 +415,7 @@ "DE.Controllers.Main.warnBrowserZoom": "Текущее значение масштаба страницы в браузере поддерживается не полностью. Вернитесь к масштабу по умолчанию, нажав Ctrl+0.", "DE.Controllers.Main.warnLicenseExp": "Истек срок действия лицензии.
    Обновите лицензию, а затем обновите страницу.", "DE.Controllers.Main.warnNoLicense": "Эта версия редакторов ONLYOFFICE имеет некоторые ограничения по количеству одновременных подключений к серверу документов.
    Если требуется больше, рассмотрите вопрос об обновлении текущей лицензии или покупке коммерческой лицензии.", + "DE.Controllers.Main.warnNoLicenseUsers": "Эта версия редакторов ONLYOFFICE имеет некоторые ограничения по числу одновременно работающих пользователей.
    Если требуется больше, рассмотрите вопрос об обновлении текущей лицензии или покупке коммерческой лицензии.", "DE.Controllers.Main.warnProcessRightsChange": "Вам было отказано в праве на редактирование этого файла.", "DE.Controllers.Statusbar.textHasChanges": "Отслежены новые изменения", "DE.Controllers.Statusbar.textTrackChanges": "Документ открыт при включенном режиме отслеживания изменений", @@ -796,6 +851,10 @@ "DE.Views.DocumentHolder.spellcheckText": "Проверка орфографии", "DE.Views.DocumentHolder.splitCellsText": "Разделить ячейку...", "DE.Views.DocumentHolder.splitCellTitleText": "Разделить ячейку", + "DE.Views.DocumentHolder.strDelete": "Удалить подпись", + "DE.Views.DocumentHolder.strDetails": "Состав подписи", + "DE.Views.DocumentHolder.strSetup": "Настройка подписи", + "DE.Views.DocumentHolder.strSign": "Подписать", "DE.Views.DocumentHolder.styleText": "Форматирование как стиль", "DE.Views.DocumentHolder.tableText": "Таблицу", "DE.Views.DocumentHolder.textAlign": "Выравнивание", @@ -954,6 +1013,7 @@ "DE.Views.FileMenu.btnHistoryCaption": "Журнал версий", "DE.Views.FileMenu.btnInfoCaption": "Сведения о документе...", "DE.Views.FileMenu.btnPrintCaption": "Печать", + "DE.Views.FileMenu.btnProtectCaption": "Защитить", "DE.Views.FileMenu.btnRecentFilesCaption": "Открыть последние...", "DE.Views.FileMenu.btnRenameCaption": "Переименовать...", "DE.Views.FileMenu.btnReturnCaption": "Вернуться к документу", @@ -983,6 +1043,22 @@ "DE.Views.FileMenuPanels.DocumentInfo.txtWords": "Слова", "DE.Views.FileMenuPanels.DocumentRights.txtBtnAccessRights": "Изменить права доступа", "DE.Views.FileMenuPanels.DocumentRights.txtRights": "Люди, имеющие права", + "DE.Views.FileMenuPanels.ProtectDoc.notcriticalErrorTitle": "Внимание", + "DE.Views.FileMenuPanels.ProtectDoc.strEncrypt": "C помощью пароля", + "DE.Views.FileMenuPanels.ProtectDoc.strInvalid": "Недействительные подписи", + "DE.Views.FileMenuPanels.ProtectDoc.strInvisibleSign": "Добавить невидимую цифровую подпись", + "DE.Views.FileMenuPanels.ProtectDoc.strProtect": "Защитить документ", + "DE.Views.FileMenuPanels.ProtectDoc.strRequested": "Запрошенные подписи", + "DE.Views.FileMenuPanels.ProtectDoc.strSignature": "С помощью подписи", + "DE.Views.FileMenuPanels.ProtectDoc.strValid": "Действительные подписи", + "DE.Views.FileMenuPanels.ProtectDoc.strVisibleSign": "Добавить видимую цифровую подпись", + "DE.Views.FileMenuPanels.ProtectDoc.txtEdit": "Редактировать документ", + "DE.Views.FileMenuPanels.ProtectDoc.txtEditWarning": "При редактировании из документа будут удалены подписи.
    Вы действительно хотите продолжить?", + "DE.Views.FileMenuPanels.ProtectDoc.txtEncrypted": "Этот документ защищен паролем", + "DE.Views.FileMenuPanels.ProtectDoc.txtRequestedSignatures": "Этот документ требуется подписать.", + "DE.Views.FileMenuPanels.ProtectDoc.txtSigned": "В документ добавлены действительные подписи. Документ защищен от редактирования.", + "DE.Views.FileMenuPanels.ProtectDoc.txtSignedInvalid": "Некоторые из цифровых подписей в документе недействительны или их нельзя проверить. Документ защищен от редактирования.", + "DE.Views.FileMenuPanels.ProtectDoc.txtView": "Просмотр подписей", "DE.Views.FileMenuPanels.Settings.okButtonText": "Применить", "DE.Views.FileMenuPanels.Settings.strAlignGuides": "Включить направляющие выравнивания", "DE.Views.FileMenuPanels.Settings.strAutoRecover": "Включить автовосстановление", @@ -1305,6 +1381,7 @@ "DE.Views.RightMenu.txtMailMergeSettings": "Параметры слияния", "DE.Views.RightMenu.txtParagraphSettings": "Параметры абзаца", "DE.Views.RightMenu.txtShapeSettings": "Параметры фигуры", + "DE.Views.RightMenu.txtSignatureSettings": "Настройка подписи", "DE.Views.RightMenu.txtTableSettings": "Параметры таблицы", "DE.Views.RightMenu.txtTextArtSettings": "Параметры объекта Text Art", "DE.Views.ShapeSettings.strBackground": "Цвет фона", @@ -1357,6 +1434,23 @@ "DE.Views.ShapeSettings.txtTight": "По контуру", "DE.Views.ShapeSettings.txtTopAndBottom": "Сверху и снизу", "DE.Views.ShapeSettings.txtWood": "Дерево", + "DE.Views.SignatureSettings.notcriticalErrorTitle": "Внимание", + "DE.Views.SignatureSettings.strDelete": "Удалить подпись", + "DE.Views.SignatureSettings.strDetails": "Состав подписи", + "DE.Views.SignatureSettings.strInvalid": "Недействительные подписи", + "DE.Views.SignatureSettings.strInvisibleSign": "Добавить невидимую цифровую подпись", + "DE.Views.SignatureSettings.strRequested": "Запрошенные подписи", + "DE.Views.SignatureSettings.strSetup": "Настройка подписи", + "DE.Views.SignatureSettings.strSign": "Подписать", + "DE.Views.SignatureSettings.strSignature": "Подпись", + "DE.Views.SignatureSettings.strValid": "Действительные подписи", + "DE.Views.SignatureSettings.strView": "Просмотр", + "DE.Views.SignatureSettings.strVisibleSign": "Добавить видимую цифровую подпись", + "DE.Views.SignatureSettings.txtContinueEditing": "Все равно редактировать", + "DE.Views.SignatureSettings.txtEditWarning": "При редактировании из документа будут удалены подписи.
    Вы действительно хотите продолжить?", + "DE.Views.SignatureSettings.txtRequestedSignatures": "Этот документ требуется подписать.", + "DE.Views.SignatureSettings.txtSigned": "В документ добавлены действительные подписи. Документ защищен от редактирования.", + "DE.Views.SignatureSettings.txtSignedInvalid": "Некоторые из цифровых подписей в документе недействительны или их нельзя проверить. Документ защищен от редактирования.", "DE.Views.Statusbar.goToPageText": "Перейти на страницу", "DE.Views.Statusbar.pageIndexText": "Страница {0} из {1}", "DE.Views.Statusbar.tipFitPage": "По размеру страницы", @@ -1611,6 +1705,7 @@ "DE.Views.Toolbar.textTabHome": "Главная", "DE.Views.Toolbar.textTabInsert": "Вставка", "DE.Views.Toolbar.textTabLayout": "Макет", + "DE.Views.Toolbar.textTabProtect": "Защита", "DE.Views.Toolbar.textTabReview": "Рецензирование", "DE.Views.Toolbar.textTitleError": "Ошибка", "DE.Views.Toolbar.textToCurrent": "В текущей позиции", diff --git a/apps/presentationeditor/main/locale/en.json b/apps/presentationeditor/main/locale/en.json index 52142b2dd..be7019c3c 100644 --- a/apps/presentationeditor/main/locale/en.json +++ b/apps/presentationeditor/main/locale/en.json @@ -118,57 +118,57 @@ "Common.Views.OpenDialog.txtTitleProtected": "Protected File", "Common.Views.PasswordDialog.cancelButtonText": "Cancel", "Common.Views.PasswordDialog.okButtonText": "OK", - "Common.Views.PasswordDialog.txtPassword": "Password", - "Common.Views.PasswordDialog.txtTitle": "Set Password", - "Common.Views.PasswordDialog.txtDescription": "A Password is required to open this document", - "Common.Views.PasswordDialog.txtRepeat": "Repeat password", + "Common.Views.PasswordDialog.txtDescription": "A password is required to open this document", "Common.Views.PasswordDialog.txtIncorrectPwd": "Confirmation password is not identical", + "Common.Views.PasswordDialog.txtPassword": "Password", + "Common.Views.PasswordDialog.txtRepeat": "Repeat password", + "Common.Views.PasswordDialog.txtTitle": "Set Password", "Common.Views.PluginDlg.textLoading": "Loading", "Common.Views.Plugins.groupCaption": "Plugins", "Common.Views.Plugins.strPlugins": "Plugins", "Common.Views.Plugins.textLoading": "Loading", "Common.Views.Plugins.textStart": "Start", "Common.Views.Plugins.textStop": "Stop", - "Common.Views.Protection.txtAddPwd": "Add password", - "Common.Views.Protection.txtEncrypt": "Encrypt", - "Common.Views.Protection.txtSignature": "Signature", "Common.Views.Protection.hintAddPwd": "Encrypt with password", "Common.Views.Protection.hintPwd": "Change or delete password", "Common.Views.Protection.hintSignature": "Add digital signature or signature line", + "Common.Views.Protection.txtAddPwd": "Add password", "Common.Views.Protection.txtChangePwd": "Change password", "Common.Views.Protection.txtDeletePwd": "Delete password", + "Common.Views.Protection.txtEncrypt": "Encrypt", "Common.Views.Protection.txtInvisibleSignature": "Add digital signature", + "Common.Views.Protection.txtSignature": "Signature", "Common.Views.Protection.txtSignatureLine": "Signature line", "Common.Views.RenameDialog.cancelButtonText": "Cancel", "Common.Views.RenameDialog.okButtonText": "Ok", "Common.Views.RenameDialog.textName": "File name", "Common.Views.RenameDialog.txtInvalidName": "The file name cannot contain any of the following characters: ", - "Common.Views.SignDialog.textTitle": "Sign Document", - "Common.Views.SignDialog.textPurpose": "Purpose for signing this document", - "Common.Views.SignDialog.textCertificate": "Certificate", - "Common.Views.SignDialog.textValid": "Valid from %1 to %2", - "Common.Views.SignDialog.textChange": "Change", "Common.Views.SignDialog.cancelButtonText": "Cancel", "Common.Views.SignDialog.okButtonText": "Ok", + "Common.Views.SignDialog.textBold": "Bold", + "Common.Views.SignDialog.textCertificate": "Certificate", + "Common.Views.SignDialog.textChange": "Change", "Common.Views.SignDialog.textInputName": "Input signer name", - "Common.Views.SignDialog.textUseImage": "or click 'Select Image' to use a picture as signature", + "Common.Views.SignDialog.textItalic": "Italic", + "Common.Views.SignDialog.textPurpose": "Purpose for signing this document", "Common.Views.SignDialog.textSelectImage": "Select Image", "Common.Views.SignDialog.textSignature": "Signature looks as", + "Common.Views.SignDialog.textTitle": "Sign Document", + "Common.Views.SignDialog.textUseImage": "or click 'Select Image' to use a picture as signature", + "Common.Views.SignDialog.textValid": "Valid from %1 to %2", "Common.Views.SignDialog.tipFontName": "Font Name", "Common.Views.SignDialog.tipFontSize": "Font Size", - "Common.Views.SignDialog.textBold": "Bold", - "Common.Views.SignDialog.textItalic": "Italic", - "Common.Views.SignSettingsDialog.textInfo": "Signer Info", - "Common.Views.SignSettingsDialog.textInfoName": "Name", - "Common.Views.SignSettingsDialog.textInfoTitle": "Signer Title", - "Common.Views.SignSettingsDialog.textInfoEmail": "E-mail", - "Common.Views.SignSettingsDialog.textInstructions": "Instructions for Signer", "Common.Views.SignSettingsDialog.cancelButtonText": "Cancel", "Common.Views.SignSettingsDialog.okButtonText": "Ok", - "Common.Views.SignSettingsDialog.txtEmpty": "This field is required", "Common.Views.SignSettingsDialog.textAllowComment": "Allow signer to add comment in the signature dialog", + "Common.Views.SignSettingsDialog.textInfo": "Signer Info", + "Common.Views.SignSettingsDialog.textInfoEmail": "E-mail", + "Common.Views.SignSettingsDialog.textInfoName": "Name", + "Common.Views.SignSettingsDialog.textInfoTitle": "Signer Title", + "Common.Views.SignSettingsDialog.textInstructions": "Instructions for Signer", "Common.Views.SignSettingsDialog.textShowDate": "Show sign date in signature line", "Common.Views.SignSettingsDialog.textTitle": "Signature Settings", + "Common.Views.SignSettingsDialog.txtEmpty": "This field is required", "PE.Controllers.LeftMenu.newDocumentTitle": "Unnamed presentation", "PE.Controllers.LeftMenu.requestEditRightsText": "Requesting editing rights...", "PE.Controllers.LeftMenu.textNoTextFound": "The data you have been searching for could not be found. Please adjust your search options.", @@ -853,6 +853,7 @@ "PE.Views.FileMenu.btnHelpCaption": "Help...", "PE.Views.FileMenu.btnInfoCaption": "Presentation Info...", "PE.Views.FileMenu.btnPrintCaption": "Print", + "PE.Views.FileMenu.btnProtectCaption": "Protect", "PE.Views.FileMenu.btnRecentFilesCaption": "Open Recent...", "PE.Views.FileMenu.btnRenameCaption": "Rename...", "PE.Views.FileMenu.btnReturnCaption": "Back to Presentation", @@ -861,7 +862,6 @@ "PE.Views.FileMenu.btnSaveCaption": "Save", "PE.Views.FileMenu.btnSettingsCaption": "Advanced Settings...", "PE.Views.FileMenu.btnToEditCaption": "Edit Presentation", - "PE.Views.FileMenu.btnProtectCaption": "Protect", "PE.Views.FileMenuPanels.CreateNew.fromBlankText": "From Blank", "PE.Views.FileMenuPanels.CreateNew.fromTemplateText": "From Template", "PE.Views.FileMenuPanels.CreateNew.newDescriptionText": "Create a new blank presentation which you will be able to style and format after it is created during the editing. Or choose one of the templates to start a presentation of a certain type or purpose where some styles have already been pre-applied.", @@ -875,16 +875,16 @@ "PE.Views.FileMenuPanels.DocumentInfo.txtTitle": "Presentation Title", "PE.Views.FileMenuPanels.DocumentRights.txtBtnAccessRights": "Change access rights", "PE.Views.FileMenuPanels.DocumentRights.txtRights": "Persons who have rights", + "PE.Views.FileMenuPanels.ProtectDoc.notcriticalErrorTitle": "Warning", + "PE.Views.FileMenuPanels.ProtectDoc.strEncrypt": "With password", "PE.Views.FileMenuPanels.ProtectDoc.strProtect": "Protect Presentation", - "PE.Views.FileMenuPanels.ProtectDoc.strSignature": "With Signature", - "PE.Views.FileMenuPanels.ProtectDoc.txtView": "View signatures", + "PE.Views.FileMenuPanels.ProtectDoc.strSignature": "With signature", "PE.Views.FileMenuPanels.ProtectDoc.txtEdit": "Edit presentation", + "PE.Views.FileMenuPanels.ProtectDoc.txtEditWarning": "Editing will remove the signatures from the presentation.
    Are you sure you want to continue?", + "PE.Views.FileMenuPanels.ProtectDoc.txtEncrypted": "This presentation has been protected by password", "PE.Views.FileMenuPanels.ProtectDoc.txtSigned": "Valid signatures has been added to the presentation. The presentation is protected from editing.", "PE.Views.FileMenuPanels.ProtectDoc.txtSignedInvalid": "Some of the digital signatures in presentation are invalid or could not be verified. The presentation is protected from editing.", - "PE.Views.FileMenuPanels.ProtectDoc.notcriticalErrorTitle": "Warning", - "PE.Views.FileMenuPanels.ProtectDoc.txtEditWarning": "Editing will remove the signatures from the presentation.
    Are you sure you want to continue?", - "PE.Views.FileMenuPanels.ProtectDoc.strEncrypt": "With Password", - "PE.Views.FileMenuPanels.ProtectDoc.txtEncrypted": "This presentation has been protected by password", + "PE.Views.FileMenuPanels.ProtectDoc.txtView": "View signatures", "PE.Views.FileMenuPanels.Settings.okButtonText": "Apply", "PE.Views.FileMenuPanels.Settings.strAlignGuides": "Turn on alignment guides", "PE.Views.FileMenuPanels.Settings.strAutoRecover": "Turn on autorecover", @@ -999,7 +999,7 @@ "PE.Views.ParagraphSettingsAdvanced.strStrike": "Strikethrough", "PE.Views.ParagraphSettingsAdvanced.strSubscript": "Subscript", "PE.Views.ParagraphSettingsAdvanced.strSuperscript": "Superscript", - "PE.Views.ParagraphSettingsAdvanced.strTabs": "Tab", + "PE.Views.ParagraphSettingsAdvanced.strTabs": "Tabs", "PE.Views.ParagraphSettingsAdvanced.textAlign": "Alignment", "PE.Views.ParagraphSettingsAdvanced.textCharacterSpacing": "Character Spacing", "PE.Views.ParagraphSettingsAdvanced.textDefault": "Default Tab", @@ -1016,10 +1016,10 @@ "PE.Views.RightMenu.txtImageSettings": "Image settings", "PE.Views.RightMenu.txtParagraphSettings": "Text settings", "PE.Views.RightMenu.txtShapeSettings": "Shape settings", + "PE.Views.RightMenu.txtSignatureSettings": "Signature Settings", "PE.Views.RightMenu.txtSlideSettings": "Slide settings", "PE.Views.RightMenu.txtTableSettings": "Table settings", "PE.Views.RightMenu.txtTextArtSettings": "Text Art settings", - "PE.Views.RightMenu.txtSignatureSettings": "Signature Settings", "PE.Views.ShapeSettings.strBackground": "Background color", "PE.Views.ShapeSettings.strChange": "Change Autoshape", "PE.Views.ShapeSettings.strColor": "Color", @@ -1096,17 +1096,17 @@ "PE.Views.ShapeSettingsAdvanced.textWeightArrows": "Weights & Arrows", "PE.Views.ShapeSettingsAdvanced.textWidth": "Width", "PE.Views.ShapeSettingsAdvanced.txtNone": "None", - "PE.Views.SignatureSettings.strSignature": "Signature", - "PE.Views.SignatureSettings.strValid": "Valid signatures", + "PE.Views.SignatureSettings.notcriticalErrorTitle": "Warning", + "PE.Views.SignatureSettings.strDelete": "Remove Signature", + "PE.Views.SignatureSettings.strDetails": "Signature Details", "PE.Views.SignatureSettings.strInvalid": "Invalid signatures", "PE.Views.SignatureSettings.strSign": "Sign", - "PE.Views.SignatureSettings.strDetails": "Signature Details", - "PE.Views.SignatureSettings.strDelete": "Remove Signature", + "PE.Views.SignatureSettings.strSignature": "Signature", + "PE.Views.SignatureSettings.strValid": "Valid signatures", + "PE.Views.SignatureSettings.txtContinueEditing": "Edit anyway", + "PE.Views.SignatureSettings.txtEditWarning": "Editing will remove the signatures from the presentation.
    Are you sure you want to continue?", "PE.Views.SignatureSettings.txtSigned": "Valid signatures has been added to the presentation. The presentation is protected from editing.", "PE.Views.SignatureSettings.txtSignedInvalid": "Some of the digital signatures in presentation are invalid or could not be verified. The presentation is protected from editing.", - "PE.Views.SignatureSettings.txtContinueEditing": "Edit anyway", - "PE.Views.SignatureSettings.notcriticalErrorTitle": "Warning", - "PE.Views.SignatureSettings.txtEditWarning": "Editing will remove the signatures from the presentation.
    Are you sure you want to continue?", "PE.Views.SlideSettings.strBackground": "Background color", "PE.Views.SlideSettings.strColor": "Color", "PE.Views.SlideSettings.strDelay": "Delay", @@ -1374,7 +1374,7 @@ "PE.Views.Toolbar.textShowPresenterView": "Show presenter view", "PE.Views.Toolbar.textShowSettings": "Show Settings", "PE.Views.Toolbar.textStock": "Stock", - "PE.Views.Toolbar.textStrikeout": "Strikeout", + "PE.Views.Toolbar.textStrikeout": "Strikethrough", "PE.Views.Toolbar.textSubscript": "Subscript", "PE.Views.Toolbar.textSuperscript": "Superscript", "PE.Views.Toolbar.textSurface": "Surface", diff --git a/apps/presentationeditor/main/locale/it.json b/apps/presentationeditor/main/locale/it.json index 3635ac6cf..b8069f088 100644 --- a/apps/presentationeditor/main/locale/it.json +++ b/apps/presentationeditor/main/locale/it.json @@ -112,19 +112,63 @@ "Common.Views.OpenDialog.cancelButtonText": "Annulla", "Common.Views.OpenDialog.okButtonText": "OK", "Common.Views.OpenDialog.txtEncoding": "Codifica", + "Common.Views.OpenDialog.txtIncorrectPwd": "Password errata", "Common.Views.OpenDialog.txtPassword": "Password", "Common.Views.OpenDialog.txtTitle": "Seleziona parametri %1", "Common.Views.OpenDialog.txtTitleProtected": "File protetto", + "Common.Views.PasswordDialog.cancelButtonText": "Annulla", + "Common.Views.PasswordDialog.okButtonText": "OK", + "Common.Views.PasswordDialog.txtDescription": "É richiesta la password per aprire il documento", + "Common.Views.PasswordDialog.txtIncorrectPwd": "la password di conferma non corrisponde", + "Common.Views.PasswordDialog.txtPassword": "Password", + "Common.Views.PasswordDialog.txtRepeat": "Ripeti password", + "Common.Views.PasswordDialog.txtTitle": "Imposta password", "Common.Views.PluginDlg.textLoading": "Caricamento", "Common.Views.Plugins.groupCaption": "Componenti Aggiuntivi", "Common.Views.Plugins.strPlugins": "Plugin", "Common.Views.Plugins.textLoading": "Caricamento", "Common.Views.Plugins.textStart": "Avvio", "Common.Views.Plugins.textStop": "Termina", + "Common.Views.Protection.hintAddPwd": "Crittografa con password", + "Common.Views.Protection.hintPwd": "Modifica o rimuovi password", + "Common.Views.Protection.hintSignature": "Aggiungi firma digitale o riga di firma", + "Common.Views.Protection.txtAddPwd": "Aggiungi password", + "Common.Views.Protection.txtChangePwd": "Modifica password", + "Common.Views.Protection.txtDeletePwd": "Elimina password", + "Common.Views.Protection.txtEncrypt": "Crittografare", + "Common.Views.Protection.txtInvisibleSignature": "Aggiungi firma digitale", + "Common.Views.Protection.txtSignature": "Firma", + "Common.Views.Protection.txtSignatureLine": "Riga della firma", "Common.Views.RenameDialog.cancelButtonText": "Annulla", "Common.Views.RenameDialog.okButtonText": "OK", "Common.Views.RenameDialog.textName": "Nome file", "Common.Views.RenameDialog.txtInvalidName": "Il nome del file non può contenere nessuno dei seguenti caratteri:", + "Common.Views.SignDialog.cancelButtonText": "Annulla", + "Common.Views.SignDialog.okButtonText": "OK", + "Common.Views.SignDialog.textBold": "Grassetto", + "Common.Views.SignDialog.textCertificate": "Certificato", + "Common.Views.SignDialog.textChange": "Cambia", + "Common.Views.SignDialog.textInputName": "Inserisci nome firmatario", + "Common.Views.SignDialog.textItalic": "Corsivo", + "Common.Views.SignDialog.textPurpose": "Motivo della firma del documento", + "Common.Views.SignDialog.textSelectImage": "Seleziona Immagine", + "Common.Views.SignDialog.textSignature": "La firma appare come", + "Common.Views.SignDialog.textTitle": "Firma Documento", + "Common.Views.SignDialog.textUseImage": "oppure clicca 'Scegli immagine' per utilizzare un'immagine come firma", + "Common.Views.SignDialog.textValid": "Valido dal %1 al %2", + "Common.Views.SignDialog.tipFontName": "Nome carattere", + "Common.Views.SignDialog.tipFontSize": "Dimensione carattere", + "Common.Views.SignSettingsDialog.cancelButtonText": "Annulla", + "Common.Views.SignSettingsDialog.okButtonText": "OK", + "Common.Views.SignSettingsDialog.textAllowComment": "Consenti al firmatario di aggiungere commenti nella finestra di firma", + "Common.Views.SignSettingsDialog.textInfo": "Informazioni sul Firmatario", + "Common.Views.SignSettingsDialog.textInfoEmail": "E-mail", + "Common.Views.SignSettingsDialog.textInfoName": "Nome", + "Common.Views.SignSettingsDialog.textInfoTitle": "Titolo del Firmatario", + "Common.Views.SignSettingsDialog.textInstructions": "Istruzioni per i Firmatari", + "Common.Views.SignSettingsDialog.textShowDate": "Mostra la data nella riga di Firma", + "Common.Views.SignSettingsDialog.textTitle": "Impostazioni della Firma", + "Common.Views.SignSettingsDialog.txtEmpty": "Campo obbligatorio", "PE.Controllers.LeftMenu.newDocumentTitle": "Presentazione senza nome", "PE.Controllers.LeftMenu.requestEditRightsText": "Richiesta di autorizzazione di modifica...", "PE.Controllers.LeftMenu.textNoTextFound": "I dati da cercare non sono stati trovati. Modifica i parametri di ricerca.", @@ -195,7 +239,7 @@ "PE.Controllers.Main.textCloseTip": "Clicca per chiudere il consiglio", "PE.Controllers.Main.textContactUs": "Contatta il reparto vendite.", "PE.Controllers.Main.textLoadingDocument": "Caricamento della presentazione", - "PE.Controllers.Main.textNoLicenseTitle": "Versione open source di ONLYOFFICE", + "PE.Controllers.Main.textNoLicenseTitle": "ONLYOFFICE® limite connessione", "PE.Controllers.Main.textShape": "Forma", "PE.Controllers.Main.textStrict": "Modalità Rigorosa", "PE.Controllers.Main.textTryUndoRedo": "Le funzioni Annulla/Ripristina sono disabilitate per la Modalità di Co-editing Veloce.
    Clicca il pulsante 'Modalità Rigorosa' per passare alla Modalità di Co-editing Rigorosa per poter modificare il file senza l'interferenza di altri utenti e inviare le modifiche solamente dopo averle salvate. Puoi passare da una modalità all'altra di co-editing utilizzando le Impostazioni avanzate dell'editor.", @@ -276,7 +320,8 @@ "PE.Controllers.Main.warnBrowserIE9": "L'applicazione è poco compatibile con IE9. Usa IE10 o più recente", "PE.Controllers.Main.warnBrowserZoom": "Le impostazioni correnti di zoom del tuo browser non sono completamente supportate. Per favore, ritorna allo zoom predefinito premendo Ctrl+0.", "PE.Controllers.Main.warnLicenseExp": "La tua licenza è scaduta.
    Si prega di aggiornare la licenza e ricaricare la pagina.", - "PE.Controllers.Main.warnNoLicense": "Stai utilizzando una versione open source di ONLYOFFICE®. La versione presenta delle limitazioni per le connessioni simultanee al server dei documenti (20 connessioni alla volta).
    Per poterne avere di più, considera l'acquisto di una licenza commerciale.", + "PE.Controllers.Main.warnNoLicense": "Questa versione di ONLYOFFICE® Editors presenta delle limitazioni per le connessioni simultanee al server dei documenti.
    Se necessiti di avere di più, considera l'acquisto di una licenza commerciale.", + "PE.Controllers.Main.warnNoLicenseUsers": "Questa versione di ONLYOFFICE® Editors presenta delle limitazioni per le connessioni simultanee al server dei documenti.
    Se necessiti di avere di più, considera l'acquisto di una licenza commerciale.", "PE.Controllers.Main.warnProcessRightsChange": "Ci stato negato il diritto alla modifica del file.", "PE.Controllers.Statusbar.zoomText": "Zoom {0}%", "PE.Controllers.Toolbar.confirmAddFontName": "Il carattere che vuoi salvare non è accessibile su questo dispositivo.
    Lo stile di testo sarà visualizzato usando uno dei caratteri di sistema, il carattere salvato sarà usato quando accessibile.
    Vuoi continuare?", @@ -808,6 +853,7 @@ "PE.Views.FileMenu.btnHelpCaption": "Guida...", "PE.Views.FileMenu.btnInfoCaption": "Informazioni presentazione...", "PE.Views.FileMenu.btnPrintCaption": "Stampa", + "PE.Views.FileMenu.btnProtectCaption": "Proteggi", "PE.Views.FileMenu.btnRecentFilesCaption": "Apri recenti...", "PE.Views.FileMenu.btnRenameCaption": "Rinomina...", "PE.Views.FileMenu.btnReturnCaption": "Torna alla presentazione", @@ -829,6 +875,16 @@ "PE.Views.FileMenuPanels.DocumentInfo.txtTitle": "Titolo presentazione", "PE.Views.FileMenuPanels.DocumentRights.txtBtnAccessRights": "Cambia diritti di accesso", "PE.Views.FileMenuPanels.DocumentRights.txtRights": "Persone con diritti", + "PE.Views.FileMenuPanels.ProtectDoc.notcriticalErrorTitle": "Avviso", + "PE.Views.FileMenuPanels.ProtectDoc.strEncrypt": "con Password", + "PE.Views.FileMenuPanels.ProtectDoc.strProtect": "Proteggi Presentazione", + "PE.Views.FileMenuPanels.ProtectDoc.strSignature": "con Firma", + "PE.Views.FileMenuPanels.ProtectDoc.txtEdit": "Modifica presentazione", + "PE.Views.FileMenuPanels.ProtectDoc.txtEditWarning": "la modifica eliminerà le firme dalla presentazione.
    Sei sicuro di voler continuare?", + "PE.Views.FileMenuPanels.ProtectDoc.txtEncrypted": "Questa presentazione è protetta con password", + "PE.Views.FileMenuPanels.ProtectDoc.txtSigned": "Le firme valide sono state aggiunte alla presentazione. La presentazione è protetta dalla modifica.", + "PE.Views.FileMenuPanels.ProtectDoc.txtSignedInvalid": "Alcune delle firme digitali in presentazione non sono valide o non possono essere verificate. La presentazione è protetta dalla modifica.", + "PE.Views.FileMenuPanels.ProtectDoc.txtView": "Mostra firme", "PE.Views.FileMenuPanels.Settings.okButtonText": "Applica", "PE.Views.FileMenuPanels.Settings.strAlignGuides": "Turn on alignment guides", "PE.Views.FileMenuPanels.Settings.strAutoRecover": "Attiva il ripristino automatico", @@ -839,6 +895,7 @@ "PE.Views.FileMenuPanels.Settings.strFast": "Fast", "PE.Views.FileMenuPanels.Settings.strForcesave": "Salva sempre sul server (altrimenti salva sul server alla chiusura del documento)", "PE.Views.FileMenuPanels.Settings.strInputMode": "Attiva geroglifici", + "PE.Views.FileMenuPanels.Settings.strInputSogou": "Attiva l'input Sogou Pinyin", "PE.Views.FileMenuPanels.Settings.strShowChanges": "Evidenzia modifiche di collaborazione", "PE.Views.FileMenuPanels.Settings.strSpellCheckMode": "Attiva controllo ortografia", "PE.Views.FileMenuPanels.Settings.strStrict": "Strict", @@ -917,6 +974,7 @@ "PE.Views.LeftMenu.tipSupport": "Feedback & Support", "PE.Views.LeftMenu.tipTitles": "Titoli", "PE.Views.LeftMenu.txtDeveloper": "MODALITÀ SVILUPPATORE", + "PE.Views.LeftMenu.txtTrial": "Modalità di prova", "PE.Views.ParagraphSettings.strLineHeight": "Interlinea", "PE.Views.ParagraphSettings.strParagraphSpacing": "Spaziatura del paragrafo", "PE.Views.ParagraphSettings.strSpacingAfter": "Dopo", @@ -958,6 +1016,7 @@ "PE.Views.RightMenu.txtImageSettings": "Impostazioni immagine", "PE.Views.RightMenu.txtParagraphSettings": "Impostazioni testo", "PE.Views.RightMenu.txtShapeSettings": "Impostazioni forma", + "PE.Views.RightMenu.txtSignatureSettings": "Impostazioni della Firma", "PE.Views.RightMenu.txtSlideSettings": "Impostazioni diapositiva", "PE.Views.RightMenu.txtTableSettings": "Impostazioni tabella", "PE.Views.RightMenu.txtTextArtSettings": "Text Art Settings", @@ -1037,6 +1096,17 @@ "PE.Views.ShapeSettingsAdvanced.textWeightArrows": "Spessori e frecce", "PE.Views.ShapeSettingsAdvanced.textWidth": "Larghezza", "PE.Views.ShapeSettingsAdvanced.txtNone": "Niente", + "PE.Views.SignatureSettings.notcriticalErrorTitle": "Avviso", + "PE.Views.SignatureSettings.strDelete": "Rimuovi Firma", + "PE.Views.SignatureSettings.strDetails": "Dettagli firma", + "PE.Views.SignatureSettings.strInvalid": "Firme non valide", + "PE.Views.SignatureSettings.strSign": "Firma", + "PE.Views.SignatureSettings.strSignature": "Firma", + "PE.Views.SignatureSettings.strValid": "Firme valide", + "PE.Views.SignatureSettings.txtContinueEditing": "Modifica comunque", + "PE.Views.SignatureSettings.txtEditWarning": "la modifica eliminerà le firme dalla presentazione.
    Sei sicuro di voler continuare?", + "PE.Views.SignatureSettings.txtSigned": "Le firme valide sono state aggiunte alla presentazione. La presentazione è protetta dalla modifica.", + "PE.Views.SignatureSettings.txtSignedInvalid": "Alcune delle firme digitali in presentazione non sono valide o non possono essere verificate. La presentazione è protetta dalla modifica.", "PE.Views.SlideSettings.strBackground": "Colore sfondo", "PE.Views.SlideSettings.strColor": "Colore", "PE.Views.SlideSettings.strDelay": "Ritardo", @@ -1311,6 +1381,7 @@ "PE.Views.Toolbar.textTabFile": "File", "PE.Views.Toolbar.textTabHome": "Home", "PE.Views.Toolbar.textTabInsert": "Inserisci", + "PE.Views.Toolbar.textTabProtect": "Protezione", "PE.Views.Toolbar.textTitleError": "Errore", "PE.Views.Toolbar.textUnderline": "Sottolineato", "PE.Views.Toolbar.textZoom": "Zoom", diff --git a/apps/presentationeditor/main/locale/ru.json b/apps/presentationeditor/main/locale/ru.json index 4deba0e4e..7f7bf9ffe 100644 --- a/apps/presentationeditor/main/locale/ru.json +++ b/apps/presentationeditor/main/locale/ru.json @@ -116,16 +116,59 @@ "Common.Views.OpenDialog.txtPassword": "Пароль", "Common.Views.OpenDialog.txtTitle": "Выбрать параметры %1", "Common.Views.OpenDialog.txtTitleProtected": "Защищенный файл", + "Common.Views.PasswordDialog.cancelButtonText": "Отмена", + "Common.Views.PasswordDialog.okButtonText": "OK", + "Common.Views.PasswordDialog.txtDescription": "Для открытия этого документа требуется пароль", + "Common.Views.PasswordDialog.txtIncorrectPwd": "Пароль и его подтверждение не совпадают", + "Common.Views.PasswordDialog.txtPassword": "Пароль", + "Common.Views.PasswordDialog.txtRepeat": "Повторить пароль", + "Common.Views.PasswordDialog.txtTitle": "Установка пароля", "Common.Views.PluginDlg.textLoading": "Загрузка", "Common.Views.Plugins.groupCaption": "Плагины", "Common.Views.Plugins.strPlugins": "Плагины", "Common.Views.Plugins.textLoading": "Загрузка", "Common.Views.Plugins.textStart": "Запустить", "Common.Views.Plugins.textStop": "Остановить", + "Common.Views.Protection.hintAddPwd": "Зашифровать с помощью пароля", + "Common.Views.Protection.hintPwd": "Изменить или удалить пароль", + "Common.Views.Protection.hintSignature": "Добавить цифровую подпись или строку подписи", + "Common.Views.Protection.txtAddPwd": "Добавить пароль", + "Common.Views.Protection.txtChangePwd": "Изменить пароль", + "Common.Views.Protection.txtDeletePwd": "Удалить пароль", + "Common.Views.Protection.txtEncrypt": "Шифровать", + "Common.Views.Protection.txtInvisibleSignature": "Добавить цифровую подпись", + "Common.Views.Protection.txtSignature": "Подпись", + "Common.Views.Protection.txtSignatureLine": "Строка подписи", "Common.Views.RenameDialog.cancelButtonText": "Отмена", "Common.Views.RenameDialog.okButtonText": "Ok", "Common.Views.RenameDialog.textName": "Имя файла", "Common.Views.RenameDialog.txtInvalidName": "Имя файла не должно содержать следующих символов: ", + "Common.Views.SignDialog.cancelButtonText": "Отмена", + "Common.Views.SignDialog.okButtonText": "Ok", + "Common.Views.SignDialog.textBold": "Жирный", + "Common.Views.SignDialog.textCertificate": "Сертификат", + "Common.Views.SignDialog.textChange": "Изменить", + "Common.Views.SignDialog.textInputName": "Введите имя подписывающего", + "Common.Views.SignDialog.textItalic": "Курсив", + "Common.Views.SignDialog.textPurpose": "Цель подписания документа", + "Common.Views.SignDialog.textSelectImage": "Выбрать изображение", + "Common.Views.SignDialog.textSignature": "Как выглядит подпись:", + "Common.Views.SignDialog.textTitle": "Подписание документа", + "Common.Views.SignDialog.textUseImage": "или нажмите 'Выбрать изображение', чтобы использовать изображение в качестве подписи", + "Common.Views.SignDialog.textValid": "Действителен с %1 по %2", + "Common.Views.SignDialog.tipFontName": "Шрифт", + "Common.Views.SignDialog.tipFontSize": "Размер шрифта", + "Common.Views.SignSettingsDialog.cancelButtonText": "Отмена", + "Common.Views.SignSettingsDialog.okButtonText": "Ok", + "Common.Views.SignSettingsDialog.textAllowComment": "Разрешить подписывающему добавлять примечания в окне подписи", + "Common.Views.SignSettingsDialog.textInfo": "Сведения о подписывающем", + "Common.Views.SignSettingsDialog.textInfoEmail": "Адрес электронной почты", + "Common.Views.SignSettingsDialog.textInfoName": "Имя", + "Common.Views.SignSettingsDialog.textInfoTitle": "Должность подписывающего", + "Common.Views.SignSettingsDialog.textInstructions": "Инструкции для подписывающего", + "Common.Views.SignSettingsDialog.textShowDate": "Показывать дату подписи в строке подписи", + "Common.Views.SignSettingsDialog.textTitle": "Настройка подписи", + "Common.Views.SignSettingsDialog.txtEmpty": "Это поле необходимо заполнить", "PE.Controllers.LeftMenu.newDocumentTitle": "Презентация без имени", "PE.Controllers.LeftMenu.requestEditRightsText": "Запрос прав на редактирование...", "PE.Controllers.LeftMenu.textNoTextFound": "Искомые данные не найдены. Пожалуйста, измените параметры поиска.", @@ -278,6 +321,7 @@ "PE.Controllers.Main.warnBrowserZoom": "Текущее значение масштаба страницы в браузере поддерживается не полностью. Вернитесь к масштабу по умолчанию, нажав Ctrl+0", "PE.Controllers.Main.warnLicenseExp": "Истек срок действия лицензии.
    Обновите лицензию, а затем обновите страницу.", "PE.Controllers.Main.warnNoLicense": "Эта версия редакторов ONLYOFFICE имеет некоторые ограничения по количеству одновременных подключений к серверу документов.
    Если требуется больше, рассмотрите вопрос об обновлении текущей лицензии или покупке коммерческой лицензии.", + "PE.Controllers.Main.warnNoLicenseUsers": "Эта версия редакторов ONLYOFFICE имеет некоторые ограничения по числу одновременно работающих пользователей.
    Если требуется больше, рассмотрите вопрос об обновлении текущей лицензии или покупке коммерческой лицензии.", "PE.Controllers.Main.warnProcessRightsChange": "Вам было отказано в праве на редактирование этого файла.", "PE.Controllers.Statusbar.zoomText": "Масштаб {0}%", "PE.Controllers.Toolbar.confirmAddFontName": "Шрифт, который вы хотите сохранить, недоступен на этом устройстве.
    Стиль текста будет отображаться с помощью одного из системных шрифтов. Сохраненный шрифт будет использоваться, когда он станет доступен.
    Вы хотите продолжить?", @@ -809,6 +853,7 @@ "PE.Views.FileMenu.btnHelpCaption": "Справка...", "PE.Views.FileMenu.btnInfoCaption": "Сведения о презентации...", "PE.Views.FileMenu.btnPrintCaption": "Печать", + "PE.Views.FileMenu.btnProtectCaption": "Защитить", "PE.Views.FileMenu.btnRecentFilesCaption": "Открыть последние...", "PE.Views.FileMenu.btnRenameCaption": "Переименовать...", "PE.Views.FileMenu.btnReturnCaption": "Вернуться к презентации", @@ -830,6 +875,16 @@ "PE.Views.FileMenuPanels.DocumentInfo.txtTitle": "Название презентации", "PE.Views.FileMenuPanels.DocumentRights.txtBtnAccessRights": "Изменить права доступа", "PE.Views.FileMenuPanels.DocumentRights.txtRights": "Люди, имеющие права", + "PE.Views.FileMenuPanels.ProtectDoc.notcriticalErrorTitle": "Внимание", + "PE.Views.FileMenuPanels.ProtectDoc.strEncrypt": "C помощью пароля", + "PE.Views.FileMenuPanels.ProtectDoc.strProtect": "Защитить презентацию", + "PE.Views.FileMenuPanels.ProtectDoc.strSignature": "С помощью подписи", + "PE.Views.FileMenuPanels.ProtectDoc.txtEdit": "Редактировать презентацию", + "PE.Views.FileMenuPanels.ProtectDoc.txtEditWarning": "При редактировании из презентации будут удалены подписи.
    Вы действительно хотите продолжить?", + "PE.Views.FileMenuPanels.ProtectDoc.txtEncrypted": "Эта презентация защищена паролем", + "PE.Views.FileMenuPanels.ProtectDoc.txtSigned": "В презентацию добавлены действительные подписи. Презентация защищена от редактирования.", + "PE.Views.FileMenuPanels.ProtectDoc.txtSignedInvalid": "Некоторые из цифровых подписей в презентации недействительны или их нельзя проверить. Презентация защищена от редактирования.", + "PE.Views.FileMenuPanels.ProtectDoc.txtView": "Просмотр подписей", "PE.Views.FileMenuPanels.Settings.okButtonText": "Применить", "PE.Views.FileMenuPanels.Settings.strAlignGuides": "Включить направляющие выравнивания", "PE.Views.FileMenuPanels.Settings.strAutoRecover": "Включить автовосстановление", @@ -961,6 +1016,7 @@ "PE.Views.RightMenu.txtImageSettings": "Параметры изображения", "PE.Views.RightMenu.txtParagraphSettings": "Параметры текста", "PE.Views.RightMenu.txtShapeSettings": "Параметры фигуры", + "PE.Views.RightMenu.txtSignatureSettings": "Настройка подписи", "PE.Views.RightMenu.txtSlideSettings": "Параметры слайда", "PE.Views.RightMenu.txtTableSettings": "Параметры таблицы", "PE.Views.RightMenu.txtTextArtSettings": "Параметры объектов Text Art", @@ -1040,6 +1096,17 @@ "PE.Views.ShapeSettingsAdvanced.textWeightArrows": "Линии и стрелки", "PE.Views.ShapeSettingsAdvanced.textWidth": "Ширина", "PE.Views.ShapeSettingsAdvanced.txtNone": "Нет", + "PE.Views.SignatureSettings.notcriticalErrorTitle": "Внимание", + "PE.Views.SignatureSettings.strDelete": "Удалить подпись", + "PE.Views.SignatureSettings.strDetails": "Состав подписи", + "PE.Views.SignatureSettings.strInvalid": "Недействительные подписи", + "PE.Views.SignatureSettings.strSign": "Подписать", + "PE.Views.SignatureSettings.strSignature": "Подпись", + "PE.Views.SignatureSettings.strValid": "Действительные подписи", + "PE.Views.SignatureSettings.txtContinueEditing": "Все равно редактировать", + "PE.Views.SignatureSettings.txtEditWarning": "При редактировании из презентации будут удалены подписи.
    Вы действительно хотите продолжить?", + "PE.Views.SignatureSettings.txtSigned": "В презентацию добавлены действительные подписи. Презентация защищена от редактирования.", + "PE.Views.SignatureSettings.txtSignedInvalid": "Некоторые из цифровых подписей в презентации недействительны или их нельзя проверить. Презентация защищена от редактирования.", "PE.Views.SlideSettings.strBackground": "Цвет фона", "PE.Views.SlideSettings.strColor": "Цвет", "PE.Views.SlideSettings.strDelay": "Задержка", @@ -1314,6 +1381,7 @@ "PE.Views.Toolbar.textTabFile": "Файл", "PE.Views.Toolbar.textTabHome": "Главная", "PE.Views.Toolbar.textTabInsert": "Вставка", + "PE.Views.Toolbar.textTabProtect": "Защита", "PE.Views.Toolbar.textTitleError": "Ошибка", "PE.Views.Toolbar.textUnderline": "Подчеркнутый", "PE.Views.Toolbar.textZoom": "Масштаб", diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json index 5fea2bef0..cf16d271b 100644 --- a/apps/spreadsheeteditor/main/locale/en.json +++ b/apps/spreadsheeteditor/main/locale/en.json @@ -104,57 +104,57 @@ "Common.Views.OpenDialog.txtTitleProtected": "Protected File", "Common.Views.PasswordDialog.cancelButtonText": "Cancel", "Common.Views.PasswordDialog.okButtonText": "OK", - "Common.Views.PasswordDialog.txtPassword": "Password", - "Common.Views.PasswordDialog.txtTitle": "Set Password", - "Common.Views.PasswordDialog.txtDescription": "A Password is required to open this document", - "Common.Views.PasswordDialog.txtRepeat": "Repeat password", + "Common.Views.PasswordDialog.txtDescription": "A password is required to open this document", "Common.Views.PasswordDialog.txtIncorrectPwd": "Confirmation password is not identical", + "Common.Views.PasswordDialog.txtPassword": "Password", + "Common.Views.PasswordDialog.txtRepeat": "Repeat password", + "Common.Views.PasswordDialog.txtTitle": "Set Password", "Common.Views.PluginDlg.textLoading": "Loading", "Common.Views.Plugins.groupCaption": "Plugins", "Common.Views.Plugins.strPlugins": "Plugins", "Common.Views.Plugins.textLoading": "Loading", "Common.Views.Plugins.textStart": "Start", "Common.Views.Plugins.textStop": "Stop", - "Common.Views.Protection.txtAddPwd": "Add password", - "Common.Views.Protection.txtEncrypt": "Encrypt", - "Common.Views.Protection.txtSignature": "Signature", "Common.Views.Protection.hintAddPwd": "Encrypt with password", "Common.Views.Protection.hintPwd": "Change or delete password", "Common.Views.Protection.hintSignature": "Add digital signature or signature line", + "Common.Views.Protection.txtAddPwd": "Add password", "Common.Views.Protection.txtChangePwd": "Change password", "Common.Views.Protection.txtDeletePwd": "Delete password", + "Common.Views.Protection.txtEncrypt": "Encrypt", "Common.Views.Protection.txtInvisibleSignature": "Add digital signature", + "Common.Views.Protection.txtSignature": "Signature", "Common.Views.Protection.txtSignatureLine": "Signature line", "Common.Views.RenameDialog.cancelButtonText": "Cancel", "Common.Views.RenameDialog.okButtonText": "Ok", "Common.Views.RenameDialog.textName": "File name", "Common.Views.RenameDialog.txtInvalidName": "The file name cannot contain any of the following characters: ", - "Common.Views.SignDialog.textTitle": "Sign Document", - "Common.Views.SignDialog.textPurpose": "Purpose for signing this document", - "Common.Views.SignDialog.textCertificate": "Certificate", - "Common.Views.SignDialog.textValid": "Valid from %1 to %2", - "Common.Views.SignDialog.textChange": "Change", "Common.Views.SignDialog.cancelButtonText": "Cancel", "Common.Views.SignDialog.okButtonText": "Ok", + "Common.Views.SignDialog.textBold": "Bold", + "Common.Views.SignDialog.textCertificate": "Certificate", + "Common.Views.SignDialog.textChange": "Change", "Common.Views.SignDialog.textInputName": "Input signer name", - "Common.Views.SignDialog.textUseImage": "or click 'Select Image' to use a picture as signature", + "Common.Views.SignDialog.textItalic": "Italic", + "Common.Views.SignDialog.textPurpose": "Purpose for signing this document", "Common.Views.SignDialog.textSelectImage": "Select Image", "Common.Views.SignDialog.textSignature": "Signature looks as", + "Common.Views.SignDialog.textTitle": "Sign Document", + "Common.Views.SignDialog.textUseImage": "or click 'Select Image' to use a picture as signature", + "Common.Views.SignDialog.textValid": "Valid from %1 to %2", "Common.Views.SignDialog.tipFontName": "Font Name", "Common.Views.SignDialog.tipFontSize": "Font Size", - "Common.Views.SignDialog.textBold": "Bold", - "Common.Views.SignDialog.textItalic": "Italic", - "Common.Views.SignSettingsDialog.textInfo": "Signer Info", - "Common.Views.SignSettingsDialog.textInfoName": "Name", - "Common.Views.SignSettingsDialog.textInfoTitle": "Signer Title", - "Common.Views.SignSettingsDialog.textInfoEmail": "E-mail", - "Common.Views.SignSettingsDialog.textInstructions": "Instructions for Signer", "Common.Views.SignSettingsDialog.cancelButtonText": "Cancel", "Common.Views.SignSettingsDialog.okButtonText": "Ok", - "Common.Views.SignSettingsDialog.txtEmpty": "This field is required", "Common.Views.SignSettingsDialog.textAllowComment": "Allow signer to add comment in the signature dialog", + "Common.Views.SignSettingsDialog.textInfo": "Signer Info", + "Common.Views.SignSettingsDialog.textInfoEmail": "E-mail", + "Common.Views.SignSettingsDialog.textInfoName": "Name", + "Common.Views.SignSettingsDialog.textInfoTitle": "Signer Title", + "Common.Views.SignSettingsDialog.textInstructions": "Instructions for Signer", "Common.Views.SignSettingsDialog.textShowDate": "Show sign date in signature line", "Common.Views.SignSettingsDialog.textTitle": "Signature Settings", + "Common.Views.SignSettingsDialog.txtEmpty": "This field is required", "SSE.Controllers.DocumentHolder.alignmentText": "Alignment", "SSE.Controllers.DocumentHolder.centerText": "Center", "SSE.Controllers.DocumentHolder.deleteColumnText": "Delete Column", @@ -840,7 +840,7 @@ "SSE.Views.ChartSettings.textArea": "Area", "SSE.Views.ChartSettings.textBar": "Bar", "SSE.Views.ChartSettings.textBorderSizeErr": "The entered value is incorrect.
    Please enter a value between 0 pt and 1584 pt.", - "SSE.Views.ChartSettings.textChartType": "Change Chart Type", + "SSE.Views.ChartSettings.textChartType": "Change chart type", "SSE.Views.ChartSettings.textColumn": "Column", "SSE.Views.ChartSettings.textColumnSpark": "Column", "SSE.Views.ChartSettings.textEditData": "Edit Data and Location", @@ -1045,6 +1045,10 @@ "SSE.Views.DocumentHolder.selectDataText": "Column Data", "SSE.Views.DocumentHolder.selectRowText": "Row", "SSE.Views.DocumentHolder.selectTableText": "Table", + "SSE.Views.DocumentHolder.strDelete": "Remove Signature", + "SSE.Views.DocumentHolder.strDetails": "Signature Details", + "SSE.Views.DocumentHolder.strSetup": "Signature Setup", + "SSE.Views.DocumentHolder.strSign": "Sign", "SSE.Views.DocumentHolder.textArrangeBack": "Send to Background", "SSE.Views.DocumentHolder.textArrangeBackward": "Send Backward", "SSE.Views.DocumentHolder.textArrangeForward": "Bring Forward", @@ -1106,10 +1110,6 @@ "SSE.Views.DocumentHolder.txtUngroup": "Ungroup", "SSE.Views.DocumentHolder.txtWidth": "Width", "SSE.Views.DocumentHolder.vertAlignText": "Vertical Alignment", - "SSE.Views.DocumentHolder.strSign": "Sign", - "SSE.Views.DocumentHolder.strDetails": "Signature Details", - "SSE.Views.DocumentHolder.strSetup": "Signature Setup", - "SSE.Views.DocumentHolder.strDelete": "Remove Signature", "SSE.Views.FileMenu.btnBackCaption": "Go to Documents", "SSE.Views.FileMenu.btnCloseMenuCaption": "Close Menu", "SSE.Views.FileMenu.btnCreateNewCaption": "Create New", @@ -1117,6 +1117,7 @@ "SSE.Views.FileMenu.btnHelpCaption": "Help...", "SSE.Views.FileMenu.btnInfoCaption": "Spreadsheet Info...", "SSE.Views.FileMenu.btnPrintCaption": "Print", + "SSE.Views.FileMenu.btnProtectCaption": "Protect", "SSE.Views.FileMenu.btnRecentFilesCaption": "Open Recent...", "SSE.Views.FileMenu.btnRenameCaption": "Rename...", "SSE.Views.FileMenu.btnReturnCaption": "Back to Spreadsheet", @@ -1125,7 +1126,6 @@ "SSE.Views.FileMenu.btnSaveCaption": "Save", "SSE.Views.FileMenu.btnSettingsCaption": "Advanced Settings...", "SSE.Views.FileMenu.btnToEditCaption": "Edit Spreadsheet", - "SSE.Views.FileMenu.btnProtectCaption": "Protect", "SSE.Views.FileMenuPanels.CreateNew.fromBlankText": "From Blank", "SSE.Views.FileMenuPanels.CreateNew.fromTemplateText": "From Template", "SSE.Views.FileMenuPanels.CreateNew.newDescriptionText": "Create a new blank spreadsheet which you will be able to style and format after it is created during the editing. Or choose one of the templates to start a spreadsheet of a certain type or purpose where some styles have already been pre-applied.", @@ -1178,19 +1178,19 @@ "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtPt": "Point", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtRu": "Russian", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtWin": "as Windows", + "SSE.Views.FileMenuPanels.ProtectDoc.notcriticalErrorTitle": "Warning", + "SSE.Views.FileMenuPanels.ProtectDoc.strEncrypt": "With password", + "SSE.Views.FileMenuPanels.ProtectDoc.strProtect": "Protect Spreadsheet", + "SSE.Views.FileMenuPanels.ProtectDoc.strSignature": "With signature", + "SSE.Views.FileMenuPanels.ProtectDoc.txtEdit": "Edit spreadsheet", + "SSE.Views.FileMenuPanels.ProtectDoc.txtEditWarning": "Editing will remove the signatures from the spreadsheet.
    Are you sure you want to continue?", + "SSE.Views.FileMenuPanels.ProtectDoc.txtEncrypted": "This spreadsheet has been protected by password", + "SSE.Views.FileMenuPanels.ProtectDoc.txtRequestedSignatures": "This spreadsheet needs to be signed.", + "SSE.Views.FileMenuPanels.ProtectDoc.txtSigned": "Valid signatures has been added to the spreadsheet. The spreadsheet is protected from editing.", + "SSE.Views.FileMenuPanels.ProtectDoc.txtSignedInvalid": "Some of the digital signatures in spreadsheet are invalid or could not be verified. The spreadsheet is protected from editing.", + "SSE.Views.FileMenuPanels.ProtectDoc.txtView": "View signatures", "SSE.Views.FileMenuPanels.Settings.txtGeneral": "General", "SSE.Views.FileMenuPanels.Settings.txtPageSettings": "Page Settings", - "SSE.Views.FileMenuPanels.ProtectDoc.strProtect": "Protect Workbook", - "SSE.Views.FileMenuPanels.ProtectDoc.strSignature": "With Signature", - "SSE.Views.FileMenuPanels.ProtectDoc.txtView": "View signatures", - "SSE.Views.FileMenuPanels.ProtectDoc.txtEdit": "Edit workbook", - "SSE.Views.FileMenuPanels.ProtectDoc.txtSigned": "Valid signatures has been added to the workbook. The workbook is protected from editing.", - "SSE.Views.FileMenuPanels.ProtectDoc.txtSignedInvalid": "Some of the digital signatures in workbook are invalid or could not be verified. The workbook is protected from editing.", - "SSE.Views.FileMenuPanels.ProtectDoc.txtRequestedSignatures": "This workbook needs to be signed.", - "SSE.Views.FileMenuPanels.ProtectDoc.notcriticalErrorTitle": "Warning", - "SSE.Views.FileMenuPanels.ProtectDoc.txtEditWarning": "Editing will remove the signatures from the workbook.
    Are you sure you want to continue?", - "SSE.Views.FileMenuPanels.ProtectDoc.strEncrypt": "With Password", - "SSE.Views.FileMenuPanels.ProtectDoc.txtEncrypted": "This workbook has been protected by password", "SSE.Views.FormatSettingsDialog.textCancel": "Cancel", "SSE.Views.FormatSettingsDialog.textCategory": "Category", "SSE.Views.FormatSettingsDialog.textDecimal": "Decimal", @@ -1391,7 +1391,7 @@ "SSE.Views.ParagraphSettingsAdvanced.strStrike": "Strikethrough", "SSE.Views.ParagraphSettingsAdvanced.strSubscript": "Subscript", "SSE.Views.ParagraphSettingsAdvanced.strSuperscript": "Superscript", - "SSE.Views.ParagraphSettingsAdvanced.strTabs": "Tab", + "SSE.Views.ParagraphSettingsAdvanced.strTabs": "Tabs", "SSE.Views.ParagraphSettingsAdvanced.textAlign": "Alignment", "SSE.Views.ParagraphSettingsAdvanced.textCharacterSpacing": "Character Spacing", "SSE.Views.ParagraphSettingsAdvanced.textDefault": "Default Tab", @@ -1437,10 +1437,10 @@ "SSE.Views.RightMenu.txtParagraphSettings": "Text settings", "SSE.Views.RightMenu.txtSettings": "Common Settings", "SSE.Views.RightMenu.txtShapeSettings": "Shape settings", + "SSE.Views.RightMenu.txtSignatureSettings": "Signature Settings", "SSE.Views.RightMenu.txtSparklineSettings": "Sparkline Settings", "SSE.Views.RightMenu.txtTableSettings": "Table settings", "SSE.Views.RightMenu.txtTextArtSettings": "Text Art settings", - "SSE.Views.RightMenu.txtSignatureSettings": "Signature Settings", "SSE.Views.SetValueDialog.cancelButtonText": "Cancel", "SSE.Views.SetValueDialog.okButtonText": "OK", "SSE.Views.SetValueDialog.txtMaxText": "The maximum value for this field is {0}", @@ -1488,21 +1488,6 @@ "SSE.Views.ShapeSettings.txtNoBorders": "No Line", "SSE.Views.ShapeSettings.txtPapyrus": "Papyrus", "SSE.Views.ShapeSettings.txtWood": "Wood", - "SSE.Views.SignatureSettings.strSignature": "Signature", - "SSE.Views.SignatureSettings.strSigner": "Signer", - "SSE.Views.SignatureSettings.strRequested": "Requested signatures", - "SSE.Views.SignatureSettings.strValid": "Valid signatures", - "SSE.Views.SignatureSettings.strInvalid": "Invalid signatures", - "SSE.Views.SignatureSettings.strSign": "Sign", - "SSE.Views.SignatureSettings.strDetails": "Signature Details", - "SSE.Views.SignatureSettings.strDelete": "Remove Signature", - "SSE.Views.SignatureSettings.strSetup": "Signature Setup", - "SSE.Views.SignatureSettings.txtSigned": "Valid signatures has been added to the workbook. The workbook is protected from editing.", - "SSE.Views.SignatureSettings.txtSignedInvalid": "Some of the digital signatures in workbook are invalid or could not be verified. The workbook is protected from editing.", - "SSE.Views.SignatureSettings.txtRequestedSignatures": "This workbook needs to be signed.", - "SSE.Views.SignatureSettings.txtContinueEditing": "Edit anyway", - "SSE.Views.SignatureSettings.notcriticalErrorTitle": "Warning", - "SSE.Views.SignatureSettings.txtEditWarning": "Editing will remove the signatures from the workbook.
    Are you sure you want to continue?", "SSE.Views.ShapeSettingsAdvanced.cancelButtonText": "Cancel", "SSE.Views.ShapeSettingsAdvanced.okButtonText": "OK", "SSE.Views.ShapeSettingsAdvanced.strColumns": "Columns", @@ -1536,6 +1521,21 @@ "SSE.Views.ShapeSettingsAdvanced.textTop": "Top", "SSE.Views.ShapeSettingsAdvanced.textWeightArrows": "Weights & Arrows", "SSE.Views.ShapeSettingsAdvanced.textWidth": "Width", + "SSE.Views.SignatureSettings.notcriticalErrorTitle": "Warning", + "SSE.Views.SignatureSettings.strDelete": "Remove Signature", + "SSE.Views.SignatureSettings.strDetails": "Signature Details", + "SSE.Views.SignatureSettings.strInvalid": "Invalid signatures", + "SSE.Views.SignatureSettings.strRequested": "Requested signatures", + "SSE.Views.SignatureSettings.strSetup": "Signature Setup", + "SSE.Views.SignatureSettings.strSign": "Sign", + "SSE.Views.SignatureSettings.strSignature": "Signature", + "SSE.Views.SignatureSettings.strSigner": "Signer", + "SSE.Views.SignatureSettings.strValid": "Valid signatures", + "SSE.Views.SignatureSettings.txtContinueEditing": "Edit anyway", + "SSE.Views.SignatureSettings.txtEditWarning": "Editing will remove the signatures from the spreadsheet.
    Are you sure you want to continue?", + "SSE.Views.SignatureSettings.txtRequestedSignatures": "This spreadsheet needs to be signed.", + "SSE.Views.SignatureSettings.txtSigned": "Valid signatures has been added to the spreadsheet. The spreadsheet is protected from editing.", + "SSE.Views.SignatureSettings.txtSignedInvalid": "Some of the digital signatures in spreadsheet are invalid or could not be verified. The spreadsheet is protected from editing.", "SSE.Views.Statusbar.CopyDialog.itemCopyToEnd": "(Copy to end)", "SSE.Views.Statusbar.CopyDialog.itemMoveToEnd": "(Move to end)", "SSE.Views.Statusbar.CopyDialog.textCopyBefore": "Copy before sheet", diff --git a/apps/spreadsheeteditor/main/locale/it.json b/apps/spreadsheeteditor/main/locale/it.json index 121344837..2f54708dc 100644 --- a/apps/spreadsheeteditor/main/locale/it.json +++ b/apps/spreadsheeteditor/main/locale/it.json @@ -102,16 +102,59 @@ "Common.Views.OpenDialog.txtTab": "Tabulazione", "Common.Views.OpenDialog.txtTitle": "Seleziona parametri %1", "Common.Views.OpenDialog.txtTitleProtected": "File protetto", + "Common.Views.PasswordDialog.cancelButtonText": "Annulla", + "Common.Views.PasswordDialog.okButtonText": "OK", + "Common.Views.PasswordDialog.txtDescription": "É richiesta la password per aprire il documento", + "Common.Views.PasswordDialog.txtIncorrectPwd": "la password di conferma non corrisponde", + "Common.Views.PasswordDialog.txtPassword": "Password", + "Common.Views.PasswordDialog.txtRepeat": "Ripeti password", + "Common.Views.PasswordDialog.txtTitle": "Imposta password", "Common.Views.PluginDlg.textLoading": "Caricamento", "Common.Views.Plugins.groupCaption": "Componenti Aggiuntivi", "Common.Views.Plugins.strPlugins": "Plugin", "Common.Views.Plugins.textLoading": "Caricamento", "Common.Views.Plugins.textStart": "Avvio", "Common.Views.Plugins.textStop": "Termina", + "Common.Views.Protection.hintAddPwd": "Crittografa con password", + "Common.Views.Protection.hintPwd": "Modifica o rimuovi password", + "Common.Views.Protection.hintSignature": "Aggiungi firma digitale o riga di firma", + "Common.Views.Protection.txtAddPwd": "Aggiungi password", + "Common.Views.Protection.txtChangePwd": "Modifica password", + "Common.Views.Protection.txtDeletePwd": "Elimina password", + "Common.Views.Protection.txtEncrypt": "Crittografare", + "Common.Views.Protection.txtInvisibleSignature": "Aggiungi firma digitale", + "Common.Views.Protection.txtSignature": "Firma", + "Common.Views.Protection.txtSignatureLine": "Riga della firma", "Common.Views.RenameDialog.cancelButtonText": "Annulla", "Common.Views.RenameDialog.okButtonText": "OK", "Common.Views.RenameDialog.textName": "Nome file", "Common.Views.RenameDialog.txtInvalidName": "Il nome del file non può contenere nessuno dei seguenti caratteri:", + "Common.Views.SignDialog.cancelButtonText": "Annulla", + "Common.Views.SignDialog.okButtonText": "OK", + "Common.Views.SignDialog.textBold": "Grassetto", + "Common.Views.SignDialog.textCertificate": "Certificato", + "Common.Views.SignDialog.textChange": "Cambia", + "Common.Views.SignDialog.textInputName": "Inserisci nome firmatario", + "Common.Views.SignDialog.textItalic": "Corsivo", + "Common.Views.SignDialog.textPurpose": "Motivo della firma del documento", + "Common.Views.SignDialog.textSelectImage": "Seleziona Immagine", + "Common.Views.SignDialog.textSignature": "La firma appare come", + "Common.Views.SignDialog.textTitle": "Firma Documento", + "Common.Views.SignDialog.textUseImage": "oppure clicca 'Scegli immagine' per utilizzare un'immagine come firma", + "Common.Views.SignDialog.textValid": "Valido dal %1 al %2", + "Common.Views.SignDialog.tipFontName": "Nome carattere", + "Common.Views.SignDialog.tipFontSize": "Dimensione carattere", + "Common.Views.SignSettingsDialog.cancelButtonText": "Annulla", + "Common.Views.SignSettingsDialog.okButtonText": "OK", + "Common.Views.SignSettingsDialog.textAllowComment": "Consenti al firmatario di aggiungere commenti nella finestra di firma", + "Common.Views.SignSettingsDialog.textInfo": "Informazioni sul Firmatario", + "Common.Views.SignSettingsDialog.textInfoEmail": "E-mail", + "Common.Views.SignSettingsDialog.textInfoName": "Nome", + "Common.Views.SignSettingsDialog.textInfoTitle": "Titolo del Firmatario", + "Common.Views.SignSettingsDialog.textInstructions": "Istruzioni per i Firmatari", + "Common.Views.SignSettingsDialog.textShowDate": "Mostra la data nella riga di Firma", + "Common.Views.SignSettingsDialog.textTitle": "Impostazioni della Firma", + "Common.Views.SignSettingsDialog.txtEmpty": "Campo obbligatorio", "SSE.Controllers.DocumentHolder.alignmentText": "Allineamento", "SSE.Controllers.DocumentHolder.centerText": "Al centro", "SSE.Controllers.DocumentHolder.deleteColumnText": "Elimina colonna", @@ -250,10 +293,10 @@ "SSE.Controllers.Main.convertationTimeoutText": "E' stato superato il tempo limite della conversione.", "SSE.Controllers.Main.criticalErrorExtText": "Clicca su \"OK\" per ritornare all'elenco dei documenti.", "SSE.Controllers.Main.criticalErrorTitle": "Errore", - "SSE.Controllers.Main.defaultTitleText": "ONLYOFFICE Spreadsheet Editor", + "SSE.Controllers.Main.defaultTitleText": "Editor dei fogli di calcolo ONLYOFFICE® ", "SSE.Controllers.Main.downloadErrorText": "Download fallito.", - "SSE.Controllers.Main.downloadTextText": "Download del foglio elettronico in corso...", - "SSE.Controllers.Main.downloadTitleText": "Download del foglio elettronico", + "SSE.Controllers.Main.downloadTextText": "Download del foglio di calcolo in corso...", + "SSE.Controllers.Main.downloadTitleText": "Download del foglio di calcolo", "SSE.Controllers.Main.errorAccessDeny": "Stai tentando di eseguire un'azione per la quale non disponi di permessi sufficienti.
    Si prega di contattare l'amministratore del Server dei Documenti.", "SSE.Controllers.Main.errorArgsRange": "Un errore nella formula inserita.
    È stato utilizzato un intervallo di argomenti non corretto.", "SSE.Controllers.Main.errorAutoFilterChange": "Operazione non consentita. Si sta tentando di spostare le celle nella tabella del tuo foglio di lavoro.", @@ -312,30 +355,30 @@ "SSE.Controllers.Main.loadImagesTitleText": "Caricamento delle immagini", "SSE.Controllers.Main.loadImageTextText": "Caricamento dell'immagine in corso...", "SSE.Controllers.Main.loadImageTitleText": "Caricamento dell'immagine", - "SSE.Controllers.Main.loadingDocumentTitleText": "Caricamento del foglio elettronico", + "SSE.Controllers.Main.loadingDocumentTitleText": "Caricamento del foglio di calcolo", "SSE.Controllers.Main.notcriticalErrorTitle": "Avviso", "SSE.Controllers.Main.openErrorText": "Si è verificato un errore all'apertura del file", - "SSE.Controllers.Main.openTextText": "Apertura del foglio elettronico in corso...", - "SSE.Controllers.Main.openTitleText": "Apertura del foglio elettronico", + "SSE.Controllers.Main.openTextText": "Apertura del foglio di calcolo in corso...", + "SSE.Controllers.Main.openTitleText": "Apertura del foglio di calcolo", "SSE.Controllers.Main.pastInMergeAreaError": "Impossibile modificare la parte della cella unita", - "SSE.Controllers.Main.printTextText": "Stampa del foglio elettronico in corso...", - "SSE.Controllers.Main.printTitleText": "Stampa del foglio elettronico", + "SSE.Controllers.Main.printTextText": "Stampa del foglio di calcolo in corso...", + "SSE.Controllers.Main.printTitleText": "Stampa in corso del foglio di calcolo", "SSE.Controllers.Main.reloadButtonText": "Ricarica pagina", "SSE.Controllers.Main.requestEditFailedMessageText": "Qualcuno sta modificando questo documento. Si prega di provare più tardi.", "SSE.Controllers.Main.requestEditFailedTitleText": "Accesso vietato", "SSE.Controllers.Main.saveErrorText": "Si è verificato un errore al salvataggio del file", "SSE.Controllers.Main.savePreparingText": "Preparazione al salvataggio ", "SSE.Controllers.Main.savePreparingTitle": "Preparazione al salvataggio. Si prega di aspettare...", - "SSE.Controllers.Main.saveTextText": "Salvataggio del foglio elettronico in corso...", - "SSE.Controllers.Main.saveTitleText": "Salvataggio del foglio elettronico", + "SSE.Controllers.Main.saveTextText": "Salvataggio del foglio di calcolo in corso...", + "SSE.Controllers.Main.saveTitleText": "Salvataggio del foglio di calcolo", "SSE.Controllers.Main.textAnonymous": "Anonimo", "SSE.Controllers.Main.textBuyNow": "Visita il sito web", "SSE.Controllers.Main.textCloseTip": "Clicca per chiudere il consiglio", "SSE.Controllers.Main.textConfirm": "Conferma", "SSE.Controllers.Main.textContactUs": "Contatta il reparto vendite.", - "SSE.Controllers.Main.textLoadingDocument": "Caricamento del foglio elettronico", + "SSE.Controllers.Main.textLoadingDocument": "Caricamento del foglio di calcolo", "SSE.Controllers.Main.textNo": "No", - "SSE.Controllers.Main.textNoLicenseTitle": "Versione open source di ONLYOFFICE®", + "SSE.Controllers.Main.textNoLicenseTitle": "ONLYOFFICE® limite connessione", "SSE.Controllers.Main.textPleaseWait": "L'operazione può richiedere più tempo. Per favore, attendi...", "SSE.Controllers.Main.textRecalcFormulas": "Calcolo delle formule in corso...", "SSE.Controllers.Main.textShape": "Forma", @@ -392,7 +435,8 @@ "SSE.Controllers.Main.warnBrowserIE9": "L'applicazione è poco compatibile con IE9. Usa IE10 o più recente", "SSE.Controllers.Main.warnBrowserZoom": "Le impostazioni correnti di zoom del tuo browser non sono completamente supportate. Per favore, ritorna allo zoom predefinito premendo Ctrl+0.", "SSE.Controllers.Main.warnLicenseExp": "La tua licenza è scaduta.
    Si prega di aggiornare la licenza e ricaricare la pagina.", - "SSE.Controllers.Main.warnNoLicense": "Stai utilizzando una versione open source di ONLYOFFICE®. La versione presenta delle limitazioni per le connessioni simultanee al server dei documenti (20 connessioni alla volta).
    Per poterne avere di più, considera l'acquisto di una licenza commerciale.", + "SSE.Controllers.Main.warnNoLicense": "Questa versione di ONLYOFFICE® Editors presenta delle limitazioni per le connessioni simultanee al server dei documenti.
    Se necessiti di avere di più, considera l'acquisto di una licenza commerciale.", + "SSE.Controllers.Main.warnNoLicenseUsers": "Questa versione di ONLYOFFICE® Editors presenta delle limitazioni per le connessioni simultanee al server dei documenti.
    Se necessiti di avere di più, considera l'acquisto di una licenza commerciale.", "SSE.Controllers.Main.warnProcessRightsChange": "Ci stato negato il diritto alla modifica del file.", "SSE.Controllers.Print.strAllSheets": "Tutti i fogli", "SSE.Controllers.Print.textWarning": "Avviso", @@ -796,7 +840,7 @@ "SSE.Views.ChartSettings.textArea": "Area", "SSE.Views.ChartSettings.textBar": "Barra", "SSE.Views.ChartSettings.textBorderSizeErr": "Il valore inserito non è corretto.
    Inserisci un valore tra 0 pt e 1584 pt.", - "SSE.Views.ChartSettings.textChartType": "Cambia tipo grafico", + "SSE.Views.ChartSettings.textChartType": "Cambia tipo di grafico", "SSE.Views.ChartSettings.textColumn": "Colonna", "SSE.Views.ChartSettings.textColumnSpark": "Colonna", "SSE.Views.ChartSettings.textEditData": "Modifica Dati e Posizione", @@ -1001,6 +1045,10 @@ "SSE.Views.DocumentHolder.selectDataText": "Dati colonna", "SSE.Views.DocumentHolder.selectRowText": "Riga", "SSE.Views.DocumentHolder.selectTableText": "Tabella", + "SSE.Views.DocumentHolder.strDelete": "Rimuovi Firma", + "SSE.Views.DocumentHolder.strDetails": "Dettagli firma", + "SSE.Views.DocumentHolder.strSetup": "Impostazioni firma", + "SSE.Views.DocumentHolder.strSign": "Firma", "SSE.Views.DocumentHolder.textArrangeBack": "Porta in secondo piano", "SSE.Views.DocumentHolder.textArrangeBackward": "Porta indietro", "SSE.Views.DocumentHolder.textArrangeForward": "Porta avanti", @@ -1067,26 +1115,27 @@ "SSE.Views.FileMenu.btnCreateNewCaption": "Crea nuovo oggetto", "SSE.Views.FileMenu.btnDownloadCaption": "Scarica in...", "SSE.Views.FileMenu.btnHelpCaption": "Guida...", - "SSE.Views.FileMenu.btnInfoCaption": "Informazioni foglio...", + "SSE.Views.FileMenu.btnInfoCaption": "Informazioni foglio di calcolo...", "SSE.Views.FileMenu.btnPrintCaption": "Stampa", + "SSE.Views.FileMenu.btnProtectCaption": "Proteggi", "SSE.Views.FileMenu.btnRecentFilesCaption": "Apri recenti...", "SSE.Views.FileMenu.btnRenameCaption": "Rinomina...", - "SSE.Views.FileMenu.btnReturnCaption": "Torna al foglio", + "SSE.Views.FileMenu.btnReturnCaption": "Torna al foglio di calcolo", "SSE.Views.FileMenu.btnRightsCaption": "Access Rights...", "SSE.Views.FileMenu.btnSaveAsCaption": "Salva con", "SSE.Views.FileMenu.btnSaveCaption": "Salva", "SSE.Views.FileMenu.btnSettingsCaption": "Impostazioni avanzate...", - "SSE.Views.FileMenu.btnToEditCaption": "Modifica foglio", + "SSE.Views.FileMenu.btnToEditCaption": "Modifica foglio di calcolo", "SSE.Views.FileMenuPanels.CreateNew.fromBlankText": "Da vuoto", "SSE.Views.FileMenuPanels.CreateNew.fromTemplateText": "Da modello", - "SSE.Views.FileMenuPanels.CreateNew.newDescriptionText": "Crea un nuovo foglio elettronico vuoto che potrai formattare durante la modifica. O scegli uno dei modelli per creare un foglio elettronico di un certo tipo a quale sono già applicati certi stili.", - "SSE.Views.FileMenuPanels.CreateNew.newDocumentText": "Nuovo foglio elettronico", + "SSE.Views.FileMenuPanels.CreateNew.newDescriptionText": "Crea un nuovo foglio di calcolo vuoto che potrai formattare durante la modifica. O scegli uno dei modelli per creare un foglio di calcolo di un certo tipo a quale sono già applicati certi stili.", + "SSE.Views.FileMenuPanels.CreateNew.newDocumentText": "Nuovo foglio di calcolo", "SSE.Views.FileMenuPanels.DocumentInfo.txtAuthor": "Autore", "SSE.Views.FileMenuPanels.DocumentInfo.txtBtnAccessRights": "Cambia diritti di accesso", "SSE.Views.FileMenuPanels.DocumentInfo.txtDate": "Data di creazione", "SSE.Views.FileMenuPanels.DocumentInfo.txtPlacement": "Percorso", "SSE.Views.FileMenuPanels.DocumentInfo.txtRights": "Persone con diritti", - "SSE.Views.FileMenuPanels.DocumentInfo.txtTitle": "Titolo foglio elettronico", + "SSE.Views.FileMenuPanels.DocumentInfo.txtTitle": "Titolo foglio di calcolo", "SSE.Views.FileMenuPanels.DocumentRights.txtBtnAccessRights": "Cambia diritti di accesso", "SSE.Views.FileMenuPanels.DocumentRights.txtRights": "Persone con diritti", "SSE.Views.FileMenuPanels.MainSettingsGeneral.okButtonText": "Applica", @@ -1100,6 +1149,7 @@ "SSE.Views.FileMenuPanels.MainSettingsGeneral.strForcesave": "Salva sempre sul server (altrimenti salva sul server alla chiusura del documento)", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFuncLocale": "Formula Language", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFuncLocaleEx": "Example: SUM; MIN; MAX; COUNT", + "SSE.Views.FileMenuPanels.MainSettingsGeneral.strInputSogou": "Attiva l'input Sogou Pinyin", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strLiveComment": "Attivare visualizzazione dei commenti", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strRegSettings": "Regional Settings", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strRegSettingsEx": "Example: ", @@ -1120,6 +1170,7 @@ "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtDe": "Deutsch", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtEn": "English", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtInch": "Pollice", + "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtInput": "Input alternativo", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtLiveComment": "Visualizzazione dei Commenti", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtMac": "come OS X", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtNative": "Nativo", @@ -1127,6 +1178,17 @@ "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtPt": "Punto", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtRu": "Russian", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtWin": "come Windows", + "SSE.Views.FileMenuPanels.ProtectDoc.notcriticalErrorTitle": "Avviso", + "SSE.Views.FileMenuPanels.ProtectDoc.strEncrypt": "con Password", + "SSE.Views.FileMenuPanels.ProtectDoc.strProtect": "Proteggi foglio di calcolo", + "SSE.Views.FileMenuPanels.ProtectDoc.strSignature": "con Firma", + "SSE.Views.FileMenuPanels.ProtectDoc.txtEdit": "Modifica foglio di calcolo", + "SSE.Views.FileMenuPanels.ProtectDoc.txtEditWarning": "La modifica rimuoverà le firme dal foglio di calcolo.
    Sei sicuro di voler continuare?", + "SSE.Views.FileMenuPanels.ProtectDoc.txtEncrypted": "Questo foglio di calcolo è protetto con password", + "SSE.Views.FileMenuPanels.ProtectDoc.txtRequestedSignatures": "Questo foglio di calcolo necessita di essere firmato.", + "SSE.Views.FileMenuPanels.ProtectDoc.txtSigned": "Le firme valide sono state aggiunte al foglio di calcolo. Il foglio di calcolo è protetto dalla modifica.", + "SSE.Views.FileMenuPanels.ProtectDoc.txtSignedInvalid": "Alcune delle firme digitali presenti nel foglio di calcolo non sono valide o non possono essere verificate. Il foglio di calcolo è protetto dalla modifica.", + "SSE.Views.FileMenuPanels.ProtectDoc.txtView": "Mostra firme", "SSE.Views.FileMenuPanels.Settings.txtGeneral": "Generale", "SSE.Views.FileMenuPanels.Settings.txtPageSettings": "Impostazioni Pagina", "SSE.Views.FormatSettingsDialog.textCancel": "Annulla", @@ -1243,6 +1305,7 @@ "SSE.Views.LeftMenu.tipSearch": "Ricerca", "SSE.Views.LeftMenu.tipSupport": "Feedback & Support", "SSE.Views.LeftMenu.txtDeveloper": "MODALITÀ SVILUPPATORE", + "SSE.Views.LeftMenu.txtTrial": "Modalità di prova", "SSE.Views.MainSettingsPrint.okButtonText": "Salva", "SSE.Views.MainSettingsPrint.strBottom": "In basso", "SSE.Views.MainSettingsPrint.strLandscape": "Orizzontale", @@ -1374,6 +1437,7 @@ "SSE.Views.RightMenu.txtParagraphSettings": "Impostazioni testo", "SSE.Views.RightMenu.txtSettings": "Impostazioni generali", "SSE.Views.RightMenu.txtShapeSettings": "Impostazioni forma", + "SSE.Views.RightMenu.txtSignatureSettings": "Impostazioni della Firma", "SSE.Views.RightMenu.txtSparklineSettings": "Impostazioni Sparkline", "SSE.Views.RightMenu.txtTableSettings": "Impostazioni tabella", "SSE.Views.RightMenu.txtTextArtSettings": "Text Art Settings", @@ -1457,6 +1521,20 @@ "SSE.Views.ShapeSettingsAdvanced.textTop": "In alto", "SSE.Views.ShapeSettingsAdvanced.textWeightArrows": "Spessori e frecce", "SSE.Views.ShapeSettingsAdvanced.textWidth": "Larghezza", + "SSE.Views.SignatureSettings.notcriticalErrorTitle": "Avviso", + "SSE.Views.SignatureSettings.strDelete": "Rimuovi Firma", + "SSE.Views.SignatureSettings.strDetails": "Dettagli firma", + "SSE.Views.SignatureSettings.strInvalid": "Firme non valide", + "SSE.Views.SignatureSettings.strRequested": "Firme Richieste", + "SSE.Views.SignatureSettings.strSetup": "Impostazioni firma", + "SSE.Views.SignatureSettings.strSign": "Firma", + "SSE.Views.SignatureSettings.strSignature": "Firma", + "SSE.Views.SignatureSettings.strValid": "Firme valide", + "SSE.Views.SignatureSettings.txtContinueEditing": "Modifica comunque", + "SSE.Views.SignatureSettings.txtEditWarning": "La modifica rimuoverà le firme dal foglio di calcolo.
    Sei sicuro di voler continuare?", + "SSE.Views.SignatureSettings.txtRequestedSignatures": "Questo foglio di calcolo necessita di essere firmato.", + "SSE.Views.SignatureSettings.txtSigned": "Le firme valide sono state aggiunte al foglio di calcolo. Il foglio di calcolo è protetto dalla modifica.", + "SSE.Views.SignatureSettings.txtSignedInvalid": "Alcune delle firme digitali presenti nel foglio di calcolo non sono valide o non possono essere verificate. Il foglio di calcolo è protetto dalla modifica.", "SSE.Views.Statusbar.CopyDialog.itemCopyToEnd": "(Copia alla fine)", "SSE.Views.Statusbar.CopyDialog.itemMoveToEnd": "(Sposta alla fine)", "SSE.Views.Statusbar.CopyDialog.textCopyBefore": "Copia prima del foglio", @@ -1649,6 +1727,7 @@ "SSE.Views.Toolbar.textTabFile": "File", "SSE.Views.Toolbar.textTabHome": "Home", "SSE.Views.Toolbar.textTabInsert": "Inserisci", + "SSE.Views.Toolbar.textTabProtect": "Protezione", "SSE.Views.Toolbar.textTopBorders": "Bordi superiori", "SSE.Views.Toolbar.textUnderline": "Sottolineato", "SSE.Views.Toolbar.textWinLossSpark": "Vinci/Perdi", diff --git a/apps/spreadsheeteditor/main/locale/ru.json b/apps/spreadsheeteditor/main/locale/ru.json index c2db0c20c..ce19b1db4 100644 --- a/apps/spreadsheeteditor/main/locale/ru.json +++ b/apps/spreadsheeteditor/main/locale/ru.json @@ -102,16 +102,59 @@ "Common.Views.OpenDialog.txtTab": "Табуляция", "Common.Views.OpenDialog.txtTitle": "Выбрать параметры %1", "Common.Views.OpenDialog.txtTitleProtected": "Защищенный файл", + "Common.Views.PasswordDialog.cancelButtonText": "Отмена", + "Common.Views.PasswordDialog.okButtonText": "OK", + "Common.Views.PasswordDialog.txtDescription": "Для открытия этого документа требуется пароль", + "Common.Views.PasswordDialog.txtIncorrectPwd": "Пароль и его подтверждение не совпадают", + "Common.Views.PasswordDialog.txtPassword": "Пароль", + "Common.Views.PasswordDialog.txtRepeat": "Повторить пароль", + "Common.Views.PasswordDialog.txtTitle": "Установка пароля", "Common.Views.PluginDlg.textLoading": "Загрузка", "Common.Views.Plugins.groupCaption": "Плагины", "Common.Views.Plugins.strPlugins": "Плагины", "Common.Views.Plugins.textLoading": "Загрузка", "Common.Views.Plugins.textStart": "Запустить", "Common.Views.Plugins.textStop": "Остановить", + "Common.Views.Protection.hintAddPwd": "Зашифровать с помощью пароля", + "Common.Views.Protection.hintPwd": "Изменить или удалить пароль", + "Common.Views.Protection.hintSignature": "Добавить цифровую подпись или строку подписи", + "Common.Views.Protection.txtAddPwd": "Добавить пароль", + "Common.Views.Protection.txtChangePwd": "Изменить пароль", + "Common.Views.Protection.txtDeletePwd": "Удалить пароль", + "Common.Views.Protection.txtEncrypt": "Шифровать", + "Common.Views.Protection.txtInvisibleSignature": "Добавить цифровую подпись", + "Common.Views.Protection.txtSignature": "Подпись", + "Common.Views.Protection.txtSignatureLine": "Строка подписи", "Common.Views.RenameDialog.cancelButtonText": "Отмена", "Common.Views.RenameDialog.okButtonText": "Ok", "Common.Views.RenameDialog.textName": "Имя файла", "Common.Views.RenameDialog.txtInvalidName": "Имя файла не должно содержать следующих символов: ", + "Common.Views.SignDialog.cancelButtonText": "Отмена", + "Common.Views.SignDialog.okButtonText": "Ok", + "Common.Views.SignDialog.textBold": "Жирный", + "Common.Views.SignDialog.textCertificate": "Сертификат", + "Common.Views.SignDialog.textChange": "Изменить", + "Common.Views.SignDialog.textInputName": "Введите имя подписывающего", + "Common.Views.SignDialog.textItalic": "Курсив", + "Common.Views.SignDialog.textPurpose": "Цель подписания документа", + "Common.Views.SignDialog.textSelectImage": "Выбрать изображение", + "Common.Views.SignDialog.textSignature": "Как выглядит подпись:", + "Common.Views.SignDialog.textTitle": "Подписание документа", + "Common.Views.SignDialog.textUseImage": "или нажмите 'Выбрать изображение', чтобы использовать изображение в качестве подписи", + "Common.Views.SignDialog.textValid": "Действителен с %1 по %2", + "Common.Views.SignDialog.tipFontName": "Шрифт", + "Common.Views.SignDialog.tipFontSize": "Размер шрифта", + "Common.Views.SignSettingsDialog.cancelButtonText": "Отмена", + "Common.Views.SignSettingsDialog.okButtonText": "Ok", + "Common.Views.SignSettingsDialog.textAllowComment": "Разрешить подписывающему добавлять примечания в окне подписи", + "Common.Views.SignSettingsDialog.textInfo": "Сведения о подписывающем", + "Common.Views.SignSettingsDialog.textInfoEmail": "Адрес электронной почты", + "Common.Views.SignSettingsDialog.textInfoName": "Имя", + "Common.Views.SignSettingsDialog.textInfoTitle": "Должность подписывающего", + "Common.Views.SignSettingsDialog.textInstructions": "Инструкции для подписывающего", + "Common.Views.SignSettingsDialog.textShowDate": "Показывать дату подписи в строке подписи", + "Common.Views.SignSettingsDialog.textTitle": "Настройка подписи", + "Common.Views.SignSettingsDialog.txtEmpty": "Это поле необходимо заполнить", "SSE.Controllers.DocumentHolder.alignmentText": "Выравнивание", "SSE.Controllers.DocumentHolder.centerText": "По центру", "SSE.Controllers.DocumentHolder.deleteColumnText": "Удалить столбец", @@ -393,6 +436,7 @@ "SSE.Controllers.Main.warnBrowserZoom": "Текущее значение масштаба страницы в браузере поддерживается не полностью. Вернитесь к масштабу по умолчанию, нажав Ctrl+0", "SSE.Controllers.Main.warnLicenseExp": "Истек срок действия лицензии.
    Обновите лицензию, а затем обновите страницу.", "SSE.Controllers.Main.warnNoLicense": "Эта версия редакторов ONLYOFFICE имеет некоторые ограничения по количеству одновременных подключений к серверу документов.
    Если требуется больше, рассмотрите вопрос об обновлении текущей лицензии или покупке коммерческой лицензии.", + "SSE.Controllers.Main.warnNoLicenseUsers": "Эта версия редакторов ONLYOFFICE имеет некоторые ограничения по числу одновременно работающих пользователей.
    Если требуется больше, рассмотрите вопрос об обновлении текущей лицензии или покупке коммерческой лицензии.", "SSE.Controllers.Main.warnProcessRightsChange": "Вам было отказано в праве на редактирование этого файла.", "SSE.Controllers.Print.strAllSheets": "Все листы", "SSE.Controllers.Print.textWarning": "Предупреждение", @@ -1001,6 +1045,10 @@ "SSE.Views.DocumentHolder.selectDataText": "Данные столбцов", "SSE.Views.DocumentHolder.selectRowText": "Строку", "SSE.Views.DocumentHolder.selectTableText": "Таблицу", + "SSE.Views.DocumentHolder.strDelete": "Удалить подпись", + "SSE.Views.DocumentHolder.strDetails": "Состав подписи", + "SSE.Views.DocumentHolder.strSetup": "Настройка подписи", + "SSE.Views.DocumentHolder.strSign": "Подписать", "SSE.Views.DocumentHolder.textArrangeBack": "Перенести на задний план", "SSE.Views.DocumentHolder.textArrangeBackward": "Перенести назад", "SSE.Views.DocumentHolder.textArrangeForward": "Перенести вперед", @@ -1069,6 +1117,7 @@ "SSE.Views.FileMenu.btnHelpCaption": "Справка...", "SSE.Views.FileMenu.btnInfoCaption": "Сведения о таблице...", "SSE.Views.FileMenu.btnPrintCaption": "Печать", + "SSE.Views.FileMenu.btnProtectCaption": "Защитить", "SSE.Views.FileMenu.btnRecentFilesCaption": "Открыть последние...", "SSE.Views.FileMenu.btnRenameCaption": "Переименовать...", "SSE.Views.FileMenu.btnReturnCaption": "Вернуться к таблице", @@ -1129,6 +1178,17 @@ "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtPt": "Пункт", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtRu": "Русский", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtWin": "как Windows", + "SSE.Views.FileMenuPanels.ProtectDoc.notcriticalErrorTitle": "Внимание", + "SSE.Views.FileMenuPanels.ProtectDoc.strEncrypt": "C помощью пароля", + "SSE.Views.FileMenuPanels.ProtectDoc.strProtect": "Защитить электронную таблицу", + "SSE.Views.FileMenuPanels.ProtectDoc.strSignature": "С помощью подписи", + "SSE.Views.FileMenuPanels.ProtectDoc.txtEdit": "Редактировать таблицу", + "SSE.Views.FileMenuPanels.ProtectDoc.txtEditWarning": "При редактировании из электронной таблицы будут удалены подписи.
    Вы действительно хотите продолжить?", + "SSE.Views.FileMenuPanels.ProtectDoc.txtEncrypted": "Эта электронная таблица защищена паролем", + "SSE.Views.FileMenuPanels.ProtectDoc.txtRequestedSignatures": "Эту таблицу требуется подписать.", + "SSE.Views.FileMenuPanels.ProtectDoc.txtSigned": "В электронную таблицу добавлены действительные подписи. Таблица защищена от редактирования.", + "SSE.Views.FileMenuPanels.ProtectDoc.txtSignedInvalid": "Некоторые из цифровых подписей в электронной таблице недействительны или их нельзя проверить. Таблица защищена от редактирования.", + "SSE.Views.FileMenuPanels.ProtectDoc.txtView": "Просмотр подписей", "SSE.Views.FileMenuPanels.Settings.txtGeneral": "Общие", "SSE.Views.FileMenuPanels.Settings.txtPageSettings": "Параметры страницы", "SSE.Views.FormatSettingsDialog.textCancel": "Отмена", @@ -1377,6 +1437,7 @@ "SSE.Views.RightMenu.txtParagraphSettings": "Параметры текста", "SSE.Views.RightMenu.txtSettings": "Общие настройки", "SSE.Views.RightMenu.txtShapeSettings": "Параметры фигуры", + "SSE.Views.RightMenu.txtSignatureSettings": "Настройка подписи", "SSE.Views.RightMenu.txtSparklineSettings": "Параметры спарклайна", "SSE.Views.RightMenu.txtTableSettings": "Параметры таблицы", "SSE.Views.RightMenu.txtTextArtSettings": "Параметры объектов Text Art", @@ -1460,6 +1521,20 @@ "SSE.Views.ShapeSettingsAdvanced.textTop": "Сверху", "SSE.Views.ShapeSettingsAdvanced.textWeightArrows": "Линии и стрелки", "SSE.Views.ShapeSettingsAdvanced.textWidth": "Ширина", + "SSE.Views.SignatureSettings.notcriticalErrorTitle": "Внимание", + "SSE.Views.SignatureSettings.strDelete": "Удалить подпись", + "SSE.Views.SignatureSettings.strDetails": "Состав подписи", + "SSE.Views.SignatureSettings.strInvalid": "Недействительные подписи", + "SSE.Views.SignatureSettings.strRequested": "Запрошенные подписи", + "SSE.Views.SignatureSettings.strSetup": "Настройка подписи", + "SSE.Views.SignatureSettings.strSign": "Подписать", + "SSE.Views.SignatureSettings.strSignature": "Подпись", + "SSE.Views.SignatureSettings.strValid": "Действительные подписи", + "SSE.Views.SignatureSettings.txtContinueEditing": "Все равно редактировать", + "SSE.Views.SignatureSettings.txtEditWarning": "При редактировании из электронной таблицы будут удалены подписи.
    Вы действительно хотите продолжить?", + "SSE.Views.SignatureSettings.txtRequestedSignatures": "Эту таблицу требуется подписать.", + "SSE.Views.SignatureSettings.txtSigned": "В электронную таблицу добавлены действительные подписи. Таблица защищена от редактирования.", + "SSE.Views.SignatureSettings.txtSignedInvalid": "Некоторые из цифровых подписей в электронной таблице недействительны или их нельзя проверить. Таблица защищена от редактирования.", "SSE.Views.Statusbar.CopyDialog.itemCopyToEnd": "(Скопировать в конец)", "SSE.Views.Statusbar.CopyDialog.itemMoveToEnd": "(Переместить в конец)", "SSE.Views.Statusbar.CopyDialog.textCopyBefore": "Скопировать перед листом", @@ -1652,6 +1727,7 @@ "SSE.Views.Toolbar.textTabFile": "Файл", "SSE.Views.Toolbar.textTabHome": "Главная", "SSE.Views.Toolbar.textTabInsert": "Вставка", + "SSE.Views.Toolbar.textTabProtect": "Защита", "SSE.Views.Toolbar.textTopBorders": "Верхние границы", "SSE.Views.Toolbar.textUnderline": "Подчеркнутый", "SSE.Views.Toolbar.textWinLossSpark": "Выигрыш/проигрыш", From 07205f3c088be07ad858e73e698fed426c61d650 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 11 Dec 2017 14:50:26 +0300 Subject: [PATCH 59/86] Update translations. --- apps/documenteditor/mobile/locale/it.json | 5 +++-- apps/documenteditor/mobile/locale/ru.json | 5 +++-- apps/presentationeditor/mobile/locale/it.json | 5 +++-- apps/presentationeditor/mobile/locale/ru.json | 5 +++-- apps/spreadsheeteditor/mobile/locale/it.json | 5 +++-- apps/spreadsheeteditor/mobile/locale/ru.json | 5 +++-- 6 files changed, 18 insertions(+), 12 deletions(-) diff --git a/apps/documenteditor/mobile/locale/it.json b/apps/documenteditor/mobile/locale/it.json index 231fe5ad6..7cacc244a 100644 --- a/apps/documenteditor/mobile/locale/it.json +++ b/apps/documenteditor/mobile/locale/it.json @@ -107,7 +107,7 @@ "DE.Controllers.Main.textContactUs": "Contatta il reparto vendite.", "DE.Controllers.Main.textDone": "Fatto", "DE.Controllers.Main.textLoadingDocument": "Caricamento del documento", - "DE.Controllers.Main.textNoLicenseTitle": "Versione open source di ONLYOFFICE", + "DE.Controllers.Main.textNoLicenseTitle": "ONLYOFFICE® limite connessione", "DE.Controllers.Main.textOK": "OK", "DE.Controllers.Main.textPassword": "Password", "DE.Controllers.Main.textPreloader": "Caricamento in corso...", @@ -146,7 +146,8 @@ "DE.Controllers.Main.uploadImageTextText": "Caricamento dell'immagine in corso...", "DE.Controllers.Main.uploadImageTitleText": "Caricamento dell'immagine", "DE.Controllers.Main.warnLicenseExp": "La tua licenza è scaduta.
    Si prega di aggiornare la licenza e ricaricare la pagina.", - "DE.Controllers.Main.warnNoLicense": "Stai utilizzando una versione open source di ONLYOFFICE. La versione presenta delle limitazioni per le connessioni simultanee al server dei documenti (20 connessioni alla volta).
    Per poterne avere di più, considera l'acquisto di una licenza commerciale.", + "DE.Controllers.Main.warnNoLicense": "Questa versione di ONLYOFFICE® Editors presenta delle limitazioni per le connessioni simultanee al server dei documenti.
    Se necessiti di avere di più, considera l'acquisto di una licenza commerciale.", + "DE.Controllers.Main.warnNoLicenseUsers": "Questa versione di ONLYOFFICE Editors presenta alcune limitazioni per gli utenti simultanei.
    Se hai bisogno di più, ti preghiamo di considerare l'aggiornamento della tua licenza attuale o l'acquisto di una licenza commerciale.", "DE.Controllers.Main.warnProcessRightsChange": "Ti è stato negato il diritto di modificare il file.", "DE.Controllers.Search.textNoTextFound": "Testo non trovato", "DE.Controllers.Search.textReplaceAll": "Sostituisci tutto", diff --git a/apps/documenteditor/mobile/locale/ru.json b/apps/documenteditor/mobile/locale/ru.json index 8b0e93287..74ccea933 100644 --- a/apps/documenteditor/mobile/locale/ru.json +++ b/apps/documenteditor/mobile/locale/ru.json @@ -107,7 +107,7 @@ "DE.Controllers.Main.textContactUs": "Связаться с отделом продаж", "DE.Controllers.Main.textDone": "Готово", "DE.Controllers.Main.textLoadingDocument": "Загрузка документа", - "DE.Controllers.Main.textNoLicenseTitle": "Open source версия ONLYOFFICE", + "DE.Controllers.Main.textNoLicenseTitle": "Ограничение по числу подключений ONLYOFFICE", "DE.Controllers.Main.textOK": "OK", "DE.Controllers.Main.textPassword": "Пароль", "DE.Controllers.Main.textPreloader": "Загрузка...", @@ -146,7 +146,8 @@ "DE.Controllers.Main.uploadImageTextText": "Загрузка изображения...", "DE.Controllers.Main.uploadImageTitleText": "Загрузка изображения", "DE.Controllers.Main.warnLicenseExp": "Истек срок действия лицензии.
    Обновите лицензию, а затем обновите страницу.", - "DE.Controllers.Main.warnNoLicense": "Вы используете open source версию ONLYOFFICE. Эта версия имеет ограничения по количеству одновременных подключений к серверу документов (20 подключений одновременно).
    Если требуется больше, рассмотрите вопрос о покупке коммерческой лицензии.", + "DE.Controllers.Main.warnNoLicense": "Эта версия редакторов ONLYOFFICE имеет некоторые ограничения по количеству одновременных подключений к серверу документов.
    Если требуется больше, рассмотрите вопрос об обновлении текущей лицензии или покупке коммерческой лицензии.", + "DE.Controllers.Main.warnNoLicenseUsers": "Эта версия редакторов ONLYOFFICE имеет некоторые ограничения по числу одновременно работающих пользователей.
    Если требуется больше, рассмотрите вопрос об обновлении текущей лицензии или покупке коммерческой лицензии.", "DE.Controllers.Main.warnProcessRightsChange": "Вам было отказано в праве на редактирование этого файла.", "DE.Controllers.Search.textNoTextFound": "Текст не найден", "DE.Controllers.Search.textReplaceAll": "Заменить все", diff --git a/apps/presentationeditor/mobile/locale/it.json b/apps/presentationeditor/mobile/locale/it.json index 0d77e7924..4a4142ad5 100644 --- a/apps/presentationeditor/mobile/locale/it.json +++ b/apps/presentationeditor/mobile/locale/it.json @@ -122,7 +122,7 @@ "PE.Controllers.Main.textContactUs": "Contatta il reparto vendite.", "PE.Controllers.Main.textDone": "Fatto", "PE.Controllers.Main.textLoadingDocument": "Caricamento della presentazione", - "PE.Controllers.Main.textNoLicenseTitle": "Versione open source di ONLYOFFICE", + "PE.Controllers.Main.textNoLicenseTitle": "ONLYOFFICE® limite connessione", "PE.Controllers.Main.textOK": "OK", "PE.Controllers.Main.textPassword": "Password", "PE.Controllers.Main.textPreloader": "Caricamento in corso...", @@ -203,7 +203,8 @@ "PE.Controllers.Main.uploadImageTextText": "Caricamento dell'immagine in corso...", "PE.Controllers.Main.uploadImageTitleText": "Caricamento dell'immagine", "PE.Controllers.Main.warnLicenseExp": "La tua licenza è scaduta.
    Si prega di aggiornare la licenza e ricaricare la pagina.", - "PE.Controllers.Main.warnNoLicense": "Stai utilizzando una versione open source di ONLYOFFICE. La versione presenta delle limitazioni per le connessioni simultanee al server dei documenti (20 connessioni alla volta).
    Per poterne avere di più, considera l'acquisto di una licenza commerciale.", + "PE.Controllers.Main.warnNoLicense": "Questa versione di ONLYOFFICE® Editors presenta delle limitazioni per le connessioni simultanee al server dei documenti.
    Se necessiti di avere di più, considera l'acquisto di una licenza commerciale.", + "PE.Controllers.Main.warnNoLicenseUsers": "Questa versione di ONLYOFFICE® Editors presenta delle limitazioni per le connessioni simultanee al server dei documenti.
    Se necessiti di avere di più, considera l'acquisto di una licenza commerciale.", "PE.Controllers.Main.warnProcessRightsChange": "Ti è stato negato il diritto di modificare il file.", "PE.Controllers.Search.textNoTextFound": "Testo non trovato", "PE.Controllers.Settings.notcriticalErrorTitle": "Avviso", diff --git a/apps/presentationeditor/mobile/locale/ru.json b/apps/presentationeditor/mobile/locale/ru.json index 8ca133be6..ee32c3e65 100644 --- a/apps/presentationeditor/mobile/locale/ru.json +++ b/apps/presentationeditor/mobile/locale/ru.json @@ -122,7 +122,7 @@ "PE.Controllers.Main.textContactUs": "Связаться с отделом продаж", "PE.Controllers.Main.textDone": "Готово", "PE.Controllers.Main.textLoadingDocument": "Загрузка презентации", - "PE.Controllers.Main.textNoLicenseTitle": "Open source версия ONLYOFFICE", + "PE.Controllers.Main.textNoLicenseTitle": "Ограничение по числу подключений ONLYOFFICE", "PE.Controllers.Main.textOK": "OK", "PE.Controllers.Main.textPassword": "Пароль", "PE.Controllers.Main.textPreloader": "Загрузка...", @@ -203,7 +203,8 @@ "PE.Controllers.Main.uploadImageTextText": "Загрузка изображения...", "PE.Controllers.Main.uploadImageTitleText": "Загрузка изображения", "PE.Controllers.Main.warnLicenseExp": "Истек срок действия лицензии.
    Обновите лицензию, а затем обновите страницу.", - "PE.Controllers.Main.warnNoLicense": "Вы используете open source версию ONLYOFFICE. Эта версия имеет ограничения по количеству одновременных подключений к серверу документов (20 подключений одновременно).
    Если требуется больше, рассмотрите вопрос о покупке коммерческой лицензии.", + "PE.Controllers.Main.warnNoLicense": "Эта версия редакторов ONLYOFFICE имеет некоторые ограничения по количеству одновременных подключений к серверу документов.
    Если требуется больше, рассмотрите вопрос об обновлении текущей лицензии или покупке коммерческой лицензии.", + "PE.Controllers.Main.warnNoLicenseUsers": "Эта версия редакторов ONLYOFFICE имеет некоторые ограничения по числу одновременно работающих пользователей.
    Если требуется больше, рассмотрите вопрос об обновлении текущей лицензии или покупке коммерческой лицензии.", "PE.Controllers.Main.warnProcessRightsChange": "Вам было отказано в праве на редактирование этого файла.", "PE.Controllers.Search.textNoTextFound": "Текст не найден", "PE.Controllers.Settings.notcriticalErrorTitle": "Внимание", diff --git a/apps/spreadsheeteditor/mobile/locale/it.json b/apps/spreadsheeteditor/mobile/locale/it.json index 987a24c6a..302c312a8 100644 --- a/apps/spreadsheeteditor/mobile/locale/it.json +++ b/apps/spreadsheeteditor/mobile/locale/it.json @@ -194,7 +194,7 @@ "SSE.Controllers.Main.textContactUs": "Contatta il reparto vendite.", "SSE.Controllers.Main.textDone": "Fatto", "SSE.Controllers.Main.textLoadingDocument": "Caricamento del documento", - "SSE.Controllers.Main.textNoLicenseTitle": "Versione open source di ONLYOFFICE®", + "SSE.Controllers.Main.textNoLicenseTitle": "ONLYOFFICE® limite connessione", "SSE.Controllers.Main.textOK": "OK", "SSE.Controllers.Main.textPassword": "Password", "SSE.Controllers.Main.textPreloader": "Caricamento in corso...", @@ -255,7 +255,8 @@ "SSE.Controllers.Main.uploadImageTextText": "Caricamento dell'immagine in corso...", "SSE.Controllers.Main.uploadImageTitleText": "Caricamento dell'immagine", "SSE.Controllers.Main.warnLicenseExp": "La tua licenza è scaduta.
    Si prega di aggiornare la licenza e ricaricare la pagina.", - "SSE.Controllers.Main.warnNoLicense": "Stai utilizzando una versione open source di ONLYOFFICE®. La versione presenta delle limitazioni per le connessioni simultanee al server dei documenti (20 connessioni alla volta).
    Per poterne avere di più, considera l'acquisto di una licenza commerciale.", + "SSE.Controllers.Main.warnNoLicense": "Questa versione di ONLYOFFICE® Editors presenta delle limitazioni per le connessioni simultanee al server dei documenti.
    Se necessiti di avere di più, considera l'acquisto di una licenza commerciale.", + "SSE.Controllers.Main.warnNoLicenseUsers": "Questa versione di ONLYOFFICE Editors presenta alcune limitazioni per gli utenti simultanei.
    Se hai bisogno di più, ti preghiamo di considerare l'aggiornamento della tua licenza attuale o l'acquisto di una licenza commerciale.", "SSE.Controllers.Main.warnProcessRightsChange": "Ti è stato negato il diritto di modificare il file.", "SSE.Controllers.Search.textNoTextFound": "Testo non trovato", "SSE.Controllers.Search.textReplaceAll": "Sostituisci tutto", diff --git a/apps/spreadsheeteditor/mobile/locale/ru.json b/apps/spreadsheeteditor/mobile/locale/ru.json index 25c6afc86..ed68e9abf 100644 --- a/apps/spreadsheeteditor/mobile/locale/ru.json +++ b/apps/spreadsheeteditor/mobile/locale/ru.json @@ -194,7 +194,7 @@ "SSE.Controllers.Main.textContactUs": "Связаться с отделом продаж", "SSE.Controllers.Main.textDone": "Готово", "SSE.Controllers.Main.textLoadingDocument": "Загрузка документа", - "SSE.Controllers.Main.textNoLicenseTitle": "Open source версия ONLYOFFICE", + "SSE.Controllers.Main.textNoLicenseTitle": "Ограничение по числу подключений ONLYOFFICE", "SSE.Controllers.Main.textOK": "OK", "SSE.Controllers.Main.textPassword": "Пароль", "SSE.Controllers.Main.textPreloader": "Загрузка...", @@ -255,7 +255,8 @@ "SSE.Controllers.Main.uploadImageTextText": "Загрузка изображения...", "SSE.Controllers.Main.uploadImageTitleText": "Загрузка изображения", "SSE.Controllers.Main.warnLicenseExp": "Истек срок действия лицензии.
    Обновите лицензию, а затем обновите страницу.", - "SSE.Controllers.Main.warnNoLicense": "Вы используете open source версию ONLYOFFICE. Эта версия имеет ограничения по количеству одновременных подключений к серверу документов (20 подключений одновременно).
    Если требуется больше, рассмотрите вопрос о покупке коммерческой лицензии.", + "SSE.Controllers.Main.warnNoLicense": "Эта версия редакторов ONLYOFFICE имеет некоторые ограничения по количеству одновременных подключений к серверу документов.
    Если требуется больше, рассмотрите вопрос об обновлении текущей лицензии или покупке коммерческой лицензии.", + "SSE.Controllers.Main.warnNoLicenseUsers": "Эта версия редакторов ONLYOFFICE имеет некоторые ограничения по числу одновременно работающих пользователей.
    Если требуется больше, рассмотрите вопрос об обновлении текущей лицензии или покупке коммерческой лицензии.", "SSE.Controllers.Main.warnProcessRightsChange": "Вам было отказано в праве на редактирование этого файла.", "SSE.Controllers.Search.textNoTextFound": "Текст не найден", "SSE.Controllers.Search.textReplaceAll": "Заменить все", From b54fbbae00ff6b89d819124aeb17f099a4703e65 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 11 Dec 2017 15:12:51 +0300 Subject: [PATCH 60/86] Update translations. --- apps/documenteditor/main/locale/ru.json | 4 ++-- apps/presentationeditor/main/locale/ru.json | 4 ++-- apps/spreadsheeteditor/main/locale/ru.json | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/documenteditor/main/locale/ru.json b/apps/documenteditor/main/locale/ru.json index 1c02b10ba..f47689d8d 100644 --- a/apps/documenteditor/main/locale/ru.json +++ b/apps/documenteditor/main/locale/ru.json @@ -1198,8 +1198,8 @@ "DE.Views.ImageSettingsAdvanced.textSize": "Размер", "DE.Views.ImageSettingsAdvanced.textSquare": "Квадратный", "DE.Views.ImageSettingsAdvanced.textTitle": "Изображение - дополнительные параметры", - "DE.Views.ImageSettingsAdvanced.textTitleChart": "Диаграмма - Дополнительные параметры", - "DE.Views.ImageSettingsAdvanced.textTitleShape": "Фигура - Дополнительные параметры", + "DE.Views.ImageSettingsAdvanced.textTitleChart": "Диаграмма - дополнительные параметры", + "DE.Views.ImageSettingsAdvanced.textTitleShape": "Фигура - дополнительные параметры", "DE.Views.ImageSettingsAdvanced.textTop": "Сверху", "DE.Views.ImageSettingsAdvanced.textTopMargin": "Верхнего поля", "DE.Views.ImageSettingsAdvanced.textVertical": "По вертикали", diff --git a/apps/presentationeditor/main/locale/ru.json b/apps/presentationeditor/main/locale/ru.json index 7f7bf9ffe..cedd5730e 100644 --- a/apps/presentationeditor/main/locale/ru.json +++ b/apps/presentationeditor/main/locale/ru.json @@ -678,7 +678,7 @@ "PE.Views.ChartSettingsAdvanced.textAltDescription": "Описание", "PE.Views.ChartSettingsAdvanced.textAltTip": "Альтернативное текстовое представление информации о визуальном объекте, которое будет зачитываться для людей с нарушениями зрения или когнитивными нарушениями, чтобы помочь им лучше понять, какую информацию содержит изображение, автофигура, диаграмма или таблица.", "PE.Views.ChartSettingsAdvanced.textAltTitle": "Заголовок", - "PE.Views.ChartSettingsAdvanced.textTitle": "Диаграмма - Дополнительные параметры", + "PE.Views.ChartSettingsAdvanced.textTitle": "Диаграмма - дополнительные параметры", "PE.Views.DocumentHolder.aboveText": "Выше", "PE.Views.DocumentHolder.addCommentText": "Добавить комментарий", "PE.Views.DocumentHolder.advancedImageText": "Дополнительные параметры изображения", @@ -1091,7 +1091,7 @@ "PE.Views.ShapeSettingsAdvanced.textSize": "Размер", "PE.Views.ShapeSettingsAdvanced.textSpacing": "Интервал между колонками", "PE.Views.ShapeSettingsAdvanced.textSquare": "Квадратный", - "PE.Views.ShapeSettingsAdvanced.textTitle": "Фигура - Дополнительные параметры", + "PE.Views.ShapeSettingsAdvanced.textTitle": "Фигура - дополнительные параметры", "PE.Views.ShapeSettingsAdvanced.textTop": "Сверху", "PE.Views.ShapeSettingsAdvanced.textWeightArrows": "Линии и стрелки", "PE.Views.ShapeSettingsAdvanced.textWidth": "Ширина", diff --git a/apps/spreadsheeteditor/main/locale/ru.json b/apps/spreadsheeteditor/main/locale/ru.json index ce19b1db4..1927a03fd 100644 --- a/apps/spreadsheeteditor/main/locale/ru.json +++ b/apps/spreadsheeteditor/main/locale/ru.json @@ -984,8 +984,8 @@ "SSE.Views.ChartSettingsDlg.textTenThousands": "10 000", "SSE.Views.ChartSettingsDlg.textThousands": "Тысячи", "SSE.Views.ChartSettingsDlg.textTickOptions": "Параметры делений", - "SSE.Views.ChartSettingsDlg.textTitle": "Диаграмма - Дополнительные параметры", - "SSE.Views.ChartSettingsDlg.textTitleSparkline": "Спарклайн - Дополнительные параметры", + "SSE.Views.ChartSettingsDlg.textTitle": "Диаграмма - дополнительные параметры", + "SSE.Views.ChartSettingsDlg.textTitleSparkline": "Спарклайн - дополнительные параметры", "SSE.Views.ChartSettingsDlg.textTop": "Сверху", "SSE.Views.ChartSettingsDlg.textTrillions": "Триллионы", "SSE.Views.ChartSettingsDlg.textType": "Тип", @@ -1517,7 +1517,7 @@ "SSE.Views.ShapeSettingsAdvanced.textSize": "Размер", "SSE.Views.ShapeSettingsAdvanced.textSpacing": "Интервал между колонками", "SSE.Views.ShapeSettingsAdvanced.textSquare": "Квадратный", - "SSE.Views.ShapeSettingsAdvanced.textTitle": "Фигура - Дополнительные параметры", + "SSE.Views.ShapeSettingsAdvanced.textTitle": "Фигура - дополнительные параметры", "SSE.Views.ShapeSettingsAdvanced.textTop": "Сверху", "SSE.Views.ShapeSettingsAdvanced.textWeightArrows": "Линии и стрелки", "SSE.Views.ShapeSettingsAdvanced.textWidth": "Ширина", @@ -1668,7 +1668,7 @@ "SSE.Views.Toolbar.capInsertTable": "Таблица", "SSE.Views.Toolbar.capInsertText": "Надпись", "SSE.Views.Toolbar.mniImageFromFile": "Изображение из файла", - "SSE.Views.Toolbar.mniImageFromUrl": "Изображение по url", + "SSE.Views.Toolbar.mniImageFromUrl": "Изображение по URL", "SSE.Views.Toolbar.textAlignBottom": "По нижнему краю", "SSE.Views.Toolbar.textAlignCenter": "По центру", "SSE.Views.Toolbar.textAlignJust": "По ширине", From eb3efa3778a7ec9b8af59211f3b759d8ec9c5d9c Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 12 Dec 2017 14:14:27 +0300 Subject: [PATCH 61/86] [DE] Insert content controls. --- apps/common/main/resources/less/toolbar.less | 1 + .../main/app/controller/Toolbar.js | 54 ++++- .../main/app/template/Toolbar.template | 4 + .../main/app/view/ControlSettingsDialog.js | 207 ++++++++++++++++++ apps/documenteditor/main/app/view/Toolbar.js | 40 +++- apps/documenteditor/main/locale/en.json | 15 +- apps/documenteditor/sdk_dev_scripts.js | 1 + 7 files changed, 318 insertions(+), 4 deletions(-) create mode 100644 apps/documenteditor/main/app/view/ControlSettingsDialog.js diff --git a/apps/common/main/resources/less/toolbar.less b/apps/common/main/resources/less/toolbar.less index 20e3e8246..4ed3b9368 100644 --- a/apps/common/main/resources/less/toolbar.less +++ b/apps/common/main/resources/less/toolbar.less @@ -293,3 +293,4 @@ .button-normal-icon(btn-img-bkwd, 27, @toolbar-big-icon-size); .button-normal-icon(btn-img-frwd, 28, @toolbar-big-icon-size); .button-normal-icon(btn-img-wrap, 29, @toolbar-big-icon-size); +.button-normal-icon(btn-controls, 18, @toolbar-big-icon-size); diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index d6dd0b269..2e1d1041a 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -56,7 +56,8 @@ define([ 'documenteditor/main/app/view/PageSizeDialog', 'documenteditor/main/app/view/NoteSettingsDialog', 'documenteditor/main/app/controller/PageLayout', - 'documenteditor/main/app/view/CustomColumnsDialog' + 'documenteditor/main/app/view/CustomColumnsDialog', + 'documenteditor/main/app/view/ControlSettingsDialog' ], function () { 'use strict'; @@ -283,6 +284,7 @@ define([ toolbar.btnInsertText.on('click', _.bind(this.onBtnInsertTextClick, this)); toolbar.btnInsertShape.menu.on('hide:after', _.bind(this.onInsertShapeHide, this)); toolbar.btnDropCap.menu.on('item:click', _.bind(this.onDropCapSelect, this)); + toolbar.btnContentControls.menu.on('item:click', _.bind(this.onControlsSelect, this)); toolbar.mnuDropCapAdvanced.on('click', _.bind(this.onDropCapAdvancedClick, this)); toolbar.btnColumns.menu.on('item:click', _.bind(this.onColumnsSelect, this)); toolbar.btnPageOrient.menu.on('item:click', _.bind(this.onPageOrientSelect, this)); @@ -640,7 +642,8 @@ define([ in_chart = false, in_equation = false, btn_eq_state = false, - in_image = false; + in_image = false, + in_control = false; while (++i < selectedObjects.length) { type = selectedObjects[i].get_ObjectType(); @@ -720,6 +723,19 @@ define([ if ( !toolbar.btnDropCap.isDisabled() ) toolbar.mnuDropCapAdvanced.setDisabled(disable_dropcapadv); + if (!paragraph_locked && !header_locked) { + in_control = this.api.asc_IsContentControl(); + var control_props = in_control ? this.api.asc_GetContentControlProperties() : null, + lock_type = (in_control&&control_props) ? control_props.get_Lock() : AscCommonWord.sdtlock_Unlocked, + control_plain = (in_control&&control_props) ? (control_props.get_ContentControlType()==AscCommonWord.sdttype_InlineLevel) : false; + (lock_type===undefined) && (lock_type = AscCommonWord.sdtlock_Unlocked); + + toolbar.btnContentControls.menu.items[0].setDisabled(control_plain || lock_type==AscCommonWord.sdtlock_SdtContentLocked || lock_type==AscCommonWord.sdtlock_ContentLocked); + toolbar.btnContentControls.menu.items[1].setDisabled(control_plain || lock_type==AscCommonWord.sdtlock_SdtContentLocked || lock_type==AscCommonWord.sdtlock_ContentLocked); + toolbar.btnContentControls.menu.items[2].setDisabled(!in_control || lock_type==AscCommonWord.sdtlock_SdtContentLocked || lock_type==AscCommonWord.sdtlock_SdtLocked); + toolbar.btnContentControls.menu.items[4].setDisabled(!in_control); + } + need_disable = !can_add_table || header_locked || in_equation; toolbar.btnInsertTable.setDisabled(need_disable); @@ -1667,6 +1683,40 @@ define([ } }, + onControlsSelect: function(menu, item) { + if (item.value == 'settings' || item.value == 'remove') { + if (this.api.asc_IsContentControl()) { + var props = this.api.asc_GetContentControlProperties(); + if (props) { + var id = props.get_InternalId(); + if (item.value == 'settings') { + var me = this; + (new DE.Views.ControlSettingsDialog({ + props: props, + api: me.api, + handler: function(result, value) { + if (result == 'ok') { + me.api.asc_SetContentControlProperties(value, id); + } + + Common.NotificationCenter.trigger('edit:complete', me.toolbar); + } + })).show(); + + } else { + this.api.asc_RemoveContentControlWrapper(id); + Common.component.Analytics.trackEvent('ToolBar', 'Remove Content Control'); + } + } + } + } else { + this.api.asc_AddContentControl(item.value); + Common.component.Analytics.trackEvent('ToolBar', 'Add Content Control'); + } + + Common.NotificationCenter.trigger('edit:complete', this.toolbar); + }, + onColumnsSelect: function(menu, item) { if (_.isUndefined(item.value)) return; diff --git a/apps/documenteditor/main/app/template/Toolbar.template b/apps/documenteditor/main/app/template/Toolbar.template index fd2fd7e23..25d50862c 100644 --- a/apps/documenteditor/main/app/template/Toolbar.template +++ b/apps/documenteditor/main/app/template/Toolbar.template @@ -138,6 +138,10 @@
    +
    +
    + +
    '; + function _click_turnpreview(btn, e) { + if (this.appConfig.canReview) { + Common.NotificationCenter.trigger('reviewchanges:turn', btn.pressed ? 'on' : 'off'); + } + }; + function setEvents() { var me = this; @@ -466,12 +472,6 @@ define([ me.fireEvent('reviewchange:reject', [menu, item]); }); - function _click_turnpreview(btn, e) { - if (me.appConfig.canReview) { - Common.NotificationCenter.trigger('reviewchanges:turn', btn.pressed ? 'on' : 'off'); - } - }; - this.btnsTurnReview.forEach(function (button) { button.on('click', _click_turnpreview.bind(me)); Common.NotificationCenter.trigger('edit:complete', me); From 478d874c62d93ee6d2ec5f961e98c4199a37ff61 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 13 Dec 2017 17:55:32 +0300 Subject: [PATCH 67/86] Update help. --- .../main/resources/help/en/Contents.json | 9 ++++- .../en/HelpfulHints/CollaborativeEditing.htm | 4 +- .../resources/help/en/HelpfulHints/Review.htm | 4 +- .../help/en/ProgramInterface/FileTab.htm | 27 ++++++++++++++ .../help/en/ProgramInterface/HomeTab.htm | 33 +++++++++++++++++ .../help/en/ProgramInterface/InsertTab.htm | 25 +++++++++++++ .../help/en/ProgramInterface/LayoutTab.htm | 25 +++++++++++++ .../help/en/ProgramInterface/PluginsTab.htm | 28 ++++++++++++++ .../en/ProgramInterface/ProgramInterface.htm | 35 ++++++++++++++++++ .../help/en/ProgramInterface/ReviewTab.htm | 25 +++++++++++++ .../UsageInstructions/SetPageParameters.htm | 8 ++-- .../main/resources/help/en/editor.css | 1 + .../help/en/images/interface/editorwindow.png | Bin 0 -> 92208 bytes .../help/en/images/interface/filetab.png | Bin 0 -> 32655 bytes .../help/en/images/interface/hometab.png | Bin 0 -> 15799 bytes .../help/en/images/interface/inserttab.png | Bin 0 -> 15731 bytes .../help/en/images/interface/layouttab.png | Bin 0 -> 13948 bytes .../help/en/images/interface/leftpart.png | Bin 0 -> 1129 bytes .../help/en/images/interface/pluginstab.png | Bin 0 -> 14158 bytes .../help/en/images/interface/reviewtab.png | Bin 0 -> 14715 bytes .../help/en/images/interface/rightpart.png | Bin 0 -> 468 bytes .../help/en/images/versionhistory.png | Bin 3285 -> 3085 bytes .../main/resources/help/ru/Contents.json | 9 ++++- .../ru/HelpfulHints/CollaborativeEditing.htm | 4 +- .../resources/help/ru/HelpfulHints/Review.htm | 4 +- .../help/ru/ProgramInterface/FileTab.htm | 27 ++++++++++++++ .../help/ru/ProgramInterface/HomeTab.htm | 33 +++++++++++++++++ .../help/ru/ProgramInterface/InsertTab.htm | 25 +++++++++++++ .../help/ru/ProgramInterface/LayoutTab.htm | 25 +++++++++++++ .../help/ru/ProgramInterface/PluginsTab.htm | 28 ++++++++++++++ .../ru/ProgramInterface/ProgramInterface.htm | 35 ++++++++++++++++++ .../help/ru/ProgramInterface/ReviewTab.htm | 25 +++++++++++++ .../help/ru/UsageInstructions/AddBorders.htm | 2 +- .../ru/UsageInstructions/BackgroundColor.htm | 4 +- .../UsageInstructions/ChangeWrappingStyle.htm | 4 +- .../ru/UsageInstructions/DecorationStyles.htm | 2 +- .../ru/UsageInstructions/InsertAutoshapes.htm | 16 ++++---- .../ru/UsageInstructions/InsertCharts.htm | 22 +++++------ .../ru/UsageInstructions/InsertImages.htm | 10 ++--- .../ru/UsageInstructions/InsertTables.htm | 18 ++++----- .../help/ru/UsageInstructions/PageBreaks.htm | 4 +- .../ru/UsageInstructions/ParagraphIndents.htm | 2 +- .../UsageInstructions/SavePrintDownload.htm | 4 +- .../UsageInstructions/SetPageParameters.htm | 8 ++-- .../main/resources/help/ru/editor.css | 1 + .../help/ru/images/interface/editorwindow.png | Bin 0 -> 90205 bytes .../help/ru/images/interface/filetab.png | Bin 0 -> 35632 bytes .../help/ru/images/interface/hometab.png | Bin 0 -> 17084 bytes .../help/ru/images/interface/inserttab.png | Bin 0 -> 17139 bytes .../help/ru/images/interface/layouttab.png | Bin 0 -> 14379 bytes .../help/ru/images/interface/leftpart.png | Bin 0 -> 1129 bytes .../help/ru/images/interface/pluginstab.png | Bin 0 -> 14774 bytes .../help/ru/images/interface/reviewtab.png | Bin 0 -> 15966 bytes .../help/ru/images/interface/rightpart.png | Bin 0 -> 468 bytes .../main/resources/help/en/Contents.json | 5 +++ .../help/en/ProgramInterface/FileTab.htm | 26 +++++++++++++ .../help/en/ProgramInterface/HomeTab.htm | 27 ++++++++++++++ .../help/en/ProgramInterface/InsertTab.htm | 24 ++++++++++++ .../help/en/ProgramInterface/PluginsTab.htm | 26 +++++++++++++ .../en/ProgramInterface/ProgramInterface.htm | 35 ++++++++++++++++++ .../main/resources/help/en/editor.css | 1 + .../help/en/images/interface/editorwindow.png | Bin 0 -> 494318 bytes .../help/en/images/interface/filetab.png | Bin 0 -> 27096 bytes .../help/en/images/interface/hometab.png | Bin 0 -> 24085 bytes .../help/en/images/interface/inserttab.png | Bin 0 -> 13054 bytes .../help/en/images/interface/leftpart.png | Bin 0 -> 1915 bytes .../help/en/images/interface/pluginstab.png | Bin 0 -> 12579 bytes .../help/en/images/interface/rightpart.png | Bin 0 -> 448 bytes .../resources/help/en/images/split_cells.png | Bin 3359 -> 3816 bytes .../main/resources/help/ru/Contents.json | 5 +++ .../help/ru/ProgramInterface/FileTab.htm | 26 +++++++++++++ .../help/ru/ProgramInterface/HomeTab.htm | 27 ++++++++++++++ .../help/ru/ProgramInterface/InsertTab.htm | 24 ++++++++++++ .../help/ru/ProgramInterface/PluginsTab.htm | 26 +++++++++++++ .../ru/ProgramInterface/ProgramInterface.htm | 35 ++++++++++++++++++ .../ru/UsageInstructions/InsertCharts.htm | 2 +- .../help/ru/UsageInstructions/InsertText.htm | 2 +- .../UsageInstructions/SavePrintDownload.htm | 4 +- .../main/resources/help/ru/editor.css | 1 + .../help/ru/images/interface/editorwindow.png | Bin 0 -> 495072 bytes .../help/ru/images/interface/filetab.png | Bin 0 -> 29849 bytes .../help/ru/images/interface/hometab.png | Bin 0 -> 23328 bytes .../help/ru/images/interface/inserttab.png | Bin 0 -> 14359 bytes .../help/ru/images/interface/leftpart.png | Bin 0 -> 2174 bytes .../help/ru/images/interface/pluginstab.png | Bin 0 -> 13284 bytes .../help/ru/images/interface/rightpart.png | Bin 0 -> 448 bytes .../main/resources/help/en/Contents.json | 5 +++ .../en/HelpfulHints/CollaborativeEditing.htm | 4 +- .../help/en/ProgramInterface/FileTab.htm | 26 +++++++++++++ .../help/en/ProgramInterface/HomeTab.htm | 30 +++++++++++++++ .../help/en/ProgramInterface/InsertTab.htm | 23 ++++++++++++ .../help/en/ProgramInterface/PluginsTab.htm | 26 +++++++++++++ .../en/ProgramInterface/ProgramInterface.htm | 35 ++++++++++++++++++ .../help/en/UsageInstructions/SortData.htm | 2 +- .../main/resources/help/en/editor.css | 1 + .../help/en/images/interface/editorwindow.png | Bin 0 -> 104932 bytes .../help/en/images/interface/filetab.png | Bin 0 -> 29138 bytes .../help/en/images/interface/hometab.png | Bin 0 -> 15155 bytes .../help/en/images/interface/inserttab.png | Bin 0 -> 12612 bytes .../help/en/images/interface/leftpart.png | Bin 0 -> 1129 bytes .../help/en/images/interface/pluginstab.png | Bin 0 -> 12555 bytes .../help/en/images/interface/rightpart.png | Bin 0 -> 468 bytes .../main/resources/help/ru/Contents.json | 5 +++ .../ru/HelpfulHints/CollaborativeEditing.htm | 4 +- .../help/ru/ProgramInterface/FileTab.htm | 26 +++++++++++++ .../help/ru/ProgramInterface/HomeTab.htm | 30 +++++++++++++++ .../help/ru/ProgramInterface/InsertTab.htm | 23 ++++++++++++ .../help/ru/ProgramInterface/PluginsTab.htm | 26 +++++++++++++ .../ru/ProgramInterface/ProgramInterface.htm | 35 ++++++++++++++++++ .../ru/UsageInstructions/InsertAutoshapes.htm | 10 ++--- .../help/ru/UsageInstructions/InsertChart.htm | 20 +++++----- .../ru/UsageInstructions/InsertImages.htm | 2 +- .../UsageInstructions/InsertTextObjects.htm | 2 +- .../UsageInstructions/SavePrintDownload.htm | 4 +- .../help/ru/UsageInstructions/SortData.htm | 4 +- .../main/resources/help/ru/editor.css | 1 + .../help/ru/images/interface/editorwindow.png | Bin 0 -> 108628 bytes .../help/ru/images/interface/filetab.png | Bin 0 -> 31353 bytes .../help/ru/images/interface/hometab.png | Bin 0 -> 15446 bytes .../help/ru/images/interface/inserttab.png | Bin 0 -> 13491 bytes .../help/ru/images/interface/leftpart.png | Bin 0 -> 1129 bytes .../help/ru/images/interface/pluginstab.png | Bin 0 -> 12699 bytes .../help/ru/images/interface/rightpart.png | Bin 0 -> 468 bytes 123 files changed, 1084 insertions(+), 92 deletions(-) create mode 100644 apps/documenteditor/main/resources/help/en/ProgramInterface/FileTab.htm create mode 100644 apps/documenteditor/main/resources/help/en/ProgramInterface/HomeTab.htm create mode 100644 apps/documenteditor/main/resources/help/en/ProgramInterface/InsertTab.htm create mode 100644 apps/documenteditor/main/resources/help/en/ProgramInterface/LayoutTab.htm create mode 100644 apps/documenteditor/main/resources/help/en/ProgramInterface/PluginsTab.htm create mode 100644 apps/documenteditor/main/resources/help/en/ProgramInterface/ProgramInterface.htm create mode 100644 apps/documenteditor/main/resources/help/en/ProgramInterface/ReviewTab.htm create mode 100644 apps/documenteditor/main/resources/help/en/images/interface/editorwindow.png create mode 100644 apps/documenteditor/main/resources/help/en/images/interface/filetab.png create mode 100644 apps/documenteditor/main/resources/help/en/images/interface/hometab.png create mode 100644 apps/documenteditor/main/resources/help/en/images/interface/inserttab.png create mode 100644 apps/documenteditor/main/resources/help/en/images/interface/layouttab.png create mode 100644 apps/documenteditor/main/resources/help/en/images/interface/leftpart.png create mode 100644 apps/documenteditor/main/resources/help/en/images/interface/pluginstab.png create mode 100644 apps/documenteditor/main/resources/help/en/images/interface/reviewtab.png create mode 100644 apps/documenteditor/main/resources/help/en/images/interface/rightpart.png create mode 100644 apps/documenteditor/main/resources/help/ru/ProgramInterface/FileTab.htm create mode 100644 apps/documenteditor/main/resources/help/ru/ProgramInterface/HomeTab.htm create mode 100644 apps/documenteditor/main/resources/help/ru/ProgramInterface/InsertTab.htm create mode 100644 apps/documenteditor/main/resources/help/ru/ProgramInterface/LayoutTab.htm create mode 100644 apps/documenteditor/main/resources/help/ru/ProgramInterface/PluginsTab.htm create mode 100644 apps/documenteditor/main/resources/help/ru/ProgramInterface/ProgramInterface.htm create mode 100644 apps/documenteditor/main/resources/help/ru/ProgramInterface/ReviewTab.htm create mode 100644 apps/documenteditor/main/resources/help/ru/images/interface/editorwindow.png create mode 100644 apps/documenteditor/main/resources/help/ru/images/interface/filetab.png create mode 100644 apps/documenteditor/main/resources/help/ru/images/interface/hometab.png create mode 100644 apps/documenteditor/main/resources/help/ru/images/interface/inserttab.png create mode 100644 apps/documenteditor/main/resources/help/ru/images/interface/layouttab.png create mode 100644 apps/documenteditor/main/resources/help/ru/images/interface/leftpart.png create mode 100644 apps/documenteditor/main/resources/help/ru/images/interface/pluginstab.png create mode 100644 apps/documenteditor/main/resources/help/ru/images/interface/reviewtab.png create mode 100644 apps/documenteditor/main/resources/help/ru/images/interface/rightpart.png create mode 100644 apps/presentationeditor/main/resources/help/en/ProgramInterface/FileTab.htm create mode 100644 apps/presentationeditor/main/resources/help/en/ProgramInterface/HomeTab.htm create mode 100644 apps/presentationeditor/main/resources/help/en/ProgramInterface/InsertTab.htm create mode 100644 apps/presentationeditor/main/resources/help/en/ProgramInterface/PluginsTab.htm create mode 100644 apps/presentationeditor/main/resources/help/en/ProgramInterface/ProgramInterface.htm create mode 100644 apps/presentationeditor/main/resources/help/en/images/interface/editorwindow.png create mode 100644 apps/presentationeditor/main/resources/help/en/images/interface/filetab.png create mode 100644 apps/presentationeditor/main/resources/help/en/images/interface/hometab.png create mode 100644 apps/presentationeditor/main/resources/help/en/images/interface/inserttab.png create mode 100644 apps/presentationeditor/main/resources/help/en/images/interface/leftpart.png create mode 100644 apps/presentationeditor/main/resources/help/en/images/interface/pluginstab.png create mode 100644 apps/presentationeditor/main/resources/help/en/images/interface/rightpart.png create mode 100644 apps/presentationeditor/main/resources/help/ru/ProgramInterface/FileTab.htm create mode 100644 apps/presentationeditor/main/resources/help/ru/ProgramInterface/HomeTab.htm create mode 100644 apps/presentationeditor/main/resources/help/ru/ProgramInterface/InsertTab.htm create mode 100644 apps/presentationeditor/main/resources/help/ru/ProgramInterface/PluginsTab.htm create mode 100644 apps/presentationeditor/main/resources/help/ru/ProgramInterface/ProgramInterface.htm create mode 100644 apps/presentationeditor/main/resources/help/ru/images/interface/editorwindow.png create mode 100644 apps/presentationeditor/main/resources/help/ru/images/interface/filetab.png create mode 100644 apps/presentationeditor/main/resources/help/ru/images/interface/hometab.png create mode 100644 apps/presentationeditor/main/resources/help/ru/images/interface/inserttab.png create mode 100644 apps/presentationeditor/main/resources/help/ru/images/interface/leftpart.png create mode 100644 apps/presentationeditor/main/resources/help/ru/images/interface/pluginstab.png create mode 100644 apps/presentationeditor/main/resources/help/ru/images/interface/rightpart.png create mode 100644 apps/spreadsheeteditor/main/resources/help/en/ProgramInterface/FileTab.htm create mode 100644 apps/spreadsheeteditor/main/resources/help/en/ProgramInterface/HomeTab.htm create mode 100644 apps/spreadsheeteditor/main/resources/help/en/ProgramInterface/InsertTab.htm create mode 100644 apps/spreadsheeteditor/main/resources/help/en/ProgramInterface/PluginsTab.htm create mode 100644 apps/spreadsheeteditor/main/resources/help/en/ProgramInterface/ProgramInterface.htm create mode 100644 apps/spreadsheeteditor/main/resources/help/en/images/interface/editorwindow.png create mode 100644 apps/spreadsheeteditor/main/resources/help/en/images/interface/filetab.png create mode 100644 apps/spreadsheeteditor/main/resources/help/en/images/interface/hometab.png create mode 100644 apps/spreadsheeteditor/main/resources/help/en/images/interface/inserttab.png create mode 100644 apps/spreadsheeteditor/main/resources/help/en/images/interface/leftpart.png create mode 100644 apps/spreadsheeteditor/main/resources/help/en/images/interface/pluginstab.png create mode 100644 apps/spreadsheeteditor/main/resources/help/en/images/interface/rightpart.png create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/ProgramInterface/FileTab.htm create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/ProgramInterface/HomeTab.htm create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/ProgramInterface/InsertTab.htm create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/ProgramInterface/PluginsTab.htm create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/ProgramInterface/ProgramInterface.htm create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/images/interface/editorwindow.png create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/images/interface/filetab.png create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/images/interface/hometab.png create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/images/interface/inserttab.png create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/images/interface/leftpart.png create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/images/interface/pluginstab.png create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/images/interface/rightpart.png diff --git a/apps/documenteditor/main/resources/help/en/Contents.json b/apps/documenteditor/main/resources/help/en/Contents.json index 78f5aa4f5..1c79846d2 100644 --- a/apps/documenteditor/main/resources/help/en/Contents.json +++ b/apps/documenteditor/main/resources/help/en/Contents.json @@ -1,5 +1,12 @@ [ - {"src": "UsageInstructions/SetPageParameters.htm", "name": "Set page parameters", "headername": "Usage Instructions"}, + {"src": "ProgramInterface/ProgramInterface.htm", "name": "Introducing Document Editor user interface", "headername": "Program Interface"}, + {"src": "ProgramInterface/FileTab.htm", "name": "File tab"}, + {"src": "ProgramInterface/HomeTab.htm", "name": "Home Tab"}, + {"src": "ProgramInterface/InsertTab.htm", "name": "Insert tab"}, + {"src": "ProgramInterface/LayoutTab.htm", "name": "Layout tab"}, + {"src": "ProgramInterface/ReviewTab.htm", "name": "Review tab"}, + {"src": "ProgramInterface/PluginsTab.htm", "name": "Plugins tab"}, + {"src": "UsageInstructions/SetPageParameters.htm", "name": "Set page parameters", "headername": "Usage Instructions"}, {"src": "UsageInstructions/ChangeColorScheme.htm", "name": "Change color scheme"}, {"src": "UsageInstructions/CopyPasteUndoRedo.htm", "name": "Copy/paste text passages, undo/redo your actions"}, {"src": "UsageInstructions/NonprintingCharacters.htm", "name": "Show/hide nonprinting characters"}, diff --git a/apps/documenteditor/main/resources/help/en/HelpfulHints/CollaborativeEditing.htm b/apps/documenteditor/main/resources/help/en/HelpfulHints/CollaborativeEditing.htm index b3ca6fbc1..012043492 100644 --- a/apps/documenteditor/main/resources/help/en/HelpfulHints/CollaborativeEditing.htm +++ b/apps/documenteditor/main/resources/help/en/HelpfulHints/CollaborativeEditing.htm @@ -26,7 +26,7 @@

    When no users are viewing or editing the file, the icon in the editor header will look like Manage document access rights icon allowing you to manage the users who have access to the file right from the document: invite new users giving them permissions to edit, read or review the document, or deny some users access rights to the file. Click this icon to manage the access to the file; this can be done both when there are no other users who view or co-edit the document at the moment and when there are other users and the icon looks like Number of users icon.

    As soon as one of the users saves his/her changes by clicking the Save icon icon, the others will see a note within the status bar stating that they have updates. To save the changes you made, so that other users can view them, and get the updates saved by your co-editors, click the Save icon icon in the left upper corner of the top toolbar. The updates will be highlighted for you to check what exactly has been changed.

    You can specify what changes you want to be highlighted during co-editing if you click the File tab at the top toolbar, select the Advanced Settings... option and choose between none, all and last realtime collaboration changes. Selecting View all changes, all the changes made during the current session will be highlighted. Selecting View last changes, only the changes made since you last time clicked the Save icon icon will be highlighted. Selecting View None changes, changes made during the current session will not be highlighted.

    -

    Chat

    +

    Chat

    You can use this tool to coordinate the co-editing process on-the-fly, for example, to arrange with your collaborators about who is doing what, which paragraph you are going to edit now etc.

    The chat messages are stored during one session only. To discuss the document content it is better to use comments which are stored until you decide to delete them.

    To access the chat and leave a message for other users,

    @@ -38,7 +38,7 @@

    All the messages left by users will be displayed on the panel on the left. If there are new messages you haven't read yet, the chat icon will look like this - Chat icon.

    To close the panel with chat messages, click the Chat icon icon once again.

    -

    Comments

    +

    Comments

    To leave a comment,

    1. select a text passage where you think there is an error or problem,
    2. diff --git a/apps/documenteditor/main/resources/help/en/HelpfulHints/Review.htm b/apps/documenteditor/main/resources/help/en/HelpfulHints/Review.htm index 6bbe17489..9b1f62467 100644 --- a/apps/documenteditor/main/resources/help/en/HelpfulHints/Review.htm +++ b/apps/documenteditor/main/resources/help/en/HelpfulHints/Review.htm @@ -19,14 +19,14 @@
    3. switch to the Review tab at the top toolbar and press the Track Changes button Track Changes button.
    4. Note: it is not necessary for the reviewer to enable the Track Changes option. It is enabled by default and cannot be disabled when the document is shared with review only access rights.

      -

      Choose the changes display mode

      +

      Choose the changes display mode

      Click the Display Mode button Display Mode button at the top toolbar and select one of the available modes from the list:

      • All changes (Editing) - this option is selected by default. It allows both to view suggested changes and edit the document.
      • All changes accepted (Preview) - this mode is used to display all the changes as if they were accepted. This option does not actually accept all changes, it only allows you to see how the document will look like after you accept all the changes. In this mode, you cannot edit the document.
      • All changes rejected (Preview) - this mode is used to display all the changes as if they were rejected. This option does not actually reject all changes, it only allows you to view the document without changes. In this mode, you cannot edit the document.
      -

      Accept or reject changes

      +

      Accept or reject changes

      Use the To Previous Change button Previous and the To Next Change button Next buttons at the top toolbar to navigate among the changes.

      To accept the currently selected change you can:

    -

    На вкладке Обтекание текстом окна Таблица - Дополнительные параметры можно также задать следующие дополнительные параметры:

    +

    На вкладке Обтекание текстом окна Таблица - дополнительные параметры можно также задать следующие дополнительные параметры:

    • Для встроенных таблиц можно задать тип Выравнивания таблицы (по левому краю, по центру или по правому краю) и Отступ слева.
    • Для плавающих таблиц можно задать Расстояние до текста и положение на вкладке Положение таблицы.
    • diff --git a/apps/documenteditor/main/resources/help/ru/UsageInstructions/DecorationStyles.htm b/apps/documenteditor/main/resources/help/ru/UsageInstructions/DecorationStyles.htm index 15570f0e6..43d97c37f 100644 --- a/apps/documenteditor/main/resources/help/ru/UsageInstructions/DecorationStyles.htm +++ b/apps/documenteditor/main/resources/help/ru/UsageInstructions/DecorationStyles.htm @@ -44,7 +44,7 @@ Используется, чтобы сделать текст мельче и поместить его в нижней части строки, например, как в химических формулах. -

      Для получения доступа к дополнительным настройкам шрифта щелкните правой кнопкой мыши и выберите в меню пункт Дополнительные параметры абзаца или используйте ссылку Дополнительные параметры на правой боковой панели. Откроется окно Абзац - Дополнительные параметры, в котором необходимо переключиться на вкладку Шрифт.

      +

      Для получения доступа к дополнительным настройкам шрифта щелкните правой кнопкой мыши и выберите в меню пункт Дополнительные параметры абзаца или используйте ссылку Дополнительные параметры на правой боковой панели. Откроется окно Абзац - дополнительные параметры, в котором необходимо переключиться на вкладку Шрифт.

      Здесь можно применить следующие стили оформления и настройки шрифта:

      • Зачёркивание - используется для зачеркивания текста чертой, проведенной по буквам.
      • diff --git a/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertAutoshapes.htm b/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertAutoshapes.htm index a18440082..682df7b21 100644 --- a/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertAutoshapes.htm +++ b/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertAutoshapes.htm @@ -38,7 +38,7 @@
      • Порядок - используется, чтобы вынести выбранную автофигуру на передний план, переместить на задний план, перенести вперед или назад, а также сгруппировать или разгруппировать автофигуры для выполнения операций над несколькими из них сразу. Подробнее о расположении объектов в определенном порядке рассказывается на этой странице.
      • Выравнивание - используется, чтобы выровнять фигуру по левому краю, по центру, по правому краю, по верхнему краю, по середине, по нижнему краю. Подробнее о выравнивании объектов рассказывается на этой странице.
      • Стиль обтекания - используется, чтобы выбрать один из доступных стилей обтекания текстом - в тексте, вокруг рамки, по контуру, сквозное, сверху и снизу, перед текстом, за текстом - или для изменения границы обтекания. Опция Изменить границу обтекания доступна только в том случае, если выбран стиль обтекания, отличный от стиля "В тексте". Чтобы произвольно изменить границу, перетаскивайте точки границы обтекания. Чтобы создать новую точку границы обтекания, щелкните в любом месте на красной линии и перетащите ее в нужную позицию. Изменение границы обтекания
      • -
      • Дополнительные параметры фигуры - используется для вызова окна 'Фигура - Дополнительные параметры'.
      • +
      • Дополнительные параметры фигуры - используется для вызова окна 'Фигура - дополнительные параметры'.

      Некоторые параметры автофигуры можно изменить с помощью вкладки Параметры фигуры на правой боковой панели. Чтобы ее активировать, щелкните по фигуре и выберите значок Параметры фигуры Значок Параметры фигуры справа. Здесь можно изменить следующие свойства:

      @@ -99,8 +99,8 @@
    • Изменить автофигуру - используйте этот раздел, чтобы заменить текущую автофигуру на другую, выбрав ее из выпадающего списка.

    -

    Чтобы изменить дополнительные параметры автофигуры, щелкните по ней правой кнопкой мыши и выберите из контекстного меню пункт Дополнительные параметры. Или нажмите ссылку Дополнительные параметры на правой боковой панели. Откроется окно 'Фигура - Дополнительные параметры':

    -

    Фигура - Дополнительные параметры

    +

    Чтобы изменить дополнительные параметры автофигуры, щелкните по ней правой кнопкой мыши и выберите из контекстного меню пункт Дополнительные параметры. Или нажмите ссылку Дополнительные параметры на правой боковой панели. Откроется окно 'Фигура - дополнительные параметры':

    +

    Фигура - дополнительные параметры

    Вкладка Размер содержит следующие параметры:

    • @@ -119,7 +119,7 @@
    • Если установлен флажок Сохранять пропорции, ширина и высота будут изменены пропорционально, сохраняя исходное соотношение сторон фигуры.
    -

    Фигура - Дополнительные параметры

    +

    Фигура - дополнительные параметры

    Вкладка Обтекание текстом содержит следующие параметры:

    • Стиль обтекания - используйте эту опцию, чтобы изменить способ размещения автофигуры относительно текста: или она будет являться частью текста (если выбран стиль обтекания "В тексте") или текст будет обтекать ее со всех сторон (если выбран один из остальных стилей). @@ -137,7 +137,7 @@

    При выборе стиля обтекания вокруг рамки, по контуру, сквозное или сверху и снизу можно задать дополнительные параметры - расстояние до текста со всех сторон (сверху, снизу, слева, справа).

    -

    Фигура - Дополнительные параметры

    +

    Фигура - дополнительные параметры

    Вкладка Положение доступна только в том случае, если выбран стиль обтекания, отличный от стиля "В тексте". Вкладка содержит следующие параметры, которые различаются в зависимости от выбранного стиля обтекания:

    • @@ -159,7 +159,7 @@
    • Опция Перемещать с текстом определяет, будет ли автофигура перемещаться вместе с текстом, к которому она привязана.
    • Опция Разрешить перекрытие определяет, будут ли перекрываться две автофигуры, если перетащить их близко друг к другу на странице.
    -

    Фигура - Дополнительные параметры

    +

    Фигура - дополнительные параметры

    Вкладка Параметры фигуры содержит следующие параметры:

    • Стиль линии - эта группа опций позволяет задать такие параметры: @@ -183,10 +183,10 @@
    • Стрелки - эта группа опций доступна только в том случае, если выбрана фигура из группы автофигур Линии. Она позволяет задать Начальный и Конечный стиль и Размер стрелки, выбрав соответствующие опции из выпадающих списков.
    -

    Фигура - Дополнительные параметры

    +

    Фигура - дополнительные параметры

    На вкладке Поля вокруг текста можно изменить внутренние поля автофигуры Сверху, Снизу, Слева и Справа (то есть расстояние между текстом внутри фигуры и границами автофигуры).

    Примечание: эта вкладка доступна, только если в автофигуру добавлен текст, в противном случае вкладка неактивна.

    -

    Фигура - Дополнительные параметры

    +

    Фигура - дополнительные параметры

    Вкладка Альтернативный текст позволяет задать Заголовок и Описание, которые будут зачитываться для людей с нарушениями зрения или когнитивными нарушениями, чтобы помочь им лучше понять, какую информацию содержит фигура.

    diff --git a/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertCharts.htm b/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertCharts.htm index 8fa87674e..fd1024974 100644 --- a/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertCharts.htm +++ b/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertCharts.htm @@ -29,8 +29,8 @@

    Окно Редактор диаграмм

    diff --git a/apps/documenteditor/main/app/view/ControlSettingsDialog.js b/apps/documenteditor/main/app/view/ControlSettingsDialog.js new file mode 100644 index 000000000..033713966 --- /dev/null +++ b/apps/documenteditor/main/app/view/ControlSettingsDialog.js @@ -0,0 +1,207 @@ +/* + * + * (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 + * + */ + +/** + * ControlSettingsDialog.js.js + * + * Created by Julia Radzhabova on 12.12.2017 + * Copyright (c) 2017 Ascensio System SIA. All rights reserved. + * + */ + +define([ + 'common/main/lib/util/utils', + 'common/main/lib/component/CheckBox', + 'common/main/lib/component/InputField', + 'common/main/lib/view/AdvancedSettingsWindow' +], function () { 'use strict'; + + DE.Views.ControlSettingsDialog = Common.Views.AdvancedSettingsWindow.extend(_.extend({ + options: { + contentWidth: 300, + height: 250 + }, + + 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 : $('#control-settings-txt-name'), + allowBlank : true, + validateOnChange: false, + validateOnBlur: false, + style : 'width: 100%;', + value : '' + }); + + this.txtTag = new Common.UI.InputField({ + el : $('#control-settings-txt-tag'), + allowBlank : true, + validateOnChange: false, + validateOnBlur: false, + style : 'width: 100%;', + value : '' + }); + + this.chLockDelete = new Common.UI.CheckBox({ + el: $('#control-settings-chb-lock-delete'), + labelText: this.txtLockDelete + }); + + this.chLockEdit = new Common.UI.CheckBox({ + el: $('#control-settings-chb-lock-edit'), + labelText: this.txtLockEdit + }); + + this.afterRender(); + }, + + afterRender: function() { + this._setDefaults(this.props); + }, + + show: function() { + Common.Views.AdvancedSettingsWindow.prototype.show.apply(this, arguments); + }, + + _setDefaults: function (props) { + if (props) { + var val = props.get_Id(); + this.txtName.setValue(val ? val : ''); + + val = props.get_Tag(); + this.txtTag.setValue(val ? val : ''); + + val = props.get_Lock(); + (val===undefined) && (val = AscCommonWord.sdtlock_Unlocked); + this.chLockDelete.setValue(val==AscCommonWord.sdtlock_SdtContentLocked || val==AscCommonWord.sdtlock_SdtLocked); + this.chLockEdit.setValue(val==AscCommonWord.sdtlock_SdtContentLocked || val==AscCommonWord.sdtlock_ContentLocked); + } + }, + + getSettings: function () { + var props = new AscCommonWord.CContentControlPr(); + + + props.put_Id(this.txtName.getValue()); + props.put_Tag(this.txtTag.getValue()); + + + var lock = AscCommonWord.sdtlock_Unlocked; + + if (this.chLockDelete.getValue()=='checked' && this.chLockEdit.getValue()=='checked') + lock = AscCommonWord.sdtlock_SdtContentLocked; + else if (this.chLockDelete.getValue()=='checked') + lock = AscCommonWord.sdtlock_SdtLocked; + else if (this.chLockEdit.getValue()=='checked') + lock = AscCommonWord.sdtlock_ContentLocked; + props.put_Lock(lock); + + return props; + }, + + onDlgBtnClick: function(event) { + var me = this; + var state = (typeof(event) == 'object') ? event.currentTarget.attributes['result'].value : event; + if (state == 'ok') { + this.handler && this.handler.call(this, state, this.getSettings()); + } + + this.close(); + }, + + onPrimary: function() { + return true; + }, + + textTitle: 'Content Control Settings', + textName: 'Title', + textTag: 'Tag', + txtLockDelete: 'Content control cannot be deleted', + txtLockEdit: 'Contents cannot be edited', + cancelButtonText: 'Cancel', + okButtonText: 'Ok' + + }, DE.Views.ControlSettingsDialog || {})) +}); \ No newline at end of file diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index 0dcf9ca21..e66fe35af 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -608,6 +608,36 @@ define([ }); this.paragraphControls.push(this.btnDropCap); + this.btnContentControls = new Common.UI.Button({ + id: 'tlbtn-controls', + cls: 'btn-toolbar x-huge icon-top', + iconCls: 'btn-controls', + caption: me.capBtnInsControls, + menu: new Common.UI.Menu({ + cls: 'ppm-toolbar', + items: [ + { + caption: this.textRichControl, + value: AscCommonWord.sdttype_BlockLevel + }, + { + caption: this.textPlainControl, + value: AscCommonWord.sdttype_InlineLevel + }, + { + caption: this.textRemoveControl, + value: 'remove' + }, + {caption: '--'}, + { + caption: this.mniEditControls, + value: 'settings' + } + ] + }) + }); + this.paragraphControls.push(this.btnContentControls); + this.btnColumns = new Common.UI.Button({ id: 'tlbtn-columns', cls: 'btn-toolbar x-huge icon-top', @@ -1270,6 +1300,7 @@ define([ _injectComponent('#slot-btn-instext', this.btnInsertText); _injectComponent('#slot-btn-instextart', this.btnInsertTextArt); _injectComponent('#slot-btn-dropcap', this.btnDropCap); + _injectComponent('#slot-btn-controls', this.btnContentControls); _injectComponent('#slot-btn-columns', this.btnColumns); _injectComponent('#slot-btn-inshyperlink', this.btnInsertHyperlink); _injectComponent('#slot-btn-editheader', this.btnEditHeader); @@ -1527,6 +1558,7 @@ define([ this.btnInsertShape.updateHint(this.tipInsertShape); this.btnInsertEquation.updateHint(this.tipInsertEquation); this.btnDropCap.updateHint(this.tipDropCap); + this.btnContentControls.updateHint(this.tipControls); this.btnColumns.updateHint(this.tipColumns); this.btnPageOrient.updateHint(this.tipPageOrient); this.btnPageSize.updateHint(this.tipPageSize); @@ -2470,7 +2502,13 @@ define([ capBtnComment: 'Comment', textColumnsCustom: 'Custom Columns', textSurface: 'Surface', - textTabProtect: 'Protection' + textTabProtect: 'Protection', + capBtnInsControls: 'Content Controls', + textRichControl: 'Insert rich text content control', + textPlainControl: 'Insert plain text content control', + textRemoveControl: 'Remove content control', + mniEditControls: 'Control Settings', + tipControls: 'Insert content controls' } })(), DE.Views.Toolbar || {})); }); diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index 1b527836a..ae04ea533 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -783,6 +783,13 @@ "DE.Views.ChartSettings.txtTight": "Tight", "DE.Views.ChartSettings.txtTitle": "Chart", "DE.Views.ChartSettings.txtTopAndBottom": "Top and bottom", + "DE.Views.ControlSettingsDialog.textTitle": "Content Control Settings", + "DE.Views.ControlSettingsDialog.textName": "Title", + "DE.Views.ControlSettingsDialog.textTag": "Tag", + "DE.Views.ControlSettingsDialog.txtLockDelete": "Content control cannot be deleted", + "DE.Views.ControlSettingsDialog.txtLockEdit": "Contents cannot be edited", + "DE.Views.ControlSettingsDialog.cancelButtonText": "Cancel", + "DE.Views.ControlSettingsDialog.okButtonText": "Ok", "DE.Views.CustomColumnsDialog.cancelButtonText": "Cancel", "DE.Views.CustomColumnsDialog.okButtonText": "Ok", "DE.Views.CustomColumnsDialog.textColumns": "Number of columns", @@ -1791,5 +1798,11 @@ "DE.Views.Toolbar.txtScheme6": "Concourse", "DE.Views.Toolbar.txtScheme7": "Equity", "DE.Views.Toolbar.txtScheme8": "Flow", - "DE.Views.Toolbar.txtScheme9": "Foundry" + "DE.Views.Toolbar.txtScheme9": "Foundry", + "DE.Views.Toolbar.capBtnInsControls": "Content Controls", + "DE.Views.Toolbar.textRichControl": "Insert rich text content control", + "DE.Views.Toolbar.textPlainControl": "Insert plain text content control", + "DE.Views.Toolbar.textRemoveControl": "Remove content control", + "DE.Views.Toolbar.mniEditControls": "Control Settings", + "DE.Views.Toolbar.tipControls": "Insert content controls" } \ No newline at end of file diff --git a/apps/documenteditor/sdk_dev_scripts.js b/apps/documenteditor/sdk_dev_scripts.js index c021353bd..9c904b5b7 100644 --- a/apps/documenteditor/sdk_dev_scripts.js +++ b/apps/documenteditor/sdk_dev_scripts.js @@ -12,6 +12,7 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/HistoryCommon.js", "../../../../sdkjs/common/TableId.js", "../../../../sdkjs/common/TableIdChanges.js", + "../../../../sdkjs/common/macros.js", "../../../../sdkjs/common/NumFormat.js", "../../../../sdkjs/common/SerializeChart.js", "../../../../sdkjs/common/AdvancedOptions.js", From 8165448e2d15939504bfb0ab66f5ff952a2af741 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 11 Dec 2017 15:38:20 +0300 Subject: [PATCH 62/86] Added a link to the new file. --- apps/documenteditor/sdk_dev_scripts.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/documenteditor/sdk_dev_scripts.js b/apps/documenteditor/sdk_dev_scripts.js index c021353bd..9c904b5b7 100644 --- a/apps/documenteditor/sdk_dev_scripts.js +++ b/apps/documenteditor/sdk_dev_scripts.js @@ -12,6 +12,7 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/HistoryCommon.js", "../../../../sdkjs/common/TableId.js", "../../../../sdkjs/common/TableIdChanges.js", + "../../../../sdkjs/common/macros.js", "../../../../sdkjs/common/NumFormat.js", "../../../../sdkjs/common/SerializeChart.js", "../../../../sdkjs/common/AdvancedOptions.js", From 8a44934bbde565ade7f3bf8da87cfa8a52774ef6 Mon Sep 17 00:00:00 2001 From: Sergey Konovalov Date: Tue, 12 Dec 2017 14:11:11 +0300 Subject: [PATCH 63/86] Added a link to the new file. --- apps/presentationeditor/sdk_dev_scripts.js | 1 + apps/spreadsheeteditor/sdk_dev_scripts.js | 1 + 2 files changed, 2 insertions(+) diff --git a/apps/presentationeditor/sdk_dev_scripts.js b/apps/presentationeditor/sdk_dev_scripts.js index e1f833587..cd73751ce 100644 --- a/apps/presentationeditor/sdk_dev_scripts.js +++ b/apps/presentationeditor/sdk_dev_scripts.js @@ -12,6 +12,7 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/HistoryCommon.js", "../../../../sdkjs/common/TableId.js", "../../../../sdkjs/common/TableIdChanges.js", + "../../../../sdkjs/common/macros.js", "../../../../sdkjs/common/NumFormat.js", "../../../../sdkjs/common/SerializeChart.js", "../../../../sdkjs/common/AdvancedOptions.js", diff --git a/apps/spreadsheeteditor/sdk_dev_scripts.js b/apps/spreadsheeteditor/sdk_dev_scripts.js index e53e7e8f5..8346b1ef9 100644 --- a/apps/spreadsheeteditor/sdk_dev_scripts.js +++ b/apps/spreadsheeteditor/sdk_dev_scripts.js @@ -12,6 +12,7 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/HistoryCommon.js", "../../../../sdkjs/common/TableId.js", "../../../../sdkjs/common/TableIdChanges.js", + "../../../../sdkjs/common/macros.js", "../../../../sdkjs/common/AdvancedOptions.js", "../../../../sdkjs/cell/apiDefines.js", "../../../../sdkjs/cell/utils/utils.js", From 3a3e0602b76a5c3e7e97404361db199fd97bb3c5 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 13 Dec 2017 12:11:27 +0300 Subject: [PATCH 64/86] Bugfix for IE/Edge: set focus out of the editor frame. --- apps/documenteditor/main/app/controller/Main.js | 2 ++ apps/presentationeditor/main/app/controller/Main.js | 2 ++ apps/spreadsheeteditor/main/app/controller/Main.js | 2 ++ 3 files changed, 6 insertions(+) diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index 6794bfd05..e6ff4095c 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -199,6 +199,8 @@ define([ !/area_id/.test(e.target.id) && ($(e.target).parent().find(e.relatedTarget).length<1 || e.target.localName == 'textarea') /* Check if focus in combobox goes from input to it's menu button or menu items, or from comment editing area to Ok/Cancel button */ && (e.relatedTarget.localName != 'input' || !/form-control/.test(e.relatedTarget.className)) /* Check if focus goes to text input with class "form-control" */ && (e.relatedTarget.localName != 'textarea' || /area_id/.test(e.relatedTarget.id))) /* Check if focus goes to textarea, but not to "area_id" */ { + if (Common.Utils.isIE && e.originalEvent && e.originalEvent.target && /area_id/.test(e.originalEvent.target.id) && (e.originalEvent.target === e.originalEvent.srcElement)) + return; me.api.asc_enableKeyEvents(true); if (/msg-reply/.test(e.target.className)) me.dontCloseDummyComment = false; diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js index 1fc3d1ff7..7df2dbad6 100644 --- a/apps/presentationeditor/main/app/controller/Main.js +++ b/apps/presentationeditor/main/app/controller/Main.js @@ -195,6 +195,8 @@ define([ !/area_id/.test(e.target.id) && ($(e.target).parent().find(e.relatedTarget).length<1 || e.target.localName == 'textarea') /* Check if focus in combobox goes from input to it's menu button or menu items, or from comment editing area to Ok/Cancel button */ && (e.relatedTarget.localName != 'input' || !/form-control/.test(e.relatedTarget.className)) /* Check if focus goes to text input with class "form-control" */ && (e.relatedTarget.localName != 'textarea' || /area_id/.test(e.relatedTarget.id))) /* Check if focus goes to textarea, but not to "area_id" */ { + if (Common.Utils.isIE && e.originalEvent && e.originalEvent.target && /area_id/.test(e.originalEvent.target.id) && (e.originalEvent.target === e.originalEvent.srcElement)) + return; me.api.asc_enableKeyEvents(true); if (/msg-reply/.test(e.target.className)) me.dontCloseDummyComment = false; diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index 28bdbc31f..3c2c2ec8a 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -209,6 +209,8 @@ define([ !/area_id/.test(e.target.id) && ($(e.target).parent().find(e.relatedTarget).length<1 || e.target.localName == 'textarea') /* Check if focus in combobox goes from input to it's menu button or menu items, or from comment editing area to Ok/Cancel button */ && (e.relatedTarget.localName != 'input' || !/form-control/.test(e.relatedTarget.className)) /* Check if focus goes to text input with class "form-control" */ && (e.relatedTarget.localName != 'textarea' || /area_id/.test(e.relatedTarget.id))) /* Check if focus goes to textarea, but not to "area_id" */ { + if (Common.Utils.isIE && e.originalEvent && e.originalEvent.target && /area_id/.test(e.originalEvent.target.id) && (e.originalEvent.target === e.originalEvent.srcElement)) + return; me.api.asc_enableKeyEvents(true); if (/msg-reply/.test(e.target.className)) me.dontCloseDummyComment = false; From e7b722c02174d223adc8820087c229a56dd6d6a7 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 13 Dec 2017 16:52:14 +0300 Subject: [PATCH 65/86] [DE] Updated icons. Added context menu for content controls. --- .../resources/img/controls/toolbarbig.png | Bin 11880 -> 13583 bytes .../resources/img/controls/toolbarbig@2x.png | Bin 26782 -> 30487 bytes apps/common/main/resources/less/toolbar.less | 2 +- .../main/app/controller/Toolbar.js | 45 +++++---- .../main/app/view/ControlSettingsDialog.js | 9 +- .../main/app/view/DocumentHolder.js | 90 +++++++++++++++++- apps/documenteditor/main/app/view/Toolbar.js | 24 +++-- apps/documenteditor/main/locale/en.json | 18 ++-- .../main/resources/img/popupmenu-btns.png | Bin 5170 -> 5520 bytes .../main/resources/img/popupmenu-btns@2x.png | Bin 19245 -> 12664 bytes .../main/resources/less/toolbar.less | 4 + 11 files changed, 148 insertions(+), 44 deletions(-) diff --git a/apps/common/main/resources/img/controls/toolbarbig.png b/apps/common/main/resources/img/controls/toolbarbig.png index 21d0714b4e25f346215a2a3915714df42413f253..b9f731ba9b01170d28d411bedb747794566d49a5 100644 GIT binary patch delta 12471 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 delta 10754 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 diff --git a/apps/common/main/resources/img/controls/toolbarbig@2x.png b/apps/common/main/resources/img/controls/toolbarbig@2x.png index cb65c79b236d317fc53be64da1eeb36a87f1e57d..a5cc606ce5533f6a997b2fc4f03c9b8116b3ff4f 100644 GIT binary patch literal 30487 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�F)I1l2=xTS=@j&3M5Y-I8vhBrPL# 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
    l$Jd5#J&+!Hv8sx2qehE!6nbe*_HKXO=(Bt%R5 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
    ', '', '', + '', + '', + '', + '', + '', '', '', '
    ', @@ -95,7 +100,6 @@ define([ ].join('') }, options); - this.api = options.api; this.handler = options.handler; this.props = options.props; @@ -200,6 +204,7 @@ define([ textTag: 'Tag', txtLockDelete: 'Content control cannot be deleted', txtLockEdit: 'Contents cannot be edited', + textLock: 'Locking', cancelButtonText: 'Cancel', okButtonText: 'Ok' diff --git a/apps/documenteditor/main/app/view/DocumentHolder.js b/apps/documenteditor/main/app/view/DocumentHolder.js index 4aefe7708..7b97f6593 100644 --- a/apps/documenteditor/main/app/view/DocumentHolder.js +++ b/apps/documenteditor/main/app/view/DocumentHolder.js @@ -52,7 +52,8 @@ define([ 'documenteditor/main/app/view/DropcapSettingsAdvanced', 'documenteditor/main/app/view/HyperlinkSettingsDialog', 'documenteditor/main/app/view/ParagraphSettingsAdvanced', - 'documenteditor/main/app/view/TableSettingsAdvanced' + 'documenteditor/main/app/view/TableSettingsAdvanced', + 'documenteditor/main/app/view/ControlSettingsDialog' ], function ($, _, Backbone, gateway) { 'use strict'; DE.Views.DocumentHolder = Backbone.View.extend(_.extend({ @@ -1791,6 +1792,28 @@ define([ me.fireEvent('editcomplete', me); }, + onControlsSelect: function(item, e) { + var props = this.api.asc_GetContentControlProperties(); + if (props) { + if (item.value == 'settings') { + var me = this; + (new DE.Views.ControlSettingsDialog({ + props: props, + handler: function (result, value) { + if (result == 'ok') { + me.api.asc_SetContentControlProperties(value, props.get_InternalId()); + } + + Common.NotificationCenter.trigger('edit:complete', me.toolbar); + } + })).show(); + } else if (item.value == 'remove') { + this.api.asc_RemoveContentControlWrapper(props.get_InternalId()); + } + } + Common.NotificationCenter.trigger('edit:complete', this.toolbar); + }, + createDelayedElementsViewer: function() { var me = this; @@ -2484,6 +2507,27 @@ define([ }) }); + var menuTableRemoveControl = new Common.UI.MenuItem({ + caption: me.textRemove, + value: 'remove' + }).on('click', _.bind(me.onControlsSelect, me)); + + var menuTableControlSettings = new Common.UI.MenuItem({ + caption: me.textSettings, + value: 'settings' + }).on('click', _.bind(me.onControlsSelect, me)); + + var menuTableControl = new Common.UI.MenuItem({ + caption: me.textContentControls, + menu : new Common.UI.Menu({ + menuAlign: 'tl-tr', + items : [ + menuTableRemoveControl, + menuTableControlSettings + ] + }) + }); + /** coauthoring begin **/ var menuAddCommentTable = new Common.UI.MenuItem({ caption : me.addCommentText @@ -2742,6 +2786,14 @@ define([ } else me.clearEquationMenu(false, 6); menuEquationSeparatorInTable.setVisible(isEquation && eqlen>0); + + var in_control = me.api.asc_IsContentControl(); + menuTableControl.setVisible(in_control); + if (in_control) { + var control_props = me.api.asc_GetContentControlProperties(), + lock_type = (control_props) ? control_props.get_Lock() : AscCommonWord.sdtlock_Unlocked; + menuTableRemoveControl.setDisabled(lock_type==AscCommonWord.sdtlock_SdtContentLocked || lock_type==AscCommonWord.sdtlock_SdtLocked); + } }, items: [ me.menuSpellCheckTable, @@ -2862,6 +2914,7 @@ define([ menuAddHyperlinkTable, menuHyperlinkTable, menuHyperlinkSeparator, + menuTableControl, menuParagraphAdvancedInTable ] }).on('hide:after', function(menu, e, isFromInputControl) { @@ -3117,6 +3170,21 @@ define([ caption : '--' }); + var menuParaRemoveControl = new Common.UI.MenuItem({ + caption: me.textRemoveControl, + value: 'remove' + }).on('click', _.bind(me.onControlsSelect, me)); + + var menuParaControlSettings = new Common.UI.MenuItem( + { + caption: me.textEditControls, + value: 'settings' + }).on('click', _.bind(me.onControlsSelect, me)); + + var menuParaControlSeparator = new Common.UI.MenuItem({ + caption : '--' + }); + this.textMenu = new Common.UI.Menu({ initMenu: function(value){ var isInShape = (value.imgProps && value.imgProps.value && !_.isNull(value.imgProps.value.get_ShapeProperties())); @@ -3216,6 +3284,16 @@ define([ if (me.mode.canEditStyles && !isInChart) { me.menuStyleUpdate.setCaption(me.updateStyleText.replace('%1', DE.getController('Main').translationTable[window.currentStyleName] || window.currentStyleName)); } + + var in_control = me.api.asc_IsContentControl(); + menuParaRemoveControl.setVisible(in_control); + menuParaControlSettings.setVisible(in_control); + menuParaControlSeparator.setVisible(in_control); + if (in_control) { + var control_props = me.api.asc_GetContentControlProperties(), + lock_type = (control_props) ? control_props.get_Lock() : AscCommonWord.sdtlock_Unlocked; + menuParaRemoveControl.setDisabled(lock_type==AscCommonWord.sdtlock_SdtContentLocked || lock_type==AscCommonWord.sdtlock_SdtLocked); + } }, items: [ me.menuSpellPara, @@ -3230,6 +3308,9 @@ define([ menuParaPaste, { caption: '--' }, menuEquationSeparator, + menuParaRemoveControl, + menuParaControlSettings, + menuParaControlSeparator, menuParagraphBreakBefore, menuParagraphKeepLines, menuParagraphVAlign, @@ -3546,7 +3627,12 @@ define([ strSign: 'Sign', strDetails: 'Signature Details', strSetup: 'Signature Setup', - strDelete: 'Remove Signature' + strDelete: 'Remove Signature', + textContentControls: 'Content control', + textRemove: 'Remove', + textSettings: 'Settings', + textRemoveControl: 'Remove content control', + textEditControls: 'Content control settings' }, DE.Views.DocumentHolder || {})); }); \ No newline at end of file diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index e66fe35af..c4c1441a4 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -616,16 +616,20 @@ define([ menu: new Common.UI.Menu({ cls: 'ppm-toolbar', items: [ - { - caption: this.textRichControl, - value: AscCommonWord.sdttype_BlockLevel - }, { caption: this.textPlainControl, + iconCls: 'mnu-control-plain', value: AscCommonWord.sdttype_InlineLevel }, + { + caption: this.textRichControl, + iconCls: 'mnu-control-rich', + value: AscCommonWord.sdttype_BlockLevel + }, + {caption: '--'}, { caption: this.textRemoveControl, + iconCls: 'mnu-control-remove', value: 'remove' }, {caption: '--'}, @@ -2503,12 +2507,12 @@ define([ textColumnsCustom: 'Custom Columns', textSurface: 'Surface', textTabProtect: 'Protection', - capBtnInsControls: 'Content Controls', - textRichControl: 'Insert rich text content control', - textPlainControl: 'Insert plain text content control', - textRemoveControl: 'Remove content control', - mniEditControls: 'Control Settings', - tipControls: 'Insert content controls' + capBtnInsControls: 'Content Control', + textRichControl: 'Rich text', + textPlainControl: 'Plain text', + textRemoveControl: 'Remove', + mniEditControls: 'Settings', + tipControls: 'Insert content control' } })(), DE.Views.Toolbar || {})); }); diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index ae04ea533..4d1744d21 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -788,6 +788,7 @@ "DE.Views.ControlSettingsDialog.textTag": "Tag", "DE.Views.ControlSettingsDialog.txtLockDelete": "Content control cannot be deleted", "DE.Views.ControlSettingsDialog.txtLockEdit": "Contents cannot be edited", + "DE.Views.ControlSettingsDialog.textLock": "Locking", "DE.Views.ControlSettingsDialog.cancelButtonText": "Cancel", "DE.Views.ControlSettingsDialog.okButtonText": "Ok", "DE.Views.CustomColumnsDialog.cancelButtonText": "Cancel", @@ -968,6 +969,11 @@ "DE.Views.DocumentHolder.txtUngroup": "Ungroup", "DE.Views.DocumentHolder.updateStyleText": "Update %1 style", "DE.Views.DocumentHolder.vertAlignText": "Vertical Alignment", + "DE.Views.DocumentHolder.textContentControls": "Content control", + "DE.Views.DocumentHolder.textRemove": "Remove", + "DE.Views.DocumentHolder.textSettings": "Settings", + "DE.Views.DocumentHolder.textRemoveControl": "Remove content control", + "DE.Views.DocumentHolder.textEditControls": "Content control settings", "DE.Views.DropcapSettingsAdvanced.cancelButtonText": "Cancel", "DE.Views.DropcapSettingsAdvanced.okButtonText": "Ok", "DE.Views.DropcapSettingsAdvanced.strBorders": "Borders & Fill", @@ -1799,10 +1805,10 @@ "DE.Views.Toolbar.txtScheme7": "Equity", "DE.Views.Toolbar.txtScheme8": "Flow", "DE.Views.Toolbar.txtScheme9": "Foundry", - "DE.Views.Toolbar.capBtnInsControls": "Content Controls", - "DE.Views.Toolbar.textRichControl": "Insert rich text content control", - "DE.Views.Toolbar.textPlainControl": "Insert plain text content control", - "DE.Views.Toolbar.textRemoveControl": "Remove content control", - "DE.Views.Toolbar.mniEditControls": "Control Settings", - "DE.Views.Toolbar.tipControls": "Insert content controls" + "DE.Views.Toolbar.capBtnInsControls": "Content Control", + "DE.Views.Toolbar.textRichControl": "Rich text", + "DE.Views.Toolbar.textPlainControl": "Plain text", + "DE.Views.Toolbar.textRemoveControl": "Remove", + "DE.Views.Toolbar.mniEditControls": "Settings", + "DE.Views.Toolbar.tipControls": "Insert content control" } \ No newline at end of file diff --git a/apps/documenteditor/main/resources/img/popupmenu-btns.png b/apps/documenteditor/main/resources/img/popupmenu-btns.png index 91b274febe2cfe63ee9cd8ee156aeff4c0936404..0f4b97d68ada86e119becec7533b542d869e1c24 100644 GIT binary patch literal 5520 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 literal 5170 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 KpexiJqy7W$MT@Ec diff --git a/apps/documenteditor/main/resources/img/popupmenu-btns@2x.png b/apps/documenteditor/main/resources/img/popupmenu-btns@2x.png index 5a1b534c5ff8a2aea100cadcfcc75d34cb67858c..56c646f90c2946eeacff693d0419969d877a9e82 100644 GIT binary patch literal 12664 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 literal 19245 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 diff --git a/apps/documenteditor/main/resources/less/toolbar.less b/apps/documenteditor/main/resources/less/toolbar.less index af45fb7fb..fd84706f4 100644 --- a/apps/documenteditor/main/resources/less/toolbar.less +++ b/apps/documenteditor/main/resources/less/toolbar.less @@ -364,6 +364,10 @@ .menu-icon-normal(mnu-orient-portrait, 36, @menu-icon-size); .menu-icon-normal(mnu-orient-landscape, 37, @menu-icon-size); +.menu-icon-normal(mnu-control-plain, 38, @menu-icon-size); +.menu-icon-normal(mnu-control-rich, 39, @menu-icon-size); +.menu-icon-normal(mnu-control-remove, 40, @menu-icon-size); + .menu-otherstates-icon(ppm-toolbar, @menu-icon-size); From 419d00f2db68f46607d59a908ef3f68ea42cc12e Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 13 Dec 2017 16:53:00 +0300 Subject: [PATCH 66/86] Review changes refactoring. --- apps/common/main/lib/view/ReviewChanges.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/common/main/lib/view/ReviewChanges.js b/apps/common/main/lib/view/ReviewChanges.js index 852e57d28..f017eb097 100644 --- a/apps/common/main/lib/view/ReviewChanges.js +++ b/apps/common/main/lib/view/ReviewChanges.js @@ -438,6 +438,12 @@ define([ '' + '
  • -
  • измените параметры диаграммы, нажав на кнопку Изменить диаграмму в окне Редактор диаграмм. Откроется окно Диаграмма - Дополнительные параметры. -

    Окно Диаграмма - Дополнительные параметры

    +
  • измените параметры диаграммы, нажав на кнопку Изменить диаграмму в окне Редактор диаграмм. Откроется окно Диаграмма - дополнительные параметры. +

    Окно Диаграмма - дополнительные параметры

    На вкладке Тип и данные можно изменить тип диаграммы, а также данные, которые вы хотите использовать для создания диаграммы.
    • Выберите Тип диаграммы, который требуется применить: гистограмма, график, круговая, линейчатая, с областями, точечная, биржевая.
    • @@ -41,7 +41,7 @@ Измените способ расположения данных. Можно выбрать ряды данных для использования по оси X: в строках или в столбцах.
    -

    Окно Диаграмма - Дополнительные параметры

    +

    Окно Диаграмма - дополнительные параметры

    На вкладке Макет можно изменить расположение элементов диаграммы:

    • @@ -130,7 +130,7 @@

    - Окно Диаграмма - Дополнительные параметры + Окно Диаграмма - дополнительные параметры

    Примечание: Вкладки Вертикальная/горизонтальная ось недоступны для круговых диаграмм, так как у круговых диаграмм нет осей. @@ -212,7 +212,7 @@

  • - Окно Диаграмма - Дополнительные параметры + Окно Диаграмма - дополнительные параметры

    На вкладке Горизонтальная ось можно изменить параметры горизонтальной оси, которую также называют @@ -276,7 +276,7 @@ -

    Диаграмма - Дополнительные параметры

    +

    Диаграмма - дополнительные параметры

    Вкладка Альтернативный текст позволяет задать Заголовок и Описание, которые будут зачитываться для людей с нарушениями зрения или когнитивными нарушениями, чтобы помочь им лучше понять, какую информацию содержит диаграмма.

    @@ -315,7 +315,7 @@
  • Выравнивание - используется, чтобы выровнять диаграмму по левому краю, по центру, по правому краю, по верхнему краю, по середине, по нижнему краю. Подробнее о выравнивании объектов рассказывается на этой странице.
  • Стиль обтекания - используется, чтобы выбрать один из доступных стилей обтекания текстом - в тексте, вокруг рамки, по контуру, сквозное, сверху и снизу, перед текстом, за текстом. Опция Изменить границу обтекания для диаграмм недоступна.
  • Изменить данные - используется для вызова окна 'Редактор диаграмм'.
  • -
  • Дополнительные параметры диаграммы - используется для вызова окна 'Диаграмма - Дополнительные параметры'.
  • +
  • Дополнительные параметры диаграммы - используется для вызова окна 'Диаграмма - дополнительные параметры'.
  • При выборе диаграммы справа также появляется значок Параметры фигуры Значок Параметры фигуры, @@ -325,12 +325,12 @@


    Чтобы изменить дополнительные параметры диаграммы, щелкните по ней правой кнопкой мыши и выберите из контекстного меню пункт Дополнительные параметры диаграммы. Или нажмите ссылку Дополнительные параметры на правой боковой панели. Откроется окно свойств диаграммы:

    -

    Диаграмма - Дополнительные параметры: Размер

    +

    Диаграмма - дополнительные параметры: Размер

    Вкладка Размер содержит следующие параметры:

    • Ширина и Высота - используйте эти опции, чтобы изменить ширину и/или высоту диаграммы. Если нажата кнопка Сохранять пропорции Кнопка Сохранять пропорции (в этом случае она выглядит так: Кнопка Сохранять пропорции нажата), ширина и высота будут изменены пропорционально, сохраняя исходное соотношение сторон диаграммы.
    -

    Диаграмма - Дополнительные параметры: Обтекание текстом

    +

    Диаграмма - дополнительные параметры: Обтекание текстом

    Вкладка Обтекание текстом содержит следующие параметры:

    • Стиль обтекания - используйте эту опцию, чтобы изменить способ размещения диаграммы относительно текста: или она будет являться частью текста (если выбран стиль обтекания "В тексте") или текст будет обтекать ее со всех сторон (если выбран один из остальных стилей). @@ -348,7 +348,7 @@

    При выборе стиля обтекания вокруг рамки, по контуру, сквозное или сверху и снизу можно задать дополнительные параметры - расстояние до текста со всех сторон (сверху, снизу, слева, справа).

    -

    Диаграмма - Дополнительные параметры: Положение

    +

    Диаграмма - дополнительные параметры: Положение

    Вкладка Положение доступна только в том случае, если выбран стиль обтекания, отличный от стиля "В тексте". Вкладка содержит следующие параметры, которые различаются в зависимости от выбранного стиля обтекания:

    • @@ -370,7 +370,7 @@
    • Опция Перемещать с текстом определяет, будет ли диаграмма перемещаться вместе с текстом, к которому она привязана.
    • Опция Разрешить перекрытие определяет, будут ли перекрываться две диаграммы, если перетащить их близко друг к другу на странице.
    -

    Диаграмма - Дополнительные параметры

    +

    Диаграмма - дополнительные параметры

    Вкладка Альтернативный текст позволяет задать Заголовок и Описание, которые будут зачитываться для людей с нарушениями зрения или когнитивными нарушениями, чтобы помочь им лучше понять, какую информацию содержит диаграмма.

    diff --git a/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertImages.htm b/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertImages.htm index dc61a42bf..8033e255d 100644 --- a/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertImages.htm +++ b/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertImages.htm @@ -45,16 +45,16 @@
  • Выравнивание - используется, чтобы выровнять изображение по левому краю, по центру, по правому краю, по верхнему краю, по середине, по нижнему краю. Подробнее о выравнивании объектов рассказывается на этой странице.
  • Стиль обтекания - используется, чтобы выбрать один из доступных стилей обтекания текстом - в тексте, вокруг рамки, по контуру, сквозное, сверху и снизу, перед текстом, за текстом - или для изменения границы обтекания. Опция Изменить границу обтекания доступна только в том случае, если выбран стиль обтекания, отличный от стиля "В тексте". Чтобы произвольно изменить границу, перетаскивайте точки границы обтекания. Чтобы создать новую точку границы обтекания, щелкните в любом месте на красной линии и перетащите ее в нужную позицию. Изменение границы обтекания
  • Размер по умолчанию - используется для смены текущего размера изображения на размер по умолчанию.
  • -
  • Дополнительные параметры изображения - используется для вызова окна 'Изображение - Дополнительные параметры'.
  • +
  • Дополнительные параметры изображения - используется для вызова окна 'Изображение - дополнительные параметры'.

  • Чтобы изменить дополнительные параметры изображения, щелкните по нему правой кнопкой мыши и выберите из контекстного меню пункт Дополнительные параметры изображения. Или нажмите ссылку Дополнительные параметры на правой боковой панели. Откроется окно свойств изображения:

    -

    Изображение - Дополнительные параметры: Размер

    +

    Изображение - дополнительные параметры: Размер

    Вкладка Размер содержит следующие параметры:

    • Ширина и Высота - используйте эти опции, чтобы изменить ширину и/или высоту изображения. Если нажата кнопка Сохранять пропорции Кнопка Сохранять пропорции (в этом случае она выглядит так: Кнопка Сохранять пропорции нажата), ширина и высота будут изменены пропорционально, сохраняя исходное соотношение сторон изображения. Чтобы восстановить размер по умолчанию добавленного изображения, нажмите кнопку По умолчанию.
    -

    Изображение - Дополнительные параметры: Обтекание текстом

    +

    Изображение - дополнительные параметры: Обтекание текстом

    Вкладка Обтекание текстом содержит следующие параметры:

    • Стиль обтекания - используйте эту опцию, чтобы изменить способ размещения изображения относительно текста: или оно будет являться частью текста (если выбран стиль обтекания "В тексте") или текст будет обтекать его со всех сторон (если выбран один из остальных стилей). @@ -72,7 +72,7 @@

    При выборе стиля обтекания вокруг рамки, по контуру, сквозное или сверху и снизу можно задать дополнительные параметры - расстояние до текста со всех сторон (сверху, снизу, слева, справа).

    -

    Изображение - Дополнительные параметры: Положение

    +

    Изображение - дополнительные параметры: Положение

    Вкладка Положение доступна только в том случае, если выбран стиль обтекания, отличный от стиля "В тексте". Вкладка содержит следующие параметры, которые различаются в зависимости от выбранного стиля обтекания:

    • В разделе По горизонтали можно выбрать один из следующих трех способов позиционирования изображения: @@ -92,7 +92,7 @@
    • Опция Перемещать с текстом определяет, будет ли изображение перемещаться вместе с текстом, к которому оно привязано.
    • Опция Разрешить перекрытие определяет, будут ли перекрываться два изображения, если перетащить их близко друг к другу на странице.
    -

    Изображение - Дополнительные параметры

    +

    Изображение - дополнительные параметры

    Вкладка Альтернативный текст позволяет задать Заголовок и Описание, которые будут зачитываться для людей с нарушениями зрения или когнитивными нарушениями, чтобы помочь им лучше понять, какую информацию содержит изображение.

    diff --git a/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertTables.htm b/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertTables.htm index 08db56c32..c41032dc6 100644 --- a/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertTables.htm +++ b/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertTables.htm @@ -41,9 +41,9 @@
  • Направление текста - используется для изменения ориентации текста в ячейке. Текст можно расположить по горизонтали, по вертикали сверху вниз (Поворот на 90°), или по вертикали снизу вверх (Поворот на 270°).
  • Стиль обтекания - Встроенный - используется для выбора встроенного стиля обтекания (при котором таблица разрывает текст), а также выравнивания: по левому краю, по центру, по правому краю.
  • Стиль обтекания - Плавающий - используется для выбора плавающего стиля обтекания, при котором текст размещается вокруг таблицы.
  • -
  • Дополнительные параметры таблицы - используется для вызова окна 'Таблица - Дополнительные параметры'.
  • +
  • Дополнительные параметры таблицы - используется для вызова окна 'Таблица - дополнительные параметры'.
  • Гиперссылка - используется для вставки гиперссылки.
  • -
  • Дополнительные параметры абзаца - используется для вызова окна 'Абзац - Дополнительные параметры'.
  • +
  • Дополнительные параметры абзаца - используется для вызова окна 'Абзац - дополнительные параметры'.

  • Правая боковая панель - Настройки таблицы

    @@ -68,11 +68,11 @@
  • Стиль обтекания - используется для выбора одного из двух стилей обтекания текстом - встроенного и плавающего.

  • Строки и столбцы - используется для выполнения некоторых операций с таблицей: выделения, удаления, вставки строк и столбцов, объединения ячеек, разделения ячейки.

  • Повторять как заголовок на каждой странице - в длинных таблицах используется для вставки одной и той же строки заголовка наверху каждой страницы.

  • -
  • Дополнительные параметры - используется для вызова окна 'Таблица - Дополнительные параметры'.

  • +
  • Дополнительные параметры - используется для вызова окна 'Таблица - дополнительные параметры'.


  • Чтобы изменить дополнительные параметры таблицы, щелкните по таблице правой кнопкой мыши и выберите из контекстного меню пункт Дополнительные параметры таблицы. Или нажмите ссылку Дополнительные параметры на правой боковой панели. Откроется окно свойств таблицы:

    -

    Таблица - Дополнительные параметры

    +

    Таблица - дополнительные параметры

    На вкладке Таблица можно изменить свойства всей таблицы.

    • @@ -96,7 +96,7 @@
    -

    Таблица - Дополнительные параметры

    +

    Таблица - дополнительные параметры

    На вкладке Ячейка можно изменить свойства отдельных ячеек. Сначала надо выбрать ячейку, к которой требуется применить изменения, или выделить всю таблицу, чтобы изменить свойства всех ее ячеек.

    • @@ -117,7 +117,7 @@
    -

    Таблица - Дополнительные параметры

    +

    Таблица - дополнительные параметры

    Вкладка Границы и фон содержит следующие параметры:

    • @@ -130,7 +130,7 @@
    • Фон ячейки - цвет фона внутри ячейки (опция доступна только в том случае, если выделены одна или более ячеек или выбрана опция Интервалы между ячейками на вкладке Таблица).
    • Фон таблицы - цвет фона таблицы или фона пространства между ячейками в том случае, если выбрана опция Интервалы между ячейками на вкладке Таблица.
    -

    Таблица - Дополнительные параметры

    +

    Таблица - дополнительные параметры

    Вкладка Положение таблицы доступна только в том случае, если на вкладке Обтекание текстом выбран Плавающий стиль обтекания, и содержит следующие параметры:

    • Параметры раздела По горизонтали включают в себя выравнивание таблицы (по левому краю, по центру, по правому краю) относительно поля, страницы или текста, а также положение таблицы справа от поля, страницы или текста.
    • @@ -143,7 +143,7 @@
    -

    Таблица - Дополнительные параметры

    +

    Таблица - дополнительные параметры

    Вкладка Обтекание текстом содержит следующие параметры:

    • Стиль обтекания текстом - Встроенный или Плавающий. Используйте нужную опцию, чтобы изменить способ размещения таблицы относительно текста: или она будет являться частью текста (если Вы выбрали встроенный стиль), или текст будет обтекать ее со всех сторон (если Вы выбрали плавающий стиль).
    • @@ -155,7 +155,7 @@
    -

    Таблица - Дополнительные параметры

    +

    Таблица - дополнительные параметры

    Вкладка Альтернативный текст позволяет задать Заголовок и Описание, которые будут зачитываться для людей с нарушениями зрения или когнитивными нарушениями, чтобы помочь им лучше понять, какую информацию содержит таблица.

    diff --git a/apps/documenteditor/main/resources/help/ru/UsageInstructions/PageBreaks.htm b/apps/documenteditor/main/resources/help/ru/UsageInstructions/PageBreaks.htm index 0e3421ee4..913baf695 100644 --- a/apps/documenteditor/main/resources/help/ru/UsageInstructions/PageBreaks.htm +++ b/apps/documenteditor/main/resources/help/ru/UsageInstructions/PageBreaks.htm @@ -15,12 +15,12 @@

    Чтобы вставить разрыв страницы перед выбранным абзацем, то есть начать этот абзац в верхней части новой страницы:

    • щелкните правой кнопкой мыши и выберите в меню пункт С новой страницы, или
    • -
    • щелкните правой кнопкой мыши, выберите в меню пункт Дополнительные параметры абзаца или используйте ссылку Дополнительные параметры на правой боковой панели, затем в открывшемся окне Абзац - Дополнительные параметры установите флажок С новой страницы.
    • +
    • щелкните правой кнопкой мыши, выберите в меню пункт Дополнительные параметры абзаца или используйте ссылку Дополнительные параметры на правой боковой панели, затем в открывшемся окне Абзац - дополнительные параметры установите флажок С новой страницы.

    Чтобы располагать строки абзаца на одной странице и переносить на новую страницу только целые абзацы (то есть не допускать разрыва страниц между строками одного абзаца),

    • щелкните правой кнопкой мыши и выберите в меню пункт Не разрывать абзац или
    • -
    • щелкните правой кнопкой мыши, выберите в меню пункт Дополнительные параметры абзаца или используйте ссылку Дополнительные параметры на правой боковой панели, и установите флажок Не разрывать абзац в открывшемся окне Абзац - Дополнительные параметры.
    • +
    • щелкните правой кнопкой мыши, выберите в меню пункт Дополнительные параметры абзаца или используйте ссылку Дополнительные параметры на правой боковой панели, и установите флажок Не разрывать абзац в открывшемся окне Абзац - дополнительные параметры.

    В окне Абзац - дополнительные параметры можно задать еще два параметра разбивки на страницы:


    -

    Чтобы изменить дополнительные параметры автофигуры, используйте ссылку Дополнительные параметры на правой боковой панели. Откроется окно 'Фигура - Дополнительные параметры': -

    Фигура - Дополнительные параметры

    +

    Чтобы изменить дополнительные параметры автофигуры, используйте ссылку Дополнительные параметры на правой боковой панели. Откроется окно 'Фигура - дополнительные параметры':

    +

    Фигура - дополнительные параметры

    Вкладка Размер содержит следующие параметры:

    • Ширина и Высота - используйте эти опции, чтобы изменить ширину и/или высоту автофигуры. Если нажата кнопка Сохранять пропорции Кнопка Сохранять пропорции (в этом случае она выглядит так: Кнопка Сохранять пропорции нажата), ширина и высота будут изменены пропорционально, сохраняя исходное соотношение сторон фигуры.
    -

    Фигура - Дополнительные параметры

    +

    Фигура - дополнительные параметры

    Вкладка Линии и стрелки содержит следующие параметры:

    • Стиль линии - эта группа опций позволяет задать такие параметры: @@ -113,12 +113,12 @@
    • Стрелки - эта группа опций доступна только в том случае, если выбрана фигура из группы автофигур Линии. Она позволяет задать Начальный и Конечный стиль и Размер стрелки, выбрав соответствующие опции из выпадающих списков.
    -

    Фигура - Дополнительные параметры

    +

    Фигура - дополнительные параметры

    На вкладке Поля вокруг текста можно изменить внутренние поля автофигуры Сверху, Снизу, Слева и Справа (то есть расстояние между текстом внутри фигуры и границами автофигуры).

    Примечание: эта вкладка доступна, только если в автофигуру добавлен текст, в противном случае вкладка неактивна.

    Свойства фигуры - вкладка Колонки

    На вкладке Колонки можно добавить колонки текста внутри автофигуры, указав нужное Количество колонок (не более 16) и Интервал между колонками. После того как вы нажмете кнопку ОК, уже имеющийся текст или любой другой текст, который вы введете, в этой автофигуре будет представлен в виде колонок и будет перетекать из одной колонки в другую.

    -

    Фигура - Дополнительные параметры

    +

    Фигура - дополнительные параметры

    Вкладка Альтернативный текст позволяет задать Заголовок и Описание, которые будут зачитываться для людей с нарушениями зрения или когнитивными нарушениями, чтобы помочь им лучше понять, какую информацию содержит автофигура.


    Вставка и форматирование текста внутри автофигуры

    diff --git a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertChart.htm b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertChart.htm index ed20ef3c0..8c0b6efe7 100644 --- a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertChart.htm +++ b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertChart.htm @@ -36,10 +36,10 @@

    Тип и стиль выбранной диаграммы будут изменены. Если требуется отредактировать данные, использованные для построения диаграммы,

    1. нажмите на ссылку Дополнительные параметры, расположенную на правой боковой панели, или выберите пункт Дополнительные параметры диаграммы из контекстного меню или просто дважды щелкните мышью по диаграмме,
    2. -
    3. в открывшемся окне Диаграмма - Дополнительные параметры внесите все необходимые изменения,
    4. +
    5. в открывшемся окне Диаграмма - дополнительные параметры внесите все необходимые изменения,
    6. нажмите кнопку OK, чтобы применить изменения и закрыть окно.
    -

    Ниже приводится описание параметров диаграммы, которые можно изменить с помощью окна Диаграмма - Дополнительные параметры.

    +

    Ниже приводится описание параметров диаграммы, которые можно изменить с помощью окна Диаграмма - дополнительные параметры.

    На вкладке Тип и данные можно изменить тип диаграммы, а также данные, которые вы хотите использовать для создания диаграммы.

      @@ -47,7 +47,7 @@
    • Проверьте выбранный Диапазон данных и при необходимости измените его, нажав на кнопку Выбор данных и указав желаемый диапазон данных в следующем формате: Лист1!A1:B4.
    • Измените способ расположения данных. Можно выбрать ряды данных для использования по оси X: в строках или в столбцах.
    -

    Диаграмма - Дополнительные параметры

    +

    Диаграмма - дополнительные параметры

    На вкладке Макет можно изменить расположение элементов диаграммы:

      @@ -132,7 +132,7 @@
    -

    Диаграмма - Дополнительные параметры

    +

    Диаграмма - дополнительные параметры

    Примечание: Вкладки Вертикальная/горизонтальная ось недоступны для круговых диаграмм, так как у круговых диаграмм нет осей.

    На вкладке Вертикальная ось можно изменить параметры вертикальной оси, которую называют также осью значений или осью Y, где указываются числовые значения. Обратите, пожалуйста, внимание, что для гистограмм вертикальная ось является осью категорий, на которой показываются текстовые подписи, так что в этом случае опции вкладки Вертикальная ось будут соответствовать опциям, о которых пойдет речь в следующем разделе. Для точечных диаграмм обе оси являются осями категорий.

    @@ -208,7 +208,7 @@ -

    Диаграмма - Дополнительные параметры

    +

    Диаграмма - дополнительные параметры

    На вкладке Горизонтальная ось можно изменить параметры горизонтальной оси, которую также называют осью категорий или осью X, где отображаются текстовые подписи. Обратите внимание, что для Гистограмм горизонтальная ось является осью значений, на которой отображаются числовые значения, @@ -270,10 +270,10 @@ -

    Диаграмма - Дополнительные параметры

    +

    Диаграмма - дополнительные параметры

    Вкладка Альтернативный текст позволяет задать Заголовок и Описание, которые будут зачитываться для людей с нарушениями зрения или когнитивными нарушениями, чтобы помочь им лучше понять, какую информацию содержит диаграмма.

    -

    Диаграмма - Дополнительные параметры

    +

    Диаграмма - дополнительные параметры

    Редактирование элементов диаграммы

    Чтобы изменить Заголовок диаграммы, выделите мышью стандартный текст и введите вместо него свой собственный.

    @@ -322,8 +322,8 @@ -

    Нажмите на ссылку Дополнительные параметры, расположенную на правой боковой панели, чтобы открыть окно Спарклайн - Дополнительные параметры.

    -

    Окно Спарклайн - Дополнительные параметры

    +

    Нажмите на ссылку Дополнительные параметры, расположенную на правой боковой панели, чтобы открыть окно Спарклайн - дополнительные параметры.

    +

    Окно Спарклайн - дополнительные параметры

    На вкладке Тип и данные можно изменить Тип и Стиль спарклайна, а также указать параметры отображения для Скрытых и пустых ячеек:

    • @@ -336,7 +336,7 @@
    • Показывать данные в скрытых строках и столбцах - установите этот флажок, если в спарклайны требуется включать значения из скрытых ячеек.
    -

    Окно Спарклайн - Дополнительные параметры

    +

    Окно Спарклайн - дополнительные параметры

    На вкладке Параметры оси можно задать следующие параметры Горизонтальной/Вертикальной оси:

    • diff --git a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertImages.htm b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertImages.htm index 90bf8f635..0f5b732d3 100644 --- a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertImages.htm +++ b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertImages.htm @@ -44,7 +44,7 @@

      Выбранное изображение будет заменено.

      Чтобы изменить дополнительные параметры изображения, щелкните по нему правой кнопкой мыши и выберите из контекстного меню пункт Дополнительные параметры изображения. Или нажмите ссылку Дополнительные параметры на правой боковой панели. Откроется окно свойств изображения:

      -

      Изображение - Дополнительные параметры

      +

      Изображение - дополнительные параметры

      Вкладка Альтернативный текст позволяет задать Заголовок и Описание, которые будут зачитываться для людей с нарушениями зрения или когнитивными нарушениями, чтобы помочь им лучше понять, какую информацию содержит изображение.

      Чтобы удалить вставленное изображение, щелкните по нему и нажмите клавишу Delete.

      diff --git a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertTextObjects.htm b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertTextObjects.htm index 8b71d89ba..754b6cfdb 100644 --- a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertTextObjects.htm +++ b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertTextObjects.htm @@ -35,7 +35,7 @@
    • чтобы изменить размер текстового поля, переместить, повернуть его, используйте специальные маркеры по краям фигуры.
    • чтобы изменить заливку, обводку, заменить прямоугольное поле на какую-то другую фигуру или открыть дополнительные параметры фигуры, щелкните по значку Параметры фигуры Значок Параметры фигуры на правой боковой панели и используйте соответствующие опции.
    • чтобы расположить текстовые поля в определенном порядке относительно других объектов, щелкните правой кнопкой мыши по границе текстового поля и используйте опции контекстного меню.
    • -
    • чтобы создать колонки текста внутри текстового поля, щелкните правой кнопкой мыши по границе текстового поля, нажмите на пункт меню Дополнительные параметры фигуры и перейдите на вкладку Колонки в окне Фигура - Дополнительные параметры.
    • +
    • чтобы создать колонки текста внутри текстового поля, щелкните правой кнопкой мыши по границе текстового поля, нажмите на пункт меню Дополнительные параметры фигуры и перейдите на вкладку Колонки в окне Фигура - дополнительные параметры.

    Форматирование текста внутри текстового поля

    Щелкните по тексту внутри текстового поля, чтобы можно было изменить его свойства. Когда текст выделен, границы текстового поля отображаются как пунктирные линии.

    diff --git a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/SavePrintDownload.htm b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/SavePrintDownload.htm index c445a308e..d033d8e5e 100644 --- a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/SavePrintDownload.htm +++ b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/SavePrintDownload.htm @@ -1,7 +1,7 @@  - Сохранение / печать / загрузка таблицы + Сохранение / печать / скачивание таблицы @@ -9,7 +9,7 @@
    -

    Сохранение / печать / загрузка таблицы

    +

    Сохранение / печать / скачивание таблицы

    По умолчанию онлайн-редактор электронных таблиц автоматически сохраняет файл каждые 2 секунды, когда вы работаете над ним, чтобы не допустить потери данных в случае непредвиденного закрытия программы. Если вы совместно редактируете файл в Быстром режиме, таймер запрашивает наличие изменений 25 раз в секунду и сохраняет их, если они были внесены. При совместном редактировании файла в Строгом режиме изменения автоматически сохраняются каждые 10 минут. При необходимости можно легко выбрать предпочтительный режим совместного редактирования или отключить функцию автоматического сохранения на странице Дополнительные параметры.

    Чтобы сохранить текущую электронную таблицу вручную:

    -
    +
    From d16069f7f1e188efdba4febb898598a2d4d7009c Mon Sep 17 00:00:00 2001 From: alexandervnuchkov Date: Fri, 12 Jan 2018 17:52:45 +0300 Subject: [PATCH 78/86] Added search to the documentation for all editors --- .../main/resources/help/editor.css | 132 + .../main/resources/help/en/Contents.json | 73 +- .../resources/help/en/HelpfulHints/About.htm | 5 + .../help/en/HelpfulHints/AdvancedSettings.htm | 5 + .../en/HelpfulHints/CollaborativeEditing.htm | 8 +- .../en/HelpfulHints/KeyboardShortcuts.htm | 4 + .../help/en/HelpfulHints/Navigation.htm | 5 + .../resources/help/en/HelpfulHints/Review.htm | 9 +- .../resources/help/en/HelpfulHints/Search.htm | 5 + .../help/en/HelpfulHints/SpellChecking.htm | 5 + .../help/en/HelpfulHints/SupportedFormats.htm | 5 + .../help/en/ProgramInterface/FileTab.htm | 31 + .../help/en/ProgramInterface/HomeTab.htm | 37 + .../help/en/ProgramInterface/InsertTab.htm | 29 + .../help/en/ProgramInterface/LayoutTab.htm | 29 + .../help/en/ProgramInterface/PluginsTab.htm | 32 + .../en/ProgramInterface/ProgramInterface.htm | 39 + .../help/en/ProgramInterface/ReviewTab.htm | 29 + .../help/en/UsageInstructions/AddBorders.htm | 5 + .../en/UsageInstructions/AddHyperlinks.htm | 4 + .../UsageInstructions/AlignArrangeObjects.htm | 5 + .../help/en/UsageInstructions/AlignText.htm | 5 + .../en/UsageInstructions/BackgroundColor.htm | 4 + .../UsageInstructions/ChangeColorScheme.htm | 4 + .../UsageInstructions/ChangeWrappingStyle.htm | 5 + .../UsageInstructions/CopyClearFormatting.htm | 4 + .../UsageInstructions/CopyPasteUndoRedo.htm | 5 + .../help/en/UsageInstructions/CreateLists.htm | 4 + .../en/UsageInstructions/DecorationStyles.htm | 4 + .../UsageInstructions/FontTypeSizeColor.htm | 4 + .../UsageInstructions/FormattingPresets.htm | 5 + .../en/UsageInstructions/InsertAutoshapes.htm | 4 + .../en/UsageInstructions/InsertCharts.htm | 4 + .../en/UsageInstructions/InsertDropCap.htm | 5 + .../en/UsageInstructions/InsertEquation.htm | 5 + .../en/UsageInstructions/InsertFootnotes.htm | 4 + .../InsertHeadersFooters.htm | 4 + .../en/UsageInstructions/InsertImages.htm | 5 + .../UsageInstructions/InsertPageNumbers.htm | 4 + .../InsertRichTextContentControls.htm | 4 + .../en/UsageInstructions/InsertTables.htm | 5 + .../UsageInstructions/InsertTextObjects.htm | 4 + .../help/en/UsageInstructions/LineSpacing.htm | 5 + .../NonprintingCharacters.htm | 5 + .../en/UsageInstructions/OpenCreateNew.htm | 5 + .../help/en/UsageInstructions/PageBreaks.htm | 5 + .../en/UsageInstructions/ParagraphIndents.htm | 5 + .../UsageInstructions/SavePrintDownload.htm | 4 + .../en/UsageInstructions/SectionBreaks.htm | 4 + .../UsageInstructions/SetPageParameters.htm | 12 +- .../help/en/UsageInstructions/SetTabStops.htm | 5 + .../en/UsageInstructions/UseMailMerge.htm | 5 + .../help/en/UsageInstructions/ViewDocInfo.htm | 5 + .../main/resources/help/en/callback.js | 32 - .../main/resources/help/en/editor.css | 35 +- .../help/en/images/interface/editorwindow.png | Bin 0 -> 92208 bytes .../help/en/images/interface/filetab.png | Bin 0 -> 32655 bytes .../help/en/images/interface/hometab.png | Bin 0 -> 15799 bytes .../help/en/images/interface/inserttab.png | Bin 0 -> 15731 bytes .../help/en/images/interface/layouttab.png | Bin 0 -> 13948 bytes .../help/en/images/interface/leftpart.png | Bin 0 -> 1129 bytes .../help/en/images/interface/pluginstab.png | Bin 0 -> 14158 bytes .../help/en/images/interface/reviewtab.png | Bin 0 -> 14715 bytes .../help/en/images/interface/rightpart.png | Bin 0 -> 468 bytes .../help/en/images/versionhistory.png | Bin 3285 -> 3085 bytes .../main/resources/help/en/search/indexes.js | 253 ++ .../resources/help/en/search/js/jquery.min.js | 6 + .../en/search/js/lunr-languages/lunr.multi.js | 75 + .../js/lunr-languages/lunr.stemmer.support.js | 304 ++ .../main/resources/help/en/search/js/lunr.js | 2977 +++++++++++++++++ .../help/en/search/js/page-search.js | 5 + .../main/resources/help/en/search/search.html | 234 ++ .../main/resources/help/ru/Contents.json | 73 +- .../resources/help/ru/HelpfulHints/About.htm | 3 +- .../help/ru/HelpfulHints/AdvancedSettings.htm | 1 + .../ru/HelpfulHints/CollaborativeEditing.htm | 4 +- .../help/ru/HelpfulHints/Navigation.htm | 3 +- .../resources/help/ru/HelpfulHints/Review.htm | 5 +- .../resources/help/ru/HelpfulHints/Search.htm | 3 +- .../help/ru/HelpfulHints/SpellChecking.htm | 1 + .../help/ru/HelpfulHints/SupportedFormats.htm | 3 +- .../help/ru/ProgramInterface/FileTab.htm | 31 + .../help/ru/ProgramInterface/HomeTab.htm | 37 + .../help/ru/ProgramInterface/InsertTab.htm | 29 + .../help/ru/ProgramInterface/LayoutTab.htm | 29 + .../help/ru/ProgramInterface/PluginsTab.htm | 32 + .../ru/ProgramInterface/ProgramInterface.htm | 39 + .../help/ru/ProgramInterface/ReviewTab.htm | 29 + .../help/ru/UsageInstructions/AddBorders.htm | 11 +- .../ru/UsageInstructions/AddHyperlinks.htm | 6 +- .../UsageInstructions/AlignArrangeObjects.htm | 7 +- .../help/ru/UsageInstructions/AlignText.htm | 9 +- .../ru/UsageInstructions/BackgroundColor.htm | 10 +- .../UsageInstructions/ChangeColorScheme.htm | 6 +- .../UsageInstructions/ChangeWrappingStyle.htm | 11 +- .../UsageInstructions/CopyClearFormatting.htm | 6 +- .../UsageInstructions/CopyPasteUndoRedo.htm | 9 +- .../help/ru/UsageInstructions/CreateLists.htm | 6 +- .../ru/UsageInstructions/DecorationStyles.htm | 8 +- .../UsageInstructions/FontTypeSizeColor.htm | 6 +- .../UsageInstructions/FormattingPresets.htm | 7 +- .../ru/UsageInstructions/InsertAutoshapes.htm | 22 +- .../ru/UsageInstructions/InsertCharts.htm | 28 +- .../ru/UsageInstructions/InsertDropCap.htm | 9 +- .../ru/UsageInstructions/InsertEquation.htm | 7 +- .../ru/UsageInstructions/InsertFootnotes.htm | 6 +- .../InsertHeadersFooters.htm | 6 +- .../ru/UsageInstructions/InsertImages.htm | 17 +- .../UsageInstructions/InsertPageNumbers.htm | 6 +- .../InsertRichTextContentControls.htm | 6 +- .../ru/UsageInstructions/InsertTables.htm | 25 +- .../UsageInstructions/InsertTextObjects.htm | 6 +- .../help/ru/UsageInstructions/LineSpacing.htm | 7 +- .../NonprintingCharacters.htm | 7 +- .../ru/UsageInstructions/OpenCreateNew.htm | 9 +- .../help/ru/UsageInstructions/PageBreaks.htm | 13 +- .../ru/UsageInstructions/ParagraphIndents.htm | 11 +- .../UsageInstructions/SavePrintDownload.htm | 10 +- .../ru/UsageInstructions/SectionBreaks.htm | 6 +- .../UsageInstructions/SetPageParameters.htm | 14 +- .../help/ru/UsageInstructions/SetTabStops.htm | 9 +- .../ru/UsageInstructions/UseMailMerge.htm | 1 + .../help/ru/UsageInstructions/ViewDocInfo.htm | 32 +- .../main/resources/help/ru/callback.js | 32 - .../main/resources/help/ru/editor.css | 5 +- .../help/ru/images/interface/editorwindow.png | Bin 0 -> 90205 bytes .../help/ru/images/interface/filetab.png | Bin 0 -> 35632 bytes .../help/ru/images/interface/hometab.png | Bin 0 -> 17084 bytes .../help/ru/images/interface/inserttab.png | Bin 0 -> 17139 bytes .../help/ru/images/interface/layouttab.png | Bin 0 -> 14379 bytes .../help/ru/images/interface/leftpart.png | Bin 0 -> 1129 bytes .../help/ru/images/interface/pluginstab.png | Bin 0 -> 14774 bytes .../help/ru/images/interface/reviewtab.png | Bin 0 -> 15966 bytes .../help/ru/images/interface/rightpart.png | Bin 0 -> 468 bytes .../main/resources/help/ru/search/indexes.js | 471 +-- .../main/resources/help/en/Contents.json | 49 +- .../resources/help/en/HelpfulHints/About.htm | 5 + .../help/en/HelpfulHints/AdvancedSettings.htm | 5 + .../en/HelpfulHints/CollaborativeEditing.htm | 4 + .../en/HelpfulHints/KeyboardShortcuts.htm | 4 + .../help/en/HelpfulHints/Navigation.htm | 5 + .../resources/help/en/HelpfulHints/Search.htm | 5 + .../help/en/HelpfulHints/SpellChecking.htm | 5 + .../help/en/HelpfulHints/SupportedFormats.htm | 5 + .../help/en/ProgramInterface/FileTab.htm | 30 + .../help/en/ProgramInterface/HomeTab.htm | 31 + .../help/en/ProgramInterface/InsertTab.htm | 28 + .../help/en/ProgramInterface/PluginsTab.htm | 30 + .../en/ProgramInterface/ProgramInterface.htm | 39 + .../en/UsageInstructions/AddHyperlinks.htm | 4 + .../UsageInstructions/AlignArrangeObjects.htm | 5 + .../en/UsageInstructions/ApplyTransitions.htm | 5 + .../UsageInstructions/CopyClearFormatting.htm | 4 + .../UsageInstructions/CopyPasteUndoRedo.htm | 5 + .../help/en/UsageInstructions/CreateLists.htm | 5 + .../FillObjectsSelectColor.htm | 5 + .../en/UsageInstructions/InsertAutoshapes.htm | 4 + .../en/UsageInstructions/InsertCharts.htm | 4 + .../en/UsageInstructions/InsertEquation.htm | 5 + .../en/UsageInstructions/InsertImages.htm | 4 + .../en/UsageInstructions/InsertTables.htm | 4 + .../help/en/UsageInstructions/InsertText.htm | 4 + .../en/UsageInstructions/ManageSlides.htm | 4 + .../UsageInstructions/ManipulateObjects.htm | 5 + .../en/UsageInstructions/OpenCreateNew.htm | 5 + .../UsageInstructions/PreviewPresentation.htm | 4 + .../UsageInstructions/SavePrintDownload.htm | 4 + .../UsageInstructions/SetSlideParameters.htm | 4 + .../ViewPresentationInfo.htm | 5 + .../main/resources/help/en/callback.js | 32 - .../main/resources/help/en/editor.css | 29 +- .../help/en/images/interface/editorwindow.png | Bin 0 -> 494318 bytes .../help/en/images/interface/filetab.png | Bin 0 -> 27096 bytes .../help/en/images/interface/hometab.png | Bin 0 -> 24085 bytes .../help/en/images/interface/inserttab.png | Bin 0 -> 13054 bytes .../help/en/images/interface/leftpart.png | Bin 0 -> 1915 bytes .../help/en/images/interface/pluginstab.png | Bin 0 -> 12579 bytes .../help/en/images/interface/rightpart.png | Bin 0 -> 448 bytes .../resources/help/en/images/split_cells.png | Bin 3359 -> 3816 bytes .../main/resources/help/en/search/indexes.js | 168 + .../resources/help/en/search/js/jquery.min.js | 6 + .../en/search/js/lunr-languages/lunr.multi.js | 75 + .../js/lunr-languages/lunr.stemmer.support.js | 304 ++ .../main/resources/help/en/search/js/lunr.js | 2977 +++++++++++++++++ .../help/en/search/js/page-search.js | 5 + .../main/resources/help/en/search/search.html | 234 ++ .../main/resources/help/ru/Contents.json | 45 +- .../resources/help/ru/HelpfulHints/About.htm | 5 + .../help/ru/HelpfulHints/AdvancedSettings.htm | 5 + .../ru/HelpfulHints/CollaborativeEditing.htm | 4 + .../ru/HelpfulHints/KeyboardShortcuts.htm | 4 + .../help/ru/HelpfulHints/Navigation.htm | 5 + .../resources/help/ru/HelpfulHints/Search.htm | 5 + .../help/ru/HelpfulHints/SpellChecking.htm | 5 + .../help/ru/HelpfulHints/SupportedFormats.htm | 5 + .../help/ru/ProgramInterface/FileTab.htm | 30 + .../help/ru/ProgramInterface/HomeTab.htm | 31 + .../help/ru/ProgramInterface/InsertTab.htm | 28 + .../help/ru/ProgramInterface/PluginsTab.htm | 30 + .../ru/ProgramInterface/ProgramInterface.htm | 39 + .../ru/UsageInstructions/AddHyperlinks.htm | 4 + .../UsageInstructions/AlignArrangeObjects.htm | 5 + .../ru/UsageInstructions/ApplyTransitions.htm | 5 + .../UsageInstructions/CopyClearFormatting.htm | 4 + .../UsageInstructions/CopyPasteUndoRedo.htm | 5 + .../help/ru/UsageInstructions/CreateLists.htm | 5 + .../FillObjectsSelectColor.htm | 5 + .../ru/UsageInstructions/InsertAutoshapes.htm | 4 + .../ru/UsageInstructions/InsertCharts.htm | 6 +- .../ru/UsageInstructions/InsertEquation.htm | 5 + .../ru/UsageInstructions/InsertImages.htm | 4 + .../ru/UsageInstructions/InsertTables.htm | 4 + .../help/ru/UsageInstructions/InsertText.htm | 6 +- .../ru/UsageInstructions/ManageSlides.htm | 4 + .../UsageInstructions/ManipulateObjects.htm | 5 + .../ru/UsageInstructions/OpenCreateNew.htm | 5 + .../UsageInstructions/PreviewPresentation.htm | 4 + .../UsageInstructions/SavePrintDownload.htm | 8 +- .../UsageInstructions/SetSlideParameters.htm | 4 + .../ViewPresentationInfo.htm | 5 + .../main/resources/help/ru/callback.js | 32 - .../main/resources/help/ru/editor.css | 29 +- .../help/ru/images/interface/editorwindow.png | Bin 0 -> 495072 bytes .../help/ru/images/interface/filetab.png | Bin 0 -> 29849 bytes .../help/ru/images/interface/hometab.png | Bin 0 -> 23328 bytes .../help/ru/images/interface/inserttab.png | Bin 0 -> 14359 bytes .../help/ru/images/interface/leftpart.png | Bin 0 -> 2174 bytes .../help/ru/images/interface/pluginstab.png | Bin 0 -> 13284 bytes .../help/ru/images/interface/rightpart.png | Bin 0 -> 448 bytes .../main/resources/help/ru/search/indexes.js | 168 + .../resources/help/ru/search/js/jquery.min.js | 6 + .../ru/search/js/lunr-languages/lunr.multi.js | 75 + .../ru/search/js/lunr-languages/lunr.ru.js | 391 +++ .../js/lunr-languages/lunr.stemmer.support.js | 304 ++ .../main/resources/help/ru/search/js/lunr.js | 2977 +++++++++++++++++ .../help/ru/search/js/page-search.js | 5 + .../main/resources/help/ru/search/search.html | 235 ++ .../main/resources/help/en/Contents.json | 61 +- .../main/resources/help/en/Functions/abs.htm | 5 + .../resources/help/en/Functions/accrint.htm | 5 + .../resources/help/en/Functions/accrintm.htm | 5 + .../main/resources/help/en/Functions/acos.htm | 5 + .../resources/help/en/Functions/acosh.htm | 5 + .../main/resources/help/en/Functions/acot.htm | 5 + .../resources/help/en/Functions/acoth.htm | 5 + .../resources/help/en/Functions/address.htm | 5 + .../resources/help/en/Functions/aggregate.htm | 5 + .../resources/help/en/Functions/amordegrc.htm | 5 + .../resources/help/en/Functions/amorintm.htm | 5 + .../resources/help/en/Functions/amorlinc.htm | 5 + .../main/resources/help/en/Functions/and.htm | 5 + .../resources/help/en/Functions/arabic.htm | 5 + .../main/resources/help/en/Functions/asin.htm | 5 + .../resources/help/en/Functions/asinh.htm | 5 + .../main/resources/help/en/Functions/atan.htm | 5 + .../resources/help/en/Functions/atan2.htm | 5 + .../resources/help/en/Functions/atanh.htm | 5 + .../resources/help/en/Functions/avedev.htm | 5 + .../resources/help/en/Functions/average.htm | 5 + .../resources/help/en/Functions/averagea.htm | 5 + .../resources/help/en/Functions/averageif.htm | 5 + .../help/en/Functions/averageifs.htm | 5 + .../main/resources/help/en/Functions/base.htm | 5 + .../resources/help/en/Functions/besseli.htm | 5 + .../resources/help/en/Functions/besselj.htm | 5 + .../resources/help/en/Functions/besselk.htm | 5 + .../resources/help/en/Functions/bessely.htm | 5 + .../resources/help/en/Functions/beta-dist.htm | 5 + .../resources/help/en/Functions/beta-inv.htm | 5 + .../resources/help/en/Functions/betadist.htm | 5 + .../resources/help/en/Functions/bin2dec.htm | 5 + .../resources/help/en/Functions/bin2hex.htm | 5 + .../resources/help/en/Functions/bin2oct.htm | 5 + .../help/en/Functions/binom-dist-range.htm | 5 + .../help/en/Functions/binom-dist.htm | 5 + .../resources/help/en/Functions/binom-inv.htm | 5 + .../resources/help/en/Functions/binomdist.htm | 5 + .../resources/help/en/Functions/bitand.htm | 5 + .../resources/help/en/Functions/bitlshift.htm | 5 + .../resources/help/en/Functions/bitor.htm | 5 + .../resources/help/en/Functions/bitrshift.htm | 5 + .../resources/help/en/Functions/bitxor.htm | 5 + .../resources/help/en/Functions/ceiling.htm | 5 + .../help/en/Functions/ceilingmath.htm | 5 + .../help/en/Functions/ceilingprecise.htm | 5 + .../main/resources/help/en/Functions/char.htm | 5 + .../resources/help/en/Functions/chidist.htm | 5 + .../resources/help/en/Functions/chiinv.htm | 5 + .../help/en/Functions/chisq-dist-rt.htm | 5 + .../help/en/Functions/chisq-dist.htm | 5 + .../help/en/Functions/chisq-inv-rt.htm | 5 + .../resources/help/en/Functions/chisq-inv.htm | 5 + .../help/en/Functions/chisq-test.htm | 5 + .../resources/help/en/Functions/chitest.htm | 5 + .../resources/help/en/Functions/choose.htm | 5 + .../resources/help/en/Functions/clean.htm | 5 + .../main/resources/help/en/Functions/code.htm | 5 + .../resources/help/en/Functions/column.htm | 5 + .../resources/help/en/Functions/columns.htm | 5 + .../resources/help/en/Functions/combin.htm | 5 + .../resources/help/en/Functions/combina.htm | 5 + .../resources/help/en/Functions/complex.htm | 5 + .../resources/help/en/Functions/concat.htm | 5 + .../help/en/Functions/concatenate.htm | 5 + .../help/en/Functions/confidence-norm.htm | 5 + .../help/en/Functions/confidence-t.htm | 5 + .../help/en/Functions/confidence.htm | 5 + .../resources/help/en/Functions/correl.htm | 5 + .../main/resources/help/en/Functions/cos.htm | 5 + .../main/resources/help/en/Functions/cosh.htm | 5 + .../main/resources/help/en/Functions/cot.htm | 5 + .../main/resources/help/en/Functions/coth.htm | 5 + .../resources/help/en/Functions/count.htm | 5 + .../resources/help/en/Functions/counta.htm | 5 + .../help/en/Functions/countblank.htm | 5 + .../resources/help/en/Functions/countif.htm | 5 + .../resources/help/en/Functions/countifs.htm | 5 + .../resources/help/en/Functions/coupdaybs.htm | 5 + .../resources/help/en/Functions/coupdays.htm | 5 + .../help/en/Functions/coupdaysnc.htm | 5 + .../resources/help/en/Functions/coupncd.htm | 5 + .../resources/help/en/Functions/coupnum.htm | 5 + .../resources/help/en/Functions/couppcd.htm | 5 + .../resources/help/en/Functions/covar.htm | 5 + .../help/en/Functions/covariance-p.htm | 5 + .../help/en/Functions/covariance-s.htm | 5 + .../resources/help/en/Functions/critbinom.htm | 5 + .../main/resources/help/en/Functions/csc.htm | 5 + .../main/resources/help/en/Functions/csch.htm | 5 + .../resources/help/en/Functions/cumipmt.htm | 5 + .../resources/help/en/Functions/cumprinc.htm | 5 + .../main/resources/help/en/Functions/date.htm | 5 + .../resources/help/en/Functions/datedif.htm | 5 + .../resources/help/en/Functions/datevalue.htm | 5 + .../resources/help/en/Functions/daverage.htm | 5 + .../main/resources/help/en/Functions/day.htm | 5 + .../main/resources/help/en/Functions/days.htm | 5 + .../resources/help/en/Functions/days360.htm | 5 + .../main/resources/help/en/Functions/db.htm | 5 + .../resources/help/en/Functions/dcount.htm | 5 + .../resources/help/en/Functions/dcounta.htm | 5 + .../main/resources/help/en/Functions/ddb.htm | 5 + .../resources/help/en/Functions/dec2bin.htm | 5 + .../resources/help/en/Functions/dec2hex.htm | 5 + .../resources/help/en/Functions/dec2oct.htm | 5 + .../resources/help/en/Functions/decimal.htm | 5 + .../resources/help/en/Functions/degrees.htm | 5 + .../resources/help/en/Functions/delta.htm | 5 + .../resources/help/en/Functions/devsq.htm | 5 + .../main/resources/help/en/Functions/dget.htm | 5 + .../main/resources/help/en/Functions/disc.htm | 5 + .../main/resources/help/en/Functions/dmax.htm | 5 + .../main/resources/help/en/Functions/dmin.htm | 5 + .../resources/help/en/Functions/dollar.htm | 5 + .../resources/help/en/Functions/dollarde.htm | 5 + .../resources/help/en/Functions/dollarfr.htm | 5 + .../resources/help/en/Functions/dproduct.htm | 5 + .../resources/help/en/Functions/dstdev.htm | 5 + .../resources/help/en/Functions/dstdevp.htm | 5 + .../main/resources/help/en/Functions/dsum.htm | 5 + .../resources/help/en/Functions/duration.htm | 5 + .../main/resources/help/en/Functions/dvar.htm | 5 + .../resources/help/en/Functions/dvarp.htm | 5 + .../help/en/Functions/ecma-ceiling.htm | 5 + .../resources/help/en/Functions/edate.htm | 4 + .../resources/help/en/Functions/effect.htm | 5 + .../resources/help/en/Functions/eomonth.htm | 4 + .../help/en/Functions/erf-precise.htm | 5 + .../main/resources/help/en/Functions/erf.htm | 5 + .../help/en/Functions/erfc-precise.htm | 5 + .../main/resources/help/en/Functions/erfc.htm | 5 + .../help/en/Functions/error.type.htm | 5 + .../main/resources/help/en/Functions/even.htm | 5 + .../resources/help/en/Functions/exact.htm | 5 + .../main/resources/help/en/Functions/exp.htm | 5 + .../help/en/Functions/expon-dist.htm | 5 + .../resources/help/en/Functions/expondist.htm | 5 + .../resources/help/en/Functions/f-dist-rt.htm | 5 + .../resources/help/en/Functions/f-dist.htm | 5 + .../resources/help/en/Functions/f-inv-rt.htm | 5 + .../resources/help/en/Functions/f-inv.htm | 5 + .../main/resources/help/en/Functions/fact.htm | 5 + .../help/en/Functions/factdouble.htm | 5 + .../resources/help/en/Functions/false.htm | 5 + .../resources/help/en/Functions/fdist.htm | 5 + .../main/resources/help/en/Functions/find.htm | 5 + .../main/resources/help/en/Functions/finv.htm | 5 + .../resources/help/en/Functions/fisher.htm | 5 + .../resources/help/en/Functions/fisherinv.htm | 5 + .../resources/help/en/Functions/fixed.htm | 5 + .../resources/help/en/Functions/floor.htm | 5 + .../resources/help/en/Functions/floormath.htm | 5 + .../help/en/Functions/floorprecise.htm | 5 + .../help/en/Functions/forecast-linear.htm | 5 + .../resources/help/en/Functions/forecast.htm | 5 + .../resources/help/en/Functions/frequency.htm | 5 + .../main/resources/help/en/Functions/fv.htm | 5 + .../help/en/Functions/fvschedule.htm | 5 + .../help/en/Functions/gamma-dist.htm | 5 + .../resources/help/en/Functions/gamma-inv.htm | 5 + .../resources/help/en/Functions/gamma.htm | 5 + .../resources/help/en/Functions/gammadist.htm | 5 + .../resources/help/en/Functions/gammainv.htm | 5 + .../help/en/Functions/gammaln-precise.htm | 5 + .../resources/help/en/Functions/gammaln.htm | 5 + .../resources/help/en/Functions/gauss.htm | 5 + .../main/resources/help/en/Functions/gcd.htm | 5 + .../resources/help/en/Functions/geomean.htm | 5 + .../resources/help/en/Functions/gestep.htm | 5 + .../resources/help/en/Functions/harmean.htm | 5 + .../resources/help/en/Functions/hex2bin.htm | 5 + .../resources/help/en/Functions/hex2dec.htm | 5 + .../resources/help/en/Functions/hex2oct.htm | 5 + .../resources/help/en/Functions/hlookup.htm | 5 + .../main/resources/help/en/Functions/hour.htm | 5 + .../help/en/Functions/hypgeomdist.htm | 5 + .../main/resources/help/en/Functions/if.htm | 5 + .../resources/help/en/Functions/iferror.htm | 5 + .../main/resources/help/en/Functions/ifna.htm | 5 + .../resources/help/en/Functions/imabs.htm | 5 + .../resources/help/en/Functions/imaginary.htm | 5 + .../help/en/Functions/imargument.htm | 5 + .../help/en/Functions/imconjugate.htm | 5 + .../resources/help/en/Functions/imcos.htm | 5 + .../resources/help/en/Functions/imcosh.htm | 5 + .../resources/help/en/Functions/imcot.htm | 5 + .../resources/help/en/Functions/imcsc.htm | 5 + .../resources/help/en/Functions/imcsch.htm | 5 + .../resources/help/en/Functions/imdiv.htm | 5 + .../resources/help/en/Functions/imexp.htm | 5 + .../main/resources/help/en/Functions/imln.htm | 5 + .../resources/help/en/Functions/imlog10.htm | 5 + .../resources/help/en/Functions/imlog2.htm | 5 + .../resources/help/en/Functions/impower.htm | 5 + .../resources/help/en/Functions/improduct.htm | 5 + .../resources/help/en/Functions/imreal.htm | 5 + .../resources/help/en/Functions/imsec.htm | 5 + .../resources/help/en/Functions/imsech.htm | 5 + .../resources/help/en/Functions/imsin.htm | 5 + .../resources/help/en/Functions/imsinh.htm | 5 + .../resources/help/en/Functions/imsqrt.htm | 5 + .../resources/help/en/Functions/imsub.htm | 5 + .../resources/help/en/Functions/imsum.htm | 5 + .../resources/help/en/Functions/imtan.htm | 5 + .../resources/help/en/Functions/index.htm | 5 + .../resources/help/en/Functions/indirect.htm | 5 + .../main/resources/help/en/Functions/int.htm | 5 + .../resources/help/en/Functions/intercept.htm | 5 + .../resources/help/en/Functions/intrate.htm | 5 + .../main/resources/help/en/Functions/ipmt.htm | 5 + .../main/resources/help/en/Functions/irr.htm | 5 + .../resources/help/en/Functions/isblank.htm | 5 + .../resources/help/en/Functions/iserr.htm | 5 + .../resources/help/en/Functions/iserror.htm | 5 + .../resources/help/en/Functions/iseven.htm | 5 + .../resources/help/en/Functions/isformula.htm | 5 + .../resources/help/en/Functions/islogical.htm | 5 + .../main/resources/help/en/Functions/isna.htm | 5 + .../resources/help/en/Functions/isnontext.htm | 5 + .../resources/help/en/Functions/isnumber.htm | 5 + .../help/en/Functions/isoceiling.htm | 5 + .../resources/help/en/Functions/isodd.htm | 5 + .../help/en/Functions/isoweeknum.htm | 4 + .../resources/help/en/Functions/ispmt.htm | 5 + .../resources/help/en/Functions/isref.htm | 5 + .../resources/help/en/Functions/istext.htm | 5 + .../main/resources/help/en/Functions/kurt.htm | 5 + .../resources/help/en/Functions/large.htm | 5 + .../main/resources/help/en/Functions/lcm.htm | 5 + .../main/resources/help/en/Functions/left.htm | 5 + .../main/resources/help/en/Functions/len.htm | 5 + .../main/resources/help/en/Functions/ln.htm | 5 + .../main/resources/help/en/Functions/log.htm | 5 + .../resources/help/en/Functions/log10.htm | 5 + .../resources/help/en/Functions/loginv.htm | 5 + .../help/en/Functions/lognorm-dist.htm | 5 + .../help/en/Functions/lognorm-inv.htm | 5 + .../help/en/Functions/lognormdist.htm | 5 + .../resources/help/en/Functions/lookup.htm | 5 + .../resources/help/en/Functions/lower.htm | 5 + .../resources/help/en/Functions/match.htm | 5 + .../main/resources/help/en/Functions/max.htm | 5 + .../main/resources/help/en/Functions/maxa.htm | 5 + .../resources/help/en/Functions/maxifs.htm | 5 + .../resources/help/en/Functions/mdeterm.htm | 5 + .../resources/help/en/Functions/mduration.htm | 5 + .../resources/help/en/Functions/median.htm | 5 + .../main/resources/help/en/Functions/mid.htm | 5 + .../main/resources/help/en/Functions/min.htm | 5 + .../main/resources/help/en/Functions/mina.htm | 5 + .../resources/help/en/Functions/minifs.htm | 5 + .../resources/help/en/Functions/minute.htm | 5 + .../resources/help/en/Functions/minverse.htm | 5 + .../main/resources/help/en/Functions/mirr.htm | 5 + .../resources/help/en/Functions/mmult.htm | 5 + .../main/resources/help/en/Functions/mod.htm | 5 + .../resources/help/en/Functions/mode-mult.htm | 5 + .../resources/help/en/Functions/mode-sngl.htm | 5 + .../main/resources/help/en/Functions/mode.htm | 5 + .../resources/help/en/Functions/month.htm | 5 + .../resources/help/en/Functions/mround.htm | 5 + .../help/en/Functions/multinomial.htm | 5 + .../main/resources/help/en/Functions/n.htm | 5 + .../main/resources/help/en/Functions/na.htm | 5 + .../help/en/Functions/negbinom-dist.htm | 5 + .../help/en/Functions/negbinomdist.htm | 5 + .../help/en/Functions/networkdays-intl.htm | 4 + .../help/en/Functions/networkdays.htm | 4 + .../resources/help/en/Functions/nominal.htm | 5 + .../resources/help/en/Functions/norm-dist.htm | 5 + .../resources/help/en/Functions/norm-inv.htm | 5 + .../help/en/Functions/norm-s-dist.htm | 5 + .../help/en/Functions/norm-s-inv.htm | 5 + .../resources/help/en/Functions/normdist.htm | 5 + .../resources/help/en/Functions/norminv.htm | 5 + .../resources/help/en/Functions/normsdist.htm | 5 + .../resources/help/en/Functions/normsinv.htm | 5 + .../main/resources/help/en/Functions/not.htm | 5 + .../main/resources/help/en/Functions/now.htm | 5 + .../main/resources/help/en/Functions/nper.htm | 5 + .../main/resources/help/en/Functions/npv.htm | 5 + .../help/en/Functions/numbervalue.htm | 5 + .../resources/help/en/Functions/oct2bin.htm | 5 + .../resources/help/en/Functions/oct2dec.htm | 5 + .../resources/help/en/Functions/oct2hex.htm | 5 + .../main/resources/help/en/Functions/odd.htm | 5 + .../resources/help/en/Functions/oddfprice.htm | 5 + .../resources/help/en/Functions/oddfyield.htm | 5 + .../resources/help/en/Functions/oddlprice.htm | 5 + .../resources/help/en/Functions/oddlyield.htm | 5 + .../resources/help/en/Functions/offset.htm | 5 + .../main/resources/help/en/Functions/or.htm | 5 + .../resources/help/en/Functions/pearson.htm | 5 + .../help/en/Functions/percentile-exc.htm | 5 + .../help/en/Functions/percentile-inc.htm | 5 + .../help/en/Functions/percentile.htm | 5 + .../help/en/Functions/percentrank-exc.htm | 5 + .../help/en/Functions/percentrank-inc.htm | 5 + .../help/en/Functions/percentrank.htm | 5 + .../resources/help/en/Functions/permut.htm | 5 + .../help/en/Functions/permutationa.htm | 5 + .../main/resources/help/en/Functions/phi.htm | 5 + .../main/resources/help/en/Functions/pi.htm | 5 + .../main/resources/help/en/Functions/pmt.htm | 5 + .../help/en/Functions/poisson-dist.htm | 5 + .../resources/help/en/Functions/poisson.htm | 5 + .../resources/help/en/Functions/power.htm | 5 + .../main/resources/help/en/Functions/ppmt.htm | 5 + .../resources/help/en/Functions/price.htm | 5 + .../resources/help/en/Functions/pricedisc.htm | 5 + .../resources/help/en/Functions/pricemat.htm | 5 + .../main/resources/help/en/Functions/prob.htm | 5 + .../resources/help/en/Functions/product.htm | 5 + .../resources/help/en/Functions/proper.htm | 5 + .../main/resources/help/en/Functions/pv.htm | 5 + .../help/en/Functions/quartile-exc.htm | 5 + .../help/en/Functions/quartile-inc.htm | 5 + .../resources/help/en/Functions/quartile.htm | 5 + .../resources/help/en/Functions/quotient.htm | 5 + .../resources/help/en/Functions/radians.htm | 5 + .../main/resources/help/en/Functions/rand.htm | 5 + .../help/en/Functions/randbetween.htm | 5 + .../resources/help/en/Functions/rank-avg.htm | 5 + .../resources/help/en/Functions/rank-eq.htm | 5 + .../main/resources/help/en/Functions/rank.htm | 5 + .../main/resources/help/en/Functions/rate.htm | 5 + .../resources/help/en/Functions/received.htm | 5 + .../resources/help/en/Functions/replace.htm | 5 + .../main/resources/help/en/Functions/rept.htm | 5 + .../resources/help/en/Functions/right.htm | 5 + .../resources/help/en/Functions/roman.htm | 5 + .../resources/help/en/Functions/round.htm | 5 + .../resources/help/en/Functions/rounddown.htm | 5 + .../resources/help/en/Functions/roundup.htm | 5 + .../main/resources/help/en/Functions/row.htm | 5 + .../main/resources/help/en/Functions/rows.htm | 5 + .../main/resources/help/en/Functions/rri.htm | 5 + .../main/resources/help/en/Functions/rsq.htm | 5 + .../resources/help/en/Functions/search.htm | 5 + .../main/resources/help/en/Functions/sec.htm | 5 + .../main/resources/help/en/Functions/sech.htm | 5 + .../resources/help/en/Functions/second.htm | 5 + .../resources/help/en/Functions/seriessum.htm | 5 + .../resources/help/en/Functions/sheet.htm | 5 + .../resources/help/en/Functions/sheets.htm | 5 + .../main/resources/help/en/Functions/sign.htm | 5 + .../main/resources/help/en/Functions/sin.htm | 5 + .../main/resources/help/en/Functions/sinh.htm | 5 + .../resources/help/en/Functions/skew-p.htm | 5 + .../main/resources/help/en/Functions/skew.htm | 5 + .../main/resources/help/en/Functions/sln.htm | 5 + .../resources/help/en/Functions/slope.htm | 5 + .../resources/help/en/Functions/small.htm | 5 + .../main/resources/help/en/Functions/sqrt.htm | 5 + .../resources/help/en/Functions/sqrtpi.htm | 5 + .../help/en/Functions/standardize.htm | 5 + .../resources/help/en/Functions/stdev-p.htm | 5 + .../resources/help/en/Functions/stdev-s.htm | 5 + .../resources/help/en/Functions/stdev.htm | 5 + .../resources/help/en/Functions/stdeva.htm | 5 + .../resources/help/en/Functions/stdevp.htm | 5 + .../resources/help/en/Functions/stdevpa.htm | 5 + .../resources/help/en/Functions/steyx.htm | 5 + .../help/en/Functions/substitute.htm | 5 + .../resources/help/en/Functions/subtotal.htm | 5 + .../main/resources/help/en/Functions/sum.htm | 5 + .../resources/help/en/Functions/sumif.htm | 5 + .../resources/help/en/Functions/sumifs.htm | 5 + .../help/en/Functions/sumproduct.htm | 5 + .../resources/help/en/Functions/sumsq.htm | 5 + .../resources/help/en/Functions/sumx2my2.htm | 5 + .../resources/help/en/Functions/sumx2py2.htm | 5 + .../resources/help/en/Functions/sumxmy2.htm | 5 + .../resources/help/en/Functions/switch.htm | 5 + .../main/resources/help/en/Functions/syd.htm | 5 + .../resources/help/en/Functions/t-dist-2t.htm | 5 + .../resources/help/en/Functions/t-dist-rt.htm | 5 + .../resources/help/en/Functions/t-dist.htm | 5 + .../resources/help/en/Functions/t-inv-2t.htm | 5 + .../resources/help/en/Functions/t-inv.htm | 5 + .../resources/help/en/Functions/t-test.htm | 5 + .../main/resources/help/en/Functions/t.htm | 5 + .../main/resources/help/en/Functions/tan.htm | 5 + .../main/resources/help/en/Functions/tanh.htm | 5 + .../resources/help/en/Functions/tbilleq.htm | 5 + .../help/en/Functions/tbillprice.htm | 5 + .../help/en/Functions/tbillyield.htm | 5 + .../resources/help/en/Functions/tdist.htm | 5 + .../main/resources/help/en/Functions/text.htm | 5 + .../resources/help/en/Functions/textjoin.htm | 5 + .../main/resources/help/en/Functions/time.htm | 5 + .../resources/help/en/Functions/timevalue.htm | 5 + .../main/resources/help/en/Functions/tinv.htm | 5 + .../resources/help/en/Functions/today.htm | 5 + .../resources/help/en/Functions/transpose.htm | 5 + .../main/resources/help/en/Functions/trim.htm | 5 + .../resources/help/en/Functions/trimmean.htm | 5 + .../main/resources/help/en/Functions/true.htm | 5 + .../resources/help/en/Functions/trunc.htm | 5 + .../resources/help/en/Functions/ttest.htm | 5 + .../main/resources/help/en/Functions/type.htm | 5 + .../resources/help/en/Functions/unichar.htm | 5 + .../resources/help/en/Functions/unicode.htm | 5 + .../resources/help/en/Functions/upper.htm | 5 + .../resources/help/en/Functions/value.htm | 5 + .../resources/help/en/Functions/var-p.htm | 5 + .../resources/help/en/Functions/var-s.htm | 5 + .../main/resources/help/en/Functions/var.htm | 5 + .../main/resources/help/en/Functions/vara.htm | 5 + .../main/resources/help/en/Functions/varp.htm | 5 + .../resources/help/en/Functions/varpa.htm | 5 + .../main/resources/help/en/Functions/vdb.htm | 5 + .../resources/help/en/Functions/vlookup.htm | 5 + .../resources/help/en/Functions/weekday.htm | 4 + .../resources/help/en/Functions/weeknum.htm | 4 + .../help/en/Functions/weibull-dist.htm | 5 + .../resources/help/en/Functions/weibull.htm | 5 + .../help/en/Functions/workday-intl.htm | 4 + .../resources/help/en/Functions/workday.htm | 4 + .../main/resources/help/en/Functions/xirr.htm | 5 + .../main/resources/help/en/Functions/xnpv.htm | 5 + .../main/resources/help/en/Functions/xor.htm | 5 + .../main/resources/help/en/Functions/year.htm | 5 + .../resources/help/en/Functions/yearfrac.htm | 4 + .../resources/help/en/Functions/yield.htm | 5 + .../resources/help/en/Functions/yielddisc.htm | 5 + .../resources/help/en/Functions/yieldmat.htm | 5 + .../resources/help/en/Functions/z-test.htm | 5 + .../resources/help/en/Functions/ztest.htm | 5 + .../resources/help/en/HelpfulHints/About.htm | 5 + .../help/en/HelpfulHints/AdvancedSettings.htm | 5 + .../en/HelpfulHints/CollaborativeEditing.htm | 8 +- .../en/HelpfulHints/KeyboardShortcuts.htm | 4 + .../help/en/HelpfulHints/Navigation.htm | 5 + .../resources/help/en/HelpfulHints/Search.htm | 5 + .../help/en/HelpfulHints/SupportedFormats.htm | 5 + .../help/en/ProgramInterface/FileTab.htm | 30 + .../help/en/ProgramInterface/HomeTab.htm | 34 + .../help/en/ProgramInterface/InsertTab.htm | 27 + .../help/en/ProgramInterface/PluginsTab.htm | 30 + .../en/ProgramInterface/ProgramInterface.htm | 39 + .../help/en/UsageInstructions/AddBorders.htm | 5 + .../en/UsageInstructions/AddHyperlinks.htm | 5 + .../help/en/UsageInstructions/AlignText.htm | 5 + .../UsageInstructions/ChangeNumberFormat.htm | 5 + .../en/UsageInstructions/ClearFormatting.htm | 4 + .../en/UsageInstructions/CopyPasteData.htm | 5 + .../UsageInstructions/FontTypeSizeStyle.htm | 4 + .../en/UsageInstructions/InsertAutoshapes.htm | 4 + .../help/en/UsageInstructions/InsertChart.htm | 4 + .../UsageInstructions/InsertDeleteCells.htm | 5 + .../en/UsageInstructions/InsertEquation.htm | 5 + .../en/UsageInstructions/InsertFunction.htm | 4 + .../en/UsageInstructions/InsertImages.htm | 4 + .../UsageInstructions/InsertTextObjects.htm | 4 + .../en/UsageInstructions/ManageSheets.htm | 5 + .../UsageInstructions/ManipulateObjects.htm | 5 + .../help/en/UsageInstructions/MergeCells.htm | 5 + .../en/UsageInstructions/OpenCreateNew.htm | 5 + .../UsageInstructions/SavePrintDownload.htm | 4 + .../help/en/UsageInstructions/SortData.htm | 6 +- .../help/en/UsageInstructions/UndoRedo.htm | 4 + .../en/UsageInstructions/UseNamedRanges.htm | 4 + .../help/en/UsageInstructions/ViewDocInfo.htm | 5 + .../main/resources/help/en/editor.css | 42 +- .../help/en/images/interface/editorwindow.png | Bin 0 -> 104932 bytes .../help/en/images/interface/filetab.png | Bin 0 -> 29138 bytes .../help/en/images/interface/hometab.png | Bin 0 -> 15155 bytes .../help/en/images/interface/inserttab.png | Bin 0 -> 12612 bytes .../help/en/images/interface/leftpart.png | Bin 0 -> 1129 bytes .../help/en/images/interface/pluginstab.png | Bin 0 -> 12555 bytes .../help/en/images/interface/rightpart.png | Bin 0 -> 468 bytes .../main/resources/help/en/search/indexes.js | 2328 +++++++++++++ .../resources/help/en/search/js/jquery.min.js | 6 + .../en/search/js/lunr-languages/lunr.multi.js | 75 + .../js/lunr-languages/lunr.stemmer.support.js | 304 ++ .../main/resources/help/en/search/js/lunr.js | 2977 +++++++++++++++++ .../help/en/search/js/page-search.js | 5 + .../main/resources/help/en/search/search.html | 234 ++ .../main/resources/help/ru/Contents.json | 55 +- .../main/resources/help/ru/Functions/abs.htm | 5 + .../resources/help/ru/Functions/accrint.htm | 5 + .../resources/help/ru/Functions/accrintm.htm | 5 + .../main/resources/help/ru/Functions/acos.htm | 5 + .../resources/help/ru/Functions/acosh.htm | 5 + .../main/resources/help/ru/Functions/acot.htm | 5 + .../resources/help/ru/Functions/acoth.htm | 5 + .../resources/help/ru/Functions/address.htm | 5 + .../resources/help/ru/Functions/aggregate.htm | 5 + .../resources/help/ru/Functions/amordegrc.htm | 5 + .../resources/help/ru/Functions/amorlinc.htm | 5 + .../main/resources/help/ru/Functions/and.htm | 5 + .../resources/help/ru/Functions/arabic.htm | 5 + .../main/resources/help/ru/Functions/asin.htm | 5 + .../resources/help/ru/Functions/asinh.htm | 5 + .../main/resources/help/ru/Functions/atan.htm | 5 + .../resources/help/ru/Functions/atan2.htm | 5 + .../resources/help/ru/Functions/atanh.htm | 5 + .../resources/help/ru/Functions/avedev.htm | 5 + .../resources/help/ru/Functions/average.htm | 5 + .../resources/help/ru/Functions/averagea.htm | 5 + .../resources/help/ru/Functions/averageif.htm | 5 + .../help/ru/Functions/averageifs.htm | 5 + .../main/resources/help/ru/Functions/base.htm | 5 + .../resources/help/ru/Functions/besseli.htm | 5 + .../resources/help/ru/Functions/besselj.htm | 5 + .../resources/help/ru/Functions/besselk.htm | 5 + .../resources/help/ru/Functions/bessely.htm | 5 + .../resources/help/ru/Functions/beta-dist.htm | 5 + .../resources/help/ru/Functions/beta-inv.htm | 5 + .../resources/help/ru/Functions/betadist.htm | 5 + .../resources/help/ru/Functions/bin2dec.htm | 5 + .../resources/help/ru/Functions/bin2hex.htm | 5 + .../resources/help/ru/Functions/bin2oct.htm | 7 +- .../help/ru/Functions/binom-dist-range.htm | 5 + .../help/ru/Functions/binom-dist.htm | 5 + .../resources/help/ru/Functions/binom-inv.htm | 5 + .../resources/help/ru/Functions/binomdist.htm | 5 + .../resources/help/ru/Functions/bitand.htm | 5 + .../resources/help/ru/Functions/bitlshift.htm | 5 + .../resources/help/ru/Functions/bitor.htm | 5 + .../resources/help/ru/Functions/bitrshift.htm | 5 + .../resources/help/ru/Functions/bitxor.htm | 5 + .../resources/help/ru/Functions/ceiling.htm | 5 + .../help/ru/Functions/ceilingmath.htm | 5 + .../help/ru/Functions/ceilingprecise.htm | 5 + .../main/resources/help/ru/Functions/char.htm | 5 + .../resources/help/ru/Functions/chidist.htm | 5 + .../resources/help/ru/Functions/chiinv.htm | 5 + .../help/ru/Functions/chisq-dist-rt.htm | 5 + .../help/ru/Functions/chisq-dist.htm | 5 + .../help/ru/Functions/chisq-inv-rt.htm | 5 + .../resources/help/ru/Functions/chisq-inv.htm | 5 + .../help/ru/Functions/chisq-test.htm | 5 + .../resources/help/ru/Functions/chitest.htm | 5 + .../resources/help/ru/Functions/choose.htm | 5 + .../resources/help/ru/Functions/clean.htm | 5 + .../main/resources/help/ru/Functions/code.htm | 5 + .../resources/help/ru/Functions/column.htm | 5 + .../resources/help/ru/Functions/columns.htm | 5 + .../resources/help/ru/Functions/combin.htm | 5 + .../resources/help/ru/Functions/combina.htm | 5 + .../resources/help/ru/Functions/complex.htm | 5 + .../resources/help/ru/Functions/concat.htm | 5 + .../help/ru/Functions/concatenate.htm | 5 + .../help/ru/Functions/confidence-norm.htm | 5 + .../help/ru/Functions/confidence-t.htm | 5 + .../help/ru/Functions/confidence.htm | 5 + .../resources/help/ru/Functions/correl.htm | 5 + .../main/resources/help/ru/Functions/cos.htm | 5 + .../main/resources/help/ru/Functions/cosh.htm | 5 + .../main/resources/help/ru/Functions/cot.htm | 5 + .../main/resources/help/ru/Functions/coth.htm | 5 + .../resources/help/ru/Functions/count.htm | 5 + .../resources/help/ru/Functions/counta.htm | 5 + .../help/ru/Functions/countblank.htm | 5 + .../resources/help/ru/Functions/countif.htm | 5 + .../resources/help/ru/Functions/countifs.htm | 5 + .../resources/help/ru/Functions/coupdaybs.htm | 5 + .../resources/help/ru/Functions/coupdays.htm | 5 + .../help/ru/Functions/coupdaysnc.htm | 5 + .../resources/help/ru/Functions/coupncd.htm | 5 + .../resources/help/ru/Functions/coupnum.htm | 5 + .../resources/help/ru/Functions/couppcd.htm | 5 + .../resources/help/ru/Functions/covar.htm | 5 + .../help/ru/Functions/covariance-p.htm | 5 + .../help/ru/Functions/covariance-s.htm | 5 + .../resources/help/ru/Functions/critbinom.htm | 5 + .../main/resources/help/ru/Functions/csc.htm | 5 + .../main/resources/help/ru/Functions/csch.htm | 5 + .../resources/help/ru/Functions/cumipmt.htm | 5 + .../resources/help/ru/Functions/cumprinc.htm | 5 + .../main/resources/help/ru/Functions/date.htm | 5 + .../resources/help/ru/Functions/datedif.htm | 5 + .../resources/help/ru/Functions/datevalue.htm | 5 + .../resources/help/ru/Functions/daverage.htm | 5 + .../main/resources/help/ru/Functions/day.htm | 5 + .../main/resources/help/ru/Functions/days.htm | 5 + .../resources/help/ru/Functions/days360.htm | 5 + .../main/resources/help/ru/Functions/db.htm | 5 + .../resources/help/ru/Functions/dcount.htm | 5 + .../resources/help/ru/Functions/dcounta.htm | 5 + .../main/resources/help/ru/Functions/ddb.htm | 5 + .../resources/help/ru/Functions/dec2bin.htm | 5 + .../resources/help/ru/Functions/dec2hex.htm | 5 + .../resources/help/ru/Functions/dec2oct.htm | 5 + .../resources/help/ru/Functions/decimal.htm | 5 + .../resources/help/ru/Functions/degrees.htm | 5 + .../resources/help/ru/Functions/delta.htm | 5 + .../resources/help/ru/Functions/devsq.htm | 5 + .../main/resources/help/ru/Functions/dget.htm | 5 + .../main/resources/help/ru/Functions/disc.htm | 5 + .../main/resources/help/ru/Functions/dmax.htm | 5 + .../main/resources/help/ru/Functions/dmin.htm | 5 + .../resources/help/ru/Functions/dollar.htm | 5 + .../resources/help/ru/Functions/dollarde.htm | 5 + .../resources/help/ru/Functions/dollarfr.htm | 5 + .../resources/help/ru/Functions/dproduct.htm | 5 + .../resources/help/ru/Functions/dstdev.htm | 5 + .../resources/help/ru/Functions/dstdevp.htm | 5 + .../main/resources/help/ru/Functions/dsum.htm | 5 + .../resources/help/ru/Functions/duration.htm | 5 + .../main/resources/help/ru/Functions/dvar.htm | 5 + .../resources/help/ru/Functions/dvarp.htm | 5 + .../help/ru/Functions/ecma-ceiling.htm | 5 + .../resources/help/ru/Functions/edate.htm | 4 + .../resources/help/ru/Functions/effect.htm | 5 + .../resources/help/ru/Functions/eomonth.htm | 4 + .../help/ru/Functions/erf-precise.htm | 5 + .../main/resources/help/ru/Functions/erf.htm | 5 + .../help/ru/Functions/erfc-precise.htm | 5 + .../main/resources/help/ru/Functions/erfc.htm | 5 + .../help/ru/Functions/error.type.htm | 5 + .../main/resources/help/ru/Functions/even.htm | 5 + .../resources/help/ru/Functions/exact.htm | 5 + .../main/resources/help/ru/Functions/exp.htm | 5 + .../help/ru/Functions/expon-dist.htm | 5 + .../resources/help/ru/Functions/expondist.htm | 5 + .../resources/help/ru/Functions/f-dist-rt.htm | 5 + .../resources/help/ru/Functions/f-dist.htm | 5 + .../resources/help/ru/Functions/f-inv-rt.htm | 5 + .../resources/help/ru/Functions/f-inv.htm | 5 + .../main/resources/help/ru/Functions/fact.htm | 5 + .../help/ru/Functions/factdouble.htm | 5 + .../resources/help/ru/Functions/false.htm | 5 + .../resources/help/ru/Functions/fdist.htm | 5 + .../main/resources/help/ru/Functions/find.htm | 5 + .../main/resources/help/ru/Functions/finv.htm | 5 + .../resources/help/ru/Functions/fisher.htm | 5 + .../resources/help/ru/Functions/fisherinv.htm | 5 + .../resources/help/ru/Functions/fixed.htm | 5 + .../resources/help/ru/Functions/floor.htm | 5 + .../resources/help/ru/Functions/floormath.htm | 5 + .../help/ru/Functions/floorprecise.htm | 5 + .../help/ru/Functions/forecast-linear.htm | 5 + .../resources/help/ru/Functions/forecast.htm | 5 + .../resources/help/ru/Functions/frequency.htm | 5 + .../main/resources/help/ru/Functions/fv.htm | 5 + .../help/ru/Functions/fvschedule.htm | 5 + .../help/ru/Functions/gamma-dist.htm | 5 + .../resources/help/ru/Functions/gamma-inv.htm | 5 + .../resources/help/ru/Functions/gamma.htm | 5 + .../resources/help/ru/Functions/gammadist.htm | 5 + .../resources/help/ru/Functions/gammainv.htm | 5 + .../help/ru/Functions/gammaln-precise.htm | 5 + .../resources/help/ru/Functions/gammaln.htm | 5 + .../resources/help/ru/Functions/gauss.htm | 5 + .../main/resources/help/ru/Functions/gcd.htm | 5 + .../resources/help/ru/Functions/geomean.htm | 5 + .../resources/help/ru/Functions/gestep.htm | 5 + .../resources/help/ru/Functions/harmean.htm | 5 + .../resources/help/ru/Functions/hex2bin.htm | 5 + .../resources/help/ru/Functions/hex2dec.htm | 5 + .../resources/help/ru/Functions/hex2oct.htm | 5 + .../resources/help/ru/Functions/hlookup.htm | 5 + .../main/resources/help/ru/Functions/hour.htm | 5 + .../help/ru/Functions/hypgeomdist.htm | 5 + .../main/resources/help/ru/Functions/if.htm | 5 + .../resources/help/ru/Functions/iferror.htm | 5 + .../main/resources/help/ru/Functions/ifna.htm | 5 + .../resources/help/ru/Functions/imabs.htm | 5 + .../resources/help/ru/Functions/imaginary.htm | 5 + .../help/ru/Functions/imargument.htm | 5 + .../help/ru/Functions/imconjugate.htm | 5 + .../resources/help/ru/Functions/imcos.htm | 5 + .../resources/help/ru/Functions/imcosh.htm | 5 + .../resources/help/ru/Functions/imcot.htm | 5 + .../resources/help/ru/Functions/imcsc.htm | 5 + .../resources/help/ru/Functions/imcsch.htm | 5 + .../resources/help/ru/Functions/imdiv.htm | 5 + .../resources/help/ru/Functions/imexp.htm | 5 + .../main/resources/help/ru/Functions/imln.htm | 5 + .../resources/help/ru/Functions/imlog10.htm | 5 + .../resources/help/ru/Functions/imlog2.htm | 5 + .../resources/help/ru/Functions/impower.htm | 5 + .../resources/help/ru/Functions/improduct.htm | 5 + .../resources/help/ru/Functions/imreal.htm | 5 + .../resources/help/ru/Functions/imsec.htm | 5 + .../resources/help/ru/Functions/imsech.htm | 5 + .../resources/help/ru/Functions/imsin.htm | 5 + .../resources/help/ru/Functions/imsinh.htm | 5 + .../resources/help/ru/Functions/imsqrt.htm | 5 + .../resources/help/ru/Functions/imsub.htm | 5 + .../resources/help/ru/Functions/imsum.htm | 5 + .../resources/help/ru/Functions/imtan.htm | 5 + .../resources/help/ru/Functions/index.htm | 5 + .../resources/help/ru/Functions/indirect.htm | 5 + .../main/resources/help/ru/Functions/int.htm | 5 + .../resources/help/ru/Functions/intercept.htm | 5 + .../resources/help/ru/Functions/intrate.htm | 5 + .../main/resources/help/ru/Functions/ipmt.htm | 5 + .../main/resources/help/ru/Functions/irr.htm | 5 + .../resources/help/ru/Functions/isblank.htm | 5 + .../resources/help/ru/Functions/iserr.htm | 5 + .../resources/help/ru/Functions/iserror.htm | 5 + .../resources/help/ru/Functions/iseven.htm | 5 + .../resources/help/ru/Functions/isformula.htm | 5 + .../resources/help/ru/Functions/islogical.htm | 5 + .../main/resources/help/ru/Functions/isna.htm | 5 + .../resources/help/ru/Functions/isnontext.htm | 5 + .../resources/help/ru/Functions/isnumber.htm | 5 + .../help/ru/Functions/isoceiling.htm | 5 + .../resources/help/ru/Functions/isodd.htm | 5 + .../help/ru/Functions/isoweeknum.htm | 4 + .../resources/help/ru/Functions/ispmt.htm | 5 + .../resources/help/ru/Functions/isref.htm | 5 + .../resources/help/ru/Functions/istext.htm | 5 + .../main/resources/help/ru/Functions/kurt.htm | 5 + .../resources/help/ru/Functions/large.htm | 5 + .../main/resources/help/ru/Functions/lcm.htm | 5 + .../main/resources/help/ru/Functions/left.htm | 5 + .../main/resources/help/ru/Functions/len.htm | 5 + .../main/resources/help/ru/Functions/ln.htm | 5 + .../main/resources/help/ru/Functions/log.htm | 5 + .../resources/help/ru/Functions/log10.htm | 5 + .../resources/help/ru/Functions/loginv.htm | 5 + .../help/ru/Functions/lognorm-dist.htm | 5 + .../help/ru/Functions/lognorm-inv.htm | 5 + .../help/ru/Functions/lognormdist.htm | 5 + .../resources/help/ru/Functions/lookup.htm | 5 + .../resources/help/ru/Functions/lower.htm | 5 + .../resources/help/ru/Functions/match.htm | 5 + .../main/resources/help/ru/Functions/max.htm | 5 + .../main/resources/help/ru/Functions/maxa.htm | 5 + .../resources/help/ru/Functions/maxifs.htm | 5 + .../resources/help/ru/Functions/mdeterm.htm | 5 + .../resources/help/ru/Functions/mduration.htm | 5 + .../resources/help/ru/Functions/median.htm | 5 + .../main/resources/help/ru/Functions/mid.htm | 5 + .../main/resources/help/ru/Functions/min.htm | 5 + .../main/resources/help/ru/Functions/mina.htm | 5 + .../resources/help/ru/Functions/minifs.htm | 5 + .../resources/help/ru/Functions/minute.htm | 5 + .../resources/help/ru/Functions/minverse.htm | 5 + .../main/resources/help/ru/Functions/mirr.htm | 5 + .../resources/help/ru/Functions/mmult.htm | 5 + .../main/resources/help/ru/Functions/mod.htm | 5 + .../resources/help/ru/Functions/mode-mult.htm | 5 + .../resources/help/ru/Functions/mode-sngl.htm | 5 + .../main/resources/help/ru/Functions/mode.htm | 5 + .../resources/help/ru/Functions/month.htm | 5 + .../resources/help/ru/Functions/mround.htm | 5 + .../help/ru/Functions/multinomial.htm | 5 + .../main/resources/help/ru/Functions/n.htm | 5 + .../main/resources/help/ru/Functions/na.htm | 5 + .../help/ru/Functions/negbinom-dist.htm | 5 + .../help/ru/Functions/negbinomdist.htm | 5 + .../help/ru/Functions/networkdays-intl.htm | 4 + .../help/ru/Functions/networkdays.htm | 4 + .../resources/help/ru/Functions/nominal.htm | 5 + .../resources/help/ru/Functions/norm-dist.htm | 5 + .../resources/help/ru/Functions/norm-inv.htm | 5 + .../help/ru/Functions/norm-s-dist.htm | 5 + .../help/ru/Functions/norm-s-inv.htm | 5 + .../resources/help/ru/Functions/normdist.htm | 5 + .../resources/help/ru/Functions/norminv.htm | 5 + .../resources/help/ru/Functions/normsdist.htm | 5 + .../resources/help/ru/Functions/normsinv.htm | 5 + .../main/resources/help/ru/Functions/not.htm | 5 + .../main/resources/help/ru/Functions/now.htm | 5 + .../main/resources/help/ru/Functions/nper.htm | 5 + .../main/resources/help/ru/Functions/npv.htm | 5 + .../help/ru/Functions/numbervalue.htm | 5 + .../resources/help/ru/Functions/oct2bin.htm | 5 + .../resources/help/ru/Functions/oct2dec.htm | 5 + .../resources/help/ru/Functions/oct2hex.htm | 5 + .../main/resources/help/ru/Functions/odd.htm | 5 + .../resources/help/ru/Functions/oddfprice.htm | 5 + .../resources/help/ru/Functions/oddfyield.htm | 5 + .../resources/help/ru/Functions/oddlprice.htm | 5 + .../resources/help/ru/Functions/oddlyield.htm | 5 + .../resources/help/ru/Functions/offset.htm | 5 + .../main/resources/help/ru/Functions/or.htm | 5 + .../resources/help/ru/Functions/pearson.htm | 5 + .../help/ru/Functions/percentile-exc.htm | 5 + .../help/ru/Functions/percentile-inc.htm | 5 + .../help/ru/Functions/percentile.htm | 5 + .../help/ru/Functions/percentrank-exc.htm | 5 + .../help/ru/Functions/percentrank-inc.htm | 5 + .../help/ru/Functions/percentrank.htm | 5 + .../resources/help/ru/Functions/permut.htm | 5 + .../help/ru/Functions/permutationa.htm | 5 + .../main/resources/help/ru/Functions/phi.htm | 5 + .../main/resources/help/ru/Functions/pi.htm | 5 + .../main/resources/help/ru/Functions/pmt.htm | 5 + .../help/ru/Functions/poisson-dist.htm | 5 + .../resources/help/ru/Functions/poisson.htm | 5 + .../resources/help/ru/Functions/power.htm | 5 + .../main/resources/help/ru/Functions/ppmt.htm | 5 + .../resources/help/ru/Functions/price.htm | 5 + .../resources/help/ru/Functions/pricedisc.htm | 5 + .../resources/help/ru/Functions/pricemat.htm | 5 + .../main/resources/help/ru/Functions/prob.htm | 5 + .../resources/help/ru/Functions/product.htm | 5 + .../resources/help/ru/Functions/proper.htm | 5 + .../main/resources/help/ru/Functions/pv.htm | 5 + .../help/ru/Functions/quartile-exc.htm | 5 + .../help/ru/Functions/quartile-inc.htm | 5 + .../resources/help/ru/Functions/quartile.htm | 5 + .../resources/help/ru/Functions/quotient.htm | 5 + .../resources/help/ru/Functions/radians.htm | 5 + .../main/resources/help/ru/Functions/rand.htm | 5 + .../help/ru/Functions/randbetween.htm | 5 + .../resources/help/ru/Functions/rank-avg.htm | 5 + .../resources/help/ru/Functions/rank-eq.htm | 5 + .../main/resources/help/ru/Functions/rank.htm | 5 + .../main/resources/help/ru/Functions/rate.htm | 5 + .../resources/help/ru/Functions/received.htm | 5 + .../resources/help/ru/Functions/replace.htm | 5 + .../main/resources/help/ru/Functions/rept.htm | 5 + .../resources/help/ru/Functions/right.htm | 5 + .../resources/help/ru/Functions/roman.htm | 5 + .../resources/help/ru/Functions/round.htm | 5 + .../resources/help/ru/Functions/rounddown.htm | 5 + .../resources/help/ru/Functions/roundup.htm | 5 + .../main/resources/help/ru/Functions/row.htm | 5 + .../main/resources/help/ru/Functions/rows.htm | 5 + .../main/resources/help/ru/Functions/rri.htm | 5 + .../main/resources/help/ru/Functions/rsq.htm | 5 + .../resources/help/ru/Functions/search.htm | 5 + .../main/resources/help/ru/Functions/sec.htm | 5 + .../main/resources/help/ru/Functions/sech.htm | 5 + .../resources/help/ru/Functions/second.htm | 5 + .../resources/help/ru/Functions/seriessum.htm | 5 + .../resources/help/ru/Functions/sheet.htm | 5 + .../resources/help/ru/Functions/sheets.htm | 5 + .../main/resources/help/ru/Functions/sign.htm | 5 + .../main/resources/help/ru/Functions/sin.htm | 5 + .../main/resources/help/ru/Functions/sinh.htm | 5 + .../resources/help/ru/Functions/skew-p.htm | 5 + .../main/resources/help/ru/Functions/skew.htm | 5 + .../main/resources/help/ru/Functions/sln.htm | 5 + .../resources/help/ru/Functions/slope.htm | 5 + .../resources/help/ru/Functions/small.htm | 5 + .../main/resources/help/ru/Functions/sqrt.htm | 5 + .../resources/help/ru/Functions/sqrtpi.htm | 5 + .../help/ru/Functions/standardize.htm | 5 + .../resources/help/ru/Functions/stdev-p.htm | 5 + .../resources/help/ru/Functions/stdev-s.htm | 5 + .../resources/help/ru/Functions/stdev.htm | 5 + .../resources/help/ru/Functions/stdeva.htm | 5 + .../resources/help/ru/Functions/stdevp.htm | 5 + .../resources/help/ru/Functions/stdevpa.htm | 5 + .../resources/help/ru/Functions/steyx.htm | 5 + .../help/ru/Functions/substitute.htm | 5 + .../resources/help/ru/Functions/subtotal.htm | 5 + .../main/resources/help/ru/Functions/sum.htm | 5 + .../resources/help/ru/Functions/sumif.htm | 5 + .../resources/help/ru/Functions/sumifs.htm | 5 + .../help/ru/Functions/sumproduct.htm | 5 + .../resources/help/ru/Functions/sumsq.htm | 5 + .../resources/help/ru/Functions/sumx2my2.htm | 5 + .../resources/help/ru/Functions/sumx2py2.htm | 5 + .../resources/help/ru/Functions/sumxmy2.htm | 5 + .../resources/help/ru/Functions/switch.htm | 5 + .../main/resources/help/ru/Functions/syd.htm | 5 + .../resources/help/ru/Functions/t-dist-2t.htm | 5 + .../resources/help/ru/Functions/t-dist-rt.htm | 5 + .../resources/help/ru/Functions/t-dist.htm | 5 + .../resources/help/ru/Functions/t-inv-2t.htm | 5 + .../resources/help/ru/Functions/t-inv.htm | 5 + .../resources/help/ru/Functions/t-test.htm | 5 + .../main/resources/help/ru/Functions/t.htm | 5 + .../main/resources/help/ru/Functions/tan.htm | 5 + .../main/resources/help/ru/Functions/tanh.htm | 5 + .../resources/help/ru/Functions/tbilleq.htm | 5 + .../help/ru/Functions/tbillprice.htm | 5 + .../help/ru/Functions/tbillyield.htm | 5 + .../resources/help/ru/Functions/tdist.htm | 5 + .../main/resources/help/ru/Functions/text.htm | 5 + .../resources/help/ru/Functions/textjoin.htm | 5 + .../main/resources/help/ru/Functions/time.htm | 5 + .../resources/help/ru/Functions/timevalue.htm | 5 + .../main/resources/help/ru/Functions/tinv.htm | 5 + .../resources/help/ru/Functions/today.htm | 5 + .../resources/help/ru/Functions/transpose.htm | 5 + .../main/resources/help/ru/Functions/trim.htm | 5 + .../resources/help/ru/Functions/trimmean.htm | 5 + .../main/resources/help/ru/Functions/true.htm | 5 + .../resources/help/ru/Functions/trunc.htm | 5 + .../resources/help/ru/Functions/ttest.htm | 5 + .../main/resources/help/ru/Functions/type.htm | 5 + .../resources/help/ru/Functions/unichar.htm | 5 + .../resources/help/ru/Functions/unicode.htm | 5 + .../resources/help/ru/Functions/upper.htm | 5 + .../resources/help/ru/Functions/value.htm | 5 + .../resources/help/ru/Functions/var-p.htm | 5 + .../resources/help/ru/Functions/var-s.htm | 5 + .../main/resources/help/ru/Functions/var.htm | 5 + .../main/resources/help/ru/Functions/vara.htm | 5 + .../main/resources/help/ru/Functions/varp.htm | 5 + .../resources/help/ru/Functions/varpa.htm | 5 + .../main/resources/help/ru/Functions/vdb.htm | 5 + .../resources/help/ru/Functions/vlookup.htm | 5 + .../resources/help/ru/Functions/weekday.htm | 4 + .../resources/help/ru/Functions/weeknum.htm | 4 + .../help/ru/Functions/weibull-dist.htm | 5 + .../resources/help/ru/Functions/weibull.htm | 5 + .../help/ru/Functions/workday-intl.htm | 4 + .../resources/help/ru/Functions/workday.htm | 4 + .../main/resources/help/ru/Functions/xirr.htm | 5 + .../main/resources/help/ru/Functions/xnpv.htm | 5 + .../main/resources/help/ru/Functions/xor.htm | 5 + .../main/resources/help/ru/Functions/year.htm | 5 + .../resources/help/ru/Functions/yearfrac.htm | 4 + .../resources/help/ru/Functions/yield.htm | 5 + .../resources/help/ru/Functions/yielddisc.htm | 5 + .../resources/help/ru/Functions/yieldmat.htm | 5 + .../resources/help/ru/Functions/z-test.htm | 5 + .../resources/help/ru/Functions/ztest.htm | 5 + .../resources/help/ru/HelpfulHints/About.htm | 5 + .../help/ru/HelpfulHints/AdvancedSettings.htm | 5 + .../ru/HelpfulHints/CollaborativeEditing.htm | 8 +- .../ru/HelpfulHints/KeyboardShortcuts.htm | 4 + .../help/ru/HelpfulHints/Navigation.htm | 5 + .../resources/help/ru/HelpfulHints/Search.htm | 5 + .../help/ru/HelpfulHints/SupportedFormats.htm | 5 + .../help/ru/ProgramInterface/FileTab.htm | 30 + .../help/ru/ProgramInterface/HomeTab.htm | 34 + .../help/ru/ProgramInterface/InsertTab.htm | 27 + .../help/ru/ProgramInterface/PluginsTab.htm | 30 + .../ru/ProgramInterface/ProgramInterface.htm | 39 + .../help/ru/UsageInstructions/AddBorders.htm | 5 + .../ru/UsageInstructions/AddHyperlinks.htm | 5 + .../help/ru/UsageInstructions/AlignText.htm | 5 + .../UsageInstructions/ChangeNumberFormat.htm | 5 + .../ru/UsageInstructions/ClearFormatting.htm | 4 + .../ru/UsageInstructions/CopyPasteData.htm | 5 + .../UsageInstructions/FontTypeSizeStyle.htm | 4 + .../ru/UsageInstructions/InsertAutoshapes.htm | 14 +- .../help/ru/UsageInstructions/InsertChart.htm | 24 +- .../UsageInstructions/InsertDeleteCells.htm | 5 + .../ru/UsageInstructions/InsertEquation.htm | 5 + .../ru/UsageInstructions/InsertFunction.htm | 4 + .../ru/UsageInstructions/InsertImages.htm | 6 +- .../UsageInstructions/InsertTextObjects.htm | 6 +- .../ru/UsageInstructions/ManageSheets.htm | 5 + .../UsageInstructions/ManipulateObjects.htm | 5 + .../help/ru/UsageInstructions/MergeCells.htm | 5 + .../ru/UsageInstructions/OpenCreateNew.htm | 5 + .../UsageInstructions/SavePrintDownload.htm | 8 +- .../help/ru/UsageInstructions/SortData.htm | 8 +- .../help/ru/UsageInstructions/UndoRedo.htm | 4 + .../ru/UsageInstructions/UseNamedRanges.htm | 4 + .../help/ru/UsageInstructions/ViewDocInfo.htm | 5 + .../main/resources/help/ru/editor.css | 42 +- .../help/ru/images/interface/editorwindow.png | Bin 0 -> 108628 bytes .../help/ru/images/interface/filetab.png | Bin 0 -> 31353 bytes .../help/ru/images/interface/hometab.png | Bin 0 -> 15446 bytes .../help/ru/images/interface/inserttab.png | Bin 0 -> 13491 bytes .../help/ru/images/interface/leftpart.png | Bin 0 -> 1129 bytes .../help/ru/images/interface/pluginstab.png | Bin 0 -> 12699 bytes .../help/ru/images/interface/rightpart.png | Bin 0 -> 468 bytes .../main/resources/help/ru/search/indexes.js | 2328 +++++++++++++ .../resources/help/ru/search/js/jquery.min.js | 6 + .../ru/search/js/lunr-languages/lunr.multi.js | 75 + .../ru/search/js/lunr-languages/lunr.ru.js | 391 +++ .../js/lunr-languages/lunr.stemmer.support.js | 304 ++ .../main/resources/help/ru/search/js/lunr.js | 2977 +++++++++++++++++ .../help/ru/search/js/page-search.js | 5 + .../main/resources/help/ru/search/search.html | 235 ++ 1201 files changed, 31109 insertions(+), 756 deletions(-) create mode 100644 apps/documenteditor/main/resources/help/editor.css create mode 100644 apps/documenteditor/main/resources/help/en/ProgramInterface/FileTab.htm create mode 100644 apps/documenteditor/main/resources/help/en/ProgramInterface/HomeTab.htm create mode 100644 apps/documenteditor/main/resources/help/en/ProgramInterface/InsertTab.htm create mode 100644 apps/documenteditor/main/resources/help/en/ProgramInterface/LayoutTab.htm create mode 100644 apps/documenteditor/main/resources/help/en/ProgramInterface/PluginsTab.htm create mode 100644 apps/documenteditor/main/resources/help/en/ProgramInterface/ProgramInterface.htm create mode 100644 apps/documenteditor/main/resources/help/en/ProgramInterface/ReviewTab.htm create mode 100644 apps/documenteditor/main/resources/help/en/images/interface/editorwindow.png create mode 100644 apps/documenteditor/main/resources/help/en/images/interface/filetab.png create mode 100644 apps/documenteditor/main/resources/help/en/images/interface/hometab.png create mode 100644 apps/documenteditor/main/resources/help/en/images/interface/inserttab.png create mode 100644 apps/documenteditor/main/resources/help/en/images/interface/layouttab.png create mode 100644 apps/documenteditor/main/resources/help/en/images/interface/leftpart.png create mode 100644 apps/documenteditor/main/resources/help/en/images/interface/pluginstab.png create mode 100644 apps/documenteditor/main/resources/help/en/images/interface/reviewtab.png create mode 100644 apps/documenteditor/main/resources/help/en/images/interface/rightpart.png create mode 100644 apps/documenteditor/main/resources/help/en/search/indexes.js create mode 100644 apps/documenteditor/main/resources/help/en/search/js/jquery.min.js create mode 100644 apps/documenteditor/main/resources/help/en/search/js/lunr-languages/lunr.multi.js create mode 100644 apps/documenteditor/main/resources/help/en/search/js/lunr-languages/lunr.stemmer.support.js create mode 100644 apps/documenteditor/main/resources/help/en/search/js/lunr.js create mode 100644 apps/documenteditor/main/resources/help/en/search/js/page-search.js create mode 100644 apps/documenteditor/main/resources/help/en/search/search.html create mode 100644 apps/documenteditor/main/resources/help/ru/ProgramInterface/FileTab.htm create mode 100644 apps/documenteditor/main/resources/help/ru/ProgramInterface/HomeTab.htm create mode 100644 apps/documenteditor/main/resources/help/ru/ProgramInterface/InsertTab.htm create mode 100644 apps/documenteditor/main/resources/help/ru/ProgramInterface/LayoutTab.htm create mode 100644 apps/documenteditor/main/resources/help/ru/ProgramInterface/PluginsTab.htm create mode 100644 apps/documenteditor/main/resources/help/ru/ProgramInterface/ProgramInterface.htm create mode 100644 apps/documenteditor/main/resources/help/ru/ProgramInterface/ReviewTab.htm create mode 100644 apps/documenteditor/main/resources/help/ru/images/interface/editorwindow.png create mode 100644 apps/documenteditor/main/resources/help/ru/images/interface/filetab.png create mode 100644 apps/documenteditor/main/resources/help/ru/images/interface/hometab.png create mode 100644 apps/documenteditor/main/resources/help/ru/images/interface/inserttab.png create mode 100644 apps/documenteditor/main/resources/help/ru/images/interface/layouttab.png create mode 100644 apps/documenteditor/main/resources/help/ru/images/interface/leftpart.png create mode 100644 apps/documenteditor/main/resources/help/ru/images/interface/pluginstab.png create mode 100644 apps/documenteditor/main/resources/help/ru/images/interface/reviewtab.png create mode 100644 apps/documenteditor/main/resources/help/ru/images/interface/rightpart.png create mode 100644 apps/presentationeditor/main/resources/help/en/ProgramInterface/FileTab.htm create mode 100644 apps/presentationeditor/main/resources/help/en/ProgramInterface/HomeTab.htm create mode 100644 apps/presentationeditor/main/resources/help/en/ProgramInterface/InsertTab.htm create mode 100644 apps/presentationeditor/main/resources/help/en/ProgramInterface/PluginsTab.htm create mode 100644 apps/presentationeditor/main/resources/help/en/ProgramInterface/ProgramInterface.htm create mode 100644 apps/presentationeditor/main/resources/help/en/images/interface/editorwindow.png create mode 100644 apps/presentationeditor/main/resources/help/en/images/interface/filetab.png create mode 100644 apps/presentationeditor/main/resources/help/en/images/interface/hometab.png create mode 100644 apps/presentationeditor/main/resources/help/en/images/interface/inserttab.png create mode 100644 apps/presentationeditor/main/resources/help/en/images/interface/leftpart.png create mode 100644 apps/presentationeditor/main/resources/help/en/images/interface/pluginstab.png create mode 100644 apps/presentationeditor/main/resources/help/en/images/interface/rightpart.png create mode 100644 apps/presentationeditor/main/resources/help/en/search/indexes.js create mode 100644 apps/presentationeditor/main/resources/help/en/search/js/jquery.min.js create mode 100644 apps/presentationeditor/main/resources/help/en/search/js/lunr-languages/lunr.multi.js create mode 100644 apps/presentationeditor/main/resources/help/en/search/js/lunr-languages/lunr.stemmer.support.js create mode 100644 apps/presentationeditor/main/resources/help/en/search/js/lunr.js create mode 100644 apps/presentationeditor/main/resources/help/en/search/js/page-search.js create mode 100644 apps/presentationeditor/main/resources/help/en/search/search.html create mode 100644 apps/presentationeditor/main/resources/help/ru/ProgramInterface/FileTab.htm create mode 100644 apps/presentationeditor/main/resources/help/ru/ProgramInterface/HomeTab.htm create mode 100644 apps/presentationeditor/main/resources/help/ru/ProgramInterface/InsertTab.htm create mode 100644 apps/presentationeditor/main/resources/help/ru/ProgramInterface/PluginsTab.htm create mode 100644 apps/presentationeditor/main/resources/help/ru/ProgramInterface/ProgramInterface.htm create mode 100644 apps/presentationeditor/main/resources/help/ru/images/interface/editorwindow.png create mode 100644 apps/presentationeditor/main/resources/help/ru/images/interface/filetab.png create mode 100644 apps/presentationeditor/main/resources/help/ru/images/interface/hometab.png create mode 100644 apps/presentationeditor/main/resources/help/ru/images/interface/inserttab.png create mode 100644 apps/presentationeditor/main/resources/help/ru/images/interface/leftpart.png create mode 100644 apps/presentationeditor/main/resources/help/ru/images/interface/pluginstab.png create mode 100644 apps/presentationeditor/main/resources/help/ru/images/interface/rightpart.png create mode 100644 apps/presentationeditor/main/resources/help/ru/search/indexes.js create mode 100644 apps/presentationeditor/main/resources/help/ru/search/js/jquery.min.js create mode 100644 apps/presentationeditor/main/resources/help/ru/search/js/lunr-languages/lunr.multi.js create mode 100644 apps/presentationeditor/main/resources/help/ru/search/js/lunr-languages/lunr.ru.js create mode 100644 apps/presentationeditor/main/resources/help/ru/search/js/lunr-languages/lunr.stemmer.support.js create mode 100644 apps/presentationeditor/main/resources/help/ru/search/js/lunr.js create mode 100644 apps/presentationeditor/main/resources/help/ru/search/js/page-search.js create mode 100644 apps/presentationeditor/main/resources/help/ru/search/search.html create mode 100644 apps/spreadsheeteditor/main/resources/help/en/ProgramInterface/FileTab.htm create mode 100644 apps/spreadsheeteditor/main/resources/help/en/ProgramInterface/HomeTab.htm create mode 100644 apps/spreadsheeteditor/main/resources/help/en/ProgramInterface/InsertTab.htm create mode 100644 apps/spreadsheeteditor/main/resources/help/en/ProgramInterface/PluginsTab.htm create mode 100644 apps/spreadsheeteditor/main/resources/help/en/ProgramInterface/ProgramInterface.htm create mode 100644 apps/spreadsheeteditor/main/resources/help/en/images/interface/editorwindow.png create mode 100644 apps/spreadsheeteditor/main/resources/help/en/images/interface/filetab.png create mode 100644 apps/spreadsheeteditor/main/resources/help/en/images/interface/hometab.png create mode 100644 apps/spreadsheeteditor/main/resources/help/en/images/interface/inserttab.png create mode 100644 apps/spreadsheeteditor/main/resources/help/en/images/interface/leftpart.png create mode 100644 apps/spreadsheeteditor/main/resources/help/en/images/interface/pluginstab.png create mode 100644 apps/spreadsheeteditor/main/resources/help/en/images/interface/rightpart.png create mode 100644 apps/spreadsheeteditor/main/resources/help/en/search/indexes.js create mode 100644 apps/spreadsheeteditor/main/resources/help/en/search/js/jquery.min.js create mode 100644 apps/spreadsheeteditor/main/resources/help/en/search/js/lunr-languages/lunr.multi.js create mode 100644 apps/spreadsheeteditor/main/resources/help/en/search/js/lunr-languages/lunr.stemmer.support.js create mode 100644 apps/spreadsheeteditor/main/resources/help/en/search/js/lunr.js create mode 100644 apps/spreadsheeteditor/main/resources/help/en/search/js/page-search.js create mode 100644 apps/spreadsheeteditor/main/resources/help/en/search/search.html create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/ProgramInterface/FileTab.htm create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/ProgramInterface/HomeTab.htm create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/ProgramInterface/InsertTab.htm create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/ProgramInterface/PluginsTab.htm create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/ProgramInterface/ProgramInterface.htm create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/images/interface/editorwindow.png create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/images/interface/filetab.png create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/images/interface/hometab.png create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/images/interface/inserttab.png create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/images/interface/leftpart.png create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/images/interface/pluginstab.png create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/images/interface/rightpart.png create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/search/indexes.js create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/search/js/jquery.min.js create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/search/js/lunr-languages/lunr.multi.js create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/search/js/lunr-languages/lunr.ru.js create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/search/js/lunr-languages/lunr.stemmer.support.js create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/search/js/lunr.js create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/search/js/page-search.js create mode 100644 apps/spreadsheeteditor/main/resources/help/ru/search/search.html diff --git a/apps/documenteditor/main/resources/help/editor.css b/apps/documenteditor/main/resources/help/editor.css new file mode 100644 index 000000000..a3cb9ce6f --- /dev/null +++ b/apps/documenteditor/main/resources/help/editor.css @@ -0,0 +1,132 @@ +body +{ +font-family: Tahoma, Arial, Verdana; +font-size: 12px; +color: #666; +background: #fff; +} + +img +{ +border: none; +vertical-align: middle; +} + +img.floatleft +{ +float: left; +margin-right: 30px; +margin-bottom: 10px; +} + +img.floatright +{ +float: right; +margin-left: 30px; +margin-bottom: 10px; +} + +li +{ +line-height: 2em; +} + +.mainpart +{ +margin: 0; +padding: 10px 20px; +} + +.mainpart h1 +{ +font-size: 16px; +font-weight: bold; +} + +table, +tr, +td, +th +{ +border-left: 0; +border-right: 0; +border-bottom: solid 1px #E4E4E4; +border-collapse: collapse; +padding: 8px; +text-align: left; +} + +table +{ +margin: 20px 0; +width: 100%; +} + +th +{ +font-size: 14px; +font-weight: bold; +padding-top: 20px; +} + +td.function +{ +width: 35%; +} + +td.shortfunction +{ +width: 20%; +} + +td.combination +{ +width: 15%; +} + +td.description +{ +width: 50%; +} + +td.longdescription +{ +width: 80%; +} + +.note +{ +background: #F4F4F4 url(images/help.png) no-repeat 7px 5px; +font-size: 11px; +padding: 10px 20px 10px 37px; +width: 90%; +margin: 10px 0; +line-height: 1em; +min-height: 14px; +} + +hr +{ +height: 1px; +width: 90%; +text-align: left; +margin: 10px 0 15px; +color: #E4E4E4; +background-color: #E4E4E4; +border: 0; +clear: both; +} + +a +{ +color: #7496DD; +text-decoration: underline; +} + +a:hover +{ +text-decoration: none; +} +a.sup_link { +text-decoration: none; +} \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/en/Contents.json b/apps/documenteditor/main/resources/help/en/Contents.json index 78f5aa4f5..fa7e29337 100644 --- a/apps/documenteditor/main/resources/help/en/Contents.json +++ b/apps/documenteditor/main/resources/help/en/Contents.json @@ -1,45 +1,52 @@ [ - {"src": "UsageInstructions/SetPageParameters.htm", "name": "Set page parameters", "headername": "Usage Instructions"}, - {"src": "UsageInstructions/ChangeColorScheme.htm", "name": "Change color scheme"}, - {"src": "UsageInstructions/CopyPasteUndoRedo.htm", "name": "Copy/paste text passages, undo/redo your actions"}, - {"src": "UsageInstructions/NonprintingCharacters.htm", "name": "Show/hide nonprinting characters"}, - {"src": "UsageInstructions/AlignText.htm", "name": "Align your text in a paragraph"}, - {"src": "UsageInstructions/FormattingPresets.htm", "name": "Apply formatting styles"}, + {"src": "ProgramInterface/ProgramInterface.htm", "name": "Introducing Document Editor user interface", "headername": "Program Interface"}, + {"src": "ProgramInterface/FileTab.htm", "name": "File tab"}, + {"src": "ProgramInterface/HomeTab.htm", "name": "Home Tab"}, + {"src": "ProgramInterface/InsertTab.htm", "name": "Insert tab"}, + {"src": "ProgramInterface/LayoutTab.htm", "name": "Layout tab"}, + {"src": "ProgramInterface/ReviewTab.htm", "name": "Review tab"}, + {"src": "ProgramInterface/PluginsTab.htm", "name": "Plugins tab"}, + {"src": "UsageInstructions/ChangeColorScheme.htm", "name": "Change color scheme", "headername": "Basic operations"}, + {"src": "UsageInstructions/CopyPasteUndoRedo.htm", "name": "Copy/paste text passages, undo/redo your actions"}, + {"src": "UsageInstructions/OpenCreateNew.htm", "name": "Create a new document or open an existing one"}, + {"src": "UsageInstructions/SetPageParameters.htm", "name": "Set page parameters", "headername": "Page formatting"}, + {"src": "UsageInstructions/NonprintingCharacters.htm", "name": "Show/hide nonprinting characters" }, + {"src": "UsageInstructions/SectionBreaks.htm", "name": "Insert section breaks" }, + {"src": "UsageInstructions/InsertHeadersFooters.htm", "name": "Insert headers and footers"}, + {"src": "UsageInstructions/InsertPageNumbers.htm", "name": "Insert page numbers"}, + {"src": "UsageInstructions/InsertFootnotes.htm", "name": "Insert footnotes"}, + {"src": "UsageInstructions/AlignText.htm", "name": "Align your text in a paragraph", "headername": "Paragraph formatting"}, {"src": "UsageInstructions/BackgroundColor.htm", "name": "Select background color for a paragraph"}, {"src": "UsageInstructions/ParagraphIndents.htm", "name": "Change paragraph indents"}, {"src": "UsageInstructions/LineSpacing.htm", "name": "Set paragraph line spacing"}, {"src": "UsageInstructions/PageBreaks.htm", "name": "Insert page breaks"}, - {"src": "UsageInstructions/SectionBreaks.htm", "name": "Insert section breaks"}, - {"src": "UsageInstructions/AddBorders.htm", "name": "Add borders"}, + {"src": "UsageInstructions/AddBorders.htm", "name": "Add borders"}, + {"src": "UsageInstructions/SetTabStops.htm", "name": "Set tab stops"}, + {"src": "UsageInstructions/CreateLists.htm", "name": "Create lists"}, + {"src": "UsageInstructions/FormattingPresets.htm", "name": "Apply formatting styles", "headername": "Text formatting"}, {"src": "UsageInstructions/FontTypeSizeColor.htm", "name": "Set font type, size, and color"}, {"src": "UsageInstructions/DecorationStyles.htm", "name": "Apply font decoration styles"}, - {"src": "UsageInstructions/CopyClearFormatting.htm", "name": "Copy/clear text formatting"}, - {"src": "UsageInstructions/SetTabStops.htm", "name": "Set tab stops"}, - {"src": "UsageInstructions/CreateLists.htm", "name": "Create lists"}, - {"src": "UsageInstructions/InsertTables.htm", "name": "Insert tables"}, + {"src": "UsageInstructions/CopyClearFormatting.htm", "name": "Copy/clear text formatting" }, + {"src": "UsageInstructions/AddHyperlinks.htm", "name": "Add hyperlinks"}, + {"src": "UsageInstructions/InsertDropCap.htm", "name": "Insert a drop cap"}, + {"src": "UsageInstructions/InsertTables.htm", "name": "Insert tables", "headername": "Operations on objects"}, {"src": "UsageInstructions/InsertImages.htm", "name": "Insert images"}, {"src": "UsageInstructions/InsertAutoshapes.htm", "name": "Insert autoshapes"}, {"src": "UsageInstructions/InsertCharts.htm", "name": "Insert charts" }, - {"src": "UsageInstructions/AlignArrangeObjects.htm", "name": "Align and arrange objects on a page" }, - {"src": "UsageInstructions/ChangeWrappingStyle.htm", "name": "Change wrapping style"}, - {"src": "UsageInstructions/AddHyperlinks.htm", "name": "Add hyperlinks"}, - {"src": "UsageInstructions/InsertDropCap.htm", "name": "Insert a drop cap"}, - {"src": "UsageInstructions/InsertHeadersFooters.htm", "name": "Insert headers and footers"}, - { "src": "UsageInstructions/InsertPageNumbers.htm", "name": "Insert page numbers" }, - {"src": "UsageInstructions/InsertFootnotes.htm", "name": "Insert footnotes" }, - {"src": "UsageInstructions/InsertEquation.htm", "name": "Insert equations" }, {"src": "UsageInstructions/InsertTextObjects.htm", "name": "Insert text objects" }, - {"src": "UsageInstructions/UseMailMerge.htm", "name": "Use mail merge"}, - {"src": "UsageInstructions/ViewDocInfo.htm", "name": "View document information"}, - {"src": "UsageInstructions/SavePrintDownload.htm", "name": "Save/download/print your document"}, - {"src": "UsageInstructions/OpenCreateNew.htm", "name": "Create a new document or open an existing one"}, - {"src": "HelpfulHints/About.htm", "name": "About Document Editor", "headername": "Helpful Hints"}, - {"src": "HelpfulHints/SupportedFormats.htm", "name": "Supported Formats of Electronic Documents"}, - {"src": "HelpfulHints/AdvancedSettings.htm", "name": "Advanced Settings of Document Editor"}, - {"src": "HelpfulHints/Navigation.htm", "name": "View Settings and Navigation Tools"}, - {"src": "HelpfulHints/Search.htm", "name": "Search and Replace Function"}, - {"src": "HelpfulHints/CollaborativeEditing.htm", "name": "Collaborative Document Editing"}, - {"src": "HelpfulHints/Review.htm", "name": "Document Review"}, - {"src": "HelpfulHints/SpellChecking.htm", "name": "Spell-checking"}, - {"src": "HelpfulHints/KeyboardShortcuts.htm", "name": "Keyboard Shortcuts"} + {"src": "UsageInstructions/AlignArrangeObjects.htm", "name": "Align and arrange objects on a page" }, + {"src": "UsageInstructions/ChangeWrappingStyle.htm", "name": "Change wrapping style" }, + {"src": "UsageInstructions/UseMailMerge.htm", "name": "Use mail merge", "headername": "Mail Merge"}, + {"src": "UsageInstructions/InsertEquation.htm", "name": "Insert equations", "headername": "Math equations"}, + {"src": "HelpfulHints/CollaborativeEditing.htm", "name": "Collaborative document editing", "headername": "Document co-editing"}, + {"src": "HelpfulHints/Review.htm", "name": "Document Review"}, + {"src": "UsageInstructions/ViewDocInfo.htm", "name": "View document information", "headername": "Document co-editing"}, + {"src": "UsageInstructions/SavePrintDownload.htm", "name": "Save/download/print your document" }, + {"src": "HelpfulHints/AdvancedSettings.htm", "name": "Advanced settings of Document Editor"}, + {"src": "HelpfulHints/Navigation.htm", "name": "View settings and navigation tools"}, + {"src": "HelpfulHints/Search.htm", "name": "Search and replace function"}, + {"src": "HelpfulHints/SpellChecking.htm", "name": "Spell-checking"}, + {"src": "HelpfulHints/About.htm", "name": "About Document Editor", "headername": "Helpful hints"}, + {"src": "HelpfulHints/SupportedFormats.htm", "name": "Supported formats of electronic documents" }, + {"src": "HelpfulHints/KeyboardShortcuts.htm", "name": "Keyboard shortcuts"} ] \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/en/HelpfulHints/About.htm b/apps/documenteditor/main/resources/help/en/HelpfulHints/About.htm index 3c10ae6a4..ada6445c2 100644 --- a/apps/documenteditor/main/resources/help/en/HelpfulHints/About.htm +++ b/apps/documenteditor/main/resources/help/en/HelpfulHints/About.htm @@ -5,9 +5,14 @@ + +
    +
    + +

    About Document Editor

    Document Editor is an online application that lets you look through and edit documents directly in your browser.

    diff --git a/apps/documenteditor/main/resources/help/en/HelpfulHints/AdvancedSettings.htm b/apps/documenteditor/main/resources/help/en/HelpfulHints/AdvancedSettings.htm index 274ba1f24..7645170c0 100644 --- a/apps/documenteditor/main/resources/help/en/HelpfulHints/AdvancedSettings.htm +++ b/apps/documenteditor/main/resources/help/en/HelpfulHints/AdvancedSettings.htm @@ -5,9 +5,14 @@ + +
    +
    + +

    Advanced Settings of Document Editor

    Document Editor lets you change its advanced settings. To access them, open the File tab at the top toolbar and select the Advanced Settings... option. You can also use the Advanced settings icon icon in the right upper corner at the Home tab of the top toolbar.

    The advanced settings are:

    diff --git a/apps/documenteditor/main/resources/help/en/HelpfulHints/CollaborativeEditing.htm b/apps/documenteditor/main/resources/help/en/HelpfulHints/CollaborativeEditing.htm index b3ca6fbc1..13d123f22 100644 --- a/apps/documenteditor/main/resources/help/en/HelpfulHints/CollaborativeEditing.htm +++ b/apps/documenteditor/main/resources/help/en/HelpfulHints/CollaborativeEditing.htm @@ -6,9 +6,13 @@ +
    +
    + +

    Collaborative Document Editing

    Document Editor offers you the possibility to work at a document collaboratively with other users. This feature includes:

      @@ -26,7 +30,7 @@

      When no users are viewing or editing the file, the icon in the editor header will look like Manage document access rights icon allowing you to manage the users who have access to the file right from the document: invite new users giving them permissions to edit, read or review the document, or deny some users access rights to the file. Click this icon to manage the access to the file; this can be done both when there are no other users who view or co-edit the document at the moment and when there are other users and the icon looks like Number of users icon.

      As soon as one of the users saves his/her changes by clicking the Save icon icon, the others will see a note within the status bar stating that they have updates. To save the changes you made, so that other users can view them, and get the updates saved by your co-editors, click the Save icon icon in the left upper corner of the top toolbar. The updates will be highlighted for you to check what exactly has been changed.

      You can specify what changes you want to be highlighted during co-editing if you click the File tab at the top toolbar, select the Advanced Settings... option and choose between none, all and last realtime collaboration changes. Selecting View all changes, all the changes made during the current session will be highlighted. Selecting View last changes, only the changes made since you last time clicked the Save icon icon will be highlighted. Selecting View None changes, changes made during the current session will not be highlighted.

      -

      Chat

      +

      Chat

      You can use this tool to coordinate the co-editing process on-the-fly, for example, to arrange with your collaborators about who is doing what, which paragraph you are going to edit now etc.

      The chat messages are stored during one session only. To discuss the document content it is better to use comments which are stored until you decide to delete them.

      To access the chat and leave a message for other users,

      @@ -38,7 +42,7 @@

      All the messages left by users will be displayed on the panel on the left. If there are new messages you haven't read yet, the chat icon will look like this - Chat icon.

      To close the panel with chat messages, click the Chat icon icon once again.

    -

    Comments

    +

    Comments

    To leave a comment,

    1. select a text passage where you think there is an error or problem,
    2. diff --git a/apps/documenteditor/main/resources/help/en/HelpfulHints/KeyboardShortcuts.htm b/apps/documenteditor/main/resources/help/en/HelpfulHints/KeyboardShortcuts.htm index 7bd104742..5683eadb1 100644 --- a/apps/documenteditor/main/resources/help/en/HelpfulHints/KeyboardShortcuts.htm +++ b/apps/documenteditor/main/resources/help/en/HelpfulHints/KeyboardShortcuts.htm @@ -6,9 +6,13 @@ +
      +
      + +

      Keyboard Shortcuts

      diff --git a/apps/documenteditor/main/resources/help/en/HelpfulHints/Navigation.htm b/apps/documenteditor/main/resources/help/en/HelpfulHints/Navigation.htm index e01f5a41c..b2cb0f37b 100644 --- a/apps/documenteditor/main/resources/help/en/HelpfulHints/Navigation.htm +++ b/apps/documenteditor/main/resources/help/en/HelpfulHints/Navigation.htm @@ -5,9 +5,14 @@ + +
      +
      + +

      View Settings and Navigation Tools

      Document Editor offers several tools to help you view and navigate through your document: zoom, page number indicator etc.

      Adjust the View Settings

      diff --git a/apps/documenteditor/main/resources/help/en/HelpfulHints/Review.htm b/apps/documenteditor/main/resources/help/en/HelpfulHints/Review.htm index 6bbe17489..be8b60c57 100644 --- a/apps/documenteditor/main/resources/help/en/HelpfulHints/Review.htm +++ b/apps/documenteditor/main/resources/help/en/HelpfulHints/Review.htm @@ -5,9 +5,14 @@ + +
      +
      + +

      Document Review

      When somebody shares a file with you that has review permissions, you need to use the document Review feature.

      If you are the reviewer, then you can use the Review option to review the document, change the sentences, phrases and other page elements, correct spelling, and do other things to the document without actually editing it. All your changes will be recorded and shown to the person who sent the document to you.

      @@ -19,14 +24,14 @@
    3. switch to the Review tab at the top toolbar and press the Track Changes button Track Changes button.
    4. Note: it is not necessary for the reviewer to enable the Track Changes option. It is enabled by default and cannot be disabled when the document is shared with review only access rights.

      -

      Choose the changes display mode

      +

      Choose the changes display mode

      Click the Display Mode button Display Mode button at the top toolbar and select one of the available modes from the list:

      • All changes (Editing) - this option is selected by default. It allows both to view suggested changes and edit the document.
      • All changes accepted (Preview) - this mode is used to display all the changes as if they were accepted. This option does not actually accept all changes, it only allows you to see how the document will look like after you accept all the changes. In this mode, you cannot edit the document.
      • All changes rejected (Preview) - this mode is used to display all the changes as if they were rejected. This option does not actually reject all changes, it only allows you to view the document without changes. In this mode, you cannot edit the document.
      -

      Accept or reject changes

      +

      Accept or reject changes

      Use the To Previous Change button Previous and the To Next Change button Next buttons at the top toolbar to navigate among the changes.

      To accept the currently selected change you can:

      ","
      "],col:[2,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],_default:[0,"",""]};ct.optgroup=ct.option,ct.tbody=ct.tfoot=ct.colgroup=ct.caption=ct.thead,ct.th=ct.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===undefined?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(mt(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&dt(mt(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++)1===e.nodeType&&(x.cleanData(mt(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!it.test(e)&&!ct[(nt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(tt,"<$1>");try{for(;r>n;n++)t=this[n]||{},1===t.nodeType&&(x.cleanData(mt(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=f.apply([],e);var r,i,o,s,a,u,l=0,c=this.length,p=this,h=c-1,d=e[0],g=x.isFunction(d);if(g||!(1>=c||"string"!=typeof d||x.support.checkClone)&&st.test(d))return this.each(function(r){var i=p.eq(r);g&&(e[0]=d.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(r=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),i=r.firstChild,1===r.childNodes.length&&(r=i),i)){for(o=x.map(mt(r,"script"),ft),s=o.length;c>l;l++)a=r,l!==h&&(a=x.clone(a,!0,!0),s&&x.merge(o,mt(a,"script"))),t.call(this[l],a,l);if(s)for(u=o[o.length-1].ownerDocument,x.map(o,ht),l=0;s>l;l++)a=o[l],at.test(a.type||"")&&!q.access(a,"globalEval")&&x.contains(u,a)&&(a.src?x._evalUrl(a.src):x.globalEval(a.textContent.replace(lt,"")))}return this}}),x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=[],i=x(e),o=i.length-1,s=0;for(;o>=s;s++)n=s===o?this:this.clone(!0),x(i[s])[t](n),h.apply(r,n.get());return this.pushStack(r)}}),x.extend({clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=x.contains(e.ownerDocument,e);if(!(x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(s=mt(a),o=mt(e),r=0,i=o.length;i>r;r++)yt(o[r],s[r]);if(t)if(n)for(o=o||mt(e),s=s||mt(a),r=0,i=o.length;i>r;r++)gt(o[r],s[r]);else gt(e,a);return s=mt(a,"script"),s.length>0&&dt(s,!u&&mt(e,"script")),a},buildFragment:function(e,t,n,r){var i,o,s,a,u,l,c=0,p=e.length,f=t.createDocumentFragment(),h=[];for(;p>c;c++)if(i=e[c],i||0===i)if("object"===x.type(i))x.merge(h,i.nodeType?[i]:i);else if(rt.test(i)){o=o||f.appendChild(t.createElement("div")),s=(nt.exec(i)||["",""])[1].toLowerCase(),a=ct[s]||ct._default,o.innerHTML=a[1]+i.replace(tt,"<$1>")+a[2],l=a[0];while(l--)o=o.lastChild;x.merge(h,o.childNodes),o=f.firstChild,o.textContent=""}else h.push(t.createTextNode(i));f.textContent="",c=0;while(i=h[c++])if((!r||-1===x.inArray(i,r))&&(u=x.contains(i.ownerDocument,i),o=mt(f.appendChild(i),"script"),u&&dt(o),n)){l=0;while(i=o[l++])at.test(i.type||"")&&n.push(i)}return f},cleanData:function(e){var t,n,r,i,o,s,a=x.event.special,u=0;for(;(n=e[u])!==undefined;u++){if(F.accepts(n)&&(o=n[q.expando],o&&(t=q.cache[o]))){if(r=Object.keys(t.events||{}),r.length)for(s=0;(i=r[s])!==undefined;s++)a[i]?x.event.remove(n,i):x.removeEvent(n,i,t.handle);q.cache[o]&&delete q.cache[o]}delete L.cache[n[L.expando]]}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}});function pt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function ft(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function ht(e){var t=ut.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function dt(e,t){var n=e.length,r=0;for(;n>r;r++)q.set(e[r],"globalEval",!t||q.get(t[r],"globalEval"))}function gt(e,t){var n,r,i,o,s,a,u,l;if(1===t.nodeType){if(q.hasData(e)&&(o=q.access(e),s=q.set(t,o),l=o.events)){delete s.handle,s.events={};for(i in l)for(n=0,r=l[i].length;r>n;n++)x.event.add(t,i,l[i][n])}L.hasData(e)&&(a=L.access(e),u=x.extend({},a),L.set(t,u))}}function mt(e,t){var n=e.getElementsByTagName?e.getElementsByTagName(t||"*"):e.querySelectorAll?e.querySelectorAll(t||"*"):[];return t===undefined||t&&x.nodeName(e,t)?x.merge([e],n):n}function yt(e,t){var n=t.nodeName.toLowerCase();"input"===n&&ot.test(e.type)?t.checked=e.checked:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}x.fn.extend({wrapAll:function(e){var t;return x.isFunction(e)?this.each(function(t){x(this).wrapAll(e.call(this,t))}):(this[0]&&(t=x(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var vt,xt,bt=/^(none|table(?!-c[ea]).+)/,wt=/^margin/,Tt=RegExp("^("+b+")(.*)$","i"),Ct=RegExp("^("+b+")(?!px)[a-z%]+$","i"),kt=RegExp("^([+-])=("+b+")","i"),Nt={BODY:"block"},Et={position:"absolute",visibility:"hidden",display:"block"},St={letterSpacing:0,fontWeight:400},jt=["Top","Right","Bottom","Left"],Dt=["Webkit","O","Moz","ms"];function At(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Dt.length;while(i--)if(t=Dt[i]+n,t in e)return t;return r}function Lt(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function qt(t){return e.getComputedStyle(t,null)}function Ht(e,t){var n,r,i,o=[],s=0,a=e.length;for(;a>s;s++)r=e[s],r.style&&(o[s]=q.get(r,"olddisplay"),n=r.style.display,t?(o[s]||"none"!==n||(r.style.display=""),""===r.style.display&&Lt(r)&&(o[s]=q.access(r,"olddisplay",Rt(r.nodeName)))):o[s]||(i=Lt(r),(n&&"none"!==n||!i)&&q.set(r,"olddisplay",i?n:x.css(r,"display"))));for(s=0;a>s;s++)r=e[s],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[s]||"":"none"));return e}x.fn.extend({css:function(e,t){return x.access(this,function(e,t,n){var r,i,o={},s=0;if(x.isArray(t)){for(r=qt(e),i=t.length;i>s;s++)o[t[s]]=x.css(e,t[s],!1,r);return o}return n!==undefined?x.style(e,t,n):x.css(e,t)},e,t,arguments.length>1)},show:function(){return Ht(this,!0)},hide:function(){return Ht(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Lt(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=vt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,s,a=x.camelCase(t),u=e.style;return t=x.cssProps[a]||(x.cssProps[a]=At(u,a)),s=x.cssHooks[t]||x.cssHooks[a],n===undefined?s&&"get"in s&&(i=s.get(e,!1,r))!==undefined?i:u[t]:(o=typeof n,"string"===o&&(i=kt.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(x.css(e,t)),o="number"),null==n||"number"===o&&isNaN(n)||("number"!==o||x.cssNumber[a]||(n+="px"),x.support.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),s&&"set"in s&&(n=s.set(e,n,r))===undefined||(u[t]=n)),undefined)}},css:function(e,t,n,r){var i,o,s,a=x.camelCase(t);return t=x.cssProps[a]||(x.cssProps[a]=At(e.style,a)),s=x.cssHooks[t]||x.cssHooks[a],s&&"get"in s&&(i=s.get(e,!0,n)),i===undefined&&(i=vt(e,t,r)),"normal"===i&&t in St&&(i=St[t]),""===n||n?(o=parseFloat(i),n===!0||x.isNumeric(o)?o||0:i):i}}),vt=function(e,t,n){var r,i,o,s=n||qt(e),a=s?s.getPropertyValue(t)||s[t]:undefined,u=e.style;return s&&(""!==a||x.contains(e.ownerDocument,e)||(a=x.style(e,t)),Ct.test(a)&&wt.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=s.width,u.width=r,u.minWidth=i,u.maxWidth=o)),a};function Ot(e,t,n){var r=Tt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function Ft(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,s=0;for(;4>o;o+=2)"margin"===n&&(s+=x.css(e,n+jt[o],!0,i)),r?("content"===n&&(s-=x.css(e,"padding"+jt[o],!0,i)),"margin"!==n&&(s-=x.css(e,"border"+jt[o]+"Width",!0,i))):(s+=x.css(e,"padding"+jt[o],!0,i),"padding"!==n&&(s+=x.css(e,"border"+jt[o]+"Width",!0,i)));return s}function Pt(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=qt(e),s=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=vt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Ct.test(i))return i;r=s&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+Ft(e,t,n||(s?"border":"content"),r,o)+"px"}function Rt(e){var t=o,n=Nt[e];return n||(n=Mt(e,t),"none"!==n&&n||(xt=(xt||x("