@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
@@ -1,15 +1,17 @@
1
1
  <template>
2
- <MGroupList
3
- style="width: 100%"
4
- :config="config"
5
- :name="name"
6
- :disabled="disabled"
7
- :model="model"
8
- :last-values="lastValues"
9
- :prop="prop"
10
- :size="size"
11
- @change="changeHandler"
12
- ></MGroupList>
2
+ <div class="m-fields-display-conds">
3
+ <MGroupList
4
+ :config="config"
5
+ :name="name"
6
+ :disabled="disabled"
7
+ :model="model"
8
+ :last-values="lastValues"
9
+ :is-compare="isCompareMode"
10
+ :prop="prop"
11
+ :size="size"
12
+ @change="changeHandler"
13
+ ></MGroupList>
14
+ </div>
13
15
  </template>
14
16
 
15
17
  <script lang="ts" setup>
@@ -22,156 +24,32 @@ import {
22
24
  type FieldProps,
23
25
  filterFunction,
24
26
  type FormState,
25
- type GroupListConfig,
26
27
  MGroupList,
27
28
  } from '@tmagic/form';
28
29
 
29
- import { useServices } from '@editor/hooks/use-services';
30
- import { getCascaderOptionsFromFields, getFieldType } from '@editor/utils';
30
+ import { createDisplayCondsConfig } from '@editor/fields/configs/displayConds';
31
31
 
32
32
  defineOptions({
33
33
  name: 'm-fields-display-conds',
34
34
  });
35
35
 
36
36
  const emit = defineEmits<{
37
- change: [value: DisplayCond[], eventData?: ContainerChangeEventData];
37
+ change: [value: DisplayCond | DisplayCond[], eventData?: ContainerChangeEventData];
38
38
  }>();
39
39
 
40
40
  const props = withDefaults(defineProps<FieldProps<DisplayCondsConfig>>(), {
41
41
  disabled: false,
42
42
  });
43
43
 
44
- const { dataSourceService } = useServices();
45
44
  const mForm = inject<FormState | undefined>('mForm');
46
45
 
47
46
  const parentFields = computed(() => filterFunction<string[]>(mForm, props.config.parentFields, props) || []);
48
47
 
49
- const fieldOnChange = (_formState: FormState | undefined, v: string[], { model }: { model: Record<string, any> }) => {
50
- const [id, ...fieldNames] = [...parentFields.value, ...v];
51
- const ds = dataSourceService.getDataSourceById(id);
52
- const type = getFieldType(ds, fieldNames);
53
- if (type === 'number') {
54
- model.value = Number(model.value);
55
- } else if (type === 'boolean') {
56
- model.value = Boolean(model.value);
57
- } else if (type === 'null') {
58
- model.value = null;
59
- } else {
60
- model.value = `${model.value}`;
61
- }
62
- return v;
63
- };
64
-
65
- const config = computed<GroupListConfig>(() => ({
66
- type: 'groupList',
67
- name: props.name,
68
- titlePrefix: props.config.titlePrefix,
69
- expandAll: true,
70
- enableToggleMode: false,
71
- flat: props.config.flat,
72
- items: [
73
- {
74
- type: 'table',
75
- name: 'cond',
76
- operateColWidth: props.config.operateColWidth,
77
- enableToggleMode: false,
78
- fixed: props.config.fixed,
79
- flat: props.config.flat,
80
- items: [
81
- parentFields.value.length
82
- ? {
83
- type: 'cascader',
84
- options: () => {
85
- const [dsId, ...keys] = parentFields.value;
86
- const ds = dataSourceService.getDataSourceById(dsId);
87
- if (!ds) {
88
- return [];
89
- }
90
-
91
- let fields = ds.fields || [];
92
- keys.forEach((key) => {
93
- const field = fields.find((f) => f.name === key);
94
- fields = field?.fields || [];
95
- });
96
-
97
- return getCascaderOptionsFromFields(fields, ['string', 'number', 'boolean', 'any']);
98
- },
99
- name: 'field',
100
- value: 'key',
101
- label: '字段',
102
- checkStrictly: false,
103
- onChange: fieldOnChange,
104
- }
105
- : {
106
- type: 'data-source-field-select',
107
- name: 'field',
108
- value: 'key',
109
- label: '字段',
110
- checkStrictly: false,
111
- dataSourceFieldType: ['string', 'number', 'boolean', 'any'],
112
- onChange: fieldOnChange,
113
- },
114
- {
115
- type: 'cond-op-select',
116
- parentFields: parentFields.value,
117
- label: '条件',
118
- width: 140,
119
- name: 'op',
120
- },
121
- {
122
- label: '值',
123
- width: 160,
124
- items: [
125
- {
126
- name: 'value',
127
- type: (_mForm, { model }) => {
128
- const [id, ...fieldNames] = [...parentFields.value, ...model.field];
129
- const ds = dataSourceService.getDataSourceById(id);
130
- const type = getFieldType(ds, fieldNames);
48
+ const config = computed(() => createDisplayCondsConfig(props.config, props.name, parentFields.value));
131
49
 
132
- if (type === 'number') {
133
- return 'number';
134
- }
135
-
136
- if (type === 'boolean') {
137
- return 'select';
138
- }
139
-
140
- if (type === 'null') {
141
- return 'display';
142
- }
143
-
144
- return 'text';
145
- },
146
- options: [
147
- { text: 'true', value: true },
148
- { text: 'false', value: false },
149
- ],
150
- display: (_mForm, { model }) => !['between', 'not_between'].includes(model.op),
151
- displayText: (_mForm: FormState | undefined, { model }: any) => {
152
- if (model.value === null) {
153
- return 'null';
154
- }
155
- return model.value;
156
- },
157
- },
158
- {
159
- name: 'range',
160
- type: 'number-range',
161
- display: (vm, { model }) => ['between', 'not_between'].includes(model.op),
162
- },
163
- ],
164
- },
165
- ],
166
- },
167
- ],
168
- }));
50
+ const isCompareMode = computed(() => Boolean(props.isCompare && props.lastValues));
169
51
 
