@tmagic/editor 1.8.0-beta.1 → 1.8.0-beta.11

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 (232) hide show
  1. package/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +31 -5
  2. package/dist/es/components/CodeBlockEditor.vue_vue_type_script_setup_true_lang.js +21 -113
  3. package/dist/es/components/CodeParams.vue_vue_type_script_setup_true_lang.js +7 -1
  4. package/dist/es/components/CompareForm.js +5 -0
  5. package/dist/es/components/CompareForm.vue_vue_type_script_setup_true_lang.js +196 -0
  6. package/dist/es/components/ContentMenu.vue_vue_type_script_setup_true_lang.js +1 -1
  7. package/dist/es/components/FloatingBox.vue_vue_type_script_setup_true_lang.js +2 -2
  8. package/dist/es/components/Icon.vue_vue_type_script_setup_true_lang.js +1 -1
  9. package/dist/es/components/Resizer.vue_vue_type_script_setup_true_lang.js +1 -1
  10. package/dist/es/components/ScrollBar.vue_vue_type_script_setup_true_lang.js +1 -1
  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 +7 -7
  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/editorProps.js +2 -0
  18. package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +20 -4
  19. package/dist/es/fields/CodeLink.vue_vue_type_script_setup_true_lang.js +3 -6
  20. package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +19 -3
  21. package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +42 -8
  22. package/dist/es/fields/CondOpSelect.vue_vue_type_script_setup_true_lang.js +1 -1
  23. package/dist/es/fields/DataSourceFieldSelect/FieldSelect.vue_vue_type_script_setup_true_lang.js +14 -6
  24. package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +3 -3
  25. package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +41 -16
  26. package/dist/es/fields/DataSourceInput.vue_vue_type_script_setup_true_lang.js +2 -2
  27. package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +9 -5
  28. package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +40 -19
  29. package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +17 -9
  30. package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +4 -2
  31. package/dist/es/fields/DisplayConds.vue_vue_type_script_setup_true_lang.js +1 -1
  32. package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +59 -12
  33. package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +12 -7
  34. package/dist/es/fields/PageFragmentSelect.vue_vue_type_script_setup_true_lang.js +1 -1
  35. package/dist/es/fields/StyleSetter/Index.vue_vue_type_script_setup_true_lang.js +1 -1
  36. package/dist/es/fields/StyleSetter/components/BackgroundPosition.vue_vue_type_script_setup_true_lang.js +1 -1
  37. package/dist/es/fields/StyleSetter/components/Border.vue_vue_type_script_setup_true_lang.js +28 -6
  38. package/dist/es/fields/StyleSetter/components/Box.vue_vue_type_script_setup_true_lang.js +1 -1
  39. package/dist/es/fields/StyleSetter/icons/background-repeat/NoRepeat.js +1 -1
  40. package/dist/es/fields/StyleSetter/icons/background-repeat/Repeat.js +1 -1
  41. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatX.js +1 -1
  42. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatY.js +1 -1
  43. package/dist/es/fields/StyleSetter/icons/display/Block.js +1 -1
  44. package/dist/es/fields/StyleSetter/icons/display/Flex.js +1 -1
  45. package/dist/es/fields/StyleSetter/icons/display/Inline.js +1 -1
  46. package/dist/es/fields/StyleSetter/icons/display/InlineBlock.js +1 -1
  47. package/dist/es/fields/StyleSetter/icons/display/None.js +1 -1
  48. package/dist/es/fields/StyleSetter/icons/flex-direction/Column.js +1 -1
  49. package/dist/es/fields/StyleSetter/icons/flex-direction/ColumnReverse.js +1 -1
  50. package/dist/es/fields/StyleSetter/icons/flex-direction/Row.js +1 -1
  51. package/dist/es/fields/StyleSetter/icons/flex-direction/RowReverse.js +1 -1
  52. package/dist/es/fields/StyleSetter/icons/justify-content/Center.js +1 -1
  53. package/dist/es/fields/StyleSetter/icons/justify-content/FlexEnd.js +1 -1
  54. package/dist/es/fields/StyleSetter/icons/justify-content/FlexStart.js +1 -1
  55. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceAround.js +1 -1
  56. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceBetween.js +1 -1
  57. package/dist/es/fields/StyleSetter/icons/text-align/Center.js +1 -1
  58. package/dist/es/fields/StyleSetter/icons/text-align/Left.js +1 -1
  59. package/dist/es/fields/StyleSetter/icons/text-align/Right.js +1 -1
  60. package/dist/es/fields/StyleSetter/pro/Background.vue_vue_type_script_setup_true_lang.js +1 -1
  61. package/dist/es/fields/StyleSetter/pro/Border.vue_vue_type_script_setup_true_lang.js +1 -1
  62. package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +1 -1
  63. package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +1 -1
  64. package/dist/es/fields/StyleSetter/pro/Position.vue_vue_type_script_setup_true_lang.js +1 -1
  65. package/dist/es/fields/StyleSetter/pro/Transform.vue_vue_type_script_setup_true_lang.js +1 -1
  66. package/dist/es/fields/UISelect.vue_vue_type_script_setup_true_lang.js +9 -6
  67. package/dist/es/hooks/use-code-block-edit.js +7 -4
  68. package/dist/es/hooks/use-data-source-edit.js +5 -2
  69. package/dist/es/hooks/use-stage.js +22 -10
  70. package/dist/es/icons/CenterIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  71. package/dist/es/icons/CodeIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  72. package/dist/es/icons/FolderMinusIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  73. package/dist/es/index.js +14 -3
  74. package/dist/es/initService.js +7 -7
  75. package/dist/es/layouts/AddPageBox.vue_vue_type_script_setup_true_lang.js +1 -1
  76. package/dist/es/layouts/CodeEditor.vue_vue_type_script_setup_true_lang.js +7 -6
  77. package/dist/es/layouts/Framework.vue_vue_type_script_setup_true_lang.js +14 -9
  78. package/dist/es/layouts/NavMenu.vue_vue_type_script_setup_true_lang.js +12 -4
  79. package/dist/es/layouts/NavMenuColumn.vue_vue_type_script_setup_true_lang.js +1 -1
  80. package/dist/es/layouts/history-list/Bucket.js +5 -0
  81. package/dist/es/layouts/history-list/Bucket.vue_vue_type_script_setup_true_lang.js +71 -0
  82. package/dist/es/layouts/history-list/BucketTab.js +5 -0
  83. package/dist/es/layouts/history-list/BucketTab.vue_vue_type_script_setup_true_lang.js +62 -0
  84. package/dist/es/layouts/history-list/GroupRow.js +5 -0
  85. package/dist/es/layouts/history-list/GroupRow.vue_vue_type_script_setup_true_lang.js +269 -0
  86. package/dist/es/layouts/history-list/HistoryDiffDialog.js +5 -0
  87. package/dist/es/layouts/history-list/HistoryDiffDialog.vue_vue_type_script_setup_true_lang.js +294 -0
  88. package/dist/es/layouts/history-list/HistoryListPanel.js +5 -0
  89. package/dist/es/layouts/history-list/HistoryListPanel.vue_vue_type_script_setup_true_lang.js +327 -0
  90. package/dist/es/layouts/history-list/InitialRow.js +5 -0
  91. package/dist/es/layouts/history-list/InitialRow.vue_vue_type_script_setup_true_lang.js +83 -0
  92. package/dist/es/layouts/history-list/PageTab.js +5 -0
  93. package/dist/es/layouts/history-list/PageTab.vue_vue_type_script_setup_true_lang.js +95 -0
  94. package/dist/es/layouts/history-list/composables.js +184 -0
  95. package/dist/es/layouts/history-list/useHistoryList.js +56 -0
  96. package/dist/es/layouts/history-list/useHistoryRevert.js +313 -0
  97. package/dist/es/layouts/page-bar/AddButton.vue_vue_type_script_setup_true_lang.js +1 -1
  98. package/dist/es/layouts/page-bar/PageBar.vue_vue_type_script_setup_true_lang.js +5 -3
  99. package/dist/es/layouts/page-bar/PageBarScrollContainer.vue_vue_type_script_setup_true_lang.js +1 -1
  100. package/dist/es/layouts/page-bar/PageList.vue_vue_type_script_setup_true_lang.js +1 -1
  101. package/dist/es/layouts/page-bar/Search.vue_vue_type_script_setup_true_lang.js +2 -2
  102. package/dist/es/layouts/props-panel/FormPanel.vue_vue_type_script_setup_true_lang.js +1 -1
  103. package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +6 -2
  104. package/dist/es/layouts/sidebar/ComponentListPanel.vue_vue_type_script_setup_true_lang.js +2 -2
  105. package/dist/es/layouts/sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js +8 -4
  106. package/dist/es/layouts/sidebar/code-block/CodeBlockList.vue_vue_type_script_setup_true_lang.js +4 -4
  107. package/dist/es/layouts/sidebar/code-block/CodeBlockListPanel.vue_vue_type_script_setup_true_lang.js +2 -2
  108. package/dist/es/layouts/sidebar/code-block/useContentMenu.js +1 -1
  109. package/dist/es/layouts/sidebar/data-source/DataSourceAddButton.vue_vue_type_script_setup_true_lang.js +1 -1
  110. package/dist/es/layouts/sidebar/data-source/DataSourceConfigPanel.vue_vue_type_script_setup_true_lang.js +19 -6
  111. package/dist/es/layouts/sidebar/data-source/DataSourceList.vue_vue_type_script_setup_true_lang.js +1 -1
  112. package/dist/es/layouts/sidebar/data-source/DataSourceListPanel.vue_vue_type_script_setup_true_lang.js +25 -3
  113. package/dist/es/layouts/sidebar/data-source/useContentMenu.js +1 -1
  114. package/dist/es/layouts/sidebar/layer/LayerMenu.vue_vue_type_script_setup_true_lang.js +6 -6
  115. package/dist/es/layouts/sidebar/layer/LayerNodeTool.vue_vue_type_script_setup_true_lang.js +2 -2
  116. package/dist/es/layouts/sidebar/layer/LayerPanel.vue_vue_type_script_setup_true_lang.js +1 -1
  117. package/dist/es/layouts/sidebar/layer/use-node-status.js +1 -1
  118. package/dist/es/layouts/workspace/Breadcrumb.vue_vue_type_script_setup_true_lang.js +1 -1
  119. package/dist/es/layouts/workspace/Workspace.vue_vue_type_script_setup_true_lang.js +1 -1
  120. package/dist/es/layouts/workspace/viewer/NodeListMenu.vue_vue_type_script_setup_true_lang.js +1 -1
  121. package/dist/es/layouts/workspace/viewer/Stage.vue_vue_type_script_setup_true_lang.js +2 -2
  122. package/dist/es/layouts/workspace/viewer/StageOverlay.vue_vue_type_script_setup_true_lang.js +1 -1
  123. package/dist/es/layouts/workspace/viewer/ViewerMenu.vue_vue_type_script_setup_true_lang.js +9 -9
  124. package/dist/es/services/BaseService.js +31 -68
  125. package/dist/es/services/codeBlock.js +286 -8
  126. package/dist/es/services/componentList.js +2 -2
  127. package/dist/es/services/dataSource.js +287 -8
  128. package/dist/es/services/dep.js +21 -9
  129. package/dist/es/services/editor.js +655 -194
  130. package/dist/es/services/events.js +2 -2
  131. package/dist/es/services/history.js +390 -47
  132. package/dist/es/services/keybinding.js +5 -5
  133. package/dist/es/services/props.js +8 -8
  134. package/dist/es/services/stageOverlay.js +2 -2
  135. package/dist/es/services/storage.js +2 -2
  136. package/dist/es/services/ui.js +5 -2
  137. package/dist/es/style.css +456 -8
  138. package/dist/es/utils/code-block.js +122 -0
  139. package/dist/es/utils/content-menu.js +19 -12
  140. package/dist/es/utils/data-source/index.js +2 -0
  141. package/dist/es/utils/dep/worker.js +1 -1
  142. package/dist/es/utils/editor.js +105 -51
  143. package/dist/es/utils/history.js +220 -0
  144. package/dist/es/utils/indexed-db.js +86 -0
  145. package/dist/es/utils/undo-redo.js +80 -1
  146. package/dist/style.css +456 -8
  147. package/dist/tmagic-editor.umd.cjs +11149 -6646
  148. package/package.json +8 -8
  149. package/src/Editor.vue +25 -1
  150. package/src/components/CodeBlockEditor.vue +20 -109
  151. package/src/components/CodeParams.vue +6 -0
  152. package/src/components/CompareForm.vue +277 -0
  153. package/src/components/ToolButton.vue +2 -2
  154. package/src/editorProps.ts +9 -0
  155. package/src/fields/Code.vue +19 -3
  156. package/src/fields/CodeLink.vue +2 -5
  157. package/src/fields/CodeSelect.vue +17 -1
  158. package/src/fields/CodeSelectCol.vue +37 -3
  159. package/src/fields/DataSourceFieldSelect/FieldSelect.vue +23 -3
  160. package/src/fields/DataSourceFieldSelect/Index.vue +2 -2
  161. package/src/fields/DataSourceFields.vue +48 -10
  162. package/src/fields/DataSourceInput.vue +3 -3
  163. package/src/fields/DataSourceMethodSelect.vue +12 -4
  164. package/src/fields/DataSourceMethods.vue +55 -24
  165. package/src/fields/DataSourceMocks.vue +13 -3
  166. package/src/fields/DataSourceSelect.vue +4 -1
  167. package/src/fields/EventSelect.vue +57 -8
  168. package/src/fields/KeyValue.vue +17 -4
  169. package/src/fields/StyleSetter/components/Border.vue +15 -6
  170. package/src/fields/UISelect.vue +5 -2
  171. package/src/hooks/use-code-block-edit.ts +9 -5
  172. package/src/hooks/use-data-source-edit.ts +2 -2
  173. package/src/hooks/use-stage.ts +26 -9
  174. package/src/index.ts +8 -0
  175. package/src/initService.ts +1 -1
  176. package/src/layouts/CodeEditor.vue +17 -5
  177. package/src/layouts/Framework.vue +11 -6
  178. package/src/layouts/NavMenu.vue +12 -3
  179. package/src/layouts/history-list/Bucket.vue +91 -0
  180. package/src/layouts/history-list/BucketTab.vue +72 -0
  181. package/src/layouts/history-list/GroupRow.vue +304 -0
  182. package/src/layouts/history-list/HistoryDiffDialog.vue +281 -0
  183. package/src/layouts/history-list/HistoryListPanel.vue +367 -0
  184. package/src/layouts/history-list/InitialRow.vue +71 -0
  185. package/src/layouts/history-list/PageTab.vue +118 -0
  186. package/src/layouts/history-list/composables.ts +309 -0
  187. package/src/layouts/history-list/useHistoryList.ts +60 -0
  188. package/src/layouts/history-list/useHistoryRevert.ts +421 -0
  189. package/src/layouts/page-bar/PageBar.vue +4 -2
  190. package/src/layouts/props-panel/PropsPanel.vue +5 -1
  191. package/src/layouts/sidebar/ComponentListPanel.vue +9 -5
  192. package/src/layouts/sidebar/Sidebar.vue +8 -3
  193. package/src/layouts/sidebar/code-block/CodeBlockList.vue +5 -5
  194. package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +1 -1
  195. package/src/layouts/sidebar/code-block/useContentMenu.ts +1 -1
  196. package/src/layouts/sidebar/data-source/DataSourceConfigPanel.vue +31 -2
  197. package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +27 -2
  198. package/src/layouts/sidebar/data-source/useContentMenu.ts +1 -1
  199. package/src/layouts/sidebar/layer/LayerMenu.vue +19 -11
  200. package/src/layouts/sidebar/layer/LayerNodeTool.vue +7 -4
  201. package/src/layouts/sidebar/layer/use-node-status.ts +9 -6
  202. package/src/layouts/workspace/viewer/Stage.vue +1 -1
  203. package/src/layouts/workspace/viewer/ViewerMenu.vue +8 -8
  204. package/src/services/BaseService.ts +35 -86
  205. package/src/services/codeBlock.ts +361 -5
  206. package/src/services/dataSource.ts +336 -6
  207. package/src/services/dep.ts +32 -9
  208. package/src/services/editor.ts +834 -194
  209. package/src/services/history.ts +509 -49
  210. package/src/services/keybinding.ts +3 -3
  211. package/src/services/props.ts +2 -2
  212. package/src/services/ui.ts +7 -0
  213. package/src/theme/history-list-panel.scss +557 -0
  214. package/src/theme/page-bar.scss +0 -4
  215. package/src/theme/props-panel.scss +3 -3
  216. package/src/theme/style-setter/border.scss +4 -1
  217. package/src/theme/theme.scss +1 -0
  218. package/src/type.ts +613 -31
  219. package/src/utils/code-block.ts +150 -0
  220. package/src/utils/content-menu.ts +25 -13
  221. package/src/utils/data-source/index.ts +2 -0
  222. package/src/utils/dep/worker.ts +5 -3
  223. package/src/utils/editor.ts +166 -60
  224. package/src/utils/history.ts +286 -0
  225. package/src/utils/index.ts +3 -0
  226. package/src/utils/indexed-db.ts +122 -0
  227. package/src/utils/undo-redo.ts +111 -0
  228. package/types/index.d.ts +3197 -896
  229. package/dist/es/utils/compose.js +0 -44
  230. package/dist/es/utils/editor-history.js +0 -100
  231. package/src/utils/compose.ts +0 -52
  232. package/src/utils/editor-history.ts +0 -138
