@tmagic/editor 1.0.0-beta.13 → 1.0.0-beta.16

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.
Files changed (101) hide show
  1. package/coverage/clover.xml +703 -601
  2. package/coverage/coverage-final.json +35 -33
  3. package/coverage/lcov-report/index.html +56 -56
  4. package/coverage/lcov-report/src/Editor.vue.html +1 -1
  5. package/coverage/lcov-report/{layouts/sidebar/LayerMenu.vue.html → src/components/ContentMenu.vue.html} +137 -95
  6. package/coverage/lcov-report/src/components/Icon.vue.html +5 -5
  7. package/coverage/lcov-report/src/components/ScrollViewer.vue.html +1 -1
  8. package/coverage/lcov-report/src/components/ToolButton.vue.html +180 -63
  9. package/coverage/lcov-report/src/components/index.html +34 -19
  10. package/coverage/lcov-report/src/index.html +1 -1
  11. package/coverage/lcov-report/src/layouts/AddPageBox.vue.html +1 -1
  12. package/coverage/lcov-report/src/layouts/Framework.vue.html +13 -13
  13. package/coverage/lcov-report/src/layouts/NavMenu.vue.html +1 -1
  14. package/coverage/lcov-report/src/layouts/PropsPanel.vue.html +1 -1
  15. package/coverage/lcov-report/src/layouts/Resizer.vue.html +1 -1
  16. package/coverage/lcov-report/src/layouts/index.html +15 -15
  17. package/coverage/lcov-report/src/layouts/sidebar/ComponentListPanel.vue.html +78 -12
  18. package/coverage/lcov-report/src/layouts/sidebar/LayerMenu.vue.html +149 -92
  19. package/coverage/lcov-report/src/layouts/sidebar/LayerPanel.vue.html +43 -121
  20. package/coverage/lcov-report/src/layouts/sidebar/Sidebar.vue.html +23 -140
  21. package/coverage/lcov-report/{utils/undo-redo.ts.html → src/layouts/sidebar/TabPane.vue.html} +94 -118
  22. package/coverage/lcov-report/src/layouts/sidebar/index.html +64 -49
  23. package/coverage/lcov-report/src/layouts/workspace/PageBar.vue.html +99 -12
  24. package/coverage/lcov-report/src/layouts/workspace/Stage.vue.html +86 -95
  25. package/coverage/lcov-report/src/layouts/workspace/ViewerMenu.vue.html +208 -97
  26. package/coverage/lcov-report/src/layouts/workspace/Workspace.vue.html +3 -3
  27. package/coverage/lcov-report/src/layouts/workspace/index.html +35 -35
  28. package/coverage/lcov-report/src/services/BaseService.ts.html +11 -11
  29. package/coverage/lcov-report/src/services/componentList.ts.html +1 -1
  30. package/coverage/lcov-report/src/services/editor.ts.html +103 -10
  31. package/coverage/lcov-report/src/services/events.ts.html +1 -1
  32. package/coverage/lcov-report/src/services/history.ts.html +29 -8
  33. package/coverage/lcov-report/src/services/index.html +25 -25
  34. package/coverage/lcov-report/src/services/props.ts.html +4 -7
  35. package/coverage/lcov-report/src/services/ui.ts.html +1 -1
  36. package/coverage/lcov-report/src/type.ts.html +8 -14
  37. package/coverage/lcov-report/src/utils/compose.ts.html +4 -4
  38. package/coverage/lcov-report/src/utils/config.ts.html +1 -1
  39. package/coverage/lcov-report/src/utils/editor.ts.html +2 -2
  40. package/coverage/lcov-report/src/utils/index.html +1 -1
  41. package/coverage/lcov-report/src/utils/index.ts.html +1 -1
  42. package/coverage/lcov-report/src/utils/logger.ts.html +1 -1
  43. package/coverage/lcov-report/src/utils/props.ts.html +59 -2
  44. package/coverage/lcov-report/src/utils/scroll-viewer.ts.html +1 -1
  45. package/coverage/lcov-report/src/utils/undo-redo.ts.html +1 -1
  46. package/coverage/lcov.info +1679 -1402
  47. package/dist/style.css +47 -20
  48. package/dist/tmagic-editor.es.js +732 -485
  49. package/dist/tmagic-editor.es.js.map +1 -1
  50. package/dist/tmagic-editor.umd.js +733 -485
  51. package/dist/tmagic-editor.umd.js.map +1 -1
  52. package/dist/types/src/Editor.vue.d.ts +1 -1
  53. package/dist/types/src/components/ToolButton.vue.d.ts +12 -1
  54. package/dist/types/src/fields/UISelect.vue.d.ts +4 -1
  55. package/dist/types/src/index.d.ts +1 -0
  56. package/dist/types/src/layouts/CodeEditor.vue.d.ts +13 -4
  57. package/dist/types/src/layouts/sidebar/ComponentListPanel.vue.d.ts +1 -0
  58. package/dist/types/src/layouts/sidebar/Sidebar.vue.d.ts +2 -3
  59. package/dist/types/src/layouts/sidebar/TabPane.vue.d.ts +14 -0
  60. package/dist/types/src/layouts/workspace/PageBar.vue.d.ts +2 -0
  61. package/dist/types/src/services/history.d.ts +1 -0
  62. package/dist/types/src/services/props.d.ts +2 -2
  63. package/dist/types/src/type.d.ts +6 -8
  64. package/dist/types/src/utils/polyfills.d.ts +0 -0
  65. package/package.json +15 -10
  66. package/src/components/ContentMenu.vue +107 -0
  67. package/src/components/ToolButton.vue +66 -27
  68. package/src/fields/UISelect.vue +14 -6
  69. package/src/index.ts +2 -0
  70. package/src/layouts/CodeEditor.vue +20 -10
  71. package/src/layouts/Framework.vue +6 -6
  72. package/src/layouts/sidebar/ComponentListPanel.vue +23 -1
  73. package/src/layouts/sidebar/LayerMenu.vue +91 -72
  74. package/src/layouts/sidebar/LayerPanel.vue +23 -49
  75. package/src/layouts/sidebar/Sidebar.vue +13 -52
  76. package/src/layouts/sidebar/TabPane.vue +68 -0
  77. package/src/layouts/workspace/PageBar.vue +35 -6
  78. package/src/layouts/workspace/Stage.vue +41 -44
  79. package/src/layouts/workspace/ViewerMenu.vue +104 -67
  80. package/src/layouts/workspace/Workspace.vue +2 -2
  81. package/src/services/editor.ts +33 -2
  82. package/src/services/history.ts +7 -0
  83. package/src/services/props.ts +2 -3
  84. package/src/theme/common/var.scss +1 -0
  85. package/src/theme/component-list-panel.scss +2 -0
  86. package/src/theme/content-menu.scss +33 -26
  87. package/src/theme/layer-panel.scss +1 -1
  88. package/src/theme/nav-menu.scss +6 -2
  89. package/src/theme/page-bar.scss +22 -1
  90. package/src/theme/props-panel.scss +4 -0
  91. package/src/type.ts +6 -8
  92. package/src/utils/editor.ts +1 -1
  93. package/src/utils/polyfills.ts +22 -0
  94. package/src/utils/props.ts +19 -0
  95. package/coverage/lcov-report/Icon.vue.html +0 -172
  96. package/coverage/lcov-report/ToolButton.vue.html +0 -655
  97. package/coverage/lcov-report/layouts/sidebar/index.html +0 -116
  98. package/coverage/lcov-report/utils/index.html +0 -116
  99. package/dist/types/src/layouts/sidebar/LayerPanel.vue.d.ts +0 -980
  100. package/dist/types/src/layouts/workspace/Stage.vue.d.ts +0 -188
  101. package/dist/types/src/layouts/workspace/ViewerMenu.vue.d.ts +0 -18
