@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
@@ -4,11 +4,12 @@ import { PROPS_PANEL_WIDTH_STORAGE_KEY } from "../../utils/const.js";
4
4
  import { useServices } from "../../hooks/use-services.js";
5
5
  import Resizer_default from "../../components/Resizer.js";
6
6
  import Icon_default from "../../components/Icon.js";
7
+ import { ENABLE_PROPS_FORM_VALIDATE } from "../../editorProps.js";
7
8
  import FormPanel_default from "./FormPanel.js";
8
9
  import { useStylePanel } from "./use-style-panel.js";
9
10
  import { TMagicButton } from "@tmagic/design";
10
11
  import { setValueByKeyPath } from "@tmagic/utils";
11
- import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, normalizeClass, onBeforeUnmount, onMounted, openBlock, ref, renderSlot, unref, useTemplateRef, vShow, watch, watchEffect, withCtx, withDirectives } from "vue";
12
+ import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, inject, normalizeClass, onBeforeUnmount, onMounted, openBlock, ref, renderSlot, unref, useTemplateRef, vShow, watch, watchEffect, withCtx, withDirectives } from "vue";
12
13
  import { Close, Sugar } from "@element-plus/icons-vue";
13
14
  //#region packages/editor/src/layouts/props-panel/PropsPanel.vue?vue&type=script&setup=true&lang.ts
