@tmagic/editor 1.8.0-beta.0 → 1.8.0-beta.2

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 (138) hide show
  1. package/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +11 -2
  2. package/dist/es/components/CodeBlockEditor.vue_vue_type_script_setup_true_lang.js +18 -110
  3. package/dist/es/components/CodeParams.vue_vue_type_script_setup_true_lang.js +6 -0
  4. package/dist/es/components/CompareForm.js +5 -0
  5. package/dist/es/components/CompareForm.vue_vue_type_script_setup_true_lang.js +167 -0
  6. package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +19 -3
  7. package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +18 -2
  8. package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +37 -6
  9. package/dist/es/fields/DataSourceFieldSelect/FieldSelect.vue_vue_type_script_setup_true_lang.js +3 -1
  10. package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +12 -3
  11. package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +14 -6
  12. package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +3 -1
  13. package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +15 -7
  14. package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +14 -6
  15. package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +3 -1
  16. package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +58 -11
  17. package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +11 -6
  18. package/dist/es/fields/StyleSetter/Index.vue_vue_type_script_setup_true_lang.js +8 -2
  19. package/dist/es/fields/StyleSetter/components/Border.vue_vue_type_script_setup_true_lang.js +10 -2
  20. package/dist/es/fields/StyleSetter/components/Box.vue_vue_type_script_setup_true_lang.js +3 -1
  21. package/dist/es/fields/StyleSetter/pro/Background.vue_vue_type_script_setup_true_lang.js +10 -2
  22. package/dist/es/fields/StyleSetter/pro/Border.vue_vue_type_script_setup_true_lang.js +16 -3
  23. package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +10 -2
  24. package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +14 -2
  25. package/dist/es/fields/StyleSetter/pro/Position.vue_vue_type_script_setup_true_lang.js +10 -2
  26. package/dist/es/fields/StyleSetter/pro/Transform.vue_vue_type_script_setup_true_lang.js +10 -2
  27. package/dist/es/fields/UISelect.vue_vue_type_script_setup_true_lang.js +8 -5
  28. package/dist/es/hooks/use-code-block-edit.js +2 -2
  29. package/dist/es/hooks/use-stage.js +15 -7
  30. package/dist/es/index.js +3 -1
  31. package/dist/es/initService.js +6 -6
  32. package/dist/es/layouts/CodeEditor.vue_vue_type_script_setup_true_lang.js +4 -0
  33. package/dist/es/layouts/Framework.vue_vue_type_script_setup_true_lang.js +12 -7
  34. package/dist/es/layouts/NavMenu.vue_vue_type_script_setup_true_lang.js +8 -0
  35. package/dist/es/layouts/history-list/Bucket.js +5 -0
  36. package/dist/es/layouts/history-list/Bucket.vue_vue_type_script_setup_true_lang.js +84 -0
  37. package/dist/es/layouts/history-list/CodeBlockTab.js +5 -0
  38. package/dist/es/layouts/history-list/CodeBlockTab.vue_vue_type_script_setup_true_lang.js +62 -0
  39. package/dist/es/layouts/history-list/DataSourceTab.js +5 -0
  40. package/dist/es/layouts/history-list/DataSourceTab.vue_vue_type_script_setup_true_lang.js +62 -0
  41. package/dist/es/layouts/history-list/GroupRow.js +5 -0
  42. package/dist/es/layouts/history-list/GroupRow.vue_vue_type_script_setup_true_lang.js +180 -0
  43. package/dist/es/layouts/history-list/HistoryDiffDialog.js +5 -0
  44. package/dist/es/layouts/history-list/HistoryDiffDialog.vue_vue_type_script_setup_true_lang.js +195 -0
  45. package/dist/es/layouts/history-list/HistoryListPanel.js +5 -0
  46. package/dist/es/layouts/history-list/HistoryListPanel.vue_vue_type_script_setup_true_lang.js +270 -0
  47. package/dist/es/layouts/history-list/InitialRow.js +5 -0
  48. package/dist/es/layouts/history-list/InitialRow.vue_vue_type_script_setup_true_lang.js +48 -0
  49. package/dist/es/layouts/history-list/PageTab.js +5 -0
  50. package/dist/es/layouts/history-list/PageTab.vue_vue_type_script_setup_true_lang.js +99 -0
  51. package/dist/es/layouts/history-list/composables.js +154 -0
  52. package/dist/es/layouts/sidebar/layer/use-node-status.js +38 -4
  53. package/dist/es/services/BaseService.js +31 -68
  54. package/dist/es/services/codeBlock.js +205 -8
  55. package/dist/es/services/componentList.js +2 -2
  56. package/dist/es/services/dataSource.js +217 -8
  57. package/dist/es/services/dep.js +21 -9
  58. package/dist/es/services/editor.js +350 -160
  59. package/dist/es/services/events.js +2 -2
  60. package/dist/es/services/history.js +407 -12
  61. package/dist/es/services/keybinding.js +2 -2
  62. package/dist/es/services/props.js +8 -8
  63. package/dist/es/services/stageOverlay.js +2 -2
  64. package/dist/es/services/storage.js +2 -2
  65. package/dist/es/services/ui.js +2 -2
  66. package/dist/es/style.css +347 -1
  67. package/dist/es/utils/code-block.js +122 -0
  68. package/dist/es/utils/content-menu.js +4 -5
  69. package/dist/es/utils/dep/worker.js +1 -1
  70. package/dist/es/utils/editor.js +3 -3
  71. package/dist/es/utils/undo-redo.js +20 -0
  72. package/dist/style.css +347 -1
  73. package/dist/tmagic-editor.umd.cjs +3273 -766
  74. package/package.json +7 -7
  75. package/src/Editor.vue +7 -0
  76. package/src/components/CodeBlockEditor.vue +20 -109
  77. package/src/components/CodeParams.vue +6 -0
  78. package/src/components/CompareForm.vue +225 -0
  79. package/src/editorProps.ts +2 -0
  80. package/src/fields/Code.vue +19 -3
  81. package/src/fields/CodeSelect.vue +17 -1
  82. package/src/fields/CodeSelectCol.vue +30 -2
  83. package/src/fields/DataSourceFieldSelect/FieldSelect.vue +7 -1
  84. package/src/fields/DataSourceFieldSelect/Index.vue +9 -2
  85. package/src/fields/DataSourceFields.vue +12 -3
  86. package/src/fields/DataSourceMethodSelect.vue +4 -1
  87. package/src/fields/DataSourceMethods.vue +14 -4
  88. package/src/fields/DataSourceMocks.vue +13 -3
  89. package/src/fields/DataSourceSelect.vue +4 -1
  90. package/src/fields/EventSelect.vue +57 -8
  91. package/src/fields/KeyValue.vue +17 -4
  92. package/src/fields/StyleSetter/Index.vue +6 -0
  93. package/src/fields/StyleSetter/components/Border.vue +15 -1
  94. package/src/fields/StyleSetter/components/Box.vue +2 -0
  95. package/src/fields/StyleSetter/pro/Background.vue +15 -1
  96. package/src/fields/StyleSetter/pro/Border.vue +24 -2
  97. package/src/fields/StyleSetter/pro/Font.vue +15 -1
  98. package/src/fields/StyleSetter/pro/Layout.vue +17 -1
  99. package/src/fields/StyleSetter/pro/Position.vue +15 -1
  100. package/src/fields/StyleSetter/pro/Transform.vue +15 -1
  101. package/src/fields/UISelect.vue +5 -2
  102. package/src/hooks/use-code-block-edit.ts +5 -2
  103. package/src/hooks/use-stage.ts +23 -7
  104. package/src/index.ts +1 -0
  105. package/src/layouts/CodeEditor.vue +15 -0
  106. package/src/layouts/Framework.vue +10 -5
  107. package/src/layouts/NavMenu.vue +9 -0
  108. package/src/layouts/history-list/Bucket.vue +99 -0
  109. package/src/layouts/history-list/CodeBlockTab.vue +61 -0
  110. package/src/layouts/history-list/DataSourceTab.vue +61 -0
  111. package/src/layouts/history-list/GroupRow.vue +207 -0
  112. package/src/layouts/history-list/HistoryDiffDialog.vue +212 -0
  113. package/src/layouts/history-list/HistoryListPanel.vue +271 -0
  114. package/src/layouts/history-list/InitialRow.vue +41 -0
  115. package/src/layouts/history-list/PageTab.vue +94 -0
  116. package/src/layouts/history-list/composables.ts +195 -0
  117. package/src/layouts/sidebar/layer/use-node-status.ts +64 -12
  118. package/src/services/BaseService.ts +35 -86
  119. package/src/services/codeBlock.ts +256 -5
  120. package/src/services/dataSource.ts +257 -6
  121. package/src/services/dep.ts +32 -9
  122. package/src/services/editor.ts +454 -171
  123. package/src/services/history.ts +452 -8
  124. package/src/services/props.ts +2 -2
  125. package/src/theme/history-list-panel.scss +423 -0
  126. package/src/theme/theme.scss +1 -0
  127. package/src/type.ts +179 -6
  128. package/src/utils/code-block.ts +150 -0
  129. package/src/utils/content-menu.ts +8 -5
  130. package/src/utils/dep/worker.ts +5 -3
  131. package/src/utils/editor.ts +4 -1
  132. package/src/utils/index.ts +1 -0
  133. package/src/utils/undo-redo.ts +23 -0
  134. package/types/index.d.ts +2107 -810
  135. package/dist/es/utils/compose.js +0 -44
  136. package/dist/es/utils/editor-history.js +0 -100
  137. package/src/utils/compose.ts +0 -52
  138. package/src/utils/editor-history.ts +0 -138