@@ -23,9 +23,9 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">45.71% </span>
26
+ <span class="strong">46.47% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>32/70</span>
28
+ <span class='fraction'>33/71</span>
29
29
  </div>
30
30
 
31
31
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">49.18% </span>
47
+ <span class="strong">50% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>30/61</span>
49
+ <span class='fraction'>31/62</span>
50
50
  </div>
51
51
 
52
52
 
@@ -245,7 +245,50 @@
245
245
  <a name='L180'></a><a href='#L180'>180</a>
246
246
  <a name='L181'></a><a href='#L181'>181</a>
247
247
  <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
278
+ <span class="cline-any cline-neutral">&nbsp;</span>
279
+ <span class="cline-any cline-neutral">&nbsp;</span>
280
+ <span class="cline-any cline-neutral">&nbsp;</span>
281
+ <span class="cline-any cline-neutral">&nbsp;</span>
282
+ <span class="cline-any cline-neutral">&nbsp;</span>
283
+ <span class="cline-any cline-neutral">&nbsp;</span>
284
+ <span class="cline-any cline-neutral">&nbsp;</span>
285
+ <span class="cline-any cline-neutral">&nbsp;</span>
286
+ <span class="cline-any cline-neutral">&nbsp;</span>
287
+ <span class="cline-any cline-neutral">&nbsp;</span>
288
+ <span class="cline-any cline-neutral">&nbsp;</span>
289
+ <span class="cline-any cline-neutral">&nbsp;</span>
290
+ <span class="cline-any cline-neutral">&nbsp;</span>
291
+ <span class="cline-any cline-neutral">&nbsp;</span>
249
292
  <span class="cline-any cline-neutral">&nbsp;</span>
