UNPKG

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
/** * 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 }); }; /** * 绑定字段属性,当字段属