@tmagic/editor 1.8.0-manmanyu.8 → 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 (281) 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 -119
  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 +17 -9
  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 +3 -3
  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 +36 -28
  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/useHistoryList.js +4 -4
  106. package/dist/es/layouts/history-list/useHistoryRevert.js +38 -33
  107. package/dist/es/layouts/page-bar/AddButton.vue_vue_type_script_setup_true_lang.js +1 -1
  108. package/dist/es/layouts/page-bar/PageBar.vue_vue_type_script_setup_true_lang.js +1 -1
  109. package/dist/es/layouts/page-bar/PageBarScrollContainer.vue_vue_type_script_setup_true_lang.js +1 -1
  110. package/dist/es/layouts/page-bar/PageList.vue_vue_type_script_setup_true_lang.js +1 -1
  111. package/dist/es/layouts/page-bar/Search.vue_vue_type_script_setup_true_lang.js +2 -2
  112. package/dist/es/layouts/props-panel/FormPanel.vue_vue_type_script_setup_true_lang.js +50 -20
  113. package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +53 -35
  114. package/dist/es/layouts/props-panel/use-style-panel.js +3 -2
  115. package/dist/es/layouts/sidebar/ComponentListPanel.vue_vue_type_script_setup_true_lang.js +3 -3
  116. package/dist/es/layouts/sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js +21 -36
  117. package/dist/es/layouts/sidebar/code-block/CodeBlockList.vue_vue_type_script_setup_true_lang.js +1 -1
  118. package/dist/es/layouts/sidebar/code-block/CodeBlockListPanel.vue_vue_type_script_setup_true_lang.js +4 -4
  119. package/dist/es/layouts/sidebar/code-block/useContentMenu.js +19 -4
  120. package/dist/es/layouts/sidebar/data-source/DataSourceAddButton.vue_vue_type_script_setup_true_lang.js +1 -1
  121. package/dist/es/layouts/sidebar/data-source/DataSourceConfigPanel.vue_vue_type_script_setup_true_lang.js +9 -4
  122. package/dist/es/layouts/sidebar/data-source/DataSourceList.vue_vue_type_script_setup_true_lang.js +1 -1
  123. package/dist/es/layouts/sidebar/data-source/DataSourceListPanel.vue_vue_type_script_setup_true_lang.js +4 -4
  124. package/dist/es/layouts/sidebar/data-source/useContentMenu.js +19 -4
  125. package/dist/es/layouts/sidebar/layer/LayerMenu.vue_vue_type_script_setup_true_lang.js +3 -3
  126. package/dist/es/layouts/sidebar/layer/LayerNodeContent.js +5 -0
  127. package/dist/es/layouts/sidebar/layer/LayerNodeContent.vue_vue_type_script_setup_true_lang.js +46 -0
  128. package/dist/es/layouts/sidebar/layer/LayerNodeTool.vue_vue_type_script_setup_true_lang.js +1 -1
  129. package/dist/es/layouts/sidebar/layer/LayerPanel.vue_vue_type_script_setup_true_lang.js +6 -4
  130. package/dist/es/layouts/sidebar/layer/use-click.js +3 -3
  131. package/dist/es/layouts/sidebar/layer/use-drag.js +11 -10
  132. package/dist/es/layouts/sidebar/layer/use-node-status.js +2 -2
  133. package/dist/es/layouts/workspace/Breadcrumb.vue_vue_type_script_setup_true_lang.js +1 -1
  134. package/dist/es/layouts/workspace/Workspace.vue_vue_type_script_setup_true_lang.js +1 -1
  135. package/dist/es/layouts/workspace/viewer/NodeListMenu.vue_vue_type_script_setup_true_lang.js +9 -3
  136. package/dist/es/layouts/workspace/viewer/Stage.vue_vue_type_script_setup_true_lang.js +55 -9
  137. package/dist/es/layouts/workspace/viewer/StageOverlay.vue_vue_type_script_setup_true_lang.js +1 -1
  138. package/dist/es/layouts/workspace/viewer/ViewerMenu.vue_vue_type_script_setup_true_lang.js +8 -8
  139. package/dist/es/plugin.js +35 -23
  140. package/dist/es/services/codeBlock.js +40 -31
  141. package/dist/es/services/dataSource.js +46 -34
  142. package/dist/es/services/dep.js +162 -41
  143. package/dist/es/services/editor.js +373 -137
  144. package/dist/es/services/events.js +4 -4
  145. package/dist/es/services/history.js +275 -392
  146. package/dist/es/services/keybinding.js +3 -3
  147. package/dist/es/services/props.js +2 -1
  148. package/dist/es/services/storage.js +2 -2
  149. package/dist/es/services/ui.js +7 -2
  150. package/dist/es/style.css +277 -114
  151. package/dist/es/utils/code-block.js +14 -7
  152. package/dist/es/utils/config.js +4 -1
  153. package/dist/es/utils/const.js +2 -2
  154. package/dist/es/utils/content-menu.js +2 -2
  155. package/dist/es/utils/data-source/index.js +34 -12
  156. package/dist/es/utils/dep/collect-worker-client.js +154 -0
  157. package/dist/es/utils/dep/idle-task.js +70 -22
  158. package/dist/es/utils/dep/worker.js +1 -1
  159. package/dist/es/utils/editor.js +4 -2
  160. package/dist/es/utils/event.js +135 -0
  161. package/dist/es/utils/history.js +35 -47
  162. package/dist/es/utils/monaco-editor.js +22 -6
  163. package/dist/es/utils/operator.js +2 -2
  164. package/dist/es/utils/props.js +50 -106
  165. package/dist/es/utils/type-match-rules.js +356 -0
  166. package/dist/style.css +277 -114
  167. package/dist/themes/magic-admin.css +978 -175
  168. package/dist/tmagic-editor-headless.umd.cjs +10880 -0
  169. package/dist/tmagic-editor.umd.cjs +13047 -11363
  170. package/package.json +18 -13
  171. package/src/Editor.vue +23 -6
  172. package/src/components/CodeBlockEditor.vue +3 -0
  173. package/src/components/CodeParams.vue +10 -4
  174. package/src/components/CompareForm.vue +20 -190
  175. package/src/components/ContentMenu.vue +34 -6
  176. package/src/components/FloatingBox.vue +71 -7
  177. package/src/components/ScrollBar.vue +0 -67
  178. package/src/components/ViewForm.vue +54 -0
  179. package/src/editorProps.ts +23 -10
  180. package/src/fields/Code.vue +1 -1
  181. package/src/fields/CodeSelect.vue +20 -113
  182. package/src/fields/CodeSelectCol.vue +1 -1
  183. package/src/fields/CondOpSelect.vue +5 -26
  184. package/src/fields/DataSourceFieldSelect/FieldSelect.vue +2 -2
  185. package/src/fields/DataSourceFieldSelect/Index.vue +4 -1
  186. package/src/fields/DataSourceFields.vue +5 -1
  187. package/src/fields/DataSourceInput.vue +10 -28
  188. package/src/fields/DataSourceMethodSelect.vue +1 -1
  189. package/src/fields/DataSourceMethods.vue +6 -2
  190. package/src/fields/DataSourceMocks.vue +3 -0
  191. package/src/fields/DataSourceSelect.vue +1 -1
  192. package/src/fields/DisplayConds.vue +17 -139
  193. package/src/fields/EventSelect.vue +29 -416
  194. package/src/fields/KeyValue.vue +1 -1
  195. package/src/fields/StyleSetter/Index.vue +2 -8
  196. package/src/fields/StyleSetter/components/Border.vue +4 -38
  197. package/src/fields/StyleSetter/components/Box.vue +1 -1
  198. package/src/fields/StyleSetter/components/Position.vue +1 -1
  199. package/src/fields/StyleSetter/configs.ts +690 -0
  200. package/src/fields/StyleSetter/pro/Background.vue +9 -64
  201. package/src/fields/StyleSetter/pro/Border.vue +5 -16
  202. package/src/fields/StyleSetter/pro/Font.vue +11 -71
  203. package/src/fields/StyleSetter/pro/Layout.vue +10 -230
  204. package/src/fields/StyleSetter/pro/Position.vue +11 -82
  205. package/src/fields/StyleSetter/pro/Transform.vue +6 -34
  206. package/src/fields/UISelect.vue +0 -12
  207. package/src/fields/configs/codeSelect.ts +127 -0
  208. package/src/fields/configs/displayConds.ts +184 -0
  209. package/src/fields/configs/eventSelect.ts +309 -0
  210. package/src/fields/configs/stickyAddButton.ts +32 -0
  211. package/src/fields/headless-validation.ts +177 -0
  212. package/src/headless.ts +33 -0
  213. package/src/hooks/index.ts +1 -0
  214. package/src/hooks/use-compare-form.ts +166 -0
  215. package/src/hooks/use-form-context.ts +56 -0
  216. package/src/hooks/use-stage.ts +1 -0
  217. package/src/index.ts +9 -0
  218. package/src/initService.ts +73 -18
  219. package/src/layouts/CodeEditor.vue +32 -6
  220. package/src/layouts/Framework.vue +7 -6
  221. package/src/layouts/history-list/BucketTab.vue +2 -2
  222. package/src/layouts/history-list/HistoryDiffDialog.vue +33 -15
  223. package/src/layouts/history-list/HistoryListPanel.vue +16 -18
  224. package/src/layouts/history-list/useHistoryRevert.ts +57 -41
  225. package/src/layouts/props-panel/FormPanel.vue +75 -20
  226. package/src/layouts/props-panel/PropsPanel.vue +81 -30
  227. package/src/layouts/props-panel/use-style-panel.ts +4 -3
  228. package/src/layouts/sidebar/ComponentListPanel.vue +6 -2
  229. package/src/layouts/sidebar/Sidebar.vue +5 -3
  230. package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +5 -2
  231. package/src/layouts/sidebar/code-block/useContentMenu.ts +14 -2
  232. package/src/layouts/sidebar/data-source/DataSourceConfigPanel.vue +3 -0
  233. package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +3 -3
  234. package/src/layouts/sidebar/data-source/useContentMenu.ts +14 -2
  235. package/src/layouts/sidebar/layer/LayerMenu.vue +2 -2
  236. package/src/layouts/sidebar/layer/LayerNodeContent.vue +57 -0
  237. package/src/layouts/sidebar/layer/LayerPanel.vue +5 -2
  238. package/src/layouts/sidebar/layer/use-click.ts +3 -3
  239. package/src/layouts/sidebar/layer/use-node-status.ts +2 -2
  240. package/src/layouts/workspace/viewer/NodeListMenu.vue +4 -1
  241. package/src/layouts/workspace/viewer/Stage.vue +80 -10
  242. package/src/layouts/workspace/viewer/ViewerMenu.vue +7 -7
  243. package/src/plugin.ts +35 -25
  244. package/src/services/codeBlock.ts +4 -0
  245. package/src/services/dataSource.ts +3 -0
  246. package/src/services/dep.ts +292 -47
  247. package/src/services/editor.ts +383 -120
  248. package/src/services/events.ts +8 -7
  249. package/src/services/history.ts +22 -1
  250. package/src/services/keybinding.ts +3 -3
  251. package/src/services/ui.ts +26 -5
  252. package/src/theme/code-block.scss +0 -37
  253. package/src/theme/display-conds.scss +4 -0
  254. package/src/theme/event.scss +25 -33
  255. package/src/theme/floating-box.scss +9 -1
  256. package/src/theme/framework.scss +4 -1
  257. package/src/theme/layer-node-content.scss +14 -0
  258. package/src/theme/nav-menu.scss +5 -1
  259. package/src/theme/props-panel.scss +17 -3
  260. package/src/theme/scroll-bar.scss +64 -0
  261. package/src/theme/theme.scss +3 -0
  262. package/src/theme/themes/magic-admin/index.scss +109 -9
  263. package/src/theme/ui-select.scss +9 -0
  264. package/src/type.ts +216 -6
  265. package/src/utils/code-block.ts +1 -0
  266. package/src/utils/config.ts +9 -1
  267. package/src/utils/const.ts +3 -3
  268. package/src/utils/content-menu.ts +2 -2
  269. package/src/utils/data-source/index.ts +31 -12
  270. package/src/utils/dep/collect-worker-client.ts +215 -0
  271. package/src/utils/dep/idle-task.ts +104 -35
  272. package/src/utils/dep/worker.ts +113 -9
  273. package/src/utils/event.ts +237 -0
  274. package/src/utils/index.ts +2 -0
  275. package/src/utils/monaco-editor.ts +27 -0
  276. package/src/utils/operator.ts +2 -2
  277. package/src/utils/props.ts +61 -122
  278. package/src/utils/type-match-rules.ts +697 -0
  279. package/types/headless.d.ts +17 -0
  280. package/types/index.d.ts +1494 -978
  281. package/src/fields/StyleSetter/icons/align-items/index copy.ts +0 -5
