dnd.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517
  1. // Licensed Materials - Property of IBM
  2. //
  3. // IBM Cognos Products: pps
  4. //
  5. // (C) Copyright IBM Corp. 2005, 2017
  6. //
  7. // US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  8. //Maintain the undo information
  9. var TYPE_XTAB_MEASURE = 1;
  10. var TYPE_ROW = 2;
  11. var TYPE_COLUMN = 3;
  12. var TYPE_NEST_ROWS = 4;
  13. var TYPE_NEST_COLS = 5;
  14. var TYPE_REORDER_ROW = 6;
  15. var TYPE_REORDER_COLUMN = 7;
  16. var TYPE_CHANGE_DIMBAR_FILTER = 9;
  17. var TYPE_NONE = 0;
  18. var NEST_BETWEEN_CATEGORY_SENSITIVITY = 3;
  19. var previousOper = TYPE_NONE;
  20. var previousLevel = -1;
  21. var selectedMeasureCell = null;
  22. var overCategoryHeader = null;
  23. function getOper(type, obj, event) {
  24. if (type == "dimbar")
  25. return TYPE_CHANGE_DIMBAR_FILTER;
  26. if (type == "d" || type == "m")
  27. return TYPE_XTAB_MEASURE;
  28. else if (type == "r" || type.indexOf("lr") >= 0) {
  29. if (isReordering(type, event, obj))
  30. return TYPE_REORDER_ROW;
  31. else
  32. return TYPE_ROW;
  33. } else if (type == "c" || type.indexOf("lc") >= 0) {
  34. if (isReordering(type, event, obj))
  35. return TYPE_REORDER_COLUMN;
  36. else
  37. return TYPE_COLUMN;
  38. } else if (type == "rn")
  39. return TYPE_NEST_ROWS;
  40. else if (type == "cn")
  41. return TYPE_NEST_COLS;
  42. else
  43. return TYPE_NONE;
  44. }
  45. function getLevel(type, obj, event) {
  46. var oper = getOper(type, obj, event);
  47. if (oper == TYPE_NEST_ROWS || oper == TYPE_NEST_COLS)
  48. return obj.getAttribute("level");
  49. else if (oper == TYPE_ROW || oper == TYPE_COLUMN || oper == TYPE_REORDER_ROW || oper == TYPE_REORDER_COLUMN)
  50. if (type == "r" || type == "c")
  51. return obj.getAttribute("mylevel");
  52. else
  53. return parseLevelNumber(type);
  54. else
  55. return -1;
  56. }
  57. function isNestLeftOfCategory(event, obj) {
  58. return (parseInt(event.clientX - getOffsetLeft(obj)) <= NEST_BETWEEN_CATEGORY_SENSITIVITY);
  59. }
  60. function isNestRightOfCategory(event, obj) {
  61. return (parseInt(getOffsetLeft(obj) + obj.offsetWidth - event.clientX) <= NEST_BETWEEN_CATEGORY_SENSITIVITY);
  62. }
  63. function isNestAboveCategory(event, obj) {
  64. return (parseInt(event.clientY - getOffsetTop(obj)) <= NEST_BETWEEN_CATEGORY_SENSITIVITY);
  65. }
  66. function isNestBelowCategory(event, obj) {
  67. return (parseInt(getOffsetTop(obj) + obj.offsetHeight - event.clientY) <= NEST_BETWEEN_CATEGORY_SENSITIVITY);
  68. }
  69. function processDragOverOrEnter(event)
  70. {
  71. if (!topparent.allFramesInitialized())
  72. return;
  73. var eventM = new eventManager(event);
  74. eventM.cancelBubble();
  75. if ( !isValidDragAndDropObject() )
  76. return;
  77. var obj = bubbletoDragAndDropSensitiveObject(eventM.getSrc());
  78. if (obj == null)
  79. return;
  80. type = obj.getAttribute("type");
  81. //Get operation and Level
  82. var oper = getOper(type, obj, event);
  83. var level = getLevel(type, obj, event);
  84. //Check if we need to undo the previous drag drop effect
  85. if ((oper != TYPE_CHANGE_DIMBAR_FILTER) && (oper != previousOper || level != previousLevel)) {
  86. dragLeave(event, previousOper, previousLevel);
  87. if (oper == TYPE_REORDER_ROW || oper == TYPE_REORDER_COLUMN)
  88. overCategoryHeader = obj;
  89. else
  90. overCategoryHeader = null;
  91. switch (oper) {
  92. case TYPE_XTAB_MEASURE: onDragOverXtabMeasure(event); break;
  93. case TYPE_ROW: onDragOverRow(event, level); break;
  94. case TYPE_COLUMN: onDragOverColumn(event, level); break;
  95. case TYPE_NEST_ROWS: onDragOverRowNestZone(event, level); break;
  96. case TYPE_NEST_COLS: onDragOverColNestZone(event, level); break;
  97. case TYPE_REORDER_ROW:
  98. case TYPE_REORDER_COLUMN: onDragOverCategoryNestBetween(event, obj); break;
  99. }
  100. }
  101. if (eventM.theEvent.dataTransfer)
  102. processDragCursor(type, obj, event);
  103. previousOper = oper;
  104. previousLevel = level;
  105. eventM.preventDefault();
  106. }
  107. function dragLeave(event, oper, level) {
  108. switch (oper) {
  109. case TYPE_XTAB_MEASURE: onDragLeaveXtabMeasure(); break;
  110. case TYPE_ROW: onDragLeaveRow(event, level); break;
  111. case TYPE_COLUMN: onDragLeaveColumn(event, level); break;
  112. case TYPE_NEST_ROWS: onDragLeaveRowNestZone(level); break;
  113. case TYPE_NEST_COLS: onDragLeaveColNestZone(level); break;
  114. case TYPE_REORDER_ROW:
  115. case TYPE_REORDER_COLUMN: onDragLeaveCategoryNestBetween(event); break;
  116. }
  117. }
  118. function processDragCursor(type, obj, event) {
  119. var eventM = new eventManager(event);
  120. if (getOper(type, obj, event) == TYPE_CHANGE_DIMBAR_FILTER)
  121. eventM.theEvent.dataTransfer.dropEffect = "move";
  122. else if (getOper(type, obj, event) == TYPE_ROW || getOper(type, obj, event) == TYPE_COLUMN)
  123. eventM.theEvent.dataTransfer.dropEffect = "move";
  124. else if (getOper(type, obj, event) == TYPE_REORDER_ROW || getOper(type, obj, event) == TYPE_REORDER_COLUMN)
  125. eventM.theEvent.dataTransfer.dropEffect = "move";
  126. else if (getOper(type, obj, event) == TYPE_NEST_ROWS || getOper(type, obj, event) == TYPE_NEST_COLS)
  127. eventM.theEvent.dataTransfer.dropEffect = "copy";
  128. else if (getOper(type, obj, event) == TYPE_XTAB_MEASURE && isDraggingMeasure())
  129. eventM.theEvent.dataTransfer.dropEffect = "move";
  130. else
  131. eventM.theEvent.dataTransfer.dropEffect = "none";
  132. }
  133. function processDragLeave(event) {
  134. if (!topparent.allFramesInitialized())
  135. return;
  136. var eventM = new eventManager(event);
  137. eventM.cancelBubble();
  138. if (eventM.theEvent.clientX < document.getElementById("innerNiceMain-tab0").offsetLeft || eventM.theEvent.clientY < document.getElementById("innerNiceMain-tab0").offsetTop) {
  139. dragLeave(event, previousOper, previousLevel);
  140. previousOper = TYPE_NONE;
  141. previousLevel = -1;
  142. }
  143. eventM.preventDefault();
  144. }
  145. function processDragEnter(event) {
  146. processDragOverOrEnter(event);
  147. }
  148. function processDragOver(event) {
  149. processDragOverOrEnter(event);
  150. }
  151. function processNestBetweenOverOrEnter(event) {
  152. var eventM = new eventManager(event);
  153. eventM.cancelBubble();
  154. eventM.theEvent.dataTransfer.dropEffect = "move";
  155. eventM.preventDefault();
  156. }
  157. function processDrop(event)
  158. {
  159. if (!topparent.allFramesInitialized())
  160. return;
  161. var eventM = new eventManager(event);
  162. eventM.cancelBubble();
  163. if ( !isValidDragAndDropObject() )
  164. return;
  165. var obj = bubbletoDragAndDropSensitiveObject(eventM.getSrc());
  166. if (obj == null) {
  167. //Dump the object from the drop framework
  168. topparent.getGlobal("dndManager").cancelDrag();
  169. return;
  170. }
  171. var oper = getOper(type, obj, event);
  172. var level = getLevel(type, obj, event);
  173. switch (oper) {
  174. case TYPE_XTAB_MEASURE: onDropMeasure(parseInt(obj.getAttribute("measureno"))); break;
  175. case TYPE_ROW: onDropRowReplace(event, obj.getAttribute("code"), level); break;
  176. case TYPE_COLUMN: onDropColumnReplace(obj.getAttribute("code"), level); break;
  177. case TYPE_NEST_ROWS: onDropRowNest(event, obj.getAttribute("code"), level, obj.getAttribute("dimIdx")); break;
  178. case TYPE_NEST_COLS: onDropColumnNest(obj.getAttribute("code"), level , obj.getAttribute("dimIdx")); break;
  179. case TYPE_REORDER_ROW:
  180. case TYPE_REORDER_COLUMN: onDropCategoryNestBetween(event, obj); break;
  181. case TYPE_CHANGE_DIMBAR_FILTER: onDropMeasuresOnDimbar(event); break;
  182. }
  183. topparent.getGlobal("dndManager").cancelDrag();
  184. eventM.preventDefault();
  185. }
  186. function processNestBetweenDrop(event) {
  187. var eventM = new eventManager(event);
  188. eventM.cancelBubble();
  189. if (overCategoryHeader != null) {
  190. onDropCategoryNestBetween(eventM.theEvent, overCategoryHeader);
  191. }
  192. topparent.getGlobal("dndManager").cancelDrag();
  193. onDragLeaveCategoryNestBetween(eventM.theEvent);
  194. eventM.preventDefault();
  195. }
  196. function bubbletoDragAndDropSensitiveObject( obj )
  197. {
  198. var target = obj;
  199. if (!obj)
  200. return null;
  201. if (!obj.getAttribute || !obj.getAttribute("type") || obj.getAttribute("type") == "")
  202. target = bubbletoDragAndDropSensitiveObject( obj.parentNode );
  203. return target;
  204. }
  205. function isValidDragAndDropObject()
  206. {
  207. var retValue = true;
  208. var text = topparent.getGlobal("dndManager").getData();
  209. if (!text)
  210. retValue = false;
  211. return retValue;
  212. }
  213. function onDragOverCategoryNestBetween(event, obj)
  214. {
  215. showXtabDragNestBetweenDiv(event, obj);
  216. }
  217. function onDragLeaveCategoryNestBetween(event)
  218. {
  219. hideXtabDragNestBetweenDiv();
  220. }
  221. function onDropCategoryNestBetween(event, obj)
  222. {
  223. var dndManager = topparent.getGlobal("dndManager");
  224. var catInfo = new DragInfo (dndManager.getData());
  225. var RC = obj.getAttribute("type") == "r"? "R" : "C";
  226. var cmd = "";
  227. if (obj.getAttribute("parent_code")) {
  228. //We want to drill up on the summary,
  229. //hide all categories but the target category and source category,
  230. //and then reorder the categories accordingly.
  231. var level = parseInt(obj.getAttribute("mylevel"));
  232. cmd += "DG:" + RC + level + "\t" + constructOperandId(obj.getAttribute("parent_id"),obj.getAttribute("dimIdx"),obj.getAttribute("parent_code"));
  233. cmd += "\t\tMS:1\t" + RC + level + "\t" + constructOperandId(catInfo['ppds_id'],obj.getAttribute("dimIdx"),catInfo['code']) + "\t" + constructOperandId(obj.getAttribute("ppdsId"),obj.getAttribute("dimIdx"),obj.getAttribute("code"));
  234. if (level)
  235. cmd += "\t\tES:" + RC + level;
  236. else
  237. cmd += "\t\tET:" + RC + "0";
  238. } else {
  239. //Show the dragged category in case it is hidden
  240. cmd += "MS:0\t" + constructOperandId(catInfo['ppds_id'],catInfo['dim'],catInfo['code']);
  241. }
  242. cmd += "\t\t" + constructReorderCategoryCommand(catInfo['ppds_id'], catInfo['code'], obj);
  243. doit (cmd);
  244. }
  245. function onDropMeasuresOnDimbar(event)
  246. {
  247. var dndManager = topparent.getGlobal("dndManager");
  248. var catInfo = new DragInfo (dndManager.getData());
  249. var cmd = "DC:" + catInfo['ppds_id'] + "," + catInfo['dim'] + "," + catInfo['code'];
  250. doit (cmd);
  251. }
  252. function onDragOverRowNestZone(event, level)
  253. {
  254. var eventM = new eventManager(event);
  255. var id;
  256. id = "rowNest" + level;
  257. var tags = document.getElementsByName(id);
  258. for (var i=0; i < tags.length; i++)
  259. {
  260. if (tags[i].parentNode.className.indexOf(" nest-area") >= 0)
  261. return; //no point in processing, it's already selected...
  262. else
  263. {
  264. tags[i].parentNode.className += " nest-area";
  265. }
  266. }
  267. }
  268. function onDragOverColNestZone(event, level)
  269. {
  270. var eventM = new eventManager(event);
  271. var id;
  272. id = "columnNest" + level;
  273. var tags = document.getElementsByName(id);
  274. for (var i=0; i < tags.length; i++)
  275. {
  276. if (tags[i].parentNode.className.indexOf(" nest-area") >= 0)
  277. return; //no point in processing, it's already selected...
  278. else
  279. {
  280. tags[i].parentNode.className += " nest-area";
  281. }
  282. }
  283. }
  284. function onDragLeaveRowNestZone(level)
  285. {
  286. var id;
  287. id = "rowNest" + level;
  288. var tags = document.getElementsByName(id);
  289. for (var i=0; i < tags.length; i++)
  290. {
  291. if (tags[i].parentNode.className.indexOf(" nest-area") >= 0)
  292. tags[i].parentNode.className = tags[i].parentNode.className.replace(RegExp(" nest-area", "g"), "");
  293. else
  294. return;
  295. }
  296. }
  297. function onDragLeaveColNestZone(level)
  298. {
  299. var id;
  300. id = "columnNest" + level;
  301. var tags = document.getElementsByName(id);
  302. for (var i=0; i < tags.length; i++)
  303. {
  304. if (tags[i].parentNode.className.indexOf(" nest-area") >= 0)
  305. tags[i].parentNode.className = tags[i].parentNode.className.replace(RegExp(" nest-area", "g"), "");
  306. else
  307. return;
  308. }
  309. }
  310. function onDropColumnReplace(code, level) {
  311. doColumnReplaceCommand (code, level);
  312. }
  313. function onDropColumnNest(code, level, dimIdx) {
  314. doColumnNestCommand (code, level, dimIdx);
  315. }
  316. function onDragOverColumn(event, level) {
  317. var obj = document.getElementById("lc" + level);
  318. deselectAllXtab(event);
  319. selectLevel(event, obj, true);
  320. }
  321. function onDragLeaveColumn(event,level) {
  322. var obj = document.getElementById("lc" + level);
  323. selectLevel(event, obj, false );
  324. }
  325. function onDropRowReplace(event, code, level ) {
  326. var eventM = new eventManager(event);
  327. doRowReplaceCommand (code, level);
  328. eventM.cancelBubble();
  329. }
  330. function onDropRowNest(event, code, level, dimIdx) {
  331. var eventM = new eventManager(event);
  332. doRowNestCommand (code, level, dimIdx);
  333. eventM.cancelBubble();
  334. }
  335. function onDragOverRow(event,level) {
  336. var obj = document.getElementById("lr" + level);
  337. deselectAllXtab(event);
  338. selectLevel(event, obj, true );
  339. }
  340. function onDragLeaveRow(event, level) {
  341. var obj = document.getElementById("lr" + level);
  342. selectLevel(event, obj, false );
  343. }
  344. function onDropMeasure(measureNo) {
  345. if ( !isDraggingMeasure() ) return;
  346. doReplaceMeasureCommand(measureNo);
  347. }
  348. function onDragOverXtabMeasure(event) {
  349. if ( isDraggingMeasure() )
  350. {
  351. var eventM = new eventManager(event);
  352. var obj = bubbletoDragAndDropSensitiveObject(eventM.getSrc());
  353. if (obj && obj.getAttribute("type") == "m")
  354. obj.className += " measure-drag-over";
  355. selectedMeasureCell = obj;
  356. }
  357. }
  358. function onDragLeaveXtabMeasure() {
  359. if (selectedMeasureCell)
  360. {
  361. var name = selectedMeasureCell.className;
  362. name = name.replace(RegExp(" measure-drag-over", "g"), "");
  363. selectedMeasureCell.className = name;
  364. selectedMeasureCell = null;
  365. }
  366. }
  367. function hideErrorDialog() {
  368. el = document.getElementById('testDivError');
  369. el.parentElement.removeChild(el);
  370. }
  371. function isDraggingMeasure()
  372. {
  373. var dndManager = topparent.getGlobal("dndManager");
  374. var catInfo = new DragInfo (dndManager.getData());
  375. var dim = parseInt(catInfo['dim']);
  376. var sCmd = "gDimensionInfo[" + dim + "]";
  377. var dimInfo = topparent.getGlobal(sCmd);
  378. if (dimInfo.isMeasureDimension)
  379. return true;
  380. return false;
  381. }
  382. function getParentOfDraggedCategory() {
  383. //Since we are draggin from the tree, we have to get the parent from the tree.
  384. var dndManager = topparent.getGlobal("dndManager");
  385. var catInfo = new DragInfo (dndManager.getData());
  386. return catInfo['parentId'];
  387. }
  388. function getDraggedCategory() {
  389. var dndManager = topparent.getGlobal("dndManager");
  390. var catInfo = new DragInfo (dndManager.getData());
  391. var dim = parseInt(catInfo['dim']);
  392. var code = catInfo['code'];
  393. return dimCache.getCategory(dim,code);
  394. }
  395. function getIdofDraggedCategory() {
  396. var dndManager = topparent.getGlobal("dndManager");
  397. var catInfo = new DragInfo(dndManager.getData());
  398. return catInfo['ppds_id'];
  399. }
  400. function isReordering(type, event, obj) {
  401. if (!event || !type || !obj)
  402. return false;
  403. if (parseInt(obj.getAttribute("ppdsId")) == parseInt(getIdofDraggedCategory()))
  404. return false;
  405. if (obj.getAttribute("summary") && !topparent.getGlobal("gDimensionInfo[" + obj.getAttribute("dimIdx") + "]").isMeasureDimension)
  406. return false;
  407. if (parseInt(obj.getAttribute("parent_id")) != parseInt(getParentOfDraggedCategory()))
  408. return false;
  409. if (topparent.getGlobal("gDimensionInfo[" + obj.getAttribute("dimIdx") + "]").isTimeDimension)
  410. return false;
  411. if (type == "r") {
  412. if (isNestAboveCategory(event, obj) || isNestBelowCategory(event, obj))
  413. return true;
  414. } else if (type == "c") {
  415. if (isNestLeftOfCategory(event, obj) || isNestRightOfCategory(event, obj))
  416. return true;
  417. }
  418. return false;
  419. }
  420. function DimensionInfo (isTime, isMeasure)
  421. {
  422. this.isTimeDimension = isTime;
  423. this.isMeasureDimension = isMeasure;
  424. }