@@ -7,10 +7,13 @@ 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, openBlock, 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" };
13
+ var _hoisted_2 = {
14
+ key: 0,
15
+ class: "m-editor-data-source-fields-footer"
16
+ };
14
17
  var DataSourceFields_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
15
18
  name: "MFieldsDataSourceFields",
16
19
  __name: "DataSourceFields",
@@ -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");
@@ -130,6 +136,8 @@ var DataSourceFields_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
130
136
  }]
131
137
  }
132
138
  ];
139
+ /** 对比模式下移除「操作」列(编辑/删除按钮),仅保留只读列。 */
140
+ const displayColumns = computed(() => isCompare.value ? fieldColumns.filter((col) => !col.actions) : fieldColumns);
133
141
  const dataSourceFieldsConfig = [
134
142
  {
135
143
  name: "index",
@@ -306,10 +314,10 @@ var DataSourceFields_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
306
314
  return openBlock(), createElementBlock("div", _hoisted_1, [
307
315
  createVNode(unref(MagicTable), {
308
316
  data: __props.model[__props.name],
309
- columns: fieldColumns,
317
+ columns: displayColumns.value,
310
318
  border: true
311
- }, null, 8, ["data"]),
312
- createElementVNode("div", _hoisted_2, [createVNode(unref(TMagicButton), {
319
+ }, null, 8, ["data", "columns"]),
320
+ !isCompare.value ? (openBlock(), createElementBlock("div", _hoisted_2, [createVNode(unref(TMagicButton), {
313
321
  size: "small",
314
322
  disabled: __props.disabled,
315
323
  plain: "",
@@ -326,7 +334,7 @@ var DataSourceFields_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
326
334
  }, {
327
335
  default: withCtx(() => [..._cache[9] || (_cache[9] = [createTextVNode("添加", -1)])]),
328
336
  _: 1
329
- }, 8, ["disabled"])]),
337
+ }, 8, ["disabled"])])) : createCommentVNode("v-if", true),
330
338
  createVNode(FloatingBox_default, {
331
339
  visible: addDialogVisible.value,
332
340
  "onUpdate:visible": _cache[2] || (_cache[2] = ($event) => addDialogVisible.value = $event),
@@ -38,6 +38,8 @@ var DataSourceMethodSelect_vue_vue_type_script_setup_true_name_true_lang_default
38
38
  const props = __props;
39
39
  const hasDataSourceSidePanel = 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];
@@ -143,7 +145,7 @@ var DataSourceMethodSelect_vue_vue_type_script_setup_true_name_true_lang_default
143
145
  "size",
144
146
  "disabled",
145
147
  "prop"
146
- ]), __props.model[__props.name] && isCustomMethod.value && hasDataSourceSidePanel.value ? (openBlock(), createBlock(unref(TMagicTooltip), {
148
+ ]), __props.model[__props.name] && isCustomMethod.value && hasDataSourceSidePanel.value && !isCompare.value ? (openBlock(), createBlock(unref(TMagicTooltip), {
147
149
  key: 0,
148
150
  content: notEditable.value ? "查看" : "编辑"
149
151
  }, {
@@ -1,11 +1,14 @@
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, 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" };
8
+ var _hoisted_2 = {
9
+ key: 0,
10
+ class: "m-editor-data-source-methods-footer"
11
+ };
9
12
  var DataSourceMethods_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
10
13
  name: "MFieldsDataSourceMethods",
11
14
  __name: "DataSourceMethods",
@@ -28,6 +31,9 @@ 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;
@@ -78,6 +84,8 @@ var DataSourceMethods_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
78
84
  }]
79
85
  }
80
86
  ];
87
+ /** 对比模式下移除「操作」列(编辑/删除按钮),仅保留只读列。 */
88
+ const displayColumns = computed(() => isCompare.value ? methodColumns.filter((col) => !col.actions) : methodColumns);
81
89
  const createCodeHandler = () => {
82
90
  codeConfig.value = {
83
91
  name: "",
@@ -115,10 +123,10 @@ var DataSourceMethods_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
115
123
  return openBlock(), createElementBlock("div", _hoisted_1, [
116
124
  createVNode(unref(MagicTable), {
117
125
  data: __props.model[__props.name],
118
- columns: methodColumns,
126
+ columns: displayColumns.value,
119
127
  border: true
120
- }, null, 8, ["data"]),
121
- createElementVNode("div", _hoisted_2, [createVNode(unref(TMagicButton), {
128
+ }, null, 8, ["data", "columns"]),
129
+ !isCompare.value ? (openBlock(), createElementBlock("div", _hoisted_2, [createVNode(unref(TMagicButton), {
122
130
  size: "small",
123
131
  type: "primary",
124
132
  disabled: __props.disabled,
@@ -127,9 +135,9 @@ var DataSourceMethods_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
127
135
  }, {
128
136
  default: withCtx(() => [..._cache[0] || (_cache[0] = [createTextVNode("添加", -1)])]),
129
137
  _: 1
130
- }, 8, ["disabled"])]),
138
+ }, 8, ["disabled"])])) : createCommentVNode("v-if", true),
131
139
  codeConfig.value ? (openBlock(), createBlock(CodeBlockEditor_default, {
132
- key: 0,
140
+ key: 1,
133
141
  ref: "codeBlockEditor",
134
142
  disabled: __props.disabled,
135
143
  content: codeConfig.value,
@@ -7,10 +7,13 @@ import { MFormBox } from "@tmagic/form";
7
7
  import { MagicTable } from "@tmagic/table";
8
8
  import { TMagicButton, TMagicSwitch, 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, openBlock, ref, unref, useModel, withCtx } from "vue";
11
11
  //#region packages/editor/src/fields/DataSourceMocks.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" };
13
+ var _hoisted_2 = {
14
+ key: 0,
15
+ class: "m-editor-data-source-fields-footer"
16
+ };
14
17
  var DataSourceMocks_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
15
18
  name: "MFieldsDataSourceMocks",
16
19
  __name: "DataSourceMocks",
@@ -42,6 +45,9 @@ var DataSourceMocks_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
42
45
  const props = __props;
43
46
  const emit = __emit;
44
47
  const { uiService } = useServices();
48
+ const mForm = inject("mForm");
49
+ /** 对比模式下隐藏新增/编辑/删除等操作按钮,仅保留只读展示。 */
50
+ const isCompare = computed(() => Boolean(mForm?.isCompare));
45
51
  const width = useModel(__props, "width");
46
52
  const drawerTitle = ref("");
47
53
  const formValues = ref({});
@@ -175,6 +181,8 @@ var DataSourceMocks_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
175
181
  }]
176
182
  }
177
183
  ];
184
+ /** 对比模式下移除「操作」列(编辑/删除按钮),仅保留只读列。 */
185
+ const displayColumns = computed(() => isCompare.value ? columns.filter((col) => !col.actions) : columns);
178
186
  const newHandler = () => {
179
187
  const isFirstRow = props.model[props.name].length === 0;
180
188
  formValues.value = {
@@ -209,9 +217,9 @@ var DataSourceMocks_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
209
217
  return openBlock(), createElementBlock("div", _hoisted_1, [
210
218
  createVNode(unref(MagicTable), {
211
219
  data: __props.model[__props.name],
212
- columns
213
- }, null, 8, ["data"]),
214
- createElementVNode("div", _hoisted_2, [createVNode(unref(TMagicButton), {
220
+ columns: displayColumns.value
221
+ }, null, 8, ["data", "columns"]),
222
+ !isCompare.value ? (openBlock(), createElementBlock("div", _hoisted_2, [createVNode(unref(TMagicButton), {
215
223
  size: "small",
216
224
  type: "primary",
217
225
  disabled: __props.disabled,
@@ -220,7 +228,7 @@ var DataSourceMocks_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
220
228
  }, {
221
229
  default: withCtx(() => [..._cache[4] || (_cache[4] = [createTextVNode("添加", -1)])]),
222
230
  _: 1
223
- }, 8, ["disabled"])]),
231
+ }, 8, ["disabled"])])) : createCommentVNode("v-if", true),
224
232
  createVNode(FloatingBox_default, {
225
233
  visible: addDialogVisible.value,
226
234
  "onUpdate:visible": _cache[1] || (_cache[1] = ($event) => addDialogVisible.value = $event),
@@ -34,6 +34,8 @@ var DataSourceSelect_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
34
34
  const eventBus = inject("eventBus");
35
35
  const dataSources = computed(() => dataSourceService.get("dataSources"));
36
36
  const notEditable = computed(() => filterFunction(mForm, props.config.notEditable, props));
37
+ /** 对比模式下隐藏查看/编辑操作按钮,仅保留只读展示。 */
38
+ const isCompare = computed(() => Boolean(mForm?.isCompare));
37
39
  const hasDataSourceSidePanel = computed(() => uiService.get("sideBarItems").find((item) => item.$key === SideItemKey.DATA_SOURCE));
38
40
  const selectConfig = computed(() => {
39
41
  const { type, dataSourceType, value, ...config } = props.config;
@@ -80,7 +82,7 @@ var DataSourceSelect_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
80
82
  "disabled",
81
83
  "config",
82
84
  "last-values"
83
- ]), __props.model[__props.name] && hasDataSourceSidePanel.value ? (openBlock(), createBlock(unref(TMagicTooltip), {
85
+ ]), __props.model[__props.name] && hasDataSourceSidePanel.value && !isCompare.value ? (openBlock(), createBlock(unref(TMagicTooltip), {
84
86
  key: 0,
85
87
  content: notEditable.value ? "查看" : "编辑"
86
88
  }, {
@@ -4,7 +4,7 @@ import { MContainer, MPanel, MTable, defineFormItem } from "@tmagic/form";
4
4
  import { TMagicButton } from "@tmagic/design";
5
5
  import { DATA_SOURCE_FIELDS_CHANGE_EVENT_PREFIX, traverseNode } from "@tmagic/utils";
6
6
  import { ActionType } from "@tmagic/core";
7
- import { Fragment, computed, createBlock, createElementBlock, createTextVNode, createVNode, defineComponent, openBlock, renderList, unref, withCtx } from "vue";
7
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createTextVNode, createVNode, defineComponent, openBlock, renderList, unref, withCtx } from "vue";
8
8
  import { has } from "lodash-es";
9
9
  import { Delete } from "@element-plus/icons-vue";
10
10
  //#region packages/editor/src/fields/EventSelect.vue?vue&type=script&setup=true&lang.ts
@@ -243,6 +243,39 @@ var EventSelect_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
243
243
  if (props.model[props.name].length === 0) return false;
244
244
  return !has(props.model[props.name][0], "actions");
245
245
  });
246
+ /**
247
+ * 对比模式判定:
248
+ *
249
+ * event-select 内部由「事件列表 + 嵌套子表单」组成,属于复合字段。父级 `MFormContainer` 已将其
250
+ * 归入「自接管对比字段」(见 Container.vue 的 `SELF_DIFF_FIELD_TYPES`),即对比时只渲染一次本组件,
251
+ * 并把当前值 `model` 与历史值 `lastValues` 一并传入,由本组件把 `is-compare`/`lastValues` 透传给
252
+ * 内部的 MPanel / MFormContainer,逐项(事件名、动作)展示前后差异。
253
+ *
254
+ * 仅当存在历史值时才启用对比,避免 lastValues 缺失时退化为「全部新增」的空对比。
255
+ */
256
+ const isCompareMode = computed(() => Boolean(props.isCompare && props.lastValues));
257
+ /**
258
+ * 待渲染的事件卡片列表。
259
+ *
260
+ * - 非对比模式:直接映射当前事件列表,`lastCardItem` 为空;
261
+ * - 对比模式:按索引对齐当前值与历史值,取两者长度的最大值,使得「新增」(仅当前有)与
262
+ * 「删除」(仅历史有)的事件都能被渲染出来;缺失的一侧用空对象兜底,从而让子级正确高亮差异。
263
+ */
264
+ const displayList = computed(() => {
265
+ const current = props.model[props.name] || [];
266
+ if (!isCompareMode.value) return current.map((cardItem, index) => ({
267
+ cardItem,
268
+ lastCardItem: void 0,
269
+ index
270
+ }));
271
+ const last = props.lastValues?.[props.name] || [];
272
+ const length = Math.max(current.length, last.length);
273
+ return Array.from({ length }, (_, index) => ({
274
+ cardItem: current[index] ?? {},
275
+ lastCardItem: last[index] ?? {},
276
+ index
277
+ }));
278
+ });
246
279
  const addEvent = () => {
247
280
  const defaultEvent = {
248
281
  name: "",
@@ -267,14 +300,19 @@ var EventSelect_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
267
300
  size: __props.size,
268
301
  disabled: __props.disabled,
269
302
  model: __props.model,
303
+ "last-values": __props.lastValues,
304
+ "is-compare": isCompareMode.value,
270
305
  config: tableConfig.value,
271
306
  onChange: onChangeHandler
272
307
  }, null, 8, [
273
308
  "size",
274
309
  "disabled",
275
310
  "model",
311
+ "last-values",
312
+ "is-compare",
276
313
  "config"
277
- ])) : (openBlock(), createElementBlock("div", _hoisted_2, [createVNode(unref(TMagicButton), {
314
+ ])) : (openBlock(), createElementBlock("div", _hoisted_2, [!isCompareMode.value ? (openBlock(), createBlock(unref(TMagicButton), {
315
+ key: 0,
278
316
  class: "create-button",
279
317
  type: "primary",
280
318
  size: __props.size,
@@ -283,44 +321,51 @@ var EventSelect_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
283
321
  }, {
284
322
  default: withCtx(() => [..._cache[1] || (_cache[1] = [createTextVNode("添加事件", -1)])]),
285
323
  _: 1
286
- }, 8, ["size", "disabled"]), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.model[__props.name], (cardItem, index) => {
324
+ }, 8, ["size", "disabled"])) : createCommentVNode("v-if", true), (openBlock(true), createElementBlock(Fragment, null, renderList(displayList.value, (entry) => {
287
325
  return openBlock(), createBlock(unref(MPanel), {
288
- key: index,
326
+ key: entry.index,
289
327
  disabled: __props.disabled,
290
328
  size: __props.size,
291
- prop: `${__props.prop}.${index}`,
329
+ prop: `${__props.prop}.${entry.index}`,
292
330
  config: actionsConfig.value,
293
- model: cardItem,
331
+ model: entry.cardItem,
332
+ "last-values": entry.lastCardItem,
333
+ "is-compare": isCompareMode.value,
294
334
  "label-width": __props.config.labelWidth || "100px",
295
335
  onChange: onChangeHandler
296
336
  }, {
297
337
  header: withCtx(() => [createVNode(unref(MContainer), {
298
338
  class: "fullWidth",
299
339
  config: eventNameConfig.value,
300
- model: cardItem,
340
+ model: entry.cardItem,
341
+ "last-values": entry.lastCardItem,
342
+ "is-compare": isCompareMode.value,
301
343
  disabled: __props.disabled,
302
344
  size: __props.size,
303
- prop: `${__props.prop}.${index}`,
345
+ prop: `${__props.prop}.${entry.index}`,
304
346
  onChange: eventNameChangeHandler
305
347
  }, null, 8, [
306
348
  "config",
307
349
  "model",
350
+ "last-values",
351
+ "is-compare",
308
352
  "disabled",
309
353
  "size",
310
354
  "prop"
311
- ]), createVNode(unref(TMagicButton), {
355
+ ]), !isCompareMode.value ? (openBlock(), createBlock(unref(TMagicButton), {
356
+ key: 0,
312
357
  style: { "color": "#f56c6c" },
313
358
  link: "",
314
359
  icon: unref(Delete),
315
360
  disabled: __props.disabled,
316
361
  size: __props.size,
317
- onClick: ($event) => removeEvent(Number(index))
362
+ onClick: ($event) => removeEvent(Number(entry.index))
318
363
  }, null, 8, [
319
364
  "icon",
320
365
  "disabled",
321
366
  "size",
322
367
  "onClick"
323
- ])]),
368
+ ])) : createCommentVNode("v-if", true)]),
324
369
  _: 2
325
370
  }, 1032, [
326
371
  "disabled",
@@ -328,6 +373,8 @@ var EventSelect_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
328
373
  "prop",
329
374
  "config",
330
375
  "model",
376
+ "last-values",
377
+ "is-compare",
331
378
  "label-width"
332
379
  ]);
333
380
  }), 128))]))]);
@@ -1,7 +1,7 @@
1
1
  import CodeEditor_default from "../layouts/CodeEditor.js";
2
2
  import CodeIcon_default from "../icons/CodeIcon.js";
3
3
  import { TMagicButton, TMagicInput } from "@tmagic/design";
4
- import { Fragment, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, ref, renderList, unref, watchEffect, withCtx } from "vue";
4
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, inject, openBlock, ref, renderList, unref, watchEffect, withCtx } from "vue";
5
5
  import { Delete, Plus } from "@element-plus/icons-vue";
