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

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 (119) hide show
  1. package/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +7 -4
  2. package/dist/es/components/CodeBlockEditor.vue_vue_type_script_setup_true_lang.js +5 -1
  3. package/dist/es/components/CodeParams.vue_vue_type_script_setup_true_lang.js +2 -1
  4. package/dist/es/components/CompareForm.vue_vue_type_script_setup_true_lang.js +18 -123
  5. package/dist/es/components/FloatingBox.vue_vue_type_script_setup_true_lang.js +60 -14
  6. package/dist/es/components/ScrollBar.js +0 -1
  7. package/dist/es/components/ViewForm.js +5 -0
  8. package/dist/es/components/ViewForm.vue_vue_type_script_setup_true_lang.js +58 -0
  9. package/dist/es/editorProps.js +6 -1
  10. package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +15 -3
  11. package/dist/es/fields/CondOpSelect.vue_vue_type_script_setup_true_lang.js +2 -17
  12. package/dist/es/fields/DataSourceFieldSelect/FieldSelect.vue_vue_type_script_setup_true_lang.js +2 -1
  13. package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +7 -0
  14. package/dist/es/fields/DataSourceInput.vue_vue_type_script_setup_true_lang.js +5 -17
  15. package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +4 -0
  16. package/dist/es/fields/DisplayConds.vue_vue_type_script_setup_true_lang.js +29 -3
  17. package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +50 -88
  18. package/dist/es/fields/StyleSetter/Index.vue_vue_type_script_setup_true_lang.js +2 -5
  19. package/dist/es/fields/StyleSetter/pro/Background.vue_vue_type_script_setup_true_lang.js +48 -23
  20. package/dist/es/fields/StyleSetter/pro/Border.vue_vue_type_script_setup_true_lang.js +6 -3
  21. package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +28 -22
  22. package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +28 -22
  23. package/dist/es/fields/StyleSetter/pro/Position.vue_vue_type_script_setup_true_lang.js +28 -22
  24. package/dist/es/fields/StyleSetter/pro/Transform.vue_vue_type_script_setup_true_lang.js +6 -3
  25. package/dist/es/fields/UISelect.js +0 -1
  26. package/dist/es/hooks/use-compare-form.js +119 -0
  27. package/dist/es/index.js +13 -8
  28. package/dist/es/layouts/CodeEditor.vue_vue_type_script_setup_true_lang.js +21 -6
  29. package/dist/es/layouts/Framework.vue_vue_type_script_setup_true_lang.js +9 -6
  30. package/dist/es/layouts/history-list/HistoryDiffDialog.vue_vue_type_script_setup_true_lang.js +4 -1
  31. package/dist/es/layouts/history-list/composables.js +1 -1
  32. package/dist/es/layouts/history-list/useHistoryRevert.js +7 -3
  33. package/dist/es/layouts/props-panel/FormPanel.vue_vue_type_script_setup_true_lang.js +44 -5
  34. package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +15 -8
  35. package/dist/es/layouts/props-panel/use-style-panel.js +3 -2
  36. package/dist/es/layouts/sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js +15 -31
  37. package/dist/es/layouts/sidebar/code-block/CodeBlockListPanel.vue_vue_type_script_setup_true_lang.js +2 -2
  38. package/dist/es/layouts/sidebar/code-block/useContentMenu.js +18 -3
  39. package/dist/es/layouts/sidebar/data-source/DataSourceConfigPanel.vue_vue_type_script_setup_true_lang.js +4 -0
  40. package/dist/es/layouts/sidebar/data-source/DataSourceListPanel.vue_vue_type_script_setup_true_lang.js +2 -2
  41. package/dist/es/layouts/sidebar/data-source/useContentMenu.js +18 -3
  42. package/dist/es/layouts/sidebar/layer/LayerNodeContent.js +5 -0
  43. package/dist/es/layouts/sidebar/layer/LayerNodeContent.vue_vue_type_script_setup_true_lang.js +46 -0
  44. package/dist/es/layouts/sidebar/layer/LayerPanel.vue_vue_type_script_setup_true_lang.js +2 -1
  45. package/dist/es/layouts/workspace/viewer/NodeListMenu.vue_vue_type_script_setup_true_lang.js +8 -2
  46. package/dist/es/plugin.js +3 -1
  47. package/dist/es/services/codeBlock.js +1 -1
  48. package/dist/es/services/editor.js +104 -5
  49. package/dist/es/services/history.js +1 -1
  50. package/dist/es/services/props.js +3 -2
  51. package/dist/es/services/storage.js +2 -2
  52. package/dist/es/services/ui.js +3 -0
  53. package/dist/es/style.css +104 -55
  54. package/dist/es/utils/data-source/index.js +30 -11
  55. package/dist/es/utils/event.js +123 -0
  56. package/dist/es/utils/monaco-editor.js +22 -6
  57. package/dist/es/utils/props.js +119 -8
  58. package/dist/es/utils/type-match-rules.js +360 -0
  59. package/dist/style.css +104 -55
  60. package/dist/tmagic-editor.umd.cjs +16996 -15806
  61. package/package.json +8 -8
  62. package/src/Editor.vue +3 -1
  63. package/src/components/CodeBlockEditor.vue +3 -0
  64. package/src/components/CompareForm.vue +16 -196
  65. package/src/components/FloatingBox.vue +77 -8
  66. package/src/components/ScrollBar.vue +0 -67
  67. package/src/components/ViewForm.vue +55 -0
  68. package/src/editorProps.ts +13 -0
  69. package/src/fields/CodeSelect.vue +4 -1
  70. package/src/fields/CondOpSelect.vue +2 -24
  71. package/src/fields/DataSourceFields.vue +5 -0
  72. package/src/fields/DataSourceInput.vue +7 -25
  73. package/src/fields/DataSourceMocks.vue +3 -0
  74. package/src/fields/DisplayConds.vue +14 -0
  75. package/src/fields/EventSelect.vue +84 -129
  76. package/src/fields/StyleSetter/Index.vue +2 -8
  77. package/src/fields/StyleSetter/pro/Background.vue +94 -55
  78. package/src/fields/StyleSetter/pro/Border.vue +9 -11
  79. package/src/fields/StyleSetter/pro/Font.vue +66 -64
  80. package/src/fields/StyleSetter/pro/Layout.vue +140 -138
  81. package/src/fields/StyleSetter/pro/Position.vue +69 -67
  82. package/src/fields/StyleSetter/pro/Transform.vue +23 -25
  83. package/src/fields/UISelect.vue +0 -12
  84. package/src/hooks/index.ts +1 -0
  85. package/src/hooks/use-compare-form.ts +187 -0
  86. package/src/index.ts +2 -0
  87. package/src/layouts/CodeEditor.vue +32 -6
  88. package/src/layouts/Framework.vue +7 -6
  89. package/src/layouts/history-list/HistoryDiffDialog.vue +11 -1
  90. package/src/layouts/history-list/useHistoryRevert.ts +4 -0
  91. package/src/layouts/props-panel/FormPanel.vue +66 -5
  92. package/src/layouts/props-panel/PropsPanel.vue +20 -6
  93. package/src/layouts/props-panel/use-style-panel.ts +4 -3
  94. package/src/layouts/sidebar/Sidebar.vue +2 -0
  95. package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +4 -1
  96. package/src/layouts/sidebar/code-block/useContentMenu.ts +13 -1
  97. package/src/layouts/sidebar/data-source/DataSourceConfigPanel.vue +3 -0
  98. package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +2 -2
  99. package/src/layouts/sidebar/data-source/useContentMenu.ts +13 -1
  100. package/src/layouts/sidebar/layer/LayerNodeContent.vue +57 -0
  101. package/src/layouts/sidebar/layer/LayerPanel.vue +4 -1
  102. package/src/layouts/workspace/viewer/NodeListMenu.vue +4 -1
  103. package/src/plugin.ts +3 -1
  104. package/src/services/editor.ts +168 -3
  105. package/src/services/ui.ts +6 -0
  106. package/src/theme/event.scss +8 -0
  107. package/src/theme/floating-box.scss +9 -1
  108. package/src/theme/layer-node-content.scss +14 -0
  109. package/src/theme/scroll-bar.scss +64 -0
  110. package/src/theme/theme.scss +3 -0
  111. package/src/theme/ui-select.scss +9 -0
  112. package/src/type.ts +105 -2
  113. package/src/utils/data-source/index.ts +30 -12
  114. package/src/utils/event.ts +224 -0
  115. package/src/utils/index.ts +2 -0
  116. package/src/utils/monaco-editor.ts +27 -0
  117. package/src/utils/props.ts +189 -2
  118. package/src/utils/type-match-rules.ts +678 -0
  119. package/types/index.d.ts +558 -213
