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