+
+
@@ -281,7 +283,9 @@
let subSummary = {
moneyTypes: [],
- totalAmount: 0
+ notMoneyTypes: [],
+ totalAmount: 0,
+ notAmount: 0
};
// DataGrid 管理器实例
@@ -473,22 +477,39 @@
// 创建 DataGridManager(自动初始化 datagrid 和分页器)
gridManager = createDataGridManager({
gridId: 'feegrid',
+ pagerId: 'feegrid_pager',
keyField: 'subid',
pageSize: 50,
viewName: subviewtable,
- orderField: 'father ASC, mx_xh ASC, b_id ASC',
+ orderField: 'father ASC, mx_xh ASC',
baseSearchCondition: "mx_zdorderid='" + strid + "'",
selectAllBtn: '#btn_select_all',
- selectAllText: '全部选中',
- unselectAllText: '全部反选',
userid: '',
- onLoadSuccess: function (rows) {
- calcw_selfee();
+ // 添加 toolbar 配置
+ customDatagridOptions: {
+ toolbar: '#tb_con',
+ idField: 'subid',
+ fit: true,
+ remoteSort: false,
+ multiSort: true,
+ //multiSort :true,
+ singleSelect: true,
+ //ctrlSelect:true,
+ selectOnCheck: false,
+ checkOnSelect: false,
+ rownumbers: true,
+ autoRowHeight: false,
+ },
+ onLoadSuccess: function (rows, isFirstLoad) {
+ // if (isFirstLoad) {
+ // calcw_selfee();
+ // }
},
onAfterEdit: function (rowIndex, row, changes) {
calcw_fee();
},
onSelectionChange: function () {
+ console.log("===change===")
calcw_selfee();
}
});
@@ -517,148 +538,130 @@
//////////-------feegrid-----------
// 单行对「按币别汇总」的贡献,与 calcw_fee SQL 中 CASE 应收/应付 一致
- function applyFeeRowToMoneyTypeGroups(groupMap, row, sign) {
+ function buildGroupMap(data, prefix) {
+ var groupMap = {};
+ var prefixLen = prefix.length;
+ for (var key in data) {
+ if (key.startsWith(prefix)) {
+ var currency = key.substring(prefixLen).toUpperCase();
+ var amount = Number(data[key] || 0);
+ if (!groupMap[currency]) {
+ groupMap[currency] = { mx_moneytype_id: currency, mx_amount: 0 };
+ }
+ groupMap[currency].mx_amount += amount;
+ }
+ }
+ return groupMap;
+ }
+
+ function applyFeeRowToGroup(groupMap, row, sign) {
var mt = row.mx_moneytype_id;
- if (mt === undefined || mt === null || mt === '') {
- return;
- }
- var rootNet = 0;
- if (row.mx_type_id == '应收') {
- rootNet = Number(row.mx_amount_root || 0);
- } else if (row.mx_type_id == '应付') {
- rootNet = -Number(row.mx_amount_root || 0);
- }
+ if (!mt) return;
var amt = Number(row.mx_amount || 0);
+ if (row.mx_type_id == '应付') {
+ amt = -amt;
+ }
if (!groupMap[mt]) {
- groupMap[mt] = { mx_moneytype_id: mt, mx_amount_root: 0, mx_amount: 0 };
+ groupMap[mt] = { mx_moneytype_id: mt, mx_amount: 0 };
}
- groupMap[mt].mx_amount_root += sign * rootNet;
groupMap[mt].mx_amount += sign * amt;
}
+ function groupMapToArray(groupMap) {
+ var arr = [];
+ for (var mk in groupMap) {
+ var g = groupMap[mk];
+ g.mx_amount = Math.round(g.mx_amount * 100) / 100;
+ arr.push(g);
+ }
+ return arr.sort(function (a, b) {
+ return String(a.mx_moneytype_id).localeCompare(String(b.mx_moneytype_id));
+ });
+ }
+
+ function calcTotal(arr) {
+ var total = 0;
+ for (var i = 0; i < arr.length; i++) {
+ total += Number(arr[i].mx_amount || 0);
+ }
+ return Math.round(total * 100) / 100;
+ }
+
+ function buildDisplayText(arr) {
+ var txtArr = [];
+ for (var i = 0; i < arr.length; i++) {
+ var row = arr[i];
+ if (row.mx_amount !== 0) {
+ txtArr.push(row.mx_moneytype_id + " " + row.mx_amount);
+ }
+ }
+ return txtArr.join(";");
+ }
+
function calcw_fee() {
if (!strid) {
$("#div_total").text('0.00');
$('#b_amount').val('0.00');
subSummary.moneyTypes = [];
+ subSummary.notMoneyTypes = [];
subSummary.totalAmount = 0;
+ subSummary.notAmount = 0;
return;
}
- var data = mainData;
+ var amountGroupMap = buildGroupMap(mainData, 'v_amount_');
+ var notAmountGroupMap = buildGroupMap(mainData, 'v_notamount_');
- // 提取币种金额(v_amount_ 开头的字段)放入 groupMap
- var groupMap = {};
- for (var key in data) {
- if (key.startsWith('v_amount_')) {
- var currency = key.replace('v_amount_', '').toUpperCase();
- var amount = Number(data[key] || 0);
- groupMap[currency] = {
- mx_moneytype_id: currency,
- mx_amount_root: amount,
- mx_amount: amount
- };
- }
- }
-
- // 草稿:已保存行标记删除 → 仍计入 DB 汇总,需扣回;本地新增 insertRows → 尚未进 DB,需加上
- var dIdx;
var deleteRows = gridManager.getDeleteRows();
var insertRows = gridManager.getInsertRows();
- for (dIdx = 0; dIdx < deleteRows.length; dIdx++) {
- applyFeeRowToMoneyTypeGroups(groupMap, deleteRows[dIdx], -1);
+
+ for (var i = 0; i < deleteRows.length; i++) {
+ applyFeeRowToGroup(amountGroupMap, deleteRows[i], -1);
+ applyFeeRowToGroup(notAmountGroupMap, deleteRows[i], -1);
}
- for (dIdx = 0; dIdx < insertRows.length; dIdx++) {
- var insRow = insertRows[dIdx];
- if (insRow._rowState === 'delete') {
- continue;
+ for (var i = 0; i < insertRows.length; i++) {
+ if (insertRows[i]._rowState !== 'delete') {
+ applyFeeRowToGroup(amountGroupMap, insertRows[i], 1);
+ applyFeeRowToGroup(notAmountGroupMap, insertRows[i], 1);
}
- applyFeeRowToMoneyTypeGroups(groupMap, insRow, 1);
}
- // 构建合并后的 moneyTypes
- var mergedDatas = [];
- var mk;
- for (mk in groupMap) {
- var g = groupMap[mk];
- g.mx_amount_root = Math.round(g.mx_amount_root * 1000) / 1000;
- g.mx_amount = Math.round(g.mx_amount * 100) / 100;
- mergedDatas.push(g);
- }
- mergedDatas.sort(function (a, b) {
- return String(a.mx_moneytype_id).localeCompare(String(b.mx_moneytype_id));
+ var moneyTypes = groupMapToArray(amountGroupMap);
+ var notMoneyTypes = groupMapToArray(notAmountGroupMap);
+
+ subSummary.moneyTypes = moneyTypes.filter(function (r) {
+ return r.mx_amount !== 0;
});
-
- // 计算总金额
- var totalamount = 0;
- for (var mi = 0; mi < mergedDatas.length; mi++) {
- totalamount += Number(mergedDatas[mi].mx_amount || 0);
- }
- totalamount = Math.round(totalamount * 100) / 100;
-
- // 更新 subSummary
- subSummary.moneyTypes = mergedDatas.filter(function (r) {
- return r.mx_amount_root !== 0 || r.mx_amount !== 0;
+ subSummary.notMoneyTypes = notMoneyTypes.filter(function (r) {
+ return r.mx_amount !== 0;
});
- subSummary.totalAmount = totalamount;
+ subSummary.totalAmount = calcTotal(moneyTypes);
+ subSummary.notAmount = calcTotal(notMoneyTypes);
- // 构建显示文本
- var txtArr = [];
- for (var mi = 0; mi < mergedDatas.length; mi++) {
- var row = mergedDatas[mi];
- if (row.mx_amount_root === 0 && row.mx_amount === 0) {
- continue;
- }
- txtArr.push(row.mx_moneytype_id + " " + row.mx_amount_root);
- }
- var totaltxt = txtArr.join(";");
-
- if (totalamount !== 0) {
- totaltxt += " 折合金额:" + totalamount;
+ var totaltxt = buildDisplayText(moneyTypes);
+ if (subSummary.totalAmount !== 0) {
+ totaltxt += " 折合金额:" + subSummary.totalAmount;
}
$("#div_total").text(totaltxt);
- $("#b_amount").val(totalamount);
+ $("#b_amount").val(subSummary.totalAmount);
+ console.log(subSummary);
calcDeleteFee();
}
function calcDeleteFee() {
- var deleteRows = gridManager.getDeleteRows();
var deleteGroupMap = {};
+ var deleteRows = gridManager.getDeleteRows();
for (var i = 0; i < deleteRows.length; i++) {
- var row = deleteRows[i];
- var mt = row.mx_moneytype_id;
- if (mt === undefined || mt === null || mt === '') {
- continue;
- }
- var rootNet = 0;
- if (row.mx_type_id == '应收') {
- rootNet = Number(row.mx_amount_root || 0);
- } else if (row.mx_type_id == '应付') {
- rootNet = -Number(row.mx_amount_root || 0);
- }
- var amt = Number(row.mx_amount || 0);
- if (!deleteGroupMap[mt]) {
- deleteGroupMap[mt] = { mx_moneytype_id: mt, mx_amount_root: 0, mx_amount: 0 };
- }
- deleteGroupMap[mt].mx_amount_root += rootNet;
- deleteGroupMap[mt].mx_amount += amt;
+ applyFeeRowToGroup(deleteGroupMap, deleteRows[i], 1);
}
- var deleteTxtArr = [];
- var deleteTotal = 0;
- for (var mk in deleteGroupMap) {
- var g = deleteGroupMap[mk];
- g.mx_amount_root = Math.round(g.mx_amount_root * 1000) / 1000;
- g.mx_amount = Math.round(g.mx_amount * 100) / 100;
- deleteTxtArr.push(g.mx_moneytype_id + " " + g.mx_amount_root);
- deleteTotal += g.mx_amount;
- }
+ var deleteArr = groupMapToArray(deleteGroupMap);
+ var deleteTotal = calcTotal(deleteArr);
+ var deleteTxt = buildDisplayText(deleteArr);
- deleteTotal = Math.round(deleteTotal * 100) / 100;
- var deleteTxt = deleteTxtArr.join(";");
if (deleteTotal !== 0) {
deleteTxt += " 折合金额:" + deleteTotal;
}
@@ -668,59 +671,115 @@
// 计算选中行的金额(仅业务有效行)
function calcw_selfee() {
+ console.log(gridManager)
+
+ if (gridManager.isAllChecked()) {
+ calcSelfeeAllChecked();
+ } else {
+ calcSelfeeNormal();
+ }
+ }
+
+ function calcSelfeeNormal() {
var rows = gridManager.getValidSelectedRows();
-
- var irow = rows.length;
-
var moneyArray = [];
- var canadd;
- for (var i = 0; i < irow; i++) {
- //console.log(rows[i]);
- var moneytype = rows[i].mx_moneytype_id;
- var skamount = 0;
- var fkamount = 0;
+ for (var i = 0; i < rows.length; i++) {
+ var row = rows[i];
+ var moneytype = row.mx_moneytype_id;
+ if (!moneytype) continue;
+
var alreadyamount = 0;
var notamount = 0;
- if (rows[i].mx_type_id == '应收') {
- skamount = rows[i].mx_amount_root;
- alreadyamount = Number(rows[i].mx_amount_root);
- notamount = Number(rows[i].notamount);
+ if (row.mx_type_id == '应收') {
+ alreadyamount = Number(row.mx_amount || 0);
+ notamount = Number(row.notamount || 0);
+ } else if (row.mx_type_id == '应付') {
+ alreadyamount = -Number(row.mx_amount || 0);
+ notamount = -Number(row.notamount || 0);
}
- if (rows[i].mx_type_id == '应付') {
- fkamount = rows[i].mx_amount_root;
- alreadyamount = 0 - Number(rows[i].mx_amount_root);
- notamount = 0 - Number(rows[i].notamount);
- }
- var amount = Number(skamount) - Number(fkamount);
- //if(rows[i].mx_type_id=='应收'){
- // alreadyamount=Number(alreadyamount);
- //}
- canadd = true;
- for (var k in moneyArray) {
- if (moneyArray[k].moneyid == moneytype) {
- moneyArray[k].totalamount = moneyArray[k].totalamount + amount;
- moneyArray[k].totalalreadyamount = moneyArray[k].totalalreadyamount + alreadyamount;
- moneyArray[k].totalnotamount = moneyArray[k].totalnotamount + notamount;
- canadd = false;
- }
- }
- if (canadd) {
- moneyArray.push({ moneyid: moneytype, totalamount: amount, totalalreadyamount: alreadyamount, totalnotamount: notamount });
+ var existing = moneyArray.find(function (m) {
+ return m.moneyid == moneytype;
+ });
+ if (existing) {
+ existing.totalalreadyamount += alreadyamount;
+ existing.totalnotamount += notamount;
+ } else {
+ moneyArray.push({ moneyid: moneytype, totalalreadyamount: alreadyamount, totalnotamount: notamount });
}
}
- var totaltxt = "";
+
+ updateSelfeeDisplay(moneyArray);
+ }
+
+ function calcSelfeeAllChecked() {
+ var excludedRows = gridManager.getExcludedRows();
+
+ console.log(excludedRows)
+
+ var moneyArray = [];
+ var tempAmountMap = {};
+ var tempNotAmountMap = {};
+
+ for (var i = 0; i < subSummary.moneyTypes.length; i++) {
+ var mt = subSummary.moneyTypes[i];
+ tempAmountMap[mt.mx_moneytype_id] = mt.mx_amount;
+ }
+ for (var i = 0; i < subSummary.notMoneyTypes.length; i++) {
+ var mt = subSummary.notMoneyTypes[i];
+ tempNotAmountMap[mt.mx_moneytype_id] = mt.mx_amount;
+ }
+
+ for (var i = 0; i < excludedRows.length; i++) {
+ var row = excludedRows[i];
+ var mt = row.mx_moneytype_id;
+ if (!mt) continue;
+
+ var amt = Number(row.mx_amount || 0);
+ if (row.mx_type_id == '应付') amt = -amt;
+ if (tempAmountMap[mt] !== undefined) {
+ tempAmountMap[mt] -= amt;
+ }
+
+ var notAmt = Number(row.notamount || 0);
+ if (row.mx_type_id == '应付') notAmt = -notAmt;
+ if (tempNotAmountMap[mt] !== undefined) {
+ tempNotAmountMap[mt] -= notAmt;
+ }
+ }
+
+ var allCurrencies = {};
+ for (var mt in tempAmountMap) allCurrencies[mt] = true;
+ for (var mt in tempNotAmountMap) allCurrencies[mt] = true;
+
+ for (var mt in allCurrencies) {
+ moneyArray.push({
+ moneyid: mt,
+ totalalreadyamount: tempAmountMap[mt] || 0,
+ totalnotamount: tempNotAmountMap[mt] || 0
+ });
+ }
+
+ moneyArray.sort(function (a, b) {
+ return String(a.moneyid).localeCompare(String(b.moneyid));
+ });
+
+ updateSelfeeDisplay(moneyArray);
+ }
+
+ function updateSelfeeDisplay(moneyArray) {
var total_select = "";
var total_selectnotxz = "";
for (var j = 0; j < moneyArray.length; j++) {
- //totaltxt=totaltxt+moneyArray[j].moneyid+':'+Math.round((moneyArray[j].totalamount)*100)/100+';';
- total_select = total_select + moneyArray[j].moneyid + ':' + Math.round((moneyArray[j].totalalreadyamount) * 100) / 100 + ';';
- total_selectnotxz = total_selectnotxz + moneyArray[j].moneyid + ':' + Math.round((moneyArray[j].totalnotamount) * 100) / 100 + ';';
+ var item = moneyArray[j];
+ if (item.totalalreadyamount !== 0) {
+ total_select += item.moneyid + ':' + Math.round(item.totalalreadyamount * 100) / 100 + ';';
+ }
+ if (item.totalnotamount !== 0) {
+ total_selectnotxz += item.moneyid + ':' + Math.round(item.totalnotamount * 100) / 100 + ';';
+ }
}
- //alert(total_select);
- //alert(total_selectnotxz);
- //$("#div_total").text(totaltxt);
$("#total_select").text(total_select);
$("#total_selectnotxz").text(total_selectnotxz);
}
@@ -1392,7 +1451,6 @@
calcw_fee();
}
- // 子表草稿:弹窗选费用 → 写入 insertRows(去重)并刷新当前分页视图
function handleSelectedFee(rows) {
if (rows.length == undefined) {
rows = [rows];
@@ -1403,20 +1461,7 @@
$('#v_dwname').val(rows[0].v_mx_dw_name);
}
- for (var i = 0; i < rows.length; i++) {
- var r = rows[i];
- var rk = gridManager.getDraftManager().getRowKey(r);
- var dup = gridManager.getInsertRows().some(function (x) {
- return gridManager.getDraftManager().getRowKey(x) === rk;
- });
- if (!dup) {
- if (!r._rowState) {
- r._rowState = 'insert';
- }
- gridManager.addInsertRows(r);
- }
- }
-
+ gridManager.addInsertRows(rows);
gridManager.refreshCurrentPage();
calcw_fee();
}
@@ -1428,105 +1473,28 @@
$.messager.confirm("操作提示", '您确定要删除勾选的费用吗?', function (r) {
if (r) {
endEditing_con();
- var selectedRows = gridManager.getValidSelectedRows();
-
- if (selectedRows.length === 0) {
- $.messager.alert('提示', '请选择要删除的行(已标记删除的行请使用「撤销删除」)', 'warning');
- return;
- }
-
- for (var i = selectedRows.length - 1; i >= 0; i--) {
- var row = selectedRows[i];
+ var result = gridManager.deleteSelectedRows(function (row) {
var invoiceno = row.mx_invoiceid;
var kp = invoiceno && invoiceno !== '' && invoiceno !== null ? '1' : '0';
-
if ((row.alreadyamount != 0) || (kp == '1')) {
- $.messager.alert('提示', '已经销账或开票的费用不能删除!', 'warning');
- return;
+ return '已经销账或开票的费用不能删除!';
}
- }
-
- var hasInsertDelete = false;
-
- var dm = gridManager.getDraftManager();
- for (var i = selectedRows.length - 1; i >= 0; i--) {
- var row = selectedRows[i];
-
- if (dm.isInsertRow(row) || dm.isInInsertRows(row)) {
- gridManager.removeInsertRow(row);
- hasInsertDelete = true;
- } else {
- var delKey = dm.getRowKey(row);
- var wasUpdate = gridManager.getUpdateRows().some(function (rr) {
- return dm.getRowKey(rr) === delKey;
- });
- row._undoRowState = wasUpdate ? 'update' : '';
- row._rowState = 'delete';
- gridManager.addDeleteRow(row);
- }
- }
-
- calcw_fee();
-
- if (hasInsertDelete) {
- gridManager.refreshAfterDelete();
- } else {
- gridManager.refreshDisplay();
+ return true;
+ });
+ if (result) {
+ calcw_fee();
}
}
})
}
- // 子表草稿:撤销删除(逻辑依赖 selectedRows / getDeletedSelectedRows)
+ // 子表草稿:撤销删除
function undoRemoveFee() {
endEditing_con();
- var pageRows = $('#feegrid').datagrid('getRows');
- var targets = [];
- var selKeys = {};
- var dm = gridManager.getDraftManager();
- var selectedRows = gridManager.getSelectedRows();
- for (var sk = 0; sk < selectedRows.length; sk++) {
- selKeys[dm.getRowKey(selectedRows[sk])] = true;
+ var result = gridManager.undoDeleteSelectedRows();
+ if (result) {
+ calcw_fee();
}
- var hasSelectionOnPage = false;
- for (var hp = 0; hp < pageRows.length; hp++) {
- if (selKeys[dm.getRowKey(pageRows[hp])]) {
- hasSelectionOnPage = true;
- break;
- }
- }
- if (!hasSelectionOnPage) {
- for (var u = 0; u < pageRows.length; u++) {
- if (pageRows[u]._rowState === 'delete') {
- targets.push(pageRows[u]);
- }
- }
- } else {
- var delSel = dm.getDeletedSelectedRows();
- var delKeys = {};
- for (var dv = 0; dv < delSel.length; dv++) {
- delKeys[dm.getRowKey(delSel[dv])] = true;
- }
- for (var v = 0; v < pageRows.length; v++) {
- var pr = pageRows[v];
- if (pr._rowState === 'delete' && delKeys[dm.getRowKey(pr)]) {
- targets.push(pr);
- }
- }
- }
- if (targets.length === 0) {
- $.messager.alert('提示', '当前页没有可撤销的删除行', 'warning');
- return;
- }
- for (var w = 0; w < targets.length; w++) {
- var row = targets[w];
- if (row._rowState !== 'delete') {
- continue;
- }
- gridManager.removeDeleteRow(row);
- }
- calcw_fee();
- gridManager.refreshAfterUndo();
}
// 批量删除
diff --git a/code/jsp/feegrid-manager.js b/code/jsp/feegrid-manager.js
new file mode 100644
index 00000000..fdd122fc
--- /dev/null
+++ b/code/jsp/feegrid-manager.js
@@ -0,0 +1,1307 @@
+/**
+ * DataGrid 公共管理模块 - 重构版本
+ *
+ * 核心架构:全局缓存 + 单状态源
+ *
+ * 设计原则:
+ * 1. 单状态源:所有状态仅保存在 row 对象上
+ * 2. 全局缓存层:所有数据统一进入 allRowMap
+ * 3. 状态标记:通过 row._draftState 标识状态
+ * 4. 分页安全:状态不依赖当前页数据,从缓存恢复
+ *
+ * 状态定义:
+ * - _isNew: true 表示前端新增未提交数据
+ * - _draftState: null | 'add' | 'update' | 'delete'
+ * - _originData: 原始数据备份(用于撤销)
+ * - _changedFields: 变更字段列表
+ *
+ * 使用方式:
+ * var gridManager = createDataGridManager({
+ * gridId: 'feegrid',
+ * keyField: 'subid',
+ * viewName: 'v_cwzd_orderfee_s',
+ * baseSearchCondition: "mx_zdorderid='xxx'",
+ * onLoadSuccess: function(rows) { ... },
+ * onAfterEdit: function(rowIndex, row, changes) { ... },
+ * onSelectionChange: function() { ... }
+ * });
+ */
+(function (window) {
+ "use strict";
+
+ // ==================== GlobalCacheManager(全局缓存管理器)====================
+
+ /**
+ * 创建全局缓存管理器
+ * @param {Object} config 配置参数
+ * @param {string} config.keyField 主键字段名
+ */
+ function createGlobalCacheManager(config) {
+ var keyField = (config && config.keyField) || "id";
+
+ var allRowMap = {};
+ var draftRowMap = {};
+ var selectionMap = {};
+ var exclusionMap = {};
+ var isAllChecked = false;
+ var isBatchDeleting = false;
+
+ function cloneRow(obj) {
+ if (!obj) return null;
+ return JSON.parse(JSON.stringify(obj));
+ }
+
+ function getRowKey(row) {
+ return row[keyField];
+ }
+
+ function initDraftState(rowId) {
+ if (!draftRowMap[rowId]) {
+ draftRowMap[rowId] = {
+ state: null,
+ originData: null,
+ changedFields: []
+ };
+ }
+ return draftRowMap[rowId];
+ }
+
+ function setRowToCache(row, isNew) {
+ var key = getRowKey(row);
+ var cachedRow = cloneRow(row);
+
+ if (!allRowMap[key]) {
+ cachedRow._isNew = isNew || false;
+ cachedRow._draftState = isNew ? 'add' : null;
+ cachedRow._originData = isNew ? null : cloneRow(row);
+ cachedRow._changedFields = [];
+ } else {
+ cachedRow._isNew = allRowMap[key]._isNew;
+ cachedRow._draftState = allRowMap[key]._draftState;
+ cachedRow._originData = allRowMap[key]._originData;
+ cachedRow._changedFields = allRowMap[key]._changedFields;
+ }
+
+ allRowMap[key] = cachedRow;
+ return cachedRow;
+ }
+
+ function getRowFromCache(rowId) {
+ return allRowMap[rowId] || null;
+ }
+
+ function removeRowFromCache(rowId) {
+ delete allRowMap[rowId];
+ delete draftRowMap[rowId];
+ delete selectionMap[rowId];
+ delete exclusionMap[rowId];
+ }
+
+ function updateRowInCache(row) {
+ var key = getRowKey(row);
+ var existing = allRowMap[key];
+
+ if (!existing) {
+ return setRowToCache(row, false);
+ }
+
+ var draftState = existing._draftState;
+
+ if (draftState !== 'delete') {
+ existing._draftState = existing._isNew ? 'add' : 'update';
+
+ for (var field in row) {
+ if (field !== keyField && field.indexOf('_') !== 0) {
+ if (!existing._originData) {
+ existing._originData = cloneRow(existing);
+ }
+ if (existing._originData[field] !== row[field]) {
+ if (existing._changedFields.indexOf(field) === -1) {
+ existing._changedFields.push(field);
+ }
+ } else {
+ var idx = existing._changedFields.indexOf(field);
+ if (idx !== -1) {
+ existing._changedFields.splice(idx, 1);
+ }
+ }
+ existing[field] = row[field];
+ }
+ }
+ }
+
+ return existing;
+ }
+
+ function markRowDeleted(row) {
+ var key = getRowKey(row);
+ var cachedRow = allRowMap[key];
+
+ if (!cachedRow) {
+ cachedRow = setRowToCache(row, false);
+ }
+
+ if (cachedRow._isNew) {
+ removeRowFromCache(key);
+ return true;
+ }
+
+ if (cachedRow._draftState !== 'delete') {
+ if (!cachedRow._originData) {
+ cachedRow._originData = cloneRow(cachedRow);
+ }
+ cachedRow._draftState = 'delete';
+ cachedRow._changedFields = [];
+ }
+
+ if (!isAllChecked) {
+ setSelection(key, false);
+ }
+ return false;
+ }
+
+ function unmarkRowDeleted(row) {
+ var key = getRowKey(row);
+ var cachedRow = allRowMap[key];
+
+ if (!cachedRow || cachedRow._draftState !== 'delete') {
+ return false;
+ }
+
+ if (cachedRow._originData) {
+ var originState = cachedRow._originData._draftState;
+ cachedRow._draftState = originState || null;
+ cachedRow._changedFields = cachedRow._originData._changedFields || [];
+
+ for (var field in cachedRow._originData) {
+ if (field.indexOf('_') !== 0) {
+ cachedRow[field] = cachedRow._originData[field];
+ }
+ }
+ } else {
+ cachedRow._draftState = null;
+ cachedRow._changedFields = [];
+ }
+
+ return true;
+ }
+
+ function setSelection(rowId, selected) {
+ selectionMap[rowId] = selected;
+ }
+
+ function isSelected(rowId) {
+ return selectionMap[rowId] === true;
+ }
+
+ function setExclusion(rowId, excluded) {
+ exclusionMap[rowId] = excluded;
+ }
+
+ function isExcluded(rowId) {
+ return exclusionMap[rowId] === true;
+ }
+
+ function clearAllSelections() {
+ selectionMap = {};
+ }
+
+ function clearAllExclusions() {
+ exclusionMap = {};
+ }
+
+ function applyDraftStateToRemoteRows(remoteRows) {
+ var result = [];
+
+ for (var i = 0; i < remoteRows.length; i++) {
+ var row = remoteRows[i];
+ var key = getRowKey(row);
+ var cachedRow = allRowMap[key];
+
+ if (cachedRow) {
+ if (isBatchDeleting && !exclusionMap[key] && cachedRow._draftState !== 'add') {
+ cachedRow._draftState = 'delete';
+ if (!cachedRow._originData) {
+ cachedRow._originData = cloneRow(cachedRow);
+ }
+ var deleteRow = cloneRow(cachedRow);
+ deleteRow._rowState = 'delete';
+ result.push(deleteRow);
+ } else if (cachedRow._draftState === 'delete') {
+ var deleteRow = cloneRow(cachedRow);
+ deleteRow._rowState = 'delete';
+ result.push(deleteRow);
+ } else if (cachedRow._draftState === 'add' || cachedRow._draftState === 'update') {
+ var draftRow = cloneRow(cachedRow);
+ draftRow._rowState = cachedRow._draftState;
+ result.push(draftRow);
+ } else {
+ setRowToCache(row, false);
+ result.push(cloneRow(row));
+ }
+ } else {
+ setRowToCache(row, false);
+
+ if (isBatchDeleting && !exclusionMap[key]) {
+ var newCachedRow = allRowMap[key];
+ newCachedRow._draftState = 'delete';
+ if (!newCachedRow._originData) {
+ newCachedRow._originData = cloneRow(newCachedRow);
+ }
+ var deleteRow = cloneRow(newCachedRow);
+ deleteRow._rowState = 'delete';
+ result.push(deleteRow);
+ } else {
+ result.push(cloneRow(row));
+ }
+ }
+ }
+
+ return result;
+ }
+
+ function getRowsForSubmission() {
+ var addRows = [];
+ var updateRows = [];
+ var deleteRows = [];
+
+ for (var key in allRowMap) {
+ var row = allRowMap[key];
+ var draftState = row._draftState;
+
+ switch (draftState) {
+ case 'add':
+ var addRow = cloneRow(row);
+ delete addRow._isNew;
+ delete addRow._draftState;
+ delete addRow._originData;
+ delete addRow._changedFields;
+ delete addRow._rowState;
+ addRows.push(addRow);
+ break;
+ case 'update':
+ var updateRow = cloneRow(row);
+ delete updateRow._isNew;
+ delete updateRow._draftState;
+ delete updateRow._originData;
+ delete updateRow._changedFields;
+ delete updateRow._rowState;
+ updateRows.push(updateRow);
+ break;
+ case 'delete':
+ var deleteRow = cloneRow(row);
+ delete deleteRow._isNew;
+ delete deleteRow._draftState;
+ delete deleteRow._originData;
+ delete deleteRow._changedFields;
+ delete deleteRow._rowState;
+ deleteRows.push(deleteRow);
+ break;
+ }
+ }
+
+ return {
+ addRows: addRows,
+ updateRows: updateRows,
+ deleteRows: deleteRows
+ };
+ }
+
+ function getRowsByState(stateFilter) {
+ var result = [];
+ for (var key in allRowMap) {
+ var row = allRowMap[key];
+ if (row._draftState === stateFilter) {
+ result.push(cloneRow(row));
+ }
+ }
+ return result;
+ }
+
+ function getSelectedRowIds() {
+ var ids = [];
+ for (var key in selectionMap) {
+ if (selectionMap[key] === true) {
+ var row = allRowMap[key];
+ if (!row || row._draftState !== 'delete') {
+ ids.push(key);
+ }
+ }
+ }
+ return ids;
+ }
+
+ function getSelectedRows() {
+ var rows = [];
+ for (var key in selectionMap) {
+ if (selectionMap[key] === true) {
+ var row = allRowMap[key];
+ if (row) {
+ rows.push(cloneRow(row));
+ }
+ }
+ }
+ return rows;
+ }
+
+ function getValidSelectedRows(currentPageRows) {
+ var rows = [];
+
+ if (isAllChecked && currentPageRows && currentPageRows.length > 0) {
+ for (var i = 0; i < currentPageRows.length; i++) {
+ var row = currentPageRows[i];
+ var key = getRowKey(row);
+
+ if (!exclusionMap[key]) {
+ var cachedRow = allRowMap[key];
+ if (cachedRow && cachedRow._draftState !== 'delete') {
+ rows.push(cloneRow(cachedRow));
+ } else if (!cachedRow && row._draftState !== 'delete') {
+ rows.push(cloneRow(row));
+ }
+ }
+ }
+ } else {
+ for (var key in selectionMap) {
+ if (selectionMap[key] === true) {
+ var row = allRowMap[key];
+ if (row && row._draftState !== 'delete') {
+ rows.push(cloneRow(row));
+ }
+ }
+ }
+ }
+
+ return rows;
+ }
+
+ function getExcludedRowIds() {
+ var ids = [];
+ for (var key in exclusionMap) {
+ if (exclusionMap[key] === true) {
+ ids.push(key);
+ }
+ }
+ return ids;
+ }
+
+ function getExcludedRows() {
+ var rows = [];
+ for (var key in exclusionMap) {
+ if (exclusionMap[key] === true) {
+ var row = allRowMap[key];
+ if (row && row._draftState !== 'delete') {
+ rows.push(cloneRow(row));
+ }
+ }
+ }
+ return rows;
+ }
+
+ function reset() {
+ allRowMap = {};
+ draftRowMap = {};
+ selectionMap = {};
+ exclusionMap = {};
+ isAllChecked = false;
+ isBatchDeleting = false;
+ }
+
+ return {
+ keyField: keyField,
+ cloneRow: cloneRow,
+ getRowKey: getRowKey,
+ setRowToCache: setRowToCache,
+ getRowFromCache: getRowFromCache,
+ removeRowFromCache: removeRowFromCache,
+ updateRowInCache: updateRowInCache,
+ markRowDeleted: markRowDeleted,
+ unmarkRowDeleted: unmarkRowDeleted,
+ setSelection: setSelection,
+ isSelected: isSelected,
+ setExclusion: setExclusion,
+ isExcluded: isExcluded,
+ clearAllSelections: clearAllSelections,
+ clearAllExclusions: clearAllExclusions,
+ applyDraftStateToRemoteRows: applyDraftStateToRemoteRows,
+ getRowsForSubmission: getRowsForSubmission,
+ getRowsByState: getRowsByState,
+ getSelectedRowIds: getSelectedRowIds,
+ getSelectedRows: getSelectedRows,
+ getValidSelectedRows: getValidSelectedRows,
+ getExcludedRowIds: getExcludedRowIds,
+ getExcludedRows: getExcludedRows,
+
+ isAllChecked: function () { return isAllChecked; },
+ setAllChecked: function (value) {
+ isAllChecked = value;
+ if (value) clearAllSelections();
+ },
+
+ isBatchDeleting: function () { return isBatchDeleting; },
+ setBatchDeleting: function (value) {
+ if (!value && isBatchDeleting) {
+ for (var key in allRowMap) {
+ var row = allRowMap[key];
+ if (row._draftState === 'delete' && !exclusionMap[key]) {
+ if (row._originData) {
+ var originState = row._originData._draftState;
+ row._draftState = originState || null;
+ row._changedFields = row._originData._changedFields || [];
+
+ for (var field in row._originData) {
+ if (field.indexOf('_') !== 0) {
+ row[field] = row._originData[field];
+ }
+ }
+ } else {
+ row._draftState = null;
+ row._changedFields = [];
+ }
+ }
+ }
+ }
+ isBatchDeleting = value;
+ },
+
+ getInsertRows: function () { return getRowsByState('add'); },
+ getUpdateRows: function () { return getRowsByState('update'); },
+ getDeleteRows: function () { return getRowsByState('delete'); },
+
+ reset: reset
+ };
+ }
+
+ // ==================== createDataGridManager(导出模块)====================
+
+ function createDataGridManager(config) {
+ var $ = window.jQuery;
+
+ var DEFAULT_CONFIG = {
+ gridId: "feegrid",
+ keyField: "subid",
+ pageSize: 50,
+ viewName: "",
+ searchUrl: "jsp/searchdatapagenew.jsp",
+ orderField: "b_id",
+ baseSearchCondition: null,
+ searchCondition: null,
+ pageList: [50, 100, 200],
+ rowStateStyles: {
+ add: "background-color: #f6ffed;",
+ update: "background-color: #fffbe6;",
+ delete: "background-color: #fff1f0;",
+ },
+ selectAllBtn: "#btn_select_all",
+ selectAllText: "全部选中",
+ unselectAllText: "全部反选",
+ userid: "",
+ customDatagridOptions: null,
+ ajaxTimeout: 30000,
+ onLoadError: null,
+ onLoadSuccess: null,
+ onAfterEdit: null,
+ onSelectionChange: null,
+ pagerId: null,
+ };
+
+ var options = $.extend(true, {}, DEFAULT_CONFIG, config);
+
+ var state = {
+ cacheManager: null,
+ editIndex: undefined,
+ isLoading: false,
+ pagerId: null,
+ requestVersion: 0,
+ isFirstLoad: true,
+ isSyncing: false,
+ pagination: {
+ pageSize: options.pageSize,
+ pageNumber: 1,
+ remoteTotal: 0,
+ }
+ };
+
+ _initCacheManager();
+ _initGrid();
+
+ function _initCacheManager() {
+ state.cacheManager = createGlobalCacheManager({
+ keyField: options.keyField
+ });
+ }
+
+ function _getPagerId() {
+ if (!state.pagerId) {
+ state.pagerId = options.pagerId || (options.gridId + "_pager");
+ }
+ return state.pagerId;
+ }
+
+ function _setLoading() {
+ state.isLoading = true;
+ $("#" + options.gridId).datagrid("loading");
+ $("#" + _getPagerId())
+ .css({
+ "pointer-events": "none",
+ opacity: "0.6",
+ })
+ .pagination("loading");
+ }
+
+ function _clearLoading() {
+ state.isLoading = false;
+ $("#" + options.gridId).datagrid("loaded");
+ $("#" + _getPagerId())
+ .css({
+ "pointer-events": "",
+ opacity: "",
+ })
+ .pagination("loaded");
+ }
+
+ function _syncGridChecks() {
+ var rows = $("#" + options.gridId).datagrid("getRows");
+ var cm = state.cacheManager;
+
+ state.isSyncing = true;
+
+ for (var i = 0; i < rows.length; i++) {
+ var row = rows[i];
+ var key = cm.getRowKey(row);
+ var shouldCheck = false;
+
+ if (cm.isAllChecked()) {
+ shouldCheck = !cm.isExcluded(key);
+ } else {
+ shouldCheck = cm.isSelected(key);
+ }
+
+ if (shouldCheck) {
+ $("#" + options.gridId).datagrid("checkRow", i);
+ } else {
+ $("#" + options.gridId).datagrid("uncheckRow", i);
+ }
+ }
+
+ state.isSyncing = false;
+ }
+
+ function _handleRowStyles() {
+ $(".datagrid-body tr").each(function () {
+ var rowIndex = $(this).attr("datagrid-row-index");
+ if (rowIndex !== undefined) {
+ var row = $("#" + options.gridId).datagrid("getRows")[parseInt(rowIndex)];
+ if (row && row._draftState === 'delete') {
+ $(this).addClass("datagrid-row-delete");
+ } else {
+ $(this).removeClass("datagrid-row-delete");
+ }
+ }
+ });
+ }
+
+ function buildFinalCondition() {
+ var parts = [];
+
+ if (options.baseSearchCondition) {
+ parts.push(options.baseSearchCondition);
+ }
+
+ if (options.searchCondition) {
+ parts.push(options.searchCondition);
+ }
+
+ return parts.join(" AND ");
+ }
+
+ function _renderPage(pageData, total, pageNumber, pageSize) {
+ $("#" + options.gridId).datagrid("loadData", pageData);
+ $("#" + _getPagerId()).pagination("refresh", {
+ total: total,
+ pageNumber: pageNumber,
+ pageSize: pageSize,
+ });
+ }
+
+ function _refresh(mode) {
+ switch (mode) {
+ case "full":
+ state.pagination.pageNumber = 1;
+ state.pagination.remoteTotal = 0;
+ loadPage(1);
+ break;
+ case "page":
+ refreshCurrentPage();
+ break;
+ case "display":
+ default:
+ refreshDisplay();
+ break;
+ }
+ }
+
+ function loadPage(pageNumber) {
+ _setLoading();
+
+ var pageSize = state.pagination.pageSize;
+ var searchCondition = buildFinalCondition();
+ var currentRequestVersion = ++state.requestVersion;
+ var insertRows = state.cacheManager.getInsertRows();
+
+ if (!searchCondition) {
+ var pageData = [];
+ if (insertRows.length > 0) {
+ var startInInsert = (pageNumber - 1) * pageSize;
+ var endInInsert = startInInsert + pageSize;
+ pageData = insertRows.slice(startInInsert, endInInsert);
+ }
+
+ var totalPages = Math.ceil(insertRows.length / pageSize);
+ if (pageNumber > totalPages && insertRows.length > 0) {
+ pageNumber = Math.max(1, totalPages);
+ var startInInsert = (pageNumber - 1) * pageSize;
+ var endInInsert = startInInsert + pageSize;
+ pageData = insertRows.slice(startInInsert, endInInsert);
+ }
+
+ state.pagination.pageNumber = pageNumber;
+ _renderPage(pageData, insertRows.length, pageNumber, pageSize);
+ _clearLoading();
+ return;
+ }
+
+ var remoteTotal = state.pagination.remoteTotal;
+ var startIndex = (pageNumber - 1) * pageSize;
+ var endIndex = startIndex + pageSize;
+
+ if (insertRows.length > 0 && startIndex >= remoteTotal) {
+ var insertStart = startIndex - remoteTotal;
+ var insertEnd = endIndex - remoteTotal;
+ var pageData = insertRows.slice(insertStart, insertEnd);
+
+ var totalCount = remoteTotal + insertRows.length;
+
+ state.pagination.pageNumber = pageNumber;
+ _renderPage(pageData, totalCount, pageNumber, pageSize);
+ _clearLoading();
+ return;
+ }
+
+ var searchParam = {
+ viewname: options.viewName,
+ searchcondition: searchCondition,
+ userid: options.userid,
+ orderfield: options.orderField,
+ keyfield: options.keyField,
+ page: pageNumber,
+ rows: pageSize,
+ };
+
+ $.ajax({
+ type: "post",
+ url: options.searchUrl,
+ cache: false,
+ data: searchParam,
+ dataType: "json",
+ timeout: options.ajaxTimeout,
+ success: function (result) {
+ if (currentRequestVersion !== state.requestVersion) {
+ return;
+ }
+
+ var remoteRows = state.cacheManager.applyDraftStateToRemoteRows(result.rows);
+ remoteTotal = result.total;
+
+ var totalCount = remoteTotal + insertRows.length;
+ var totalPages = Math.ceil(totalCount / pageSize);
+
+ if (pageNumber > totalPages) {
+ pageNumber = Math.max(1, totalPages);
+ }
+
+ startIndex = (pageNumber - 1) * pageSize;
+ endIndex = startIndex + pageSize;
+
+ var pageData = [];
+
+ if (endIndex <= remoteTotal) {
+ pageData = remoteRows;
+ } else if (startIndex >= remoteTotal) {
+ var insertStart = startIndex - remoteTotal;
+ var insertEnd = endIndex - remoteTotal;
+ pageData = insertRows.slice(insertStart, insertEnd);
+ } else {
+ var remotePart = remoteRows.slice(startIndex - (pageNumber - 1) * pageSize);
+ var insertPart = insertRows.slice(0, endIndex - remoteTotal);
+ pageData = remotePart.concat(insertPart);
+ }
+
+ state.pagination.remoteTotal = remoteTotal;
+ state.pagination.pageNumber = pageNumber;
+
+ _renderPage(pageData, totalCount, pageNumber, pageSize);
+ },
+ error: function (xhr, status, error) {
+ if (currentRequestVersion !== state.requestVersion) {
+ return;
+ }
+
+ if (insertRows.length > 0) {
+ var startInInsert = (pageNumber - 1) * pageSize;
+ var endInInsert = startInInsert + pageSize;
+ var pageData = insertRows.slice(startInInsert, endInInsert);
+ _renderPage(pageData, insertRows.length, pageNumber, pageSize);
+ }
+
+ if (typeof options.onLoadError === "function") {
+ options.onLoadError(xhr, status, error);
+ } else {
+ console.log("分页加载失败: " + status);
+ }
+ },
+ complete: function () {
+ if (currentRequestVersion === state.requestVersion) {
+ _clearLoading();
+ }
+ },
+ });
+ }
+
+ function refreshCurrentPage() {
+ var currentPage = state.pagination.pageNumber;
+ loadPage(currentPage);
+ }
+
+ function refreshDisplay() {
+ var currentRows = $("#" + options.gridId).datagrid("getRows");
+ var cm = state.cacheManager;
+
+ for (var i = 0; i < currentRows.length; i++) {
+ var row = currentRows[i];
+ var key = cm.getRowKey(row);
+ var cachedRow = cm.getRowFromCache(key);
+
+ if (cachedRow) {
+ row._draftState = cachedRow._draftState;
+ row._rowState = cachedRow._draftState;
+ }
+ }
+
+ $("#" + options.gridId).datagrid("loadData", currentRows);
+
+ if (!cm.isAllChecked()) {
+ $("#" + options.gridId).datagrid("clearChecked");
+ }
+
+ _handleRowStyles();
+ _triggerCallback("onSelectionChange");
+ }
+
+ function refreshAfterDelete() {
+ var pageSize = state.pagination.pageSize;
+ var remoteTotal = state.pagination.remoteTotal;
+ var insertRows = state.cacheManager.getInsertRows();
+ var deleteRows = state.cacheManager.getDeleteRows();
+ var totalPages = Math.ceil((remoteTotal + insertRows.length) / pageSize);
+ var currentPage = state.pagination.pageNumber;
+
+ if (currentPage > totalPages && totalPages > 0) {
+ state.pagination.pageNumber = totalPages;
+ $("#" + _getPagerId()).pagination("select", totalPages);
+ } else if (remoteTotal === 0 && insertRows.length === 0) {
+ $("#" + options.gridId).datagrid("loadData", []);
+ $("#" + _getPagerId()).pagination("refresh", {
+ total: 0,
+ pageNumber: 1,
+ pageSize: pageSize,
+ });
+ } else {
+ loadPage(currentPage);
+ }
+
+ $("#" + options.gridId).datagrid("clearChecked");
+ _triggerCallback("onSelectionChange");
+ }
+
+ function refreshAfterUndo() {
+ var currentPage = state.pagination.pageNumber;
+ loadPage(currentPage);
+ }
+
+ function addInsertRows(rows) {
+ if (!$.isArray(rows)) rows = [rows];
+ var cm = state.cacheManager;
+
+ for (var i = 0; i < rows.length; i++) {
+ var row = rows[i];
+ var key = cm.getRowKey(row);
+ if (!cm.getRowFromCache(key)) {
+ cm.setRowToCache(row, true);
+ }
+ }
+ }
+
+ function removeInsertRow(row) {
+ var key = state.cacheManager.getRowKey(row);
+ state.cacheManager.removeRowFromCache(key);
+ }
+
+ function addDeleteRow(row) {
+ state.cacheManager.markRowDeleted(row);
+ }
+
+ function removeDeleteRow(row) {
+ state.cacheManager.unmarkRowDeleted(row);
+ refreshAfterUndo();
+ }
+
+ function addUpdateRow(row) {
+ state.cacheManager.updateRowInCache(row);
+ }
+
+ function deleteSelectedRows(canDeleteCallback) {
+ var currentPageRows = $("#" + options.gridId).datagrid("getRows");
+ var selectedRows = state.cacheManager.getValidSelectedRows(currentPageRows);
+ var cm = state.cacheManager;
+
+ if (selectedRows.length === 0) {
+ $.messager.alert("提示", "请选择要删除的行(已标记删除的行请使用「撤销删除」)", "warning");
+ return false;
+ }
+
+ if (canDeleteCallback) {
+ for (var i = selectedRows.length - 1; i >= 0; i--) {
+ var row = selectedRows[i];
+ var result = canDeleteCallback(row);
+ if (result !== true) {
+ $.messager.alert("提示", result || "该记录不能删除!", "warning");
+ return false;
+ }
+ }
+ }
+
+ var hasInsertDelete = false;
+ var hasRemoteDelete = false;
+
+ for (var i = selectedRows.length - 1; i >= 0; i--) {
+ var row = selectedRows[i];
+ var wasNew = cm.getRowFromCache(cm.getRowKey(row))?._isNew;
+
+ if (cm.markRowDeleted(row)) {
+ hasInsertDelete = true;
+ } else {
+ hasRemoteDelete = true;
+ }
+ }
+
+ if (cm.isAllChecked()) {
+ cm.setBatchDeleting(true);
+ }
+
+ if (hasInsertDelete) {
+ refreshAfterDelete();
+ } else if (hasRemoteDelete) {
+ refreshDisplay();
+ }
+
+ return true;
+ }
+
+ function undoDeleteSelectedRows() {
+ var cm = state.cacheManager;
+ var pageRows = $("#" + options.gridId).datagrid("getRows");
+ var targets = [];
+
+ var selectedRows = cm.getSelectedRows();
+ var selKeys = {};
+ for (var sk = 0; sk < selectedRows.length; sk++) {
+ selKeys[cm.getRowKey(selectedRows[sk])] = true;
+ }
+
+ var hasSelectionOnPage = false;
+ for (var hp = 0; hp < pageRows.length; hp++) {
+ if (selKeys[cm.getRowKey(pageRows[hp])]) {
+ hasSelectionOnPage = true;
+ break;
+ }
+ }
+
+ if (cm.isAllChecked() && cm.isBatchDeleting()) {
+ for (var u = 0; u < pageRows.length; u++) {
+ var row = pageRows[u];
+ var key = cm.getRowKey(row);
+ if (row._draftState === 'delete' && !cm.isExcluded(key)) {
+ targets.push(row);
+ }
+ }
+ } else if (!hasSelectionOnPage) {
+ for (var u = 0; u < pageRows.length; u++) {
+ if (pageRows[u]._draftState === 'delete') {
+ targets.push(pageRows[u]);
+ }
+ }
+ } else {
+ for (var v = 0; v < pageRows.length; v++) {
+ var pr = pageRows[v];
+ if (pr._draftState === 'delete' && selKeys[cm.getRowKey(pr)]) {
+ targets.push(pr);
+ }
+ }
+ }
+
+ if (targets.length === 0) {
+ $.messager.alert("提示", "当前页没有可撤销的删除行", "warning");
+ return false;
+ }
+
+ var restoredRowIndexes = [];
+ for (var w = 0; w < targets.length; w++) {
+ var row = targets[w];
+ if (row._draftState !== 'delete') {
+ continue;
+ }
+ var rowIndex = $("#" + options.gridId).datagrid("getRowIndex", row);
+ cm.unmarkRowDeleted(row);
+ cm.setSelection(cm.getRowKey(row), true);
+ if (rowIndex >= 0) {
+ restoredRowIndexes.push(rowIndex);
+ }
+ }
+
+ cm.setBatchDeleting(false);
+ refreshAfterUndo();
+
+ for (var r = 0; r < restoredRowIndexes.length; r++) {
+ $("#" + options.gridId).datagrid("checkRow", restoredRowIndexes[r]);
+ }
+
+ return true;
+ }
+
+ function toggleSelectAll() {
+ state.isSyncing = true;
+ var btn = $(options.selectAllBtn);
+ var cm = state.cacheManager;
+
+ if (cm.isAllChecked()) {
+ cm.setAllChecked(false);
+ cm.setBatchDeleting(false);
+ cm.clearAllExclusions();
+ cm.clearAllSelections();
+ $("#" + options.gridId).datagrid("clearChecked");
+ if (btn.length) btn.val(options.selectAllText);
+ } else {
+ cm.setAllChecked(true);
+ cm.clearAllExclusions();
+ var rows = $("#" + options.gridId).datagrid("getRows");
+ for (var i = 0; i < rows.length; i++) {
+ $("#" + options.gridId).datagrid("checkRow", i);
+ }
+ if (btn.length) btn.val(options.unselectAllText);
+ }
+
+ state.isSyncing = false;
+ _triggerCallback("onSelectionChange");
+ }
+
+ function clearSelection() {
+ var cm = state.cacheManager;
+ cm.setAllChecked(false);
+ cm.setBatchDeleting(false);
+ cm.clearAllExclusions();
+ cm.clearAllSelections();
+ $("#" + options.gridId).datagrid("clearChecked");
+ _triggerCallback("onSelectionChange");
+ }
+
+ function setAllChecked(value) {
+ var cm = state.cacheManager;
+ cm.setAllChecked(value);
+ if (value) cm.clearAllExclusions();
+ _syncGridChecks();
+ _triggerCallback("onSelectionChange");
+ }
+
+ function setSearchCondition(condition) {
+ options.searchCondition = condition;
+ }
+
+ function clearSearch() {
+ options.searchCondition = null;
+ }
+
+ function reload(newSearchCondition) {
+ if (newSearchCondition !== undefined) {
+ options.searchCondition = newSearchCondition;
+ }
+ state.pagination.pageNumber = 1;
+ state.pagination.remoteTotal = 0;
+ loadPage(1);
+ }
+
+ function resetSearch() {
+ options.searchCondition = null;
+ reload();
+ }
+
+ function _triggerCallback(callbackName) {
+ var callback = options[callbackName];
+ if (typeof callback === "function") {
+ var args = Array.prototype.slice.call(arguments, 1);
+ callback.apply(null, args);
+ }
+ }
+
+ function handleAfterEdit(rowIndex, row, changes) {
+ if (Object.keys(changes).length === 0) return;
+
+ var cm = state.cacheManager;
+ var key = cm.getRowKey(row);
+ var cachedRow = cm.getRowFromCache(key);
+
+ if (cachedRow && cachedRow._draftState === 'delete') {
+ return;
+ }
+
+ cm.updateRowInCache(row);
+ _triggerCallback("onAfterEdit", rowIndex, row, changes);
+ }
+
+ function handleRowCheck(index, row) {
+ var cm = state.cacheManager;
+
+ if (cm.isAllChecked()) {
+ cm.setExclusion(cm.getRowKey(row), false);
+ } else {
+ cm.setSelection(cm.getRowKey(row), true);
+ }
+
+ if (!state.isSyncing) {
+ _triggerCallback("onSelectionChange");
+ }
+ }
+
+ function handleRowUncheck(index, row) {
+ var cm = state.cacheManager;
+
+ if (cm.isAllChecked()) {
+ cm.setExclusion(cm.getRowKey(row), true);
+ } else {
+ cm.setSelection(cm.getRowKey(row), false);
+ }
+
+ if (!state.isSyncing) {
+ _triggerCallback("onSelectionChange");
+ }
+ }
+
+ function handleCheckAll() {
+ state.isSyncing = true;
+ var cm = state.cacheManager;
+ var rows = $("#" + options.gridId).datagrid("getRows");
+ for (var i = 0; i < rows.length; i++) {
+ var key = cm.getRowKey(rows[i]);
+ if (cm.isAllChecked()) {
+ cm.setExclusion(key, false);
+ } else {
+ cm.setSelection(key, true);
+ }
+ }
+ state.isSyncing = false;
+ _triggerCallback("onSelectionChange");
+ }
+
+ function handleUncheckAll() {
+ state.isSyncing = true;
+ var cm = state.cacheManager;
+ var rows = $("#" + options.gridId).datagrid("getRows");
+ for (var i = 0; i < rows.length; i++) {
+ var key = cm.getRowKey(rows[i]);
+ if (cm.isAllChecked()) {
+ cm.setExclusion(key, true);
+ } else {
+ cm.setSelection(key, false);
+ }
+ }
+ state.isSyncing = false;
+ _triggerCallback("onSelectionChange");
+ }
+
+ function handleLoadSuccess() {
+ $.messager.progress("close");
+ _syncGridChecks();
+ _handleRowStyles();
+ var rows = $("#" + options.gridId).datagrid("getRows");
+ _triggerCallback("onLoadSuccess", rows);
+ }
+
+ function reset() {
+ state.editIndex = undefined;
+ state.isLoading = false;
+ state.pagination = {
+ pageSize: options.pageSize,
+ pageNumber: 1,
+ remoteTotal: 0,
+ };
+ if (state.cacheManager) state.cacheManager.reset();
+ }
+
+ function _initGrid() {
+ var pagerId = _getPagerId();
+ var pagerSelector = "#" + pagerId;
+
+ var baseDatagridOptions = {
+ idField: options.keyField,
+ pageSize: options.pageSize,
+ rowStyler: function (index, row) {
+ var draftState = row._draftState;
+
+ if (!draftState && state.cacheManager) {
+ var key = state.cacheManager.getRowKey(row);
+ var cachedRow = state.cacheManager.getRowFromCache(key);
+ if (cachedRow) {
+ draftState = cachedRow._draftState;
+ }
+ }
+
+ var stateStyle = options.rowStateStyles[draftState] || options.rowStateStyles[row._rowState];
+ return stateStyle || "";
+ },
+ onLoadSuccess: handleLoadSuccess,
+ onAfterEdit: handleAfterEdit,
+ onCheckAll: handleCheckAll,
+ onUncheckAll: handleUncheckAll,
+ onCheck: handleRowCheck,
+ onUncheck: handleRowUncheck,
+ };
+
+ var datagridOptions = options.customDatagridOptions
+ ? $.extend(true, {}, baseDatagridOptions, options.customDatagridOptions)
+ : baseDatagridOptions;
+
+ $("#" + options.gridId)
+ .datagrid(datagridOptions)
+ .datagrid("columnMoving");
+
+ $("#" + options.gridId)
+ .datagrid("getPanel")
+ .find(".datagrid-body")
+ .on("scroll.datagrid", function () {
+ if (state.editIndex !== undefined) {
+ $("#" + options.gridId).datagrid("endEdit", state.editIndex);
+ state.editIndex = undefined;
+ }
+ });
+
+ $(pagerSelector).pagination({
+ total: 0,
+ pageSize: options.pageSize,
+ pageNumber: 1,
+ pageList: options.pageList,
+ onSelectPage: function (pageNumber, pageSize) {
+ state.pagination.pageNumber = pageNumber;
+ state.pagination.pageSize = pageSize;
+ loadPage(pageNumber);
+ },
+ onChangePageSize: function (pageSize) {
+ state.pagination.pageNumber = 1;
+ state.pagination.pageSize = pageSize;
+
+ if (!state.cacheManager.isAllChecked()) {
+ $("#" + options.gridId).datagrid("clearChecked");
+ state.cacheManager.clearAllSelections();
+ }
+
+ _triggerCallback("onSelectionChange");
+ loadPage(1);
+ },
+ });
+ }
+
+ function setColumns(columns) {
+ $("#" + options.gridId).datagrid({
+ columns: [columns],
+ });
+ }
+
+ function isLoading() {
+ return state.isLoading;
+ }
+
+ function getPager() {
+ return $("#" + _getPagerId());
+ }
+
+ function getGrid() {
+ return $("#" + options.gridId);
+ }
+
+ function getRowsForSubmission() {
+ return state.cacheManager.getRowsForSubmission();
+ }
+
+ return {
+ setColumns: setColumns,
+ loadPage: loadPage,
+ refreshCurrentPage: refreshCurrentPage,
+ refreshDisplay: refreshDisplay,
+ refreshAfterDelete: refreshAfterDelete,
+ refreshAfterUndo: refreshAfterUndo,
+
+ addInsertRows: addInsertRows,
+ removeInsertRow: removeInsertRow,
+ addDeleteRow: addDeleteRow,
+ removeDeleteRow: removeDeleteRow,
+ addUpdateRow: addUpdateRow,
+ deleteSelectedRows: deleteSelectedRows,
+ undoDeleteSelectedRows: undoDeleteSelectedRows,
+
+ getValidSelectedRows: function () {
+ var currentPageRows = $("#" + options.gridId).datagrid("getRows");
+ return state.cacheManager.getValidSelectedRows(currentPageRows);
+ },
+ getSelectedRows: function () {
+ return state.cacheManager.getSelectedRows();
+ },
+ toggleSelectAll: toggleSelectAll,
+ clearSelection: clearSelection,
+ isAllChecked: function () {
+ console.log("===1===")
+ return state.cacheManager.isAllChecked();
+ },
+ setAllChecked: setAllChecked,
+
+ getInsertRows: function () {
+ return state.cacheManager.getInsertRows();
+ },
+ getUpdateRows: function () {
+ return state.cacheManager.getUpdateRows();
+ },
+ getDeleteRows: function () {
+ return state.cacheManager.getDeleteRows();
+ },
+ getExcludedRows: function () {
+ return state.cacheManager.getExcludedRows();
+ },
+
+ getRowsForSubmission: getRowsForSubmission,
+
+ getCacheManager: function () {
+ return state.cacheManager;
+ },
+
+ setSearchCondition: setSearchCondition,
+ clearSearch: clearSearch,
+ reload: reload,
+ resetSearch: resetSearch,
+
+ isLoading: isLoading,
+ getPager: getPager,
+ getGrid: getGrid,
+ reset: reset,
+ };
+ }
+
+ window.createDataGridManager = createDataGridManager;
+})(window);
\ No newline at end of file
diff --git a/code/jsp/js/feegrid-manager.js b/code/jsp/js/feegrid-manager.js
index f0d134e2..fdd122fc 100644
--- a/code/jsp/js/feegrid-manager.js
+++ b/code/jsp/js/feegrid-manager.js
@@ -1,13 +1,20 @@
/**
- * DataGrid 公共管理模块
- *
- * 核心设计原则:
- * 1. 草稿态维护最终状态,而非操作过程
- * 2. delete 是临时挂起状态,保留 backup 用于恢复
- * 3. 本地数据不参与条件搜索,搜索完全依赖远程接口
- * 4. 搜索与展示分离:搜索=远程,展示=本地状态覆盖
- * 5. baseSearchCondition 作为永久根条件
- *
+ * DataGrid 公共管理模块 - 重构版本
+ *
+ * 核心架构:全局缓存 + 单状态源
+ *
+ * 设计原则:
+ * 1. 单状态源:所有状态仅保存在 row 对象上
+ * 2. 全局缓存层:所有数据统一进入 allRowMap
+ * 3. 状态标记:通过 row._draftState 标识状态
+ * 4. 分页安全:状态不依赖当前页数据,从缓存恢复
+ *
+ * 状态定义:
+ * - _isNew: true 表示前端新增未提交数据
+ * - _draftState: null | 'add' | 'update' | 'delete'
+ * - _originData: 原始数据备份(用于撤销)
+ * - _changedFields: 变更字段列表
+ *
* 使用方式:
* var gridManager = createDataGridManager({
* gridId: 'feegrid',
@@ -20,918 +27,1281 @@
* });
*/
(function (window) {
- "use strict";
+ "use strict";
- // ==================== DraftStateManager(内部模块)====================
+ // ==================== GlobalCacheManager(全局缓存管理器)====================
- function createDraftStateManager(config) {
- var keyField = (config && config.keyField) || "id";
- var defaultPageSize = (config && config.pageSize) || 50;
+ /**
+ * 创建全局缓存管理器
+ * @param {Object} config 配置参数
+ * @param {string} config.keyField 主键字段名
+ */
+ function createGlobalCacheManager(config) {
+ var keyField = (config && config.keyField) || "id";
- var draftStateMap = {};
- var isAllChecked = false;
+ var allRowMap = {};
+ var draftRowMap = {};
+ var selectionMap = {};
+ var exclusionMap = {};
+ var isAllChecked = false;
+ var isBatchDeleting = false;
- var pagination = {
- pageSize: defaultPageSize,
- pageNumber: 1,
- remoteTotal: 0,
- };
+ function cloneRow(obj) {
+ if (!obj) return null;
+ return JSON.parse(JSON.stringify(obj));
+ }
- function initOrUpdateDraftState(rowId) {
- if (!draftStateMap[rowId]) {
- draftStateMap[rowId] = {
- state: null,
- data: null,
- backup: null,
- selected: false,
- excluded: false,
+ function getRowKey(row) {
+ return row[keyField];
+ }
+
+ function initDraftState(rowId) {
+ if (!draftRowMap[rowId]) {
+ draftRowMap[rowId] = {
+ state: null,
+ originData: null,
+ changedFields: []
+ };
+ }
+ return draftRowMap[rowId];
+ }
+
+ function setRowToCache(row, isNew) {
+ var key = getRowKey(row);
+ var cachedRow = cloneRow(row);
+
+ if (!allRowMap[key]) {
+ cachedRow._isNew = isNew || false;
+ cachedRow._draftState = isNew ? 'add' : null;
+ cachedRow._originData = isNew ? null : cloneRow(row);
+ cachedRow._changedFields = [];
+ } else {
+ cachedRow._isNew = allRowMap[key]._isNew;
+ cachedRow._draftState = allRowMap[key]._draftState;
+ cachedRow._originData = allRowMap[key]._originData;
+ cachedRow._changedFields = allRowMap[key]._changedFields;
+ }
+
+ allRowMap[key] = cachedRow;
+ return cachedRow;
+ }
+
+ function getRowFromCache(rowId) {
+ return allRowMap[rowId] || null;
+ }
+
+ function removeRowFromCache(rowId) {
+ delete allRowMap[rowId];
+ delete draftRowMap[rowId];
+ delete selectionMap[rowId];
+ delete exclusionMap[rowId];
+ }
+
+ function updateRowInCache(row) {
+ var key = getRowKey(row);
+ var existing = allRowMap[key];
+
+ if (!existing) {
+ return setRowToCache(row, false);
+ }
+
+ var draftState = existing._draftState;
+
+ if (draftState !== 'delete') {
+ existing._draftState = existing._isNew ? 'add' : 'update';
+
+ for (var field in row) {
+ if (field !== keyField && field.indexOf('_') !== 0) {
+ if (!existing._originData) {
+ existing._originData = cloneRow(existing);
+ }
+ if (existing._originData[field] !== row[field]) {
+ if (existing._changedFields.indexOf(field) === -1) {
+ existing._changedFields.push(field);
+ }
+ } else {
+ var idx = existing._changedFields.indexOf(field);
+ if (idx !== -1) {
+ existing._changedFields.splice(idx, 1);
+ }
+ }
+ existing[field] = row[field];
+ }
+ }
+ }
+
+ return existing;
+ }
+
+ function markRowDeleted(row) {
+ var key = getRowKey(row);
+ var cachedRow = allRowMap[key];
+
+ if (!cachedRow) {
+ cachedRow = setRowToCache(row, false);
+ }
+
+ if (cachedRow._isNew) {
+ removeRowFromCache(key);
+ return true;
+ }
+
+ if (cachedRow._draftState !== 'delete') {
+ if (!cachedRow._originData) {
+ cachedRow._originData = cloneRow(cachedRow);
+ }
+ cachedRow._draftState = 'delete';
+ cachedRow._changedFields = [];
+ }
+
+ if (!isAllChecked) {
+ setSelection(key, false);
+ }
+ return false;
+ }
+
+ function unmarkRowDeleted(row) {
+ var key = getRowKey(row);
+ var cachedRow = allRowMap[key];
+
+ if (!cachedRow || cachedRow._draftState !== 'delete') {
+ return false;
+ }
+
+ if (cachedRow._originData) {
+ var originState = cachedRow._originData._draftState;
+ cachedRow._draftState = originState || null;
+ cachedRow._changedFields = cachedRow._originData._changedFields || [];
+
+ for (var field in cachedRow._originData) {
+ if (field.indexOf('_') !== 0) {
+ cachedRow[field] = cachedRow._originData[field];
+ }
+ }
+ } else {
+ cachedRow._draftState = null;
+ cachedRow._changedFields = [];
+ }
+
+ return true;
+ }
+
+ function setSelection(rowId, selected) {
+ selectionMap[rowId] = selected;
+ }
+
+ function isSelected(rowId) {
+ return selectionMap[rowId] === true;
+ }
+
+ function setExclusion(rowId, excluded) {
+ exclusionMap[rowId] = excluded;
+ }
+
+ function isExcluded(rowId) {
+ return exclusionMap[rowId] === true;
+ }
+
+ function clearAllSelections() {
+ selectionMap = {};
+ }
+
+ function clearAllExclusions() {
+ exclusionMap = {};
+ }
+
+ function applyDraftStateToRemoteRows(remoteRows) {
+ var result = [];
+
+ for (var i = 0; i < remoteRows.length; i++) {
+ var row = remoteRows[i];
+ var key = getRowKey(row);
+ var cachedRow = allRowMap[key];
+
+ if (cachedRow) {
+ if (isBatchDeleting && !exclusionMap[key] && cachedRow._draftState !== 'add') {
+ cachedRow._draftState = 'delete';
+ if (!cachedRow._originData) {
+ cachedRow._originData = cloneRow(cachedRow);
+ }
+ var deleteRow = cloneRow(cachedRow);
+ deleteRow._rowState = 'delete';
+ result.push(deleteRow);
+ } else if (cachedRow._draftState === 'delete') {
+ var deleteRow = cloneRow(cachedRow);
+ deleteRow._rowState = 'delete';
+ result.push(deleteRow);
+ } else if (cachedRow._draftState === 'add' || cachedRow._draftState === 'update') {
+ var draftRow = cloneRow(cachedRow);
+ draftRow._rowState = cachedRow._draftState;
+ result.push(draftRow);
+ } else {
+ setRowToCache(row, false);
+ result.push(cloneRow(row));
+ }
+ } else {
+ setRowToCache(row, false);
+
+ if (isBatchDeleting && !exclusionMap[key]) {
+ var newCachedRow = allRowMap[key];
+ newCachedRow._draftState = 'delete';
+ if (!newCachedRow._originData) {
+ newCachedRow._originData = cloneRow(newCachedRow);
+ }
+ var deleteRow = cloneRow(newCachedRow);
+ deleteRow._rowState = 'delete';
+ result.push(deleteRow);
+ } else {
+ result.push(cloneRow(row));
+ }
+ }
+ }
+
+ return result;
+ }
+
+ function getRowsForSubmission() {
+ var addRows = [];
+ var updateRows = [];
+ var deleteRows = [];
+
+ for (var key in allRowMap) {
+ var row = allRowMap[key];
+ var draftState = row._draftState;
+
+ switch (draftState) {
+ case 'add':
+ var addRow = cloneRow(row);
+ delete addRow._isNew;
+ delete addRow._draftState;
+ delete addRow._originData;
+ delete addRow._changedFields;
+ delete addRow._rowState;
+ addRows.push(addRow);
+ break;
+ case 'update':
+ var updateRow = cloneRow(row);
+ delete updateRow._isNew;
+ delete updateRow._draftState;
+ delete updateRow._originData;
+ delete updateRow._changedFields;
+ delete updateRow._rowState;
+ updateRows.push(updateRow);
+ break;
+ case 'delete':
+ var deleteRow = cloneRow(row);
+ delete deleteRow._isNew;
+ delete deleteRow._draftState;
+ delete deleteRow._originData;
+ delete deleteRow._changedFields;
+ delete deleteRow._rowState;
+ deleteRows.push(deleteRow);
+ break;
+ }
+ }
+
+ return {
+ addRows: addRows,
+ updateRows: updateRows,
+ deleteRows: deleteRows
+ };
+ }
+
+ function getRowsByState(stateFilter) {
+ var result = [];
+ for (var key in allRowMap) {
+ var row = allRowMap[key];
+ if (row._draftState === stateFilter) {
+ result.push(cloneRow(row));
+ }
+ }
+ return result;
+ }
+
+ function getSelectedRowIds() {
+ var ids = [];
+ for (var key in selectionMap) {
+ if (selectionMap[key] === true) {
+ var row = allRowMap[key];
+ if (!row || row._draftState !== 'delete') {
+ ids.push(key);
+ }
+ }
+ }
+ return ids;
+ }
+
+ function getSelectedRows() {
+ var rows = [];
+ for (var key in selectionMap) {
+ if (selectionMap[key] === true) {
+ var row = allRowMap[key];
+ if (row) {
+ rows.push(cloneRow(row));
+ }
+ }
+ }
+ return rows;
+ }
+
+ function getValidSelectedRows(currentPageRows) {
+ var rows = [];
+
+ if (isAllChecked && currentPageRows && currentPageRows.length > 0) {
+ for (var i = 0; i < currentPageRows.length; i++) {
+ var row = currentPageRows[i];
+ var key = getRowKey(row);
+
+ if (!exclusionMap[key]) {
+ var cachedRow = allRowMap[key];
+ if (cachedRow && cachedRow._draftState !== 'delete') {
+ rows.push(cloneRow(cachedRow));
+ } else if (!cachedRow && row._draftState !== 'delete') {
+ rows.push(cloneRow(row));
+ }
+ }
+ }
+ } else {
+ for (var key in selectionMap) {
+ if (selectionMap[key] === true) {
+ var row = allRowMap[key];
+ if (row && row._draftState !== 'delete') {
+ rows.push(cloneRow(row));
+ }
+ }
+ }
+ }
+
+ return rows;
+ }
+
+ function getExcludedRowIds() {
+ var ids = [];
+ for (var key in exclusionMap) {
+ if (exclusionMap[key] === true) {
+ ids.push(key);
+ }
+ }
+ return ids;
+ }
+
+ function getExcludedRows() {
+ var rows = [];
+ for (var key in exclusionMap) {
+ if (exclusionMap[key] === true) {
+ var row = allRowMap[key];
+ if (row && row._draftState !== 'delete') {
+ rows.push(cloneRow(row));
+ }
+ }
+ }
+ return rows;
+ }
+
+ function reset() {
+ allRowMap = {};
+ draftRowMap = {};
+ selectionMap = {};
+ exclusionMap = {};
+ isAllChecked = false;
+ isBatchDeleting = false;
+ }
+
+ return {
+ keyField: keyField,
+ cloneRow: cloneRow,
+ getRowKey: getRowKey,
+ setRowToCache: setRowToCache,
+ getRowFromCache: getRowFromCache,
+ removeRowFromCache: removeRowFromCache,
+ updateRowInCache: updateRowInCache,
+ markRowDeleted: markRowDeleted,
+ unmarkRowDeleted: unmarkRowDeleted,
+ setSelection: setSelection,
+ isSelected: isSelected,
+ setExclusion: setExclusion,
+ isExcluded: isExcluded,
+ clearAllSelections: clearAllSelections,
+ clearAllExclusions: clearAllExclusions,
+ applyDraftStateToRemoteRows: applyDraftStateToRemoteRows,
+ getRowsForSubmission: getRowsForSubmission,
+ getRowsByState: getRowsByState,
+ getSelectedRowIds: getSelectedRowIds,
+ getSelectedRows: getSelectedRows,
+ getValidSelectedRows: getValidSelectedRows,
+ getExcludedRowIds: getExcludedRowIds,
+ getExcludedRows: getExcludedRows,
+
+ isAllChecked: function () { return isAllChecked; },
+ setAllChecked: function (value) {
+ isAllChecked = value;
+ if (value) clearAllSelections();
+ },
+
+ isBatchDeleting: function () { return isBatchDeleting; },
+ setBatchDeleting: function (value) {
+ if (!value && isBatchDeleting) {
+ for (var key in allRowMap) {
+ var row = allRowMap[key];
+ if (row._draftState === 'delete' && !exclusionMap[key]) {
+ if (row._originData) {
+ var originState = row._originData._draftState;
+ row._draftState = originState || null;
+ row._changedFields = row._originData._changedFields || [];
+
+ for (var field in row._originData) {
+ if (field.indexOf('_') !== 0) {
+ row[field] = row._originData[field];
+ }
+ }
+ } else {
+ row._draftState = null;
+ row._changedFields = [];
+ }
+ }
+ }
+ }
+ isBatchDeleting = value;
+ },
+
+ getInsertRows: function () { return getRowsByState('add'); },
+ getUpdateRows: function () { return getRowsByState('update'); },
+ getDeleteRows: function () { return getRowsByState('delete'); },
+
+ reset: reset
};
- }
- return draftStateMap[rowId];
}
- function setDraftState(rowId, state, data, backup) {
- var draftState = initOrUpdateDraftState(rowId);
- draftState.state = state;
- draftState.data = data;
- draftState.backup = backup;
- }
+ // ==================== createDataGridManager(导出模块)====================
- function getDraftState(rowId) {
- return draftStateMap[rowId];
- }
+ function createDataGridManager(config) {
+ var $ = window.jQuery;
- function removeDraftState(rowId) {
- delete draftStateMap[rowId];
- }
+ var DEFAULT_CONFIG = {
+ gridId: "feegrid",
+ keyField: "subid",
+ pageSize: 50,
+ viewName: "",
+ searchUrl: "jsp/searchdatapagenew.jsp",
+ orderField: "b_id",
+ baseSearchCondition: null,
+ searchCondition: null,
+ pageList: [50, 100, 200],
+ rowStateStyles: {
+ add: "background-color: #f6ffed;",
+ update: "background-color: #fffbe6;",
+ delete: "background-color: #fff1f0;",
+ },
+ selectAllBtn: "#btn_select_all",
+ selectAllText: "全部选中",
+ unselectAllText: "全部反选",
+ userid: "",
+ customDatagridOptions: null,
+ ajaxTimeout: 30000,
+ onLoadError: null,
+ onLoadSuccess: null,
+ onAfterEdit: null,
+ onSelectionChange: null,
+ pagerId: null,
+ };
- function hasDraftState(rowId) {
- return draftStateMap.hasOwnProperty(rowId);
- }
+ var options = $.extend(true, {}, DEFAULT_CONFIG, config);
- function setRowSelected(rowId, selected) {
- var draftState = initOrUpdateDraftState(rowId);
- draftState.selected = selected;
- }
+ var state = {
+ cacheManager: null,
+ editIndex: undefined,
+ isLoading: false,
+ pagerId: null,
+ requestVersion: 0,
+ isFirstLoad: true,
+ isSyncing: false,
+ pagination: {
+ pageSize: options.pageSize,
+ pageNumber: 1,
+ remoteTotal: 0,
+ }
+ };
- function setRowExcluded(rowId, excluded) {
- var draftState = initOrUpdateDraftState(rowId);
- draftState.excluded = excluded;
- }
+ _initCacheManager();
+ _initGrid();
- function addInsertRow(row) {
- if (!row._rowState) row._rowState = "insert";
- var key = getRowKey(row);
- setDraftState(key, "insert", row, null);
- }
-
- function removeInsertRow(row) {
- var key = getRowKey(row);
- removeDraftState(key);
- }
-
- function addUpdateRow(row) {
- var key = getRowKey(row);
- var existingState = getDraftState(key);
-
- if (existingState && existingState.state === "delete") {
- return;
- }
-
- row._rowState = "update";
- setDraftState(key, "update", row, null);
- }
-
- function addDeleteRow(row) {
- var key = getRowKey(row);
- var existingState = getDraftState(key);
-
- var backupData = existingState ? existingState.data : row;
- row._rowState = "delete";
-
- setDraftState(key, "delete", row, backupData);
- setRowSelected(key, false);
- }
-
- function recoverRow(row) {
- var key = getRowKey(row);
- var state = getDraftState(key);
-
- if (state && state.state === "delete") {
- if (state.backup) {
- var backupState = state.backup._rowState || "";
- setDraftState(key, backupState, state.backup, null);
- row._rowState = backupState;
- } else {
- removeDraftState(key);
- row._rowState = "";
+ function _initCacheManager() {
+ state.cacheManager = createGlobalCacheManager({
+ keyField: options.keyField
+ });
}
- }
- }
- function addSelectedRow(row) {
- var key = getRowKey(row);
- setRowSelected(key, true);
- }
-
- function removeSelectedRow(row) {
- var key = getRowKey(row);
- setRowSelected(key, false);
- }
-
- function clearSelectedRows() {
- for (var key in draftStateMap) {
- draftStateMap[key].selected = false;
- }
- }
-
- function addExcludedRow(row) {
- var key = getRowKey(row);
- setRowExcluded(key, true);
- }
-
- function removeExcludedRow(row) {
- var key = getRowKey(row);
- setRowExcluded(key, false);
- }
-
- function clearExcludedRows() {
- for (var key in draftStateMap) {
- draftStateMap[key].excluded = false;
- }
- }
-
- function isRowExcluded(row) {
- var key = getRowKey(row);
- var state = getDraftState(key);
- return state ? state.excluded : false;
- }
-
- function cloneRow(row) {
- if (!row) return null;
- return JSON.parse(JSON.stringify(row));
- }
-
- function applyDraftState(remoteRows) {
- var displayRows = [];
-
- for (var i = 0; i < remoteRows.length; i++) {
- var row = remoteRows[i];
- var key = getRowKey(row);
- var draftState = getDraftState(key);
-
- if (draftState) {
- switch (draftState.state) {
- case "delete":
- continue;
- case "update":
- case "insert":
- displayRows.push(cloneRow(draftState.data));
- break;
- default:
- displayRows.push(cloneRow(row));
- }
- } else {
- displayRows.push(cloneRow(row));
+ function _getPagerId() {
+ if (!state.pagerId) {
+ state.pagerId = options.pagerId || (options.gridId + "_pager");
+ }
+ return state.pagerId;
}
- }
- return displayRows;
- }
-
- function reset() {
- draftStateMap = {};
- isAllChecked = false;
- pagination = {
- pageSize: defaultPageSize,
- pageNumber: 1,
- remoteTotal: 0,
- };
- }
-
- function getRowKey(row) {
- return row[keyField];
- }
-
- function getRowIdsByState(stateFilter) {
- var ids = [];
- for (var key in draftStateMap) {
- var state = draftStateMap[key];
- if (state.state === stateFilter) {
- ids.push(key);
+ function _setLoading() {
+ state.isLoading = true;
+ $("#" + options.gridId).datagrid("loading");
+ $("#" + _getPagerId())
+ .css({
+ "pointer-events": "none",
+ opacity: "0.6",
+ })
+ .pagination("loading");
}
- }
- return ids;
- }
- return {
- keyField: keyField,
-
- setDraftState: setDraftState,
- getDraftState: getDraftState,
- removeDraftState: removeDraftState,
- hasDraftState: hasDraftState,
-
- addInsertRow: addInsertRow,
- removeInsertRow: removeInsertRow,
- addUpdateRow: addUpdateRow,
- addDeleteRow: addDeleteRow,
- recoverRow: recoverRow,
-
- getInsertRows: function () {
- var inserts = [];
- for (var key in draftStateMap) {
- if (draftStateMap[key].state === "insert") {
- inserts.push(draftStateMap[key].data);
- }
+ function _clearLoading() {
+ state.isLoading = false;
+ $("#" + options.gridId).datagrid("loaded");
+ $("#" + _getPagerId())
+ .css({
+ "pointer-events": "",
+ opacity: "",
+ })
+ .pagination("loaded");
}
- return inserts;
- },
- getInsertRowIds: function () {
- return getRowIdsByState("insert");
- },
- getUpdateRows: function () {
- var updates = [];
- for (var key in draftStateMap) {
- if (draftStateMap[key].state === "update") {
- updates.push(draftStateMap[key].data);
- }
+
+ function _syncGridChecks() {
+ var rows = $("#" + options.gridId).datagrid("getRows");
+ var cm = state.cacheManager;
+
+ state.isSyncing = true;
+
+ for (var i = 0; i < rows.length; i++) {
+ var row = rows[i];
+ var key = cm.getRowKey(row);
+ var shouldCheck = false;
+
+ if (cm.isAllChecked()) {
+ shouldCheck = !cm.isExcluded(key);
+ } else {
+ shouldCheck = cm.isSelected(key);
+ }
+
+ if (shouldCheck) {
+ $("#" + options.gridId).datagrid("checkRow", i);
+ } else {
+ $("#" + options.gridId).datagrid("uncheckRow", i);
+ }
+ }
+
+ state.isSyncing = false;
}
- return updates;
- },
- getDeleteRows: function () {
- var deletes = [];
- for (var key in draftStateMap) {
- if (draftStateMap[key].state === "delete") {
- deletes.push(draftStateMap[key].data);
- }
+
+ function _handleRowStyles() {
+ $(".datagrid-body tr").each(function () {
+ var rowIndex = $(this).attr("datagrid-row-index");
+ if (rowIndex !== undefined) {
+ var row = $("#" + options.gridId).datagrid("getRows")[parseInt(rowIndex)];
+ if (row && row._draftState === 'delete') {
+ $(this).addClass("datagrid-row-delete");
+ } else {
+ $(this).removeClass("datagrid-row-delete");
+ }
+ }
+ });
}
- return deletes;
- },
- addSelectedRow: addSelectedRow,
- removeSelectedRow: removeSelectedRow,
- getSelectedRowIds: function () {
- var ids = [];
- for (var key in draftStateMap) {
- if (
- draftStateMap[key].selected &&
- (!draftStateMap[key].state || draftStateMap[key].state !== "delete")
- ) {
- ids.push(key);
- }
+ function buildFinalCondition() {
+ var parts = [];
+
+ if (options.baseSearchCondition) {
+ parts.push(options.baseSearchCondition);
+ }
+
+ if (options.searchCondition) {
+ parts.push(options.searchCondition);
+ }
+
+ return parts.join(" AND ");
}
- return ids;
- },
- getSelectedRows: function () {
- var rows = [];
- for (var key in draftStateMap) {
- var state = draftStateMap[key];
- if (state.selected && state.data) {
- rows.push(state.data);
- }
+
+ function _renderPage(pageData, total, pageNumber, pageSize) {
+ $("#" + options.gridId).datagrid("loadData", pageData);
+ $("#" + _getPagerId()).pagination("refresh", {
+ total: total,
+ pageNumber: pageNumber,
+ pageSize: pageSize,
+ });
}
- return rows;
- },
- getValidSelectedRows: function () {
- var rows = [];
- for (var key in draftStateMap) {
- var state = draftStateMap[key];
- if (
- state.selected &&
- state.data &&
- (!state.state || state.state !== "delete")
- ) {
- rows.push(state.data);
- }
+
+ function _refresh(mode) {
+ switch (mode) {
+ case "full":
+ state.pagination.pageNumber = 1;
+ state.pagination.remoteTotal = 0;
+ loadPage(1);
+ break;
+ case "page":
+ refreshCurrentPage();
+ break;
+ case "display":
+ default:
+ refreshDisplay();
+ break;
+ }
}
- return rows;
- },
- clearSelectedRows: clearSelectedRows,
- isAllChecked: function () {
- return isAllChecked;
- },
- setAllChecked: function (value) {
- isAllChecked = value;
- if (value) clearSelectedRows();
- },
+ function loadPage(pageNumber) {
+ _setLoading();
- addExcludedRow: addExcludedRow,
- removeExcludedRow: removeExcludedRow,
- getExcludedRowIds: function () {
- var ids = [];
- for (var key in draftStateMap) {
- if (draftStateMap[key].excluded) {
- ids.push(key);
- }
+ var pageSize = state.pagination.pageSize;
+ var searchCondition = buildFinalCondition();
+ var currentRequestVersion = ++state.requestVersion;
+ var insertRows = state.cacheManager.getInsertRows();
+
+ if (!searchCondition) {
+ var pageData = [];
+ if (insertRows.length > 0) {
+ var startInInsert = (pageNumber - 1) * pageSize;
+ var endInInsert = startInInsert + pageSize;
+ pageData = insertRows.slice(startInInsert, endInInsert);
+ }
+
+ var totalPages = Math.ceil(insertRows.length / pageSize);
+ if (pageNumber > totalPages && insertRows.length > 0) {
+ pageNumber = Math.max(1, totalPages);
+ var startInInsert = (pageNumber - 1) * pageSize;
+ var endInInsert = startInInsert + pageSize;
+ pageData = insertRows.slice(startInInsert, endInInsert);
+ }
+
+ state.pagination.pageNumber = pageNumber;
+ _renderPage(pageData, insertRows.length, pageNumber, pageSize);
+ _clearLoading();
+ return;
+ }
+
+ var remoteTotal = state.pagination.remoteTotal;
+ var startIndex = (pageNumber - 1) * pageSize;
+ var endIndex = startIndex + pageSize;
+
+ if (insertRows.length > 0 && startIndex >= remoteTotal) {
+ var insertStart = startIndex - remoteTotal;
+ var insertEnd = endIndex - remoteTotal;
+ var pageData = insertRows.slice(insertStart, insertEnd);
+
+ var totalCount = remoteTotal + insertRows.length;
+
+ state.pagination.pageNumber = pageNumber;
+ _renderPage(pageData, totalCount, pageNumber, pageSize);
+ _clearLoading();
+ return;
+ }
+
+ var searchParam = {
+ viewname: options.viewName,
+ searchcondition: searchCondition,
+ userid: options.userid,
+ orderfield: options.orderField,
+ keyfield: options.keyField,
+ page: pageNumber,
+ rows: pageSize,
+ };
+
+ $.ajax({
+ type: "post",
+ url: options.searchUrl,
+ cache: false,
+ data: searchParam,
+ dataType: "json",
+ timeout: options.ajaxTimeout,
+ success: function (result) {
+ if (currentRequestVersion !== state.requestVersion) {
+ return;
+ }
+
+ var remoteRows = state.cacheManager.applyDraftStateToRemoteRows(result.rows);
+ remoteTotal = result.total;
+
+ var totalCount = remoteTotal + insertRows.length;
+ var totalPages = Math.ceil(totalCount / pageSize);
+
+ if (pageNumber > totalPages) {
+ pageNumber = Math.max(1, totalPages);
+ }
+
+ startIndex = (pageNumber - 1) * pageSize;
+ endIndex = startIndex + pageSize;
+
+ var pageData = [];
+
+ if (endIndex <= remoteTotal) {
+ pageData = remoteRows;
+ } else if (startIndex >= remoteTotal) {
+ var insertStart = startIndex - remoteTotal;
+ var insertEnd = endIndex - remoteTotal;
+ pageData = insertRows.slice(insertStart, insertEnd);
+ } else {
+ var remotePart = remoteRows.slice(startIndex - (pageNumber - 1) * pageSize);
+ var insertPart = insertRows.slice(0, endIndex - remoteTotal);
+ pageData = remotePart.concat(insertPart);
+ }
+
+ state.pagination.remoteTotal = remoteTotal;
+ state.pagination.pageNumber = pageNumber;
+
+ _renderPage(pageData, totalCount, pageNumber, pageSize);
+ },
+ error: function (xhr, status, error) {
+ if (currentRequestVersion !== state.requestVersion) {
+ return;
+ }
+
+ if (insertRows.length > 0) {
+ var startInInsert = (pageNumber - 1) * pageSize;
+ var endInInsert = startInInsert + pageSize;
+ var pageData = insertRows.slice(startInInsert, endInInsert);
+ _renderPage(pageData, insertRows.length, pageNumber, pageSize);
+ }
+
+ if (typeof options.onLoadError === "function") {
+ options.onLoadError(xhr, status, error);
+ } else {
+ console.log("分页加载失败: " + status);
+ }
+ },
+ complete: function () {
+ if (currentRequestVersion === state.requestVersion) {
+ _clearLoading();
+ }
+ },
+ });
}
- return ids;
- },
- getExcludedRows: function () {
- var rows = [];
- for (var key in draftStateMap) {
- var state = draftStateMap[key];
- if (state.excluded && state.data) {
- rows.push(state.data);
- }
+
+ function refreshCurrentPage() {
+ var currentPage = state.pagination.pageNumber;
+ loadPage(currentPage);
}
- return rows;
- },
- clearExcludedRows: clearExcludedRows,
- isRowExcluded: isRowExcluded,
- applyDraftState: applyDraftState,
+ function refreshDisplay() {
+ var currentRows = $("#" + options.gridId).datagrid("getRows");
+ var cm = state.cacheManager;
- pagination: {
- get: function () {
- return pagination;
- },
- setPageNumber: function (pageNumber) {
- pagination.pageNumber = pageNumber;
- },
- setPageSize: function (pageSize) {
- pagination.pageSize = pageSize;
- },
- setRemoteTotal: function (remoteTotal) {
- pagination.remoteTotal = remoteTotal;
- },
- getPageSize: function () {
- return pagination.pageSize;
- },
- getPageNumber: function () {
- return pagination.pageNumber;
- },
- getRemoteTotal: function () {
- return pagination.remoteTotal;
- },
- getTotalPages: function () {
- return Math.ceil(pagination.remoteTotal / pagination.pageSize);
- },
- },
+ for (var i = 0; i < currentRows.length; i++) {
+ var row = currentRows[i];
+ var key = cm.getRowKey(row);
+ var cachedRow = cm.getRowFromCache(key);
- getRowKey: getRowKey,
- reset: reset,
- };
- }
+ if (cachedRow) {
+ row._draftState = cachedRow._draftState;
+ row._rowState = cachedRow._draftState;
+ }
+ }
- // ==================== createDataGridManager(导出)====================
+ $("#" + options.gridId).datagrid("loadData", currentRows);
- function createDataGridManager(config) {
- var $ = window.jQuery;
+ if (!cm.isAllChecked()) {
+ $("#" + options.gridId).datagrid("clearChecked");
+ }
- var DEFAULT_CONFIG = {
- gridId: "feegrid",
- keyField: "subid",
- pageSize: 50,
- viewName: "",
- searchUrl: "jsp/searchdatapagenew.jsp",
- orderField: "b_id",
- baseSearchCondition: null,
- searchCondition: null,
- pageList: [50, 100, 200],
- rowStateStyles: {
- insert: "background-color: #f6ffed;",
- update: "background-color: #fffbe6;",
- delete: "background-color: #fff1f0;",
- },
- selectAllBtn: "#btn_select_all",
- selectAllText: "全部选中",
- unselectAllText: "全部反选",
- userid: "",
- customDatagridOptions: null,
- ajaxTimeout: 30000,
- onLoadError: null,
- onLoadSuccess: null,
- onAfterEdit: null,
- onSelectionChange: null,
- };
-
- var options = $.extend(true, {}, DEFAULT_CONFIG, config);
-
- var state = {
- draftManager: null,
- editIndex: undefined,
- isLoading: false,
- pagerId: null,
- requestVersion: 0,
- };
-
- _initDraftManager();
- _initGrid();
-
- function _initDraftManager() {
- state.draftManager = createDraftStateManager({
- keyField: options.keyField,
- pageSize: options.pageSize,
- });
- }
-
- function _getPagerId() {
- if (!state.pagerId) {
- state.pagerId = options.gridId + "_pager";
- }
- return state.pagerId;
- }
-
- function _setLoading() {
- state.isLoading = true;
- $("#" + options.gridId).datagrid("loading");
- $("#" + _getPagerId())
- .css({
- "pointer-events": "none",
- opacity: "0.6",
- })
- .pagination("loading");
- }
-
- function _clearLoading() {
- state.isLoading = false;
- $("#" + options.gridId).datagrid("loaded");
- $("#" + _getPagerId())
- .css({
- "pointer-events": "",
- opacity: "",
- })
- .pagination("loaded");
- }
-
- function _syncGridChecks() {
- var rows = $("#" + options.gridId).datagrid("getRows");
- var selectedKeys = {};
- var selectedRowIds = state.draftManager.getSelectedRowIds();
-
- for (var s = 0; s < selectedRowIds.length; s++) {
- selectedKeys[selectedRowIds[s]] = true;
- }
-
- var excludedKeys = {};
- var excludedRowIds = state.draftManager.getExcludedRowIds();
- for (var e = 0; e < excludedRowIds.length; e++) {
- excludedKeys[excludedRowIds[e]] = true;
- }
-
- for (var i = 0; i < rows.length; i++) {
- var row = rows[i];
- var key = state.draftManager.getRowKey(row);
- if (state.draftManager.isAllChecked()) {
- if (excludedKeys[key]) {
- $("#" + options.gridId).datagrid("uncheckRow", i);
- } else {
- $("#" + options.gridId).datagrid("checkRow", i);
- }
- } else {
- if (selectedKeys[key]) {
- $("#" + options.gridId).datagrid("checkRow", i);
- } else {
- $("#" + options.gridId).datagrid("uncheckRow", i);
- }
+ _handleRowStyles();
+ _triggerCallback("onSelectionChange");
}
- }
- }
- function _handleRowStyles() {
- $(".datagrid-body tr").each(function () {
- var rowIndex = $(this).attr("datagrid-row-index");
- if (rowIndex !== undefined) {
- var row = $("#" + options.gridId).datagrid("getRows")[
- parseInt(rowIndex)
- ];
- if (row && row._rowState === "delete") {
- $(this).addClass("datagrid-row-delete");
- } else {
- $(this).removeClass("datagrid-row-delete");
- }
- }
- });
- }
+ function refreshAfterDelete() {
+ var pageSize = state.pagination.pageSize;
+ var remoteTotal = state.pagination.remoteTotal;
+ var insertRows = state.cacheManager.getInsertRows();
+ var deleteRows = state.cacheManager.getDeleteRows();
+ var totalPages = Math.ceil((remoteTotal + insertRows.length) / pageSize);
+ var currentPage = state.pagination.pageNumber;
- function buildFinalCondition() {
- var parts = [];
+ if (currentPage > totalPages && totalPages > 0) {
+ state.pagination.pageNumber = totalPages;
+ $("#" + _getPagerId()).pagination("select", totalPages);
+ } else if (remoteTotal === 0 && insertRows.length === 0) {
+ $("#" + options.gridId).datagrid("loadData", []);
+ $("#" + _getPagerId()).pagination("refresh", {
+ total: 0,
+ pageNumber: 1,
+ pageSize: pageSize,
+ });
+ } else {
+ loadPage(currentPage);
+ }
- if (options.baseSearchCondition) {
- parts.push(options.baseSearchCondition);
- }
-
- if (options.searchCondition) {
- parts.push(options.searchCondition);
- }
-
- return parts.join(" AND ");
- }
-
- function loadPage(pageNumber) {
- _setLoading();
-
- var pageSize = state.draftManager.pagination.getPageSize();
- var searchCondition = buildFinalCondition();
- var currentRequestVersion = ++state.requestVersion;
-
- if (!searchCondition) {
- var insertRows = state.draftManager.getInsertRows();
- var pageData = [];
- if (insertRows.length > 0) {
- var startInInsert = (pageNumber - 1) * pageSize;
- var endInInsert = startInInsert + pageSize;
- pageData = insertRows.slice(startInInsert, endInInsert);
- }
- _renderPage(pageData, insertRows.length, pageNumber, pageSize);
- _clearLoading();
- return;
- }
-
- var searchParam = {
- viewname: options.viewName,
- searchcondition: searchCondition,
- userid: options.userid,
- orderfield: options.orderField,
- keyfield: options.keyField,
- page: pageNumber,
- rows: pageSize,
- };
-
- $.ajax({
- type: "post",
- url: options.searchUrl,
- cache: false,
- data: searchParam,
- dataType: "json",
- timeout: options.ajaxTimeout,
- success: function (result) {
- if (currentRequestVersion !== state.requestVersion) {
- return;
- }
-
- state.draftManager.pagination.setRemoteTotal(result.total);
-
- var displayRows = state.draftManager.applyDraftState(result.rows);
-
- _renderPage(displayRows, result.total, pageNumber, pageSize);
- },
- error: function (xhr, status, error) {
- if (currentRequestVersion !== state.requestVersion) {
- return;
- }
- if (typeof options.onLoadError === "function") {
- options.onLoadError(xhr, status, error);
- } else {
- console.log("分页加载失败: " + status);
- }
- },
- complete: function () {
- if (currentRequestVersion === state.requestVersion) {
- _clearLoading();
- }
- },
- });
- }
-
- function _renderPage(pageData, total, pageNumber, pageSize) {
- $("#" + options.gridId).datagrid("loadData", pageData);
- $("#" + _getPagerId()).pagination("refresh", {
- total: total,
- pageNumber: pageNumber,
- pageSize: pageSize,
- });
- }
-
- function refreshCurrentPage() {
- var currentPage = state.draftManager.pagination.getPageNumber();
- loadPage(currentPage);
- }
-
- function refreshDisplay() {
- var currentRows = $("#" + options.gridId).datagrid("getRows");
- $("#" + options.gridId).datagrid("loadData", currentRows);
- $("#" + options.gridId).datagrid("clearChecked");
- _triggerCallback("onSelectionChange");
- }
-
- function refreshAfterDelete() {
- var pageSize = state.draftManager.pagination.getPageSize();
- var remoteTotal = state.draftManager.pagination.getRemoteTotal();
- var totalPages = Math.ceil(remoteTotal / pageSize);
- var currentPage = state.draftManager.pagination.getPageNumber();
-
- if (currentPage > totalPages && totalPages > 0) {
- state.draftManager.pagination.setPageNumber(totalPages);
- $("#" + _getPagerId()).pagination("select", totalPages);
- } else if (remoteTotal === 0) {
- $("#" + options.gridId).datagrid("loadData", []);
- $("#" + _getPagerId()).pagination("refresh", {
- total: 0,
- pageNumber: 1,
- pageSize: pageSize,
- });
- } else {
- loadPage(currentPage);
- }
-
- $("#" + options.gridId).datagrid("clearChecked");
- _triggerCallback("onSelectionChange");
- }
-
- function refreshAfterUndo() {
- var currentPage = state.draftManager.pagination.getPageNumber();
- loadPage(currentPage);
- }
-
- function addInsertRows(rows) {
- if (!$.isArray(rows)) rows = [rows];
- for (var i = 0; i < rows.length; i++) {
- state.draftManager.addInsertRow(rows[i]);
- }
- }
-
- function removeInsertRow(row) {
- state.draftManager.removeInsertRow(row);
- }
-
- function addDeleteRow(row) {
- state.draftManager.addDeleteRow(row);
- }
-
- function removeDeleteRow(row) {
- state.draftManager.recoverRow(row);
- refreshAfterUndo();
- }
-
- function addUpdateRow(row) {
- state.draftManager.addUpdateRow(row);
- }
-
- function toggleSelectAll() {
- var btn = $(options.selectAllBtn);
- if (state.draftManager.isAllChecked()) {
- state.draftManager.setAllChecked(false);
- state.draftManager.clearExcludedRows();
- state.draftManager.clearSelectedRows();
- $("#" + options.gridId).datagrid("clearChecked");
- if (btn.length) btn.val(options.selectAllText);
- } else {
- state.draftManager.setAllChecked(true);
- state.draftManager.clearExcludedRows();
- var rows = $("#" + options.gridId).datagrid("getRows");
- for (var i = 0; i < rows.length; i++) {
- $("#" + options.gridId).datagrid("checkRow", i);
- }
- if (btn.length) btn.val(options.unselectAllText);
- }
- _triggerCallback("onSelectionChange");
- }
-
- function clearSelection() {
- state.draftManager.setAllChecked(false);
- state.draftManager.clearExcludedRows();
- state.draftManager.clearSelectedRows();
- $("#" + options.gridId).datagrid("clearChecked");
- _triggerCallback("onSelectionChange");
- }
-
- function setAllChecked(value) {
- state.draftManager.setAllChecked(value);
- if (value) state.draftManager.clearExcludedRows();
- _syncGridChecks();
- _triggerCallback("onSelectionChange");
- }
-
- function setSearchCondition(condition) {
- options.searchCondition = condition;
- }
-
- function clearSearch() {
- options.searchCondition = null;
- }
-
- function reload(newSearchCondition) {
- if (newSearchCondition !== undefined) {
- options.searchCondition = newSearchCondition;
- }
- state.draftManager.pagination.setPageNumber(1);
- loadPage(1);
- }
-
- function resetSearch() {
- options.searchCondition = null;
- reload();
- }
-
- function _triggerCallback(callbackName) {
- var callback = options[callbackName];
- if (typeof callback === "function") {
- var args = Array.prototype.slice.call(arguments, 1);
- callback.apply(null, args);
- }
- }
-
- function handleAfterEdit(rowIndex, row, changes) {
- if (Object.keys(changes).length === 0) return;
-
- var key = state.draftManager.getRowKey(row);
- var draftState = state.draftManager.getDraftState(key);
-
- if (draftState && draftState.state === "delete") {
- return;
- }
-
- if (draftState && draftState.state === "insert") {
- row._rowState = "insert";
- state.draftManager.setDraftState(key, "insert", row, null);
- } else if (draftState && draftState.state === "update") {
- row._rowState = "update";
- state.draftManager.setDraftState(key, "update", row, null);
- } else {
- row._rowState = "update";
- state.draftManager.addUpdateRow(row);
- }
-
- _triggerCallback("onAfterEdit", rowIndex, row, changes);
- }
-
- function handleRowCheck(index, row) {
- if (state.draftManager.isAllChecked()) {
- state.draftManager.removeExcludedRow(row);
- } else {
- state.draftManager.addSelectedRow(row);
- }
- _triggerCallback("onSelectionChange");
- }
-
- function handleRowUncheck(index, row) {
- if (state.draftManager.isAllChecked()) {
- state.draftManager.addExcludedRow(row);
- } else {
- state.draftManager.removeSelectedRow(row);
- }
- _triggerCallback("onSelectionChange");
- }
-
- function handleCheckAll() {
- state.draftManager.setAllChecked(true);
- state.draftManager.clearExcludedRows();
- _triggerCallback("onSelectionChange");
- }
-
- function handleUncheckAll() {
- state.draftManager.setAllChecked(false);
- state.draftManager.clearExcludedRows();
- state.draftManager.clearSelectedRows();
- _triggerCallback("onSelectionChange");
- }
-
- function handleLoadSuccess() {
- $.messager.progress("close");
- _syncGridChecks();
- _handleRowStyles();
- var rows = $("#" + options.gridId).datagrid("getRows");
- _triggerCallback("onLoadSuccess", rows);
- }
-
- function reset() {
- state.editIndex = undefined;
- state.isLoading = false;
- if (state.draftManager) state.draftManager.reset();
- }
-
- function _initGrid() {
- var baseDatagridOptions = {
- idField: options.keyField,
- pageSize: options.pageSize,
- rowStyler: function (index, row) {
- var stateStyle = options.rowStateStyles[row._rowState];
- return stateStyle || "";
- },
- onLoadSuccess: handleLoadSuccess,
- onAfterEdit: handleAfterEdit,
- onCheckAll: handleCheckAll,
- onUncheckAll: handleUncheckAll,
- onCheck: handleRowCheck,
- onUncheck: handleRowUncheck,
- };
-
- var datagridOptions = options.customDatagridOptions
- ? $.extend(true, {}, baseDatagridOptions, options.customDatagridOptions)
- : baseDatagridOptions;
-
- $("#" + options.gridId)
- .datagrid(datagridOptions)
- .datagrid("columnMoving");
-
- $("#" + options.gridId)
- .datagrid("getPanel")
- .find(".datagrid-body")
- .on("scroll.datagrid", function () {
- if (state.editIndex !== undefined) {
- $("#" + options.gridId).datagrid("endEdit", state.editIndex);
- state.editIndex = undefined;
- }
- });
-
- var pagerId = _getPagerId();
- var pagerSelector = "#" + pagerId;
-
- if ($(pagerSelector).length === 0) {
- var gridPanel = $("#" + options.gridId).datagrid("getPanel");
- var pagerDiv = $(
- '',
- );
- gridPanel.after(pagerDiv);
- }
-
- $(pagerSelector).pagination({
- total: 0,
- pageSize: options.pageSize,
- pageNumber: 1,
- pageList: options.pageList,
- onSelectPage: function (pageNumber, pageSize) {
- state.draftManager.pagination.setPageNumber(pageNumber);
- state.draftManager.pagination.setPageSize(pageSize);
- loadPage(pageNumber);
- },
- onChangePageSize: function (pageSize) {
- state.draftManager.pagination.setPageNumber(1);
- state.draftManager.pagination.setPageSize(pageSize);
-
- if (!state.draftManager.isAllChecked()) {
$("#" + options.gridId).datagrid("clearChecked");
- state.draftManager.clearSelectedRows();
- }
+ _triggerCallback("onSelectionChange");
+ }
- _triggerCallback("onSelectionChange");
- loadPage(1);
- },
- });
+ function refreshAfterUndo() {
+ var currentPage = state.pagination.pageNumber;
+ loadPage(currentPage);
+ }
+
+ function addInsertRows(rows) {
+ if (!$.isArray(rows)) rows = [rows];
+ var cm = state.cacheManager;
+
+ for (var i = 0; i < rows.length; i++) {
+ var row = rows[i];
+ var key = cm.getRowKey(row);
+ if (!cm.getRowFromCache(key)) {
+ cm.setRowToCache(row, true);
+ }
+ }
+ }
+
+ function removeInsertRow(row) {
+ var key = state.cacheManager.getRowKey(row);
+ state.cacheManager.removeRowFromCache(key);
+ }
+
+ function addDeleteRow(row) {
+ state.cacheManager.markRowDeleted(row);
+ }
+
+ function removeDeleteRow(row) {
+ state.cacheManager.unmarkRowDeleted(row);
+ refreshAfterUndo();
+ }
+
+ function addUpdateRow(row) {
+ state.cacheManager.updateRowInCache(row);
+ }
+
+ function deleteSelectedRows(canDeleteCallback) {
+ var currentPageRows = $("#" + options.gridId).datagrid("getRows");
+ var selectedRows = state.cacheManager.getValidSelectedRows(currentPageRows);
+ var cm = state.cacheManager;
+
+ if (selectedRows.length === 0) {
+ $.messager.alert("提示", "请选择要删除的行(已标记删除的行请使用「撤销删除」)", "warning");
+ return false;
+ }
+
+ if (canDeleteCallback) {
+ for (var i = selectedRows.length - 1; i >= 0; i--) {
+ var row = selectedRows[i];
+ var result = canDeleteCallback(row);
+ if (result !== true) {
+ $.messager.alert("提示", result || "该记录不能删除!", "warning");
+ return false;
+ }
+ }
+ }
+
+ var hasInsertDelete = false;
+ var hasRemoteDelete = false;
+
+ for (var i = selectedRows.length - 1; i >= 0; i--) {
+ var row = selectedRows[i];
+ var wasNew = cm.getRowFromCache(cm.getRowKey(row))?._isNew;
+
+ if (cm.markRowDeleted(row)) {
+ hasInsertDelete = true;
+ } else {
+ hasRemoteDelete = true;
+ }
+ }
+
+ if (cm.isAllChecked()) {
+ cm.setBatchDeleting(true);
+ }
+
+ if (hasInsertDelete) {
+ refreshAfterDelete();
+ } else if (hasRemoteDelete) {
+ refreshDisplay();
+ }
+
+ return true;
+ }
+
+ function undoDeleteSelectedRows() {
+ var cm = state.cacheManager;
+ var pageRows = $("#" + options.gridId).datagrid("getRows");
+ var targets = [];
+
+ var selectedRows = cm.getSelectedRows();
+ var selKeys = {};
+ for (var sk = 0; sk < selectedRows.length; sk++) {
+ selKeys[cm.getRowKey(selectedRows[sk])] = true;
+ }
+
+ var hasSelectionOnPage = false;
+ for (var hp = 0; hp < pageRows.length; hp++) {
+ if (selKeys[cm.getRowKey(pageRows[hp])]) {
+ hasSelectionOnPage = true;
+ break;
+ }
+ }
+
+ if (cm.isAllChecked() && cm.isBatchDeleting()) {
+ for (var u = 0; u < pageRows.length; u++) {
+ var row = pageRows[u];
+ var key = cm.getRowKey(row);
+ if (row._draftState === 'delete' && !cm.isExcluded(key)) {
+ targets.push(row);
+ }
+ }
+ } else if (!hasSelectionOnPage) {
+ for (var u = 0; u < pageRows.length; u++) {
+ if (pageRows[u]._draftState === 'delete') {
+ targets.push(pageRows[u]);
+ }
+ }
+ } else {
+ for (var v = 0; v < pageRows.length; v++) {
+ var pr = pageRows[v];
+ if (pr._draftState === 'delete' && selKeys[cm.getRowKey(pr)]) {
+ targets.push(pr);
+ }
+ }
+ }
+
+ if (targets.length === 0) {
+ $.messager.alert("提示", "当前页没有可撤销的删除行", "warning");
+ return false;
+ }
+
+ var restoredRowIndexes = [];
+ for (var w = 0; w < targets.length; w++) {
+ var row = targets[w];
+ if (row._draftState !== 'delete') {
+ continue;
+ }
+ var rowIndex = $("#" + options.gridId).datagrid("getRowIndex", row);
+ cm.unmarkRowDeleted(row);
+ cm.setSelection(cm.getRowKey(row), true);
+ if (rowIndex >= 0) {
+ restoredRowIndexes.push(rowIndex);
+ }
+ }
+
+ cm.setBatchDeleting(false);
+ refreshAfterUndo();
+
+ for (var r = 0; r < restoredRowIndexes.length; r++) {
+ $("#" + options.gridId).datagrid("checkRow", restoredRowIndexes[r]);
+ }
+
+ return true;
+ }
+
+ function toggleSelectAll() {
+ state.isSyncing = true;
+ var btn = $(options.selectAllBtn);
+ var cm = state.cacheManager;
+
+ if (cm.isAllChecked()) {
+ cm.setAllChecked(false);
+ cm.setBatchDeleting(false);
+ cm.clearAllExclusions();
+ cm.clearAllSelections();
+ $("#" + options.gridId).datagrid("clearChecked");
+ if (btn.length) btn.val(options.selectAllText);
+ } else {
+ cm.setAllChecked(true);
+ cm.clearAllExclusions();
+ var rows = $("#" + options.gridId).datagrid("getRows");
+ for (var i = 0; i < rows.length; i++) {
+ $("#" + options.gridId).datagrid("checkRow", i);
+ }
+ if (btn.length) btn.val(options.unselectAllText);
+ }
+
+ state.isSyncing = false;
+ _triggerCallback("onSelectionChange");
+ }
+
+ function clearSelection() {
+ var cm = state.cacheManager;
+ cm.setAllChecked(false);
+ cm.setBatchDeleting(false);
+ cm.clearAllExclusions();
+ cm.clearAllSelections();
+ $("#" + options.gridId).datagrid("clearChecked");
+ _triggerCallback("onSelectionChange");
+ }
+
+ function setAllChecked(value) {
+ var cm = state.cacheManager;
+ cm.setAllChecked(value);
+ if (value) cm.clearAllExclusions();
+ _syncGridChecks();
+ _triggerCallback("onSelectionChange");
+ }
+
+ function setSearchCondition(condition) {
+ options.searchCondition = condition;
+ }
+
+ function clearSearch() {
+ options.searchCondition = null;
+ }
+
+ function reload(newSearchCondition) {
+ if (newSearchCondition !== undefined) {
+ options.searchCondition = newSearchCondition;
+ }
+ state.pagination.pageNumber = 1;
+ state.pagination.remoteTotal = 0;
+ loadPage(1);
+ }
+
+ function resetSearch() {
+ options.searchCondition = null;
+ reload();
+ }
+
+ function _triggerCallback(callbackName) {
+ var callback = options[callbackName];
+ if (typeof callback === "function") {
+ var args = Array.prototype.slice.call(arguments, 1);
+ callback.apply(null, args);
+ }
+ }
+
+ function handleAfterEdit(rowIndex, row, changes) {
+ if (Object.keys(changes).length === 0) return;
+
+ var cm = state.cacheManager;
+ var key = cm.getRowKey(row);
+ var cachedRow = cm.getRowFromCache(key);
+
+ if (cachedRow && cachedRow._draftState === 'delete') {
+ return;
+ }
+
+ cm.updateRowInCache(row);
+ _triggerCallback("onAfterEdit", rowIndex, row, changes);
+ }
+
+ function handleRowCheck(index, row) {
+ var cm = state.cacheManager;
+
+ if (cm.isAllChecked()) {
+ cm.setExclusion(cm.getRowKey(row), false);
+ } else {
+ cm.setSelection(cm.getRowKey(row), true);
+ }
+
+ if (!state.isSyncing) {
+ _triggerCallback("onSelectionChange");
+ }
+ }
+
+ function handleRowUncheck(index, row) {
+ var cm = state.cacheManager;
+
+ if (cm.isAllChecked()) {
+ cm.setExclusion(cm.getRowKey(row), true);
+ } else {
+ cm.setSelection(cm.getRowKey(row), false);
+ }
+
+ if (!state.isSyncing) {
+ _triggerCallback("onSelectionChange");
+ }
+ }
+
+ function handleCheckAll() {
+ state.isSyncing = true;
+ var cm = state.cacheManager;
+ var rows = $("#" + options.gridId).datagrid("getRows");
+ for (var i = 0; i < rows.length; i++) {
+ var key = cm.getRowKey(rows[i]);
+ if (cm.isAllChecked()) {
+ cm.setExclusion(key, false);
+ } else {
+ cm.setSelection(key, true);
+ }
+ }
+ state.isSyncing = false;
+ _triggerCallback("onSelectionChange");
+ }
+
+ function handleUncheckAll() {
+ state.isSyncing = true;
+ var cm = state.cacheManager;
+ var rows = $("#" + options.gridId).datagrid("getRows");
+ for (var i = 0; i < rows.length; i++) {
+ var key = cm.getRowKey(rows[i]);
+ if (cm.isAllChecked()) {
+ cm.setExclusion(key, true);
+ } else {
+ cm.setSelection(key, false);
+ }
+ }
+ state.isSyncing = false;
+ _triggerCallback("onSelectionChange");
+ }
+
+ function handleLoadSuccess() {
+ $.messager.progress("close");
+ _syncGridChecks();
+ _handleRowStyles();
+ var rows = $("#" + options.gridId).datagrid("getRows");
+ _triggerCallback("onLoadSuccess", rows);
+ }
+
+ function reset() {
+ state.editIndex = undefined;
+ state.isLoading = false;
+ state.pagination = {
+ pageSize: options.pageSize,
+ pageNumber: 1,
+ remoteTotal: 0,
+ };
+ if (state.cacheManager) state.cacheManager.reset();
+ }
+
+ function _initGrid() {
+ var pagerId = _getPagerId();
+ var pagerSelector = "#" + pagerId;
+
+ var baseDatagridOptions = {
+ idField: options.keyField,
+ pageSize: options.pageSize,
+ rowStyler: function (index, row) {
+ var draftState = row._draftState;
+
+ if (!draftState && state.cacheManager) {
+ var key = state.cacheManager.getRowKey(row);
+ var cachedRow = state.cacheManager.getRowFromCache(key);
+ if (cachedRow) {
+ draftState = cachedRow._draftState;
+ }
+ }
+
+ var stateStyle = options.rowStateStyles[draftState] || options.rowStateStyles[row._rowState];
+ return stateStyle || "";
+ },
+ onLoadSuccess: handleLoadSuccess,
+ onAfterEdit: handleAfterEdit,
+ onCheckAll: handleCheckAll,
+ onUncheckAll: handleUncheckAll,
+ onCheck: handleRowCheck,
+ onUncheck: handleRowUncheck,
+ };
+
+ var datagridOptions = options.customDatagridOptions
+ ? $.extend(true, {}, baseDatagridOptions, options.customDatagridOptions)
+ : baseDatagridOptions;
+
+ $("#" + options.gridId)
+ .datagrid(datagridOptions)
+ .datagrid("columnMoving");
+
+ $("#" + options.gridId)
+ .datagrid("getPanel")
+ .find(".datagrid-body")
+ .on("scroll.datagrid", function () {
+ if (state.editIndex !== undefined) {
+ $("#" + options.gridId).datagrid("endEdit", state.editIndex);
+ state.editIndex = undefined;
+ }
+ });
+
+ $(pagerSelector).pagination({
+ total: 0,
+ pageSize: options.pageSize,
+ pageNumber: 1,
+ pageList: options.pageList,
+ onSelectPage: function (pageNumber, pageSize) {
+ state.pagination.pageNumber = pageNumber;
+ state.pagination.pageSize = pageSize;
+ loadPage(pageNumber);
+ },
+ onChangePageSize: function (pageSize) {
+ state.pagination.pageNumber = 1;
+ state.pagination.pageSize = pageSize;
+
+ if (!state.cacheManager.isAllChecked()) {
+ $("#" + options.gridId).datagrid("clearChecked");
+ state.cacheManager.clearAllSelections();
+ }
+
+ _triggerCallback("onSelectionChange");
+ loadPage(1);
+ },
+ });
+ }
+
+ function setColumns(columns) {
+ $("#" + options.gridId).datagrid({
+ columns: [columns],
+ });
+ }
+
+ function isLoading() {
+ return state.isLoading;
+ }
+
+ function getPager() {
+ return $("#" + _getPagerId());
+ }
+
+ function getGrid() {
+ return $("#" + options.gridId);
+ }
+
+ function getRowsForSubmission() {
+ return state.cacheManager.getRowsForSubmission();
+ }
+
+ return {
+ setColumns: setColumns,
+ loadPage: loadPage,
+ refreshCurrentPage: refreshCurrentPage,
+ refreshDisplay: refreshDisplay,
+ refreshAfterDelete: refreshAfterDelete,
+ refreshAfterUndo: refreshAfterUndo,
+
+ addInsertRows: addInsertRows,
+ removeInsertRow: removeInsertRow,
+ addDeleteRow: addDeleteRow,
+ removeDeleteRow: removeDeleteRow,
+ addUpdateRow: addUpdateRow,
+ deleteSelectedRows: deleteSelectedRows,
+ undoDeleteSelectedRows: undoDeleteSelectedRows,
+
+ getValidSelectedRows: function () {
+ var currentPageRows = $("#" + options.gridId).datagrid("getRows");
+ return state.cacheManager.getValidSelectedRows(currentPageRows);
+ },
+ getSelectedRows: function () {
+ return state.cacheManager.getSelectedRows();
+ },
+ toggleSelectAll: toggleSelectAll,
+ clearSelection: clearSelection,
+ isAllChecked: function () {
+ console.log("===1===")
+ return state.cacheManager.isAllChecked();
+ },
+ setAllChecked: setAllChecked,
+
+ getInsertRows: function () {
+ return state.cacheManager.getInsertRows();
+ },
+ getUpdateRows: function () {
+ return state.cacheManager.getUpdateRows();
+ },
+ getDeleteRows: function () {
+ return state.cacheManager.getDeleteRows();
+ },
+ getExcludedRows: function () {
+ return state.cacheManager.getExcludedRows();
+ },
+
+ getRowsForSubmission: getRowsForSubmission,
+
+ getCacheManager: function () {
+ return state.cacheManager;
+ },
+
+ setSearchCondition: setSearchCondition,
+ clearSearch: clearSearch,
+ reload: reload,
+ resetSearch: resetSearch,
+
+ isLoading: isLoading,
+ getPager: getPager,
+ getGrid: getGrid,
+ reset: reset,
+ };
}
- function setColumns(columns) {
- $("#" + options.gridId).datagrid({
- columns: [columns],
- });
- }
-
- function isLoading() {
- return state.isLoading;
- }
-
- function getPager() {
- return $("#" + _getPagerId());
- }
-
- function getGrid() {
- return $("#" + options.gridId);
- }
-
- return {
- setColumns: setColumns,
- loadPage: loadPage,
- refreshCurrentPage: refreshCurrentPage,
- refreshDisplay: refreshDisplay,
- refreshAfterDelete: refreshAfterDelete,
- refreshAfterUndo: refreshAfterUndo,
-
- addInsertRows: addInsertRows,
- removeInsertRow: removeInsertRow,
- addDeleteRow: addDeleteRow,
- removeDeleteRow: removeDeleteRow,
- addUpdateRow: addUpdateRow,
-
- getValidSelectedRows: function () {
- return state.draftManager.getValidSelectedRows();
- },
- getSelectedRows: function () {
- return state.draftManager.getSelectedRows();
- },
- toggleSelectAll: toggleSelectAll,
- clearSelection: clearSelection,
- setAllChecked: setAllChecked,
-
- getInsertRows: function () {
- return state.draftManager.getInsertRows();
- },
- getUpdateRows: function () {
- return state.draftManager.getUpdateRows();
- },
- getDeleteRows: function () {
- return state.draftManager.getDeleteRows();
- },
-
- getDraftManager: function () {
- return state.draftManager;
- },
-
- setSearchCondition: setSearchCondition,
- clearSearch: clearSearch,
- reload: reload,
- resetSearch: resetSearch,
-
- isLoading: isLoading,
- getPager: getPager,
- getGrid: getGrid,
- reset: reset,
- };
- }
-
- window.createDataGridManager = createDataGridManager;
-})(window);
+ window.createDataGridManager = createDataGridManager;
+})(window);
\ No newline at end of file