@@ -1,5 +1,5 @@
1
- import { MContainer, defineFormItem } from "@tmagic/form";
2
- import { createBlock, defineComponent, openBlock, unref } from "vue";
1
+ import { MContainer, defineFormConfig } from "@tmagic/form";
2
+ import { Fragment, createBlock, createElementBlock, defineComponent, openBlock, renderList, unref } from "vue";
3
3
  //#region packages/editor/src/fields/StyleSetter/pro/Position.vue?vue&type=script&setup=true&lang.ts
4
4
  var Position_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
5
5
  __name: "Position",
@@ -8,7 +8,8 @@ var Position_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
8
8
  lastValues: {},
9
9
  isCompare: { type: Boolean },
10
10
  disabled: { type: Boolean },
11
- size: {}
11
+ size: {},
12
+ prop: {}
12
13
  },
13
14
  emits: ["change", "addDiffCount"],
14
15
  setup(__props, { emit: __emit }) {
@@ -21,7 +22,7 @@ var Position_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
21
22
  fixed: "固定定位",
22
23
  sticky: "粘性定位"
23
24
  };
24
- const config = defineFormItem({ items: [
25
+ const formConfig = defineFormConfig([
25
26
  {
26
27
  name: "position",
27
28
  text: "定位",
@@ -74,29 +75,34 @@ var Position_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
74
75
  type: "data-source-field-select",
75
76
  fieldConfig: { type: "text" }
76
77
  }
77
- ] });
78
+ ]);
78
79
  const change = (value, eventData) => {
79
80
  emit("change", value, eventData);
80
81
  };
81
82
  const onAddDiffCount = () => emit("addDiffCount");
82
83
  return (_ctx, _cache) => {
83
- return openBlock(), createBlock(unref(MContainer), {
84
- config: unref(config),
85
- model: __props.values,
86
- "last-values": __props.lastValues,
87
- "is-compare": __props.isCompare,
88
- size: __props.size,
89
- disabled: __props.disabled,
90
- onChange: change,
91
- onAddDiffCount
92
- }, null, 8, [
93
- "config",
94
- "model",
95
- "last-values",
96
- "is-compare",
97
- "size",
98
- "disabled"
99
- ]);
84
+ return openBlock(true), createElementBlock(Fragment, null, renderList(unref(formConfig), (item, index) => {
85
+ return openBlock(), createBlock(unref(MContainer), {
86
+ prop: __props.prop,
87
+ key: index,
88
+ config: item,
89
+ model: __props.values,
90
+ "last-values": __props.lastValues,
91
+ "is-compare": __props.isCompare,
92
+ size: __props.size,
93
+ disabled: __props.disabled,
94
+ onChange: change,
95
+ onAddDiffCount
96
+ }, null, 8, [
97
+ "prop",
98
+ "config",
99
+ "model",
100
+ "last-values",
101
+ "is-compare",
102
+ "size",
103
+ "disabled"
104
+ ]);
105
+ }), 128);
100
106
  };
101
107
  }
102
108
  });
@@ -8,12 +8,13 @@ var Transform_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
8
8
  lastValues: {},
9
9
  isCompare: { type: Boolean },
10
10
  disabled: { type: Boolean },
11
- size: {}
11
+ size: {},
12
+ prop: {}
12
13
  },
13
14
  emits: ["change", "addDiffCount"],