@@ -6,6 +6,7 @@ var defaultEditorProps = {
6
6
  disabledMultiSelect: false,
7
7
  alwaysMultiSelect: false,
8
8
  disabledPageFragment: false,
9
+ disabledFlashTip: false,
9
10
  disabledStageOverlay: false,
10
11
  containerHighlightClassName: CONTAINER_HIGHLIGHT_CLASS_NAME,
11
12
  containerHighlightDuration: 800,
@@ -15,6 +16,7 @@ var defaultEditorProps = {
15
16
  disabledCodeBlock: false,
16
17
  componentGroupList: () => [],
17
18
  datasourceList: () => [],
19
+ historyListExtraTabs: () => [],
18
20
  menu: () => ({
19
21
  left: [],
20
22
  right: []
@@ -1,7 +1,7 @@
1
1
  import CodeEditor_default from "../layouts/CodeEditor.js";
2
- import { createBlock, defineComponent, openBlock } from "vue";
2
+ import { computed, createBlock, defineComponent, openBlock } from "vue";
3
3
  //#region packages/editor/src/fields/Code.vue?vue&type=script&setup=true&lang.ts
4
- var Code_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
4
+ var Code_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
5
5
  name: "MFieldsVsCode",
6
6
  __name: "Code",
7
7
  props: {
@@ -22,17 +22,31 @@ var Code_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCom
22
22
  emits: ["change"],
23
23
  setup(__props, { emit: __emit }) {
24
24
  const emit = __emit;
25
+ const props = __props;
26
+ /**
27
+ * 对比模式判定:
28
+ *
29
+ * - 当 `isCompare === true` 时,由父级 `MFormContainer` 统一渲染一次本字段(不再渲染前后两份独立组件),
30
+ * 并把 `model`(当前值)与 `lastValues`(历史值)一并传入;
31
+ * - 此时本字段切换到 monaco 自带的 diff 编辑器(左侧旧、右侧新),相比"两个独立 monaco 实例"更直观,
32
+ * 也避免了同一表单内重复实例化重型编辑器带来的开销。
33
+ *
34
+ * 仅当存在历史值(lastValues)且开启了对比模式时启用 diff,避免在 lastValues 缺失时退化为空对比。
35
+ */
36
+ const diffMode = computed(() => Boolean(props.isCompare && props.lastValues));
25
37
  const save = (v) => {
26
38
  emit("change", v);
27
39
  };
28
40
  return (_ctx, _cache) => {
29
41
  return openBlock(), createBlock(CodeEditor_default, {
30
42
  height: __props.config.height,
31
- "init-values": __props.model[__props.name],
43
+ type: diffMode.value ? "diff" : void 0,
44
+ "init-values": diffMode.value ? (__props.lastValues || {})[__props.name] : __props.model[__props.name],
45
+ "modified-values": diffMode.value ? __props.model[__props.name] : void 0,
32
46
  language: __props.config.language,
33
47
  options: {
34
48
  ...__props.config.options,
35
- readOnly: __props.disabled
49
+ readOnly: diffMode.value ? true : __props.disabled
36
50
  },
37
51
  autosize: __props.config.autosize,
38
52
  parse: __props.config.parse,
@@ -40,7 +54,9 @@ var Code_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCom
40
54
  onSave: save
41
55
  }, null, 8, [
42
56
  "height",
57
+ "type",
43
58
  "init-values",
59
+ "modified-values",
44
60
  "language",
45
61
  "options",
46
62
  "autosize",
@@ -1,8 +1,8 @@
1
1
  import { getEditorConfig } from "../utils/config.js";
2
+ import { serializeConfig } from "../utils/editor.js";
2
3
  import { computed, createBlock, defineComponent, openBlock, reactive, resolveComponent, watch } from "vue";
3
- import serialize from "serialize-javascript";
4
4
  //#region packages/editor/src/fields/CodeLink.vue?vue&type=script&setup=true&lang.ts
5
- var CodeLink_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
5
+ var CodeLink_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
6
6
  name: "MFieldsCodeLink",
7
7
  __name: "CodeLink",
8
8
  props: {
@@ -39,10 +39,7 @@ var CodeLink_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defin
39
39
  });
40
40
  const modelValue = reactive({ form: { [props.name]: "" } });
41
41
  watch(() => props.model[props.name], (value) => {
42
- modelValue.form = { [props.name]: serialize(value, {
43
- space: 2,
44
- unsafe: true
45
- }).replace(/"(\w+)":\s/g, "$1: ") };
42
+ modelValue.form = { [props.name]: serializeConfig(value) };
46
43
  }, { immediate: true });
47
44
  const changeHandler = (v) => {
48
45
  if (!props.name || !props.model) return;
@@ -5,7 +5,7 @@ import { HookCodeType, HookType } from "@tmagic/core";
5
5
  import { computed, createElementBlock, createVNode, defineComponent, normalizeClass, openBlock, unref, watch, withCtx } from "vue";
6
6
  import { isEmpty } from "lodash-es";
7
7
  //#region packages/editor/src/fields/CodeSelect.vue?vue&type=script&setup=true&lang.ts
8
- var CodeSelect_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
8
+ var CodeSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
9
9
  name: "MFieldsCodeSelect",
10
10
  __name: "CodeSelect",
11
11
  props: {
@@ -25,6 +25,20 @@ var CodeSelect_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
25
25
  const emit = __emit;
26
26
  const { dataSourceService, codeBlockService } = useServices();
27
27
  const props = __props;
28
+ /**
29
+ * 对比模式判定:
30
+ *
31
+ * code-select 仅是对内部「钩子列表」group-list 的包裹,本身不渲染叶子字段。父级 `MFormContainer`
32
+ * 已将其归入「自接管对比字段」(见 Container.vue 的 `SELF_DIFF_FIELD_TYPES`),即对比时只渲染一次
33
+ * 本组件,并把当前值 `model` 与历史值 `lastValues` 一并传入,由本组件把 `is-compare`/`lastValues`
34
+ * 透传给内部 MContainer,再由 group-list / code-select-col 等子级逐项展示前后差异。
35
+ *
36
+ * 注意:`model` 传入的是 `model[name]`(钩子值本身),因此 `lastValues` 也必须同层取 `lastValues[name]`,
37
+ * 否则前后值的嵌套层级不一致会导致对比错位。
38
+ *
39
+ * 仅当存在历史值时才启用对比,避免 lastValues 缺失时退化为「全部新增」的空对比。
40
+ */
41
+ const isCompareMode = computed(() => Boolean(props.isCompare && props.lastValues));
28
42
  const codeConfig = computed(() => ({
29
43
  type: "group-list",
30
44
  name: "hookData",
@@ -96,7 +110,8 @@ var CodeSelect_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
96
110
  size: __props.size,
97
111
  prop: __props.prop,
98
112
  disabled: __props.disabled,
99
- lastValues: __props.lastValues,
113
+ "is-compare": isCompareMode.value,
114
+ "last-values": __props.lastValues?.[__props.name],
100
115
  model: __props.model[__props.name],
101
116
  onChange: changeHandler
102
117
  }, null, 8, [
@@ -104,7 +119,8 @@ var CodeSelect_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
104
119
  "size",
105
120
  "prop",
106
121
  "disabled",
107
- "lastValues",
122
+ "is-compare",
123
+ "last-values",
108
124
  "model"
109
125
  ])]),
110
126
  _: 1
@@ -2,7 +2,7 @@ import { SideItemKey } from "../type.js";
2
2
  import { useServices } from "../hooks/use-services.js";
3
3
  import Icon_default from "../components/Icon.js";
4
4
  import CodeParams_default from "../components/CodeParams.js";
5
- import { MSelect, createValues, filterFunction } from "@tmagic/form";
5
+ import { MContainer, MSelect, createValues, filterFunction } from "@tmagic/form";
6
6
  import { TMagicButton } from "@tmagic/design";
7
7
  import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, inject, openBlock, ref, unref, watch, withCtx } from "vue";
8
8
  import { isEmpty, map } from "lodash-es";
@@ -10,7 +10,7 @@ import { Edit, View } from "@element-plus/icons-vue";
10
10
  //#region packages/editor/src/fields/CodeSelectCol.vue?vue&type=script&setup=true&lang.ts
11
11
  var _hoisted_1 = { class: "m-fields-code-select-col" };
12
12
  var _hoisted_2 = { class: "code-select-container" };
13
- var CodeSelectCol_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
13
+ var CodeSelectCol_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
14
14
  name: "MFieldsCodeSelectCol",
15
15
  __name: "CodeSelectCol",
16
16
  props: {
@@ -35,8 +35,20 @@ var CodeSelectCol_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
35
35
  const eventBus = inject("eventBus");
36
36
  const emit = __emit;
37
37
  const props = __props;
38
+ /**
39
+ * 对比模式判定:
40
+ *
41
+ * code-select-col 由「代码块下拉框 + 参数子表单」组成,属于复合字段。父级 `MFormContainer` 已将其
42
+ * 归入「自接管对比字段」(见 Container.vue 的 `SELF_DIFF_FIELD_TYPES`),即对比时只渲染一次本组件,
43
+ * 并把当前值 `model` 与历史值 `lastValues` 一并传入,由本组件把 `is-compare`/`lastValues` 透传给
44
+ * 内部的下拉框(MFormContainer)与参数表单(CodeParams),逐项展示前后差异。
45
+ *
46
+ * 仅当存在历史值时才启用对比,避免 lastValues 缺失时退化为「全部新增」的空对比。
47
+ */
48
+ const isCompareMode = computed(() => Boolean(props.isCompare && props.lastValues));
38
49
  const notEditable = computed(() => filterFunction(mForm, props.config.notEditable, props));
39
- const hasCodeBlockSidePanel = computed(() => (uiService.get("sideBarItems") || []).find((item) => item.$key === SideItemKey.CODE_BLOCK));
50
+ const codeBlockSidePanel = computed(() => (uiService.get("sideBarItems") || []).find((item) => item.$key === SideItemKey.CODE_BLOCK));
51
+ const hasCodeBlockSidePanel = computed(() => codeBlockSidePanel.value);
40
52
  /**
41
53
  * 根据代码块id获取代码块参数配置
42
54
  * @param codeId 代码块ID
@@ -91,13 +103,31 @@ var CodeSelectCol_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
91
103
  emit("change", props.model[props.name], eventData);
92
104
  };
93
105
  const editCode = (id) => {
106
+ const sideBarItem = codeBlockSidePanel.value;
107
+ if (sideBarItem) uiService.set("sideBarActiveTabName", sideBarItem.text || sideBarItem.$key || SideItemKey.CODE_BLOCK);
94
108
  eventBus?.emit("edit-code", id);
95
109
  };
96
110
  return (_ctx, _cache) => {
97
111
  return openBlock(), createElementBlock("div", _hoisted_1, [
98
112
  createElementVNode("div", _hoisted_2, [
99
113
  createCommentVNode(" 代码块下拉框 "),
100
- createVNode(unref(MSelect), {
114
+ createCommentVNode(" 对比模式下交由 MFormContainer 展示下拉框的前后差异(codeId 变化时高亮新旧代码块名),\n 普通模式仍直接渲染 MSelect 以保留选择 / 写值逻辑 "),
115
+ isCompareMode.value ? (openBlock(), createBlock(unref(MContainer), {
116
+ key: 0,
117
+ class: "select",
118
+ config: selectConfig,
119
+ model: __props.model,
120
+ "last-values": __props.lastValues,
121
+ "is-compare": true,
122
+ size: __props.size,
123
+ prop: __props.prop
124
+ }, null, 8, [
125
+ "model",
126
+ "last-values",
127
+ "size",
128
+ "prop"
129
+ ])) : (openBlock(), createBlock(unref(MSelect), {
130
+ key: 1,
101
131
  class: "select",
102
132
  config: selectConfig,
103
133
  name: __props.name,
@@ -110,10 +140,10 @@ var CodeSelectCol_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
110
140
  "model",
111
141
  "size",
112
142
  "prop"
113
- ]),
114
- createCommentVNode(" 查看/编辑按钮 "),
115
- __props.model[__props.name] && hasCodeBlockSidePanel.value ? (openBlock(), createBlock(unref(TMagicButton), {
116
- key: 0,
143
+ ])),
144
+ createCommentVNode(" 查看/编辑按钮:对比模式为只读,不展示 "),
145
+ !isCompareMode.value && __props.model[__props.name] && hasCodeBlockSidePanel.value ? (openBlock(), createBlock(unref(TMagicButton), {
146
+ key: 2,
117
147
  class: "m-fields-select-action-button",
118
148
  size: __props.size,
119
149
  onClick: _cache[0] || (_cache[0] = ($event) => editCode(__props.model[__props.name]))
@@ -127,12 +157,16 @@ var CodeSelectCol_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
127
157
  name: "params",
128
158
  key: __props.model[__props.name],
129
159
  model: __props.model,
160
+ "last-values": __props.lastValues,
161
+ "is-compare": isCompareMode.value,
130
162
  size: __props.size,
131
163
  disabled: __props.disabled,
132
164
  "params-config": paramsConfig.value,
133
165
  onChange: onParamsChangeHandler
134
166
  }, null, 8, [
135
167
  "model",
168
+ "last-values",
169
+ "is-compare",
136
170
  "size",
137
171
  "disabled",
138
172
  "params-config"
@@ -4,7 +4,7 @@ import { getFieldType } from "../utils/data-source/index.js";
4
4
  import { TMagicSelect, getDesignConfig } from "@tmagic/design";
5
5
  import { Fragment, computed, createBlock, createElementBlock, defineComponent, mergeProps, openBlock, renderList, resolveDynamicComponent, unref, withCtx } from "vue";
6
6
  //#region packages/editor/src/fields/CondOpSelect.vue?vue&type=script&setup=true&lang.ts
7
- var CondOpSelect_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
7
+ var CondOpSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
8
8
  name: "MFieldsCondOpSelect",
9
9
  __name: "CondOpSelect",
10
10
  props: {
@@ -9,9 +9,9 @@ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock
9
9
  import { Edit, View } from "@element-plus/icons-vue";
10
10
  //#region packages/editor/src/fields/DataSourceFieldSelect/FieldSelect.vue?vue&type=script&setup=true&lang.ts
11
11
  var _hoisted_1 = { class: "m-editor-data-source-field-select" };
12
- var FieldSelect_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
12
+ var FieldSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
13
13
  __name: "FieldSelect",
14
- props: /* @__PURE__ */ mergeModels({
14
+ props: /*@__PURE__*/ mergeModels({
15
15
  value: {},
16
16
  disabled: { type: Boolean },
17
17
  checkStrictly: { type: Boolean },
@@ -23,7 +23,7 @@ var FieldSelect_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
23
23
  "modelValue": { default: [] },
24
24
  "modelModifiers": {}
25
25
  }),
26
- emits: /* @__PURE__ */ mergeModels(["change"], ["update:modelValue"]),
26
+ emits: /*@__PURE__*/ mergeModels(["change"], ["update:modelValue"]),
27
27
  setup(__props, { emit: __emit }) {
28
28
  const props = __props;
29
29
  const emit = __emit;
@@ -39,6 +39,8 @@ var FieldSelect_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
39
39
  });
40
40
  const valueIsKey = computed(() => props.value === "key");
41
41
  const notEditable = computed(() => filterFunction(mForm, props.notEditable, props));
42
+ /** 对比模式下隐藏查看/编辑操作按钮,仅保留只读展示。 */
43
+ const isCompare = computed(() => Boolean(mForm?.isCompare));
42
44
  const dataSourcesOptions = computed(() => dataSources.value.map((ds) => ({
43
45
  text: ds.title || ds.id,
44
46
  value: valueIsKey.value ? ds.id : `${DATA_SOURCE_FIELDS_SELECT_VALUE_PREFIX}${ds.id}`
@@ -87,9 +89,15 @@ var FieldSelect_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
87
89
  modelValue.value = v;
88
90
  emit("change", v);
89
91
  };
90
- const hasDataSourceSidePanel = computed(() => uiService.get("sideBarItems").find((item) => item.$key === SideItemKey.DATA_SOURCE));
92
+ const dataSourceSidePanel = computed(() => uiService.get("sideBarItems").find((item) => item.$key === SideItemKey.DATA_SOURCE));
93
+ const hasDataSourceSidePanel = computed(() => dataSourceSidePanel.value);
91
94
  const editHandler = (id) => {
92
- eventBus?.emit("edit-data-source", removeDataSourceFieldPrefix(id));
95
+ const sideBarItem = dataSourceSidePanel.value;
96
+ if (sideBarItem) uiService.set("sideBarActiveTabName", sideBarItem.text || sideBarItem.$key || SideItemKey.DATA_SOURCE);
97
+ const dataSourceId = removeDataSourceFieldPrefix(id);
98
+ const fieldPath = selectFieldsId.value;
99
+ if (fieldPath.length) eventBus?.emit("edit-data-source-field", dataSourceId, [...fieldPath]);
100
+ else eventBus?.emit("edit-data-source", dataSourceId);
93
101
  };
94
102
  return (_ctx, _cache) => {
95
103
  return openBlock(), createElementBlock("div", _hoisted_1, [__props.dataSourceId ? (openBlock(), createBlock(unref(TMagicCascader), {
@@ -166,7 +174,7 @@ var FieldSelect_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
166
174
  "size",
167
175
  "options",
168
176
  "props"
169
- ])), selectDataSourceId.value && hasDataSourceSidePanel.value ? (openBlock(), createBlock(unref(TMagicTooltip), {
177
+ ])), selectDataSourceId.value && hasDataSourceSidePanel.value && !isCompare.value ? (openBlock(), createBlock(unref(TMagicTooltip), {
170
178
  key: 3,
171
179
  content: notEditable.value ? "查看" : "编辑"
172
180
  }, {
@@ -8,7 +8,7 @@ import { computed, createBlock, createCommentVNode, createElementBlock, createVN
8
8
  import { Coin } from "@element-plus/icons-vue";
9
9
  //#region packages/editor/src/fields/DataSourceFieldSelect/Index.vue?vue&type=script&setup=true&lang.ts
10
10
  var _hoisted_1 = { class: "m-fields-data-source-field-select" };
11
- var Index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
11
+ var Index_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
12
12
  name: "MFieldsDataSourceFieldSelect",
13
13
  __name: "Index",
14
14
  props: {
@@ -140,7 +140,7 @@ var Index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
140
140
  "init-values",
141
141
  "values",
142
142
  "prop"
143
- ])), __props.config.fieldConfig && !disabledDataSource.value ? (openBlock(), createBlock(unref(TMagicTooltip), {
143
+ ])), __props.config.fieldConfig && !disabledDataSource.value && !unref(mForm)?.isCompare ? (openBlock(), createBlock(unref(TMagicTooltip), {
144
144
  key: 2,
145
145
  disabled: showDataSourceFieldSelect.value,
146
146
  content: "选择数据源"
@@ -148,7 +148,7 @@ var Index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
148
148
  default: withCtx(() => [createVNode(unref(TMagicButton), {
149
149
  type: showDataSourceFieldSelect.value ? "primary" : "default",
150
150
  size: __props.size,
151
- disabled: __props.disabled || unref(mForm)?.isCompare,
151
+ disabled: __props.disabled,
152
152
  onClick: onToggleDataSourceFieldSelectHandler
153
153
  }, {
154
154
  default: withCtx(() => [createVNode(Icon_default, { icon: unref(Coin) }, null, 8, ["icon"])]),
@@ -7,14 +7,17 @@ import { MFormBox } from "@tmagic/form";
7
7
  import { MagicTable } from "@tmagic/table";
8
8
  import { TMagicButton, tMagicMessage, tMagicMessageBox } from "@tmagic/design";
9
9
  import { getDefaultValueFromFields } from "@tmagic/utils";
10
- import { createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, inject, isRef, mergeModels, openBlock, ref, unref, useModel, withCtx } from "vue";
10
+ import { computed, createCommentVNode, createElementBlock, createTextVNode, createVNode, defineComponent, inject, isRef, mergeModels, onMounted, openBlock, provide, ref, unref, useModel, withCtx } from "vue";
11
11
  //#region packages/editor/src/fields/DataSourceFields.vue?vue&type=script&setup=true&lang.ts
12
12
  var _hoisted_1 = { class: "m-editor-data-source-fields" };
13
- var _hoisted_2 = { class: "m-editor-data-source-fields-footer" };
14
- var DataSourceFields_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
13
+ var _hoisted_2 = {
14
+ key: 0,
15
+ class: "m-editor-data-source-fields-footer"
16
+ };
17
+ var DataSourceFields_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
15
18
  name: "MFieldsDataSourceFields",
16
19
  __name: "DataSourceFields",
17
- props: /* @__PURE__ */ mergeModels({
20
+ props: /*@__PURE__*/ mergeModels({
18
21
  config: {},
19
22
  model: {},
20
23
  initValues: {},
@@ -42,7 +45,7 @@ var DataSourceFields_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
42
45
  },
43
46
  "visible1Modifiers": {}
44
47
  }),
45
- emits: /* @__PURE__ */ mergeModels(["change"], [
48
+ emits: /*@__PURE__*/ mergeModels(["change"], [
46
49
  "update:width",
47
50
  "update:visible",
48
51
  "update:visible1"
@@ -51,6 +54,9 @@ var DataSourceFields_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
51
54
  const props = __props;
52
55
  const emit = __emit;
53
56
  const { uiService } = useServices();
57
+ const mForm = inject("mForm");
58
+ /** 对比模式下隐藏新增/编辑/删除等操作按钮,仅保留只读展示。 */
59
+ const isCompare = computed(() => Boolean(mForm?.isCompare));
54
60
  const fieldValues = ref({});
55
61
  const fieldTitle = ref("");
56
62
  const width = useModel(__props, "width");
@@ -60,6 +66,15 @@ var DataSourceFields_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
60
66
  calcBoxPosition();
61
67
  addDialogVisible.value = true;
62
68
  };
69
+ const editField = (row, index) => {
70
+ fieldValues.value = {
71
+ ...row,
72
+ index
73
+ };
74
+ fieldTitle.value = `编辑${row.title}`;
75
+ calcBoxPosition();
76
+ addDialogVisible.value = true;
77
+ };
63
78
  const fieldChange = ({ index, ...value }, data) => {
64
79
  addDialogVisible.value = false;
65
80
  if (index > -1) emit("change", value, {
@@ -111,13 +126,7 @@ var DataSourceFields_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
111
126
  actions: [{
112
127
  text: "编辑",
113
128
  handler: (row, index) => {
114
- fieldValues.value = {
115
- ...row,
116
- index
117
- };
118
- fieldTitle.value = `编辑${row.title}`;
119
- calcBoxPosition();
120
- addDialogVisible.value = true;
129
+ editField(row, index);
121
130
  }
122
131
  }, {
123
132
  text: "删除",
@@ -130,6 +139,8 @@ var DataSourceFields_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
130
139
  }]
131
140
  }
132
141
  ];
142
+ /** 对比模式下移除「操作」列(编辑/删除按钮),仅保留只读列。 */
143
+ const displayColumns = computed(() => isCompare.value ? fieldColumns.filter((col) => !col.actions) : fieldColumns);
133
144
  const dataSourceFieldsConfig = [
134
145
  {
135
146
  name: "index",
@@ -302,14 +313,28 @@ var DataSourceFields_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
302
313
  const addFromJsonDialogVisible = useModel(__props, "visible1");
303
314
  const { height: editorHeight } = useEditorContentHeight();
304
315
  const { boxPosition, calcBoxPosition } = useNextFloatBoxPosition(uiService, inject("parentFloating", ref(null)));
316
+ /**
317
+ * 由 DataSourceConfigPanel 注入:打开数据源详情后需要直接打开的字段路径(字段名数组)。
318
+ * 当前层消费 path[0],并把剩余路径下发给嵌套字段,实现逐层打开。
319
+ */
320
+ const editingFieldPath = inject("editingDataSourceFieldPath", computed(() => []));
321
+ provide("editingDataSourceFieldPath", computed(() => editingFieldPath.value.slice(1)));
322
+ onMounted(() => {
323
+ const path = editingFieldPath.value;
324
+ if (!path.length) return;
325
+ const fields = props.model[props.name] || [];
326
+ const index = fields.findIndex((field) => field.name === path[0]);
327
+ if (index === -1) return;
328
+ editField(fields[index], index);
329
+ });
305
330
  return (_ctx, _cache) => {
306
331
  return openBlock(), createElementBlock("div", _hoisted_1, [
307
332
  createVNode(unref(MagicTable), {
308
333
  data: __props.model[__props.name],
309
- columns: fieldColumns,
334
+ columns: displayColumns.value,
310
335
  border: true
311
- }, null, 8, ["data"]),
312
- createElementVNode("div", _hoisted_2, [createVNode(unref(TMagicButton), {
336
+ }, null, 8, ["data", "columns"]),
337
+ !isCompare.value ? (openBlock(), createElementBlock("div", _hoisted_2, [createVNode(unref(TMagicButton), {
313
338
  size: "small",
314
339
  disabled: __props.disabled,
315
340
  plain: "",
@@ -326,7 +351,7 @@ var DataSourceFields_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
326
351
  }, {
327
352
  default: withCtx(() => [..._cache[9] || (_cache[9] = [createTextVNode("添加", -1)])]),
328
353
  _: 1
329
- }, 8, ["disabled"])]),
354
+ }, 8, ["disabled"])])) : createCommentVNode("v-if", true),
330
355
  createVNode(FloatingBox_default, {
331
356
  visible: addDialogVisible.value,
332
357
  "onUpdate:visible": _cache[2] || (_cache[2] = ($event) => addDialogVisible.value = $event),
@@ -15,7 +15,7 @@ var _hoisted_2 = { style: {
15
15
  "font-size": "10px",
16
16
  "color": "rgba(0, 0, 0, 0.6)"
17
17
  } };
18
- var DataSourceInput_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
18
+ var DataSourceInput_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
19
19
  name: "MFieldsDataSourceInput",
20
20
  __name: "DataSourceInput",
21
21
  props: {
@@ -227,7 +227,7 @@ var DataSourceInput_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
227
227
  onSelect: selectHandler
228
228
  }), {
229
229
  suffix: withCtx(() => [createVNode(Icon_default, { icon: unref(Coin) }, null, 8, ["icon"])]),
230
- default: withCtx(({ item }) => [createElementVNode("div", _hoisted_1, [createElementVNode("div", null, toDisplayString(item.text), 1), createElementVNode("span", _hoisted_2, toDisplayString(item.value), 1)])]),
230
+ default: withCtx((slotProps) => [createElementVNode("div", _hoisted_1, [createElementVNode("div", null, toDisplayString(slotProps?.item?.text || ""), 1), createElementVNode("span", _hoisted_2, toDisplayString(slotProps?.item?.value || ""), 1)])]),
231
231
  _: 1
232
232
  }, 16, ["modelValue"])) : (openBlock(), createElementBlock("div", {
233
233
  key: 2,
@@ -11,7 +11,7 @@ import { Edit, View } from "@element-plus/icons-vue";
11
11
  //#region packages/editor/src/fields/DataSourceMethodSelect.vue?vue&type=script&setup=true&name=true&lang.ts
12
12
  var _hoisted_1 = { class: "m-fields-data-source-method-select" };
13
13
  var _hoisted_2 = { class: "data-source-method-select-container" };
14
- var DataSourceMethodSelect_vue_vue_type_script_setup_true_name_true_lang_default = /* @__PURE__ */ defineComponent({
14
+ var DataSourceMethodSelect_vue_vue_type_script_setup_true_name_true_lang_default = /*@__PURE__*/ defineComponent({
15
15
  name: "MFieldsDataSourceMethodSelect",
16
16
  __name: "DataSourceMethodSelect",
17
17
  props: {
@@ -36,8 +36,10 @@ var DataSourceMethodSelect_vue_vue_type_script_setup_true_name_true_lang_default
36
36
  const eventBus = inject("eventBus");
37
37
  const emit = __emit;
38
38
  const props = __props;
39
- const hasDataSourceSidePanel = computed(() => (uiService.get("sideBarItems") || []).find((item) => item.$key === SideItemKey.DATA_SOURCE));
39
+ const dataSourceSidePanel = computed(() => (uiService.get("sideBarItems") || []).find((item) => item.$key === SideItemKey.DATA_SOURCE));
40
40
  const notEditable = computed(() => filterFunction(mForm, props.config.notEditable, props));
41
+ /** 对比模式下隐藏查看/编辑操作按钮,仅保留只读展示。 */
42
+ const isCompare = computed(() => Boolean(mForm?.isCompare));
41
43
  const dataSources = computed(() => dataSourceService.get("dataSources"));
42
44
  const isCustomMethod = computed(() => {
43
45
  const [id, name] = props.model[props.name];
@@ -122,9 +124,11 @@ var DataSourceMethodSelect_vue_vue_type_script_setup_true_name_true_lang_default
122
124
  emit("change", props.model[props.name], eventData);
123
125
  };
124
126
  const editCodeHandler = () => {
125
- const [id] = props.model[props.name];
127
+ const [id, methodName] = props.model[props.name];
126
128
  if (!dataSourceService.getDataSourceById(id)) return;
127
- eventBus?.emit("edit-data-source", id);
129
+ const sideBarItem = dataSourceSidePanel.value;
130
+ if (sideBarItem) uiService.set("sideBarActiveTabName", sideBarItem.text || sideBarItem.$key || SideItemKey.DATA_SOURCE);
131
+ eventBus?.emit("edit-data-source-method", id, methodName);
128
132
  };
129
133
  return (_ctx, _cache) => {
130
134
  return openBlock(), createElementBlock("div", _hoisted_1, [createElementVNode("div", _hoisted_2, [createVNode(unref(MCascader), {
@@ -143,7 +147,7 @@ var DataSourceMethodSelect_vue_vue_type_script_setup_true_name_true_lang_default
143
147
  "size",
144
148
  "disabled",
145
149
  "prop"
146
- ]), __props.model[__props.name] && isCustomMethod.value && hasDataSourceSidePanel.value ? (openBlock(), createBlock(unref(TMagicTooltip), {
150
+ ]), __props.model[__props.name] && isCustomMethod.value && dataSourceSidePanel.value && !isCompare.value ? (openBlock(), createBlock(unref(TMagicTooltip), {
147
151
  key: 0,
148
152
  content: notEditable.value ? "查看" : "编辑"
149
153
  }, {
@@ -1,12 +1,15 @@
1
1
  import CodeBlockEditor_default from "../components/CodeBlockEditor.js";
2
2
  import { MagicTable } from "@tmagic/table";
3
3
  import { TMagicButton, tMagicMessageBox } from "@tmagic/design";
4
- import { createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, nextTick, openBlock, ref, unref, useTemplateRef, withCtx } from "vue";
4
+ import { computed, createBlock, createCommentVNode, createElementBlock, createTextVNode, createVNode, defineComponent, inject, nextTick, onMounted, openBlock, ref, unref, useTemplateRef, withCtx } from "vue";
5
5
  import { cloneDeep } from "lodash-es";
6
6
  //#region packages/editor/src/fields/DataSourceMethods.vue?vue&type=script&setup=true&lang.ts
7
7
  var _hoisted_1 = { class: "m-editor-data-source-methods" };
8
- var _hoisted_2 = { class: "m-editor-data-source-methods-footer" };
9
- var DataSourceMethods_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
8
+ var _hoisted_2 = {
9
+ key: 0,
10
+ class: "m-editor-data-source-methods-footer"
11
+ };
12
+ var DataSourceMethods_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
10
13
  name: "MFieldsDataSourceMethods",
11
14
  __name: "DataSourceMethods",
12
15
  props: {
@@ -28,9 +31,25 @@ var DataSourceMethods_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
28
31
  setup(__props, { emit: __emit }) {
29
32
  const props = __props;
30
33
  const emit = __emit;
34
+ const mForm = inject("mForm");
35
+ /** 对比模式下隐藏新增/编辑/删除等操作按钮,仅保留只读展示。 */
36
+ const isCompare = computed(() => Boolean(mForm?.isCompare));
31
37
  const codeConfig = ref();
32
38
  const codeBlockEditorRef = useTemplateRef("codeBlockEditor");
33
39
  let editIndex = -1;
40
+ const editMethod = (method, index) => {
41
+ let codeContent = "({ params, dataSource, app }) => {\n // place your code here\n}";
42
+ if (method.content) if (typeof method.content !== "string") codeContent = method.content.toString();
43
+ else codeContent = method.content;
44
+ codeConfig.value = {
45
+ ...cloneDeep(method),
46
+ content: codeContent
47
+ };
48
+ editIndex = index;
49
+ nextTick(() => {
50
+ codeBlockEditorRef.value?.show();
51
+ });
52
+ };
34
53
  const methodColumns = [
35
54
  {
36
55
  label: "名称",
@@ -55,17 +74,7 @@ var DataSourceMethods_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
55
74
  actions: [{
56
75
  text: "编辑",
57
76
  handler: (method, index) => {
58
- let codeContent = "({ params, dataSource, app }) => {\n // place your code here\n}";
59
- if (method.content) if (typeof method.content !== "string") codeContent = method.content.toString();
60
- else codeContent = method.content;
61
- codeConfig.value = {
62
- ...cloneDeep(method),
63
- content: codeContent
64
- };
65
- editIndex = index;
66
- nextTick(() => {
67
- codeBlockEditorRef.value?.show();
68
- });
77
+ editMethod(method, index);
69
78
  }
70
79
  }, {
71
80
  text: "删除",
@@ -78,6 +87,8 @@ var DataSourceMethods_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
78
87
  }]
79
88
  }
80
89
  ];
90
+ /** 对比模式下移除「操作」列(编辑/删除按钮),仅保留只读列。 */
91
+ const displayColumns = computed(() => isCompare.value ? methodColumns.filter((col) => !col.actions) : methodColumns);
81
92
  const createCodeHandler = () => {
82
93
  codeConfig.value = {
83
94
  name: "",
@@ -111,14 +122,24 @@ var DataSourceMethods_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
111
122
  codeConfig.value = void 0;
112
123
  codeBlockEditorRef.value?.hide();
113
124
  };
125
+ /** 由 DataSourceConfigPanel 注入:打开数据源详情后需要直接打开的方法名 */
126
+ const editingMethodName = inject("editingDataSourceMethodName", computed(() => ""));
127
+ onMounted(() => {
128
+ const methodName = editingMethodName.value;
129
+ if (!methodName) return;
130
+ const methods = props.model[props.name] || [];
131
+ const index = methods.findIndex((method) => method.name === methodName);
132
+ if (index === -1) return;
133
+ editMethod(methods[index], index);
134
+ });
114
135
  return (_ctx, _cache) => {
115
136
  return openBlock(), createElementBlock("div", _hoisted_1, [
116
137
  createVNode(unref(MagicTable), {
117
138
  data: __props.model[__props.name],
118
- columns: methodColumns,
139
+ columns: displayColumns.value,
119
140
  border: true
120
- }, null, 8, ["data"]),
121
- createElementVNode("div", _hoisted_2, [createVNode(unref(TMagicButton), {
141
+ }, null, 8, ["data", "columns"]),
142
+ !isCompare.value ? (openBlock(), createElementBlock("div", _hoisted_2, [createVNode(unref(TMagicButton), {
122
143
  size: "small",
123
144
  type: "primary",
124
145
  disabled: __props.disabled,
@@ -127,9 +148,9 @@ var DataSourceMethods_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
127
148
  }, {
128
149
  default: withCtx(() => [..._cache[0] || (_cache[0] = [createTextVNode("添加", -1)])]),
129
150
  _: 1
130
- }, 8, ["disabled"])]),
151
+ }, 8, ["disabled"])])) : createCommentVNode("v-if", true),
131
152
  codeConfig.value ? (openBlock(), createBlock(CodeBlockEditor_default, {
132
- key: 0,
153
+ key: 1,
133
154
  ref: "codeBlockEditor",
134
155
  disabled: __props.disabled,
135
156
  content: codeConfig.value,