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

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 (127) hide show
  1. package/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +15 -3
  2. package/dist/es/components/ContentMenu.vue_vue_type_script_setup_true_lang.js +31 -8
  3. package/dist/es/components/FloatingBox.vue_vue_type_script_setup_true_lang.js +7 -2
  4. package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +15 -4
  5. package/dist/es/fields/CodeLink.vue_vue_type_script_setup_true_lang.js +4 -1
  6. package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +80 -55
  7. package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +5 -1
  8. package/dist/es/fields/CondOpSelect.vue_vue_type_script_setup_true_lang.js +4 -1
  9. package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +10 -7
  10. package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +4 -1
  11. package/dist/es/fields/DataSourceInput.vue_vue_type_script_setup_true_lang.js +4 -1
  12. package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +4 -1
  13. package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +4 -1
  14. package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +4 -1
  15. package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +4 -1
  16. package/dist/es/fields/DisplayConds.vue_vue_type_script_setup_true_lang.js +8 -2
  17. package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +99 -64
  18. package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +4 -1
  19. package/dist/es/fields/PageFragmentSelect.vue_vue_type_script_setup_true_lang.js +4 -1
  20. package/dist/es/fields/StyleSetter/Index.vue_vue_type_script_setup_true_lang.js +5 -4
  21. package/dist/es/fields/StyleSetter/components/BackgroundPosition.vue_vue_type_script_setup_true_lang.js +4 -1
  22. package/dist/es/fields/StyleSetter/components/Border.vue_vue_type_script_setup_true_lang.js +1 -1
  23. package/dist/es/fields/StyleSetter/icons/align-items/Center.js +31 -0
  24. package/dist/es/fields/StyleSetter/icons/align-items/FlexEnd.js +31 -0
  25. package/dist/es/fields/StyleSetter/icons/align-items/FlexStart.js +31 -0
  26. package/dist/es/fields/StyleSetter/icons/align-items/SpaceAround.js +50 -0
  27. package/dist/es/fields/StyleSetter/icons/align-items/SpaceBetween.js +50 -0
  28. package/dist/es/fields/StyleSetter/icons/background-repeat/NoRepeat.js +6 -6
  29. package/dist/es/fields/StyleSetter/icons/background-repeat/Repeat.js +5 -2
  30. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatX.js +28 -5
  31. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatY.js +31 -5
  32. package/dist/es/fields/StyleSetter/icons/flex-direction/Column.js +10 -2
  33. package/dist/es/fields/StyleSetter/icons/flex-direction/ColumnReverse.js +10 -2
  34. package/dist/es/fields/StyleSetter/icons/flex-direction/Row.js +10 -2
  35. package/dist/es/fields/StyleSetter/icons/flex-direction/RowReverse.js +10 -2
  36. package/dist/es/fields/StyleSetter/icons/justify-content/Center.js +16 -2
  37. package/dist/es/fields/StyleSetter/icons/justify-content/FlexEnd.js +18 -2
  38. package/dist/es/fields/StyleSetter/icons/justify-content/FlexStart.js +18 -2
  39. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceAround.js +36 -2
  40. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceBetween.js +32 -2
  41. package/dist/es/fields/StyleSetter/pro/Background.vue_vue_type_script_setup_true_lang.js +7 -6
  42. package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +6 -3
  43. package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +47 -25
  44. package/dist/es/fields/UISelect.vue_vue_type_script_setup_true_lang.js +4 -1
  45. package/dist/es/icons/DatasourceIcon.js +17 -0
  46. package/dist/es/index.js +2 -2
  47. package/dist/es/layouts/Framework.vue_vue_type_script_setup_true_lang.js +14 -10
  48. package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +13 -4
  49. package/dist/es/layouts/sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js +3 -3
  50. package/dist/es/plugin.js +2 -1
  51. package/dist/es/services/editor.js +86 -24
  52. package/dist/es/services/history.js +16 -0
  53. package/dist/es/services/ui.js +5 -3
  54. package/dist/es/style.css +307 -40
  55. package/dist/es/utils/config.js +4 -1
  56. package/dist/es/utils/const.js +2 -2
  57. package/dist/es/utils/data-source/index.js +4 -2
  58. package/dist/es/utils/props.js +43 -29
  59. package/dist/es/utils/type-match-rules.js +12 -5
  60. package/dist/style.css +307 -40
  61. package/dist/themes/magic-admin.css +3004 -0
  62. package/dist/tmagic-editor.umd.cjs +1161 -476
  63. package/package.json +7 -7
  64. package/src/Editor.vue +22 -1
  65. package/src/components/ContentMenu.vue +44 -8
  66. package/src/components/FloatingBox.vue +8 -2
  67. package/src/editorProps.ts +4 -0
  68. package/src/fields/Code.vue +10 -2
  69. package/src/fields/CodeSelect.vue +54 -43
  70. package/src/fields/CodeSelectCol.vue +1 -0
  71. package/src/fields/DataSourceFieldSelect/Index.vue +14 -5
  72. package/src/fields/DisplayConds.vue +4 -1
  73. package/src/fields/EventSelect.vue +56 -32
  74. package/src/fields/StyleSetter/Index.vue +1 -4
  75. package/src/fields/StyleSetter/components/Border.vue +1 -1
  76. package/src/fields/StyleSetter/icons/align-items/Center.vue +19 -0
  77. package/src/fields/StyleSetter/icons/align-items/FlexEnd.vue +19 -0
  78. package/src/fields/StyleSetter/icons/align-items/FlexStart.vue +19 -0
  79. package/src/fields/StyleSetter/icons/align-items/SpaceAround.vue +34 -0
  80. package/src/fields/StyleSetter/icons/align-items/SpaceBetween.vue +34 -0
  81. package/src/fields/StyleSetter/icons/align-items/index.ts +5 -0
  82. package/src/fields/StyleSetter/icons/background-repeat/NoRepeat.vue +20 -4
  83. package/src/fields/StyleSetter/icons/background-repeat/Repeat.vue +10 -28
  84. package/src/fields/StyleSetter/icons/background-repeat/RepeatX.vue +4 -5
  85. package/src/fields/StyleSetter/icons/background-repeat/RepeatY.vue +4 -5
  86. package/src/fields/StyleSetter/icons/flex-direction/Column.vue +4 -3
  87. package/src/fields/StyleSetter/icons/flex-direction/ColumnReverse.vue +4 -3
  88. package/src/fields/StyleSetter/icons/flex-direction/Row.vue +4 -3
  89. package/src/fields/StyleSetter/icons/flex-direction/RowReverse.vue +4 -3
  90. package/src/fields/StyleSetter/icons/justify-content/Center.vue +5 -2
  91. package/src/fields/StyleSetter/icons/justify-content/FlexEnd.vue +15 -2
  92. package/src/fields/StyleSetter/icons/justify-content/FlexStart.vue +15 -2
  93. package/src/fields/StyleSetter/icons/justify-content/SpaceAround.vue +28 -3
  94. package/src/fields/StyleSetter/icons/justify-content/SpaceBetween.vue +28 -2
  95. package/src/fields/StyleSetter/pro/Background.vue +7 -2
  96. package/src/fields/StyleSetter/pro/Font.vue +3 -3
  97. package/src/fields/StyleSetter/pro/Layout.vue +98 -28
  98. package/src/icons/DatasourceIcon.vue +7 -0
  99. package/src/index.ts +3 -0
  100. package/src/layouts/Framework.vue +7 -1
  101. package/src/layouts/props-panel/PropsPanel.vue +38 -12
  102. package/src/layouts/sidebar/Sidebar.vue +3 -3
  103. package/src/plugin.ts +3 -2
  104. package/src/services/editor.ts +76 -11
  105. package/src/services/history.ts +22 -1
  106. package/src/services/ui.ts +20 -5
  107. package/src/theme/code-block.scss +37 -0
  108. package/src/theme/common/var.scss +1 -1
  109. package/src/theme/component-list-panel.scss +2 -2
  110. package/src/theme/data-source-field.scss +4 -0
  111. package/src/theme/display-conds.scss +11 -0
  112. package/src/theme/event.scss +58 -4
  113. package/src/theme/framework.scss +4 -1
  114. package/src/theme/history-list-panel.scss +9 -9
  115. package/src/theme/nav-menu.scss +5 -1
  116. package/src/theme/props-panel.scss +2 -1
  117. package/src/theme/style-setter/border.scss +14 -5
  118. package/src/theme/theme.scss +1 -0
  119. package/src/theme/themes/magic-admin/index.scss +214 -0
  120. package/src/theme/ui-select.scss +1 -1
  121. package/src/type.ts +33 -6
  122. package/src/utils/config.ts +9 -1
  123. package/src/utils/const.ts +3 -2
  124. package/src/utils/data-source/index.ts +3 -3
  125. package/src/utils/props.ts +22 -9
  126. package/src/utils/type-match-rules.ts +11 -5
  127. package/types/index.d.ts +114 -35
