5b0197f4d88ff86a88c0e61044590431c0c0829005fe7ab4f120496aceae7917e7a5d4d7b6f7be13d53fdd469b7e53340a2684bf2669f1515a9b2f5d0762a7 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  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 _number = require('./../../../helpers/number');
  6. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  7. /**
  8. * @class Scroll
  9. */
  10. var Scroll = function () {
  11. /**
  12. * @param {Walkontable} wotInstance
  13. */
  14. function Scroll(wotInstance) {
  15. _classCallCheck(this, Scroll);
  16. this.wot = wotInstance;
  17. // legacy support
  18. this.instance = wotInstance;
  19. }
  20. /**
  21. * Scrolls viewport to a cell by minimum number of cells
  22. *
  23. * @param {CellCoords} coords
  24. */
  25. _createClass(Scroll, [{
  26. key: 'scrollViewport',
  27. value: function scrollViewport(coords) {
  28. if (!this.wot.drawn) {
  29. return;
  30. }
  31. var _getVariables2 = this._getVariables(),
  32. topOverlay = _getVariables2.topOverlay,
  33. leftOverlay = _getVariables2.leftOverlay,
  34. totalRows = _getVariables2.totalRows,
  35. totalColumns = _getVariables2.totalColumns,
  36. fixedRowsTop = _getVariables2.fixedRowsTop,
  37. fixedRowsBottom = _getVariables2.fixedRowsBottom,
  38. fixedColumnsLeft = _getVariables2.fixedColumnsLeft;
  39. if (coords.row < 0 || coords.row > Math.max(totalRows - 1, 0)) {
  40. throw new Error('row ' + coords.row + ' does not exist');
  41. }
  42. if (coords.col < 0 || coords.col > Math.max(totalColumns - 1, 0)) {
  43. throw new Error('column ' + coords.col + ' does not exist');
  44. }
  45. if (coords.row >= fixedRowsTop && coords.row < this.getFirstVisibleRow()) {
  46. topOverlay.scrollTo(coords.row);
  47. } else if (coords.row > this.getLastVisibleRow() && coords.row < totalRows - fixedRowsBottom) {
  48. topOverlay.scrollTo(coords.row, true);
  49. }
  50. if (coords.col >= fixedColumnsLeft && coords.col < this.getFirstVisibleColumn()) {
  51. leftOverlay.scrollTo(coords.col);
  52. } else if (coords.col > this.getLastVisibleColumn()) {
  53. leftOverlay.scrollTo(coords.col, true);
  54. }
  55. }
  56. /**
  57. * Get first visible row based on virtual dom and how table is visible in browser window viewport.
  58. *
  59. * @returns {Number}
  60. */
  61. }, {
  62. key: 'getFirstVisibleRow',
  63. value: function getFirstVisibleRow() {
  64. var _getVariables3 = this._getVariables(),
  65. topOverlay = _getVariables3.topOverlay,
  66. wtTable = _getVariables3.wtTable,
  67. wtViewport = _getVariables3.wtViewport,
  68. totalRows = _getVariables3.totalRows,
  69. fixedRowsTop = _getVariables3.fixedRowsTop;
  70. var firstVisibleRow = wtTable.getFirstVisibleRow();
  71. if (topOverlay.mainTableScrollableElement === window) {
  72. var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement);
  73. var totalTableHeight = (0, _element.innerHeight)(wtTable.hider);
  74. var windowHeight = (0, _element.innerHeight)(window);
  75. var windowScrollTop = (0, _element.getScrollTop)(window);
  76. // Only calculate firstVisibleRow when table didn't filled (from up) whole viewport space
  77. if (rootElementOffset.top + totalTableHeight - windowHeight <= windowScrollTop) {
  78. var rowsHeight = wtViewport.getColumnHeaderHeight();
  79. rowsHeight += topOverlay.sumCellSizes(0, fixedRowsTop);
  80. (0, _number.rangeEachReverse)(totalRows, 1, function (row) {
  81. rowsHeight += topOverlay.sumCellSizes(row - 1, row);
  82. if (rootElementOffset.top + totalTableHeight - rowsHeight <= windowScrollTop) {
  83. // Return physical row + 1
  84. firstVisibleRow = row;
  85. return false;
  86. }
  87. });
  88. }
  89. }
  90. return firstVisibleRow;
  91. }
  92. /**
  93. * Get last visible row based on virtual dom and how table is visible in browser window viewport.
  94. *
  95. * @returns {Number}
  96. */
  97. }, {
  98. key: 'getLastVisibleRow',
  99. value: function getLastVisibleRow() {
  100. var _getVariables4 = this._getVariables(),
  101. topOverlay = _getVariables4.topOverlay,
  102. wtTable = _getVariables4.wtTable,
  103. wtViewport = _getVariables4.wtViewport,
  104. totalRows = _getVariables4.totalRows;
  105. var lastVisibleRow = wtTable.getLastVisibleRow();
  106. if (topOverlay.mainTableScrollableElement === window) {
  107. var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement);
  108. var windowHeight = (0, _element.innerHeight)(window);
  109. var windowScrollTop = (0, _element.getScrollTop)(window);
  110. // Only calculate lastVisibleRow when table didn't filled (from bottom) whole viewport space
  111. if (rootElementOffset.top > windowScrollTop) {
  112. var rowsHeight = wtViewport.getColumnHeaderHeight();
  113. (0, _number.rangeEach)(1, totalRows, function (row) {
  114. rowsHeight += topOverlay.sumCellSizes(row - 1, row);
  115. if (rootElementOffset.top + rowsHeight - windowScrollTop >= windowHeight) {
  116. // Return physical row - 1 (-2 because rangeEach gives row index + 1 - sumCellSizes requirements)
  117. lastVisibleRow = row - 2;
  118. return false;
  119. }
  120. });
  121. }
  122. }
  123. return lastVisibleRow;
  124. }
  125. /**
  126. * Get first visible column based on virtual dom and how table is visible in browser window viewport.
  127. *
  128. * @returns {Number}
  129. */
  130. }, {
  131. key: 'getFirstVisibleColumn',
  132. value: function getFirstVisibleColumn() {
  133. var _getVariables5 = this._getVariables(),
  134. leftOverlay = _getVariables5.leftOverlay,
  135. wtTable = _getVariables5.wtTable,
  136. wtViewport = _getVariables5.wtViewport,
  137. totalColumns = _getVariables5.totalColumns,
  138. fixedColumnsLeft = _getVariables5.fixedColumnsLeft;
  139. var firstVisibleColumn = wtTable.getFirstVisibleColumn();
  140. if (leftOverlay.mainTableScrollableElement === window) {
  141. var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement);
  142. var totalTableWidth = (0, _element.innerWidth)(wtTable.hider);
  143. var windowWidth = (0, _element.innerWidth)(window);
  144. var windowScrollLeft = (0, _element.getScrollLeft)(window);
  145. // Only calculate firstVisibleColumn when table didn't filled (from left) whole viewport space
  146. if (rootElementOffset.left + totalTableWidth - windowWidth <= windowScrollLeft) {
  147. var columnsWidth = wtViewport.getRowHeaderWidth();
  148. (0, _number.rangeEachReverse)(totalColumns, 1, function (column) {
  149. columnsWidth += leftOverlay.sumCellSizes(column - 1, column);
  150. if (rootElementOffset.left + totalTableWidth - columnsWidth <= windowScrollLeft) {
  151. // Return physical column + 1
  152. firstVisibleColumn = column;
  153. return false;
  154. }
  155. });
  156. }
  157. }
  158. return firstVisibleColumn;
  159. }
  160. /**
  161. * Get last visible column based on virtual dom and how table is visible in browser window viewport.
  162. *
  163. * @returns {Number}
  164. */
  165. }, {
  166. key: 'getLastVisibleColumn',
  167. value: function getLastVisibleColumn() {
  168. var _getVariables6 = this._getVariables(),
  169. leftOverlay = _getVariables6.leftOverlay,
  170. wtTable = _getVariables6.wtTable,
  171. wtViewport = _getVariables6.wtViewport,
  172. totalColumns = _getVariables6.totalColumns;
  173. var lastVisibleColumn = wtTable.getLastVisibleColumn();
  174. if (leftOverlay.mainTableScrollableElement === window) {
  175. var rootElementOffset = (0, _element.offset)(wtTable.wtRootElement);
  176. var windowWidth = (0, _element.innerWidth)(window);
  177. var windowScrollLeft = (0, _element.getScrollLeft)(window);
  178. // Only calculate lastVisibleColumn when table didn't filled (from right) whole viewport space
  179. if (rootElementOffset.left > windowScrollLeft) {
  180. var columnsWidth = wtViewport.getRowHeaderWidth();
  181. (0, _number.rangeEach)(1, totalColumns, function (column) {
  182. columnsWidth += leftOverlay.sumCellSizes(column - 1, column);
  183. if (rootElementOffset.left + columnsWidth - windowScrollLeft >= windowWidth) {
  184. // Return physical column - 1 (-2 because rangeEach gives column index + 1 - sumCellSizes requirements)
  185. lastVisibleColumn = column - 2;
  186. return false;
  187. }
  188. });
  189. }
  190. }
  191. return lastVisibleColumn;
  192. }
  193. /**
  194. * Returns collection of variables used to rows and columns visibility calculations.
  195. *
  196. * @returns {Object}
  197. * @private
  198. */
  199. }, {
  200. key: '_getVariables',
  201. value: function _getVariables() {
  202. var wot = this.wot;
  203. var topOverlay = wot.wtOverlays.topOverlay;
  204. var leftOverlay = wot.wtOverlays.leftOverlay;
  205. var wtTable = wot.wtTable;
  206. var wtViewport = wot.wtViewport;
  207. var totalRows = wot.getSetting('totalRows');
  208. var totalColumns = wot.getSetting('totalColumns');
  209. var fixedRowsTop = wot.getSetting('fixedRowsTop');
  210. var fixedRowsBottom = wot.getSetting('fixedRowsBottom');
  211. var fixedColumnsLeft = wot.getSetting('fixedColumnsLeft');
  212. return {
  213. topOverlay: topOverlay,
  214. leftOverlay: leftOverlay,
  215. wtTable: wtTable,
  216. wtViewport: wtViewport,
  217. totalRows: totalRows,
  218. totalColumns: totalColumns,
  219. fixedRowsTop: fixedRowsTop,
  220. fixedRowsBottom: fixedRowsBottom,
  221. fixedColumnsLeft: fixedColumnsLeft
  222. };
  223. }
  224. }]);
  225. return Scroll;
  226. }();
  227. exports.default = Scroll;