@@ -0,0 +1,158 @@
1
+ import { getCascaderOptionsFromFields, getFieldType } from "../../utils/data-source/index.js";
2
+ import dataSource_default from "../../services/dataSource.js";
3
+ import { stickyAddButton } from "./stickyAddButton.js";
4
+ import { removeDataSourceFieldPrefix } from "@tmagic/utils";
5
+ //#region packages/editor/src/fields/configs/displayConds.ts
6
+ /**
7
+ * `fields/DisplayConds.vue` 内部渲染的条件列表配置。
8
+ *
9
+ * 外层是条件组,内层 `cond` 是组内条件(groupList,每个字段单独一行)。
10
+ * 由组件与无渲染校验的嵌套配置共用。
11
+ *
12
+ * `parentFields` 由调用方求值:有父级字段路径时用 cascader 在该路径下选字段,
13
+ * 没有时用 data-source-field-select 从头选。
14
+ */
15
+ var createDisplayCondsConfig = (config, name, parentFields) => {
16
+ const resolveFieldPath = (path) => {
17
+ const [id, ...fieldNames] = path;
18
+ return {
19
+ ds: id ? dataSource_default.getDataSourceById(removeDataSourceFieldPrefix(`${id}`)) : void 0,
20
+ fieldNames
21
+ };
22
+ };
23
+ const fieldOnChange = (_formState, v, { model }) => {
24
+ const { ds, fieldNames } = resolveFieldPath([...parentFields, ...v]);
25
+ const type = getFieldType(ds, fieldNames);
26
+ if (type === "number") model.value = Number(model.value);
27
+ else if (type === "boolean") model.value = Boolean(model.value);
28
+ else if (type === "null") model.value = null;
29
+ else model.value = `${model.value}`;
30
+ return v;
31
+ };
32
+ const fieldItem = parentFields.length ? {
33
+ type: "cascader",
34
+ options: () => {
35
+ const { ds, fieldNames } = resolveFieldPath(parentFields);
36
+ if (!ds) return [];
37
+ let fields = ds.fields || [];
38
+ fieldNames.forEach((key) => {
39
+ fields = fields.find((f) => f.name === key)?.fields || [];
40
+ });
41
+ return getCascaderOptionsFromFields(fields, [
42
+ "string",
43
+ "number",
44
+ "boolean",
45
+ "any"
46
+ ]);
47
+ },
48
+ name: "field",
49
+ value: "key",
50
+ text: "字段",
51
+ checkStrictly: false,
52
+ onChange: fieldOnChange,
53
+ defaultValue: () => [],
54
+ rules: [{
55
+ required: true,
56
+ trigger: "blur",
57
+ message: "请选择字段"
58
+ }, {
59
+ typeMatch: true,
60
+ trigger: "change"
61
+ }]
62
+ } : {
63
+ type: "data-source-field-select",
64
+ name: "field",
65
+ value: "key",
66
+ text: "字段",
67
+ checkStrictly: false,
68
+ dataSourceFieldType: [
69
+ "string",
70
+ "number",
71
+ "boolean",
72
+ "any"
73
+ ],
74
+ onChange: fieldOnChange,
75
+ defaultValue: () => [],
76
+ rules: [{
77
+ required: true,
78
+ trigger: "blur",
79
+ message: "请选择字段"
80
+ }, {
81
+ typeMatch: true,
82
+ trigger: "change"
83
+ }]
84
+ };
85
+ return {
86
+ type: "groupList",
87
+ name,
88
+ titlePrefix: config.titlePrefix,
89
+ expandAll: true,
90
+ enableToggleMode: false,
91
+ defaultAdd: { cond: [] },
92
+ ...stickyAddButton(`新增${config.titlePrefix || "条件组"}`),
93
+ flat: config.flat,
94
+ defaultValue: config.defaultValue ?? [],
95
+ rules: config.rules ?? [{ typeMatch: true }],
96
+ items: [{
97
+ type: "groupList",
98
+ name: "cond",
99
+ titlePrefix: "条件",
100
+ expandAll: true,
101
+ enableToggleMode: false,
102
+ copyable: true,
103
+ movable: false,
104
+ flat: true,
105
+ labelWidth: "80px",
106
+ ...stickyAddButton("新增条件"),
107
+ items: [
108
+ fieldItem,
109
+ {
110
+ type: "cond-op-select",
111
+ parentFields,
112
+ text: "条件",
113
+ name: "op",
114
+ rules: [{
115
+ required: true,
116
+ trigger: "blur",
117
+ message: "请选择条件"
118
+ }, {
119
+ typeMatch: true,
120
+ trigger: "change"
121
+ }]
122
+ },
123
+ {
124
+ name: "value",
125
+ text: "值",
126
+ type: (_mForm, { model }) => {
127
+ const { ds, fieldNames } = resolveFieldPath([...parentFields, ...model.field || []]);
128
+ const type = getFieldType(ds, fieldNames);
129
+ if (type === "number") return "number";
130
+ if (type === "boolean") return "select";
131
+ if (type === "null") return "display";
132
+ return "text";
133
+ },
134
+ options: [{
135
+ text: "true",
136
+ value: true
137
+ }, {
138
+ text: "false",
139
+ value: false
140
+ }],
141
+ display: (_mForm, { model }) => !["between", "not_between"].includes(model.op),
142
+ displayText: (_mForm, { model }) => {
143
+ if (model.value === null) return "null";
144
+ return model.value;
145
+ }
146
+ },
147
+ {
148
+ name: "range",
149
+ text: "值",
150
+ type: "number-range",
151
+ display: (_mForm, { model }) => ["between", "not_between"].includes(model.op)
152
+ }
153
+ ]
154
+ }]
155
+ };
156
+ };
157
+ //#endregion
158
+ export { createDisplayCondsConfig };
@@ -0,0 +1,225 @@
1
+ import props_default from "../../services/props.js";
2
+ import editor_default from "../../services/editor.js";
3
+ import codeBlock_default from "../../services/codeBlock.js";
4
+ import dataSource_default from "../../services/dataSource.js";
5
+ import events_default from "../../services/events.js";
6
+ import { getCompActionAllowedValues, getCompActionOptions, getEventNameAllowedValues, getEventNameOptions, normalizeCompActionValue } from "../../utils/event.js";
7
+ import { stickyAddButton } from "./stickyAddButton.js";
8
+ import { ActionType } from "@tmagic/core";
9
+ import { has } from "lodash-es";
10
+ import { defineFormItem } from "@tmagic/form/headless";
11
+ //#region packages/editor/src/fields/configs/eventSelect.ts
12
+ /**
13
+ * `fields/EventSelect.vue` 内部渲染的各段配置。
14
+ *
15
+ * 由组件与无渲染校验的嵌套配置共用:组件用它们渲染,嵌套配置用它们让父表单校验到这些字段。
16
+ * 每段都支持通过 `config.xxxConfig` 覆盖,覆盖逻辑也必须两边一致,因此一并收口在此。
17
+ */
18
+ /** 事件名称下拉框配置,渲染在每张事件卡片的头部 */
19
+ var createEventNameConfig = (config) => {
20
+ return {
21
+ name: "name",
22
+ text: "事件类型",
23
+ type: (_mForm, { formValue }) => {
24
+ if (config.src !== "component" || formValue.type === "page-fragment-container" && formValue.pageFragmentId) return "cascader";
25
+ return "select";
26
+ },
27
+ labelWidth: "70px",
28
+ checkStrictly: () => config.src !== "component",
29
+ valueSeparator: ".",
30
+ options: (_mForm, { formValue }) => getEventNameOptions(config.src, formValue),
31
+ rules: [{
32
+ validator: ({ value, callback }, { formValue }) => {
33
+ const allowedNames = getEventNameAllowedValues(config, formValue);
34
+ if (allowedNames && allowedNames.size > 0 && value && !allowedNames.has(value)) return callback(`事件名(${value})不存在`);
35
+ callback();
36
+ },
37
+ trigger: "blur"
38
+ }],
39
+ ...config.eventNameConfig
40
+ };
41
+ };
42
+ var createActionTypeOptions = () => {
43
+ const o = [{
44
+ text: "组件",
45
+ label: "组件",
46
+ value: ActionType.COMP
47
+ }];
48
+ if (!props_default.getDisabledCodeBlock()) o.push({
49
+ text: "代码",
50
+ label: "代码",
51
+ disabled: !Object.keys(codeBlock_default.getCodeDsl() || {}).length,
52
+ value: ActionType.CODE
53
+ });
54
+ if (!props_default.getDisabledDataSource()) o.push({
55
+ text: "数据源",
56
+ label: "数据源",
57
+ value: ActionType.DATA_SOURCE
58
+ });
59
+ return o;
60
+ };
61
+ /** 联动类型 */
62
+ var createActionTypeConfig = (config) => {
63
+ return {
64
+ name: "actionType",
65
+ text: "联动类型",
66
+ type: "select",
67
+ defaultValue: ActionType.COMP,
68
+ options: createActionTypeOptions(),
69
+ rules: [{
70
+ required: true,
71
+ message: "联动类型不能为空"
72
+ }, {
73
+ typeMatch: true,
74
+ trigger: "blur"
75
+ }],
76
+ onChange: (_mForm, _v, { setModel }) => {
77
+ setModel("to", "");
78
+ setModel("method", "");
79
+ setModel("codeId", "");
80
+ setModel("dataSourceMethod", []);
81
+ },
82
+ ...config.actionTypeConfig
83
+ };
84
+ };
85
+ /** 联动组件 */
86
+ var createTargetCompConfig = (config) => {
87
+ return {
88
+ name: "to",
89
+ text: "联动组件",
90
+ type: "ui-select",
91
+ display: (_mForm, { model }) => model.actionType === ActionType.COMP,
92
+ onChange: (_mForm, _v, { setModel }) => {
93
+ setModel("method", "");
94
+ },
95
+ rules: [{
96
+ typeMatch: true,
97
+ trigger: "blur"
98
+ }],
99
+ ...config.targetCompConfig
100
+ };
101
+ };
102
+ /** 联动组件动作 */
103
+ var createCompActionConfig = (config) => {
104
+ return {
105
+ name: "method",
106
+ text: "动作",
107
+ type: (_mForm, { model }) => {
108
+ const to = editor_default.getNodeById(model.to);
109
+ if (to?.type === "page-fragment-container" && to.pageFragmentId) return "cascader";
110
+ return "select";
111
+ },
112
+ checkStrictly: () => config.src !== "component",
113
+ display: (_mForm, { model }) => model.actionType === ActionType.COMP,
114
+ options: (_mForm, { model }) => getCompActionOptions(model.to),
115
+ rules: [{
116
+ trigger: "blur",
117
+ validator: ({ value, callback }, { model }) => {
118
+ const allowedMethods = getCompActionAllowedValues(config, model);
119
+ const normalized = normalizeCompActionValue(value);
120
+ if (allowedMethods && allowedMethods.size > 0 && normalized && !allowedMethods.has(normalized)) return callback(`动作名(${normalized})不存在`);
121
+ callback();
122
+ }
123
+ }],
124
+ ...config.compActionConfig
125
+ };
126
+ };
127
+ /** 代码联动 */
128
+ var createCodeActionConfig = (config) => {
129
+ return {
130
+ type: "code-select-col",
131
+ text: "代码块",
132
+ name: "codeId",
133
+ notEditable: () => !codeBlock_default.getEditStatus(),
134
+ display: (_mForm, { model }) => model.actionType === ActionType.CODE,
135
+ ...config.codeActionConfig
136
+ };
137
+ };
138
+ /** 数据源联动 */
139
+ var createDataSourceActionConfig = (config) => {
140
+ return {
141
+ type: "data-source-method-select",
142
+ text: "数据源方法",
143
+ name: "dataSourceMethod",
144
+ notEditable: () => !dataSource_default.get("editable"),
145
+ display: (_mForm, { model }) => model.actionType === ActionType.DATA_SOURCE,
146
+ ...config.dataSourceActionConfig
147
+ };
148
+ };
149
+ /** 单张事件里的动作组 */
150
+ var createActionsConfig = (config) => defineFormItem({
151
+ type: "group-list",
152
+ name: "actions",
153
+ expandAll: true,
154
+ enableToggleMode: false,
155
+ titlePrefix: "动作",
156
+ labelPosition: "top",
157
+ flat: true,
158
+ ...stickyAddButton("新增动作"),
159
+ items: [
160
+ createActionTypeConfig(config),
161
+ createTargetCompConfig(config),
162
+ createCompActionConfig(config),
163
+ createCodeActionConfig(config),
164
+ createDataSourceActionConfig(config)
165
+ ]
166
+ });
167
+ /** 事件列表(外层 group-list)。事件名走 title slot,body 只放动作组。 */
168
+ var createEventSelectConfig = (config, name, options) => defineFormItem({
169
+ type: "group-list",
170
+ name,
171
+ titlePrefix: "事件",
172
+ expandAll: true,
173
+ enableToggleMode: false,
174
+ movable: false,
175
+ defaultAdd: {
176
+ name: "",
177
+ actions: []
178
+ },
179
+ ...stickyAddButton("添加事件"),
180
+ items: [...options?.includeEventName ? [createEventNameConfig(config)] : [], createActionsConfig(config)]
181
+ });
182
+ /** 兼容旧数据格式(事件列表里没有 actions)时渲染的表格配置,本身不带校验规则 */
183
+ var createLegacyTableConfig = (config) => defineFormItem({
184
+ type: "table",
185
+ name: "events",
186
+ items: [
187
+ {
188
+ name: "name",
189
+ label: "事件名",
190
+ type: createEventNameConfig(config).type,
191
+ options: (_mForm, { formValue }) => events_default.getEvent(formValue.type, { node: editor_default.getNodeById(formValue.id) }).map((option) => ({
192
+ text: option.label,
193
+ value: option.value
194
+ }))
195
+ },
196
+ {
197
+ name: "to",
198
+ label: "联动组件",
199
+ type: "ui-select"
200
+ },
201
+ {
202
+ name: "method",
203
+ label: "动作",
204
+ type: createCompActionConfig(config).type,
205
+ options: (_mForm, { model, formValue }) => {
206
+ const node = editor_default.getNodeById(model.to) || formValue;
207
+ if (!node?.type) return [];
208
+ return events_default.getMethod(node.type, {
209
+ targetId: model.to,
210
+ node
211
+ }).map((option) => ({
212
+ text: option.label,
213
+ value: option.value
214
+ }));
215
+ }
216
+ }
217
+ ]
218
+ });
219
+ /** 事件列表是否为旧数据格式(列表项里没有 actions) */
220
+ var isLegacyEventValue = (events) => {
221
+ if (!Array.isArray(events) || events.length === 0) return false;
222
+ return !has(events[0], "actions");
223
+ };
224
+ //#endregion
225
+ export { createActionsConfig, createEventNameConfig, createEventSelectConfig, createLegacyTableConfig, isLegacyEventValue };
@@ -0,0 +1,21 @@
1
+ //#region packages/editor/src/fields/configs/stickyAddButton.ts
2
+ /**
3
+ * 属性面板列表字段共用的吸底全宽「添加」按钮与吸顶标题,展开到 group-list 配置上。
4
+ *
5
+ * 吸底按钮会盖住列表底部,吸顶标题会盖住列表顶部,新增的项必须同时滚进视口才看得见。
6
+ */
7
+ var stickyAddButton = (text) => ({
8
+ scrollLastItemIntoView: true,
9
+ header: { sticky: true },
10
+ addButtonConfig: {
11
+ sticky: true,
12
+ text,
13
+ props: {
14
+ type: "primary",
15
+ plain: true,
16
+ text: false
17
+ }
18
+ }
19
+ });
20
+ //#endregion
21
+ export { stickyAddButton };
@@ -0,0 +1,139 @@
1
+ import { editorTypeMatchRules, validateDataSourceFieldSelect } from "../utils/type-match-rules.js";
2
+ import { createCodeSelectConfig, normalizeCodeSelectValue } from "./configs/codeSelect.js";
3
+ import { createEventSelectConfig, isLegacyEventValue } from "./configs/eventSelect.js";
4
+ import { createDisplayCondsConfig } from "./configs/displayConds.js";
5
+ import { createStyleSetterConfig } from "./StyleSetter/configs.js";
6
+ import { filterFunction } from "@tmagic/form/headless";
7
+ //#region packages/editor/src/fields/headless-validation.ts
8
+ var getName = (config) => `${config.name ?? ""}`;
9
+ /** `code-select` 旧数据兼容:空值改写成 `{ hookType, hookData }`。 */
10
+ var codeSelectEffect = ({ config, model }) => {
11
+ normalizeCodeSelectValue(model, getName(config));
12
+ };
13
+ /** `event-select`:表单 init 对未声明 defaultValue 的自定义 type 会写成空串,统一收成数组。 */
14
+ var eventSelectEffect = ({ config, model }) => {
15
+ const name = getName(config);
16
+ if (model && !Array.isArray(model[name])) model[name] = [];
17
+ };
18
+ /**
19
+ * `code-select` 的内部配置。
20
+ *
21
+ * 对应 `fields/CodeSelect.vue` 内部
22
+ * `<MContainer :config="codeConfig" :model="model[name]" :prop="prop">`。
23
+ *
24
+ * @param ctx - innerConfig 回调入参
25
+ * @returns 内部容器的 config / model / prop
26
+ */
27
+ var codeSelectInnerConfig = ({ config, model, prop }) => {
28
+ const name = getName(config);
29
+ return {
30
+ config: createCodeSelectConfig(config),
31
+ model: model?.[name],
32
+ prop
33
+ };
34
+ };
35
+ /**
36
+ * `display-conds` 的内部配置。
37
+ *
38
+ * 对应 `fields/DisplayConds.vue` 内部把同一份 groupList 配置交给 `MGroupList`。
39
+ *
40
+ * @param ctx - innerConfig 回调入参
41
+ * @returns 内部 group-list 配置;prop 基准为 parentProp,避免 name 被拼两次
42
+ */
43
+ var displayCondsInnerConfig = ({ config, model, prop, parentProp, mForm }) => {
44
+ const name = getName(config);
45
+ const parentFields = filterFunction(mForm, config.parentFields, {
46
+ model,
47
+ config,
48
+ prop
49
+ }) || [];
50
+ return {
51
+ config: createDisplayCondsConfig(config, name, parentFields),
52
+ prop: parentProp
53
+ };
54
+ };
55
+ /**
56
+ * `event-select` 的内部配置。
57
+ *
58
+ * 对应 `fields/EventSelect.vue`:列表走 group-list,事件名渲染在 title slot,
59
+ * 无渲染校验仍把事件名当作列表项字段,路径为 `<prop>.<index>.name`。
60
+ *
61
+ * @param ctx - innerConfig 回调入参
62
+ * @returns 合成的 group-list 配置;旧数据格式返回 null,不参与校验
63
+ */
64
+ var eventSelectInnerConfig = ({ config, model, parentProp }) => {
65
+ const name = getName(config);
66
+ const events = model?.[name];
67
+ if (!Array.isArray(events) || isLegacyEventValue(events)) return null;
68
+ return {
69
+ config: createEventSelectConfig(config, name, { includeEventName: true }),
70
+ prop: parentProp
71
+ };
72
+ };
73
+ /**
74
+ * `style-setter` 的内部配置。
75
+ *
76
+ * 对应 `fields/StyleSetter/Index.vue`:6 个面板共用 `:values="model[name]"`、`:prop="prop || name"`。
77
+ * `theme` 按 `useTheme` 缺省空串传入,只改 flexWrap 的 UI childType,不影响校验字段。
78
+ *
79
+ * @param ctx - innerConfig 回调入参
80
+ * @returns style 面板配置及 styleModel
81
+ */
82
+ var styleSetterInnerConfig = ({ config, model, prop }) => {
83
+ const name = getName(config);
84
+ const styleModel = model?.[name] ?? {};
85
+ return {
86
+ config: createStyleSetterConfig(styleModel, "", validateDataSourceFieldSelect),
87
+ model: styleModel,
88
+ prop
89
+ };
90
+ };
91
+ /**
92
+ * 编辑器字段的无渲染登记表(不含 Vue 组件)。
93
+ *
94
+ * Node 里 `registerFields(editorFields)` 即可配合 `validateForm` / `submitForm`。
95
+ * 安装编辑器时由 plugin 把 `component` 叠上去再传给 `@tmagic/form`。
96
+ *
97
+ * - 叶子:内部只渲染叶子 UI,或把子表单渲染在独立的 MForm / MFormBox 实例里
98
+ * - innerConfig:内部再渲染 MContainer / MPanel / MGroupList,把运行期配置交出来
99
+ * - typeMatch:该 type 自身的类型匹配校验
100
+ *
101
+ * innerConfig 返回的 config / model / prop 与组件模板里传给内部容器的那一组保持一一对应,
102
+ * 且配置本身与组件共用同一份工厂(`fields/configs/`)。
103
+ */
104
+ var editorFields = {
105
+ "vs-code": {},
106
+ "code-link": {},
107
+ "ui-select": { typeMatch: editorTypeMatchRules["ui-select"] },
108
+ "cond-op-select": { typeMatch: editorTypeMatchRules["cond-op-select"] },
109
+ "page-fragment-select": { typeMatch: editorTypeMatchRules["page-fragment-select"] },
110
+ "data-source-select": { typeMatch: editorTypeMatchRules["data-source-select"] },
111
+ "data-source-input": { typeMatch: editorTypeMatchRules["data-source-input"] },
112
+ "key-value": { typeMatch: editorTypeMatchRules["key-value"] },
113
+ "code-select-col": { typeMatch: editorTypeMatchRules["code-select-col"] },
114
+ "data-source-fields": { typeMatch: editorTypeMatchRules["data-source-fields"] },
115
+ "data-source-mocks": { typeMatch: editorTypeMatchRules["data-source-mocks"] },
116
+ "data-source-methods": { typeMatch: editorTypeMatchRules["data-source-methods"] },
117
+ "data-source-method-select": { typeMatch: editorTypeMatchRules["data-source-method-select"] },
118
+ "data-source-field-select": { typeMatch: editorTypeMatchRules["data-source-field-select"] },
119
+ "code-select": {
120
+ effect: codeSelectEffect,
121
+ innerConfig: codeSelectInnerConfig,
122
+ typeMatch: editorTypeMatchRules["code-select"]
123
+ },
124
+ "display-conds": {
125
+ innerConfig: displayCondsInnerConfig,
126
+ typeMatch: editorTypeMatchRules["display-conds"]
127
+ },
128
+ "event-select": {
129
+ effect: eventSelectEffect,
130
+ innerConfig: eventSelectInnerConfig,
131
+ typeMatch: editorTypeMatchRules["event-select"]
132
+ },
133
+ "style-setter": {
134
+ innerConfig: styleSetterInnerConfig,
135
+ typeMatch: editorTypeMatchRules["style-setter"]
136
+ }
137
+ };
138
+ //#endregion
139
+ export { editorFields };
@@ -0,0 +1,2 @@
1
+ import { editorFields } from "./fields/headless-validation.js";
2
+ export { editorFields };
@@ -23,8 +23,10 @@ var useCodeBlockEdit = (codeBlockService) => {
23
23
  return;
24
24
  }