6
6
  //#region packages/editor/src/fields/KeyValue.vue?vue&type=script&setup=true&lang.ts
7
7
  var _hoisted_1 = { class: "m-fields-key-value" };
@@ -28,6 +28,9 @@ var KeyValue_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defin
28
28
  setup(__props, { emit: __emit }) {
29
29
  const props = __props;
30
30
  const emit = __emit;
31
+ const mForm = inject("mForm");
32
+ /** 对比模式下隐藏增删/代码切换等操作按钮,仅保留只读展示。 */
33
+ const isCompare = computed(() => Boolean(mForm?.isCompare));
31
34
  const records = ref([]);
32
35
  const showCode = ref(false);
33
36
  watchEffect(() => {
@@ -98,7 +101,8 @@ var KeyValue_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defin
98
101
  "disabled",
99
102
  "size"
100
103
  ]),
101
- createVNode(unref(TMagicButton), {
104
+ !isCompare.value ? (openBlock(), createBlock(unref(TMagicButton), {
105
+ key: 0,
102
106
  class: "m-fields-key-value-delete",
103
107
  type: "danger",
104
108
  size: __props.size,
@@ -112,9 +116,10 @@ var KeyValue_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defin
112
116
  "disabled",
113
117
  "icon",
114
118
  "onClick"
115
- ])
119
+ ])) : createCommentVNode("v-if", true)
116
120
  ]);