250
293
  <span class="cline-any cline-neutral">&nbsp;</span>
251
294
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -292,11 +335,23 @@
292
335
  <span class="cline-any cline-neutral">&nbsp;</span>
293
336
  <span class="cline-any cline-neutral">&nbsp;</span>
294
337
  <span class="cline-any cline-yes">2x</span>
338
+ <span class="cline-any cline-neutral">&nbsp;</span>
339
+ <span class="cline-any cline-neutral">&nbsp;</span>
340
+ <span class="cline-any cline-neutral">&nbsp;</span>
341
+ <span class="cline-any cline-neutral">&nbsp;</span>
342
+ <span class="cline-any cline-neutral">&nbsp;</span>
343
+ <span class="cline-any cline-neutral">&nbsp;</span>
344
+ <span class="cline-any cline-neutral">&nbsp;</span>
345
+ <span class="cline-any cline-neutral">&nbsp;</span>
346
+ <span class="cline-any cline-neutral">&nbsp;</span>
347
+ <span class="cline-any cline-neutral">&nbsp;</span>
348
+ <span class="cline-any cline-neutral">&nbsp;</span>
295
349
  <span class="cline-any cline-yes">2x</span>
296
350
  <span class="cline-any cline-neutral">&nbsp;</span>
297
351
  <span class="cline-any cline-neutral">&nbsp;</span>
298
352
  <span class="cline-any cline-yes">2x</span>
299
353
  <span class="cline-any cline-neutral">&nbsp;</span>
354
+ <span class="cline-any cline-yes">2x</span>
300
355
  <span class="cline-any cline-neutral">&nbsp;</span>
301
356
  <span class="cline-any cline-yes">2x</span>
302
357
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -397,6 +452,9 @@
397
452
  <span class="cline-any cline-neutral">&nbsp;</span>
398
453
  <span class="cline-any cline-neutral">&nbsp;</span>
399
454
  <span class="cline-any cline-neutral">&nbsp;</span>
455
+ <span class="cline-any cline-neutral">&nbsp;</span>
456
+ <span class="cline-any cline-neutral">&nbsp;</span>
457
+ <span class="cline-any cline-neutral">&nbsp;</span>
400
458
  <span class="cline-any cline-yes">3x</span>
401
459
  <span class="cline-any cline-neutral">&nbsp;</span>
402
460
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -451,11 +509,25 @@
451
509
  &lt;/slot&gt;
452
510
  &lt;/div&gt;
453
511
  &nbsp;
454
- &lt;el-popover placement="top" :width="160" trigger="hover"&gt;
512
+ &lt;el-popover popper-class="page-bar-popover" placement="top" :width="160" trigger="hover"&gt;
455
513
  &lt;div&gt;
456
514
  &lt;slot name="page-bar-popover" :page="item"&gt;
