@tmagic/editor 1.8.0-manmanyu.9 → 1.8.0

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 (279) hide show
  1. package/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +22 -13
  2. package/dist/es/components/CodeBlockEditor.vue_vue_type_script_setup_true_lang.js +10 -5
  3. package/dist/es/components/CodeParams.vue_vue_type_script_setup_true_lang.js +7 -6
  4. package/dist/es/components/CompareForm.vue_vue_type_script_setup_true_lang.js +21 -122
  5. package/dist/es/components/ContentMenu.vue_vue_type_script_setup_true_lang.js +21 -5
  6. package/dist/es/components/FloatingBox.vue_vue_type_script_setup_true_lang.js +62 -16
  7. package/dist/es/components/Icon.vue_vue_type_script_setup_true_lang.js +1 -1
  8. package/dist/es/components/Resizer.vue_vue_type_script_setup_true_lang.js +3 -2
  9. package/dist/es/components/ScrollBar.js +0 -1
  10. package/dist/es/components/ScrollBar.vue_vue_type_script_setup_true_lang.js +5 -4
  11. package/dist/es/components/ScrollViewer.vue_vue_type_script_setup_true_lang.js +1 -1
  12. package/dist/es/components/SearchInput.vue_vue_type_script_setup_true_lang.js +1 -1
  13. package/dist/es/components/SplitView.vue_vue_type_script_setup_true_lang.js +1 -1
  14. package/dist/es/components/ToolButton.vue_vue_type_script_setup_true_lang.js +1 -1
  15. package/dist/es/components/Tree.vue_vue_type_script_setup_true_lang.js +1 -1
  16. package/dist/es/components/TreeNode.vue_vue_type_script_setup_true_lang.js +1 -1
  17. package/dist/es/components/ViewForm.js +5 -0
  18. package/dist/es/components/ViewForm.vue_vue_type_script_setup_true_lang.js +56 -0
  19. package/dist/es/editorProps.js +7 -1
  20. package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +1 -1
  21. package/dist/es/fields/CodeLink.vue_vue_type_script_setup_true_lang.js +1 -1
  22. package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +30 -113
  23. package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +2 -2
  24. package/dist/es/fields/CondOpSelect.vue_vue_type_script_setup_true_lang.js +7 -19
  25. package/dist/es/fields/DataSourceFieldSelect/FieldSelect.vue_vue_type_script_setup_true_lang.js +7 -6
  26. package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +4 -2
  27. package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +12 -4
  28. package/dist/es/fields/DataSourceInput.vue_vue_type_script_setup_true_lang.js +9 -20
  29. package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +2 -2
  30. package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +5 -3
  31. package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +9 -4
  32. package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +2 -2
  33. package/dist/es/fields/DisplayConds.vue_vue_type_script_setup_true_lang.js +10 -110
  34. package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +52 -363
  35. package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +1 -1
  36. package/dist/es/fields/PageFragmentSelect.vue_vue_type_script_setup_true_lang.js +1 -1
  37. package/dist/es/fields/StyleSetter/Index.vue_vue_type_script_setup_true_lang.js +3 -6
  38. package/dist/es/fields/StyleSetter/components/BackgroundPosition.vue_vue_type_script_setup_true_lang.js +1 -1
  39. package/dist/es/fields/StyleSetter/components/Border.vue_vue_type_script_setup_true_lang.js +4 -35
  40. package/dist/es/fields/StyleSetter/components/Box.vue_vue_type_script_setup_true_lang.js +3 -3
  41. package/dist/es/fields/StyleSetter/configs.js +663 -0
  42. package/dist/es/fields/StyleSetter/icons/align-items/Center.js +1 -1
  43. package/dist/es/fields/StyleSetter/icons/align-items/FlexEnd.js +1 -1
  44. package/dist/es/fields/StyleSetter/icons/align-items/FlexStart.js +1 -1
  45. package/dist/es/fields/StyleSetter/icons/align-items/SpaceAround.js +1 -1
  46. package/dist/es/fields/StyleSetter/icons/align-items/SpaceBetween.js +1 -1
  47. package/dist/es/fields/StyleSetter/icons/background-repeat/NoRepeat.js +1 -1
  48. package/dist/es/fields/StyleSetter/icons/background-repeat/Repeat.js +1 -1
  49. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatX.js +1 -1
  50. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatY.js +1 -1
  51. package/dist/es/fields/StyleSetter/icons/display/Block.js +1 -1
  52. package/dist/es/fields/StyleSetter/icons/display/Flex.js +1 -1
  53. package/dist/es/fields/StyleSetter/icons/display/Inline.js +1 -1
  54. package/dist/es/fields/StyleSetter/icons/display/InlineBlock.js +1 -1
  55. package/dist/es/fields/StyleSetter/icons/display/None.js +1 -1
  56. package/dist/es/fields/StyleSetter/icons/flex-direction/Column.js +1 -1
  57. package/dist/es/fields/StyleSetter/icons/flex-direction/ColumnReverse.js +1 -1
  58. package/dist/es/fields/StyleSetter/icons/flex-direction/Row.js +1 -1
  59. package/dist/es/fields/StyleSetter/icons/flex-direction/RowReverse.js +1 -1
  60. package/dist/es/fields/StyleSetter/icons/justify-content/Center.js +1 -1
  61. package/dist/es/fields/StyleSetter/icons/justify-content/FlexEnd.js +1 -1
  62. package/dist/es/fields/StyleSetter/icons/justify-content/FlexStart.js +1 -1
  63. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceAround.js +1 -1
  64. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceBetween.js +1 -1
  65. package/dist/es/fields/StyleSetter/icons/text-align/Center.js +1 -1
  66. package/dist/es/fields/StyleSetter/icons/text-align/Left.js +1 -1
  67. package/dist/es/fields/StyleSetter/icons/text-align/Right.js +1 -1
  68. package/dist/es/fields/StyleSetter/pro/Background.vue_vue_type_script_setup_true_lang.js +29 -106
  69. package/dist/es/fields/StyleSetter/pro/Border.vue_vue_type_script_setup_true_lang.js +8 -11
  70. package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +30 -89
  71. package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +29 -297
  72. package/dist/es/fields/StyleSetter/pro/Position.vue_vue_type_script_setup_true_lang.js +29 -82
  73. package/dist/es/fields/StyleSetter/pro/Transform.vue_vue_type_script_setup_true_lang.js +8 -24
  74. package/dist/es/fields/UISelect.js +0 -1
  75. package/dist/es/fields/UISelect.vue_vue_type_script_setup_true_lang.js +1 -1
  76. package/dist/es/fields/configs/codeSelect.js +98 -0
  77. package/dist/es/fields/configs/displayConds.js +158 -0
  78. package/dist/es/fields/configs/eventSelect.js +225 -0
  79. package/dist/es/fields/configs/stickyAddButton.js +21 -0
  80. package/dist/es/fields/headless-validation.js +139 -0
  81. package/dist/es/headless.js +2 -0
  82. package/dist/es/hooks/use-code-block-edit.js +4 -2
  83. package/dist/es/hooks/use-compare-form.js +101 -0
  84. package/dist/es/hooks/use-form-context.js +29 -0
  85. package/dist/es/hooks/use-stage.js +1 -0
  86. package/dist/es/icons/CenterIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  87. package/dist/es/icons/CodeIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  88. package/dist/es/icons/DatasourceIcon.js +1 -1
  89. package/dist/es/icons/FolderMinusIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  90. package/dist/es/index.js +16 -8
  91. package/dist/es/initService.js +52 -16
  92. package/dist/es/layouts/AddPageBox.vue_vue_type_script_setup_true_lang.js +1 -1
  93. package/dist/es/layouts/CodeEditor.vue_vue_type_script_setup_true_lang.js +26 -10
  94. package/dist/es/layouts/Framework.vue_vue_type_script_setup_true_lang.js +11 -8
  95. package/dist/es/layouts/NavMenu.vue_vue_type_script_setup_true_lang.js +1 -1
  96. package/dist/es/layouts/NavMenuColumn.vue_vue_type_script_setup_true_lang.js +1 -1
  97. package/dist/es/layouts/history-list/Bucket.vue_vue_type_script_setup_true_lang.js +1 -1
  98. package/dist/es/layouts/history-list/BucketTab.vue_vue_type_script_setup_true_lang.js +8 -5
  99. package/dist/es/layouts/history-list/GroupRow.vue_vue_type_script_setup_true_lang.js +1 -1
  100. package/dist/es/layouts/history-list/HistoryDiffDialog.vue_vue_type_script_setup_true_lang.js +26 -10
  101. package/dist/es/layouts/history-list/HistoryListPanel.vue_vue_type_script_setup_true_lang.js +11 -13
  102. package/dist/es/layouts/history-list/InitialRow.vue_vue_type_script_setup_true_lang.js +1 -1
  103. package/dist/es/layouts/history-list/PageTab.vue_vue_type_script_setup_true_lang.js +1 -1
  104. package/dist/es/layouts/history-list/composables.js +1 -1
  105. package/dist/es/layouts/history-list/useHistoryRevert.js +38 -33
  106. package/dist/es/layouts/page-bar/AddButton.vue_vue_type_script_setup_true_lang.js +1 -1
  107. package/dist/es/layouts/page-bar/PageBar.vue_vue_type_script_setup_true_lang.js +1 -1
  108. package/dist/es/layouts/page-bar/PageBarScrollContainer.vue_vue_type_script_setup_true_lang.js +1 -1
  109. package/dist/es/layouts/page-bar/PageList.vue_vue_type_script_setup_true_lang.js +1 -1
  110. package/dist/es/layouts/page-bar/Search.vue_vue_type_script_setup_true_lang.js +2 -2
  111. package/dist/es/layouts/props-panel/FormPanel.vue_vue_type_script_setup_true_lang.js +50 -20
  112. package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +53 -35
  113. package/dist/es/layouts/props-panel/use-style-panel.js +3 -2
  114. package/dist/es/layouts/sidebar/ComponentListPanel.vue_vue_type_script_setup_true_lang.js +3 -3
  115. package/dist/es/layouts/sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js +21 -36
  116. package/dist/es/layouts/sidebar/code-block/CodeBlockList.vue_vue_type_script_setup_true_lang.js +1 -1
  117. package/dist/es/layouts/sidebar/code-block/CodeBlockListPanel.vue_vue_type_script_setup_true_lang.js +4 -4
  118. package/dist/es/layouts/sidebar/code-block/useContentMenu.js +19 -4
  119. package/dist/es/layouts/sidebar/data-source/DataSourceAddButton.vue_vue_type_script_setup_true_lang.js +1 -1
  120. package/dist/es/layouts/sidebar/data-source/DataSourceConfigPanel.vue_vue_type_script_setup_true_lang.js +9 -4
  121. package/dist/es/layouts/sidebar/data-source/DataSourceList.vue_vue_type_script_setup_true_lang.js +1 -1
  122. package/dist/es/layouts/sidebar/data-source/DataSourceListPanel.vue_vue_type_script_setup_true_lang.js +4 -4
  123. package/dist/es/layouts/sidebar/data-source/useContentMenu.js +19 -4
  124. package/dist/es/layouts/sidebar/layer/LayerMenu.vue_vue_type_script_setup_true_lang.js +3 -3
  125. package/dist/es/layouts/sidebar/layer/LayerNodeContent.js +5 -0
  126. package/dist/es/layouts/sidebar/layer/LayerNodeContent.vue_vue_type_script_setup_true_lang.js +46 -0
  127. package/dist/es/layouts/sidebar/layer/LayerNodeTool.vue_vue_type_script_setup_true_lang.js +1 -1
  128. package/dist/es/layouts/sidebar/layer/LayerPanel.vue_vue_type_script_setup_true_lang.js +6 -4
  129. package/dist/es/layouts/sidebar/layer/use-click.js +3 -3
  130. package/dist/es/layouts/sidebar/layer/use-drag.js +11 -10
  131. package/dist/es/layouts/sidebar/layer/use-node-status.js +2 -2
  132. package/dist/es/layouts/workspace/Breadcrumb.vue_vue_type_script_setup_true_lang.js +1 -1
  133. package/dist/es/layouts/workspace/Workspace.vue_vue_type_script_setup_true_lang.js +1 -1
  134. package/dist/es/layouts/workspace/viewer/NodeListMenu.vue_vue_type_script_setup_true_lang.js +9 -3
  135. package/dist/es/layouts/workspace/viewer/Stage.vue_vue_type_script_setup_true_lang.js +55 -9
  136. package/dist/es/layouts/workspace/viewer/StageOverlay.vue_vue_type_script_setup_true_lang.js +1 -1
  137. package/dist/es/layouts/workspace/viewer/ViewerMenu.vue_vue_type_script_setup_true_lang.js +8 -8
  138. package/dist/es/plugin.js +35 -23
  139. package/dist/es/services/codeBlock.js +8 -3
  140. package/dist/es/services/dataSource.js +3 -0
  141. package/dist/es/services/dep.js +162 -41
  142. package/dist/es/services/editor.js +344 -113
  143. package/dist/es/services/events.js +4 -4
  144. package/dist/es/services/history.js +17 -1
  145. package/dist/es/services/keybinding.js +3 -3
  146. package/dist/es/services/props.js +2 -1
  147. package/dist/es/services/storage.js +2 -2
  148. package/dist/es/services/ui.js +7 -2
  149. package/dist/es/style.css +277 -114
  150. package/dist/es/utils/code-block.js +14 -7
  151. package/dist/es/utils/config.js +4 -1
  152. package/dist/es/utils/const.js +2 -2
  153. package/dist/es/utils/content-menu.js +2 -2
  154. package/dist/es/utils/data-source/index.js +34 -12
  155. package/dist/es/utils/dep/collect-worker-client.js +154 -0
  156. package/dist/es/utils/dep/idle-task.js +70 -22
  157. package/dist/es/utils/dep/worker.js +1 -1
  158. package/dist/es/utils/editor.js +4 -2
  159. package/dist/es/utils/event.js +135 -0
  160. package/dist/es/utils/monaco-editor.js +22 -6
  161. package/dist/es/utils/operator.js +2 -2
  162. package/dist/es/utils/props.js +50 -106
  163. package/dist/es/utils/type-match-rules.js +356 -0
  164. package/dist/style.css +277 -114
  165. package/dist/themes/magic-admin.css +978 -175
  166. package/dist/tmagic-editor-headless.umd.cjs +10880 -0
  167. package/dist/tmagic-editor.umd.cjs +12695 -10896
  168. package/package.json +18 -13
  169. package/src/Editor.vue +23 -6
  170. package/src/components/CodeBlockEditor.vue +3 -0
  171. package/src/components/CodeParams.vue +10 -4
  172. package/src/components/CompareForm.vue +20 -190
  173. package/src/components/ContentMenu.vue +34 -6
  174. package/src/components/FloatingBox.vue +71 -7
  175. package/src/components/ScrollBar.vue +0 -67
  176. package/src/components/ViewForm.vue +54 -0
  177. package/src/editorProps.ts +23 -10
  178. package/src/fields/Code.vue +1 -1
  179. package/src/fields/CodeSelect.vue +20 -113
  180. package/src/fields/CodeSelectCol.vue +1 -1
  181. package/src/fields/CondOpSelect.vue +5 -26
  182. package/src/fields/DataSourceFieldSelect/FieldSelect.vue +2 -2
  183. package/src/fields/DataSourceFieldSelect/Index.vue +4 -1
  184. package/src/fields/DataSourceFields.vue +5 -1
  185. package/src/fields/DataSourceInput.vue +10 -28
  186. package/src/fields/DataSourceMethodSelect.vue +1 -1
  187. package/src/fields/DataSourceMethods.vue +6 -2
  188. package/src/fields/DataSourceMocks.vue +3 -0
  189. package/src/fields/DataSourceSelect.vue +1 -1
  190. package/src/fields/DisplayConds.vue +17 -139
  191. package/src/fields/EventSelect.vue +29 -416
  192. package/src/fields/KeyValue.vue +1 -1
  193. package/src/fields/StyleSetter/Index.vue +2 -8
  194. package/src/fields/StyleSetter/components/Border.vue +4 -38
  195. package/src/fields/StyleSetter/components/Box.vue +1 -1
  196. package/src/fields/StyleSetter/components/Position.vue +1 -1
  197. package/src/fields/StyleSetter/configs.ts +690 -0
  198. package/src/fields/StyleSetter/pro/Background.vue +9 -64
  199. package/src/fields/StyleSetter/pro/Border.vue +5 -16
  200. package/src/fields/StyleSetter/pro/Font.vue +11 -71
  201. package/src/fields/StyleSetter/pro/Layout.vue +10 -230
  202. package/src/fields/StyleSetter/pro/Position.vue +11 -82
  203. package/src/fields/StyleSetter/pro/Transform.vue +6 -34
  204. package/src/fields/UISelect.vue +0 -12
  205. package/src/fields/configs/codeSelect.ts +127 -0
  206. package/src/fields/configs/displayConds.ts +184 -0
  207. package/src/fields/configs/eventSelect.ts +309 -0
  208. package/src/fields/configs/stickyAddButton.ts +32 -0
  209. package/src/fields/headless-validation.ts +177 -0
  210. package/src/headless.ts +33 -0
  211. package/src/hooks/index.ts +1 -0
  212. package/src/hooks/use-compare-form.ts +166 -0
  213. package/src/hooks/use-form-context.ts +56 -0
  214. package/src/hooks/use-stage.ts +1 -0
  215. package/src/index.ts +9 -0
  216. package/src/initService.ts +73 -18
  217. package/src/layouts/CodeEditor.vue +32 -6
  218. package/src/layouts/Framework.vue +7 -6
  219. package/src/layouts/history-list/BucketTab.vue +2 -2
  220. package/src/layouts/history-list/HistoryDiffDialog.vue +33 -15
  221. package/src/layouts/history-list/HistoryListPanel.vue +16 -18
  222. package/src/layouts/history-list/useHistoryRevert.ts +57 -41
  223. package/src/layouts/props-panel/FormPanel.vue +75 -20
  224. package/src/layouts/props-panel/PropsPanel.vue +81 -30
  225. package/src/layouts/props-panel/use-style-panel.ts +4 -3
  226. package/src/layouts/sidebar/ComponentListPanel.vue +6 -2
  227. package/src/layouts/sidebar/Sidebar.vue +5 -3
  228. package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +5 -2
  229. package/src/layouts/sidebar/code-block/useContentMenu.ts +14 -2
  230. package/src/layouts/sidebar/data-source/DataSourceConfigPanel.vue +3 -0
  231. package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +3 -3
  232. package/src/layouts/sidebar/data-source/useContentMenu.ts +14 -2
  233. package/src/layouts/sidebar/layer/LayerMenu.vue +2 -2
  234. package/src/layouts/sidebar/layer/LayerNodeContent.vue +57 -0
  235. package/src/layouts/sidebar/layer/LayerPanel.vue +5 -2
  236. package/src/layouts/sidebar/layer/use-click.ts +3 -3
  237. package/src/layouts/sidebar/layer/use-node-status.ts +2 -2
  238. package/src/layouts/workspace/viewer/NodeListMenu.vue +4 -1
  239. package/src/layouts/workspace/viewer/Stage.vue +80 -10
  240. package/src/layouts/workspace/viewer/ViewerMenu.vue +7 -7
  241. package/src/plugin.ts +35 -25
  242. package/src/services/codeBlock.ts +4 -0
  243. package/src/services/dataSource.ts +3 -0
  244. package/src/services/dep.ts +292 -47
  245. package/src/services/editor.ts +383 -120
  246. package/src/services/events.ts +8 -7
  247. package/src/services/history.ts +22 -1
  248. package/src/services/keybinding.ts +3 -3
  249. package/src/services/ui.ts +26 -5
  250. package/src/theme/code-block.scss +0 -37
  251. package/src/theme/display-conds.scss +4 -0
  252. package/src/theme/event.scss +25 -33
  253. package/src/theme/floating-box.scss +9 -1
  254. package/src/theme/framework.scss +4 -1
  255. package/src/theme/layer-node-content.scss +14 -0
  256. package/src/theme/nav-menu.scss +5 -1
  257. package/src/theme/props-panel.scss +17 -3
  258. package/src/theme/scroll-bar.scss +64 -0
  259. package/src/theme/theme.scss +3 -0
  260. package/src/theme/themes/magic-admin/index.scss +109 -9
  261. package/src/theme/ui-select.scss +9 -0
  262. package/src/type.ts +216 -6
  263. package/src/utils/code-block.ts +1 -0
  264. package/src/utils/config.ts +9 -1
  265. package/src/utils/const.ts +3 -3
  266. package/src/utils/content-menu.ts +2 -2
  267. package/src/utils/data-source/index.ts +31 -12
  268. package/src/utils/dep/collect-worker-client.ts +215 -0
  269. package/src/utils/dep/idle-task.ts +104 -35
  270. package/src/utils/dep/worker.ts +113 -9
  271. package/src/utils/event.ts +237 -0
  272. package/src/utils/index.ts +2 -0
  273. package/src/utils/monaco-editor.ts +27 -0
  274. package/src/utils/operator.ts +2 -2
  275. package/src/utils/props.ts +61 -122
  276. package/src/utils/type-match-rules.ts +697 -0
  277. package/types/headless.d.ts +17 -0
  278. package/types/index.d.ts +1199 -724
  279. package/src/fields/StyleSetter/icons/align-items/index copy.ts +0 -5