@@ -5,10 +5,11 @@ export const LEFT_COLUMN_WIDTH_STORAGE_KEY = '$MagicEditorLeftColumnWidthData';
5
5
  export const RIGHT_COLUMN_WIDTH_STORAGE_KEY = '$MagicEditorRightColumnWidthData';
6
6
  export const PROPS_PANEL_WIDTH_STORAGE_KEY = '$MagicEditorPropsPanelWidthData';
7
7
 
8
- export const DEFAULT_LEFT_COLUMN_WIDTH = 310;
8
+ export const DEFAULT_LEFT_COLUMN_WIDTH = 345;
9
9
  export const DEFAULT_RIGHT_COLUMN_WIDTH = 480;
10
10
 
11
- export const MIN_LEFT_COLUMN_WIDTH = 200;
11
+ // 2026-06-11 设计稿修改,固定左侧栏存在时最小宽度为 345
12
+ export const MIN_LEFT_COLUMN_WIDTH = 345;
12
13
  export const MIN_CENTER_COLUMN_WIDTH = 400;
13
14
  export const MIN_RIGHT_COLUMN_WIDTH = 300;
14
15
 
@@ -243,7 +243,7 @@ export const resolveFieldByPath = (
243
243
  fields: DataSchema[] | undefined,
244
244
  fieldNames: string[],
245
245
  options: { skipNumberIndices?: boolean } = {},
246
- ): { ok: boolean; field?: DataSchema; fields: DataSchema[] } => {
246
+ ): { ok: boolean; field?: DataSchema; fields: DataSchema[]; failedName?: string } => {
247
247
  let currentFields = fields || [];
248
248
  let field: DataSchema | undefined;
249
249
 
@@ -252,11 +252,11 @@ export const resolveFieldByPath = (
252
252
  continue;
253
253
  }
254
254
  if (!currentFields.length) {
255
- return { ok: false, fields: currentFields };
255
+ return { ok: false, fields: currentFields, failedName: name };
256
256
  }
257
257
  field = currentFields.find((item) => item.name === name);
258
258
  if (!field) {
259
- return { ok: false, fields: currentFields };
259
+ return { ok: false, fields: currentFields, failedName: name };
260
260
  }
261
261
  currentFields = field.fields || [];
262
262
  }
