diff --git a/src/editor/core/draw/Draw.ts b/src/editor/core/draw/Draw.ts index 9f5ab3e..b29afa6 100644 --- a/src/editor/core/draw/Draw.ts +++ b/src/editor/core/draw/Draw.ts @@ -62,7 +62,7 @@ import { WordBreak } from '../../dataset/enum/Editor' import { Control } from './control/Control' -import { zipElementList } from '../../utils/element' +import { getSlimCloneElementList, zipElementList } from '../../utils/element' import { CheckboxParticle } from './particle/CheckboxParticle' import { DeepRequired, IPadding } from '../../interface/Common' import { @@ -2059,23 +2059,26 @@ export class Draw { } // 历史记录用于undo、redo if (isSubmitHistory) { - const self = this - const oldElementList = deepClone(this.elementList) - const oldHeaderElementList = deepClone(this.header.getElementList()) - const oldFooterElementList = deepClone(this.footer.getElementList()) - const { startIndex, endIndex } = this.range.getRange() + const oldElementList = getSlimCloneElementList(this.elementList) + const oldHeaderElementList = getSlimCloneElementList( + this.header.getElementList() + ) + const oldFooterElementList = getSlimCloneElementList( + this.footer.getElementList() + ) + const oldRange = deepClone(this.range.getRange()) const pageNo = this.pageNo const oldPositionContext = deepClone(positionContext) const zone = this.zone.getZone() - this.historyManager.execute(function () { - self.zone.setZone(zone) - self.setPageNo(pageNo) - self.position.setPositionContext(deepClone(oldPositionContext)) - self.header.setElementList(deepClone(oldHeaderElementList)) - self.footer.setElementList(deepClone(oldFooterElementList)) - self.elementList = deepClone(oldElementList) - self.range.setRange(startIndex, endIndex) - self.render({ + this.historyManager.execute(() => { + this.zone.setZone(zone) + this.setPageNo(pageNo) + this.position.setPositionContext(deepClone(oldPositionContext)) + this.header.setElementList(deepClone(oldHeaderElementList)) + this.footer.setElementList(deepClone(oldFooterElementList)) + this.elementList = deepClone(oldElementList) + this.range.replaceRange(deepClone(oldRange)) + this.render({ curIndex, isSubmitHistory: false, isSourceHistory: true diff --git a/src/editor/utils/element.ts b/src/editor/utils/element.ts index f42bd81..e380c14 100644 --- a/src/editor/utils/element.ts +++ b/src/editor/utils/element.ts @@ -1,4 +1,11 @@ -import { cloneProperty, deepClone, getUUID, isArrayEqual, splitText } from '.' +import { + cloneProperty, + deepClone, + deepCloneOmitKeys, + getUUID, + isArrayEqual, + splitText +} from '.' import { ElementType, IEditorOption, @@ -28,6 +35,7 @@ import { } from '../dataset/constant/Title' import { ControlComponent, ControlType } from '../dataset/enum/Control' import { DeepRequired } from '../interface/Common' +import { IRowElement } from '../interface/Row' import { ITd } from '../interface/table/Td' import { ITr } from '../interface/table/Tr' @@ -1169,3 +1177,10 @@ export function getTextFromElementList(elementList: IElement[]) { } return buildText(zipElementList(elementList)) } + +export function getSlimCloneElementList(elementList: IElement[]) { + return deepCloneOmitKeys(elementList, [ + 'metrics', + 'style' + ]) +} diff --git a/src/editor/utils/index.ts b/src/editor/utils/index.ts index ad2b4fd..0f3c333 100644 --- a/src/editor/utils/index.ts +++ b/src/editor/utils/index.ts @@ -31,6 +31,23 @@ export function throttle(func: Function, delay: number) { } } +export function deepCloneOmitKeys(obj: T, omitKeys: (keyof K)[]): T { + if (!obj || typeof obj !== 'object') { + return obj + } + let newObj: any = {} + if (Array.isArray(obj)) { + newObj = obj.map(item => deepCloneOmitKeys(item, omitKeys)) + } else { + // prettier-ignore + (Object.keys(obj) as (keyof K)[]).forEach(key => { + if (omitKeys.includes(key)) return + return (newObj[key] = deepCloneOmitKeys((obj[key as unknown as keyof T] ), omitKeys)) + }) + } + return newObj +} + export function deepClone(obj: T): T { if (!obj || typeof obj !== 'object') { return obj @@ -39,8 +56,8 @@ export function deepClone(obj: T): T { if (Array.isArray(obj)) { newObj = obj.map(item => deepClone(item)) } else { - Object.keys(obj as any).forEach(key => { - // @ts-ignore + // prettier-ignore + (Object.keys(obj) as (keyof T)[]).forEach(key => { return (newObj[key] = deepClone(obj[key])) }) }