@tmagic/editor 1.8.0-beta.24 → 1.8.0-beta.26

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 (113) hide show
  1. package/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +10 -16
  2. package/dist/es/components/CodeParams.vue_vue_type_script_setup_true_lang.js +4 -4
  3. package/dist/es/components/CompareForm.vue_vue_type_script_setup_true_lang.js +5 -8
  4. package/dist/es/components/ViewForm.vue_vue_type_script_setup_true_lang.js +3 -5
  5. package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +3 -11
  6. package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +29 -124
  7. package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +5 -6
  8. package/dist/es/fields/CondOpSelect.vue_vue_type_script_setup_true_lang.js +3 -2
  9. package/dist/es/fields/DataSourceFieldSelect/FieldSelect.vue_vue_type_script_setup_true_lang.js +1 -1
  10. package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +7 -6
  11. package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +6 -10
  12. package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +5 -7
  13. package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +1 -4
  14. package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +4 -6
  15. package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +1 -1
  16. package/dist/es/fields/DisplayConds.vue_vue_type_script_setup_true_lang.js +9 -137
  17. package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +51 -326
  18. package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +2 -4
  19. package/dist/es/fields/StyleSetter/components/Border.vue_vue_type_script_setup_true_lang.js +3 -34
  20. package/dist/es/fields/StyleSetter/configs.js +663 -0
  21. package/dist/es/fields/StyleSetter/pro/Background.vue_vue_type_script_setup_true_lang.js +5 -108
  22. package/dist/es/fields/StyleSetter/pro/Border.vue_vue_type_script_setup_true_lang.js +3 -9
  23. package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +6 -103
  24. package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +5 -265
  25. package/dist/es/fields/StyleSetter/pro/Position.vue_vue_type_script_setup_true_lang.js +5 -85
  26. package/dist/es/fields/StyleSetter/pro/Transform.vue_vue_type_script_setup_true_lang.js +3 -22
  27. package/dist/es/fields/configs/codeSelect.js +98 -0
  28. package/dist/es/fields/configs/displayConds.js +158 -0
  29. package/dist/es/fields/configs/eventSelect.js +225 -0
  30. package/dist/es/fields/configs/stickyAddButton.js +20 -0
  31. package/dist/es/fields/headless-validation.js +139 -0
  32. package/dist/es/headless.js +2 -0
  33. package/dist/es/hooks/use-compare-form.js +6 -23
  34. package/dist/es/hooks/use-form-context.js +19 -0
  35. package/dist/es/index.js +3 -2
  36. package/dist/es/initService.js +17 -1
  37. package/dist/es/layouts/history-list/HistoryDiffDialog.vue_vue_type_script_setup_true_lang.js +1 -7
  38. package/dist/es/layouts/history-list/HistoryListPanel.vue_vue_type_script_setup_true_lang.js +1 -11
  39. package/dist/es/layouts/history-list/useHistoryRevert.js +3 -11
  40. package/dist/es/layouts/props-panel/FormPanel.vue_vue_type_script_setup_true_lang.js +10 -23
  41. package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +3 -13
  42. package/dist/es/layouts/sidebar/code-block/CodeBlockListPanel.vue_vue_type_script_setup_true_lang.js +1 -1
  43. package/dist/es/layouts/sidebar/code-block/useContentMenu.js +1 -1
  44. package/dist/es/layouts/sidebar/data-source/DataSourceListPanel.vue_vue_type_script_setup_true_lang.js +1 -1
  45. package/dist/es/layouts/sidebar/data-source/useContentMenu.js +1 -1
  46. package/dist/es/plugin.js +33 -32
  47. package/dist/es/style.css +120 -60
  48. package/dist/es/utils/data-source/index.js +2 -1
  49. package/dist/es/utils/props.js +1 -4
  50. package/dist/es/utils/type-match-rules.js +23 -22
  51. package/dist/style.css +120 -60
  52. package/dist/themes/magic-admin.css +132 -67
  53. package/dist/tmagic-editor-headless.umd.cjs +10867 -0
  54. package/dist/tmagic-editor.umd.cjs +2151 -2034
  55. package/package.json +12 -7
  56. package/src/Editor.vue +12 -16
  57. package/src/components/CodeParams.vue +10 -4
  58. package/src/components/CompareForm.vue +4 -5
  59. package/src/components/ViewForm.vue +2 -3
  60. package/src/editorProps.ts +1 -2
  61. package/src/fields/Code.vue +2 -10
  62. package/src/fields/CodeSelect.vue +20 -116
  63. package/src/fields/CodeSelectCol.vue +3 -5
  64. package/src/fields/CondOpSelect.vue +3 -2
  65. package/src/fields/DataSourceFieldSelect/FieldSelect.vue +1 -1
  66. package/src/fields/DataSourceFieldSelect/Index.vue +7 -6
  67. package/src/fields/DataSourceFields.vue +0 -7
  68. package/src/fields/DataSourceMethodSelect.vue +2 -5
  69. package/src/fields/DataSourceMethods.vue +1 -6
  70. package/src/fields/DataSourceMocks.vue +1 -10
  71. package/src/fields/DataSourceSelect.vue +1 -1
  72. package/src/fields/DisplayConds.vue +17 -153
  73. package/src/fields/EventSelect.vue +28 -375
  74. package/src/fields/KeyValue.vue +3 -4
  75. package/src/fields/StyleSetter/components/Border.vue +4 -38
  76. package/src/fields/StyleSetter/configs.ts +690 -0
  77. package/src/fields/StyleSetter/pro/Background.vue +4 -104
  78. package/src/fields/StyleSetter/pro/Border.vue +3 -12
  79. package/src/fields/StyleSetter/pro/Font.vue +5 -124
  80. package/src/fields/StyleSetter/pro/Layout.vue +4 -219
  81. package/src/fields/StyleSetter/pro/Position.vue +6 -110
  82. package/src/fields/StyleSetter/pro/Transform.vue +4 -30
  83. package/src/fields/configs/codeSelect.ts +127 -0
  84. package/src/fields/configs/displayConds.ts +184 -0
  85. package/src/fields/configs/eventSelect.ts +309 -0
  86. package/src/fields/configs/stickyAddButton.ts +31 -0
  87. package/src/fields/headless-validation.ts +177 -0
  88. package/src/headless.ts +33 -0
  89. package/src/hooks/use-compare-form.ts +7 -25
  90. package/src/hooks/use-form-context.ts +40 -0
  91. package/src/index.ts +2 -0
  92. package/src/initService.ts +23 -1
  93. package/src/layouts/history-list/HistoryDiffDialog.vue +0 -10
  94. package/src/layouts/history-list/HistoryListPanel.vue +1 -13
  95. package/src/layouts/history-list/useHistoryRevert.ts +7 -13
  96. package/src/layouts/props-panel/FormPanel.vue +17 -28
  97. package/src/layouts/props-panel/PropsPanel.vue +1 -4
  98. package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +1 -1
  99. package/src/layouts/sidebar/code-block/useContentMenu.ts +1 -1
  100. package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +1 -1
  101. package/src/layouts/sidebar/data-source/useContentMenu.ts +1 -1
  102. package/src/plugin.ts +32 -33
  103. package/src/theme/code-block.scss +0 -37
  104. package/src/theme/display-conds.scss +4 -0
  105. package/src/theme/event.scss +22 -45
  106. package/src/theme/props-panel.scss +17 -3
  107. package/src/theme/themes/magic-admin/index.scss +12 -1
  108. package/src/type.ts +10 -29
  109. package/src/utils/data-source/index.ts +1 -0
  110. package/src/utils/props.ts +1 -4
  111. package/src/utils/type-match-rules.ts +37 -31
  112. package/types/headless.d.ts +18 -0
  113. package/types/index.d.ts +155 -180