25
25
  let codeContent = "";
26
- if (codeBlock.content) if (typeof codeBlock.content !== "string") codeContent = codeBlock.content.toString();
27
- else codeContent = codeBlock.content;
26
+ if (codeBlock.content) {
27
+ if (typeof codeBlock.content !== "string") codeContent = codeBlock.content.toString();
28
+ else codeContent = codeBlock.content;
29
+ }
28
30
  codeConfig.value = {
29
31
  ...cloneDeep(codeBlock),
30
32
  content: codeContent
@@ -0,0 +1,101 @@
1
+ import { useEditorFormContext } from "./use-form-context.js";
2
+ import { getCodeBlockFormConfig } from "../utils/code-block.js";
3
+ import { computed, inject, provide, ref, useTemplateRef, watch } from "vue";
4
+ //#region packages/editor/src/hooks/use-compare-form.ts
5
+ /**
6
+ * CompareForm / ViewForm 共用逻辑:
7
+ * - 按 `category`(node / data-source / code-block) 加载 FormConfig(支持自定义 `loadConfig`);
8
+ * - 代码块 `content` 归一化为字符串;
9
+ * - 外层容器固定高度 + 内部滚动的 `wrapperStyle`;
10
+ * - 将 services / stage 作为 form context 传给 MForm,保证 filterFunction 上下文一致。
11
+ *
12
+ * 两个组件的差异仅在于是否做新旧值对比,这部分逻辑保留在各自组件中。
13
+ */
14
+ var useCompareForm = (props) => {
15
+ provide("services", props.services);
16
+ const config = ref([]);
17
+ /** vs-code 编辑器的 monaco 配置项,沿用 Editor 顶层 provide('codeOptions', ...) 的注入。 */
18
+ const codeOptions = inject("codeOptions", {});
19
+ /** 将代码块的 content 字段统一成字符串,便于在表单 / 对比中展示 */
20
+ const normalizeCodeBlockValue = (v) => {
21
+ if (!v) return {};
22
+ const next = { ...v };
23
+ if (next.content && typeof next.content !== "string") try {
24
+ next.content = next.content.toString();
25
+ } catch {
26
+ next.content = "";
27
+ }
28
+ return next;
29
+ };
30
+ const currentValues = computed(() => {
31
+ if (props.category === "code-block") return normalizeCodeBlockValue(props.value);
32
+ return props.value || {};
33
+ });
34
+ /**
35
+ * 外层包裹层的样式:当传入 `height` 时启用固定高度 + 内部滚动,
36
+ * 这样滚动条会出现在组件内部,避免父容器(如 Dialog)自身也产生滚动。
37
+ */
38
+ const wrapperStyle = computed(() => {
39
+ if (!props.height) return void 0;
40
+ return {
41
+ height: props.height,
42
+ overflow: "auto"
43
+ };
44
+ });
45
+ const formContext = useEditorFormContext(() => props.services);
46
+ /**
47
+ * 内置的默认 FormConfig 加载逻辑:按 `category` 从对应 service / 工具取配置。
48
+ * 作为 ctx.defaultLoadConfig 透传给自定义 `loadConfig`,方便复用与二次加工。
49
+ */
50
+ const defaultLoadConfig = async () => {
51
+ if (!props.services) return [];
52
+ switch (props.category) {
53
+ case "node":
54
+ if (!props.type) return [];
55
+ return props.services.propsService.getPropsConfig(props.type, { node: props.value });
56
+ case "data-source": return props.services.dataSourceService.getFormConfig(props.type || "base").map((item) => "type" in item && item.type === "tab" ? {
57
+ ...item,
58
+ active: "fields"
59
+ } : item);
60
+ case "code-block": return getCodeBlockFormConfig({
61
+ paramColConfig: props.services.codeBlockService.getParamsColConfig(),
62
+ isDataSource: () => Boolean(props.dataSourceType),
63
+ dataSourceType: () => props.dataSourceType,
64
+ codeOptions,
65
+ editable: false
66
+ });
67
+ default: return [];
68
+ }
69
+ };
70
+ const loadConfig = async () => {
71
+ if (props.loadConfig) {
72
+ config.value = await props.loadConfig({
73
+ category: props.category,
74
+ type: props.type,
75
+ dataSourceType: props.dataSourceType,
76
+ defaultLoadConfig
77
+ });
78
+ return;
79
+ }
80
+ config.value = await defaultLoadConfig();
81
+ };
82
+ watch([
83
+ () => props.category,
84
+ () => props.type,
85
+ () => props.dataSourceType,
86
+ () => props.loadConfig
87
+ ], () => {
88
+ loadConfig();
89
+ }, { immediate: true });
90
+ return {
91
+ config,
92
+ currentValues,
93
+ wrapperStyle,
94
+ formContext,
95
+ loadConfig,
96
+ formRef: useTemplateRef("form"),
97
+ normalizeCodeBlockValue
98
+ };
99
+ };
100
+ //#endregion
101
+ export { useCompareForm };
@@ -0,0 +1,29 @@
1
+ import { FORM_CONTEXT_KEY, mergeFormContexts } from "@tmagic/form";
2
+ import { computed, inject, unref } from "vue";
3
+ //#region packages/editor/src/hooks/use-form-context.ts
4
+ /**
5
+ * 编辑器注入给表单的业务上下文:`services` 与当前画布 `stage`。
6
+ *
7
+ * 由 `Editor.vue`(provide `FORM_CONTEXT_KEY`)、`FormPanel.vue` 与 `useCompareForm`
8
+ * 共用。`stage` 走 computed 而非快照,保证切换画布后配置回调读到的是最新实例。
9
+ *
10
+ * 宿主可能在 `<MEditor>` 外层 provide 了自己的业务字段,这里必须把那一层合并进来:
11
+ * 否则编辑器再 provide 一次会把宿主整层遮蔽掉,属性面板、对比表单里的配置回调就
12
+ * 读不到宿主字段了。`services` / `stage` 由编辑器兜底,优先级高于宿主同名字段。
13
+ *
14
+ * 字段类型见 `@editor/type` 里对 `@tmagic/form-schema` 的 `FormContext` 模块增强。
15
+ */
16
+ var useEditorFormContext = (getServices) => {
17
+ const hostContext = inject(FORM_CONTEXT_KEY, void 0);
18
+ return computed(() => {
19
+ const services = getServices();
20
+ const host = unref(hostContext);
21
+ if (host && host.services === services) return host;
22
+ return mergeFormContexts(host, {
23
+ services,
24
+ stage: services?.editorService.get("stage")
25
+ });
26
+ });
27
+ };
28
+ //#endregion
29
+ export { useEditorFormContext };