123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348 |
- "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 = $('<div style="visibility:hidden" class="gp-panel-control-container"><div><div gp-react-div></div></div></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($('<div class="gp-panel-control-blocker"></div>')); //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;
- });
|