GlobalParametersPanel.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. "use strict";
  2. /**
  3. * Licensed Materials - Property of IBM
  4. *
  5. * IBM Cognos Products: BI Glass
  6. *
  7. * Copyright IBM Corp. 2015, 2019
  8. *
  9. * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  10. */
  11. define(['underscore', 'jquery', 'bi/commons/ui/properties/PropertyUIControl', 'doT', 'bi/commons/ui/View', 'bi/commons/ui/ButtonBar', 'bi/admin/nls/StringResource', 'bi/admin/common/utils/parameters/ParameterValues', 'bi/admin/common/utils/parameters/CollectParameterValues', 'bi/admin/globalparameters/view/controls/PromptControlFactory', 'bi/admin/globalparameters/helpers/AccountParameterValues', 'text!bi/admin/globalparameters/view/templates/GlobalFilterPanel.html', 'bi/commons/utils/Utils'], function (_, $, PropertyUIControl, doT, View, ButtonBar, StringResource, ParameterValues, CollectParameterValues, PromptControlFactory, AccountParameterValues, GlobalFilterPanelHtml, Utils) {
  12. //NOSONAR
  13. 'use strict'; //NOSONAR
  14. var _gCachedCollectParameterValuesResponses = {};
  15. var GlobalFilterPanel = View.extend({
  16. init: function init(options) {
  17. GlobalFilterPanel.inherited('init', this, arguments);
  18. _.extend(this, options);
  19. this._activeContentView = this.glassContext.appController.currentAppView.currentContentView; // access the switcher directly until events are supported
  20. this._allViews = this.glassContext.cachedPerspectives; // check to see if the active content view implements getParameters, if so, we should filter the panel based on the parameters the view supports
  21. this._filterParametersValues = this._activeContentView.getParameters ? true : false;
  22. this._parameter_values = this.glassContext.services.userProfile.userProfileSettings.parameter_values ? this.glassContext.services.userProfile.userProfileSettings.parameter_values : {};
  23. this._parameters = this.glassContext.services.userProfile.userProfileSettings.parameters ? this.glassContext.services.userProfile.userProfileSettings.parameters : {};
  24. this._workingAnimationDiv = Utils.getLoadingAnimation(1); // on going associative array tracking an parameter which has changed
  25. this._changed_values = {}; // tracks values until the user hits apply, then is cleared
  26. this._transaction_values = {};
  27. },
  28. render: function render() {
  29. this.$el.css('height', '100%');
  30. var sHtml = doT.template(GlobalFilterPanelHtml)({
  31. 'title': StringResource.get('userSettings'),
  32. 'no_values_message': StringResource.get('noSettingsDefined')
  33. });
  34. this.$el.html(sHtml);
  35. this._showLoadingSVG();
  36. this._renderBody();
  37. this._renderFooter();
  38. return Promise.resolve(true);
  39. },
  40. _renderBody: function _renderBody() {
  41. var activeParameters = this._activeContentView.getParameters ? this._activeContentView.getParameters() : null;
  42. var collectParameterValuesPromises = [];
  43. var disabledControls = {};
  44. var reportsQueries = {};
  45. _.each(this._parameter_values, function (parameter_value, parameterName) {
  46. var parameter = this._parameters[parameterName];
  47. if (parameter && parameter_value.enabled) {
  48. if (this._filterParametersValues && activeParameters && !activeParameters[parameterName]) {
  49. disabledControls[parameterName] = parameter_value;
  50. }
  51. if (parameter.source === 'user' || !reportsQueries[parameter.report_id]) {
  52. var requestParameterValues = {};
  53. if (parameter.report_id) {
  54. reportsQueries[parameter.report_id] = true;
  55. requestParameterValues = this._getRequestParameterValues(parameter.report_id);
  56. }
  57. if (parameter.report_id && _gCachedCollectParameterValuesResponses[parameter.report_id]) {
  58. collectParameterValuesPromises.push(Promise.resolve(_gCachedCollectParameterValuesResponses[parameter.report_id]));
  59. } else {
  60. var collectParameterValues = new CollectParameterValues({
  61. 'glassContext': this.glassContext,
  62. 'parameter': parameter,
  63. 'parameterValues': requestParameterValues
  64. });
  65. collectParameterValuesPromises.push(collectParameterValues.get());
  66. }
  67. }
  68. }
  69. }.bind(this));
  70. this._renderControls(collectParameterValuesPromises, disabledControls);
  71. },
  72. _getRequestParameterValues: function _getRequestParameterValues(report_id) {
  73. var requestParameterValues = {};
  74. _.each(this._parameter_values, function (parameterValue) {
  75. if (this._parameters[parameterValue.name] && this._parameters[parameterValue.name].report_id === report_id && parameterValue.values.length !== 0) {
  76. requestParameterValues[parameterValue.name] = parameterValue;
  77. }
  78. }.bind(this));
  79. return requestParameterValues;
  80. },
  81. _renderControls: function _renderControls(collectParameterValuesPromises, disabledControls) {
  82. if (collectParameterValuesPromises.length === 0) {
  83. this._showEmptyTable();
  84. } else {
  85. Promise.all(collectParameterValuesPromises).then(function (responses) {
  86. var responseIndexWithDataSourcePrompts = this._getResponseIndexWithDataSourcePrompts(responses);
  87. if (responseIndexWithDataSourcePrompts !== -1) {
  88. this._handlePromptingResponses(responses, responseIndexWithDataSourcePrompts, disabledControls);
  89. } else {
  90. this._hideLoadingSVG();
  91. var controlsAdded = this._addPromptControls(responses, disabledControls);
  92. if (!controlsAdded) {
  93. this._showEmptyTable();
  94. }
  95. }
  96. }.bind(this));
  97. }
  98. },
  99. _getResponseIndexWithDataSourcePrompts: function _getResponseIndexWithDataSourcePrompts(responses) {
  100. for (var i = 0; i < responses.length; ++i) {
  101. if (responses[i].xml) {
  102. var dataSourcePrompts = $(responses[i].xml).find('selectDataSourceSignon');
  103. if (dataSourcePrompts.length !== 0) {
  104. //NOSONAR
  105. return i;
  106. }
  107. }
  108. }
  109. return -1;
  110. },
  111. _handlePromptingResponses: function _handlePromptingResponses(responses, responseIndexWithDataSourcePrompts, disabledControls) {
  112. var response = responses[responseIndexWithDataSourcePrompts];
  113. if (responseIndexWithDataSourcePrompts === -1) {
  114. this._showEmptyTable();
  115. } else {
  116. this.glassContext.appController.showSlideOut({
  117. parent: this.slideout,
  118. overlay: true,
  119. content: {
  120. module: 'bi/admin/globalparameters/view/DataSourcePromptPanel',
  121. glassContext: this.glassContext,
  122. parameter: response.parameters[0],
  123. prompt_details: response,
  124. onOKCallback: function (promptResponse) {
  125. responses[responseIndexWithDataSourcePrompts] = promptResponse;
  126. this._renderControls(responses, disabledControls);
  127. }.bind(this),
  128. doCancel: this._showEmptyTable.bind(this)
  129. },
  130. onHide: function onHide() {
  131. if (this.contentView._cancelled === true) {
  132. this.contentView.doCancel();
  133. }
  134. }
  135. });
  136. }
  137. },
  138. _addPromptControls: function _addPromptControls(collectParameterValuesResponses, disabledControls) {
  139. var controlsToRender = [];
  140. _.each(collectParameterValuesResponses, function (collectParameterValuesResponse) {
  141. if (collectParameterValuesResponse.report_id) {
  142. _gCachedCollectParameterValuesResponses[collectParameterValuesResponse.report_id] = collectParameterValuesResponse;
  143. }
  144. _.each(collectParameterValuesResponse.promptControls, function (parameterName) {
  145. var parameter_value = this._parameter_values[parameterName];
  146. var hasXMLResponse = collectParameterValuesResponse.type === 'xml' && collectParameterValuesResponse.xml;
  147. var hasJSONResponse = collectParameterValuesResponse.type === 'json' && collectParameterValuesResponse.json;
  148. if (parameter_value && parameter_value.enabled && (hasXMLResponse || hasJSONResponse) && !disabledControls[parameterName]) {
  149. var parameter = this._parameters[parameterName];
  150. controlsToRender.push({
  151. collectParameterValuesResponse: collectParameterValuesResponse,
  152. parameter_value: parameter_value,
  153. parameter: parameter,
  154. disabled: disabledControls[parameterName] ? true : false
  155. });
  156. }
  157. }.bind(this));
  158. }.bind(this));
  159. _.each(_.sortBy(controlsToRender, function (controlToRender) {
  160. return controlToRender.parameter.ordinal ? controlToRender.parameter.ordinal : 0;
  161. }.bind(this)), function (controlToRender) {
  162. this._addPromptControl(controlToRender.collectParameterValuesResponse, controlToRender.parameter_value, controlToRender.parameter, controlToRender.disabled);
  163. }.bind(this));
  164. return controlsToRender.length > 0;
  165. },
  166. _findCollectParameterValuesResponse: function _findCollectParameterValuesResponse(responses, parameter) {
  167. var collectParameterValuesResponse = _.find(responses, function (response) {
  168. if (response.type === 'xml') {
  169. return response.report_id === parameter.report_id;
  170. } else {
  171. return response.name === parameter.name;
  172. }
  173. });
  174. return collectParameterValuesResponse;
  175. },
  176. _addPromptControl: function _addPromptControl(collectParameterValuesResponse, parameter_value, parameter, disableControl) {
  177. var $div = $('<div style="visibility:hidden" class="gp-panel-control-container"><div><div gp-react-div></div></div></div>');
  178. var $bodyDiv = this.$el.find('#parameterControls');
  179. $bodyDiv.append($div);
  180. PromptControlFactory.render({
  181. '$el': $div.find('[gp-react-div]'),
  182. 'glassContext': this.glassContext,
  183. 'parameter': parameter,
  184. 'parameter_value': parameter_value,
  185. 'prompt_details': collectParameterValuesResponse,
  186. 'onValuesChange': this._onValuesChange.bind(this)
  187. }).then(function () {
  188. $div.css('visibility', 'visible');
  189. });
  190. if (disableControl) {
  191. $div.find('> div').append($('<div class="gp-panel-control-blocker"></div>')); //NOSONAR
  192. }
  193. },
  194. _showEmptyTable: function _showEmptyTable() {
  195. this._hideLoadingSVG();
  196. this.$el.find('.emptyTableContent').css('display', '');
  197. },
  198. _onValuesChange: function _onValuesChange(valid, parameter_value, invalidateCache) {
  199. if (invalidateCache && this._parameters[parameter_value.name] && this._parameters[parameter_value.name].report_id) {
  200. delete _gCachedCollectParameterValuesResponses[this._parameters[parameter_value.name].report_id];
  201. }
  202. this._changed_values[parameter_value.name] = parameter_value;
  203. this._changed_values[parameter_value.name].enabled = true;
  204. this._transaction_values[parameter_value.name] = parameter_value;
  205. this._transaction_values[parameter_value.name].enabled = true;
  206. this._updateFooterButton('gp-saveToAccount', true);
  207. this._updateFooterButton('gp-applyValues', true);
  208. },
  209. _renderFooter: function _renderFooter() {
  210. this._buttonBar = new ButtonBar({
  211. buttons: [{
  212. 'id': 'gp-resetToDefault',
  213. 'label': StringResource.get('reset'),
  214. 'onSelect': this._resetToDefault.bind(this),
  215. 'class': 'gp-secondaryButton'
  216. }, {
  217. 'id': 'gp-applyValues',
  218. 'label': StringResource.get('apply'),
  219. 'onSelect': this._applyParameterValues.bind(this)
  220. }]
  221. });
  222. this._buttonBar.render().then(function (buttonBarHtml) {
  223. this.$el.find('#globalFiltersFooter').html(buttonBarHtml);
  224. this._updateFooterButton('gp-applyValues', false);
  225. }.bind(this));
  226. },
  227. _getFooterButton: function _getFooterButton(id) {
  228. return _.find(this._buttonBar.getButtonList(), function (button) {
  229. return button.id === id;
  230. });
  231. },
  232. _updateFooterButton: function _updateFooterButton(id, enable) {
  233. var button = this._getFooterButton(id);
  234. if (button) {
  235. // Temporarily comment out code until RS integration is complete
  236. enable ? button.enable() : button.disable(); //NOSONAR
  237. }
  238. },
  239. _showLoadingSVG: function _showLoadingSVG() {
  240. var $waitContainer = this.$el.find('#gp-waitContainer');
  241. $waitContainer.append(this._workingAnimationDiv);
  242. $waitContainer.css('display', 'block');
  243. },
  244. _hideLoadingSVG: function _hideLoadingSVG() {
  245. var $waitContainer = this.$el.find('#gp-waitContainer');
  246. $waitContainer.css('display', 'none');
  247. },
  248. _resetToDefault: function _resetToDefault() {
  249. var accountParameterValues = new AccountParameterValues({
  250. glassContext: this.glassContext
  251. });
  252. accountParameterValues.reset().then(function () {
  253. this.glassContext.services.fetch.get('v1/users/~/user_profile_settings', {}).then(function (response) {
  254. _.each(response.data.parameter_values, function (parameter_value) {
  255. if (this._transaction_values[parameter_value.name] && !_.isEqual(parameter_value, this._transaction_values[parameter_value.name])) {
  256. this._transaction_values[parameter_value.name] = parameter_value;
  257. }
  258. }.bind(this));
  259. this._changed_values = {};
  260. this._parameter_values = response.data.parameter_values;
  261. this.glassContext.services.userProfile.userProfileSettings.parameter_values = this._parameter_values;
  262. this._applyParameterValues();
  263. this.$el.find('#parameterControls').empty();
  264. this._renderBody();
  265. }.bind(this));
  266. }.bind(this)).catch(function (err) {}.bind(this));
  267. },
  268. saveToUserAccount: function saveToUserAccount() {
  269. if (!_.isEmpty(this._changed_values)) {
  270. var accountParameterValues = new AccountParameterValues({
  271. glassContext: this.glassContext
  272. });
  273. accountParameterValues.update(this._changed_values).catch(function (err) {// log the error
  274. }.bind(this));
  275. }
  276. },
  277. _updateUserProfileValues: function _updateUserProfileValues() {
  278. _.each(this._parameter_values, function (parameterValue, parameterName) {
  279. if (this._changed_values[parameterName]) {
  280. this._parameter_values[parameterName] = this._changed_values[parameterName];
  281. this.glassContext.services.userProfile.userProfileSettings.parameter_values[parameterName] = this._parameter_values[parameterName];
  282. }
  283. }.bind(this));
  284. },
  285. setFocus: function setFocus() {
  286. $(this.$el.find(".gp-flyout-panel")).focus();
  287. },
  288. _applyParameterValues: function _applyParameterValues() {
  289. this._updateUserProfileValues();
  290. _.each(this._allViews, function (view) {
  291. if (_.isFunction(view.currentContentView.updateGlobalParameters)) {
  292. view.currentContentView.updateGlobalParameters(this._transaction_values, this.glassContext);
  293. }
  294. }.bind(this));
  295. this._transaction_values = {};
  296. this._updateFooterButton('gp-applyValues', false);
  297. }
  298. });
  299. return GlobalFilterPanel;
  300. });