@@ -1,3 +1,4 @@
1
+ import { useEditorFormContext } from "./hooks/use-form-context.js";
1
2
  import props_default from "./services/props.js";
2
3
  import history_default from "./services/history.js";
3
4
  import storage_default from "./services/storage.js";
@@ -18,8 +19,9 @@ import dep_default from "./services/dep.js";
18
19
  import keybinding_default from "./services/keybinding.js";
19
20
  import stageOverlay_default from "./services/stageOverlay.js";
20
21
  import { initServiceEvents, initServiceState } from "./initService.js";
22
+ import { FORM_CONTEXT_KEY } from "@tmagic/form";
21
23
  import { M_THEME_KEY } from "@tmagic/design";
22
- import { computed, createBlock, createVNode, defineComponent, mergeDefaults, openBlock, provide, ref, renderSlot, unref, withCtx } from "vue";
24
+ import { computed, createBlock, createVNode, defineComponent, mergeDefaults, openBlock, provide, renderSlot, unref, withCtx } from "vue";
23
25
  import { EventEmitter } from "events";
24
26
  //#region packages/editor/src/Editor.vue?vue&type=script&setup=true&lang.ts
25
27
  var Editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
@@ -75,7 +77,6 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
75
77
  canDropIn: { type: Function },
76
78
  beforeDblclick: { type: Function },
77
79
  beforeLayerNodeDblclick: { type: Function },
78
- extendFormState: { type: Function },
79
80
  historyListExtraTabs: {},
80
81
  pageBarSortOptions: {},
81
82
  pageFilterFunction: { type: Function }
@@ -131,25 +132,21 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
131
132
  beforeDblclick: props.beforeDblclick
132
133
  };
133
134
  stageOverlay_default.set("stageOptions", stageOptions);
134
- const propsPanelRef = ref(null);
135
135
  provide("services", services);
136
136
  provide("codeOptions", props.codeOptions);
137
137
  provide("stageOptions", stageOptions);
138
138
  /** 是否启用「属性配置表单校验」联动能力,供 PropsPanel / FormPanel 判断校验失败时是否仍更新节点并记录错误 */
139
139
  provide(ENABLE_PROPS_FORM_VALIDATE, props.enablePropsFormValidate ?? false);
