diff --git a/apps/common/Gateway.js b/apps/common/Gateway.js index c37df3c4af..ab65b5c34a 100644 --- a/apps/common/Gateway.js +++ b/apps/common/Gateway.js @@ -322,8 +322,8 @@ if (window.Common === undefined) { _postMessage({event:'onMakeActionLink', data: config}); }, - requestUsers: function () { - _postMessage({event:'onRequestUsers'}); + requestUsers: function (command) { + _postMessage({event:'onRequestUsers', data: {c: command}}); }, requestSendNotify: function (emails) { diff --git a/apps/common/main/lib/controller/ExternalUsers.js b/apps/common/main/lib/controller/ExternalUsers.js index 5b51172e38..48a1655cdd 100644 --- a/apps/common/main/lib/controller/ExternalUsers.js +++ b/apps/common/main/lib/controller/ExternalUsers.js @@ -45,20 +45,18 @@ if (Common.UI === undefined) { } Common.UI.ExternalUsers = new( function() { - var externalUsers = null, - getCallback, + var externalUsers = [], isUsersLoading = false; - var _get = function(callback) { + var _get = function(type) { if (isUsersLoading) return; - getCallback = null; - if (externalUsers===null) { - getCallback = callback; + type = type || 'mention'; + if (externalUsers[type]===undefined) { isUsersLoading = true; - Common.Gateway.requestUsers(); + Common.Gateway.requestUsers(type || 'mention'); } else { - callback(externalUsers); + Common.NotificationCenter.trigger('mentions:setusers', type, externalUsers[type]); } }; @@ -66,13 +64,17 @@ Common.UI.ExternalUsers = new( function() { if (!canRequestUsers) return; Common.Gateway.on('setusers', function(data) { - externalUsers = data.users || []; + if (data.users===null) {// clear user lists + externalUsers = []; + return; + } + var type = data.c || 'mention'; + externalUsers[type] = data.users || []; isUsersLoading = false; - getCallback && getCallback(externalUsers); - getCallback = null; + Common.NotificationCenter.trigger('mentions:setusers', type, externalUsers[type]); }); Common.NotificationCenter.on('mentions:clearusers', function() { - externalUsers = null; + externalUsers = []; }); }; diff --git a/apps/common/main/lib/view/ReviewPopover.js b/apps/common/main/lib/view/ReviewPopover.js index 350a3483f9..64b2f2bf9c 100644 --- a/apps/common/main/lib/view/ReviewPopover.js +++ b/apps/common/main/lib/view/ReviewPopover.js @@ -113,6 +113,10 @@ define([ Common.UI.Window.prototype.initialize.call(this, _options); + if (this.canRequestUsers) { + Common.NotificationCenter.on('mentions:setusers', _.bind(this.onEmailListMenuCallback, this)); + } + return this; }, render: function (comments, review) { @@ -1195,15 +1199,15 @@ define([ left: left, right: right }; - Common.UI.ExternalUsers.get(this.onEmailListMenuCallback.bind(this)); + Common.UI.ExternalUsers.get('mention'); } else { this._state.emailSearch = null; this.emailMenu.rendered && this.emailMenu.cmpEl.css('display', 'none'); } }, - onEmailListMenuCallback: function(users) { - if (!this._state.emailSearch || users.length<1) return; + onEmailListMenuCallback: function(type, users) { + if (!this._state.emailSearch || users.length<1 || type && type!=='mention') return; var me = this, menu = me.emailMenu, diff --git a/apps/spreadsheeteditor/main/app/view/ProtectedRangesEditDlg.js b/apps/spreadsheeteditor/main/app/view/ProtectedRangesEditDlg.js index 64b987a316..40e1c5fb94 100644 --- a/apps/spreadsheeteditor/main/app/view/ProtectedRangesEditDlg.js +++ b/apps/spreadsheeteditor/main/app/view/ProtectedRangesEditDlg.js @@ -91,6 +91,7 @@ define([ _options.tpl = _.template(this.template)(_options); this._userStr = ''; + this._initSettings = true; Common.UI.Window.prototype.initialize.call(this, _options); }, @@ -135,7 +136,8 @@ define([ menuStyle : 'min-width: 100%;max-height: 233px;', editable: true, data: [], - placeHolder: this.userPlaceholder, + placeHolder: this.txtYouCanEdit, + disabled: true, takeFocusOnClose: true, itemsTemplate: _.template([ '<% _.each(items, function(item) { %>', @@ -148,6 +150,7 @@ define([ this.cmbUser.on('changing', this.onUserChanging.bind(this)); this.cmbUser.on('show:after',_.bind(this.onCmbUserOpen, this)); this.cmbUser.on('show:before',_.bind(this.onCmbUserBeforeOpen, this)); + this.cmbUser.on('hide:after',_.bind(this.onCmbUserAfterHide, this)); // this.cmbUser.on('changed:before', this.onUserChangedBefore.bind(this)); Common.Utils.isChrome && this.cmbUser._input && this.cmbUser._input.attr('autocomplete', '1'); // Don't show browser menu with email addresses @@ -178,7 +181,17 @@ define([ return this.inputRangeName; }, + close: function() { + this.canRequestUsers && Common.NotificationCenter.off('mentions:setusers', this.binding.onUserMenuCallback); + Common.UI.Window.prototype.close.apply(this, arguments); + }, + afterRender: function() { + if (this.canRequestUsers) { + this.binding = { onUserMenuCallback: _.bind(this.onUserMenuCallback, this) }; + Common.NotificationCenter.on('mentions:setusers', this.binding.onUserMenuCallback); + } + this._setDefaults(this.props); }, @@ -214,28 +227,7 @@ define([ this.inputRangeName.setValue(props.asc_getName()); this.txtDataRange.setValue(props.asc_getRef()); this.listUser.store.add({value: this.currentUser.id, name: this.currentUser.name + ' (' + this.textYou + ')', email: '', isCurrent: true}); - var me= this, - rangeUsers = props.asc_getUsers(); - Common.UI.ExternalUsers.get(function(users) { - if (users && users.length>0) { - if (!_.find(users, function(item) { return item.id!==undefined && item.id!==null; })) { // no id in user info - me.cmbUser.setDisabled(true); - me.cmbUser._input && me.cmbUser._input.attr('placeholder', me.txtYouCanEdit); - } - - if (rangeUsers && rangeUsers.length>0) { - var store = me.listUser.store; - rangeUsers.forEach(function(item) { - var rec = _.findWhere(users, {id: item}); - if (rec) - store.add({value: item, name: rec.name, email: rec.email}); - }); - } - } else { - me.cmbUser.setDisabled(true); - me.cmbUser._input && me.cmbUser._input.attr('placeholder', me.txtYouCanEdit); - } - }); + this.onUserMenu(true); } }, @@ -291,6 +283,10 @@ define([ this.cmbUser.setRawValue(this._userStr); }, + onCmbUserAfterHide: function(combo, e, params) { + this._forceOpen = false; // need when setUsers event initiated not from combobox + }, + onUserChanging: function(combo, newValue) { this._userStr = newValue; this.onUserMenu(); @@ -307,15 +303,40 @@ define([ this.onUserMenu(); }, - onUserMenu: function() { - Common.UI.ExternalUsers.get(this.onUserMenuCallback.bind(this)); + onUserMenu: function(preventOpen) { + this._forceOpen = !preventOpen; + Common.UI.ExternalUsers.get('protect'); }, - onUserMenuCallback: function(users) { + onUserMenuCallback: function(type, users) { + if (type!=='protect') return; + + if (this._initSettings) { + var me= this, + rangeUsers = this.props.asc_getUsers(); + if (users && users.length>0) { + if (_.find(users, function(item) { return item.id!==undefined && item.id!==null; })) { // has id in user info + me.cmbUser.setDisabled(false); + me.cmbUser._input && me.cmbUser._input.attr('placeholder', me.userPlaceholder); + } + if (rangeUsers && rangeUsers.length>0) { + var store = me.listUser.store; + rangeUsers.forEach(function(item) { + var rec = _.findWhere(users, {id: item}); + if (rec) + store.add({value: item, name: rec.name || '', email: rec.email || ''}); + }); + } + } + this._initSettings = false; + } + + if (!this._forceOpen && !this.cmbUser.isMenuOpen()) return; + var arr = [], str = this.cmbUser.getRawValue(); - if (users.length>0) { + if (users && users.length>0) { var strlc = str.toLowerCase(); users = _.filter(users, function(item) { return (item.id !== undefined && item.id !== null) && @@ -332,11 +353,10 @@ define([ if (!item.hasAccess) divider = true; }); - } else { - } this.cmbUser.setData(arr); this.cmbUser.setRawValue(str); + if (arr.length>0) this.cmbUser.openMenu() else {