form-designer-xinyi 1.0.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 (310) hide show
  1. package/.eslintrc.js +10 -0
  2. package/.vscode/extensions.json +3 -0
  3. package/.vscode/settings.json +6 -0
  4. package/LICENSE +21 -0
  5. package/README.md +236 -0
  6. package/docs/.vitepress/config.ts +158 -0
  7. package/docs/.vitepress/theme/custom.css +38 -0
  8. package/docs/.vitepress/theme/index.ts +7 -0
  9. package/docs/.vitepress/theme/style.css +36 -0
  10. package/docs/guide/about/about.md +25 -0
  11. package/docs/guide/action/customFunctions.md +560 -0
  12. package/docs/guide/action/publicMethods.md +25 -0
  13. package/docs/guide/components/EBuilder.md +544 -0
  14. package/docs/guide/components/EDesigner.md +117 -0
  15. package/docs/guide/extensions/actionBar.md +55 -0
  16. package/docs/guide/extensions/component.md +113 -0
  17. package/docs/guide/extensions/icon.md +41 -0
  18. package/docs/guide/extensions/rightSidebar.md +57 -0
  19. package/docs/guide/start/dark-mode.md +149 -0
  20. package/docs/guide/start/i18n-cn.md +39 -0
  21. package/docs/guide/start/index.md +59 -0
  22. package/docs/guide/start/layoutGuide.md +0 -0
  23. package/docs/guide/start/quick-start.md +179 -0
  24. package/docs/guide/start/theme.md +122 -0
  25. package/docs/guide/utils/pageManager.md +97 -0
  26. package/docs/guide/utils/pluginManager.md +227 -0
  27. package/docs/index.md +41 -0
  28. package/docs/package.json +14 -0
  29. package/docs/public/dark.png +0 -0
  30. package/docs/public/favicon.ico +0 -0
  31. package/docs/public/icons/demo.css +539 -0
  32. package/docs/public/icons/demo_index.html +589 -0
  33. package/docs/public/icons/iconfont.css +379 -0
  34. package/docs/public/icons/iconfont.js +1 -0
  35. package/docs/public/icons/iconfont.json +646 -0
  36. package/docs/public/icons/iconfont.ttf +0 -0
  37. package/docs/public/icons/iconfont.woff +0 -0
  38. package/docs/public/icons/iconfont.woff2 +0 -0
  39. package/docs/public/layout.jpg +0 -0
  40. package/docs/public/logo.png +0 -0
  41. package/docs/public/theme.jpg +0 -0
  42. package/docs/updateLog.md +364 -0
  43. package/docs/vite.config.ts +18 -0
  44. package/docs//345/210/235/345/247/213/345/214/226/345/270/203/345/261/200.jpg +0 -0
  45. package/docs//350/256/276/350/256/241/345/231/250/344/273/213/347/273/215.md +21 -0
  46. package/docs//350/256/276/350/256/241/345/231/250/345/270/203/345/261/200.jpg +0 -0
  47. package/examples/README.md +18 -0
  48. package/examples/index.html +13 -0
  49. package/examples/package.json +27 -0
  50. package/examples/public/favicon.ico +0 -0
  51. package/examples/src/App.vue +5 -0
  52. package/examples/src/assets/logo.png +0 -0
  53. package/examples/src/layout/baseLayout.vue +3 -0
  54. package/examples/src/layout/components/Header/index.vue +102 -0
  55. package/examples/src/layout/components/Main/Maximize.vue +77 -0
  56. package/examples/src/layout/components/Main/index.vue +16 -0
  57. package/examples/src/layout/components/Menu/index.vue +49 -0
  58. package/examples/src/layout/index.vue +26 -0
  59. package/examples/src/main.ts +6 -0
  60. package/examples/src/router/index.ts +98 -0
  61. package/examples/src/style/reset.css +253 -0
  62. package/examples/src/style.less +44 -0
  63. package/examples/src/views/builder/basic/index.vue +182 -0
  64. package/examples/src/views/builder/disableDisplay/index.vue +153 -0
  65. package/examples/src/views/builder/disableDisplay copy/index.vue +111 -0
  66. package/examples/src/views/builder/loadData/index.vue +195 -0
  67. package/examples/src/views/builder/sum/index.vue +127 -0
  68. package/examples/src/views/designer/basic/index.vue +22 -0
  69. package/examples/src/views/designer/loadData/index.vue +186 -0
  70. package/examples/src/vite-env.d.ts +1 -0
  71. package/examples/tsconfig.json +27 -0
  72. package/examples/tsconfig.node.json +10 -0
  73. package/examples/vite.config.ts +28 -0
  74. package/package.json +44 -0
  75. package/packages/core/LICENSE +21 -0
  76. package/packages/core/components/asyncLoader/index.less +92 -0
  77. package/packages/core/components/asyncLoader/index.vue +7 -0
  78. package/packages/core/components/builder/index.ts +3 -0
  79. package/packages/core/components/builder/src/builder.vue +217 -0
  80. package/packages/core/components/builder/src/types.ts +4 -0
  81. package/packages/core/components/designer/index.ts +3 -0
  82. package/packages/core/components/designer/src/designer.vue +258 -0
  83. package/packages/core/components/designer/src/index.less +81 -0
  84. package/packages/core/components/designer/src/modules/actionBar/index.less +79 -0
  85. package/packages/core/components/designer/src/modules/actionBar/index.vue +44 -0
  86. package/packages/core/components/designer/src/modules/attributeView/attributeView.vue +104 -0
  87. package/packages/core/components/designer/src/modules/attributeView/eventView.vue +76 -0
  88. package/packages/core/components/designer/src/modules/attributeView/index.less +36 -0
  89. package/packages/core/components/designer/src/modules/attributeView/styleView.vue +103 -0
  90. package/packages/core/components/designer/src/modules/componentView/index.less +52 -0
  91. package/packages/core/components/designer/src/modules/componentView/index.vue +118 -0
  92. package/packages/core/components/designer/src/modules/editContainer/editNodeItem.vue +74 -0
  93. package/packages/core/components/designer/src/modules/editContainer/editScreenContainer.vue +142 -0
  94. package/packages/core/components/designer/src/modules/editContainer/index.less +129 -0
  95. package/packages/core/components/designer/src/modules/editContainer/index.vue +37 -0
  96. package/packages/core/components/designer/src/modules/editContainer/nodeItem.vue +91 -0
  97. package/packages/core/components/designer/src/modules/editContainer/previewJson.vue +61 -0
  98. package/packages/core/components/designer/src/modules/editContainer/previewWidgets.vue +373 -0
  99. package/packages/core/components/designer/src/modules/editContainer/toolbar.vue +248 -0
  100. package/packages/core/components/designer/src/modules/header/index.less +16 -0
  101. package/packages/core/components/designer/src/modules/header/index.vue +60 -0
  102. package/packages/core/components/designer/src/modules/outline/index.less +7 -0
  103. package/packages/core/components/designer/src/modules/outline/outline.vue +39 -0
  104. package/packages/core/components/designer/src/modules/preview/index.less +0 -0
  105. package/packages/core/components/designer/src/modules/preview/index.vue +71 -0
  106. package/packages/core/components/designer/src/modules/rightSidebar/breadcrumb.vue +30 -0
  107. package/packages/core/components/designer/src/modules/rightSidebar/index.less +75 -0
  108. package/packages/core/components/designer/src/modules/rightSidebar/index.vue +58 -0
  109. package/packages/core/components/designer/src/modules/sourceCode/index.less +7 -0
  110. package/packages/core/components/designer/src/modules/sourceCode/index.vue +34 -0
  111. package/packages/core/components/designer/src/types.ts +9 -0
  112. package/packages/core/components/icon/index.ts +2 -0
  113. package/packages/core/components/icon/src/icon.vue +15 -0
  114. package/packages/core/components/node/index.ts +2 -0
  115. package/packages/core/components/node/src/node.vue +350 -0
  116. package/packages/core/components/tree/index.ts +2 -0
  117. package/packages/core/components/tree/src/index.less +106 -0
  118. package/packages/core/components/tree/src/tree.vue +113 -0
  119. package/packages/core/components/tree/src/treeNodeItem.vue +87 -0
  120. package/packages/core/components/tree/src/treeNodes.vue +68 -0
  121. package/packages/core/extensions/EActionEditor/index.less +172 -0
  122. package/packages/core/extensions/EActionEditor/index.vue +160 -0
  123. package/packages/core/extensions/EActionEditor/src/EActionEditorItem.vue +133 -0
  124. package/packages/core/extensions/EActionEditor/src/EActionModal.vue +258 -0
  125. package/packages/core/extensions/EActionEditor/src/EArgsEditor.vue +61 -0
  126. package/packages/core/extensions/EActionEditor/src/EScriptEdit.vue +26 -0
  127. package/packages/core/extensions/EColEditor/index.less +24 -0
  128. package/packages/core/extensions/EColEditor/index.vue +65 -0
  129. package/packages/core/extensions/EInputSize/index.vue +59 -0
  130. package/packages/core/extensions/EOptionsEditor/index.vue +52 -0
  131. package/packages/core/extensions/EOptionsEditor/optionItem.vue +72 -0
  132. package/packages/core/extensions/ERuleEditor/ERuleItem.vue +137 -0
  133. package/packages/core/extensions/ERuleEditor/data.ts +24 -0
  134. package/packages/core/extensions/ERuleEditor/index.less +17 -0
  135. package/packages/core/extensions/ERuleEditor/index.vue +154 -0
  136. package/packages/core/extensions/ERuleEditor/types.ts +17 -0
  137. package/packages/core/extensions/MonacoEditor/index.ts +31 -0
  138. package/packages/core/extensions/MonacoEditor/index.vue +147 -0
  139. package/packages/core/extensions/Page/index.ts +23 -0
  140. package/packages/core/extensions/Page/index.vue +27 -0
  141. package/packages/core/extensions/index.ts +73 -0
  142. package/packages/core/index.less +27 -0
  143. package/packages/core/index.ts +35 -0
  144. package/packages/core/package.json +59 -0
  145. package/packages/core/static/icons/demo.css +539 -0
  146. package/packages/core/static/icons/demo_index.html +2281 -0
  147. package/packages/core/static/icons/iconfont.css +372 -0
  148. package/packages/core/static/icons/iconfont.js +1 -0
  149. package/packages/core/static/icons/iconfont.json +646 -0
  150. package/packages/core/static/icons/iconfont.ttf +0 -0
  151. package/packages/core/static/icons/iconfont.woff +0 -0
  152. package/packages/core/static/icons/iconfont.woff2 +0 -0
  153. package/packages/core/static/logo.png +0 -0
  154. package/packages/core/theme/var.less +175 -0
  155. package/packages/core/tsconfig.json +19 -0
  156. package/packages/core/types/epic-designer.ts +75 -0
  157. package/packages/epic-designer/.babelrc +9 -0
  158. package/packages/epic-designer/.eslintrc.cjs +76 -0
  159. package/packages/epic-designer/LICENSE +21 -0
  160. package/packages/epic-designer/README.md +239 -0
  161. package/packages/epic-designer/index.ts +13 -0
  162. package/packages/epic-designer/package.json +75 -0
  163. package/packages/epic-designer/shims-vue.d.ts +4 -0
  164. package/packages/epic-designer/tsconfig.json +19 -0
  165. package/packages/epic-designer/uno.config.ts +79 -0
  166. package/packages/script/package.json +17 -0
  167. package/packages/script/src/check-compiled.ts +22 -0
  168. package/packages/script/tsconfig.json +10 -0
  169. package/packages/ui/LICENSE +21 -0
  170. package/packages/ui/antd/button/button.vue +16 -0
  171. package/packages/ui/antd/button/index.ts +202 -0
  172. package/packages/ui/antd/card/card.ts +31 -0
  173. package/packages/ui/antd/card/index.ts +63 -0
  174. package/packages/ui/antd/cascader/cascader.vue +23 -0
  175. package/packages/ui/antd/cascader/index.ts +197 -0
  176. package/packages/ui/antd/checkbox/index.ts +99 -0
  177. package/packages/ui/antd/col/col.ts +31 -0
  178. package/packages/ui/antd/col/index.ts +22 -0
  179. package/packages/ui/antd/color-picker/index.ts +107 -0
  180. package/packages/ui/antd/date-picker/datePicker.ts +47 -0
  181. package/packages/ui/antd/date-picker/index.ts +302 -0
  182. package/packages/ui/antd/form/form.vue +118 -0
  183. package/packages/ui/antd/form/index.ts +195 -0
  184. package/packages/ui/antd/form-item/formItem.vue +15 -0
  185. package/packages/ui/antd/form-item/index.ts +11 -0
  186. package/packages/ui/antd/formLogic/actionEdit.vue +72 -0
  187. package/packages/ui/antd/formLogic/actionItem.vue +46 -0
  188. package/packages/ui/antd/formLogic/conditionEdit.vue +111 -0
  189. package/packages/ui/antd/formLogic/conditionItem.vue +150 -0
  190. package/packages/ui/antd/formLogic/drawer.vue +124 -0
  191. package/packages/ui/antd/formLogic/formLogic.vue +33 -0
  192. package/packages/ui/antd/formLogic/index.ts +11 -0
  193. package/packages/ui/antd/formLogic/types.ts +25 -0
  194. package/packages/ui/antd/index.less +33 -0
  195. package/packages/ui/antd/index.ts +323 -0
  196. package/packages/ui/antd/input/index.ts +169 -0
  197. package/packages/ui/antd/input-number/index.ts +181 -0
  198. package/packages/ui/antd/input-password/index.ts +152 -0
  199. package/packages/ui/antd/modal/index.ts +19 -0
  200. package/packages/ui/antd/modal/modal.vue +82 -0
  201. package/packages/ui/antd/radio/index.ts +105 -0
  202. package/packages/ui/antd/row/index.ts +114 -0
  203. package/packages/ui/antd/row/row.ts +31 -0
  204. package/packages/ui/antd/select/index.ts +228 -0
  205. package/packages/ui/antd/slider/index.ts +142 -0
  206. package/packages/ui/antd/switch/index.ts +141 -0
  207. package/packages/ui/antd/textarea/index.ts +162 -0
  208. package/packages/ui/antd/time-picker/index.ts +189 -0
  209. package/packages/ui/antd/upload-file/index.ts +88 -0
  210. package/packages/ui/antd/upload-file/uploadFile.ts +117 -0
  211. package/packages/ui/antd/upload-image/index.ts +69 -0
  212. package/packages/ui/antd/upload-image/uploadImage.vue +148 -0
  213. package/packages/ui/elementPlus/button/button.ts +25 -0
  214. package/packages/ui/elementPlus/button/index.ts +128 -0
  215. package/packages/ui/elementPlus/card/card.ts +36 -0
  216. package/packages/ui/elementPlus/card/index.ts +50 -0
  217. package/packages/ui/elementPlus/cascader/index.ts +216 -0
  218. package/packages/ui/elementPlus/checkbox/checkbox.ts +31 -0
  219. package/packages/ui/elementPlus/checkbox/index.ts +140 -0
  220. package/packages/ui/elementPlus/col/col.ts +31 -0
  221. package/packages/ui/elementPlus/col/index.ts +21 -0
  222. package/packages/ui/elementPlus/collapse/collapse.ts +32 -0
  223. package/packages/ui/elementPlus/collapse/index.ts +41 -0
  224. package/packages/ui/elementPlus/collapse-item/collapseItem.ts +31 -0
  225. package/packages/ui/elementPlus/collapse-item/index.ts +12 -0
  226. package/packages/ui/elementPlus/color-picker/index.ts +110 -0
  227. package/packages/ui/elementPlus/date-picker/index.ts +218 -0
  228. package/packages/ui/elementPlus/form/form.vue +99 -0
  229. package/packages/ui/elementPlus/form/index.ts +147 -0
  230. package/packages/ui/elementPlus/formItem/formItem.vue +15 -0
  231. package/packages/ui/elementPlus/formItem/index.ts +11 -0
  232. package/packages/ui/elementPlus/index.less +79 -0
  233. package/packages/ui/elementPlus/index.ts +84 -0
  234. package/packages/ui/elementPlus/input/index.ts +179 -0
  235. package/packages/ui/elementPlus/input-number/index.ts +145 -0
  236. package/packages/ui/elementPlus/modal/index.ts +18 -0
  237. package/packages/ui/elementPlus/modal/modal.ts +68 -0
  238. package/packages/ui/elementPlus/radio/index.ts +121 -0
  239. package/packages/ui/elementPlus/radio/radio.ts +32 -0
  240. package/packages/ui/elementPlus/row/index.ts +105 -0
  241. package/packages/ui/elementPlus/row/row.ts +32 -0
  242. package/packages/ui/elementPlus/select/index.ts +283 -0
  243. package/packages/ui/elementPlus/select/select.ts +31 -0
  244. package/packages/ui/elementPlus/slider/index.ts +237 -0
  245. package/packages/ui/elementPlus/switch/index.ts +159 -0
  246. package/packages/ui/elementPlus/textarea/index.ts +154 -0
  247. package/packages/ui/elementPlus/upload-file/index.ts +86 -0
  248. package/packages/ui/elementPlus/upload-file/uploadFile.ts +114 -0
  249. package/packages/ui/elementPlus/upload-image/index.ts +86 -0
  250. package/packages/ui/elementPlus/upload-image/uploadImage.ts +151 -0
  251. package/packages/ui/hooks/index.ts +1 -0
  252. package/packages/ui/hooks/logic.ts +129 -0
  253. package/packages/ui/index.ts +22 -0
  254. package/packages/ui/naiveUi/button/button.ts +25 -0
  255. package/packages/ui/naiveUi/button/index.ts +146 -0
  256. package/packages/ui/naiveUi/card/card.ts +32 -0
  257. package/packages/ui/naiveUi/card/index.ts +25 -0
  258. package/packages/ui/naiveUi/cascader/index.ts +218 -0
  259. package/packages/ui/naiveUi/checkbox/checkbox.ts +27 -0
  260. package/packages/ui/naiveUi/checkbox/index.ts +114 -0
  261. package/packages/ui/naiveUi/col/col.ts +30 -0
  262. package/packages/ui/naiveUi/col/index.ts +21 -0
  263. package/packages/ui/naiveUi/collapse/collapse.ts +31 -0
  264. package/packages/ui/naiveUi/collapse/index.ts +40 -0
  265. package/packages/ui/naiveUi/collapse-item/collapseItem.ts +31 -0
  266. package/packages/ui/naiveUi/collapse-item/index.ts +12 -0
  267. package/packages/ui/naiveUi/color-picker/index.ts +179 -0
  268. package/packages/ui/naiveUi/date-picker/index.ts +210 -0
  269. package/packages/ui/naiveUi/form/form.vue +85 -0
  270. package/packages/ui/naiveUi/form/index.ts +141 -0
  271. package/packages/ui/naiveUi/form-item/formItem.vue +15 -0
  272. package/packages/ui/naiveUi/form-item/index.ts +10 -0
  273. package/packages/ui/naiveUi/index.less +33 -0
  274. package/packages/ui/naiveUi/index.ts +80 -0
  275. package/packages/ui/naiveUi/input/index.ts +215 -0
  276. package/packages/ui/naiveUi/input-number/index.ts +141 -0
  277. package/packages/ui/naiveUi/modal/index.ts +18 -0
  278. package/packages/ui/naiveUi/modal/modal.ts +83 -0
  279. package/packages/ui/naiveUi/radio/index.ts +94 -0
  280. package/packages/ui/naiveUi/radio/radio.ts +27 -0
  281. package/packages/ui/naiveUi/row/index.ts +105 -0
  282. package/packages/ui/naiveUi/row/row.ts +31 -0
  283. package/packages/ui/naiveUi/select/index.ts +193 -0
  284. package/packages/ui/naiveUi/slider/index.ts +181 -0
  285. package/packages/ui/naiveUi/switch/index.ts +133 -0
  286. package/packages/ui/naiveUi/upload-file/index.ts +82 -0
  287. package/packages/ui/naiveUi/upload-file/uploadFile.ts +78 -0
  288. package/packages/ui/naiveUi/upload-image/index.ts +82 -0
  289. package/packages/ui/naiveUi/upload-image/uploadImage.ts +152 -0
  290. package/packages/ui/package.json +18 -0
  291. package/packages/ui/tsconfig.json +19 -0
  292. package/packages/utils/LICENSE +21 -0
  293. package/packages/utils/common/common.ts +18 -0
  294. package/packages/utils/common/component.ts +22 -0
  295. package/packages/utils/common/data.ts +682 -0
  296. package/packages/utils/common/element.ts +166 -0
  297. package/packages/utils/common/index.ts +6 -0
  298. package/packages/utils/common/string.ts +18 -0
  299. package/packages/utils/common/theme.ts +84 -0
  300. package/packages/utils/index.ts +3 -0
  301. package/packages/utils/manager/index.ts +3 -0
  302. package/packages/utils/manager/pageManager.ts +157 -0
  303. package/packages/utils/manager/pluginManager.ts +586 -0
  304. package/packages/utils/manager/revoke.ts +128 -0
  305. package/packages/utils/package.json +7 -0
  306. package/packages/utils/shareStore/index.ts +30 -0
  307. package/packages/utils/tsconfig.json +19 -0
  308. package/packages/utils/vite.config.ts +39 -0
  309. package/pnpm-workspace.yaml +5 -0
  310. package/turbo.json +20 -0
