UNPKG

@visactor/vtable

Version:

canvas table width high performance

211 lines (195 loc) 13.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: !0 }), exports.getGroupCheckboxState = exports.changeCheckboxOrder = exports.setCellCheckboxStateByAttribute = exports.setCellCheckboxState = exports.initLeftRecordsCheckState = exports.updateHeaderCheckedState = exports.initCheckedState = exports.syncCheckedState = exports.setHeaderCheckedState = exports.setCheckedState = void 0; const vutils_1 = require("@visactor/vutils"), helper_1 = require("../../tools/helper"); function setCheckedState(col, row, field, checked, state) { const cellRange = state.table.getCellRange(col, row); if (cellRange.start.col !== cellRange.end.col || cellRange.start.row !== cellRange.end.row) for (let i = cellRange.start.col; i <= cellRange.end.col; i++) for (let j = cellRange.start.row; j <= cellRange.end.row; j++) setSingleCheckedState(i, j, field, checked, state); else setSingleCheckedState(col, row, field, checked, state); } function setSingleCheckedState(col, row, field, checked, state) { const recordIndex = state.table.getRecordShowIndexByCell(col, row); if (recordIndex >= 0) { const dataIndex = state.table.dataSource.getIndexKey(recordIndex).toString(); state.checkedState.has(dataIndex) ? state.checkedState.get(dataIndex)[field] = checked : state.checkedState.set(dataIndex, { [field]: checked }); } } function setHeaderCheckedState(field, checked, state) { var _a; state.headerCheckedState[field] = checked, null === (_a = state.checkedState) || void 0 === _a || _a.forEach((recordCheckState => { recordCheckState[field] = checked; })); } function syncCheckedState(col, row, field, checked, state) { var _a, _b; if (state.table.isHeader(col, row)) { if ((0, vutils_1.isValid)(state.headerCheckedState[field])) return state.headerCheckedState[field]; if ("function" == typeof checked) return; if ((0, vutils_1.isValid)(checked)) state.headerCheckedState[field] = checked; else if ((null === (_a = state.checkedState) || void 0 === _a ? void 0 : _a.size) > 0) { return state.updateHeaderCheckedState(field, col, row); } return state.headerCheckedState[field]; } const recordIndex = state.table.getRecordShowIndexByCell(col, row); if (recordIndex >= 0) { const dataIndex = state.table.dataSource.getIndexKey(recordIndex).toString(); if ((0, vutils_1.isValid)(null === (_b = state.checkedState.get(dataIndex)) || void 0 === _b ? void 0 : _b[field])) return state.checkedState.get(dataIndex)[field]; if (state.checkedState.has(dataIndex)) state.checkedState.get(dataIndex)[field] = checked; else if (dataIndex.includes(",")) { const parentDataIndex = dataIndex.split(",").slice(0, -1).join(","); state.checkedState.has(parentDataIndex) && !0 === state.checkedState.get(parentDataIndex)[field] ? state.checkedState.set(dataIndex, { [field]: !0 }) : state.checkedState.set(dataIndex, { [field]: checked }); } else state.checkedState.set(dataIndex, { [field]: checked }); } return checked; } function initCheckedState(records, state) { state.checkedState.clear(), state.headerCheckedState = {}, state.radioState = {}; let isNeedInitHeaderCheckedStateFromRecord = !1; if (state._checkboxCellTypeFields = [], state._headerCheckFuncs = {}, state.table.internalProps.layoutMap.headerObjects.forEach(((hd, index) => { if ("checkbox" === hd.headerType) { const headerChecked = hd.define.checked; null == headerChecked || "function" == typeof headerChecked ? (isNeedInitHeaderCheckedStateFromRecord = !0, "function" == typeof headerChecked && (state._headerCheckFuncs[hd.field] = headerChecked)) : state.headerCheckedState[hd.field] = headerChecked, "checkbox" !== hd.define.cellType && !(0, vutils_1.isFunction)(hd.define.cellType) || hd.fieldFormat || state._checkboxCellTypeFields.push(hd.field); } })), 1 === state.table.leftRowSeriesNumberCount) state.headerCheckedState._vtable_rowSeries_number = !1, state._checkboxCellTypeFields.push("_vtable_rowSeries_number"), isNeedInitHeaderCheckedStateFromRecord = !0; else if (state.table.leftRowSeriesNumberCount > 1) { for (let i = 0; i < state.table.leftRowSeriesNumberCount; i++) state.headerCheckedState[`_vtable_rowSeries_number_${i}`] = !1, state._checkboxCellTypeFields.push(`_vtable_rowSeries_number_${i}`); isNeedInitHeaderCheckedStateFromRecord = !0; } isNeedInitHeaderCheckedStateFromRecord && initRecordCheckState(records, state); } function updateHeaderCheckedState(field, state, col, row) { let allChecked = !0, allUnChecked = !0, hasChecked = !1; return state.checkedState.forEach(((check_state, index) => { var _a, _b; index = index.includes(",") ? index.split(",").map((item => Number(item))) : Number(index); const tableIndex = state.table.getTableIndexByRecordIndex(index), mergeCell = state.table.transpose ? state.table.getCustomMerge(tableIndex, row) : state.table.getCustomMerge(col, tableIndex), data = null === (_a = state.table.dataSource) || void 0 === _a ? void 0 : _a.get(index); mergeCell || !(null === (_b = state.table.internalProps.rowSeriesNumber) || void 0 === _b ? void 0 : _b.enableTreeCheckbox) && (null == data ? void 0 : data.vtableMerge) || (!0 !== (null == check_state ? void 0 : check_state[field]) ? allChecked = !1 : (allUnChecked = !1, hasChecked = !0)); })), allChecked ? (state.headerCheckedState[field] = !0, allChecked) : allUnChecked ? (state.headerCheckedState[field] = !1, !1) : !!hasChecked && (state.headerCheckedState[field] = "indeterminate", "indeterminate"); } function initLeftRecordsCheckState(records, state) { for (let index = state.checkedState.size; index < records.length; index++) { const record = records[index]; state._checkboxCellTypeFields.forEach((field => { const value = record[field]; let isChecked; (0, vutils_1.isObject)(value) ? isChecked = value.checked : "boolean" == typeof value && (isChecked = value); const dataIndex = index.toString(); state.checkedState.get(dataIndex) || state.checkedState.set(dataIndex, {}), state.checkedState.get(dataIndex)[field] = isChecked; })); } } function setCellCheckboxState(col, row, checked, table) { const cellGroup = table.scenegraph.getCell(col, row), checkbox = null == cellGroup ? void 0 : cellGroup.getChildByName("checkbox"); if (!checkbox) { const field = table.getHeaderField(col, row); if (table.isHeader(col, row)) { table.stateManager.setHeaderCheckedState(field, checked); "checkbox" === table.getCellType(col, row) && table.scenegraph.updateCheckboxCellState(col, row, checked); } else { table.stateManager.setCheckedState(col, row, field, checked); if ("checkbox" === table.getCellType(col, row)) { const oldHeaderCheckedState = table.stateManager.headerCheckedState[field], newHeaderCheckedState = table.stateManager.updateHeaderCheckedState(field, col, row); oldHeaderCheckedState !== newHeaderCheckedState && table.scenegraph.updateHeaderCheckboxCellState(col, row, newHeaderCheckedState); } } return; } const {checked: oldChecked, indeterminate: indeterminate} = checkbox.attribute; indeterminate ? (checked || checkbox._handlePointerUp(), checkbox._handlePointerUp()) : oldChecked ? checked || checkbox._handlePointerUp() : checked && checkbox._handlePointerUp(); } function setCellCheckboxStateByAttribute(col, row, checked, table) { const cellGroup = table.scenegraph.getCell(col, row), checkbox = null == cellGroup ? void 0 : cellGroup.getChildByName("checkbox"); checkbox && ("indeterminate" === checked ? (checkbox.setAttribute("indeterminate", !0), checkbox.setAttribute("checked", void 0)) : (checkbox.setAttribute("indeterminate", void 0), checkbox.setAttribute("checked", checked))); } function changeCheckboxOrder(sourceIndex, targetIndex, state) { const {checkedState: checkedState, table: table} = state; let source, target; if (table.internalProps.transpose ? (sourceIndex = table.getRecordShowIndexByCell(sourceIndex, 0), targetIndex = table.getRecordShowIndexByCell(targetIndex, 0)) : (source = table.isPivotTable() ? void 0 : table.getRecordIndexByCell(0, sourceIndex), target = table.isPivotTable() ? void 0 : table.getRecordIndexByCell(0, targetIndex)), (0, vutils_1.isNumber)(source) && (0, vutils_1.isNumber)(target)) { if ((sourceIndex = source) > (targetIndex = target)) { const sourceRecord = checkedState.get(sourceIndex.toString()); for (let i = sourceIndex; i > targetIndex; i--) checkedState.set(i.toString(), checkedState.get((i - 1).toString())); checkedState.set(targetIndex.toString(), sourceRecord); } else if (sourceIndex < targetIndex) { const sourceRecord = checkedState.get(sourceIndex.toString()); for (let i = sourceIndex; i < targetIndex; i++) checkedState.set(i.toString(), checkedState.get((i + 1).toString())); checkedState.set(targetIndex.toString(), sourceRecord); } } else if ((0, vutils_1.isArray)(source) && (0, vutils_1.isArray)(target)) if ((sourceIndex = source[source.length - 1]) > (targetIndex = target[target.length - 1])) { const sourceRecord = checkedState.get(source.toString()); for (let i = sourceIndex; i > targetIndex; i--) { const now = [ ...source ]; now[now.length - 1] = i; const last = [ ...source ]; last[last.length - 1] = i - 1, checkedState.set(now.toString(), checkedState.get(last.toString())); } checkedState.set(target.toString(), sourceRecord); } else if (sourceIndex < targetIndex) { const sourceRecord = checkedState.get(source.toString()); for (let i = sourceIndex; i < targetIndex; i++) { const now = [ ...source ]; now[now.length - 1] = i; const next = [ ...source ]; next[next.length - 1] = i + 1, checkedState.set(now.toString(), checkedState.get(next.toString())); } checkedState.set(target.toString(), sourceRecord); } } function getGroupCheckboxState(table) { const result = [], dataSource = table.dataSource, groupKeyLength = dataSource.dataConfig.groupByRules.length + 1; return dataSource.currentIndexedData.forEach(((indexArr, index) => { if ((0, vutils_1.isArray)(indexArr) && indexArr.length === groupKeyLength) { const vtableOriginIndex = dataSource.getOriginRecordIndexForGroup(indexArr); result[vtableOriginIndex] = table.stateManager.checkedState.get(indexArr.toString()); } })), result; } function initRecordCheckState(records, state) { const table = state.table, start = table.isPivotTable() ? 0 : table.internalProps.transpose ? table.rowHeaderLevelCount : table.columnHeaderLevelCount, end = table.isPivotTable() ? (0, vutils_1.isArray)(records) ? records.length : 0 : table.internalProps.transpose ? table.colCount : table.rowCount; for (let index = 0; index + start < end; index++) { const record = table.isPivotTable() ? records[index] : table.dataSource.get(index); state._checkboxCellTypeFields.forEach((field => { const value = record && record[field]; let isChecked; if ((0, vutils_1.isObject)(value) ? isChecked = value.checked : "boolean" == typeof value && (isChecked = value), null == isChecked) { const headerCheckFunc = state._headerCheckFuncs[field]; if (headerCheckFunc) { const cellAddr = state.table.getCellAddrByFieldRecord(field, index); isChecked = (0, helper_1.getOrApply)(headerCheckFunc, { col: cellAddr.col, row: cellAddr.row, table: state.table, context: null, value: value }); } } const dataIndex = table.isPivotTable() ? index.toString() : state.table.dataSource.getIndexKey(index).toString(); state.checkedState.get(dataIndex) || state.checkedState.set(dataIndex, {}), state.checkedState.get(dataIndex)[field] = isChecked; })); } } exports.setCheckedState = setCheckedState, exports.setHeaderCheckedState = setHeaderCheckedState, exports.syncCheckedState = syncCheckedState, exports.initCheckedState = initCheckedState, exports.updateHeaderCheckedState = updateHeaderCheckedState, exports.initLeftRecordsCheckState = initLeftRecordsCheckState, exports.setCellCheckboxState = setCellCheckboxState, exports.setCellCheckboxStateByAttribute = setCellCheckboxStateByAttribute, exports.changeCheckboxOrder = changeCheckboxOrder, exports.getGroupCheckboxState = getGroupCheckboxState; //# sourceMappingURL=checkbox.js.map