170
52
  const changeHandler = (v: DisplayCond[], eventData?: ContainerChangeEventData) => {
171
- if (!Array.isArray(props.model[props.name])) {
172
- props.model[props.name] = [];
173
- }
174
-
175
53
  emit('change', v, eventData);
176
54
  };
177
55
  </script>
@@ -15,98 +15,50 @@
15
15
  <div v-else class="fullWidth event-select-container">
16
16
  <div class="event-select-header">
17
17
  <div class="event-select-title">事件配置</div>
18
- <TMagicButton
19
- v-if="!isCompareMode && displayList.length > 0"
20
- class="create-button"
21
- text
22
- type="primary"
23
- :icon="Plus"
24
- :size="size"
25
- :disabled="disabled"
26
- @click="addEvent()"
27
- >添加事件</TMagicButton
28
- >
29
18
  </div>
30
- <MPanel
31
- v-for="entry in displayList"
32
- :key="entry.index"
19
+ <MGroupList
20
+ :config="eventConfig"
21
+ :name="name"
33
22
  :disabled="disabled"
34
- :size="size"
35
- :prop="`${prop}.${entry.index}`"
36
- :config="actionsConfig"
37
- :model="entry.cardItem"
38
- :last-values="entry.lastCardItem"
23
+ :model="model"
24
+ :last-values="lastValues"
39
25
  :is-compare="isCompareMode"
40
- :hide-expand="true"
41
- :label-width="config.labelWidth || '100px'"
26
+ :prop="prop"
27
+ :size="size"
42
28
  @change="onChangeHandler"
43
29
  >
44
- <template #header>
30
+ <template #title="{ model: itemModel, lastValues: itemLastValues, prop: itemProp }">
45
31
  <div class="event-item-header">
46
- <div class="event-item-title">事件{{ Number(entry.index) + 1 }}</div>
47
32
  <MFormContainer
48
33
  class="fullWidth"
49
34
  :config="eventNameConfig"
50
- :model="entry.cardItem"
51
- :last-values="entry.lastCardItem"
35
+ :model="itemModel"
36
+ :last-values="itemLastValues"
52
37
  :is-compare="isCompareMode"
53
38
  :disabled="disabled"
54
39
  :size="size"
55
- :prop="`${prop}.${entry.index}`"
56
- @change="eventNameChangeHandler"
40
+ :prop="itemProp"
41
+ @change="onChangeHandler"
57
42
  ></MFormContainer>