140
140
  /**
141
- * 把顶层 `extendFormState` 提供给非 PropsPanel 链路上的组件使用(例如历史差异对话框 HistoryDiffDialog
142
- * 内部的 CompareForm)。这样所有依赖业务上下文的表单 filterFunction 都能拿到一致的扩展状态,
143
- * 与 PropsPanel 通过 `:extend-state` 显式传入的方式保持等价。
141
+ * 编辑器注入给整棵表单树的业务上下文(`services` / `stage`),属性面板、对比表单、
142
+ * 侧边栏里的嵌套 MForm 都通过 inject 自动继承。
143
+ *
144
+ * 业务方要追加自己的字段,在 `<MEditor>` 外层再 `provide(FORM_CONTEXT_KEY, computed(...))`
145
+ * 即可,配置回调统一通过 `mForm.xxx` 读取。
144
146
  */
145
- provide("extendFormState", props.extendFormState);
147
+ provide(FORM_CONTEXT_KEY, useEditorFormContext(() => services));
146
148
  provide("isLargeStageContainer", computed(() => props.isLargeStageContainer));
147
149
  /**
148
- * 提供 PropsPanel 主属性表单的 formState getter,供历史差异弹窗复用,
149
- * 让 CompareForm 与 PropsPanel 的 filterFunction 上下文保持一致。
150
- */
151
- provide("getPropsPanelFormState", () => propsPanelRef.value?.configForm?.formState);
152
- /**
153
150
  * 把历史记录面板的自定义扩展 tab 提供给深层的 HistoryListPanel(它挂在 NavMenu 中,
154
151
  * 以 markRaw component 形式渲染,无法直接通过 props 透传)。业务方可借此在历史记录
155
152
  * 面板内追加自定义模块的历史 tab。
@@ -163,11 +160,9 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
163
160
  */
164
161
  provide(M_THEME_KEY, computed(() => props.theme ?? ""));
165
162
  const propsPanelMountedHandler = (e) => {
166
- propsPanelRef.value = e;
167
163
  emit("props-panel-mounted", e);
168
164
  };
169
165
  const propsPanelUnmountedHandler = () => {
170
- propsPanelRef.value = null;
171
166
  emit("props-panel-unmounted");
172
167
  };
173
168
  const propsPanelSubmitErrorHandler = (e) => {
@@ -244,7 +239,6 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
244
239
  "custom-content-menu"
245
240
  ])])]),
246
241
  "props-panel": withCtx(() => [renderSlot(_ctx.$slots, "props-panel", {}, () => [createVNode(PropsPanel_default, {
247
- "extend-state": __props.extendFormState,
248
242
  "disabled-show-src": __props.disabledShowSrc,
249
243
  onMounted: propsPanelMountedHandler,
250
244
  onUnmounted: propsPanelUnmountedHandler,
@@ -253,7 +247,7 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
253
247
  }, {
254
248
  "props-panel-header": withCtx(() => [renderSlot(_ctx.$slots, "props-panel-header")]),
255
249
  _: 3
256
- }, 8, ["extend-state", "disabled-show-src"])])]),
250
+ }, 8, ["disabled-show-src"])])]),
257
251
  empty: withCtx(() => [renderSlot(_ctx.$slots, "empty", { editorService: unref(editor_default) })]),
258
252
  "content-after": withCtx(() => [renderSlot(_ctx.$slots, "content-after")]),
259
253
  footer: withCtx(() => [renderSlot(_ctx.$slots, "footer")]),
@@ -1,5 +1,5 @@
1
1
  import { error } from "../utils/logger.js";
2
- import { MForm } from "@tmagic/form";
2
+ import { MForm, defineFormItem } from "@tmagic/form";
3
3
  import { computed, createBlock, defineComponent, openBlock, unref, useTemplateRef } from "vue";
4
4
  //#region packages/editor/src/components/CodeParams.vue?vue&type=script&setup=true&lang.ts
5
5
  var CodeParams_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
@@ -19,13 +19,13 @@ var CodeParams_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
19
19
  const props = __props;
20
20
  const emit = __emit;
21
21
  const formRef = useTemplateRef("form");