14
15
  var _hoisted_1 = {
@@ -32,6 +33,7 @@ var PropsPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
32
33
  setup(__props, { expose: __expose, emit: __emit }) {
33
34
  const emit = __emit;
34
35
  const { editorService, uiService, propsService, storageService } = useServices();
36
+ const enablePropsFormValidate = inject(ENABLE_PROPS_FORM_VALIDATE, false);
35
37
  const values = ref({});
36
38
  const curFormConfig = ref([]);
37
39
  const node = computed(() => editorService.get("node"));
@@ -54,7 +56,7 @@ var PropsPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
54
56
  onBeforeUnmount(() => {
55
57
  propsService.off("props-configs-change", init);
56
58
  });
57
- const submit = async (v, eventData) => {
59
+ const submit = async (v, eventData, error, source = "props") => {
58
60
  try {
59
61
  if (!v.id) v.id = values.value.id;
60
62
  const newValue = {
@@ -72,7 +74,12 @@ var PropsPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
72
74
  const historySource = eventData ? "props" : "code";
73
75
  editorService.update(newValue, {
74
76
  changeRecords: eventData?.changeRecords,
75
- historySource
77
+ historySource,
78
+ ...enablePropsFormValidate && error ? { invalidInfo: {
79
+ id: newValue.id,
80
+ source,
81
+ error: error?.message
82
+ } } : {}
76
83
  });
77
84
  } catch (e) {
78
85
  emit("submit-error", e);
@@ -123,7 +130,7 @@ var PropsPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
123
130
  values: values.value,
124
131
  disabledShowSrc: __props.disabledShowSrc,
125
132
  extendState: __props.extendState,
126
- onSubmit: submit,
133
+ onSubmit: _cache[0] || (_cache[0] = (v, eventData, error) => submit(v, eventData, error, "props")),
127
134
  onSubmitError: errorHandler,
128
135
  onFormError: errorHandler,
129
136
  onMounted: mountedHandler,
@@ -148,14 +155,14 @@ var PropsPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
148
155
  values: values.value,
149
156
  disabledShowSrc: __props.disabledShowSrc,
150
157
  extendState: __props.extendState,
151
- onSubmit: submit,
158
+ onSubmit: _cache[2] || (_cache[2] = (v, eventData, error) => submit(v, eventData, error, "style")),
152
159
  onSubmitError: errorHandler,
153
160
  onFormError: errorHandler
154
161
  }, {
155
- "props-form-panel-header": withCtx(() => [createElementVNode("div", _hoisted_2, [_cache[2] || (_cache[2] = createElementVNode("span", null, "样式", -1)), createElementVNode("div", null, [createVNode(unref(TMagicButton), {
162
+ "props-form-panel-header": withCtx(() => [createElementVNode("div", _hoisted_2, [_cache[4] || (_cache[4] = createElementVNode("span", null, "样式", -1)), createElementVNode("div", null, [createVNode(unref(TMagicButton), {
156
163
  link: "",
157
164
  size: "small",
158
- onClick: _cache[0] || (_cache[0] = ($event) => unref(toggleStylePanel)(false))
165
+ onClick: _cache[1] || (_cache[1] = ($event) => unref(toggleStylePanel)(false))
159
166
  }, {
160
167
  default: withCtx(() => [createVNode(Icon_default, { icon: unref(Close) }, null, 8, ["icon"])]),
161
168
  _: 1
@@ -170,7 +177,7 @@ var PropsPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
170
177
  key: 2,
171
178
  class: "m-editor-props-panel-style-icon",
172
179
  circle: "",
173
- onClick: _cache[1] || (_cache[1] = ($event) => unref(toggleStylePanel)(true))
180
+ onClick: _cache[3] || (_cache[3] = ($event) => unref(toggleStylePanel)(true))
174
181
  }, {
175
182
  default: withCtx(() => [createVNode(Icon_default, { icon: unref(Sugar) }, null, 8, ["icon"])]),
176
183
  _: 1
@@ -23,8 +23,9 @@ var useStylePanel = ({ uiService, storageService }, propsPanelWidth) => {
23
23
  columnWidth.center += propsPanelWidth.value;
24
24
  }
25
25
  if (columnWidth.center < 0) {
26
- columnWidth.right = columnWidth.right + columnWidth.center - 400;
27
- columnWidth.center = 400;
26
+ const minCenterColumnWidth = uiService.get("minCenterColumnWidth");
27
+ columnWidth.right = columnWidth.right + columnWidth.center - minCenterColumnWidth;
28
+ columnWidth.center = minCenterColumnWidth;
28
29
  propsPanelWidth.value = columnWidth.right / 2;
29
30
  }
30
31
  storageService.setItem(RIGHT_COLUMN_WIDTH_STORAGE_KEY, columnWidth.right, { protocol: Protocol.NUMBER });
@@ -61,6 +61,7 @@ var Sidebar_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCo
61
61
  const taskLength = computed(() => depService.get("taskLength"));
62
62
  const tipsBarVisible = ref(true);
63
63
  const columnLeftWidth = computed(() => uiService.get("columnWidth")[ColumnLayout.LEFT]);
64
+ const frameworkWidth = computed(() => uiService.get("frameworkRect")?.width || 0);
64
65
  const { height: editorContentHeight } = useEditorContentHeight();
65
66
  const columnLeftHeight = ref(0);
66
67
  const unWatchEditorContentHeight = watch(editorContentHeight, (height) => {
@@ -189,23 +190,17 @@ var Sidebar_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCo
189
190
  }, config.props || {}, toHandlers(config?.listeners || {})), createSlots({ _: 2 }, [
190
191
  config.$key === "component-list" || config.slots?.componentList ? {
191
192
  name: "component-list",
192
- fn: withCtx(({ componentGroupList }) => [config.$key === "component-list" ? renderSlot(_ctx.$slots, "component-list", {
193
- key: 0,
194
- componentGroupList
195
- }) : config.slots?.componentList ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.componentList), { key: 1 })) : createCommentVNode("v-if", true)]),
193
+ fn: withCtx(({ componentGroupList }) => [config.$key === "component-list" ? renderSlot(_ctx.$slots, "component-list", { componentGroupList }, void 0, void 0, 0) : config.slots?.componentList ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.componentList), { key: 1 })) : createCommentVNode("v-if", true)]),
196
194
  key: "0"
197
195
  } : void 0,
198
196
  config.$key === "component-list" || config.slots?.componentListPanelHeader ? {
199
197
  name: "component-list-panel-header",
200
- fn: withCtx(() => [config.$key === "component-list" ? renderSlot(_ctx.$slots, "component-list-panel-header", { key: 0 }) : config.slots?.componentListPanelHeader ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.componentListPanelHeader), { key: 1 })) : createCommentVNode("v-if", true)]),
198
+ fn: withCtx(() => [config.$key === "component-list" ? renderSlot(_ctx.$slots, "component-list-panel-header", {}, void 0, void 0, 0) : config.slots?.componentListPanelHeader ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.componentListPanelHeader), { key: 1 })) : createCommentVNode("v-if", true)]),
201
199
  key: "1"
202
200
  } : void 0,
203
201
  config.$key === "component-list" || config.slots?.componentListItem ? {
204
202
  name: "component-list-item",
205
- fn: withCtx(({ component }) => [config.$key === "component-list" ? renderSlot(_ctx.$slots, "component-list-item", {
206
- key: 0,
207
- component
208
- }) : config.slots?.componentListItem ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.componentListItem), {
203
+ fn: withCtx(({ component }) => [config.$key === "component-list" ? renderSlot(_ctx.$slots, "component-list-item", { component }, void 0, void 0, 0) : config.slots?.componentListItem ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.componentListItem), {
209
204
  key: 1,
210
205
  component
211
206
  }, null, 8, ["component"])) : createCommentVNode("v-if", true)]),
@@ -213,34 +208,30 @@ var Sidebar_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCo
213
208
  } : void 0,
214
209
  config.$key === "layer" || config.slots?.layerPanelHeader ? {
215
210
  name: "layer-panel-header",
216
- fn: withCtx(() => [config.$key === "layer" ? renderSlot(_ctx.$slots, "layer-panel-header", { key: 0 }) : config.slots?.layerPanelHeader ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.layerPanelHeader), { key: 1 })) : createCommentVNode("v-if", true)]),
211
+ fn: withCtx(() => [config.$key === "layer" ? renderSlot(_ctx.$slots, "layer-panel-header", {}, void 0, void 0, 0) : config.slots?.layerPanelHeader ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.layerPanelHeader), { key: 1 })) : createCommentVNode("v-if", true)]),
217
212
  key: "3"
218
213
  } : void 0,
219
214
  config.$key === "code-block" || config.slots?.codeBlockPanelHeader ? {
220
215
  name: "code-block-panel-header",
221
- fn: withCtx(() => [config.$key === "code-block" ? renderSlot(_ctx.$slots, "code-block-panel-header", { key: 0 }) : config.slots?.codeBlockPanelHeader ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.codeBlockPanelHeader), { key: 1 })) : createCommentVNode("v-if", true)]),
216
+ fn: withCtx(() => [config.$key === "code-block" ? renderSlot(_ctx.$slots, "code-block-panel-header", {}, void 0, void 0, 0) : config.slots?.codeBlockPanelHeader ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.codeBlockPanelHeader), { key: 1 })) : createCommentVNode("v-if", true)]),
222
217
  key: "4"
