tui-grid
Version:
TOAST UI Grid : Powerful data grid control supported by TOAST UI
176 lines (148 loc) • 5.56 kB
JavaScript
/**
* @fileoverview Painter class for the row(TR) views
* @author NHN. FE Development Lab <dl_javascript@nhn.com>
*/
;
var _ = require('underscore');
var snippet = require('tui-code-snippet');
var Painter = require('../base/painter');
var constMap = require('../common/constMap');
var classNameConst = require('../common/classNameConst');
var attrNameConst = constMap.attrName;
var CELL_BORDER_WIDTH = constMap.dimension.CELL_BORDER_WIDTH;
/**
* Painter class for the row(TR) views
* @module painter/row
* @extends module:base/painter
* @param {object} options - Options
* @ignore
*/
var RowPainter = snippet.defineClass(Painter, /** @lends module:painter/row.prototype */{
init: function(options) {
Painter.apply(this, arguments);
this.painterManager = options.painterManager;
},
/**
* css selector to find its own element(s) from a parent element.
* @type {String}
*/
selector: 'tr',
/**
* markup template
* @returns {String} HTML string
*/
template: _.template(
'<tr ' +
'<%=rowKeyAttr%> ' +
'class="<%=className%>" ' +
'style="height:<%=height%>px;">' +
'<%=contents%>' +
'</tr>'
),
/**
* cellData 의 isEditable 프로퍼티에 따른 editType 을 반환한다.
* editable 프로퍼티가 false 라면 normal type 으로 설정한다.
* @param {string} columnName 컬럼명
* @param {Object} cellData 셀 데이터
* @returns {string} cellFactory 에서 사용될 editType
* @private
*/
_getEditType: function(columnName, cellData) {
var editType = snippet.pick(cellData.columnModel, 'editOptions', 'type');
return editType || 'normal';
},
/**
* Get cell painter by value
* @param {boolean} treeCell - Whether the current cell is tree-cell or not
* @param {string} editType - When the current cell is normal, the cell type is selected
* @returns {object} cell painter
*/
_getCellPainter: function(treeCell, editType) {
var cellPainter;
if (treeCell) {
cellPainter = this.painterManager.getTreeCellPainter();
} else {
cellPainter = this.painterManager.getCellPainter(editType);
}
return cellPainter;
},
/**
* Returns the HTML string of all cells in Dummy row.
* @param {Number} rowNum - row number
* @param {Array.<String>} columnNames - An array of column names
* @returns {String} HTLM string
* @private
*/
_generateHtmlForDummyRow: function(rowNum, columnNames) {
var cellPainter = this.painterManager.getCellPainter('dummy');
var html = '';
_.each(columnNames, function(columnName) {
html += cellPainter.generateHtml(rowNum, columnName);
});
return html;
},
/**
* Returns the HTML string of all cells in Actual row.
* @param {module:model/row} model - View model instance
* @param {Array.<String>} columnNames - An array of column names
* @returns {String} HTLM string
* @private
*/
_generateHtmlForActualRow: function(model, columnNames) {
var html = '';
_.each(columnNames, function(columnName) {
var cellData = model.get(columnName);
var treeCell, editType, cellPainter;
if (cellData && cellData.isMainRow) {
treeCell = !!cellData.tree;
editType = this._getEditType(columnName, cellData);
cellPainter = this._getCellPainter(treeCell, editType);
html += cellPainter.generateHtml(cellData);
}
}, this);
return html;
},
/**
* Returns the HTML string of all cells in the given model (row).
* @param {module:model/row} model - View model instance
* @param {Array.<String>} columnNames - An array of column names
* @returns {String} HTLM string
*/
generateHtml: function(model, columnNames) {
var rowKey = model.get('rowKey');
var rowNum = model.get('rowNum');
var className = (rowNum % 2) ? classNameConst.ROW_ODD : classNameConst.ROW_EVEN;
var rowKeyAttr = '';
var html;
if (_.isUndefined(rowKey)) {
html = this._generateHtmlForDummyRow(rowNum, columnNames);
} else {
rowKeyAttr = attrNameConst.ROW_KEY + '="' + rowKey + '"';
html = this._generateHtmlForActualRow(model, columnNames);
}
return this.template({
rowKeyAttr: rowKeyAttr,
height: model.get('height') + CELL_BORDER_WIDTH,
contents: html,
className: className
});
},
/**
* Refreshes the row(TR) element.
* @param {object} changed - object that contains the changed data using columnName as keys
* @param {jQuery} $tr - jquery object for tr element
*/
refresh: function(changed, $tr) {
_.each(changed, function(cellData, columnName) {
var treeCell, editType, cellPainter, $td;
if (columnName !== '_extraData') {
$td = $tr.find('td[' + attrNameConst.COLUMN_NAME + '="' + columnName + '"]');
editType = this._getEditType(columnName, cellData);
treeCell = !!cellData.tree;
cellPainter = this._getCellPainter(treeCell, editType);
cellPainter.refresh(cellData, $td);
}
}, this);
}
});
module.exports = RowPainter;