Built files from Bizgaze WebServer
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

moveable_rows.js 18KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636
  1. var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
  2. /* Tabulator v4.8.2 (c) Oliver Folkerd */
  3. var MoveRows = function MoveRows(table) {
  4. this.table = table; //hold Tabulator object
  5. this.placeholderElement = this.createPlaceholderElement();
  6. this.hoverElement = false; //floating row header element
  7. this.checkTimeout = false; //click check timeout holder
  8. this.checkPeriod = 150; //period to wait on mousedown to consider this a move and not a click
  9. this.moving = false; //currently moving row
  10. this.toRow = false; //destination row
  11. this.toRowAfter = false; //position of moving row relative to the desitnation row
  12. this.hasHandle = false; //row has handle instead of fully movable row
  13. this.startY = 0; //starting Y position within header element
  14. this.startX = 0; //starting X position within header element
  15. this.moveHover = this.moveHover.bind(this);
  16. this.endMove = this.endMove.bind(this);
  17. this.tableRowDropEvent = false;
  18. this.touchMove = false;
  19. this.connection = false;
  20. this.connectionSelectorsTables = false;
  21. this.connectionSelectorsElements = false;
  22. this.connectionElements = [];
  23. this.connections = [];
  24. this.connectedTable = false;
  25. this.connectedRow = false;
  26. };
  27. MoveRows.prototype.createPlaceholderElement = function () {
  28. var el = document.createElement("div");
  29. el.classList.add("tabulator-row");
  30. el.classList.add("tabulator-row-placeholder");
  31. return el;
  32. };
  33. MoveRows.prototype.initialize = function (handle) {
  34. this.connectionSelectorsTables = this.table.options.movableRowsConnectedTables;
  35. this.connectionSelectorsElements = this.table.options.movableRowsConnectedElements;
  36. this.connection = this.connectionSelectorsTables || this.connectionSelectorsElements;
  37. };
  38. MoveRows.prototype.setHandle = function (handle) {
  39. this.hasHandle = handle;
  40. };
  41. MoveRows.prototype.initializeGroupHeader = function (group) {
  42. var self = this,
  43. config = {},
  44. rowEl;
  45. //inter table drag drop
  46. config.mouseup = function (e) {
  47. self.tableRowDrop(e, row);
  48. }.bind(self);
  49. //same table drag drop
  50. config.mousemove = function (e) {
  51. if (e.pageY - Tabulator.prototype.helpers.elOffset(group.element).top + self.table.rowManager.element.scrollTop > group.getHeight() / 2) {
  52. if (self.toRow !== group || !self.toRowAfter) {
  53. var rowEl = group.getElement();
  54. rowEl.parentNode.insertBefore(self.placeholderElement, rowEl.nextSibling);
  55. self.moveRow(group, true);
  56. }
  57. } else {
  58. if (self.toRow !== group || self.toRowAfter) {
  59. var rowEl = group.getElement();
  60. if (rowEl.previousSibling) {
  61. rowEl.parentNode.insertBefore(self.placeholderElement, rowEl);
  62. self.moveRow(group, false);
  63. }
  64. }
  65. }
  66. }.bind(self);
  67. group.modules.moveRow = config;
  68. };
  69. MoveRows.prototype.initializeRow = function (row) {
  70. var self = this,
  71. config = {},
  72. rowEl;
  73. //inter table drag drop
  74. config.mouseup = function (e) {
  75. self.tableRowDrop(e, row);
  76. }.bind(self);
  77. //same table drag drop
  78. config.mousemove = function (e) {
  79. if (e.pageY - Tabulator.prototype.helpers.elOffset(row.element).top + self.table.rowManager.element.scrollTop > row.getHeight() / 2) {
  80. if (self.toRow !== row || !self.toRowAfter) {
  81. var rowEl = row.getElement();
  82. rowEl.parentNode.insertBefore(self.placeholderElement, rowEl.nextSibling);
  83. self.moveRow(row, true);
  84. }
  85. } else {
  86. if (self.toRow !== row || self.toRowAfter) {
  87. var rowEl = row.getElement();
  88. rowEl.parentNode.insertBefore(self.placeholderElement, rowEl);
  89. self.moveRow(row, false);
  90. }
  91. }
  92. }.bind(self);
  93. if (!this.hasHandle) {
  94. rowEl = row.getElement();
  95. rowEl.addEventListener("mousedown", function (e) {
  96. if (e.which === 1) {
  97. self.checkTimeout = setTimeout(function () {
  98. self.startMove(e, row);
  99. }, self.checkPeriod);
  100. }
  101. });
  102. rowEl.addEventListener("mouseup", function (e) {
  103. if (e.which === 1) {
  104. if (self.checkTimeout) {
  105. clearTimeout(self.checkTimeout);
  106. }
  107. }
  108. });
  109. this.bindTouchEvents(row, row.getElement());
  110. }
  111. row.modules.moveRow = config;
  112. };
  113. MoveRows.prototype.initializeCell = function (cell) {
  114. var self = this,
  115. cellEl = cell.getElement();
  116. cellEl.addEventListener("mousedown", function (e) {
  117. if (e.which === 1) {
  118. self.checkTimeout = setTimeout(function () {
  119. self.startMove(e, cell.row);
  120. }, self.checkPeriod);
  121. }
  122. });
  123. cellEl.addEventListener("mouseup", function (e) {
  124. if (e.which === 1) {
  125. if (self.checkTimeout) {
  126. clearTimeout(self.checkTimeout);
  127. }
  128. }
  129. });
  130. this.bindTouchEvents(cell.row, cell.getElement());
  131. };
  132. MoveRows.prototype.bindTouchEvents = function (row, element) {
  133. var self = this,
  134. startYMove = false,
  135. //shifting center position of the cell
  136. dir = false,
  137. currentRow,
  138. nextRow,
  139. prevRow,
  140. nextRowHeight,
  141. prevRowHeight,
  142. nextRowHeightLast,
  143. prevRowHeightLast;
  144. element.addEventListener("touchstart", function (e) {
  145. self.checkTimeout = setTimeout(function () {
  146. self.touchMove = true;
  147. currentRow = row;
  148. nextRow = row.nextRow();
  149. nextRowHeight = nextRow ? nextRow.getHeight() / 2 : 0;
  150. prevRow = row.prevRow();
  151. prevRowHeight = prevRow ? prevRow.getHeight() / 2 : 0;
  152. nextRowHeightLast = 0;
  153. prevRowHeightLast = 0;
  154. startYMove = false;
  155. self.startMove(e, row);
  156. }, self.checkPeriod);
  157. }, { passive: true });
  158. this.moving, this.toRow, this.toRowAfter;
  159. element.addEventListener("touchmove", function (e) {
  160. var halfCol, diff, moveToRow;
  161. if (self.moving) {
  162. e.preventDefault();
  163. self.moveHover(e);
  164. if (!startYMove) {
  165. startYMove = e.touches[0].pageY;
  166. }
  167. diff = e.touches[0].pageY - startYMove;
  168. if (diff > 0) {
  169. if (nextRow && diff - nextRowHeightLast > nextRowHeight) {
  170. moveToRow = nextRow;
  171. if (moveToRow !== row) {
  172. startYMove = e.touches[0].pageY;
  173. moveToRow.getElement().parentNode.insertBefore(self.placeholderElement, moveToRow.getElement().nextSibling);
  174. self.moveRow(moveToRow, true);
  175. }
  176. }
  177. } else {
  178. if (prevRow && -diff - prevRowHeightLast > prevRowHeight) {
  179. moveToRow = prevRow;
  180. if (moveToRow !== row) {
  181. startYMove = e.touches[0].pageY;
  182. moveToRow.getElement().parentNode.insertBefore(self.placeholderElement, moveToRow.getElement());
  183. self.moveRow(moveToRow, false);
  184. }
  185. }
  186. }
  187. if (moveToRow) {
  188. currentRow = moveToRow;
  189. nextRow = moveToRow.nextRow();
  190. nextRowHeightLast = nextRowHeight;
  191. nextRowHeight = nextRow ? nextRow.getHeight() / 2 : 0;
  192. prevRow = moveToRow.prevRow();
  193. prevRowHeightLast = prevRowHeight;
  194. prevRowHeight = prevRow ? prevRow.getHeight() / 2 : 0;
  195. }
  196. }
  197. });
  198. element.addEventListener("touchend", function (e) {
  199. if (self.checkTimeout) {
  200. clearTimeout(self.checkTimeout);
  201. }
  202. if (self.moving) {
  203. self.endMove(e);
  204. self.touchMove = false;
  205. }
  206. });
  207. };
  208. MoveRows.prototype._bindMouseMove = function () {
  209. var self = this;
  210. self.table.rowManager.getDisplayRows().forEach(function (row) {
  211. if ((row.type === "row" || row.type === "group") && row.modules.moveRow.mousemove) {
  212. row.getElement().addEventListener("mousemove", row.modules.moveRow.mousemove);
  213. }
  214. });
  215. };
  216. MoveRows.prototype._unbindMouseMove = function () {
  217. var self = this;
  218. self.table.rowManager.getDisplayRows().forEach(function (row) {
  219. if ((row.type === "row" || row.type === "group") && row.modules.moveRow.mousemove) {
  220. row.getElement().removeEventListener("mousemove", row.modules.moveRow.mousemove);
  221. }
  222. });
  223. };
  224. MoveRows.prototype.startMove = function (e, row) {
  225. var element = row.getElement();
  226. this.setStartPosition(e, row);
  227. this.moving = row;
  228. this.table.element.classList.add("tabulator-block-select");
  229. //create placeholder
  230. this.placeholderElement.style.width = row.getWidth() + "px";
  231. this.placeholderElement.style.height = row.getHeight() + "px";
  232. if (!this.connection) {
  233. element.parentNode.insertBefore(this.placeholderElement, element);
  234. element.parentNode.removeChild(element);
  235. } else {
  236. this.table.element.classList.add("tabulator-movingrow-sending");
  237. this.connectToTables(row);
  238. }
  239. //create hover element
  240. this.hoverElement = element.cloneNode(true);
  241. this.hoverElement.classList.add("tabulator-moving");
  242. if (this.connection) {
  243. document.body.appendChild(this.hoverElement);
  244. this.hoverElement.style.left = "0";
  245. this.hoverElement.style.top = "0";
  246. this.hoverElement.style.width = this.table.element.clientWidth + "px";
  247. this.hoverElement.style.whiteSpace = "nowrap";
  248. this.hoverElement.style.overflow = "hidden";
  249. this.hoverElement.style.pointerEvents = "none";
  250. } else {
  251. this.table.rowManager.getTableElement().appendChild(this.hoverElement);
  252. this.hoverElement.style.left = "0";
  253. this.hoverElement.style.top = "0";
  254. this._bindMouseMove();
  255. }
  256. document.body.addEventListener("mousemove", this.moveHover);
  257. document.body.addEventListener("mouseup", this.endMove);
  258. this.moveHover(e);
  259. };
  260. MoveRows.prototype.setStartPosition = function (e, row) {
  261. var pageX = this.touchMove ? e.touches[0].pageX : e.pageX,
  262. pageY = this.touchMove ? e.touches[0].pageY : e.pageY,
  263. element,
  264. position;
  265. element = row.getElement();
  266. if (this.connection) {
  267. position = element.getBoundingClientRect();
  268. this.startX = position.left - pageX + window.pageXOffset;
  269. this.startY = position.top - pageY + window.pageYOffset;
  270. } else {
  271. this.startY = pageY - element.getBoundingClientRect().top;
  272. }
  273. };
  274. MoveRows.prototype.endMove = function (e) {
  275. if (!e || e.which === 1 || this.touchMove) {
  276. this._unbindMouseMove();
  277. if (!this.connection) {
  278. this.placeholderElement.parentNode.insertBefore(this.moving.getElement(), this.placeholderElement.nextSibling);
  279. this.placeholderElement.parentNode.removeChild(this.placeholderElement);
  280. }
  281. this.hoverElement.parentNode.removeChild(this.hoverElement);
  282. this.table.element.classList.remove("tabulator-block-select");
  283. if (this.toRow) {
  284. this.table.rowManager.moveRow(this.moving, this.toRow, this.toRowAfter);
  285. }
  286. this.moving = false;
  287. this.toRow = false;
  288. this.toRowAfter = false;
  289. document.body.removeEventListener("mousemove", this.moveHover);
  290. document.body.removeEventListener("mouseup", this.endMove);
  291. if (this.connection) {
  292. this.table.element.classList.remove("tabulator-movingrow-sending");
  293. this.disconnectFromTables();
  294. }
  295. }
  296. };
  297. MoveRows.prototype.moveRow = function (row, after) {
  298. this.toRow = row;
  299. this.toRowAfter = after;
  300. };
  301. MoveRows.prototype.moveHover = function (e) {
  302. if (this.connection) {
  303. this.moveHoverConnections.call(this, e);
  304. } else {
  305. this.moveHoverTable.call(this, e);
  306. }
  307. };
  308. MoveRows.prototype.moveHoverTable = function (e) {
  309. var rowHolder = this.table.rowManager.getElement(),
  310. scrollTop = rowHolder.scrollTop,
  311. yPos = (this.touchMove ? e.touches[0].pageY : e.pageY) - rowHolder.getBoundingClientRect().top + scrollTop,
  312. scrollPos;
  313. this.hoverElement.style.top = yPos - this.startY + "px";
  314. };
  315. MoveRows.prototype.moveHoverConnections = function (e) {
  316. this.hoverElement.style.left = this.startX + (this.touchMove ? e.touches[0].pageX : e.pageX) + "px";
  317. this.hoverElement.style.top = this.startY + (this.touchMove ? e.touches[0].pageY : e.pageY) + "px";
  318. };
  319. MoveRows.prototype.elementRowDrop = function (e, element, row) {
  320. if (this.table.options.movableRowsElementDrop) {
  321. this.table.options.movableRowsElementDrop(e, element, row ? row.getComponent() : false);
  322. }
  323. };
  324. //establish connection with other tables
  325. MoveRows.prototype.connectToTables = function (row) {
  326. var _this = this;
  327. var connectionTables;
  328. if (this.connectionSelectorsTables) {
  329. connectionTables = this.table.modules.comms.getConnections(this.connectionSelectorsTables);
  330. this.table.options.movableRowsSendingStart.call(this.table, connectionTables);
  331. this.table.modules.comms.send(this.connectionSelectorsTables, "moveRow", "connect", {
  332. row: row
  333. });
  334. }
  335. if (this.connectionSelectorsElements) {
  336. this.connectionElements = [];
  337. if (!Array.isArray(this.connectionSelectorsElements)) {
  338. this.connectionSelectorsElements = [this.connectionSelectorsElements];
  339. }
  340. this.connectionSelectorsElements.forEach(function (query) {
  341. if (typeof query === "string") {
  342. _this.connectionElements = _this.connectionElements.concat(Array.prototype.slice.call(document.querySelectorAll(query)));
  343. } else {
  344. _this.connectionElements.push(query);
  345. }
  346. });
  347. this.connectionElements.forEach(function (element) {
  348. var dropEvent = function dropEvent(e) {
  349. _this.elementRowDrop(e, element, _this.moving);
  350. };
  351. element.addEventListener("mouseup", dropEvent);
  352. element.tabulatorElementDropEvent = dropEvent;
  353. element.classList.add("tabulator-movingrow-receiving");
  354. });
  355. }
  356. };
  357. //disconnect from other tables
  358. MoveRows.prototype.disconnectFromTables = function () {
  359. var connectionTables;
  360. if (this.connectionSelectorsTables) {
  361. connectionTables = this.table.modules.comms.getConnections(this.connectionSelectorsTables);
  362. this.table.options.movableRowsSendingStop.call(this.table, connectionTables);
  363. this.table.modules.comms.send(this.connectionSelectorsTables, "moveRow", "disconnect");
  364. }
  365. this.connectionElements.forEach(function (element) {
  366. element.classList.remove("tabulator-movingrow-receiving");
  367. element.removeEventListener("mouseup", element.tabulatorElementDropEvent);
  368. delete element.tabulatorElementDropEvent;
  369. });
  370. };
  371. //accept incomming connection
  372. MoveRows.prototype.connect = function (table, row) {
  373. var self = this;
  374. if (!this.connectedTable) {
  375. this.connectedTable = table;
  376. this.connectedRow = row;
  377. this.table.element.classList.add("tabulator-movingrow-receiving");
  378. self.table.rowManager.getDisplayRows().forEach(function (row) {
  379. if (row.type === "row" && row.modules.moveRow && row.modules.moveRow.mouseup) {
  380. row.getElement().addEventListener("mouseup", row.modules.moveRow.mouseup);
  381. }
  382. });
  383. self.tableRowDropEvent = self.tableRowDrop.bind(self);
  384. self.table.element.addEventListener("mouseup", self.tableRowDropEvent);
  385. this.table.options.movableRowsReceivingStart.call(this.table, row, table);
  386. return true;
  387. } else {
  388. console.warn("Move Row Error - Table cannot accept connection, already connected to table:", this.connectedTable);
  389. return false;
  390. }
  391. };
  392. //close incomming connection
  393. MoveRows.prototype.disconnect = function (table) {
  394. var self = this;
  395. if (table === this.connectedTable) {
  396. this.connectedTable = false;
  397. this.connectedRow = false;
  398. this.table.element.classList.remove("tabulator-movingrow-receiving");
  399. self.table.rowManager.getDisplayRows().forEach(function (row) {
  400. if (row.type === "row" && row.modules.moveRow && row.modules.moveRow.mouseup) {
  401. row.getElement().removeEventListener("mouseup", row.modules.moveRow.mouseup);
  402. }
  403. });
  404. self.table.element.removeEventListener("mouseup", self.tableRowDropEvent);
  405. this.table.options.movableRowsReceivingStop.call(this.table, table);
  406. } else {
  407. console.warn("Move Row Error - trying to disconnect from non connected table");
  408. }
  409. };
  410. MoveRows.prototype.dropComplete = function (table, row, success) {
  411. var sender = false;
  412. if (success) {
  413. switch (_typeof(this.table.options.movableRowsSender)) {
  414. case "string":
  415. sender = this.senders[this.table.options.movableRowsSender];
  416. break;
  417. case "function":
  418. sender = this.table.options.movableRowsSender;
  419. break;
  420. }
  421. if (sender) {
  422. sender.call(this, this.moving.getComponent(), row ? row.getComponent() : undefined, table);
  423. } else {
  424. if (this.table.options.movableRowsSender) {
  425. console.warn("Mover Row Error - no matching sender found:", this.table.options.movableRowsSender);
  426. }
  427. }
  428. this.table.options.movableRowsSent.call(this.table, this.moving.getComponent(), row ? row.getComponent() : undefined, table);
  429. } else {
  430. this.table.options.movableRowsSentFailed.call(this.table, this.moving.getComponent(), row ? row.getComponent() : undefined, table);
  431. }
  432. this.endMove();
  433. };
  434. MoveRows.prototype.tableRowDrop = function (e, row) {
  435. var receiver = false,
  436. success = false;
  437. console.trace("drop");
  438. e.stopImmediatePropagation();
  439. switch (_typeof(this.table.options.movableRowsReceiver)) {
  440. case "string":
  441. receiver = this.receivers[this.table.options.movableRowsReceiver];
  442. break;
  443. case "function":
  444. receiver = this.table.options.movableRowsReceiver;
  445. break;
  446. }
  447. if (receiver) {
  448. success = receiver.call(this, this.connectedRow.getComponent(), row ? row.getComponent() : undefined, this.connectedTable);
  449. } else {
  450. console.warn("Mover Row Error - no matching receiver found:", this.table.options.movableRowsReceiver);
  451. }
  452. if (success) {
  453. this.table.options.movableRowsReceived.call(this.table, this.connectedRow.getComponent(), row ? row.getComponent() : undefined, this.connectedTable);
  454. } else {
  455. this.table.options.movableRowsReceivedFailed.call(this.table, this.connectedRow.getComponent(), row ? row.getComponent() : undefined, this.connectedTable);
  456. }
  457. this.table.modules.comms.send(this.connectedTable, "moveRow", "dropcomplete", {
  458. row: row,
  459. success: success
  460. });
  461. };
  462. MoveRows.prototype.receivers = {
  463. insert: function insert(fromRow, toRow, fromTable) {
  464. this.table.addRow(fromRow.getData(), undefined, toRow);
  465. return true;
  466. },
  467. add: function add(fromRow, toRow, fromTable) {
  468. this.table.addRow(fromRow.getData());
  469. return true;
  470. },
  471. update: function update(fromRow, toRow, fromTable) {
  472. if (toRow) {
  473. toRow.update(fromRow.getData());
  474. return true;
  475. }
  476. return false;
  477. },
  478. replace: function replace(fromRow, toRow, fromTable) {
  479. if (toRow) {
  480. this.table.addRow(fromRow.getData(), undefined, toRow);
  481. toRow.delete();
  482. return true;
  483. }
  484. return false;
  485. }
  486. };
  487. MoveRows.prototype.senders = {
  488. delete: function _delete(fromRow, toRow, toTable) {
  489. fromRow.delete();
  490. }
  491. };
  492. MoveRows.prototype.commsReceived = function (table, action, data) {
  493. switch (action) {
  494. case "connect":
  495. return this.connect(table, data.row);
  496. break;
  497. case "disconnect":
  498. return this.disconnect(table);
  499. break;
  500. case "dropcomplete":
  501. return this.dropComplete(table, data.row, data.success);
  502. break;
  503. }
  504. };
  505. Tabulator.prototype.registerModule("moveRow", MoveRows);