@tmagic/editor 1.8.0-beta.12 → 1.8.0-beta.14

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 (133) hide show
  1. package/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +15 -3
  2. package/dist/es/components/CodeBlockEditor.vue_vue_type_script_setup_true_lang.js +1 -1
  3. package/dist/es/components/CompareForm.vue_vue_type_script_setup_true_lang.js +13 -121
  4. package/dist/es/components/ContentMenu.vue_vue_type_script_setup_true_lang.js +11 -4
  5. package/dist/es/components/FloatingBox.vue_vue_type_script_setup_true_lang.js +7 -2
  6. package/dist/es/components/ViewForm.js +5 -0
  7. package/dist/es/components/ViewForm.vue_vue_type_script_setup_true_lang.js +58 -0
  8. package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +4 -1
  9. package/dist/es/fields/CodeLink.vue_vue_type_script_setup_true_lang.js +4 -1
  10. package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +80 -55
  11. package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +5 -1
  12. package/dist/es/fields/CondOpSelect.vue_vue_type_script_setup_true_lang.js +4 -1
  13. package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +10 -7
  14. package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +4 -1
  15. package/dist/es/fields/DataSourceInput.vue_vue_type_script_setup_true_lang.js +4 -1
  16. package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +4 -1
  17. package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +4 -1
  18. package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +4 -1
  19. package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +4 -1
  20. package/dist/es/fields/DisplayConds.vue_vue_type_script_setup_true_lang.js +8 -2
  21. package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +99 -64
  22. package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +4 -1
  23. package/dist/es/fields/PageFragmentSelect.vue_vue_type_script_setup_true_lang.js +4 -1
  24. package/dist/es/fields/StyleSetter/Index.vue_vue_type_script_setup_true_lang.js +5 -4
  25. package/dist/es/fields/StyleSetter/components/BackgroundPosition.vue_vue_type_script_setup_true_lang.js +4 -1
  26. package/dist/es/fields/StyleSetter/components/Border.vue_vue_type_script_setup_true_lang.js +1 -1
  27. package/dist/es/fields/StyleSetter/icons/align-items/Center.js +31 -0
  28. package/dist/es/fields/StyleSetter/icons/align-items/FlexEnd.js +31 -0
  29. package/dist/es/fields/StyleSetter/icons/align-items/FlexStart.js +31 -0
  30. package/dist/es/fields/StyleSetter/icons/align-items/SpaceAround.js +50 -0
  31. package/dist/es/fields/StyleSetter/icons/align-items/SpaceBetween.js +50 -0
  32. package/dist/es/fields/StyleSetter/icons/background-repeat/NoRepeat.js +6 -6
  33. package/dist/es/fields/StyleSetter/icons/background-repeat/Repeat.js +5 -2
  34. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatX.js +28 -5
  35. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatY.js +31 -5
  36. package/dist/es/fields/StyleSetter/icons/flex-direction/Column.js +10 -2
  37. package/dist/es/fields/StyleSetter/icons/flex-direction/ColumnReverse.js +10 -2
  38. package/dist/es/fields/StyleSetter/icons/flex-direction/Row.js +10 -2
  39. package/dist/es/fields/StyleSetter/icons/flex-direction/RowReverse.js +10 -2
  40. package/dist/es/fields/StyleSetter/icons/justify-content/Center.js +16 -2
  41. package/dist/es/fields/StyleSetter/icons/justify-content/FlexEnd.js +18 -2
  42. package/dist/es/fields/StyleSetter/icons/justify-content/FlexStart.js +18 -2
  43. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceAround.js +36 -2
  44. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceBetween.js +32 -2
  45. package/dist/es/fields/StyleSetter/pro/Background.vue_vue_type_script_setup_true_lang.js +7 -6
  46. package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +6 -3
  47. package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +47 -25
  48. package/dist/es/fields/UISelect.vue_vue_type_script_setup_true_lang.js +4 -1
  49. package/dist/es/hooks/use-compare-form.js +119 -0
  50. package/dist/es/icons/DatasourceIcon.js +17 -0
  51. package/dist/es/index.js +6 -4
  52. package/dist/es/layouts/Framework.vue_vue_type_script_setup_true_lang.js +14 -10
  53. package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +10 -1
  54. package/dist/es/layouts/sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js +3 -3
  55. package/dist/es/plugin.js +2 -1
  56. package/dist/es/services/codeBlock.js +1 -1
  57. package/dist/es/services/editor.js +54 -13
  58. package/dist/es/services/history.js +1 -1
  59. package/dist/es/services/props.js +1 -1
  60. package/dist/es/services/storage.js +1 -1
  61. package/dist/es/services/ui.js +5 -3
  62. package/dist/es/style.css +303 -40
  63. package/dist/es/utils/config.js +4 -1
  64. package/dist/es/utils/const.js +2 -2
  65. package/dist/es/utils/props.js +69 -30
  66. package/dist/style.css +303 -40
  67. package/dist/themes/magic-admin.css +3000 -0
  68. package/dist/tmagic-editor.umd.cjs +1748 -1079
  69. package/package.json +7 -7
  70. package/src/Editor.vue +22 -1
  71. package/src/components/CompareForm.vue +15 -202
  72. package/src/components/ContentMenu.vue +10 -2
  73. package/src/components/FloatingBox.vue +8 -2
  74. package/src/components/ViewForm.vue +55 -0
  75. package/src/editorProps.ts +4 -0
  76. package/src/fields/CodeSelect.vue +54 -43
  77. package/src/fields/CodeSelectCol.vue +1 -0
  78. package/src/fields/DataSourceFieldSelect/Index.vue +14 -5
  79. package/src/fields/DisplayConds.vue +4 -1
  80. package/src/fields/EventSelect.vue +56 -32
  81. package/src/fields/StyleSetter/Index.vue +1 -4
  82. package/src/fields/StyleSetter/components/Border.vue +1 -1
  83. package/src/fields/StyleSetter/icons/align-items/Center.vue +19 -0
  84. package/src/fields/StyleSetter/icons/align-items/FlexEnd.vue +19 -0
  85. package/src/fields/StyleSetter/icons/align-items/FlexStart.vue +19 -0
  86. package/src/fields/StyleSetter/icons/align-items/SpaceAround.vue +34 -0
  87. package/src/fields/StyleSetter/icons/align-items/SpaceBetween.vue +34 -0
  88. package/src/fields/StyleSetter/icons/align-items/index.ts +5 -0
  89. package/src/fields/StyleSetter/icons/background-repeat/NoRepeat.vue +20 -4
  90. package/src/fields/StyleSetter/icons/background-repeat/Repeat.vue +10 -28
  91. package/src/fields/StyleSetter/icons/background-repeat/RepeatX.vue +4 -5
  92. package/src/fields/StyleSetter/icons/background-repeat/RepeatY.vue +4 -5
  93. package/src/fields/StyleSetter/icons/flex-direction/Column.vue +4 -3
  94. package/src/fields/StyleSetter/icons/flex-direction/ColumnReverse.vue +4 -3
  95. package/src/fields/StyleSetter/icons/flex-direction/Row.vue +4 -3
  96. package/src/fields/StyleSetter/icons/flex-direction/RowReverse.vue +4 -3
  97. package/src/fields/StyleSetter/icons/justify-content/Center.vue +5 -2
  98. package/src/fields/StyleSetter/icons/justify-content/FlexEnd.vue +15 -2
  99. package/src/fields/StyleSetter/icons/justify-content/FlexStart.vue +15 -2
  100. package/src/fields/StyleSetter/icons/justify-content/SpaceAround.vue +28 -3
  101. package/src/fields/StyleSetter/icons/justify-content/SpaceBetween.vue +28 -2
  102. package/src/fields/StyleSetter/pro/Background.vue +7 -2
  103. package/src/fields/StyleSetter/pro/Font.vue +3 -3
  104. package/src/fields/StyleSetter/pro/Layout.vue +98 -28
  105. package/src/hooks/index.ts +1 -0
  106. package/src/hooks/use-compare-form.ts +187 -0
  107. package/src/icons/DatasourceIcon.vue +7 -0
  108. package/src/index.ts +4 -0
  109. package/src/layouts/Framework.vue +7 -1
  110. package/src/layouts/props-panel/PropsPanel.vue +19 -1
  111. package/src/layouts/sidebar/Sidebar.vue +3 -3
  112. package/src/plugin.ts +3 -2
  113. package/src/services/editor.ts +54 -11
  114. package/src/services/ui.ts +20 -5
  115. package/src/theme/code-block.scss +37 -0
  116. package/src/theme/common/var.scss +1 -1
  117. package/src/theme/component-list-panel.scss +2 -2
  118. package/src/theme/data-source-field.scss +4 -0
  119. package/src/theme/display-conds.scss +11 -0
  120. package/src/theme/event.scss +58 -4
  121. package/src/theme/framework.scss +4 -1
  122. package/src/theme/history-list-panel.scss +9 -9
  123. package/src/theme/nav-menu.scss +5 -1
  124. package/src/theme/props-panel.scss +2 -1
  125. package/src/theme/style-setter/border.scss +14 -5
  126. package/src/theme/theme.scss +1 -0
  127. package/src/theme/themes/magic-admin/index.scss +214 -0
  128. package/src/theme/ui-select.scss +1 -1
  129. package/src/type.ts +79 -6
  130. package/src/utils/config.ts +9 -1
  131. package/src/utils/const.ts +3 -2
  132. package/src/utils/props.ts +51 -9
  133. package/types/index.d.ts +314 -203
