cvFilter.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770
  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 FilterAction() {
  13. this.m_sAction = "Filter";
  14. this.m_sType = "";
  15. this.m_sItem = "";
  16. this.m_sFormattedNumber= "";
  17. this.m_sFormattedEndNumber= "";
  18. this.m_jsonDetails = "";
  19. }
  20. FilterAction.prototype = new ModifyReportAction();
  21. FilterAction.prototype.execute = function()
  22. {
  23. ModifyReportAction.prototype.execute.apply(this, arguments)
  24. if (this.m_sType.indexOf("remove") != -1) {
  25. this.getCognosViewer().getViewerWidget().clearRAPCache();
  26. }
  27. };
  28. FilterAction.prototype.genSelectionContextWithUniqueCTXIDs = function() { return true; };
  29. FilterAction.prototype.getUndoHint = function()
  30. {
  31. if (this.m_sType.indexOf("remove") != -1) {
  32. return RV_RES.IDS_JS_REMOVE_FILTER;
  33. } else {
  34. return RV_RES.IDS_JS_FILTER;
  35. }
  36. };
  37. FilterAction.prototype.setRequestParms = function( parms )
  38. {
  39. if (parms.type!=null && typeof parms.type != "undefined") {
  40. this.m_sType = parms.type;
  41. if (parms.id!=null && typeof parms.id != "undefined") {
  42. this.m_sId = parms.id;
  43. }
  44. if (parms.item!=null && typeof parms.item != "undefined") {
  45. this.m_sItem = parms.item;
  46. }
  47. if (parms.details) {
  48. this.m_jsonDetails = parms.details;
  49. }
  50. if (parms.formattedNumber!=null && typeof parms.formattedNumber != "undefined") {
  51. this.m_sFormattedNumber = parms.formattedNumber;
  52. }
  53. if (parms.formattedEndNumber!=null && typeof parms.formattedEndNumber != "undefined") {
  54. this.m_sFormattedEndNumber = parms.formattedEndNumber;
  55. }
  56. } else {
  57. this.m_sType = parms;
  58. }
  59. };
  60. FilterAction.prototype.addActionContextAdditionalParms = function()
  61. {
  62. var parms = "<type>" + this.m_sType + "</type>";
  63. if (this.m_sId != null && typeof this.m_sId != "undefined") {
  64. parms+= ("<id>" + xml_encode(this.m_sId) + "</id>");
  65. }
  66. if (this.m_sItem != null && typeof this.m_sItem != "undefined" && this.m_sItem!="") {
  67. parms+= ("<item>" + xml_encode(this.m_sItem) + "</item>");
  68. }
  69. if (this.m_jsonDetails && this.m_jsonDetails!="")
  70. {
  71. parms+= "<details>" + xml_encode(this.m_jsonDetails) + "</details>";
  72. }
  73. if (this.m_sFormattedNumber != null && typeof this.m_sFormattedNumber != "undefined" && this.m_sFormattedNumber!="") {
  74. parms+= ("<formattedNumber>" + this.m_sFormattedNumber + "</formattedNumber>");
  75. }
  76. if (this.m_sFormattedEndNumber != null && typeof this.m_sFormattedEndNumber != "undefined" && this.m_sFormattedEndNumber!="") {
  77. parms+= ("<formattedEndNumber>" + this.m_sFormattedEndNumber + "</formattedEndNumber>");
  78. }
  79. return parms;
  80. };
  81. FilterAction.prototype.buildSelectedItemsString = function(selectedObjects)
  82. {
  83. var itemsLabel = "";
  84. var numberOfSelectedItems = selectedObjects.length;
  85. var numberOfItemsToAdd = numberOfSelectedItems > 5 ? 5 : numberOfSelectedItems;
  86. for(var index = 0; index < numberOfSelectedItems; ++index)
  87. {
  88. var value = this.getItemLabel(selectedObjects[index]);
  89. if (typeof value == "undefined" || value == "")
  90. {
  91. //a selectedObject has neither displayValue nor useValue.
  92. return "";
  93. }
  94. if((index) < numberOfItemsToAdd)
  95. {
  96. itemsLabel += value;
  97. }
  98. if((index+1) < numberOfItemsToAdd)
  99. {
  100. itemsLabel += ", ";
  101. }
  102. }
  103. if(numberOfSelectedItems > 5)
  104. {
  105. itemsLabel += ", ++";
  106. }
  107. return itemsLabel;
  108. };
  109. FilterAction.prototype.getItemLabel = function (selectedObject)
  110. {
  111. var value = selectedObject.getDisplayValues()[0];
  112. if (typeof value == "undefined")
  113. {
  114. value = selectedObject.getUseValues()[0][0];
  115. }
  116. return value;
  117. };
  118. FilterAction.prototype.toggleMenu = function(jsonSpec, enabled)
  119. {
  120. if (enabled)
  121. {
  122. jsonSpec.iconClass = "filter";
  123. jsonSpec.disabled = false;
  124. }
  125. else
  126. { jsonSpec.iconClass = "filterDisabled";
  127. jsonSpec.disabled = true;
  128. }
  129. return jsonSpec;
  130. };
  131. FilterAction.prototype.updateMenu = function(jsonSpec)
  132. {
  133. jsonSpec.visible = (this.ifContainsInteractiveDataContainer() && !this.detailFilteringIsDisabled());
  134. var result = jsonSpec;
  135. if (jsonSpec.visible) {
  136. var canAddOrRemoveFilters=(this.m_oCV.getSelectionController().getAllSelectedObjects().length > 0
  137. || this.isSelectionFilterable() || this.isRemoveAllValid());
  138. if (!canAddOrRemoveFilters) {
  139. result = this.toggleMenu(jsonSpec, false);
  140. }
  141. else {
  142. this.buildMenu(jsonSpec);
  143. if (jsonSpec.disabled == true) {
  144. result = this.toggleMenu(jsonSpec, false);
  145. }
  146. else {
  147. result = this.buildDynamicMenuItem(jsonSpec, "Filter");
  148. }
  149. }
  150. }
  151. return result;
  152. };
  153. FilterAction.prototype.detailFilteringIsDisabled = function()
  154. {
  155. var oRAPReportInfo = this.getCognosViewer().getRAPReportInfo();
  156. if (oRAPReportInfo) {
  157. return oRAPReportInfo.isDetailFilteringDisabled();
  158. }
  159. return false;
  160. };
  161. FilterAction.prototype.buildMenu = function(jsonSpec)
  162. {
  163. jsonSpec.visible = (this.ifContainsInteractiveDataContainer() &&
  164. !this.detailFilteringIsDisabled());
  165. if (! jsonSpec.visible)
  166. {
  167. return jsonSpec;
  168. }
  169. var selectionIsFilterable=this.isSelectionFilterable();
  170. this.toggleMenu(jsonSpec, selectionIsFilterable);
  171. var filterItems = [];
  172. var filterValueActionsAdded = false;
  173. var renderedRemoveSeparator = false;
  174. var selectionController = this.m_oCV.getSelectionController();
  175. var selectedObjects = selectionController.getAllSelectedObjects();
  176. if(selectedObjects.length > 0 && selectionController.selectionsInSameDataContainer() && selectionController.selectionsFromSameDataItem())
  177. {
  178. var refDataItem = selectedObjects[0].getDataItems()[0][0];
  179. if (selectionIsFilterable) {
  180. filterValueActionsAdded = this.addFilterValueActionsToMenu(selectionController, filterItems, refDataItem);
  181. }
  182. if (this.isRemoveItemFilterValid(refDataItem)) {
  183. if (filterValueActionsAdded == true) {
  184. filterItems.push({separator: true});
  185. renderedRemoveSeparator=true;
  186. }
  187. var label = this.getRefDataItemLabel(refDataItem);
  188. filterItems.push({ name: "RemoveFilterFor", label: RV_RES.IDS_JS_REMOVE_FILTER_FOR + " " + enforceTextDir(label), iconClass: "", action: { name: "Filter", payload: "remove" }, items: null });
  189. }
  190. }
  191. if (this.isRemoveAllValid()==true) {
  192. if (filterValueActionsAdded && !renderedRemoveSeparator) {
  193. filterItems.push({separator: true});
  194. }
  195. filterItems.push({ name: "RemoveAllFiltersForWidget", label: RV_RES.IDS_JS_REMOVE_ALL_FILTERS_FOR_WIDGET, iconClass: "", action: { name: "Filter", payload: "removeAllForWidget" }, items: null });
  196. }
  197. if(filterItems.length == 0)
  198. {
  199. return this.toggleMenu(jsonSpec, false);
  200. } else {
  201. jsonSpec.items = filterItems;
  202. this.toggleMenu(jsonSpec, true);
  203. return jsonSpec;
  204. }
  205. };
  206. FilterAction.prototype.getRefDataItemLabel = function(refDataItem)
  207. {
  208. var label = refDataItem;
  209. var oRAPReportInfo = this.m_oCV.getRAPReportInfo();
  210. if (oRAPReportInfo) {
  211. var oFilter = oRAPReportInfo.getFilterObject(refDataItem, true);
  212. if (oFilter) {
  213. label = oFilter.itemLabel;
  214. }
  215. }
  216. return label;
  217. };
  218. FilterAction.prototype.addFilterValueActionsToMenu = function(selectionController, filterItems, refDataItem)
  219. {
  220. var selectedObjects = selectionController.getAllSelectedObjectsWithUniqueCTXIDs();
  221. // Don't add the filter actions if the data container is a list and the list
  222. // column header is selected
  223. var numberOfSelectedValues = selectedObjects.length;
  224. var sel = 0;
  225. if (selectedObjects[0].m_dataContainerType=='list') {
  226. for (sel=0; sel<selectedObjects.length; ++sel) {
  227. if (selectedObjects[sel].m_sLayoutType == 'columnTitle') {
  228. numberOfSelectedValues=0;
  229. break;
  230. }
  231. }
  232. }
  233. if (numberOfSelectedValues == 0)
  234. {
  235. return false;
  236. }
  237. var itemsLabel = this.buildSelectedItemsString(selectedObjects);
  238. if (itemsLabel == "")
  239. {
  240. if (numberOfSelectedValues == 1 && selectedObjects[0].getLayoutType() == "datavalue")
  241. {
  242. itemsLabel = RV_RES.IDS_JS_NULL;
  243. filterItems.push({ name: "InFilter", label: CViewerCommon.getMessage(RV_RES.IDS_JS_FILTER_INCLUDE, itemsLabel), iconClass: "", action: { name: "Filter", payload: "in" }, items: null });
  244. filterItems.push({ name: "NotInFilter", label: CViewerCommon.getMessage(RV_RES.IDS_JS_FILTER_EXCLUDE, itemsLabel), iconClass: "", action: { name: "Filter", payload: "not" }, items: null });
  245. }
  246. }
  247. else {
  248. if (selectionController.selectionsAreDateTime() ||
  249. (selectionController.selectionsHaveCalculationMetadata() && !selectionController.selectionsNonMeasureWithMUN() )) {
  250. // Don't present numeric filtering options if column titles are
  251. // selected
  252. for (sel=0; sel<numberOfSelectedValues; ++sel) {
  253. if (selectedObjects[sel].m_sLayoutType == 'columnTitle') {
  254. return false;
  255. }
  256. }
  257. if(numberOfSelectedValues == 1)
  258. {
  259. if (selectedObjects[0].getUseValues()[0][0]) {
  260. filterItems.push({ name: "LessFilter", label: RV_RES.IDS_JS_FILTER_LESS_THAN + " " + itemsLabel, iconClass: "", action: { name: "Filter", payload: { type:"lessThan", formattedNumber: itemsLabel }}, items: null });
  261. filterItems.push({ name: "LessEqualFilter", label: RV_RES.IDS_JS_FILTER_LESS_THAN_EQUAL + " " + itemsLabel, iconClass: "", action: { name: "Filter", payload: { type:"lessThanEqual", formattedNumber: itemsLabel }}, items: null });
  262. filterItems.push({ name: "GreaterEqualFilter", label: RV_RES.IDS_JS_FILTER_GREATER_THAN_EQUAL + " " + itemsLabel, iconClass: "", action: { name: "Filter", payload: { type:"greaterThanEqual", formattedNumber: itemsLabel }}, items: null });
  263. filterItems.push({ name: "GreaterFilter", label: RV_RES.IDS_JS_FILTER_GREATER_THAN + " " + itemsLabel, iconClass: "", action: { name: "Filter", payload: { type:"greaterThan", formattedNumber: itemsLabel }}, items: null });
  264. }
  265. }
  266. else if(numberOfSelectedValues == 2)
  267. {
  268. if (selectedObjects[0].getUseValues()[0][0] && selectedObjects[1].getUseValues()[0][0]) {
  269. var formattedNumber = this.getItemLabel(selectedObjects[0]);
  270. var formattedEndNumber = this.getItemLabel(selectedObjects[1]);
  271. filterItems.push({ name: "BetweenFilter", label: CViewerCommon.getMessage(RV_RES.IDS_JS_FILTER_BETWEEN, [formattedNumber, formattedEndNumber]), iconClass: "", action: { name: "Filter", payload: {type: "between", formattedNumber: formattedNumber, formattedEndNumber: formattedEndNumber}}, items: null });
  272. filterItems.push({ name: "NotBetweenFilter", label: CViewerCommon.getMessage(RV_RES.IDS_JS_FILTER_NOT_BETWEEN, [formattedNumber, formattedEndNumber]), iconClass: "", action: { name: "Filter", payload: {type: "notBetween", formattedNumber: formattedNumber, formattedEndNumber: formattedEndNumber }}, items: null });
  273. }
  274. }
  275. else
  276. {
  277. return false;
  278. }
  279. }
  280. else
  281. {
  282. var containerType = selectionController.getDataContainerType();
  283. if (containerType == "crosstab" && selectedObjects[0].getLayoutType() == 'columnTitle') {
  284. if (this.isSelectSingleMember(selectedObjects[0])==true) {
  285. return false;
  286. }
  287. }
  288. filterItems.push({ name: "InFilter", label: CViewerCommon.getMessage(RV_RES.IDS_JS_FILTER_INCLUDE, enforceTextDir(itemsLabel)), iconClass: "", action: { name: "Filter", payload: "in" }, items: null });
  289. filterItems.push({ name: "NotInFilter", label: CViewerCommon.getMessage(RV_RES.IDS_JS_FILTER_EXCLUDE, enforceTextDir(itemsLabel)), iconClass: "", action: { name: "Filter", payload: "not" }, items: null });
  290. }
  291. }
  292. return true;
  293. };
  294. FilterAction.prototype.isRemoveAllValid = function()
  295. {
  296. // If the reportInfo has any filters for any container, remove all is valid.
  297. var reportInfo = this.m_oCV.getRAPReportInfo();
  298. if(reportInfo) {
  299. return reportInfo.containsFilters();
  300. }
  301. return false;
  302. };
  303. FilterAction.prototype.isRemoveItemFilterValid = function(refDataItem)
  304. {
  305. var containerId = this.getContainerId(this.m_oCV.getSelectionController());
  306. var reportInfo = this.m_oCV.getRAPReportInfo();
  307. if(containerId != null && reportInfo)
  308. {
  309. var oFilter = reportInfo.getFilterObjectFromContainer(containerId, refDataItem, false);
  310. return oFilter ? true : false;
  311. }
  312. return false;
  313. };
  314. FilterAction.prototype.isSelectionFilterable = function() {
  315. var selectionController = this.m_oCV.getSelectionController();
  316. var selectedObjects = selectionController.getAllSelectedObjects();
  317. if (selectedObjects.length > 0) {
  318. var cellRef = selectedObjects[0].getCellRef();
  319. if (cellRef && cellRef.getAttribute && cellRef.getAttribute("no_data_item_column") === "true") {
  320. return false;
  321. }
  322. if (selectionController.hasSelectedChartNodes()) {
  323. //CHARTS: Selections are not filterable if:
  324. // 1) Any title is selected (eg legendTitle, numericAxisTitle, ordinalAxisTitle)
  325. // 2) A calc/measure that is on an edge is selected (eg. legendLabel, ordinalAxisLabel)
  326. var measureOrCalculationType=false;
  327. if (selectionController.selectionsAreDateTime() ||
  328. (selectionController.selectionsHaveCalculationMetadata() && !selectionController.selectionsNonMeasureWithMUN() )) {
  329. measureOrCalculationType=true;
  330. }
  331. for (var sel=0; sel<selectedObjects.length; ++sel) {
  332. if (selectedObjects[sel].getLayoutType()) {
  333. if (selectedObjects[sel].getLayoutType().match('Title$')=='Title') {
  334. return false;
  335. }
  336. if (measureOrCalculationType && selectedObjects[sel].getLayoutType().match('Label$')=='Label') {
  337. return false;
  338. }
  339. }
  340. }
  341. }
  342. }
  343. return true;
  344. };
  345. function GetFilterInfoAction()
  346. {
  347. this.m_requestParms = null;
  348. }
  349. GetFilterInfoAction.prototype = new ModifyReportAction();
  350. GetFilterInfoAction.prototype.isUndoable = function()
  351. {
  352. return false;
  353. };
  354. GetFilterInfoAction.prototype.canBeQueued = function()
  355. {
  356. return true;
  357. };
  358. GetFilterInfoAction.prototype.setRequestParms = function( parms )
  359. {
  360. this.m_requestParms = parms;
  361. };
  362. GetFilterInfoAction.prototype.runReport = function()
  363. {
  364. return false;
  365. };
  366. GetFilterInfoAction.prototype.updateInfoBar = function()
  367. {
  368. return false;
  369. };
  370. GetFilterInfoAction.prototype.fireModifiedReportEvent = function()
  371. {
  372. // do nothing
  373. };
  374. GetFilterInfoAction.prototype.buildActionContextAdditionalParmsXML = function()
  375. {
  376. var itemDoc = XMLBuilderCreateXMLDocument("item");
  377. var itemElement = itemDoc.documentElement;
  378. for( var parm in this.m_requestParms )
  379. {
  380. if( this.m_requestParms.hasOwnProperty( parm ) )
  381. {
  382. var parameterElement = itemDoc.createElement( parm );
  383. parameterElement.appendChild( itemDoc.createTextNode( this.m_requestParms[parm]));
  384. itemElement.appendChild( parameterElement );
  385. }
  386. }
  387. return itemDoc;
  388. };
  389. GetFilterInfoAction.prototype.addActionContextAdditionalParms = function()
  390. {
  391. if( this.m_requestParms === null )
  392. {
  393. return "";
  394. }
  395. return XMLBuilderSerializeNode( this.buildActionContextAdditionalParmsXML() );
  396. };
  397. GetFilterInfoAction.prototype.createFilterInfoDispatcherEntry = function()
  398. {
  399. var filterInfoDispatcherEntry = new ReportInfoDispatcherEntry(this.m_oCV);
  400. filterInfoDispatcherEntry.initializeAction(this);
  401. return filterInfoDispatcherEntry;
  402. };
  403. GetFilterInfoAction.prototype.execute = function() {
  404. this.getCognosViewer().setKeepFocus(this.keepFocusOnWidget());
  405. var filterInfoDispatcherEntry = this.createFilterInfoDispatcherEntry();
  406. this.m_oCV.dispatchRequest(filterInfoDispatcherEntry);
  407. this.fireModifiedReportEvent();
  408. };
  409. GetFilterInfoAction.prototype.getOnPromptingCallback = function(){
  410. return this.getOnCompleteCallback();
  411. };
  412. function GetFilterValuesAction()
  413. {
  414. this.m_sAction = 'CollectFilterValues';
  415. this.m_sRetryClass = 'GetFilterValues';
  416. }
  417. GetFilterValuesAction.prototype = new GetFilterInfoAction();
  418. GetFilterValuesAction.prototype.addActionContextAdditionalParms = function()
  419. {
  420. if( this.m_requestParms === null )
  421. {
  422. return "";
  423. }
  424. var itemDoc = this.buildActionContextAdditionalParmsXML();
  425. var itemElement = itemDoc.documentElement;
  426. for( var parm in this.m_requestParms ) {
  427. if (parm == "name") {
  428. // If we can find a min and max, send it....
  429. var selectionController = this.m_oCV.getSelectionController();
  430. if (typeof selectionController != "undefined" &&
  431. typeof selectionController.getCCDManager() != "undefined") {
  432. var minMax = selectionController.getCCDManager().GetPageMinMaxForRDI(this.m_requestParms[parm]);
  433. if (typeof minMax != "undefined") {
  434. var pageMinElement = itemDoc.createElement( "pageMin" );
  435. pageMinElement.appendChild( itemDoc.createTextNode( minMax.pageMin ) );
  436. var pageMaxElement = itemDoc.createElement( "pageMax" );
  437. pageMaxElement.appendChild( itemDoc.createTextNode( minMax.pageMax ) );
  438. itemElement.appendChild(pageMinElement);
  439. itemElement.appendChild(pageMaxElement);
  440. }
  441. if (this.m_oCV.isSinglePageReport() == true) {
  442. var singlePage = itemDoc.createElement("singlePageReport");
  443. itemElement.appendChild(singlePage);
  444. }
  445. }
  446. break;
  447. }
  448. }
  449. var additionalParms = XMLBuilderSerializeNode( itemDoc );
  450. return (additionalParms + this.addClientContextData(/*maxValuesPerRDI*/3));
  451. };
  452. GetFilterValuesAction.prototype.getOnCompleteCallback = function()
  453. {
  454. var viewer = this.getCognosViewer();
  455. var viewerWidget = viewer.getViewerWidget();
  456. var params = this.m_requestParms;
  457. var callback = function(response) {
  458. viewerWidget.handleGetFilterValuesResponse(response, params);
  459. };
  460. return callback;
  461. };
  462. GetFilterValuesAction.prototype.canBeQueued = function() { return true; };
  463. GetFilterValuesAction.prototype.getActionKey = function()
  464. {
  465. if (typeof this.m_requestParms != "undefined" &&
  466. typeof this.m_requestParms.source != "undefined") {
  467. return this.m_sAction+this.m_requestParms.source;
  468. }
  469. return null;
  470. };
  471. function GetFilterableItemsAction()
  472. {
  473. this.m_sAction = 'CollectFilterableItems';
  474. }
  475. GetFilterableItemsAction.prototype = new GetFilterInfoAction();
  476. GetFilterableItemsAction.prototype.addActionContextAdditionalParms = function()
  477. {
  478. return this.addClientContextData(/*maxValuesPerRDI*/3);
  479. };
  480. GetFilterableItemsAction.prototype.getOnCompleteCallback = function()
  481. {
  482. var viewer = this.getCognosViewer();
  483. var viewerWidget = viewer.getViewerWidget();
  484. var callback = function(response) {
  485. viewerWidget.handleGetFilterableItemsResponse(response);
  486. };
  487. return callback;
  488. };
  489. function UpdateDataFilterAction()
  490. {
  491. this.m_sAction = "UpdateDataFilter";
  492. this.m_bForceRunSpec = false;
  493. }
  494. UpdateDataFilterAction.prototype = new ModifyReportAction();
  495. UpdateDataFilterAction.prototype.runReport = function() {
  496. return this.getViewerWidget().shouldReportBeRunOnAction();
  497. };
  498. UpdateDataFilterAction.prototype.getActionKey = function()
  499. {
  500. if (typeof this.m_requestParams != "undefined") {
  501. try
  502. {
  503. var parms = eval("(" + this.m_requestParams + ")");
  504. if (parms.clientId !== null) {
  505. return this.m_sAction + parms.clientId;
  506. }
  507. }
  508. catch (e)
  509. {
  510. // If eval fails for any reason, return a null actionKey.
  511. }
  512. }
  513. return null;
  514. };
  515. UpdateDataFilterAction.prototype.canBeQueued = function()
  516. {
  517. return true;
  518. };
  519. UpdateDataFilterAction.prototype.keepFocusOnWidget = function()
  520. {
  521. return false;
  522. };
  523. UpdateDataFilterAction.prototype.isUndoable = function()
  524. {
  525. return false;
  526. };
  527. UpdateDataFilterAction.prototype.setRequestParms = function( parms )
  528. {
  529. this.m_requestParams = parms.filterPayload;
  530. this.m_drillResetHUN = parms.drillResetHUN;
  531. this.m_isFacet = parms.isFacet;
  532. if (parms.forceCleanup) {
  533. this.m_sForceCleanup = parms.forceCleanup;
  534. }
  535. };
  536. UpdateDataFilterAction.prototype.forceRunSpecRequest = function() {
  537. return this.m_bForceRunSpec;
  538. };
  539. UpdateDataFilterAction.prototype.preProcessContextValues = function() {
  540. var resultingProcessedRequestParamsValues = [];
  541. var requestParamsObject = dojo.fromJson(this.m_requestParams);
  542. if(requestParamsObject && requestParamsObject["com.ibm.widget.context"] && (requestParamsObject["com.ibm.widget.context"]["values"] || requestParamsObject["com.ibm.widget.context"]["ranges"]) ) {
  543. var oRAPReportInfo = this.m_oCV.m_RAPReportInfo;
  544. var reportContainers = oRAPReportInfo.getContainers();
  545. if(!reportContainers) {
  546. resultingProcessedRequestParamsValues;
  547. }
  548. // strip out data items which we don't care about (aren't part report info)
  549. var key = "";
  550. var contextObject = "";
  551. if(requestParamsObject["com.ibm.widget.context"]["values"]) {
  552. key = "values";
  553. contextObject = requestParamsObject["com.ibm.widget.context"]["values"];
  554. } else {
  555. key = "ranges";
  556. contextObject = requestParamsObject["com.ibm.widget.context"]["ranges"];
  557. }
  558. var existingSliderInfo = oRAPReportInfo.collectSliderSetFromReportInfo();
  559. for(dataItem in contextObject) {
  560. if (oRAPReportInfo && oRAPReportInfo.isReferenced(dataItem)) {
  561. var clonedRequestParam = dojo.clone(requestParamsObject);
  562. var newValues = {};
  563. newValues[dataItem] = requestParamsObject["com.ibm.widget.context"][key][dataItem];
  564. clonedRequestParam["com.ibm.widget.context"][key] = newValues;
  565. if(requestParamsObject["com.ibm.widget.context.bux.selectValueControl"] && requestParamsObject["com.ibm.widget.context.bux.selectValueControl"]["selectValueControl"] && requestParamsObject["com.ibm.widget.context.bux.selectValueControl"]["selectValueControl"]["itemSpecification"]) {
  566. var newSpecification = {};
  567. clonedRequestParam["com.ibm.widget.context.bux.selectValueControl"]["selectValueControl"]["itemSpecification"] = {};
  568. var packageBase = document.forms["formWarpRequest" + this.m_oCV.getId()].packageBase.value;
  569. for(modelItem in requestParamsObject["com.ibm.widget.context.bux.selectValueControl"]["selectValueControl"]["itemSpecification"]) {
  570. if(modelItem.indexOf(packageBase) != -1) {
  571. newSpecification[dataItem] = requestParamsObject["com.ibm.widget.context.bux.selectValueControl"]["selectValueControl"]["itemSpecification"][modelItem][dataItem];
  572. if (newSpecification[dataItem]) {
  573. clonedRequestParam["com.ibm.widget.context.bux.selectValueControl"]["selectValueControl"]["itemSpecification"][modelItem] = newSpecification;
  574. break;
  575. }
  576. }
  577. }
  578. }
  579. var itemCount = contextObject[dataItem] && key !== "ranges" ? contextObject[dataItem].length : 0;
  580. if (this.checkIfFilterExpressionChanged(dataItem, requestParamsObject.clientId, itemCount, existingSliderInfo)) {
  581. this.m_bForceRunSpec = true;
  582. }
  583. resultingProcessedRequestParamsValues.push(dojo.toJson(clonedRequestParam));
  584. }
  585. }
  586. } else {
  587. resultingProcessedRequestParamsValues.push(dojo.toJson(requestParamsObject));
  588. }
  589. return resultingProcessedRequestParamsValues;
  590. };
  591. /**
  592. * Returns true if this is a new filter or if the filterExpression in the reportSpec will
  593. * change because of this updateDataFilter action. It'll change if the slider/select value
  594. * was re-configured on a different data item or if we're going from one item to multiple items
  595. */
  596. UpdateDataFilterAction.prototype.checkIfFilterExpressionChanged = function(dataItem, sliderId, itemCount, existingSliderInfo) {
  597. if (!existingSliderInfo || !existingSliderInfo[sliderId] || existingSliderInfo[sliderId].name != dataItem) {
  598. return true;
  599. }
  600. var existingItemCount = existingSliderInfo[sliderId].values ? existingSliderInfo[sliderId].values.length : 0;
  601. if (itemCount == existingItemCount) {
  602. return false;
  603. }
  604. // If we've gone from 1 value to multiple or from multiple to 1 then we need to do a runSpec
  605. return (itemCount === 1) !== (existingItemCount === 1);
  606. };
  607. UpdateDataFilterAction.prototype.addActionContext = function()
  608. {
  609. var actionContext = "<reportActions";
  610. var inlineValues = "";
  611. if(!this.runReport()) {
  612. actionContext += " run=\"false\"";
  613. inlineValues = "<inlineValues/>";
  614. }
  615. actionContext += ">";
  616. if( this.m_drillResetHUN && this.m_drillResetHUN.length > 0 ) {
  617. actionContext += this._getDrillResetActionContext();
  618. }
  619. if(this.m_sForceCleanup) {
  620. actionContext += "<reportAction name=\"" + this.m_sAction + "\">" + dojo.toJson(this.m_sForceCleanup) + "</reportAction>";
  621. }
  622. var processedRequestParamValues;
  623. var isXMLFilterPayload = (this.m_requestParams.charAt(0)==="<");
  624. if ( this.m_isFacet || isXMLFilterPayload) {
  625. processedRequestParamValues = [ this.m_requestParams ];
  626. } else {
  627. processedRequestParamValues = this.preProcessContextValues();
  628. }
  629. for(var idx = 0; idx < processedRequestParamValues.length; ++idx) {
  630. var actionParams = processedRequestParamValues[idx];
  631. actionContext += "<reportAction name=\"" + this.m_sAction + "\">" + inlineValues;
  632. actionContext += (isXMLFilterPayload) ? actionParams : xml_encode(actionParams);
  633. if(idx > 0) {
  634. actionContext += "<augment>true</augment>";
  635. }
  636. if (!this.m_isFacet) {
  637. actionContext += this.addClientContextData(/*maxValuesPerRDI*/3);
  638. }
  639. actionContext += "</reportAction>";
  640. actionContext += "<reportAction name=\"GetInfo\"><include><sliders/></include>";
  641. actionContext += "</reportAction>";
  642. }
  643. actionContext += "</reportActions>";
  644. return actionContext;
  645. };
  646. UpdateDataFilterAction.prototype._getDrillResetActionContext = function()
  647. {
  648. var drillResetAction = new DrillResetAction();
  649. drillResetAction.setCognosViewer( this.getCognosViewer() );
  650. var params = { drilledResetHUNs : this.m_drillResetHUN };
  651. drillResetAction.setRequestParms( params );
  652. drillResetAction.setUpdateInfoBar( false );
  653. var drillResetActionContext = drillResetAction.getReportActionContext();
  654. return drillResetActionContext;
  655. };