"use strict"; /** * Licensed Materials - Property of IBM * IBM Cognos Products: Cognos Analytics * Copyright IBM Corp. 2015, 2018 * US Government Users Restricted Rights - * Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp. */ define(['q', 'underscore', 'doT', 'bi/commons/ui/Slideout', 'bi/admin/account/AccountExplorer', 'bi/admin/account/services/SecurityObjectSelectorAdaptor', 'bi/admin/common/slideout/BasePane', 'bi/admin/common/ui/MagicWand', 'bacontentnav/utils/UIHelper', 'bacontentnav/common/ui/Breadcrumbs', 'bi/admin/common/ui/listview/ListView', 'bi/admin/nls/StringResource', 'text!bi/admin/account/templates/SecurityObjectSelectorTemplate.html', 'bi/admin/common/utils/AJAXUtils', 'bi/admin/account/ui/SecurityObjectExplorerView'], function (Q, _, dot, Slideout, AccountExplorer, SecurityObjectSelectorAdaptor, BasePane, MagicWand, UIHelper, Breadcrumbs, ListView, StringResource, template, AJAXUtils, SecurityObjectExplorerView) { 'use strict'; //NOSONAR: meant to be strict var SecurityObjectSelectorPane = BasePane.extend({ title: StringResource.get('addMembersPaneTitle'), showBreadcrumbs: true, multiSelect: true, _breadCrumbs: null, /** * @param options.el {node} - container dom node */ init: function init(options) { SecurityObjectSelectorPane.inherited('init', this, arguments); _.extend(this, options); var cognosNamespaceOnly = options.cognosNamespaceOnly ? options.cognosNamespaceOnly : false; this.title = !options.fromFilterPane ? this.title : StringResource.get('selectauser'); this.explorerView = this._getNewSecurityObjectExplorerView({ glassContext: this.glassContext, showBreadcrumbs: true, hideSearch: options.hideSearch, type: options.type, accountExplorer: options.accountExplorer, listAdaptor: this._getNewSecurityObjectSelectorAdaptor({ glassContext: this.glassContext, 'allowedSelectionTypes': options.allowedSelectionTypes, "cognosNamespaceOnly": cognosNamespaceOnly, 'enableAccountItemLink': options.enableAccountItemLink }), parent: this, onSelectionChange: this._onSelectionChange.bind(this) }); if (options.targetType) { this.explorerView.targetType = options.targetType; } }, _getNewSecurityObjectExplorerView: function _getNewSecurityObjectExplorerView(options) { return new SecurityObjectExplorerView(options); }, _getNewSecurityObjectSelectorAdaptor: function _getNewSecurityObjectSelectorAdaptor(options) { return new SecurityObjectSelectorAdaptor(options); }, renderBody: function renderBody($body) { this.explorerView.$el = $body; return this.explorerView.render($body).then(function () { var tempObj = {}; tempObj.strings = { 'add': StringResource.get('add'), 'close': StringResource.get('close') }; var sHtml = dot.template(template)(tempObj); $body.append(sHtml); this._bindEvents(); this.$el.addClass("securityObjectExplorer"); //reload the listView in order to readjust its flex box so it does not get overlapped by the footer return this.explorerView.reloadList(); }.bind(this)); }, setFocus: function setFocus() { this.$body.find('.bi-admin-filterbar-leading input').focus(); }, setFocusOnMemberList: function setFocusOnMemberList() { if (!this.listView.setFocus()) { this.setFocus(); } }, _bindEvents: function _bindEvents() { if (this.isCopyUserProfile) { $('#btnAdd_addMembers').on('clicktap', this._addCopyTargetsClick.bind(this)); } else { $('#btnAdd_addMembers').on('clicktap', this._addMembersClick.bind(this)); } $('#btnCancel_addMembers').on('clicktap', this.slideout.hide.bind(this.slideout)); }, _addCopyTargetsClick: function _addCopyTargetsClick() { var selectedItems = this.explorerView.getSelectedObjects(); if (selectedItems.length > 0 && !_.isUndefined(this.multiSelectCallback) && this.isCopyUserProfile) { this.multiSelectCallback(selectedItems); } this.slideout.hide(); }, _addMembersClick: function _addMembersClick() { return Promise.try(function () { var selectedItems = this.explorerView.getSelectedObjects(); if (selectedItems.length === 0) { this.glassContext.appController.showToast(StringResource.get('memberSelErrorMsg'), { type: 'error' }); } else { if (!_.isUndefined(this.multiSelectCallback)) { return this.multiSelectCallback(selectedItems); } else if (!_.isUndefined(this.selectedCallback)) { return this.selectedCallback(selectedItems[0]); } else { if (this.isAddMemberTo) { return this._addToAsMember(selectedItems); } else { return this._addMember(selectedItems); } } } }.bind(this)); }, _onSelectionChange: function _onSelectionChange() { var selectedItems = this.explorerView.getSelectedObjects(); if (selectedItems.length > 0 && this._checkSelectedItemTypes(selectedItems)) { this._toggleAddMembersButton(false); } else { this._toggleAddMembersButton(true); } if (this.isCopyUserProfile) { var selectedAccounts = selectedItems.filter(function (item) { return item.objectClass === 'account'; }); var title = this.$el.find('.bi-admin-pane-header .title'); if (selectedAccounts.length > 0) { $(title[0]).html(StringResource.get('usersSelected', { numUsers: selectedItems.length })); } else { $(title[0]).html(this.title); } } }, _toggleAddMembersButton: function _toggleAddMembersButton(disable) { if (disable === true) { this.$el.find('button#btnAdd_addMembers').addClass('disabled'); } else if (disable === false) { this.$el.find('button#btnAdd_addMembers').removeClass('disabled'); } else { this.$el.find('button#btnAdd_addMembers').toggleClass('disabled'); } }, _addMembers: function _addMembers(type, id, members) { var userPrefURL = ""; switch (type) { case 'group': userPrefURL = AJAXUtils.getPath('addGroupMembers', id); break; case 'role': userPrefURL = AJAXUtils.getPath('addRoleMembers', id); break; default: break; } var options = { dataType: 'json', type: 'POST', contentType: 'application/json; charset=utf-8', data: JSON.stringify(members), url: userPrefURL, cache: false }; return this.glassContext.services.ajax.ajax(options); }, _addToAsMember: function _addToAsMember(selectedItems) { var members = this._buildMembersFromObjectInfo(); var isError = false; var aPromises = []; _.each(selectedItems, function (item) { if (item.permissions.indexOf('write') > -1 && _.contains(this.allowedSelectionTypes, item.objectClass)) { var innerDeferred = Q.defer(); this._addMembers(item.objectClass, item.id, members).then(function (data) { innerDeferred.resolve(data.warning ? data.warning : StringResource.get('addMemberMsg')); }).fail(function (jqXHR, err) { innerDeferred.resolve(err.responseJSON.messages[0]); isError = true; }); aPromises.push(innerDeferred.promise); } //If a user doesn't have write permissions show correct error message else if (item.permissions.indexOf('write') === -1) { var prom = Q.defer(); prom.resolve(StringResource.get('writePermissionNeededError')); aPromises.push(prom.promise); isError = true; } }.bind(this)); return Q.all(aPromises).then(function (messages) { if (!isError) { this.glassContext.appController.showToast(messages); } else { this.glassContext.appController.showToast(StringResource.get(messages), { type: 'error' }); } }.bind(this)); }, _buildMembersFromObjectInfo: function _buildMembersFromObjectInfo() { var members = {}; members.groups = []; members.users = []; members.roles = []; for (var i = 0; i < this.objectInfo.length; i++) { var object = this.objectInfo[i]; if (object.type === 'group') { members.groups.push({ id: object.id }); } else { members.users.push({ id: object.id }); } } return members; }, _addMember: function _addMember(selectedItems) { var members = {}; members.groups = []; members.users = []; members.roles = []; _.each(selectedItems, function (item) { var memberId = item.id; var memberType = item.type; if (this.objectInfo[0].type === 'group') { if (memberType === 'group') { members.groups.push({ id: memberId }); } else { members.users.push({ id: memberId }); } } else { if (memberType === 'group') { members.groups.push({ id: memberId }); } else if (memberType === 'role') { members.roles.push({ id: memberId }); } else { members.users.push({ id: memberId }); } } }.bind(this)); return this._addMembers(this.objectInfo[0].type, this.objectInfo[0].id, members).then(function (data) { this.objectInfo[0].members = data.members; this.parentView.refresh(); this.glassContext.appController.showToast(data.warning ? data.warning : StringResource.get('addMemberMsg')); }.bind(this)); }, _checkSelectedItemTypes: function _checkSelectedItemTypes(selectedItems) { for (var i = 0; i < selectedItems.length; i++) { if (!_.contains(this.allowedSelectionTypes, selectedItems[i].type)) { return false; } } return true; } }); return SecurityObjectSelectorPane; });