22
- const getFormConfig = (items = []) => [{
22
+ const getFormConfig = (items = []) => [defineFormItem({
23
23
  type: "fieldset",
24
24
  items,
25
25
  legend: "参数",
26
- labelWidth: "120px",
26
+ labelPosition: "top",
27
27
  name: props.name
28
- }];
28
+ })];
29
29
  const codeParamsConfig = computed(() => getFormConfig(props.paramsConfig.map(({ name, text, extra, ...config }) => {
30
30
  let { type } = config;
31
31
  if (typeof type === "function") type = type(void 0, { model: props.model[props.name] });
@@ -14,8 +14,6 @@ var CompareForm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
14
14
  dataSourceType: {},
15
15
  labelWidth: { default: "120px" },
16
16
  height: {},
17
- extendState: {},
18
- baseFormState: {},
19
17
  size: {},
20
18
  loadConfig: {},
21
19
  services: {},
@@ -24,7 +22,7 @@ var CompareForm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
24
22
  },
25
23
  setup(__props, { expose: __expose }) {
26
24
  const props = __props;
27
- const { config, currentValues, wrapperStyle, mergedExtendState, loadConfig, formRef, normalizeCodeBlockValue } = useCompareForm(props);
25
+ const { config, currentValues, wrapperStyle, formContext, loadConfig, formRef, normalizeCodeBlockValue } = useCompareForm(props);
28
26
  const lastValuesProcessed = computed(() => {
29
27
  if (props.category === "code-block") return normalizeCodeBlockValue(props.lastValue);
30
28
  return props.lastValue || {};
@@ -32,9 +30,8 @@ var CompareForm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
32
30
  /**
33
31
  * `code-select` 字段在历史数据中存在两种"语义为空"的形态:
34
32
  * - 字符串 `''`(旧数据 / 用户从未配置过钩子);
35
- * - `{ hookType: HookType.CODE, hookData: [] }`(CodeSelect.vue 在挂载时
36
- * 写入的默认结构,参见 packages/editor/src/fields/CodeSelect.vue 中
37
- * `props.model[props.name] = { hookType: HookType.CODE, hookData: [] }`)。
33
+ * - `{ hookType: HookType.CODE, hookData: [] }`(`normalizeCodeSelectValue`
34
+ * 写入的默认结构)。
38
35
  *
39
36
  * 直接 `isEqual` 会把两者判为不等,从而在历史对比里对每个未配置过钩子的组件
40
37
  * 都展示一份"差异",体验很糟糕。这里把它们视为相等,跳过对比。
@@ -71,7 +68,7 @@ var CompareForm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
71
68
  "is-compare": true,
72
69
  disabled: true,
73
70
  "label-width": __props.labelWidth,
74
- "extend-state": unref(mergedExtendState),
71
+ context: unref(formContext),
75
72
  "show-diff": showDiff,
76
73
  "self-diff-field-types": __props.selfDiffFieldTypes,
77
74
  size: __props.size
@@ -80,7 +77,7 @@ var CompareForm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
80
77
  "init-values",
81
78
  "last-values",
82
79
  "label-width",
83
- "extend-state",
80
+ "context",
84
81
  "self-diff-field-types",
85
82
  "size"
86
83
  ])) : createCommentVNode("v-if", true)], 4);
@@ -12,8 +12,6 @@ var ViewForm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
12
12
  dataSourceType: {},
13
13
  labelWidth: { default: "120px" },
14
14
  height: {},
15
- extendState: {},
16
- baseFormState: {},
17
15
  size: {},
18
16
  loadConfig: {},
19
17
  services: {},
@@ -23,7 +21,7 @@ var ViewForm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
23
21
  }
24
22
  },
25
23
  setup(__props, { expose: __expose }) {
26
- const { config, currentValues, wrapperStyle, mergedExtendState, loadConfig, formRef } = useCompareForm(__props);
24
+ const { config, currentValues, wrapperStyle, formContext, loadConfig, formRef } = useCompareForm(__props);
27
25
  __expose({
28
26
  form: formRef,
29
27
  config,
@@ -41,14 +39,14 @@ var ViewForm_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
41
39
  "init-values": unref(currentValues),
42
40
  disabled: __props.disabled,
43
41
  "label-width": __props.labelWidth,
44
- "extend-state": unref(mergedExtendState),
42
+ context: unref(formContext),
45
43
  size: __props.size
46
44
  }, null, 8, [
47
45
  "config",
48
46
  "init-values",
49
47
  "disabled",
50
48
  "label-width",
51
- "extend-state",
49
+ "context",
52
50
  "size"
53
51
  ])) : createCommentVNode("v-if", true)], 4);
54
52
  };
@@ -1,6 +1,5 @@
1
1
  import CodeEditor_default from "../layouts/CodeEditor.js";
2
- import { FORM_SILENT_MODE_KEY } from "@tmagic/form";
3
- import { computed, createBlock, createCommentVNode, defineComponent, inject, openBlock, unref } from "vue";
2
+ import { computed, createBlock, defineComponent, openBlock } from "vue";
4
3
  //#region packages/editor/src/fields/Code.vue?vue&type=script&setup=true&lang.ts
5
4
  var Code_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
6
5
  name: "MFieldsVsCode",
@@ -25,12 +24,6 @@ var Code_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCompo
25
24
  },
26
25
  emits: ["change"],
27
26
  setup(__props, { emit: __emit }) {
28
- /**
29
- * 静默模式(submitForm/validateForm 隐藏挂载)下跳过 monaco 渲染:
30
- * 校验由 FormItem 针对 model 中的值完成,与编辑器实例无关;本组件挂载无值副作用
31
- * (save 仅由用户操作/编辑器内容变更触发),跳过可省去 monaco worker/model 的无谓实例化。
32
- */
33
- const silentMode = inject(FORM_SILENT_MODE_KEY, false);
34
27
  const emit = __emit;
35
28
  const props = __props;
36
29
  /**
@@ -48,8 +41,7 @@ var Code_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCompo
48
41
  emit("change", v);
49
42
  };
50
43
  return (_ctx, _cache) => {
51
- return !unref(silentMode) ? (openBlock(), createBlock(CodeEditor_default, {
52
- key: 0,
44
+ return openBlock(), createBlock(CodeEditor_default, {
53
45
  height: __props.config.height,
54
46
  type: diffMode.value ? "diff" : void 0,
55
47
  "init-values": diffMode.value ? (__props.lastValues || {})[__props.name] : __props.model[__props.name],
@@ -73,7 +65,7 @@ var Code_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCompo
73
65
  "autosize",
74
66
  "parse",
75
67
  "editor-custom-type"
76
- ])) : createCommentVNode("v-if", true);
68
+ ]);
77
69
  };
78
70
  }
79
71
  });
@@ -1,10 +1,6 @@
1
- import { useServices } from "../hooks/use-services.js";
1
+ import { createCodeSelectConfig, normalizeCodeSelectValue } from "./configs/codeSelect.js";
2
2
  import { MContainer } from "@tmagic/form";
3
- import { TMagicButton, TMagicCard } from "@tmagic/design";
4
- import { HookCodeType, HookType } from "@tmagic/core";
5
- import { computed, createElementBlock, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, toDisplayString, unref, watch, withCtx } from "vue";
6
- import { isEmpty } from "lodash-es";
7
- import { Plus } from "@element-plus/icons-vue";
3
+ import { computed, createElementBlock, createVNode, defineComponent, normalizeClass, openBlock, unref, watch } from "vue";
8
4
  //#region packages/editor/src/fields/CodeSelect.vue?vue&type=script&setup=true&lang.ts
9
5
  var CodeSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
10
6
  name: "MFieldsCodeSelect",
@@ -27,7 +23,6 @@ var CodeSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
27
23
  emits: ["change"],
28
24
  setup(__props, { emit: __emit }) {
29
25
  const emit = __emit;
30
- const { dataSourceService, codeBlockService } = useServices();
31
26
  const props = __props;
32
27
  /**
33
28
  * 对比模式判定:
@@ -43,125 +38,35 @@ var CodeSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
43
38
  * 仅当存在历史值时才启用对比,避免 lastValues 缺失时退化为「全部新增」的空对比。
44
39
  */
45
40
  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
- };
55
- const codeConfig = computed(() => ({
56
- type: "group-list",
57
- name: "hookData",
58
- enableToggleMode: false,
59
- expandAll: true,
60
- addable: () => false,
61
- title: (mForm, { model, index }) => {
62
- if (model.codeType === HookCodeType.DATA_SOURCE_METHOD) {
63
- if (Array.isArray(model.codeId)) {
64
- if (model.codeId.length < 2) return index;
65
- return `${dataSourceService.getDataSourceById(model.codeId[0])?.title} / ${model.codeId[1]}`;
66
- }
67
- return Array.isArray(model.codeId) ? model.codeId.join("/") : index;
68
- }
69
- const codeContent = codeBlockService.getCodeContentById(model.codeId);
70
- if (codeContent) return codeContent.name;
71
- return model.codeId || index;
72
- },
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;
96
- }
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
- ]
121
- }));
122
- watch(() => props.model[props.name], (value) => {
123
- if (isEmpty(value)) props.model[props.name] = {
124
- hookType: HookType.CODE,
125
- hookData: []
126
- };
127
- }, { immediate: true });
41
+ const codeConfig = computed(() => createCodeSelectConfig(props.config));
42
+ watch(() => props.model[props.name], () => {
43
+ normalizeCodeSelectValue(props.model, props.name);
44
+ });
128
45
  const changeHandler = (v, eventData) => emit("change", v, eventData);
129
46
  return (_ctx, _cache) => {
130
- return openBlock(), createElementBlock("div", { class: normalizeClass(["m-fields-code-select", __props.config.className]) }, [createVNode(unref(TMagicCard), { flat: __props.config.flat }, {
131
- default: withCtx(() => [createVNode(unref(MContainer), {
132
- config: codeConfig.value,
133
- size: __props.size,
134
- class: "code-select-content",
135
- prop: __props.prop,
136
- disabled: __props.disabled,
137
- "is-compare": isCompareMode.value,
138
- "last-values": __props.lastValues?.[__props.name],
139
- model: __props.model[__props.name],
140
- onChange: changeHandler
141
- }, null, 8, [
142
- "config",
143
- "size",
144
- "prop",
145
- "disabled",
146
- "is-compare",
147
- "last-values",
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"
162
- ])]),
163
- _: 1
164
- }, 8, ["flat"])], 2);
47
+ return openBlock(), createElementBlock("div", { class: normalizeClass(["m-fields-code-select", __props.config.className]) }, [createVNode(unref(MContainer), {
48
+ config: codeConfig.value,
49
+ size: __props.size,
50
+ class: "code-select-content",
51
+ prop: __props.prop,
52
+ disabled: __props.disabled,
53
+ "is-compare": isCompareMode.value,
54
+ "last-values": __props.lastValues?.[__props.name],
55
+ model: __props.model[__props.name],
56
+ "label-position": __props.config.labelPosition,
57
+ "label-width": __props.config.labelWidth,
58
+ onChange: changeHandler
59
+ }, null, 8, [
60
+ "config",
61
+ "size",
62
+ "prop",
63
+ "disabled",
64
+ "is-compare",
65
+ "last-values",
66
+ "model",
67
+ "label-position",
68
+ "label-width"
69
+ ])], 2);
165
70
  };
166
71
  }
167
72
  });