@@ -87,70 +87,3 @@ const scrollBy = (delta: number) => {
87
87
  }
88
88
  };
89
89
  </script>
90
-
91
- <style lang="scss">
92
- .m-editor-scroll-bar {
93
- position: absolute;
94
- background-color: transparent;
95
- opacity: 0.3;
96
- transition:
97
- background-color 0.2s linear,
98
- opacity 0.2s linear;
99
-
100
- .m-editor-scroll-bar-thumb {
101
- background-color: #aaa;
102
- border-radius: 6px;
103
- position: absolute;
104
- }
105
-
106
- &.horizontal {
107
- width: 100%;
108
- height: 15px;
109
- bottom: 0;
110
-
111
- .m-editor-scroll-bar-thumb {
112
- height: 6px;
113
- transition:
114
- background-color 0.2s linear,
115
- height 0.2s ease-in-out;
116
- bottom: 2px;
117
- }
118
- }
119
-
120
- &.vertical {
121
- height: 100%;
122
- width: 15px;
123
- right: 5px;
124
-
125
- .m-editor-scroll-bar-thumb {
126
- width: 6px;
127
- transition:
128
- background-color 0.2s linear,
129
- width 0.2s ease-in-out;
130
- right: 2px;
131
- }
132
- }
133
-
134
- &:hover,
135
- &:focus {
136
- background-color: #eee;
137
- opacity: 0.9;
138
-
139
- .m-editor-scroll-bar-thumb {
140
- background-color: #999;
141
- }
142
-
143
- &.horizontal {
144
- .m-editor-scroll-bar-thumb {
145
- height: 11px;
146
- }
147
- }
148
-
149
- &.vertical {
150
- .m-editor-scroll-bar-thumb {
151
- width: 11px;
152
- }
153
- }
154
- }
155
- }
156
- </style>
@@ -0,0 +1,54 @@
1
+ <template>
2
+ <div class="m-editor-view-form-wrapper" :style="wrapperStyle">
3
+ <MForm
4
+ v-if="config.length"
5
+ ref="form"
6
+ class="m-editor-view-form"
7
+ :config="config"
8
+ :init-values="currentValues"
9
+ :disabled="disabled"
10
+ :label-width="labelWidth"
11
+ :context="formContext"
12
+ :size="size"
13
+ ></MForm>
14
+ </div>
15
+ </template>
16
+
17
+ <script lang="ts" setup>
18
+ import { type Ref, type ShallowRef } from 'vue';
19
+
20
+ import { type FormConfig, MForm } from '@tmagic/form';
21
+
22
+ import { useCompareForm } from '@editor/hooks/use-compare-form';
23
+ import type { CompareFormBaseProps } from '@editor/type';
24
+
25
+ defineOptions({
26
+ name: 'MEditorViewForm',
27
+ });
28
+
29
+ const props = withDefaults(
30
+ defineProps<
31
+ CompareFormBaseProps & {
32
+ /** 是否禁用表单(默认只读展示)。 */
33
+ disabled?: boolean;
34
+ }
35
+ >(),
36
+ {
37
+ category: 'node',
38
+ labelWidth: '120px',
39
+ disabled: true,
40
+ },
41
+ );
42
+
43
+ const { config, currentValues, wrapperStyle, formContext, loadConfig, formRef } = useCompareForm(props);
44
+
45
+ defineExpose<{
46
+ form: ShallowRef<InstanceType<typeof MForm> | null>;
47
+ config: Ref<FormConfig>;
48
+ reload: () => Promise<void>;
49
+ }>({
50
+ form: formRef,
51
+ config,
52
+ reload: loadConfig,
53
+ });
54
+ </script>
@@ -1,5 +1,7 @@
1
+ import type { InjectionKey } from 'vue';
2
+
1
3
  import type { DataSourceSchema, EventOption, Id, MApp, MNode, MPage, MPageFragment } from '@tmagic/core';
