AddInputRow.js 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  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(['underscore', 'q', 'bi/admin/common/actions/ListAction', 'bi/commons/utils/BidiUtil', 'bi/admin/nls/StringResource', 'bacontentnav/utils/UIHelper', 'bi/admin/common/utils/AJAXUtils', 'ba-react-admin/ba-react-admin.min'], function (_, Q, listAction, BidiUtil, StringResource, UIHelper, AJAXUtils, AdminReact) {
  10. 'use strict'; //NOSONAR
  11. var AddInputRow = listAction.extend({
  12. init: function init(options) {
  13. AddInputRow.inherited('init', this, options);
  14. _.extend(this, options);
  15. },
  16. execute: function execute(type, pid) {
  17. var listControl = this.getListControl();
  18. var rowProperties = this._getInputRowProperties(type);
  19. listControl.insertToTable({
  20. "defaultName": rowProperties.defaultName,
  21. "type": rowProperties.type,
  22. "uid": rowProperties.uid
  23. });
  24. this._createInput(rowProperties.className, rowProperties.defaultName, rowProperties.ajaxRequestType, pid);
  25. },
  26. _getInputRowProperties: function _getInputRowProperties(type) {
  27. var rowObj;
  28. switch (type) {
  29. case "namespaceFolder":
  30. rowObj = {
  31. "defaultName": StringResource.get('addNewFolder'),
  32. "type": 'folder',
  33. "uid": _.uniqueId('new_folder_'),
  34. "className": "newFolderRow",
  35. "ajaxRequestType": "namespaceFolder"
  36. };
  37. break;
  38. case "group":
  39. rowObj = {
  40. "defaultName": StringResource.get('addNewGroup'),
  41. "type": 'group',
  42. "uid": _.uniqueId('new_group_'),
  43. "className": "newGroupRow",
  44. "ajaxRequestType": "group"
  45. };
  46. break;
  47. case "nonBrowsableGroup":
  48. rowObj = {
  49. "defaultName": StringResource.get('addNewGroup'),
  50. "type": 'nonBrowsableGroup',
  51. "uid": _.uniqueId('new_group_'),
  52. "className": "newGroupRow",
  53. "ajaxRequestType": "nonBrowsableGroup"
  54. };
  55. break;
  56. case "role":
  57. rowObj = {
  58. "defaultName": StringResource.get('addNewRole'),
  59. "type": 'role',
  60. "uid": _.uniqueId('new_role_'),
  61. "className": "newRoleRow",
  62. "ajaxRequestType": "role"
  63. };
  64. break;
  65. default:
  66. break;
  67. }
  68. ;
  69. return rowObj;
  70. },
  71. _createInput: function _createInput(className, label, objectType, pid) {
  72. var listControl = this.getListControl();
  73. $('.dataTables_scrollBody').scrollTop(0); //the new row will initially be added to the bottom, so we move it to the top
  74. var listOfTrs = listControl.$el.find('.dataTables_scrollBody').find('tbody').find('tr');
  75. var $newTr = $(listOfTrs[listOfTrs.length - 1]).clone();
  76. var $theDiv = $($newTr.find('.nameColumnDiv')[0]);
  77. $theDiv.addClass(className);
  78. var tdEllipsisCell = $theDiv.parents("td");
  79. tdEllipsisCell.empty(); //insert the row object
  80. $newTr.insertAfter(listOfTrs[0]);
  81. $(listOfTrs[listOfTrs.length - 1]).remove();
  82. var $theInput = $(document.createElement('input'));
  83. $theInput.attr('type', 'text');
  84. $theInput.attr('id', 'inputBox');
  85. $theInput.attr('value', label);
  86. tdEllipsisCell.append($theInput);
  87. BidiUtil.initElementForBidi($theInput[0]);
  88. $theInput[0].select();
  89. $theInput[0].focus();
  90. listControl.removeEmptyTableMessage();
  91. this._addInputHandlers($theInput, objectType, pid);
  92. },
  93. _handleBlur: function _handleBlur(evt, objectType, pid) {
  94. var deferred = Q.defer();
  95. var listControl = this.getListControl(); // Detach the scroll event
  96. listControl.$el.find('.dataTables_scrollBody').off('scroll', null, this._onScroll);
  97. var checkList = {
  98. 'script': true
  99. };
  100. var closeValidationErrorDialogCallback = function closeValidationErrorDialogCallback() {
  101. $(evt.currentTarget).select();
  102. $(evt.currentTarget).focus();
  103. };
  104. var objectInfo = this._getInputText(listControl, objectType);
  105. var isValid = UIHelper.validateInput(objectInfo.defaultName, checkList, closeValidationErrorDialogCallback);
  106. if (isValid) {
  107. var objURL;
  108. this._handledSave = true;
  109. switch (objectType) {
  110. case 'group':
  111. objURL = AJAXUtils.getPath('createGroup', pid);
  112. break;
  113. case 'nonBrowsableGroup':
  114. objURL = AJAXUtils.getPath('createGroup', pid);
  115. break;
  116. case 'role':
  117. objURL = AJAXUtils.getPath('createRole', pid);
  118. break;
  119. case 'namespaceFolder':
  120. objURL = AJAXUtils.getPath('createNamespaceFolder', pid);
  121. break;
  122. default:
  123. objURL = "";
  124. break;
  125. }
  126. var options = {
  127. dataType: 'json',
  128. type: 'POST',
  129. contentType: 'application/json; charset=utf-8',
  130. data: JSON.stringify(objectInfo),
  131. url: objURL,
  132. cache: false
  133. };
  134. switch (objectType) {
  135. case 'groups':
  136. this.glassContext.appController.showToast(StringResource.get("groupToastCreateMsg", {
  137. 'name': objectInfo.defaultName
  138. }));
  139. break;
  140. case 'roles':
  141. this.glassContext.appController.showToast(StringResource.get("roleToastCreateMsg", {
  142. 'name': objectInfo.defaultName
  143. }));
  144. break;
  145. case 'folders':
  146. this.glassContext.appController.showToast(StringResource.get("folderToastCreateMsg", {
  147. 'name': objectInfo.defaultName
  148. }));
  149. break;
  150. default:
  151. break;
  152. }
  153. return this.glassContext.services.ajax.ajax(options);
  154. }
  155. return deferred.promise;
  156. },
  157. _addInputHandlers: function _addInputHandlers(inputElement, type, pid) {
  158. var self = this;
  159. inputElement.on('keydown', function (evt) {
  160. // call the blur event when the Enter key is pressed
  161. if (evt.keyCode === 13) {
  162. $(evt.currentTarget).blur();
  163. evt.stopPropagation();
  164. return false;
  165. }
  166. });
  167. inputElement.on('blur', function (evt) {
  168. this._handleBlur(evt, type, pid).then(function () {
  169. self._reloadListView();
  170. }, function (ajaxOptions, err) {
  171. if (err.responseText) {
  172. var responseText = JSON.parse(err.responseText);
  173. self.glassContext.appController.showMessage(responseText.messages);
  174. }
  175. self._reloadListView();
  176. });
  177. }.bind(this));
  178. },
  179. _reloadListView: function _reloadListView() {
  180. if (this.accountExplorer.pagingEnabled) {
  181. var listControl = this.getListControl();
  182. AdminReact.PaginationHelper.reloadListViewinPagingContext(this.glassContext, this.accountExplorer, listControl, this.listAdaptor, true);
  183. } else {
  184. this._reloadListViewWithouPaging();
  185. }
  186. },
  187. _reloadListViewWithouPaging: function _reloadListViewWithouPaging() {
  188. var listControl = this.getListControl();
  189. listControl.dataAdaptor.sortChanged = true;
  190. listControl.reload(false).done(function () {
  191. listControl.activeInputForm = null; //this instance of AddInputRow is finished, remove its reference so that a new instance can be spawned
  192. });
  193. },
  194. _generateOriginalName: function _generateOriginalName(input, type) {
  195. var inputName = input;
  196. var nameCounter = 1;
  197. while (this._duplicatesExist(inputName, type) === true) {
  198. inputName = input + " (" + nameCounter + ")";
  199. nameCounter++;
  200. }
  201. return inputName;
  202. },
  203. _duplicatesExist: function _duplicatesExist(input) {
  204. var sameNameObjects = _.filter(this.data, function (obj) {
  205. return input.toUpperCase() === obj.defaultName.toUpperCase();
  206. });
  207. if (sameNameObjects.length !== 0) {
  208. return true;
  209. }
  210. return false;
  211. },
  212. _getInputText: function _getInputText(listControl, type) {
  213. var inputValue = listControl.$el.find("#inputBox").val(); //look for duplicate objects and differentiate the name of this object if so
  214. var name = this._generateOriginalName(inputValue, type);
  215. return type === 'nonBrowsableGroup' ? {
  216. "defaultName": name
  217. } : {
  218. "defaultName": name,
  219. "defaultDescription": ""
  220. };
  221. }
  222. });
  223. return AddInputRow;
  224. });