223
218
  } : void 0,
224
219
  config.$key === "code-block" || config.slots?.codeBlockPanelTool ? {
225
220
  name: "code-block-panel-tool",
226
221
  fn: withCtx(({ id, data }) => [config.$key === "code-block" ? renderSlot(_ctx.$slots, "code-block-panel-tool", {
227
- key: 0,
228
222
  id,
229
223
  data
230
- }) : config.slots?.codeBlockPanelTool ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.codeBlockPanelTool), { key: 1 })) : createCommentVNode("v-if", true)]),
224
+ }, void 0, void 0, 0) : config.slots?.codeBlockPanelTool ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.codeBlockPanelTool), { key: 1 })) : createCommentVNode("v-if", true)]),
231
225
  key: "5"
232
226
  } : void 0,
233
227
  config.$key === "code-block" || config.slots?.codeBlockPanelSearch ? {
234
228
  name: "code-block-panel-search",
235
- fn: withCtx(() => [config.$key === "code-block" ? renderSlot(_ctx.$slots, "code-block-panel-search", { key: 0 }) : config.slots?.codeBlockPanelSearch ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.codeBlockPanelSearch), { key: 1 })) : createCommentVNode("v-if", true)]),
229
+ fn: withCtx(() => [config.$key === "code-block" ? renderSlot(_ctx.$slots, "code-block-panel-search", {}, void 0, void 0, 0) : config.slots?.codeBlockPanelSearch ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.codeBlockPanelSearch), { key: 1 })) : createCommentVNode("v-if", true)]),
236
230
  key: "6"
237
231
  } : void 0,
