@tmagic/stage 1.5.0-beta.2 → 1.5.0-beta.3
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/tmagic-stage.js +79 -64
- package/dist/tmagic-stage.umd.cjs +79 -64
- package/package.json +4 -4
- package/src/ActionManager.ts +23 -16
- package/src/DragResizeHelper.ts +20 -18
- package/src/StageCore.ts +58 -53
- package/src/StageDragResize.ts +1 -0
- package/src/StageHighlight.ts +1 -0
- package/types/index.d.ts +6 -6
package/src/StageCore.ts
CHANGED
|
@@ -47,9 +47,9 @@ import type {
|
|
|
47
47
|
*/
|
|
48
48
|
export default class StageCore extends EventEmitter {
|
|
49
49
|
public container?: HTMLDivElement;
|
|
50
|
-
public renderer: StageRender;
|
|
51
|
-
public mask: StageMask;
|
|
52
|
-
public actionManager: ActionManager;
|
|
50
|
+
public renderer: StageRender | null = null;
|
|
51
|
+
public mask: StageMask | null = null;
|
|
52
|
+
public actionManager: ActionManager | null = null;
|
|
53
53
|
|
|
54
54
|
private pageResizeObserver: ResizeObserver | null = null;
|
|
55
55
|
private autoScrollIntoView: boolean | undefined;
|
|
@@ -87,17 +87,18 @@ export default class StageCore extends EventEmitter {
|
|
|
87
87
|
* @param id 选中的id
|
|
88
88
|
*/
|
|
89
89
|
public async select(id: Id, event?: MouseEvent): Promise<void> {
|
|
90
|
-
const el = this.renderer
|
|
91
|
-
if (el === this.actionManager
|
|
90
|
+
const el = this.renderer?.getTargetElement(id) || null;
|
|
91
|
+
if (el === this.actionManager?.getSelectedEl()) return;
|
|
92
92
|
|
|
93
|
-
await this.renderer
|
|
93
|
+
await this.renderer?.select([id]);
|
|
94
94
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
95
|
+
if (el) {
|
|
96
|
+
this.mask?.setLayout(el);
|
|
97
|
+
}
|
|
98
|
+
this.actionManager?.select(el, event);
|
|
98
99
|
|
|
99
100
|
if (el && (this.autoScrollIntoView || el.dataset.autoScrollIntoView)) {
|
|
100
|
-
this.mask
|
|
101
|
+
this.mask?.observerIntersection(el);
|
|
101
102
|
}
|
|
102
103
|
}
|
|
103
104
|
|
|
@@ -106,20 +107,20 @@ export default class StageCore extends EventEmitter {
|
|
|
106
107
|
* @param ids 选中元素的id列表
|
|
107
108
|
*/
|
|
108
109
|
public async multiSelect(ids: Id[]): Promise<void> {
|
|
109
|
-
const els = ids.map((id) => this.renderer
|
|
110
|
+
const els = ids.map((id) => this.renderer?.getTargetElement(id)).filter((el) => Boolean(el));
|
|
110
111
|
if (els.length === 0) return;
|
|
111
112
|
|
|
112
113
|
const lastEl = els[els.length - 1];
|
|
113
114
|
// 是否减少了组件选择
|
|
114
|
-
const isReduceSelect = els.length < this.actionManager
|
|
115
|
-
await this.renderer
|
|
115
|
+
const isReduceSelect = els.length < this.actionManager!.getSelectedElList().length;
|
|
116
|
+
await this.renderer?.select(ids);
|
|
116
117
|
|
|
117
|
-
lastEl && this.mask
|
|
118
|
+
lastEl && this.mask?.setLayout(lastEl);
|
|
118
119
|
|
|
119
|
-
this.actionManager
|
|
120
|
+
this.actionManager?.multiSelect(ids);
|
|
120
121
|
|
|
121
122
|
if (lastEl && (this.autoScrollIntoView || lastEl.dataset.autoScrollIntoView) && !isReduceSelect) {
|
|
122
|
-
this.mask
|
|
123
|
+
this.mask?.observerIntersection(lastEl);
|
|
123
124
|
}
|
|
124
125
|
}
|
|
125
126
|
|
|
@@ -128,11 +129,11 @@ export default class StageCore extends EventEmitter {
|
|
|
128
129
|
* @param el 要高亮的元素
|
|
129
130
|
*/
|
|
130
131
|
public highlight(id: Id): void {
|
|
131
|
-
this.actionManager
|
|
132
|
+
this.actionManager?.highlight(id);
|
|
132
133
|
}
|
|
133
134
|
|
|
134
135
|
public clearHighlight(): void {
|
|
135
|
-
this.actionManager
|
|
136
|
+
this.actionManager?.clearHighlight();
|
|
136
137
|
}
|
|
137
138
|
|
|
138
139
|
/**
|
|
@@ -142,13 +143,13 @@ export default class StageCore extends EventEmitter {
|
|
|
142
143
|
public async update(data: UpdateData): Promise<void> {
|
|
143
144
|
const { config } = data;
|
|
144
145
|
|
|
145
|
-
await this.renderer
|
|
146
|
+
await this.renderer?.update(data);
|
|
146
147
|
// 通过setTimeout等画布中组件完成渲染更新
|
|
147
148
|
setTimeout(() => {
|
|
148
|
-
const el = this.renderer
|
|
149
|
-
if (el && this.actionManager
|
|
149
|
+
const el = this.renderer?.getTargetElement(`${config.id}`);
|
|
150
|
+
if (el && this.actionManager?.isSelectedEl(el)) {
|
|
150
151
|
// 更新了组件的布局,需要重新设置mask是否可以滚动
|
|
151
|
-
this.mask
|
|
152
|
+
this.mask?.setLayout(el);
|
|
152
153
|
// 组件有更新,需要set
|
|
153
154
|
this.actionManager.setSelectedEl(el);
|
|
154
155
|
this.actionManager.updateMoveable(el);
|
|
@@ -161,7 +162,7 @@ export default class StageCore extends EventEmitter {
|
|
|
161
162
|
* @param data 组件信息数据
|
|
162
163
|
*/
|
|
163
164
|
public async add(data: UpdateData): Promise<void> {
|
|
164
|
-
return await this.renderer
|
|
165
|
+
return await this.renderer?.add(data);
|
|
165
166
|
}
|
|
166
167
|
|
|
167
168
|
/**
|
|
@@ -169,11 +170,11 @@ export default class StageCore extends EventEmitter {
|
|
|
169
170
|
* @param data 组件信息数据
|
|
170
171
|
*/
|
|
171
172
|
public async remove(data: RemoveData): Promise<void> {
|
|
172
|
-
return await this.renderer
|
|
173
|
+
return await this.renderer?.remove(data);
|
|
173
174
|
}
|
|
174
175
|
|
|
175
176
|
public setZoom(zoom: number = DEFAULT_ZOOM): void {
|
|
176
|
-
this.renderer
|
|
177
|
+
this.renderer?.setZoom(zoom);
|
|
177
178
|
}
|
|
178
179
|
|
|
179
180
|
/**
|
|
@@ -184,8 +185,8 @@ export default class StageCore extends EventEmitter {
|
|
|
184
185
|
this.container = el;
|
|
185
186
|
const { mask, renderer } = this;
|
|
186
187
|
|
|
187
|
-
await renderer
|
|
188
|
-
mask
|
|
188
|
+
await renderer?.mount(el);
|
|
189
|
+
mask?.mount(el);
|
|
189
190
|
|
|
190
191
|
this.emit('mounted');
|
|
191
192
|
}
|
|
@@ -194,8 +195,8 @@ export default class StageCore extends EventEmitter {
|
|
|
194
195
|
* 清空所有参考线
|
|
195
196
|
*/
|
|
196
197
|
public clearGuides() {
|
|
197
|
-
this.mask
|
|
198
|
-
this.actionManager
|
|
198
|
+
this.mask?.clearGuides();
|
|
199
|
+
this.actionManager?.clearGuides();
|
|
199
200
|
}
|
|
200
201
|
|
|
201
202
|
/**
|
|
@@ -216,23 +217,23 @@ export default class StageCore extends EventEmitter {
|
|
|
216
217
|
* @returns timeoutId,调用方在鼠标移走时要取消该timeout,阻止标记
|
|
217
218
|
*/
|
|
218
219
|
public delayedMarkContainer(event: MouseEvent, excludeElList: Element[] = []): NodeJS.Timeout | undefined {
|
|
219
|
-
return this.actionManager
|
|
220
|
+
return this.actionManager?.delayedMarkContainer(event, excludeElList);
|
|
220
221
|
}
|
|
221
222
|
|
|
222
223
|
public getMoveableOption<K extends keyof MoveableOptions>(key: K): MoveableOptions[K] | undefined {
|
|
223
|
-
return this.actionManager
|
|
224
|
+
return this.actionManager?.getMoveableOption(key);
|
|
224
225
|
}
|
|
225
226
|
|
|
226
227
|
public getDragStatus() {
|
|
227
|
-
return this.actionManager
|
|
228
|
+
return this.actionManager?.getDragStatus();
|
|
228
229
|
}
|
|
229
230
|
|
|
230
231
|
public disableMultiSelect() {
|
|
231
|
-
this.actionManager
|
|
232
|
+
this.actionManager?.disableMultiSelect();
|
|
232
233
|
}
|
|
233
234
|
|
|
234
235
|
public enableMultiSelect() {
|
|
235
|
-
this.actionManager
|
|
236
|
+
this.actionManager?.enableMultiSelect();
|
|
236
237
|
}
|
|
237
238
|
|
|
238
239
|
/**
|
|
@@ -241,14 +242,18 @@ export default class StageCore extends EventEmitter {
|
|
|
241
242
|
public destroy(): void {
|
|
242
243
|
const { mask, renderer, actionManager, pageResizeObserver } = this;
|
|
243
244
|
|
|
244
|
-
renderer
|
|
245
|
-
mask
|
|
246
|
-
actionManager
|
|
245
|
+
renderer?.destroy();
|
|
246
|
+
mask?.destroy();
|
|
247
|
+
actionManager?.destroy();
|
|
247
248
|
pageResizeObserver?.disconnect();
|
|
248
249
|
|
|
249
250
|
this.removeAllListeners();
|
|
250
251
|
|
|
251
252
|
this.container = undefined;
|
|
253
|
+
this.renderer = null;
|
|
254
|
+
this.mask = null;
|
|
255
|
+
this.actionManager = null;
|
|
256
|
+
this.pageResizeObserver = null;
|
|
252
257
|
}
|
|
253
258
|
|
|
254
259
|
public on<Name extends keyof CoreEvents, Param extends CoreEvents[Name]>(
|
|
@@ -272,8 +277,8 @@ export default class StageCore extends EventEmitter {
|
|
|
272
277
|
|
|
273
278
|
if (typeof ResizeObserver !== 'undefined') {
|
|
274
279
|
this.pageResizeObserver = new ResizeObserver((entries) => {
|
|
275
|
-
this.mask
|
|
276
|
-
this.actionManager
|
|
280
|
+
this.mask?.pageResize(entries);
|
|
281
|
+
this.actionManager?.updateMoveable();
|
|
277
282
|
});
|
|
278
283
|
|
|
279
284
|
this.pageResizeObserver.observe(page);
|
|
@@ -286,26 +291,26 @@ export default class StageCore extends EventEmitter {
|
|
|
286
291
|
containerHighlightDuration: config.containerHighlightDuration,
|
|
287
292
|
containerHighlightType: config.containerHighlightType,
|
|
288
293
|
moveableOptions: config.moveableOptions,
|
|
289
|
-
container: this.mask
|
|
294
|
+
container: this.mask!.content,
|
|
290
295
|
disabledDragStart: config.disabledDragStart,
|
|
291
296
|
disabledMultiSelect: config.disabledMultiSelect,
|
|
292
297
|
canSelect: config.canSelect,
|
|
293
298
|
isContainer: config.isContainer,
|
|
294
299
|
updateDragEl: config.updateDragEl,
|
|
295
300
|
getRootContainer: () => this.container,
|
|
296
|
-
getRenderDocument: () => this.renderer
|
|
297
|
-
getTargetElement: (id: Id) => this.renderer
|
|
298
|
-
getElementsFromPoint: (point: Point) => this.renderer
|
|
301
|
+
getRenderDocument: () => this.renderer!.getDocument(),
|
|
302
|
+
getTargetElement: (id: Id) => this.renderer!.getTargetElement(id),
|
|
303
|
+
getElementsFromPoint: (point: Point) => this.renderer!.getElementsFromPoint(point),
|
|
299
304
|
};
|
|
300
305
|
|
|
301
306
|
return actionManagerConfig;
|
|
302
307
|
}
|
|
303
308
|
|
|
304
309
|
private initRenderEvent(): void {
|
|
305
|
-
this.renderer
|
|
310
|
+
this.renderer?.on('runtime-ready', (runtime: Runtime) => {
|
|
306
311
|
this.emit('runtime-ready', runtime);
|
|
307
312
|
});
|
|
308
|
-
this.renderer
|
|
313
|
+
this.renderer?.on('page-el-update', (el: HTMLElement) => {
|
|
309
314
|
this.mask?.observe(el);
|
|
310
315
|
this.observePageResize(el);
|
|
311
316
|
|
|
@@ -314,8 +319,8 @@ export default class StageCore extends EventEmitter {
|
|
|
314
319
|
}
|
|
315
320
|
|
|
316
321
|
private initMaskEvent(): void {
|
|
317
|
-
this.mask
|
|
318
|
-
this.actionManager
|
|
322
|
+
this.mask?.on('change-guides', (data: GuidesEventData) => {
|
|
323
|
+
this.actionManager?.setGuidelines(data.type, data.guides);
|
|
319
324
|
this.emit('change-guides', data);
|
|
320
325
|
});
|
|
321
326
|
}
|
|
@@ -336,7 +341,7 @@ export default class StageCore extends EventEmitter {
|
|
|
336
341
|
*/
|
|
337
342
|
private initActionManagerEvent(): void {
|
|
338
343
|
this.actionManager
|
|
339
|
-
|
|
344
|
+
?.on('before-select', (el: HTMLElement, event?: MouseEvent) => {
|
|
340
345
|
const id = getIdFromEl()(el);
|
|
341
346
|
id && this.select(id, event);
|
|
342
347
|
})
|
|
@@ -359,7 +364,7 @@ export default class StageCore extends EventEmitter {
|
|
|
359
364
|
*/
|
|
360
365
|
private initDrEvent(): void {
|
|
361
366
|
this.actionManager
|
|
362
|
-
|
|
367
|
+
?.on('update', (data: UpdateEventData) => {
|
|
363
368
|
this.emit('update', data);
|
|
364
369
|
})
|
|
365
370
|
.on('sort', (data: SortEventData) => {
|
|
@@ -379,11 +384,11 @@ export default class StageCore extends EventEmitter {
|
|
|
379
384
|
private initMulDrEvent(): void {
|
|
380
385
|
this.actionManager
|
|
381
386
|
// 多选切换到单选
|
|
382
|
-
|
|
387
|
+
?.on('change-to-select', (id: Id, e: MouseEvent) => {
|
|
383
388
|
this.select(id);
|
|
384
389
|
// 先保证画布内完成渲染,再通知外部更新
|
|
385
390
|
setTimeout(() => {
|
|
386
|
-
const el = this.renderer
|
|
391
|
+
const el = this.renderer?.getTargetElement(id);
|
|
387
392
|
el && this.emit('select', el, e);
|
|
388
393
|
});
|
|
389
394
|
})
|
|
@@ -396,7 +401,7 @@ export default class StageCore extends EventEmitter {
|
|
|
396
401
|
* 初始化Highlight类通过ActionManager抛出来的事件监听
|
|
397
402
|
*/
|
|
398
403
|
private initHighlightEvent(): void {
|
|
399
|
-
this.actionManager
|
|
404
|
+
this.actionManager?.on('highlight', (highlightEl: HTMLElement) => {
|
|
400
405
|
this.emit('highlight', highlightEl);
|
|
401
406
|
});
|
|
402
407
|
}
|
|
@@ -406,7 +411,7 @@ export default class StageCore extends EventEmitter {
|
|
|
406
411
|
*/
|
|
407
412
|
private initMouseEvent(): void {
|
|
408
413
|
this.actionManager
|
|
409
|
-
|
|
414
|
+
?.on('mousemove', (event: MouseEvent) => {
|
|
410
415
|
this.emit('mousemove', event);
|
|
411
416
|
})
|
|
412
417
|
.on('mouseleave', (event: MouseEvent) => {
|
package/src/StageDragResize.ts
CHANGED
package/src/StageHighlight.ts
CHANGED
package/types/index.d.ts
CHANGED
|
@@ -406,7 +406,7 @@ interface MultiDrEvents {
|
|
|
406
406
|
*/
|
|
407
407
|
declare class ActionManager extends EventEmitter {
|
|
408
408
|
private dr;
|
|
409
|
-
private multiDr
|
|
409
|
+
private multiDr;
|
|
410
410
|
private highlightLayer;
|
|
411
411
|
/** 单选、多选、高亮的容器(蒙层的content) */
|
|
412
412
|
private container;
|
|
@@ -502,7 +502,7 @@ declare class ActionManager extends EventEmitter {
|
|
|
502
502
|
* @returns timeoutId,调用方在鼠标移走时要取消该timeout,阻止标记
|
|
503
503
|
*/
|
|
504
504
|
delayedMarkContainer(event: MouseEvent, excludeElList?: Element[]): NodeJS.Timeout | undefined;
|
|
505
|
-
getDragStatus(): StageDragStatus;
|
|
505
|
+
getDragStatus(): StageDragStatus | undefined;
|
|
506
506
|
destroy(): void;
|
|
507
507
|
on<Name extends keyof ActionManagerEvents, Param extends ActionManagerEvents[Name]>(eventName: Name, listener: (...args: Param) => void): this;
|
|
508
508
|
emit<Name extends keyof ActionManagerEvents, Param extends ActionManagerEvents[Name]>(eventName: Name, ...args: Param): boolean;
|
|
@@ -720,9 +720,9 @@ declare class StageRender extends EventEmitter$1 {
|
|
|
720
720
|
*/
|
|
721
721
|
declare class StageCore extends EventEmitter$1 {
|
|
722
722
|
container?: HTMLDivElement;
|
|
723
|
-
renderer: StageRender;
|
|
724
|
-
mask: StageMask;
|
|
725
|
-
actionManager: ActionManager;
|
|
723
|
+
renderer: StageRender | null;
|
|
724
|
+
mask: StageMask | null;
|
|
725
|
+
actionManager: ActionManager | null;
|
|
726
726
|
private pageResizeObserver;
|
|
727
727
|
private autoScrollIntoView;
|
|
728
728
|
private customizedRender?;
|
|
@@ -781,7 +781,7 @@ declare class StageCore extends EventEmitter$1 {
|
|
|
781
781
|
*/
|
|
782
782
|
delayedMarkContainer(event: MouseEvent, excludeElList?: Element[]): NodeJS.Timeout | undefined;
|
|
783
783
|
getMoveableOption<K extends keyof MoveableOptions>(key: K): MoveableOptions[K] | undefined;
|
|
784
|
-
getDragStatus(): StageDragStatus;
|
|
784
|
+
getDragStatus(): StageDragStatus | undefined;
|
|
785
785
|
disableMultiSelect(): void;
|
|
786
786
|
enableMultiSelect(): void;
|
|
787
787
|
/**
|