@@ -0,0 +1,682 @@
1
+ import {
2
+ PageSchema,
3
+ type ComponentSchema,
4
+ } from "@epic-designer/core/types/epic-designer";
5
+ import { getUUID } from "./string";
6
+ import { pluginManager } from "../index";
7
+
8
+ /**
9
+ * 深拷贝数据
10
+ * @param obj
11
+ * @returns
12
+ */
13
+ export function deepClone(
14
+ obj: Record<string, any>,
15
+ cache = new WeakMap()
16
+ ): any {
17
+ // 如果不是对象或数组,则直接返回
18
+ if (typeof obj !== "object" || obj === null) {
19
+ return obj;
20
+ }
21
+
22
+ // 如果已经处理过这个对象,则直接返回缓存中的对象
23
+ if (cache.has(obj)) {
24
+ return cache.get(obj);
25
+ }
26
+
27
+ // 处理数组
28
+ if (Array.isArray(obj)) {
29
+ const clonedArray = obj.map((item: any) => deepClone(item, cache));
30
+ cache.set(obj, clonedArray);
31
+ return clonedArray;
32
+ }
33
+
34
+ // 处理对象
35
+ const clonedObj = {} as any;
36
+ cache.set(obj, clonedObj);
37
+ Object.keys(obj).forEach((key) => {
38
+ clonedObj[key] = deepClone(obj[key], cache);
39
+ });
40
+ return clonedObj;
41
+ }
42
+
43
+ /**
44
+ * 生成新的schema数据
45
+ * 深拷贝数据,防止重复引用
46
+ * 生成uuid
47
+ * 生成field
48
+ * @param schema
49
+ */
50
+ export function generateNewSchema(schema: ComponentSchema) {
51
+ const [newSchema] = mapSchemas([deepClone(schema)], (item) => {
52
+ // 补充id字段
53
+ const newVal = {
54
+ ...item,
55
+ id: `${item.type}_${getUUID(8)}`,
56
+ };
57
+
58
+ // 存在字段名,则自动在字段名后补充id
59
+ if (
60
+ (newVal.field || newVal.input) &&
61
+ !pluginManager.getComponentConfingByType(newVal.type)?.editConstraints?.fixedField
62
+ ) {
63
+ newVal.field = newVal.id;
64
+ }
65
+ return newVal;
66
+ });
67
+
68
+ return newSchema;
69
+ }
70
+
71
+ /**
72
+ * 不改变obj1引用,将obj2所有属性遍历复制给obj1。
73
+ * 递归比较两个对象,将obj2的属性复制给obj1。
74
+ * 如果obj1中有obj2没有的属性,则删除该属性。
75
+ * @param obj1 - 要修改的对象。
76
+ * @param obj2 - 要比较的对象。
77
+ */
78
+ export function deepCompareAndModify(
79
+ obj1: Record<string, any>,
80
+ obj2: Record<string, any>
81
+ ): void {
82
+ // 循环遍历obj2的所有属性
83
+ for (const [key, val2] of Object.entries(obj2)) {
84
+ const val1 = obj1?.[key];
85
+ // 如果obj1的属性值是对象或数组,则递归调用该函数
86
+ if (val1 && val2 && typeof val1 === "object" && typeof val2 === "object") {
87
+ deepCompareAndModify(val1, val2);
88
+ } else {
89
+ // 如果属性值不相等,则将obj2的属性值复制给obj1
90
+ obj1[key] = val2;
91
+ }
92
+ }
93
+
94
+ Object.keys(obj1)
95
+ .reverse()
96
+ .forEach((key) => {
97
+ // 如果obj2中存在obj1的属性跳过
98
+ if (obj2.hasOwnProperty(key)) {
99
+ return;
100
+ }
101
+ // 如果obj2中没有obj1的属性,则从obj1中删除该属性
102
+ if (Array.isArray(obj2)) {
103
+ // obj1 是数组
104
+ obj1.splice(key, 1);
105
+ } else {
106
+ // obj1 是对象
107
+ delete obj1[key];
108
+ }
109
+ });
110
+ }
111
+
112
+ /**
113
+ * 深度比较两个对象是否相等
114
+ * @param obj1
115
+ * @param obj2
116
+ * @returns
117
+ */
118
+ /**
119
+ * 深度比较两个对象是否相等
120
+ * @param obj1
121
+ * @param obj2
122
+ * @param ignoreKeys 可选参数,指定要忽略比较的属性名数组
123
+ * @returns
124
+ */
125
+ export function deepEqual(
126
+ obj1: Record<string, any>,
127
+ obj2: Record<string, any>,
128
+ ignoreKeys: string[] = [],
129
+ visitedObjs = new WeakMap()
130
+ ): boolean {
131
+ const normalize = (obj: any): any => {
132
+ // 如果是数组类型,则递归调用 normalize 函数对每个元素进行标准化处理
133
+ if (Array.isArray(obj)) {
134
+ return obj.map(normalize);
135
+ }
136
+
137
+ // 如果是对象类型,则将所有属性名按照字母顺序排序,并递归调用 normalize 函数对每个属性值进行标准化处理
138
+ else if (typeof obj === "object" && obj !== null) {
139
+ // 在访问过该对象时,直接返回一个占位符
140
+ if (visitedObjs.has(obj)) {
141
+ return "[Circular]";
142
+ }
143
+ visitedObjs.set(obj, true);
144
+
145
+ const keys = Object.keys(obj).sort();
146
+ const normalizedObj: Record<string, any> = {};
147
+ keys.forEach((key) => {
148
+ if (!ignoreKeys.includes(key)) {
149
+ // 如果该属性不在忽略列表中
150
+ normalizedObj[key] = normalize(obj[key]);
151
+ }
152
+ });
153
+
154
+ // 递归调用 normalize 函数时,需要将 visitedObjs 参数传递下去
155
+ visitedObjs.delete(obj);
156
+ return normalizedObj;
157
+ }
158
+ // 其它类型直接返回即可
159
+ else {
160
+ return obj;
161
+ }
162
+ };
163
+
164
+ // 对两个对象进行标准化处理后,再进行比较
165
+ return JSON.stringify(normalize(obj1)) === JSON.stringify(normalize(obj2));
166
+ }
167
+
168
+ /**
169
+ * 通过id获取节点路径
170
+ * @param schemas
171
+ * @param id
172
+ */
173
+ export function getMatchedById(
174
+ schemas: ComponentSchema[],
175
+ id: string
176
+ ): ComponentSchema[] {
177
+ const matched: ComponentSchema[] = [];
178
+ let found = false;
179
+
180
+ function getNodePath(node: ComponentSchema): void {
181
+ matched.push(node);
182
+ if (node.id === id) {
183
+ found = true;
184
+ }
185
+ // 遍历默认子节点
186
+ if (!found && node.children != null && node.children.length > 0) {
187
+ for (let i = 0; i < node.children.length; i++) {
188
+ getNodePath(node.children[i]);
189
+ if (found) break;
190
+ }
191
+ }
192
+
193
+ // 遍历插槽
194
+ if (!found && node.slots) {
195
+ for (let key in node.slots) {
196
+ for (let i = 0; i < node.slots[key].length; i++) {
197
+ getNodePath(node.slots[key][i]);
198
+ if (found) break;
199
+ }
200
+ }
201
+ }
202
+
203
+ if (!found) {
204
+ matched.pop();
205
+ }
206
+ }
207
+
208
+ schemas.forEach(getNodePath);
209
+
210
+ if (!found) {
211
+ console.error(`没有查询到id为${id}的节点`);
212
+ }
213
+
214
+ return matched;
215
+ }
216
+
217
+ /**
218
+ * 此函数接受一个字符串参数,表示对象中的字段 和 对象
219
+ * 它通过将参数使用点“.”作为分隔符拆分成部分来检索字段的值
220
+ * 然后通过迭代每一部分从对象中获取字段的值
221
+ * 如果找不到字段值,则该函数返回null
222
+ * @param field 属性路径
223
+ */
224
+ export function getAttributeValue(
225
+ field: string,
226
+ obj: Record<string, any>
227
+ ): Record<string, any> | undefined {
228
+ // 使用“.”作为分隔符拆分field字符串,以创建字段数组。
229
+ const fieldList = field.split(".");
230
+ let data: Record<string, any> | undefined = obj;
231
+ // 遍历fieldList中每个字段,以从obj中检索字段的值
232
+ for (let i = 0; i < fieldList.length; i++) {
233
+ // 更新nodeItem为nodeItem中当前字段的值。
234
+ data = data[fieldList[i]];
235
+ // 如果字段的值不存在,则返回空。
236
+ if (typeof data === "undefined") return;
237
+ }
238
+
239
+ // 假如数据是个空数组,则直接返回 undefined
240
+ // if (Array.isArray(data) && data.length === 0) {
241
+ // return;
242
+ // }
243
+
244
+ // 返回从obj中检索到的最终字段的值。
245
+
246
+ return data;
247
+ }
248
+
249
+ /**
250
+ * 设置属性值的函数
251
+ * 这是一个设置属性值的函数,传入三个参数,一个是要设置的属性值,一个是要设置的属性路径,一个要设置的对象。
252
+ * 函数主要工作是将属性路径拆分成数组,然后遍历这个数组,依次进入对象中的子属性,直到最后一个子属性,然后将属性值设置到这个子属性上。
253
+ * @param value 属性值
254
+ * @param field 属性路径
255
+ * @param obj 属性路径
256
+ */
257
+ export function setAttributeValue(
258
+ value: any,
259
+ field: string,
260
+ obj: Record<string, any>
261
+ ): void {
262
+ // 使用“.”作为分隔符拆分field字符串,以创建字段数组。
263
+ const fieldList = field.split(".");
264
+ let data: Record<string, any> = obj;
265
+
266
+ // 遍历属性路径数组
267
+ fieldList.forEach((item, index) => {
268
+ // 如果当前遍历到数组的最后一个元素,则将属性值设置到这个子属性上
269
+ if (index === fieldList.length - 1) {
270
+ data[item] = value;
271
+ return;
272
+ }
273
+
274
+ // 否则,进入子属性对象中
275
+ data = data[item] ?? (data[item] = {});
276
+ });
277
+ }
278
+
279
+ /**
280
+ * 获取表单字段
281
+ * @param schemas 页面结构数据
282
+ * @param formName 表单name
283
+ */
284
+ export function getFormFields(
285
+ schemas: ComponentSchema[],
286
+ formName = "default"
287
+ ) {
288
+ const inputSchemaList = getFormSchemas(schemas, formName);
289
+ return inputSchemaList.map((item) => item.field);
290
+ }
291
+
292
+ /**
293
+ * 从给定的组件schema数组中获取特定表单的输入字段schema数组。
294
+ * @param {ComponentSchema[]} schemas - 包含整个表单结构信息的组件schema数组。
295
+ * @param {string} formName - 要获取输入字段schema的表单名称,默认为 "default"。
296
+ * @returns {ComponentSchema[]} 包含表单输入字段schema的数组。
297
+ */
298
+ export function getFormSchemas(
299
+ schemas: ComponentSchema[],
300
+ formName = "default"
301
+ ) {
302
+ const formSchema = findSchemas(
303
+ schemas,
304
+ (currentNode) => {
305
+ return (
306
+ currentNode.type === "form" &&
307
+ (currentNode.componentProps?.name ?? currentNode.name === formName)
308
+ );
309
+ },
310
+ true
311
+ ) as ComponentSchema;
312
+ // console.log(schema);
313
+ const inputSchemaList = findSchemas(
314
+ formSchema?.children ?? [],
315
+ (currentNode) => {
316
+ return Boolean(currentNode.input);
317
+ },
318
+ false,
319
+ (currentNode: ComponentSchema) => {
320
+ // 过滤子表单子节点
321
+ return currentNode.type !== "subform";
322
+ }
323
+ ) as ComponentSchema[];
324
+
325
+ return inputSchemaList;
326
+ }
327
+
328
+ /**
329
+ * 查询Schema 返回所有符合添加的数据
330
+ * @param schemas
331
+ * @param handler
332
+ * @param once 当once为true,表示只需要查询一条符合添加的数据之后结束函数
333
+ * @param filter 节点过滤,函数返回 false,则不查询该节点得所有子节点 children
334
+ * @returns
335
+ */
336
+ export function findSchemas(
337
+ schemas: ComponentSchema[],
338
+ handler: (item: ComponentSchema) => boolean,
339
+ once = false,
340
+ filter?: (item: ComponentSchema) => boolean
341
+ ) {
342
+ const matchedNodes: ComponentSchema[] = [];
343
+
344
+ const nodesToVisit: ComponentSchema[] = [...schemas];
345
+
346
+ while (nodesToVisit.length) {
347
+ const currentNode = nodesToVisit.pop() as ComponentSchema;
348
+
349
+ // 检查默认子节点
350
+ if (currentNode?.children && (!filter || filter(currentNode))) {
351
+ nodesToVisit.push(...currentNode.children);
352
+ }
353
+
354
+ // 检查插槽
355
+ if (currentNode?.slots && (!filter || filter(currentNode))) {
356
+ for (let key in currentNode.slots) {
357
+ nodesToVisit.push(...currentNode.slots[key]);
358
+ }
359
+ }
360
+
361
+ if (handler(currentNode)) {
362
+ matchedNodes.push(currentNode);
363
+ if (once) {
364
+ return currentNode;
365
+ }
366
+ }
367
+ }
368
+
369
+ // 当只查询一条数据时,执行到这里说明没有查询到数据,所以返回false
370
+ if (once) {
371
+ return false;
372
+ }
373
+
374
+ return matchedNodes;
375
+ }
376
+
377
+ /**
378
+ * 遍历Schema 返回映射的数据
379
+ * @param schemas
380
+ * @param handler 映射处理
381
+ * @param filter 节点过滤,函数返回 false,则不映射该节点得所有子节点 children
382
+ * @returns
383
+ */
384
+ export function mapSchemas(
385
+ schemas: ComponentSchema[],
386
+ handler: (item: ComponentSchema) => ComponentSchema,
387
+ filter?: (item: ComponentSchema) => boolean
388
+ ) {
389
+ const nodesToVisit: ComponentSchema[] = [...schemas];
390
+
391
+ while (nodesToVisit.length) {
392
+ const currentNode = nodesToVisit.pop() as ComponentSchema;
393
+
394
+ // 检查默认子节点
395
+ if (currentNode?.children && (!filter || filter(currentNode))) {
396
+ nodesToVisit.push(...currentNode.children);
397
+ }
398
+ // 检查插槽
399
+ if (currentNode?.slots && (!filter || filter(currentNode))) {
400
+ for (let key in currentNode.slots) {
401
+ nodesToVisit.push(...currentNode.slots[key]);
402
+ }
403
+ }
404
+
405
+ deepCompareAndModify(currentNode, handler(currentNode));
406
+ }
407
+
408
+ return schemas;
409
+ }
410
+
411
+ /**
412
+ * 通过id查询schema
413
+ * @param schemas
414
+ * @param id
415
+ * @returns
416
+ */
417
+ export function findSchemaById(
418
+ schemas: ComponentSchema[],
419
+ id: string
420
+ ): ComponentSchema {
421
+ let index: number = 0;
422
+
423
+ // 查询节点
424
+ const schema = findSchemas(
425
+ schemas,
426
+ (currentNode) => {
427
+ return currentNode.id === id;
428
+ },
429
+ true
430
+ ) as ComponentSchema & { children: ComponentSchema };
431
+
432
+ // 判断节点是否存在,不存在则抛出异常
433
+ if (!schema) {
434
+ throw new Error(`没有查询到id为${id}的节点`);
435
+ }
436
+
437
+ return schema;
438
+ }
439
+
440
+ /**
441
+ * 通过id查询schema及节点children index 信息
442
+ * @param schemas
443
+ * @param id
444
+ * @returns
445
+ */
446
+ export function findSchemaInfoById(
447
+ schemas: ComponentSchema[],
448
+ id: string
449
+ ): {
450
+ list: ComponentSchema[];
451
+ schema: ComponentSchema;
452
+ index: number;
453
+ } {
454
+ const stack: ComponentSchema[] = [{ type: "", children: schemas }];
455
+ let index: number = 0;
456
+ let children: ComponentSchema[] | null = null;
457
+ // 查询父节点
458
+ const parentSchema = findSchemas(
459
+ stack,
460
+ (currentNode) => {
461
+ children = currentNode.children ?? null;
462
+
463
+ if (!children) {
464
+ if (currentNode?.slots) {
465
+ for (let key in currentNode.slots) {
466
+ children = currentNode.slots[key] as ComponentSchema[];
467
+ for (let i = 0; i < children.length; i++) {
468
+ if (children[i].id === id) {
469
+ index = i;
470
+ return true;
471
+ }
472
+ }
473
+ }
474
+ }
475
+ return false;
476
+ }
477
+
478
+ for (let i = 0; i < children.length; i++) {
479
+ if (children[i].id === id) {
480
+ index = i;
481
+ return true;
482
+ }
483
+ }
484
+
485
+ return false;
486
+ },
487
+ true
488
+ ) as ComponentSchema & { children: ComponentSchema };
489
+
490
+ // 判断节点是否存在,不存在则抛出异常
491
+ if (!children) {
492
+ throw new Error(`没有查询到id为${id}的节点`);
493
+ }
494
+
495
+ return {
496
+ list: children,
497
+ schema: children[index],
498
+ index,
499
+ };
500
+ }
501
+
502
+ /**
503
+ * 将k-form-design数据转换为epic-designer数据
504
+ * @param data
505
+ * @returns
506
+ */
507
+
508
+ export function convertKFormData(data) {
509
+ const convertedData: PageSchema = {
510
+ schemas: [
511
+ {
512
+ type: "page",
513
+ id: "root",
514
+ label: "页面",
515
+ children: [
516
+ {
517
+ label: "表单",
518
+ type: "form",
519
+ icon: "epic-icon-daibanshixiang",
520
+ labelWidth: data.config.labelWidth || 100,
521
+ name: "default",
522
+ componentProps: {
523
+ layout: data.config.layout || "horizontal",
524
+ labelWidth: data.config.labelWidth || 100,
525
+ labelLayout:
526
+ data.config.labelLayout === "flex" ? "fixed" : "flex",
527
+ labelCol: data.config.labelCol || { span: 5 },
528
+ wrapperCol: data.config.wrapperCol || { span: 19 },
529
+ hideRequiredMark: data.config.hideRequiredMark || false,
530
+ colon: data.config.colon || true,
531
+ labelAlign: data.config.labelAlign || "right",
532
+ size: data.config.size || "middle",
533
+ },
534
+ children: [],
535
+ id: "form_" + getUUID(),
536
+ },
537
+ ],
538
+ componentProps: {
539
+ style: {
540
+ padding: "16px",
541
+ },
542
+ },
543
+ },
544
+ ],
545
+ script: data.script || "",
546
+ };
547
+
548
+ convertedData.schemas[0]!.children![0]!.children = recursionConvertedNode(
549
+ data.list
550
+ );
551
+
552
+ return convertedData;
553
+ }
554
+
555
+ /**
556
+ * 递归转换子节点
557
+ * @param children
558
+ */
559
+ export function recursionConvertedNode(
560
+ children: any,
561
+ parent?: any
562
+ ): ComponentSchema[] {
563
+ return children.map((item: any) => {
564
+ let type = item.type ?? "";
565
+ const componentProps = item.options ?? {};
566
+
567
+ const handleUploadComponent = (uploadType: string, replacement: string) => {
568
+ if (type === uploadType) {
569
+ type = replacement;
570
+ if (componentProps.defaultValue) {
571
+ componentProps.defaultValue = JSON.parse(componentProps.defaultValue);
572
+ }
573
+ }
574
+ };
575
+
576
+ handleUploadComponent("uploadImg", "upload-image");
577
+ handleUploadComponent("uploadFile", "upload-file");
578
+
579
+ if (type === "date" && componentProps.range) {
580
+ componentProps.type = "daterange";
581
+ delete componentProps.range;
582
+ }
583
+
584
+ if (type === "date" || type === "time") {
585
+ componentProps.valueFormat = componentProps.format;
586
+ }
587
+
588
+ if (type === "textarea") {
589
+ const { minRows, maxRows } = componentProps;
590
+ componentProps.autoSize = { minRows, maxRows };
591
+ delete componentProps.minRows;
592
+ delete componentProps.maxRows;
593
+ }
594
+
595
+ if (type === "number" && !componentProps.precision) {
596
+ delete componentProps.precision;
597
+ }
598
+
599
+ if (componentProps.width) {
600
+ componentProps.style = { width: componentProps.width };
601
+ delete componentProps.width;
602
+ }
603
+
604
+ if (type === "grid") {
605
+ type = "row";
606
+ // 待修改
607
+ }
608
+
609
+ if (parent && parent.type === "grid") {
610
+ type = "col";
611
+ componentProps.span = item.span;
612
+ item.key = getUUID();
613
+ }
614
+
615
+ // 创建新的节点数据
616
+ const newItem: ComponentSchema = {
617
+ label: item.label,
618
+ type,
619
+ icon: item.icon || "",
620
+ field: item.model,
621
+ componentProps,
622
+ id: item.key,
623
+ };
624
+
625
+ // 隐藏label 和 无FormItem 数据
626
+ if (componentProps.noFormItem || !componentProps.showLabel) {
627
+ newItem.noFormItem = true;
628
+ delete componentProps.noFormItem;
629
+ delete componentProps.showLabel;
630
+ }
631
+
632
+ // 清空属性字段
633
+ if (componentProps.clearable) {
634
+ componentProps.allowClear = true;
635
+ delete componentProps.clearable;
636
+ }
637
+
638
+ // 输入组件
639
+ const inputTypes = [
640
+ "input",
641
+ "textarea",
642
+ "number",
643
+ "password",
644
+ "select",
645
+ "cascader",
646
+ "checkbox",
647
+ "radio",
648
+ "date",
649
+ "time",
650
+ "slider",
651
+ "switch",
652
+ "color-picker",
653
+ "upload-file",
654
+ "upload-image",
655
+ ];
656
+ if (inputTypes.includes(type)) {
657
+ newItem.input = true;
658
+ if (item.rules?.[0]?.required === false) {
659
+ item.rules.shift();
660
+ }
661
+ if (item.rules?.length > 0) {
662
+ newItem.rules = item.rules;
663
+ }
664
+ }
665
+
666
+ // 递归子节点转换
667
+ if (item.list) {
668
+ newItem.children = recursionConvertedNode(item.list, item);
669
+ }
670
+ if (item.columns) {
671
+ newItem.children = recursionConvertedNode(item.columns, item);
672
+ }
673
+ if (item.trs) {
674
+ newItem.children = recursionConvertedNode(item.trs, item);
675
+ }
676
+ if (item.tds) {
677
+ newItem.children = recursionConvertedNode(item.tds, item);
678
+ }
679
+
680
+ return newItem;
681
+ });
682
+ }