PromptControlFactory.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. "use strict";
  2. /**
  3. * Licensed Materials - Property of IBM
  4. * IBM Cognos Products: Cognos Analytics
  5. * Copyright IBM Corp. 2015, 2017
  6. * US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  7. */
  8. 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) {
  9. return {
  10. transformNode: function transformNode(parameter, xml) {
  11. //NOSONAR
  12. var $promptControlNode;
  13. if (parameter.type === 'credential') {
  14. $promptControlNode = $(xml).find('*[parameter^=\'' + parameter.name + '\']');
  15. } else {
  16. $promptControlNode = $(xml).find('*[parameter=\'' + parameter.name + '\']');
  17. }
  18. switch ($promptControlNode.prop('tagName')) {
  19. case 'selectValue':
  20. {
  21. return this._loadSelectValue(parameter.name, $promptControlNode);
  22. }
  23. case 'selectWithTree':
  24. {
  25. return this._loadSelectWithTree(parameter.name, $promptControlNode);
  26. }
  27. case 'selectWithSearch':
  28. case 'textBox':
  29. {
  30. return this._loadTextBox(parameter.name, $promptControlNode);
  31. }
  32. case 'selectDateTime':
  33. case 'selectDate':
  34. case 'selectTime':
  35. {
  36. return this._loadSelectDateTime(parameter.name, $promptControlNode);
  37. }
  38. case 'selectDataSourceSignon':
  39. {
  40. return this._loadDataSourceControl(parameter.name, $promptControlNode);
  41. }
  42. default:
  43. {
  44. return null;
  45. }
  46. }
  47. },
  48. _loadSelectValue: function _loadSelectValue(parameterName, $promptControlNode) {
  49. var selectValueUI = $promptControlNode.attr('selectValueUI');
  50. var module;
  51. switch (selectValueUI) {
  52. case 'dropdown':
  53. {
  54. module = AdminReact.DropDownControl;
  55. break;
  56. }
  57. case 'checkboxGroup':
  58. {
  59. module = AdminReact.CheckboxGroupControl;
  60. break;
  61. }
  62. case 'radioGroup':
  63. {
  64. module = AdminReact.RadioGroupControl;
  65. break;
  66. }
  67. default:
  68. {
  69. // For the initial release, we won't support list controls, we'll default lists to either drop downs or checkboxes
  70. // module = 'bi/admin/globalparameters/view/controls/ListControl'; //NOSONAR
  71. if ($promptControlNode.attr('multiSelect') === 'true') {
  72. module = AdminReact.CheckboxGroupControl;
  73. } else {
  74. module = AdminReact.DropDownControl;
  75. }
  76. break;
  77. }
  78. }
  79. return {
  80. name: parameterName,
  81. control: {
  82. multiSelect: $promptControlNode.attr('multiSelect') === 'true',
  83. type: selectValueUI,
  84. module: module,
  85. autoSubmit: $promptControlNode.attr('autoSubmit') === 'true'
  86. },
  87. values: this._loadValues($promptControlNode)
  88. };
  89. },
  90. _loadSelectWithTree: function _loadSelectWithTree(parameterName, $promptControlNode) {
  91. return {
  92. name: parameterName,
  93. control: {
  94. multiSelect: $promptControlNode.attr('multiSelect') === 'true',
  95. type: 'tree',
  96. module: AdminReact.TreeControl,
  97. canExpand: $promptControlNode.attr('canExpand') === 'true'
  98. },
  99. values: this._loadValues($promptControlNode),
  100. ancestry: this._loadAncestryValues($promptControlNode)
  101. };
  102. },
  103. _loadTextBox: function _loadTextBox(parameterName, $promptControlNode) {
  104. var multiSelect = $promptControlNode.attr('multiSelect') === 'true';
  105. var range = $promptControlNode.attr('range') === 'true';
  106. var module;
  107. if (multiSelect === true) {
  108. module = AdminReact.MultiSelectTextBoxControl;
  109. } else if (range === true) {
  110. module = AdminReact.RangeTextBoxControl;
  111. } else {
  112. module = AdminReact.TextBoxControl;
  113. }
  114. return {
  115. name: parameterName,
  116. control: {
  117. multiSelect: multiSelect,
  118. type: 'textBox',
  119. module: module,
  120. numbersOnly: $promptControlNode.attr('numbersOnly') === 'true',
  121. multiLine: $promptControlNode.attr('multiLine') === 'true',
  122. hideText: $promptControlNode.attr('hideText') === 'true',
  123. showThousandsSeparator: $promptControlNode.attr('showThousandsSeparator') === 'true'
  124. },
  125. values: this._loadValues($promptControlNode)
  126. };
  127. },
  128. _loadSelectDateTime: function _loadSelectDateTime(parameterName, $promptControlNode) {
  129. var multiSelect = $promptControlNode.attr('multiSelect') === 'true';
  130. var range = $promptControlNode.attr('range') === 'true';
  131. var module;
  132. if (multiSelect === true) {
  133. module = AdminReact.MultiSelectDateTimeControl;
  134. } else if (range === true) {
  135. module = AdminReact.RangeDateTimeControl;
  136. } else {
  137. module = AdminReact.DateTimeControl;
  138. }
  139. return {
  140. name: parameterName,
  141. control: {
  142. multiSelect: multiSelect,
  143. type: $promptControlNode.prop('tagName'),
  144. module: module,
  145. range: range,
  146. calendar: $promptControlNode.attr('calendar'),
  147. selectDateTimeUI: $promptControlNode.attr('selectDateTimeUI'),
  148. firstDate: $promptControlNode.attr('firstDate'),
  149. lastDate: $promptControlNode.attr('lastDate'),
  150. showSeconds: $promptControlNode.attr('showSeconds') === 'true',
  151. showMilliseconds: $promptControlNode.attr('showMilliSeconds') === 'true'
  152. },
  153. values: this._loadValues($promptControlNode)
  154. };
  155. },
  156. _loadValues: function _loadValues($promptControlNode) {
  157. return this._getSelectValues($promptControlNode, 'selectOptions');
  158. },
  159. _loadAncestryValues: function _loadAncestryValues($promptControlNode) {
  160. return this._getSelectValues($promptControlNode, 'selectChoicesAncestry');
  161. },
  162. _getSelectValues: function _getSelectValues($promptControlNode, nodeName) {
  163. var values = [];
  164. var valueNodes = $promptControlNode.find(nodeName).find('*');
  165. _.each(valueNodes, function (valueNode) {
  166. values.push({
  167. label: $(valueNode).attr('displayValue') || '',
  168. value: $(valueNode).attr('useValue') || ''
  169. });
  170. });
  171. return values;
  172. },
  173. _loadDataSourceControl: function _loadDataSourceControl(parameterName, $promptControlNode) {
  174. var faultCode = $promptControlNode.attr('faultcode');
  175. var type;
  176. var title;
  177. if (faultCode === 'CQE-803') {
  178. type = 'login';
  179. title = StringResource.get('dataSourceLoginTitle');
  180. } else if (faultCode === 'CQE-801') {
  181. type = 'connection';
  182. title = StringResource.get('dataSourceConnectionTitle');
  183. } else {
  184. type = 'signon';
  185. title = StringResource.get('dataSourceSignOnTitle');
  186. }
  187. var values = [];
  188. var connectionPath = null;
  189. if (type !== 'connection') {
  190. connectionPath = $promptControlNode.find('connection').attr('searchPath');
  191. if (!connectionPath) {
  192. connectionPath = $promptControlNode.attr('faultConnectionSearchPath');
  193. }
  194. }
  195. var $connections = $promptControlNode.find(type);
  196. _.each($connections, function (node) {
  197. values.push({
  198. label: $(node).attr('name'),
  199. value: $(node).attr('searchPath')
  200. });
  201. });
  202. return {
  203. name: $promptControlNode.attr('parameter'),
  204. control: {
  205. type: type,
  206. module: AdminReact.DataSourceControl,
  207. dataSourceName: $promptControlNode.attr('dataSourceName'),
  208. title: title,
  209. persist: $promptControlNode.attr('persistPrompt') ? $promptControlNode.attr('persistPrompt') === 'true' : false,
  210. failureCount: $promptControlNode.attr('logonFailureCount') ? parseInt($promptControlNode.attr('logonFailureCount')) : -1,
  211. faultConnectionSearchPath: $promptControlNode.attr('faultConnectionSearchPath'),
  212. connectionName: $promptControlNode.attr('faultConnectionName'),
  213. connectionPath: connectionPath,
  214. cubepassword: type === 'login' && $promptControlNode.attr('faultSubcode') === '6' ? true : false
  215. },
  216. values: values
  217. };
  218. },
  219. render: function render(options) {
  220. var promptDetails = options.prompt_details;
  221. var jsonSpec = {};
  222. if (promptDetails.type === 'json') {
  223. jsonSpec = promptDetails.json;
  224. } else if (promptDetails.type === 'xml') {
  225. jsonSpec = this.transformNode(options.parameter, promptDetails.xml);
  226. }
  227. jsonSpec.displayLabel = GlobalParameterHelper.getMultilingualDisplay(options.glassContext.services.userProfile.preferences.contentLocale, options.parameter);
  228. return this._loadControl(jsonSpec, options);
  229. },
  230. _loadControl: function _loadControl(promptSpec, options) {
  231. var reactProps = {
  232. style: {
  233. 'margin': '5px'
  234. },
  235. glassContext: options.glassContext,
  236. spec: promptSpec,
  237. $tracking: options.prompt_details.$tracking,
  238. $conversation: options.prompt_details.$conversation,
  239. parameter: options.parameter,
  240. parameter_value: options.parameter_value,
  241. onValuesChange: options.onValuesChange,
  242. ParameterValueHelper: GlobalParameterHelper,
  243. SelectionHelper: SelectionHelper,
  244. StringResource: StringResource,
  245. SoapHelper: SoapHelper,
  246. ParameterValues: ParameterValues,
  247. LoadTreeDataTemplate: LoadTreeDataTemplate,
  248. doT: doT,
  249. PromiseEach: Promise.each,
  250. XMLSerializerConstructor: function XMLSerializerConstructor() {
  251. return new XMLSerializer();
  252. },
  253. $: $
  254. };
  255. this._doRender(promptSpec.control.module, options, promptSpec, reactProps);
  256. return Promise.resolve();
  257. },
  258. _doRender: function _doRender(promptControl, options, jsonSpec, reactProps) {
  259. ReactDOM.render(React.createElement(AdminReact.AdminRoot, {}, React.createElement('div', {
  260. className: 'gp-controls'
  261. }, React.createElement(promptControl, reactProps))), options.$el[0]);
  262. }
  263. };
  264. });