MembersTab.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. "use strict";
  2. /**
  3. * Licensed Materials - Property of IBM
  4. * IBM Cognos Products: Cognos Analytics
  5. * Copyright IBM Corp. 2015, 2018
  6. * US Government Users Restricted Rights - Use, duplication or disclosure
  7. * restricted by GSA ADP Schedule Contract with IBM Corp.
  8. */
  9. 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) {
  10. var MembersTab = ContentView.extend({
  11. init: function init(options) {
  12. MembersTab.inherited('init', this, arguments);
  13. this.unavailableMembersExist = false;
  14. $.extend(this, options);
  15. },
  16. render: function render() {
  17. var strings = {
  18. 'addMember': StringResource.get('addMember'),
  19. 'removeMember': StringResource.get('removeMember'),
  20. 'removeMemberButton': StringResource.get('removeMemberButton'),
  21. 'tableCaption': StringResource.get('membersTableCaption'),
  22. 'tableheader': {
  23. 'type': StringResource.get('type'),
  24. 'name': StringResource.get('name'),
  25. 'action': StringResource.get('removeActionColumn')
  26. },
  27. 'group': StringResource.get('groupIconName'),
  28. 'account': StringResource.get('accountIconName'),
  29. 'import': StringResource.get('import'),
  30. 'select': StringResource.get('select'),
  31. 'addBulkMembers': StringResource.get('import'),
  32. 'unavailableMembersExist': StringResource.get('unavailableMembersExist')
  33. }; // check write permission
  34. var writable = this.objectInfo.permissions && this.objectInfo.permissions.indexOf('write') > -1 ? true : false;
  35. if (!this.glassContext.isDevInstall()) {
  36. //external namespace has no write permission
  37. var currentNamespace = this.accountExplorer.getCurrentNamespace();
  38. if (currentNamespace.defaultName !== "Cognos") {
  39. writable = false;
  40. }
  41. }
  42. return this._getMembers().then(function (members) {
  43. var htmlStr;
  44. if (members === 'everyone' || members === 'allAuthUsers') {
  45. htmlStr = this._getBlankHtml(members);
  46. } else {
  47. members = _.map(members, function (member) {
  48. return this._patchItem(member);
  49. }.bind(this));
  50. var sText = StringResource.get('noMember', {
  51. 'type': this.objectInfo.type
  52. });
  53. var tempObj = {
  54. 'members': members,
  55. 'writable': writable,
  56. 'strings': strings,
  57. 'unavailableMembersExist': this.unavailableMembersExist,
  58. noMemberText: sText
  59. };
  60. htmlStr = dot.template(template)(tempObj);
  61. }
  62. this.$el.append(htmlStr);
  63. $.each(this.$el.find('.groupListFocusable .text-title'), function (index, value) {
  64. ContentFormatter.middleShortenString(value);
  65. });
  66. this.widgetKeyController = new WidgetNavigator({
  67. $el: this.$el.find(".groupList-table"),
  68. focusClass: "groupListFocusable"
  69. });
  70. this._bindEvents();
  71. this._enforceTextDir();
  72. }.bind(this));
  73. },
  74. refresh: function refresh() {
  75. this.$el.empty();
  76. this.render();
  77. },
  78. _enforceTextDir: function _enforceTextDir() {
  79. var $spans = this.$el.find(".text-title");
  80. $spans.attr('dir', BidiUtil.resolveBaseTextDir(this.innerHTML));
  81. },
  82. _removeMembers: function _removeMembers(members) {
  83. var objId = this.objectInfo.id;
  84. var objType = this.objectInfo.type;
  85. var membersURL;
  86. switch (objType) {
  87. case 'role':
  88. membersURL = AJAXUtils.getPath('getRoleMembers', objId);
  89. break;
  90. case 'group':
  91. membersURL = AJAXUtils.getPath('getGroupMembers', objId);
  92. break;
  93. default:
  94. membersURL = "";
  95. break;
  96. }
  97. var options = {
  98. dataType: 'json',
  99. type: 'PUT',
  100. data: JSON.stringify(members),
  101. url: membersURL,
  102. cache: false
  103. };
  104. return this.glassContext.services.ajax.ajax(options);
  105. },
  106. _getMemberList: function _getMemberList() {
  107. var objId = this.objectInfo.id;
  108. var objType = this.objectInfo.type;
  109. if (objType !== 'group' && objType !== 'role') {
  110. this.logger.error("Can't get member list for object type: " + this.objectInfo.type);
  111. var resp = $.Deferred();
  112. resp.reject(resp, "Can't get member list for object type: " + this.objectInfo.type);
  113. return resp.promise();
  114. }
  115. var membersURL = 'v1/' + objType + "s/" + objId + '/members';
  116. var options = {
  117. dataType: 'json',
  118. type: 'GET',
  119. data: {},
  120. url: membersURL,
  121. cache: false
  122. };
  123. return this.glassContext.services.ajax.ajax(options);
  124. },
  125. _getMembers: function _getMembers() {
  126. var deferred = Q.defer();
  127. switch (this.objectInfo.type) {
  128. case 'group':
  129. var isEveryoneGroup = this.objectInfo.searchPath.indexOf("CAMID(\"::Everyone") >= 0;
  130. var isAllAuthUserGroup = this.objectInfo.searchPath.indexOf("CAMID(\"::All Authenticated Users") >= 0;
  131. if (isEveryoneGroup) {
  132. deferred.resolve('everyone');
  133. } else if (isAllAuthUserGroup) {
  134. deferred.resolve('allAuthUsers');
  135. } else {
  136. this._getMemberList().then(function (data) {
  137. this._checkifUnavailableMembersExist(data);
  138. var members = [].concat(data.groups, data.users);
  139. deferred.resolve(members);
  140. }.bind(this), function (dfd, err) {
  141. deferred.reject(err);
  142. });
  143. }
  144. break;
  145. case 'role':
  146. this._getMemberList().then(function (data) {
  147. this._checkifUnavailableMembersExist(data);
  148. var members = [].concat(data.groups, data.users, data.roles);
  149. deferred.resolve(members);
  150. }.bind(this), function (dfd, err) {
  151. deferred.reject(err);
  152. });
  153. break;
  154. default:
  155. deferred.resolve();
  156. break;
  157. }
  158. return deferred.promise;
  159. },
  160. _checkifUnavailableMembersExist: function _checkifUnavailableMembersExist(data) {
  161. if (data.unavailableMembersExist && !this.unavailableMembersExist) {
  162. this.unavailableMembersExist = data.unavailableMembersExist;
  163. }
  164. },
  165. _getBlankHtml: function _getBlankHtml(members) {
  166. return '<div class="member-pane-empty">' + '<div class="emptyTableImage wft_bee"></div>' + '<div class="emptyTableText">' + StringResource.get(members + 'MemberMsg') + '</div>';
  167. },
  168. _patchItem: function _patchItem(member) {
  169. switch (member.type) {
  170. case 'account':
  171. member.svgIcon = "common-user";
  172. if (member.givenName && member.surname) {
  173. member.defaultName = member.givenName + ' ' + member.surname;
  174. }
  175. if (member.ancestors && member.ancestors.length > 1) {
  176. member.namespace = member.ancestors[1].defaultName;
  177. }
  178. break;
  179. case 'role':
  180. member.svgIcon = "common-role";
  181. break;
  182. case 'group':
  183. member.svgIcon = "common-group";
  184. break;
  185. default:
  186. this.logger.error("can not patch item of type: " + member.type);
  187. }
  188. return member;
  189. },
  190. _bindEvents: function _bindEvents() {
  191. this.$el.find('#addMember').on('primaryaction', function () {
  192. var defaultTypes = this.objectInfo.type === 'group' ? ['group', 'account'] : ['group', 'role', 'account'];
  193. this.addMemberSlideout = this.glassContext.appController.showSlideOut({
  194. 'parent': this.slideout,
  195. 'width': "450px",
  196. 'content': {
  197. 'module': 'bi/admin/account/slideout/SecurityObjectSelectorPane',
  198. 'parentView': this,
  199. 'objectInfo': [this.objectInfo],
  200. 'allowedSelectionTypes': defaultTypes,
  201. targetType: []
  202. }
  203. });
  204. }.bind(this));
  205. this.$el.find('td .admin-remove-member-svgIcon').on('primaryaction', this._removeMemberClick.bind(this));
  206. this.$el.find('#addBulkMembers').on('primaryaction', function () {
  207. this.addBulkMembersSlideout = this.glassContext.appController.showSlideOut({
  208. 'parent': this.slideout,
  209. 'width': "400px",
  210. 'content': {
  211. 'module': 'bi/admin/account/slideout/BulkMembershipPane',
  212. 'parentView': this,
  213. 'objectInfo': [this.objectInfo],
  214. 'refreshListCallback': this.refresh
  215. }
  216. });
  217. }.bind(this));
  218. },
  219. _removeMemberClick: function _removeMemberClick(e) {
  220. var item = $(e.currentTarget).closest('tr.list-item');
  221. if (this.objectInfo.searchPath.indexOf('CAMID("::System Administrators")') !== -1 && this.objectInfo.members && this.objectInfo.members.length === 1) {
  222. var oDialog = this._getNewConfirmationDialog('confirmDelete', StringResource.get('confirmDelete'), StringResource.get('unableToRemoveMembers'));
  223. oDialog.confirm(function () {});
  224. } else {
  225. var conDialog = this._getNewConfirmationDialog('confirmDelete', StringResource.get('confirmDelete'), StringResource.get('confirmDeleteMemberMessage'));
  226. conDialog.confirm(this._removeMember.bind(this, item));
  227. }
  228. e.stopPropagation();
  229. return false;
  230. },
  231. _getNewConfirmationDialog: function _getNewConfirmationDialog(sType, sTitle, sMessage) {
  232. return new ConfirmationDialog(sType, sTitle, sMessage);
  233. },
  234. _removeMember: function _removeMember(item) {
  235. var members = {};
  236. members.groups = [];
  237. members.users = [];
  238. members.roles = [];
  239. switch (item.attr('data-type')) {
  240. case 'account':
  241. members.users.push({
  242. id: item.attr('id')
  243. });
  244. break;
  245. case 'role':
  246. members.roles.push({
  247. id: item.attr('id')
  248. });
  249. break;
  250. case 'group':
  251. members.groups.push({
  252. id: item.attr('id')
  253. });
  254. break;
  255. default:
  256. this.logger.error("can not remove member of type: " + item.attr('data-type'));
  257. }
  258. return this._removeMembers(members).then(function () {
  259. this.objectInfo.members = _.filter(this.objectInfo.members, function (member) {
  260. return member.id !== item.attr('id');
  261. });
  262. this._removeItemFromMemberList(members);
  263. this.glassContext.appController.showToast(StringResource.get('removeMemberMsg'));
  264. }.bind(this));
  265. },
  266. _removeItemFromMemberList: function _removeItemFromMemberList(members) {
  267. var allMembers = members.groups.concat(members.users, members.roles);
  268. _.each(allMembers, function (member) {
  269. var item = _.find(this.$el.find('tr.list-item'), function (item) {
  270. if (item.id === member.id) {
  271. return item;
  272. }
  273. });
  274. try {
  275. item.removeNode(true);
  276. } catch (err) {
  277. item.remove();
  278. }
  279. }.bind(this));
  280. if (this.widgetKeyController) {
  281. this.widgetKeyController.setInitialTabIndex();
  282. }
  283. }
  284. });
  285. return MembersTab;
  286. });