@@ -180,6 +180,7 @@ export const advancedTabConfig: TabPaneConfig = {
180
180
  name: NODE_DISABLE_CODE_BLOCK_KEY,
181
181
  text: '禁用代码块',
182
182
  type: 'switch',
183
+ labelPosition: 'left',
183
184
  defaultValue: false,
184
185
  extra: '开启后,配置的代码块将不会被执行',
185
186
  },
@@ -187,15 +188,16 @@ export const advancedTabConfig: TabPaneConfig = {
187
188
  name: NODE_DISABLE_DATA_SOURCE_KEY,
188
189
  text: '禁用数据源',
189
190
  type: 'switch',
191
+ labelPosition: 'left',
190
192
  defaultValue: false,
191
193
  extra: '开启后,组件内配置的数据源相关配置将不会被编译,显隐条件将失效',
192
194
  },
193
195
  {
194
196
  name: 'created',
195
- text: 'created',
197
+ text: 'Created',
196
198
  labelPosition: 'top',
197
199
  type: 'code-select',
198
- extra: '组件初始化时执行',
200
+ titleExtra: '组件初始化时执行',
199
201
  rules: [
200
202
  { typeMatch: true, trigger: 'change' },
201
203
  {
@@ -210,10 +212,10 @@ export const advancedTabConfig: TabPaneConfig = {
210
212
  },
211
213
  {
212
214
  name: 'mounted',
213
- text: 'mounted',
215
+ text: 'Mounted',
214
216
  labelPosition: 'top',
215
217
  type: 'code-select',
216
- extra: '组件挂载到dom时执行',
218
+ titleExtra: '组件挂载到dom时执行',
217
219
  rules: [
218
220
  { typeMatch: true, trigger: 'change' },
219
221
  {
@@ -228,8 +230,8 @@ export const advancedTabConfig: TabPaneConfig = {
228
230
  },
229
231
  {
230
232
  name: 'display',
231
- text: 'display',
232
- extra: '控制组件是否渲染,关系的代码块返回值为false时不渲染',
233
+ text: 'Display',
234
+ titleExtra: '控制组件是否渲染,关系的代码块返回值为false时不渲染',
233
235
  labelPosition: 'top',
234
236
  type: 'code-select',
235
237
  rules: [
@@ -263,10 +265,17 @@ export const displayTabConfig: TabPaneConfig<DisplayCondsConfig> = {
263
265
  extra: (_state, { model }) =>
264
266
  `条件成立时${model[NODE_CONDS_RESULT_KEY] ? '隐藏' : '显示'},不成立时${model[NODE_CONDS_RESULT_KEY] ? '显示' : '隐藏'};<br />同一条件组内的所有条件配置同时成立时表示该条件组成立,任意一个条件组成立时表示条件成立(条件组内为且的关系,条件组间为或的关系);<br />条件为空时表示成立;`,
265
267
  },
268
+ {
269
+ text: '条件组配置',
270
+ static: true,
271
+ className: 'display-conds-title',
272
+ },
266
273
  {
267
274
  type: 'display-conds',
268
275
  name: NODE_CONDS_KEY,
269
276
  titlePrefix: '条件组',
277
+ fixed: 'right',
278
+ operateColWidth: 112,
270
279
  defaultValue: [],
271
280
  rules: [{ typeMatch: true }],
272
281
  },
@@ -303,10 +312,13 @@ export const fillConfig = (
303
312
  name: 'id',
304
313
  text: 'ID',
305
314
  type: 'text',
306
- disabled: true,
315
+ // 走纯文本渲染,避免出现 disabled 的灰底输入框;append 仍正常显示。
316
+ static: true,
317
+
307
318
  append: {
308
- type: 'button',
309
- text: '复制',
319
+ type: 'icon',
320
+ text: 'https://vip.image.video.qpic.cn/vupload/20260615/36cf7e1781493669935.svg',
321
+ extra: '复制',
310
322
  handler: (vm, { model }) => {
311
323
  navigator.clipboard
312
324
  .writeText(`${model.id}`)
@@ -339,6 +351,7 @@ export const fillConfig = (
339
351
  const tabConfig: TabConfig = {
340
352
  type: 'tab',
341
353
  labelWidth,
354
+ className: 'magic-right-panel-tabs-top',
342
355
  items: [
343
356
  {
344
357
  title: '属性',
@@ -20,6 +20,7 @@ import type { DataSourceFieldType, DataSourceSchema, Id } from '@tmagic/core';
20
20
  import { NodeType } from '@tmagic/core';
21
21
  import { appendValidateSuggestion } from '@tmagic/design';
22
22
  import type { TypeMatchValidateContext, TypeMatchValidator } from '@tmagic/form';
23
+ import { validateTypeMatch } from '@tmagic/form';
23
24
  import {
24
25
  DATA_SOURCE_FIELDS_SELECT_VALUE_PREFIX,
25
26
  DATA_SOURCE_SET_DATA_METHOD_NAME,
@@ -261,16 +262,20 @@ const validateDataSourceFieldPath = (
261
262
 
262
263
  const ds = findDataSource(`${dsId}`);
263
264
  if (!ds) {
264
- return defaultMessage(options.message, '值不在可选项中', dataSourceIdSuggestion());
265
+ return defaultMessage(options.message, `数据源(${dsId})不存在`, dataSourceIdSuggestion());
265
266
  }
266
267
 
267
268
  if (!fieldNames.length) {
268
269
  return undefined;
269
270
  }
270
271
 
271
- const { field, ok } = resolveFieldByPath(ds.fields, fieldNames);
272
+ const { field, ok, fields, failedName } = resolveFieldByPath(ds.fields, fieldNames);
272
273
  if (!ok) {
273
- return defaultMessage(options.message, '值不在可选项中', dataSourceIdSuggestion());
274
+ return defaultMessage(
275
+ options.message,
276
+ `数据源字段(${failedName})不存在`,
277
+ listSuggestion(fields.map((item) => item.name)),
278
+ );
274
279
  }
275
280
 
276
281
  const allowedTypes = options.dataSourceFieldType || ['any'];
@@ -471,11 +476,12 @@ const isDataSourceFieldPathValue = (value: any, config: any): value is string[]
471
476
  return `${value[0]}`.startsWith(DATA_SOURCE_FIELDS_SELECT_VALUE_PREFIX);
472
477
  };
473
478
 
474
- const validateDataSourceFieldSelect: TypeMatchValidator = (value, { message, props }) => {
479
+ const validateDataSourceFieldSelect: TypeMatchValidator = (value, { mForm, message, props }) => {
475
480
  const config = props.config || {};
476
481
 
477
482
  if (config.fieldConfig && !isDataSourceFieldPathValue(value, config)) {
478
- return undefined;
483
+ // 值不是数据源字段路径时,按 fieldConfig 的类型校验(与表单项自身 typeMatch 行为一致)
484
+ return validateTypeMatch(value, mForm, { ...props, config: { name: config.name, ...config.fieldConfig } }, message);
479
485
  }
480
486
 
481
487
  if (!Array.isArray(value) || value.some((item) => typeof item !== 'string')) {