@tmagic/editor 1.8.0-manmanyu.9 → 1.8.0

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 (279) hide show
  1. package/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +22 -13
  2. package/dist/es/components/CodeBlockEditor.vue_vue_type_script_setup_true_lang.js +10 -5
  3. package/dist/es/components/CodeParams.vue_vue_type_script_setup_true_lang.js +7 -6
  4. package/dist/es/components/CompareForm.vue_vue_type_script_setup_true_lang.js +21 -122
  5. package/dist/es/components/ContentMenu.vue_vue_type_script_setup_true_lang.js +21 -5
  6. package/dist/es/components/FloatingBox.vue_vue_type_script_setup_true_lang.js +62 -16
  7. package/dist/es/components/Icon.vue_vue_type_script_setup_true_lang.js +1 -1
  8. package/dist/es/components/Resizer.vue_vue_type_script_setup_true_lang.js +3 -2
  9. package/dist/es/components/ScrollBar.js +0 -1
  10. package/dist/es/components/ScrollBar.vue_vue_type_script_setup_true_lang.js +5 -4
  11. package/dist/es/components/ScrollViewer.vue_vue_type_script_setup_true_lang.js +1 -1
  12. package/dist/es/components/SearchInput.vue_vue_type_script_setup_true_lang.js +1 -1
  13. package/dist/es/components/SplitView.vue_vue_type_script_setup_true_lang.js +1 -1
  14. package/dist/es/components/ToolButton.vue_vue_type_script_setup_true_lang.js +1 -1
  15. package/dist/es/components/Tree.vue_vue_type_script_setup_true_lang.js +1 -1
  16. package/dist/es/components/TreeNode.vue_vue_type_script_setup_true_lang.js +1 -1
  17. package/dist/es/components/ViewForm.js +5 -0
  18. package/dist/es/components/ViewForm.vue_vue_type_script_setup_true_lang.js +56 -0
  19. package/dist/es/editorProps.js +7 -1
  20. package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +1 -1
  21. package/dist/es/fields/CodeLink.vue_vue_type_script_setup_true_lang.js +1 -1
  22. package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +30 -113
  23. package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +2 -2
  24. package/dist/es/fields/CondOpSelect.vue_vue_type_script_setup_true_lang.js +7 -19
  25. package/dist/es/fields/DataSourceFieldSelect/FieldSelect.vue_vue_type_script_setup_true_lang.js +7 -6
  26. package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +4 -2
  27. package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +12 -4
  28. package/dist/es/fields/DataSourceInput.vue_vue_type_script_setup_true_lang.js +9 -20
  29. package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +2 -2
  30. package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +5 -3
  31. package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +9 -4
  32. package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +2 -2
  33. package/dist/es/fields/DisplayConds.vue_vue_type_script_setup_true_lang.js +10 -110
  34. package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +52 -363
  35. package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +1 -1
  36. package/dist/es/fields/PageFragmentSelect.vue_vue_type_script_setup_true_lang.js +1 -1
  37. package/dist/es/fields/StyleSetter/Index.vue_vue_type_script_setup_true_lang.js +3 -6
  38. package/dist/es/fields/StyleSetter/components/BackgroundPosition.vue_vue_type_script_setup_true_lang.js +1 -1
  39. package/dist/es/fields/StyleSetter/components/Border.vue_vue_type_script_setup_true_lang.js +4 -35
  40. package/dist/es/fields/StyleSetter/components/Box.vue_vue_type_script_setup_true_lang.js +3 -3
  41. package/dist/es/fields/StyleSetter/configs.js +663 -0
  42. package/dist/es/fields/StyleSetter/icons/align-items/Center.js +1 -1
  43. package/dist/es/fields/StyleSetter/icons/align-items/FlexEnd.js +1 -1
  44. package/dist/es/fields/StyleSetter/icons/align-items/FlexStart.js +1 -1
  45. package/dist/es/fields/StyleSetter/icons/align-items/SpaceAround.js +1 -1
  46. package/dist/es/fields/StyleSetter/icons/align-items/SpaceBetween.js +1 -1
  47. package/dist/es/fields/StyleSetter/icons/background-repeat/NoRepeat.js +1 -1
  48. package/dist/es/fields/StyleSetter/icons/background-repeat/Repeat.js +1 -1
  49. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatX.js +1 -1
  50. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatY.js +1 -1
  51. package/dist/es/fields/StyleSetter/icons/display/Block.js +1 -1
  52. package/dist/es/fields/StyleSetter/icons/display/Flex.js +1 -1
  53. package/dist/es/fields/StyleSetter/icons/display/Inline.js +1 -1
  54. package/dist/es/fields/StyleSetter/icons/display/InlineBlock.js +1 -1
  55. package/dist/es/fields/StyleSetter/icons/display/None.js +1 -1
  56. package/dist/es/fields/StyleSetter/icons/flex-direction/Column.js +1 -1
  57. package/dist/es/fields/StyleSetter/icons/flex-direction/ColumnReverse.js +1 -1
  58. package/dist/es/fields/StyleSetter/icons/flex-direction/Row.js +1 -1
  59. package/dist/es/fields/StyleSetter/icons/flex-direction/RowReverse.js +1 -1
  60. package/dist/es/fields/StyleSetter/icons/justify-content/Center.js +1 -1
  61. package/dist/es/fields/StyleSetter/icons/justify-content/FlexEnd.js +1 -1
  62. package/dist/es/fields/StyleSetter/icons/justify-content/FlexStart.js +1 -1
  63. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceAround.js +1 -1
  64. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceBetween.js +1 -1
  65. package/dist/es/fields/StyleSetter/icons/text-align/Center.js +1 -1
  66. package/dist/es/fields/StyleSetter/icons/text-align/Left.js +1 -1
  67. package/dist/es/fields/StyleSetter/icons/text-align/Right.js +1 -1
  68. package/dist/es/fields/StyleSetter/pro/Background.vue_vue_type_script_setup_true_lang.js +29 -106
  69. package/dist/es/fields/StyleSetter/pro/Border.vue_vue_type_script_setup_true_lang.js +8 -11
  70. package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +30 -89
  71. package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +29 -297
  72. package/dist/es/fields/StyleSetter/pro/Position.vue_vue_type_script_setup_true_lang.js +29 -82
  73. package/dist/es/fields/StyleSetter/pro/Transform.vue_vue_type_script_setup_true_lang.js +8 -24
  74. package/dist/es/fields/UISelect.js +0 -1
  75. package/dist/es/fields/UISelect.vue_vue_type_script_setup_true_lang.js +1 -1
  76. package/dist/es/fields/configs/codeSelect.js +98 -0
  77. package/dist/es/fields/configs/displayConds.js +158 -0
  78. package/dist/es/fields/configs/eventSelect.js +225 -0
  79. package/dist/es/fields/configs/stickyAddButton.js +21 -0
  80. package/dist/es/fields/headless-validation.js +139 -0
  81. package/dist/es/headless.js +2 -0
  82. package/dist/es/hooks/use-code-block-edit.js +4 -2
  83. package/dist/es/hooks/use-compare-form.js +101 -0
  84. package/dist/es/hooks/use-form-context.js +29 -0
  85. package/dist/es/hooks/use-stage.js +1 -0
  86. package/dist/es/icons/CenterIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  87. package/dist/es/icons/CodeIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  88. package/dist/es/icons/DatasourceIcon.js +1 -1
  89. package/dist/es/icons/FolderMinusIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  90. package/dist/es/index.js +16 -8
  91. package/dist/es/initService.js +52 -16
  92. package/dist/es/layouts/AddPageBox.vue_vue_type_script_setup_true_lang.js +1 -1
  93. package/dist/es/layouts/CodeEditor.vue_vue_type_script_setup_true_lang.js +26 -10
  94. package/dist/es/layouts/Framework.vue_vue_type_script_setup_true_lang.js +11 -8
  95. package/dist/es/layouts/NavMenu.vue_vue_type_script_setup_true_lang.js +1 -1
  96. package/dist/es/layouts/NavMenuColumn.vue_vue_type_script_setup_true_lang.js +1 -1
  97. package/dist/es/layouts/history-list/Bucket.vue_vue_type_script_setup_true_lang.js +1 -1
  98. package/dist/es/layouts/history-list/BucketTab.vue_vue_type_script_setup_true_lang.js +8 -5
  99. package/dist/es/layouts/history-list/GroupRow.vue_vue_type_script_setup_true_lang.js +1 -1
  100. package/dist/es/layouts/history-list/HistoryDiffDialog.vue_vue_type_script_setup_true_lang.js +26 -10
  101. package/dist/es/layouts/history-list/HistoryListPanel.vue_vue_type_script_setup_true_lang.js +11 -13
  102. package/dist/es/layouts/history-list/InitialRow.vue_vue_type_script_setup_true_lang.js +1 -1
  103. package/dist/es/layouts/history-list/PageTab.vue_vue_type_script_setup_true_lang.js +1 -1
  104. package/dist/es/layouts/history-list/composables.js +1 -1
  105. package/dist/es/layouts/history-list/useHistoryRevert.js +38 -33
  106. package/dist/es/layouts/page-bar/AddButton.vue_vue_type_script_setup_true_lang.js +1 -1
  107. package/dist/es/layouts/page-bar/PageBar.vue_vue_type_script_setup_true_lang.js +1 -1
  108. package/dist/es/layouts/page-bar/PageBarScrollContainer.vue_vue_type_script_setup_true_lang.js +1 -1
  109. package/dist/es/layouts/page-bar/PageList.vue_vue_type_script_setup_true_lang.js +1 -1
  110. package/dist/es/layouts/page-bar/Search.vue_vue_type_script_setup_true_lang.js +2 -2
  111. package/dist/es/layouts/props-panel/FormPanel.vue_vue_type_script_setup_true_lang.js +50 -20
  112. package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +53 -35
  113. package/dist/es/layouts/props-panel/use-style-panel.js +3 -2
  114. package/dist/es/layouts/sidebar/ComponentListPanel.vue_vue_type_script_setup_true_lang.js +3 -3
  115. package/dist/es/layouts/sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js +21 -36
  116. package/dist/es/layouts/sidebar/code-block/CodeBlockList.vue_vue_type_script_setup_true_lang.js +1 -1
  117. package/dist/es/layouts/sidebar/code-block/CodeBlockListPanel.vue_vue_type_script_setup_true_lang.js +4 -4
  118. package/dist/es/layouts/sidebar/code-block/useContentMenu.js +19 -4
  119. package/dist/es/layouts/sidebar/data-source/DataSourceAddButton.vue_vue_type_script_setup_true_lang.js +1 -1
  120. package/dist/es/layouts/sidebar/data-source/DataSourceConfigPanel.vue_vue_type_script_setup_true_lang.js +9 -4
  121. package/dist/es/layouts/sidebar/data-source/DataSourceList.vue_vue_type_script_setup_true_lang.js +1 -1
  122. package/dist/es/layouts/sidebar/data-source/DataSourceListPanel.vue_vue_type_script_setup_true_lang.js +4 -4
  123. package/dist/es/layouts/sidebar/data-source/useContentMenu.js +19 -4
  124. package/dist/es/layouts/sidebar/layer/LayerMenu.vue_vue_type_script_setup_true_lang.js +3 -3
  125. package/dist/es/layouts/sidebar/layer/LayerNodeContent.js +5 -0
  126. package/dist/es/layouts/sidebar/layer/LayerNodeContent.vue_vue_type_script_setup_true_lang.js +46 -0
  127. package/dist/es/layouts/sidebar/layer/LayerNodeTool.vue_vue_type_script_setup_true_lang.js +1 -1
  128. package/dist/es/layouts/sidebar/layer/LayerPanel.vue_vue_type_script_setup_true_lang.js +6 -4
  129. package/dist/es/layouts/sidebar/layer/use-click.js +3 -3
  130. package/dist/es/layouts/sidebar/layer/use-drag.js +11 -10
  131. package/dist/es/layouts/sidebar/layer/use-node-status.js +2 -2
  132. package/dist/es/layouts/workspace/Breadcrumb.vue_vue_type_script_setup_true_lang.js +1 -1
  133. package/dist/es/layouts/workspace/Workspace.vue_vue_type_script_setup_true_lang.js +1 -1
  134. package/dist/es/layouts/workspace/viewer/NodeListMenu.vue_vue_type_script_setup_true_lang.js +9 -3
  135. package/dist/es/layouts/workspace/viewer/Stage.vue_vue_type_script_setup_true_lang.js +55 -9
  136. package/dist/es/layouts/workspace/viewer/StageOverlay.vue_vue_type_script_setup_true_lang.js +1 -1
  137. package/dist/es/layouts/workspace/viewer/ViewerMenu.vue_vue_type_script_setup_true_lang.js +8 -8
  138. package/dist/es/plugin.js +35 -23
  139. package/dist/es/services/codeBlock.js +8 -3
  140. package/dist/es/services/dataSource.js +3 -0
  141. package/dist/es/services/dep.js +162 -41
  142. package/dist/es/services/editor.js +344 -113
  143. package/dist/es/services/events.js +4 -4
  144. package/dist/es/services/history.js +17 -1
  145. package/dist/es/services/keybinding.js +3 -3
  146. package/dist/es/services/props.js +2 -1
  147. package/dist/es/services/storage.js +2 -2
  148. package/dist/es/services/ui.js +7 -2
  149. package/dist/es/style.css +277 -114
  150. package/dist/es/utils/code-block.js +14 -7
  151. package/dist/es/utils/config.js +4 -1
  152. package/dist/es/utils/const.js +2 -2
  153. package/dist/es/utils/content-menu.js +2 -2
  154. package/dist/es/utils/data-source/index.js +34 -12
  155. package/dist/es/utils/dep/collect-worker-client.js +154 -0
  156. package/dist/es/utils/dep/idle-task.js +70 -22
  157. package/dist/es/utils/dep/worker.js +1 -1
  158. package/dist/es/utils/editor.js +4 -2
  159. package/dist/es/utils/event.js +135 -0
  160. package/dist/es/utils/monaco-editor.js +22 -6
  161. package/dist/es/utils/operator.js +2 -2
  162. package/dist/es/utils/props.js +50 -106
  163. package/dist/es/utils/type-match-rules.js +356 -0
  164. package/dist/style.css +277 -114
  165. package/dist/themes/magic-admin.css +978 -175
  166. package/dist/tmagic-editor-headless.umd.cjs +10880 -0
  167. package/dist/tmagic-editor.umd.cjs +12695 -10896
  168. package/package.json +18 -13
  169. package/src/Editor.vue +23 -6
  170. package/src/components/CodeBlockEditor.vue +3 -0
  171. package/src/components/CodeParams.vue +10 -4
  172. package/src/components/CompareForm.vue +20 -190
  173. package/src/components/ContentMenu.vue +34 -6
  174. package/src/components/FloatingBox.vue +71 -7
  175. package/src/components/ScrollBar.vue +0 -67
  176. package/src/components/ViewForm.vue +54 -0
  177. package/src/editorProps.ts +23 -10
  178. package/src/fields/Code.vue +1 -1
  179. package/src/fields/CodeSelect.vue +20 -113
  180. package/src/fields/CodeSelectCol.vue +1 -1
  181. package/src/fields/CondOpSelect.vue +5 -26
  182. package/src/fields/DataSourceFieldSelect/FieldSelect.vue +2 -2
  183. package/src/fields/DataSourceFieldSelect/Index.vue +4 -1
  184. package/src/fields/DataSourceFields.vue +5 -1
  185. package/src/fields/DataSourceInput.vue +10 -28
  186. package/src/fields/DataSourceMethodSelect.vue +1 -1
  187. package/src/fields/DataSourceMethods.vue +6 -2
  188. package/src/fields/DataSourceMocks.vue +3 -0
  189. package/src/fields/DataSourceSelect.vue +1 -1
  190. package/src/fields/DisplayConds.vue +17 -139
  191. package/src/fields/EventSelect.vue +29 -416
  192. package/src/fields/KeyValue.vue +1 -1
  193. package/src/fields/StyleSetter/Index.vue +2 -8
  194. package/src/fields/StyleSetter/components/Border.vue +4 -38
  195. package/src/fields/StyleSetter/components/Box.vue +1 -1
  196. package/src/fields/StyleSetter/components/Position.vue +1 -1
  197. package/src/fields/StyleSetter/configs.ts +690 -0
  198. package/src/fields/StyleSetter/pro/Background.vue +9 -64
  199. package/src/fields/StyleSetter/pro/Border.vue +5 -16
  200. package/src/fields/StyleSetter/pro/Font.vue +11 -71
  201. package/src/fields/StyleSetter/pro/Layout.vue +10 -230
  202. package/src/fields/StyleSetter/pro/Position.vue +11 -82
  203. package/src/fields/StyleSetter/pro/Transform.vue +6 -34
  204. package/src/fields/UISelect.vue +0 -12
  205. package/src/fields/configs/codeSelect.ts +127 -0
  206. package/src/fields/configs/displayConds.ts +184 -0
  207. package/src/fields/configs/eventSelect.ts +309 -0
  208. package/src/fields/configs/stickyAddButton.ts +32 -0
  209. package/src/fields/headless-validation.ts +177 -0
  210. package/src/headless.ts +33 -0
  211. package/src/hooks/index.ts +1 -0
  212. package/src/hooks/use-compare-form.ts +166 -0
  213. package/src/hooks/use-form-context.ts +56 -0
  214. package/src/hooks/use-stage.ts +1 -0
  215. package/src/index.ts +9 -0
  216. package/src/initService.ts +73 -18
  217. package/src/layouts/CodeEditor.vue +32 -6
  218. package/src/layouts/Framework.vue +7 -6
  219. package/src/layouts/history-list/BucketTab.vue +2 -2
  220. package/src/layouts/history-list/HistoryDiffDialog.vue +33 -15
  221. package/src/layouts/history-list/HistoryListPanel.vue +16 -18
  222. package/src/layouts/history-list/useHistoryRevert.ts +57 -41
  223. package/src/layouts/props-panel/FormPanel.vue +75 -20
  224. package/src/layouts/props-panel/PropsPanel.vue +81 -30
  225. package/src/layouts/props-panel/use-style-panel.ts +4 -3
  226. package/src/layouts/sidebar/ComponentListPanel.vue +6 -2
  227. package/src/layouts/sidebar/Sidebar.vue +5 -3
  228. package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +5 -2
  229. package/src/layouts/sidebar/code-block/useContentMenu.ts +14 -2
  230. package/src/layouts/sidebar/data-source/DataSourceConfigPanel.vue +3 -0
  231. package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +3 -3
  232. package/src/layouts/sidebar/data-source/useContentMenu.ts +14 -2
  233. package/src/layouts/sidebar/layer/LayerMenu.vue +2 -2
  234. package/src/layouts/sidebar/layer/LayerNodeContent.vue +57 -0
  235. package/src/layouts/sidebar/layer/LayerPanel.vue +5 -2
  236. package/src/layouts/sidebar/layer/use-click.ts +3 -3
  237. package/src/layouts/sidebar/layer/use-node-status.ts +2 -2
  238. package/src/layouts/workspace/viewer/NodeListMenu.vue +4 -1
  239. package/src/layouts/workspace/viewer/Stage.vue +80 -10
  240. package/src/layouts/workspace/viewer/ViewerMenu.vue +7 -7
  241. package/src/plugin.ts +35 -25
  242. package/src/services/codeBlock.ts +4 -0
  243. package/src/services/dataSource.ts +3 -0
  244. package/src/services/dep.ts +292 -47
  245. package/src/services/editor.ts +383 -120
  246. package/src/services/events.ts +8 -7
  247. package/src/services/history.ts +22 -1
  248. package/src/services/keybinding.ts +3 -3
  249. package/src/services/ui.ts +26 -5
  250. package/src/theme/code-block.scss +0 -37
  251. package/src/theme/display-conds.scss +4 -0
  252. package/src/theme/event.scss +25 -33
  253. package/src/theme/floating-box.scss +9 -1
  254. package/src/theme/framework.scss +4 -1
  255. package/src/theme/layer-node-content.scss +14 -0
  256. package/src/theme/nav-menu.scss +5 -1
  257. package/src/theme/props-panel.scss +17 -3
  258. package/src/theme/scroll-bar.scss +64 -0
  259. package/src/theme/theme.scss +3 -0
  260. package/src/theme/themes/magic-admin/index.scss +109 -9
  261. package/src/theme/ui-select.scss +9 -0
  262. package/src/type.ts +216 -6
  263. package/src/utils/code-block.ts +1 -0
  264. package/src/utils/config.ts +9 -1
  265. package/src/utils/const.ts +3 -3
  266. package/src/utils/content-menu.ts +2 -2
  267. package/src/utils/data-source/index.ts +31 -12
  268. package/src/utils/dep/collect-worker-client.ts +215 -0
  269. package/src/utils/dep/idle-task.ts +104 -35
  270. package/src/utils/dep/worker.ts +113 -9
  271. package/src/utils/event.ts +237 -0
  272. package/src/utils/index.ts +2 -0
  273. package/src/utils/monaco-editor.ts +27 -0
  274. package/src/utils/operator.ts +2 -2
  275. package/src/utils/props.ts +61 -122
  276. package/src/utils/type-match-rules.ts +697 -0
  277. package/types/headless.d.ts +17 -0
  278. package/types/index.d.ts +1199 -724
  279. package/src/fields/StyleSetter/icons/align-items/index copy.ts +0 -5
