"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(['doT', 'q', 'jquery', 'underscore', 'bi/commons/utils/BidiUtil', 'bi/admin/nls/StringResource', 'bi/glass/app/ContentView', 'bacontentnav/utils/WidgetNavigator', 'bi/commons/ui/dialogs/ConfirmationDialog', 'text!bi/admin/account/templates/MembersTabTemplate.html', 'bi/admin/common/utils/AJAXUtils', 'bi/commons/utils/ContentFormatter'], function (dot, Q, $, _, BidiUtil, StringResource, ContentView, WidgetNavigator, ConfirmationDialog, template, AJAXUtils, ContentFormatter) { var MembersTab = ContentView.extend({ init: function init(options) { MembersTab.inherited('init', this, arguments); this.unavailableMembersExist = false; $.extend(this, options); }, render: function render() { var strings = { 'addMember': StringResource.get('addMember'), 'removeMember': StringResource.get('removeMember'), 'removeMemberButton': StringResource.get('removeMemberButton'), 'tableCaption': StringResource.get('membersTableCaption'), 'tableheader': { 'type': StringResource.get('type'), 'name': StringResource.get('name'), 'action': StringResource.get('removeActionColumn') }, 'group': StringResource.get('groupIconName'), 'account': StringResource.get('accountIconName'), 'import': StringResource.get('import'), 'select': StringResource.get('select'), 'addBulkMembers': StringResource.get('import'), 'unavailableMembersExist': StringResource.get('unavailableMembersExist') }; // check write permission var writable = this.objectInfo.permissions && this.objectInfo.permissions.indexOf('write') > -1 ? true : false; if (!this.glassContext.isDevInstall()) { //external namespace has no write permission var currentNamespace = this.accountExplorer.getCurrentNamespace(); if (currentNamespace.defaultName !== "Cognos") { writable = false; } } return this._getMembers().then(function (members) { var htmlStr; if (members === 'everyone' || members === 'allAuthUsers') { htmlStr = this._getBlankHtml(members); } else { members = _.map(members, function (member) { return this._patchItem(member); }.bind(this)); var sText = StringResource.get('noMember', { 'type': this.objectInfo.type }); var tempObj = { 'members': members, 'writable': writable, 'strings': strings, 'unavailableMembersExist': this.unavailableMembersExist, noMemberText: sText }; htmlStr = dot.template(template)(tempObj); } this.$el.append(htmlStr); $.each(this.$el.find('.groupListFocusable .text-title'), function (index, value) { ContentFormatter.middleShortenString(value); }); this.widgetKeyController = new WidgetNavigator({ $el: this.$el.find(".groupList-table"), focusClass: "groupListFocusable" }); this._bindEvents(); this._enforceTextDir(); }.bind(this)); }, refresh: function refresh() { this.$el.empty(); this.render(); }, _enforceTextDir: function _enforceTextDir() { var $spans = this.$el.find(".text-title"); $spans.attr('dir', BidiUtil.resolveBaseTextDir(this.innerHTML)); }, _removeMembers: function _removeMembers(members) { var objId = this.objectInfo.id; var objType = this.objectInfo.type; var membersURL; switch (objType) { case 'role': membersURL = AJAXUtils.getPath('getRoleMembers', objId); break; case 'group': membersURL = AJAXUtils.getPath('getGroupMembers', objId); break; default: membersURL = ""; break; } var options = { dataType: 'json', type: 'PUT', data: JSON.stringify(members), url: membersURL, cache: false }; return this.glassContext.services.ajax.ajax(options); }, _getMemberList: function _getMemberList() { var objId = this.objectInfo.id; var objType = this.objectInfo.type; if (objType !== 'group' && objType !== 'role') { this.logger.error("Can't get member list for object type: " + this.objectInfo.type); var resp = $.Deferred(); resp.reject(resp, "Can't get member list for object type: " + this.objectInfo.type); return resp.promise(); } var membersURL = 'v1/' + objType + "s/" + objId + '/members'; var options = { dataType: 'json', type: 'GET', data: {}, url: membersURL, cache: false }; return this.glassContext.services.ajax.ajax(options); }, _getMembers: function _getMembers() { var deferred = Q.defer(); switch (this.objectInfo.type) { case 'group': var isEveryoneGroup = this.objectInfo.searchPath.indexOf("CAMID(\"::Everyone") >= 0; var isAllAuthUserGroup = this.objectInfo.searchPath.indexOf("CAMID(\"::All Authenticated Users") >= 0; if (isEveryoneGroup) { deferred.resolve('everyone'); } else if (isAllAuthUserGroup) { deferred.resolve('allAuthUsers'); } else { this._getMemberList().then(function (data) { this._checkifUnavailableMembersExist(data); var members = [].concat(data.groups, data.users); deferred.resolve(members); }.bind(this), function (dfd, err) { deferred.reject(err); }); } break; case 'role': this._getMemberList().then(function (data) { this._checkifUnavailableMembersExist(data); var members = [].concat(data.groups, data.users, data.roles); deferred.resolve(members); }.bind(this), function (dfd, err) { deferred.reject(err); }); break; default: deferred.resolve(); break; } return deferred.promise; }, _checkifUnavailableMembersExist: function _checkifUnavailableMembersExist(data) { if (data.unavailableMembersExist && !this.unavailableMembersExist) { this.unavailableMembersExist = data.unavailableMembersExist; } }, _getBlankHtml: function _getBlankHtml(members) { return '
' + '
' + '
' + StringResource.get(members + 'MemberMsg') + '
'; }, _patchItem: function _patchItem(member) { switch (member.type) { case 'account': member.svgIcon = "common-user"; if (member.givenName && member.surname) { member.defaultName = member.givenName + ' ' + member.surname; } if (member.ancestors && member.ancestors.length > 1) { member.namespace = member.ancestors[1].defaultName; } break; case 'role': member.svgIcon = "common-role"; break; case 'group': member.svgIcon = "common-group"; break; default: this.logger.error("can not patch item of type: " + member.type); } return member; }, _bindEvents: function _bindEvents() { this.$el.find('#addMember').on('primaryaction', function () { var defaultTypes = this.objectInfo.type === 'group' ? ['group', 'account'] : ['group', 'role', 'account']; this.addMemberSlideout = this.glassContext.appController.showSlideOut({ 'parent': this.slideout, 'width': "450px", 'content': { 'module': 'bi/admin/account/slideout/SecurityObjectSelectorPane', 'parentView': this, 'objectInfo': [this.objectInfo], 'allowedSelectionTypes': defaultTypes, targetType: [] } }); }.bind(this)); this.$el.find('td .admin-remove-member-svgIcon').on('primaryaction', this._removeMemberClick.bind(this)); this.$el.find('#addBulkMembers').on('primaryaction', function () { this.addBulkMembersSlideout = this.glassContext.appController.showSlideOut({ 'parent': this.slideout, 'width': "400px", 'content': { 'module': 'bi/admin/account/slideout/BulkMembershipPane', 'parentView': this, 'objectInfo': [this.objectInfo], 'refreshListCallback': this.refresh } }); }.bind(this)); }, _removeMemberClick: function _removeMemberClick(e) { var item = $(e.currentTarget).closest('tr.list-item'); if (this.objectInfo.searchPath.indexOf('CAMID("::System Administrators")') !== -1 && this.objectInfo.members && this.objectInfo.members.length === 1) { var oDialog = this._getNewConfirmationDialog('confirmDelete', StringResource.get('confirmDelete'), StringResource.get('unableToRemoveMembers')); oDialog.confirm(function () {}); } else { var conDialog = this._getNewConfirmationDialog('confirmDelete', StringResource.get('confirmDelete'), StringResource.get('confirmDeleteMemberMessage')); conDialog.confirm(this._removeMember.bind(this, item)); } e.stopPropagation(); return false; }, _getNewConfirmationDialog: function _getNewConfirmationDialog(sType, sTitle, sMessage) { return new ConfirmationDialog(sType, sTitle, sMessage); }, _removeMember: function _removeMember(item) { var members = {}; members.groups = []; members.users = []; members.roles = []; switch (item.attr('data-type')) { case 'account': members.users.push({ id: item.attr('id') }); break; case 'role': members.roles.push({ id: item.attr('id') }); break; case 'group': members.groups.push({ id: item.attr('id') }); break; default: this.logger.error("can not remove member of type: " + item.attr('data-type')); } return this._removeMembers(members).then(function () { this.objectInfo.members = _.filter(this.objectInfo.members, function (member) { return member.id !== item.attr('id'); }); this._removeItemFromMemberList(members); this.glassContext.appController.showToast(StringResource.get('removeMemberMsg')); }.bind(this)); }, _removeItemFromMemberList: function _removeItemFromMemberList(members) { var allMembers = members.groups.concat(members.users, members.roles); _.each(allMembers, function (member) { var item = _.find(this.$el.find('tr.list-item'), function (item) { if (item.id === member.id) { return item; } }); try { item.removeNode(true); } catch (err) { item.remove(); } }.bind(this)); if (this.widgetKeyController) { this.widgetKeyController.setInitialTabIndex(); } } }); return MembersTab; });