2
- import type { FormConfig, FormState } from '@tmagic/form';
4
+ import type { FormConfig } from '@tmagic/form';
3
5
  import StageCore, {
4
6
  CONTAINER_HIGHLIGHT_CLASS_NAME,
5
7
  ContainerHighlightType,
@@ -26,15 +28,16 @@ import type {
26
28
  TreeNodeData,
27
29
  } from './type';
28
30
 
31
+ /**
32
+ * 「属性配置表单校验」联动能力的 provide/inject 注入键。
33
+ * 使用 Symbol 避免与其它字符串键冲突,供 PropsPanel / FormPanel 注入判断校验失败时是否仍更新节点并记录错误。
34
+ */
35
+ export const ENABLE_PROPS_FORM_VALIDATE: InjectionKey<boolean> = Symbol('enablePropsFormValidate');
36
+
29
37
  export interface EditorProps {
30
- /**
31
- * 主题名称:对应 `packages/editor/src/theme/themes/<theme>/index.scss` 的目录名。
32
- *
33
- * 设置后会在编辑器根元素上追加 `m-editor--<theme>` 修饰类,配合按需引入
34
- * `@tmagic/editor/dist/themes/<theme>.css` 即可启用主题样式。
35
- *
36
- * 例如:`<MEditor theme="magic-admin" />` + `import '@tmagic/editor/dist/themes/magic-admin.css'`。
37
- */
38
+ /** 是否是大屏模拟器容器,大屏容器时,左侧属性面板会扩展为两列(正常3列),颜色表单不扩展两列等 */
39
+ isLargeStageContainer?: boolean;
40
+
38
41
  theme?: string;
39
42
  /** 页面初始值 */
40
43
  modelValue?: MApp;
@@ -79,6 +82,11 @@ export interface EditorProps {
79
82
  containerHighlightDuration?: number;
80
83
  /** 拖入画布中容器时,识别容器的操作类型 */
81
84
  containerHighlightType?: ContainerHighlightType;
85
+ /**
86
+ * 是否仅在新增组件(从组件列表拖入新组件)时才启用识别容器,
87
+ * 开启后在画布中拖动已有组件不会识别容器,默认 false
88
+ */
89
+ containerHighlightAddOnly?: boolean;
82
90
  /** 画布大小 */
83
91
  stageRect?: StageRect;
84
92
  /** monaco editor 的配置 */
@@ -100,6 +108,11 @@ export interface EditorProps {
100
108
  disabledFlashTip?: boolean;
101
109
  /** 禁用双击在浮层中单独编辑选中组件 */
102
110
  disabledStageOverlay?: boolean;
111
+ /**
112
+ * 是否启用「属性配置表单校验」联动能力:开启后属性/样式表单校验失败时仍更新节点,
113
+ * 并把错误信息集中记录到 editorService,用于组件树标红提示与保存拦截;默认 false(关闭)。
114
+ */
115
+ enablePropsFormValidate?: boolean;
103
116
  /** 禁用属性配置面板右下角显示源码的按钮 */
104
117
  disabledShowSrc?: boolean;
105
118
  /** 禁用数据源 */
@@ -136,7 +149,6 @@ export interface EditorProps {
136
149
  beforeDblclick?: (event: MouseEvent) => Promise<boolean | void> | boolean | void;
137
150
  /** 组件树节点双击前的钩子函数,返回 false 则阻止默认的双击行为 */
138
151
  beforeLayerNodeDblclick?: (event: MouseEvent, data: TreeNodeData) => Promise<boolean | void> | boolean | void;
139
- extendFormState?: (state: FormState) => Record<string, any> | Promise<Record<string, any>>;
140
152
  /** 历史记录面板的自定义扩展 tab,追加在内置的页面/数据源/代码块 tab 之后 */
141
153
  historyListExtraTabs?: HistoryListExtraTab[];
142
154
  /** 页面顺序拖拽配置参数 */
@@ -155,6 +167,7 @@ export const defaultEditorProps = {
155
167
  containerHighlightClassName: CONTAINER_HIGHLIGHT_CLASS_NAME,
156
168
  containerHighlightDuration: 800,
157
169
  containerHighlightType: ContainerHighlightType.DEFAULT,
170
+ containerHighlightAddOnly: false,
158
171
  disabledShowSrc: false,
159
172
  disabledDataSource: false,
160
173
  disabledCodeBlock: false,
@@ -19,7 +19,7 @@
19
19
  <script lang="ts" setup>
20
20
  import { computed } from 'vue';
21
21
 
22
- import type { CodeConfig, FieldProps } from '@tmagic/form';
22
+ import { type CodeConfig, type FieldProps } from '@tmagic/form';
23
23
 
24
24
  import MagicCodeEditor from '@editor/layouts/CodeEditor.vue';
25
25
 
@@ -1,36 +1,29 @@
1
1
  <template>
2
2
  <div class="m-fields-code-select" :class="config.className">
3
- <TMagicCard :flat="config.flat">
4
- <MContainer
5
- :config="codeConfig"
6
- :size="size"
7
- class="code-select-content"
8
- :prop="prop"
9
- :disabled="disabled"
10
- :is-compare="isCompareMode"
11
- :last-values="lastValues?.[name]"
12
- :model="model[name]"
13
- @change="changeHandler"
14
- >
15
- </MContainer>
16
- <TMagicButton class="create-button fullWidth" :icon="Plus" :size="size" :disabled="disabled" @click="newHandler()"
17
- >添加{{ config.text }}</TMagicButton
18
- >
19
- </TMagicCard>
3
+ <MContainer
4
+ :config="codeConfig"
5
+ :size="size"
6
+ class="code-select-content"
7
+ :prop="prop"
8
+ :disabled="disabled"
9
+ :is-compare="isCompareMode"
10
+ :last-values="lastValues?.[name]"
11
+ :model="model[name]"
12
+ :label-position="config.labelPosition"
13
+ :label-width="config.labelWidth"
14
+ @change="changeHandler"
15
+ >
16
+ </MContainer>
20
17
  </div>
21
18
  </template>
22
19
 
23
20
  <script lang="ts" setup>
24
21
  import { computed, watch } from 'vue';
25
- import { Plus } from '@element-plus/icons-vue';
26
- import { isEmpty } from 'lodash-es';
27
22
 
28
- import { HookCodeType, HookType } from '@tmagic/core';
29
- import { TMagicButton, TMagicCard } from '@tmagic/design';
30
- import type { CodeSelectConfig, ContainerChangeEventData, FieldProps, GroupListConfig } from '@tmagic/form';
23
+ import type { CodeSelectConfig, ContainerChangeEventData, FieldProps } from '@tmagic/form';
31
24
  import { MContainer } from '@tmagic/form';
32
25
 
33
- import { useServices } from '@editor/hooks/use-services';
26
+ import { createCodeSelectConfig, normalizeCodeSelectValue } from '@editor/fields/configs/codeSelect';
34
27
 
35
28
  defineOptions({
36
29
  name: 'MFieldsCodeSelect',
@@ -40,8 +33,6 @@ const emit = defineEmits<{
40
33
  change: [v: any, eventData: ContainerChangeEventData];
41
34
  }>();
42
35
 
43
- const { dataSourceService, codeBlockService } = useServices();
44
-
45
36
  const props = withDefaults(defineProps<FieldProps<CodeSelectConfig>>(), {});
46
37
 
47
38
  /**
@@ -58,98 +49,14 @@ const props = withDefaults(defineProps<FieldProps<CodeSelectConfig>>(), {});
58
49
  * 仅当存在历史值时才启用对比,避免 lastValues 缺失时退化为「全部新增」的空对比。
59
50
  */
60
51
  const isCompareMode = computed(() => Boolean(props.isCompare && props.lastValues));
61
- const newHandler = () => {
62
- const defaultCode = {
63
- codeType: HookCodeType.CODE,
64
- codeId: '',
65
- };
66
- const name = props.config.name || '';
67
- const hookData = props.model[name]?.hookData || [];
68
- emit('change', defaultCode, {
69
- modifyKey: `hookData.${hookData.length}`,
70
- });
71
- };
72
- const codeConfig = computed<GroupListConfig>(() => ({
73
- type: 'group-list',
74
- name: 'hookData',
75
- enableToggleMode: false,
76
- expandAll: true,
77
- flat: true,
78
- addable: () => false,
79
- title: (mForm, { model, index }: any) => {
80
- if (model.codeType === HookCodeType.DATA_SOURCE_METHOD) {
81
- if (Array.isArray(model.codeId)) {
82
- if (model.codeId.length < 2) {
83
- return index;
84
- }
85
-
86
- const ds = dataSourceService.getDataSourceById(model.codeId[0]);
87
- return `${ds?.title} / ${model.codeId[1]}`;
88
- }
89
-
90
- return Array.isArray(model.codeId) ? model.codeId.join('/') : index;
91
- }
92
-
93
- const codeContent = codeBlockService.getCodeContentById(model.codeId);
94
52
 
95
- if (codeContent) {
96
- return codeContent.name;
97
- }
98
-
99
- return model.codeId || index;
100
- },
101
- titlePrefix: props.config.name === undefined ? undefined : String(props.config.name),
102
- items: [
103
- {
104
- text: '代码类型',
105
- type: 'select',
106
- name: 'codeType',
107
- labelPosition: 'right',
108
- options: [
109
- { value: HookCodeType.CODE, text: '代码块' },
110
- { value: HookCodeType.DATA_SOURCE_METHOD, text: '数据源方法' },
111
- ],
112
- defaultValue: 'code',
113
- onChange: (_mForm, v: HookCodeType, { setModel }) => {
114
- if (v === HookCodeType.DATA_SOURCE_METHOD) {
115
- setModel('codeId', []);
116
- } else {
117
- setModel('codeId', '');
118
- }
119
- return v;
120
- },
121
- },
122
- {
123
- type: 'code-select-col',
124
- name: 'codeId',
125
- text: '代码块',
126
- display: (_mForm, { model }) => model.codeType !== HookCodeType.DATA_SOURCE_METHOD,
127
- notEditable: () => !codeBlockService.getEditStatus(),
128
- },
129
- {
130
- type: 'data-source-method-select',
131
- name: 'codeId',
132
- text: '数据源字段',
133
- display: (_mForm, { model }) => model.codeType === HookCodeType.DATA_SOURCE_METHOD,
134
- notEditable: () => !dataSourceService.get('editable'),
135
- },
136
- ],
137
- }));
53
+ const codeConfig = computed(() => createCodeSelectConfig(props.config));
138
54
 
55
+ // 挂载时的归一化由 applyMountValueEffects → code-select 的 effect 完成,这里只兜运行期被置空
139
56
  watch(
140
57
  () => props.model[props.name],
141
- (value) => {
142
- // 兼容旧的数据结构
143
- if (isEmpty(value)) {
144
- // 空值或者空数组
145
- props.model[props.name] = {
146
- hookType: HookType.CODE,
147
- hookData: [],
148
- };
149
- }
150
- },
151
- {
152
- immediate: true,
58
+ () => {
59
+ normalizeCodeSelectValue(props.model, props.name);
153
60
  },
154
61
  );
155
62
 
@@ -84,7 +84,7 @@ defineOptions({
84
84
 
85
85
  const mForm = inject<FormState | undefined>('mForm');
86
86
  const { codeBlockService, uiService } = useServices();
87
- const eventBus = inject<EventBus>('eventBus');
87
+ const eventBus = inject<EventBus | null>('eventBus', null);
88
88
  const emit = defineEmits<{
89
89
  change: [v: any, eventData: ContainerChangeEventData];
90
90
  }>();
@@ -31,9 +31,10 @@ import { computed } from 'vue';
31
31
 
32
32
  import { getDesignConfig, TMagicSelect } from '@tmagic/design';
33
33
  import type { CondOpSelectConfig, FieldProps } from '@tmagic/form';
34
+ import { removeDataSourceFieldPrefix } from '@tmagic/utils';
34
35
 
35
36
  import { useServices } from '@editor/hooks/use-services';
36
- import { arrayOptions, eqOptions, getFieldType, numberOptions } from '@editor/utils';
37
+ import { getCondOpOptionsByFieldType, getFieldType } from '@editor/utils';
37
38
 
38
39
  defineOptions({
39
40
  name: 'MFieldsCondOpSelect',
@@ -50,32 +51,10 @@ const props = defineProps<FieldProps<CondOpSelectConfig>>();
50
51
  const optionComponent = getDesignConfig('components')?.option;
51
52
 
52
53
  const options = computed(() => {
53
- const [id, ...fieldNames] = [...(props.config.parentFields || []), ...props.model.field];
54
-
55
- const ds = dataSourceService.getDataSourceById(id);
56
-
54
+ const [id, ...fieldNames] = [...(props.config.parentFields || []), ...(props.model.field || [])];
55
+ const ds = id ? dataSourceService.getDataSourceById(removeDataSourceFieldPrefix(id)) : undefined;
57
56
  const type = getFieldType(ds, fieldNames);
58
-
59
- if (type === 'array') {
60
- return arrayOptions;
61
- }
62
-
63
- if (type === 'boolean' || type === 'null') {
64
- return [
65
- { text: '是', value: 'is' },
66
- { text: '不是', value: 'not' },
67
- ];
68
- }
69
-
70
- if (type === 'number') {
71
- return [...eqOptions, ...numberOptions];
72
- }
73
-
74
- if (type === 'string') {
75
- return [...arrayOptions, ...eqOptions];
76
- }
77
-
78
- return [...arrayOptions, ...eqOptions, ...numberOptions];
57
+ return getCondOpOptionsByFieldType(type);
79
58
  });
80
59
 
81
60
  const fieldChangeHandler = (v: string) => {
@@ -118,13 +118,13 @@ const emit = defineEmits<{
118
118
  change: [v: string[]];
119
119
  }>();
120
120
 
121
- const modelValue = defineModel<string[] | any>('modelValue', { default: [] });
121
+ const modelValue = defineModel<string[] | any>('modelValue', { default: () => [] });
122
122
 
123
123
  const optionComponent = getDesignConfig('components')?.option;
124
124
 
125
125
  const { dataSourceService, uiService } = useServices();
126
126
  const mForm = inject<FormState | undefined>('mForm');
127
- const eventBus = inject<EventBus>('eventBus');
127
+ const eventBus = inject<EventBus | null>('eventBus', null);
128
128
 
129
129
  const allDataSources = computed(() => dataSourceService.get('dataSources') || []);
130
130
 
@@ -141,7 +141,10 @@ const checkStrictly = computed(() => {
141
141
  if (typeof props.config.checkStrictly !== 'function') {
142
142
  value = props.config.checkStrictly;
143
143
  } else {
144
- const dsId = removeDataSourceFieldPrefix(props.model[0]);
144
+ const fieldValue = props.model[props.name];
145
+ // 指定了 dataSourceId 时取值里只有字段名,数据源 id 只能取自 config
146
+ const rawDsId = props.config.dataSourceId ?? (Array.isArray(fieldValue) ? fieldValue[0] : fieldValue);
147
+ const dsId = removeDataSourceFieldPrefix(`${rawDsId}`);
145
148
  const dataSource = dataSources.value.find((ds) => ds.id === dsId);
146
149
 
147
150
  value = props.config.checkStrictly(mForm, {
@@ -8,10 +8,12 @@
8
8
  </div>
9
9
 
10
10
  <FloatingBox
11
+ :body-style="{ padding: '0 16px' }"
11
12
  v-model:visible="addDialogVisible"
12
13
  v-model:width="width"
13
14
  v-model:height="editorHeight"
14
15
  :title="fieldTitle"
16
+ :framework-width="frameworkWidth"
15
17
  :position="boxPosition"
16
18
  >
17
19
  <template #body>
@@ -28,10 +30,12 @@
28
30
  </FloatingBox>
29
31
 
30
32
  <FloatingBox
33
+ :body-style="{ padding: '0 16px' }"
31
34
  v-model:visible="addFromJsonDialogVisible"
32
35
  v-model:width="width"
33
36
  v-model:height="editorHeight"
34
37
  title="快速添加数据定义"
38
+ :framework-width="frameworkWidth"
35
39
  :position="boxPosition"
36
40
  >
37
41
  <template #body>
@@ -85,7 +89,6 @@ const emit = defineEmits<{
85
89
 
86
90
  const { uiService } = useServices();
87
91
  const mForm = inject<FormState | undefined>('mForm');
88
-
89
92
  /** 对比模式下隐藏新增/编辑/删除等操作按钮,仅保留只读展示。 */
90
93
  const isCompare = computed(() => Boolean(mForm?.isCompare));
91
94
 
@@ -358,6 +361,7 @@ const { height: editorHeight } = useEditorContentHeight();
358
361
 
359
362
  const parentFloating = inject<Ref<HTMLDivElement | null>>('parentFloating', ref(null));
360
363
  const { boxPosition, calcBoxPosition } = useNextFloatBoxPosition(uiService, parentFloating);
364
+ const frameworkWidth = computed(() => uiService.get('frameworkRect')?.width || 0);
361
365
 
362
366
  /**
363
367
  * 由 DataSourceConfigPanel 注入:打开数据源详情后需要直接打开的字段路径(字段名数组)。
@@ -30,10 +30,10 @@
30
30
  <template #suffix>
31
31
  <Icon :icon="Coin" />
32
32
  </template>
33
- <template #default="{ item }">
33
+ <template #default="slotProps">
34
34
  <div style="display: flex; flex-direction: column; line-height: 1.2em">
35
- <div>{{ item.text }}</div>
36
- <span style="font-size: 10px; color: rgba(0, 0, 0, 0.6)">{{ item.value }}</span>
35
+ <div>{{ slotProps?.item?.text || '' }}</div>
36
+ <span style="font-size: 10px; color: rgba(0, 0, 0, 0.6)">{{ slotProps?.item?.value || '' }}</span>
37
37
  </div>
38
38
  </template>
39
39
  </component>
@@ -79,11 +79,11 @@ import { Coin } from '@element-plus/icons-vue';
79
79
  import type { DataSchema, DataSourceSchema } from '@tmagic/core';
80
80
  import { getDesignConfig, TMagicAutocomplete, TMagicInput, TMagicTag } from '@tmagic/design';
81
81
  import type { DataSourceInputConfig, FieldProps } from '@tmagic/form';
82
- import { getKeysArray, isNumber } from '@tmagic/utils';
82
+ import { getKeysArray } from '@tmagic/utils';
83
83
 
84
84
  import Icon from '@editor/components/Icon.vue';
85
85
  import { useServices } from '@editor/hooks/use-services';
86
- import { getDisplayField } from '@editor/utils/data-source';
86
+ import { getDisplayField, resolveFieldByPath } from '@editor/utils/data-source';
87
87
 
88
88
  defineOptions({
89
89
  name: 'MFieldsDataSourceInput',
@@ -251,34 +251,16 @@ const fieldQuerySearch = (
251
251
  return;
252
252
  }
253
253
 
254
- let fields = ds.fields || [];
255
-
256
- // 后面这些是字段
257
- let key = keys.shift();
258
- while (key) {
259
- if (isNumber(key)) {
260
- key = keys.shift();
261
- continue;
262
- }
263
-
264
- for (const field of fields) {
265
- if (field.name === key) {
266
- fields = field.fields || [];
267
- key = keys.shift();
268
- break;
269
- }
270
- }
271
- }
254
+ const { fields } = resolveFieldByPath(ds.fields, keys, { skipNumberIndices: true });
272
255
 
273
256
  if (curCharIsDot(dotIndex)) {
274
257
  // 当前输入的是.
275
- result = fields || [];
258
+ result = fields;
276
259
  } else if (dotIndex > -1) {
277
260
  const queryName = queryString.substring(dotIndex + 1).toLowerCase();
278
- result =
279
- fields.filter(
280
- (field) => field.name?.toLowerCase().includes(queryName) || field.title?.toLowerCase().includes(queryName),
281
- ) || [];
261
+ result = fields.filter(
262
+ (field) => field.name?.toLowerCase().includes(queryName) || field.title?.toLowerCase().includes(queryName),
263
+ );
282
264
  }
283
265
 
284
266
  cb(
@@ -67,7 +67,7 @@ defineOptions({
67
67
 
68
68
  const { dataSourceService, uiService } = useServices();
69
69
  const mForm = inject<FormState | undefined>('mForm');
70
- const eventBus = inject<EventBus>('eventBus');
70
+ const eventBus = inject<EventBus | null>('eventBus', null);
71
71
 
72
72
  const emit = defineEmits(['change']);
73
73
 
@@ -26,7 +26,12 @@ import { cloneDeep } from 'lodash-es';
26
26
 
27
27
  import type { CodeBlockContent } from '@tmagic/core';
28
28
  import { TMagicButton, tMagicMessageBox } from '@tmagic/design';
29
- import type { ContainerChangeEventData, DataSourceMethodsConfig, FieldProps, FormState } from '@tmagic/form';
29
+ import {
30
+ type ContainerChangeEventData,
31
+ type DataSourceMethodsConfig,
32
+ type FieldProps,
33
+ type FormState,
34
+ } from '@tmagic/form';
30
35
  import { type ColumnConfig, MagicTable } from '@tmagic/table';
31
36
 
32
37
  import CodeBlockEditor from '@editor/components/CodeBlockEditor.vue';
@@ -43,7 +48,6 @@ const props = withDefaults(defineProps<FieldProps<DataSourceMethodsConfig>>(), {
43
48
  const emit = defineEmits(['change']);
44
49
 
45
50
  const mForm = inject<FormState | undefined>('mForm');
46
-
47
51
  /** 对比模式下隐藏新增/编辑/删除等操作按钮,仅保留只读展示。 */
48
52
  const isCompare = computed(() => Boolean(mForm?.isCompare));
49
53
 
@@ -7,10 +7,12 @@
7
7
  </div>
8
8
 
9
9
  <FloatingBox
10
+ :body-style="{ padding: '0 16px' }"
10
11
  v-model:visible="addDialogVisible"
11
12
  v-model:width="width"
12
13
  v-model:height="editorHeight"
13
14
  :title="drawerTitle"
15
+ :framework-width="frameworkWidth"
14
16
  :position="boxPosition"
15
17
  >
16
18
  <template #body>
@@ -254,4 +256,5 @@ const addDialogVisible = defineModel<boolean>('visible', { default: false });
254
256
  const { height: editorHeight } = useEditorContentHeight();
255
257
  const parentFloating = inject<Ref<HTMLDivElement | null>>('parentFloating', ref(null));
256
258
  const { boxPosition, calcBoxPosition } = useNextFloatBoxPosition(uiService, parentFloating);
259
+ const frameworkWidth = computed(() => uiService.get('frameworkRect')?.width || 0);
257
260
  </script>
@@ -50,7 +50,7 @@ const props = withDefaults(defineProps<FieldProps<DataSourceSelect>>(), {
50
50
 
51
51
  const mForm = inject<FormState | undefined>('mForm');
52
52
  const { dataSourceService, uiService } = useServices();
53
- const eventBus = inject<EventBus>('eventBus');
53
+ const eventBus = inject<EventBus | null>('eventBus', null);
54
54
 
55
55
  const dataSources = computed(() => dataSourceService.get('dataSources'));
56
56