238
232
  config.$key === "layer" || config.slots?.layerNodeContent ? {
239
233
  name: "layer-node-content",
240
- fn: withCtx(({ data: nodeData }) => [config.$key === "layer" ? renderSlot(_ctx.$slots, "layer-node-content", {
241
- key: 0,
242
- data: nodeData
243
- }) : config.slots?.layerNodeContent ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.layerNodeContent), {
234
+ fn: withCtx(({ data: nodeData }) => [config.$key === "layer" ? renderSlot(_ctx.$slots, "layer-node-content", { data: nodeData }, void 0, void 0, 0) : config.slots?.layerNodeContent ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.layerNodeContent), {
244
235
  key: 1,
245
236
  data: nodeData
246
237
  }, null, 8, ["data"])) : createCommentVNode("v-if", true)]),
@@ -248,10 +239,7 @@ var Sidebar_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCo
248
239
  } : void 0,
249
240
  config.$key === "layer" || config.slots?.layerNodeLabel ? {
250
241
  name: "layer-node-label",
251
- fn: withCtx(({ data: nodeData }) => [config.$key === "layer" ? renderSlot(_ctx.$slots, "layer-node-label", {
252
- key: 0,
253
- data: nodeData
254
- }) : config.slots?.layerNodeLabel ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.layerNodeTool), {
242
+ fn: withCtx(({ data: nodeData }) => [config.$key === "layer" ? renderSlot(_ctx.$slots, "layer-node-label", { data: nodeData }, void 0, void 0, 0) : config.slots?.layerNodeLabel ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.layerNodeTool), {
255
243
  key: 1,
256
244
  data: nodeData
257
245
  }, null, 8, ["data"])) : createCommentVNode("v-if", true)]),
@@ -259,10 +247,7 @@ var Sidebar_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCo
259
247
  } : void 0,
260
248
  config.$key === "layer" || config.slots?.layerNodeTool ? {
261
249
  name: "layer-node-tool",
262
- fn: withCtx(({ data: nodeData }) => [config.$key === "layer" ? renderSlot(_ctx.$slots, "layer-node-tool", {
263
- key: 0,
264
- data: nodeData
265
- }) : config.slots?.layerNodeTool ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.layerNodeTool), {
250
+ fn: withCtx(({ data: nodeData }) => [config.$key === "layer" ? renderSlot(_ctx.$slots, "layer-node-tool", { data: nodeData }, void 0, void 0, 0) : config.slots?.layerNodeTool ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.layerNodeTool), {
266
251
  key: 1,
267
252
  data: nodeData
268
253
  }, null, 8, ["data"])) : createCommentVNode("v-if", true)]),
@@ -270,15 +255,12 @@ var Sidebar_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCo
270
255
  } : void 0,
271
256
  config.$key === "data-source" || config.slots?.dataSourcePanelTool ? {
272
257
  name: "data-source-panel-tool",
273
- fn: withCtx(({ data }) => [config.$key === "data-source" ? renderSlot(_ctx.$slots, "data-source-panel-tool", {
274
- key: 0,
275
- data
276
- }) : config.slots?.DataSourcePanelTool ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.DataSourcePanelTool), { key: 1 })) : createCommentVNode("v-if", true)]),
258
+ fn: withCtx(({ data }) => [config.$key === "data-source" ? renderSlot(_ctx.$slots, "data-source-panel-tool", { data }, void 0, void 0, 0) : config.slots?.DataSourcePanelTool ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.DataSourcePanelTool), { key: 1 })) : createCommentVNode("v-if", true)]),
277
259
  key: "10"
278
260
  } : void 0,
279
261
  config.$key === "data-source" || config.slots?.dataSourcePanelSearch ? {
280
262
  name: "data-source-panel-search",
281
- fn: withCtx(() => [config.$key === "data-source" ? renderSlot(_ctx.$slots, "data-source-panel-search", { key: 0 }) : config.slots?.dataSourcePanelSearch ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.dataSourcePanelSearch), { key: 1 })) : createCommentVNode("v-if", true)]),
263
+ fn: withCtx(() => [config.$key === "data-source" ? renderSlot(_ctx.$slots, "data-source-panel-search", {}, void 0, void 0, 0) : config.slots?.dataSourcePanelSearch ? (openBlock(), createBlock(resolveDynamicComponent(config.slots.dataSourcePanelSearch), { key: 1 })) : createCommentVNode("v-if", true)]),
282
264
  key: "11"