457
- &lt;div class="magic-editor-content-menu-item" @click="() =&gt; copy(item)"&gt;复制&lt;/div&gt;
458
- &lt;div class="magic-editor-content-menu-item" @click="() =&gt; remove(item)"&gt;删除&lt;/div&gt;
515
+ &lt;tool-button
516
+ :data="{
517
+ type: 'button',
518
+ text: '复制',
519
+ icon: DocumentCopy,
520
+ handler: () =&gt; copy(item),
521
+ }"
522
+ &gt;&lt;/tool-button&gt;
523
+ &lt;tool-button
524
+ :data="{
525
+ type: 'button',
526
+ text: '删除',
527
+ icon: Delete,
528
+ handler: () =&gt; remove(item),
529
+ }"
530
+ &gt;&lt;/tool-button&gt;
459
531
  &lt;/slot&gt;
460
532
  &lt;/div&gt;
461
533
  &lt;template #reference&gt;
@@ -473,12 +545,24 @@
473
545
  &lt;/template&gt;
474
546
  &nbsp;
475
547
  &lt;script lang="ts"&gt;
476
- import { computed, ComputedRef, defineComponent, inject, onMounted, onUnmounted, ref, toRaw, watch } from 'vue';
477
- import { ArrowLeftBold, ArrowRightBold, CaretBottom, Plus } from '@element-plus/icons';
548
+ import {
549
+ computed,
550
+ ComputedRef,
551
+ defineComponent,
552
+ inject,
553
+ markRaw,
554
+ onMounted,
555
+ onUnmounted,
556
+ ref,
557
+ toRaw,
558
+ watch,
559
+ } from 'vue';
560
+ import { ArrowLeftBold, ArrowRightBold, CaretBottom, Delete, DocumentCopy, Plus } from '@element-plus/icons';
478
561
  &nbsp;
479
562
  import type { MApp, MPage } from '@tmagic/schema';
480
563
  import { NodeType } from '@tmagic/schema';
481
564
  &nbsp;
565
+ import ToolButton from '@editor/components/ToolButton.vue';
482
566
  import type { Services } from '@editor/type';
483
567
  import { generatePageNameByApp } from '@editor/utils/editor';
484
568
  &nbsp;
@@ -567,7 +651,7 @@ const useScroll = (root: ComputedRef&lt;MApp | undefined&gt;) =&gt; {
567
651
  };
568
652
  &nbsp;
