"use strict"; /** * Licensed Materials - Property of IBM * IBM Cognos Products: Cognos Analytics * Copyright IBM Corp. 2015, 2017 * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp. */ define(['doT', 'underscore', 'react-dom', 'react', 'ba-react-admin/ba-react-admin.min', 'bi/admin/globalparameters/helpers/ParameterValueHelper', 'bi/admin/nls/StringResource', 'bi/admin/globalparameters/helpers/MultiListSelectionHelper', 'bi/admin/globalparameters/helpers/SoapHelper', 'bi/admin/common/utils/parameters/ParameterValues', 'text!bi/admin/globalparameters/view/templates/loadTreeData.xml'], function (doT, _, ReactDOM, React, AdminReact, GlobalParameterHelper, StringResource, SelectionHelper, SoapHelper, ParameterValues, LoadTreeDataTemplate) { return { transformNode: function transformNode(parameter, xml) { //NOSONAR var $promptControlNode; if (parameter.type === 'credential') { $promptControlNode = $(xml).find('*[parameter^=\'' + parameter.name + '\']'); } else { $promptControlNode = $(xml).find('*[parameter=\'' + parameter.name + '\']'); } switch ($promptControlNode.prop('tagName')) { case 'selectValue': { return this._loadSelectValue(parameter.name, $promptControlNode); } case 'selectWithTree': { return this._loadSelectWithTree(parameter.name, $promptControlNode); } case 'selectWithSearch': case 'textBox': { return this._loadTextBox(parameter.name, $promptControlNode); } case 'selectDateTime': case 'selectDate': case 'selectTime': { return this._loadSelectDateTime(parameter.name, $promptControlNode); } case 'selectDataSourceSignon': { return this._loadDataSourceControl(parameter.name, $promptControlNode); } default: { return null; } } }, _loadSelectValue: function _loadSelectValue(parameterName, $promptControlNode) { var selectValueUI = $promptControlNode.attr('selectValueUI'); var module; switch (selectValueUI) { case 'dropdown': { module = AdminReact.DropDownControl; break; } case 'checkboxGroup': { module = AdminReact.CheckboxGroupControl; break; } case 'radioGroup': { module = AdminReact.RadioGroupControl; break; } default: { // For the initial release, we won't support list controls, we'll default lists to either drop downs or checkboxes // module = 'bi/admin/globalparameters/view/controls/ListControl'; //NOSONAR if ($promptControlNode.attr('multiSelect') === 'true') { module = AdminReact.CheckboxGroupControl; } else { module = AdminReact.DropDownControl; } break; } } return { name: parameterName, control: { multiSelect: $promptControlNode.attr('multiSelect') === 'true', type: selectValueUI, module: module, autoSubmit: $promptControlNode.attr('autoSubmit') === 'true' }, values: this._loadValues($promptControlNode) }; }, _loadSelectWithTree: function _loadSelectWithTree(parameterName, $promptControlNode) { return { name: parameterName, control: { multiSelect: $promptControlNode.attr('multiSelect') === 'true', type: 'tree', module: AdminReact.TreeControl, canExpand: $promptControlNode.attr('canExpand') === 'true' }, values: this._loadValues($promptControlNode), ancestry: this._loadAncestryValues($promptControlNode) }; }, _loadTextBox: function _loadTextBox(parameterName, $promptControlNode) { var multiSelect = $promptControlNode.attr('multiSelect') === 'true'; var range = $promptControlNode.attr('range') === 'true'; var module; if (multiSelect === true) { module = AdminReact.MultiSelectTextBoxControl; } else if (range === true) { module = AdminReact.RangeTextBoxControl; } else { module = AdminReact.TextBoxControl; } return { name: parameterName, control: { multiSelect: multiSelect, type: 'textBox', module: module, numbersOnly: $promptControlNode.attr('numbersOnly') === 'true', multiLine: $promptControlNode.attr('multiLine') === 'true', hideText: $promptControlNode.attr('hideText') === 'true', showThousandsSeparator: $promptControlNode.attr('showThousandsSeparator') === 'true' }, values: this._loadValues($promptControlNode) }; }, _loadSelectDateTime: function _loadSelectDateTime(parameterName, $promptControlNode) { var multiSelect = $promptControlNode.attr('multiSelect') === 'true'; var range = $promptControlNode.attr('range') === 'true'; var module; if (multiSelect === true) { module = AdminReact.MultiSelectDateTimeControl; } else if (range === true) { module = AdminReact.RangeDateTimeControl; } else { module = AdminReact.DateTimeControl; } return { name: parameterName, control: { multiSelect: multiSelect, type: $promptControlNode.prop('tagName'), module: module, range: range, calendar: $promptControlNode.attr('calendar'), selectDateTimeUI: $promptControlNode.attr('selectDateTimeUI'), firstDate: $promptControlNode.attr('firstDate'), lastDate: $promptControlNode.attr('lastDate'), showSeconds: $promptControlNode.attr('showSeconds') === 'true', showMilliseconds: $promptControlNode.attr('showMilliSeconds') === 'true' }, values: this._loadValues($promptControlNode) }; }, _loadValues: function _loadValues($promptControlNode) { return this._getSelectValues($promptControlNode, 'selectOptions'); }, _loadAncestryValues: function _loadAncestryValues($promptControlNode) { return this._getSelectValues($promptControlNode, 'selectChoicesAncestry'); }, _getSelectValues: function _getSelectValues($promptControlNode, nodeName) { var values = []; var valueNodes = $promptControlNode.find(nodeName).find('*'); _.each(valueNodes, function (valueNode) { values.push({ label: $(valueNode).attr('displayValue') || '', value: $(valueNode).attr('useValue') || '' }); }); return values; }, _loadDataSourceControl: function _loadDataSourceControl(parameterName, $promptControlNode) { var faultCode = $promptControlNode.attr('faultcode'); var type; var title; if (faultCode === 'CQE-803') { type = 'login'; title = StringResource.get('dataSourceLoginTitle'); } else if (faultCode === 'CQE-801') { type = 'connection'; title = StringResource.get('dataSourceConnectionTitle'); } else { type = 'signon'; title = StringResource.get('dataSourceSignOnTitle'); } var values = []; var connectionPath = null; if (type !== 'connection') { connectionPath = $promptControlNode.find('connection').attr('searchPath'); if (!connectionPath) { connectionPath = $promptControlNode.attr('faultConnectionSearchPath'); } } var $connections = $promptControlNode.find(type); _.each($connections, function (node) { values.push({ label: $(node).attr('name'), value: $(node).attr('searchPath') }); }); return { name: $promptControlNode.attr('parameter'), control: { type: type, module: AdminReact.DataSourceControl, dataSourceName: $promptControlNode.attr('dataSourceName'), title: title, persist: $promptControlNode.attr('persistPrompt') ? $promptControlNode.attr('persistPrompt') === 'true' : false, failureCount: $promptControlNode.attr('logonFailureCount') ? parseInt($promptControlNode.attr('logonFailureCount')) : -1, faultConnectionSearchPath: $promptControlNode.attr('faultConnectionSearchPath'), connectionName: $promptControlNode.attr('faultConnectionName'), connectionPath: connectionPath, cubepassword: type === 'login' && $promptControlNode.attr('faultSubcode') === '6' ? true : false }, values: values }; }, render: function render(options) { var promptDetails = options.prompt_details; var jsonSpec = {}; if (promptDetails.type === 'json') { jsonSpec = promptDetails.json; } else if (promptDetails.type === 'xml') { jsonSpec = this.transformNode(options.parameter, promptDetails.xml); } jsonSpec.displayLabel = GlobalParameterHelper.getMultilingualDisplay(options.glassContext.services.userProfile.preferences.contentLocale, options.parameter); return this._loadControl(jsonSpec, options); }, _loadControl: function _loadControl(promptSpec, options) { var reactProps = { style: { 'margin': '5px' }, glassContext: options.glassContext, spec: promptSpec, $tracking: options.prompt_details.$tracking, $conversation: options.prompt_details.$conversation, parameter: options.parameter, parameter_value: options.parameter_value, onValuesChange: options.onValuesChange, ParameterValueHelper: GlobalParameterHelper, SelectionHelper: SelectionHelper, StringResource: StringResource, SoapHelper: SoapHelper, ParameterValues: ParameterValues, LoadTreeDataTemplate: LoadTreeDataTemplate, doT: doT, PromiseEach: Promise.each, XMLSerializerConstructor: function XMLSerializerConstructor() { return new XMLSerializer(); }, $: $ }; this._doRender(promptSpec.control.module, options, promptSpec, reactProps); return Promise.resolve(); }, _doRender: function _doRender(promptControl, options, jsonSpec, reactProps) { ReactDOM.render(React.createElement(AdminReact.AdminRoot, {}, React.createElement('div', { className: 'gp-controls' }, React.createElement(promptControl, reactProps))), options.$el[0]); } }; });