58
- <TMagicButton
59
- class="event-item-delete-button"
60
- v-if="!isCompareMode"
61
- link
62
- :icon="Delete"
63
- :disabled="disabled"
64
- :size="size"
65
- @click="removeEvent(Number(entry.index))"
66
- ></TMagicButton>
67
43
  </div>
68
44
  </template>
69
- </MPanel>
70
-
71
- <TMagicButton
72
- v-if="!isCompareMode"
73
- class="create-button fullWidth"
74
- :icon="Plus"
75
- :disabled="disabled"
76
- @click="addEvent()"
77
- >添加事件</TMagicButton
78
- >
45
+ </MGroupList>
79
46
  </div>
80
47
  </div>
81
48
  </template>
82
49
 
83
50
  <script lang="ts" setup>
84
51
  import { computed } from 'vue';
85
- import { Delete } from '@element-plus/icons-vue';
86
- import { Plus } from '@element-plus/icons-vue';
87
- import { has } from 'lodash-es';
88
52
 
89
- import type { EventOption, MComponent, MContainer } from '@tmagic/core';
90
- import { ActionType } from '@tmagic/core';
91
- import { TMagicButton } from '@tmagic/design';
92
- import type {
93
- CascaderOption,
94
- CodeSelectColConfig,
95
- ContainerChangeEventData,
96
- DataSourceMethodSelectConfig,
97
- DynamicTypeConfig,
98
- EventSelectConfig,
99
- FieldProps,
100
- FormState,
101
- PanelConfig,
102
- TableConfig,
103
- UISelectConfig,
104
- } from '@tmagic/form';
105
- import { defineFormItem, MContainer as MFormContainer, MPanel, MTable } from '@tmagic/form';
106
- import { DATA_SOURCE_FIELDS_CHANGE_EVENT_PREFIX, traverseNode } from '@tmagic/utils';
53
+ import type { ContainerChangeEventData, EventSelectConfig, FieldProps } from '@tmagic/form';
54
+ import { MContainer as MFormContainer, MGroupList, MTable } from '@tmagic/form';
107
55
 
108
- import { useServices } from '@editor/hooks/use-services';
109
- import { getCascaderOptionsFromFields } from '@editor/utils';
56
+ import {
57
+ createEventNameConfig,
58
+ createEventSelectConfig,
59
+ createLegacyTableConfig,
60
+ isLegacyEventValue,
61
+ } from '@editor/fields/configs/eventSelect';
110
62
 
