kero
Version:
<img src="http://tinper.org/assets/images/kero.png" width="120" style="max-width:100%;"/>
1,785 lines (1,641 loc) • 162 kB
JavaScript
/**
* kero v3.2.5
*
* author : yonyou FED
* homepage : https://github.com/iuap-design/kero#readme
* bugs : https://github.com/iuap-design/kero/issues
*/
(function (exports) {
'use strict';
/**
* Module : Sparrow extend enum
* Author : Kvkens(yueming@yonyou.com)
* Date : 2016-07-27 21:46:50
*/
var U_LANGUAGES = "i_languages";
var U_THEME = "u_theme";
var U_LOCALE = "u_locale";
var U_USERCODE = "usercode";
var enumerables = true;
var enumerablesTest = {
toString: 1
};
for(var i in enumerablesTest) {
enumerables = null;
}
if(enumerables) {
enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable',
'toLocaleString', 'toString', 'constructor'
];
}
/**
* Module : Sparrow extend
* Author : Kvkens(yueming@yonyou.com)
* Date : 2016-07-27 21:46:50
*/
/**
* 复制对象属性
*
* @param {Object} 目标对象
* @param {config} 源对象
*/
var extend = function(object, config) {
var args = arguments,
options;
if(args.length > 1) {
for(var len = 1; len < args.length; len++) {
options = args[len];
if(object && options && typeof options === 'object') {
var i, j, k;
for(i in options) {
object[i] = options[i];
}
if(enumerables) {
for(j = enumerables.length; j--;) {
k = enumerables[j];
if(options.hasOwnProperty && options.hasOwnProperty(k)) {
object[k] = options[k];
}
}
}
}
}
}
return object;
};
if(!Object.assign){
Object.assign = extend;
}
/**
* Module : kero DataTable copyRow
* Author : liuyk(liuyk@yonyou.com)
* Date : 2016-08-01 14:34:01
*/
/**
* 在指定index位置插入单条数据行
* @memberof DataTable
* @param {number} index 数据行插入之后的位置
* @param {object} row 数据行信息
* @example
* var row = {
* field1:'value1'
* }
* datatable.copyRow(1,row)
*/
var copyRow = function copyRow(index, row) {
this.copyRows(index, [row]);
};
/**
* 在指定index位置插入多条数据行
* @memberof DataTable
* @param {number} index 数据行插入之后的位置
* @param {array} rows 存储数据行信息的数组
* @example
* var row1 = {
* field1:'value1'
* }
* var row2 = {
* field1:'value1'
* }
* datatable.copyRow(1,[row1,row2])
*/
var copyRows = function copyRows(index, rows) {
for (var i = 0; i < rows.length; i++) {
var newRow = new Row({
parent: this
});
if (rows[i]) {
newRow.setData(rows[i].getData());
}
this.insertRows(index === undefined ? this.rows().length : index, [newRow]);
}
};
var copyRowFunObj = {
copyRow: copyRow,
copyRows: copyRows
};
/**
* Module : kero DataTable data
* Author : liuyk(liuyk@yonyou.com)
* Date : 2016-07-30 14:34:01
*/
/**
* 设置数据信息
* @memberof DataTable
* @param {object} data 需要设置的数据信息,必须包含rows或者pages属性
* @param {array} [data.rows] 数据信息中的行信息数组
* @param {array} [data.pages] 数据信息中的page对象数组
* @param {number} [data.pageIndex=DataTable对象当前的页码] 数据信息中的当前页码
* @param {number} [data.pageSize=DataTable对象当前的每页显示条数] 数据信息中的每页显示条数
* @param {number} [data.totalPages=DataTable对象当前的总页数] 数据信息中的总页数
* @param {number} [data.totalRow=如果存在rows则为rows的长度,否则为DataTable对象当前的总条数] 数据信息中的总条数
* @param {number} [data.select] 数据信息中的选中行行号
* @param {number} [data.focus] 数据信息中的focus行行号
* @param {object} options 设置数据时的配置参数
* @param {boolean} options.unSelect=false 是否默认选中第一行,如果为true则不选中第一行,否则选中第一行
* @example
* // 不包含分页的情况
* var data = {
* pageIndex:0,
* pageSize:5,
* totalPages:5,
* totalRow:22,
* rows:[{
* id:'r41201', // 如果需要添加
* status:'nrm', // 如果需要添加
* data:{
* field1:'value1',
* field2:'value2'
* }
* },{
* id:'r41202',
* status:'nrm',
* data:{
* field1:'value11',
* field2:'value21'
* }
* },...],
* select:[0]
* }
* // 包含分页的情况
* var data = {
* pageIndex:0,
* pageSize:5,
* totalPages:5,
* totalRow:22,
* pages:[{
* index: 0,
* select: [],
* current: -1,
* rows:[{
* id:'r41201', // 如果需要添加
* status:'nrm', // 如果需要添加
* data:{
* field1:'value1',
* field2:'value2'
* }
* },{
* id:'r41202',
* status:'nrm',
* data:{
* field1:'value11',
* field2:'value21'
* }
* },...]
* },...],
* }
* var op = {
* unSelect:true
* }
* datatable.setData(data,op)
*/
var setData = function setData(data, options) {
if (data.pageIndex || data.pageIndex === 0) {
var newIndex = data.pageIndex;
} else {
var newIndex = this.pageIndex();
}
if (data.pageSize || data.pageSize === 0) {
var newSize = data.pageSize;
} else {
var newSize = this.pageSize();
}
if (data.totalPages || data.totalPages === 0) {
var newTotalPages = data.totalPages;
} else {
var newTotalPages = this.totalPages();
}
if (data.totalRow || data.totalRow === 0) {
var newTotalRow = data.totalRow;
} else {
if (data.rows) var newTotalRow = data.rows.length;else var newTotalRow = this.totalRow();
}
var select,
focus,
unSelect = options ? options.unSelect : false;
this.pageIndex(newIndex);
this.pageSize(newSize);
this.pageCache = data.pageCache || this.pageCache;
if (this.pageCache === true) {
this.updatePages(data.pages);
if (newIndex != this.pageIndex()) {
this.setCurrentPage(newIndex, true);
this.totalPages(newTotalPages);
this.totalRow(newTotalRow + this.newCount);
return;
} else {
// 首先删除数据,然后将当前页数据插入
this.removeAllRows();
select = this.getPage(newIndex).selectedIndices;
focus = this.getPage(newIndex).focus;
var rows = this.setRows(this.getPage(newIndex).rows, options);
this.getPage(newIndex).rows = rows;
}
// 后台传入totalPages及totalRow才进行更新
if (data.totalPages) {
this.totalPages(data.totalPages);
}
if (data.totalRow || data.totalRow === 0) {
this.totalRow(data.totalRow + this.newCount);
}
} else {
select = data.select || (!unSelect ? [0] : []);
focus = data.focus !== undefined ? data.focus : data.current;
this.setRows(data.rows, options);
this.totalPages(newTotalPages);
this.totalRow(newTotalRow);
}
this.updateSelectedIndices();
if (select && select.length > 0 && this.rows().length > 0) this.setRowsSelect(select);
if (focus !== undefined && this.getRow(focus)) this.setRowFocus(focus);
};
/**
* 设置对应行对应字段的值
* @memberof DataTable
* @param {string} fieldName 需要设置的字段
* @param {string} value 需要设置的值
* @param {u.row} [row=当前行] 需要设置的u.row对象,
* @param {*} [ctx] 自定义属性,在valuechange监听传入对象中可通过ctx获取此处设置
* @param {string} validType 传递值的字符类型,如string,integer等
* @example
* datatable.setValue('filed1','value1') //设置当前行字段值
* var row = datatable.getRow(1)
* datatable.setValue('filed1','value1',row) //设置在指定行字段值
* datatable.setValue('filed1','value1',row,'ctx') //设置在指定行字段值,同时传入自定义数据
*/
var setValue = function setValue(fieldName, value, row, ctx, validType) {
if (arguments.length === 1) {
value = fieldName;
fieldName = '$data';
}
row = row ? row : this.getCurrentRow();
if (row) row.setValue(fieldName, value, ctx, undefined, validType);
};
/**
* 重置所有行的数据至nrm状态时的数据
*/
var resetAllValue = function resetAllValue() {
var rows = new Array();
rows = rows.concat(this.rows());
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
this.resetValueByRow(row);
}
};
/**
* 根据row对象重置数据至nrm状态时的数据
* @param {u.row} row 需要重置数据的row对象
*/
var resetValueByRow = function resetValueByRow(row) {
if (row.status == Row.STATUS.NEW) {
this.setRowsDelete(row);
} else if (row.status == Row.STATUS.FALSE_DELETE) {
row.status = Row.STATUS.NORMAL;
var rows = [row];
this.trigger(DataTable.ON_INSERT, {
index: 0,
rows: rows
});
} else if (row.status == Row.STATUS.UPDATE) {
row.status = Row.STATUS.NORMAL;
row.resetValue();
}
};
var dataFunObj = {
setData: setData,
setValue: setValue,
resetAllValue: resetAllValue,
resetValueByRow: resetValueByRow
};
/**
* Module : kero DataTable enable
* Author : liuyk(liuyk@yonyou.com)
* Date : 2016-08-08 09:59:01
*/
/**
* 判断DataTable或指定字段是否可修改
* @memberof DataTable
* @param {string} [fieldName] 需要进行判断的字段值
* @return {boolean} DataTable/指定字段是否可修改
* @example
* datatable.isEnable() //获取datatable是否可修改
* datatable.isEnable('field1') //获取字段field1是否可修改
*/
var isEnable = function isEnable(fieldName) {
var fieldEnable = this.getMeta(fieldName, 'enable');
if (typeof fieldEnable == 'undefined' || fieldEnable == null) fieldEnable = true;
return fieldEnable && this.enable;
};
/**
* 设置DataTable是否可修改
* @memberof DataTable
* @param {boolean} enable true表示可修改,否则表示不可修改
* @example
* datatable.setEnable(true)
*/
var setEnable = function setEnable(enable) {
if (this.enable == enable) return;
//当传入的参数不为false时,默认enable为true
if (enable === false) {
enable = false;
} else {
enable = true;
}
this.enable = enable;
this.enableChange(-this.enableChange());
this.trigger(DataTable.ON_ENABLE_CHANGE, {
enable: this.enable
});
};
var enableFunObj = {
isEnable: isEnable,
setEnable: setEnable
};
/**
* Module : kero DataTable getCurrent
* Author : liuyk(liuyk@yonyou.com)
* Date : 2016-08-08 09:59:01
*/
/**
* 获取DataTable对象的当前行
* @memberof DataTable
* @return {null|u.Row} DataTable对象的当前行
* @example
* datatable.getCurrentRow()
*/
var getCurrentRow = function getCurrentRow() {
if (this.focusIndex() != -1) return this.getFocusRow();
var index = this.getSelectedIndex();
if (index == -1) return null;else return this.getRow(index);
};
/**
* 获取DataTable对象的当前行对应的index
* @memberof DataTable
* @return {number} DataTable对象的当前行对应的index
* @example
* datatable.getCurrentIndex()
*/
var getCurrentIndex = function getCurrentIndex() {
if (this.focusIndex() != -1) return this.focusIndex();
var index = this.getSelectedIndex();
if (index == -1) return -1;else return index;
};
var getCurrentFunObj = {
getCurrentRow: getCurrentRow,
getCurrentIndex: getCurrentIndex
};
/**
* Module : kero DataTable getData
* Author : liuyk(liuyk@yonyou.com)
* Date : 2016-07-30 14:34:01
*/
/**
* 获取DataTable的数据信息
* @memberof DataTable
* @return {array} 数据信息对应的数组,每项对应一条数据
* @example
* datatable.getData()
*/
var getData = function getData() {
var datas = [],
rows = this.rows();
for (var i = 0; i < rows.length; i++) {
datas.push(rows[i].getData());
}
return datas;
};
// 将page转为row对象格式
var page2data = function page2data(page, pageIndex) {
var data = {};
data.focus = page.focus;
data.index = pageIndex;
data.select = page.selectedIndices;
return data;
};
/**
* 按照特定规则获取数据
* @memberof DataTable
* @param {string} rule
* DataTable.SUBMIT.current('current') :当前选中行
* DataTable.SUBMIT.focus('focus') :当前focus行
* DataTable.SUBMIT.all('all') :所有行
* DataTable.SUBMIT.select('select') :当前页选中行
* DataTable.SUBMIT.change('change') :发生改变的行
* DataTable.SUBMIT.empty('empty') :不获取数据,返回空数组
* DataTable.SUBMIT.allSelect('allSelect') :所有页选中行
* DataTable.SUBMIT.allPages('allPages') :所有页的数据
* @return {array} 按照规则获取到的数据信息
* @example
* datatable.getDataByRule(‘all’)
*/
var getDataByRule = function getDataByRule(rule) {
var returnData = {},
datas = null,
rows;
returnData.meta = this.meta;
returnData.params = this.params;
rule = rule || DataTable.SUBMIT.current;
// 存在多页及不存在多页分开处理
if (this.pageCache) {
var pages = this.getPages();
if (rule == DataTable.SUBMIT.current || rule == DataTable.SUBMIT.focus) {
datas = [];
var pageIndex = this.pageIndex();
var currPage = pages[pageIndex];
if (currPage) {
var currIndex = this.focusIndex();
if (rule == DataTable.SUBMIT.current) {
if (currIndex == -1) currIndex = this.getSelectedIndex();
}
var data = page2data(currPage, pageIndex);
data.rows = [];
for (var i = 0, count = currPage.rows.length; i < count; i++) {
var row = currPage.rows[i].getData();
if (i != currIndex) row.data = {};
data.rows.push(row);
}
datas.push(data);
}
} else if (rule == DataTable.SUBMIT.all || rule == DataTable.SUBMIT.allPages) {
datas = [];
for (var i = 0; i < pages.length; i++) {
var currPage = pages[i];
var data = page2data(currPage, i);
data.rows = [];
for (var i = 0; i < currPage.rows.length; i++) {
data.rows.push(currPage.rows[i].getData());
}
datas.push(data);
}
} else if (rule == DataTable.SUBMIT.select) {
datas = [];
var pageIndex = this.pageIndex();
var currPage = pages[pageIndex];
if (currPage) {
var data = page2data(currPage, pageIndex);
data.rows = [];
for (var i = 0, count = currPage.rows.length; i < count; i++) {
var row = currPage.rows[i].getData();
if (data.select.indexOf(i) < 0) row.data = {};
data.rows.push(row);
}
datas.push(data);
}
} else if (rule == DataTable.SUBMIT.allSelect) {
datas = [];
for (var i = 0; i < pages.length; i++) {
var currPage = pages[i];
var data = page2data(currPage, i);
data.rows = [];
for (var j = 0, count = currPage.rows.length; j < count; j++) {
var row = currPage.rows[j].getData();
if (data.select.indexOf(j) < 0) row.data = {};
data.rows.push(row);
}
datas.push(data);
}
} else if (rule == DataTable.SUBMIT.change) {
datas = [];
for (var i = 0; i < pages.length; i++) {
var currPage = pages[i];
var data = page2data(currPage, i);
data.rows = [];
for (var j = 0, count = currPage.rows.length; j < count; j++) {
var row = currPage.rows[j].getData();
if (row.status == Row.STATUS.NORMAL) {
row.data = {};
}
data.rows.push(row);
}
datas.push(data);
}
} else if (rule === DataTable.SUBMIT.empty) {
datas = [];
}
if (pages.length < 1 || !pages[this.pageIndex()]) {
datas = [{
index: this.pageIndex(),
select: [],
focus: -1,
rows: []
}];
}
returnData.pages = datas;
} else {
if (rule == DataTable.SUBMIT.current) {
datas = [];
var currIndex = this.focusIndex();
if (currIndex == -1) currIndex = this.getSelectedIndex();
rows = this.rows();
for (var i = 0, count = rows.length; i < count; i++) {
if (i == currIndex) datas.push(rows[i].getData());else datas.push(rows[i].getEmptyData());
}
} else if (rule == DataTable.SUBMIT.focus) {
datas = [];
rows = this.rows();
for (var i = 0, count = rows.length; i < count; i++) {
if (i == this.focusIndex()) datas.push(rows[i].getData());else datas.push(rows[i].getEmptyData());
}
} else if (rule == DataTable.SUBMIT.all) {
datas = this.getData();
} else if (rule == DataTable.SUBMIT.select) {
datas = this.getSelectedDatas(true);
} else if (rule == DataTable.SUBMIT.change) {
datas = this.getChangedDatas();
} else if (rule === DataTable.SUBMIT.empty) {
datas = [];
}
returnData.rows = datas;
returnData.select = this.getSelectedIndexs();
returnData.focus = this.getFocusIndex();
}
returnData.pageSize = this.pageSize();
returnData.pageIndex = this.pageIndex();
returnData.isChanged = this.isChanged();
returnData.master = this.master;
returnData.pageCache = this.pageCache;
return returnData;
};
/**
* 根据索引获取指定行数据信息
* @memberof DataTable
* @param {number} index 需要获取的数据信息的索引
* @return {object} 获取到的指定行数据信息
* @example
* datatable.getRow(1)
*/
var getRow = function getRow(index) {
//return this.rows()[index] //modify by licza. improve performance
return this.rows.peek()[index];
};
// 获取子表的数据行
var getChildRow = function getChildRow(obj) {
var fullField = obj.fullField,
index = obj.index,
row = null;
if (parseInt(index) > -1) {
if ((index + '').indexOf('.') > 0) {
var fieldArr = fullField.split('.');
var indexArr = index.split('.');
var nowDataTable = this;
var nowRow = null;
for (var i = 0; i < indexArr.length; i++) {
nowRow = nowDataTable.getRow(indexArr[i]);
if (i < indexArr.length - 1) {
if (nowRow) {
nowDataTable = nowRow.getValue(fieldArr[i]);
} else {
nowRow = null;
break;
}
}
}
row = nowRow;
} else {
row = this.getRow(index);
}
}
return row;
};
/**
* 根据rowid获取Row对象
* @memberof DataTable
* @param {string} rowid 需要获取的Row对应的rowid
* @returns {Row}
* @example
* datatable.getRowByRowId('rowid')
*/
var getRowByRowId = function getRowByRowId(rowid) {
var rows = this.rows.peek();
for (var i = 0, count = rows.length; i < count; i++) {
if (rows[i].rowId == rowid) return rows[i];
}
return null;
};
/**
* 获取Row对象对应的索引
* @memberof DataTable
* @param {u.Row} 需要获取索引的row对象
* @returns {*}
* @example
* var row = datatable.getRow(1)
* datatable.getRowIndex(row) // 1
*/
var getRowIndex = function getRowIndex(row) {
var rows = this.rows.peek();
for (var i = 0, count = rows.length; i < count; i++) {
if (rows[i].rowId === row.rowId) return i;
}
return -1;
};
/**
* 根据字段及字段值获取所有数据行
* @memberof DataTable
* @param {string} field 需要获取行的对应字段
* @param {string} value 需要获取行的对应字段值
* @return {array} 根据字段及字段值获取的所有数据行
* @example
* datatable.getRowsByField('field1','value1')
*/
var getRowsByField = function getRowsByField(field, value) {
var rows = this.rows.peek();
var returnRows = new Array();
for (var i = 0, count = rows.length; i < count; i++) {
if (rows[i].getValue(field) === value) returnRows.push(rows[i]);
}
return returnRows;
};
/**
* 根据多个字段及字段值获取所有数据行
* @memberof DataTable
* @param {string} fields 需要获取行的对应字段及对应值数组
* @return {array} 根据字段及字段值获取的所有数据行
* @example
* datatable.getRowsByFields([{field:'field1',value:'value1'},{field:'field2',value:'value2'}])
*/
var getRowsByFields = function getRowsByFields(fileds) {
var rows = this.rows.peek();
var returnRows = new Array();
if (fileds && fileds.length > 0) {
for (var i = 0, count = rows.length; i < count; i++) {
var matchCount = 0;
var l = fileds.length;
for (var j = 0; j < l; j++) {
if (rows[i].getValue(fileds[j]['field']) === fileds[j]['value']) matchCount++;
}
if (matchCount == l) returnRows.push(rows[i]);
}
}
return returnRows;
};
/**
* 根据字段及字段值获取第一条数据行
* @memberof DataTable
* @param {string} field 需要获取行的对应字段
* @param {string} value 需要获取行的对应字段值
* @return {u.Row} 根据字段及字段值获取第一条数据行
* @example
* datatable.getRowByField('field1','value1')
*/
var getRowByField = function getRowByField(field, value) {
var rows = this.rows.peek();
for (var i = 0, count = rows.length; i < count; i++) {
if (rows[i].getValue(field) === value) return rows[i];
}
return null;
};
/**
* 获取当前页的所有数据行
* @memberof DataTable
* @return {array} 获取到的数据行
* @example
* datatable.getAllRows()
*/
var getAllRows = function getAllRows() {
return this.rows.peek();
};
/**
* 获取所有页的所有数据行
* @memberof DataTable
* @return {array} 获取到的数据行
* @example
* datatable.getAllPageRows()
*/
var getAllPageRows = function getAllPageRows() {
var datas = [],
rows;
for (var i = 0; i < this.totalPages(); i++) {
rows = [];
if (i == this.pageIndex()) {
rows = this.getData();
} else {
var page = this.cachedPages[i];
if (page) {
rows = page.getData();
}
}
for (var j = 0; j < rows.length; j++) {
datas.push(rows[j]);
}
}
return datas;
};
/**
* 获取发生变化的数据信息
* @memberof DataTable
* @param {boolean} withEmptyRow=false 未发生变化的数据是否使用空行代替,true表示以空行代替未发生变化行,false相反
* @return {array} 发生变化的数据信息
* @example
* datatable.getChangedDatas()
*/
var getChangedDatas = function getChangedDatas(withEmptyRow) {
var datas = [],
rows = this.rows();
for (var i = 0, count = rows.length; i < count; i++) {
if (rows[i] && rows[i].status != Row.STATUS.NORMAL) {
datas.push(rows[i].getData());
} else if (withEmptyRow == true) {
datas.push(rows[i].getEmptyData());
}
}
return datas;
};
/**
* 获取发生改变的Row对象
* @memberof DataTable
* @return {array} 发生改变的Row对象
* @example
* datatable.getChangedRows()
*/
var getChangedRows = function getChangedRows() {
var changedRows = [],
rows = this.rows.peek();
for (var i = 0, count = rows.length; i < count; i++) {
if (rows[i] && rows[i].status != Row.STATUS.NORMAL) {
changedRows.push(rows[i]);
}
}
return changedRows;
};
var getDeleteRows = function getDeleteRows() {
var deleteRows = [],
rows = this.rows.peek();
for (var i = 0, count = rows.length; i < count; i++) {
if (rows[i] && rows[i].status == Row.STATUS.FALSE_DELETE) {
deleteRows.push(rows[i]);
}
}
return deleteRows;
};
/**
* 根据字段获取对应Row对象的字段值
* @memberof DataTable
* @param {string} fieldName 需要获取的值对应的字段
* @param {u.Row} [row=默认为当前行] 对应的数据行
* @return {string} 获取到的字段值
* @example
* datatable.getValue('field1')
* var row = datatable.getRow(1)
* datatable.getValue('field1',row)
*/
var getValue = function getValue(fieldName, row) {
row = row || this.getCurrentRow();
if (row) return row.getValue(fieldName);else return '';
};
/**
* 根据行号获取行索引
* @memberof DataTable
* @param {String} rowId
* @example
* datatable.getIndexByRowId('rowid')
*/
var getIndexByRowId = function getIndexByRowId(rowId) {
var rows = this.rows();
for (var i = 0, count = rows.length; i < count; i++) {
if (rows[i].rowId == rowId) return i;
}
return -1;
};
/**
* 获取所有行数据信息
* @memberof DataTable
* @return {array} 所有行数据信息
* @example
* datatable.getAllDatas()
*/
var getAllDatas = function getAllDatas() {
var rows = this.getAllRows();
var datas = [];
for (var i = 0, count = rows.length; i < count; i++) {
if (rows[i]) datas.push(rows[i].getData());
}return datas;
};
/**
* 根据索引获取rowid
* @memberof DataTable
* @param {array} indices 需要获取rowid的索引值
* @return {array} 获取到的rowid
* @example
* datatable.getRowIdsByIndices([1,2,5])
*/
var getRowIdsByIndices = function getRowIdsByIndices(indices) {
var rowIds = [];
for (var i = 0; i < indices.length; i++) {
if (this.getRow(indices[i])) rowIds.push(this.getRow(indices[i]).rowId);
}
return rowIds;
};
/**
* 根据索引获取row
* @memberof DataTable
* @param {array} indices 需要获取rowid的索引值
* @return {array} 获取到的row
* @example
* datatable.getRowIdsByIndices([1,2,5])
*/
var getRowsByIndices = function getRowsByIndices(indices) {
var rows = [];
for (var i = 0; i < indices.length; i++) {
rows.push(this.getRow(indices[i]));
}
return rows;
};
var getDataFunObj = {
getData: getData,
getDataByRule: getDataByRule,
getRow: getRow,
getChildRow: getChildRow,
getRowByRowId: getRowByRowId,
getRowIndex: getRowIndex,
getRowsByField: getRowsByField,
getRowByField: getRowByField,
getAllRows: getAllRows,
getAllPageRows: getAllPageRows,
getChangedDatas: getChangedDatas,
getChangedRows: getChangedRows,
getDeleteRows: getDeleteRows,
getValue: getValue,
getIndexByRowId: getIndexByRowId,
getAllDatas: getAllDatas,
getRowIdsByIndices: getRowIdsByIndices,
getRowsByIndices: getRowsByIndices,
getRowsByFields: getRowsByFields
};
/**
* Module : kero dataTable getFocus
* Author : liuyk(liuyk@yonyou.com)
* Date : 2016-08-08 09:59:01
*/
/**
* 获取焦点行
* @memberof DataTable
* @return {u.Row} 焦点行
* @example
* datatable.getFocusRow()
*/
var getFocusRow = function getFocusRow() {
if (this.focusIndex() != -1) return this.getRow(this.focusIndex());else return null;
};
/**
* 获取焦点行索引
* @memberof DataTable
* @return {number} 焦点行索引
* @example
* datatable.getFocusIndex()
*/
var getFocusIndex = function getFocusIndex() {
return this.focusIndex();
};
var getFocusFunObj = {
getFocusRow: getFocusRow,
getFocusIndex: getFocusIndex
};
/**
* Module : kero dataTable getMete
* Author : liuyk(liuyk@yonyou.com)
* Date : 2016-07-30 14:34:01
*/
/**
* 获取meta信息
* @memberof DataTable
* @param {string} [fieldName] 需要获取的字段
* @param {string} [key] 需要获取的字段指定meta信息
* @return {object} meta信息
* @example
* datatable.getMeta() // 获取所有meta信息
* datatable.getMeta('field1') // 获取field1所有meta信息
* datatable.getMeta('field1','type') // 获取field1的key信息
*/
var getMeta = function getMeta(fieldName, key) {
if (arguments.length === 0) return this.meta;else if (arguments.length === 1) return this.meta[fieldName];
if (this.meta[fieldName] && typeof this.meta[fieldName][key] !== 'undefined') {
return this.meta[fieldName][key];
} else {
return null;
}
};
/**
* 获取当前行的meta信息,如果不存在当前行则获取DataTable的meta信息
* @memberof DataTable
* @param {string} [fieldName] 需要获取的字段
* @param {string} [key] 需要获取的字段指定meta信息
* @return {object} meta信息
* @example
* datatable.getRowMeta() // 获取当前行所有meta信息
* datatable.getRowMeta('field1') // 获取当前行field1所有meta信息
* datatable.getRowMeta('field1','type') // 获取当前行field1的key信息
*/
var getRowMeta = function getRowMeta(fieldName, key) {
var row = this.getCurrentRow();
if (row) return row.getMeta(fieldName, key);else return this.getMeta(fieldName, key);
};
var getMetaFunObj = {
getMeta: getMeta,
getRowMeta: getRowMeta
};
/**
* Module : kero dataTable getPage
* Author : liuyk(liuyk@yonyou.com)
* Date : 2016-08-01 14:34:01
*/
/**
* 获取指定索引的Page对象
* @memberof DataTable
* @param {number} pageIndex 需要获取的page对应的索引
* @return {Page|-1} 获取到的Page对象,不存在则返回-1
* @example
* datatable.getPage(1)
*/
var getPage = function getPage(pageIndex) {
if (this.pageCache) {
return this.cachedPages[pageIndex];
}
return -1;
};
/**
* 获取所有的Page对象
* @memberof DataTable
* @return {array} 所有的Page对象
* @example
* datatable.getPages()
*/
var getPages = function getPages() {
if (this.pageCache) {
return this.cachedPages;
}
return [];
};
var getPageFunObj = {
getPage: getPage,
getPages: getPages
};
/**
* Module : kero dataTable getParam
* Author : liuyk(liuyk@yonyou.com)
* Date : 2016-07-30 14:34:01
*/
/**
* 获取Param参数值
* @memberof DataTable
* @param {string} key Param对应的key
* @return {*} Param参数值
* @example
* datatable.getParam('param1')
*/
var getParam = function getParam(key) {
return this.params[key];
};
var getParamFunObj = {
getParam: getParam
};
/**
* Module : kero dataTable getSelect
* Author : liuyk(liuyk@yonyou.com)
* Date : 2016-08-01 14:34:01
*/
/**
* 获取选中行索引,多选时,只返回第一个行索引
* @memberof DataTable
* @return {number} 选中行索引
* @example
* datatable.getSelectedIndex()
*/
var getSelectedIndex = function getSelectedIndex() {
var selectedIndices = this.selectedIndices();
if (selectedIndices == null || selectedIndices.length == 0) return -1;
return selectedIndices[0];
};
/**
* 获取选中的所有行索引数组
* @memberof DataTable
* @return {array} 所有行索引数组
* @example
* datatable.getSelectedIndices()
*/
var getSelectedIndices = function getSelectedIndices() {
var selectedIndices = this.selectedIndices();
if (selectedIndices == null || selectedIndices.length == 0) return [];
return selectedIndices;
};
// 兼容保留,不要用
var getSelectedIndexs = function getSelectedIndexs() {
return this.getSelectedIndices();
};
/**
* 获取选中行的数据信息
* @memberof DataTable
* @param {boolean} [withEmptyRow=false] 未选中的数据是否使用空行代替,true表示以空行代替未选中行,false相反
* @return {array} 发生变化的数据信息
* @example
* datatable.getSelectedDatas()
* datatable.getSelectedDatas(true)
*/
var getSelectedDatas = function getSelectedDatas(withEmptyRow) {
var selectedIndices = this.selectedIndices();
var datas = [];
var sIndices = [];
for (var i = 0, count = selectedIndices.length; i < count; i++) {
sIndices.push(selectedIndices[i]);
}
var rows = this.rows();
for (var i = 0, count = rows.length; i < count; i++) {
if (sIndices.indexOf(i) != -1) datas.push(rows[i].getData());else if (withEmptyRow == true) datas.push(rows[i].getEmptyData());
}
return datas;
};
/**
* 获取选中的Row对象
* @memberof DataTable
* @return {array} 选中的Row对象
* @example
* datatable.getSelectedRows()
*/
var getSelectedRows = function getSelectedRows() {
var selectedIndices = this.selectedIndices();
var selectRows = [];
var rows = this.rows.peek();
var sIndices = [];
for (var i = 0, count = selectedIndices.length; i < count; i++) {
sIndices.push(selectedIndices[i]);
}
for (var i = 0, count = rows.length; i < count; i++) {
if (sIndices.indexOf(i) != -1) selectRows.push(rows[i]);
}
return selectRows;
};
var getAllPageSelectedRows = function getAllPageSelectedRows() {
var rows = [];
if (this.pageCache) {
var pages = this.getPages();
for (var i = 0; i < pages.length; i++) {
var page = pages[i];
if (page) {
rows = rows.concat(page.getSelectRows());
}
}
}
return rows;
};
var getSelectFunObj = {
getSelectedIndex: getSelectedIndex,
getSelectedIndices: getSelectedIndices,
getSelectedIndexs: getSelectedIndexs,
getSelectedDatas: getSelectedDatas,
getSelectedRows: getSelectedRows,
getAllPageSelectedRows: getAllPageSelectedRows
};
/**
* Module : kero dataTable getSimpleData
* Author : liuyk(liuyk@yonyou.com)
* Date : 2016-08-01 14:34:01
*/
/**
* 获取数据信息,只获取字段名与字段值
* @memberof DataTable
* @param {object} [options] [description]
* @param {string} [options.type=all] 获取数据的规则
* all:所有数据
* current:当前行数据
* focus:焦点行数据
* select:选中行数据
* change:发生改变的数据
* @param {array} [options.fields] 需要获取数据的字段名数组
* @return {array} 获取到的数据信息
* @example
* datatable.getSimpleData() // 获取所有数据信息
* datatable.getSimpleData({type:'current'}) // 获取当前行数据信息
* datatable.getSimpleData({type:'current','fields':['filed1','field3']}) // 获取当前行field1和filed3数据信息
*/
var getSimpleData = function getSimpleData(options) {
options = options || {};
var rows,
_rowData = [],
type = options['type'] || 'all',
fields = options['fields'] || null;
if (type === 'current') {
var currRow = this.getCurrentRow();
rows = currRow == null ? [] : [currRow];
} else if (type === 'focus') {
var focusRow = this.getFocusRow();
rows = focusRow == null ? [] : [focusRow];
} else {
if (this.pageCache) {
var pages = this.getPages();
rows = [];
for (var i = 0; i < pages.length; i++) {
var page = pages[i];
if (page) {
if (type === 'all') {
rows = rows.concat(page.rows);
} else if (type === 'select') {
rows = rows.concat(page.getSelectRows());
} else if (type === 'change') {
rows = rows.concat(page.getChangedRows());
}
}
}
} else {
if (type === 'all') {
rows = this.rows.peek();
} else if (type === 'select') {
rows = this.getSelectedRows();
} else if (type === 'change') {
rows = this.getChangedRows();
}
}
}
for (var i = 0; i < rows.length; i++) {
_rowData.push(rows[i].getSimpleData({
fields: fields
}));
}
if (_rowData.length == 0) {
_rowData = this.setSimpleDataReal; //云采提的#需求
}
return _rowData;
};
var getSimpleDataFunObj = {
getSimpleData: getSimpleData
};
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
return typeof obj;
} : function (obj) {
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
};
var classCallCheck = function (instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
};
var inherits = function (subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}
subClass.prototype = Object.create(superClass && superClass.prototype, {
constructor: {
value: subClass,
enumerable: false,
writable: true,
configurable: true
}
});
if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
};
var possibleConstructorReturn = function (self, call) {
if (!self) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call && (typeof call === "object" || typeof call === "function") ? call : self;
};
/**
* Module : kero dataTable mete
* Author : liuyk(liuyk@yonyou.com)
* Date : 2016-07-30 14:34:01
*/
/**
* 设置meta信息
* @memberof DataTable
* @param {string} fieldName 需要设置meta信息的字段名
* @param {string} key meta信息的key
* @param {string} value meta信息的值
* @example
* datatable.setMeta('filed1','type','string')
*/
var setMeta = function setMeta(fieldName, key, value) {
if (!this.meta[fieldName]) return;
var oldValue = this.meta[fieldName][key];
var currRow = this.getCurrentRow();
this.meta[fieldName][key] = value;
if (this.metaChange[fieldName + '.' + key]) this.metaChange[fieldName + '.' + key](-this.metaChange[fieldName + '.' + key]());
if (key == 'enable') this.enableChange(-this.enableChange());
this.trigger(DataTable.ON_META_CHANGE, {
eventType: 'dataTableEvent',
dataTable: this.id,
field: fieldName,
meta: key,
oldValue: oldValue,
newValue: value
});
if (currRow && !currRow.getMeta(fieldName, key, false)) {
this.trigger(fieldName + '.' + key + '.' + DataTable.ON_CURRENT_META_CHANGE, {
eventType: 'dataTableEvent',
dataTable: this.id,
oldValue: oldValue,
newValue: value
});
}
};
/**
* 更新meta信息
* @memberof DataTable
* @param {object} meta 需要更新的meta信息
* @example
* var metaObj = {supplier: {meta: {precision:'3', default: '0239900x', display:'显示名称'}}}
* datatable.updateMeta(metaObj)
*/
var updateMeta = function updateMeta(meta) {
if (!meta) {
return;
}
for (var fieldKey in meta) {
for (var propKey in meta[fieldKey]) {
var oldValue = this.meta[fieldKey][propKey];
var newValue = meta[fieldKey][propKey];
if (propKey === 'default') {
if (!this.meta[fieldKey]['default']) {
this.meta[fieldKey]['default'] = {};
}
this.meta[fieldKey]['default'].value = meta[fieldKey][propKey];
} else if (propKey === 'display') {
if (!this.meta[fieldKey]['default']) {
this.meta[fieldKey]['default'] = {};
}
this.meta[fieldKey]['default'].display = meta[fieldKey][propKey];
} else {
this.meta[fieldKey][propKey] = meta[fieldKey][propKey];
}
if (this.metaChange[fieldKey + '.' + propKey]) this.metaChange[fieldKey + '.' + propKey](-this.metaChange[fieldKey + '.' + propKey]());
this.trigger(DataTable.ON_META_CHANGE, {
eventType: 'dataTableEvent',
dataTable: this.id,
field: fieldKey,
meta: propKey,
oldValue: oldValue,
newValue: newValue
});
}
}
};
// 字段不存在时创建字段,fieldName为需要创建的字段
// options.meta为对应的meta信息
var createField = function createField(fieldName, options) {
//字段不主动定义,则不创建
if (this.root.strict == true) return;
//有子表的情况不创建字段
if (fieldName.indexOf('.') != -1) {
var fNames = fieldName.split('.');
var _name = fNames[0];
for (var i = 0, count = fNames.length; i < count; i++) {
if (this.meta[_name] && this.meta[_name]['type'] === 'child') return;
if (i + 1 < count) _name = _name + '.' + fNames[i + 1];
}
}
if (!this.meta[fieldName]) {
this.meta[fieldName] = {};
}
if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) === 'object') {
if (options['meta']) {
for (var key in options['meta']) {
//if (!this.meta[fieldName][key]){
this.meta[fieldName]['meta'][key] = options['meta'][key];
//}
}
} else {
for (var key in options) {
//if (!this.meta[fieldName][key]){
this.meta[fieldName][key] = options[key];
//}
}
}
}
// 在顶层dataTable上定义field信息
if (this.root !== this) {
var nsArr = this.ns.split('.');
var _fieldMeta = this.root.meta;
for (var i = 0; i < nsArr.length; i++) {
_fieldMeta[nsArr[i]] = _fieldMeta[nsArr[i]] || {};
_fieldMeta[nsArr[i]]['type'] = _fieldMeta[nsArr[i]]['type'] || 'child';
_fieldMeta[nsArr[i]]['meta'] = _fieldMeta[nsArr[i]]['meta'] || {};
_fieldMeta = _fieldMeta[nsArr[i]]['meta'];
}
if (!_fieldMeta[fieldName]) {
_fieldMeta[fieldName] = {};
}
if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) === 'object') {
for (var key in options) {
if (!_fieldMeta[fieldName][key]) {
_fieldMeta[fieldName][key] = options[key];
}
}
}
}
};
var metaFunObj = {
setMeta: setMeta,
updateMeta: updateMeta,
createField: createField
};
/**
* Module : kero dataTable page
* Author : liuyk(liuyk@yonyou.com)
* Date : 2016-08-01 14:34:01
*/
// 设置当前页
var setCurrentPage = function setCurrentPage(pageIndex, notCacheCurrentPage) {
var nowTotalRow = this.totalRow();
if (pageIndex != this.pageIndex() && notCacheCurrentPage != true) this.cacheCurrentPage();
this.pageIndex(pageIndex);
var cachedPage = this.cachedPages[this.pageIndex()];
if (cachedPage) {
// 取当前页的选中行重设选中行
var selectedIndices = cachedPage.selectedIndices;
this.removeAllRows();
this.setRows(cachedPage.rows);
this.setRowsSelect(selectedIndices);
}
this.totalRow(nowTotalRow);
};
// 更新分页信息,通过fire调用,不对外提供
var updatePages = function updatePages(pages) {
var pageSize = this.pageSize(),
pageIndex = 0,
page,
r,
row;
var page, index, i, rows, focus, selectIndices, status, j, row, originRow;
for (i = 0; i < pages.length; i++) {
index = pages[i].index;
rows = pages[i].rows;
focus = pages[i].current;
selectIndices = pages[i].select;
status = pages[i].status;
if (status === 'del') {
this.cachedPages[index] = null;
continue;
}
if (!this.cachedPages[index]) {
page = new Page({
parent: this
});
page.rows = rows;
for (var j = 0; j < page.rows.length; j++) {
page.rows[j].rowId = page.rows[j].id;
delete page.rows[j].id;
}
this.cachedPages[index] = page;
page.selectedIndices = selectIndices;
page.focus = focus;
} else {
page = this.cachedPages[index];
page.selectedIndices = selectIndices;
page.focus = focus;
for (var j = 0; j < rows.length; j++) {
r = rows[j];
if (!r.id) r.id = Row.getRandomRowId();
if (r.status == Row.STATUS.DELETE) {
var row = page.getRowByRowId(r.id);
if (row) {
// 针对后台不传回总行数的情况下更新总行数
var oldTotalRow = this.totalRow();
var newTotalRow = oldTotalRow - 1;
this.totalRow(newTotalRow);
if (row.status == Row.STATUS.NEW) {
this.newCount -= 1;
if (this.newCount < 0) this.newCount = 0;
}
}
this.removeRowByRowId(r.id);
page.removeRowByRowId(r.id);
} else {
row = page.getRowByRowId(r.id);
if (row) {
page.updateRow(row, r);
// if(row.status == Row.STATUS.NEW){
// // 针对后台不传回总行数的情况下更新总行数
// var oldTotalRow = this.totalRow();
// var newTotalRow = oldTotalRow + 1;
// this.totalRow(newTotalRow);
// }
if (row.status == Row.STATUS.NEW && r.status != Row.STATUS.NEW) {
this.newCount -= 1;
if (this.newCount < 0) this.newCount = 0;
}
row.setStatus(Row.STATUS.NORMAL);
if (r.status == Row.STATUS.NEW) {
row.setStatus(Row.STATUS.NEW);
}
} else {
r.rowId = r.id;
delete r.id;
page.rows.push(r);
if (r.status != Row.STATUS.NEW) {
row.setStatus(Row.STATUS.NORMAL);
} else {
this.newCount += 1;
}
// 针对后台不传回总行数的情况下更新总行数
var oldTotalRow = this.totalRow();
var newTotalRow = oldTotalRow + 1;
this.totalRow(newTotalRow);
}
}
}
}
}
};
// 前端分页方法,不建议使用,建议在后端进行分页
var setPages = function setPages(allRows) {
var pageSize = this.pageSize(),
pageIndex = 0,
page;
this.cachedPages = [];
for (var i = 0; i < allRows.length; i++) {
pageIndex = Math.floor(i / pageSize);
if (!this.cachedPages[pageIndex]) {
page = new Page({
parent: this
});
this.cachedPages[pageIndex] = page;
}
page.rows.push(allRows[i]);
}
if (this.pageIndex() > -1) this.setCurrentPage(this.pageIndex());
this.totalRow(allRows.length);
this.totalPages(pageIndex + 1);
};
// 判断是否存在索引对应的Page
var hasPage = function hasPage(pageIndex) {
return this.pageCache && this.cachedPages[pageIndex] ? true : false;
};
// 清空cachedPages
var clearCache = function clearCache() {
this.cachedPages = [];
};
// 更新当前分页的page对象
var cacheCurrentPage = function cacheCurrentPage() {
if (this.pageCache && this.pageIndex() > -1) {
var page = new Page({
parent: this
});
page.focus = this.getFocusIndex();
page.selectedIndices = this.selectedIndices().slice();
var rows = this.rows.peek();
for (var i = 0; i < rows.length; i++) {
var r = rows[i].getData();
r.rowId = r.id;
delete r.id;
page.rows.push(r);
}
this.cachedPages[this.pageIndex()] = page;
}
};
//根据datatable的选中行更新每页的选中行
var updatePagesSelect = function updatePagesSelect() {
var selectRows = this.getSelectedRows();
var pages = this.getPages();
for (var i = 0; i < pages.length; i++) {
var rows = pages[i].rows;
var selectedIndices = [];
for (var j = 0; j < selectRows.length; j++) {
var nowSelectRow = selectRows[j];
for (var k = 0; k < rows.length; k++) {
var row = rows[k];
if (nowSelectRow == row) {
selectedIndices.push(k);
break;
}
}
}
pages[i].selectedIndices = selectedIndices;
}
};
//根据datatable的rows更新当前页的rows
var updatePageRows = function updatePageRows() {
if (this.pageCache) {
var pageIndex = this.pageIndex();
var page = this.getPages()[pageIndex];
if (page) {
page.rows = this.rows();
}
}
};
//根据datatable的选中行更新page的选中行
var updatePageSelect = function updatePageSelect() {
if (this.pageCache) {
var pageIndex = this.pageIndex();
var page = this.getPages()[pageIndex];
if (page) {
var selectedIndices = this.selectedIndices().slice();
page.selectedIndices = selectedIndices;
}
}
};
//根据datatable的focus更新page的focus
var updatePageFocus = function updatePageFocus() {
if (this.pageCache) {
var pageIndex = this.pageIndex();
var page = this.getPages()[pageIndex];
if (page) {
page.focus = this.getFocusIndex();
}
}
};
// 根据datatable更新page对象
var updatePageAll = function updatePageAll() {
this.updatePageRows();
this.updatePageSelect();
this.updatePageFocus();
};
var pageFunObj = {
setCurrentPage: setCurrentPage,
updatePages: updatePages,
setPages: setPages,
hasPage: hasPage,
clearCache: clearCache,
cacheCurrentPage: cacheCurrentPage,
updatePagesSelect: updatePagesSelect,
updatePageRows: updatePageRows,
updatePageSelect: updatePageSelect,
updatePageFocus: updatePageFocus,
updatePageAll: updatePageAll
};
/**
* Module : kero dataTable param
* Author : liuyk(liuyk@yonyou.com)
* Date : 2016-07-30 14:34:01
*/
/**
* 增加Param参数
* @memberof DataTable
* @param {string} key 需要增加的key值
* @param {*} value 需要增加的具体指
* @example
* datatable.addParam('precision','3')
*/
var addParam = function addParam(key, value) {
this.params[key] = value;
};
/**
* 增加多个Param参数
* @memberof DataTable
* @param {object} params 需要增加的Param对象
* @example
* var paramsObj = {
* 'precision':'3',
* 'default':'1.234'
* }
* datatable.addParams(paramsObj)
*/
var addParams = function addParams(params) {
for (var key in params) {
this.params[key] = params[key];
}
};
var paramFunObj = {
addParam: addParam,
addParams: addParams
};
/**
* Module : kero dataTable ref
* Author : liuyk(liuyk@yonyou.com)
* Date : 2016-08-01 14:34:01
*/
/**
* 为选中行绑定监听,当选中行发生改变时触发对应方法
* @memberof DataTable
* @param {string} fieldName 绑定的字段名
* @example
* datatable.refSelectedRows().subscribe(function(){})
*/
var refSelectedRows = function refSelectedRows() {
return ko.pureComputed({
read: function read() {
var ins = this.selectedIndices() || [];
var rs = this.rows();
var selectedRows = [];
for (var i = 0; i < ins.length; i++) {
selectedRows.push(rs[i]);
}
return selectedRows;
},
owner: this
});
};
/**
* 为某个字段绑定监听,当字段发生改变时触发对应方法
* @memberof DataTable
* @param {string} fieldName 绑定的字段名
* @example
* datatable.ref('field1').subscribe(function(){})
*/
var ref = function ref(fieldName) {
this.createField(fieldName);
if (!this.valueChange[fieldName]) this.valueChange[fieldName] = ko.observable(1);
return ko.pureComputed({
read: function read() {
this.valueChange[fieldName]();
this.currentRowChange();
var row = this.getCurrentRow();
if (row) {
return row.getChildValue(fieldName);
} else return '';
},
write: function write(value) {
var row = this.getCurrentRow();
if (row) row.setChildValue(fieldName, value);
},
owner: this
});
};
/**
* 绑定字段属性,当字段属