@@ -18,13 +18,16 @@ import dep_default from "./services/dep.js";
18
18
  import keybinding_default from "./services/keybinding.js";
19
19
  import stageOverlay_default from "./services/stageOverlay.js";
20
20
  import { initServiceEvents, initServiceState } from "./initService.js";
21
- import { createBlock, createVNode, defineComponent, mergeDefaults, openBlock, provide, ref, renderSlot, unref, withCtx } from "vue";
21
+ import { M_THEME_KEY } from "@tmagic/design";
22
+ import { computed, createBlock, createVNode, defineComponent, mergeDefaults, openBlock, provide, ref, renderSlot, unref, withCtx } from "vue";
22
23
  import { EventEmitter } from "events";
23
24
  //#region packages/editor/src/Editor.vue?vue&type=script&setup=true&lang.ts
24
25
  var Editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
25
26
  name: "MEditor",
26
27
  __name: "Editor",
27
28
  props: /*@__PURE__*/ mergeDefaults({
29
+ isLargeStageContainer: { type: Boolean },
30
+ theme: {},
28
31
  modelValue: {},
29
32
  componentGroupList: {},
30
33
  datasourceList: {},
@@ -138,6 +141,7 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
138
141
  * 与 PropsPanel 通过 `:extend-state` 显式传入的方式保持等价。
139
142
  */
140
143
  provide("extendFormState", props.extendFormState);
144
+ provide("isLargeStageContainer", computed(() => props.isLargeStageContainer));
141
145
  /**
142
146
  * 提供 PropsPanel 主属性表单的 formState getter,供历史差异弹窗复用,
143
147
  * 让 CompareForm 与 PropsPanel 的 filterFunction 上下文保持一致。
@@ -150,6 +154,12 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
150
154
  */
151
155
  provide("historyListExtraTabs", props.historyListExtraTabs);
152
156
  provide("eventBus", new EventEmitter());
157
+ /**
158
+ * 把当前主题以响应式 ref 形式 provide 给后代,供包含 `Teleport` 的组件
159
+ * (如 `TMagicPopover` / `FloatingBox` / `ContentMenu`)在传送目标上挂 `m-theme--<theme>`
160
+ * 类,让主题级 CSS 变量在 portal 节点上也能命中。详见 `@tmagic/design/theme.ts`。
161
+ */
162
+ provide(M_THEME_KEY, computed(() => props.theme ?? ""));
153
163
  const propsPanelMountedHandler = (e) => {
154
164
  propsPanelRef.value = e;
155
165
  emit("props-panel-mounted", e);
@@ -173,7 +183,8 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
173
183
  "disabled-page-fragment": __props.disabledPageFragment,
174
184
  "page-bar-sort-options": __props.pageBarSortOptions,
175
185
  "page-filter-function": __props.pageFilterFunction,
176
- "hide-sidebar": __props.hideSidebar
186
+ "hide-sidebar": __props.hideSidebar,
187
+ theme: __props.theme
177
188
  }, {
178
189
  header: withCtx(() => [renderSlot(_ctx.$slots, "header")]),
179
190
  nav: withCtx(() => [renderSlot(_ctx.$slots, "nav", { editorService: unref(editor_default) }, () => [createVNode(NavMenu_default, { data: __props.menu }, null, 8, ["data"])])]),
@@ -254,7 +265,8 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
254
265
  "disabled-page-fragment",
255
266
  "page-bar-sort-options",
256
267
  "page-filter-function",
257
- "hide-sidebar"
268
+ "hide-sidebar",
269
+ "theme"
258
270
  ]);
259
271
  };