package/src/type.ts CHANGED
@@ -33,7 +33,8 @@ import type {
33
33
  MPage,
34
34
  MPageFragment,
35
35
  } from '@tmagic/core';
36
- import type { ChangeRecord, FormConfig, FormState, TableColumnConfig, TypeFunction } from '@tmagic/form';
36
+ import type { FieldSize } from '@tmagic/design';
37
+ import type { ChangeRecord, FormConfig, TableColumnConfig, TypeFunction } from '@tmagic/form';
37
38
  import type StageCore from '@tmagic/stage';
38
39
  import type {
39
40
  CanDropIn,
@@ -76,7 +77,7 @@ export interface FrameworkSlots {
76
77
  empty(props: {}): any;
77
78
  workspace(props: {}): any;
78
79
  'props-panel'(props: {}): any;
79
- 'footer'(props: {}): any;
80
+ footer(props: {}): any;
80
81
  'page-bar'(props: {}): any;
81
82
  'page-bar-add-button'(props: {}): any;
82
83
  'page-bar-title'(props: { page: MPage | MPageFragment }): any;
@@ -139,6 +140,7 @@ export type BeforeAdd = (config: MNode, parent: MContainer) => Promise<MNode> |
139
140
  export type GetConfig = (config: FormConfig) => Promise<FormConfig> | FormConfig;
140
141
 
141
142
  export interface EditorInstallOptions {
143
+ flat?: boolean;
142
144
  parseDSL: <T = any>(dsl: string) => T;
143
145
  customCreateMonacoEditor: (
144
146
  monaco: typeof import('monaco-editor'),
@@ -170,12 +172,26 @@ export interface Services {
170
172
  }
171
173
  // #endregion Services
172
174
 
175
+ declare module '@tmagic/form-schema' {
176
+ interface FormContext {
177
+ /** 编辑器服务集合(由 Editor / FormPanel provide) */
178
+ services?: Services;
179
+ /** 当前画布 Stage 实例(由 Editor / FormPanel provide) */
180
+ stage?: any;
181
+ }
182
+ }
183
+
173
184
  export interface StageOptions {
174
185
  runtimeUrl?: string;
175
186
  autoScrollIntoView?: boolean;
176
187
  containerHighlightClassName?: string;
177
188
  containerHighlightDuration?: number;
178
189
  containerHighlightType?: ContainerHighlightType;
190
+ /**
191
+ * 是否仅在新增组件(从组件列表拖入新组件)时才启用识别容器,
192
+ * 开启后在画布中拖动已有组件不会识别容器,默认 false
193
+ */
194
+ containerHighlightAddOnly?: boolean;
179
195
  disabledDragStart?: boolean;
180
196
  render?: (stage: StageCore) => HTMLDivElement | void | Promise<HTMLDivElement | void>;
181
197
  moveableOptions?: CustomizeMoveableOptions;
@@ -209,6 +225,26 @@ export interface StageOptions {
209
225
  beforeDblclick?: (event: MouseEvent) => Promise<boolean | void> | boolean | void;
210
226
  }
211
227
 
228
+ // #region NodeInvalidInfo
229
+ /**
230
+ * 节点校验错误信息,按来源(属性表单 / 样式表单)分别保存错误文案。
231
+ * 属性表单与样式表单是两个独立的 FormPanel,均指向同一节点,故以来源为键,
232
+ * 避免某个面板校验通过时误清另一个面板记录的错误。
233
+ * 节点视为存在错误当且仅当任一来源存在非空文本。
234
+ */
235
+ export interface NodeInvalidInfo {
236
+ /** 属性表单校验错误文案(可能为包含 <br> 的 HTML) */
237
+ props?: string;
238
+ /** 样式表单校验错误文案(可能为包含 <br> 的 HTML) */
239
+ style?: string;
240
+ }
241
+ // #endregion NodeInvalidInfo
242
+
243
+ // #region NodeInvalidSource
244
+ /** 节点校验错误来源 */
245
+ export type NodeInvalidSource = keyof NodeInvalidInfo;
246
+ // #endregion NodeInvalidSource
247
+
212
248
  export interface StoreState {
213
249
  root: MApp | null;
214
250
  page: MPage | MPageFragment | null;
@@ -219,6 +255,8 @@ export interface StoreState {
219
255
  stage: StageCore | null;
220
256
  stageLoading: boolean;
221
257
  modifiedNodeIds: Map<Id, Id>;
258
+ /** 校验失败的节点错误信息,按节点 id 存储,供组件树标记与保存拦截读取 */
259
+ invalidNodeIds: Map<Id, NodeInvalidInfo>;
222
260
  pageLength: number;
223
261
  pageFragmentLength: number;
224
262
  disabledMultiSelect: boolean;
@@ -278,6 +316,7 @@ export interface StageRect {
278
316
  height: number | string;
279
317
  }
280
318
 
319
+ // #region UiState
281
320
  export interface UiState {
282
321
  /** 当前点击画布是否触发选中,true: 不触发,false: 触发,默认为false */
283
322
  uiSelectMode: boolean;
@@ -296,6 +335,12 @@ export interface UiState {
296
335
  stageRect: StageRect;
297
336
  /** 编辑器列布局每一列的宽度,分为左中右三列 */
298
337
  columnWidth: GetColumnWidth;
338
+ /** 编辑器列布局左侧列最小宽度 */
339
+ minLeftColumnWidth: number;
340
+ /** 编辑器列布局中间列最小宽度 */
341
+ minCenterColumnWidth: number;
342
+ /** 编辑器列布局右侧列最小宽度 */
343
+ minRightColumnWidth: number;
299
344
  /** 是否显示画布参考线,true: 显示,false: 不显示,默认为true */
300
345
  showGuides: boolean;
301
346
  /** 画布上是否存在参考线 */
@@ -329,6 +374,7 @@ export interface UiState {
329
374
  height: number;
330
375
  };
331
376
  }
377
+ // #endregion UiState
332
378
 
333
379
  // #region EditorNodeInfo
334
380
  export interface EditorNodeInfo {
@@ -541,6 +587,46 @@ export interface CompareFormLoadConfigContext {
541
587
  * 可通过 `ctx.defaultLoadConfig()` 复用默认结果再做二次加工。
542
588
  */
543
589
  export type CompareFormLoadConfig = (ctx: CompareFormLoadConfigContext) => FormConfig | Promise<FormConfig>;
590
+
591
+ /**
592
+ * CompareForm / ViewForm 共用的基础 props。
593
+ * 两者都基于同一套「按 category 加载 FormConfig + 注入 services/stage」的逻辑(见 useCompareForm),
594
+ * 差异仅在于是否做新旧值对比。这里抽出公共字段避免重复定义。
595
+ */
596
+ export interface CompareFormBaseProps {
597
+ /** 当前值(对比场景下为修改后的值) */
598
+ value: Partial<MNode> | Partial<DataSourceSchema> | Partial<CodeBlockContent> | Record<string, any>;
599
+ /**
600
+ * 类型说明:
601
+ * - `category` 为 `node` 时,`type` 为节点组件的类型,例如 'text'、'button'、'page'、'container' 等
602
+ * - `category` 为 `data-source` 时,`type` 为数据源类型,例如 'base'、'http'
603
+ * - `category` 为 `code-block` 时,`type` 可不传
604
+ */
605
+ type?: string;
606
+ /** 表单配置类别,决定从哪里取 FormConfig */
607
+ category?: CompareCategory;
608
+ /** 数据源代码块场景下的数据源类型(base/http),用于代码块表单中"执行时机"展示 */
609
+ dataSourceType?: string;
610
+ labelWidth?: string;
611
+ /**
612
+ * 外层容器高度。设置后表单内容超出时会在组件内部出现滚动条,
613
+ * 避免 dialog / 面板使用方需要自行处理滚动。可传任意 CSS 长度,例如 `60vh` / `400px` / `100%`。
614
+ */
615
+ height?: string;
616
+ /**
617
+ * 表单内组件的尺寸(透传给 MForm 的 `size`),可选 'large' | 'default' | 'small'。
618
+ * 缺省时使用 MForm 内置默认尺寸。
619
+ */
620
+ size?: FieldSize;
621
+ /**
622
+ * 自定义 FormConfig 加载逻辑。传入后将接管内置的按 `category`(node/data-source/code-block)
623
+ * 取配置逻辑,调用方可根据业务自行返回(或异步返回)表单配置。可通过
624
+ * `ctx.defaultLoadConfig()` 复用默认结果再做二次加工。
625
+ */
626
+ loadConfig?: CompareFormLoadConfig;
627
+ /** 编辑器服务集合,由调用方传入(不再通过 inject('services') 获取)。 */
628
+ services?: Services;
629
+ }
544
630
  // #endregion CompareForm
545
631
 
546
632
  // #region SideItemKey
@@ -844,6 +930,10 @@ export interface StepExtra {
844
930
  selectedAfter?: Id[];
845
931
  /** 本次操作涉及的节点 id 集合(page 类型) */
846
932
  modifiedNodeIds?: Map<Id, Id>;
933
+ /** 操作前的节点校验错误快照,撤销后还原(使撤销一个「校验失败」的改动后错误消失) */
934
+ invalidNodeIdsBefore?: Map<Id, NodeInvalidInfo>;
935
+ /** 操作后的节点校验错误快照,重做后还原(使重做后错误恢复) */
936
+ invalidNodeIdsAfter?: Map<Id, NodeInvalidInfo>;
847
937
  [key: string]: any;
848
938
  }
849
939
  // #endregion StepExtra
@@ -1200,9 +1290,24 @@ export interface PageBarSortOptions extends PartSortableOptions {
1200
1290
  }
1201
1291
  // #endregion PageBarSortOptions
1202
1292
 
1293
+ /**
1294
+ * 右键菜单当前目标(侧栏树节点等)。
1295
+ * 数据源 / 代码块面板通过 `customContentMenu` 的 `getTarget` 暴露,业务在 handler 内自行读取。
1296
+ */
1297
+ export interface ContentMenuTarget {
1298
+ /** 目标 ID */
1299
+ id: string;
1300
+ /** 原始节点数据(树节点等) */
1301
+ data?: TreeNodeData;
1302
+ }
1303
+
1304
+ export type ContentMenuType = 'layer' | 'data-source' | 'viewer' | 'code-block';
1305
+
1203
1306
  export type CustomContentMenuFunction = (
1204
1307
  menus: (MenuButton | MenuComponent)[],
1205
- type: 'layer' | 'data-source' | 'viewer' | 'code-block',
1308
+ type: ContentMenuType,
1309
+ /** 读取当前右键目标;数据源 / 代码块面板会传入,图层 / 画布一般不需要 */
1310
+ getTarget?: () => ContentMenuTarget | null,
1206
1311
  ) => (MenuButton | MenuComponent)[];
1207
1312
 
1208
1313
  export interface EditorEvents {
@@ -1218,8 +1323,63 @@ export interface EditorEvents {
1218
1323
  'move-layer': [offset: number | LayerOffset];
1219
1324
  'drag-to': [data: { targetIndex: number; configs: MNode | MNode[]; targetParent: MContainer }];
1220
1325
  'history-change': [data: MPage | MPageFragment];
1326
+ /**
1327
+ * DSL 发生变更后统一触发,免去分别监听 add / remove / update / move-layer / drag-to。
1328
+ * 回调参数为 {@link EditorChangeEvent},按 `type` 区分操作类型并携带各自的操作内容(payload)
1329
+ * 以及变更所在的当前 page(可能为 null)。撤销 / 重做内部同样会经由
1330
+ * add / remove / update 触发本事件;如需区分「用户操作」与「撤销重做」请配合 `history-change`。
1331
+ */
1332
+ change: [event: EditorChangeEvent];
1333
+ /** 节点校验错误状态发生变化时触发,携带当前完整的错误 Map(供非响应式消费方订阅) */
1334
+ 'invalid-node-change': [invalidNodeIds: Map<Id, NodeInvalidInfo>];
1221
1335
  }
1222
1336
 
1337
+ // #region EditorChangeEvent
1338
+ /** `change` 事件中单个变更项:变更的 node 及其所属的 page(可能为 null)。 */
1339
+ export interface EditorChangeItem {
1340
+ node: MNode;
1341
+ page: StoreState['page'];
1342
+ }
1343
+
1344
+ /** `update` 类型变更项:node 为前后快照及 form 端变更记录,page 为其所属页面。 */
1345
+ export interface EditorUpdateChangeItem {
1346
+ node: { newNode: MNode; oldNode: MNode; changeRecords?: ChangeRecord[] };
1347
+ page: StoreState['page'];
1348
+ }
1349
+
1350
+ /** {@link EditorEvents.change} 各操作类型共有的历史相关字段。 */
1351
+ export interface EditorChangeEventHistoryMeta {
1352
+ /**
1353
+ * 本次变更的「历史来源」(调用 DSL 操作时传入的 {@link HistoryOpOptions.historySource},
1354
+ * 撤销 / 重做时则为被应用 step 上记录的 `source`),未携带时为 undefined。
1355
+ */
1356
+ historySource?: HistoryOpSource;
1357
+ /**
1358
+ * 本次操作是否未写入历史记录(即调用时传入的 {@link HistoryOpOptions.doNotPushHistory},缺省为 false);
1359
+ * 撤销 / 重做路径补发的事件恒为 true(撤销/重做本身不再入栈)。
1360
+ */
1361
+ doNotPushHistory?: boolean;
1362
+ }
1363
+
1364
+ /**
1365
+ * {@link EditorEvents.change} 的回调参数:以 `type` 区分操作类型,并携带对应的操作内容。
1366
+ * `data` 为本次变更的节点列表,每项包含 node 及其所属的 page(可能为 null);
1367
+ * `move-layer` 额外带层级偏移 `offset`,`drag-to` 额外带目标位置 `targetIndex` / `targetParent`;
1368
+ * 历史相关字段(historySource / doNotPushHistory)见 {@link EditorChangeEventHistoryMeta}。
1369
+ */
1370
+ export type EditorChangeEvent =
1371
+ | ({ type: 'add'; data: EditorChangeItem[] } & EditorChangeEventHistoryMeta)
1372
+ | ({ type: 'remove'; data: EditorChangeItem[] } & EditorChangeEventHistoryMeta)
1373
+ | ({ type: 'update'; data: EditorUpdateChangeItem[] } & EditorChangeEventHistoryMeta)
1374
+ | ({ type: 'move-layer'; data: EditorChangeItem[]; offset: number | LayerOffset } & EditorChangeEventHistoryMeta)
1375
+ | ({
1376
+ type: 'drag-to';
1377
+ data: EditorChangeItem[];
1378
+ targetIndex: number;
1379
+ targetParent: MContainer;
1380
+ } & EditorChangeEventHistoryMeta);
1381
+ // #endregion EditorChangeEvent
1382
+
1223
1383
  export interface HistoryEvents {
1224
1384
  change: [
1225
1385
  state: BaseStepValue | StepValue | CodeBlockStepValue | DataSourceStepValue,
@@ -1233,6 +1393,12 @@ export interface HistoryEvents {
1233
1393
  'mark-saved': [{ kind: HistoryStepType; id?: Id }];
1234
1394
  clear: [{ id: Id; stepType: HistoryStepType }];
1235
1395
  'marker-change': [{ id: Id; marker: StepValue; stepType: HistoryStepType }];
1396
+ /**
1397
+ * 页面 / 页面片结构变更(新增 / 删除)时派发,见 {@link HistoryService.notifyPageStructureChange}。
1398
+ * 一次操作(add / remove / setRoot 整体替换)涉及多个页面时合并为**一个**事件;
1399
+ * `add` / `remove` 分别为本次新增与删除的页面列表(其一可为空数组)。
1400
+ */
1401
+ 'page-structure-change': [change: { add: (MPage | MPageFragment)[]; remove: (MPage | MPageFragment)[] }];
1236
1402
  }
1237
1403
 
1238
1404
  export const canUsePluginMethods = {
@@ -1301,6 +1467,29 @@ export interface DslOpOptions extends HistoryOpOptions {
1301
1467
  }
1302
1468
  // #endregion DslOpOptions
1303
1469
 
1470
+ // #region UpdateOptions
1471
+ /**
1472
+ * {@link EditorService.update} / {@link EditorService.doUpdate} 的额外数据
1473
+ * - changeRecords: 单节点 form 端变更记录(多节点场景下被忽略,使用 changeRecordList)
1474
+ * - changeRecordList: 多节点 form 端变更记录列表,按 config 数组同序对应每个节点;优先级高于 changeRecords
1475
+ * - replace: 为 true 时跳过 mergeWith / toggleFixedPosition / setChildrenLayout,直接用传入配置整节点替换
1476
+ * - invalidInfo: 属性面板提交时携带的校验错误信息,在写入历史记录之前落库
1477
+ */
1478
+ export interface UpdateOptions extends HistoryOpOptionsWithChangeRecords {
1479
+ changeRecordList?: ChangeRecord[][];
1480
+ /**
1481
+ * 为 true 时不做深合并等变换,直接用传入配置整节点替换现有节点。
1482
+ * 适用于源码编辑、历史整节点快照回放等「完整 DSL」场景;默认 false(局部属性更新走 merge)。
1483
+ */
1484
+ replace?: boolean;
1485
+ /**
1486
+ * 属性面板提交时携带的校验错误信息,在写入历史记录之前落库,
1487
+ * 使历史快照与本次变更对齐,从而 undo/redo 能正确还原错误标记。
1488
+ */
1489
+ invalidInfo?: { id: Id; source: NodeInvalidSource; error?: string };
1490
+ }
1491
+ // #endregion UpdateOptions
1492
+
1304
1493
  /** 差异对话框的入参 */
1305
1494
  export interface DiffDialogPayload {
1306
1495
  /** 表单类别 */
@@ -1319,6 +1508,14 @@ export interface DiffDialogPayload {
1319
1508
  targetLabel?: string;
1320
1509
  /** 用于标题展示的目标 id */
1321
1510
  id?: string | number;
1511
+ /**
1512
+ * 指定打开时的初始对比模式:
1513
+ * - before:该步骤修改前 vs 修改后
1514
+ * - current:该步骤修改后 vs 当前最新值
1515
+ * 不传时按是否存在「修改后的值」/「当前值」自动推断。
1516
+ * 若指定的模式当前不可用(对应数据缺失),将回退到自动推断结果。
1517
+ */
1518
+ mode?: 'before' | 'current';
1322
1519
  }
1323
1520
 
1324
1521
  /**
@@ -1353,6 +1550,8 @@ export interface HistoryBucketConfig<T extends BaseStepValue = BaseStepValue> ex
1353
1550
  showInitial?: boolean;
1354
1551
  /** 是否支持「跳转到该记录」(goto),默认 true。 */
1355
1552
  gotoEnabled?: boolean;
1553
+ /** 是否展示顶部「清空」按钮,默认 true。无需提供清空能力的自定义历史可传 false。 */
1554
+ showClear?: boolean;
1356
1555
  }
1357
1556
 
1358
1557
  export interface UseHistoryRevertOptions {
@@ -1363,10 +1562,11 @@ export interface UseHistoryRevertOptions {
1363
1562
  */
1364
1563
  appContext?: AppContext | null;
1365
1564
  /**
1366
- * 透传给差异确认弹窗的 `extendState`(即 Editor 的 `extendFormState`),
1367
- * 使对比表单中依赖业务上下文的 `display` / `disabled` 等 filterFunction 正常工作。
1565
+ * 内置页面 / 数据源 / 代码块的差异 / 回滚确认弹窗默认宽度(透传给 TMagicDialog 的 `width`),
1566
+ * `'1200px'` / `'80%'`。缺省时使用弹窗内置默认宽度(900px)。
1567
+ * 业务自有历史(`viewDiff` / `confirmAndRevert`)可在调用时通过各自入参的 `width` 单独覆盖。
1368
1568
  */
1369
- extendState?: (_state: FormState) => Record<string, any> | Promise<Record<string, any>>;
1569
+ dialogWidth?: string;
1370
1570
  }
1371
1571
 
1372
1572
  /**
@@ -1382,6 +1582,16 @@ export interface CustomDiffFormOptions {
1382
1582
  loadConfig?: CompareFormLoadConfig;
1383
1583
  /** 需要走 self diff 的字段类型(如模块的 mod-cond)。 */
1384
1584
  selfDiffFieldTypes?: string[];
1585
+ /**
1586
+ * 差异 / 确认回滚弹窗宽度(透传给 HistoryDiffDialog 的 TMagicDialog `width`),
1587
+ * 如 `'1200px'` / `'80%'`。缺省时使用弹窗内置默认宽度(900px)。
1588
+ */
1589
+ width?: string;
1590
+ /**
1591
+ * 差异 / 确认回滚弹窗内 form 表单的尺寸(透传给 CompareForm 的 `size`),
1592
+ * 可选 `'large' | 'default' | 'small'`,缺省时使用表单内置默认尺寸。
1593
+ */
1594
+ size?: FieldSize;
1385
1595
  }
1386
1596
 
1387
1597
  /**
@@ -103,6 +103,7 @@ export const getCodeBlockFormConfig = (options: GetCodeBlockFormConfigOptions =
103
103
  const list = [
104
104
  { text: '初始化前', value: 'beforeInit' },
105
105
  { text: '初始化后', value: 'afterInit' },
106
+ { text: '页面渲染后', value: 'mounted' },
106
107
  ];
107
108
  if (dataSourceType?.() !== 'base') {
108
109
  list.push({ text: '请求前', value: 'beforeRequest' });
@@ -16,14 +16,22 @@
16
16
  * limitations under the License.
17
17
  */
18
18
 
19
+ import { ref } from 'vue';
20
+
19
21
  import { EditorInstallOptions } from '@editor/type';
20
22
 
21
23
  let $TMAGIC_EDITOR: EditorInstallOptions = {} as any;
22
24
 
25
+ // 用 ref 持有 flat 全局开关:const 引用本身不可变,符合 `import/no-mutable-exports`;
26
+ // 通过 `.value` 改值仍保持模块级响应式语义,与 editor/plugin.ts、design/index.ts 里
27
+ // 的同名变量写法对齐。
28
+ const isGlobalFlat = ref(false);
29
+
23
30
  const setEditorConfig = (option: EditorInstallOptions): void => {
24
31
  $TMAGIC_EDITOR = option;
32
+ isGlobalFlat.value = option.flat ?? false;
25
33
  };
26
34
 
27
35
  const getEditorConfig = <K extends keyof EditorInstallOptions>(key: K): EditorInstallOptions[K] => $TMAGIC_EDITOR[key];
28
36
 
29
- export { getEditorConfig, setEditorConfig };
37
+ export { getEditorConfig, isGlobalFlat, setEditorConfig };
@@ -5,11 +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
- // 2026-06-11 设计稿修改,固定左侧栏存在时最小宽度为238px
12
- export const MIN_LEFT_COLUMN_WIDTH = 238;
11
+ // 2026-06-11 设计稿修改,固定左侧栏存在时最小宽度为 345
12
+ export const MIN_LEFT_COLUMN_WIDTH = 345;
13
13
  export const MIN_CENTER_COLUMN_WIDTH = 400;
14
14
  export const MIN_RIGHT_COLUMN_WIDTH = 300;
15
15
 
@@ -2,7 +2,7 @@ import { computed, markRaw, type ShallowRef } from 'vue';
2
2
  import { CopyDocument, Delete, DocumentCopy } from '@element-plus/icons-vue';
3
3
 
4
4
  import { cloneDeep, Id, MContainer, NodeType } from '@tmagic/core';
5
- import { calcValueByFontsize, isPage, isPageFragment } from '@tmagic/utils';
5
+ import { calcValueByFontsize, isPage, isPageOrFragment } from '@tmagic/utils';
6
6
 
7
7
  import ContentMenu from '@editor/components/ContentMenu.vue';
8
8
  import type { HistoryOpSource, MenuButton, Services } from '@editor/type';
@@ -20,7 +20,7 @@ export const useDeleteMenu = (historySource?: HistoryOpSource): MenuButton => ({
20
20
  icon: Delete,
21
21
  display: ({ editorService }) => {
22
22
  const node = editorService.get('node');
23
- return node?.type !== NodeType.ROOT && !isPage(node) && !isPageFragment(node);
23
+ return node?.type !== NodeType.ROOT && !isPageOrFragment(node);
24
24
  },
25
25
  handler: ({ editorService }) => {
26
26
  const nodes = editorService.get('nodes');
@@ -37,6 +37,7 @@ const dataSourceFormConfig: TabConfig = {
37
37
  name: 'events',
38
38
  src: 'datasource',
39
39
  type: 'event-select',
40
+ defaultValue: [],
40
41
  },
41
42
  ],
42
43
  },
@@ -235,19 +236,37 @@ export const getCascaderOptionsFromFields = (
235
236
  return result;
236
237
  };
237
238
 
238
- export const getFieldType = (ds: DataSourceSchema | undefined, fieldNames: string[]) => {
239
- let fields = ds?.fields;
240
- let type = '';
241
-
242
- for (const fieldName of fieldNames) {
243
- if (!fields?.length) return '';
244
-
245
- const field = fields.find((f) => f.name === fieldName);
246
- if (!field) return '';
239
+ /**
240
+ * 按字段名路径下钻 DataSchema。
241
+ * @param skipNumberIndices 为 true 时跳过数字段(模板路径中的数组下标,如 arr[0].x)
242
+ */
243
+ export const resolveFieldByPath = (
244
+ fields: DataSchema[] | undefined,
245
+ fieldNames: string[],
246
+ options: { skipNumberIndices?: boolean } = {},
247
+ ): { ok: boolean; field?: DataSchema; fields: DataSchema[]; failedName?: string } => {
248
+ let currentFields = fields || [];
249
+ let field: DataSchema | undefined;
247
250
 
248
- type = field.type || '';
249
- fields = field.fields;
251
+ for (const name of fieldNames) {
252
+ if (options.skipNumberIndices && isNumber(name)) {
253
+ continue;
254
+ }
255
+ if (!currentFields.length) {
256
+ return { ok: false, fields: currentFields, failedName: name };
257
+ }
258
+ field = currentFields.find((item) => item.name === name);
259
+ if (!field) {
260
+ return { ok: false, fields: currentFields, failedName: name };
261
+ }
262
+ currentFields = field.fields || [];
250
263
  }
251
264
 
252
- return type;
265
+ return { field, ok: true, fields: currentFields };
266
+ };
267
+
268
+ export const getFieldType = (ds: DataSourceSchema | undefined, fieldNames: string[]) => {
269
+ const { ok, field } = resolveFieldByPath(ds?.fields, fieldNames);
270
+ if (!ok) return '';
271
+ return field?.type || '';
253
272
  };