@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
@@ -1,8 +1,8 @@
1
1
  <template>
2
2
  <div class="m-editor-data-source-fields">
3
- <MagicTable :data="model[name]" :columns="fieldColumns" :border="true"></MagicTable>
3
+ <MagicTable :data="model[name]" :columns="displayColumns" :border="true"></MagicTable>
4
4
 
5
- <div class="m-editor-data-source-fields-footer">
5
+ <div v-if="!isCompare" class="m-editor-data-source-fields-footer">
6
6
  <TMagicButton size="small" :disabled="disabled" plain @click="newFromJsonHandler()">快速添加</TMagicButton>
7
7
  <TMagicButton size="small" type="primary" :disabled="disabled" plain @click="newHandler()">添加</TMagicButton>
8
8
  </div>
@@ -47,7 +47,7 @@
47
47
  </template>
48
48
 
49
49
  <script setup lang="ts">
50
- import { inject, Ref, ref } from 'vue';
50
+ import { computed, inject, Ref, ref } from 'vue';
51
51
 
52
52
  import type { DataSchema } from '@tmagic/core';
53
53
  import { TMagicButton, tMagicMessage, tMagicMessageBox } from '@tmagic/design';
@@ -84,6 +84,10 @@ const emit = defineEmits<{
84
84
  }>();
85
85
 
86
86
  const { uiService } = useServices();
87
+ const mForm = inject<FormState | undefined>('mForm');
88
+
89
+ /** 对比模式下隐藏新增/编辑/删除等操作按钮,仅保留只读展示。 */
90
+ const isCompare = computed(() => Boolean(mForm?.isCompare));
87
91
 
88
92
  const fieldValues = ref<Record<string, any>>({});
89
93
  const fieldTitle = ref('');
@@ -176,6 +180,11 @@ const fieldColumns: ColumnConfig[] = [
176
180
  },
177
181
  ];
178
182
 