@@ -2,7 +2,7 @@ import { SideItemKey } from "../type.js";
2
2
  import { useServices } from "../hooks/use-services.js";
3
3
  import Icon_default from "../components/Icon.js";
4
4
  import CodeParams_default from "../components/CodeParams.js";
5
- import { FORM_SILENT_MODE_KEY, MContainer, MSelect, createValues, filterFunction } from "@tmagic/form";
5
+ import { MContainer, MSelect, createValues, filterFunction } from "@tmagic/form";
6
6
  import { TMagicButton } from "@tmagic/design";
7
7
  import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, inject, openBlock, ref, unref, watch, withCtx } from "vue";
8
8
  import { isEmpty, map } from "lodash-es";
@@ -34,9 +34,8 @@ var CodeSelectCol_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
34
34
  emits: ["change"],
35
35
  setup(__props, { emit: __emit }) {
36
36
  const mForm = inject("mForm");
37
- const silentMode = inject(FORM_SILENT_MODE_KEY, false);
38
37
  const { codeBlockService, uiService } = useServices();
39
- const eventBus = inject("eventBus");
38
+ const eventBus = inject("eventBus", null);
40
39
  const emit = __emit;
41
40
  const props = __props;
42
41
  /**
@@ -131,7 +130,7 @@ var CodeSelectCol_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
131
130
  "last-values",
132
131
  "size",
133
132
  "prop"
134
- ])) : !unref(silentMode) ? (openBlock(), createBlock(unref(MSelect), {
133
+ ])) : (openBlock(), createBlock(unref(MSelect), {
135
134
  key: 1,
136
135
  class: "select",
137
136
  config: selectConfig,
@@ -145,9 +144,9 @@ var CodeSelectCol_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
145
144
  "model",
146
145
  "size",
147
146
  "prop"
148
- ])) : createCommentVNode("v-if", true),
147
+ ])),
149
148
  createCommentVNode(" 查看/编辑按钮:对比模式为只读,不展示 "),
150
- !isCompareMode.value && !unref(silentMode) && __props.model[__props.name] && hasCodeBlockSidePanel.value ? (openBlock(), createBlock(unref(TMagicButton), {
149
+ !isCompareMode.value && __props.model[__props.name] && hasCodeBlockSidePanel.value ? (openBlock(), createBlock(unref(TMagicButton), {
151
150
  key: 2,
152
151
  class: "m-fields-select-action-button",
153
152
  size: __props.size,
@@ -2,6 +2,7 @@ import { getCondOpOptionsByFieldType } from "../utils/props.js";
2
2
  import { useServices } from "../hooks/use-services.js";
3
3
  import { getFieldType } from "../utils/data-source/index.js";
4
4
  import { TMagicSelect, getDesignConfig } from "@tmagic/design";
5
+ import { removeDataSourceFieldPrefix } from "@tmagic/utils";
5
6
  import { Fragment, computed, createBlock, createElementBlock, defineComponent, mergeProps, openBlock, renderList, resolveDynamicComponent, unref, withCtx } from "vue";
6
7
  //#region packages/editor/src/fields/CondOpSelect.vue?vue&type=script&setup=true&lang.ts
7
8
  var CondOpSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
@@ -29,8 +30,8 @@ var CondOpSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
29
30
  const props = __props;
30
31
  const optionComponent = getDesignConfig("components")?.option;
31
32
  const options = computed(() => {
32
- const [id, ...fieldNames] = [...props.config.parentFields || [], ...props.model.field];
33
- const ds = dataSourceService.getDataSourceById(id);
33
+ const [id, ...fieldNames] = [...props.config.parentFields || [], ...props.model.field || []];
34
+ const ds = id ? dataSourceService.getDataSourceById(removeDataSourceFieldPrefix(id)) : void 0;
34
35
  const type = getFieldType(ds, fieldNames);
35
36
  return getCondOpOptionsByFieldType(type);
36
37
  });
@@ -31,7 +31,7 @@ var FieldSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
31
31
  const optionComponent = getDesignConfig("components")?.option;
32
32
  const { dataSourceService, uiService } = useServices();
33
33
  const mForm = inject("mForm");
34
- const eventBus = inject("eventBus");
34
+ const eventBus = inject("eventBus", null);
35
35
  const allDataSources = computed(() => dataSourceService.get("dataSources") || []);
36
36
  const dataSources = computed(() => {
37
37
  if (!props.dataSourceId) return allDataSources.value;
@@ -2,7 +2,7 @@ import { useServices } from "../../hooks/use-services.js";
2
2
  import Icon_default from "../../components/Icon.js";
3
3
  import DatasourceIcon_default from "../../icons/DatasourceIcon.js";
4
4
  import FieldSelect_default from "./FieldSelect.js";
5
- import { FORM_SILENT_MODE_KEY, getFormField } from "@tmagic/form";
5
+ import { getFormField } from "@tmagic/form";
6
6
  import { TMagicButton, TMagicTooltip, tMagicMessage } from "@tmagic/design";
7
7
  import { DATA_SOURCE_FIELDS_SELECT_VALUE_PREFIX, removeDataSourceFieldPrefix } from "@tmagic/utils";
8
8
  import { computed, createBlock, createCommentVNode, createElementBlock, createVNode, defineComponent, inject, normalizeClass, openBlock, ref, resolveComponent, resolveDynamicComponent, unref, watch, withCtx } from "vue";
@@ -40,7 +40,6 @@ var Index_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComp
40
40
  }, { immediate: true });
41
41
  const { dataSourceService, propsService } = useServices();
42
42
  const mForm = inject("mForm");
43
- const silentMode = inject(FORM_SILENT_MODE_KEY, false);
44
43
  const dataSources = computed(() => dataSourceService.get("dataSources") || []);
45
44
  const disabledDataSource = computed(() => propsService.getDisabledDataSource());
46
45
  const type = computed(() => {
@@ -60,7 +59,9 @@ var Index_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComp
60
59
  let value;
61
60
  if (typeof props.config.checkStrictly !== "function") value = props.config.checkStrictly;
62
61
  else {
63
- const dsId = removeDataSourceFieldPrefix(props.model[0]);
62
+ const fieldValue = props.model[props.name];
63
+ const rawDsId = props.config.dataSourceId ?? (Array.isArray(fieldValue) ? fieldValue[0] : fieldValue);
64
+ const dsId = removeDataSourceFieldPrefix(`${rawDsId}`);
64
65
  const dataSource = dataSources.value.find((ds) => ds.id === dsId);
65
66
  value = props.config.checkStrictly(mForm, {
66
67
  values: mForm?.initValues || {},
@@ -104,7 +105,7 @@ var Index_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComp
104
105
  showDataSourceFieldSelect.value = !showDataSourceFieldSelect.value;
105
106
  };
106
107
  return (_ctx, _cache) => {
107
- return openBlock(), createElementBlock("div", { class: normalizeClass(["m-fields-data-source-field-select", { [`data-source-field-${type.value}`]: !isSelectValid.value }]) }, [isSelectValid.value && !unref(silentMode) ? (openBlock(), createBlock(FieldSelect_default, {
108
+ return openBlock(), createElementBlock("div", { class: normalizeClass(["m-fields-data-source-field-select", { [`data-source-field-${type.value}`]: !isSelectValid.value }]) }, [isSelectValid.value ? (openBlock(), createBlock(FieldSelect_default, {
108
109
  key: 0,
109
110
  "model-value": __props.model[__props.name],
110
111
  disabled: __props.disabled,
@@ -122,7 +123,7 @@ var Index_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComp
122
123
  "checkStrictly",
123
124
  "dataSourceFieldType",
124
125
  "dataSourceId"
125
- ])) : !unref(silentMode) ? (openBlock(), createBlock(resolveDynamicComponent(tagName.value), {
126
+ ])) : (openBlock(), createBlock(resolveDynamicComponent(tagName.value), {
126
127
  key: 1,
127
128
  config: __props.config.fieldConfig,
128
129
  model: __props.model,
@@ -144,7 +145,7 @@ var Index_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComp
144
145
  "init-values",
145
146
  "values",
146
147
  "prop"
147
- ])) : createCommentVNode("v-if", true), !unref(silentMode) && __props.config.fieldConfig && !disabledDataSource.value && !unref(mForm)?.isCompare ? (openBlock(), createBlock(unref(TMagicTooltip), {
148
+ ])), __props.config.fieldConfig && !disabledDataSource.value && !unref(mForm)?.isCompare ? (openBlock(), createBlock(unref(TMagicTooltip), {
148
149
  key: 2,
149
150
  disabled: showDataSourceFieldSelect.value,
150
151
  content: "选择数据源"
@@ -3,11 +3,11 @@ import { useEditorContentHeight } from "../hooks/use-editor-content-height.js";
3
3
  import { useNextFloatBoxPosition } from "../hooks/use-next-float-box-position.js";
4
4
  import { error } from "../utils/logger.js";
5
5
  import FloatingBox_default from "../components/FloatingBox.js";
6
- import { FORM_SILENT_MODE_KEY, MFormBox } from "@tmagic/form";
6
+ 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 { computed, createBlock, createCommentVNode, createElementBlock, createTextVNode, createVNode, defineComponent, inject, isRef, mergeModels, onMounted, openBlock, provide, ref, unref, useModel, withCtx } from "vue";
10
+ import { computed, createCommentVNode, createElementBlock, createTextVNode, createVNode, defineComponent, inject, isRef, mergeModels, onMounted, openBlock, provide, ref, unref, useModel, withCtx } from "vue";
11
11
  //#region packages/editor/src/fields/DataSourceFields.vue?vue&type=script&setup=true&lang.ts
12
12
  var _hoisted_1 = { class: "m-editor-data-source-fields" };
13
13
  var _hoisted_2 = {
@@ -58,7 +58,6 @@ var DataSourceFields_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
58
58
  const emit = __emit;
59
59
  const { uiService } = useServices();
60
60
  const mForm = inject("mForm");
61
- const silentMode = inject(FORM_SILENT_MODE_KEY, false);
62
61
  /** 对比模式下隐藏新增/编辑/删除等操作按钮,仅保留只读展示。 */
63
62
  const isCompare = computed(() => Boolean(mForm?.isCompare));
64
63
  const fieldValues = ref({});
@@ -326,7 +325,6 @@ var DataSourceFields_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
326
325
  const editingFieldPath = inject("editingDataSourceFieldPath", computed(() => []));
327
326
  provide("editingDataSourceFieldPath", computed(() => editingFieldPath.value.slice(1)));
328
327
  onMounted(() => {
329
- if (silentMode) return;
330
328
  const path = editingFieldPath.value;
331
329
  if (!path.length) return;
332
330
  const fields = props.model[props.name] || [];
@@ -359,8 +357,7 @@ var DataSourceFields_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
359
357
  default: withCtx(() => [..._cache[9] || (_cache[9] = [createTextVNode("添加", -1)])]),
360
358
  _: 1
361
359
  }, 8, ["disabled"])])) : createCommentVNode("v-if", true),
