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) { %>',
- '',
- '<%= Common.Utils.String.htmlEncode(item.name) %> | ',
- '<%= Common.Utils.String.htmlEncode(item.date) %> | ',
- '
',
- '<% }); %>',
+ var me = this;
+ this.templateSignature = _.template([
+ '',
+ '',
+ '<%= 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