260
272
  }
@@ -1,9 +1,9 @@
1
1
  import { getEditorConfig } from "../utils/config.js";
2
+ import { getCodeBlockFormConfig } from "../utils/code-block.js";
2
3
  import { useServices } from "../hooks/use-services.js";
3
4
  import { useWindowRect } from "../hooks/use-window-rect.js";
4
5
  import { useEditorContentHeight } from "../hooks/use-editor-content-height.js";
5
6
  import { useNextFloatBoxPosition } from "../hooks/use-next-float-box-position.js";
6
- import { getCodeBlockFormConfig } from "../utils/code-block.js";
7
7
  import CodeEditor_default from "../layouts/CodeEditor.js";
8
8
  import FloatingBox_default from "./FloatingBox.js";
9
9
  import { MFormBox } from "@tmagic/form";
@@ -1,7 +1,7 @@
1
- import { getCodeBlockFormConfig } from "../utils/code-block.js";
1
+ import { useCompareForm } from "../hooks/use-compare-form.js";
2
2
  import { MForm } from "@tmagic/form";
3
3
  import { HookType } from "@tmagic/core";
4
- import { computed, createBlock, createCommentVNode, createElementBlock, defineComponent, inject, normalizeStyle, openBlock, provide, ref, unref, useTemplateRef, watch, watchEffect } from "vue";
4
+ import { computed, createBlock, createCommentVNode, createElementBlock, defineComponent, normalizeStyle, openBlock, unref } from "vue";
5
5
  import { isEqual } from "lodash-es";
6
6
  //#region packages/editor/src/components/CompareForm.vue?vue&type=script&setup=true&lang.ts
7
7
  var CompareForm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