14
15
  setup(__props, { emit: __emit }) {
15
16
  const emit = __emit;
16
- const config = defineFormItem({ items: [{
17
+ const config = defineFormItem({
17
18
  name: "transform",
18
19
  items: [{
19
20
  name: "rotate",
@@ -32,13 +33,14 @@ var Transform_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
32
33
  dataSourceFieldType: ["string", "number"],
33
34
  fieldConfig: { type: "text" }
34
35
  }]
35
- }] });
36
+ });
36
37
  const change = (value, eventData) => {
37
38
  emit("change", value, eventData);
38
39
  };
39
40
  const onAddDiffCount = () => emit("addDiffCount");
40
41
  return (_ctx, _cache) => {
41
42
  return openBlock(), createBlock(unref(MContainer), {
43
+ prop: __props.prop,
42
44
  config: unref(config),
43
45
  model: __props.values,
44
46
  "last-values": __props.lastValues,
@@ -48,6 +50,7 @@ var Transform_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
48
50
  onChange: change,
49
51
  onAddDiffCount
50
52
  }, null, 8, [
53
+ "prop",
51
54
  "config",
52
55
  "model",
53
56
  "last-values",
@@ -1,5 +1,4 @@
1
1
  import UISelect_vue_vue_type_script_setup_true_lang_default from "./UISelect.vue_vue_type_script_setup_true_lang.js";
2
- /* empty css */
3
2
  //#region packages/editor/src/fields/UISelect.vue
4
3
  var UISelect_default = UISelect_vue_vue_type_script_setup_true_lang_default;
5
4
  //#endregion
@@ -0,0 +1,119 @@
1
+ import { getCodeBlockFormConfig } from "../utils/code-block.js";
2
+ import { removeStyleDisplayConfig } from "../utils/props.js";
3
+ import { computed, inject, provide, ref, useTemplateRef, watch, watchEffect } from "vue";
4
+ //#region packages/editor/src/hooks/use-compare-form.ts
5
+ /**
6
+ * CompareForm / ViewForm 共用逻辑:
7
+ * - 按 `category`(node / data-source / code-block) 加载 FormConfig(支持自定义 `loadConfig`);
8
+ * - 代码块 `content` 归一化为字符串;
9
+ * - 外层容器固定高度 + 内部滚动的 `wrapperStyle`;
10
+ * - 将 services / stage 注入 MForm.formState,保证 filterFunction 上下文一致。
11
+ *
12
+ * 两个组件的差异仅在于是否做新旧值对比,这部分逻辑保留在各自组件中。
13
+ */
14
+ var useCompareForm = (props) => {
15
+ provide("services", props.services);
16
+ const config = ref([]);
17
+ /** vs-code 编辑器的 monaco 配置项,沿用 Editor 顶层 provide('codeOptions', ...) 的注入。 */
18
+ const codeOptions = inject("codeOptions", {});
19
+ /** 将代码块的 content 字段统一成字符串,便于在表单 / 对比中展示 */
20
+ const normalizeCodeBlockValue = (v) => {
21
+ if (!v) return {};
22
+ const next = { ...v };
23
+ if (next.content && typeof next.content !== "string") try {
24
+ next.content = next.content.toString();
25
+ } catch {
26
+ next.content = "";
27
+ }
28
+ return next;
29
+ };
30
+ const currentValues = computed(() => {
31
+ if (props.category === "code-block") return normalizeCodeBlockValue(props.value);
32
+ return props.value || {};
33
+ });
34
+ /**
35
+ * 外层包裹层的样式:当传入 `height` 时启用固定高度 + 内部滚动,
36
+ * 这样滚动条会出现在组件内部,避免父容器(如 Dialog)自身也产生滚动。
37
+ */
38
+ const wrapperStyle = computed(() => {
39
+ if (!props.height) return void 0;
40
+ return {
41
+ height: props.height,
42
+ overflow: "auto"
43
+ };
44
+ });
45
+ const mergedExtendState = (state) => {
46
+ return (props.extendState ?? ((s) => s))(props.baseFormState || state);
47
+ };
48
+ /**
49
+ * 内置的默认 FormConfig 加载逻辑:按 `category` 从对应 service / 工具取配置。
50
+ * 作为 ctx.defaultLoadConfig 透传给自定义 `loadConfig`,方便复用与二次加工。
51
+ */
52
+ const defaultLoadConfig = async () => {
53
+ if (!props.services) return [];
54
+ switch (props.category) {
55
+ case "node":
56
+ if (!props.type) return [];
57
+ return removeStyleDisplayConfig(await props.services.propsService.getPropsConfig(props.type, { node: props.value }));
58
+ case "data-source": return props.services.dataSourceService.getFormConfig(props.type || "base").map((item) => "type" in item && item.type === "tab" ? {
59
+ ...item,
60
+ active: "fields"
61
+ } : item);
62
+ case "code-block": return getCodeBlockFormConfig({
63
+ paramColConfig: props.services.codeBlockService.getParamsColConfig(),
64
+ isDataSource: () => Boolean(props.dataSourceType),
65
+ dataSourceType: () => props.dataSourceType,
66
+ codeOptions,
67
+ editable: false
68
+ });
69
+ default: return [];
70
+ }
71
+ };
72
+ const loadConfig = async () => {
73
+ if (props.loadConfig) {
74
+ config.value = await props.loadConfig({
75
+ category: props.category,
76
+ type: props.type,
77
+ dataSourceType: props.dataSourceType,
78
+ defaultLoadConfig
79
+ });
80
+ return;
81
+ }
82
+ config.value = await defaultLoadConfig();
83
+ };
84
+ watch([
85
+ () => props.category,
86
+ () => props.type,
87
+ () => props.dataSourceType,
88
+ () => props.loadConfig
89
+ ], () => {
90
+ loadConfig();
91
+ }, { immediate: true });
92
+ const formRef = useTemplateRef("form");
93
+ /**
94
+ * 把 services / stage 注入 MForm 的 formState,避免 propsService 注入的表单配置中
95
+ * 形如 `display: ({ services }) => services.uiService.get(...)` 的 filterFunction
96
+ * 在执行时拿不到 `formState.services` 而报错。
97
+ *
98
+ * 与 props-panel/FormPanel.vue 中的注入方式保持一致:
99
+ * - services:整个 useServices() 返回的服务集合;
100
+ * - stage:当前 editorService.get('stage') 的最新值。
101
+ */
102
+ watchEffect(() => {
103
+ if (formRef.value && props.services) {
104
+ formRef.value.formState.stage = props.services.editorService.get("stage");
105
+ formRef.value.formState.services = props.services;
106
+ }
107
+ });
108
+ return {
109
+ config,
110
+ currentValues,
111
+ wrapperStyle,
112
+ mergedExtendState,
113
+ loadConfig,
114
+ formRef,
115
+ normalizeCodeBlockValue
116
+ };
117
+ };
118
+ //#endregion
119
+ export { useCompareForm };
package/dist/es/index.js CHANGED
@@ -1,8 +1,10 @@
1
1
  import { CODE_DRAFT_STORAGE_KEY, CodeDeleteErrorType, ColumnLayout, DragType, KeyBindingCommand, Keys, LayerOffset, Layout, SideItemKey, canUsePluginMethods } from "./type.js";
2
2
  import { useCodeBlockEdit } from "./hooks/use-code-block-edit.js";
3
- import { advancedTabConfig, arrayOptions, displayTabConfig, eqOptions, eventTabConfig, fillConfig, numberOptions, styleTabConfig } from "./utils/props.js";
4
- import props_default from "./services/props.js";
5
3
  import { getEditorConfig, setEditorConfig } from "./utils/config.js";
4
+ import { getCodeBlockFormConfig } from "./utils/code-block.js";
5
+ import { advancedTabConfig, arrayOptions, booleanOptions, displayTabConfig, eqOptions, eventTabConfig, fillConfig, getCondOpOptionsByFieldType, numberOptions, removeStyleDisplayConfig, styleTabConfig, validatePropsForm } from "./utils/props.js";
6
+ import { useCompareForm } from "./hooks/use-compare-form.js";
7
+ import props_default from "./services/props.js";
6
8
  import { UndoRedo } from "./utils/undo-redo.js";
7
9
  import { createStackStep, describeRevertStep, deserializeStacks, detectStackOpType, detectTargetId, detectTargetName, getLastPushedHistoryIds, getOrCreateStack, markStackSaved, mergeSteps, serializeStacks, undoFloor } from "./utils/history.js";
8
10
  import { idbDelete, idbGet, idbSet, isIndexedDBSupported, openIndexedDB } from "./utils/indexed-db.js";
@@ -23,11 +25,15 @@ import { useFilter } from "./hooks/use-filter.js";
23
25
  import { useGetSo } from "./hooks/use-getso.js";
24
26
  import { useNextFloatBoxPosition } from "./hooks/use-next-float-box-position.js";
25
27
  import { useNodeStatus } from "./hooks/use-node-status.js";
26
- import { getCodeBlockFormConfig } from "./utils/code-block.js";
27
28
  import { debug, error, info, log, warn } from "./utils/logger.js";
28
- import { getCascaderOptionsFromFields, getDisplayField, getFieldType, getFormConfig, getFormValue } from "./utils/data-source/index.js";
29
+ import { getCascaderOptionsFromFields, getDisplayField, getFieldType, getFormConfig, getFormValue, resolveFieldByPath } from "./utils/data-source/index.js";
29
30
  import { IdleTask } from "./utils/dep/idle-task.js";
30
31
  import { ScrollViewer } from "./utils/scroll-viewer.js";
32
+ import codeBlock_default from "./services/codeBlock.js";
33
+ import dataSource_default from "./services/dataSource.js";
34
+ import { ALL_COND_OPS, editorTypeMatchRules } from "./utils/type-match-rules.js";
35
+ import events_default from "./services/events.js";
36
+ import { EVENT_NAME_VALUE_SEPARATOR, collectEventNameOptionValues, getCompActionAllowedValues, getCompActionOptions, getEventNameAllowedValues, getEventNameOptions, isEventNameCheckStrictly, normalizeCompActionValue } from "./utils/event.js";
31
37
  import monaco_editor_default from "./utils/monaco-editor.js";
32
38
  import Resizer_default from "./components/Resizer.js";
33
39
  import SplitView_default from "./components/SplitView.js";
@@ -49,13 +55,11 @@ import CodeBlockList_default from "./layouts/sidebar/code-block/CodeBlockList.js
49
55
  import CodeBlockListPanel_default from "./layouts/sidebar/code-block/CodeBlockListPanel.js";
50
56
  import DataSourceAddButton_default from "./layouts/sidebar/data-source/DataSourceAddButton.js";
51
57
  import DataSourceConfigPanel_default from "./layouts/sidebar/data-source/DataSourceConfigPanel.js";
58
+ import LayerNodeContent_default from "./layouts/sidebar/layer/LayerNodeContent.js";
52
59
  import LayerPanel_default from "./layouts/sidebar/layer/LayerPanel.js";
53
60
  import ComponentListPanel_default from "./layouts/sidebar/ComponentListPanel.js";
54
- import codeBlock_default from "./services/codeBlock.js";
55
61
  import componentList_default from "./services/componentList.js";
56
- import dataSource_default from "./services/dataSource.js";
57
62
  import dep_default from "./services/dep.js";
58
- import events_default from "./services/events.js";
59
63
  import keybinding_default from "./services/keybinding.js";
60
64
  import stageOverlay_default from "./services/stageOverlay.js";
61
65
  import Editor_default from "./Editor.js";
@@ -71,6 +75,7 @@ import Index_default from "./fields/DataSourceFieldSelect/Index.js";
71
75
  import EventSelect_default from "./fields/EventSelect.js";
72
76
  import KeyValue_default from "./fields/KeyValue.js";
73
77
  import CompareForm_default from "./components/CompareForm.js";
78
+ import ViewForm_default from "./components/ViewForm.js";
74
79
  import HistoryDiffDialog_default from "./layouts/history-list/HistoryDiffDialog.js";
75
80
  import PageFragmentSelect_default from "./fields/PageFragmentSelect.js";
76
81
  import DisplayConds_default from "./fields/DisplayConds.js";
@@ -87,4 +92,4 @@ export * from "@tmagic/table";
87
92
  export * from "@tmagic/stage";
88
93
  export * from "@tmagic/design";
89
94
  export * from "@tmagic/utils";
90
- export { CODE_DRAFT_STORAGE_KEY, COPY_CODE_STORAGE_KEY, COPY_DS_STORAGE_KEY, COPY_STORAGE_KEY, CodeBlockEditor_default as CodeBlockEditor, CodeBlockList_default as CodeBlockList, CodeBlockListPanel_default as CodeBlockListPanel, CodeDeleteErrorType, CodeSelect_default as CodeSelect, CodeSelectCol_default as CodeSelectCol, ColumnLayout, CompareForm_default as CompareForm, ComponentListPanel_default as ComponentListPanel, CondOpSelect_default as CondOpSelect, ContentMenu_default as ContentMenu, DEFAULT_LEFT_COLUMN_WIDTH, DEFAULT_RIGHT_COLUMN_WIDTH, DataSourceAddButton_default as DataSourceAddButton, DataSourceConfigPanel_default as DataSourceConfigPanel, Index_default as DataSourceFieldSelect, DataSourceFields_default as DataSourceFields, DataSourceInput_default as DataSourceInput, DataSourceMethodSelect_default as DataSourceMethodSelect, DataSourceMethods_default as DataSourceMethods, DataSourceMocks_default as DataSourceMocks, DataSourceSelect_default as DataSourceSelect, DepTargetType, DisplayConds_default as DisplayConds, DragType, EventSelect_default as EventSelect, Fixed2Other, FloatingBox_default as FloatingBox, H_GUIDE_LINE_STORAGE_KEY, HistoryDiffDialog_default as HistoryDiffDialog, Bucket_default as HistoryListBucket, BucketTab_default as HistoryListBucketTab, Icon_default as Icon, IdleTask, KeyBindingCommand, KeyValue_default as KeyValue, Keys, LEFT_COLUMN_WIDTH_STORAGE_KEY, LayerOffset, LayerPanel_default as LayerPanel, Layout, SplitView_default as LayoutContainer, MIN_CENTER_COLUMN_WIDTH, MIN_LEFT_COLUMN_WIDTH, MIN_RIGHT_COLUMN_WIDTH, PROPS_PANEL_WIDTH_STORAGE_KEY, PageFragmentSelect_default as PageFragmentSelect, FormPanel_default as PropsFormPanel, PropsPanel_default as PropsPanel, RIGHT_COLUMN_WIDTH_STORAGE_KEY, Resizer_default as Resizer, ScrollViewer, SideItemKey, SplitView_default as SplitView, StageCore, Index_default$1 as StyleSetter, CodeEditor_default as TMagicCodeEditor, Editor_default as TMagicEditor, ToolButton_default as ToolButton, Tree_default as Tree, TreeNode_default as TreeNode, UI_SELECT_MODE_EVENT_NAME, UndoRedo, V_GUIDE_LINE_STORAGE_KEY, advancedTabConfig, arrayOptions, beforePaste, buildChangeRecords, calcAlignCenterStyle, calcLayerTargetIndex, calcMoveStyle, canUsePluginMethods, change2Fixed, classifyDragSources, codeBlock_default as codeBlockService, collectRelatedNodes, componentList_default as componentListService, confirmHistoryAction, createStackStep, dataSource_default as dataSourceService, debug, plugin_default as default, defaultIsExpandable, dep_default as depService, describeRevertStep, describeStepForRevert, deserializeStacks, designPlugin, detectStackOpType, detectTargetId, detectTargetName, displayTabConfig, editorNodeMergeCustomizer, editor_default as editorService, eqOptions, error, eventTabConfig, events_default as eventsService, fillConfig, fixNodeLeft, fixNodePosition, formPlugin, generatePageName, generatePageNameByApp, getAddParent, getCascaderOptionsFromFields, getCodeBlockFormConfig, getDefaultConfig, getDisplayField, getEditorConfig, getFieldType, getFormConfig, getFormValue, getGuideLineFromCache, getInitPositionStyle, getLastPushedHistoryIds, getNodeIndex, getOrCreateStack, getPageFragmentList, getPageList, getPageNameList, getPositionInContainer, getRelativeStyle, history_default as historyService, idbDelete, idbGet, idbSet, info, isIncludeDataSource, isIndexedDBSupported, keybinding_default as keybindingService, monaco_editor_default as loadMonaco, log, markStackSaved, mergeSteps, moveItemsInContainer, numberOptions, openIndexedDB, props_default as propsService, resolveSelectedNode, serializeConfig, serializeStacks, setChildrenLayout, setEditorConfig, setLayout, stageOverlay_default as stageOverlayService, storage_default as storageService, styleTabConfig, tablePlugin, toggleFixedPosition, ui_default as uiService, undoFloor, updateStatus, useCodeBlockEdit, useEditorContentHeight, useFilter, useFloatBox, useGetSo, useHistoryRevert, useNextFloatBoxPosition, useNodeStatus, useServices, useStage, useWindowRect, warn };
95
+ export { ALL_COND_OPS, CODE_DRAFT_STORAGE_KEY, COPY_CODE_STORAGE_KEY, COPY_DS_STORAGE_KEY, COPY_STORAGE_KEY, CodeBlockEditor_default as CodeBlockEditor, CodeBlockList_default as CodeBlockList, CodeBlockListPanel_default as CodeBlockListPanel, CodeDeleteErrorType, CodeSelect_default as CodeSelect, CodeSelectCol_default as CodeSelectCol, ColumnLayout, CompareForm_default as CompareForm, ComponentListPanel_default as ComponentListPanel, CondOpSelect_default as CondOpSelect, ContentMenu_default as ContentMenu, DEFAULT_LEFT_COLUMN_WIDTH, DEFAULT_RIGHT_COLUMN_WIDTH, DataSourceAddButton_default as DataSourceAddButton, DataSourceConfigPanel_default as DataSourceConfigPanel, Index_default as DataSourceFieldSelect, DataSourceFields_default as DataSourceFields, DataSourceInput_default as DataSourceInput, DataSourceMethodSelect_default as DataSourceMethodSelect, DataSourceMethods_default as DataSourceMethods, DataSourceMocks_default as DataSourceMocks, DataSourceSelect_default as DataSourceSelect, DepTargetType, DisplayConds_default as DisplayConds, DragType, EVENT_NAME_VALUE_SEPARATOR, EventSelect_default as EventSelect, Fixed2Other, FloatingBox_default as FloatingBox, H_GUIDE_LINE_STORAGE_KEY, HistoryDiffDialog_default as HistoryDiffDialog, Bucket_default as HistoryListBucket, BucketTab_default as HistoryListBucketTab, Icon_default as Icon, IdleTask, KeyBindingCommand, KeyValue_default as KeyValue, Keys, LEFT_COLUMN_WIDTH_STORAGE_KEY, LayerNodeContent_default as LayerNodeContent, LayerOffset, LayerPanel_default as LayerPanel, Layout, SplitView_default as LayoutContainer, MIN_CENTER_COLUMN_WIDTH, MIN_LEFT_COLUMN_WIDTH, MIN_RIGHT_COLUMN_WIDTH, PROPS_PANEL_WIDTH_STORAGE_KEY, PageFragmentSelect_default as PageFragmentSelect, FormPanel_default as PropsFormPanel, PropsPanel_default as PropsPanel, RIGHT_COLUMN_WIDTH_STORAGE_KEY, Resizer_default as Resizer, ScrollViewer, SideItemKey, SplitView_default as SplitView, StageCore, Index_default$1 as StyleSetter, CodeEditor_default as TMagicCodeEditor, Editor_default as TMagicEditor, ToolButton_default as ToolButton, Tree_default as Tree, TreeNode_default as TreeNode, UI_SELECT_MODE_EVENT_NAME, UndoRedo, V_GUIDE_LINE_STORAGE_KEY, ViewForm_default as ViewForm, advancedTabConfig, arrayOptions, beforePaste, booleanOptions, buildChangeRecords, calcAlignCenterStyle, calcLayerTargetIndex, calcMoveStyle, canUsePluginMethods, change2Fixed, classifyDragSources, codeBlock_default as codeBlockService, collectEventNameOptionValues, collectRelatedNodes, componentList_default as componentListService, confirmHistoryAction, createStackStep, dataSource_default as dataSourceService, debug, plugin_default as default, defaultIsExpandable, dep_default as depService, describeRevertStep, describeStepForRevert, deserializeStacks, designPlugin, detectStackOpType, detectTargetId, detectTargetName, displayTabConfig, editorNodeMergeCustomizer, editor_default as editorService, editorTypeMatchRules, eqOptions, error, eventTabConfig, events_default as eventsService, fillConfig, fixNodeLeft, fixNodePosition, formPlugin, generatePageName, generatePageNameByApp, getAddParent, getCascaderOptionsFromFields, getCodeBlockFormConfig, getCompActionAllowedValues, getCompActionOptions, getCondOpOptionsByFieldType, getDefaultConfig, getDisplayField, getEditorConfig, getEventNameAllowedValues, getEventNameOptions, getFieldType, getFormConfig, getFormValue, getGuideLineFromCache, getInitPositionStyle, getLastPushedHistoryIds, getNodeIndex, getOrCreateStack, getPageFragmentList, getPageList, getPageNameList, getPositionInContainer, getRelativeStyle, history_default as historyService, idbDelete, idbGet, idbSet, info, isEventNameCheckStrictly, isIncludeDataSource, isIndexedDBSupported, keybinding_default as keybindingService, monaco_editor_default as loadMonaco, log, markStackSaved, mergeSteps, moveItemsInContainer, normalizeCompActionValue, numberOptions, openIndexedDB, props_default as propsService, removeStyleDisplayConfig, resolveFieldByPath, resolveSelectedNode, serializeConfig, serializeStacks, setChildrenLayout, setEditorConfig, setLayout, stageOverlay_default as stageOverlayService, storage_default as storageService, styleTabConfig, tablePlugin, toggleFixedPosition, ui_default as uiService, undoFloor, updateStatus, useCodeBlockEdit, useCompareForm, useEditorContentHeight, useFilter, useFloatBox, useGetSo, useHistoryRevert, useNextFloatBoxPosition, useNodeStatus, useServices, useStage, useWindowRect, validatePropsForm, warn };
@@ -110,6 +110,7 @@ var CodeEditor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
110
110
  const values = ref("");
111
111
  const loading = ref(false);
112
112
  const codeEditorEl = useTemplateRef("codeEditor");
113
+ let destroyed = false;
113
114
  const resizeObserver = new globalThis.ResizeObserver(throttle(() => {
114
115
  vsEditor?.layout();
115
116
  vsDiffEditor?.layout();
@@ -150,11 +151,17 @@ var CodeEditor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
150
151
  emit("save", props.parse ? parseCode(newValue, props.language) : newValue);
151
152
  }
152
153
  };
154
+ const isEditorElValid = () => !destroyed && !!codeEditorEl.value && codeEditorEl.value.isConnected;
153
155
  const init = async () => {
154
- if (!codeEditorEl.value) return;
155
- if (codeEditorEl.value.clientHeight === 0) await nextTick();
156
+ if (!isEditorElValid()) return;
157
+ if (codeEditorEl.value.clientHeight === 0) {
158
+ await nextTick();
159
+ if (!isEditorElValid()) return;
160
+ }
156
161
  cachedExtraHeight = null;
157
162
  monaco = await monaco_editor_default();
163
+ if (!isEditorElValid()) return;
164
+ const editorEl = codeEditorEl.value;
158
165
  const options = {
159
166
  value: values.value,
160
167
  language: props.language,
@@ -163,19 +170,26 @@ var CodeEditor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
163
170
  ...props.options
164
171
  };
165
172
  if (props.type === "diff") {
166
- vsDiffEditor = await getEditorConfig("customCreateMonacoDiffEditor")(monaco, codeEditorEl.value, options);
173
+ vsDiffEditor = await getEditorConfig("customCreateMonacoDiffEditor")(monaco, editorEl, options);
167
174
  vsDiffEditor.getModifiedEditor().onDidChangeModelContent(() => {
168
175
  if (props.autosize) setAutoHeight(getEditorValue());
169
176
  });
170
177
  } else {
171
- vsEditor = await getEditorConfig("customCreateMonacoEditor")(monaco, codeEditorEl.value, options);
178
+ vsEditor = await getEditorConfig("customCreateMonacoEditor")(monaco, editorEl, options);
172
179
  vsEditor.onDidChangeModelContent(() => {
173
180
  if (props.autosize) setAutoHeight(getEditorValue());
174
181
  });
175
182
  }
183
+ if (destroyed) {
184
+ vsEditor?.dispose();
185
+ vsDiffEditor?.dispose();
186
+ vsEditor = null;
187
+ vsDiffEditor = null;
188
+ return;
189
+ }
176
190
  setEditorValue(props.initValues, props.modifiedValues);
177
191
  emit("initd", vsEditor);
178
- codeEditorEl.value.addEventListener("keydown", handleKeyDown);
192
+ editorEl.addEventListener("keydown", handleKeyDown);
179
193
  if (props.type !== "diff" && props.autoSave) vsEditor?.onDidBlurEditorWidget(() => {
180
194
  const newValue = getEditorValue();
181
195
  if (values.value !== newValue) {
@@ -183,7 +197,7 @@ var CodeEditor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
183
197
  emit("save", props.parse ? parseCode(newValue, props.language) : newValue);
184
198
  }
185
199
  });
186
- resizeObserver.observe(codeEditorEl.value);
200
+ resizeObserver.observe(editorEl);
187
201
  };
188
202
  watch(() => props.initValues, (v, preV) => {
189
203
  if (v !== preV) setEditorValue(props.initValues, props.modifiedValues);
@@ -205,6 +219,7 @@ var CodeEditor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
205
219
  loading.value = false;
206
220
  });
207
221
  onBeforeUnmount(() => {
222
+ destroyed = true;
208
223
  resizeObserver.disconnect();
209
224
  vsEditor?.dispose();
210
225
  vsDiffEditor?.dispose();
@@ -33,6 +33,9 @@ var Framework_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
33
33
  const pageLength = computed(() => editorService.get("pageLength") || 0);
34
34
  const showSrc = computed(() => uiService.get("showSrc"));
35
35
  const columnWidth = computed(() => uiService.get("columnWidth"));
36
+ const minLeftColumnWidth = computed(() => uiService.get("minLeftColumnWidth"));
37
+ const minCenterColumnWidth = computed(() => uiService.get("minCenterColumnWidth"));
38
+ const minRightColumnWidth = computed(() => uiService.get("minRightColumnWidth"));
36
39
  watch(pageLength, () => {
37
40
  splitViewRef.value?.updateWidth();
38
41
  });
@@ -76,13 +79,13 @@ var Framework_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
76
79
  renderSlot(_ctx.$slots, "header"),
77
80
  renderSlot(_ctx.$slots, "nav"),
78
81
  renderSlot(_ctx.$slots, "content-before"),
79
- showSrc.value ? renderSlot(_ctx.$slots, "src-code", { key: 0 }, () => [createVNode(CodeEditor_default, {
82
+ showSrc.value ? renderSlot(_ctx.$slots, "src-code", {}, () => [createVNode(CodeEditor_default, {
80
83
  class: "m-editor-content",
81
84
  "editor-custom-type": "m-editor-content",
82
85
  "init-values": root.value,
83
86
  options: unref(codeOptions),
84
87
  onSave: saveCode
85
- }, null, 8, ["init-values", "options"])]) : createCommentVNode("v-if", true),
88
+ }, null, 8, ["init-values", "options"])], void 0, 0) : createCommentVNode("v-if", true),
86
89
  withDirectives(createVNode(SplitView_default, {
87
90
  ref: "splitView",
88
91
  class: "m-editor-content",
@@ -91,13 +94,13 @@ var Framework_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
91
94
  "right-class": "m-editor-framework-right",
92
95
  left: __props.hideSidebar ? void 0 : columnWidth.value.left,
93
96
  right: columnWidth.value.right,
94
- "min-left": __props.hideSidebar ? 0 : unref(200),
95
- "min-right": unref(300),
96
- "min-center": unref(400),
97
+ "min-left": __props.hideSidebar ? 0 : minLeftColumnWidth.value,
98
+ "min-right": minRightColumnWidth.value,
99
+ "min-center": minCenterColumnWidth.value,
97
100
  width: frameworkRect.value.width,
98
101
  onChange: columnWidthChange
99
102
  }, createSlots({
100
- center: withCtx(() => [page.value ? renderSlot(_ctx.$slots, "workspace", { key: 0 }) : renderSlot(_ctx.$slots, "empty", { key: 1 }, () => [createVNode(AddPageBox_default, { "disabled-page-fragment": __props.disabledPageFragment }, null, 8, ["disabled-page-fragment"])]), renderSlot(_ctx.$slots, "page-bar", {}, () => [createVNode(PageBar_default, {
103
+ center: withCtx(() => [page.value ? renderSlot(_ctx.$slots, "workspace", {}, void 0, void 0, 0) : renderSlot(_ctx.$slots, "empty", {}, () => [createVNode(AddPageBox_default, { "disabled-page-fragment": __props.disabledPageFragment }, null, 8, ["disabled-page-fragment"])], void 0, 1), renderSlot(_ctx.$slots, "page-bar", {}, () => [createVNode(PageBar_default, {
101
104
  "disabled-page-fragment": __props.disabledPageFragment,
102
105
  "page-bar-sort-options": __props.pageBarSortOptions,
103
106
  "filter-function": __props.pageFilterFunction
@@ -28,6 +28,7 @@ var HistoryDiffDialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
28
28
  extendState: {},
29
29
  loadConfig: {},
30
30
  width: { default: "900px" },
31
+ size: {},
31
32
  isConfirm: { type: Boolean },
32
33
  onConfirm: {},
33
34
  selfDiffFieldTypes: {},
@@ -258,6 +259,7 @@ var HistoryDiffDialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
258
259
  "load-config": __props.loadConfig,
259
260
  "self-diff-field-types": __props.selfDiffFieldTypes,
260
261
  services: props.services,
262
+ size: props.size,
261
263
  height: "70vh"
262
264
  }, null, 8, [
263
265
  "category",
@@ -269,7 +271,8 @@ var HistoryDiffDialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
269
271
  "extend-state",
270
272
  "load-config",
271
273
  "self-diff-field-types",
272
- "services"
274
+ "services",
275
+ "size"
273
276
  ])) : (openBlock(), createBlock(CodeEditor_default, {
274
277
  key: 2,
275
278
  type: "diff",
@@ -181,4 +181,4 @@ var confirmHistoryAction = async (message) => {
181
181
  }
182
182
  };
183
183
  //#endregion
184
- export { confirmHistoryAction, describePageGroup, describePageStep, describeStep, formatHistoryFullTime, formatHistoryTime, isHistoryGroupExpanded, isPageStepRevertable, isSingleDiffStepRevertable, opLabel, sourceLabel, toRowGroup };
184
+ export { confirmHistoryAction, describePageGroup, describePageStep, describeStep, formatHistoryFullTime, formatHistoryTime, groupOperator, groupSource, groupTimestamp, isHistoryGroupExpanded, isPageStepRevertable, isSingleDiffStepRevertable, opLabel, sourceLabel, toRowGroup };
@@ -48,6 +48,7 @@ var mountHistoryDiffDialog = async (options) => {
48
48
  selfDiffFieldTypes: options.selfDiffFieldTypes,
49
49
  compareFormState: options.compareFormState,
50
50
  width: options.width,
51
+ size: options.size ?? options.services?.uiService?.get("propsPanelSize"),
51
52
  onClose: options.onClose
52
53
  });
53
54
  if (options.appContext) Object.assign(app._context, options.appContext);
@@ -148,7 +149,8 @@ var useHistoryRevert = (options = {}, services) => {
148
149
  extendState,
149
150
  services,
150
151
  ...extra,
151
- width: extra?.width ?? dialogWidth
152
+ width: extra?.width ?? dialogWidth,
153
+ size: extra?.size
152
154
  });
153
155
  return confirmRevert();
154
156
  };
@@ -275,7 +277,8 @@ var useHistoryRevert = (options = {}, services) => {
275
277
  if (!await runRevert(revertOptions.diffPayload ?? null, {
276
278
  loadConfig: revertOptions.loadConfig,
277
279
  selfDiffFieldTypes: revertOptions.selfDiffFieldTypes,
278
- width: revertOptions.width
280
+ width: revertOptions.width,
281
+ size: revertOptions.size
279
282
  })) return null;
280
283
  return await revertOptions.revert();
281
284
  };
@@ -289,7 +292,8 @@ var useHistoryRevert = (options = {}, services) => {
289
292
  extendState,
290
293
  services,
291
294
  ...extra,
292
- width: extra?.width ?? dialogWidth
295
+ width: extra?.width ?? dialogWidth,
296
+ size: extra?.size
293
297
  });
294
298
  };
295
299
  return {
@@ -1,9 +1,12 @@
1
+ import { validatePropsForm } from "../../utils/props.js";
1
2
  import { useServices } from "../../hooks/use-services.js";
2
3
  import { useEditorContentHeight } from "../../hooks/use-editor-content-height.js";
3
4
  import Icon_default from "../../components/Icon.js";
4
5
  import CodeEditor_default from "../CodeEditor.js";
6
+ import { ENABLE_PROPS_FORM_VALIDATE } from "../../editorProps.js";
5
7
  import { MForm } from "@tmagic/form";
6
- import { TMagicButton, TMagicScrollbar } from "@tmagic/design";
8
+ import { TMagicButton, TMagicScrollbar, tMagicMessage } from "@tmagic/design";
9
+ import { filterXSS } from "@tmagic/utils";
7
10
  import { computed, createBlock, createCommentVNode, createElementBlock, createVNode, defineComponent, getCurrentInstance, inject, normalizeClass, onMounted, onUnmounted, openBlock, ref, renderSlot, unref, useTemplateRef, watchEffect, withCtx } from "vue";
8
11
  import { Document } from "@element-plus/icons-vue";
9
12
  //#region packages/editor/src/layouts/props-panel/FormPanel.vue?vue&type=script&setup=true&lang.ts
@@ -30,6 +33,7 @@ var FormPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
30
33
  setup(__props, { expose: __expose, emit: __emit }) {
31
34
  const props = __props;
32
35
  const emit = __emit;
36
+ const enablePropsFormValidate = inject(ENABLE_PROPS_FORM_VALIDATE, false);
33
37
  const services = useServices();
34
38
  const { editorService, uiService } = services;
35
39
  const codeOptions = inject("codeOptions", {});
@@ -53,16 +57,50 @@ var FormPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
53
57
  });
54
58
  const submit = async (v, eventData) => {
55
59
  try {
56
- emit("submit", await configFormRef.value?.submitForm(), eventData);
60
+ const values = await configFormRef.value?.submitForm();
61
+ emit("submit", values, eventData);
57
62
  } catch (e) {
58
- emit("submit-error", e);
63
+ if (enablePropsFormValidate) emit("submit", v, eventData, e);
64
+ else emit("submit-error", e);
59
65
  }
60
66
  };
61
67
  const errorHandler = (e) => {
62
68
  emit("form-error", e);
63
69
  };
64
- const saveCode = (values) => {
65
- emit("submit", props.codeValueKey ? { [props.codeValueKey]: values } : values);
70
+ /**
71
+ * 将校验错误文案安全地转为用于弹窗展示的 HTML。
72
+ *
73
+ * 文案形如 `字段 -> 主文案\n\n建议`,多条以结构性 `<br>` 拼接。为在保留换行排版的同时
74
+ * 避免 `${value}`/字段名中可能夹带的 HTML 造成 XSS:先按结构性 `<br>` 拆分,对每段做 HTML
75
+ * 转义后再把段内换行 `\n` 替换为 `<br>`,最后用 `<br>` 拼回。
76
+ */
77
+ const formatValidateErrorHtml = (error) => error.split(/<br\s*\/?>/i).map((segment) => filterXSS(segment).replaceAll("\n", "<br>")).join("<br>");
78
+ const saveCode = async (values) => {
79
+ const newValues = props.codeValueKey ? { [props.codeValueKey]: values } : values;
80
+ if (!enablePropsFormValidate) {
81
+ emit("submit", newValues);
82
+ return;
83
+ }
84
+ try {
85
+ const error = await validatePropsForm({
86
+ config: props.config,
87
+ values: newValues,
88
+ appContext: internalInstance?.appContext ?? null,
89
+ services,
90
+ stage: stage.value,
91
+ typeMatchValid: true,
92
+ extendState: props.extendState
93
+ });
94
+ if (error) tMagicMessage({
95
+ type: "error",
96
+ message: formatValidateErrorHtml(error),
97
+ dangerouslyUseHTMLString: true
98
+ });
99
+ emit("submit", newValues, void 0, error ? new Error(error) : void 0);
100
+ } catch (e) {
101
+ console.log("validateForm error", e);
102
+ emit("submit", newValues);
103
+ }
66
104
  };
67
105
  __expose({
68
106
  configForm: configFormRef,
@@ -81,6 +119,7 @@ var FormPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
81
119
  size: propsPanelSize.value,
82
120
  "init-values": __props.values,
83
121
  config: __props.config,
122
+ "type-match-valid": true,
84
123
  "extend-state": __props.extendState,
85
124
  onChange: submit,
86
125
  onError: errorHandler