111
63
  defineOptions({
112
64
  name: 'MFieldsEventSelect',
@@ -118,364 +70,25 @@ const emit = defineEmits<{
118
70
  change: [v: any, eventData?: ContainerChangeEventData];
119
71
  }>();
120
72
 
121
- const { editorService, dataSourceService, eventsService, codeBlockService, propsService } = useServices();
122
-
123
- // 事件名称下拉框表单配置
124
- const eventNameConfig = computed(() => {
125
- const defaultEventNameConfig = {
126
- name: 'name',
127
- text: '事件类型',
128
- type: (mForm: FormState | undefined, { formValue }: any) => {
129
- if (
130
- props.config.src !== 'component' ||
131
- (formValue.type === 'page-fragment-container' && formValue.pageFragmentId)
132
- ) {
133
- return 'cascader';
134
- }
135
- return 'select';
136
- },
137
- labelWidth: '70px',
138
- checkStrictly: () => props.config.src !== 'component',
139
- valueSeparator: '.',
140
- options: (mForm: FormState, { formValue }: any) => {
141
- let events: EventOption[] | CascaderOption[] = [];
142
-
143
- if (props.config.src === 'component') {
144
- events = eventsService.getEvent(formValue.type);
145
-
146
- if (formValue.type === 'page-fragment-container' && formValue.pageFragmentId) {
147
- const pageFragment = editorService.get('root')?.items?.find((page) => page.id === formValue.pageFragmentId);
148
- if (pageFragment) {
149
- events = [
150
- {
151
- label: pageFragment.name || '页面片容器',
152
- value: pageFragment.id,
153
- children: events,
154
- },
155
- ];
156
- pageFragment.items.forEach((node) => {
157
- traverseNode<MComponent | MContainer>(node, (node) => {
158
- const nodeEvents = (node.type && eventsService.getEvent(node.type)) || [];
159
-
160
- events.push({
161
- label: `${node.name}_${node.id}`,
162
- value: `${node.id}`,
163
- children: nodeEvents,
164
- });
165
- });
166
- });
167
-
168
- return events;
169
- }
170
- }
171
-
172
- return events.map((option) => ({
173
- text: option.label,
174
- value: option.value,
175
- }));
176
- }
177
-
178
- if (props.config.src === 'datasource') {
179
- // 从数据源类型中获取到相关事件
180
- events = dataSourceService.getFormEvent(formValue.type);
181
- // 从数据源类型和实例中分别获取数据以追加数据变化的事件
182
- const dataSource = dataSourceService.getDataSourceById(formValue.id);
183
- const fields = dataSource?.fields || [];
184
- if (fields.length > 0) {
185
- return [
186
- ...events,
187
- {
188
- label: '数据变化',
189
- value: DATA_SOURCE_FIELDS_CHANGE_EVENT_PREFIX,
190
- children: getCascaderOptionsFromFields(fields),
191
- },
192
- ];
193
- }
194
-
195
- return events;
196
- }
197
- },
198
- };
199
- return { ...defaultEventNameConfig, ...props.config.eventNameConfig };
200
- });
201
-
202
- // 联动类型
203
- const actionTypeConfig = computed(() => {
204
- const defaultActionTypeConfig = {
205
- name: 'actionType',
206
- text: '联动类型',
207
- type: 'select',
208
- labelPosition: 'left',
209
- defaultValue: ActionType.COMP,
210
- options: () => {
211
- const o: {
212
- text: string;
213
- label: string;
214
- value: string;
215
- disabled?: boolean;
216
- }[] = [
217
- {
218
- text: '组件',
219
- label: '组件',
220
- value: ActionType.COMP,
221
- },
222
- ];
223
-
224
- if (!propsService.getDisabledCodeBlock()) {
225
- o.push({
226
- text: '代码',
227
- label: '代码',
228
- disabled: !Object.keys(codeBlockService.getCodeDsl() || {}).length,
229
- value: ActionType.CODE,
230
- });
231
- }
232
-
233
- if (!propsService.getDisabledDataSource()) {
234
- o.push({
235
- text: '数据源',
236
- label: '数据源',
237
- value: ActionType.DATA_SOURCE,
238
- });
239
- }
240
-
241
- return o;
242
- },
243
- };
244
- return { ...defaultActionTypeConfig, ...props.config.actionTypeConfig };
245
- });
246
-
247
- // 联动组件配置
248
- const targetCompConfig = computed(() => {
249
- const defaultTargetCompConfig: UISelectConfig = {
250
- name: 'to',
251
- text: '联动组件',
252
- type: 'ui-select',
253
- labelPosition: 'left',
254
- display: (_mForm, { model }) => model.actionType === ActionType.COMP,
255
- onChange: (_MForm, _v, { setModel }) => {
256
- setModel('method', '');
257
- },
258
- };
259
- return { ...defaultTargetCompConfig, ...props.config.targetCompConfig };
260
- });
261
-
262
- // 联动组件动作配置
263
- const compActionConfig = computed(() => {
264
- const defaultCompActionConfig: DynamicTypeConfig = {
265
- name: 'method',
266
- text: '动作',
267
- labelPosition: 'left',
268
- type: (mForm: FormState | undefined, { model }: any) => {
269
- const to = editorService.getNodeById(model.to);
270
-
271
- if (to && to.type === 'page-fragment-container' && to.pageFragmentId) {
272
- return 'cascader';
273
- }
274
-
275
- return 'select';
276
- },
277
- checkStrictly: () => props.config.src !== 'component',
278
- display: (mForm: FormState | undefined, { model }: any) => model.actionType === ActionType.COMP,
279
- options: (mForm: FormState, { model }: any) => {
280
- const node = editorService.getNodeById(model.to);
281
- if (!node?.type) return [];
282
-
283
- let methods: EventOption[] | CascaderOption[] = [];
73
+ const tableConfig = computed(() => createLegacyTableConfig(props.config));
284
74
 
285
- methods = eventsService.getMethod(node.type, model.to);
75
+ const eventNameConfig = computed(() => createEventNameConfig(props.config));
286
76
 
287
- if (node.type === 'page-fragment-container' && node.pageFragmentId) {
288
- const pageFragment = editorService.get('root')?.items?.find((page) => page.id === node.pageFragmentId);
289
- if (pageFragment) {
290
- methods = [];
291
- pageFragment.items.forEach((node: MComponent | MContainer) => {
292
- traverseNode<MComponent | MContainer>(node, (node) => {
293
- const nodeMethods = (node.type && eventsService.getMethod(node.type, node.id)) || [];
77
+ const eventConfig = computed(() => createEventSelectConfig(props.config, props.name));
294
78
 
295
- if (nodeMethods.length) {
296
- methods.push({
297
- label: `${node.name}_${node.id}`,
298
- value: `${node.id}`,
299
- children: nodeMethods,
300
- });
301
- }
302
- });
303
- });
304
-
305
- return methods;
306
- }
307
- }
308
-
309
- return methods.map((method) => ({
310
- text: method.label,
311
- value: method.value,
312
- }));
313
- },
314
- };
315
- return { ...defaultCompActionConfig, ...props.config.compActionConfig };
316
- });
317
-
318
- // 代码联动配置
319
- const codeActionConfig = computed(() => {
320
- const defaultCodeActionConfig: CodeSelectColConfig = {
321
- type: 'code-select-col',
322
- text: '代码块',
323
- name: 'codeId',
324
- notEditable: () => !codeBlockService.getEditStatus(),
325
- display: (mForm, { model }) => model.actionType === ActionType.CODE,
326
- };
327
- return { ...defaultCodeActionConfig, ...props.config.codeActionConfig };
328
- });
329
-
330
- // 数据源联动配置
331
- const dataSourceActionConfig = computed(() => {
332
- const defaultDataSourceActionConfig: DataSourceMethodSelectConfig = {
333
- type: 'data-source-method-select',
334
- text: '数据源方法',
335
- name: 'dataSourceMethod',
336
- notEditable: () => !dataSourceService.get('editable'),
337
- display: (mForm, { model }) => model.actionType === ActionType.DATA_SOURCE,
338
- };
339
- return { ...defaultDataSourceActionConfig, ...props.config.dataSourceActionConfig };
340
- });
341
-
342
- // 兼容旧的数据格式
343
- const tableConfig = computed(
344
- () =>
345
- defineFormItem({
346
- type: 'table',
347
- name: 'events',
348
- items: [
349
- {
350
- name: 'name',
351
- label: '事件名',
352
- type: eventNameConfig.value.type,
353
- options: (mForm: FormState, { formValue }: any) =>
354
- eventsService.getEvent(formValue.type).map((option: any) => ({
355
- text: option.label,
356
- value: option.value,
357
- })),
358
- },
359
- {
360
- name: 'to',
361
- label: '联动组件',
362
- type: 'ui-select',
363
- },
364
- {
365
- name: 'method',
366
- label: '动作',
367
- type: compActionConfig.value.type,
368
- options: (mForm: FormState, { model }: any) => {
369
- const node = editorService.getNodeById(model.to);
370
- if (!node?.type) return [];
371
-
372
- return eventsService.getMethod(node.type, model.to).map((option: any) => ({
373
- text: option.label,
374
- value: option.value,
375
- }));
376
- },
377
- },
378
- ],
379
- }) as TableConfig,
380
- );
381
-
382
- // 组件动作组表单配置
383
- const actionsConfig = computed(
384
- () =>
385
- defineFormItem({
386
- type: 'panel',
387
- labelPosition: 'left',
388
- flat: true,
389
- items: [
390
- {
391
- type: 'group-list',
392
- name: 'actions',
393
- expandAll: true,
394
- enableToggleMode: false,
395
- titlePrefix: '动作',
396
- labelPosition: 'left',
397
- flat: true,
398
- items: [
399
- actionTypeConfig.value,
400
- targetCompConfig.value,
401
- compActionConfig.value,
402
- codeActionConfig.value,
403
- dataSourceActionConfig.value,
404
- ],
405
- },
406
- ],
407
- }) as PanelConfig,
408
- );
409
-
410
- // 是否为旧的数据格式
411
- const isOldVersion = computed(() => {
412
- if (props.model[props.name].length === 0) return false;
413
- return !has(props.model[props.name][0], 'actions');
414
- });
79
+ const isOldVersion = computed(() => isLegacyEventValue(props.model[props.name]));
415
80
 
416
81
  /**
417
82
  * 对比模式判定:
418
83
  *
419
- * event-select 内部由「事件列表 + 嵌套子表单」组成,属于复合字段。父级 `MFormContainer` 已将其
420
- * 归入「自接管对比字段」(见 Container.vue 的 `SELF_DIFF_FIELD_TYPES`),即对比时只渲染一次本组件,
421
- * 并把当前值 `model` 与历史值 `lastValues` 一并传入,由本组件把 `is-compare`/`lastValues` 透传给
422
- * 内部的 MPanel / MFormContainer,逐项(事件名、动作)展示前后差异。
84
+ * event-select 内部是事件列表 group-list。父级 `MFormContainer` 已将其归入「自接管对比字段」
85
+ * (见 Container.vue 的 `SELF_DIFF_FIELD_TYPES`),对比时只渲染一次本组件,并把 `is-compare` /
86
+ * `lastValues` 透传给内部 MGroupList title slot 里的事件名表单。
423
87
  *
424
88
  * 仅当存在历史值时才启用对比,避免 lastValues 缺失时退化为「全部新增」的空对比。
425
89
  */
426
90
  const isCompareMode = computed(() => Boolean(props.isCompare && props.lastValues));
427
91
 
428
- /**
429
- * 待渲染的事件卡片列表。
430
- *
431
- * - 非对比模式:直接映射当前事件列表,`lastCardItem` 为空;
432
- * - 对比模式:按索引对齐当前值与历史值,取两者长度的最大值,使得「新增」(仅当前有)与
433
- * 「删除」(仅历史有)的事件都能被渲染出来;缺失的一侧用空对象兜底,从而让子级正确高亮差异。
434
- */
435
- const displayList = computed<{ cardItem: any; lastCardItem: any; index: number }[]>(() => {
436
- const current = props.model[props.name] || [];
437
-
438
- if (!isCompareMode.value) {
439
- return current.map((cardItem: any, index: number) => ({ cardItem, lastCardItem: undefined, index }));
440
- }
441
-
442
- const last = props.lastValues?.[props.name] || [];
443
- const length = Math.max(current.length, last.length);
444
-
445
- return Array.from({ length }, (_, index) => ({
446
- cardItem: current[index] ?? {},
447
- lastCardItem: last[index] ?? {},
448
- index,
449
- }));
450
- });
451
-
452
- // 添加事件
453
- const addEvent = () => {
454
- const defaultEvent = {
455
- name: '',
456
- actions: [],
457
- };
458
-
459
- if (!props.model[props.name]) {
460
- props.model[props.name] = [];
461
- }
462
-
463
- emit('change', defaultEvent, {
464
- modifyKey: props.model[props.name].length,
465
- });
466
- };
467
-
468
- // 删除事件
469
- const removeEvent = (index: number) => {
470
- if (!props.name) return;
471
- props.model[props.name].splice(index, 1);
472
- emit('change', props.model[props.name]);
473
- };
474
-
475
- const eventNameChangeHandler = (v: any, eventData: ContainerChangeEventData) => {
476
- emit('change', props.model[props.name], eventData);
477
- };
478
-
479
- const onChangeHandler = (v: any, eventData: ContainerChangeEventData) =>
92
+ const onChangeHandler = (_v: any, eventData?: ContainerChangeEventData) =>
480
93
  emit('change', props.model[props.name], eventData);
481
94
  </script>
@@ -75,7 +75,7 @@ import { computed, inject, ref, watchEffect } from 'vue';
75
75
  import { Delete, Plus } from '@element-plus/icons-vue';
76
76
 
77
77
  import { TMagicButton, TMagicInput } from '@tmagic/design';
78
- import type { FieldProps, FormState, KeyValueConfig } from '@tmagic/form';
78
+ import { type FieldProps, type FormState, type KeyValueConfig } from '@tmagic/form';
79
79
 
80
80
  import CodeIcon from '@editor/icons/CodeIcon.vue';
81
81
  import MagicCodeEditor from '@editor/layouts/CodeEditor.vue';