@@ -9,59 +9,27 @@ var CompareForm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
9
9
  __name: "CompareForm",
10
10
  props: {
11
11
  value: {},
12
- lastValue: {},
13
12
  type: {},
14
13
  category: { default: "node" },
15
14
  dataSourceType: {},
16
15
  labelWidth: { default: "120px" },
17
16
  height: {},
18
- extendState: {
19
- type: Function,
20
- default: (state) => state
21
- },
17
+ extendState: {},
22
18
  baseFormState: {},
23
- selfDiffFieldTypes: {},
24
19
  size: {},
25
20
  loadConfig: {},
26
- services: {}
21
+ services: {},
22
+ lastValue: {},
23
+ selfDiffFieldTypes: {}
27
24
  },
28
25
  setup(__props, { expose: __expose }) {
29
26
  const props = __props;
30
- provide("services", props.services);
31
- const config = ref([]);
32
- /** vs-code 编辑器的 monaco 配置项,沿用 Editor 顶层 provide('codeOptions', ...) 的注入。 */
33
- const codeOptions = inject("codeOptions", {});
34
- /** 将代码块的 content 字段统一成字符串,便于在表单/对比中展示 */
35
- const normalizeCodeBlockValue = (v) => {
36
- if (!v) return {};
37
- const next = { ...v };
38
- if (next.content && typeof next.content !== "string") try {
39
- next.content = next.content.toString();
40
- } catch {
41
- next.content = "";
42
- }
43
- return next;
44
- };
45
- const currentValues = computed(() => {
46
- if (props.category === "code-block") return normalizeCodeBlockValue(props.value);
47
- return props.value || {};
48
- });
27
+ const { config, currentValues, wrapperStyle, mergedExtendState, loadConfig, formRef, normalizeCodeBlockValue } = useCompareForm(props);
49
28
  const lastValuesProcessed = computed(() => {
50
29
  if (props.category === "code-block") return normalizeCodeBlockValue(props.lastValue);
51
30
  return props.lastValue || {};
52
31
  });
53
32
  /**
54
- * 外层包裹层的样式:当传入 `height` 时启用固定高度 + 内部滚动,
55
- * 这样滚动条会出现在 CompareForm 内部,避免父容器(如 Dialog)自身也产生滚动。
56
- */
57
- const wrapperStyle = computed(() => {
58
- if (!props.height) return void 0;
59
- return {
60
- height: props.height,
61
- overflow: "auto"
62
- };
63
- });
64
- /**
65
33
  * `code-select` 字段在历史数据中存在两种"语义为空"的形态:
66
34
  * - 字符串 `''`(旧数据 / 用户从未配置过钩子);
67
35
  * - `{ hookType: HookType.CODE, hookData: [] }`(CodeSelect.vue 在挂载时
@@ -84,83 +52,6 @@ var CompareForm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
84
52
  }
85
53
  return !isEqual(curValue, lastValue);
86
54
  };
87
- const removeStyleDisplayConfig = (formConfig) => formConfig.map((item) => {
88
- if (!("type" in item)) return item;
89
- if (item?.type !== "tab" || !Array.isArray(item.items)) return item;
90
- return {
91
- ...item,
92
- items: item.items.map((tabPane) => {
93
- if (tabPane?.title !== "样式" || !Array.isArray(tabPane.items)) return tabPane;
94
- return {
95
- ...tabPane,
96
- display: true
97
- };
98
- })
99
- };
100
- });
101
- const mergedExtendState = (state) => {
102
- return props.extendState(props.baseFormState || state);
103
- };
104
- /**
105
- * 内置的默认 FormConfig 加载逻辑:按 `category` 从对应 service / 工具取配置。
106
- * 作为 ctx.defaultLoadConfig 透传给自定义 `loadConfig`,方便复用与二次加工。
107
- */
108
- const defaultLoadConfig = async () => {
109
- if (!props.services) return [];
110
- switch (props.category) {
111
- case "node":
112
- if (!props.type) return [];
113
- return removeStyleDisplayConfig(await props.services.propsService.getPropsConfig(props.type, { node: props.value }));
114
- case "data-source": return props.services.dataSourceService.getFormConfig(props.type || "base").map((item) => "type" in item && item.type === "tab" ? {
115
- ...item,
116
- active: "fields"
117
- } : item);
118
- case "code-block": return getCodeBlockFormConfig({
119
- paramColConfig: props.services.codeBlockService.getParamsColConfig(),
120
- isDataSource: () => Boolean(props.dataSourceType),
121
- dataSourceType: () => props.dataSourceType,
122
- codeOptions,
123
- editable: false
124
- });
125
- default: return [];
126
- }
127
- };
128
- const loadConfig = async () => {
129
- if (props.loadConfig) {
130
- config.value = await props.loadConfig({
131
- category: props.category,
132
- type: props.type,
133
- dataSourceType: props.dataSourceType,
134
- defaultLoadConfig
135
- });
136
- return;
137
- }
138
- config.value = await defaultLoadConfig();
139
- };
140
- watch([
141
- () => props.category,
142
- () => props.type,
143
- () => props.dataSourceType,
144
- () => props.loadConfig
145
- ], () => {
146
- loadConfig();
147
- }, { immediate: true });
148
- const formRef = useTemplateRef("form");
149
- /**
150
- * 把 services / stage 注入 MForm 的 formState,避免 propsService 注入的表单配置中
151
- * 形如 `display: ({ services }) => services.uiService.get(...)` 的 filterFunction
152
- * 在执行时拿不到 `formState.services` 而报错。
153
- *
154
- * 与 props-panel/FormPanel.vue 中的注入方式保持一致:
155
- * - services:整个 useServices() 返回的服务集合;
156
- * - stage:当前 editorService.get('stage') 的最新值。
157
- */
158
- watchEffect(() => {
159
- if (formRef.value && props.services) {
160
- formRef.value.formState.stage = props.services.editorService.get("stage");
161
- formRef.value.formState.services = props.services;
162
- }
163
- });
164
55
  __expose({
165
56
  form: formRef,
166
57
  config,
@@ -169,18 +60,18 @@ var CompareForm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
169
60
  return (_ctx, _cache) => {
170
61
  return openBlock(), createElementBlock("div", {
171
62
  class: "m-editor-compare-form-wrapper",
172
- style: normalizeStyle(wrapperStyle.value)
173
- }, [config.value.length ? (openBlock(), createBlock(unref(MForm), {
63
+ style: normalizeStyle(unref(wrapperStyle))
64
+ }, [unref(config).length ? (openBlock(), createBlock(unref(MForm), {
174
65
  key: 0,
175
66
  ref: "form",
176
67
  class: "m-editor-compare-form",
177
- config: config.value,
178
- "init-values": currentValues.value,
68
+ config: unref(config),
69
+ "init-values": unref(currentValues),
179
70
  "last-values": lastValuesProcessed.value,
180
71
  "is-compare": true,
181
72
  disabled: true,
182
73
  "label-width": __props.labelWidth,
183
- "extend-state": mergedExtendState,
74
+ "extend-state": unref(mergedExtendState),
184
75
  "show-diff": showDiff,
185
76
  "self-diff-field-types": __props.selfDiffFieldTypes,
186
77
  size: __props.size
@@ -189,6 +80,7 @@ var CompareForm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
189
80
  "init-values",
190
81
  "last-values",
191
82
  "label-width",
83
+ "extend-state",
192
84
  "self-diff-field-types",
193
85
  "size"
194
86
  ])) : createCommentVNode("v-if", true)], 4);
@@ -1,6 +1,6 @@
1
1
  import ToolButton_default from "./ToolButton.js";
2
- import { useZIndex } from "@tmagic/design";
3
- import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, openBlock, ref, renderList, renderSlot, resolveComponent, useTemplateRef, vShow, withCtx, withDirectives, withModifiers } from "vue";
2
+ import { useThemeClass, useZIndex } from "@tmagic/design";
3
+ import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, openBlock, ref, renderList, renderSlot, resolveComponent, unref, useTemplateRef, vShow, withCtx, withDirectives, withModifiers } from "vue";
4
4
  //#region packages/editor/src/components/ContentMenu.vue?vue&type=script&setup=true&lang.ts
5
5
  var ContentMenu_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
6
6
  name: "MEditorContentMenu",
@@ -29,6 +29,13 @@ var ContentMenu_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
29
29
  const buttonRefs = useTemplateRef("buttons");
30
30
  const subMenuRef = useTemplateRef("subMenu");
31
31
  const visible = ref(false);
32
+ /**
33
+ * 主题修饰类(来自最近的 `<MEditor>` / `<MForm>` 祖先 provide)。
34
+ * - 顶层 `ContentMenu` 渲染在编辑器子树中,加上去是冗余但无害;
35
+ * - 子菜单(递归 `<content-menu :is-sub-menu="true">` 被 `<teleport to="body">` 送到 body)
36
+ * 不在编辑器子树中,必须显式挂上主题类,主题级 CSS 变量才能命中。
37
+ */
38
+ const themeClass = useThemeClass();
32
39
  const subMenuData = ref([]);
33
40
  const zIndex = useZIndex();
34
41
  const curZIndex = ref(0);
@@ -118,8 +125,8 @@ var ContentMenu_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
118
125
  persisted: ""
119
126
  }, {
120
127
  default: withCtx(() => [withDirectives(createElementVNode("div", {
121
- class: "magic-editor-content-menu",
122
128
  ref: "menu",
129
+ class: normalizeClass(["magic-editor-content-menu", unref(themeClass)]),
123
130
  style: normalizeStyle(menuStyle.value),
124
131
  onMouseenter: _cache[0] || (_cache[0] = ($event) => mouseenterHandler()),
125
132
  onContextmenu: _cache[1] || (_cache[1] = withModifiers(() => {}, ["prevent"]))
@@ -150,7 +157,7 @@ var ContentMenu_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
150
157
  "is-sub-menu": true,
151
158
  onHide: hide
152
159
  }, null, 8, ["active", "menu-data"])) : createCommentVNode("v-if", true)]))
153
- ], 36), [[vShow, visible.value]])]),
160
+ ], 38), [[vShow, visible.value]])]),
154
161
  _: 3
