mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2025-12-11 18:42:56 +00:00
fix(prop): emit event when unset prop
This commit is contained in:
parent
dfe6878028
commit
e3a19896d7
@ -353,7 +353,6 @@ export class Prop implements IProp, IPropParent {
|
|||||||
@action
|
@action
|
||||||
setValue(val: IPublicTypeCompositeValue) {
|
setValue(val: IPublicTypeCompositeValue) {
|
||||||
if (val === this._value) return;
|
if (val === this._value) return;
|
||||||
const editor = this.owner.document?.designer.editor;
|
|
||||||
const oldValue = this._value;
|
const oldValue = this._value;
|
||||||
this._value = val;
|
this._value = val;
|
||||||
this._code = null;
|
this._code = null;
|
||||||
@ -386,22 +385,31 @@ export class Prop implements IProp, IPropParent {
|
|||||||
this.setupItems();
|
this.setupItems();
|
||||||
|
|
||||||
if (oldValue !== this._value) {
|
if (oldValue !== this._value) {
|
||||||
const propsInfo = {
|
this.emitChange({ oldValue });
|
||||||
key: this.key,
|
|
||||||
prop: this,
|
|
||||||
oldValue,
|
|
||||||
newValue: this._value,
|
|
||||||
};
|
|
||||||
|
|
||||||
editor?.eventBus.emit(GlobalEvent.Node.Prop.InnerChange, {
|
|
||||||
node: this.owner as any,
|
|
||||||
...propsInfo,
|
|
||||||
});
|
|
||||||
|
|
||||||
this.owner?.emitPropChange?.(propsInfo);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
emitChange = ({
|
||||||
|
oldValue,
|
||||||
|
}: {
|
||||||
|
oldValue: IPublicTypeCompositeValue | UNSET;
|
||||||
|
}) => {
|
||||||
|
const editor = this.owner.document?.designer.editor;
|
||||||
|
const propsInfo = {
|
||||||
|
key: this.key,
|
||||||
|
prop: this,
|
||||||
|
oldValue,
|
||||||
|
newValue: this.type === 'unset' ? undefined : this._value,
|
||||||
|
};
|
||||||
|
|
||||||
|
editor?.eventBus.emit(GlobalEvent.Node.Prop.InnerChange, {
|
||||||
|
node: this.owner as any,
|
||||||
|
...propsInfo,
|
||||||
|
});
|
||||||
|
|
||||||
|
this.owner?.emitPropChange?.(propsInfo);
|
||||||
|
};
|
||||||
|
|
||||||
getValue(): IPublicTypeCompositeValue {
|
getValue(): IPublicTypeCompositeValue {
|
||||||
return this.export(IPublicEnumTransformStage.Serilize);
|
return this.export(IPublicEnumTransformStage.Serilize);
|
||||||
}
|
}
|
||||||
@ -462,7 +470,12 @@ export class Prop implements IProp, IPropParent {
|
|||||||
*/
|
*/
|
||||||
@action
|
@action
|
||||||
unset() {
|
unset() {
|
||||||
this._type = 'unset';
|
if (this._type !== 'unset') {
|
||||||
|
this._type = 'unset';
|
||||||
|
this.emitChange({
|
||||||
|
oldValue: this._value,
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import { Editor, engineConfig } from '@alilc/lowcode-editor-core';
|
|||||||
import { Designer } from '../../../../src/designer/designer';
|
import { Designer } from '../../../../src/designer/designer';
|
||||||
import { DocumentModel } from '../../../../src/document/document-model';
|
import { DocumentModel } from '../../../../src/document/document-model';
|
||||||
import { Prop, isProp, isValidArrayIndex } from '../../../../src/document/node/props/prop';
|
import { Prop, isProp, isValidArrayIndex } from '../../../../src/document/node/props/prop';
|
||||||
import { IPublicEnumTransformStage } from '@alilc/lowcode-types';
|
import { GlobalEvent, IPublicEnumTransformStage } from '@alilc/lowcode-types';
|
||||||
import { shellModelFactory } from '../../../../../engine/src/modules/shell-model-factory';
|
import { shellModelFactory } from '../../../../../engine/src/modules/shell-model-factory';
|
||||||
|
|
||||||
const slotNodeImportMockFn = jest.fn();
|
const slotNodeImportMockFn = jest.fn();
|
||||||
@ -24,9 +24,16 @@ const mockOwner = {
|
|||||||
remove: slotNodeRemoveMockFn,
|
remove: slotNodeRemoveMockFn,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
designer: {},
|
designer: {
|
||||||
|
editor: {
|
||||||
|
eventBus: {
|
||||||
|
emit: jest.fn(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
isInited: true,
|
isInited: true,
|
||||||
|
emitPropChange: jest.fn(),
|
||||||
};
|
};
|
||||||
|
|
||||||
const mockPropsInst = {
|
const mockPropsInst = {
|
||||||
@ -564,3 +571,98 @@ describe('其他导出函数', () => {
|
|||||||
expect(isValidArrayIndex('2', 1)).toBeFalsy();
|
expect(isValidArrayIndex('2', 1)).toBeFalsy();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('setValue with event', () => {
|
||||||
|
let propInstance;
|
||||||
|
let mockEmitChange;
|
||||||
|
let mockEventBusEmit;
|
||||||
|
let mockEmitPropChange;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
// Initialize the instance of your class
|
||||||
|
propInstance = new Prop(mockPropsInst, true, 'stringProp');;
|
||||||
|
|
||||||
|
// Mock necessary methods and properties
|
||||||
|
mockEmitChange = jest.spyOn(propInstance, 'emitChange');
|
||||||
|
propInstance.owner = {
|
||||||
|
document: {
|
||||||
|
designer: {
|
||||||
|
editor: {
|
||||||
|
eventBus: {
|
||||||
|
emit: jest.fn(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
emitPropChange: jest.fn(),
|
||||||
|
};
|
||||||
|
mockEventBusEmit = jest.spyOn(propInstance.owner.document.designer.editor.eventBus, 'emit');
|
||||||
|
mockEmitPropChange = jest.spyOn(propInstance.owner, 'emitPropChange');
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
jest.restoreAllMocks();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should correctly handle string values and emit changes', () => {
|
||||||
|
const oldValue = propInstance._value;
|
||||||
|
const newValue = 'new string value';
|
||||||
|
|
||||||
|
propInstance.setValue(newValue);
|
||||||
|
|
||||||
|
const expectedPartialPropsInfo = expect.objectContaining({
|
||||||
|
key: propInstance.key,
|
||||||
|
newValue, // You can specifically test only certain keys
|
||||||
|
oldValue,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(propInstance.getValue()).toBe(newValue);
|
||||||
|
expect(propInstance.type).toBe('literal');
|
||||||
|
expect(mockEmitChange).toHaveBeenCalledWith({ oldValue });
|
||||||
|
expect(mockEventBusEmit).toHaveBeenCalledWith(GlobalEvent.Node.Prop.InnerChange, expectedPartialPropsInfo);
|
||||||
|
expect(mockEmitPropChange).toHaveBeenCalledWith(expectedPartialPropsInfo);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle object values and set type to map', () => {
|
||||||
|
const oldValue = propInstance._value;
|
||||||
|
const newValue = 234;
|
||||||
|
|
||||||
|
const expectedPartialPropsInfo = expect.objectContaining({
|
||||||
|
key: propInstance.key,
|
||||||
|
newValue, // You can specifically test only certain keys
|
||||||
|
oldValue,
|
||||||
|
});
|
||||||
|
|
||||||
|
propInstance.setValue(newValue);
|
||||||
|
|
||||||
|
expect(propInstance.getValue()).toEqual(newValue);
|
||||||
|
expect(propInstance.type).toBe('literal');
|
||||||
|
expect(mockEmitChange).toHaveBeenCalledWith({ oldValue });
|
||||||
|
expect(mockEventBusEmit).toHaveBeenCalledWith(GlobalEvent.Node.Prop.InnerChange, expectedPartialPropsInfo);
|
||||||
|
expect(mockEmitPropChange).toHaveBeenCalledWith(expectedPartialPropsInfo);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should has event when unset call', () => {
|
||||||
|
const oldValue = propInstance._value;
|
||||||
|
|
||||||
|
propInstance.unset();
|
||||||
|
|
||||||
|
const expectedPartialPropsInfo = expect.objectContaining({
|
||||||
|
key: propInstance.key,
|
||||||
|
newValue: undefined, // You can specifically test only certain keys
|
||||||
|
oldValue,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(propInstance.getValue()).toEqual(undefined);
|
||||||
|
expect(propInstance.type).toBe('unset');
|
||||||
|
expect(mockEmitChange).toHaveBeenCalledWith({
|
||||||
|
oldValue,
|
||||||
|
newValue: undefined,
|
||||||
|
});
|
||||||
|
expect(mockEventBusEmit).toHaveBeenCalledWith(GlobalEvent.Node.Prop.InnerChange, expectedPartialPropsInfo);
|
||||||
|
expect(mockEmitPropChange).toHaveBeenCalledWith(expectedPartialPropsInfo);
|
||||||
|
|
||||||
|
propInstance.unset();
|
||||||
|
expect(mockEmitChange).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user