362
- !unref(silentMode) ? (openBlock(), createBlock(FloatingBox_default, {
363
- key: 1,
360
+ createVNode(FloatingBox_default, {
364
361
  "body-style": { padding: "0 16px" },
365
362
  visible: addDialogVisible.value,
366
363
  "onUpdate:visible": _cache[2] || (_cache[2] = ($event) => addDialogVisible.value = $event),
@@ -394,9 +391,8 @@ var DataSourceFields_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
394
391
  "title",
395
392
  "framework-width",
396
393
  "position"
397
- ])) : createCommentVNode("v-if", true),
398
- !unref(silentMode) ? (openBlock(), createBlock(FloatingBox_default, {
399
- key: 2,
394
+ ]),
395
+ createVNode(FloatingBox_default, {
400
396
  "body-style": { padding: "0 16px" },
401
397
  visible: addFromJsonDialogVisible.value,
402
398
  "onUpdate:visible": _cache[5] || (_cache[5] = ($event) => addFromJsonDialogVisible.value = $event),
@@ -421,7 +417,7 @@ var DataSourceFields_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
421
417
  "height",
422
418
  "framework-width",
423
419
  "position"
424
- ])) : createCommentVNode("v-if", true)
420
+ ])
425
421
  ]);
426
422
  };
427
423
  }