155
162
  });
156
163
  };
@@ -1,5 +1,5 @@
1
1
  import Icon_default from "./Icon.js";
2
- import { TMagicButton, useZIndex } from "@tmagic/design";
2
+ import { TMagicButton, useThemeClass, useZIndex } from "@tmagic/design";
3
3
  import { Teleport, computed, createBlock, createCommentVNode, createElementVNode, createVNode, defineComponent, mergeModels, mergeProps, nextTick, normalizeStyle, onBeforeUnmount, openBlock, provide, ref, renderSlot, toDisplayString, unref, useModel, useTemplateRef, watch, withCtx } from "vue";
4
4
  import { Close } from "@element-plus/icons-vue";
5
5
  import VanillaMoveable from "moveable";
@@ -43,6 +43,11 @@ var FloatingBox_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
43
43
  const props = __props;
44
44
  const targetEl = useTemplateRef("target");
45
45
  const titleEl = useTemplateRef("title");
46
+ /**
47
+ * 主题修饰类(来自最近的 `<MEditor>` / `<MForm>` 祖先 provide)。
48
+ * 挂在 `Teleport` 出去的浮动面板根节点上,让主题级 CSS 变量在 portal 节点上也能命中。
49
+ */
50
+ const themeClass = useThemeClass();
46
51
  const zIndex = useZIndex();
