@flowgram.ai/free-history-plugin 0.2.15 → 0.2.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.mts +19 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js.map +1 -1
- package/package.json +9 -9
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/create-free-history-plugin.ts","../../src/history-entity-manager.ts","../../src/handlers/drag-nodes-handler.ts","../../src/types.ts","../../src/handlers/change-node-data-handler.ts","../../src/free-history-config.ts","../../src/handlers/change-content-handler.ts","../../src/changes/delete-node-change.ts","../../src/changes/delete-line-change.ts","../../src/changes/add-node-change.ts","../../src/changes/add-line-change.ts","../../src/changes/index.ts","../../src/free-history-registers.ts","../../src/operation-metas/reset-layout.ts","../../src/operation-metas/base.ts","../../src/operation-metas/move-child-nodes.ts","../../src/operation-metas/drag-nodes.ts","../../src/operation-metas/delete-node.ts","../../src/operation-metas/delete-line.ts","../../src/operation-metas/change-node-data.ts","../../src/operation-metas/add-node.ts","../../src/operation-metas/add-line.ts","../../src/operation-metas/index.ts","../../src/free-history-manager.ts","../../src/index.ts","../../src/hooks/use-undo-redo.tsx"],"sourcesContent":["import { bindContributions, definePluginCreator } from '@flowgram.ai/core';\nimport { HistoryContainerModule, OperationContribution } from '@flowgram.ai/history';\n\nimport { type FreeHistoryPluginOptions } from './types';\nimport { HistoryEntityManager } from './history-entity-manager';\nimport { DragNodesHandler } from './handlers/drag-nodes-handler';\nimport { ChangeNodeDataHandler } from './handlers/change-node-data-handler';\nimport { ChangeContentHandler } from './handlers/change-content-handler';\nimport { FreeHistoryRegisters } from './free-history-registers';\nimport { FreeHistoryManager } from './free-history-manager';\nimport { FreeHistoryConfig } from './free-history-config';\n\nexport const createFreeHistoryPlugin = definePluginCreator<FreeHistoryPluginOptions>({\n onBind: ({ bind }) => {\n bindContributions(bind, FreeHistoryRegisters, [OperationContribution]);\n bind(FreeHistoryConfig).toSelf().inSingletonScope();\n bind(FreeHistoryManager).toSelf().inSingletonScope();\n bind(HistoryEntityManager).toSelf().inSingletonScope();\n bind(DragNodesHandler).toSelf().inSingletonScope();\n bind(ChangeNodeDataHandler).toSelf().inSingletonScope();\n bind(ChangeContentHandler).toSelf().inSingletonScope();\n },\n onInit(ctx, opts): void {\n ctx.get<FreeHistoryConfig>(FreeHistoryConfig).init(ctx, opts);\n\n if (!opts.enable) {\n return;\n }\n ctx.get<FreeHistoryManager>(FreeHistoryManager).onInit(ctx, opts);\n },\n onDispose(ctx) {\n ctx.get<HistoryEntityManager>(HistoryEntityManager).dispose();\n },\n containerModules: [HistoryContainerModule],\n});\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { cloneDeep, isEqual } from 'lodash';\nimport { injectable } from 'inversify';\nimport { type EntityData } from '@flowgram.ai/core';\nimport { type Disposable, DisposableCollection } from '@flowgram.ai/utils';\n\n@injectable()\nexport class HistoryEntityManager implements Disposable {\n private _entityDataValues: Map<EntityData, unknown> = new Map();\n\n private _toDispose: DisposableCollection = new DisposableCollection();\n\n addEntityData(entityData: EntityData) {\n this._entityDataValues.set(entityData, cloneDeep(entityData.toJSON()));\n this._toDispose.push(\n entityData.onWillChange(event => {\n const value = event.toJSON();\n const oldValue = this._entityDataValues.get(entityData);\n if (isEqual(value, oldValue)) {\n return;\n }\n this._entityDataValues.set(entityData, cloneDeep(value));\n }),\n );\n }\n\n getValue(entityData: EntityData) {\n return this._entityDataValues.get(entityData);\n }\n\n setValue(entityData: EntityData, value: unknown) {\n return this._entityDataValues.set(entityData, value);\n }\n\n dispose() {\n this._entityDataValues.clear();\n this._toDispose.dispose();\n }\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { injectable, inject } from 'inversify';\nimport { HistoryService } from '@flowgram.ai/history';\nimport { type NodesDragEndEvent } from '@flowgram.ai/free-layout-core';\nimport { TransformData } from '@flowgram.ai/core';\n\nimport { FreeOperationType, type IHandler } from '../types';\n\n@injectable()\nexport class DragNodesHandler implements IHandler<NodesDragEndEvent> {\n @inject(HistoryService)\n private _historyService: HistoryService;\n\n handle(event: NodesDragEndEvent) {\n if (event.type === 'onDragEnd') {\n this._dragNode(event);\n }\n }\n\n private _dragNode(event: NodesDragEndEvent) {\n this._historyService.pushOperation(\n {\n type: FreeOperationType.dragNodes,\n value: {\n ids: event.nodes.map((node) => node.id),\n value: event.nodes.map((node) => {\n const { x, y } = node.getData(TransformData).position;\n return {\n x,\n y,\n };\n }),\n oldValue: event.startPositions,\n },\n },\n { noApply: true }\n );\n }\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { type IPoint } from '@flowgram.ai/utils';\nimport { type Operation, type OperationMeta } from '@flowgram.ai/history';\nimport {\n type WorkflowContentChangeType,\n type WorkflowContentChangeEvent,\n type WorkflowLineEntity,\n type WorkflowLinePortInfo,\n type WorkflowNodeJSON,\n type PositionMap,\n} from '@flowgram.ai/free-layout-core';\nimport { type FlowNodeEntity, type FlowNodeJSON } from '@flowgram.ai/document';\nimport { type EntityData, type PluginContext } from '@flowgram.ai/core';\n\nexport enum FreeOperationType {\n addLine = 'addLine',\n deleteLine = 'deleteLine',\n moveNode = 'moveNode',\n addNode = 'addNode',\n deleteNode = 'deleteNode',\n changeNodeData = 'changeNodeData',\n resetLayout = 'resetLayout',\n dragNodes = 'dragNodes',\n moveChildNodes = 'moveChildNodes',\n}\n\nexport interface AddOrDeleteLineOperationValue extends WorkflowLinePortInfo {\n id: string;\n}\n\nexport interface AddOrDeleteWorkflowNodeOperationValue {\n node: WorkflowNodeJSON;\n parentID?: string;\n}\n\nexport interface AddLineOperation extends Operation {\n type: FreeOperationType.addLine;\n value: AddOrDeleteLineOperationValue;\n}\n\nexport interface DeleteLineOperation extends Operation {\n type: FreeOperationType.deleteLine;\n value: AddOrDeleteLineOperationValue;\n}\n\nexport interface MoveNodeOperation extends Operation {\n type: FreeOperationType.moveNode;\n value: MoveNodeOperationValue;\n}\n\nexport interface AddWorkflowNodeOperation extends Operation {\n type: FreeOperationType.addNode;\n value: AddOrDeleteWorkflowNodeOperationValue;\n}\n\nexport interface DeleteWorkflowNodeOperation extends Operation {\n type: FreeOperationType.deleteNode;\n value: AddOrDeleteWorkflowNodeOperationValue;\n}\n\nexport interface MoveNodeOperationValue {\n id: string;\n value: {\n x: number;\n y: number;\n };\n oldValue: {\n x: number;\n y: number;\n };\n}\n\nexport interface DragNodeOperationValue {\n ids: string[];\n value: IPoint[];\n oldValue: IPoint[];\n}\n\nexport interface ResetLayoutOperationValue {\n ids: string[];\n value: PositionMap;\n oldValue: PositionMap;\n}\n\nexport interface ContentChangeTypeToOperation<T extends Operation> {\n type: WorkflowContentChangeType;\n toOperation: (event: WorkflowContentChangeEvent, ctx: PluginContext) => T | undefined;\n}\n\nexport interface EntityDataType {\n type: FreeOperationType;\n toEntityData: (node: FlowNodeEntity, ctx: PluginContext) => EntityData;\n}\n\nexport interface ChangeNodeDataValue {\n id: string;\n value: unknown;\n oldValue: unknown;\n path: string;\n}\n\nexport interface ChangeNodeDataOperation extends Operation {\n type: FreeOperationType.changeNodeData;\n value: ChangeNodeDataValue;\n}\n\n/**\n * 将node转成json\n */\nexport type NodeToJson = (node: FlowNodeEntity) => FlowNodeJSON;\n/**\n * 将line转成json\n */\nexport type LineToJson = (node: WorkflowLineEntity) => FlowNodeJSON;\n/**\n * 根据节点id获取label\n */\nexport type GetNodeLabelById = (id: string) => string;\n/**\n * 根据节点获取label\n */\nexport type GetNodeLabel = (node: FlowNodeJSON) => string;\n/**\n * 根据分支获取label\n */\nexport type GetBlockLabel = (node: FlowNodeJSON) => string;\n/**\n * 根据节点获取URI\n */\nexport type GetNodeURI = (id: string) => string | any;\n/**\n * 根据连线获取URI\n */\nexport type GetLineURI = (id: string) => string | any;\n\n/**\n * 插件配置\n */\nexport interface FreeHistoryPluginOptions {\n enable?: boolean;\n limit?: number;\n nodeToJSON?: (ctx: PluginContext) => NodeToJson;\n getNodeLabelById?: (ctx: PluginContext) => GetNodeLabelById;\n getNodeLabel?: (ctx: PluginContext) => GetNodeLabel;\n getBlockLabel?: (ctx: PluginContext) => GetBlockLabel;\n getNodeURI?: (ctx: PluginContext) => GetNodeURI;\n getLineURI?: (ctx: PluginContext) => GetLineURI;\n operationMetas?: OperationMeta[];\n enableChangeNode?: boolean;\n uri?: string | any;\n}\n\nexport interface IHandler<E> {\n handle: (event: E, ctx: PluginContext) => void | Promise<void>;\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { cloneDeep, get, isEqual, set } from 'lodash';\nimport { injectable, inject } from 'inversify';\nimport { FlowNodeFormData, type DetailChangeEvent } from '@flowgram.ai/form-core';\nimport { type FlowNodeEntity } from '@flowgram.ai/document';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { HistoryService } from '@flowgram.ai/history';\n\nimport { FreeOperationType, type IHandler } from '../types';\nimport { HistoryEntityManager } from '../history-entity-manager';\nimport { FreeHistoryConfig } from '../free-history-config';\n\nexport interface ChangeNodeDataEvent extends DetailChangeEvent {\n node: FlowNodeEntity;\n}\n\n@injectable()\nexport class ChangeNodeDataHandler implements IHandler<ChangeNodeDataEvent> {\n @inject(HistoryService)\n private _historyService: HistoryService;\n\n @inject(WorkflowDocument) document: WorkflowDocument;\n\n @inject(HistoryEntityManager)\n private _entityManager: HistoryEntityManager;\n\n @inject(FreeHistoryConfig)\n private _config: FreeHistoryConfig;\n\n handle(event: ChangeNodeDataEvent) {\n const { path, value, initialized, node } = event;\n const formData = node.getData<FlowNodeFormData>(FlowNodeFormData);\n const oldValue = this._entityManager.getValue(formData) as object;\n const propPath = path.split('/').filter(Boolean).join('.');\n\n const propOldValue = propPath ? get(oldValue, propPath) : oldValue;\n if (isEqual(value, propOldValue)) {\n return;\n }\n\n if (initialized) {\n let operationPath = path;\n let operationValue = cloneDeep(value);\n let operationOldValue = propOldValue;\n // 只存储一层的数据,因为formModel无法获取数组下的某项的值\n if (path !== '/') {\n const clonedOldValue = cloneDeep(oldValue);\n set(clonedOldValue, propPath, value);\n operationPath = path.split('/').filter(Boolean)[0];\n operationValue = get(clonedOldValue, operationPath);\n operationOldValue = get(oldValue, operationPath);\n }\n\n this._historyService.pushOperation(\n {\n type: FreeOperationType.changeNodeData,\n value: {\n id: node.id,\n path: operationPath,\n value: operationValue,\n oldValue: operationOldValue,\n },\n uri: this._config.getNodeURI(node.id),\n },\n { noApply: true },\n );\n }\n\n if (propPath) {\n set(oldValue, propPath, cloneDeep(value));\n } else {\n this._entityManager.setValue(formData, cloneDeep(value));\n }\n }\n}\n","import { injectable } from 'inversify';\nimport { type FlowNodeEntity, type FlowNodeJSON } from '@flowgram.ai/document';\nimport { type PluginContext } from '@flowgram.ai/core';\n\nimport {\n type FreeHistoryPluginOptions,\n type GetBlockLabel,\n type GetLineURI,\n type GetNodeLabel,\n type GetNodeLabelById,\n type GetNodeURI,\n type NodeToJson,\n} from './types';\n\n@injectable()\nexport class FreeHistoryConfig {\n init(ctx: PluginContext, options: FreeHistoryPluginOptions) {\n this.enable = !!options?.enable;\n\n if (options.nodeToJSON) {\n this.nodeToJSON = options.nodeToJSON(ctx);\n }\n\n if (options.getNodeLabelById) {\n this.getNodeLabelById = options.getNodeLabelById(ctx);\n }\n\n if (options.getNodeLabel) {\n this.getNodeLabel = options.getNodeLabel(ctx);\n }\n\n if (options.getBlockLabel) {\n this.getBlockLabel = options.getBlockLabel(ctx);\n }\n\n if (options.getNodeURI) {\n this.getNodeURI = options.getNodeURI(ctx);\n }\n\n if (options.getLineURI) {\n this.getLineURI = options.getLineURI(ctx);\n }\n }\n\n enable = false;\n\n nodeToJSON: NodeToJson = (node: FlowNodeEntity) => node.toJSON();\n\n getNodeLabelById: GetNodeLabelById = (id: string) => id;\n\n getNodeLabel: GetNodeLabel = (node: FlowNodeJSON) => node.id;\n\n getBlockLabel: GetBlockLabel = (node: FlowNodeJSON) => node.id;\n\n getNodeURI: GetNodeURI = (id: string) => `node:${id}`;\n\n getLineURI: GetLineURI = (id: string) => `line:${id}`;\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { injectable, inject } from 'inversify';\nimport { HistoryService, Operation } from '@flowgram.ai/history';\nimport { type WorkflowContentChangeEvent } from '@flowgram.ai/free-layout-core';\nimport { type PluginContext } from '@flowgram.ai/core';\n\nimport { type IHandler } from '../types';\nimport changes from '../changes';\n\n@injectable()\nexport class ChangeContentHandler implements IHandler<WorkflowContentChangeEvent> {\n @inject(HistoryService)\n private _historyService: HistoryService;\n\n handle(event: WorkflowContentChangeEvent, ctx: PluginContext) {\n if (!this._historyService.undoRedoService.canPush()) {\n return;\n }\n\n const change = changes.find((c) => c.type === event.type);\n if (!change) {\n return;\n }\n const operation: Operation | undefined = change.toOperation(event, ctx);\n if (!operation) {\n return;\n }\n\n this._historyService.pushOperation(operation, { noApply: true });\n }\n}\n","import { WorkflowContentChangeType } from '@flowgram.ai/free-layout-core';\nimport { type FlowNodeEntity } from '@flowgram.ai/document';\n\nimport {\n type ContentChangeTypeToOperation,\n FreeOperationType,\n type DeleteWorkflowNodeOperation,\n} from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\n\nexport const deleteNodeChange: ContentChangeTypeToOperation<DeleteWorkflowNodeOperation> = {\n type: WorkflowContentChangeType.DELETE_NODE,\n toOperation: (event, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const node = event.entity as FlowNodeEntity;\n const json = event.toJSON();\n const parentID = node.parent?.id;\n\n return {\n type: FreeOperationType.deleteNode,\n value: {\n node: json,\n parentID,\n },\n uri: config.getNodeURI(node.id),\n };\n },\n};\n","import { type WorkflowLineEntity } from '@flowgram.ai/free-layout-core';\nimport { WorkflowContentChangeType } from '@flowgram.ai/free-layout-core';\n\nimport {\n type AddOrDeleteLineOperationValue,\n type ContentChangeTypeToOperation,\n type DeleteLineOperation,\n FreeOperationType,\n} from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\n\nexport const deleteLineChange: ContentChangeTypeToOperation<DeleteLineOperation> = {\n type: WorkflowContentChangeType.DELETE_LINE,\n toOperation: (event, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const line = event.entity as WorkflowLineEntity;\n const value: AddOrDeleteLineOperationValue = {\n from: line.info.from,\n to: line.info.to || '',\n fromPort: line.info.fromPort || '',\n toPort: line.info.toPort || '',\n id: line.id,\n };\n return {\n type: FreeOperationType.deleteLine,\n value,\n uri: config.getNodeURI(line.id),\n };\n },\n};\n","import { WorkflowDocument, type WorkflowNodeJSON } from '@flowgram.ai/free-layout-core';\nimport { WorkflowContentChangeType } from '@flowgram.ai/free-layout-core';\nimport { type FlowNodeEntity } from '@flowgram.ai/document';\n\nimport {\n type AddWorkflowNodeOperation,\n type ContentChangeTypeToOperation,\n FreeOperationType,\n} from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\n\nexport const addNodeChange: ContentChangeTypeToOperation<AddWorkflowNodeOperation> = {\n type: WorkflowContentChangeType.ADD_NODE,\n toOperation: (event, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n const node = event.entity as FlowNodeEntity;\n const parentID = node.parent?.id;\n const json: WorkflowNodeJSON = document.toNodeJSON(node);\n\n return {\n type: FreeOperationType.addNode,\n value: {\n node: json,\n parentID,\n },\n uri: config.getNodeURI(node.id),\n };\n },\n};\n","import { type WorkflowLineEntity } from '@flowgram.ai/free-layout-core';\nimport { WorkflowContentChangeType } from '@flowgram.ai/free-layout-core';\n\nimport {\n type AddLineOperation,\n type AddOrDeleteLineOperationValue,\n type ContentChangeTypeToOperation,\n FreeOperationType,\n} from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\n\nexport const addLineChange: ContentChangeTypeToOperation<AddLineOperation> = {\n type: WorkflowContentChangeType.ADD_LINE,\n toOperation: (event, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const line = event.entity as WorkflowLineEntity;\n const value: AddOrDeleteLineOperationValue = {\n from: line.info.from,\n to: line.info.to || '',\n fromPort: line.info.fromPort || '',\n toPort: line.info.toPort || '',\n id: line.id,\n };\n return {\n type: FreeOperationType.addLine,\n value,\n uri: config.getLineURI(line.id),\n };\n },\n};\n","import { deleteNodeChange } from './delete-node-change';\nimport { deleteLineChange } from './delete-line-change';\nimport { addNodeChange } from './add-node-change';\nimport { addLineChange } from './add-line-change';\n\nexport default [addLineChange, deleteLineChange, addNodeChange, deleteNodeChange];\n","import { injectable } from 'inversify';\nimport { type OperationContribution, type OperationRegistry } from '@flowgram.ai/history';\n\nimport { operationMetas } from './operation-metas';\n\n@injectable()\nexport class FreeHistoryRegisters implements OperationContribution {\n registerOperationMeta(operationRegistry: OperationRegistry): void {\n operationMetas.forEach(operationMeta => {\n operationRegistry.registerOperationMeta(operationMeta);\n });\n }\n}\n","import { type PluginContext } from '@flowgram.ai/core';\nimport { WorkflowResetLayoutService } from '@flowgram.ai/free-layout-core';\nimport { type OperationMeta } from '@flowgram.ai/history';\n\nimport { FreeOperationType, type ResetLayoutOperationValue } from '../types';\nimport { baseOperationMeta } from './base';\n\nexport const resetLayoutOperationMeta: OperationMeta<\n ResetLayoutOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: FreeOperationType.resetLayout,\n inverse: op => ({\n ...op,\n value: {\n ...op.value,\n value: op.value.oldValue,\n oldValue: op.value.value,\n },\n }),\n apply: async (operation, ctx: PluginContext) => {\n const reset = ctx.get<WorkflowResetLayoutService>(WorkflowResetLayoutService);\n await reset.layoutToPositions(operation.value.ids, operation.value.value);\n },\n shouldMerge: () => false,\n};\n","import { type OperationMeta } from '@flowgram.ai/history';\n\nexport const baseOperationMeta: Partial<OperationMeta> = {\n shouldMerge: (_op, prev, element) => {\n if (!prev) {\n return false;\n }\n\n if (\n // 合并500ms内的操作, 如删除节点会联动删除线条\n Date.now() - element.getTimestamp() <\n 500\n ) {\n return true;\n }\n return false;\n },\n};\n","import { OperationMeta } from '@flowgram.ai/history';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { MoveChildNodesOperationValue, OperationType } from '@flowgram.ai/document';\nimport { FlowNodeBaseType } from '@flowgram.ai/document';\nimport { PluginContext, TransformData } from '@flowgram.ai/core';\n\nimport { baseOperationMeta } from './base';\n\nexport const moveChildNodesOperationMeta: OperationMeta<\n MoveChildNodesOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: OperationType.moveChildNodes,\n inverse: (op) => ({\n ...op,\n value: {\n ...op.value,\n fromIndex: op.value.toIndex,\n toIndex: op.value.fromIndex,\n fromParentId: op.value.toParentId,\n toParentId: op.value.fromParentId,\n },\n }),\n apply: (operation, ctx: PluginContext) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n document.moveChildNodes(operation.value);\n const fromContainer = document.getNode(operation.value.fromParentId);\n requestAnimationFrame(() => {\n if (fromContainer && fromContainer.flowNodeType !== FlowNodeBaseType.ROOT) {\n const fromContainerTransformData = fromContainer.getData(TransformData);\n fromContainerTransformData.fireChange();\n }\n });\n },\n};\n","import { type OperationMeta } from '@flowgram.ai/history';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { type PluginContext, TransformData } from '@flowgram.ai/core';\n\nimport { type DragNodeOperationValue, FreeOperationType } from '../types';\nimport { baseOperationMeta } from './base';\n\nexport const dragNodesOperationMeta: OperationMeta<DragNodeOperationValue, PluginContext, void> = {\n ...baseOperationMeta,\n type: FreeOperationType.dragNodes,\n inverse: (op) => ({\n ...op,\n value: {\n ...op.value,\n value: op.value.oldValue,\n oldValue: op.value.value,\n },\n }),\n apply: (operation, ctx) => {\n operation.value.ids.forEach((id, index) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n const node = document.getNode(id);\n if (!node) {\n return;\n }\n\n const transform = node.getData(TransformData);\n const point = operation.value.value[index];\n transform.update({\n position: {\n x: point.x,\n y: point.y,\n },\n });\n document.layout.updateAffectedTransform(node);\n });\n },\n};\n","import { type PluginContext } from '@flowgram.ai/core';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { type OperationMeta } from '@flowgram.ai/history';\n\nimport { type AddOrDeleteWorkflowNodeOperationValue, FreeOperationType } from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\nimport { baseOperationMeta } from './base';\n\nexport const deleteNodeOperationMeta: OperationMeta<\n AddOrDeleteWorkflowNodeOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: FreeOperationType.deleteNode,\n inverse: op => ({\n ...op,\n type: FreeOperationType.addNode,\n }),\n apply: (operation, ctx: PluginContext) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n const node = document.getNode(operation.value.node.id);\n if (node) {\n node.dispose();\n }\n },\n getLabel: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n return `Delete Node ${config.getNodeLabel(op.value.node)}`;\n },\n getDescription: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n let desc = `Delete Node ${config.getNodeLabel(op.value.node)}`;\n if (op.value.node.meta?.position) {\n desc += ` at ${op.value.node.meta.position.x},${op.value.node.meta.position.y}`;\n }\n return desc;\n },\n};\n","import { type OperationMeta } from '@flowgram.ai/history';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { type PluginContext } from '@flowgram.ai/core';\n\nimport { type AddOrDeleteLineOperationValue, FreeOperationType } from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\nimport { baseOperationMeta } from './base';\n\nexport const deleteLineOperationMeta: OperationMeta<\n AddOrDeleteLineOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: FreeOperationType.deleteLine,\n inverse: (op) => ({\n ...op,\n type: FreeOperationType.addLine,\n }),\n apply: (operation, ctx: PluginContext) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n document.removeNode(operation.value.id);\n },\n getLabel: (op, ctx) => 'Delete Line',\n getDescription: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const { value } = op;\n if (!value.from || !value.to) {\n return 'Delete Line';\n }\n\n const fromName = config.getNodeLabelById(value.from);\n const toName = config.getNodeLabelById(value.to);\n return `Delete Line from ${fromName} to ${toName}`;\n },\n};\n","import { FlowNodeFormData } from '@flowgram.ai/form-core';\nimport { type PluginContext } from '@flowgram.ai/core';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { type OperationMeta } from '@flowgram.ai/history';\n\nimport { FreeOperationType, type ChangeNodeDataValue } from '../types';\nimport { baseOperationMeta } from './base';\n\nexport const changeNodeDataOperationMeta: OperationMeta<ChangeNodeDataValue, PluginContext, void> =\n {\n ...baseOperationMeta,\n type: FreeOperationType.changeNodeData,\n inverse: op => ({\n ...op,\n value: {\n ...op.value,\n value: op.value.oldValue,\n oldValue: op.value.value,\n },\n }),\n apply: (operation, ctx: PluginContext) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n const node = document.getNode(operation.value.id);\n\n if (!node) {\n return;\n }\n const formData = node.getData(FlowNodeFormData);\n\n if (!formData) {\n return;\n }\n\n let { path } = operation.value;\n if (path.endsWith('/') && path !== '/') {\n path = path.slice(0, -1);\n }\n\n if (!path.startsWith('/')) {\n path = `/${path}`;\n }\n\n const formItem = formData.formModel.getFormItemByPath(path);\n\n if (!formItem) {\n return;\n }\n formItem.value = operation.value.value;\n },\n shouldMerge: (op, prev, element) => {\n if (!prev) {\n return false;\n }\n\n if (Date.now() - element.getTimestamp() < 500) {\n if (\n op.type === prev.type && // 相同类型\n op.value.id === prev.value.id && // 相同节点\n op.value?.path === prev.value?.path // 相同路径\n ) {\n return {\n type: op.type,\n value: {\n ...op.value,\n value: op.value.value,\n oldValue: prev.value.oldValue,\n },\n };\n }\n return true;\n }\n return false;\n },\n };\n","import { cloneDeep } from 'lodash';\nimport { type PluginContext } from '@flowgram.ai/core';\nimport { WorkflowDocument, type WorkflowNodeJSON } from '@flowgram.ai/free-layout-core';\nimport { type OperationMeta } from '@flowgram.ai/history';\n\nimport { type AddOrDeleteWorkflowNodeOperationValue, FreeOperationType } from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\nimport { baseOperationMeta } from './base';\n\nexport const addNodeOperationMeta: OperationMeta<\n AddOrDeleteWorkflowNodeOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: FreeOperationType.addNode,\n inverse: op => ({\n ...op,\n type: FreeOperationType.deleteNode,\n }),\n apply: async (operation, ctx: PluginContext) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n await document.createWorkflowNode(\n cloneDeep(operation.value.node) as WorkflowNodeJSON,\n false,\n operation.value.parentID,\n );\n },\n getLabel: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n return `Create Node ${config.getNodeLabel(op.value.node)}`;\n },\n getDescription: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n let desc = `Create Node ${config.getNodeLabel(op.value.node)}`;\n if (op.value.node.meta?.position) {\n desc += ` at ${op.value.node.meta.position.x},${op.value.node.meta.position.y}`;\n }\n return desc;\n },\n};\n","import { type PluginContext } from '@flowgram.ai/core';\nimport { WorkflowLinesManager } from '@flowgram.ai/free-layout-core';\nimport { type OperationMeta } from '@flowgram.ai/history';\n\nimport { type AddOrDeleteLineOperationValue, FreeOperationType } from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\nimport { baseOperationMeta } from './base';\n\nexport const addLineOperationMeta: OperationMeta<\n AddOrDeleteLineOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: FreeOperationType.addLine,\n inverse: op => ({\n ...op,\n type: FreeOperationType.deleteLine,\n }),\n apply: (operation, ctx: PluginContext) => {\n const linesManager = ctx.get<WorkflowLinesManager>(WorkflowLinesManager);\n linesManager.createLine({\n ...operation.value,\n key: operation.value.id,\n });\n },\n getLabel: (op, ctx) => 'Create Line',\n getDescription: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const { value } = op;\n if (!value.from || !value.to) {\n return 'Create Line';\n }\n\n const fromName = config.getNodeLabelById(value.from);\n const toName = config.getNodeLabelById(value.to);\n return `Create Line from ${fromName} to ${toName}`;\n },\n};\n","import { resetLayoutOperationMeta } from './reset-layout';\nimport { moveChildNodesOperationMeta } from './move-child-nodes';\nimport { dragNodesOperationMeta } from './drag-nodes';\nimport { deleteNodeOperationMeta } from './delete-node';\nimport { deleteLineOperationMeta } from './delete-line';\nimport { changeNodeDataOperationMeta } from './change-node-data';\nimport { addNodeOperationMeta } from './add-node';\nimport { addLineOperationMeta } from './add-line';\n\nexport const operationMetas = [\n addLineOperationMeta,\n deleteLineOperationMeta,\n addNodeOperationMeta,\n deleteNodeOperationMeta,\n changeNodeDataOperationMeta,\n resetLayoutOperationMeta,\n dragNodesOperationMeta,\n moveChildNodesOperationMeta,\n];\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { cloneDeep } from 'lodash';\nimport { injectable, inject, optional } from 'inversify';\nimport { DisposableCollection, Disposable } from '@flowgram.ai/utils';\nimport { HistoryService } from '@flowgram.ai/history';\nimport {\n WorkflowDocument,\n WorkflowResetLayoutService,\n WorkflowDragService,\n WorkflowOperationBaseService,\n} from '@flowgram.ai/free-layout-core';\nimport { FlowNodeFormData } from '@flowgram.ai/form-core';\nimport { FormManager } from '@flowgram.ai/form-core';\nimport { OperationType } from '@flowgram.ai/document';\nimport { type PluginContext, PositionData } from '@flowgram.ai/core';\n\nimport { DragNodeOperationValue, type FreeHistoryPluginOptions, FreeOperationType } from './types';\nimport { HistoryEntityManager } from './history-entity-manager';\nimport { DragNodesHandler } from './handlers/drag-nodes-handler';\nimport { ChangeNodeDataHandler } from './handlers/change-node-data-handler';\nimport { ChangeContentHandler } from './handlers/change-content-handler';\n\n/**\n * 历史管理\n */\n@injectable()\nexport class FreeHistoryManager {\n @inject(DragNodesHandler)\n private _dragNodesHandler: DragNodesHandler;\n\n @inject(ChangeNodeDataHandler)\n private _changeNodeDataHandler: ChangeNodeDataHandler;\n\n @inject(ChangeContentHandler)\n private _changeContentHandler: ChangeContentHandler;\n\n @inject(HistoryEntityManager)\n private _entityManager: HistoryEntityManager;\n\n @inject(FormManager)\n @optional()\n private _formManager?: FormManager;\n\n private _toDispose: DisposableCollection = new DisposableCollection();\n\n @inject(WorkflowOperationBaseService)\n private _operationService: WorkflowOperationBaseService;\n\n onInit(ctx: PluginContext, opts: FreeHistoryPluginOptions) {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n const historyService = ctx.get<HistoryService>(HistoryService);\n const dragService = ctx.get<WorkflowDragService>(WorkflowDragService);\n\n const resetLayoutService = ctx.get<WorkflowResetLayoutService>(WorkflowResetLayoutService);\n\n if (opts?.limit) {\n historyService.limit(opts.limit);\n }\n historyService.context.source = ctx;\n\n this._toDispose.pushAll([\n dragService.onNodesDrag(async (event) => {\n if (event.type !== 'onDragEnd') {\n return;\n }\n this._dragNodesHandler.handle(event);\n }),\n document.onNodeCreate(({ node, data }) => {\n const positionData = node.getData(PositionData);\n if (positionData) {\n this._entityManager.addEntityData(positionData);\n }\n }),\n this._formManager\n ? this._formManager.onFormModelWillInit(({ model, data }) => {\n const node = model.flowNodeEntity;\n const formData = node.getData<FlowNodeFormData>(FlowNodeFormData);\n\n if (formData) {\n this._entityManager.setValue(formData, cloneDeep(data));\n\n this._toDispose.push(\n formData.onDetailChange((event) => {\n this._changeNodeDataHandler.handle({\n ...event,\n node,\n });\n })\n );\n }\n })\n : Disposable.NULL,\n document.onContentChange((event) => {\n this._changeContentHandler.handle(event, ctx);\n }),\n document.onReload((_event) => {\n historyService.clear();\n }),\n resetLayoutService.onResetLayout((event) => {\n historyService.pushOperation(\n {\n type: FreeOperationType.resetLayout,\n value: {\n ids: event.nodeIds,\n value: event.positionMap,\n oldValue: event.oldPositionMap,\n },\n },\n { noApply: true }\n );\n }),\n this._operationService.onNodeMove(({ node, fromParent, fromIndex, toParent, toIndex }) => {\n historyService.pushOperation(\n {\n type: OperationType.moveChildNodes,\n value: {\n fromParentId: fromParent.id,\n fromIndex,\n nodeIds: [node.id],\n toParentId: toParent.id,\n toIndex,\n },\n },\n {\n noApply: true,\n }\n );\n }),\n this._operationService.onNodePostionUpdate((event) => {\n const value: DragNodeOperationValue = {\n ids: [event.node.id],\n value: [event.newPosition],\n oldValue: [event.oldPosition],\n };\n historyService.pushOperation(\n {\n type: FreeOperationType.dragNodes,\n value,\n },\n {\n noApply: true,\n }\n );\n }),\n ]);\n }\n\n dispose() {\n this._entityManager.dispose();\n this._toDispose.dispose();\n }\n}\n","export * from './create-free-history-plugin';\nexport * from './types';\nexport * from '@flowgram.ai/history';\nexport * from './free-history-config';\nexport * from './hooks';\nexport * from './free-history-registers';\n","import { useEffect, useState } from 'react';\n\nimport { useService } from '@flowgram.ai/core';\nimport { HistoryService } from '@flowgram.ai/history';\n\ninterface UndoRedo {\n canUndo: boolean;\n canRedo: boolean;\n undo: () => Promise<void>;\n redo: () => Promise<void>;\n}\n\nexport function useUndoRedo(): UndoRedo {\n const historyService = useService<HistoryService>(HistoryService);\n const [canUndo, setCanUndo] = useState(false);\n const [canRedo, setCanRedo] = useState(false);\n\n useEffect(() => {\n const toDispose = historyService.undoRedoService.onChange(() => {\n setCanUndo(historyService.canUndo());\n setCanRedo(historyService.canRedo());\n });\n return () => {\n toDispose.dispose();\n };\n }, []);\n\n return {\n canUndo,\n canRedo,\n undo: () => historyService.undo(),\n redo: () => historyService.redo(),\n };\n}\n"],"mappings":"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","names":["injectable","FreeOperationType","injectable","cloneDeep","isEqual","injectable","inject","HistoryService","injectable","injectable","isEqual","cloneDeep","inject","HistoryService","injectable","injectable","inject","HistoryService","WorkflowContentChangeType","WorkflowContentChangeType","WorkflowDocument","WorkflowContentChangeType","WorkflowContentChangeType","WorkflowDocument","WorkflowContentChangeType","WorkflowContentChangeType","inject","HistoryService","injectable","injectable","WorkflowDocument","TransformData","WorkflowDocument","TransformData","WorkflowDocument","TransformData","WorkflowDocument","TransformData","WorkflowDocument","WorkflowDocument","WorkflowDocument","WorkflowDocument","FlowNodeFormData","WorkflowDocument","WorkflowDocument","FlowNodeFormData","cloneDeep","WorkflowDocument","WorkflowDocument","cloneDeep","injectable","cloneDeep","injectable","inject","DisposableCollection","HistoryService","WorkflowDocument","WorkflowResetLayoutService","FlowNodeFormData","OperationType","DisposableCollection","WorkflowDocument","HistoryService","WorkflowResetLayoutService","FlowNodeFormData","cloneDeep","OperationType","inject","injectable","HistoryService"]}
|
|
1
|
+
{"version":3,"sources":["../../src/create-free-history-plugin.ts","../../src/history-entity-manager.ts","../../src/handlers/drag-nodes-handler.ts","../../src/types.ts","../../src/handlers/change-node-data-handler.ts","../../src/free-history-config.ts","../../src/handlers/change-content-handler.ts","../../src/changes/delete-node-change.ts","../../src/changes/delete-line-change.ts","../../src/changes/add-node-change.ts","../../src/changes/add-line-change.ts","../../src/changes/index.ts","../../src/free-history-registers.ts","../../src/operation-metas/reset-layout.ts","../../src/operation-metas/base.ts","../../src/operation-metas/move-child-nodes.ts","../../src/operation-metas/drag-nodes.ts","../../src/operation-metas/delete-node.ts","../../src/operation-metas/delete-line.ts","../../src/operation-metas/change-node-data.ts","../../src/operation-metas/add-node.ts","../../src/operation-metas/add-line.ts","../../src/operation-metas/index.ts","../../src/free-history-manager.ts","../../src/index.ts","../../src/hooks/use-undo-redo.tsx"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { bindContributions, definePluginCreator } from '@flowgram.ai/core';\nimport { HistoryContainerModule, OperationContribution } from '@flowgram.ai/history';\n\nimport { type FreeHistoryPluginOptions } from './types';\nimport { HistoryEntityManager } from './history-entity-manager';\nimport { DragNodesHandler } from './handlers/drag-nodes-handler';\nimport { ChangeNodeDataHandler } from './handlers/change-node-data-handler';\nimport { ChangeContentHandler } from './handlers/change-content-handler';\nimport { FreeHistoryRegisters } from './free-history-registers';\nimport { FreeHistoryManager } from './free-history-manager';\nimport { FreeHistoryConfig } from './free-history-config';\n\nexport const createFreeHistoryPlugin = definePluginCreator<FreeHistoryPluginOptions>({\n onBind: ({ bind }) => {\n bindContributions(bind, FreeHistoryRegisters, [OperationContribution]);\n bind(FreeHistoryConfig).toSelf().inSingletonScope();\n bind(FreeHistoryManager).toSelf().inSingletonScope();\n bind(HistoryEntityManager).toSelf().inSingletonScope();\n bind(DragNodesHandler).toSelf().inSingletonScope();\n bind(ChangeNodeDataHandler).toSelf().inSingletonScope();\n bind(ChangeContentHandler).toSelf().inSingletonScope();\n },\n onInit(ctx, opts): void {\n ctx.get<FreeHistoryConfig>(FreeHistoryConfig).init(ctx, opts);\n\n if (!opts.enable) {\n return;\n }\n ctx.get<FreeHistoryManager>(FreeHistoryManager).onInit(ctx, opts);\n },\n onDispose(ctx) {\n ctx.get<HistoryEntityManager>(HistoryEntityManager).dispose();\n },\n containerModules: [HistoryContainerModule],\n});\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/* eslint-disable @typescript-eslint/naming-convention */\nimport { cloneDeep, isEqual } from 'lodash';\nimport { injectable } from 'inversify';\nimport { type EntityData } from '@flowgram.ai/core';\nimport { type Disposable, DisposableCollection } from '@flowgram.ai/utils';\n\n@injectable()\nexport class HistoryEntityManager implements Disposable {\n private _entityDataValues: Map<EntityData, unknown> = new Map();\n\n private _toDispose: DisposableCollection = new DisposableCollection();\n\n addEntityData(entityData: EntityData) {\n this._entityDataValues.set(entityData, cloneDeep(entityData.toJSON()));\n this._toDispose.push(\n entityData.onWillChange(event => {\n const value = event.toJSON();\n const oldValue = this._entityDataValues.get(entityData);\n if (isEqual(value, oldValue)) {\n return;\n }\n this._entityDataValues.set(entityData, cloneDeep(value));\n }),\n );\n }\n\n getValue(entityData: EntityData) {\n return this._entityDataValues.get(entityData);\n }\n\n setValue(entityData: EntityData, value: unknown) {\n return this._entityDataValues.set(entityData, value);\n }\n\n dispose() {\n this._entityDataValues.clear();\n this._toDispose.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/* eslint-disable @typescript-eslint/naming-convention */\nimport { injectable, inject } from 'inversify';\nimport { HistoryService } from '@flowgram.ai/history';\nimport { type NodesDragEndEvent } from '@flowgram.ai/free-layout-core';\nimport { TransformData } from '@flowgram.ai/core';\n\nimport { FreeOperationType, type IHandler } from '../types';\n\n@injectable()\nexport class DragNodesHandler implements IHandler<NodesDragEndEvent> {\n @inject(HistoryService)\n private _historyService: HistoryService;\n\n handle(event: NodesDragEndEvent) {\n if (event.type === 'onDragEnd') {\n this._dragNode(event);\n }\n }\n\n private _dragNode(event: NodesDragEndEvent) {\n this._historyService.pushOperation(\n {\n type: FreeOperationType.dragNodes,\n value: {\n ids: event.nodes.map((node) => node.id),\n value: event.nodes.map((node) => {\n const { x, y } = node.getData(TransformData).position;\n return {\n x,\n y,\n };\n }),\n oldValue: event.startPositions,\n },\n },\n { noApply: true }\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/* eslint-disable @typescript-eslint/naming-convention */\nimport { type IPoint } from '@flowgram.ai/utils';\nimport { type Operation, type OperationMeta } from '@flowgram.ai/history';\nimport {\n type WorkflowContentChangeType,\n type WorkflowContentChangeEvent,\n type WorkflowLineEntity,\n type WorkflowLinePortInfo,\n type WorkflowNodeJSON,\n type PositionMap,\n} from '@flowgram.ai/free-layout-core';\nimport { type FlowNodeEntity, type FlowNodeJSON } from '@flowgram.ai/document';\nimport { type EntityData, type PluginContext } from '@flowgram.ai/core';\n\nexport enum FreeOperationType {\n addLine = 'addLine',\n deleteLine = 'deleteLine',\n moveNode = 'moveNode',\n addNode = 'addNode',\n deleteNode = 'deleteNode',\n changeNodeData = 'changeNodeData',\n resetLayout = 'resetLayout',\n dragNodes = 'dragNodes',\n moveChildNodes = 'moveChildNodes',\n}\n\nexport interface AddOrDeleteLineOperationValue extends WorkflowLinePortInfo {\n id: string;\n}\n\nexport interface AddOrDeleteWorkflowNodeOperationValue {\n node: WorkflowNodeJSON;\n parentID?: string;\n}\n\nexport interface AddLineOperation extends Operation {\n type: FreeOperationType.addLine;\n value: AddOrDeleteLineOperationValue;\n}\n\nexport interface DeleteLineOperation extends Operation {\n type: FreeOperationType.deleteLine;\n value: AddOrDeleteLineOperationValue;\n}\n\nexport interface MoveNodeOperation extends Operation {\n type: FreeOperationType.moveNode;\n value: MoveNodeOperationValue;\n}\n\nexport interface AddWorkflowNodeOperation extends Operation {\n type: FreeOperationType.addNode;\n value: AddOrDeleteWorkflowNodeOperationValue;\n}\n\nexport interface DeleteWorkflowNodeOperation extends Operation {\n type: FreeOperationType.deleteNode;\n value: AddOrDeleteWorkflowNodeOperationValue;\n}\n\nexport interface MoveNodeOperationValue {\n id: string;\n value: {\n x: number;\n y: number;\n };\n oldValue: {\n x: number;\n y: number;\n };\n}\n\nexport interface DragNodeOperationValue {\n ids: string[];\n value: IPoint[];\n oldValue: IPoint[];\n}\n\nexport interface ResetLayoutOperationValue {\n ids: string[];\n value: PositionMap;\n oldValue: PositionMap;\n}\n\nexport interface ContentChangeTypeToOperation<T extends Operation> {\n type: WorkflowContentChangeType;\n toOperation: (event: WorkflowContentChangeEvent, ctx: PluginContext) => T | undefined;\n}\n\nexport interface EntityDataType {\n type: FreeOperationType;\n toEntityData: (node: FlowNodeEntity, ctx: PluginContext) => EntityData;\n}\n\nexport interface ChangeNodeDataValue {\n id: string;\n value: unknown;\n oldValue: unknown;\n path: string;\n}\n\nexport interface ChangeNodeDataOperation extends Operation {\n type: FreeOperationType.changeNodeData;\n value: ChangeNodeDataValue;\n}\n\n/**\n * 将node转成json\n */\nexport type NodeToJson = (node: FlowNodeEntity) => FlowNodeJSON;\n/**\n * 将line转成json\n */\nexport type LineToJson = (node: WorkflowLineEntity) => FlowNodeJSON;\n/**\n * 根据节点id获取label\n */\nexport type GetNodeLabelById = (id: string) => string;\n/**\n * 根据节点获取label\n */\nexport type GetNodeLabel = (node: FlowNodeJSON) => string;\n/**\n * 根据分支获取label\n */\nexport type GetBlockLabel = (node: FlowNodeJSON) => string;\n/**\n * 根据节点获取URI\n */\nexport type GetNodeURI = (id: string) => string | any;\n/**\n * 根据连线获取URI\n */\nexport type GetLineURI = (id: string) => string | any;\n\n/**\n * 插件配置\n */\nexport interface FreeHistoryPluginOptions {\n enable?: boolean;\n limit?: number;\n nodeToJSON?: (ctx: PluginContext) => NodeToJson;\n getNodeLabelById?: (ctx: PluginContext) => GetNodeLabelById;\n getNodeLabel?: (ctx: PluginContext) => GetNodeLabel;\n getBlockLabel?: (ctx: PluginContext) => GetBlockLabel;\n getNodeURI?: (ctx: PluginContext) => GetNodeURI;\n getLineURI?: (ctx: PluginContext) => GetLineURI;\n operationMetas?: OperationMeta[];\n enableChangeNode?: boolean;\n uri?: string | any;\n}\n\nexport interface IHandler<E> {\n handle: (event: E, ctx: PluginContext) => void | Promise<void>;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/* eslint-disable @typescript-eslint/naming-convention */\nimport { cloneDeep, get, isEqual, set } from 'lodash';\nimport { injectable, inject } from 'inversify';\nimport { FlowNodeFormData, type DetailChangeEvent } from '@flowgram.ai/form-core';\nimport { type FlowNodeEntity } from '@flowgram.ai/document';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { HistoryService } from '@flowgram.ai/history';\n\nimport { FreeOperationType, type IHandler } from '../types';\nimport { HistoryEntityManager } from '../history-entity-manager';\nimport { FreeHistoryConfig } from '../free-history-config';\n\nexport interface ChangeNodeDataEvent extends DetailChangeEvent {\n node: FlowNodeEntity;\n}\n\n@injectable()\nexport class ChangeNodeDataHandler implements IHandler<ChangeNodeDataEvent> {\n @inject(HistoryService)\n private _historyService: HistoryService;\n\n @inject(WorkflowDocument) document: WorkflowDocument;\n\n @inject(HistoryEntityManager)\n private _entityManager: HistoryEntityManager;\n\n @inject(FreeHistoryConfig)\n private _config: FreeHistoryConfig;\n\n handle(event: ChangeNodeDataEvent) {\n const { path, value, initialized, node } = event;\n const formData = node.getData<FlowNodeFormData>(FlowNodeFormData);\n const oldValue = this._entityManager.getValue(formData) as object;\n const propPath = path.split('/').filter(Boolean).join('.');\n\n const propOldValue = propPath ? get(oldValue, propPath) : oldValue;\n if (isEqual(value, propOldValue)) {\n return;\n }\n\n if (initialized) {\n let operationPath = path;\n let operationValue = cloneDeep(value);\n let operationOldValue = propOldValue;\n // 只存储一层的数据,因为formModel无法获取数组下的某项的值\n if (path !== '/') {\n const clonedOldValue = cloneDeep(oldValue);\n set(clonedOldValue, propPath, value);\n operationPath = path.split('/').filter(Boolean)[0];\n operationValue = get(clonedOldValue, operationPath);\n operationOldValue = get(oldValue, operationPath);\n }\n\n this._historyService.pushOperation(\n {\n type: FreeOperationType.changeNodeData,\n value: {\n id: node.id,\n path: operationPath,\n value: operationValue,\n oldValue: operationOldValue,\n },\n uri: this._config.getNodeURI(node.id),\n },\n { noApply: true },\n );\n }\n\n if (propPath) {\n set(oldValue, propPath, cloneDeep(value));\n } else {\n this._entityManager.setValue(formData, cloneDeep(value));\n }\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable } from 'inversify';\nimport { type FlowNodeEntity, type FlowNodeJSON } from '@flowgram.ai/document';\nimport { type PluginContext } from '@flowgram.ai/core';\n\nimport {\n type FreeHistoryPluginOptions,\n type GetBlockLabel,\n type GetLineURI,\n type GetNodeLabel,\n type GetNodeLabelById,\n type GetNodeURI,\n type NodeToJson,\n} from './types';\n\n@injectable()\nexport class FreeHistoryConfig {\n init(ctx: PluginContext, options: FreeHistoryPluginOptions) {\n this.enable = !!options?.enable;\n\n if (options.nodeToJSON) {\n this.nodeToJSON = options.nodeToJSON(ctx);\n }\n\n if (options.getNodeLabelById) {\n this.getNodeLabelById = options.getNodeLabelById(ctx);\n }\n\n if (options.getNodeLabel) {\n this.getNodeLabel = options.getNodeLabel(ctx);\n }\n\n if (options.getBlockLabel) {\n this.getBlockLabel = options.getBlockLabel(ctx);\n }\n\n if (options.getNodeURI) {\n this.getNodeURI = options.getNodeURI(ctx);\n }\n\n if (options.getLineURI) {\n this.getLineURI = options.getLineURI(ctx);\n }\n }\n\n enable = false;\n\n nodeToJSON: NodeToJson = (node: FlowNodeEntity) => node.toJSON();\n\n getNodeLabelById: GetNodeLabelById = (id: string) => id;\n\n getNodeLabel: GetNodeLabel = (node: FlowNodeJSON) => node.id;\n\n getBlockLabel: GetBlockLabel = (node: FlowNodeJSON) => node.id;\n\n getNodeURI: GetNodeURI = (id: string) => `node:${id}`;\n\n getLineURI: GetLineURI = (id: string) => `line:${id}`;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/* eslint-disable @typescript-eslint/naming-convention */\nimport { injectable, inject } from 'inversify';\nimport { HistoryService, Operation } from '@flowgram.ai/history';\nimport { type WorkflowContentChangeEvent } from '@flowgram.ai/free-layout-core';\nimport { type PluginContext } from '@flowgram.ai/core';\n\nimport { type IHandler } from '../types';\nimport changes from '../changes';\n\n@injectable()\nexport class ChangeContentHandler implements IHandler<WorkflowContentChangeEvent> {\n @inject(HistoryService)\n private _historyService: HistoryService;\n\n handle(event: WorkflowContentChangeEvent, ctx: PluginContext) {\n if (!this._historyService.undoRedoService.canPush()) {\n return;\n }\n\n const change = changes.find((c) => c.type === event.type);\n if (!change) {\n return;\n }\n const operation: Operation | undefined = change.toOperation(event, ctx);\n if (!operation) {\n return;\n }\n\n this._historyService.pushOperation(operation, { noApply: true });\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { WorkflowContentChangeType } from '@flowgram.ai/free-layout-core';\nimport { type FlowNodeEntity } from '@flowgram.ai/document';\n\nimport {\n type ContentChangeTypeToOperation,\n FreeOperationType,\n type DeleteWorkflowNodeOperation,\n} from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\n\nexport const deleteNodeChange: ContentChangeTypeToOperation<DeleteWorkflowNodeOperation> = {\n type: WorkflowContentChangeType.DELETE_NODE,\n toOperation: (event, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const node = event.entity as FlowNodeEntity;\n const json = event.toJSON();\n const parentID = node.parent?.id;\n\n return {\n type: FreeOperationType.deleteNode,\n value: {\n node: json,\n parentID,\n },\n uri: config.getNodeURI(node.id),\n };\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type WorkflowLineEntity } from '@flowgram.ai/free-layout-core';\nimport { WorkflowContentChangeType } from '@flowgram.ai/free-layout-core';\n\nimport {\n type AddOrDeleteLineOperationValue,\n type ContentChangeTypeToOperation,\n type DeleteLineOperation,\n FreeOperationType,\n} from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\n\nexport const deleteLineChange: ContentChangeTypeToOperation<DeleteLineOperation> = {\n type: WorkflowContentChangeType.DELETE_LINE,\n toOperation: (event, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const line = event.entity as WorkflowLineEntity;\n const value: AddOrDeleteLineOperationValue = {\n from: line.info.from,\n to: line.info.to || '',\n fromPort: line.info.fromPort || '',\n toPort: line.info.toPort || '',\n id: line.id,\n };\n return {\n type: FreeOperationType.deleteLine,\n value,\n uri: config.getNodeURI(line.id),\n };\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { WorkflowDocument, type WorkflowNodeJSON } from '@flowgram.ai/free-layout-core';\nimport { WorkflowContentChangeType } from '@flowgram.ai/free-layout-core';\nimport { type FlowNodeEntity } from '@flowgram.ai/document';\n\nimport {\n type AddWorkflowNodeOperation,\n type ContentChangeTypeToOperation,\n FreeOperationType,\n} from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\n\nexport const addNodeChange: ContentChangeTypeToOperation<AddWorkflowNodeOperation> = {\n type: WorkflowContentChangeType.ADD_NODE,\n toOperation: (event, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n const node = event.entity as FlowNodeEntity;\n const parentID = node.parent?.id;\n const json: WorkflowNodeJSON = document.toNodeJSON(node);\n\n return {\n type: FreeOperationType.addNode,\n value: {\n node: json,\n parentID,\n },\n uri: config.getNodeURI(node.id),\n };\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type WorkflowLineEntity } from '@flowgram.ai/free-layout-core';\nimport { WorkflowContentChangeType } from '@flowgram.ai/free-layout-core';\n\nimport {\n type AddLineOperation,\n type AddOrDeleteLineOperationValue,\n type ContentChangeTypeToOperation,\n FreeOperationType,\n} from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\n\nexport const addLineChange: ContentChangeTypeToOperation<AddLineOperation> = {\n type: WorkflowContentChangeType.ADD_LINE,\n toOperation: (event, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const line = event.entity as WorkflowLineEntity;\n const value: AddOrDeleteLineOperationValue = {\n from: line.info.from,\n to: line.info.to || '',\n fromPort: line.info.fromPort || '',\n toPort: line.info.toPort || '',\n id: line.id,\n };\n return {\n type: FreeOperationType.addLine,\n value,\n uri: config.getLineURI(line.id),\n };\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { deleteNodeChange } from './delete-node-change';\nimport { deleteLineChange } from './delete-line-change';\nimport { addNodeChange } from './add-node-change';\nimport { addLineChange } from './add-line-change';\n\nexport default [addLineChange, deleteLineChange, addNodeChange, deleteNodeChange];\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable } from 'inversify';\nimport { type OperationContribution, type OperationRegistry } from '@flowgram.ai/history';\n\nimport { operationMetas } from './operation-metas';\n\n@injectable()\nexport class FreeHistoryRegisters implements OperationContribution {\n registerOperationMeta(operationRegistry: OperationRegistry): void {\n operationMetas.forEach(operationMeta => {\n operationRegistry.registerOperationMeta(operationMeta);\n });\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type PluginContext } from '@flowgram.ai/core';\nimport { WorkflowResetLayoutService } from '@flowgram.ai/free-layout-core';\nimport { type OperationMeta } from '@flowgram.ai/history';\n\nimport { FreeOperationType, type ResetLayoutOperationValue } from '../types';\nimport { baseOperationMeta } from './base';\n\nexport const resetLayoutOperationMeta: OperationMeta<\n ResetLayoutOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: FreeOperationType.resetLayout,\n inverse: op => ({\n ...op,\n value: {\n ...op.value,\n value: op.value.oldValue,\n oldValue: op.value.value,\n },\n }),\n apply: async (operation, ctx: PluginContext) => {\n const reset = ctx.get<WorkflowResetLayoutService>(WorkflowResetLayoutService);\n await reset.layoutToPositions(operation.value.ids, operation.value.value);\n },\n shouldMerge: () => false,\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type OperationMeta } from '@flowgram.ai/history';\n\nexport const baseOperationMeta: Partial<OperationMeta> = {\n shouldMerge: (_op, prev, element) => {\n if (!prev) {\n return false;\n }\n\n if (\n // 合并500ms内的操作, 如删除节点会联动删除线条\n Date.now() - element.getTimestamp() <\n 500\n ) {\n return true;\n }\n return false;\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { OperationMeta } from '@flowgram.ai/history';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { MoveChildNodesOperationValue, OperationType } from '@flowgram.ai/document';\nimport { FlowNodeBaseType } from '@flowgram.ai/document';\nimport { PluginContext, TransformData } from '@flowgram.ai/core';\n\nimport { baseOperationMeta } from './base';\n\nexport const moveChildNodesOperationMeta: OperationMeta<\n MoveChildNodesOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: OperationType.moveChildNodes,\n inverse: (op) => ({\n ...op,\n value: {\n ...op.value,\n fromIndex: op.value.toIndex,\n toIndex: op.value.fromIndex,\n fromParentId: op.value.toParentId,\n toParentId: op.value.fromParentId,\n },\n }),\n apply: (operation, ctx: PluginContext) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n document.moveChildNodes(operation.value);\n const fromContainer = document.getNode(operation.value.fromParentId);\n requestAnimationFrame(() => {\n if (fromContainer && fromContainer.flowNodeType !== FlowNodeBaseType.ROOT) {\n const fromContainerTransformData = fromContainer.getData(TransformData);\n fromContainerTransformData.fireChange();\n }\n });\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type OperationMeta } from '@flowgram.ai/history';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { type PluginContext, TransformData } from '@flowgram.ai/core';\n\nimport { type DragNodeOperationValue, FreeOperationType } from '../types';\nimport { baseOperationMeta } from './base';\n\nexport const dragNodesOperationMeta: OperationMeta<DragNodeOperationValue, PluginContext, void> = {\n ...baseOperationMeta,\n type: FreeOperationType.dragNodes,\n inverse: (op) => ({\n ...op,\n value: {\n ...op.value,\n value: op.value.oldValue,\n oldValue: op.value.value,\n },\n }),\n apply: (operation, ctx) => {\n operation.value.ids.forEach((id, index) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n const node = document.getNode(id);\n if (!node) {\n return;\n }\n\n const transform = node.getData(TransformData);\n const point = operation.value.value[index];\n transform.update({\n position: {\n x: point.x,\n y: point.y,\n },\n });\n document.layout.updateAffectedTransform(node);\n });\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type PluginContext } from '@flowgram.ai/core';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { type OperationMeta } from '@flowgram.ai/history';\n\nimport { type AddOrDeleteWorkflowNodeOperationValue, FreeOperationType } from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\nimport { baseOperationMeta } from './base';\n\nexport const deleteNodeOperationMeta: OperationMeta<\n AddOrDeleteWorkflowNodeOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: FreeOperationType.deleteNode,\n inverse: op => ({\n ...op,\n type: FreeOperationType.addNode,\n }),\n apply: (operation, ctx: PluginContext) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n const node = document.getNode(operation.value.node.id);\n if (node) {\n node.dispose();\n }\n },\n getLabel: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n return `Delete Node ${config.getNodeLabel(op.value.node)}`;\n },\n getDescription: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n let desc = `Delete Node ${config.getNodeLabel(op.value.node)}`;\n if (op.value.node.meta?.position) {\n desc += ` at ${op.value.node.meta.position.x},${op.value.node.meta.position.y}`;\n }\n return desc;\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type OperationMeta } from '@flowgram.ai/history';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { type PluginContext } from '@flowgram.ai/core';\n\nimport { type AddOrDeleteLineOperationValue, FreeOperationType } from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\nimport { baseOperationMeta } from './base';\n\nexport const deleteLineOperationMeta: OperationMeta<\n AddOrDeleteLineOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: FreeOperationType.deleteLine,\n inverse: (op) => ({\n ...op,\n type: FreeOperationType.addLine,\n }),\n apply: (operation, ctx: PluginContext) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n document.removeNode(operation.value.id);\n },\n getLabel: (op, ctx) => 'Delete Line',\n getDescription: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const { value } = op;\n if (!value.from || !value.to) {\n return 'Delete Line';\n }\n\n const fromName = config.getNodeLabelById(value.from);\n const toName = config.getNodeLabelById(value.to);\n return `Delete Line from ${fromName} to ${toName}`;\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { FlowNodeFormData } from '@flowgram.ai/form-core';\nimport { type PluginContext } from '@flowgram.ai/core';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { type OperationMeta } from '@flowgram.ai/history';\n\nimport { FreeOperationType, type ChangeNodeDataValue } from '../types';\nimport { baseOperationMeta } from './base';\n\nexport const changeNodeDataOperationMeta: OperationMeta<ChangeNodeDataValue, PluginContext, void> =\n {\n ...baseOperationMeta,\n type: FreeOperationType.changeNodeData,\n inverse: op => ({\n ...op,\n value: {\n ...op.value,\n value: op.value.oldValue,\n oldValue: op.value.value,\n },\n }),\n apply: (operation, ctx: PluginContext) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n const node = document.getNode(operation.value.id);\n\n if (!node) {\n return;\n }\n const formData = node.getData(FlowNodeFormData);\n\n if (!formData) {\n return;\n }\n\n let { path } = operation.value;\n if (path.endsWith('/') && path !== '/') {\n path = path.slice(0, -1);\n }\n\n if (!path.startsWith('/')) {\n path = `/${path}`;\n }\n\n const formItem = formData.formModel.getFormItemByPath(path);\n\n if (!formItem) {\n return;\n }\n formItem.value = operation.value.value;\n },\n shouldMerge: (op, prev, element) => {\n if (!prev) {\n return false;\n }\n\n if (Date.now() - element.getTimestamp() < 500) {\n if (\n op.type === prev.type && // 相同类型\n op.value.id === prev.value.id && // 相同节点\n op.value?.path === prev.value?.path // 相同路径\n ) {\n return {\n type: op.type,\n value: {\n ...op.value,\n value: op.value.value,\n oldValue: prev.value.oldValue,\n },\n };\n }\n return true;\n }\n return false;\n },\n };\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { cloneDeep } from 'lodash';\nimport { type PluginContext } from '@flowgram.ai/core';\nimport { WorkflowDocument, type WorkflowNodeJSON } from '@flowgram.ai/free-layout-core';\nimport { type OperationMeta } from '@flowgram.ai/history';\n\nimport { type AddOrDeleteWorkflowNodeOperationValue, FreeOperationType } from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\nimport { baseOperationMeta } from './base';\n\nexport const addNodeOperationMeta: OperationMeta<\n AddOrDeleteWorkflowNodeOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: FreeOperationType.addNode,\n inverse: op => ({\n ...op,\n type: FreeOperationType.deleteNode,\n }),\n apply: async (operation, ctx: PluginContext) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n await document.createWorkflowNode(\n cloneDeep(operation.value.node) as WorkflowNodeJSON,\n false,\n operation.value.parentID,\n );\n },\n getLabel: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n return `Create Node ${config.getNodeLabel(op.value.node)}`;\n },\n getDescription: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n let desc = `Create Node ${config.getNodeLabel(op.value.node)}`;\n if (op.value.node.meta?.position) {\n desc += ` at ${op.value.node.meta.position.x},${op.value.node.meta.position.y}`;\n }\n return desc;\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type PluginContext } from '@flowgram.ai/core';\nimport { WorkflowLinesManager } from '@flowgram.ai/free-layout-core';\nimport { type OperationMeta } from '@flowgram.ai/history';\n\nimport { type AddOrDeleteLineOperationValue, FreeOperationType } from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\nimport { baseOperationMeta } from './base';\n\nexport const addLineOperationMeta: OperationMeta<\n AddOrDeleteLineOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: FreeOperationType.addLine,\n inverse: op => ({\n ...op,\n type: FreeOperationType.deleteLine,\n }),\n apply: (operation, ctx: PluginContext) => {\n const linesManager = ctx.get<WorkflowLinesManager>(WorkflowLinesManager);\n linesManager.createLine({\n ...operation.value,\n key: operation.value.id,\n });\n },\n getLabel: (op, ctx) => 'Create Line',\n getDescription: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const { value } = op;\n if (!value.from || !value.to) {\n return 'Create Line';\n }\n\n const fromName = config.getNodeLabelById(value.from);\n const toName = config.getNodeLabelById(value.to);\n return `Create Line from ${fromName} to ${toName}`;\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { resetLayoutOperationMeta } from './reset-layout';\nimport { moveChildNodesOperationMeta } from './move-child-nodes';\nimport { dragNodesOperationMeta } from './drag-nodes';\nimport { deleteNodeOperationMeta } from './delete-node';\nimport { deleteLineOperationMeta } from './delete-line';\nimport { changeNodeDataOperationMeta } from './change-node-data';\nimport { addNodeOperationMeta } from './add-node';\nimport { addLineOperationMeta } from './add-line';\n\nexport const operationMetas = [\n addLineOperationMeta,\n deleteLineOperationMeta,\n addNodeOperationMeta,\n deleteNodeOperationMeta,\n changeNodeDataOperationMeta,\n resetLayoutOperationMeta,\n dragNodesOperationMeta,\n moveChildNodesOperationMeta,\n];\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/* eslint-disable @typescript-eslint/naming-convention */\nimport { cloneDeep } from 'lodash';\nimport { injectable, inject, optional } from 'inversify';\nimport { DisposableCollection, Disposable } from '@flowgram.ai/utils';\nimport { HistoryService } from '@flowgram.ai/history';\nimport {\n WorkflowDocument,\n WorkflowResetLayoutService,\n WorkflowDragService,\n WorkflowOperationBaseService,\n} from '@flowgram.ai/free-layout-core';\nimport { FlowNodeFormData } from '@flowgram.ai/form-core';\nimport { FormManager } from '@flowgram.ai/form-core';\nimport { OperationType } from '@flowgram.ai/document';\nimport { type PluginContext, PositionData } from '@flowgram.ai/core';\n\nimport { DragNodeOperationValue, type FreeHistoryPluginOptions, FreeOperationType } from './types';\nimport { HistoryEntityManager } from './history-entity-manager';\nimport { DragNodesHandler } from './handlers/drag-nodes-handler';\nimport { ChangeNodeDataHandler } from './handlers/change-node-data-handler';\nimport { ChangeContentHandler } from './handlers/change-content-handler';\n\n/**\n * 历史管理\n */\n@injectable()\nexport class FreeHistoryManager {\n @inject(DragNodesHandler)\n private _dragNodesHandler: DragNodesHandler;\n\n @inject(ChangeNodeDataHandler)\n private _changeNodeDataHandler: ChangeNodeDataHandler;\n\n @inject(ChangeContentHandler)\n private _changeContentHandler: ChangeContentHandler;\n\n @inject(HistoryEntityManager)\n private _entityManager: HistoryEntityManager;\n\n @inject(FormManager)\n @optional()\n private _formManager?: FormManager;\n\n private _toDispose: DisposableCollection = new DisposableCollection();\n\n @inject(WorkflowOperationBaseService)\n private _operationService: WorkflowOperationBaseService;\n\n onInit(ctx: PluginContext, opts: FreeHistoryPluginOptions) {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n const historyService = ctx.get<HistoryService>(HistoryService);\n const dragService = ctx.get<WorkflowDragService>(WorkflowDragService);\n\n const resetLayoutService = ctx.get<WorkflowResetLayoutService>(WorkflowResetLayoutService);\n\n if (opts?.limit) {\n historyService.limit(opts.limit);\n }\n historyService.context.source = ctx;\n\n this._toDispose.pushAll([\n dragService.onNodesDrag(async (event) => {\n if (event.type !== 'onDragEnd') {\n return;\n }\n this._dragNodesHandler.handle(event);\n }),\n document.onNodeCreate(({ node, data }) => {\n const positionData = node.getData(PositionData);\n if (positionData) {\n this._entityManager.addEntityData(positionData);\n }\n }),\n this._formManager\n ? this._formManager.onFormModelWillInit(({ model, data }) => {\n const node = model.flowNodeEntity;\n const formData = node.getData<FlowNodeFormData>(FlowNodeFormData);\n\n if (formData) {\n this._entityManager.setValue(formData, cloneDeep(data));\n\n this._toDispose.push(\n formData.onDetailChange((event) => {\n this._changeNodeDataHandler.handle({\n ...event,\n node,\n });\n })\n );\n }\n })\n : Disposable.NULL,\n document.onContentChange((event) => {\n this._changeContentHandler.handle(event, ctx);\n }),\n document.onReload((_event) => {\n historyService.clear();\n }),\n resetLayoutService.onResetLayout((event) => {\n historyService.pushOperation(\n {\n type: FreeOperationType.resetLayout,\n value: {\n ids: event.nodeIds,\n value: event.positionMap,\n oldValue: event.oldPositionMap,\n },\n },\n { noApply: true }\n );\n }),\n this._operationService.onNodeMove(({ node, fromParent, fromIndex, toParent, toIndex }) => {\n historyService.pushOperation(\n {\n type: OperationType.moveChildNodes,\n value: {\n fromParentId: fromParent.id,\n fromIndex,\n nodeIds: [node.id],\n toParentId: toParent.id,\n toIndex,\n },\n },\n {\n noApply: true,\n }\n );\n }),\n this._operationService.onNodePostionUpdate((event) => {\n const value: DragNodeOperationValue = {\n ids: [event.node.id],\n value: [event.newPosition],\n oldValue: [event.oldPosition],\n };\n historyService.pushOperation(\n {\n type: FreeOperationType.dragNodes,\n value,\n },\n {\n noApply: true,\n }\n );\n }),\n ]);\n }\n\n dispose() {\n this._entityManager.dispose();\n this._toDispose.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport * from './create-free-history-plugin';\nexport * from './types';\nexport * from '@flowgram.ai/history';\nexport * from './free-history-config';\nexport * from './hooks';\nexport * from './free-history-registers';\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useEffect, useState } from 'react';\n\nimport { useService } from '@flowgram.ai/core';\nimport { HistoryService } from '@flowgram.ai/history';\n\ninterface UndoRedo {\n canUndo: boolean;\n canRedo: boolean;\n undo: () => Promise<void>;\n redo: () => Promise<void>;\n}\n\nexport function useUndoRedo(): UndoRedo {\n const historyService = useService<HistoryService>(HistoryService);\n const [canUndo, setCanUndo] = useState(false);\n const [canRedo, setCanRedo] = useState(false);\n\n useEffect(() => {\n const toDispose = historyService.undoRedoService.onChange(() => {\n setCanUndo(historyService.canUndo());\n setCanRedo(historyService.canRedo());\n });\n return () => {\n toDispose.dispose();\n };\n }, []);\n\n return {\n canUndo,\n canRedo,\n undo: () => historyService.undo(),\n redo: () => historyService.redo(),\n };\n}\n"],"mappings":";;;;;;;;;;;;AAKA,SAAS,mBAAmB,2BAA2B;AACvD,SAAS,wBAAwB,6BAA6B;;;ACA9D,SAAS,WAAW,eAAe;AACnC,SAAS,kBAAkB;AAE3B,SAA0B,4BAA4B;AAG/C,IAAM,uBAAN,MAAiD;AAAA,EAAjD;AACL,SAAQ,oBAA8C,oBAAI,IAAI;AAE9D,SAAQ,aAAmC,IAAI,qBAAqB;AAAA;AAAA,EAEpE,cAAc,YAAwB;AACpC,SAAK,kBAAkB,IAAI,YAAY,UAAU,WAAW,OAAO,CAAC,CAAC;AACrE,SAAK,WAAW;AAAA,MACd,WAAW,aAAa,WAAS;AAC/B,cAAM,QAAQ,MAAM,OAAO;AAC3B,cAAM,WAAW,KAAK,kBAAkB,IAAI,UAAU;AACtD,YAAI,QAAQ,OAAO,QAAQ,GAAG;AAC5B;AAAA,QACF;AACA,aAAK,kBAAkB,IAAI,YAAY,UAAU,KAAK,CAAC;AAAA,MACzD,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,SAAS,YAAwB;AAC/B,WAAO,KAAK,kBAAkB,IAAI,UAAU;AAAA,EAC9C;AAAA,EAEA,SAAS,YAAwB,OAAgB;AAC/C,WAAO,KAAK,kBAAkB,IAAI,YAAY,KAAK;AAAA,EACrD;AAAA,EAEA,UAAU;AACR,SAAK,kBAAkB,MAAM;AAC7B,SAAK,WAAW,QAAQ;AAAA,EAC1B;AACF;AA/Ba,uBAAN;AAAA,EADN,WAAW;AAAA,GACC;;;ACNb,SAAS,cAAAA,aAAY,cAAc;AACnC,SAAS,sBAAsB;AAE/B,SAAS,qBAAqB;;;ACUvB,IAAK,oBAAL,kBAAKC,uBAAL;AACL,EAAAA,mBAAA,aAAU;AACV,EAAAA,mBAAA,gBAAa;AACb,EAAAA,mBAAA,cAAW;AACX,EAAAA,mBAAA,aAAU;AACV,EAAAA,mBAAA,gBAAa;AACb,EAAAA,mBAAA,oBAAiB;AACjB,EAAAA,mBAAA,iBAAc;AACd,EAAAA,mBAAA,eAAY;AACZ,EAAAA,mBAAA,oBAAiB;AATP,SAAAA;AAAA,GAAA;;;ADLL,IAAM,mBAAN,MAA8D;AAAA,EAInE,OAAO,OAA0B;AAC/B,QAAI,MAAM,SAAS,aAAa;AAC9B,WAAK,UAAU,KAAK;AAAA,IACtB;AAAA,EACF;AAAA,EAEQ,UAAU,OAA0B;AAC1C,SAAK,gBAAgB;AAAA,MACnB;AAAA,QACE;AAAA,QACA,OAAO;AAAA,UACL,KAAK,MAAM,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE;AAAA,UACtC,OAAO,MAAM,MAAM,IAAI,CAAC,SAAS;AAC/B,kBAAM,EAAE,GAAG,EAAE,IAAI,KAAK,QAAQ,aAAa,EAAE;AAC7C,mBAAO;AAAA,cACL;AAAA,cACA;AAAA,YACF;AAAA,UACF,CAAC;AAAA,UACD,UAAU,MAAM;AAAA,QAClB;AAAA,MACF;AAAA,MACA,EAAE,SAAS,KAAK;AAAA,IAClB;AAAA,EACF;AACF;AA3BU;AAAA,EADP,OAAO,cAAc;AAAA,GADX,iBAEH;AAFG,mBAAN;AAAA,EADNC,YAAW;AAAA,GACC;;;AERb,SAAS,aAAAC,YAAW,KAAK,WAAAC,UAAS,WAAW;AAC7C,SAAS,cAAAC,aAAY,UAAAC,eAAc;AACnC,SAAS,wBAAgD;AAEzD,SAAS,wBAAwB;AACjC,SAAS,kBAAAC,uBAAsB;;;ACN/B,SAAS,cAAAC,mBAAkB;AAepB,IAAM,oBAAN,MAAwB;AAAA,EAAxB;AA6BL,kBAAS;AAET,sBAAyB,CAAC,SAAyB,KAAK,OAAO;AAE/D,4BAAqC,CAAC,OAAe;AAErD,wBAA6B,CAAC,SAAuB,KAAK;AAE1D,yBAA+B,CAAC,SAAuB,KAAK;AAE5D,sBAAyB,CAAC,OAAe,QAAQ,EAAE;AAEnD,sBAAyB,CAAC,OAAe,QAAQ,EAAE;AAAA;AAAA,EAxCnD,KAAK,KAAoB,SAAmC;AAC1D,SAAK,SAAS,CAAC,CAAC,SAAS;AAEzB,QAAI,QAAQ,YAAY;AACtB,WAAK,aAAa,QAAQ,WAAW,GAAG;AAAA,IAC1C;AAEA,QAAI,QAAQ,kBAAkB;AAC5B,WAAK,mBAAmB,QAAQ,iBAAiB,GAAG;AAAA,IACtD;AAEA,QAAI,QAAQ,cAAc;AACxB,WAAK,eAAe,QAAQ,aAAa,GAAG;AAAA,IAC9C;AAEA,QAAI,QAAQ,eAAe;AACzB,WAAK,gBAAgB,QAAQ,cAAc,GAAG;AAAA,IAChD;AAEA,QAAI,QAAQ,YAAY;AACtB,WAAK,aAAa,QAAQ,WAAW,GAAG;AAAA,IAC1C;AAEA,QAAI,QAAQ,YAAY;AACtB,WAAK,aAAa,QAAQ,WAAW,GAAG;AAAA,IAC1C;AAAA,EACF;AAeF;AA1Ca,oBAAN;AAAA,EADNC,YAAW;AAAA,GACC;;;ADEN,IAAM,wBAAN,MAAqE;AAAA,EAY1E,OAAO,OAA4B;AACjC,UAAM,EAAE,MAAM,OAAO,aAAa,KAAK,IAAI;AAC3C,UAAM,WAAW,KAAK,QAA0B,gBAAgB;AAChE,UAAM,WAAW,KAAK,eAAe,SAAS,QAAQ;AACtD,UAAM,WAAW,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAEzD,UAAM,eAAe,WAAW,IAAI,UAAU,QAAQ,IAAI;AAC1D,QAAIC,SAAQ,OAAO,YAAY,GAAG;AAChC;AAAA,IACF;AAEA,QAAI,aAAa;AACf,UAAI,gBAAgB;AACpB,UAAI,iBAAiBC,WAAU,KAAK;AACpC,UAAI,oBAAoB;AAExB,UAAI,SAAS,KAAK;AAChB,cAAM,iBAAiBA,WAAU,QAAQ;AACzC,YAAI,gBAAgB,UAAU,KAAK;AACnC,wBAAgB,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,CAAC;AACjD,yBAAiB,IAAI,gBAAgB,aAAa;AAClD,4BAAoB,IAAI,UAAU,aAAa;AAAA,MACjD;AAEA,WAAK,gBAAgB;AAAA,QACnB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,IAAI,KAAK;AAAA,YACT,MAAM;AAAA,YACN,OAAO;AAAA,YACP,UAAU;AAAA,UACZ;AAAA,UACA,KAAK,KAAK,QAAQ,WAAW,KAAK,EAAE;AAAA,QACtC;AAAA,QACA,EAAE,SAAS,KAAK;AAAA,MAClB;AAAA,IACF;AAEA,QAAI,UAAU;AACZ,UAAI,UAAU,UAAUA,WAAU,KAAK,CAAC;AAAA,IAC1C,OAAO;AACL,WAAK,eAAe,SAAS,UAAUA,WAAU,KAAK,CAAC;AAAA,IACzD;AAAA,EACF;AACF;AAvDU;AAAA,EADPC,QAAOC,eAAc;AAAA,GADX,sBAEH;AAEkB;AAAA,EAAzBD,QAAO,gBAAgB;AAAA,GAJb,sBAIe;AAGlB;AAAA,EADPA,QAAO,oBAAoB;AAAA,GANjB,sBAOH;AAGA;AAAA,EADPA,QAAO,iBAAiB;AAAA,GATd,sBAUH;AAVG,wBAAN;AAAA,EADNE,YAAW;AAAA,GACC;;;AEhBb,SAAS,cAAAC,aAAY,UAAAC,eAAc;AACnC,SAAS,kBAAAC,uBAAiC;;;ACF1C,SAAS,iCAAiC;AAUnC,IAAM,mBAA8E;AAAA,EACzF,MAAM,0BAA0B;AAAA,EAChC,aAAa,CAAC,OAAO,QAAQ;AAC3B,UAAM,SAAS,IAAI,IAAuB,iBAAiB;AAC3D,UAAM,OAAO,MAAM;AACnB,UAAM,OAAO,MAAM,OAAO;AAC1B,UAAM,WAAW,KAAK,QAAQ;AAE9B,WAAO;AAAA,MACL;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,MACF;AAAA,MACA,KAAK,OAAO,WAAW,KAAK,EAAE;AAAA,IAChC;AAAA,EACF;AACF;;;AC1BA,SAAS,6BAAAC,kCAAiC;AAUnC,IAAM,mBAAsE;AAAA,EACjF,MAAMC,2BAA0B;AAAA,EAChC,aAAa,CAAC,OAAO,QAAQ;AAC3B,UAAM,SAAS,IAAI,IAAuB,iBAAiB;AAC3D,UAAM,OAAO,MAAM;AACnB,UAAM,QAAuC;AAAA,MAC3C,MAAM,KAAK,KAAK;AAAA,MAChB,IAAI,KAAK,KAAK,MAAM;AAAA,MACpB,UAAU,KAAK,KAAK,YAAY;AAAA,MAChC,QAAQ,KAAK,KAAK,UAAU;AAAA,MAC5B,IAAI,KAAK;AAAA,IACX;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,KAAK,OAAO,WAAW,KAAK,EAAE;AAAA,IAChC;AAAA,EACF;AACF;;;AC7BA,SAAS,oBAAAC,yBAA+C;AACxD,SAAS,6BAAAC,kCAAiC;AAUnC,IAAM,gBAAwE;AAAA,EACnF,MAAMC,2BAA0B;AAAA,EAChC,aAAa,CAAC,OAAO,QAAQ;AAC3B,UAAM,SAAS,IAAI,IAAuB,iBAAiB;AAC3D,UAAM,WAAW,IAAI,IAAsBC,iBAAgB;AAC3D,UAAM,OAAO,MAAM;AACnB,UAAM,WAAW,KAAK,QAAQ;AAC9B,UAAM,OAAyB,SAAS,WAAW,IAAI;AAEvD,WAAO;AAAA,MACL;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,MACF;AAAA,MACA,KAAK,OAAO,WAAW,KAAK,EAAE;AAAA,IAChC;AAAA,EACF;AACF;;;AC5BA,SAAS,6BAAAC,kCAAiC;AAUnC,IAAM,gBAAgE;AAAA,EAC3E,MAAMC,2BAA0B;AAAA,EAChC,aAAa,CAAC,OAAO,QAAQ;AAC3B,UAAM,SAAS,IAAI,IAAuB,iBAAiB;AAC3D,UAAM,OAAO,MAAM;AACnB,UAAM,QAAuC;AAAA,MAC3C,MAAM,KAAK,KAAK;AAAA,MAChB,IAAI,KAAK,KAAK,MAAM;AAAA,MACpB,UAAU,KAAK,KAAK,YAAY;AAAA,MAChC,QAAQ,KAAK,KAAK,UAAU;AAAA,MAC5B,IAAI,KAAK;AAAA,IACX;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,KAAK,OAAO,WAAW,KAAK,EAAE;AAAA,IAChC;AAAA,EACF;AACF;;;ACxBA,IAAO,kBAAQ,CAAC,eAAe,kBAAkB,eAAe,gBAAgB;;;ALKzE,IAAM,uBAAN,MAA2E;AAAA,EAIhF,OAAO,OAAmC,KAAoB;AAC5D,QAAI,CAAC,KAAK,gBAAgB,gBAAgB,QAAQ,GAAG;AACnD;AAAA,IACF;AAEA,UAAM,SAAS,gBAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,IAAI;AACxD,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AACA,UAAM,YAAmC,OAAO,YAAY,OAAO,GAAG;AACtE,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AAEA,SAAK,gBAAgB,cAAc,WAAW,EAAE,SAAS,KAAK,CAAC;AAAA,EACjE;AACF;AAlBU;AAAA,EADPC,QAAOC,eAAc;AAAA,GADX,qBAEH;AAFG,uBAAN;AAAA,EADNC,YAAW;AAAA,GACC;;;AMVb,SAAS,cAAAC,mBAAkB;;;ACC3B,SAAS,kCAAkC;;;ACCpC,IAAM,oBAA4C;AAAA,EACvD,aAAa,CAAC,KAAK,MAAM,YAAY;AACnC,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA;AAAA;AAAA,MAEE,KAAK,IAAI,IAAI,QAAQ,aAAa,IAClC;AAAA,MACA;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACF;;;ADVO,IAAM,2BAIT;AAAA,EACF,GAAG;AAAA,EACH;AAAA,EACA,SAAS,SAAO;AAAA,IACd,GAAG;AAAA,IACH,OAAO;AAAA,MACL,GAAG,GAAG;AAAA,MACN,OAAO,GAAG,MAAM;AAAA,MAChB,UAAU,GAAG,MAAM;AAAA,IACrB;AAAA,EACF;AAAA,EACA,OAAO,OAAO,WAAW,QAAuB;AAC9C,UAAM,QAAQ,IAAI,IAAgC,0BAA0B;AAC5E,UAAM,MAAM,kBAAkB,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK;AAAA,EAC1E;AAAA,EACA,aAAa,MAAM;AACrB;;;AE1BA,SAAS,oBAAAC,yBAAwB;AACjC,SAAuC,qBAAqB;AAC5D,SAAS,wBAAwB;AACjC,SAAwB,iBAAAC,sBAAqB;AAItC,IAAM,8BAIT;AAAA,EACF,GAAG;AAAA,EACH,MAAM,cAAc;AAAA,EACpB,SAAS,CAAC,QAAQ;AAAA,IAChB,GAAG;AAAA,IACH,OAAO;AAAA,MACL,GAAG,GAAG;AAAA,MACN,WAAW,GAAG,MAAM;AAAA,MACpB,SAAS,GAAG,MAAM;AAAA,MAClB,cAAc,GAAG,MAAM;AAAA,MACvB,YAAY,GAAG,MAAM;AAAA,IACvB;AAAA,EACF;AAAA,EACA,OAAO,CAAC,WAAW,QAAuB;AACxC,UAAM,WAAW,IAAI,IAAsBC,iBAAgB;AAC3D,aAAS,eAAe,UAAU,KAAK;AACvC,UAAM,gBAAgB,SAAS,QAAQ,UAAU,MAAM,YAAY;AACnE,0BAAsB,MAAM;AAC1B,UAAI,iBAAiB,cAAc,iBAAiB,iBAAiB,MAAM;AACzE,cAAM,6BAA6B,cAAc,QAAQC,cAAa;AACtE,mCAA2B,WAAW;AAAA,MACxC;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACnCA,SAAS,oBAAAC,yBAAwB;AACjC,SAA6B,iBAAAC,sBAAqB;AAK3C,IAAM,yBAAqF;AAAA,EAChG,GAAG;AAAA,EACH;AAAA,EACA,SAAS,CAAC,QAAQ;AAAA,IAChB,GAAG;AAAA,IACH,OAAO;AAAA,MACL,GAAG,GAAG;AAAA,MACN,OAAO,GAAG,MAAM;AAAA,MAChB,UAAU,GAAG,MAAM;AAAA,IACrB;AAAA,EACF;AAAA,EACA,OAAO,CAAC,WAAW,QAAQ;AACzB,cAAU,MAAM,IAAI,QAAQ,CAAC,IAAI,UAAU;AACzC,YAAM,WAAW,IAAI,IAAsBC,iBAAgB;AAC3D,YAAM,OAAO,SAAS,QAAQ,EAAE;AAChC,UAAI,CAAC,MAAM;AACT;AAAA,MACF;AAEA,YAAM,YAAY,KAAK,QAAQC,cAAa;AAC5C,YAAM,QAAQ,UAAU,MAAM,MAAM,KAAK;AACzC,gBAAU,OAAO;AAAA,QACf,UAAU;AAAA,UACR,GAAG,MAAM;AAAA,UACT,GAAG,MAAM;AAAA,QACX;AAAA,MACF,CAAC;AACD,eAAS,OAAO,wBAAwB,IAAI;AAAA,IAC9C,CAAC;AAAA,EACH;AACF;;;ACpCA,SAAS,oBAAAC,yBAAwB;AAO1B,IAAM,0BAIT;AAAA,EACF,GAAG;AAAA,EACH;AAAA,EACA,SAAS,SAAO;AAAA,IACd,GAAG;AAAA,IACH;AAAA,EACF;AAAA,EACA,OAAO,CAAC,WAAW,QAAuB;AACxC,UAAM,WAAW,IAAI,IAAsBC,iBAAgB;AAC3D,UAAM,OAAO,SAAS,QAAQ,UAAU,MAAM,KAAK,EAAE;AACrD,QAAI,MAAM;AACR,WAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAAA,EACA,UAAU,CAAC,IAAI,QAAQ;AACrB,UAAM,SAAS,IAAI,IAAuB,iBAAiB;AAC3D,WAAO,eAAe,OAAO,aAAa,GAAG,MAAM,IAAI,CAAC;AAAA,EAC1D;AAAA,EACA,gBAAgB,CAAC,IAAI,QAAQ;AAC3B,UAAM,SAAS,IAAI,IAAuB,iBAAiB;AAC3D,QAAI,OAAO,eAAe,OAAO,aAAa,GAAG,MAAM,IAAI,CAAC;AAC5D,QAAI,GAAG,MAAM,KAAK,MAAM,UAAU;AAChC,cAAQ,OAAO,GAAG,MAAM,KAAK,KAAK,SAAS,CAAC,IAAI,GAAG,MAAM,KAAK,KAAK,SAAS,CAAC;AAAA,IAC/E;AACA,WAAO;AAAA,EACT;AACF;;;ACrCA,SAAS,oBAAAC,yBAAwB;AAO1B,IAAM,0BAIT;AAAA,EACF,GAAG;AAAA,EACH;AAAA,EACA,SAAS,CAAC,QAAQ;AAAA,IAChB,GAAG;AAAA,IACH;AAAA,EACF;AAAA,EACA,OAAO,CAAC,WAAW,QAAuB;AACxC,UAAM,WAAW,IAAI,IAAsBC,iBAAgB;AAC3D,aAAS,WAAW,UAAU,MAAM,EAAE;AAAA,EACxC;AAAA,EACA,UAAU,CAAC,IAAI,QAAQ;AAAA,EACvB,gBAAgB,CAAC,IAAI,QAAQ;AAC3B,UAAM,SAAS,IAAI,IAAuB,iBAAiB;AAC3D,UAAM,EAAE,MAAM,IAAI;AAClB,QAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,IAAI;AAC5B,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,OAAO,iBAAiB,MAAM,IAAI;AACnD,UAAM,SAAS,OAAO,iBAAiB,MAAM,EAAE;AAC/C,WAAO,oBAAoB,QAAQ,OAAO,MAAM;AAAA,EAClD;AACF;;;ACnCA,SAAS,oBAAAC,yBAAwB;AAEjC,SAAS,oBAAAC,yBAAwB;AAM1B,IAAM,8BACX;AAAA,EACE,GAAG;AAAA,EACH;AAAA,EACA,SAAS,SAAO;AAAA,IACd,GAAG;AAAA,IACH,OAAO;AAAA,MACL,GAAG,GAAG;AAAA,MACN,OAAO,GAAG,MAAM;AAAA,MAChB,UAAU,GAAG,MAAM;AAAA,IACrB;AAAA,EACF;AAAA,EACA,OAAO,CAAC,WAAW,QAAuB;AACxC,UAAM,WAAW,IAAI,IAAsBC,iBAAgB;AAC3D,UAAM,OAAO,SAAS,QAAQ,UAAU,MAAM,EAAE;AAEhD,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AACA,UAAM,WAAW,KAAK,QAAQC,iBAAgB;AAE9C,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AAEA,QAAI,EAAE,KAAK,IAAI,UAAU;AACzB,QAAI,KAAK,SAAS,GAAG,KAAK,SAAS,KAAK;AACtC,aAAO,KAAK,MAAM,GAAG,EAAE;AAAA,IACzB;AAEA,QAAI,CAAC,KAAK,WAAW,GAAG,GAAG;AACzB,aAAO,IAAI,IAAI;AAAA,IACjB;AAEA,UAAM,WAAW,SAAS,UAAU,kBAAkB,IAAI;AAE1D,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AACA,aAAS,QAAQ,UAAU,MAAM;AAAA,EACnC;AAAA,EACA,aAAa,CAAC,IAAI,MAAM,YAAY;AAClC,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,IAAI,IAAI,QAAQ,aAAa,IAAI,KAAK;AAC7C,UACE,GAAG,SAAS,KAAK;AAAA,MACjB,GAAG,MAAM,OAAO,KAAK,MAAM;AAAA,MAC3B,GAAG,OAAO,SAAS,KAAK,OAAO,MAC/B;AACA,eAAO;AAAA,UACL,MAAM,GAAG;AAAA,UACT,OAAO;AAAA,YACL,GAAG,GAAG;AAAA,YACN,OAAO,GAAG,MAAM;AAAA,YAChB,UAAU,KAAK,MAAM;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACF;;;ACzEF,SAAS,aAAAC,kBAAiB;AAE1B,SAAS,oBAAAC,yBAA+C;AAOjD,IAAM,uBAIT;AAAA,EACF,GAAG;AAAA,EACH;AAAA,EACA,SAAS,SAAO;AAAA,IACd,GAAG;AAAA,IACH;AAAA,EACF;AAAA,EACA,OAAO,OAAO,WAAW,QAAuB;AAC9C,UAAM,WAAW,IAAI,IAAsBC,iBAAgB;AAC3D,UAAM,SAAS;AAAA,MACbC,WAAU,UAAU,MAAM,IAAI;AAAA,MAC9B;AAAA,MACA,UAAU,MAAM;AAAA,IAClB;AAAA,EACF;AAAA,EACA,UAAU,CAAC,IAAI,QAAQ;AACrB,UAAM,SAAS,IAAI,IAAuB,iBAAiB;AAC3D,WAAO,eAAe,OAAO,aAAa,GAAG,MAAM,IAAI,CAAC;AAAA,EAC1D;AAAA,EACA,gBAAgB,CAAC,IAAI,QAAQ;AAC3B,UAAM,SAAS,IAAI,IAAuB,iBAAiB;AAC3D,QAAI,OAAO,eAAe,OAAO,aAAa,GAAG,MAAM,IAAI,CAAC;AAC5D,QAAI,GAAG,MAAM,KAAK,MAAM,UAAU;AAChC,cAAQ,OAAO,GAAG,MAAM,KAAK,KAAK,SAAS,CAAC,IAAI,GAAG,MAAM,KAAK,KAAK,SAAS,CAAC;AAAA,IAC/E;AACA,WAAO;AAAA,EACT;AACF;;;ACvCA,SAAS,4BAA4B;AAO9B,IAAM,uBAIT;AAAA,EACF,GAAG;AAAA,EACH;AAAA,EACA,SAAS,SAAO;AAAA,IACd,GAAG;AAAA,IACH;AAAA,EACF;AAAA,EACA,OAAO,CAAC,WAAW,QAAuB;AACxC,UAAM,eAAe,IAAI,IAA0B,oBAAoB;AACvE,iBAAa,WAAW;AAAA,MACtB,GAAG,UAAU;AAAA,MACb,KAAK,UAAU,MAAM;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EACA,UAAU,CAAC,IAAI,QAAQ;AAAA,EACvB,gBAAgB,CAAC,IAAI,QAAQ;AAC3B,UAAM,SAAS,IAAI,IAAuB,iBAAiB;AAC3D,UAAM,EAAE,MAAM,IAAI;AAClB,QAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,IAAI;AAC5B,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,OAAO,iBAAiB,MAAM,IAAI;AACnD,UAAM,SAAS,OAAO,iBAAiB,MAAM,EAAE;AAC/C,WAAO,oBAAoB,QAAQ,OAAO,MAAM;AAAA,EAClD;AACF;;;AC7BO,IAAM,iBAAiB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AVZO,IAAM,uBAAN,MAA4D;AAAA,EACjE,sBAAsB,mBAA4C;AAChE,mBAAe,QAAQ,mBAAiB;AACtC,wBAAkB,sBAAsB,aAAa;AAAA,IACvD,CAAC;AAAA,EACH;AACF;AANa,uBAAN;AAAA,EADNC,YAAW;AAAA,GACC;;;AWLb,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,cAAAC,aAAY,UAAAC,SAAQ,gBAAgB;AAC7C,SAAS,wBAAAC,uBAAsB,kBAAkB;AACjD,SAAS,kBAAAC,uBAAsB;AAC/B;AAAA,EACE,oBAAAC;AAAA,EACA,8BAAAC;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,oBAAAC,yBAAwB;AACjC,SAAS,mBAAmB;AAC5B,SAAS,iBAAAC,sBAAqB;AAC9B,SAA6B,oBAAoB;AAY1C,IAAM,qBAAN,MAAyB;AAAA,EAAzB;AAiBL,SAAQ,aAAmC,IAAIC,sBAAqB;AAAA;AAAA,EAKpE,OAAO,KAAoB,MAAgC;AACzD,UAAM,WAAW,IAAI,IAAsBC,iBAAgB;AAC3D,UAAM,iBAAiB,IAAI,IAAoBC,eAAc;AAC7D,UAAM,cAAc,IAAI,IAAyB,mBAAmB;AAEpE,UAAM,qBAAqB,IAAI,IAAgCC,2BAA0B;AAEzF,QAAI,MAAM,OAAO;AACf,qBAAe,MAAM,KAAK,KAAK;AAAA,IACjC;AACA,mBAAe,QAAQ,SAAS;AAEhC,SAAK,WAAW,QAAQ;AAAA,MACtB,YAAY,YAAY,OAAO,UAAU;AACvC,YAAI,MAAM,SAAS,aAAa;AAC9B;AAAA,QACF;AACA,aAAK,kBAAkB,OAAO,KAAK;AAAA,MACrC,CAAC;AAAA,MACD,SAAS,aAAa,CAAC,EAAE,MAAM,KAAK,MAAM;AACxC,cAAM,eAAe,KAAK,QAAQ,YAAY;AAC9C,YAAI,cAAc;AAChB,eAAK,eAAe,cAAc,YAAY;AAAA,QAChD;AAAA,MACF,CAAC;AAAA,MACD,KAAK,eACD,KAAK,aAAa,oBAAoB,CAAC,EAAE,OAAO,KAAK,MAAM;AACzD,cAAM,OAAO,MAAM;AACnB,cAAM,WAAW,KAAK,QAA0BC,iBAAgB;AAEhE,YAAI,UAAU;AACZ,eAAK,eAAe,SAAS,UAAUC,WAAU,IAAI,CAAC;AAEtD,eAAK,WAAW;AAAA,YACd,SAAS,eAAe,CAAC,UAAU;AACjC,mBAAK,uBAAuB,OAAO;AAAA,gBACjC,GAAG;AAAA,gBACH;AAAA,cACF,CAAC;AAAA,YACH,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF,CAAC,IACD,WAAW;AAAA,MACf,SAAS,gBAAgB,CAAC,UAAU;AAClC,aAAK,sBAAsB,OAAO,OAAO,GAAG;AAAA,MAC9C,CAAC;AAAA,MACD,SAAS,SAAS,CAAC,WAAW;AAC5B,uBAAe,MAAM;AAAA,MACvB,CAAC;AAAA,MACD,mBAAmB,cAAc,CAAC,UAAU;AAC1C,uBAAe;AAAA,UACb;AAAA,YACE;AAAA,YACA,OAAO;AAAA,cACL,KAAK,MAAM;AAAA,cACX,OAAO,MAAM;AAAA,cACb,UAAU,MAAM;AAAA,YAClB;AAAA,UACF;AAAA,UACA,EAAE,SAAS,KAAK;AAAA,QAClB;AAAA,MACF,CAAC;AAAA,MACD,KAAK,kBAAkB,WAAW,CAAC,EAAE,MAAM,YAAY,WAAW,UAAU,QAAQ,MAAM;AACxF,uBAAe;AAAA,UACb;AAAA,YACE,MAAMC,eAAc;AAAA,YACpB,OAAO;AAAA,cACL,cAAc,WAAW;AAAA,cACzB;AAAA,cACA,SAAS,CAAC,KAAK,EAAE;AAAA,cACjB,YAAY,SAAS;AAAA,cACrB;AAAA,YACF;AAAA,UACF;AAAA,UACA;AAAA,YACE,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF,CAAC;AAAA,MACD,KAAK,kBAAkB,oBAAoB,CAAC,UAAU;AACpD,cAAM,QAAgC;AAAA,UACpC,KAAK,CAAC,MAAM,KAAK,EAAE;AAAA,UACnB,OAAO,CAAC,MAAM,WAAW;AAAA,UACzB,UAAU,CAAC,MAAM,WAAW;AAAA,QAC9B;AACA,uBAAe;AAAA,UACb;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,UAAU;AACR,SAAK,eAAe,QAAQ;AAC5B,SAAK,WAAW,QAAQ;AAAA,EAC1B;AACF;AA3HU;AAAA,EADPC,QAAO,gBAAgB;AAAA,GADb,mBAEH;AAGA;AAAA,EADPA,QAAO,qBAAqB;AAAA,GAJlB,mBAKH;AAGA;AAAA,EADPA,QAAO,oBAAoB;AAAA,GAPjB,mBAQH;AAGA;AAAA,EADPA,QAAO,oBAAoB;AAAA,GAVjB,mBAWH;AAIA;AAAA,EAFPA,QAAO,WAAW;AAAA,EAClB,SAAS;AAAA,GAdC,mBAeH;AAKA;AAAA,EADPA,QAAO,4BAA4B;AAAA,GAnBzB,mBAoBH;AApBG,qBAAN;AAAA,EADNC,YAAW;AAAA,GACC;;;AvBdN,IAAM,0BAA0B,oBAA8C;AAAA,EACnF,QAAQ,CAAC,EAAE,KAAK,MAAM;AACpB,sBAAkB,MAAM,sBAAsB,CAAC,qBAAqB,CAAC;AACrE,SAAK,iBAAiB,EAAE,OAAO,EAAE,iBAAiB;AAClD,SAAK,kBAAkB,EAAE,OAAO,EAAE,iBAAiB;AACnD,SAAK,oBAAoB,EAAE,OAAO,EAAE,iBAAiB;AACrD,SAAK,gBAAgB,EAAE,OAAO,EAAE,iBAAiB;AACjD,SAAK,qBAAqB,EAAE,OAAO,EAAE,iBAAiB;AACtD,SAAK,oBAAoB,EAAE,OAAO,EAAE,iBAAiB;AAAA,EACvD;AAAA,EACA,OAAO,KAAK,MAAY;AACtB,QAAI,IAAuB,iBAAiB,EAAE,KAAK,KAAK,IAAI;AAE5D,QAAI,CAAC,KAAK,QAAQ;AAChB;AAAA,IACF;AACA,QAAI,IAAwB,kBAAkB,EAAE,OAAO,KAAK,IAAI;AAAA,EAClE;AAAA,EACA,UAAU,KAAK;AACb,QAAI,IAA0B,oBAAoB,EAAE,QAAQ;AAAA,EAC9D;AAAA,EACA,kBAAkB,CAAC,sBAAsB;AAC3C,CAAC;;;AwBhCD,cAAc;;;ACFd,SAAS,WAAW,gBAAgB;AAEpC,SAAS,kBAAkB;AAC3B,SAAS,kBAAAC,uBAAsB;AASxB,SAAS,cAAwB;AACtC,QAAM,iBAAiB,WAA2BA,eAAc;AAChE,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAE5C,YAAU,MAAM;AACd,UAAM,YAAY,eAAe,gBAAgB,SAAS,MAAM;AAC9D,iBAAW,eAAe,QAAQ,CAAC;AACnC,iBAAW,eAAe,QAAQ,CAAC;AAAA,IACrC,CAAC;AACD,WAAO,MAAM;AACX,gBAAU,QAAQ;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM,MAAM,eAAe,KAAK;AAAA,IAChC,MAAM,MAAM,eAAe,KAAK;AAAA,EAClC;AACF;","names":["injectable","FreeOperationType","injectable","cloneDeep","isEqual","injectable","inject","HistoryService","injectable","injectable","isEqual","cloneDeep","inject","HistoryService","injectable","injectable","inject","HistoryService","WorkflowContentChangeType","WorkflowContentChangeType","WorkflowDocument","WorkflowContentChangeType","WorkflowContentChangeType","WorkflowDocument","WorkflowContentChangeType","WorkflowContentChangeType","inject","HistoryService","injectable","injectable","WorkflowDocument","TransformData","WorkflowDocument","TransformData","WorkflowDocument","TransformData","WorkflowDocument","TransformData","WorkflowDocument","WorkflowDocument","WorkflowDocument","WorkflowDocument","FlowNodeFormData","WorkflowDocument","WorkflowDocument","FlowNodeFormData","cloneDeep","WorkflowDocument","WorkflowDocument","cloneDeep","injectable","cloneDeep","injectable","inject","DisposableCollection","HistoryService","WorkflowDocument","WorkflowResetLayoutService","FlowNodeFormData","OperationType","DisposableCollection","WorkflowDocument","HistoryService","WorkflowResetLayoutService","FlowNodeFormData","cloneDeep","OperationType","inject","injectable","HistoryService"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -6,6 +6,11 @@ export * from '@flowgram.ai/history';
|
|
|
6
6
|
import { WorkflowLinePortInfo, WorkflowNodeJSON, PositionMap, WorkflowContentChangeType, WorkflowContentChangeEvent, WorkflowLineEntity } from '@flowgram.ai/free-layout-core';
|
|
7
7
|
import { FlowNodeEntity, FlowNodeJSON } from '@flowgram.ai/document';
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
11
|
+
* SPDX-License-Identifier: MIT
|
|
12
|
+
*/
|
|
13
|
+
|
|
9
14
|
declare enum FreeOperationType {
|
|
10
15
|
addLine = "addLine",
|
|
11
16
|
deleteLine = "deleteLine",
|
|
@@ -133,6 +138,11 @@ interface IHandler<E> {
|
|
|
133
138
|
|
|
134
139
|
declare const createFreeHistoryPlugin: _flowgram_ai_core.PluginCreator<FreeHistoryPluginOptions>;
|
|
135
140
|
|
|
141
|
+
/**
|
|
142
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
143
|
+
* SPDX-License-Identifier: MIT
|
|
144
|
+
*/
|
|
145
|
+
|
|
136
146
|
declare class FreeHistoryConfig {
|
|
137
147
|
init(ctx: PluginContext, options: FreeHistoryPluginOptions): void;
|
|
138
148
|
enable: boolean;
|
|
@@ -144,6 +154,10 @@ declare class FreeHistoryConfig {
|
|
|
144
154
|
getLineURI: GetLineURI;
|
|
145
155
|
}
|
|
146
156
|
|
|
157
|
+
/**
|
|
158
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
159
|
+
* SPDX-License-Identifier: MIT
|
|
160
|
+
*/
|
|
147
161
|
interface UndoRedo {
|
|
148
162
|
canUndo: boolean;
|
|
149
163
|
canRedo: boolean;
|
|
@@ -152,6 +166,11 @@ interface UndoRedo {
|
|
|
152
166
|
}
|
|
153
167
|
declare function useUndoRedo(): UndoRedo;
|
|
154
168
|
|
|
169
|
+
/**
|
|
170
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
171
|
+
* SPDX-License-Identifier: MIT
|
|
172
|
+
*/
|
|
173
|
+
|
|
155
174
|
declare class FreeHistoryRegisters implements OperationContribution {
|
|
156
175
|
registerOperationMeta(operationRegistry: OperationRegistry): void;
|
|
157
176
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,6 +6,11 @@ export * from '@flowgram.ai/history';
|
|
|
6
6
|
import { WorkflowLinePortInfo, WorkflowNodeJSON, PositionMap, WorkflowContentChangeType, WorkflowContentChangeEvent, WorkflowLineEntity } from '@flowgram.ai/free-layout-core';
|
|
7
7
|
import { FlowNodeEntity, FlowNodeJSON } from '@flowgram.ai/document';
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
11
|
+
* SPDX-License-Identifier: MIT
|
|
12
|
+
*/
|
|
13
|
+
|
|
9
14
|
declare enum FreeOperationType {
|
|
10
15
|
addLine = "addLine",
|
|
11
16
|
deleteLine = "deleteLine",
|
|
@@ -133,6 +138,11 @@ interface IHandler<E> {
|
|
|
133
138
|
|
|
134
139
|
declare const createFreeHistoryPlugin: _flowgram_ai_core.PluginCreator<FreeHistoryPluginOptions>;
|
|
135
140
|
|
|
141
|
+
/**
|
|
142
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
143
|
+
* SPDX-License-Identifier: MIT
|
|
144
|
+
*/
|
|
145
|
+
|
|
136
146
|
declare class FreeHistoryConfig {
|
|
137
147
|
init(ctx: PluginContext, options: FreeHistoryPluginOptions): void;
|
|
138
148
|
enable: boolean;
|
|
@@ -144,6 +154,10 @@ declare class FreeHistoryConfig {
|
|
|
144
154
|
getLineURI: GetLineURI;
|
|
145
155
|
}
|
|
146
156
|
|
|
157
|
+
/**
|
|
158
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
159
|
+
* SPDX-License-Identifier: MIT
|
|
160
|
+
*/
|
|
147
161
|
interface UndoRedo {
|
|
148
162
|
canUndo: boolean;
|
|
149
163
|
canRedo: boolean;
|
|
@@ -152,6 +166,11 @@ interface UndoRedo {
|
|
|
152
166
|
}
|
|
153
167
|
declare function useUndoRedo(): UndoRedo;
|
|
154
168
|
|
|
169
|
+
/**
|
|
170
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
171
|
+
* SPDX-License-Identifier: MIT
|
|
172
|
+
*/
|
|
173
|
+
|
|
155
174
|
declare class FreeHistoryRegisters implements OperationContribution {
|
|
156
175
|
registerOperationMeta(operationRegistry: OperationRegistry): void;
|
|
157
176
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/create-free-history-plugin.ts","../src/history-entity-manager.ts","../src/handlers/drag-nodes-handler.ts","../src/types.ts","../src/handlers/change-node-data-handler.ts","../src/free-history-config.ts","../src/handlers/change-content-handler.ts","../src/changes/delete-node-change.ts","../src/changes/delete-line-change.ts","../src/changes/add-node-change.ts","../src/changes/add-line-change.ts","../src/changes/index.ts","../src/free-history-registers.ts","../src/operation-metas/reset-layout.ts","../src/operation-metas/base.ts","../src/operation-metas/move-child-nodes.ts","../src/operation-metas/drag-nodes.ts","../src/operation-metas/delete-node.ts","../src/operation-metas/delete-line.ts","../src/operation-metas/change-node-data.ts","../src/operation-metas/add-node.ts","../src/operation-metas/add-line.ts","../src/operation-metas/index.ts","../src/free-history-manager.ts","../src/hooks/use-undo-redo.tsx"],"sourcesContent":["export * from './create-free-history-plugin';\nexport * from './types';\nexport * from '@flowgram.ai/history';\nexport * from './free-history-config';\nexport * from './hooks';\nexport * from './free-history-registers';\n","import { bindContributions, definePluginCreator } from '@flowgram.ai/core';\nimport { HistoryContainerModule, OperationContribution } from '@flowgram.ai/history';\n\nimport { type FreeHistoryPluginOptions } from './types';\nimport { HistoryEntityManager } from './history-entity-manager';\nimport { DragNodesHandler } from './handlers/drag-nodes-handler';\nimport { ChangeNodeDataHandler } from './handlers/change-node-data-handler';\nimport { ChangeContentHandler } from './handlers/change-content-handler';\nimport { FreeHistoryRegisters } from './free-history-registers';\nimport { FreeHistoryManager } from './free-history-manager';\nimport { FreeHistoryConfig } from './free-history-config';\n\nexport const createFreeHistoryPlugin = definePluginCreator<FreeHistoryPluginOptions>({\n onBind: ({ bind }) => {\n bindContributions(bind, FreeHistoryRegisters, [OperationContribution]);\n bind(FreeHistoryConfig).toSelf().inSingletonScope();\n bind(FreeHistoryManager).toSelf().inSingletonScope();\n bind(HistoryEntityManager).toSelf().inSingletonScope();\n bind(DragNodesHandler).toSelf().inSingletonScope();\n bind(ChangeNodeDataHandler).toSelf().inSingletonScope();\n bind(ChangeContentHandler).toSelf().inSingletonScope();\n },\n onInit(ctx, opts): void {\n ctx.get<FreeHistoryConfig>(FreeHistoryConfig).init(ctx, opts);\n\n if (!opts.enable) {\n return;\n }\n ctx.get<FreeHistoryManager>(FreeHistoryManager).onInit(ctx, opts);\n },\n onDispose(ctx) {\n ctx.get<HistoryEntityManager>(HistoryEntityManager).dispose();\n },\n containerModules: [HistoryContainerModule],\n});\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { cloneDeep, isEqual } from 'lodash';\nimport { injectable } from 'inversify';\nimport { type EntityData } from '@flowgram.ai/core';\nimport { type Disposable, DisposableCollection } from '@flowgram.ai/utils';\n\n@injectable()\nexport class HistoryEntityManager implements Disposable {\n private _entityDataValues: Map<EntityData, unknown> = new Map();\n\n private _toDispose: DisposableCollection = new DisposableCollection();\n\n addEntityData(entityData: EntityData) {\n this._entityDataValues.set(entityData, cloneDeep(entityData.toJSON()));\n this._toDispose.push(\n entityData.onWillChange(event => {\n const value = event.toJSON();\n const oldValue = this._entityDataValues.get(entityData);\n if (isEqual(value, oldValue)) {\n return;\n }\n this._entityDataValues.set(entityData, cloneDeep(value));\n }),\n );\n }\n\n getValue(entityData: EntityData) {\n return this._entityDataValues.get(entityData);\n }\n\n setValue(entityData: EntityData, value: unknown) {\n return this._entityDataValues.set(entityData, value);\n }\n\n dispose() {\n this._entityDataValues.clear();\n this._toDispose.dispose();\n }\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { injectable, inject } from 'inversify';\nimport { HistoryService } from '@flowgram.ai/history';\nimport { type NodesDragEndEvent } from '@flowgram.ai/free-layout-core';\nimport { TransformData } from '@flowgram.ai/core';\n\nimport { FreeOperationType, type IHandler } from '../types';\n\n@injectable()\nexport class DragNodesHandler implements IHandler<NodesDragEndEvent> {\n @inject(HistoryService)\n private _historyService: HistoryService;\n\n handle(event: NodesDragEndEvent) {\n if (event.type === 'onDragEnd') {\n this._dragNode(event);\n }\n }\n\n private _dragNode(event: NodesDragEndEvent) {\n this._historyService.pushOperation(\n {\n type: FreeOperationType.dragNodes,\n value: {\n ids: event.nodes.map((node) => node.id),\n value: event.nodes.map((node) => {\n const { x, y } = node.getData(TransformData).position;\n return {\n x,\n y,\n };\n }),\n oldValue: event.startPositions,\n },\n },\n { noApply: true }\n );\n }\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { type IPoint } from '@flowgram.ai/utils';\nimport { type Operation, type OperationMeta } from '@flowgram.ai/history';\nimport {\n type WorkflowContentChangeType,\n type WorkflowContentChangeEvent,\n type WorkflowLineEntity,\n type WorkflowLinePortInfo,\n type WorkflowNodeJSON,\n type PositionMap,\n} from '@flowgram.ai/free-layout-core';\nimport { type FlowNodeEntity, type FlowNodeJSON } from '@flowgram.ai/document';\nimport { type EntityData, type PluginContext } from '@flowgram.ai/core';\n\nexport enum FreeOperationType {\n addLine = 'addLine',\n deleteLine = 'deleteLine',\n moveNode = 'moveNode',\n addNode = 'addNode',\n deleteNode = 'deleteNode',\n changeNodeData = 'changeNodeData',\n resetLayout = 'resetLayout',\n dragNodes = 'dragNodes',\n moveChildNodes = 'moveChildNodes',\n}\n\nexport interface AddOrDeleteLineOperationValue extends WorkflowLinePortInfo {\n id: string;\n}\n\nexport interface AddOrDeleteWorkflowNodeOperationValue {\n node: WorkflowNodeJSON;\n parentID?: string;\n}\n\nexport interface AddLineOperation extends Operation {\n type: FreeOperationType.addLine;\n value: AddOrDeleteLineOperationValue;\n}\n\nexport interface DeleteLineOperation extends Operation {\n type: FreeOperationType.deleteLine;\n value: AddOrDeleteLineOperationValue;\n}\n\nexport interface MoveNodeOperation extends Operation {\n type: FreeOperationType.moveNode;\n value: MoveNodeOperationValue;\n}\n\nexport interface AddWorkflowNodeOperation extends Operation {\n type: FreeOperationType.addNode;\n value: AddOrDeleteWorkflowNodeOperationValue;\n}\n\nexport interface DeleteWorkflowNodeOperation extends Operation {\n type: FreeOperationType.deleteNode;\n value: AddOrDeleteWorkflowNodeOperationValue;\n}\n\nexport interface MoveNodeOperationValue {\n id: string;\n value: {\n x: number;\n y: number;\n };\n oldValue: {\n x: number;\n y: number;\n };\n}\n\nexport interface DragNodeOperationValue {\n ids: string[];\n value: IPoint[];\n oldValue: IPoint[];\n}\n\nexport interface ResetLayoutOperationValue {\n ids: string[];\n value: PositionMap;\n oldValue: PositionMap;\n}\n\nexport interface ContentChangeTypeToOperation<T extends Operation> {\n type: WorkflowContentChangeType;\n toOperation: (event: WorkflowContentChangeEvent, ctx: PluginContext) => T | undefined;\n}\n\nexport interface EntityDataType {\n type: FreeOperationType;\n toEntityData: (node: FlowNodeEntity, ctx: PluginContext) => EntityData;\n}\n\nexport interface ChangeNodeDataValue {\n id: string;\n value: unknown;\n oldValue: unknown;\n path: string;\n}\n\nexport interface ChangeNodeDataOperation extends Operation {\n type: FreeOperationType.changeNodeData;\n value: ChangeNodeDataValue;\n}\n\n/**\n * 将node转成json\n */\nexport type NodeToJson = (node: FlowNodeEntity) => FlowNodeJSON;\n/**\n * 将line转成json\n */\nexport type LineToJson = (node: WorkflowLineEntity) => FlowNodeJSON;\n/**\n * 根据节点id获取label\n */\nexport type GetNodeLabelById = (id: string) => string;\n/**\n * 根据节点获取label\n */\nexport type GetNodeLabel = (node: FlowNodeJSON) => string;\n/**\n * 根据分支获取label\n */\nexport type GetBlockLabel = (node: FlowNodeJSON) => string;\n/**\n * 根据节点获取URI\n */\nexport type GetNodeURI = (id: string) => string | any;\n/**\n * 根据连线获取URI\n */\nexport type GetLineURI = (id: string) => string | any;\n\n/**\n * 插件配置\n */\nexport interface FreeHistoryPluginOptions {\n enable?: boolean;\n limit?: number;\n nodeToJSON?: (ctx: PluginContext) => NodeToJson;\n getNodeLabelById?: (ctx: PluginContext) => GetNodeLabelById;\n getNodeLabel?: (ctx: PluginContext) => GetNodeLabel;\n getBlockLabel?: (ctx: PluginContext) => GetBlockLabel;\n getNodeURI?: (ctx: PluginContext) => GetNodeURI;\n getLineURI?: (ctx: PluginContext) => GetLineURI;\n operationMetas?: OperationMeta[];\n enableChangeNode?: boolean;\n uri?: string | any;\n}\n\nexport interface IHandler<E> {\n handle: (event: E, ctx: PluginContext) => void | Promise<void>;\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { cloneDeep, get, isEqual, set } from 'lodash';\nimport { injectable, inject } from 'inversify';\nimport { FlowNodeFormData, type DetailChangeEvent } from '@flowgram.ai/form-core';\nimport { type FlowNodeEntity } from '@flowgram.ai/document';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { HistoryService } from '@flowgram.ai/history';\n\nimport { FreeOperationType, type IHandler } from '../types';\nimport { HistoryEntityManager } from '../history-entity-manager';\nimport { FreeHistoryConfig } from '../free-history-config';\n\nexport interface ChangeNodeDataEvent extends DetailChangeEvent {\n node: FlowNodeEntity;\n}\n\n@injectable()\nexport class ChangeNodeDataHandler implements IHandler<ChangeNodeDataEvent> {\n @inject(HistoryService)\n private _historyService: HistoryService;\n\n @inject(WorkflowDocument) document: WorkflowDocument;\n\n @inject(HistoryEntityManager)\n private _entityManager: HistoryEntityManager;\n\n @inject(FreeHistoryConfig)\n private _config: FreeHistoryConfig;\n\n handle(event: ChangeNodeDataEvent) {\n const { path, value, initialized, node } = event;\n const formData = node.getData<FlowNodeFormData>(FlowNodeFormData);\n const oldValue = this._entityManager.getValue(formData) as object;\n const propPath = path.split('/').filter(Boolean).join('.');\n\n const propOldValue = propPath ? get(oldValue, propPath) : oldValue;\n if (isEqual(value, propOldValue)) {\n return;\n }\n\n if (initialized) {\n let operationPath = path;\n let operationValue = cloneDeep(value);\n let operationOldValue = propOldValue;\n // 只存储一层的数据,因为formModel无法获取数组下的某项的值\n if (path !== '/') {\n const clonedOldValue = cloneDeep(oldValue);\n set(clonedOldValue, propPath, value);\n operationPath = path.split('/').filter(Boolean)[0];\n operationValue = get(clonedOldValue, operationPath);\n operationOldValue = get(oldValue, operationPath);\n }\n\n this._historyService.pushOperation(\n {\n type: FreeOperationType.changeNodeData,\n value: {\n id: node.id,\n path: operationPath,\n value: operationValue,\n oldValue: operationOldValue,\n },\n uri: this._config.getNodeURI(node.id),\n },\n { noApply: true },\n );\n }\n\n if (propPath) {\n set(oldValue, propPath, cloneDeep(value));\n } else {\n this._entityManager.setValue(formData, cloneDeep(value));\n }\n }\n}\n","import { injectable } from 'inversify';\nimport { type FlowNodeEntity, type FlowNodeJSON } from '@flowgram.ai/document';\nimport { type PluginContext } from '@flowgram.ai/core';\n\nimport {\n type FreeHistoryPluginOptions,\n type GetBlockLabel,\n type GetLineURI,\n type GetNodeLabel,\n type GetNodeLabelById,\n type GetNodeURI,\n type NodeToJson,\n} from './types';\n\n@injectable()\nexport class FreeHistoryConfig {\n init(ctx: PluginContext, options: FreeHistoryPluginOptions) {\n this.enable = !!options?.enable;\n\n if (options.nodeToJSON) {\n this.nodeToJSON = options.nodeToJSON(ctx);\n }\n\n if (options.getNodeLabelById) {\n this.getNodeLabelById = options.getNodeLabelById(ctx);\n }\n\n if (options.getNodeLabel) {\n this.getNodeLabel = options.getNodeLabel(ctx);\n }\n\n if (options.getBlockLabel) {\n this.getBlockLabel = options.getBlockLabel(ctx);\n }\n\n if (options.getNodeURI) {\n this.getNodeURI = options.getNodeURI(ctx);\n }\n\n if (options.getLineURI) {\n this.getLineURI = options.getLineURI(ctx);\n }\n }\n\n enable = false;\n\n nodeToJSON: NodeToJson = (node: FlowNodeEntity) => node.toJSON();\n\n getNodeLabelById: GetNodeLabelById = (id: string) => id;\n\n getNodeLabel: GetNodeLabel = (node: FlowNodeJSON) => node.id;\n\n getBlockLabel: GetBlockLabel = (node: FlowNodeJSON) => node.id;\n\n getNodeURI: GetNodeURI = (id: string) => `node:${id}`;\n\n getLineURI: GetLineURI = (id: string) => `line:${id}`;\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { injectable, inject } from 'inversify';\nimport { HistoryService, Operation } from '@flowgram.ai/history';\nimport { type WorkflowContentChangeEvent } from '@flowgram.ai/free-layout-core';\nimport { type PluginContext } from '@flowgram.ai/core';\n\nimport { type IHandler } from '../types';\nimport changes from '../changes';\n\n@injectable()\nexport class ChangeContentHandler implements IHandler<WorkflowContentChangeEvent> {\n @inject(HistoryService)\n private _historyService: HistoryService;\n\n handle(event: WorkflowContentChangeEvent, ctx: PluginContext) {\n if (!this._historyService.undoRedoService.canPush()) {\n return;\n }\n\n const change = changes.find((c) => c.type === event.type);\n if (!change) {\n return;\n }\n const operation: Operation | undefined = change.toOperation(event, ctx);\n if (!operation) {\n return;\n }\n\n this._historyService.pushOperation(operation, { noApply: true });\n }\n}\n","import { WorkflowContentChangeType } from '@flowgram.ai/free-layout-core';\nimport { type FlowNodeEntity } from '@flowgram.ai/document';\n\nimport {\n type ContentChangeTypeToOperation,\n FreeOperationType,\n type DeleteWorkflowNodeOperation,\n} from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\n\nexport const deleteNodeChange: ContentChangeTypeToOperation<DeleteWorkflowNodeOperation> = {\n type: WorkflowContentChangeType.DELETE_NODE,\n toOperation: (event, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const node = event.entity as FlowNodeEntity;\n const json = event.toJSON();\n const parentID = node.parent?.id;\n\n return {\n type: FreeOperationType.deleteNode,\n value: {\n node: json,\n parentID,\n },\n uri: config.getNodeURI(node.id),\n };\n },\n};\n","import { type WorkflowLineEntity } from '@flowgram.ai/free-layout-core';\nimport { WorkflowContentChangeType } from '@flowgram.ai/free-layout-core';\n\nimport {\n type AddOrDeleteLineOperationValue,\n type ContentChangeTypeToOperation,\n type DeleteLineOperation,\n FreeOperationType,\n} from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\n\nexport const deleteLineChange: ContentChangeTypeToOperation<DeleteLineOperation> = {\n type: WorkflowContentChangeType.DELETE_LINE,\n toOperation: (event, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const line = event.entity as WorkflowLineEntity;\n const value: AddOrDeleteLineOperationValue = {\n from: line.info.from,\n to: line.info.to || '',\n fromPort: line.info.fromPort || '',\n toPort: line.info.toPort || '',\n id: line.id,\n };\n return {\n type: FreeOperationType.deleteLine,\n value,\n uri: config.getNodeURI(line.id),\n };\n },\n};\n","import { WorkflowDocument, type WorkflowNodeJSON } from '@flowgram.ai/free-layout-core';\nimport { WorkflowContentChangeType } from '@flowgram.ai/free-layout-core';\nimport { type FlowNodeEntity } from '@flowgram.ai/document';\n\nimport {\n type AddWorkflowNodeOperation,\n type ContentChangeTypeToOperation,\n FreeOperationType,\n} from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\n\nexport const addNodeChange: ContentChangeTypeToOperation<AddWorkflowNodeOperation> = {\n type: WorkflowContentChangeType.ADD_NODE,\n toOperation: (event, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n const node = event.entity as FlowNodeEntity;\n const parentID = node.parent?.id;\n const json: WorkflowNodeJSON = document.toNodeJSON(node);\n\n return {\n type: FreeOperationType.addNode,\n value: {\n node: json,\n parentID,\n },\n uri: config.getNodeURI(node.id),\n };\n },\n};\n","import { type WorkflowLineEntity } from '@flowgram.ai/free-layout-core';\nimport { WorkflowContentChangeType } from '@flowgram.ai/free-layout-core';\n\nimport {\n type AddLineOperation,\n type AddOrDeleteLineOperationValue,\n type ContentChangeTypeToOperation,\n FreeOperationType,\n} from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\n\nexport const addLineChange: ContentChangeTypeToOperation<AddLineOperation> = {\n type: WorkflowContentChangeType.ADD_LINE,\n toOperation: (event, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const line = event.entity as WorkflowLineEntity;\n const value: AddOrDeleteLineOperationValue = {\n from: line.info.from,\n to: line.info.to || '',\n fromPort: line.info.fromPort || '',\n toPort: line.info.toPort || '',\n id: line.id,\n };\n return {\n type: FreeOperationType.addLine,\n value,\n uri: config.getLineURI(line.id),\n };\n },\n};\n","import { deleteNodeChange } from './delete-node-change';\nimport { deleteLineChange } from './delete-line-change';\nimport { addNodeChange } from './add-node-change';\nimport { addLineChange } from './add-line-change';\n\nexport default [addLineChange, deleteLineChange, addNodeChange, deleteNodeChange];\n","import { injectable } from 'inversify';\nimport { type OperationContribution, type OperationRegistry } from '@flowgram.ai/history';\n\nimport { operationMetas } from './operation-metas';\n\n@injectable()\nexport class FreeHistoryRegisters implements OperationContribution {\n registerOperationMeta(operationRegistry: OperationRegistry): void {\n operationMetas.forEach(operationMeta => {\n operationRegistry.registerOperationMeta(operationMeta);\n });\n }\n}\n","import { type PluginContext } from '@flowgram.ai/core';\nimport { WorkflowResetLayoutService } from '@flowgram.ai/free-layout-core';\nimport { type OperationMeta } from '@flowgram.ai/history';\n\nimport { FreeOperationType, type ResetLayoutOperationValue } from '../types';\nimport { baseOperationMeta } from './base';\n\nexport const resetLayoutOperationMeta: OperationMeta<\n ResetLayoutOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: FreeOperationType.resetLayout,\n inverse: op => ({\n ...op,\n value: {\n ...op.value,\n value: op.value.oldValue,\n oldValue: op.value.value,\n },\n }),\n apply: async (operation, ctx: PluginContext) => {\n const reset = ctx.get<WorkflowResetLayoutService>(WorkflowResetLayoutService);\n await reset.layoutToPositions(operation.value.ids, operation.value.value);\n },\n shouldMerge: () => false,\n};\n","import { type OperationMeta } from '@flowgram.ai/history';\n\nexport const baseOperationMeta: Partial<OperationMeta> = {\n shouldMerge: (_op, prev, element) => {\n if (!prev) {\n return false;\n }\n\n if (\n // 合并500ms内的操作, 如删除节点会联动删除线条\n Date.now() - element.getTimestamp() <\n 500\n ) {\n return true;\n }\n return false;\n },\n};\n","import { OperationMeta } from '@flowgram.ai/history';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { MoveChildNodesOperationValue, OperationType } from '@flowgram.ai/document';\nimport { FlowNodeBaseType } from '@flowgram.ai/document';\nimport { PluginContext, TransformData } from '@flowgram.ai/core';\n\nimport { baseOperationMeta } from './base';\n\nexport const moveChildNodesOperationMeta: OperationMeta<\n MoveChildNodesOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: OperationType.moveChildNodes,\n inverse: (op) => ({\n ...op,\n value: {\n ...op.value,\n fromIndex: op.value.toIndex,\n toIndex: op.value.fromIndex,\n fromParentId: op.value.toParentId,\n toParentId: op.value.fromParentId,\n },\n }),\n apply: (operation, ctx: PluginContext) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n document.moveChildNodes(operation.value);\n const fromContainer = document.getNode(operation.value.fromParentId);\n requestAnimationFrame(() => {\n if (fromContainer && fromContainer.flowNodeType !== FlowNodeBaseType.ROOT) {\n const fromContainerTransformData = fromContainer.getData(TransformData);\n fromContainerTransformData.fireChange();\n }\n });\n },\n};\n","import { type OperationMeta } from '@flowgram.ai/history';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { type PluginContext, TransformData } from '@flowgram.ai/core';\n\nimport { type DragNodeOperationValue, FreeOperationType } from '../types';\nimport { baseOperationMeta } from './base';\n\nexport const dragNodesOperationMeta: OperationMeta<DragNodeOperationValue, PluginContext, void> = {\n ...baseOperationMeta,\n type: FreeOperationType.dragNodes,\n inverse: (op) => ({\n ...op,\n value: {\n ...op.value,\n value: op.value.oldValue,\n oldValue: op.value.value,\n },\n }),\n apply: (operation, ctx) => {\n operation.value.ids.forEach((id, index) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n const node = document.getNode(id);\n if (!node) {\n return;\n }\n\n const transform = node.getData(TransformData);\n const point = operation.value.value[index];\n transform.update({\n position: {\n x: point.x,\n y: point.y,\n },\n });\n document.layout.updateAffectedTransform(node);\n });\n },\n};\n","import { type PluginContext } from '@flowgram.ai/core';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { type OperationMeta } from '@flowgram.ai/history';\n\nimport { type AddOrDeleteWorkflowNodeOperationValue, FreeOperationType } from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\nimport { baseOperationMeta } from './base';\n\nexport const deleteNodeOperationMeta: OperationMeta<\n AddOrDeleteWorkflowNodeOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: FreeOperationType.deleteNode,\n inverse: op => ({\n ...op,\n type: FreeOperationType.addNode,\n }),\n apply: (operation, ctx: PluginContext) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n const node = document.getNode(operation.value.node.id);\n if (node) {\n node.dispose();\n }\n },\n getLabel: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n return `Delete Node ${config.getNodeLabel(op.value.node)}`;\n },\n getDescription: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n let desc = `Delete Node ${config.getNodeLabel(op.value.node)}`;\n if (op.value.node.meta?.position) {\n desc += ` at ${op.value.node.meta.position.x},${op.value.node.meta.position.y}`;\n }\n return desc;\n },\n};\n","import { type OperationMeta } from '@flowgram.ai/history';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { type PluginContext } from '@flowgram.ai/core';\n\nimport { type AddOrDeleteLineOperationValue, FreeOperationType } from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\nimport { baseOperationMeta } from './base';\n\nexport const deleteLineOperationMeta: OperationMeta<\n AddOrDeleteLineOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: FreeOperationType.deleteLine,\n inverse: (op) => ({\n ...op,\n type: FreeOperationType.addLine,\n }),\n apply: (operation, ctx: PluginContext) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n document.removeNode(operation.value.id);\n },\n getLabel: (op, ctx) => 'Delete Line',\n getDescription: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const { value } = op;\n if (!value.from || !value.to) {\n return 'Delete Line';\n }\n\n const fromName = config.getNodeLabelById(value.from);\n const toName = config.getNodeLabelById(value.to);\n return `Delete Line from ${fromName} to ${toName}`;\n },\n};\n","import { FlowNodeFormData } from '@flowgram.ai/form-core';\nimport { type PluginContext } from '@flowgram.ai/core';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { type OperationMeta } from '@flowgram.ai/history';\n\nimport { FreeOperationType, type ChangeNodeDataValue } from '../types';\nimport { baseOperationMeta } from './base';\n\nexport const changeNodeDataOperationMeta: OperationMeta<ChangeNodeDataValue, PluginContext, void> =\n {\n ...baseOperationMeta,\n type: FreeOperationType.changeNodeData,\n inverse: op => ({\n ...op,\n value: {\n ...op.value,\n value: op.value.oldValue,\n oldValue: op.value.value,\n },\n }),\n apply: (operation, ctx: PluginContext) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n const node = document.getNode(operation.value.id);\n\n if (!node) {\n return;\n }\n const formData = node.getData(FlowNodeFormData);\n\n if (!formData) {\n return;\n }\n\n let { path } = operation.value;\n if (path.endsWith('/') && path !== '/') {\n path = path.slice(0, -1);\n }\n\n if (!path.startsWith('/')) {\n path = `/${path}`;\n }\n\n const formItem = formData.formModel.getFormItemByPath(path);\n\n if (!formItem) {\n return;\n }\n formItem.value = operation.value.value;\n },\n shouldMerge: (op, prev, element) => {\n if (!prev) {\n return false;\n }\n\n if (Date.now() - element.getTimestamp() < 500) {\n if (\n op.type === prev.type && // 相同类型\n op.value.id === prev.value.id && // 相同节点\n op.value?.path === prev.value?.path // 相同路径\n ) {\n return {\n type: op.type,\n value: {\n ...op.value,\n value: op.value.value,\n oldValue: prev.value.oldValue,\n },\n };\n }\n return true;\n }\n return false;\n },\n };\n","import { cloneDeep } from 'lodash';\nimport { type PluginContext } from '@flowgram.ai/core';\nimport { WorkflowDocument, type WorkflowNodeJSON } from '@flowgram.ai/free-layout-core';\nimport { type OperationMeta } from '@flowgram.ai/history';\n\nimport { type AddOrDeleteWorkflowNodeOperationValue, FreeOperationType } from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\nimport { baseOperationMeta } from './base';\n\nexport const addNodeOperationMeta: OperationMeta<\n AddOrDeleteWorkflowNodeOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: FreeOperationType.addNode,\n inverse: op => ({\n ...op,\n type: FreeOperationType.deleteNode,\n }),\n apply: async (operation, ctx: PluginContext) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n await document.createWorkflowNode(\n cloneDeep(operation.value.node) as WorkflowNodeJSON,\n false,\n operation.value.parentID,\n );\n },\n getLabel: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n return `Create Node ${config.getNodeLabel(op.value.node)}`;\n },\n getDescription: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n let desc = `Create Node ${config.getNodeLabel(op.value.node)}`;\n if (op.value.node.meta?.position) {\n desc += ` at ${op.value.node.meta.position.x},${op.value.node.meta.position.y}`;\n }\n return desc;\n },\n};\n","import { type PluginContext } from '@flowgram.ai/core';\nimport { WorkflowLinesManager } from '@flowgram.ai/free-layout-core';\nimport { type OperationMeta } from '@flowgram.ai/history';\n\nimport { type AddOrDeleteLineOperationValue, FreeOperationType } from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\nimport { baseOperationMeta } from './base';\n\nexport const addLineOperationMeta: OperationMeta<\n AddOrDeleteLineOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: FreeOperationType.addLine,\n inverse: op => ({\n ...op,\n type: FreeOperationType.deleteLine,\n }),\n apply: (operation, ctx: PluginContext) => {\n const linesManager = ctx.get<WorkflowLinesManager>(WorkflowLinesManager);\n linesManager.createLine({\n ...operation.value,\n key: operation.value.id,\n });\n },\n getLabel: (op, ctx) => 'Create Line',\n getDescription: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const { value } = op;\n if (!value.from || !value.to) {\n return 'Create Line';\n }\n\n const fromName = config.getNodeLabelById(value.from);\n const toName = config.getNodeLabelById(value.to);\n return `Create Line from ${fromName} to ${toName}`;\n },\n};\n","import { resetLayoutOperationMeta } from './reset-layout';\nimport { moveChildNodesOperationMeta } from './move-child-nodes';\nimport { dragNodesOperationMeta } from './drag-nodes';\nimport { deleteNodeOperationMeta } from './delete-node';\nimport { deleteLineOperationMeta } from './delete-line';\nimport { changeNodeDataOperationMeta } from './change-node-data';\nimport { addNodeOperationMeta } from './add-node';\nimport { addLineOperationMeta } from './add-line';\n\nexport const operationMetas = [\n addLineOperationMeta,\n deleteLineOperationMeta,\n addNodeOperationMeta,\n deleteNodeOperationMeta,\n changeNodeDataOperationMeta,\n resetLayoutOperationMeta,\n dragNodesOperationMeta,\n moveChildNodesOperationMeta,\n];\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { cloneDeep } from 'lodash';\nimport { injectable, inject, optional } from 'inversify';\nimport { DisposableCollection, Disposable } from '@flowgram.ai/utils';\nimport { HistoryService } from '@flowgram.ai/history';\nimport {\n WorkflowDocument,\n WorkflowResetLayoutService,\n WorkflowDragService,\n WorkflowOperationBaseService,\n} from '@flowgram.ai/free-layout-core';\nimport { FlowNodeFormData } from '@flowgram.ai/form-core';\nimport { FormManager } from '@flowgram.ai/form-core';\nimport { OperationType } from '@flowgram.ai/document';\nimport { type PluginContext, PositionData } from '@flowgram.ai/core';\n\nimport { DragNodeOperationValue, type FreeHistoryPluginOptions, FreeOperationType } from './types';\nimport { HistoryEntityManager } from './history-entity-manager';\nimport { DragNodesHandler } from './handlers/drag-nodes-handler';\nimport { ChangeNodeDataHandler } from './handlers/change-node-data-handler';\nimport { ChangeContentHandler } from './handlers/change-content-handler';\n\n/**\n * 历史管理\n */\n@injectable()\nexport class FreeHistoryManager {\n @inject(DragNodesHandler)\n private _dragNodesHandler: DragNodesHandler;\n\n @inject(ChangeNodeDataHandler)\n private _changeNodeDataHandler: ChangeNodeDataHandler;\n\n @inject(ChangeContentHandler)\n private _changeContentHandler: ChangeContentHandler;\n\n @inject(HistoryEntityManager)\n private _entityManager: HistoryEntityManager;\n\n @inject(FormManager)\n @optional()\n private _formManager?: FormManager;\n\n private _toDispose: DisposableCollection = new DisposableCollection();\n\n @inject(WorkflowOperationBaseService)\n private _operationService: WorkflowOperationBaseService;\n\n onInit(ctx: PluginContext, opts: FreeHistoryPluginOptions) {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n const historyService = ctx.get<HistoryService>(HistoryService);\n const dragService = ctx.get<WorkflowDragService>(WorkflowDragService);\n\n const resetLayoutService = ctx.get<WorkflowResetLayoutService>(WorkflowResetLayoutService);\n\n if (opts?.limit) {\n historyService.limit(opts.limit);\n }\n historyService.context.source = ctx;\n\n this._toDispose.pushAll([\n dragService.onNodesDrag(async (event) => {\n if (event.type !== 'onDragEnd') {\n return;\n }\n this._dragNodesHandler.handle(event);\n }),\n document.onNodeCreate(({ node, data }) => {\n const positionData = node.getData(PositionData);\n if (positionData) {\n this._entityManager.addEntityData(positionData);\n }\n }),\n this._formManager\n ? this._formManager.onFormModelWillInit(({ model, data }) => {\n const node = model.flowNodeEntity;\n const formData = node.getData<FlowNodeFormData>(FlowNodeFormData);\n\n if (formData) {\n this._entityManager.setValue(formData, cloneDeep(data));\n\n this._toDispose.push(\n formData.onDetailChange((event) => {\n this._changeNodeDataHandler.handle({\n ...event,\n node,\n });\n })\n );\n }\n })\n : Disposable.NULL,\n document.onContentChange((event) => {\n this._changeContentHandler.handle(event, ctx);\n }),\n document.onReload((_event) => {\n historyService.clear();\n }),\n resetLayoutService.onResetLayout((event) => {\n historyService.pushOperation(\n {\n type: FreeOperationType.resetLayout,\n value: {\n ids: event.nodeIds,\n value: event.positionMap,\n oldValue: event.oldPositionMap,\n },\n },\n { noApply: true }\n );\n }),\n this._operationService.onNodeMove(({ node, fromParent, fromIndex, toParent, toIndex }) => {\n historyService.pushOperation(\n {\n type: OperationType.moveChildNodes,\n value: {\n fromParentId: fromParent.id,\n fromIndex,\n nodeIds: [node.id],\n toParentId: toParent.id,\n toIndex,\n },\n },\n {\n noApply: true,\n }\n );\n }),\n this._operationService.onNodePostionUpdate((event) => {\n const value: DragNodeOperationValue = {\n ids: [event.node.id],\n value: [event.newPosition],\n oldValue: [event.oldPosition],\n };\n historyService.pushOperation(\n {\n type: FreeOperationType.dragNodes,\n value,\n },\n {\n noApply: true,\n }\n );\n }),\n ]);\n }\n\n dispose() {\n this._entityManager.dispose();\n this._toDispose.dispose();\n }\n}\n","import { useEffect, useState } from 'react';\n\nimport { useService } from '@flowgram.ai/core';\nimport { HistoryService } from '@flowgram.ai/history';\n\ninterface UndoRedo {\n canUndo: boolean;\n canRedo: boolean;\n undo: () => Promise<void>;\n redo: () => Promise<void>;\n}\n\nexport function useUndoRedo(): UndoRedo {\n const historyService = useService<HistoryService>(HistoryService);\n const [canUndo, setCanUndo] = useState(false);\n const [canRedo, setCanRedo] = useState(false);\n\n useEffect(() => {\n const toDispose = historyService.undoRedoService.onChange(() => {\n setCanUndo(historyService.canUndo());\n setCanRedo(historyService.canRedo());\n });\n return () => {\n toDispose.dispose();\n };\n }, []);\n\n return {\n canUndo,\n canRedo,\n undo: () => historyService.undo(),\n redo: () => historyService.redo(),\n };\n}\n"],"mappings":"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","names":["import_core","import_history","import_inversify","FreeOperationType","import_lodash","import_inversify","import_history","import_inversify","import_inversify","import_history","import_free_layout_core","import_free_layout_core","import_free_layout_core","import_free_layout_core","import_inversify","import_free_layout_core","import_free_layout_core","import_document","import_core","import_free_layout_core","import_core","import_free_layout_core","import_free_layout_core","import_form_core","import_free_layout_core","import_lodash","import_free_layout_core","import_free_layout_core","import_lodash","import_inversify","import_utils","import_history","import_free_layout_core","import_form_core","import_document","import_core","import_core","import_history"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/create-free-history-plugin.ts","../src/history-entity-manager.ts","../src/handlers/drag-nodes-handler.ts","../src/types.ts","../src/handlers/change-node-data-handler.ts","../src/free-history-config.ts","../src/handlers/change-content-handler.ts","../src/changes/delete-node-change.ts","../src/changes/delete-line-change.ts","../src/changes/add-node-change.ts","../src/changes/add-line-change.ts","../src/changes/index.ts","../src/free-history-registers.ts","../src/operation-metas/reset-layout.ts","../src/operation-metas/base.ts","../src/operation-metas/move-child-nodes.ts","../src/operation-metas/drag-nodes.ts","../src/operation-metas/delete-node.ts","../src/operation-metas/delete-line.ts","../src/operation-metas/change-node-data.ts","../src/operation-metas/add-node.ts","../src/operation-metas/add-line.ts","../src/operation-metas/index.ts","../src/free-history-manager.ts","../src/hooks/use-undo-redo.tsx"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport * from './create-free-history-plugin';\nexport * from './types';\nexport * from '@flowgram.ai/history';\nexport * from './free-history-config';\nexport * from './hooks';\nexport * from './free-history-registers';\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { bindContributions, definePluginCreator } from '@flowgram.ai/core';\nimport { HistoryContainerModule, OperationContribution } from '@flowgram.ai/history';\n\nimport { type FreeHistoryPluginOptions } from './types';\nimport { HistoryEntityManager } from './history-entity-manager';\nimport { DragNodesHandler } from './handlers/drag-nodes-handler';\nimport { ChangeNodeDataHandler } from './handlers/change-node-data-handler';\nimport { ChangeContentHandler } from './handlers/change-content-handler';\nimport { FreeHistoryRegisters } from './free-history-registers';\nimport { FreeHistoryManager } from './free-history-manager';\nimport { FreeHistoryConfig } from './free-history-config';\n\nexport const createFreeHistoryPlugin = definePluginCreator<FreeHistoryPluginOptions>({\n onBind: ({ bind }) => {\n bindContributions(bind, FreeHistoryRegisters, [OperationContribution]);\n bind(FreeHistoryConfig).toSelf().inSingletonScope();\n bind(FreeHistoryManager).toSelf().inSingletonScope();\n bind(HistoryEntityManager).toSelf().inSingletonScope();\n bind(DragNodesHandler).toSelf().inSingletonScope();\n bind(ChangeNodeDataHandler).toSelf().inSingletonScope();\n bind(ChangeContentHandler).toSelf().inSingletonScope();\n },\n onInit(ctx, opts): void {\n ctx.get<FreeHistoryConfig>(FreeHistoryConfig).init(ctx, opts);\n\n if (!opts.enable) {\n return;\n }\n ctx.get<FreeHistoryManager>(FreeHistoryManager).onInit(ctx, opts);\n },\n onDispose(ctx) {\n ctx.get<HistoryEntityManager>(HistoryEntityManager).dispose();\n },\n containerModules: [HistoryContainerModule],\n});\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/* eslint-disable @typescript-eslint/naming-convention */\nimport { cloneDeep, isEqual } from 'lodash';\nimport { injectable } from 'inversify';\nimport { type EntityData } from '@flowgram.ai/core';\nimport { type Disposable, DisposableCollection } from '@flowgram.ai/utils';\n\n@injectable()\nexport class HistoryEntityManager implements Disposable {\n private _entityDataValues: Map<EntityData, unknown> = new Map();\n\n private _toDispose: DisposableCollection = new DisposableCollection();\n\n addEntityData(entityData: EntityData) {\n this._entityDataValues.set(entityData, cloneDeep(entityData.toJSON()));\n this._toDispose.push(\n entityData.onWillChange(event => {\n const value = event.toJSON();\n const oldValue = this._entityDataValues.get(entityData);\n if (isEqual(value, oldValue)) {\n return;\n }\n this._entityDataValues.set(entityData, cloneDeep(value));\n }),\n );\n }\n\n getValue(entityData: EntityData) {\n return this._entityDataValues.get(entityData);\n }\n\n setValue(entityData: EntityData, value: unknown) {\n return this._entityDataValues.set(entityData, value);\n }\n\n dispose() {\n this._entityDataValues.clear();\n this._toDispose.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/* eslint-disable @typescript-eslint/naming-convention */\nimport { injectable, inject } from 'inversify';\nimport { HistoryService } from '@flowgram.ai/history';\nimport { type NodesDragEndEvent } from '@flowgram.ai/free-layout-core';\nimport { TransformData } from '@flowgram.ai/core';\n\nimport { FreeOperationType, type IHandler } from '../types';\n\n@injectable()\nexport class DragNodesHandler implements IHandler<NodesDragEndEvent> {\n @inject(HistoryService)\n private _historyService: HistoryService;\n\n handle(event: NodesDragEndEvent) {\n if (event.type === 'onDragEnd') {\n this._dragNode(event);\n }\n }\n\n private _dragNode(event: NodesDragEndEvent) {\n this._historyService.pushOperation(\n {\n type: FreeOperationType.dragNodes,\n value: {\n ids: event.nodes.map((node) => node.id),\n value: event.nodes.map((node) => {\n const { x, y } = node.getData(TransformData).position;\n return {\n x,\n y,\n };\n }),\n oldValue: event.startPositions,\n },\n },\n { noApply: true }\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/* eslint-disable @typescript-eslint/naming-convention */\nimport { type IPoint } from '@flowgram.ai/utils';\nimport { type Operation, type OperationMeta } from '@flowgram.ai/history';\nimport {\n type WorkflowContentChangeType,\n type WorkflowContentChangeEvent,\n type WorkflowLineEntity,\n type WorkflowLinePortInfo,\n type WorkflowNodeJSON,\n type PositionMap,\n} from '@flowgram.ai/free-layout-core';\nimport { type FlowNodeEntity, type FlowNodeJSON } from '@flowgram.ai/document';\nimport { type EntityData, type PluginContext } from '@flowgram.ai/core';\n\nexport enum FreeOperationType {\n addLine = 'addLine',\n deleteLine = 'deleteLine',\n moveNode = 'moveNode',\n addNode = 'addNode',\n deleteNode = 'deleteNode',\n changeNodeData = 'changeNodeData',\n resetLayout = 'resetLayout',\n dragNodes = 'dragNodes',\n moveChildNodes = 'moveChildNodes',\n}\n\nexport interface AddOrDeleteLineOperationValue extends WorkflowLinePortInfo {\n id: string;\n}\n\nexport interface AddOrDeleteWorkflowNodeOperationValue {\n node: WorkflowNodeJSON;\n parentID?: string;\n}\n\nexport interface AddLineOperation extends Operation {\n type: FreeOperationType.addLine;\n value: AddOrDeleteLineOperationValue;\n}\n\nexport interface DeleteLineOperation extends Operation {\n type: FreeOperationType.deleteLine;\n value: AddOrDeleteLineOperationValue;\n}\n\nexport interface MoveNodeOperation extends Operation {\n type: FreeOperationType.moveNode;\n value: MoveNodeOperationValue;\n}\n\nexport interface AddWorkflowNodeOperation extends Operation {\n type: FreeOperationType.addNode;\n value: AddOrDeleteWorkflowNodeOperationValue;\n}\n\nexport interface DeleteWorkflowNodeOperation extends Operation {\n type: FreeOperationType.deleteNode;\n value: AddOrDeleteWorkflowNodeOperationValue;\n}\n\nexport interface MoveNodeOperationValue {\n id: string;\n value: {\n x: number;\n y: number;\n };\n oldValue: {\n x: number;\n y: number;\n };\n}\n\nexport interface DragNodeOperationValue {\n ids: string[];\n value: IPoint[];\n oldValue: IPoint[];\n}\n\nexport interface ResetLayoutOperationValue {\n ids: string[];\n value: PositionMap;\n oldValue: PositionMap;\n}\n\nexport interface ContentChangeTypeToOperation<T extends Operation> {\n type: WorkflowContentChangeType;\n toOperation: (event: WorkflowContentChangeEvent, ctx: PluginContext) => T | undefined;\n}\n\nexport interface EntityDataType {\n type: FreeOperationType;\n toEntityData: (node: FlowNodeEntity, ctx: PluginContext) => EntityData;\n}\n\nexport interface ChangeNodeDataValue {\n id: string;\n value: unknown;\n oldValue: unknown;\n path: string;\n}\n\nexport interface ChangeNodeDataOperation extends Operation {\n type: FreeOperationType.changeNodeData;\n value: ChangeNodeDataValue;\n}\n\n/**\n * 将node转成json\n */\nexport type NodeToJson = (node: FlowNodeEntity) => FlowNodeJSON;\n/**\n * 将line转成json\n */\nexport type LineToJson = (node: WorkflowLineEntity) => FlowNodeJSON;\n/**\n * 根据节点id获取label\n */\nexport type GetNodeLabelById = (id: string) => string;\n/**\n * 根据节点获取label\n */\nexport type GetNodeLabel = (node: FlowNodeJSON) => string;\n/**\n * 根据分支获取label\n */\nexport type GetBlockLabel = (node: FlowNodeJSON) => string;\n/**\n * 根据节点获取URI\n */\nexport type GetNodeURI = (id: string) => string | any;\n/**\n * 根据连线获取URI\n */\nexport type GetLineURI = (id: string) => string | any;\n\n/**\n * 插件配置\n */\nexport interface FreeHistoryPluginOptions {\n enable?: boolean;\n limit?: number;\n nodeToJSON?: (ctx: PluginContext) => NodeToJson;\n getNodeLabelById?: (ctx: PluginContext) => GetNodeLabelById;\n getNodeLabel?: (ctx: PluginContext) => GetNodeLabel;\n getBlockLabel?: (ctx: PluginContext) => GetBlockLabel;\n getNodeURI?: (ctx: PluginContext) => GetNodeURI;\n getLineURI?: (ctx: PluginContext) => GetLineURI;\n operationMetas?: OperationMeta[];\n enableChangeNode?: boolean;\n uri?: string | any;\n}\n\nexport interface IHandler<E> {\n handle: (event: E, ctx: PluginContext) => void | Promise<void>;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/* eslint-disable @typescript-eslint/naming-convention */\nimport { cloneDeep, get, isEqual, set } from 'lodash';\nimport { injectable, inject } from 'inversify';\nimport { FlowNodeFormData, type DetailChangeEvent } from '@flowgram.ai/form-core';\nimport { type FlowNodeEntity } from '@flowgram.ai/document';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { HistoryService } from '@flowgram.ai/history';\n\nimport { FreeOperationType, type IHandler } from '../types';\nimport { HistoryEntityManager } from '../history-entity-manager';\nimport { FreeHistoryConfig } from '../free-history-config';\n\nexport interface ChangeNodeDataEvent extends DetailChangeEvent {\n node: FlowNodeEntity;\n}\n\n@injectable()\nexport class ChangeNodeDataHandler implements IHandler<ChangeNodeDataEvent> {\n @inject(HistoryService)\n private _historyService: HistoryService;\n\n @inject(WorkflowDocument) document: WorkflowDocument;\n\n @inject(HistoryEntityManager)\n private _entityManager: HistoryEntityManager;\n\n @inject(FreeHistoryConfig)\n private _config: FreeHistoryConfig;\n\n handle(event: ChangeNodeDataEvent) {\n const { path, value, initialized, node } = event;\n const formData = node.getData<FlowNodeFormData>(FlowNodeFormData);\n const oldValue = this._entityManager.getValue(formData) as object;\n const propPath = path.split('/').filter(Boolean).join('.');\n\n const propOldValue = propPath ? get(oldValue, propPath) : oldValue;\n if (isEqual(value, propOldValue)) {\n return;\n }\n\n if (initialized) {\n let operationPath = path;\n let operationValue = cloneDeep(value);\n let operationOldValue = propOldValue;\n // 只存储一层的数据,因为formModel无法获取数组下的某项的值\n if (path !== '/') {\n const clonedOldValue = cloneDeep(oldValue);\n set(clonedOldValue, propPath, value);\n operationPath = path.split('/').filter(Boolean)[0];\n operationValue = get(clonedOldValue, operationPath);\n operationOldValue = get(oldValue, operationPath);\n }\n\n this._historyService.pushOperation(\n {\n type: FreeOperationType.changeNodeData,\n value: {\n id: node.id,\n path: operationPath,\n value: operationValue,\n oldValue: operationOldValue,\n },\n uri: this._config.getNodeURI(node.id),\n },\n { noApply: true },\n );\n }\n\n if (propPath) {\n set(oldValue, propPath, cloneDeep(value));\n } else {\n this._entityManager.setValue(formData, cloneDeep(value));\n }\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable } from 'inversify';\nimport { type FlowNodeEntity, type FlowNodeJSON } from '@flowgram.ai/document';\nimport { type PluginContext } from '@flowgram.ai/core';\n\nimport {\n type FreeHistoryPluginOptions,\n type GetBlockLabel,\n type GetLineURI,\n type GetNodeLabel,\n type GetNodeLabelById,\n type GetNodeURI,\n type NodeToJson,\n} from './types';\n\n@injectable()\nexport class FreeHistoryConfig {\n init(ctx: PluginContext, options: FreeHistoryPluginOptions) {\n this.enable = !!options?.enable;\n\n if (options.nodeToJSON) {\n this.nodeToJSON = options.nodeToJSON(ctx);\n }\n\n if (options.getNodeLabelById) {\n this.getNodeLabelById = options.getNodeLabelById(ctx);\n }\n\n if (options.getNodeLabel) {\n this.getNodeLabel = options.getNodeLabel(ctx);\n }\n\n if (options.getBlockLabel) {\n this.getBlockLabel = options.getBlockLabel(ctx);\n }\n\n if (options.getNodeURI) {\n this.getNodeURI = options.getNodeURI(ctx);\n }\n\n if (options.getLineURI) {\n this.getLineURI = options.getLineURI(ctx);\n }\n }\n\n enable = false;\n\n nodeToJSON: NodeToJson = (node: FlowNodeEntity) => node.toJSON();\n\n getNodeLabelById: GetNodeLabelById = (id: string) => id;\n\n getNodeLabel: GetNodeLabel = (node: FlowNodeJSON) => node.id;\n\n getBlockLabel: GetBlockLabel = (node: FlowNodeJSON) => node.id;\n\n getNodeURI: GetNodeURI = (id: string) => `node:${id}`;\n\n getLineURI: GetLineURI = (id: string) => `line:${id}`;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/* eslint-disable @typescript-eslint/naming-convention */\nimport { injectable, inject } from 'inversify';\nimport { HistoryService, Operation } from '@flowgram.ai/history';\nimport { type WorkflowContentChangeEvent } from '@flowgram.ai/free-layout-core';\nimport { type PluginContext } from '@flowgram.ai/core';\n\nimport { type IHandler } from '../types';\nimport changes from '../changes';\n\n@injectable()\nexport class ChangeContentHandler implements IHandler<WorkflowContentChangeEvent> {\n @inject(HistoryService)\n private _historyService: HistoryService;\n\n handle(event: WorkflowContentChangeEvent, ctx: PluginContext) {\n if (!this._historyService.undoRedoService.canPush()) {\n return;\n }\n\n const change = changes.find((c) => c.type === event.type);\n if (!change) {\n return;\n }\n const operation: Operation | undefined = change.toOperation(event, ctx);\n if (!operation) {\n return;\n }\n\n this._historyService.pushOperation(operation, { noApply: true });\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { WorkflowContentChangeType } from '@flowgram.ai/free-layout-core';\nimport { type FlowNodeEntity } from '@flowgram.ai/document';\n\nimport {\n type ContentChangeTypeToOperation,\n FreeOperationType,\n type DeleteWorkflowNodeOperation,\n} from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\n\nexport const deleteNodeChange: ContentChangeTypeToOperation<DeleteWorkflowNodeOperation> = {\n type: WorkflowContentChangeType.DELETE_NODE,\n toOperation: (event, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const node = event.entity as FlowNodeEntity;\n const json = event.toJSON();\n const parentID = node.parent?.id;\n\n return {\n type: FreeOperationType.deleteNode,\n value: {\n node: json,\n parentID,\n },\n uri: config.getNodeURI(node.id),\n };\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type WorkflowLineEntity } from '@flowgram.ai/free-layout-core';\nimport { WorkflowContentChangeType } from '@flowgram.ai/free-layout-core';\n\nimport {\n type AddOrDeleteLineOperationValue,\n type ContentChangeTypeToOperation,\n type DeleteLineOperation,\n FreeOperationType,\n} from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\n\nexport const deleteLineChange: ContentChangeTypeToOperation<DeleteLineOperation> = {\n type: WorkflowContentChangeType.DELETE_LINE,\n toOperation: (event, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const line = event.entity as WorkflowLineEntity;\n const value: AddOrDeleteLineOperationValue = {\n from: line.info.from,\n to: line.info.to || '',\n fromPort: line.info.fromPort || '',\n toPort: line.info.toPort || '',\n id: line.id,\n };\n return {\n type: FreeOperationType.deleteLine,\n value,\n uri: config.getNodeURI(line.id),\n };\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { WorkflowDocument, type WorkflowNodeJSON } from '@flowgram.ai/free-layout-core';\nimport { WorkflowContentChangeType } from '@flowgram.ai/free-layout-core';\nimport { type FlowNodeEntity } from '@flowgram.ai/document';\n\nimport {\n type AddWorkflowNodeOperation,\n type ContentChangeTypeToOperation,\n FreeOperationType,\n} from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\n\nexport const addNodeChange: ContentChangeTypeToOperation<AddWorkflowNodeOperation> = {\n type: WorkflowContentChangeType.ADD_NODE,\n toOperation: (event, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n const node = event.entity as FlowNodeEntity;\n const parentID = node.parent?.id;\n const json: WorkflowNodeJSON = document.toNodeJSON(node);\n\n return {\n type: FreeOperationType.addNode,\n value: {\n node: json,\n parentID,\n },\n uri: config.getNodeURI(node.id),\n };\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type WorkflowLineEntity } from '@flowgram.ai/free-layout-core';\nimport { WorkflowContentChangeType } from '@flowgram.ai/free-layout-core';\n\nimport {\n type AddLineOperation,\n type AddOrDeleteLineOperationValue,\n type ContentChangeTypeToOperation,\n FreeOperationType,\n} from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\n\nexport const addLineChange: ContentChangeTypeToOperation<AddLineOperation> = {\n type: WorkflowContentChangeType.ADD_LINE,\n toOperation: (event, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const line = event.entity as WorkflowLineEntity;\n const value: AddOrDeleteLineOperationValue = {\n from: line.info.from,\n to: line.info.to || '',\n fromPort: line.info.fromPort || '',\n toPort: line.info.toPort || '',\n id: line.id,\n };\n return {\n type: FreeOperationType.addLine,\n value,\n uri: config.getLineURI(line.id),\n };\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { deleteNodeChange } from './delete-node-change';\nimport { deleteLineChange } from './delete-line-change';\nimport { addNodeChange } from './add-node-change';\nimport { addLineChange } from './add-line-change';\n\nexport default [addLineChange, deleteLineChange, addNodeChange, deleteNodeChange];\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable } from 'inversify';\nimport { type OperationContribution, type OperationRegistry } from '@flowgram.ai/history';\n\nimport { operationMetas } from './operation-metas';\n\n@injectable()\nexport class FreeHistoryRegisters implements OperationContribution {\n registerOperationMeta(operationRegistry: OperationRegistry): void {\n operationMetas.forEach(operationMeta => {\n operationRegistry.registerOperationMeta(operationMeta);\n });\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type PluginContext } from '@flowgram.ai/core';\nimport { WorkflowResetLayoutService } from '@flowgram.ai/free-layout-core';\nimport { type OperationMeta } from '@flowgram.ai/history';\n\nimport { FreeOperationType, type ResetLayoutOperationValue } from '../types';\nimport { baseOperationMeta } from './base';\n\nexport const resetLayoutOperationMeta: OperationMeta<\n ResetLayoutOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: FreeOperationType.resetLayout,\n inverse: op => ({\n ...op,\n value: {\n ...op.value,\n value: op.value.oldValue,\n oldValue: op.value.value,\n },\n }),\n apply: async (operation, ctx: PluginContext) => {\n const reset = ctx.get<WorkflowResetLayoutService>(WorkflowResetLayoutService);\n await reset.layoutToPositions(operation.value.ids, operation.value.value);\n },\n shouldMerge: () => false,\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type OperationMeta } from '@flowgram.ai/history';\n\nexport const baseOperationMeta: Partial<OperationMeta> = {\n shouldMerge: (_op, prev, element) => {\n if (!prev) {\n return false;\n }\n\n if (\n // 合并500ms内的操作, 如删除节点会联动删除线条\n Date.now() - element.getTimestamp() <\n 500\n ) {\n return true;\n }\n return false;\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { OperationMeta } from '@flowgram.ai/history';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { MoveChildNodesOperationValue, OperationType } from '@flowgram.ai/document';\nimport { FlowNodeBaseType } from '@flowgram.ai/document';\nimport { PluginContext, TransformData } from '@flowgram.ai/core';\n\nimport { baseOperationMeta } from './base';\n\nexport const moveChildNodesOperationMeta: OperationMeta<\n MoveChildNodesOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: OperationType.moveChildNodes,\n inverse: (op) => ({\n ...op,\n value: {\n ...op.value,\n fromIndex: op.value.toIndex,\n toIndex: op.value.fromIndex,\n fromParentId: op.value.toParentId,\n toParentId: op.value.fromParentId,\n },\n }),\n apply: (operation, ctx: PluginContext) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n document.moveChildNodes(operation.value);\n const fromContainer = document.getNode(operation.value.fromParentId);\n requestAnimationFrame(() => {\n if (fromContainer && fromContainer.flowNodeType !== FlowNodeBaseType.ROOT) {\n const fromContainerTransformData = fromContainer.getData(TransformData);\n fromContainerTransformData.fireChange();\n }\n });\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type OperationMeta } from '@flowgram.ai/history';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { type PluginContext, TransformData } from '@flowgram.ai/core';\n\nimport { type DragNodeOperationValue, FreeOperationType } from '../types';\nimport { baseOperationMeta } from './base';\n\nexport const dragNodesOperationMeta: OperationMeta<DragNodeOperationValue, PluginContext, void> = {\n ...baseOperationMeta,\n type: FreeOperationType.dragNodes,\n inverse: (op) => ({\n ...op,\n value: {\n ...op.value,\n value: op.value.oldValue,\n oldValue: op.value.value,\n },\n }),\n apply: (operation, ctx) => {\n operation.value.ids.forEach((id, index) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n const node = document.getNode(id);\n if (!node) {\n return;\n }\n\n const transform = node.getData(TransformData);\n const point = operation.value.value[index];\n transform.update({\n position: {\n x: point.x,\n y: point.y,\n },\n });\n document.layout.updateAffectedTransform(node);\n });\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type PluginContext } from '@flowgram.ai/core';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { type OperationMeta } from '@flowgram.ai/history';\n\nimport { type AddOrDeleteWorkflowNodeOperationValue, FreeOperationType } from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\nimport { baseOperationMeta } from './base';\n\nexport const deleteNodeOperationMeta: OperationMeta<\n AddOrDeleteWorkflowNodeOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: FreeOperationType.deleteNode,\n inverse: op => ({\n ...op,\n type: FreeOperationType.addNode,\n }),\n apply: (operation, ctx: PluginContext) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n const node = document.getNode(operation.value.node.id);\n if (node) {\n node.dispose();\n }\n },\n getLabel: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n return `Delete Node ${config.getNodeLabel(op.value.node)}`;\n },\n getDescription: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n let desc = `Delete Node ${config.getNodeLabel(op.value.node)}`;\n if (op.value.node.meta?.position) {\n desc += ` at ${op.value.node.meta.position.x},${op.value.node.meta.position.y}`;\n }\n return desc;\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type OperationMeta } from '@flowgram.ai/history';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { type PluginContext } from '@flowgram.ai/core';\n\nimport { type AddOrDeleteLineOperationValue, FreeOperationType } from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\nimport { baseOperationMeta } from './base';\n\nexport const deleteLineOperationMeta: OperationMeta<\n AddOrDeleteLineOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: FreeOperationType.deleteLine,\n inverse: (op) => ({\n ...op,\n type: FreeOperationType.addLine,\n }),\n apply: (operation, ctx: PluginContext) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n document.removeNode(operation.value.id);\n },\n getLabel: (op, ctx) => 'Delete Line',\n getDescription: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const { value } = op;\n if (!value.from || !value.to) {\n return 'Delete Line';\n }\n\n const fromName = config.getNodeLabelById(value.from);\n const toName = config.getNodeLabelById(value.to);\n return `Delete Line from ${fromName} to ${toName}`;\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { FlowNodeFormData } from '@flowgram.ai/form-core';\nimport { type PluginContext } from '@flowgram.ai/core';\nimport { WorkflowDocument } from '@flowgram.ai/free-layout-core';\nimport { type OperationMeta } from '@flowgram.ai/history';\n\nimport { FreeOperationType, type ChangeNodeDataValue } from '../types';\nimport { baseOperationMeta } from './base';\n\nexport const changeNodeDataOperationMeta: OperationMeta<ChangeNodeDataValue, PluginContext, void> =\n {\n ...baseOperationMeta,\n type: FreeOperationType.changeNodeData,\n inverse: op => ({\n ...op,\n value: {\n ...op.value,\n value: op.value.oldValue,\n oldValue: op.value.value,\n },\n }),\n apply: (operation, ctx: PluginContext) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n const node = document.getNode(operation.value.id);\n\n if (!node) {\n return;\n }\n const formData = node.getData(FlowNodeFormData);\n\n if (!formData) {\n return;\n }\n\n let { path } = operation.value;\n if (path.endsWith('/') && path !== '/') {\n path = path.slice(0, -1);\n }\n\n if (!path.startsWith('/')) {\n path = `/${path}`;\n }\n\n const formItem = formData.formModel.getFormItemByPath(path);\n\n if (!formItem) {\n return;\n }\n formItem.value = operation.value.value;\n },\n shouldMerge: (op, prev, element) => {\n if (!prev) {\n return false;\n }\n\n if (Date.now() - element.getTimestamp() < 500) {\n if (\n op.type === prev.type && // 相同类型\n op.value.id === prev.value.id && // 相同节点\n op.value?.path === prev.value?.path // 相同路径\n ) {\n return {\n type: op.type,\n value: {\n ...op.value,\n value: op.value.value,\n oldValue: prev.value.oldValue,\n },\n };\n }\n return true;\n }\n return false;\n },\n };\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { cloneDeep } from 'lodash';\nimport { type PluginContext } from '@flowgram.ai/core';\nimport { WorkflowDocument, type WorkflowNodeJSON } from '@flowgram.ai/free-layout-core';\nimport { type OperationMeta } from '@flowgram.ai/history';\n\nimport { type AddOrDeleteWorkflowNodeOperationValue, FreeOperationType } from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\nimport { baseOperationMeta } from './base';\n\nexport const addNodeOperationMeta: OperationMeta<\n AddOrDeleteWorkflowNodeOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: FreeOperationType.addNode,\n inverse: op => ({\n ...op,\n type: FreeOperationType.deleteNode,\n }),\n apply: async (operation, ctx: PluginContext) => {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n await document.createWorkflowNode(\n cloneDeep(operation.value.node) as WorkflowNodeJSON,\n false,\n operation.value.parentID,\n );\n },\n getLabel: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n return `Create Node ${config.getNodeLabel(op.value.node)}`;\n },\n getDescription: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n let desc = `Create Node ${config.getNodeLabel(op.value.node)}`;\n if (op.value.node.meta?.position) {\n desc += ` at ${op.value.node.meta.position.x},${op.value.node.meta.position.y}`;\n }\n return desc;\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type PluginContext } from '@flowgram.ai/core';\nimport { WorkflowLinesManager } from '@flowgram.ai/free-layout-core';\nimport { type OperationMeta } from '@flowgram.ai/history';\n\nimport { type AddOrDeleteLineOperationValue, FreeOperationType } from '../types';\nimport { FreeHistoryConfig } from '../free-history-config';\nimport { baseOperationMeta } from './base';\n\nexport const addLineOperationMeta: OperationMeta<\n AddOrDeleteLineOperationValue,\n PluginContext,\n void\n> = {\n ...baseOperationMeta,\n type: FreeOperationType.addLine,\n inverse: op => ({\n ...op,\n type: FreeOperationType.deleteLine,\n }),\n apply: (operation, ctx: PluginContext) => {\n const linesManager = ctx.get<WorkflowLinesManager>(WorkflowLinesManager);\n linesManager.createLine({\n ...operation.value,\n key: operation.value.id,\n });\n },\n getLabel: (op, ctx) => 'Create Line',\n getDescription: (op, ctx) => {\n const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);\n const { value } = op;\n if (!value.from || !value.to) {\n return 'Create Line';\n }\n\n const fromName = config.getNodeLabelById(value.from);\n const toName = config.getNodeLabelById(value.to);\n return `Create Line from ${fromName} to ${toName}`;\n },\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { resetLayoutOperationMeta } from './reset-layout';\nimport { moveChildNodesOperationMeta } from './move-child-nodes';\nimport { dragNodesOperationMeta } from './drag-nodes';\nimport { deleteNodeOperationMeta } from './delete-node';\nimport { deleteLineOperationMeta } from './delete-line';\nimport { changeNodeDataOperationMeta } from './change-node-data';\nimport { addNodeOperationMeta } from './add-node';\nimport { addLineOperationMeta } from './add-line';\n\nexport const operationMetas = [\n addLineOperationMeta,\n deleteLineOperationMeta,\n addNodeOperationMeta,\n deleteNodeOperationMeta,\n changeNodeDataOperationMeta,\n resetLayoutOperationMeta,\n dragNodesOperationMeta,\n moveChildNodesOperationMeta,\n];\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/* eslint-disable @typescript-eslint/naming-convention */\nimport { cloneDeep } from 'lodash';\nimport { injectable, inject, optional } from 'inversify';\nimport { DisposableCollection, Disposable } from '@flowgram.ai/utils';\nimport { HistoryService } from '@flowgram.ai/history';\nimport {\n WorkflowDocument,\n WorkflowResetLayoutService,\n WorkflowDragService,\n WorkflowOperationBaseService,\n} from '@flowgram.ai/free-layout-core';\nimport { FlowNodeFormData } from '@flowgram.ai/form-core';\nimport { FormManager } from '@flowgram.ai/form-core';\nimport { OperationType } from '@flowgram.ai/document';\nimport { type PluginContext, PositionData } from '@flowgram.ai/core';\n\nimport { DragNodeOperationValue, type FreeHistoryPluginOptions, FreeOperationType } from './types';\nimport { HistoryEntityManager } from './history-entity-manager';\nimport { DragNodesHandler } from './handlers/drag-nodes-handler';\nimport { ChangeNodeDataHandler } from './handlers/change-node-data-handler';\nimport { ChangeContentHandler } from './handlers/change-content-handler';\n\n/**\n * 历史管理\n */\n@injectable()\nexport class FreeHistoryManager {\n @inject(DragNodesHandler)\n private _dragNodesHandler: DragNodesHandler;\n\n @inject(ChangeNodeDataHandler)\n private _changeNodeDataHandler: ChangeNodeDataHandler;\n\n @inject(ChangeContentHandler)\n private _changeContentHandler: ChangeContentHandler;\n\n @inject(HistoryEntityManager)\n private _entityManager: HistoryEntityManager;\n\n @inject(FormManager)\n @optional()\n private _formManager?: FormManager;\n\n private _toDispose: DisposableCollection = new DisposableCollection();\n\n @inject(WorkflowOperationBaseService)\n private _operationService: WorkflowOperationBaseService;\n\n onInit(ctx: PluginContext, opts: FreeHistoryPluginOptions) {\n const document = ctx.get<WorkflowDocument>(WorkflowDocument);\n const historyService = ctx.get<HistoryService>(HistoryService);\n const dragService = ctx.get<WorkflowDragService>(WorkflowDragService);\n\n const resetLayoutService = ctx.get<WorkflowResetLayoutService>(WorkflowResetLayoutService);\n\n if (opts?.limit) {\n historyService.limit(opts.limit);\n }\n historyService.context.source = ctx;\n\n this._toDispose.pushAll([\n dragService.onNodesDrag(async (event) => {\n if (event.type !== 'onDragEnd') {\n return;\n }\n this._dragNodesHandler.handle(event);\n }),\n document.onNodeCreate(({ node, data }) => {\n const positionData = node.getData(PositionData);\n if (positionData) {\n this._entityManager.addEntityData(positionData);\n }\n }),\n this._formManager\n ? this._formManager.onFormModelWillInit(({ model, data }) => {\n const node = model.flowNodeEntity;\n const formData = node.getData<FlowNodeFormData>(FlowNodeFormData);\n\n if (formData) {\n this._entityManager.setValue(formData, cloneDeep(data));\n\n this._toDispose.push(\n formData.onDetailChange((event) => {\n this._changeNodeDataHandler.handle({\n ...event,\n node,\n });\n })\n );\n }\n })\n : Disposable.NULL,\n document.onContentChange((event) => {\n this._changeContentHandler.handle(event, ctx);\n }),\n document.onReload((_event) => {\n historyService.clear();\n }),\n resetLayoutService.onResetLayout((event) => {\n historyService.pushOperation(\n {\n type: FreeOperationType.resetLayout,\n value: {\n ids: event.nodeIds,\n value: event.positionMap,\n oldValue: event.oldPositionMap,\n },\n },\n { noApply: true }\n );\n }),\n this._operationService.onNodeMove(({ node, fromParent, fromIndex, toParent, toIndex }) => {\n historyService.pushOperation(\n {\n type: OperationType.moveChildNodes,\n value: {\n fromParentId: fromParent.id,\n fromIndex,\n nodeIds: [node.id],\n toParentId: toParent.id,\n toIndex,\n },\n },\n {\n noApply: true,\n }\n );\n }),\n this._operationService.onNodePostionUpdate((event) => {\n const value: DragNodeOperationValue = {\n ids: [event.node.id],\n value: [event.newPosition],\n oldValue: [event.oldPosition],\n };\n historyService.pushOperation(\n {\n type: FreeOperationType.dragNodes,\n value,\n },\n {\n noApply: true,\n }\n );\n }),\n ]);\n }\n\n dispose() {\n this._entityManager.dispose();\n this._toDispose.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useEffect, useState } from 'react';\n\nimport { useService } from '@flowgram.ai/core';\nimport { HistoryService } from '@flowgram.ai/history';\n\ninterface UndoRedo {\n canUndo: boolean;\n canRedo: boolean;\n undo: () => Promise<void>;\n redo: () => Promise<void>;\n}\n\nexport function useUndoRedo(): UndoRedo {\n const historyService = useService<HistoryService>(HistoryService);\n const [canUndo, setCanUndo] = useState(false);\n const [canRedo, setCanRedo] = useState(false);\n\n useEffect(() => {\n const toDispose = historyService.undoRedoService.onChange(() => {\n setCanUndo(historyService.canUndo());\n setCanRedo(historyService.canRedo());\n });\n return () => {\n toDispose.dispose();\n };\n }, []);\n\n return {\n canUndo,\n canRedo,\n undo: () => historyService.undo(),\n redo: () => historyService.redo(),\n };\n}\n"],"mappings":"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","names":["import_core","import_history","import_inversify","FreeOperationType","import_lodash","import_inversify","import_history","import_inversify","import_inversify","import_history","import_free_layout_core","import_free_layout_core","import_free_layout_core","import_free_layout_core","import_inversify","import_free_layout_core","import_free_layout_core","import_document","import_core","import_free_layout_core","import_core","import_free_layout_core","import_free_layout_core","import_form_core","import_free_layout_core","import_lodash","import_free_layout_core","import_free_layout_core","import_lodash","import_inversify","import_utils","import_history","import_free_layout_core","import_form_core","import_document","import_core","import_core","import_history"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flowgram.ai/free-history-plugin",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.17",
|
|
4
4
|
"homepage": "https://flowgram.ai/",
|
|
5
5
|
"repository": "https://github.com/bytedance/flowgram.ai",
|
|
6
6
|
"license": "MIT",
|
|
@@ -19,12 +19,12 @@
|
|
|
19
19
|
"inversify": "^6.0.1",
|
|
20
20
|
"reflect-metadata": "~0.2.2",
|
|
21
21
|
"lodash": "^4.17.21",
|
|
22
|
-
"@flowgram.ai/core": "0.2.
|
|
23
|
-
"@flowgram.ai/document": "0.2.
|
|
24
|
-
"@flowgram.ai/
|
|
25
|
-
"@flowgram.ai/history": "0.2.
|
|
26
|
-
"@flowgram.ai/utils": "0.2.
|
|
27
|
-
"@flowgram.ai/
|
|
22
|
+
"@flowgram.ai/core": "0.2.17",
|
|
23
|
+
"@flowgram.ai/document": "0.2.17",
|
|
24
|
+
"@flowgram.ai/form-core": "0.2.17",
|
|
25
|
+
"@flowgram.ai/history": "0.2.17",
|
|
26
|
+
"@flowgram.ai/utils": "0.2.17",
|
|
27
|
+
"@flowgram.ai/free-layout-core": "0.2.17"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@types/lodash": "^4.14.137",
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
"tsup": "^8.0.1",
|
|
36
36
|
"typescript": "^5.0.4",
|
|
37
37
|
"vitest": "^0.34.6",
|
|
38
|
-
"@flowgram.ai/
|
|
39
|
-
"@flowgram.ai/
|
|
38
|
+
"@flowgram.ai/ts-config": "0.2.17",
|
|
39
|
+
"@flowgram.ai/eslint-config": "0.2.17"
|
|
40
40
|
},
|
|
41
41
|
"peerDependencies": {
|
|
42
42
|
"react": ">=16.8",
|