all files / dui/src/widget/ Table.js

100% Statements 60/60
90% Branches 27/30
100% Functions 5/5
100% Lines 60/60
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120                                          23×     22× 22× 22×     22× 22×     22× 22× 22× 22× 22×     22×                                             26× 26× 26× 57× 57× 57× 135× 135× 135× 87× 87×   48×   46× 44× 44×     57×   26×        
/**
 * 使用table tr td制作的table
 *
 * @file Table入口
 * @author Brian Li (lbxxlht@163.com)
 */
var define = typeof define === 'function' && define.amd ? define : function (factory) {
    typeof module === 'object' ? (module.exports = factory(require)) : '';
};
 
define(function (require) {
 
    var Controller = require('../core/controller');
    var util = require('../core/util');
    var tpl = require('../tpls/table-tpl');
 
    // public /////////////////////////////////////////////////////////////////
 
    /**
     * Table构造函数
     *
     * @param {Object} param 初始化参数
     * @param {Array.<Fields>} param.fields 列配置
     * @param {Array.<Object>} param.datasource 数据源
     * @return {Table} Table实例
     */
    function Table(param) {
 
        if (!(this instanceof Table)) {
            return new Table(param);
        }
 
        param = param || {};
        param.fields = param.fields || [];
        param.datasource = param.datasource || [];
 
        // 获取原始模板
        var tplString = tpl(param);
        param.tpl = tplString;
 
        // 预处理数据源
        var originalDatasource = param.datasource;
        param.datasource = {};
        param.datasource.__datasource__ = originalDatasource;
        param.datasource.__fields__ = param.fields;
        param.datasource.__prepare__ = prepare;
 
        // 调用父类初始化
        Controller.call(this, param);
    }
 
    util.inherit(Table, Controller);
 
    /**
     * 根据鼠标响应的DOM获取该DOM所在的单元格
     *
     * @param {HtmlElement} dom 鼠标响应的DOM
     * @return {Array.<number>} [row, column]单元格坐标;[-1, -1]代表表格;[-1, n] 代表表头
     */
    Table.prototype.getMouseAxis = function (dom) {
        var row = -1;
        var column = -1;
        var classes = dom.className.split(' ');
        if (classes.indexOf('table') > -1) {
            return [row, column];
        }
        var dataset = util.getDataset(dom);
        column = parseInt(dataset.uiColumn, 10);
        row = parseInt(dataset.uiRow, 10);
        while (isNaN(column) && dom.tagName !== 'BODY') {
            dom = dom.parentNode;
            dataset = util.getDataset(dom);
            column = parseInt(dataset.uiColumn, 10);
            row = parseInt(dataset.uiRow, 10);
        }
        column = isNaN(column) ? -1 : column;
        row = isNaN(row) ? -1 : row;
        return [row, column];
    };
 
    // private ///////////////////////////////////////////////////////
 
    /**
     * 表格数据预处理
     * 将用户传入的一维对象数组,根据fields配置,翻译成可直接渲染的二维数组
     *
     * @param {Array.<Object>} it 原始数据源
     * @return {Array.<Array>} 可渲染数据源,导入模板引擎的数据源
     */
    function prepare(it) {
        var result = [];
        var fields = this.__fields__;
        for (var n = 0; n < it.length; n++) {
            var row = [];
            var item = it[n];
            for (var m = 0; m < fields.length; m++) {
                var content = fields[m].content;
                var field = fields[m].field;
                if (!content && typeof field === 'string') {
                    row.push(item[field]);
                    continue;
                }
                if (typeof content === 'string') {
                    row.push(item[content]);
                    continue;
                }
                if (typeof content === 'function') {
                    row.push(content(item));
                    continue;
                }
                row.push('');
            }
            result.push(row);
        }
        return result;
    }
 
    return Table;
});