MembersTab.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. "use strict";
  2. /**
  3. * Licensed Materials - Property of IBM
  4. * IBM Cognos Products: Cognos Analytics
  5. * Copyright IBM Corp. 2017
  6. * US Government Users Restricted Rights - Use, duplication or disclosure
  7. * restricted by GSA ADP Schedule Contract with IBM Corp.
  8.  */
  9. define(['doT', 'underscore', 'bi/commons/utils/BidiUtil', 'bi/admin/nls/StringResource', 'bi/glass/app/ContentView', 'bacontentnav/utils/WidgetNavigator', 'bi/commons/ui/dialogs/ConfirmationDialog', 'text!bi/admin/multitenancy/templates/MembersTabTemplate.html', 'bi/commons/utils/ContentFormatter', 'bi/admin/multitenancy/services/TenantsCustomizationService'], function (dot, _, BidiUtil, StringResource, ContentView, WidgetNavigator, ConfirmationDialog, template, ContentFormatter, TenantsCustomizationService) {
  10. var MembersTab = ContentView.extend({
  11. init: function init(options) {
  12. MembersTab.inherited('init', this, arguments);
  13. $.extend(this, options);
  14. this.tenantsListController = new TenantsCustomizationService({
  15. glassContext: this.glassContext
  16. });
  17. this.tenantMembers = [];
  18. },
  19. render: function render() {
  20. return this.glassContext.getCoreSvc('.Config').getConfigValue('Admin/useLegacyTenancyUI').then(function (res) {
  21. if (res && res.toLowerCase) {
  22. this.useLegacyTenancyUI = res.toLowerCase() === 'true';
  23. } else {
  24. this.useLegacyTenancyUI = false;
  25. }
  26. this._getMembers().then(function (tenant) {
  27. if (tenant.tenantMembers) {
  28. this.tenantMembers = tenant.tenantMembers.map(function (tenantMember) {
  29. return tenantMember.tenantID;
  30. });
  31. }
  32. var members = tenant.tenantMembers ? tenant.tenantMembers : [];
  33. members = _.map(members, function (member) {
  34. return this._patchItem(member);
  35. }.bind(this));
  36. var writable = this.objectInfo.permissions && this.objectInfo.permissions.indexOf('write') > -1 ? true : false;
  37. var strings = {
  38. 'addMember': StringResource.get('addMember'),
  39. 'removeMember': StringResource.get('removeMember'),
  40. 'removeMemberButton': StringResource.get('removeMemberButton'),
  41. 'tableheader': {
  42. 'type': StringResource.get('type'),
  43. 'name': StringResource.get('name'),
  44. 'action': StringResource.get('removeActionColumn')
  45. },
  46. 'tenants': StringResource.get('tenantsHeader')
  47. };
  48. var sText = StringResource.get('noMember', {
  49. 'type': this.objectInfo.type
  50. });
  51. var tempObj = {
  52. 'members': members,
  53. 'writable': writable,
  54. 'strings': strings,
  55. noMemberText: sText
  56. };
  57. var htmlStr = dot.template(template)(tempObj);
  58. this.$el.append(htmlStr);
  59. $.each(this.$el.find('.groupListFocusable .text-title'), function (index, value) {
  60. ContentFormatter.middleShortenString(value);
  61. });
  62. this.widgetKeyController = new WidgetNavigator({
  63. $el: this.$el.find(".groupList-table"),
  64. focusClass: "groupListFocusable"
  65. });
  66. this._bindEvents();
  67. this._enforceTextDir();
  68. }.bind(this));
  69. }.bind(this));
  70. },
  71. refresh: function refresh() {
  72. this.$el.empty();
  73. return this.render();
  74. },
  75. _enforceTextDir: function _enforceTextDir() {
  76. var $spans = this.$el.find(".text-title");
  77. $spans.attr('dir', BidiUtil.resolveBaseTextDir(this.innerHTML));
  78. },
  79. _removeMembers: function _removeMembers(members) {
  80. var updatedMembers = {};
  81. updatedMembers.tenantMembers = this.tenantMembers.filter(function (tenantMember) {
  82. return members.tenantMembers.indexOf(tenantMember) === -1;
  83. });
  84. return this.tenantsListController.removeTenantMembers(this.objectInfo.tenantID, updatedMembers);
  85. },
  86. _getMembers: function _getMembers() {
  87. return this.tenantsListController.getTenant(this.objectInfo.tenantID).then(function (data) {
  88. return data.data[0];
  89. }.bind(this));
  90. },
  91. _patchItem: function _patchItem(member) {
  92. member.svgIcon = "common-multi_tenant";
  93. member.type = "tenant";
  94. return member;
  95. },
  96. _bindEvents: function _bindEvents() {
  97. var aMod = 'bi/admin/multitenancy/slideout/TenantsMemberList';
  98. if (this.useLegacyTenancyUI) {
  99. aMod = 'bi/admin/multitenancy/slideout/TenantsMemberListLegacy';
  100. }
  101. this.$el.find('#addMember').on('primaryaction', function () {
  102. var defaultTypes = ['tenant'];
  103. this.addMemberSlideout = this.glassContext.appController.showSlideOut({
  104. 'parent': this.slideout,
  105. 'width': "400px",
  106. 'onHide': function () {
  107. this.setFocus();
  108. }.bind(this),
  109. 'content': {
  110. 'module': aMod,
  111. 'parentView': this,
  112. 'objectInfo': [this.objectInfo],
  113. 'listController': this.tenantsListController,
  114. 'allowedSelectionTypes': defaultTypes
  115. }
  116. });
  117. }.bind(this));
  118. this.$el.find('td .admin-remove-member-svgIcon').on('primaryaction', function (e) {
  119. var item = $(e.currentTarget).closest('tr.list-item');
  120. if (this.objectInfo.searchPath.indexOf('CAMID("::System Administrators")') !== -1 && this.objectInfo.members && this.objectInfo.members.length === 1) {
  121. var oDialog = new ConfirmationDialog('confirmDelete', StringResource.get('confirmDelete'), StringResource.get('unableToRemoveMembers'));
  122. oDialog.confirm(function () {});
  123. } else {
  124. var conDialog = new ConfirmationDialog('confirmDelete', StringResource.get('confirmDelete'), StringResource.get('confirmDeleteMemberMessage'));
  125. conDialog.confirm(function () {
  126. this._removeMember(item);
  127. }.bind(this));
  128. }
  129. e.stopPropagation();
  130. return false;
  131. }.bind(this));
  132. },
  133. _removeMember: function _removeMember(item) {
  134. var members = {};
  135. members.tenantMembers = [];
  136. if (item.attr('data-type') === 'tenant') {
  137. members.tenantMembers.push(item.attr('id'));
  138. } else {
  139. this.logger.error("can not remove member of type: " + item.attr('data-type'));
  140. }
  141. this._removeMembers(members).done(function () {
  142. this._removeItemFromMemberList(members);
  143. this.glassContext.appController.showToast(StringResource.get('removeMemberMsg'));
  144. }.bind(this));
  145. this.objectInfo.members = _.filter(this.objectInfo.members, function (member) {
  146. return member.id !== item.attr('id');
  147. });
  148. },
  149. _removeItemFromMemberList: function _removeItemFromMemberList(members) {
  150. var self = this;
  151. _.each(members.tenantMembers, function (member) {
  152. var item = _.find(self.$el.find('tr.list-item'), function (item) {
  153. if (item.id === member) {
  154. return item;
  155. }
  156. });
  157. try {
  158. item.removeNode(true);
  159. } catch (err) {
  160. item.remove();
  161. }
  162. });
  163. if (this.widgetKeyController) {
  164. this.widgetKeyController.setInitialTabIndex();
  165. }
  166. },
  167. setFocus: function setFocus() {
  168. this.$el.find("#addMember").focus();
  169. }
  170. });
  171. return MembersTab;
  172. });