117
- }), 128)), createVNode(unref(TMagicButton), {
121
+ }), 128)), !isCompare.value ? (openBlock(), createBlock(unref(TMagicButton), {
122
+ key: 0,
118
123
  type: "primary",
119
124
  size: __props.size,
120
125
  disabled: __props.disabled,
@@ -128,7 +133,7 @@ var KeyValue_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defin
128
133
  "size",
129
134
  "disabled",
130
135
  "icon"
131
- ])])) : createCommentVNode("v-if", true),
136
+ ])) : createCommentVNode("v-if", true)])) : createCommentVNode("v-if", true),
132
137
  __props.config.advanced && showCode.value ? (openBlock(), createBlock(CodeEditor_default, {
133
138
  key: 1,
134
139
  "editor-custom-type": "m-fields-key-value",
@@ -142,7 +147,7 @@ var KeyValue_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defin
142
147
  parse: true,
143
148
  onSave: save
144
149
  }, null, 8, ["init-values", "options"])) : createCommentVNode("v-if", true),
145
- __props.config.advanced ? (openBlock(), createBlock(unref(TMagicButton), {
150
+ __props.config.advanced && !isCompare.value ? (openBlock(), createBlock(unref(TMagicButton), {
146
151
  key: 2,
147
152
  size: "default",
148
153
  disabled: __props.disabled,
@@ -24,7 +24,7 @@ var Index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
24
24
  lastValues: {},
25
25
  isCompare: { type: Boolean }
26
26
  },
27
- emits: ["change"],
27
+ emits: ["change", "addDiffCount"],
28
28
  setup(__props, { emit: __emit }) {
29
29
  const props = __props;
30
30
  const emit = __emit;
@@ -63,6 +63,7 @@ var Index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
63
63
  });
64
64
  emit("change", v, eventData);
65
65
  };
66
+ const onAddDiffCount = () => emit("addDiffCount");
66
67
  return (_ctx, _cache) => {
67
68
  return openBlock(), createBlock(unref(TMagicCollapse), {
68
69
  class: "m-fields-style-setter",
@@ -78,11 +79,16 @@ var Index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
78
79
  default: withCtx(() => [item.component ? (openBlock(), createBlock(resolveDynamicComponent(item.component), {
79
80
  key: 0,
80
81
  values: __props.model[__props.name],
82
+ "last-values": __props.lastValues?.[__props.name],
83
+ "is-compare": __props.isCompare,
81
84
  size: __props.size,
82
85
  disabled: __props.disabled,
83
- onChange: change
86
+ onChange: change,
87
+ onAddDiffCount
84
88
  }, null, 40, [
85
89
  "values",
90
+ "last-values",
91
+ "is-compare",
86
92
  "size",
87
93
  "disabled"
88
94
  ])) : createCommentVNode("v-if", true)]),
@@ -11,10 +11,12 @@ var Border_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
11
11
  __name: "Border",
12
12
  props: {
13
13
  model: {},
14
+ lastValues: {},
15
+ isCompare: { type: Boolean },
14
16
  disabled: { type: Boolean },
15
17
  size: {}
16
18
  },
17
- emits: ["change"],
19
+ emits: ["change", "addDiffCount"],
18
20
  setup(__props, { emit: __emit }) {
19
21
  const direction = ref("");
20
22
  const config = computed(() => defineFormItem({ items: [
@@ -57,6 +59,7 @@ var Border_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
57
59
  emit("change", record.value, { modifyKey: record.propPath });
58
60
  });
59
61
  };
62
+ const onAddDiffCount = () => emit("addDiffCount");
60
63
  return (_ctx, _cache) => {
61
64
  return openBlock(), createElementBlock("div", _hoisted_1, [createElementVNode("div", _hoisted_2, [
62
65
  createElementVNode("div", _hoisted_3, [createElementVNode("div", {
@@ -84,12 +87,17 @@ var Border_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
84
87
  ]), createElementVNode("div", _hoisted_6, [createVNode(unref(MContainer), {
85
88
  config: config.value,
86
89
  model: __props.model,
90
+ "last-values": __props.lastValues,
91
+ "is-compare": __props.isCompare,
87
92
  size: __props.size,
88
93
  disabled: __props.disabled,
89
- onChange: change
94
+ onChange: change,
95
+ onAddDiffCount
90
96
  }, null, 8, [
91
97
  "config",
92
98
  "model",
99
+ "last-values",
100
+ "is-compare",
93
101
  "size",
94
102
  "disabled"
95
103
  ])])]);
@@ -17,7 +17,9 @@ var Box_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComp
17
17
  props: {
18
18
  disabled: { type: Boolean },
19
19
  size: {},
20
- model: {}
20
+ model: {},
21
+ lastValues: {},
22
+ isCompare: { type: Boolean }
21
23
  },
22
24
  emits: ["change"],
23
25
  setup(__props, { emit: __emit }) {
@@ -10,10 +10,12 @@ var Background_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
10
10
  __name: "Background",
11
11
  props: {
12
12
  values: {},
13
+ lastValues: {},
14
+ isCompare: { type: Boolean },
13
15
  disabled: { type: Boolean },
14
16
  size: {}
15
17
  },
16
- emits: ["change"],
18
+ emits: ["change", "addDiffCount"],
17
19
  setup(__props, { emit: __emit }) {
18
20
  const emit = __emit;
19
21
  const config = defineFormItem({ items: [
@@ -95,16 +97,22 @@ var Background_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
95
97
  const change = (value, eventData) => {
96
98
  emit("change", value, eventData);
97
99
  };
100
+ const onAddDiffCount = () => emit("addDiffCount");
98
101
  return (_ctx, _cache) => {
99
102
  return openBlock(), createBlock(unref(MContainer), {
100
103
  config: unref(config),
101
104
  model: __props.values,
105
+ "last-values": __props.lastValues,
106
+ "is-compare": __props.isCompare,
102
107
  size: __props.size,
103
108
  disabled: __props.disabled,
104
- onChange: change
109
+ onChange: change,
110
+ onAddDiffCount
105
111
  }, null, 8, [
106
112
  "config",
107
113
  "model",
114
+ "last-values",
115
+ "is-compare",
108
116
  "size",
109
117
  "disabled"
110
118
  ]);
@@ -6,10 +6,12 @@ var Border_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
6
6
  __name: "Border",
7
7
  props: {
8
8
  values: {},
9
+ lastValues: {},
10
+ isCompare: { type: Boolean },
9
11
  disabled: { type: Boolean },
10
12
  size: {}
11
13
  },
12
- emits: ["change"],
14
+ emits: ["change", "addDiffCount"],
13
15
  setup(__props, { emit: __emit }) {
14
16
  const emit = __emit;
15
17
  const config = defineFormItem({ items: [{
@@ -22,25 +24,36 @@ var Border_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
22
24
  const change = (value, eventData) => {
23
25
  emit("change", value, eventData);
24
26
  };
27
+ const onAddDiffCount = () => emit("addDiffCount");
25
28
  return (_ctx, _cache) => {
26
29
  return openBlock(), createElementBlock(Fragment, null, [createVNode(unref(MContainer), {
27
30
  config: unref(config),
28
31
  model: __props.values,
32
+ "last-values": __props.lastValues,
33
+ "is-compare": __props.isCompare,
29
34
  size: __props.size,
30
35
  disabled: __props.disabled,
31
- onChange: change
36
+ onChange: change,
37
+ onAddDiffCount
32
38
  }, null, 8, [
33
39
  "config",
34
40
  "model",
41
+ "last-values",
42
+ "is-compare",
35
43
  "size",
36
44
  "disabled"
37
45
  ]), createVNode(Border_default, {
38
46
  model: __props.values,
47
+ "last-values": __props.lastValues,
48
+ "is-compare": __props.isCompare,
39
49
  size: __props.size,
40
50
  disabled: __props.disabled,
41
- onChange: change
51
+ onChange: change,
52
+ onAddDiffCount
42
53
  }, null, 8, [
43
54
  "model",
55
+ "last-values",
56
+ "is-compare",
44
57
  "size",
45
58
  "disabled"
46
59
  ])], 64);
@@ -8,10 +8,12 @@ var Font_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCom
8
8
  __name: "Font",
9
9
  props: {
10
10
  values: {},
11
+ lastValues: {},
12
+ isCompare: { type: Boolean },
11
13
  disabled: { type: Boolean },
12
14
  size: {}
13
15
  },
14
- emits: ["change"],
16
+ emits: ["change", "addDiffCount"],
15
17
  setup(__props, { emit: __emit }) {
16
18
  const emit = __emit;
17
19
  const config = defineFormItem({ items: [
@@ -79,16 +81,22 @@ var Font_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCom
79
81
  const change = (value, eventData) => {
80
82
  emit("change", value, eventData);
81
83
  };
84
+ const onAddDiffCount = () => emit("addDiffCount");
82
85
  return (_ctx, _cache) => {
83
86
  return openBlock(), createBlock(unref(MContainer), {
84
87
  config: unref(config),
85
88
  model: __props.values,
89
+ "last-values": __props.lastValues,
90
+ "is-compare": __props.isCompare,
86
91
  size: __props.size,
87
92
  disabled: __props.disabled,
88
- onChange: change
93
+ onChange: change,
94
+ onAddDiffCount
89
95
  }, null, 8, [
90
96
  "config",
91
97
  "model",
98
+ "last-values",
99
+ "is-compare",
92
100
  "size",
93
101
  "disabled"
94
102
  ]);