"use strict"; /** * Licensed Materials - Property of IBM * IBM Cognos Products: admin * 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', 'bi/content_apps/PropertiesPageView', 'bi/admin/datasource/services/ApiSvc', 'bi/admin/datasource/services/DataSourceListController', 'bi/admin/multitenancy/services/TenantsCustomizationService', 'bi/admin/nls/StringResource', 'text!bi/admin/common/propertiespageview.json', 'bi/admin/common/utils/AJAXUtils', 'bi/admin/datasource/services/ConnectionUtils', 'bi/admin/datasource/services/ConnectionListController', 'bacontentnav/utils/UIHelper', '../ba-graphics/dist/icons-js/custom-visual_16', '../ba-graphics/dist/icons-js/schematic_16', 'bi/admin/common/services/ApiBase', 'jquery'], function (_, BasePropertiesPageView, datasourceApi, DataSourceListController, TenantsController, StringResource, propertiesPageViewDefinitions, AJAXUtils, ConnectionUtils, ConnectionListController, UIHelper, bundleTypeRendererIcon, bundleTypeSchematicIcon, ApiBase, $) { 'use strict'; //NOSONAR: meant to be strict var PropertiesPageView = BasePropertiesPageView.extend({ _objectIcons: { dataSource: { icon: '#common-data_source', tooltip: 'datasource' }, dataSourceConnection: { icon: '#common-connection', tooltip: 'connection' }, dataSourceSignon: { icon: '#common-password-key', tooltip: 'signon' }, tenant: { icon: '#common-multi_tenant', tooltip: 'tenant' }, bundleType_renderer: { icon: bundleTypeRendererIcon.id || bundleTypeRendererIcon.default.id, tooltip: StringResource.get('bundleType_renderer') }, bundleType_schematic: { icon: bundleTypeSchematicIcon.id || bundleTypeSchematicIcon.default.id, tooltip: StringResource.get('bundleType_schematic') } }, /** * @param options.$el - JQuery node to append the view onto (either a parent pane or the body) * @param options.objectInformation {object} - An object that contains the information for the content * * @constructor */ init: function init(options) { options.objectInformation = options.objectInfo; PropertiesPageView.inherited('init', this, arguments); _.extend(this, options); datasourceApi.glassContext = this.glassContext; if (options.propertiesPageViewDefinition) { this._oPropertiesPageViewDefintions = options.propertiesPageViewDefinition; } else { this._oPropertiesPageViewDefintions = JSON.parse(propertiesPageViewDefinitions); } this.dsController = this._getNewDataSourceListController({ glassContext: this.glassContext }); this.tenantsController = this._getNewTenantsController({ glassContext: this.glassContext }); this.apiBase = this._getApiBase({ glassContext: this.glassContext }); }, _getApiBase: function _getApiBase(options) { return new ApiBase(options); }, _getNewDataSourceListController: function _getNewDataSourceListController(options) { return new DataSourceListController(options); }, _getNewTenantsController: function _getNewTenantsController(options) { return new TenantsController(options); }, reload: function reload() { this.$el.empty(); this.render(); }, _addTabChangeHandler: function _addTabChangeHandler() { var tabCon = this._oPropertyUIControl.getProperties()[2]; tabCon.onTabChange = function () { $(this).trigger('tabChanged'); }.bind(this); }, cannotEditNSObjects: function cannotEditNSObjects(type) { var nsObjectTypes = ['namespace', 'namespaceFolder', 'account', 'group', 'role']; return nsObjectTypes.indexOf(type) !== -1 && this._isExternalNS(); }, _property_name_read_only: function _property_name_read_only() { var $editIcon = $(this.$el.find('.banner .propertyNameEdit')); $editIcon.remove(); var $nameInput = $(this.$el.find('.propertiesBannerLabel.v_defaultName')); $nameInput.attr('readonly', 'true'); $nameInput.css('cursor', 'text'); var $ic = $(this.$el.find('.propertiesBannerIcon')); $ic.css('cursor', 'text'); }, render: function render() { return PropertiesPageView.inherited('render', this, arguments).then(function () { this.$el.addClass('AdminPropPageView'); this._addTabChangeHandler(); if (this.type === 'connection') { if (this.objectInfo.isNew || this.objectInfo.disabled) { this._hideExtraTabs(); } else { this._showExtraTabs(); } } else if (this.type === 'resourceFolder' || this.cannotEditNSObjects(this.type)) { this._property_name_read_only(); } else if (this.type === 'visualization') { var bundle = this._objectIcons['bundleType_' + this.objectInfo.bundleType]; if (bundle) { // change icon in title banner var $bundleIcon = this.$el.find('.propertyUIControlBanner .propertiesBannerIcon'); $bundleIcon.attr('title', bundle.tooltip); if (this.objectInfo.bundleImage) { var classStr = ' class="' + $bundleIcon.find('svg').attr('class') + '" '; var srcStr = ' src="' + this.objectInfo.bundleImage + '" '; $bundleIcon.find('svg').replaceWith(''); } else { $bundleIcon.find('svg>text').text(bundle.tooltip); $bundleIcon.find('svg>use').attr('xlink:href', '#' + bundle.icon); } // change type in first row var $fileType = this.$el.find('.containerUIControl.propertiesUIControlPageView .propertyRow .propertyDetails .propertyValue.fileType'); $fileType.text(bundle.tooltip); } } }.bind(this)).catch(function (e) { this.logger.debug(e); }.bind(this)); }, _hideExtraTabs: function _hideExtraTabs() { this.slideout.$el.find('.tabNumber2').addClass('disabled').attr('aria-disabled', 'true'); var $disabledIcon = $(''); this.slideout.$el.find('.tabNumber2>a').append($disabledIcon); }, _showExtraTabs: function _showExtraTabs() { this.slideout.$el.find('.tabNumber2').removeClass('disabled').removeAttr('aria-disabled'); this.slideout.$el.find('.tabNumber2>a>svg').remove(); }, _getObjectType: function _getObjectType() { if (!this.objectInformation.ancestors || this.objectInformation.ancestors.length === 0) { return this.objectInformation.type; } if (this.objectInformation.ancestors[0].type === 'capability') { return this.objectInformation.ancestors[0].type; } return this.objectInformation.type; }, _invalidDataAccount: function _invalidDataAccount(data) { var errKey; if (this.type === 'account') { if (data.password && !/^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$/.test(data.password)) { errKey = 'passwordInvalidErrorMsg'; } else if (data.surname !== undefined && $.trim(data.surname) === '') { errKey = 'surnameInvalidErrorMsg'; } else if (data.email && !/^([a-zA-Z0-9]+[_|-|.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|-|.]?)*[a-zA-Z0-9]+.[a-zA-Z]{2,3}$/.test(data.email)) { errKey = 'emailInvalidErrorMsg'; } if (errKey) { this.glassContext.appController.showErrorMessage(StringResource.get(errKey), StringResource.get('error')); } } return errKey !== undefined; }, _invalidData: function _invalidData(data) { // Glass always calls hide() on open and close of the slideout. This causes the save request to be done multiple // times. To avoid this, the _isSaved flag is used to indicate that save is already done, so not to do another one. return this._isSaved || !this.objectInfo.isNew && _.size(data) === 0 || this._invalidDataAccount(data); }, _isBasicType: function _isBasicType() { return this.type === 'account' || this.type === 'group' || this.type === 'namespaceFolder' || this.type === 'role'; }, _reloadAfterUpdate: function _reloadAfterUpdate() { if (this.onUpdate) { this.onUpdate(); } if (this.type === 'namespace') { _.each(this.parentView.listView.dataAdaptor._accountExplorer._nameSpaces, function (item, index) { if (item.id === this.objectInformation.id) { this.parentView.listView.dataAdaptor._accountExplorer._nameSpaces[index] = this.objectInformation; } }.bind(this)); } if (this.parentView.refresh) { this.parentView.refresh(); } }, _isCorDL: function _isCorDL() { return this.type === 'contact' || this.type === 'distributionList'; }, update: function update() { var data; var dataDefault = this.objectInformation.defaultName; if (this.objectInformation.contactUpdate) { data = this.objectInformation.contactUpdate; delete this.objectInformation.contactUpdate; } else { data = this._oPropertyUIControl ? this._oPropertyUIControl.getModifiedProperties() : ''; } if (this._invalidData(data)) { return Promise.resolve(); } if (this._isBasicType()) { this._convertOptions(data); } else if (this.type === 'securedFeature' || this.type === 'securedFunction' || this.type === 'productCapability' || this.type === 'resourceFolder' || this.type === 'cosConnection' || this.type === 'cosLocation') { this.objectInformation = _.extend(this.objectInformation, data); } else if (this.type !== 'visualization' && this.type !== 'dataSource' && this.type !== 'connection' && this.type !== 'tenant' && !this._isCorDL()) { this.parentView.listView.dataAdaptor.sortChanged = true; this.objectInformation = _.extend(this.objectInformation, data); } if (data.defaultName === '') { data.defaultName = dataDefault + '_defaultNameWasEmpty'; } return this._save(data).then(this._reloadAfterUpdate.bind(this)); }, _getActualValue: function _getActualValue(data, item, val) { var temp = _.find(this.objectInformation.options, function (opIt) { return opIt.name === item.name; }); var actualValue; if (data[val] !== undefined) { actualValue = data[val]; } else if (this.objectInformation.options && temp) { actualValue = temp.value; } else { actualValue = item.value; } return actualValue; }, _convertOptionsHelper: function _convertOptionsHelper(data, item) { var val = item.name; var sBidiEnumURL = 'http://developer.cognos.com/ceba/constants/biDirectionalOptionEnum#'; if (val.indexOf(sBidiEnumURL) === 0) { val = val.substring(sBidiEnumURL.length); } if (this.objectInformation.options) { var actualValue = this._getActualValue(data, item, val); if (_.isString(actualValue) && actualValue.indexOf(sBidiEnumURL) === 0) { this.objectInformation[val] = actualValue.substring(actualValue.lastIndexOf('#') + 1); } else { this.objectInformation[val] = actualValue; } item.value = actualValue; } }, _convertOptions: function _convertOptions(data) { var newOptions = [{ 'name': 'http://developer.cognos.com/ceba/constants/biDirectionalOptionEnum#baseTextDirection', 'type': 'genericOptionAnyURI', 'value': 'http://developer.cognos.com/ceba/constants/biDirectionalOptionEnum#biDirectionalFeaturesEnabled#RTL' }, { 'name': 'http://developer.cognos.com/ceba/constants/biDirectionalOptionEnum#biDirectionalFeaturesEnabled', 'type': 'genericOptionBoolean', 'value': false }, { 'name': 'showHiddenObjects', 'type': 'portalOptionBoolean', 'value': false }, { 'name': 'http:\/\/developer.cognos.com\/ceba\/constants\/systemOptionEnum#accessibilityFeatures', 'type': 'genericOptionBoolean', 'value': false }, { 'name': 'showHints', 'type': 'portalOptionString', 'value': 'showAll' }]; _.extend(this.objectInformation, data); newOptions.forEach(this._convertOptionsHelper.bind(this, data)); this.objectInformation.options = newOptions; }, onHide: function onHide() { if (!this._oPropertyUIControl) { return Promise.resolve(); } else { if (this.type === 'connection') { //in this case we want to make sure we delete the settings tab //as that is taken care of for us var tabCon = this._oPropertyUIControl.getProperties()[2]; if (tabCon && tabCon._tabs) { tabCon._tabs.splice(1, 1); } } this.update().then(function () { this._oPropertyUIControl.remove(); if (this.parentView.slideout && this.parentView.slideout.content && this.parentView.slideout.parent.parent && this.parentView.slideout.content.module.indexOf('bi/admin/datasource/slideout') > -1) { this.parentView.slideout.remove(); } }.bind(this)); return Promise.resolve(true); } }, _handleError: function _handleError(err) { if (AJAXUtils.isNamingConflictErrorMsg(err) || err.status === 409) { this.glassContext.appController.showErrorMessage(StringResource.get('nameConflictErrorMsg'), StringResource.get('error')); } else { this.glassContext.appController.showErrorMessage(err.responseJSON.messages.join('\n'), StringResource.get('error')); } }, _updateAccountObject: function _updateAccountObject() { var userPrefURL; switch (this.type) { case 'group': userPrefURL = AJAXUtils.getPath('updateGroup', this.objectInformation.id); break; case 'role': userPrefURL = AJAXUtils.getPath('updateRole', this.objectInformation.id); break; case 'user': userPrefURL = AJAXUtils.getPath('updateUser', this.objectInformation.id); break; case 'namespaceFolder': userPrefURL = AJAXUtils.getPath('updateNamespaceFolder', this.objectInformation.id); break; case 'namespace': case 'contact': case 'distributionList': userPrefURL = AJAXUtils.getPath('updateNamespace', this.objectInformation.id); break; case 'securedFeature': case 'securedFunction': case 'productCapability': userPrefURL = 'v1/objects/' + this.objectInformation.id; break; default: userPrefURL = ''; break; } var options = { dataType: 'json', contentType: 'application/json; charset=utf-8', type: 'PUT', data: JSON.stringify(this.objectInformation.updatedData), url: userPrefURL, cache: false }; return this.glassContext.services.ajax.ajax(options); }, _updateUserPreferences: function _updateUserPreferences() { var userPrefURL = AJAXUtils.getPath('getUserPreference', this.objectInformation.id); var options = { dataType: 'json', type: 'PUT', contentType: 'application/json; charset=utf-8', data: JSON.stringify(this.objectInformation), url: userPrefURL, cache: false }; return this.glassContext.services.ajax.ajax(options); }, _save: function _save(data) { this._isSaved = true; var toastName = data.defaultName ? data.defaultName : this.objectInformation.defaultName; if (data.defaultName && data.defaultName.includes('_defaultNameWasEmpty')) { this.type = 'error'; } var dfd; switch (this.type) { case 'account': this._setObjectInformationForAccounts(data); dfd = this._updateUserPreferences().then(this._showToastHelper.bind(this, toastName)); break; case 'group': case 'role': case 'namespaceFolder': dfd = this._getPropertiesInfo().then(function () { this._dataHelper(data); return this._updateAccountObject(); }.bind(this)).then(this._showToastHelper.bind(this, toastName)); break; case 'dataSource': dfd = this._saveDataSource(data, toastName); break; case 'connection': dfd = this._saveConnection(data); break; case 'visualization': this._dataHelper(data); dfd = this._saveVisualization().then(this._showToastHelper.bind(this, toastName), function (arg, err) { this._handleError(err); }.bind(this)); break; case 'namespace': case 'contact': case 'distributionList': case 'securedFeature': case 'securedFunction': case 'productCapability': this._dataHelper(data); dfd = this._updateAccountObject().then(this._showToastHelper.bind(this, toastName), function (arg, err) { this._handleError(err); }.bind(this)); break; case 'tenant': dfd = this._updateTenant(data); break; case 'resourceFolder': dfd = this.apiBase.updateResourceFolder(this.objectInformation, data); break; case 'cosConnection': dfd = this.apiBase.updateCOSConnection(this.objectInformation, data); break; case 'cosLocation': dfd = this.apiBase.updateCOSLocation(this.objectInformation, data); break; default: this.logger.error('do not know how to handle objects of type ' + this.type); dfd = Promise.resolve().then(this._showToastHelper.bind(this, toastName)); } return dfd; }, _setObjectInformationForAccounts: function _setObjectInformationForAccounts(data) { if (this.objectInformation.skin) { this.objectInformation.skin = this.objectInformation.skin.charAt(0).toUpperCase() + this.objectInformation.skin.slice(1); } if (this.objectInformation.password) { this.objectInformation.password = btoa(this.objectInformation.password); } if (!this._isAnonymous(this.objectInformation)) { this.objectInformation.defaultName = this.objectInformation.givenName + ' ' + this.objectInformation.surname; } }, _dataHelper: function _dataHelper(data) { this.objectInformation.updatedData = data; this.objectInformation.updatedData.type = this.type; if (this.type === 'securedFeature' || this.type === 'securedFunction' || this.type === 'productCapability') { this.objectInformation.updatedData.type = this.objectInformation.type; } }, _saveDataSource: function _saveDataSource(data, toastName) { var propertyInfo = { 'disabled': this.objectInformation.disabled, 'hidden': this.objectInformation.hidden, 'hasChildren': this.objectInformation.hasChildren }; $.extend(propertyInfo, data); return datasourceApi.dataSources.update(this.objectInformation.id, propertyInfo).then(this._showToastHelper.bind(this, toastName), function (arg, err) { this._handleError(err); }.bind(this)).then(function () { $(this.slideout).trigger('updateObject', this.objectInfo); }.bind(this)); }, _saveConnection: function _saveConnection(data) { $.extend(this.objectInfo, data); if (!this.objectInfo.isNew) { this._saveExistingConnection(); } return Promise.resolve(); }, _saveVisualization: function _saveVisualization() { var userPrefURL = AJAXUtils.getPath('updateVisualization', this.objectInformation.id); // visualizations id saved to CM defaultName field. // visualizations name saved to CM defaultScreenTip field. this.objectInformation.updatedData.defaultScreenTip = this.objectInformation.updatedData.defaultName; delete this.objectInformation.updatedData.defaultName; var options = { dataType: 'json', contentType: 'application/json; charset=utf-8', type: 'PUT', data: JSON.stringify(this.objectInformation.updatedData), url: userPrefURL, cache: false }; return this.glassContext.getCoreSvc('.Ajax').ajax(options); }, _showToastHelper: function _showToastHelper(toastName, newData) { if (toastName.includes('_defaultNameWasEmpty')) { var sText = StringResource.get('toastUpdateFailedMsg', { 'name': toastName.substring(0, toastName.length - 20) }); this.glassContext.appController.showToast(sText, { type: 'info' }); } else { var sText = StringResource.get('toastUpdateMsg', { 'name': toastName }); this.glassContext.appController.showToast(sText, { type: 'success' }); } return newData; }, setFocus: function setFocus() { if (this.objectInfo.isNew) { var nameEl = this.$el.find('.v_defaultName'); $(nameEl).focus(); $(nameEl).select(); } else { PropertiesPageView.inherited('setFocus', this, arguments); } }, _getIdFromLocationHeader: function _getIdFromLocationHeader(response) { var location = response.getResponseHeader('location'); return location.split('/').pop(); }, _updateTenant: function _updateTenant(data) { var tenantName = data.defaultName !== undefined ? data.defaultName : this.objectInfo.defaultName; return this.tenantsController.updateTenant(this.objectInfo.tenantID, data).then(function () { this.glassContext.appController.showToast(StringResource.get('multitenancySuccessUpdate', { 'tenantName': tenantName })); }.bind(this), function (ajaxOptions, error) { this.glassContext.appController.showErrorMessage(StringResource.get('multitenacyFailedUpdate', { 'tenantName': tenantName }) + ', ' + AJAXUtils.buildErrorMessage(error.responseJSON.errors)); }.bind(this)); }, _saveExistingConnection: function _saveExistingConnection() { ConnectionUtils.saveConnection(this.glassContext.getCoreSvc('.Ajax'), this.objectInfo, this.connectionSignons, this.removedSignons).then(function () { var sText = StringResource.get('datasourceConnectionToastUpdateMsg', { 'name': this.objectInfo.defaultName }); this.glassContext.appController.showToast(sText, { type: 'success' }); if (this.connectionSignons) { this.connectionSignons.forEach(function (signon) { delete signon.isNew; }); } this.removedSignons = []; $(this.slideout).trigger('updateObject', this.objectInfo); }.bind(this), function () { var sText = StringResource.get('datasourceConnectionToastUpdateFailedMsg', { 'name': this.objectInfo.defaultName }); this.glassContext.appController.showToast(sText, { 'type': 'error' }); }.bind(this)); }, _getPropertiesInfoForAccount: function _getPropertiesInfoForAccount() { if (!_.isUndefined(this.accountExplorer)) { return new Promise(function (resolve, reject) { this.accountExplorer.getAccount(this.objectInformation).then(function (newData) { resolve(newData.data[0]); }, reject); }.bind(this)); } else { return Promise.resolve(this.objectInfo); } }, _getPropertiesInfoForConnection: function _getPropertiesInfoForConnection() { if (!this.objectInfo.isNew) { var conControl = new ConnectionListController({ glassContext: this.glassContext }); return conControl.getConnection(this.objectInformation.id, this.objectInformation.connId).then(function (newData) { newData.dataSourceId = this.objectInfo.dataSourceId; return newData; }.bind(this)); } else { return Promise.resolve(this.objectInfo); } }, _getPropertiesInfoForGroupRoleFolderNS: function _getPropertiesInfoForGroupRoleFolderNS() { if (!_.isUndefined(this.accountExplorer)) { return new Promise(function (resolve, reject) { this.accountExplorer.getItem(this.objectInformation).then(function (newData) { resolve(newData.data[0]); }, reject); }.bind(this)); } else { return Promise.resolve(this.objectInfo); } }, _getPropertiesInfoForDataSource: function _getPropertiesInfoForDataSource() { return new Promise(function (resolve, reject) { this.dsController.getDataSource(this.objectInformation.id).then(function (newData) { resolve(newData.data[0]); }, reject); }.bind(this)); }, _getPropertiesInfoForTenant: function _getPropertiesInfoForTenant() { return new Promise(function (resolve, reject) { this.tenantsController.getTenant(this.objectInformation.tenantID).then(function (tenant) { resolve(tenant.data[0]); }, reject); }.bind(this)); }, // visualizations id saved to CM defaultName field. // visualizations name saved to CM defaultScreenTip field. _getPropertiesInfoForvisualization: function _getPropertiesInfoForvisualization() { return this.glassContext.getCoreSvc('.Ajax').ajax({ dataType: 'json', type: 'GET', url: 'v1/objects/' + encodeURIComponent(this.objectInformation.id) + '?fields=defaultScreenTip,disabled,hidden,permissions,creationTime,owner.defaultName,hidden,disabled,tenantID,defaultDescription,email,searchPath,ancestors,format,locale,timeZoneID,givenName,surname' }).then(function (resp) { resp.data.data[0].defaultName = resp.data.data[0].defaultScreenTip; return resp.data.data[0]; }).catch(function (err) { this.logger.error(err); }.bind(this)); }, _getPropertiesInfoCM: function _getPropertiesInfoCM() { return this.glassContext.getCoreSvc('.Ajax').ajax({ dataType: 'json', type: 'GET', url: 'v1/objects/' + encodeURIComponent(this.objectInformation.id) + '?fields=defaultName,disabled,hidden,permissions,creationTime,owner.defaultName,hidden,disabled,tenantID,defaultDescription,email,searchPath,ancestors,format,locale,timeZoneID,givenName,surname' }).then(function (resp) { return resp.data.data[0]; }).catch(function (err) { this.logger.error(err); }.bind(this)); }, _getPropertiesInfoForCapability: function _getPropertiesInfoForCapability() { return this.glassContext.getCoreSvc('.Ajax').ajax({ dataType: 'json', type: 'GET', url: 'v1/objects/' + encodeURIComponent(this.objectInformation.id) + '?fields=ancestors,disabled,hidden,permissions,creationTime,owner.defaultName,defaultDescription,parent,defaultName,userCapability,policies,hasChildren,searchPath' }).then(function (resp) { return resp.data.data[0]; }).catch(function (err) { this.logger.error(err); }.bind(this)); }, _getPropertiesInfoByType: function _getPropertiesInfoByType() { var dfd; switch (this.type) { case 'account': dfd = this._getPropertiesInfoForAccount(); break; case 'role': case 'group': case 'namespace': case 'namespaceFolder': dfd = this._getPropertiesInfoForGroupRoleFolderNS(); break; case 'dataSource': dfd = this._getPropertiesInfoForDataSource(); break; case 'connection': dfd = this._getPropertiesInfoForConnection(); break; case 'tenant': dfd = this._getPropertiesInfoForTenant(); break; case 'visualization': dfd = this._getPropertiesInfoForvisualization(); break; case 'contact': case 'distributionList': dfd = this._getPropertiesInfoCM(); break; case 'securedFeature': case 'securedFunction': case 'productCapability': dfd = this._getPropertiesInfoForCapability(); break; default: dfd = Promise.resolve(this.objectInfo); } return dfd; }, _getPropertiesInfo: function _getPropertiesInfo() { return this._getPropertiesInfoByType().then(function (anObj) { this.objectInformation = anObj; }.bind(this)); }, _isExternalNS: function _isExternalNS() { var allowed = ['CAMID(":', 'CAMID("CognosEx:']; var isAllowed = _.find(allowed, function (aKey) { return this.objectInfo.searchPath.indexOf(aKey) >= 0; }.bind(this)); return this.objectInfo && this.objectInfo.searchPath && !isAllowed; }, _getFileType: function _getFileType() { var objectType = this.objectInformation.type; if (objectType) { return StringResource.get('type_' + objectType.toLowerCase()); } else { return StringResource.get('unknown'); } }, _isAnonymous: function _isAnonymous(objectInformation) { if (objectInformation) { return objectInformation.searchPath.indexOf('CAMID("::Anonymous') >= 0; } else { return false; } }, _getSvgIcon: function _getSvgIcon(objInfo) { var icon = PropertiesPageView.inherited('_getSvgIcon', this, arguments); if (icon === null) { if (this._objectIcons[objInfo.type]) { icon = this._objectIcons[objInfo.type].icon; } else { return '#common-question-mark'; } } return icon; }, _getSvgTooltip: function _getSvgTooltip(objInfo) { var tooltip = PropertiesPageView.inherited('_getSvgTooltip', this, arguments); if (_.isUndefined(tooltip)) { tooltip = this._objectIcons[objInfo.type].tooltip; } return tooltip; }, _getTabItems: function _getTabItems() { var tabs = this._oPropertiesPageViewDefintions.tabs; var currentObjTabs = tabs[this._getObjectType()] || tabs['unknown'] || []; return _.map(_.filter(currentObjTabs, this._isTabVisible.bind(this)), this._getTabSpec.bind(this)); }, _getTabSpec: function _getTabSpec(tab) { return { 'name': StringResource.get(tab.name), 'module': tab.module, 'objectInfo': this.objectInformation, 'glassContext': this.glassContext, 'slideout': this.slideout, 'accountExplorer': this.accountExplorer, 'selected': this.selectedTabModule === tab.module, 'connectionResolver': this.connectionResolver }; }, _isTabVisible: function _isTabVisible(tab) { var isVisible = true; if (this._isDevOnlyTab(tab) || !this._tabHasCapabilities(tab) || !this._tabHasPermissions(tab) || this._isExternalNameSpaceRole(tab) || this._dataSourceConnShowSchemasCubes(tab) || this._isCQdataServConn(tab) || this._isOIDCNameSpaceGroup(tab)) { isVisible = false; } return isVisible; }, _dataSourceConnShowSchemasCubes: function _dataSourceConnShowSchemasCubes(tab) { var hideTab = false; if (this._getObjectType() === 'dataSourceConnection' && tab.connectionClass) { hideTab = tab.connectionClass !== ConnectionUtils.getConnectionClass(this.objectInformation); } return hideTab; }, _isCQdataServConn: function _isCQdataServConn(tab) { var hideTab = false; if (this.objectInformation.isNew) { return hideTab; } if (this._getObjectType() === 'dataSourceConnection' && tab && (tab.name === 'connection_details' || tab.name === 'schemas')) { var connectionStringParseResult = ConnectionUtils.parseConnectionString(this.objectInformation); if (!connectionStringParseResult.metadata) { hideTab = true; } } return hideTab; }, _isOIDCNameSpaceGroup: function _isOIDCNameSpaceGroup(tab) { return tab.name === 'members' && this.type === 'group' && this.accountExplorer && this.accountExplorer.isOidcNamespace && this.accountExplorer.isOidcNamespace(); }, _isExternalNameSpaceRole: function _isExternalNameSpaceRole(tab) { return tab.name === 'customization' && this.type === 'role' && this.accountExplorer && !this.accountExplorer.isBuiltinNamespace(); }, _tabHasPermissions: function _tabHasPermissions(tab) { return !tab.requiredPermissions || UIHelper.hasPermissions(this.objectInformation.permissions, tab.requiredPermissions); }, _isDevOnlyTab: function _isDevOnlyTab(tab) { return !this.glassContext.isDevInstall() && tab.devMode === true; }, _tabHasCapabilities: function _tabHasCapabilities(tab) { var hasRequiredCapabilities = true; if (tab.requiredCapabilities) { hasRequiredCapabilities = _.find(tab.requiredCapabilities, function (capability) { return this.glassContext.hasCapability(capability) === false; }.bind(this)) === undefined; } return hasRequiredCapabilities; } }); return PropertiesPageView; });