CSort.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  1. /****************************************************************
  2. ** Licensed Materials - Property of IBM
  3. **
  4. ** BI and PM: qs
  5. **
  6. ** (C) Copyright IBM Corp. 2001, 2015
  7. **
  8. ** US Government Users Restricted Rights - Use, duplication or
  9. ** disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  10. *****************************************************************/
  11. // Copyright (C) 2008 Cognos ULC, an IBM Company. All Rights Reserved.
  12. // Cognos and the Cognos logo are trademarks of Cognos ULC (formerly Cognos Incorporated) in the United States and/or other countries. IBM and the IBM logo are trademarks of International Business Machines Corporation in the United States, or other countries, or both. Other company, product, or service names may be trademarks or service marks of others.
  13. var SORT_ERROR_NO_SELECTIONS = 1;
  14. var SORT_ERROR_TOO_MANY_SELECTIONS = 2;
  15. var SORT_ERROR_NO_SUM_ON_MEASURE = 3;
  16. var SORT_ERROR_INVALID_SELECTION = 4;
  17. var SORT_ERROR_SELECTION_NOT_ALLOWED = 5;
  18. function CSort()
  19. {
  20. this.m_sOpType = "";
  21. this.m_sSortOrder = "";
  22. this.m_bDoSummFilter = false;
  23. this.m_sSummExpression = "";
  24. this.m_aColsToSort = new Array();
  25. this.m_sColId = "";
  26. this.m_sGroupName = new Array();
  27. this.m_bIsCrosstab = false;
  28. this.m_bColIsString = false;
  29. this.m_bColIsMeasure = false;
  30. this.m_bColIsSummarized = false;
  31. this.m_sColLabel = "";
  32. };
  33. CSort.prototype = new AFeatureObject();
  34. CSort.prototype.processErrorState = function ()
  35. {
  36. if (this.m_iErrorState === FEATURE_OBJECT_NO_ERROR)
  37. {
  38. return false;
  39. }
  40. else if (this.m_iErrorState === SORT_ERROR_NO_SELECTIONS)
  41. {
  42. dlgShowMessage("SORT_TITLE", "", "SORT_NO_SELECTION");
  43. return true;
  44. }
  45. else if (this.m_iErrorState === SORT_ERROR_TOO_MANY_SELECTIONS)
  46. {
  47. dlgShowMessage("SORT_TITLE", "", "SORT_TOO_MANY_SELECTIONS");
  48. return true;
  49. }
  50. else if (this.m_iErrorState === SORT_ERROR_NO_SUM_ON_MEASURE)
  51. {
  52. dlgShowMessage("SORT_TITLE", "", "SORT_MEASURE_HAS_NO_SUM");
  53. return true;
  54. }
  55. else if (this.m_iErrorState === SORT_ERROR_INVALID_SELECTION)
  56. {
  57. dlgShowMessage("SORT_TITLE", "", "SORT_INVALID_SELECTION");
  58. return true;
  59. }
  60. else if (this.m_iErrorState === SORT_ERROR_SELECTION_NOT_ALLOWED)
  61. {
  62. return true;
  63. }
  64. };
  65. CSort.prototype.proceedWithoutDialog = function ()
  66. {
  67. return this.execute(new Array(this.m_sSortOrder, this.m_bDoSummFilter, this.m_sSummExpression));
  68. };
  69. CSort.prototype.getNextSortOrder = function (sSortOrder)
  70. {
  71. if (typeof sSortOrder != "string")
  72. {
  73. sSortOrder = "A";
  74. }
  75. else if (sSortOrder.toUpperCase() == "A")
  76. {
  77. sSortOrder = "D";
  78. }
  79. else if (sSortOrder.toUpperCase() == "D")
  80. {
  81. sSortOrder = "N";
  82. }
  83. else
  84. {
  85. sSortOrder = "A";
  86. }
  87. return sSortOrder;
  88. };
  89. CSort.prototype.setup = function (aFeatureParams)
  90. {
  91. this.m_aParams = new Array();
  92. this.m_bRequiresDialog = true;
  93. this.m_iErrorState = FEATURE_OBJECT_NO_ERROR;
  94. this.m_sGroupName = new Array();
  95. this.m_bIsCrosstab = false;
  96. var oSelController = goApplicationManager.getSelectionController();
  97. var aSelColIds = oSelController.getSelectedColumnIds();
  98. var oMQMgr = goApplicationManager.getMiniQueryManager();
  99. if (aFeatureParams instanceof Array && aFeatureParams.length > 0 && aFeatureParams[0].indexOf("SETUP_FROM_TREE") >= 0)
  100. {
  101. this.setupFromMetadataTree(aFeatureParams);
  102. }
  103. else if (aFeatureParams instanceof Array && aFeatureParams.length > 0 && aFeatureParams[0].indexOf("CONTEXTDELETE") >= 0)
  104. {
  105. this.m_bRequiresDialog = false;
  106. this.m_sSortOrder = "N";
  107. this.m_bDoSummFilter = false;
  108. this.m_sSummExpression = "";
  109. if (aFeatureParams[0].indexOf("CONTEXTDELETEALL") >= 0)
  110. {
  111. this.m_aColsToSort = new Array();
  112. var aMQCols = oMQMgr.getElementsByAttribute("sort");
  113. for (var idxMQCols = 0; idxMQCols < aMQCols.length; idxMQCols++)
  114. {
  115. this.m_aColsToSort[this.m_aColsToSort.length] = aMQCols[idxMQCols].getAttribute("id");
  116. }
  117. }
  118. else
  119. {
  120. this.m_aColsToSort = new Array();
  121. this.m_aColsToSort[0] = cfgGet("contextMenuId");
  122. }
  123. cfgRemove("contextMenuType");
  124. cfgRemove("contextMenuId");
  125. return;
  126. }
  127. else if ((aFeatureParams instanceof Array && aFeatureParams.length > 0 && aFeatureParams[0] == "CONTEXTEDIT") || (typeof aFeatureParams == "object" && aFeatureParams[0] == "INCOMMINGVALUE"))
  128. {
  129. if (aFeatureParams[0] == "INCOMMINGVALUE")
  130. {
  131. this.m_sColId = aFeatureParams[1];
  132. }
  133. else
  134. {
  135. this.m_sColId = cfgGet("contextMenuId");
  136. }
  137. cfgRemove("contextMenuType");
  138. cfgRemove("contextMenuId");
  139. }
  140. else
  141. {
  142. var iNumSelCols = aSelColIds.length;
  143. if (iNumSelCols === 1)
  144. {
  145. this.m_sColId = aSelColIds[0];
  146. }
  147. else if (iNumSelCols < 1)
  148. {
  149. this.m_iErrorState = SORT_ERROR_NO_SELECTIONS;
  150. return;
  151. }
  152. else if (iNumSelCols > 1)
  153. {
  154. this.m_iErrorState = SORT_ERROR_TOO_MANY_SELECTIONS;
  155. return;
  156. }
  157. if (oMQMgr.hasPivottedColumns() && !oMQMgr.isSummarised(this.m_sColId) && oMQMgr.isMeasure(this.m_sColId))
  158. {
  159. this.m_iErrorState = SORT_ERROR_NO_SUM_ON_MEASURE;
  160. return;
  161. }
  162. else if (oMQMgr.isReportExpression(this.m_sColId))
  163. {
  164. this.m_iErrorState = SORT_ERROR_INVALID_SELECTION;
  165. return;
  166. }
  167. else if (!checkForValidSelection(false))
  168. {
  169. this.m_iErrorState = SORT_ERROR_SELECTION_NOT_ALLOWED;
  170. return;
  171. }
  172. }
  173. this.m_aColsToSort = new Array();
  174. this.m_aColsToSort[0] = this.m_sColId;
  175. if (aFeatureParams instanceof Array && aFeatureParams.length > 0 && aFeatureParams[0] == "skipDialog")
  176. {
  177. var sSortOrder = this.getNextSortOrder(oMQMgr.getColumnById(this.m_sColId).getAttribute("sort"));
  178. if (sSortOrder == "N")
  179. {
  180. this.m_bRequiresDialog = false;
  181. this.m_sSortOrder = sSortOrder;
  182. this.m_bDoSummFilter = false;
  183. this.m_sSummExpression = "";
  184. }
  185. else if (sSortOrder == "D")
  186. {
  187. this.m_bRequiresDialog = false;
  188. this.m_sSortOrder = sSortOrder;
  189. var oColumn = oMQMgr.getColFromExpression(oMQMgr.getColumnById(this.m_sColId).getAttribute("sortBy"));
  190. if (oColumn === MINI_QUERY_NO_COLUMN_FOUND)
  191. {
  192. this.m_bDoSummFilter = false;
  193. this.m_sSummExpression = "";
  194. }
  195. else
  196. {
  197. this.m_bDoSummFilter = true;
  198. this.m_sSummExpression = oMQMgr.getColumnById(this.m_sColId).getAttribute("sortBy");
  199. }
  200. }
  201. else
  202. {
  203. var bSumSortPossible = false;
  204. if (oMQMgr.isSummarised(this.m_sColId))
  205. {
  206. var aCols = oMQMgr.getAllColumns();
  207. for (var idxCols = 0; idxCols < aCols.length; idxCols++)
  208. {
  209. var sColRole = oMQMgr.getColumnRole(aCols[idxCols]);
  210. if ((sColRole == MINI_QUERY_GROUP_LIST || sColRole == MINI_QUERY_GROUP_SECTION) && (aCols[idxCols].getAttribute("id") != this.m_sColId))
  211. {
  212. bSumSortPossible = true;
  213. break;
  214. }
  215. }
  216. }
  217. if (oMQMgr.hasPivottedColumns())
  218. {
  219. if (oMQMgr.isMeasure(this.m_sColId))
  220. {
  221. this.setupDialogParams();
  222. }
  223. else
  224. {
  225. this.m_bRequiresDialog = false;
  226. this.m_sSortOrder = sSortOrder;
  227. this.m_bDoSummFilter = false;
  228. this.m_sSummExpression = "";
  229. }
  230. }
  231. else
  232. {
  233. if (bSumSortPossible)
  234. {
  235. this.setupDialogParams();
  236. }
  237. else
  238. {
  239. this.m_bRequiresDialog = false;
  240. this.m_sSortOrder = sSortOrder;
  241. this.m_bDoSummFilter = false;
  242. this.m_sSummExpression = "";
  243. }
  244. }
  245. }
  246. }
  247. else
  248. {
  249. cfgSet("LAST_DIALOG", "sort");
  250. this.setupDialogParams();
  251. }
  252. };
  253. CSort.prototype.setupDialogParams = function ()
  254. {
  255. var oMQMgr = goApplicationManager.getMiniQueryManager();
  256. var oColumn = oMQMgr.getColumnById(this.m_sColId);
  257. if (oColumn !== MINI_QUERY_NO_COLUMN_FOUND)
  258. {
  259. this.m_bColIsString = oMQMgr.isString(this.m_sColId);
  260. this.m_bColIsMeasure = oMQMgr.isMeasure(this.m_sColId);
  261. this.m_bColIsSummarized = oMQMgr.isSummarised(this.m_sColId);
  262. this.m_sColLabel = oMQMgr.getColumnLabel(this.m_sColId)
  263. }
  264. if (this.m_bColIsString)
  265. {
  266. this.m_sOpType = "alpha";
  267. }
  268. else
  269. {
  270. this.m_sOpType = "numeric";
  271. }
  272. var aCols = new Array();
  273. var idxCols;
  274. if (oMQMgr.hasPivottedColumns())
  275. {
  276. if (this.m_bColIsMeasure && this.m_bColIsSummarized)
  277. {
  278. this.setGroupNames();
  279. }
  280. this.m_bIsCrosstab = true;
  281. }
  282. else
  283. {
  284. if (this.m_bColIsSummarized)
  285. {
  286. this.setGroupNames();
  287. }
  288. this.m_bIsCrosstab = false;
  289. }
  290. var sCurrentSortOrder = "";
  291. if (oColumn !== MINI_QUERY_NO_COLUMN_FOUND)
  292. {
  293. var sSortBy = oColumn.getAttribute("sortBy");
  294. var sSortByAll = oColumn.getAttribute("sortByAll");
  295. if (sSortByAll === "true")
  296. {
  297. this.m_aParams["currentSortByIndex"] = -1;
  298. }
  299. else if (sSortBy !== null && sSortBy.length)
  300. {
  301. var oSortByColumn = oMQMgr.getColFromExpression(sSortBy);
  302. var iSortByIndex = oMQMgr.getColumnIndexByAttribute("id", oSortByColumn.getAttribute("id"));
  303. if (iSortByIndex !== MINI_QUERY_INVALID_INDEX)
  304. {
  305. this.m_aParams["currentSortByIndex"] = iSortByIndex;
  306. }
  307. }
  308. var sSortAttribute = oColumn.getAttribute("sort");
  309. if (sSortAttribute !== null && typeof sSortAttribute !== "undefined")
  310. {
  311. sCurrentSortOrder = sSortAttribute;
  312. }
  313. }
  314. this.m_aParams["currentSortOrder"] = sCurrentSortOrder;
  315. this.m_aParams["xxColName"] = encodeURIComponent(this.m_sColLabel);
  316. this.m_aParams["m"] = "/" + qs_dir + "/sort.xts";
  317. };
  318. CSort.prototype.execute = function (aParameters)
  319. {
  320. try
  321. {
  322. var oMQMgr = goApplicationManager.getMiniQueryManager();
  323. var sSortOrder = aParameters[0];
  324. var bDoSummFilter = aParameters[1];
  325. var iSummIndex = aParameters[2];
  326. var sCommand = "";
  327. var aCommandArray = new Array();
  328. if (this.m_aColsToSort.length > 1)
  329. {
  330. for (var idxCols = 0; idxCols < this.m_aColsToSort.length; idxCols++)
  331. {
  332. aCommandArray[0] = escapeParam(this.m_aColsToSort[idxCols]);
  333. if (sCommand !== "")
  334. {
  335. sCommand += ";";
  336. }
  337. sCommand += createCommand("S", sSortOrder, aCommandArray);
  338. }
  339. }
  340. else if (this.m_aColsToSort.length == 1)
  341. {
  342. aCommandArray[0] = escapeParam(this.m_aColsToSort[0]);
  343. if (bDoSummFilter && sSortOrder != 'N')
  344. {
  345. var iIndex = parseInt(iSummIndex, 10);
  346. if (iIndex === -1)
  347. {
  348. aCommandArray[1] = "sortByAll=true";
  349. }
  350. else
  351. {
  352. var oColumn = oMQMgr.getColumnFromIndex(iIndex);
  353. if (oColumn !== MINI_QUERY_NO_COLUMN_FOUND)
  354. {
  355. aCommandArray[1] = "sortBy=" + escapeParam(oMQMgr.getExpression(oColumn));
  356. }
  357. }
  358. }
  359. sCommand = createCommand("S", sSortOrder, aCommandArray);
  360. if (sSortOrder != 'N')
  361. {
  362. sCommand = wrapCmdWithCreateColumnBasedonMetadataItem(sCommand, this.m_aColsToSort[0]);
  363. }
  364. }
  365. addColumnsForReselection();
  366. if (sCommand.length > 0)
  367. {
  368. sendCmd(sCommand, "", true);
  369. }
  370. goApplicationManager.getWindowManager().hideDialogFrame();
  371. }
  372. catch (e)
  373. {
  374. }
  375. };
  376. CSort.prototype.setGroupNames = function()
  377. {
  378. var oMQMgr = goApplicationManager.getMiniQueryManager();
  379. if (typeof oMQMgr === "undefined")
  380. {
  381. return null;
  382. }
  383. this.m_sGroupName = new Array();
  384. this.m_aParams["includeAllOption"] = false;
  385. var aCols = oMQMgr.getAllColumns();
  386. if (oMQMgr.hasPivottedColumns())
  387. {
  388. for (idxCols = 0; idxCols < aCols.length; idxCols++)
  389. {
  390. if (!oMQMgr.isMeasure(aCols[idxCols]))
  391. {
  392. this.m_sGroupName[this.m_sGroupName.length] = new Array(oMQMgr.getColumnLabel(aCols[idxCols]), idxCols);
  393. }
  394. }
  395. }
  396. else
  397. {
  398. for (idxCols = 0; idxCols < aCols.length; idxCols++)
  399. {
  400. if ((oMQMgr.getColumnRole(aCols[idxCols]) == "list"
  401. || oMQMgr.getColumnRole(aCols[idxCols]) == "header")
  402. && (aCols[idxCols].getAttribute("id") != this.m_sColId))
  403. {
  404. this.m_sGroupName[this.m_sGroupName.length] = new Array(oMQMgr.getColumnLabel(aCols[idxCols]), idxCols);
  405. }
  406. }
  407. if (this.m_sGroupName && this.m_sGroupName.length > 0)
  408. {
  409. this.m_aParams["includeAllOption"] = true;
  410. }
  411. }
  412. return null;
  413. };
  414. CSort.prototype.setupFromMetadataTree = function (aFeatureParams)
  415. {
  416. this.m_aParams = new Array();
  417. this.m_bRequiresDialog = true;
  418. this.m_iErrorState = FEATURE_OBJECT_NO_ERROR;
  419. cfgSet("LAST_DIALOG", "sort");
  420. if (typeof metadataTree === "undefined"
  421. || typeof cf === "undefined")
  422. {
  423. return;
  424. }
  425. if (window && window.getSelection && window.getSelection().removeAllRanges)
  426. {
  427. window.getSelection().removeAllRanges();
  428. }
  429. var aNodes = metadataTree.getSelectionOrder();
  430. if (aNodes && aNodes.length > 0)
  431. {
  432. var oSelectedLeaf = aNodes[0];
  433. var oNode = allMetadataObjects[oSelectedLeaf.getValue()];
  434. if (oSelectedLeaf.hierarchyPath && oSelectedLeaf.hierarchyName)
  435. {
  436. oNode = new mdQueryItem(oSelectedLeaf.hierarchyName, gsMETADATA_EMPTY, oSelectedLeaf.hierarchyPath, 60, 7, 0, 0, 0, 0, gsMETADATA_EMPTY, gsMETADATA_EMPTY, gsMETADATA_EMPTY, gsMETADATA_EMPTY, gsMETADATA_EMPTY, gsMETADATA_EMPTY, gsMETADATA_EMPTY);
  437. oNode.isHierarchy = true;
  438. }
  439. var sNodeType = getNodeObjectType(oNode);
  440. if (oNode && !(sNodeType == 'FILTER' || sNodeType == 'CALCULATION' || sNodeType == 'FOLDER') )
  441. {
  442. this.m_aParams["m"] = "/" + cf.qs_dir + "/sort.xts";
  443. var oFilterFromTree = new CFilterFromTree();
  444. var oData = oFilterFromTree.getMetadataDATA(oNode, oSelectedLeaf);
  445. if (oData && typeof oData["MQColumn"] === "object")
  446. {
  447. this.m_sColId = oData["MQColumn"].getAttribute("id");
  448. }
  449. else
  450. {
  451. cfgSet("_META_" + oData["columnId"], oData);
  452. var iDataType = determineDataType(parseInt(oNode.datatype));
  453. this.m_bColIsString = (iDataType === DATA_TYPE_STRING ? true : false);
  454. this.m_bColIsMeasure = (iDataType === DATA_TYPE_NUMERIC ? true : false);
  455. this.m_bColIsSummarized = (oNode.regularAggregate > 0);
  456. this.m_sColLabel = oNode.name;
  457. this.m_sColId = oData["columnId"];
  458. }
  459. }
  460. }
  461. };