283
265
  } : void 0
284
266
  ]), 1040)) : createCommentVNode("v-if", true)], 2)), [[vShow, [
@@ -301,6 +283,7 @@ var Sidebar_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCo
301
283
  "onUpdate:height": _cache[2] || (_cache[2] = ($event) => columnLeftHeight.value = $event),
302
284
  width: columnLeftWidth.value,
303
285
  title: config.text,
286
+ "framework-width": frameworkWidth.value,
304
287
  position: {
305
288
  left: unref(floatBoxStates)[config.$key].left,
306
289
  top: unref(floatBoxStates)[config.$key].top
@@ -317,6 +300,7 @@ var Sidebar_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCo
317
300
  "height",
318
301
  "width",
319
302
  "title",
303
+ "framework-width",
320
304
  "position"
321
305
  ])) : createCommentVNode("v-if", true)], 64);
322
306
  }), 256))]))], 64);
@@ -37,10 +37,10 @@ var CodeBlockListPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__
37
37
  const editDialogCloseHandler = () => {
38
38
  if (codeBlockListRef.value) for (const [, status] of codeBlockListRef.value.nodeStatusMap.entries()) status.selected = false;
39
39
  };
40
- const { nodeContentMenuHandler, menuData: contentMenuData, contentMenuHideHandler } = useContentMenu((id) => {
40
+ const { nodeContentMenuHandler, menuData: contentMenuData, contentMenuHideHandler, getTarget } = useContentMenu((id) => {
41
41
  codeBlockListRef.value?.deleteCode(id, { historySource: "tree-contextmenu" });
42
42
  });
43
- const menuData = computed(() => props.customContentMenu(contentMenuData, "code-block"));
43
+ const menuData = computed(() => props.customContentMenu(contentMenuData, "code-block", getTarget));
44
44
  return (_ctx, _cache) => {
45
45
  return openBlock(), createElementBlock(Fragment, null, [
46
46
  createVNode(unref(TMagicScrollbar), { class: "m-editor-code-block-list m-editor-layer-panel" }, {
@@ -6,6 +6,14 @@ var useContentMenu = (deleteCode) => {
6
6
  const eventBus = inject("eventBus");
7
7
  const menuRef = useTemplateRef("menu");
8
8
  let selectId = "";
9
+ let selectData = null;
10
+ const getTarget = () => {
11
+ if (!selectId) return null;
12
+ return {
13
+ id: selectId,
14
+ data: selectData ?? void 0
15
+ };
16
+ };
9
17
  const menuData = [
10
18
  {
11
19
  type: "button",
@@ -43,17 +51,24 @@ var useContentMenu = (deleteCode) => {
43
51
  event.preventDefault();
44
52
  if (data.type === "code") {
45
53
  menuRef.value?.show(event);
46
- if (data.id) selectId = `${data.id}`;
47
- else selectId = "";
54
+ if (data.id) {
55
+ selectId = `${data.id}`;
56
+ selectData = data;
57
+ } else {
58
+ selectId = "";
59
+ selectData = null;
60
+ }
48
61
  }
49
62
  };
50
63
  const contentMenuHideHandler = () => {
51
64
  selectId = "";
65
+ selectData = null;
52
66
  };
53
67
  return {
54
68
  menuData,
55
69
  nodeContentMenuHandler,
56
- contentMenuHideHandler
70
+ contentMenuHideHandler,
71
+ getTarget
57
72
  };
58
73
  };
59
74
  //#endregion
@@ -39,6 +39,7 @@ var DataSourceConfigPanel_vue_vue_type_script_setup_true_lang_default = /*@__PUR
39
39
  const dataSourceConfig = ref([]);
40
40
  const { height: editorHeight } = useEditorContentHeight();
41
41
  const { boxPosition, calcBoxPosition } = useNextFloatBoxPosition(uiService, inject("parentFloating", ref(null)));
42
+ const frameworkWidth = computed(() => uiService.get("frameworkRect")?.width || 0);
42
43
  /** 供「方法定义」tab 内的字段消费,用于打开数据源详情后自动打开指定方法 */
43
44
  provide("editingDataSourceMethodName", computed(() => props.editMethodName));
44
45
  /** 供「数据定义」tab 内的字段消费,用于打开数据源详情后自动打开指定字段 */
@@ -77,6 +78,7 @@ var DataSourceConfigPanel_vue_vue_type_script_setup_true_lang_default = /*@__PUR
77
78
  });
78
79
  return (_ctx, _cache) => {
79
80
  return openBlock(), createBlock(FloatingBox_default, {
81
+ "body-style": { padding: "0 16px" },
80
82
  visible: boxVisible.value,
81
83
  "onUpdate:visible": _cache[0] || (_cache[0] = ($event) => boxVisible.value = $event),
82
84
  width: width.value,
@@ -84,6 +86,7 @@ var DataSourceConfigPanel_vue_vue_type_script_setup_true_lang_default = /*@__PUR
84
86
  height: unref(editorHeight),
85
87
  "onUpdate:height": _cache[2] || (_cache[2] = ($event) => isRef(editorHeight) ? editorHeight.value = $event : null),
86
88
  title: __props.title,
89
+ "framework-width": frameworkWidth.value,
87
90
  position: unref(boxPosition)
88
91
  }, {
89
92
  body: withCtx(() => [createVNode(unref(MFormBox), {
@@ -107,6 +110,7 @@ var DataSourceConfigPanel_vue_vue_type_script_setup_true_lang_default = /*@__PUR
107
110
  "width",
108
111
  "height",
109
112
  "title",
113
+ "framework-width",
110
114
  "position"
111
115
  ]);
112
116
  };
@@ -85,8 +85,8 @@ var DataSourceListPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE_
85
85
  eventBus?.on("remove-data-source", (id) => {
86
86
  removeHandler(id);
87
87
  });
88
- const { nodeContentMenuHandler, menuData: contentMenuData, contentMenuHideHandler } = useContentMenu();
89
- const menuData = computed(() => props.customContentMenu(contentMenuData, "data-source"));
88
+ const { nodeContentMenuHandler, menuData: contentMenuData, contentMenuHideHandler, getTarget } = useContentMenu();
89
+ const menuData = computed(() => props.customContentMenu(contentMenuData, "data-source", getTarget));
90
90
  return (_ctx, _cache) => {
91
91
  return openBlock(), createElementBlock(Fragment, null, [
92
92
  createVNode(unref(TMagicScrollbar), { class: "data-source-list-panel m-editor-layer-panel" }, {
@@ -6,6 +6,14 @@ var useContentMenu = () => {
6
6
  const eventBus = inject("eventBus");
7
7
  const menuRef = useTemplateRef("menu");
8
8
  let selectId = "";
9
+ let selectData = null;
10
+ const getTarget = () => {
11
+ if (!selectId) return null;
12
+ return {
13
+ id: selectId,
14
+ data: selectData ?? void 0
15
+ };
16
+ };
9
17
  const menuData = [
10
18
  {
11
19
  type: "button",
@@ -42,17 +50,24 @@ var useContentMenu = () => {
42
50
  event.preventDefault();
43
51
  if (data.type === "ds") {
44
52
  menuRef.value?.show(event);
45
- if (data.id) selectId = `${data.id}`;
46
- else selectId = "";
53
+ if (data.id) {
54
+ selectId = `${data.id}`;
55
+ selectData = data;
56
+ } else {
57
+ selectId = "";
58
+ selectData = null;
59
+ }
47
60
  }
48
61
  };
49
62
  const contentMenuHideHandler = () => {
50
63
  selectId = "";
64
+ selectData = null;
51
65
  };
52
66
  return {
53
67
  menuData,
54
68
  nodeContentMenuHandler,
55
- contentMenuHideHandler
69
+ contentMenuHideHandler,
70
+ getTarget
56
71
  };
57
72
  };
58
73
  //#endregion
@@ -0,0 +1,5 @@
1
+ import LayerNodeContent_vue_vue_type_script_setup_true_lang_default from "./LayerNodeContent.vue_vue_type_script_setup_true_lang.js";
2
+ //#region packages/editor/src/layouts/sidebar/layer/LayerNodeContent.vue
3
+ var LayerNodeContent_default = LayerNodeContent_vue_vue_type_script_setup_true_lang_default;
4
+ //#endregion
5
+ export { LayerNodeContent_default as default };
@@ -0,0 +1,46 @@
1
+ import { useServices } from "../../../hooks/use-services.js";
2
+ import Icon_default from "../../../components/Icon.js";
3
+ import { TMagicTooltip, stripValidateSuggestion } from "@tmagic/design";
4
+ import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, normalizeClass, openBlock, toDisplayString, unref, withCtx } from "vue";
5
+ import { WarningFilled } from "@element-plus/icons-vue";
6
+ //#region packages/editor/src/layouts/sidebar/layer/LayerNodeContent.vue?vue&type=script&setup=true&lang.ts
7
+ var _hoisted_1 = { class: "m-editor-layer-node-label" };
8
+ var _hoisted_2 = ["innerHTML"];
9
+ var LayerNodeContent_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
10
+ name: "MEditorLayerNodeContent",
11
+ __name: "LayerNodeContent",
12
+ props: { data: {} },
13
+ setup(__props) {
14
+ const props = __props;
15
+ const { editorService } = useServices();
16
+ const label = computed(() => `${props.data.name} (${props.data.id})`);
17
+ /** 读取集中存储的校验错误状态,建立响应式依赖 */
18
+ const invalidInfo = computed(() => editorService.get("invalidNodeIds").get(props.data.id));
19
+ const hasError = computed(() => Boolean(invalidInfo.value?.props || invalidInfo.value?.style));
20
+ /**
21
+ * 去掉单条校验文案中的「修改建议」部分。
22
+ *
23
+ * 错误文案可能是多条错误以 `<br>` 拼接的 HTML,每条本身形如 `主文案\n\n建议`。
24
+ * 组件树 tooltip 仅展示错误描述,不展示修改建议(建议仅在错误汇总面板展示),
25
+ * 故先按 `<br>` 拆分,每段用 `stripValidateSuggestion` 截断建议后再拼回。
26
+ */
27
+ const stripSuggestion = (text) => String(text ?? "").split(/<br\s*\/?>/i).map((segment) => stripValidateSuggestion(segment)).join("<br>");
28
+ /** 合并属性表单与样式表单的错误文案(去掉建议,本身可能仍是含 <br> 的 HTML) */
29
+ const errorMessage = computed(() => [stripSuggestion(invalidInfo.value?.props), stripSuggestion(invalidInfo.value?.style)].filter(Boolean).join("<br>"));
30
+ return (_ctx, _cache) => {
31
+ return openBlock(), createElementBlock("span", { class: normalizeClass(["m-editor-layer-node-content", { "is-invalid": hasError.value }]) }, [createElementVNode("span", _hoisted_1, toDisplayString(label.value), 1), hasError.value ? (openBlock(), createBlock(unref(TMagicTooltip), {
32
+ key: 0,
33
+ placement: "top"
34
+ }, {
35
+ content: withCtx(() => [createElementVNode("span", { innerHTML: errorMessage.value }, null, 8, _hoisted_2)]),
36
+ default: withCtx(() => [createVNode(Icon_default, {
37
+ class: "m-editor-layer-node-error-icon",
38
+ icon: unref(WarningFilled)
39
+ }, null, 8, ["icon"])]),
40
+ _: 1
41
+ })) : createCommentVNode("v-if", true)], 2);
42
+ };
43
+ }
44
+ });
45
+ //#endregion
46
+ export { LayerNodeContent_vue_vue_type_script_setup_true_lang_default as default };
@@ -3,6 +3,7 @@ import { useFilter } from "../../../hooks/use-filter.js";
3
3
  import SearchInput_default from "../../../components/SearchInput.js";
4
4
  import Tree_default from "../../../components/Tree.js";
5
5
  import LayerMenu_default from "./LayerMenu.js";
6
+ import LayerNodeContent_default from "./LayerNodeContent.js";
6
7
  import LayerNodeTool_default from "./LayerNodeTool.js";
7
8
  import { useClick } from "./use-click.js";
8
9
  import { useDrag } from "./use-drag.js";
@@ -83,7 +84,7 @@ var LayerPanel_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
83
84
  }, {
84
85
  "tree-node-content": withCtx(({ data: nodeData }) => [renderSlot(_ctx.$slots, "layer-node-content", { data: nodeData })]),
85
86
  "tree-node-tool": withCtx(({ data: nodeData }) => [renderSlot(_ctx.$slots, "layer-node-tool", { data: nodeData }, () => [createVNode(LayerNodeTool_default, { data: nodeData }, null, 8, ["data"])])]),
86
- "tree-node-label": withCtx(({ data: nodeData }) => [renderSlot(_ctx.$slots, "layer-node-label", { data: nodeData })]),
87
+ "tree-node-label": withCtx(({ data: nodeData }) => [renderSlot(_ctx.$slots, "layer-node-label", { data: nodeData }, () => [createVNode(LayerNodeContent_default, { data: nodeData }, null, 8, ["data"])])]),
87
88
  _: 3
88
89
  }, 8, [
89
90
  "data",
@@ -11,7 +11,8 @@ var NodeListMenu_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
11
11
  __name: "NodeListMenu",
12
12
  setup(__props) {
13
13
  const services = useServices();
14
- const { editorService } = services;
14
+ const { editorService, uiService } = services;
15
+ const frameworkWidth = computed(() => uiService.get("frameworkRect")?.width || 0);
15
16
  const visible = ref(false);
16
17
  const buttonVisible = ref(false);
17
18
  const buttonEl = useTemplateRef("button");
@@ -71,6 +72,7 @@ var NodeListMenu_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
71
72
  visible: visible.value,
72
73
  "onUpdate:visible": _cache[1] || (_cache[1] = ($event) => visible.value = $event),
73
74
  title: "当前位置下的组件",
75
+ "framework-width": frameworkWidth.value,
74
76
  position: menuPosition.value
75
77
  }, {
76
78
  body: withCtx(() => [createVNode(Tree_default, {
@@ -80,7 +82,11 @@ var NodeListMenu_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
80
82
  onNodeClick: clickHandler
81
83
  }, null, 8, ["data", "node-status-map"])]),
82
84
  _: 1
83
- }, 8, ["visible", "position"])) : createCommentVNode("v-if", true)], 64);
85
+ }, 8, [
86
+ "visible",
87
+ "framework-width",
88
+ "position"
89
+ ])) : createCommentVNode("v-if", true)], 64);
84
90
  };