183
+ /** 对比模式下移除「操作」列(编辑/删除按钮),仅保留只读列。 */
184
+ const displayColumns = computed<ColumnConfig[]>(() =>
185
+ isCompare.value ? fieldColumns.filter((col) => !col.actions) : fieldColumns,
186
+ );
187
+
179
188
  const dataSourceFieldsConfig: FormConfig = [
180
189
  { name: 'index', type: 'hidden', filter: 'number', defaultValue: -1 },
181
190
  {
@@ -13,7 +13,7 @@
13
13
  ></MCascader>
14
14
 
15
15
  <TMagicTooltip
16
- v-if="model[name] && isCustomMethod && hasDataSourceSidePanel"
16
+ v-if="model[name] && isCustomMethod && hasDataSourceSidePanel && !isCompare"
17
17
  :content="notEditable ? '查看' : '编辑'"
18
18
  >
19
19
  <TMagicButton class="m-fields-select-action-button" :size="size" @click="editCodeHandler">
@@ -81,6 +81,9 @@ const hasDataSourceSidePanel = computed(() =>
81
81
 
82
82
  const notEditable = computed(() => filterFunction(mForm, props.config.notEditable, props));
83
83
 
84
+ /** 对比模式下隐藏查看/编辑操作按钮,仅保留只读展示。 */
85
+ const isCompare = computed(() => Boolean(mForm?.isCompare));
86
+
84
87
  const dataSources = computed(() => dataSourceService.get('dataSources'));
85
88
 
86
89
  const isCustomMethod = computed(() => {
@@ -1,8 +1,8 @@
1
1
  <template>
2
2
  <div class="m-editor-data-source-methods">
3
- <MagicTable :data="model[name]" :columns="methodColumns" :border="true"></MagicTable>
3
+ <MagicTable :data="model[name]" :columns="displayColumns" :border="true"></MagicTable>
4
4
 
5
- <div class="m-editor-data-source-methods-footer">
5
+ <div v-if="!isCompare" class="m-editor-data-source-methods-footer">
6
6
  <TMagicButton size="small" type="primary" :disabled="disabled" plain @click="createCodeHandler"
7
7
  >添加</TMagicButton
8
8
  >
@@ -21,12 +21,12 @@
21
21
  </template>
22
22
 
23
23
  <script setup lang="ts">
24
- import { nextTick, ref, useTemplateRef } from 'vue';
24
+ import { computed, inject, nextTick, ref, useTemplateRef } from 'vue';
25
25
  import { cloneDeep } from 'lodash-es';
26
26
 
27
27
  import type { CodeBlockContent } from '@tmagic/core';
28
28
  import { TMagicButton, tMagicMessageBox } from '@tmagic/design';
29
- import type { ContainerChangeEventData, DataSourceMethodsConfig, FieldProps } from '@tmagic/form';
29
+ import type { ContainerChangeEventData, DataSourceMethodsConfig, FieldProps, FormState } from '@tmagic/form';
30
30
  import { type ColumnConfig, MagicTable } from '@tmagic/table';
31
31
 
32
32
  import CodeBlockEditor from '@editor/components/CodeBlockEditor.vue';
@@ -42,6 +42,11 @@ const props = withDefaults(defineProps<FieldProps<DataSourceMethodsConfig>>(), {
42
42
 
43
43
  const emit = defineEmits(['change']);
44
44
 
45
+ const mForm = inject<FormState | undefined>('mForm');
46
+
47
+ /** 对比模式下隐藏新增/编辑/删除等操作按钮,仅保留只读展示。 */
48
+ const isCompare = computed(() => Boolean(mForm?.isCompare));
49
+
45
50
  const codeConfig = ref<Omit<CodeBlockContent, 'content'> & { content: string }>();
46
51
  const codeBlockEditorRef = useTemplateRef<InstanceType<typeof CodeBlockEditor>>('codeBlockEditor');
47
52
 
@@ -107,6 +112,11 @@ const methodColumns: ColumnConfig[] = [
107
112
  },
108
113
  ];
109
114
 
115
+ /** 对比模式下移除「操作」列(编辑/删除按钮),仅保留只读列。 */
116
+ const displayColumns = computed<ColumnConfig[]>(() =>
117
+ isCompare.value ? methodColumns.filter((col) => !col.actions) : methodColumns,
118
+ );
119
+
110
120
  const createCodeHandler = () => {
111
121
  codeConfig.value = {
112
122
  name: '',
@@ -1,8 +1,8 @@
1
1
  <template>
2
2
  <div class="m-editor-data-source-fields">
3
- <MagicTable :data="model[name]" :columns="columns"></MagicTable>
3
+ <MagicTable :data="model[name]" :columns="displayColumns"></MagicTable>
4
4
 
5
- <div class="m-editor-data-source-fields-footer">
5
+ <div v-if="!isCompare" class="m-editor-data-source-fields-footer">
6
6
  <TMagicButton size="small" type="primary" :disabled="disabled" plain @click="newHandler()">添加</TMagicButton>
7
7
  </div>
8
8
 
@@ -28,7 +28,7 @@
28
28
  </template>
29
29
 
30
30
  <script setup lang="ts">
31
- import { inject, Ref, ref } from 'vue';
31
+ import { computed, inject, Ref, ref } from 'vue';
32
32
 
33
33
  import type { MockSchema } from '@tmagic/core';
34
34
  import { TMagicButton, tMagicMessageBox, TMagicSwitch } from '@tmagic/design';
@@ -54,6 +54,11 @@ const props = withDefaults(defineProps<FieldProps<DataSourceMocksConfig>>(), {
54
54
  const emit = defineEmits(['change']);
55
55
 
56
56
  const { uiService } = useServices();
57
+ const mForm = inject<FormState | undefined>('mForm');
58
+
59
+ /** 对比模式下隐藏新增/编辑/删除等操作按钮,仅保留只读展示。 */
60
+ const isCompare = computed(() => Boolean(mForm?.isCompare));
61
+
57
62
  const width = defineModel<number>('width', { default: 670 });
58
63
 
59
64
  const drawerTitle = ref('');
@@ -202,6 +207,11 @@ const columns: ColumnConfig[] = [
202
207
  },
203
208
  ];
204
209
 
210
+ /** 对比模式下移除「操作」列(编辑/删除按钮),仅保留只读列。 */
211
+ const displayColumns = computed<ColumnConfig[]>(() =>
212
+ isCompare.value ? columns.filter((col) => !col.actions) : columns,
213
+ );
214
+
205
215
  const newHandler = () => {
206
216
  const isFirstRow = props.model[props.name].length === 0;
207
217
  formValues.value = {
@@ -11,7 +11,7 @@
11
11
  @change="changeHandler"
12
12
  ></MSelect>
13
13
 
14
- <TMagicTooltip v-if="model[name] && hasDataSourceSidePanel" :content="notEditable ? '查看' : '编辑'">
14
+ <TMagicTooltip v-if="model[name] && hasDataSourceSidePanel && !isCompare" :content="notEditable ? '查看' : '编辑'">
15
15
  <TMagicButton class="m-fields-select-action-button" :size="size" @click="editHandler"
16
16
  ><MIcon :icon="!notEditable ? Edit : View"></MIcon
17
17
  ></TMagicButton>
@@ -56,6 +56,9 @@ const dataSources = computed(() => dataSourceService.get('dataSources'));
56
56
 
57
57
  const notEditable = computed(() => filterFunction(mForm, props.config.notEditable, props));
58
58
 
59
+ /** 对比模式下隐藏查看/编辑操作按钮,仅保留只读展示。 */
60
+ const isCompare = computed(() => Boolean(mForm?.isCompare));
61
+
59
62
  const hasDataSourceSidePanel = computed(() =>
60
63
  uiService.get('sideBarItems').find((item) => item.$key === SideItemKey.DATA_SOURCE),
61
64
  );
@@ -6,22 +6,32 @@
6
6
  :size="size"
7
7
  :disabled="disabled"
8
8
  :model="model"
9
+ :last-values="lastValues"
10
+ :is-compare="isCompareMode"
9
11
  :config="tableConfig"
10
12
  @change="onChangeHandler"
11
13
  ></MTable>
12
14
 
13
15
  <div v-else class="fullWidth">
14
- <TMagicButton class="create-button" type="primary" :size="size" :disabled="disabled" @click="addEvent()"
16
+ <TMagicButton
17
+ v-if="!isCompareMode"
18
+ class="create-button"
19
+ type="primary"
20
+ :size="size"
21
+ :disabled="disabled"
22
+ @click="addEvent()"
15
23
  >添加事件</TMagicButton
16
24
  >
17
25
  <MPanel
18
- v-for="(cardItem, index) in model[name]"
19
- :key="index"
26
+ v-for="entry in displayList"
27
+ :key="entry.index"
20
28
  :disabled="disabled"
21
29
  :size="size"
22
- :prop="`${prop}.${index}`"
30
+ :prop="`${prop}.${entry.index}`"
23
31
  :config="actionsConfig"
24
- :model="cardItem"
32
+ :model="entry.cardItem"
33
+ :last-values="entry.lastCardItem"
34
+ :is-compare="isCompareMode"
25
35
  :label-width="config.labelWidth || '100px'"
26
36
  @change="onChangeHandler"
27
37
  >
@@ -29,19 +39,22 @@
29
39
  <MFormContainer
30
40
  class="fullWidth"
31
41
  :config="eventNameConfig"
32
- :model="cardItem"
42
+ :model="entry.cardItem"
43
+ :last-values="entry.lastCardItem"
44
+ :is-compare="isCompareMode"
33
45
  :disabled="disabled"
34
46
  :size="size"
35
- :prop="`${prop}.${index}`"
47
+ :prop="`${prop}.${entry.index}`"
36
48
  @change="eventNameChangeHandler"
37
49
  ></MFormContainer>
38
50
  <TMagicButton
51
+ v-if="!isCompareMode"
39
52
  style="color: #f56c6c"
40
53
  link
41
54
  :icon="Delete"
42
55
  :disabled="disabled"
43
56
  :size="size"
44
- @click="removeEvent(Number(index))"
57
+ @click="removeEvent(Number(entry.index))"
45
58
  ></TMagicButton>
46
59
  </template>
47
60
  </MPanel>
@@ -374,6 +387,42 @@ const isOldVersion = computed(() => {
374
387
  return !has(props.model[props.name][0], 'actions');
375
388
  });
376
389
 
390
+ /**
391
+ * 对比模式判定:
392
+ *
393
+ * event-select 内部由「事件列表 + 嵌套子表单」组成,属于复合字段。父级 `MFormContainer` 已将其
394
+ * 归入「自接管对比字段」(见 Container.vue 的 `SELF_DIFF_FIELD_TYPES`),即对比时只渲染一次本组件,
395
+ * 并把当前值 `model` 与历史值 `lastValues` 一并传入,由本组件把 `is-compare`/`lastValues` 透传给
396
+ * 内部的 MPanel / MFormContainer,逐项(事件名、动作)展示前后差异。
397
+ *
398
+ * 仅当存在历史值时才启用对比,避免 lastValues 缺失时退化为「全部新增」的空对比。
399
+ */
400
+ const isCompareMode = computed(() => Boolean(props.isCompare && props.lastValues));
401
+
402
+ /**
403
+ * 待渲染的事件卡片列表。
404
+ *
405
+ * - 非对比模式:直接映射当前事件列表,`lastCardItem` 为空;
406
+ * - 对比模式:按索引对齐当前值与历史值,取两者长度的最大值,使得「新增」(仅当前有)与
407
+ * 「删除」(仅历史有)的事件都能被渲染出来;缺失的一侧用空对象兜底,从而让子级正确高亮差异。
408
+ */
409
+ const displayList = computed<{ cardItem: any; lastCardItem: any; index: number }[]>(() => {
410
+ const current = props.model[props.name] || [];
411
+
412
+ if (!isCompareMode.value) {
413
+ return current.map((cardItem: any, index: number) => ({ cardItem, lastCardItem: undefined, index }));
414
+ }
415
+
416
+ const last = props.lastValues?.[props.name] || [];
417
+ const length = Math.max(current.length, last.length);
418
+
419
+ return Array.from({ length }, (_, index) => ({
420
+ cardItem: current[index] ?? {},
421
+ lastCardItem: last[index] ?? {},
422
+ index,
423
+ }));
424
+ });
425
+
377
426
  // 添加事件
378
427
  const addEvent = () => {
379
428
  const defaultEvent = {
@@ -19,6 +19,7 @@
19
19
  ></TMagicInput>
20
20
 
21
21
  <TMagicButton
22
+ v-if="!isCompare"
22
23
  class="m-fields-key-value-delete"
23
24
  type="danger"
24
25
  :size="size"
@@ -30,7 +31,14 @@
30
31
  ></TMagicButton>
31
32
  </div>
32
33
 
33
- <TMagicButton type="primary" :size="size" :disabled="disabled" plain :icon="Plus" @click="addHandler"
34
+ <TMagicButton
35
+ v-if="!isCompare"
36
+ type="primary"
37
+ :size="size"
38
+ :disabled="disabled"
39
+ plain
40
+ :icon="Plus"
41
+ @click="addHandler"
34
42
  >添加</TMagicButton
35
43
  >
36
44
  </div>
@@ -52,7 +60,7 @@
52
60
  ></MagicCodeEditor>
53
61
 
54
62
  <TMagicButton
55
- v-if="config.advanced"
63
+ v-if="config.advanced && !isCompare"
56
64
  size="default"
57
65
  :disabled="disabled"
58
66
  link
@@ -63,11 +71,11 @@
63
71
  </template>
64
72
 
65
73
  <script setup lang="ts">
66
- import { ref, watchEffect } from 'vue';
74
+ import { computed, inject, ref, watchEffect } from 'vue';
67
75
  import { Delete, Plus } from '@element-plus/icons-vue';
68
76
 
69
77
  import { TMagicButton, TMagicInput } from '@tmagic/design';
70
- import type { FieldProps, KeyValueConfig } from '@tmagic/form';
78
+ import type { FieldProps, FormState, KeyValueConfig } from '@tmagic/form';
71
79
 
72
80
  import CodeIcon from '@editor/icons/CodeIcon.vue';
73
81
  import MagicCodeEditor from '@editor/layouts/CodeEditor.vue';
@@ -84,6 +92,11 @@ const emit = defineEmits<{
84
92
  change: [value: Record<string, any>];
85
93
  }>();
86
94
 
95
+ const mForm = inject<FormState | undefined>('mForm');
96
+
97
+ /** 对比模式下隐藏增删/代码切换等操作按钮,仅保留只读展示。 */
98
+ const isCompare = computed(() => Boolean(mForm?.isCompare));
99
+
87
100
  const records = ref<[string, string][]>([]);
88
101
  const showCode = ref(false);
89
102
 
@@ -7,9 +7,12 @@
7
7
  v-if="item.component"
8
8
  :is="item.component"
9
9
  :values="model[name]"
10
+ :last-values="lastValues?.[name]"
11
+ :is-compare="isCompare"
10
12
  :size="size"
11
13
  :disabled="disabled"
12
14
  @change="change"
15
+ @add-diff-count="onAddDiffCount"
13
16
  ></component>
14
17
  </TMagicCollapseItem>
15
18
  </template>
@@ -36,6 +39,7 @@ const props = defineProps<FieldProps<StyleSchema>>();
36
39
 
37
40
  const emit = defineEmits<{
38
41
  change: [v: any, eventData: ContainerChangeEventData];
42
+ addDiffCount: [];
39
43
  }>();
40
44
 
41
45
  const list = [
@@ -82,4 +86,6 @@ const change = (v: any, eventData: ContainerChangeEventData) => {
82
86
  });
83
87
  emit('change', v, eventData);
84
88
  };
89
+
90
+ const onAddDiffCount = () => emit('addDiffCount');
85
91
  </script>
@@ -30,7 +30,16 @@
30
30
  </div>
31
31
  </div>
32
32
  <div class="border-value-container">
33
- <MContainer :config="config" :model="model" :size="size" :disabled="disabled" @change="change"></MContainer>
33
+ <MContainer
34
+ :config="config"
35
+ :model="model"
36
+ :last-values="lastValues"
37
+ :is-compare="isCompare"
38
+ :size="size"
39
+ :disabled="disabled"
40
+ @change="change"
41
+ @add-diff-count="onAddDiffCount"
42
+ ></MContainer>
34
43
  </div>
35
44
  </div>
36
45
  </template>
@@ -86,11 +95,14 @@ const selectDirection = (d?: string) => (direction.value = d || '');
86
95
 
87
96
  const emit = defineEmits<{
88
97
  change: [v: StyleSchema, eventData: ContainerChangeEventData];
98
+ addDiffCount: [];
89
99
  }>();
90
100
 
91
101
  withDefaults(
92
102
  defineProps<{
93
103
  model: FormValue;
104
+ lastValues?: FormValue;
105
+ isCompare?: boolean;
94
106
  disabled?: boolean;
95
107
  size?: 'large' | 'default' | 'small';
96
108
  }>(),
@@ -104,4 +116,6 @@ const change = (value: StyleSchema, eventData: ContainerChangeEventData) => {
104
116
  });
105
117
  });
106
118
  };
119
+
120
+ const onAddDiffCount = () => emit('addDiffCount');
107
121
  </script>
@@ -64,6 +64,8 @@ withDefaults(
64
64
  disabled?: boolean;
65
65
  size?: 'large' | 'default' | 'small';
66
66
  model: FormValue;
67
+ lastValues?: FormValue;
68
+ isCompare?: boolean;
67
69
  }>(),
68
70
  {},
69
71
  );
@@ -1,5 +1,14 @@
1
1
  <template>
2
- <MContainer :config="config" :model="values" :size="size" :disabled="disabled" @change="change"></MContainer>
2
+ <MContainer
3
+ :config="config"
4
+ :model="values"
5
+ :last-values="lastValues"
6
+ :is-compare="isCompare"
7
+ :size="size"
8
+ :disabled="disabled"
9
+ @change="change"
10
+ @add-diff-count="onAddDiffCount"
11
+ ></MContainer>
3
12
  </template>
4
13
 
5
14
  <script lang="ts" setup>
@@ -13,12 +22,15 @@ import { BackgroundNoRepeat, BackgroundRepeat, BackgroundRepeatX, BackgroundRepe
13
22
 
14
23
  defineProps<{
15
24
  values: Partial<StyleSchema>;
25
+ lastValues?: Partial<StyleSchema>;
26
+ isCompare?: boolean;
16
27
  disabled?: boolean;
17
28
  size?: 'large' | 'default' | 'small';
18
29
  }>();
19
30
 
20
31
  const emit = defineEmits<{
21
32
  change: [v: StyleSchema, eventData: ContainerChangeEventData];
33
+ addDiffCount: [];
22
34
  }>();
23
35
 
24
36
  const config = defineFormItem({
@@ -79,4 +91,6 @@ const config = defineFormItem({
79
91
  const change = (value: StyleSchema, eventData: ContainerChangeEventData) => {
80
92
  emit('change', value, eventData);
81
93
  };
94
+
95
+ const onAddDiffCount = () => emit('addDiffCount');
82
96
  </script>
@@ -1,6 +1,23 @@
1
1
  <template>
2
- <MContainer :config="config" :model="values" :size="size" :disabled="disabled" @change="change"></MContainer>
3
- <Border :model="values" :size="size" :disabled="disabled" @change="change"></Border>
2
+ <MContainer
3
+ :config="config"
4
+ :model="values"
5
+ :last-values="lastValues"
6
+ :is-compare="isCompare"
7
+ :size="size"
8
+ :disabled="disabled"
9
+ @change="change"
10
+ @add-diff-count="onAddDiffCount"
11
+ ></MContainer>
12
+ <Border
13
+ :model="values"
14
+ :last-values="lastValues"
15
+ :is-compare="isCompare"
16
+ :size="size"
17
+ :disabled="disabled"
18
+ @change="change"
19
+ @add-diff-count="onAddDiffCount"
20
+ ></Border>
4
21
  </template>
5
22
 
6
23
  <script lang="ts" setup>
@@ -11,12 +28,15 @@ import Border from '../components/Border.vue';
11
28
 
12
29
  defineProps<{
13
30
  values: Partial<StyleSchema>;
31
+ lastValues?: Partial<StyleSchema>;
32
+ isCompare?: boolean;
14
33
  disabled?: boolean;
15
34
  size?: 'large' | 'default' | 'small';
16
35
  }>();
17
36
 
18
37
  const emit = defineEmits<{
19
38
  change: [v: StyleSchema, eventData: ContainerChangeEventData];
39
+ addDiffCount: [];
20
40
  }>();
21
41
 
22
42
  const config = defineFormItem({
@@ -36,4 +56,6 @@ const config = defineFormItem({
36
56
  const change = (value: StyleSchema, eventData: ContainerChangeEventData) => {
37
57
  emit('change', value, eventData);
38
58
  };
59
+
60
+ const onAddDiffCount = () => emit('addDiffCount');
39
61
  </script>
@@ -1,5 +1,14 @@
1
1
  <template>
2
- <MContainer :config="config" :model="values" :size="size" :disabled="disabled" @change="change"></MContainer>
2
+ <MContainer
3
+ :config="config"
4
+ :model="values"
5
+ :last-values="lastValues"
6
+ :is-compare="isCompare"
7
+ :size="size"
8
+ :disabled="disabled"
9
+ @change="change"
10
+ @add-diff-count="onAddDiffCount"
11
+ ></MContainer>
3
12
  </template>
4
13
 
5
14
  <script lang="ts" setup>
@@ -12,12 +21,15 @@ import { AlignCenter, AlignLeft, AlignRight } from '../icons/text-align';
12
21
 
13
22
  defineProps<{
14
23
  values: Partial<StyleSchema>;
24
+ lastValues?: Partial<StyleSchema>;
25
+ isCompare?: boolean;
15
26
  disabled?: boolean;
16
27
  size?: 'large' | 'default' | 'small';
17
28
  }>();
18
29
 
19
30
  const emit = defineEmits<{
20
31
  change: [v: StyleSchema, eventData: ContainerChangeEventData];
32
+ addDiffCount: [];
21
33
  }>();
22
34
 
23
35
  const config = defineFormItem({
@@ -91,4 +103,6 @@ const config = defineFormItem({
91
103
  const change = (value: StyleSchema, eventData: ContainerChangeEventData) => {
92
104
  emit('change', value, eventData);
93
105
  };
106
+
107
+ const onAddDiffCount = () => emit('addDiffCount');
94
108
  </script>
@@ -1,8 +1,19 @@
1
1
  <template>
2
- <MContainer :config="config" :model="values" :size="size" :disabled="disabled" @change="change"></MContainer>
2
+ <MContainer
3
+ :config="config"
4
+ :model="values"
5
+ :last-values="lastValues"
6
+ :is-compare="isCompare"
7
+ :size="size"
8
+ :disabled="disabled"
9
+ @change="change"
10
+ @add-diff-count="onAddDiffCount"
11
+ ></MContainer>
3
12
  <Box
4
13
  v-show="!['fixed', 'absolute'].includes(values.position)"
5
14
  :model="values"
15
+ :last-values="lastValues"
16
+ :is-compare="isCompare"
6
17
  :size="size"
7
18
  :disabled="disabled"
8
19
  @change="change"
@@ -34,12 +45,15 @@ import {
34
45
 
35
46
  defineProps<{
36
47
  values: Partial<StyleSchema>;
48
+ lastValues?: Partial<StyleSchema>;
49
+ isCompare?: boolean;
37
50
  disabled?: boolean;
38
51
  size?: 'large' | 'default' | 'small';
39
52
  }>();
40
53
 
41
54
  const emit = defineEmits<{
42
55
  change: [v: string | StyleSchema, eventData: ContainerChangeEventData];
56
+ addDiffCount: [];
43
57
  }>();
44
58
 
45
59
  const config = defineFormItem({
@@ -185,4 +199,6 @@ const config = defineFormItem({
185
199
  const change = (value: string | StyleSchema, eventData: ContainerChangeEventData) => {
186
200
  emit('change', value, eventData);
187
201
  };
202
+
203
+ const onAddDiffCount = () => emit('addDiffCount');
188
204
  </script>
@@ -1,5 +1,14 @@
1
1
  <template>
2
- <MContainer :config="config" :model="values" :size="size" :disabled="disabled" @change="change"></MContainer>
2
+ <MContainer
3
+ :config="config"
4
+ :model="values"
5
+ :last-values="lastValues"
6
+ :is-compare="isCompare"
7
+ :size="size"
8
+ :disabled="disabled"
9
+ @change="change"
10
+ @add-diff-count="onAddDiffCount"
11
+ ></MContainer>
3
12
  </template>
4
13
 
5
14
  <script lang="ts" setup>
@@ -8,12 +17,15 @@ import type { StyleSchema } from '@tmagic/schema';
8
17
 
9
18
  const props = defineProps<{
10
19
  values: Partial<StyleSchema>;
20
+ lastValues?: Partial<StyleSchema>;
21
+ isCompare?: boolean;
11
22
  disabled?: boolean;
12
23
  size?: 'large' | 'default' | 'small';
13
24
  }>();
14
25
 
15
26
  const emit = defineEmits<{
16
27
  change: [v: string | StyleSchema, eventData: ContainerChangeEventData];
28
+ addDiffCount: [];
17
29
  }>();
18
30
 
19
31
  const positionText: Record<string, string> = {
@@ -100,4 +112,6 @@ const config = defineFormItem({
100
112
  const change = (value: string | StyleSchema, eventData: ContainerChangeEventData) => {
101
113
  emit('change', value, eventData);
102
114
  };
115
+
116
+ const onAddDiffCount = () => emit('addDiffCount');
103
117
  </script>
@@ -1,5 +1,14 @@
1
1
  <template>
2
- <MContainer :config="config" :model="values" :size="size" :disabled="disabled" @change="change"></MContainer>
2
+ <MContainer
3
+ :config="config"
4
+ :model="values"
5
+ :last-values="lastValues"
6
+ :is-compare="isCompare"
7
+ :size="size"
8
+ :disabled="disabled"
9
+ @change="change"
10
+ @add-diff-count="onAddDiffCount"
11
+ ></MContainer>
3
12
  </template>
4
13
 
5
14
  <script lang="ts" setup>
@@ -8,12 +17,15 @@ import type { StyleSchema } from '@tmagic/schema';
8
17
 
9
18
  defineProps<{
10
19
  values: Partial<StyleSchema>;
20
+ lastValues?: Partial<StyleSchema>;
21
+ isCompare?: boolean;
11
22
  disabled?: boolean;
12
23
  size?: 'large' | 'default' | 'small';
13
24
  }>();
14
25
 
15
26
  const emit = defineEmits<{
16
27
  change: [v: StyleSchema, eventData: ContainerChangeEventData];
28
+ addDiffCount: [];
17
29
  }>();
18
30
 
19
31
  const config = defineFormItem({
@@ -51,4 +63,6 @@ const config = defineFormItem({
51
63
  const change = (value: StyleSchema, eventData: ContainerChangeEventData) => {
52
64
  emit('change', value, eventData);
53
65
  };
66
+
67
+ const onAddDiffCount = () => emit('addDiffCount');
54
68
  </script>