@@ -3,7 +3,7 @@ import { useServices } from "../hooks/use-services.js";
3
3
  import { getFieldType } from "../utils/data-source/index.js";
4
4
  import Icon_default from "../components/Icon.js";
5
5
  import CodeParams_default from "../components/CodeParams.js";
6
- import { FORM_SILENT_MODE_KEY, MCascader, createValues, filterFunction } from "@tmagic/form";
6
+ import { MCascader, createValues, filterFunction } from "@tmagic/form";
7
7
  import { TMagicButton, TMagicTooltip } from "@tmagic/design";
8
8
  import { DATA_SOURCE_SET_DATA_METHOD_NAME } from "@tmagic/utils";
9
9
  import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, inject, openBlock, ref, unref, withCtx } from "vue";
@@ -36,8 +36,7 @@ var DataSourceMethodSelect_vue_vue_type_script_setup_true_name_true_lang_default
36
36
  setup(__props, { emit: __emit }) {
37
37
  const { dataSourceService, uiService } = useServices();
38
38
  const mForm = inject("mForm");
39
- const silentMode = inject(FORM_SILENT_MODE_KEY, false);
40
- const eventBus = inject("eventBus");
39
+ const eventBus = inject("eventBus", null);
41
40
  const emit = __emit;
42
41
  const props = __props;
43
42
  const dataSourceSidePanel = computed(() => (uiService.get("sideBarItems") || []).find((item) => item.$key === SideItemKey.DATA_SOURCE));
@@ -135,8 +134,7 @@ var DataSourceMethodSelect_vue_vue_type_script_setup_true_name_true_lang_default
135
134
  eventBus?.emit("edit-data-source-method", id, methodName);
136
135
  };