47
52
  const curZIndex = ref(0);
48
53
  const titleHeight = ref(0);
@@ -179,7 +184,7 @@ var FloatingBox_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
179
184
  to: "body"
180
185
  }, [createElementVNode("div", mergeProps({
181
186
  ref: "target",
182
- class: "m-editor-float-box"
187
+ class: ["m-editor-float-box", unref(themeClass)]
183
188
  }, _ctx.$attrs, {
184
189
  style: {
185
190
  ...style.value,
@@ -0,0 +1,5 @@
1
+ import ViewForm_vue_vue_type_script_setup_true_lang_default from "./ViewForm.vue_vue_type_script_setup_true_lang.js";
2
+ //#region packages/editor/src/components/ViewForm.vue
3
+ var ViewForm_default = ViewForm_vue_vue_type_script_setup_true_lang_default;
4
+ //#endregion
5
+ export { ViewForm_default as default };
@@ -0,0 +1,58 @@
1
+ import { useCompareForm } from "../hooks/use-compare-form.js";
2
+ import { MForm } from "@tmagic/form";
3
+ import { createBlock, createCommentVNode, createElementBlock, defineComponent, normalizeStyle, openBlock, unref } from "vue";
4
+ //#region packages/editor/src/components/ViewForm.vue?vue&type=script&setup=true&lang.ts
5
+ var ViewForm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
6
+ name: "MEditorViewForm",
7
+ __name: "ViewForm",
8
+ props: {
9
+ value: {},
10
+ type: {},
11
+ category: { default: "node" },
12
+ dataSourceType: {},
13
+ labelWidth: { default: "120px" },
14
+ height: {},
15
+ extendState: {},
16
+ baseFormState: {},
17
+ size: {},
18
+ loadConfig: {},
19
+ services: {},
20
+ disabled: {
21
+ type: Boolean,
22
+ default: true
23
+ }
24
+ },
25
+ setup(__props, { expose: __expose }) {
26
+ const { config, currentValues, wrapperStyle, mergedExtendState, loadConfig, formRef } = useCompareForm(__props);
27
+ __expose({
28
+ form: formRef,
29
+ config,
30
+ reload: loadConfig
31
+ });
32
+ return (_ctx, _cache) => {
33
+ return openBlock(), createElementBlock("div", {
34
+ class: "m-editor-view-form-wrapper",
35
+ style: normalizeStyle(unref(wrapperStyle))
36
+ }, [unref(config).length ? (openBlock(), createBlock(unref(MForm), {
37
+ key: 0,
38
+ ref: "form",
39
+ class: "m-editor-view-form",
40
+ config: unref(config),
41
+ "init-values": unref(currentValues),
42
+ disabled: __props.disabled,
43
+ "label-width": __props.labelWidth,
44
+ "extend-state": unref(mergedExtendState),
45
+ size: __props.size
46
+ }, null, 8, [
47
+ "config",
48
+ "init-values",
49
+ "disabled",
50
+ "label-width",
51
+ "extend-state",
52
+ "size"
53
+ ])) : createCommentVNode("v-if", true)], 4);
54
+ };
55
+ }
56
+ });
57
+ //#endregion
58
+ export { ViewForm_vue_vue_type_script_setup_true_lang_default as default };
@@ -17,7 +17,10 @@ var Code_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCompo
17
17
  },
18
18
  size: {},
19
19
  lastValues: {},
20
- isCompare: { type: Boolean }
20
+ isCompare: { type: Boolean },
21
+ text: {},
22
+ labelWidth: {},
23
+ labelPosition: {}
21
24
  },
22
25
  emits: ["change"],
23
26
  setup(__props, { emit: __emit }) {
@@ -15,7 +15,10 @@ var CodeLink_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
15
15
  disabled: { type: Boolean },
16
16
  size: {},
17
17
  lastValues: {},
18
- isCompare: { type: Boolean }
18
+ isCompare: { type: Boolean },
19
+ text: {},
20
+ labelWidth: {},
21
+ labelPosition: {}
19
22
  },
20
23
  emits: ["change"],
21
24
  setup(__props, { emit: __emit }) {
@@ -1,9 +1,10 @@
1
1
  import { useServices } from "../hooks/use-services.js";
2
2
  import { MContainer } from "@tmagic/form";
3
- import { TMagicCard } from "@tmagic/design";
3
+ import { TMagicButton, TMagicCard } from "@tmagic/design";
4
4
  import { HookCodeType, HookType } from "@tmagic/core";
5
- import { computed, createElementBlock, createVNode, defineComponent, normalizeClass, openBlock, unref, watch, withCtx } from "vue";
5
+ import { computed, createElementBlock, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, toDisplayString, unref, watch, withCtx } from "vue";
6
6
  import { isEmpty } from "lodash-es";
7
+ import { Plus } from "@element-plus/icons-vue";
7
8
  //#region packages/editor/src/fields/CodeSelect.vue?vue&type=script&setup=true&lang.ts
8
9
  var CodeSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
9
10
  name: "MFieldsCodeSelect",
@@ -18,7 +19,10 @@ var CodeSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
18
19
  disabled: { type: Boolean },
19
20
  size: {},
20
21
  lastValues: {},
21
- isCompare: { type: Boolean }
22
+ isCompare: { type: Boolean },
23
+ text: {},
24
+ labelWidth: {},
25
+ labelPosition: {}
22
26
  },
23
27
  emits: ["change"],
24
28
  setup(__props, { emit: __emit }) {
@@ -39,11 +43,21 @@ var CodeSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
39
43
  * 仅当存在历史值时才启用对比,避免 lastValues 缺失时退化为「全部新增」的空对比。
40
44
  */
41
45
  const isCompareMode = computed(() => Boolean(props.isCompare && props.lastValues));
46
+ const newHandler = () => {
47
+ const defaultCode = {
48
+ codeType: HookCodeType.CODE,
49
+ codeId: ""
50
+ };
51
+ const name = props.config.name || "";
52
+ const hookData = props.model[name]?.hookData || [];
53
+ emit("change", defaultCode, { modifyKey: `hookData.${hookData.length}` });
54
+ };
42
55
  const codeConfig = computed(() => ({
43
56
  type: "group-list",
44
57
  name: "hookData",
45
58
  enableToggleMode: false,
46
59
  expandAll: true,
60
+ addable: () => false,
47
61
  title: (mForm, { model, index }) => {
48
62
  if (model.codeType === HookCodeType.DATA_SOURCE_METHOD) {
49
63
  if (Array.isArray(model.codeId)) {
@@ -56,57 +70,54 @@ var CodeSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
56
70
  if (codeContent) return codeContent.name;
57
71
  return model.codeId || index;
58
72
  },
59
- items: [{
60
- type: "row",
61
- items: [
62
- {
63
- type: "select",
64
- name: "codeType",
65
- span: 6,
66
- options: [{
67
- value: HookCodeType.CODE,
68
- text: "代码块"
69
- }, {
70
- value: HookCodeType.DATA_SOURCE_METHOD,
71
- text: "数据源方法"
72
- }],
73
- rules: [{
74
- typeMatch: true,
75
- trigger: "change"
76
- }],
77
- defaultValue: HookCodeType.CODE,
78
- onChange: (_mForm, v, { setModel }) => {
79
- if (v === HookCodeType.DATA_SOURCE_METHOD) setModel("codeId", []);
80
- else setModel("codeId", "");
81
- return v;
82
- }
83
- },
84
- {
85
- type: "code-select-col",
86
- name: "codeId",
87
- span: 18,
88
- labelWidth: 0,
89
- display: (_mForm, { model }) => model.codeType !== HookCodeType.DATA_SOURCE_METHOD,
90
- notEditable: () => !codeBlockService.getEditStatus(),
91
- rules: [{
92
- typeMatch: true,
93
- trigger: "change"
94
- }]
95
- },
96
- {
97
- type: "data-source-method-select",
98
- name: "codeId",
99
- span: 18,
100
- labelWidth: 0,
101
- display: (_mForm, { model }) => model.codeType === HookCodeType.DATA_SOURCE_METHOD,
102
- notEditable: () => !dataSourceService.get("editable"),
103
- rules: [{
104
- typeMatch: true,
105
- trigger: "change"
106
- }]
73
+ titlePrefix: props.config.name === void 0 ? void 0 : String(props.config.name),
74
+ items: [
75
+ {
76
+ text: "代码类型",
77
+ type: "select",
78
+ name: "codeType",
79
+ labelPosition: "right",
80
+ rules: [{
81
+ typeMatch: true,
82
+ trigger: "change"
83
+ }],
84
+ options: [{
85
+ value: HookCodeType.CODE,
86
+ text: "代码块"
87
+ }, {
88
+ value: HookCodeType.DATA_SOURCE_METHOD,
89
+ text: "数据源方法"
90
+ }],
91
+ defaultValue: HookCodeType.CODE,
92
+ onChange: (_mForm, v, { setModel }) => {
93
+ if (v === HookCodeType.DATA_SOURCE_METHOD) setModel("codeId", []);
94
+ else setModel("codeId", "");
95
+ return v;
107
96
  }
108
- ]
109
- }]
97
+ },
98
+ {
99
+ type: "code-select-col",
100
+ name: "codeId",
101
+ text: "代码块",
102
+ rules: [{
103
+ typeMatch: true,
104
+ trigger: "change"
105
+ }],
106
+ display: (_mForm, { model }) => model.codeType !== HookCodeType.DATA_SOURCE_METHOD,
107
+ notEditable: () => !codeBlockService.getEditStatus()
108
+ },
109
+ {
110
+ type: "data-source-method-select",
111
+ name: "codeId",
112
+ text: "数据源字段",
113
+ rules: [{
114
+ typeMatch: true,
115
+ trigger: "change"
116
+ }],
117
+ display: (_mForm, { model }) => model.codeType === HookCodeType.DATA_SOURCE_METHOD,
118
+ notEditable: () => !dataSourceService.get("editable")
119
+ }
120
+ ]
110
121
  }));
111
122
  watch(() => props.model[props.name], (value) => {
112
123
  if (isEmpty(value)) props.model[props.name] = {
@@ -116,10 +127,11 @@ var CodeSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
116
127
  }, { immediate: true });
117
128
  const changeHandler = (v, eventData) => emit("change", v, eventData);
118
129
  return (_ctx, _cache) => {
119
- return openBlock(), createElementBlock("div", { class: normalizeClass(["m-fields-code-select", __props.config.className]) }, [createVNode(unref(TMagicCard), null, {
130
+ return openBlock(), createElementBlock("div", { class: normalizeClass(["m-fields-code-select", __props.config.className]) }, [createVNode(unref(TMagicCard), { flat: __props.config.flat }, {
120
131
  default: withCtx(() => [createVNode(unref(MContainer), {
121
132
  config: codeConfig.value,
122
133
  size: __props.size,
134
+ class: "code-select-content",
123
135
  prop: __props.prop,
124
136
  disabled: __props.disabled,
125
137
  "is-compare": isCompareMode.value,
@@ -134,9 +146,22 @@ var CodeSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
134
146
  "is-compare",
135
147
  "last-values",
136
148
  "model"
149
+ ]), createVNode(unref(TMagicButton), {
150
+ class: "create-button fullWidth",
151
+ icon: unref(Plus),
152
+ size: __props.size,
153
+ disabled: __props.disabled,
154
+ onClick: _cache[0] || (_cache[0] = ($event) => newHandler())
155
+ }, {
156
+ default: withCtx(() => [createTextVNode("添加" + toDisplayString(__props.config.text), 1)]),
157
+ _: 1
158
+ }, 8, [
159
+ "icon",
160
+ "size",
161
+ "disabled"
137
162
  ])]),
138
163
  _: 1
139
- })], 2);
164
+ }, 8, ["flat"])], 2);
140
165
  };
141
166
  }
142
167
  });
@@ -26,7 +26,10 @@ var CodeSelectCol_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
26
26
  },
27
27
  size: {},
28
28
  lastValues: {},
29
- isCompare: { type: Boolean }
29
+ isCompare: { type: Boolean },
30
+ text: {},
31
+ labelWidth: {},
32
+ labelPosition: {}
30
33
  },
31
34
  emits: ["change"],
32
35
  setup(__props, { emit: __emit }) {
@@ -72,6 +75,7 @@ var CodeSelectCol_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
72
75
  type: "select",
73
76
  name: props.name,
74
77
  disabled: props.disabled,
78
+ text: props.config.text,
75
79
  options: () => {
76
80
  if (codeDsl.value) return map(codeDsl.value, (value, key) => ({
77
81
  text: `${value.name}(${key})`,
@@ -17,7 +17,10 @@ var CondOpSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
17
17
  disabled: { type: Boolean },
18
18
  size: {},
19
19
  lastValues: {},
20
- isCompare: { type: Boolean }
20
+ isCompare: { type: Boolean },
21
+ text: {},
22
+ labelWidth: {},
23
+ labelPosition: {}
21
24
  },
22
25
  emits: ["change"],
23
26
  setup(__props, { emit: __emit }) {