Skip to content

Commit 01a3149

Browse files
committed
feat: add control content change event #940
1 parent cd42514 commit 01a3149

File tree

20 files changed

+143
-1
lines changed

20 files changed

+143
-1
lines changed

docs/en/guide/eventbus.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,16 @@ Usage:
9090
instance.eventBus.on('controlChange', (payload: IControlChangeResult) => void)
9191
```
9292

93+
## controlContentChange
94+
95+
Feature: The control content changes
96+
97+
Usage:
98+
99+
```javascript
100+
instance.eventBus.on('controlContentChange', (payload: IControlContentChangeResult) => void)
101+
```
102+
93103
## pageModeChange
94104

95105
Feature: The page mode changes

docs/en/guide/listener.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,18 @@ Usage:
8383
instance.listener.controlChange = (payload: IControlChangeResult) => {}
8484
```
8585

86+
## controlContentChange
87+
88+
Feature: The control content changes
89+
90+
Usage:
91+
92+
```javascript
93+
instance.listener.controlContentChange = (
94+
payload: IControlContentChangeResult
95+
) => {}
96+
```
97+
8698
## pageModeChange
8799

88100
Feature: The page mode changes

docs/guide/eventbus.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,16 @@ instance.eventBus.on('contentChange', () => void)
9090
instance.eventBus.on('controlChange', (payload: IControlChangeResult) => void)
9191
```
9292

93+
## controlContentChange
94+
95+
功能:控件内容发生改变
96+
97+
用法:
98+
99+
```javascript
100+
instance.eventBus.on('controlContentChange', (payload: IControlContentChangeResult) => void)
101+
```
102+
93103
## pageModeChange
94104

95105
功能:页面模式发生改变

docs/guide/listener.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,18 @@ instance.listener.contentChange = () => {}
8383
instance.listener.controlChange = (payload: IControlChangeResult) => {}
8484
```
8585

86+
## controlContentChange
87+
88+
功能:控件内容发生改变
89+
90+
用法:
91+
92+
```javascript
93+
instance.listener.controlContentChange = (
94+
payload: IControlContentChangeResult
95+
) => {}
96+
```
97+
8698
## pageModeChange
8799

88100
功能:页面模式发生改变

src/editor/core/draw/Draw.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -688,6 +688,7 @@ export class Draw {
688688
curIndex = activeControl.setValue(payload, undefined, {
689689
isIgnoreDisabledRule: true
690690
})
691+
this.control.emitControlContentChange()
691692
} else {
692693
const elementList = this.getElementList()
693694
const isCollapsed = startIndex === endIndex

src/editor/core/draw/control/Control.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ import { ElementType } from '../../../dataset/enum/Element'
88
import { DeepRequired } from '../../../interface/Common'
99
import {
1010
IControl,
11+
IControlChangeOption,
1112
IControlChangeResult,
13+
IControlContentChangeResult,
1214
IControlContext,
1315
IControlHighlight,
1416
IControlInitOption,
@@ -477,6 +479,39 @@ export class Control {
477479
}
478480
}
479481

482+
public emitControlContentChange(options?: IControlChangeOption) {
483+
const isSubscribeControlContentChange = this.eventBus.isSubscribe(
484+
'controlContentChange'
485+
)
486+
if (
487+
!isSubscribeControlContentChange &&
488+
!this.listener.controlContentChange
489+
) {
490+
return
491+
}
492+
const controlElement =
493+
options?.controlElement || this.activeControl?.getElement()
494+
if (!controlElement) return
495+
const controlValue =
496+
options?.controlValue || this.getControlElementList(options?.context)
497+
let control: IControl
498+
if (controlValue?.length) {
499+
control = zipElementList(controlValue)[0].control!
500+
} else {
501+
control = controlElement.control!
502+
control.value = []
503+
}
504+
if (!control) return
505+
const payload: IControlContentChangeResult = {
506+
control,
507+
controlId: controlElement.controlId!
508+
}
509+
this.listener.controlContentChange?.(payload)
510+
if (isSubscribeControlContentChange) {
511+
this.eventBus.emit('controlContentChange', payload)
512+
}
513+
}
514+
480515
public reAwakeControl() {
481516
if (!this.activeControl) return
482517
const elementList = this.getElementList()
@@ -940,6 +975,10 @@ export class Control {
940975
text.clearValue(controlContext, controlRule)
941976
}
942977
}
978+
// 控件值变更事件
979+
this.emitControlContentChange({
980+
context: controlContext
981+
})
943982
// 模拟控件激活后销毁
944983
this.activeControl = null
945984
// 修改后控件结束索引

src/editor/core/draw/control/checkbox/CheckboxControl.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,9 @@ export class CheckboxControl implements IControlInstance {
128128
curIndex: startIndex,
129129
isSetCursor: false
130130
})
131+
this.control.emitControlContentChange({
132+
context
133+
})
131134
}
132135