85
91
  }
86
92
  });
package/dist/es/plugin.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { setEditorConfig } from "./utils/config.js";
2
+ import { editorTypeMatchRules } from "./utils/type-match-rules.js";
2
3
  import CodeEditor_default from "./layouts/CodeEditor.js";
3
4
  import Editor_default from "./Editor.js";
4
5
  import CodeSelect_default from "./fields/CodeSelect.js";
@@ -20,7 +21,7 @@ import Code_default from "./fields/Code.js";
20
21
  import CodeLink_default from "./fields/CodeLink.js";
21
22
  import UISelect_default from "./fields/UISelect.js";
22
23
  /* empty css */
23
- import formPlugin from "@tmagic/form";
24
+ import formPlugin, { registerTypeMatchRules } from "@tmagic/form";
24
25
  import tablePlugin from "@tmagic/table";
25
26
  import designPlugin from "@tmagic/design";
26
27
  //#region packages/editor/src/plugin.ts
@@ -34,6 +35,7 @@ var plugin_default = { install: (app, opt) => {
34
35
  app.use(designPlugin, opt || {});
35
36
  app.use(formPlugin, opt || {});
36
37
  app.use(tablePlugin);
38
+ registerTypeMatchRules(editorTypeMatchRules);
37
39
  app.config.globalProperties.$TMAGIC_EDITOR = option;
38
40
  setEditorConfig(option);
39
41
  app.component(`${Editor_default.name || "MEditor"}`, Editor_default);
@@ -1,6 +1,6 @@
1
1
  import { CODE_DRAFT_STORAGE_KEY } from "../type.js";
2
- import BaseService from "./BaseService.js";
3
2
  import { getEditorConfig } from "../utils/config.js";
3
+ import BaseService from "./BaseService.js";
4
4
  import { createStackStep, describeRevertStep, getLastPushedHistoryIds } from "../utils/history.js";
5
5
  import history_default from "./history.js";
6
6
  import storage_default, { Protocol } from "./storage.js";