569
653
  export default defineComponent({
570
- components: { ArrowLeftBold, ArrowRightBold, CaretBottom, Plus },
654
+ components: { ArrowLeftBold, ArrowRightBold, CaretBottom, Plus, ToolButton },
571
655
  &nbsp;
572
656
  setup() {
573
657
  const services = inject&lt;Services&gt;('services');
@@ -576,6 +660,9 @@ export default defineComponent({
576
660
  const root = computed(() =&gt; editorService<span class="branch-0 cbranch-no" title="branch not covered" >?.g</span>et&lt;MApp&gt;('root'));
577
661
  &nbsp;
578
662
  return {
663
+ Delete: markRaw(Delete),
664
+ DocumentCopy: markRaw(DocumentCopy),
665
+ &nbsp;
579
666
  ...useScroll(root),
580
667
  &nbsp;
581
668
  root,
@@ -616,7 +703,7 @@ export default defineComponent({
616
703
  <div class='footer quiet pad2 space-top1 center small'>
617
704
  Code coverage generated by
618
705
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
619
- at Fri Apr 22 2022 12:15:01 GMT+0800 (China Standard Time)
706
+ at Fri May 13 2022 20:42:37 GMT+0800 (China Standard Time)
620
707
  </div>
621
708
  <script src="../../../prettify.js"></script>
622
709
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">45.05% </span>
26
+ <span class="strong">38.94% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>41/91</span>
28
+ <span class='fraction'>37/95</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">14.46% </span>
33
+ <span class="strong">14.28% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>23/159</span>
35
+ <span class='fraction'>25/175</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">32.14% </span>
40
+ <span class="strong">25.92% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>9/28</span>
42
+ <span class='fraction'>7/27</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">46.75% </span>
47
+ <span class="strong">40% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>36/77</span>
49
+ <span class='fraction'>32/80</span>
50
50
  </div>
51
51
 
52
52
 
@@ -287,10 +287,7 @@
287
287
  <a name='L222'></a><a href='#L222'>222</a>
288
288
  <a name='L223'></a><a href='#L223'>223</a>
289
289
  <a name='L224'></a><a href='#L224'>224</a>
290
- <a name='L225'></a><a href='#L225'>225</a>
291
- <a name='L226'></a><a href='#L226'>226</a>
292
- <a name='L227'></a><a href='#L227'>227</a>
293
- <a name='L228'></a><a href='#L228'>228</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
290
+ <a name='L225'></a><a href='#L225'>225</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
294
291
  <span class="cline-any cline-neutral">&nbsp;</span>
295
292
  <span class="cline-any cline-neutral">&nbsp;</span>
296
293
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -311,10 +308,9 @@
311
308
  <span class="cline-any cline-neutral">&nbsp;</span>
312
309
  <span class="cline-any cline-neutral">&nbsp;</span>
313
310
  <span class="cline-any cline-neutral">&nbsp;</span>
314
- <span class="cline-any cline-yes">2x</span>
315
- <span class="cline-any cline-neutral">&nbsp;</span>
316
311
  <span class="cline-any cline-neutral">&nbsp;</span>
317
312
  <span class="cline-any cline-neutral">&nbsp;</span>
313
+ <span class="cline-any cline-yes">2x</span>
318
314
  <span class="cline-any cline-neutral">&nbsp;</span>
319
315
  <span class="cline-any cline-neutral">&nbsp;</span>
320
316
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -324,56 +320,20 @@
324
320
  <span class="cline-any cline-neutral">&nbsp;</span>
325
321
  <span class="cline-any cline-neutral">&nbsp;</span>
326
322
  <span class="cline-any cline-neutral">&nbsp;</span>
327
- <span class="cline-any cline-yes">2x</span>
328
323
  <span class="cline-any cline-neutral">&nbsp;</span>
329
324
  <span class="cline-any cline-neutral">&nbsp;</span>
330
325
  <span class="cline-any cline-neutral">&nbsp;</span>
331
326
  <span class="cline-any cline-yes">2x</span>
332
327
  <span class="cline-any cline-neutral">&nbsp;</span>
333
- <span class="cline-any cline-yes">2x</span>
334
328
  <span class="cline-any cline-neutral">&nbsp;</span>
335
329
  <span class="cline-any cline-neutral">&nbsp;</span>
336
330
  <span class="cline-any cline-yes">2x</span>
337
331
  <span class="cline-any cline-neutral">&nbsp;</span>
338
332
  <span class="cline-any cline-yes">2x</span>
339
333
  <span class="cline-any cline-yes">2x</span>
340
- <span class="cline-any cline-yes">2x</span>
341
334
  <span class="cline-any cline-neutral">&nbsp;</span>
342
- <span class="cline-any cline-neutral">&nbsp;</span>
343
- <span class="cline-any cline-neutral">&nbsp;</span>
344
- <span class="cline-any cline-neutral">&nbsp;</span>
345
- <span class="cline-any cline-neutral">&nbsp;</span>
346
- <span class="cline-any cline-yes">2x</span>
347
335
  <span class="cline-any cline-yes">2x</span>
348
336
  <span class="cline-any cline-neutral">&nbsp;</span>
349
- <span class="cline-any cline-neutral">&nbsp;</span>
350
- <span class="cline-any cline-no">&nbsp;</span>
351
- <span class="cline-any cline-neutral">&nbsp;</span>
352
- <span class="cline-any cline-neutral">&nbsp;</span>
353
- <span class="cline-any cline-neutral">&nbsp;</span>
354
- <span class="cline-any cline-neutral">&nbsp;</span>
355
- <span class="cline-any cline-neutral">&nbsp;</span>
356
- <span class="cline-any cline-yes">2x</span>
357
- <span class="cline-any cline-neutral">&nbsp;</span>
358
- <span class="cline-any cline-neutral">&nbsp;</span>
359
- <span class="cline-any cline-neutral">&nbsp;</span>
360
- <span class="cline-any cline-neutral">&nbsp;</span>
361
- <span class="cline-any cline-no">&nbsp;</span>
362
- <span class="cline-any cline-neutral">&nbsp;</span>
363
- <span class="cline-any cline-no">&nbsp;</span>
364
- <span class="cline-any cline-no">&nbsp;</span>
365
- <span class="cline-any cline-no">&nbsp;</span>
366
- <span class="cline-any cline-no">&nbsp;</span>
367
- <span class="cline-any cline-neutral">&nbsp;</span>
368
- <span class="cline-any cline-no">&nbsp;</span>
369
- <span class="cline-any cline-neutral">&nbsp;</span>
370
- <span class="cline-any cline-neutral">&nbsp;</span>
371
- <span class="cline-any cline-neutral">&nbsp;</span>
372
- <span class="cline-any cline-neutral">&nbsp;</span>
373
- <span class="cline-any cline-neutral">&nbsp;</span>
374
- <span class="cline-any cline-neutral">&nbsp;</span>
375
- <span class="cline-any cline-neutral">&nbsp;</span>
376
- <span class="cline-any cline-neutral">&nbsp;</span>
377
337
  <span class="cline-any cline-yes">2x</span>
378
338
  <span class="cline-any cline-neutral">&nbsp;</span>
379
339
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -407,6 +367,7 @@
407
367
  <span class="cline-any cline-neutral">&nbsp;</span>
408
368
  <span class="cline-any cline-yes">2x</span>
409
369
  <span class="cline-any cline-yes">2x</span>
370
+ <span class="cline-any cline-yes">2x</span>
410
371
  <span class="cline-any cline-neutral">&nbsp;</span>
411
372
  <span class="cline-any cline-yes">2x</span>
412
373
  <span class="cline-any cline-yes">2x</span>
@@ -515,6 +476,39 @@
515
476
  <span class="cline-any cline-neutral">&nbsp;</span>
516
477
  <span class="cline-any cline-neutral">&nbsp;</span>
517
478
  <span class="cline-any cline-neutral">&nbsp;</span>
479
+ <span class="cline-any cline-no">&nbsp;</span>
480
+ <span class="cline-any cline-no">&nbsp;</span>
481
+ <span class="cline-any cline-neutral">&nbsp;</span>
482
+ <span class="cline-any cline-neutral">&nbsp;</span>
483
+ <span class="cline-any cline-neutral">&nbsp;</span>
484
+ <span class="cline-any cline-no">&nbsp;</span>
485
+ <span class="cline-any cline-no">&nbsp;</span>
486
+ <span class="cline-any cline-no">&nbsp;</span>
487
+ <span class="cline-any cline-neutral">&nbsp;</span>
488
+ <span class="cline-any cline-neutral">&nbsp;</span>
489
+ <span class="cline-any cline-neutral">&nbsp;</span>
490
+ <span class="cline-any cline-neutral">&nbsp;</span>
491
+ <span class="cline-any cline-no">&nbsp;</span>
492
+ <span class="cline-any cline-no">&nbsp;</span>
493
+ <span class="cline-any cline-neutral">&nbsp;</span>
494
+ <span class="cline-any cline-no">&nbsp;</span>
495
+ <span class="cline-any cline-no">&nbsp;</span>
496
+ <span class="cline-any cline-neutral">&nbsp;</span>
497
+ <span class="cline-any cline-no">&nbsp;</span>
498
+ <span class="cline-any cline-no">&nbsp;</span>
499
+ <span class="cline-any cline-no">&nbsp;</span>
500
+ <span class="cline-any cline-no">&nbsp;</span>
501
+ <span class="cline-any cline-neutral">&nbsp;</span>
502
+ <span class="cline-any cline-neutral">&nbsp;</span>
503
+ <span class="cline-any cline-neutral">&nbsp;</span>
504
+ <span class="cline-any cline-neutral">&nbsp;</span>
505
+ <span class="cline-any cline-neutral">&nbsp;</span>
506
+ <span class="cline-any cline-neutral">&nbsp;</span>
507
+ <span class="cline-any cline-no">&nbsp;</span>
508
+ <span class="cline-any cline-neutral">&nbsp;</span>
509
+ <span class="cline-any cline-neutral">&nbsp;</span>
510
+ <span class="cline-any cline-neutral">&nbsp;</span>
511
+ <span class="cline-any cline-neutral">&nbsp;</span>
518
512
  <span class="cline-any cline-neutral">&nbsp;</span>
519
513
  <span class="cline-any cline-neutral">&nbsp;</span>
520
514
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">&lt;template&gt;
@@ -528,11 +522,13 @@
528
522
  &lt;div
529
523
  class="m-editor-stage-container"
530
524
  ref="stageContainer"
531
- @contextmenu="contextmenuHandler"
532
525
  :style="`transform: scale(${zoom})`"
526
+ @contextmenu="contextmenuHandler"
527
+ @drop="dropHandler"
528
+ @dragover="dragoverHandler"
533
529
  &gt;&lt;/div&gt;
534
530
  &lt;teleport to="body"&gt;
535
- &lt;viewer-menu ref="menu" :style="menuStyle"&gt;&lt;/viewer-menu&gt;
531
+ &lt;viewer-menu ref="menu"&gt;&lt;/viewer-menu&gt;
536
532
  &lt;/teleport&gt;
537
533
  &lt;/scroll-viewer&gt;
538
534
  &lt;/template&gt;
@@ -558,49 +554,10 @@ import type { MoveableOptions, Runtime, SortEventData, UpdateEventData } from '@
558
554
  import StageCore from '@tmagic/stage';
559
555
  &nbsp;
560
556
  import ScrollViewer from '@editor/components/ScrollViewer.vue';
561
- import type { Services, StageRect } from '@editor/type';
557
+ import { Layout, Services, StageRect } from '@editor/type';
562
558
  &nbsp;
563
559
  import ViewerMenu from './ViewerMenu.vue';
564
560
  &nbsp;
565
- const useMenu = () =&gt; {
566
- const menu = ref&lt;InstanceType&lt;typeof ViewerMenu&gt;&gt;();
567
- const menuStyle = ref({
568
- display: 'none',
569
- left: '0',
570
- top: '0',
571
- });
572
- &nbsp;
573
- onMounted(() =&gt; {
574
- document.addEventListener(
575
- 'click',
576
- <span class="fstat-no" title="function not covered" > () =&gt; {</span>
577
- <span class="cstat-no" title="statement not covered" > menuStyle.</span>value.display = 'none';
578
- },
579
- true,
580
- );
581
- });
582
- &nbsp;
583
- return {
584
- menu,
585
- menuStyle,
586
- &nbsp;
587
- <span class="fstat-no" title="function not covered" > contextmenuHandler(</span>e: MouseEvent) {
588
- <span class="cstat-no" title="statement not covered" > e.</span>preventDefault();
589
- &nbsp;
590
- const menuHeight = <span class="cstat-no" title="statement not covered" >menu.value?.$el.clientHeight;</span>
591
- let top = <span class="cstat-no" title="statement not covered" >e.clientY;</span>
592
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (menuHeight + e.clientY &gt; document.body.clientHeight) {</span>
593
- <span class="cstat-no" title="statement not covered" > top </span>= document.body.clientHeight - menuHeight;
594
- }
595
- <span class="cstat-no" title="statement not covered" > menuStyle.</span>value = {
596
- display: 'block',
597
- top: `${top}px`,
598
- left: `${e.clientX}px`,
599
- };
600
- },
601
- };
602
- };
603
- &nbsp;
604
561
  export default defineComponent({
605
562
  name: 'magic-stage',
606
563
  &nbsp;
@@ -634,12 +591,13 @@ export default defineComponent({
634
591
  &nbsp;
635
592
  const stageWrap = ref&lt;InstanceType&lt;typeof ScrollViewer&gt;&gt;();
636
593
  const stageContainer = ref&lt;HTMLDivElement&gt;();
594
+ const menu = ref&lt;InstanceType&lt;typeof ViewerMenu&gt;&gt;();
637
595
  &nbsp;
638
596
  const stageRect = computed(() =&gt; services?.uiService.get&lt;StageRect&gt;('stageRect'));
639
597
  const uiSelectMode = computed(<span class="fstat-no" title="function not covered" >() =&gt; <span class="cstat-no" title="statement not covered" >s</span>ervices?</span>.uiService.get&lt;boolean&gt;('uiSelectMode'));
640
598
  const root = computed(() =&gt; services?.editorService.get&lt;MApp&gt;('root'));
641
599
  const page = computed(<span class="fstat-no" title="function not covered" >() =&gt; <span class="cstat-no" title="statement not covered" >s</span>ervices?</span>.editorService.get&lt;MPage&gt;('page'));
642
- const zoom = computed(() =&gt; services?.uiService.get&lt;number&gt;('zoom'));
600
+ const zoom = computed(() =&gt; services?.uiService.get&lt;number&gt;('zoom') || 1);
643
601
  const node = computed(<span class="fstat-no" title="function not covered" >() =&gt; <span class="cstat-no" title="statement not covered" >s</span>ervices?</span>.editorService.get&lt;MNode&gt;('node'));
644
602
  &nbsp;
645
603
  let stage: StageCore | null = null;
@@ -737,9 +695,42 @@ export default defineComponent({
737
695
  return {
738
696
  stageWrap,
739
697
  stageContainer,
698
+ menu,
740
699
  stageRect,
741
700
  zoom,
742
- ...useMenu(),
701
+ &nbsp;
702
+ <span class="fstat-no" title="function not covered" > contextmenuHandler(</span>e: MouseEvent) {
703
+ <span class="cstat-no" title="statement not covered" > e.</span>preventDefault();
704
+ <span class="cstat-no" title="statement not covered" > menu.</span>value?.show(e);
705
+ },
706
+ &nbsp;
707
+ <span class="fstat-no" title="function not covered" > dragoverHandler(</span>e: DragEvent) {
708
+ <span class="cstat-no" title="statement not covered" > e.</span>preventDefault();
709
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (e.dataTransfer) {</span>
710
+ <span class="cstat-no" title="statement not covered" > e.</span>dataTransfer.dropEffect = 'move';
711
+ }
712
+ },
713
+ &nbsp;
714
+ <span class="fstat-no" title="function not covered" > async d</span>ropHandler(e: DragEvent) {
715
+ <span class="cstat-no" title="statement not covered" > e.</span>preventDefault();
716
+ if (<span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>e.</span>dataTransfer &amp;&amp; page.value &amp;&amp; stageContainer.value &amp;&amp; stage) {
717
+ // eslint-disable-next-line no-eval
718
+ const <span class="cstat-no" title="statement not covered" >config </span>= eval(`(${e.dataTransfer.getData('data')})`);
719
+ const <span class="cstat-no" title="statement not covered" >layout </span>= <span class="cstat-no" title="statement not covered" >await s</span>ervices?.editorService.getLayout(page.value);
720
+ &nbsp;
721
+ const <span class="cstat-no" title="statement not covered" >containerRect </span>= stageContainer.value.getBoundingClientRect();
722
+ const <span class="cstat-no" title="statement not covered" >{ s</span>crollTop, scrollLeft } = stage.mask;
723
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (layout === Layout.ABSOLUTE) {</span>
724
+ <span class="cstat-no" title="statement not covered" > config.</span>style = {
725
+ position: 'absolute',
726
+ top: e.clientY - containerRect.top + scrollTop,
727
+ left: e.clientX - containerRect.left + scrollLeft,
728
+ };
729
+ }
730
+ &nbsp;
731
+ <span class="cstat-no" title="statement not covered" > services?</span>.editorService.add(config, page.value);
732
+ }
733
+ },
743
734
  };
744
735
  },
745
736
  });
@@ -751,7 +742,7 @@ export default defineComponent({
751
742
  <div class='footer quiet pad2 space-top1 center small'>
752
743
  Code coverage generated by
753
744
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
754
- at Fri Apr 22 2022 12:15:01 GMT+0800 (China Standard Time)
745
+ at Fri May 13 2022 20:42:37 GMT+0800 (China Standard Time)
755
746
  </div>
756
747
  <script src="../../../prettify.js"></script>
757
748
  <script>