SharePromptAction.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. /*
  2. *+------------------------------------------------------------------------+
  3. *| Licensed Materials - Property of IBM
  4. *| IBM Cognos Products: Viewer
  5. *| (C) Copyright IBM Corp. 2001, 2013
  6. *|
  7. *| US Government Users Restricted Rights - Use, duplication or
  8. *| disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  9. *|
  10. *+------------------------------------------------------------------------+
  11. */
  12. function SharePromptAction()
  13. {
  14. this.m_bAbortAction = true;
  15. }
  16. SharePromptAction.prototype = new RunReportAction();
  17. SharePromptAction.prototype.preProcess = function()
  18. {
  19. var cv = this.getCognosViewer();
  20. cv.disableRaiseSharePromptEvent();
  21. };
  22. SharePromptAction.prototype.setRequestParms = function(payload)
  23. {
  24. this.m_sharePromptParameters = payload.parameters;
  25. this.m_action = "forward";
  26. };
  27. /**
  28. * Parse the prompt parameters, and try to match them by parameter name first then model item,
  29. * if a potential match is found save in an instance member to add later to the request.
  30. *
  31. * @param {Object} promptParameters
  32. * @return (Boolean) True if a potential match is found
  33. * @author Osmani Gomez
  34. */
  35. SharePromptAction.prototype.parsePromptParameters = function()
  36. {
  37. var result = false;
  38. var reportParameterNodes = this.getReportParameterNodes();
  39. if (reportParameterNodes) {
  40. var promptParameters = this.m_sharePromptParameters;
  41. var requestParams = {};
  42. var usedModelItems = [];
  43. for (var i in promptParameters) {
  44. var promptParameterName = promptParameters[i].parmName;
  45. var promptModelItem = promptParameters[i].modelItem;
  46. var sName = null;
  47. var sValue = null;
  48. var matchedByModelItem = false;
  49. var modelItemMatchedParams = {};
  50. for (var j in reportParameterNodes) {
  51. var targetParameterName = reportParameterNodes[j].getAttribute("parameterName");
  52. var targetModelItem = reportParameterNodes[j].getAttribute("modelItem");
  53. if ((typeof targetParameterName !== "undefined" && targetParameterName === promptParameterName) ||
  54. (typeof targetModelItem !== "undefined" && promptModelItem !== "undefined" && promptModelItem !== "" &&
  55. targetModelItem === promptModelItem && !this.arrayContains(usedModelItems, targetModelItem)))
  56. {
  57. result = true;
  58. sName = 'p_' + targetParameterName;
  59. sValue = this.getSharedPromptValue(promptParameters[i], reportParameterNodes[j]);
  60. if (targetParameterName === promptParameterName) {
  61. requestParams[sName] = sValue;
  62. usedModelItems.push(targetModelItem);
  63. matchedByModelItem = false;
  64. break;
  65. } else {
  66. modelItemMatchedParams[sName] = sValue;
  67. matchedByModelItem = true;
  68. }
  69. }
  70. }
  71. if (matchedByModelItem) {
  72. for (var x in modelItemMatchedParams) {
  73. requestParams[x] = modelItemMatchedParams[x];
  74. }
  75. }
  76. }
  77. if (result) {
  78. this.m_bAbortAction = false;
  79. this.m_promptValues = requestParams;
  80. }
  81. }
  82. return result;
  83. };
  84. SharePromptAction.prototype.getSharedPromptValue = function(promptParameter, reportParameterNode)
  85. {
  86. var sValue = null;
  87. var promptValue = promptParameter.parmValue;
  88. var multivaluedPrompt = this._isPromptParamMultiValued(promptParameter.multivalued, promptValue);
  89. var hasSelectOption = new RegExp(/^<selectChoices><selectOption/);
  90. // if shared prompt param -> many, report param -> one, only one option can be used
  91. if ( multivaluedPrompt && reportParameterNode.getAttribute( "multivalued" ) == null && promptValue.match(hasSelectOption)) {
  92. // make sure only one option is used, extract the the first one
  93. var reOneOption = new RegExp(/^(<selectChoices><selectOption.*?><)/);
  94. var extractedMatch = reOneOption.exec(promptValue);
  95. sValue = extractedMatch[1] + '/selectChoices>';
  96. } else {
  97. sValue = promptValue;
  98. }
  99. return sValue;
  100. };
  101. SharePromptAction.prototype.arrayContains = function(array, value)
  102. {
  103. var found = false;
  104. for (var i = 0; i < array.length; i++) {
  105. if (array[i] === value) {
  106. found = true;
  107. break;
  108. }
  109. }
  110. return found;
  111. };
  112. SharePromptAction.prototype.getPromptValues = function()
  113. {
  114. if( !this.m_promptValues )
  115. {
  116. this.parsePromptParameters();
  117. }
  118. return this.m_promptValues;
  119. };
  120. /*
  121. * Safer check for multivalue, in certain cases GetParameters won't return multivalued when it should,
  122. *
  123. */
  124. SharePromptAction.prototype._isPromptParamMultiValued = function(multiValuedParamInfo, promptValue)
  125. {
  126. var result = false;
  127. if ( multiValuedParamInfo != "undefined" && multiValuedParamInfo) {
  128. result = true;
  129. } else {
  130. var reIsMulti = new RegExp(/^<selectChoices><selectOption.*?>\s*<selectOption/);
  131. if (promptValue.match(reIsMulti)) {
  132. result = true;
  133. }
  134. }
  135. return result;
  136. };
  137. SharePromptAction.prototype.getReportParameterNodes = function()
  138. {
  139. var cv = this.getCognosViewer();
  140. var reportParameterNodes = null;
  141. try {
  142. if (cv.envParams && cv.envParams.reportPrompts) {
  143. var reportParameters = cv.envParams.reportPrompts;
  144. var xmlDom = XMLBuilderLoadXMLFromString(reportParameters);
  145. if (!(xmlDom && xmlDom.childNodes && xmlDom.childNodes.length > 0 && xmlDom.childNodes[0].nodeName === "parsererror")) {
  146. var cvTransientSpec = xmlDom.firstChild;
  147. var reportParametersNode = XMLHelper_FindChildByTagName(cvTransientSpec, "reportParameters", true);
  148. reportParameterNodes = XMLHelper_FindChildrenByTagName(reportParametersNode, "reportParameter", false);
  149. }
  150. }
  151. }
  152. catch ( e ) {}
  153. return reportParameterNodes;
  154. };
  155. SharePromptAction.prototype.executePrompt = function ()
  156. {
  157. if (this.getPromptValues() !== null )
  158. {
  159. this.execute();
  160. return true;
  161. }
  162. return false;
  163. };