443a528b792b97a4d8eeb09043454b0e2807bf755c5b86d8d53de3a76e63bc6f39ef50250406c23a18bf5d6581945a744ed63da6ed30b3be17264a86a5b961 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414
  1. 'use strict';
  2. exports.__esModule = true;
  3. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  4. var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
  5. var _pluginHooks = require('./../../pluginHooks');
  6. var _pluginHooks2 = _interopRequireDefault(_pluginHooks);
  7. var _element = require('./../../helpers/dom/element');
  8. var _browser = require('./../../helpers/browser');
  9. var _base = require('./../_base');
  10. var _base2 = _interopRequireDefault(_base);
  11. var _eventManager = require('./../../eventManager');
  12. var _eventManager2 = _interopRequireDefault(_eventManager);
  13. var _plugins = require('./../../plugins');
  14. var _src = require('./../../3rdparty/walkontable/src');
  15. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  16. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  17. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  18. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
  19. /**
  20. * @private
  21. * @plugin MultipleSelectionHandles
  22. */
  23. var MultipleSelectionHandles = function (_BasePlugin) {
  24. _inherits(MultipleSelectionHandles, _BasePlugin);
  25. /**
  26. * @param {Object} hotInstance
  27. */
  28. function MultipleSelectionHandles(hotInstance) {
  29. _classCallCheck(this, MultipleSelectionHandles);
  30. /**
  31. * @type {Array}
  32. */
  33. var _this2 = _possibleConstructorReturn(this, (MultipleSelectionHandles.__proto__ || Object.getPrototypeOf(MultipleSelectionHandles)).call(this, hotInstance));
  34. _this2.dragged = [];
  35. /**
  36. * Instance of EventManager.
  37. *
  38. * @type {EventManager}
  39. */
  40. _this2.eventManager = null;
  41. /**
  42. * @type {null}
  43. */
  44. _this2.lastSetCell = null;
  45. return _this2;
  46. }
  47. /**
  48. * Check if the plugin is enabled in the handsontable settings.
  49. *
  50. * @returns {Boolean}
  51. */
  52. _createClass(MultipleSelectionHandles, [{
  53. key: 'isEnabled',
  54. value: function isEnabled() {
  55. return (0, _browser.isMobileBrowser)();
  56. }
  57. /**
  58. * Enable plugin for this Handsontable instance.
  59. */
  60. }, {
  61. key: 'enablePlugin',
  62. value: function enablePlugin() {
  63. if (this.enabled) {
  64. return;
  65. }
  66. if (!this.eventManager) {
  67. this.eventManager = new _eventManager2.default(this);
  68. }
  69. this.registerListeners();
  70. _get(MultipleSelectionHandles.prototype.__proto__ || Object.getPrototypeOf(MultipleSelectionHandles.prototype), 'enablePlugin', this).call(this);
  71. }
  72. /**
  73. * Bind the touch events
  74. * @private
  75. */
  76. }, {
  77. key: 'registerListeners',
  78. value: function registerListeners() {
  79. var _this = this;
  80. function removeFromDragged(query) {
  81. if (_this.dragged.length === 1) {
  82. // clear array
  83. _this.dragged.splice(0, _this.dragged.length);
  84. return true;
  85. }
  86. var entryPosition = _this.dragged.indexOf(query);
  87. if (entryPosition == -1) {
  88. return false;
  89. } else if (entryPosition === 0) {
  90. _this.dragged = _this.dragged.slice(0, 1);
  91. } else if (entryPosition == 1) {
  92. _this.dragged = _this.dragged.slice(-1);
  93. }
  94. }
  95. this.eventManager.addEventListener(this.hot.rootElement, 'touchstart', function (event) {
  96. var selectedRange = void 0;
  97. if ((0, _element.hasClass)(event.target, 'topLeftSelectionHandle-HitArea')) {
  98. selectedRange = _this.hot.getSelectedRange();
  99. _this.dragged.push('topLeft');
  100. _this.touchStartRange = {
  101. width: selectedRange.getWidth(),
  102. height: selectedRange.getHeight(),
  103. direction: selectedRange.getDirection()
  104. };
  105. event.preventDefault();
  106. return false;
  107. } else if ((0, _element.hasClass)(event.target, 'bottomRightSelectionHandle-HitArea')) {
  108. selectedRange = _this.hot.getSelectedRange();
  109. _this.dragged.push('bottomRight');
  110. _this.touchStartRange = {
  111. width: selectedRange.getWidth(),
  112. height: selectedRange.getHeight(),
  113. direction: selectedRange.getDirection()
  114. };
  115. event.preventDefault();
  116. return false;
  117. }
  118. });
  119. this.eventManager.addEventListener(this.hot.rootElement, 'touchend', function (event) {
  120. if ((0, _element.hasClass)(event.target, 'topLeftSelectionHandle-HitArea')) {
  121. removeFromDragged.call(_this, 'topLeft');
  122. _this.touchStartRange = void 0;
  123. event.preventDefault();
  124. return false;
  125. } else if ((0, _element.hasClass)(event.target, 'bottomRightSelectionHandle-HitArea')) {
  126. removeFromDragged.call(_this, 'bottomRight');
  127. _this.touchStartRange = void 0;
  128. event.preventDefault();
  129. return false;
  130. }
  131. });
  132. this.eventManager.addEventListener(this.hot.rootElement, 'touchmove', function (event) {
  133. var scrollTop = (0, _element.getWindowScrollTop)(),
  134. scrollLeft = (0, _element.getWindowScrollLeft)(),
  135. endTarget = void 0,
  136. targetCoords = void 0,
  137. selectedRange = void 0,
  138. rangeWidth = void 0,
  139. rangeHeight = void 0,
  140. rangeDirection = void 0,
  141. newRangeCoords = void 0;
  142. if (_this.dragged.length === 0) {
  143. return;
  144. }
  145. endTarget = document.elementFromPoint(event.touches[0].screenX - scrollLeft, event.touches[0].screenY - scrollTop);
  146. if (!endTarget || endTarget === _this.lastSetCell) {
  147. return;
  148. }
  149. if (endTarget.nodeName == 'TD' || endTarget.nodeName == 'TH') {
  150. targetCoords = _this.hot.getCoords(endTarget);
  151. if (targetCoords.col == -1) {
  152. targetCoords.col = 0;
  153. }
  154. selectedRange = _this.hot.getSelectedRange();
  155. rangeWidth = selectedRange.getWidth();
  156. rangeHeight = selectedRange.getHeight();
  157. rangeDirection = selectedRange.getDirection();
  158. if (rangeWidth == 1 && rangeHeight == 1) {
  159. _this.hot.selection.setRangeEnd(targetCoords);
  160. }
  161. newRangeCoords = _this.getCurrentRangeCoords(selectedRange, targetCoords, _this.touchStartRange.direction, rangeDirection, _this.dragged[0]);
  162. if (newRangeCoords.start !== null) {
  163. _this.hot.selection.setRangeStart(newRangeCoords.start);
  164. }
  165. _this.hot.selection.setRangeEnd(newRangeCoords.end);
  166. _this.lastSetCell = endTarget;
  167. }
  168. event.preventDefault();
  169. });
  170. }
  171. }, {
  172. key: 'getCurrentRangeCoords',
  173. value: function getCurrentRangeCoords(selectedRange, currentTouch, touchStartDirection, currentDirection, draggedHandle) {
  174. var topLeftCorner = selectedRange.getTopLeftCorner(),
  175. bottomRightCorner = selectedRange.getBottomRightCorner(),
  176. bottomLeftCorner = selectedRange.getBottomLeftCorner(),
  177. topRightCorner = selectedRange.getTopRightCorner();
  178. var newCoords = {
  179. start: null,
  180. end: null
  181. };
  182. switch (touchStartDirection) {
  183. case 'NE-SW':
  184. switch (currentDirection) {
  185. case 'NE-SW':
  186. case 'NW-SE':
  187. if (draggedHandle == 'topLeft') {
  188. newCoords = {
  189. start: new _src.CellCoords(currentTouch.row, selectedRange.highlight.col),
  190. end: new _src.CellCoords(bottomLeftCorner.row, currentTouch.col)
  191. };
  192. } else {
  193. newCoords = {
  194. start: new _src.CellCoords(selectedRange.highlight.row, currentTouch.col),
  195. end: new _src.CellCoords(currentTouch.row, topLeftCorner.col)
  196. };
  197. }
  198. break;
  199. case 'SE-NW':
  200. if (draggedHandle == 'bottomRight') {
  201. newCoords = {
  202. start: new _src.CellCoords(bottomRightCorner.row, currentTouch.col),
  203. end: new _src.CellCoords(currentTouch.row, topLeftCorner.col)
  204. };
  205. }
  206. break;
  207. default:
  208. break;
  209. }
  210. break;
  211. case 'NW-SE':
  212. switch (currentDirection) {
  213. case 'NE-SW':
  214. if (draggedHandle == 'topLeft') {
  215. newCoords = {
  216. start: currentTouch,
  217. end: bottomLeftCorner
  218. };
  219. } else {
  220. newCoords.end = currentTouch;
  221. }
  222. break;
  223. case 'NW-SE':
  224. if (draggedHandle == 'topLeft') {
  225. newCoords = {
  226. start: currentTouch,
  227. end: bottomRightCorner
  228. };
  229. } else {
  230. newCoords.end = currentTouch;
  231. }
  232. break;
  233. case 'SE-NW':
  234. if (draggedHandle == 'topLeft') {
  235. newCoords = {
  236. start: currentTouch,
  237. end: topLeftCorner
  238. };
  239. } else {
  240. newCoords.end = currentTouch;
  241. }
  242. break;
  243. case 'SW-NE':
  244. if (draggedHandle == 'topLeft') {
  245. newCoords = {
  246. start: currentTouch,
  247. end: topRightCorner
  248. };
  249. } else {
  250. newCoords.end = currentTouch;
  251. }
  252. break;
  253. default:
  254. break;
  255. }
  256. break;
  257. case 'SW-NE':
  258. switch (currentDirection) {
  259. case 'NW-SE':
  260. if (draggedHandle == 'bottomRight') {
  261. newCoords = {
  262. start: new _src.CellCoords(currentTouch.row, topLeftCorner.col),
  263. end: new _src.CellCoords(bottomLeftCorner.row, currentTouch.col)
  264. };
  265. } else {
  266. newCoords = {
  267. start: new _src.CellCoords(topLeftCorner.row, currentTouch.col),
  268. end: new _src.CellCoords(currentTouch.row, bottomRightCorner.col)
  269. };
  270. }
  271. break;
  272. // case 'NE-SW':
  273. //
  274. // break;
  275. case 'SW-NE':
  276. if (draggedHandle == 'topLeft') {
  277. newCoords = {
  278. start: new _src.CellCoords(selectedRange.highlight.row, currentTouch.col),
  279. end: new _src.CellCoords(currentTouch.row, bottomRightCorner.col)
  280. };
  281. } else {
  282. newCoords = {
  283. start: new _src.CellCoords(currentTouch.row, topLeftCorner.col),
  284. end: new _src.CellCoords(topLeftCorner.row, currentTouch.col)
  285. };
  286. }
  287. break;
  288. case 'SE-NW':
  289. if (draggedHandle == 'bottomRight') {
  290. newCoords = {
  291. start: new _src.CellCoords(currentTouch.row, topRightCorner.col),
  292. end: new _src.CellCoords(topLeftCorner.row, currentTouch.col)
  293. };
  294. } else if (draggedHandle == 'topLeft') {
  295. newCoords = {
  296. start: bottomLeftCorner,
  297. end: currentTouch
  298. };
  299. }
  300. break;
  301. default:
  302. break;
  303. }
  304. break;
  305. case 'SE-NW':
  306. switch (currentDirection) {
  307. case 'NW-SE':
  308. case 'NE-SW':
  309. case 'SW-NE':
  310. if (draggedHandle == 'topLeft') {
  311. newCoords.end = currentTouch;
  312. }
  313. break;
  314. case 'SE-NW':
  315. if (draggedHandle == 'topLeft') {
  316. newCoords.end = currentTouch;
  317. } else {
  318. newCoords = {
  319. start: currentTouch,
  320. end: topLeftCorner
  321. };
  322. }
  323. break;
  324. default:
  325. break;
  326. }
  327. break;
  328. default:
  329. break;
  330. }
  331. return newCoords;
  332. }
  333. /**
  334. * Check if user is currently dragging the handle.
  335. *
  336. * @returns {boolean} Dragging state
  337. */
  338. }, {
  339. key: 'isDragged',
  340. value: function isDragged() {
  341. return this.dragged.length > 0;
  342. }
  343. }]);
  344. return MultipleSelectionHandles;
  345. }(_base2.default);
  346. (0, _plugins.registerPlugin)('multipleSelectionHandles', MultipleSelectionHandles);
  347. exports.default = MultipleSelectionHandles;