137
136
  return (_ctx, _cache) => {
138
- return openBlock(), createElementBlock("div", _hoisted_1, [createElementVNode("div", _hoisted_2, [!unref(silentMode) ? (openBlock(), createBlock(unref(MCascader), {
139
- key: 0,
137
+ return openBlock(), createElementBlock("div", _hoisted_1, [createElementVNode("div", _hoisted_2, [createVNode(unref(MCascader), {
140
138
  class: "select",
141
139
  config: cascaderConfig.value,
142
140
  model: __props.model,
@@ -152,8 +150,8 @@ var DataSourceMethodSelect_vue_vue_type_script_setup_true_name_true_lang_default
152
150
  "size",
153
151
  "disabled",
154
152
  "prop"
155
- ])) : createCommentVNode("v-if", true), !unref(silentMode) && __props.model[__props.name] && isCustomMethod.value && dataSourceSidePanel.value && !isCompare.value ? (openBlock(), createBlock(unref(TMagicTooltip), {
156
- key: 1,
153
+ ]), __props.model[__props.name] && isCustomMethod.value && dataSourceSidePanel.value && !isCompare.value ? (openBlock(), createBlock(unref(TMagicTooltip), {
154
+ key: 0,
157
155
  content: notEditable.value ? "查看" : "编辑"
158
156
  }, {
159
157
  default: withCtx(() => [createVNode(unref(TMagicButton), {