SecurityObjectSelectorPane.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  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 -
  7. * Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  8. */
  9. 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) {
  10. 'use strict'; //NOSONAR: meant to be strict
  11. var SecurityObjectSelectorPane = BasePane.extend({
  12. title: StringResource.get('addMembersPaneTitle'),
  13. showBreadcrumbs: true,
  14. multiSelect: true,
  15. _breadCrumbs: null,
  16. /**
  17. * @param options.el {node} - container dom node
  18. */
  19. init: function init(options) {
  20. SecurityObjectSelectorPane.inherited('init', this, arguments);
  21. _.extend(this, options);
  22. var cognosNamespaceOnly = options.cognosNamespaceOnly ? options.cognosNamespaceOnly : false;
  23. this.title = !options.fromFilterPane ? this.title : StringResource.get('selectauser');
  24. this.explorerView = this._getNewSecurityObjectExplorerView({
  25. glassContext: this.glassContext,
  26. showBreadcrumbs: true,
  27. hideSearch: options.hideSearch,
  28. type: options.type,
  29. accountExplorer: options.accountExplorer,
  30. listAdaptor: this._getNewSecurityObjectSelectorAdaptor({
  31. glassContext: this.glassContext,
  32. 'allowedSelectionTypes': options.allowedSelectionTypes,
  33. "cognosNamespaceOnly": cognosNamespaceOnly,
  34. 'enableAccountItemLink': options.enableAccountItemLink
  35. }),
  36. parent: this,
  37. onSelectionChange: this._onSelectionChange.bind(this)
  38. });
  39. if (options.targetType) {
  40. this.explorerView.targetType = options.targetType;
  41. }
  42. },
  43. _getNewSecurityObjectExplorerView: function _getNewSecurityObjectExplorerView(options) {
  44. return new SecurityObjectExplorerView(options);
  45. },
  46. _getNewSecurityObjectSelectorAdaptor: function _getNewSecurityObjectSelectorAdaptor(options) {
  47. return new SecurityObjectSelectorAdaptor(options);
  48. },
  49. renderBody: function renderBody($body) {
  50. this.explorerView.$el = $body;
  51. return this.explorerView.render($body).then(function () {
  52. var tempObj = {};
  53. tempObj.strings = {
  54. 'add': StringResource.get('add'),
  55. 'close': StringResource.get('close')
  56. };
  57. var sHtml = dot.template(template)(tempObj);
  58. $body.append(sHtml);
  59. this._bindEvents();
  60. this.$el.addClass("securityObjectExplorer"); //reload the listView in order to readjust its flex box so it does not get overlapped by the footer
  61. return this.explorerView.reloadList();
  62. }.bind(this));
  63. },
  64. setFocus: function setFocus() {
  65. this.$body.find('.bi-admin-filterbar-leading input').focus();
  66. },
  67. setFocusOnMemberList: function setFocusOnMemberList() {
  68. if (!this.listView.setFocus()) {
  69. this.setFocus();
  70. }
  71. },
  72. _bindEvents: function _bindEvents() {
  73. if (this.isCopyUserProfile) {
  74. $('#btnAdd_addMembers').on('clicktap', this._addCopyTargetsClick.bind(this));
  75. } else {
  76. $('#btnAdd_addMembers').on('clicktap', this._addMembersClick.bind(this));
  77. }
  78. $('#btnCancel_addMembers').on('clicktap', this.slideout.hide.bind(this.slideout));
  79. },
  80. _addCopyTargetsClick: function _addCopyTargetsClick() {
  81. var selectedItems = this.explorerView.getSelectedObjects();
  82. if (selectedItems.length > 0 && !_.isUndefined(this.multiSelectCallback) && this.isCopyUserProfile) {
  83. this.multiSelectCallback(selectedItems);
  84. }
  85. this.slideout.hide();
  86. },
  87. _addMembersClick: function _addMembersClick() {
  88. return Promise.try(function () {
  89. var selectedItems = this.explorerView.getSelectedObjects();
  90. if (selectedItems.length === 0) {
  91. this.glassContext.appController.showToast(StringResource.get('memberSelErrorMsg'), {
  92. type: 'error'
  93. });
  94. } else {
  95. if (!_.isUndefined(this.multiSelectCallback)) {
  96. return this.multiSelectCallback(selectedItems);
  97. } else if (!_.isUndefined(this.selectedCallback)) {
  98. return this.selectedCallback(selectedItems[0]);
  99. } else {
  100. if (this.isAddMemberTo) {
  101. return this._addToAsMember(selectedItems);
  102. } else {
  103. return this._addMember(selectedItems);
  104. }
  105. }
  106. }
  107. }.bind(this));
  108. },
  109. _onSelectionChange: function _onSelectionChange() {
  110. var selectedItems = this.explorerView.getSelectedObjects();
  111. if (selectedItems.length > 0 && this._checkSelectedItemTypes(selectedItems)) {
  112. this._toggleAddMembersButton(false);
  113. } else {
  114. this._toggleAddMembersButton(true);
  115. }
  116. if (this.isCopyUserProfile) {
  117. var selectedAccounts = selectedItems.filter(function (item) {
  118. return item.objectClass === 'account';
  119. });
  120. var title = this.$el.find('.bi-admin-pane-header .title');
  121. if (selectedAccounts.length > 0) {
  122. $(title[0]).html(StringResource.get('usersSelected', {
  123. numUsers: selectedItems.length
  124. }));
  125. } else {
  126. $(title[0]).html(this.title);
  127. }
  128. }
  129. },
  130. _toggleAddMembersButton: function _toggleAddMembersButton(disable) {
  131. if (disable === true) {
  132. this.$el.find('button#btnAdd_addMembers').addClass('disabled');
  133. } else if (disable === false) {
  134. this.$el.find('button#btnAdd_addMembers').removeClass('disabled');
  135. } else {
  136. this.$el.find('button#btnAdd_addMembers').toggleClass('disabled');
  137. }
  138. },
  139. _addMembers: function _addMembers(type, id, members) {
  140. var userPrefURL = "";
  141. switch (type) {
  142. case 'group':
  143. userPrefURL = AJAXUtils.getPath('addGroupMembers', id);
  144. break;
  145. case 'role':
  146. userPrefURL = AJAXUtils.getPath('addRoleMembers', id);
  147. break;
  148. default:
  149. break;
  150. }
  151. var options = {
  152. dataType: 'json',
  153. type: 'POST',
  154. contentType: 'application/json; charset=utf-8',
  155. data: JSON.stringify(members),
  156. url: userPrefURL,
  157. cache: false
  158. };
  159. return this.glassContext.services.ajax.ajax(options);
  160. },
  161. _addToAsMember: function _addToAsMember(selectedItems) {
  162. var members = this._buildMembersFromObjectInfo();
  163. var isError = false;
  164. var aPromises = [];
  165. _.each(selectedItems, function (item) {
  166. if (item.permissions.indexOf('write') > -1 && _.contains(this.allowedSelectionTypes, item.objectClass)) {
  167. var innerDeferred = Q.defer();
  168. this._addMembers(item.objectClass, item.id, members).then(function (data) {
  169. innerDeferred.resolve(data.warning ? data.warning : StringResource.get('addMemberMsg'));
  170. }).fail(function (jqXHR, err) {
  171. innerDeferred.resolve(err.responseJSON.messages[0]);
  172. isError = true;
  173. });
  174. aPromises.push(innerDeferred.promise);
  175. } //If a user doesn't have write permissions show correct error message
  176. else if (item.permissions.indexOf('write') === -1) {
  177. var prom = Q.defer();
  178. prom.resolve(StringResource.get('writePermissionNeededError'));
  179. aPromises.push(prom.promise);
  180. isError = true;
  181. }
  182. }.bind(this));
  183. return Q.all(aPromises).then(function (messages) {
  184. if (!isError) {
  185. this.glassContext.appController.showToast(messages);
  186. } else {
  187. this.glassContext.appController.showToast(StringResource.get(messages), {
  188. type: 'error'
  189. });
  190. }
  191. }.bind(this));
  192. },
  193. _buildMembersFromObjectInfo: function _buildMembersFromObjectInfo() {
  194. var members = {};
  195. members.groups = [];
  196. members.users = [];
  197. members.roles = [];
  198. for (var i = 0; i < this.objectInfo.length; i++) {
  199. var object = this.objectInfo[i];
  200. if (object.type === 'group') {
  201. members.groups.push({
  202. id: object.id
  203. });
  204. } else {
  205. members.users.push({
  206. id: object.id
  207. });
  208. }
  209. }
  210. return members;
  211. },
  212. _addMember: function _addMember(selectedItems) {
  213. var members = {};
  214. members.groups = [];
  215. members.users = [];
  216. members.roles = [];
  217. _.each(selectedItems, function (item) {
  218. var memberId = item.id;
  219. var memberType = item.type;
  220. if (this.objectInfo[0].type === 'group') {
  221. if (memberType === 'group') {
  222. members.groups.push({
  223. id: memberId
  224. });
  225. } else {
  226. members.users.push({
  227. id: memberId
  228. });
  229. }
  230. } else {
  231. if (memberType === 'group') {
  232. members.groups.push({
  233. id: memberId
  234. });
  235. } else if (memberType === 'role') {
  236. members.roles.push({
  237. id: memberId
  238. });
  239. } else {
  240. members.users.push({
  241. id: memberId
  242. });
  243. }
  244. }
  245. }.bind(this));
  246. return this._addMembers(this.objectInfo[0].type, this.objectInfo[0].id, members).then(function (data) {
  247. this.objectInfo[0].members = data.members;
  248. this.parentView.refresh();
  249. this.glassContext.appController.showToast(data.warning ? data.warning : StringResource.get('addMemberMsg'));
  250. }.bind(this));
  251. },
  252. _checkSelectedItemTypes: function _checkSelectedItemTypes(selectedItems) {
  253. for (var i = 0; i < selectedItems.length; i++) {
  254. if (!_.contains(this.allowedSelectionTypes, selectedItems[i].type)) {
  255. return false;
  256. }
  257. }
  258. return true;
  259. }
  260. });
  261. return SecurityObjectSelectorPane;
  262. });