0d0d7d61c63a8137dd0683c88f1b8bbfa1ad30ecafed1fbe01e2fadf2cd348d44e16534ccb9de9065da92dc1e6e9e8c968a6f08925ae1aa38ec099f14f1f8d 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  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 _element = require('./../../../../helpers/dom/element');
  5. var _object = require('./../../../../helpers/object');
  6. var _array = require('./../../../../helpers/array');
  7. var _eventManager = require('./../../../../eventManager');
  8. var _eventManager2 = _interopRequireDefault(_eventManager);
  9. var _core = require('./../core');
  10. var _core2 = _interopRequireDefault(_core);
  11. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  12. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  13. var registeredOverlays = {};
  14. /**
  15. * Creates an overlay over the original Walkontable instance. The overlay renders the clone of the original Walkontable
  16. * and (optionally) implements behavior needed for native horizontal and vertical scrolling.
  17. *
  18. * @class Overlay
  19. */
  20. var Overlay = function () {
  21. _createClass(Overlay, null, [{
  22. key: 'registerOverlay',
  23. /**
  24. * Register overlay class.
  25. *
  26. * @param {String} type Overlay type, one of the CLONE_TYPES value
  27. * @param {Overlay} overlayClass Overlay class extended from base overlay class {@link Overlay}
  28. */
  29. value: function registerOverlay(type, overlayClass) {
  30. if (Overlay.CLONE_TYPES.indexOf(type) === -1) {
  31. throw new Error('Unsupported overlay (' + type + ').');
  32. }
  33. registeredOverlays[type] = overlayClass;
  34. }
  35. /**
  36. * Create new instance of overlay type.
  37. *
  38. * @param {String} type Overlay type, one of the CLONE_TYPES value
  39. * @param {Walkontable} wot Walkontable instance
  40. */
  41. }, {
  42. key: 'createOverlay',
  43. value: function createOverlay(type, wot) {
  44. return new registeredOverlays[type](wot);
  45. }
  46. /**
  47. * Check if specified overlay was registered.
  48. *
  49. * @param {String} type Overlay type, one of the CLONE_TYPES value
  50. * @returns {Boolean}
  51. */
  52. }, {
  53. key: 'hasOverlay',
  54. value: function hasOverlay(type) {
  55. return registeredOverlays[type] !== void 0;
  56. }
  57. /**
  58. * Checks if overlay object (`overlay`) is instance of overlay type (`type`).
  59. *
  60. * @param {Overlay} overlay Overlay object
  61. * @param {String} type Overlay type, one of the CLONE_TYPES value
  62. * @returns {Boolean}
  63. */
  64. }, {
  65. key: 'isOverlayTypeOf',
  66. value: function isOverlayTypeOf(overlay, type) {
  67. if (!overlay || !registeredOverlays[type]) {
  68. return false;
  69. }
  70. return overlay instanceof registeredOverlays[type];
  71. }
  72. /**
  73. * @param {Walkontable} wotInstance
  74. */
  75. }, {
  76. key: 'CLONE_TOP',
  77. /**
  78. * @type {String}
  79. */
  80. get: function get() {
  81. return 'top';
  82. }
  83. /**
  84. * @type {String}
  85. */
  86. }, {
  87. key: 'CLONE_BOTTOM',
  88. get: function get() {
  89. return 'bottom';
  90. }
  91. /**
  92. * @type {String}
  93. */
  94. }, {
  95. key: 'CLONE_LEFT',
  96. get: function get() {
  97. return 'left';
  98. }
  99. /**
  100. * @type {String}
  101. */
  102. }, {
  103. key: 'CLONE_TOP_LEFT_CORNER',
  104. get: function get() {
  105. return 'top_left_corner';
  106. }
  107. /**
  108. * @type {String}
  109. */
  110. }, {
  111. key: 'CLONE_BOTTOM_LEFT_CORNER',
  112. get: function get() {
  113. return 'bottom_left_corner';
  114. }
  115. /**
  116. * @type {String}
  117. */
  118. }, {
  119. key: 'CLONE_DEBUG',
  120. get: function get() {
  121. return 'debug';
  122. }
  123. /**
  124. * List of all availables clone types
  125. *
  126. * @type {Array}
  127. */
  128. }, {
  129. key: 'CLONE_TYPES',
  130. get: function get() {
  131. return [Overlay.CLONE_TOP, Overlay.CLONE_BOTTOM, Overlay.CLONE_LEFT, Overlay.CLONE_TOP_LEFT_CORNER, Overlay.CLONE_BOTTOM_LEFT_CORNER, Overlay.CLONE_DEBUG];
  132. }
  133. }]);
  134. function Overlay(wotInstance) {
  135. _classCallCheck(this, Overlay);
  136. (0, _object.defineGetter)(this, 'wot', wotInstance, {
  137. writable: false
  138. });
  139. // legacy support, deprecated in the future
  140. this.instance = this.wot;
  141. this.type = '';
  142. this.mainTableScrollableElement = null;
  143. this.TABLE = this.wot.wtTable.TABLE;
  144. this.hider = this.wot.wtTable.hider;
  145. this.spreader = this.wot.wtTable.spreader;
  146. this.holder = this.wot.wtTable.holder;
  147. this.wtRootElement = this.wot.wtTable.wtRootElement;
  148. this.trimmingContainer = (0, _element.getTrimmingContainer)(this.hider.parentNode.parentNode);
  149. this.areElementSizesAdjusted = false;
  150. this.updateStateOfRendering();
  151. }
  152. /**
  153. * Update internal state of object with an information about the need of full rendering of the overlay.
  154. *
  155. * @returns {Boolean} Returns `true` if the state has changed since the last check.
  156. */
  157. _createClass(Overlay, [{
  158. key: 'updateStateOfRendering',
  159. value: function updateStateOfRendering() {
  160. var previousState = this.needFullRender;
  161. this.needFullRender = this.shouldBeRendered();
  162. var changed = previousState !== this.needFullRender;
  163. if (changed && !this.needFullRender) {
  164. this.reset();
  165. }
  166. return changed;
  167. }
  168. /**
  169. * Checks if overlay should be fully rendered
  170. *
  171. * @returns {Boolean}
  172. */
  173. }, {
  174. key: 'shouldBeRendered',
  175. value: function shouldBeRendered() {
  176. return true;
  177. }
  178. /**
  179. * Update the trimming container.
  180. */
  181. }, {
  182. key: 'updateTrimmingContainer',
  183. value: function updateTrimmingContainer() {
  184. this.trimmingContainer = (0, _element.getTrimmingContainer)(this.hider.parentNode.parentNode);
  185. }
  186. /**
  187. * Update the main scrollable element.
  188. */
  189. }, {
  190. key: 'updateMainScrollableElement',
  191. value: function updateMainScrollableElement() {
  192. this.mainTableScrollableElement = (0, _element.getScrollableElement)(this.wot.wtTable.TABLE);
  193. }
  194. /**
  195. * Make a clone of table for overlay
  196. *
  197. * @param {String} direction Can be `Overlay.CLONE_TOP`, `Overlay.CLONE_LEFT`,
  198. * `Overlay.CLONE_TOP_LEFT_CORNER`, `Overlay.CLONE_DEBUG`
  199. * @returns {Walkontable}
  200. */
  201. }, {
  202. key: 'makeClone',
  203. value: function makeClone(direction) {
  204. if (Overlay.CLONE_TYPES.indexOf(direction) === -1) {
  205. throw new Error('Clone type "' + direction + '" is not supported.');
  206. }
  207. var clone = document.createElement('DIV');
  208. var clonedTable = document.createElement('TABLE');
  209. clone.className = 'ht_clone_' + direction + ' handsontable';
  210. clone.style.position = 'absolute';
  211. clone.style.top = 0;
  212. clone.style.left = 0;
  213. clone.style.overflow = 'hidden';
  214. clonedTable.className = this.wot.wtTable.TABLE.className;
  215. clone.appendChild(clonedTable);
  216. this.type = direction;
  217. this.wot.wtTable.wtRootElement.parentNode.appendChild(clone);
  218. var preventOverflow = this.wot.getSetting('preventOverflow');
  219. if (preventOverflow === true || preventOverflow === 'horizontal' && this.type === Overlay.CLONE_TOP || preventOverflow === 'vertical' && this.type === Overlay.CLONE_LEFT) {
  220. this.mainTableScrollableElement = window;
  221. } else {
  222. this.mainTableScrollableElement = (0, _element.getScrollableElement)(this.wot.wtTable.TABLE);
  223. }
  224. return new _core2.default({
  225. cloneSource: this.wot,
  226. cloneOverlay: this,
  227. table: clonedTable
  228. });
  229. }
  230. /**
  231. * Refresh/Redraw overlay
  232. *
  233. * @param {Boolean} [fastDraw=false]
  234. */
  235. }, {
  236. key: 'refresh',
  237. value: function refresh() {
  238. var fastDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  239. // When hot settings are changed we allow to refresh overlay once before blocking
  240. var nextCycleRenderFlag = this.shouldBeRendered();
  241. if (this.clone && (this.needFullRender || nextCycleRenderFlag)) {
  242. this.clone.draw(fastDraw);
  243. }
  244. this.needFullRender = nextCycleRenderFlag;
  245. }
  246. /**
  247. * Reset overlay styles to initial values.
  248. */
  249. }, {
  250. key: 'reset',
  251. value: function reset() {
  252. if (!this.clone) {
  253. return;
  254. }
  255. var holder = this.clone.wtTable.holder;
  256. var hider = this.clone.wtTable.hider;
  257. var holderStyle = holder.style;
  258. var hidderStyle = hider.style;
  259. var rootStyle = holder.parentNode.style;
  260. (0, _array.arrayEach)([holderStyle, hidderStyle, rootStyle], function (style) {
  261. style.width = '';
  262. style.height = '';
  263. });
  264. }
  265. /**
  266. * Destroy overlay instance
  267. */
  268. }, {
  269. key: 'destroy',
  270. value: function destroy() {
  271. new _eventManager2.default(this.clone).destroy();
  272. }
  273. }]);
  274. return Overlay;
  275. }();
  276. exports.default = Overlay;