133136
public keydown(evt: KeyboardEvent): number | null {

src/editor/core/draw/control/date/DateControl.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,9 @@ export class DateControl implements IControlInstance {
227227
this.control.repaintControl({
228228
curIndex: newIndex
229229
})
230+
this.control.emitControlContentChange({
231+
context
232+
})
230233
this.destroy()
231234
}
232235
}

src/editor/core/draw/control/radio/RadioControl.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,5 +61,8 @@ export class RadioControl extends CheckboxControl {
6161
curIndex: startIndex,
6262
isSetCursor: false
6363
})
64+
this.control.emitControlContentChange({
65+
context
66+
})
6467
}
6568
}

src/editor/core/draw/control/select/SelectControl.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,9 @@ export class SelectControl implements IControlInstance {
354354
this.control.repaintControl({
355355
curIndex: prefixIndex
356356
})
357+
this.control.emitControlContentChange({
358+
controlValue: []
359+
})
357360
}
358361
}
359362
return
@@ -409,6 +412,9 @@ export class SelectControl implements IControlInstance {
409412
this.control.repaintControl({
410413
curIndex: newIndex
411414
})
415+
this.control.emitControlContentChange({
416+
context
417+
})
412418
if (!isMultiSelect) {
413419
this.destroy()
414420
}

src/editor/core/event/handlers/cut.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export function cut(host: CanvasEvent) {
3737
let curIndex: number
3838
if (control.getActiveControl() && control.getIsRangeWithinControl()) {
3939
curIndex = control.cut()
40+
control.emitControlContentChange()
4041
} else {
4142
draw.spliceElementList(elementList, start + 1, end - start)
4243
curIndex = start

src/editor/core/event/handlers/input.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ export function input(data: string, host: CanvasEvent) {
8787
let curIndex: number
8888
if (control.getActiveControl() && control.getIsRangeWithinControl()) {
8989
curIndex = control.setValue(inputData)
90+
if (!isComposing) {
91+
control.emitControlContentChange()
92+
}
9093
} else {
9194
const start = startIndex + 1
9295
if (startIndex !== endIndex) {

src/editor/core/event/handlers/keydown/backspace.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ export function backspace(evt: KeyboardEvent, host: CanvasEvent) {
3333
) {
3434
// 光标在控件内
3535
curIndex = control.keydown(evt)
36+
if (curIndex) {
37+
control.emitControlContentChange()
38+
}
3639
} else {
3740
// 普通元素删除
3841
const position = draw.getPosition()

src/editor/core/event/handlers/keydown/delete.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ export function del(evt: KeyboardEvent, host: CanvasEvent) {
3030
} else if (control.getActiveControl() && control.getIsRangeWithinControl()) {
3131
// 光标在控件内
3232
curIndex = control.keydown(evt)
33+
if (curIndex) {
34+
control.emitControlContentChange()
35+
}
3336
} else if (elementList[endIndex + 1]?.controlId) {
3437
// 光标在控件前
3538
curIndex = control.removeControl(endIndex + 1)

src/editor/core/event/handlers/keydown/enter.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ export function enter(evt: KeyboardEvent, host: CanvasEvent) {
7979
let curIndex: number
8080
if (activeControl && control.getIsRangeWithinControl()) {
8181
curIndex = control.setValue([enterText])
82+
control.emitControlContentChange()
8283
} else {
8384
const position = draw.getPosition()
8485
const cursorPosition = position.getCursorPosition()

src/editor/core/event/handlers/mouseup.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,18 @@ export function mouseup(evt: MouseEvent, host: CanvasEvent) {
297297
draw.render({
298298
isSetCursor: false
299299
})
300+
// 控件值变更回调
301+
if (activeControl) {
302+
control.emitControlContentChange()
303+
} else if (cacheStartElement.controlId) {
304+
control.emitControlContentChange({
305+
context: {
306+
range: cacheRange,
307+
elementList: cacheElementList
308+
},
309+
controlElement: cacheStartElement
310+
})
311+
}
300312
// 拖拽后渲染图片工具
301313
if (imgElement) {
302314
if (

src/editor/core/listener/Listener.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {
22
IContentChange,
33
IControlChange,
4+
IControlContentChange,
45
IIntersectionPageNoChange,
56
IPageModeChange,
67
IPageScaleChange,
@@ -20,6 +21,7 @@ export class Listener {
2021
public saved: ISaved | null
2122
public contentChange: IContentChange | null
2223
public controlChange: IControlChange | null
24+
public controlContentChange: IControlContentChange | null
2325
public pageModeChange: IPageModeChange | null
2426
public zoneChange: IZoneChange | null
2527

@@ -32,6 +34,7 @@ export class Listener {
3234
this.saved = null
3335
this.contentChange = null
3436
this.controlChange = null
37+
this.controlContentChange = null
3538
this.pageModeChange = null
3639
this.zoneChange = null
3740
}

src/editor/interface/Control.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,12 @@ export type IRepaintControlOption = Pick<
186186
'curIndex' | 'isCompute' | 'isSubmitHistory' | 'isSetCursor'
187187
>
188188

189+
export interface IControlChangeOption {
190+
context?: IControlContext
191+
controlElement?: IElement
192+
controlValue?: IElement[]
193+
}
194+
189195
export interface INextControlContext {
190196
positionContext: IPositionContext
191197
nextIndex: number
@@ -212,6 +218,11 @@ export interface IControlChangeResult {
212218
controlId: string
213219
}
214220

221+
export interface IControlContentChangeResult {
222+
control: IControl
223+
controlId: string
224+
}
225+
215226
export interface IDestroyControlOption {
216227
isEmitEvent?: boolean
217228
}

src/editor/interface/EventBus.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {
22
IContentChange,
33
IControlChange,
4+
IControlContentChange,
45
IIntersectionPageNoChange,
56
IMouseEventChange,
67
IPageModeChange,
@@ -22,6 +23,7 @@ export interface EventBusMap {
2223
saved: ISaved
2324
contentChange: IContentChange
2425
controlChange: IControlChange
26+
controlContentChange: IControlContentChange
2527
pageModeChange: IPageModeChange
2628
zoneChange: IZoneChange
2729
mousemove: IMouseEventChange

src/editor/interface/Listener.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
TitleLevel
88
} from '..'
99
import { RowFlex } from '../dataset/enum/Row'
10-
import { IControlChangeResult } from './Control'
10+
import { IControlChangeResult, IControlContentChangeResult } from './Control'
1111
import { IEditorResult } from './Editor'
1212
import { IPositionContext } from './Position'
1313
import { ITextDecoration } from './Text'
@@ -52,6 +52,10 @@ export type IContentChange = () => void
5252

5353
export type IControlChange = (payload: IControlChangeResult) => void
5454

55+
export type IControlContentChange = (
56+
payload: IControlContentChangeResult
57+
) => void
58+
5559
export type IPageModeChange = (payload: PageMode) => void
5660

5761
export type IZoneChange = (payload: EditorZone) => void

0 commit comments

Comments
 (0)