From e222fdf4a740ce5ed26c734683c67a6df5a105b2 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 4 Aug 2020 22:20:20 +0300 Subject: [PATCH 1/3] Add parameter to api config: customization.reviewPermissions (user name must be prefixed) --- .../main/lib/controller/ReviewChanges.js | 35 ++++++--- .../template/ReviewChangesPopover.template | 2 +- apps/common/main/lib/util/utils.js | 27 +++++++ apps/common/main/lib/view/Chat.js | 2 +- apps/common/main/lib/view/Comments.js | 2 +- apps/common/main/lib/view/Header.js | 4 +- apps/common/main/lib/view/History.js | 2 +- apps/common/main/lib/view/ReviewChanges.js | 77 ++++++++++--------- .../main/app/controller/Main.js | 7 +- .../main/app/view/DocumentHolder.js | 2 +- .../main/app/view/FileMenuPanels.js | 2 +- .../main/app/controller/Main.js | 7 +- .../main/app/view/DocumentHolder.js | 2 +- .../main/app/view/FileMenuPanels.js | 2 +- .../main/app/controller/DocumentHolder.js | 2 +- .../main/app/controller/Main.js | 6 +- .../main/app/view/FileMenuPanels.js | 2 +- .../main/app/view/NameManagerDlg.js | 2 +- 18 files changed, 120 insertions(+), 65 deletions(-) diff --git a/apps/common/main/lib/controller/ReviewChanges.js b/apps/common/main/lib/controller/ReviewChanges.js index 4d842e87f..d8a79c5cc 100644 --- a/apps/common/main/lib/controller/ReviewChanges.js +++ b/apps/common/main/lib/controller/ReviewChanges.js @@ -117,6 +117,16 @@ define([ if (data) { this.currentUserId = data.config.user.id; + if (this.appConfig && this.appConfig.canUseReviewPermissions) { + var permissions = this.appConfig.customization.reviewPermissions, + arr = [], + groups = Common.Utils.UserInfoParser.getParsedGroups(data.config.user.fullname); + groups && groups.forEach(function(group) { + var item = permissions[group.trim()]; + item && (arr = arr.concat(item)); + }); + this.currentUserGroups = arr; + } this.sdkViewName = data['sdkviewname'] || this.sdkViewName; } return this; @@ -183,7 +193,8 @@ define([ posY = sdkchange[0].get_Y(), animate = ( Math.abs(this._state.posx-posX)>0.001 || Math.abs(this._state.posy-posY)>0.001) || (sdkchange.length !== this._state.changes_length), lock = (sdkchange[0].get_LockUserId()!==null), - lockUser = this.getUserName(sdkchange[0].get_LockUserId()); + lockUser = this.getUserName(sdkchange[0].get_LockUserId()), + editable = changes[0].get('editable'); this.getPopover().hideTips(); this.popoverChanges.reset(changes); @@ -195,14 +206,15 @@ define([ this.getPopover().showReview(animate, lock, lockUser); - if (this.appConfig.canReview && !this.appConfig.isReviewOnly && this._state.lock !== lock) { - this.view.btnAccept.setDisabled(lock==true); - this.view.btnReject.setDisabled(lock==true); + var btnlock = lock || !editable; + if (this.appConfig.canReview && !this.appConfig.isReviewOnly && this._state.lock !== btnlock) { + this.view.btnAccept.setDisabled(btnlock); + this.view.btnReject.setDisabled(btnlock); if (this.dlgChanges) { - this.dlgChanges.btnAccept.setDisabled(lock==true); - this.dlgChanges.btnReject.setDisabled(lock==true); + this.dlgChanges.btnAccept.setDisabled(btnlock); + this.dlgChanges.btnReject.setDisabled(btnlock); } - this._state.lock = lock; + this._state.lock = btnlock; } this._state.posx = posX; this._state.posy = posY; @@ -459,7 +471,7 @@ define([ scope : me.view, hint : !me.appConfig.canReview, goto : (item.get_MoveType() == Asc.c_oAscRevisionsMove.MoveTo || item.get_MoveType() == Asc.c_oAscRevisionsMove.MoveFrom), - editable : (item.get_UserId() == me.currentUserId) + editable : me.appConfig.isReviewOnly && (item.get_UserId() == me.currentUserId) || !me.appConfig.isReviewOnly && (!me.appConfig.canUseReviewPermissions || me.checkUserGroups(item.get_UserName())) }); arr.push(change); @@ -467,10 +479,15 @@ define([ return arr; }, + checkUserGroups: function(username) { + var groups = Common.Utils.UserInfoParser.getParsedGroups(username); + return this.currentUserGroups && groups && (_.intersection(this.currentUserGroups, groups).length>0); + }, + getUserName: function(id){ if (this.userCollection && id!==null){ var rec = this.userCollection.findUser(id); - if (rec) return rec.get('username'); + if (rec) return Common.Utils.UserInfoParser.getParsedName(rec.get('username')); } return ''; }, diff --git a/apps/common/main/lib/template/ReviewChangesPopover.template b/apps/common/main/lib/template/ReviewChangesPopover.template index 0f6ed8e70..aa9b75381 100644 --- a/apps/common/main/lib/template/ReviewChangesPopover.template +++ b/apps/common/main/lib/template/ReviewChangesPopover.template @@ -13,7 +13,7 @@ <% if (editable) { %>
<% } %> - <% } else { %> + <% } else if (editable) { %>
<% } %> diff --git a/apps/common/main/lib/util/utils.js b/apps/common/main/lib/util/utils.js index 948cbb4e3..ab2262a08 100644 --- a/apps/common/main/lib/util/utils.js +++ b/apps/common/main/lib/util/utils.js @@ -959,4 +959,31 @@ Common.Utils.ModalWindow = new(function() { return count>0; } } +})(); + +Common.Utils.UserInfoParser = new(function() { + var parse = false; + return { + setParser: function(value) { + parse = !!value; + }, + + getParsedName: function(username) { + if (parse && username) { + return username.substring(username.indexOf(':')+1); + } else + return username; + }, + + getParsedGroups: function(username) { + if (parse && username) { + var idx = username.indexOf(':'), + groups = (idx>-1) ? username.substring(0, idx).split(',') : []; + for (var i=0; i', '
', '
', - '
<%= Common.Utils.String.htmlEncode(username) %>', + '
<%= Common.Utils.String.htmlEncode(Common.Utils.UserInfoParser.getParsedName(username)) %>', '', '<% if (canRestore && selected) { %>', '', diff --git a/apps/common/main/lib/view/ReviewChanges.js b/apps/common/main/lib/view/ReviewChanges.js index bbb3bbf2c..570356601 100644 --- a/apps/common/main/lib/view/ReviewChanges.js +++ b/apps/common/main/lib/view/ReviewChanges.js @@ -108,7 +108,7 @@ define([ me.fireEvent('reviewchange:accept', [me.btnAccept, 'current']); }); - this.btnAccept.menu.on('item:click', function (menu, item, e) { + this.btnAccept.menu && this.btnAccept.menu.on('item:click', function (menu, item, e) { me.fireEvent('reviewchange:accept', [menu, item]); }); @@ -116,7 +116,7 @@ define([ me.fireEvent('reviewchange:reject', [me.btnReject, 'current']); }); - this.btnReject.menu.on('item:click', function (menu, item, e) { + this.btnReject.menu && this.btnReject.menu.on('item:click', function (menu, item, e) { me.fireEvent('reviewchange:reject', [menu, item]); }); @@ -202,14 +202,14 @@ define([ this.btnAccept = new Common.UI.Button({ cls: 'btn-toolbar x-huge icon-top', caption: this.txtAccept, - split: true, + split: !this.appConfig.canUseReviewPermissions, iconCls: 'toolbar__icon btn-review-save' }); this.btnReject = new Common.UI.Button({ cls: 'btn-toolbar x-huge icon-top', caption: this.txtReject, - split: true, + split: !this.appConfig.canUseReviewPermissions, iconCls: 'toolbar__icon btn-review-deny' }); @@ -358,36 +358,37 @@ define([ if ( config.canReview ) { me.btnTurnOn.updateHint(me.tipReview); - me.btnAccept.setMenu( - new Common.UI.Menu({ - items: [ - { - caption: me.txtAcceptCurrent, - value: 'current' - }, - { - caption: me.txtAcceptAll, - value: 'all' - } - ] - }) - ); + if (!me.appConfig.canUseReviewPermissions) { + me.btnAccept.setMenu( + new Common.UI.Menu({ + items: [ + { + caption: me.txtAcceptCurrent, + value: 'current' + }, + { + caption: me.txtAcceptAll, + value: 'all' + } + ] + }) + ); + me.btnReject.setMenu( + new Common.UI.Menu({ + items: [ + { + caption: me.txtRejectCurrent, + value: 'current' + }, + { + caption: me.txtRejectAll, + value: 'all' + } + ] + }) + ); + } me.btnAccept.updateHint([me.tipAcceptCurrent, me.txtAcceptChanges]); - - me.btnReject.setMenu( - new Common.UI.Menu({ - items: [ - { - caption: me.txtRejectCurrent, - value: 'current' - }, - { - caption: me.txtRejectAll, - value: 'all' - } - ] - }) - ); me.btnReject.updateHint([me.tipRejectCurrent, me.txtRejectChanges]); if (config.canFeatureComparison) { @@ -583,7 +584,7 @@ define([ }, getUserName: function (username) { - return Common.Utils.String.htmlEncode(username); + return Common.Utils.String.htmlEncode(Common.Utils.UserInfoParser.getParsedName(username)); }, turnChanges: function(state) { @@ -771,7 +772,7 @@ define([ caption : this.txtAccept, split : true, disabled : this.mode.isReviewOnly, - menu : new Common.UI.Menu({ + menu : this.mode.canUseReviewPermissions ? false : new Common.UI.Menu({ items: [ this.mnuAcceptCurrent = new Common.UI.MenuItem({ caption: this.txtAcceptCurrent, @@ -791,7 +792,7 @@ define([ caption : this.txtReject, split : true, disabled : this.mode.isReviewOnly, - menu : new Common.UI.Menu({ + menu : this.mode.canUseReviewPermissions ? false : new Common.UI.Menu({ items: [ this.mnuRejectCurrent = new Common.UI.MenuItem({ caption: this.txtRejectCurrent, @@ -819,7 +820,7 @@ define([ me.fireEvent('reviewchange:accept', [me.btnAccept, 'current']); }); - this.btnAccept.menu.on('item:click', function (menu, item, e) { + this.btnAccept.menu && this.btnAccept.menu.on('item:click', function (menu, item, e) { me.fireEvent('reviewchange:accept', [menu, item]); }); @@ -827,7 +828,7 @@ define([ me.fireEvent('reviewchange:reject', [me.btnReject, 'current']); }); - this.btnReject.menu.on('item:click', function (menu, item, e) { + this.btnReject.menu && this.btnReject.menu.on('item:click', function (menu, item, e) { me.fireEvent('reviewchange:reject', [menu, item]); }); diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index 7a258277c..e326f8f13 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -372,8 +372,7 @@ define([ this.appOptions.mentionShare = !((typeof (this.appOptions.customization) == 'object') && (this.appOptions.customization.mentionShare==false)); appHeader = this.getApplication().getController('Viewport').getView('Common.Views.Header'); - appHeader.setCanBack(this.appOptions.canBackToFolder === true, (this.appOptions.canBackToFolder) ? this.editorConfig.customization.goback.text : '') - .setUserName(this.appOptions.user.fullname); + appHeader.setCanBack(this.appOptions.canBackToFolder === true, (this.appOptions.canBackToFolder) ? this.editorConfig.customization.goback.text : ''); if (this.editorConfig.lang) this.api.asc_setLocale(this.editorConfig.lang); @@ -1273,6 +1272,10 @@ define([ if (this.appOptions.canBranding) appHeader.setBranding(this.editorConfig.customization); + this.appOptions.canUseReviewPermissions = this.appOptions.canBranding && this.appOptions.canLicense && this.editorConfig.customization && this.editorConfig.customization.reviewPermissions && (typeof (this.editorConfig.customization.reviewPermissions) == 'object'); + Common.Utils.UserInfoParser.setParser(this.appOptions.canUseReviewPermissions); + appHeader.setUserName(Common.Utils.UserInfoParser.getParsedName(this.appOptions.user.fullname)); + this.appOptions.canRename && appHeader.setCanRename(true); this.appOptions.canBrandingExt = params.asc_getCanBranding() && (typeof this.editorConfig.customization == 'object' || this.editorConfig.plugins); this.getApplication().getController('Common.Controllers.Plugins').setMode(this.appOptions); diff --git a/apps/documenteditor/main/app/view/DocumentHolder.js b/apps/documenteditor/main/app/view/DocumentHolder.js index 292e00327..cac724954 100644 --- a/apps/documenteditor/main/app/view/DocumentHolder.js +++ b/apps/documenteditor/main/app/view/DocumentHolder.js @@ -359,7 +359,7 @@ define([ if (usersStore){ var rec = usersStore.findUser(id); if (rec) - return rec.get('username'); + return Common.Utils.UserInfoParser.getParsedName(rec.get('username')); } return me.guestText; }; diff --git a/apps/documenteditor/main/app/view/FileMenuPanels.js b/apps/documenteditor/main/app/view/FileMenuPanels.js index d89dcf1a6..ee31cb181 100644 --- a/apps/documenteditor/main/app/view/FileMenuPanels.js +++ b/apps/documenteditor/main/app/view/FileMenuPanels.js @@ -1121,7 +1121,7 @@ define([ visible = this._ShowHideInfoItem(this.lblModifyDate, !!value) || visible; value = props.asc_getLastModifiedBy(); if (value) - this.lblModifyBy.text(value); + this.lblModifyBy.text(Common.Utils.UserInfoParser.getParsedName(value)); visible = this._ShowHideInfoItem(this.lblModifyBy, !!value) || visible; $('tr.divider.modify', this.el)[visible?'show':'hide'](); diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js index cac7e7d86..dc4f4a1bf 100644 --- a/apps/presentationeditor/main/app/controller/Main.js +++ b/apps/presentationeditor/main/app/controller/Main.js @@ -331,8 +331,7 @@ define([ this.appOptions.mentionShare = !((typeof (this.appOptions.customization) == 'object') && (this.appOptions.customization.mentionShare==false)); appHeader = this.getApplication().getController('Viewport').getView('Common.Views.Header'); - appHeader.setCanBack(this.appOptions.canBackToFolder === true, (this.appOptions.canBackToFolder) ? this.editorConfig.customization.goback.text : '') - .setUserName(this.appOptions.user.fullname); + appHeader.setCanBack(this.appOptions.canBackToFolder === true, (this.appOptions.canBackToFolder) ? this.editorConfig.customization.goback.text : ''); if (this.editorConfig.lang) this.api.asc_setLocale(this.editorConfig.lang); @@ -976,6 +975,10 @@ define([ if (this.appOptions.canBranding) appHeader.setBranding(this.editorConfig.customization); + this.appOptions.canUseReviewPermissions = this.appOptions.canBranding && this.appOptions.canLicense && this.editorConfig.customization && this.editorConfig.customization.reviewPermissions && (typeof (this.editorConfig.customization.reviewPermissions) == 'object'); + Common.Utils.UserInfoParser.setParser(this.appOptions.canUseReviewPermissions); + appHeader.setUserName(Common.Utils.UserInfoParser.getParsedName(this.appOptions.user.fullname)); + this.appOptions.canRename && appHeader.setCanRename(true); this.appOptions.canBrandingExt = params.asc_getCanBranding() && (typeof this.editorConfig.customization == 'object' || this.editorConfig.plugins); this.getApplication().getController('Common.Controllers.Plugins').setMode(this.appOptions); diff --git a/apps/presentationeditor/main/app/view/DocumentHolder.js b/apps/presentationeditor/main/app/view/DocumentHolder.js index 8b23928e1..53670b510 100644 --- a/apps/presentationeditor/main/app/view/DocumentHolder.js +++ b/apps/presentationeditor/main/app/view/DocumentHolder.js @@ -363,7 +363,7 @@ define([ if (usersStore){ var rec = usersStore.findUser(id); if (rec) - return rec.get('username'); + return Common.Utils.UserInfoParser.getParsedName(rec.get('username')); } return me.guestText; }; diff --git a/apps/presentationeditor/main/app/view/FileMenuPanels.js b/apps/presentationeditor/main/app/view/FileMenuPanels.js index 23651deeb..197bcf22a 100644 --- a/apps/presentationeditor/main/app/view/FileMenuPanels.js +++ b/apps/presentationeditor/main/app/view/FileMenuPanels.js @@ -994,7 +994,7 @@ define([ visible = this._ShowHideInfoItem(this.lblModifyDate, !!value) || visible; value = props.asc_getLastModifiedBy(); if (value) - this.lblModifyBy.text(value); + this.lblModifyBy.text(Common.Utils.UserInfoParser.getParsedName(value)); visible = this._ShowHideInfoItem(this.lblModifyBy, !!value) || visible; $('tr.divider.modify', this.el)[visible?'show':'hide'](); diff --git a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js index e0b4360f4..caf2b3c5d 100644 --- a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js +++ b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js @@ -1065,7 +1065,7 @@ define([ if (usersStore){ var rec = usersStore.findUser(id); if (rec) - return rec.get('username'); + return Common.Utils.UserInfoParser.getParsedName(rec.get('username')); } return me.guestText; }; diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index 60801c928..b6f72d27b 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -360,8 +360,7 @@ define([ this.appOptions.canFeaturePivot = !!this.api.asc_isSupportFeature("pivot-tables"); this.headerView = this.getApplication().getController('Viewport').getView('Common.Views.Header'); - this.headerView.setCanBack(this.appOptions.canBackToFolder === true, (this.appOptions.canBackToFolder) ? this.editorConfig.customization.goback.text : '') - .setUserName(this.appOptions.user.fullname); + this.headerView.setCanBack(this.appOptions.canBackToFolder === true, (this.appOptions.canBackToFolder) ? this.editorConfig.customization.goback.text : ''); var reg = Common.localStorage.getItem("sse-settings-reg-settings"), isUseBaseSeparator = Common.localStorage.getBool("sse-settings-use-base-separator", true), @@ -1032,6 +1031,9 @@ define([ this.headerView.setBranding(this.editorConfig.customization); this.appOptions.canRename && this.headerView.setCanRename(true); + this.appOptions.canUseReviewPermissions = this.appOptions.canBranding && this.appOptions.canLicense && this.editorConfig.customization && this.editorConfig.customization.reviewPermissions && (typeof (this.editorConfig.customization.reviewPermissions) == 'object'); + Common.Utils.UserInfoParser.setParser(this.appOptions.canUseReviewPermissions); + this.headerView.setUserName(Common.Utils.UserInfoParser.getParsedName(this.appOptions.user.fullname)); } else this.appOptions.canModifyFilter = true; diff --git a/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js b/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js index ac727379f..9e5d562da 100644 --- a/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js +++ b/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js @@ -1801,7 +1801,7 @@ define([ visible = this._ShowHideInfoItem(this.lblModifyDate, !!value) || visible; value = props.asc_getLastModifiedBy(); if (value) - this.lblModifyBy.text(value); + this.lblModifyBy.text(Common.Utils.UserInfoParser.getParsedName(value)); visible = this._ShowHideInfoItem(this.lblModifyBy, !!value) || visible; $('tr.divider.modify', this.el)[visible?'show':'hide'](); diff --git a/apps/spreadsheeteditor/main/app/view/NameManagerDlg.js b/apps/spreadsheeteditor/main/app/view/NameManagerDlg.js index 3bd12f438..9ac77fb32 100644 --- a/apps/spreadsheeteditor/main/app/view/NameManagerDlg.js +++ b/apps/spreadsheeteditor/main/app/view/NameManagerDlg.js @@ -361,7 +361,7 @@ define([ 'text!spreadsheeteditor/main/app/template/NameManagerDlg.template', if (usersStore){ var rec = usersStore.findUser(id); if (rec) - return rec.get('username'); + return Common.Utils.UserInfoParser.getParsedName(rec.get('username')); } return this.guestText; }, From 5439ce930c8450a23b79a4201c4f8edf1d44ff90 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 5 Aug 2020 10:39:07 +0300 Subject: [PATCH 2/3] Review permissions are enabled for any license --- 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, 3 insertions(+), 3 deletions(-) diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index e326f8f13..7a2e96ebf 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -1272,7 +1272,7 @@ define([ if (this.appOptions.canBranding) appHeader.setBranding(this.editorConfig.customization); - this.appOptions.canUseReviewPermissions = this.appOptions.canBranding && this.appOptions.canLicense && this.editorConfig.customization && this.editorConfig.customization.reviewPermissions && (typeof (this.editorConfig.customization.reviewPermissions) == 'object'); + this.appOptions.canUseReviewPermissions = this.appOptions.canLicense && this.editorConfig.customization && this.editorConfig.customization.reviewPermissions && (typeof (this.editorConfig.customization.reviewPermissions) == 'object'); Common.Utils.UserInfoParser.setParser(this.appOptions.canUseReviewPermissions); appHeader.setUserName(Common.Utils.UserInfoParser.getParsedName(this.appOptions.user.fullname)); diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js index dc4f4a1bf..892e5f479 100644 --- a/apps/presentationeditor/main/app/controller/Main.js +++ b/apps/presentationeditor/main/app/controller/Main.js @@ -975,7 +975,7 @@ define([ if (this.appOptions.canBranding) appHeader.setBranding(this.editorConfig.customization); - this.appOptions.canUseReviewPermissions = this.appOptions.canBranding && this.appOptions.canLicense && this.editorConfig.customization && this.editorConfig.customization.reviewPermissions && (typeof (this.editorConfig.customization.reviewPermissions) == 'object'); + this.appOptions.canUseReviewPermissions = this.appOptions.canLicense && this.editorConfig.customization && this.editorConfig.customization.reviewPermissions && (typeof (this.editorConfig.customization.reviewPermissions) == 'object'); Common.Utils.UserInfoParser.setParser(this.appOptions.canUseReviewPermissions); appHeader.setUserName(Common.Utils.UserInfoParser.getParsedName(this.appOptions.user.fullname)); diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index b6f72d27b..b485b71f3 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -1031,7 +1031,7 @@ define([ this.headerView.setBranding(this.editorConfig.customization); this.appOptions.canRename && this.headerView.setCanRename(true); - this.appOptions.canUseReviewPermissions = this.appOptions.canBranding && this.appOptions.canLicense && this.editorConfig.customization && this.editorConfig.customization.reviewPermissions && (typeof (this.editorConfig.customization.reviewPermissions) == 'object'); + this.appOptions.canUseReviewPermissions = this.appOptions.canLicense && this.editorConfig.customization && this.editorConfig.customization.reviewPermissions && (typeof (this.editorConfig.customization.reviewPermissions) == 'object'); Common.Utils.UserInfoParser.setParser(this.appOptions.canUseReviewPermissions); this.headerView.setUserName(Common.Utils.UserInfoParser.getParsedName(this.appOptions.user.fullname)); } else From 3e0aaa04496912f7313613cd6b39309da70f228c Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 5 Aug 2020 16:36:35 +0300 Subject: [PATCH 3/3] [Mobile] Add parameter to api config: customization.reviewPermissions (user name must be prefixed) --- .../mobile/lib/controller/Collaboration.js | 40 +++++++++++++++---- apps/common/mobile/lib/view/Collaboration.js | 29 ++++++++------ apps/common/mobile/utils/utils.js | 29 +++++++++++++- .../mobile/app/controller/DocumentHolder.js | 2 +- .../mobile/app/controller/Main.js | 3 ++ .../mobile/app/controller/Settings.js | 2 +- .../mobile/app/view/add/AddOther.js | 9 ++++- .../mobile/app/controller/Main.js | 3 ++ .../mobile/app/controller/Settings.js | 2 +- .../mobile/app/view/add/AddOther.js | 9 ++++- .../mobile/app/controller/Main.js | 3 ++ .../mobile/app/controller/Settings.js | 2 +- .../mobile/app/view/add/AddOther.js | 9 ++++- 13 files changed, 112 insertions(+), 30 deletions(-) diff --git a/apps/common/mobile/lib/controller/Collaboration.js b/apps/common/mobile/lib/controller/Collaboration.js index 1b7f6d391..c0df47d38 100644 --- a/apps/common/mobile/lib/controller/Collaboration.js +++ b/apps/common/mobile/lib/controller/Collaboration.js @@ -63,7 +63,8 @@ define([ canViewReview, arrChangeReview = [], dateChange = [], - _fileKey; + _fileKey, + _currentUserGroups; return { @@ -113,6 +114,18 @@ define([ if (editor === 'DE') { _fileKey = mode.fileKey; } + + if (mode && mode.canUseReviewPermissions) { + var permissions = mode.customization.reviewPermissions, + arr = [], + groups = Common.Utils.UserInfoParser.getParsedGroups(mode.user.fullname); + groups && groups.forEach(function(group) { + var item = permissions[group.trim()]; + item && (arr = arr.concat(item)); + }); + _currentUserGroups = arr; + } + return this; }, @@ -231,7 +244,8 @@ define([ getUsersInfo: function() { var usersArray = []; _.each(editUsers, function(item){ - var fio = item.asc_getUserName().split(' '); + var name = Common.Utils.UserInfoParser.getParsedName(item.asc_getUserName()); + var fio = name.split(' '); var initials = fio[0].substring(0, 1).toUpperCase(); if (fio.length > 1) { initials += fio[fio.length - 1].substring(0, 1).toUpperCase(); @@ -241,7 +255,7 @@ define([ color: item.asc_getColor(), id: item.asc_getId(), idOriginal: item.asc_getIdOriginal(), - name: item.asc_getUserName(), + name: name, view: item.asc_getView(), initial: initials }; @@ -300,6 +314,10 @@ define([ $('#settings-accept-all').hide(); $('#settings-reject-all').hide(); } + if (this.appConfig.canUseReviewPermissions) { + $('#settings-accept-all').hide(); + $('#settings-reject-all').hide(); + } }, onTrackChanges: function(e) { @@ -407,6 +425,11 @@ define([ $('.accept-reject').html('' + this.textDelete + ''); $('#btn-delete-change').single('click', _.bind(this.onDeleteChange, this)); } + } else { + if(arrChangeReview.length != 0 && !arrChangeReview[0].editable) { + $('#btn-accept-change').addClass('disabled'); + $('#btn-reject-change').addClass('disabled'); + } } if(displayMode == "final" || displayMode == "original") { $('#btn-accept-change').addClass('disabled'); @@ -663,9 +686,7 @@ define([ userColor = item.get_UserColor(), goto = (item.get_MoveType() == Asc.c_oAscRevisionsMove.MoveTo || item.get_MoveType() == Asc.c_oAscRevisionsMove.MoveFrom); date = me.dateToLocaleTimeString(date); - var editable = (item.get_UserId() == _userId); - - + var editable = me.appConfig.isReviewOnly && (item.get_UserId() == _userId) || !me.appConfig.isReviewOnly && (!me.appConfig.canUseReviewPermissions || me.checkUserGroups(item.get_UserName())); arr.push({date: date, user: user, usercolor: userColor, changetext: changetext, goto: goto, editable: editable}); }); arrChangeReview = arr; @@ -677,6 +698,11 @@ define([ this.updateInfoChange(); }, + checkUserGroups: function(username) { + var groups = Common.Utils.UserInfoParser.getParsedGroups(username); + return _currentUserGroups && groups && (_.intersection(_currentUserGroups, groups).length>0); + }, + dateToLocaleTimeString: function (date) { function format(date) { var strTime, @@ -736,7 +762,7 @@ define([ }, getInitials: function(name) { - var fio = name.split(' '); + var fio = Common.Utils.UserInfoParser.getParsedName(name).split(' '); var initials = fio[0].substring(0, 1).toUpperCase(); if (fio.length > 1) { initials += fio[fio.length - 1].substring(0, 1).toUpperCase(); diff --git a/apps/common/mobile/lib/view/Collaboration.js b/apps/common/mobile/lib/view/Collaboration.js index 9a90b9cc4..37701504b 100644 --- a/apps/common/mobile/lib/view/Collaboration.js +++ b/apps/common/mobile/lib/view/Collaboration.js @@ -177,7 +177,7 @@ define([ if (isAndroid) { template += '
' + comment.userInitials + '
'; } - template += '
' + comment.username + '
' + + template += '
' + me.getUserName(comment.username) + '
' + '
' + comment.date + '
'; if (isAndroid) { template += '
'; @@ -202,7 +202,7 @@ define([ if (isAndroid) { template += '
' + reply.userInitials + '
' } - template += '
' + reply.username + '
' + + template += '
' + me.getUserName(reply.username) + '
' + '
' + reply.date + '
' + '
'; if (isAndroid) { @@ -249,7 +249,7 @@ define([ '
', '
', '<% if (android) { %>
<%= item.userInitials %>
<% } %>', - '
<%= item.username %>
', + '
<%= scope.getUserName(item.username) %>
', '
<%= item.date %>
', '<% if (android) { %>
<% } %>', '
', @@ -271,7 +271,7 @@ define([ '
', '
', '<% if (android) { %>
<%= reply.userInitials %>
<% } %>', - '
<%= reply.username %>
', + '
<%= scope.getUserName(reply.username) %>
', '
<%= reply.date %>
', '
', '<% if (android) { %>
<% } %>', @@ -292,7 +292,8 @@ define([ item: comment, replys: comment.replys.length, viewmode: me.viewmode, - quote: me.sliceQuote(comment.quote) + quote: me.sliceQuote(comment.quote), + scope: me })); }); $listComments.html(items.join('')); @@ -304,7 +305,7 @@ define([ var isAndroid = Framework7.prototype.device.android === true; var template = '
' + (isAndroid ? '
' + comment.userInitials + '
' : '') + - '
' + comment.username + '
' + + '
' + this.getUserName(comment.username) + '
' + '
' + comment.date + '
' + (isAndroid ? '
' : '') + '
' + @@ -317,7 +318,7 @@ define([ var isAndroid = Framework7.prototype.device.android === true; var template = '
' + (isAndroid ? '
' + initials + '
' : '') + - '
' + name + '
' + + '
' + this.getUserName(name) + '
' + '
' + date + '
' + (isAndroid ? '
' : '') + '
' + @@ -330,7 +331,7 @@ define([ var isAndroid = Framework7.prototype.device.android === true; var template = '
' + (isAndroid ? '
' + reply.userInitials + '
' : '') + - '
' + reply.username + '
' + + '
' + this.getUserName(reply.username) + '
' + '
' + reply.date + '
' + (isAndroid ? '
' : '') + '
' + @@ -354,7 +355,7 @@ define([ '
' + '
' + (isAndroid ? '
' + initial + '
' : '') + - '
' + name + '
' + + '
' + this.getUserName(name) + '
' + '
' + date + '
' + (isAndroid ? '
' : '') + '
' + @@ -401,7 +402,7 @@ define([ '
' + '
' + (isAndroid ? '
' + comment.userInitials + '
' : '') + - '
' + comment.username + '
' + + '
' + this.getUserName(comment.username) + '
' + '
' + comment.date + '
' + (isAndroid ? '
' : '') + '
' + @@ -427,7 +428,7 @@ define([ '
' + '
' + (isAndroid ? '
' + reply.userInitials + '
' : '') + - '
' + reply.username + '
' + + '
' + this.getUserName(reply.username) + '
' + '
' + reply.date + '
' + (isAndroid ? '
' : '') + '
' + @@ -442,13 +443,17 @@ define([ renderChangeReview: function(change) { var isAndroid = Framework7.prototype.device.android === true; var template = (isAndroid ? '
' + change.initials + '
' : '') + - '
' + change.user + '
' + + '
' + this.getUserName(change.user) + '
' + '
' + change.date + '
' + (isAndroid ? '
' : '') + '
' + change.text + '
'; $('#current-change').html(_.template(template)); }, + getUserName: function (username) { + return Common.Utils.String.htmlEncode(Common.Utils.UserInfoParser.getParsedName(username)); + }, + textCollaboration: 'Collaboration', textReviewing: 'Review', textСomments: 'Сomments', diff --git a/apps/common/mobile/utils/utils.js b/apps/common/mobile/utils/utils.js index d0ea75a52..83afde1fd 100644 --- a/apps/common/mobile/utils/utils.js +++ b/apps/common/mobile/utils/utils.js @@ -126,5 +126,32 @@ define([ new IScroll(targetSelector); }, 500); } - } + }; + + Common.Utils.UserInfoParser = new(function() { + var parse = false; + return { + setParser: function(value) { + parse = !!value; + }, + + getParsedName: function(username) { + if (parse && username) { + return username.substring(username.indexOf(':')+1); + } else + return username; + }, + + getParsedGroups: function(username) { + if (parse && username) { + var idx = username.indexOf(':'), + groups = (idx>-1) ? username.substring(0, idx).split(',') : []; + for (var i=0; i
<%= comment.userInitials %>
<% } %>', - '
<%= comment.username %>
', + '
<%= scope.getUserName(comment.username) %>
', '
<%= comment.date %>
', '<% if (android) { %>
<% } %>', '
' @@ -185,7 +185,8 @@ define([ var insert = _.template(template)({ android: Framework7.prototype.device.android, comment: comment, - textAddComment: me.textAddComment + textAddComment: me.textAddComment, + scope: me }); $commentInfo.html(insert); _.defer(function () { @@ -207,6 +208,10 @@ define([ }, 100); }, + getUserName: function (username) { + return Common.Utils.String.htmlEncode(Common.Utils.UserInfoParser.getParsedName(username)); + }, + renderNumFormat: function (dataFormat, selectFormat) { var $listFormat = $('#list-format-footnote ul'), items = []; diff --git a/apps/presentationeditor/mobile/app/controller/Main.js b/apps/presentationeditor/mobile/app/controller/Main.js index 06f12f856..46862cfec 100644 --- a/apps/presentationeditor/mobile/app/controller/Main.js +++ b/apps/presentationeditor/mobile/app/controller/Main.js @@ -730,6 +730,9 @@ define([ me.appOptions.canBranding = params.asc_getCustomization(); me.appOptions.canBrandingExt = params.asc_getCanBranding() && (typeof me.editorConfig.customization == 'object'); + me.appOptions.canUseReviewPermissions = me.appOptions.canLicense && me.editorConfig.customization && me.editorConfig.customization.reviewPermissions && (typeof (me.editorConfig.customization.reviewPermissions) == 'object'); + Common.Utils.UserInfoParser.setParser(me.appOptions.canUseReviewPermissions); + me.applyModeCommonElements(); me.applyModeEditorElements(); diff --git a/apps/presentationeditor/mobile/app/controller/Settings.js b/apps/presentationeditor/mobile/app/controller/Settings.js index c939fd041..4d3f3d1b3 100644 --- a/apps/presentationeditor/mobile/app/controller/Settings.js +++ b/apps/presentationeditor/mobile/app/controller/Settings.js @@ -241,7 +241,7 @@ define([ value = props.asc_getModified(); value ? $('#settings-pe-last-mod').html(value.toLocaleString(_lang, {year: 'numeric', month: '2-digit', day: '2-digit'}) + ' ' + value.toLocaleString(_lang, {timeStyle: 'short'})) : $('.display-last-mode').remove(); value = props.asc_getLastModifiedBy(); - value ? $('#settings-pe-mod-by').html(value) : $('.display-mode-by').remove(); + value ? $('#settings-pe-mod-by').html(Common.Utils.UserInfoParser.getParsedName(value)) : $('.display-mode-by').remove(); value = props.asc_getCreated(); value ? $('#settings-pe-date').html(value.toLocaleString(_lang, {year: 'numeric', month: '2-digit', day: '2-digit'}) + ' ' + value.toLocaleString(_lang, {timeStyle: 'short'})) : $('.display-created-date').remove(); value = props.asc_getCreator(); diff --git a/apps/presentationeditor/mobile/app/view/add/AddOther.js b/apps/presentationeditor/mobile/app/view/add/AddOther.js index 5748aeb36..a1935724a 100644 --- a/apps/presentationeditor/mobile/app/view/add/AddOther.js +++ b/apps/presentationeditor/mobile/app/view/add/AddOther.js @@ -143,7 +143,7 @@ define([ var $commentInfo = $('#comment-info'); var template = [ '<% if (android) { %>
<%= comment.userInitials %>
<% } %>', - '
<%= comment.username %>
', + '
<%= scope.getUserName(comment.username) %>
', '
<%= comment.date %>
', '<% if (android) { %>
<% } %>', '
' @@ -151,7 +151,8 @@ define([ var insert = _.template(template)({ android: Framework7.prototype.device.android, comment: comment, - textAddComment: me.textAddComment + textAddComment: me.textAddComment, + scope: me }); $commentInfo.html(insert); _.defer(function () { @@ -173,6 +174,10 @@ define([ }, 100); }, + getUserName: function (username) { + return Common.Utils.String.htmlEncode(Common.Utils.UserInfoParser.getParsedName(username)); + }, + showPageTable: function() { this.showPage('#addother-insert-table'); this.renderTableStyles(); diff --git a/apps/spreadsheeteditor/mobile/app/controller/Main.js b/apps/spreadsheeteditor/mobile/app/controller/Main.js index 2a5310332..9a00d514f 100644 --- a/apps/spreadsheeteditor/mobile/app/controller/Main.js +++ b/apps/spreadsheeteditor/mobile/app/controller/Main.js @@ -743,6 +743,9 @@ define([ me.appOptions.canBranding = params.asc_getCustomization(); me.appOptions.canBrandingExt = params.asc_getCanBranding() && (typeof me.editorConfig.customization == 'object'); + + me.appOptions.canUseReviewPermissions = me.appOptions.canLicense && me.editorConfig.customization && me.editorConfig.customization.reviewPermissions && (typeof (me.editorConfig.customization.reviewPermissions) == 'object'); + Common.Utils.UserInfoParser.setParser(me.appOptions.canUseReviewPermissions); } me.appOptions.canRequestEditRights = me.editorConfig.canRequestEditRights; diff --git a/apps/spreadsheeteditor/mobile/app/controller/Settings.js b/apps/spreadsheeteditor/mobile/app/controller/Settings.js index dcea13ddf..4a0005217 100644 --- a/apps/spreadsheeteditor/mobile/app/controller/Settings.js +++ b/apps/spreadsheeteditor/mobile/app/controller/Settings.js @@ -310,7 +310,7 @@ define([ value = props.asc_getModified(); value ? $('#settings-sse-last-mod').html(value.toLocaleString(_lang, {year: 'numeric', month: '2-digit', day: '2-digit'}) + ' ' + value.toLocaleString(_lang, {timeStyle: 'short'})) : $('.display-last-mode').remove(); value = props.asc_getLastModifiedBy(); - value ? $('#settings-sse-mod-by').html(value) : $('.display-mode-by').remove(); + value ? $('#settings-sse-mod-by').html(Common.Utils.UserInfoParser.getParsedName(value)) : $('.display-mode-by').remove(); value = props.asc_getCreated(); value ? $('#settings-sse-date').html(value.toLocaleString(_lang, {year: 'numeric', month: '2-digit', day: '2-digit'}) + ' ' + value.toLocaleString(_lang, {timeStyle: 'short'})) : $('.display-created-date').remove(); value = props.asc_getCreator(); diff --git a/apps/spreadsheeteditor/mobile/app/view/add/AddOther.js b/apps/spreadsheeteditor/mobile/app/view/add/AddOther.js index 96d7d37bc..aef617c64 100644 --- a/apps/spreadsheeteditor/mobile/app/view/add/AddOther.js +++ b/apps/spreadsheeteditor/mobile/app/view/add/AddOther.js @@ -217,7 +217,7 @@ define([ var $commentInfo = $('#comment-info'); var template = [ '<% if (android) { %>
<%= comment.userInitials %>
<% } %>', - '
<%= comment.username %>
', + '
<%= scope.getUserName(comment.username) %>
', '
<%= comment.date %>
', '<% if (android) { %>
<% } %>', '
' @@ -225,7 +225,8 @@ define([ var insert = _.template(template)({ android: Framework7.prototype.device.android, comment: comment, - textAddComment: me.textAddComment + textAddComment: me.textAddComment, + scope: me }); $commentInfo.html(insert); _.defer(function () { @@ -247,6 +248,10 @@ define([ }, 100); }, + getUserName: function (username) { + return Common.Utils.String.htmlEncode(Common.Utils.UserInfoParser.getParsedName(username)); + }, + showInsertImage: function () { this.showPage('#addother-insimage');