UNPKG

tui-grid

Version:

TOAST UI Grid : Powerful data grid control supported by TOAST UI

163 lines (141 loc) 4.97 kB
/** * @fileoverview Class for the selection layer * @author NHN. FE Development Lab <dl_javascript@nhn.com> */ 'use strict'; var _ = require('underscore'); var View = require('../base/view'); var classNameConst = require('../common/classNameConst'); var CELL_BORDER_WIDTH = require('../common/constMap').dimension.CELL_BORDER_WIDTH; var frameConst = require('../common/constMap').frame; /** * Class for the selection layer * @module view/selectionLayer * @extends module:base/view * @param {object} options Options * @ignore */ var SelectionLayer = View.extend(/** @lends module:view/selectionLayer.prototype */{ initialize: function(options) { _.assign(this, { whichSide: options.whichSide || frameConst.R, dimensionModel: options.dimensionModel, coordRowModel: options.coordRowModel, coordColumnModel: options.coordColumnModel, columnModel: options.columnModel, selectionModel: options.selectionModel }); this._updateColumnWidths(); this.listenTo(this.coordColumnModel, 'columnWidthChanged', this._onChangeColumnWidth); this.listenTo(this.selectionModel, 'change:range', this.render); }, className: classNameConst.LAYER_SELECTION, /** * Updates this.columnWidths * @private */ _updateColumnWidths: function() { this.columnWidths = this.coordColumnModel.getWidths(this.whichSide); }, /** * Event handler for 'columnWidthChanged' evnet on Dimension model. * @private */ _onChangeColumnWidth: function() { this._updateColumnWidths(); this.render(); }, /** * Returns relative column range based on 'this.whichSide' * @private * @param {array} columnRange - Column range indexes. [start, end] * @returns {array} - Relative column range indexes. [start, end] */ _getOwnSideColumnRange: function(columnRange) { var frozenCount = this.columnModel.getVisibleFrozenCount(); var ownColumnRange = null; if (this.whichSide === frameConst.L) { if (columnRange[0] < frozenCount) { ownColumnRange = [ columnRange[0], Math.min(columnRange[1], frozenCount - 1) ]; } } else if (columnRange[1] >= frozenCount) { ownColumnRange = [ Math.max(columnRange[0], frozenCount) - frozenCount, columnRange[1] - frozenCount ]; } return ownColumnRange; }, /** * Returns the object containing 'top' and 'height' css value. * @private * @param {array} rowRange - Row range indexes. [start, end] * @returns {{top: string, height: string}} - css values */ _getVerticalStyles: function(rowRange) { var coordRowModel = this.coordRowModel; var top = coordRowModel.getOffsetAt(rowRange[0]); var bottom = coordRowModel.getOffsetAt(rowRange[1]) + coordRowModel.getHeightAt(rowRange[1]); return { top: top + 'px', height: (bottom - top) + 'px' }; }, /** * Returns the object containing 'left' and 'width' css value. * @private * @param {array} columnRange - Column range indexes. [start, end] * @returns {{left: string, width: string}} - css values */ _getHorizontalStyles: function(columnRange) { var columnWidths = this.columnWidths; var metaColumnCount = this.columnModel.getVisibleMetaColumnCount(); var startIndex = columnRange[0]; var endIndex = columnRange[1]; var left = 0; var width = 0; var i = 0; if (this.whichSide === frameConst.L) { startIndex += metaColumnCount; endIndex += metaColumnCount; } endIndex = Math.min(endIndex, columnWidths.length - 1); for (; i <= endIndex; i += 1) { if (i < startIndex) { left += columnWidths[i] + CELL_BORDER_WIDTH; } else { width += columnWidths[i] + CELL_BORDER_WIDTH; } } width -= CELL_BORDER_WIDTH; // subtract last border width return { left: left + 'px', width: width + 'px' }; }, /** * Render. * @returns {SelectionLayer} this object */ render: function() { var range = this.selectionModel.get('range'); var styles, columnRange; if (range) { columnRange = this._getOwnSideColumnRange(range.column); } if (columnRange) { styles = _.assign({}, this._getVerticalStyles(range.row), this._getHorizontalStyles(columnRange) ); this.$el.show().css(styles); } else { this.$el.hide(); } return this; } }); module.exports = SelectionLayer;