touchScroll.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. 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; }; }();
  2. 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); } };
  3. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  4. 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; }
  5. 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; }
  6. import { addClass, removeClass } from './../../helpers/dom/element';
  7. import { arrayEach } from './../../helpers/array';
  8. import BasePlugin from './../_base';
  9. import { registerPlugin } from './../../plugins';
  10. import { isTouchSupported } from './../../helpers/feature';
  11. /**
  12. * @private
  13. * @plugin TouchScroll
  14. * @class TouchScroll
  15. */
  16. var TouchScroll = function (_BasePlugin) {
  17. _inherits(TouchScroll, _BasePlugin);
  18. function TouchScroll(hotInstance) {
  19. _classCallCheck(this, TouchScroll);
  20. /**
  21. * Collection of scrollbars to update.
  22. *
  23. * @type {Array}
  24. */
  25. var _this = _possibleConstructorReturn(this, (TouchScroll.__proto__ || Object.getPrototypeOf(TouchScroll)).call(this, hotInstance));
  26. _this.scrollbars = [];
  27. /**
  28. * Collection of overlays to update.
  29. *
  30. * @type {Array}
  31. */
  32. _this.clones = [];
  33. /**
  34. * Flag which determines if collection of overlays should be refilled on every table render.
  35. *
  36. * @type {Boolean}
  37. * @default false
  38. */
  39. _this.lockedCollection = false;
  40. /**
  41. * Flag which determines if walkontable should freeze overlays while scrolling.
  42. *
  43. * @type {Boolean}
  44. * @default false
  45. */
  46. _this.freezeOverlays = false;
  47. return _this;
  48. }
  49. /**
  50. * Check if plugin is enabled.
  51. *
  52. * @returns {Boolean}
  53. */
  54. _createClass(TouchScroll, [{
  55. key: 'isEnabled',
  56. value: function isEnabled() {
  57. return isTouchSupported();
  58. }
  59. /**
  60. * Enable the plugin.
  61. */
  62. }, {
  63. key: 'enablePlugin',
  64. value: function enablePlugin() {
  65. var _this2 = this;
  66. if (this.enabled) {
  67. return;
  68. }
  69. this.addHook('afterRender', function () {
  70. return _this2.onAfterRender();
  71. });
  72. this.registerEvents();
  73. _get(TouchScroll.prototype.__proto__ || Object.getPrototypeOf(TouchScroll.prototype), 'enablePlugin', this).call(this);
  74. }
  75. /**
  76. * Updates the plugin to use the latest options you have specified.
  77. */
  78. }, {
  79. key: 'updatePlugin',
  80. value: function updatePlugin() {
  81. this.lockedCollection = false;
  82. _get(TouchScroll.prototype.__proto__ || Object.getPrototypeOf(TouchScroll.prototype), 'updatePlugin', this).call(this);
  83. }
  84. /**
  85. * Disable plugin for this Handsontable instance.
  86. */
  87. }, {
  88. key: 'disablePlugin',
  89. value: function disablePlugin() {
  90. _get(TouchScroll.prototype.__proto__ || Object.getPrototypeOf(TouchScroll.prototype), 'disablePlugin', this).call(this);
  91. }
  92. /**
  93. * Register all necessary events.
  94. *
  95. * @private
  96. */
  97. }, {
  98. key: 'registerEvents',
  99. value: function registerEvents() {
  100. var _this3 = this;
  101. this.addHook('beforeTouchScroll', function () {
  102. return _this3.onBeforeTouchScroll();
  103. });
  104. this.addHook('afterMomentumScroll', function () {
  105. return _this3.onAfterMomentumScroll();
  106. });
  107. }
  108. /**
  109. * After render listener.
  110. *
  111. * @private
  112. */
  113. }, {
  114. key: 'onAfterRender',
  115. value: function onAfterRender() {
  116. if (this.lockedCollection) {
  117. return;
  118. }
  119. var _hot$view$wt$wtOverla = this.hot.view.wt.wtOverlays,
  120. topOverlay = _hot$view$wt$wtOverla.topOverlay,
  121. bottomOverlay = _hot$view$wt$wtOverla.bottomOverlay,
  122. leftOverlay = _hot$view$wt$wtOverla.leftOverlay,
  123. topLeftCornerOverlay = _hot$view$wt$wtOverla.topLeftCornerOverlay,
  124. bottomLeftCornerOverlay = _hot$view$wt$wtOverla.bottomLeftCornerOverlay;
  125. this.lockedCollection = true;
  126. this.scrollbars.length = 0;
  127. this.scrollbars.push(topOverlay);
  128. if (bottomOverlay.clone) {
  129. this.scrollbars.push(bottomOverlay);
  130. }
  131. this.scrollbars.push(leftOverlay);
  132. if (topLeftCornerOverlay) {
  133. this.scrollbars.push(topLeftCornerOverlay);
  134. }
  135. if (bottomLeftCornerOverlay && bottomLeftCornerOverlay.clone) {
  136. this.scrollbars.push(bottomLeftCornerOverlay);
  137. }
  138. this.clones.length = 0;
  139. if (topOverlay.needFullRender) {
  140. this.clones.push(topOverlay.clone.wtTable.holder.parentNode);
  141. }
  142. if (bottomOverlay.needFullRender) {
  143. this.clones.push(bottomOverlay.clone.wtTable.holder.parentNode);
  144. }
  145. if (leftOverlay.needFullRender) {
  146. this.clones.push(leftOverlay.clone.wtTable.holder.parentNode);
  147. }
  148. if (topLeftCornerOverlay) {
  149. this.clones.push(topLeftCornerOverlay.clone.wtTable.holder.parentNode);
  150. }
  151. if (bottomLeftCornerOverlay && bottomLeftCornerOverlay.clone) {
  152. this.clones.push(bottomLeftCornerOverlay.clone.wtTable.holder.parentNode);
  153. }
  154. }
  155. /**
  156. * Touch scroll listener.
  157. *
  158. * @private
  159. */
  160. }, {
  161. key: 'onBeforeTouchScroll',
  162. value: function onBeforeTouchScroll() {
  163. this.freezeOverlays = true;
  164. arrayEach(this.clones, function (clone) {
  165. addClass(clone, 'hide-tween');
  166. });
  167. }
  168. /**
  169. * After momentum scroll listener.
  170. *
  171. * @private
  172. */
  173. }, {
  174. key: 'onAfterMomentumScroll',
  175. value: function onAfterMomentumScroll() {
  176. var _this4 = this;
  177. this.freezeOverlays = false;
  178. arrayEach(this.clones, function (clone) {
  179. removeClass(clone, 'hide-tween');
  180. addClass(clone, 'show-tween');
  181. });
  182. setTimeout(function () {
  183. arrayEach(_this4.clones, function (clone) {
  184. removeClass(clone, 'show-tween');
  185. });
  186. }, 400);
  187. arrayEach(this.scrollbars, function (scrollbar) {
  188. scrollbar.refresh();
  189. scrollbar.resetFixedPosition();
  190. });
  191. this.hot.view.wt.wtOverlays.syncScrollWithMaster();
  192. }
  193. }]);
  194. return TouchScroll;
  195. }(BasePlugin);
  196. registerPlugin('touchScroll', TouchScroll);
  197. export default TouchScroll;