"use strict"; /** * Licensed Materials - Property of IBM * * IBM Cognos Products: BI Glass * * Copyright IBM Corp. 2015, 2019 * * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp. */ 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) { //NOSONAR 'use strict'; //NOSONAR var _gCachedCollectParameterValuesResponses = {}; var GlobalFilterPanel = View.extend({ init: function init(options) { GlobalFilterPanel.inherited('init', this, arguments); _.extend(this, options); this._activeContentView = this.glassContext.appController.currentAppView.currentContentView; // access the switcher directly until events are supported 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 this._filterParametersValues = this._activeContentView.getParameters ? true : false; this._parameter_values = this.glassContext.services.userProfile.userProfileSettings.parameter_values ? this.glassContext.services.userProfile.userProfileSettings.parameter_values : {}; this._parameters = this.glassContext.services.userProfile.userProfileSettings.parameters ? this.glassContext.services.userProfile.userProfileSettings.parameters : {}; this._workingAnimationDiv = Utils.getLoadingAnimation(1); // on going associative array tracking an parameter which has changed this._changed_values = {}; // tracks values until the user hits apply, then is cleared this._transaction_values = {}; }, render: function render() { this.$el.css('height', '100%'); var sHtml = doT.template(GlobalFilterPanelHtml)({ 'title': StringResource.get('userSettings'), 'no_values_message': StringResource.get('noSettingsDefined') }); this.$el.html(sHtml); this._showLoadingSVG(); this._renderBody(); this._renderFooter(); return Promise.resolve(true); }, _renderBody: function _renderBody() { var activeParameters = this._activeContentView.getParameters ? this._activeContentView.getParameters() : null; var collectParameterValuesPromises = []; var disabledControls = {}; var reportsQueries = {}; _.each(this._parameter_values, function (parameter_value, parameterName) { var parameter = this._parameters[parameterName]; if (parameter && parameter_value.enabled) { if (this._filterParametersValues && activeParameters && !activeParameters[parameterName]) { disabledControls[parameterName] = parameter_value; } if (parameter.source === 'user' || !reportsQueries[parameter.report_id]) { var requestParameterValues = {}; if (parameter.report_id) { reportsQueries[parameter.report_id] = true; requestParameterValues = this._getRequestParameterValues(parameter.report_id); } if (parameter.report_id && _gCachedCollectParameterValuesResponses[parameter.report_id]) { collectParameterValuesPromises.push(Promise.resolve(_gCachedCollectParameterValuesResponses[parameter.report_id])); } else { var collectParameterValues = new CollectParameterValues({ 'glassContext': this.glassContext, 'parameter': parameter, 'parameterValues': requestParameterValues }); collectParameterValuesPromises.push(collectParameterValues.get()); } } } }.bind(this)); this._renderControls(collectParameterValuesPromises, disabledControls); }, _getRequestParameterValues: function _getRequestParameterValues(report_id) { var requestParameterValues = {}; _.each(this._parameter_values, function (parameterValue) { if (this._parameters[parameterValue.name] && this._parameters[parameterValue.name].report_id === report_id && parameterValue.values.length !== 0) { requestParameterValues[parameterValue.name] = parameterValue; } }.bind(this)); return requestParameterValues; }, _renderControls: function _renderControls(collectParameterValuesPromises, disabledControls) { if (collectParameterValuesPromises.length === 0) { this._showEmptyTable(); } else { Promise.all(collectParameterValuesPromises).then(function (responses) { var responseIndexWithDataSourcePrompts = this._getResponseIndexWithDataSourcePrompts(responses); if (responseIndexWithDataSourcePrompts !== -1) { this._handlePromptingResponses(responses, responseIndexWithDataSourcePrompts, disabledControls); } else { this._hideLoadingSVG(); var controlsAdded = this._addPromptControls(responses, disabledControls); if (!controlsAdded) { this._showEmptyTable(); } } }.bind(this)); } }, _getResponseIndexWithDataSourcePrompts: function _getResponseIndexWithDataSourcePrompts(responses) { for (var i = 0; i < responses.length; ++i) { if (responses[i].xml) { var dataSourcePrompts = $(responses[i].xml).find('selectDataSourceSignon'); if (dataSourcePrompts.length !== 0) { //NOSONAR return i; } } } return -1; }, _handlePromptingResponses: function _handlePromptingResponses(responses, responseIndexWithDataSourcePrompts, disabledControls) { var response = responses[responseIndexWithDataSourcePrompts]; if (responseIndexWithDataSourcePrompts === -1) { this._showEmptyTable(); } else { this.glassContext.appController.showSlideOut({ parent: this.slideout, overlay: true, content: { module: 'bi/admin/globalparameters/view/DataSourcePromptPanel', glassContext: this.glassContext, parameter: response.parameters[0], prompt_details: response, onOKCallback: function (promptResponse) { responses[responseIndexWithDataSourcePrompts] = promptResponse; this._renderControls(responses, disabledControls); }.bind(this), doCancel: this._showEmptyTable.bind(this) }, onHide: function onHide() { if (this.contentView._cancelled === true) { this.contentView.doCancel(); } } }); } }, _addPromptControls: function _addPromptControls(collectParameterValuesResponses, disabledControls) { var controlsToRender = []; _.each(collectParameterValuesResponses, function (collectParameterValuesResponse) { if (collectParameterValuesResponse.report_id) { _gCachedCollectParameterValuesResponses[collectParameterValuesResponse.report_id] = collectParameterValuesResponse; } _.each(collectParameterValuesResponse.promptControls, function (parameterName) { var parameter_value = this._parameter_values[parameterName]; var hasXMLResponse = collectParameterValuesResponse.type === 'xml' && collectParameterValuesResponse.xml; var hasJSONResponse = collectParameterValuesResponse.type === 'json' && collectParameterValuesResponse.json; if (parameter_value && parameter_value.enabled && (hasXMLResponse || hasJSONResponse) && !disabledControls[parameterName]) { var parameter = this._parameters[parameterName]; controlsToRender.push({ collectParameterValuesResponse: collectParameterValuesResponse, parameter_value: parameter_value, parameter: parameter, disabled: disabledControls[parameterName] ? true : false }); } }.bind(this)); }.bind(this)); _.each(_.sortBy(controlsToRender, function (controlToRender) { return controlToRender.parameter.ordinal ? controlToRender.parameter.ordinal : 0; }.bind(this)), function (controlToRender) { this._addPromptControl(controlToRender.collectParameterValuesResponse, controlToRender.parameter_value, controlToRender.parameter, controlToRender.disabled); }.bind(this)); return controlsToRender.length > 0; }, _findCollectParameterValuesResponse: function _findCollectParameterValuesResponse(responses, parameter) { var collectParameterValuesResponse = _.find(responses, function (response) { if (response.type === 'xml') { return response.report_id === parameter.report_id; } else { return response.name === parameter.name; } }); return collectParameterValuesResponse; }, _addPromptControl: function _addPromptControl(collectParameterValuesResponse, parameter_value, parameter, disableControl) { var $div = $(''); var $bodyDiv = this.$el.find('#parameterControls'); $bodyDiv.append($div); PromptControlFactory.render({ '$el': $div.find('[gp-react-div]'), 'glassContext': this.glassContext, 'parameter': parameter, 'parameter_value': parameter_value, 'prompt_details': collectParameterValuesResponse, 'onValuesChange': this._onValuesChange.bind(this) }).then(function () { $div.css('visibility', 'visible'); }); if (disableControl) { $div.find('> div').append($('
')); //NOSONAR } }, _showEmptyTable: function _showEmptyTable() { this._hideLoadingSVG(); this.$el.find('.emptyTableContent').css('display', ''); }, _onValuesChange: function _onValuesChange(valid, parameter_value, invalidateCache) { if (invalidateCache && this._parameters[parameter_value.name] && this._parameters[parameter_value.name].report_id) { delete _gCachedCollectParameterValuesResponses[this._parameters[parameter_value.name].report_id]; } this._changed_values[parameter_value.name] = parameter_value; this._changed_values[parameter_value.name].enabled = true; this._transaction_values[parameter_value.name] = parameter_value; this._transaction_values[parameter_value.name].enabled = true; this._updateFooterButton('gp-saveToAccount', true); this._updateFooterButton('gp-applyValues', true); }, _renderFooter: function _renderFooter() { this._buttonBar = new ButtonBar({ buttons: [{ 'id': 'gp-resetToDefault', 'label': StringResource.get('reset'), 'onSelect': this._resetToDefault.bind(this), 'class': 'gp-secondaryButton' }, { 'id': 'gp-applyValues', 'label': StringResource.get('apply'), 'onSelect': this._applyParameterValues.bind(this) }] }); this._buttonBar.render().then(function (buttonBarHtml) { this.$el.find('#globalFiltersFooter').html(buttonBarHtml); this._updateFooterButton('gp-applyValues', false); }.bind(this)); }, _getFooterButton: function _getFooterButton(id) { return _.find(this._buttonBar.getButtonList(), function (button) { return button.id === id; }); }, _updateFooterButton: function _updateFooterButton(id, enable) { var button = this._getFooterButton(id); if (button) { // Temporarily comment out code until RS integration is complete enable ? button.enable() : button.disable(); //NOSONAR } }, _showLoadingSVG: function _showLoadingSVG() { var $waitContainer = this.$el.find('#gp-waitContainer'); $waitContainer.append(this._workingAnimationDiv); $waitContainer.css('display', 'block'); }, _hideLoadingSVG: function _hideLoadingSVG() { var $waitContainer = this.$el.find('#gp-waitContainer'); $waitContainer.css('display', 'none'); }, _resetToDefault: function _resetToDefault() { var accountParameterValues = new AccountParameterValues({ glassContext: this.glassContext }); accountParameterValues.reset().then(function () { this.glassContext.services.fetch.get('v1/users/~/user_profile_settings', {}).then(function (response) { _.each(response.data.parameter_values, function (parameter_value) { if (this._transaction_values[parameter_value.name] && !_.isEqual(parameter_value, this._transaction_values[parameter_value.name])) { this._transaction_values[parameter_value.name] = parameter_value; } }.bind(this)); this._changed_values = {}; this._parameter_values = response.data.parameter_values; this.glassContext.services.userProfile.userProfileSettings.parameter_values = this._parameter_values; this._applyParameterValues(); this.$el.find('#parameterControls').empty(); this._renderBody(); }.bind(this)); }.bind(this)).catch(function (err) {}.bind(this)); }, saveToUserAccount: function saveToUserAccount() { if (!_.isEmpty(this._changed_values)) { var accountParameterValues = new AccountParameterValues({ glassContext: this.glassContext }); accountParameterValues.update(this._changed_values).catch(function (err) {// log the error }.bind(this)); } }, _updateUserProfileValues: function _updateUserProfileValues() { _.each(this._parameter_values, function (parameterValue, parameterName) { if (this._changed_values[parameterName]) { this._parameter_values[parameterName] = this._changed_values[parameterName]; this.glassContext.services.userProfile.userProfileSettings.parameter_values[parameterName] = this._parameter_values[parameterName]; } }.bind(this)); }, setFocus: function setFocus() { $(this.$el.find(".gp-flyout-panel")).focus(); }, _applyParameterValues: function _applyParameterValues() { this._updateUserProfileValues(); _.each(this._allViews, function (view) { if (_.isFunction(view.currentContentView.updateGlobalParameters)) { view.currentContentView.updateGlobalParameters(this._transaction_values, this.glassContext); } }.bind(this)); this._transaction_values = {}; this._updateFooterButton('gp-applyValues', false); } }); return GlobalFilterPanel; });