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,91 @@
1
+ <template>
2
+ <ENode ref="nodeRef" :componentSchema="props.schema">
3
+ <!-- childImmovable不可拖拽设计 start -->
4
+ <template v-if="pluginManager.getComponentConfingByType(props.schema.type)?.editConstraints?.childImmovable" #edit-node>
5
+ <ENodeItem v-for="schema in props.schema.children" :key="schema.id" :schema="schema" />
6
+ </template>
7
+ <!-- childImmovable不可拖拽设计 end -->
8
+
9
+ <template v-else #edit-node>
10
+ <KEditNodeItem v-if="props.schema.children" v-model:schemas="props.schema.children" />
11
+ </template>
12
+ </ENode>
13
+ </template>
14
+ <script lang="ts" setup>
15
+ import ENode from '../../../../node'
16
+ import { ComponentSchema, Designer } from '../../../../../types/epic-designer'
17
+ import KEditNodeItem from './editNodeItem.vue'
18
+ import { useAttrs, provide, watch, ref, onUnmounted, computed, inject } from 'vue';
19
+ import { pluginManager, type PageManager } from '@epic-designer/utils'
20
+
21
+ const attrs = useAttrs()
22
+ const designer = inject('designer') as Designer
23
+ const pageManager = inject('pageManager', {}) as PageManager
24
+
25
+ const nodeRef = ref<HTMLBaseElement | null>(null)
26
+
27
+ provide("nodeAttrs", attrs)
28
+ defineOptions({
29
+ name: 'ENodeItem'
30
+ })
31
+ const props = defineProps<{
32
+ schema: ComponentSchema
33
+ name?: string
34
+ }>()
35
+
36
+
37
+
38
+ /**
39
+ * 获取当前组件dom元素
40
+ */
41
+ const getComponentElement = computed<HTMLBaseElement | null>(() => {
42
+ const componentInstances = pageManager.componentInstances.value
43
+ const id = props.schema?.id
44
+ const componentConfing = pluginManager.getComponentConfingByType(props.schema?.type!) ?? null
45
+ if (!id || !componentInstances?.[id]) {
46
+ return null
47
+ }
48
+ if (componentConfing?.defaultSchema.input && props.schema?.noFormItem !== true) {
49
+ return componentInstances[id + 'formItem']?.$el
50
+ }
51
+ const componentInstance = componentInstances[id]
52
+ if (componentInstance?.$el?.nodeName === '#text') {
53
+ return null
54
+ }
55
+ return componentInstance?.$el
56
+ })
57
+
58
+ // 监听选中dom元素变化
59
+ watch(() => getComponentElement.value, (componentElement) => {
60
+ componentElement?.addEventListener('click', setCheckedNode, false)
61
+ componentElement?.addEventListener('mouseover', setHoverNode, false)
62
+ componentElement?.addEventListener('mouseout', clearHoverNode, false)
63
+ })
64
+
65
+ onUnmounted(() => {
66
+ getComponentElement.value?.removeEventListener('click', setCheckedNode, false)
67
+ getComponentElement.value?.removeEventListener('mouseover', setHoverNode, false)
68
+ getComponentElement.value?.removeEventListener('mouseout', clearHoverNode, false)
69
+ })
70
+
71
+
72
+
73
+ function setCheckedNode(event: Event) {
74
+ event.stopPropagation()
75
+ designer.setCheckedNode(props.schema)
76
+ }
77
+
78
+ function setHoverNode(event: Event) {
79
+ if (props.schema.type === 'page') return
80
+ event.stopPropagation()
81
+ designer.setHoverNode(props.schema)
82
+ }
83
+
84
+ function clearHoverNode(event: Event) {
85
+ event.stopPropagation()
86
+ designer.setHoverNode(null)
87
+ }
88
+
89
+
90
+
91
+ </script>
@@ -0,0 +1,61 @@
1
+ <template>
2
+ <Modal v-model="visible" title="查看数据" class="w-900px" width="900px" @close="handleClose" @ok="handleExportData"
3
+ okText="导出数据">
4
+ <div class="min-w-750px rounded h-full">
5
+ <MonacoEditor ref="monacoEditorRef" class="editor h-full" autoToggleTheme :config="MonacoEditorConfig" language="json" />
6
+ </div>
7
+ </Modal>
8
+ </template>
9
+ <script lang="ts" setup>
10
+ import { pluginManager } from '@epic-designer/utils'
11
+ import { ref, inject, nextTick } from 'vue'
12
+ import { PageSchema } from '../../../../../types/epic-designer'
13
+
14
+ const Modal = pluginManager.getComponent('modal')
15
+ const MonacoEditor = pluginManager.getComponent('monacoEditor')
16
+ const MonacoEditorConfig = {
17
+ theme: 'vs-light',
18
+ selectOnLineNumbers: true,
19
+ minimap: {
20
+ enabled: false
21
+ },
22
+ readOnly: true
23
+ }
24
+ const monacoEditorRef = ref<any>(null)
25
+ const visible = ref(false)
26
+ const pageSchema = inject('pageSchema') as PageSchema
27
+ function handleClose() {
28
+ visible.value = false
29
+ }
30
+
31
+ // 打开预览页面
32
+ function handleOpen() {
33
+ visible.value = true
34
+ if (monacoEditorRef.value) {
35
+ monacoEditorRef.value.setValue(JSON.stringify(pageSchema, null, 2))
36
+ } else {
37
+ // 编辑器组件未加载,延时重新调用函数
38
+ setTimeout(() => {
39
+ handleOpen()
40
+ }, 300)
41
+ }
42
+ }
43
+
44
+
45
+ /**
46
+ * 导出数据
47
+ */
48
+ function handleExportData(fileName = `epic-data.json`) {
49
+ let content = "data:text/json;charset=utf-8,";
50
+ content += JSON.stringify(pageSchema, null, 2);
51
+ var encodedUri = encodeURI(content);
52
+ var actions = document.createElement("a");
53
+ actions.setAttribute("href", encodedUri);
54
+ actions.setAttribute("download", fileName);
55
+ actions.click();
56
+ }
57
+
58
+ defineExpose({
59
+ handleOpen
60
+ })
61
+ </script>
@@ -0,0 +1,373 @@
1
+ <template>
2
+ <!-- 选中高亮 start -->
3
+ <div v-show="showSelector && designer.state.checkedNode?.id !== 'root'" ref="selectorRef"
4
+ class="epic-checked-widget absolute pointer-events-none z-20"
5
+ :class="selectorPosition + ' ' + (selectorTransition ? 'transition-all' : '')">
6
+ <div class="epic-widget-action-box" ref="actionBoxRef">
7
+ <div class="epic-widget-action-item whitespace-nowrap">
8
+ <!-- {{ designer.state.checkedNode?.type }} -->
9
+ {{ pluginManager.getComponentConfingByType(designer.state.checkedNode?.type
10
+ ?? '')?.defaultSchema.label }}
11
+ </div>
12
+ <!-- 操作按钮 start -->
13
+ <div class="flex" v-if="isRemovableAndDraggable">
14
+ <div title="复制" class="epic-widget-action-item pointer-events-auto" @click="handleCopy">
15
+ <EIcon name="icon-fuzhi3" />
16
+ </div>
17
+ <div title="删除" class="epic-widget-action-item pointer-events-auto" @click="handleDelete">
18
+ <EIcon name="icon-shanchu1" />
19
+ </div>
20
+ </div>
21
+ <!-- 操作按钮 end -->
22
+ </div>
23
+ </div>
24
+ <!-- 选中高亮 end -->
25
+ <!-- 悬停效果 start -->
26
+ <div v-show="showHover && designer.state.checkedNode?.id !== designer.state.hoverNode?.id" ref="hoverWidgetRef"
27
+ class="epic-hover-widget absolute transition-all pointer-events-none z-998" />
28
+ <!-- 悬停效果 end -->
29
+ </template>
30
+ <script lang="ts" setup>
31
+ import { DesignerProps } from '../../types'
32
+ import { PageSchema, Designer } from '../../../../../types/epic-designer'
33
+ import { inject, computed, ref, watch, type Ref } from 'vue'
34
+ import { pluginManager, generateNewSchema, revoke, findSchemaInfoById, useShareStore, useTimedQuery, type PageManager } from '@epic-designer/utils'
35
+ import { useResizeObserver } from '@vueuse/core'
36
+ import EIcon from '../../../../icon'
37
+ const pageManager = inject('pageManager', {}) as PageManager
38
+ const pageSchema = inject('pageSchema') as PageSchema
39
+ const designer = inject('designer') as Designer
40
+ const designerProps = inject('designerProps') as Ref<DesignerProps>
41
+
42
+
43
+ const selectorRef = ref<HTMLDivElement | null>(null)
44
+ const hoverWidgetRef = ref<HTMLDivElement | null>(null)
45
+ const actionBoxRef = ref<HTMLDivElement | null>(null)
46
+
47
+ const showSelector = ref(false)
48
+ const showHover = ref(false)
49
+ const selectorTransition = ref(true)
50
+
51
+
52
+ const selectorPosition = ref<'top' | 'center' | 'bottom'>('top')
53
+
54
+ const { canvasScale, disabledZoom } = useShareStore()
55
+
56
+ let kEditRange: HTMLDivElement | null = null
57
+
58
+ /**
59
+ * 判断组件是否可移动和可拖拽删除
60
+ */
61
+ const isRemovableAndDraggable = computed(() => {
62
+ const schemas = designer.state.checkedNode
63
+ // 没有id不可编辑
64
+ if (!schemas?.id) return false
65
+ // 判断当前节点类型是否允许拖拽删除
66
+ if (designerProps.value.lockDefaultSchemaEdit && pageManager.defaultComponentIds.value.includes(schemas?.id)) {
67
+ // 禁止拖拽删除
68
+ return false
69
+ }
70
+ return true
71
+ })
72
+
73
+
74
+ /**
75
+ * 获取选中组件dom元素
76
+ */
77
+ const getSelectComponentElement = computed<HTMLBaseElement | null>(() => {
78
+ const componentInstances = pageManager.componentInstances.value
79
+ const id = designer.state.checkedNode?.id
80
+
81
+ // 组件隐藏状态
82
+ if (designer.state.checkedNode?.componentProps?.hidden) {
83
+ return null
84
+ }
85
+ const componentConfing = pluginManager.getComponentConfingByType(designer.state.checkedNode?.type!) ?? null
86
+ if (!id || !componentInstances?.[id]) {
87
+ return null
88
+ }
89
+ if (componentConfing?.defaultSchema.input && designer.state.checkedNode?.noFormItem !== true) {
90
+ return componentInstances[id + 'formItem']?.$el
91
+ }
92
+ const componentInstance = componentInstances[id]
93
+ if (!componentInstance?.$el || componentInstance?.$el.nodeName === '#text' || !componentInstance?.$el.getBoundingClientRect) {
94
+ return null
95
+ }
96
+
97
+ return componentInstance?.$el
98
+ })
99
+
100
+ /**
101
+ * 获取悬停组件dom元素
102
+ */
103
+ const getHoverComponentElement = computed<HTMLBaseElement | null>(() => {
104
+ const componentInstances = pageManager.componentInstances.value
105
+ const id = designer.state.hoverNode?.id
106
+ const componentConfing = pluginManager.getComponentConfingByType(designer.state.hoverNode?.type!) ?? null
107
+ if (!id || !componentInstances?.[id]) {
108
+ return null
109
+ }
110
+ if (componentConfing?.defaultSchema.input && designer.state.hoverNode?.noFormItem !== true) {
111
+ return componentInstances[id + 'formItem']?.$el
112
+ }
113
+ const componentInstance = componentInstances[id]
114
+ if (componentInstance?.$el.nodeName === '#text') {
115
+ return null
116
+ }
117
+ return componentInstance?.$el
118
+ })
119
+
120
+ const { mutationObserver, observerConfig: DocumentObserverConfig } = initObserve(setSeletorStyle)
121
+
122
+ const { startTimedQuery, stopTimedQuery } = useTimedQuery(setSeletorStyle)
123
+
124
+ // 监听选中dom元素变化
125
+ watch(() => getSelectComponentElement.value, (selectComponentElement) => {
126
+ if (selectComponentElement) {
127
+ showSelector.value = true
128
+ // 监听dom元素及子元素的变化
129
+ mutationObserver.observe(selectComponentElement, DocumentObserverConfig)
130
+
131
+ const parentNode = selectComponentElement.parentNode as HTMLBaseElement
132
+ if (parentNode) {
133
+ parentNode.ondragstart = () => {
134
+ selectorTransition.value = false
135
+ startTimedQuery()
136
+ }
137
+ parentNode.ondragend = () => {
138
+ selectorTransition.value = true
139
+ stopTimedQuery()
140
+ }
141
+ }
142
+ setSeletorStyle()
143
+
144
+
145
+
146
+
147
+
148
+
149
+
150
+ } else {
151
+ showSelector.value = false
152
+ }
153
+ })
154
+
155
+
156
+ const { mutationObserver: hoverMutationObserver, observerConfig: hoverObserverConfig } = initObserve(setHoverStyle)
157
+
158
+ // 监听悬停dom元素变化
159
+ watch(() => getHoverComponentElement.value, (hoverComponentElement) => {
160
+ if (hoverComponentElement) {
161
+ // 监听dom元素及子元素的变化
162
+ hoverMutationObserver.observe(hoverComponentElement, hoverObserverConfig)
163
+ setHoverStyle()
164
+ }
165
+ })
166
+
167
+
168
+ // 添加悬停节点监听,当悬停节点消失超过300ms,则隐藏悬停部件
169
+ let hideTimer: NodeJS.Timeout | number = 0
170
+ watch(() => designer.state.hoverNode?.id, e => {
171
+ if (e) {
172
+ showHover.value = true
173
+ clearTimeout(hideTimer)
174
+ return
175
+ }
176
+
177
+ hideTimer = setTimeout(() => {
178
+ showHover.value = false
179
+ }, 300)
180
+ })
181
+
182
+
183
+
184
+ let oldScrollTop = 0
185
+ let oldScrollLeft = 0
186
+ /**
187
+ * 设置选择部件 样式 定位 宽高
188
+ */
189
+ function setSeletorStyle() {
190
+ const element = getSelectComponentElement.value
191
+ if (!element || !kEditRange) return
192
+
193
+ const { top: offsetY, left: offsetX } = kEditRange?.getBoundingClientRect()
194
+
195
+ const { top, left, width, height } = element.getBoundingClientRect()
196
+
197
+
198
+ const scale = !disabledZoom.value ? canvasScale.value : 1
199
+ // 计算选择器部件位置
200
+ const selectorTop = top - offsetY + (kEditRange?.scrollTop ?? 0) * scale
201
+ const selectorLeft = left - offsetX + (kEditRange?.scrollLeft ?? 0) * scale
202
+
203
+ const selectorRefHeight = height / scale
204
+
205
+ if (selectorRef.value) {
206
+ selectorRef.value.style.width = `${width / scale}px`
207
+ selectorRef.value.style.height = `${selectorRefHeight}px`
208
+ selectorRef.value.style.top = `${selectorTop / scale}px`
209
+ selectorRef.value.style.left = `${selectorLeft / scale}px`
210
+ scrollIntoView(selectorTop, selectorLeft)
211
+
212
+ }
213
+
214
+ // 调整操作调位置 start
215
+ // 判断actionBoxRef是否有值
216
+ if (!actionBoxRef.value) {
217
+ return
218
+ }
219
+
220
+ // 判断actionBoxRef位置是否应该置于底部 距离顶部45px 高度100px
221
+ if (selectorTop < 45 && selectorRefHeight < 100) {
222
+ actionBoxRef.value.style.top = ''
223
+ actionBoxRef.value.style.bottom = '-30px'
224
+ actionBoxRef.value.style['border-radius'] = '0px 0px 4px 4px'
225
+ selectorPosition.value = 'bottom'
226
+
227
+ } else if (selectorTop < 45) {
228
+ // 判断actionBoxRef位置置于中间
229
+ actionBoxRef.value.style.top = '0px'
230
+ actionBoxRef.value.style['border-radius'] = '0px 0px 4px 0'
231
+ selectorPosition.value = 'center'
232
+
233
+ } else {
234
+ // actionBoxRef位置置于顶部
235
+ actionBoxRef.value.style.top = '-30px'
236
+ actionBoxRef.value.style['border-radius'] = '4px 4px 0px 0px'
237
+ selectorPosition.value = 'top'
238
+ }
239
+ // 调整操作调位置 end
240
+
241
+
242
+
243
+ }
244
+
245
+ /**
246
+ * 滚动进入可视区
247
+ */
248
+ function scrollIntoView(selectorTop: number, selectorLeft: number) {
249
+ // 自动滚动到元素可视区域 start
250
+ const element = getSelectComponentElement.value
251
+ if (!kEditRange || !element) return
252
+ // 获取两个元素的边界框信息
253
+ const rect2 = kEditRange.getBoundingClientRect();
254
+ const { width } = element.getBoundingClientRect()
255
+
256
+ const scale = !disabledZoom.value ? canvasScale.value : 1
257
+
258
+ // 使selectComponentElement位于可见区域内
259
+ const newScrollTop = selectorTop / scale - rect2.top
260
+ let newScrollLeft = selectorLeft / scale - rect2.left + width / scale
261
+ newScrollLeft < rect2.width && (newScrollLeft = 0)
262
+ const yMin = kEditRange.scrollTop - rect2.height / 3 + 60
263
+ const yMax = kEditRange.scrollTop + rect2.height / 3 * 2
264
+ const xMin = kEditRange.scrollLeft - rect2.width + 200
265
+ const xMax = kEditRange.scrollLeft + rect2.width - 200
266
+
267
+ // 判断定位误差是否小于10px,小于则不处理
268
+ if (Math.abs(newScrollTop - oldScrollTop) < 10 && Math.abs(newScrollLeft - oldScrollLeft) < 10) return
269
+ oldScrollTop = newScrollTop
270
+ oldScrollLeft = newScrollLeft
271
+ if (newScrollTop > yMin && newScrollTop < yMax && newScrollLeft > xMin && newScrollLeft < xMax) return
272
+
273
+ kEditRange.scrollTop = newScrollTop;
274
+ kEditRange.scrollLeft = newScrollLeft;
275
+ // 自动滚动到元素可视区域 end
276
+ }
277
+
278
+ /**
279
+ * 设置悬停部件 样式 定位 宽高
280
+ */
281
+ function setHoverStyle() {
282
+ const element = getHoverComponentElement.value
283
+
284
+ if (!element) return
285
+ const { top: offsetY, left: offsetX } = kEditRange?.getBoundingClientRect() ?? { top: 0, left: 0 }
286
+ const { top, left, width, height } = element.getBoundingClientRect?.() ?? element.nextElementSibling?.getBoundingClientRect()
287
+ const scale = !disabledZoom.value ? canvasScale.value : 1
288
+
289
+ // 计算选择器部件位置
290
+ const hoverTop = top - offsetY + (kEditRange?.scrollTop ?? 0) * scale
291
+ const hoverLeft = left - offsetX + (kEditRange?.scrollLeft ?? 0) * scale
292
+
293
+ if (hoverWidgetRef.value) {
294
+ hoverWidgetRef.value.style.width = `${width / scale}px`
295
+ hoverWidgetRef.value.style.height = `${height / scale}px`
296
+ hoverWidgetRef.value.style.top = `${hoverTop / scale}px`
297
+ hoverWidgetRef.value.style.left = `${hoverLeft / scale}px`
298
+ }
299
+ }
300
+
301
+ /**
302
+ * 实例化观察者对象
303
+ */
304
+ function initObserve(func: () => void) {
305
+ const MutationObserver = window.MutationObserver
306
+
307
+ const observerConfig = {
308
+ childList: true,
309
+ attributes: true,
310
+ subtree: true
311
+ }
312
+
313
+ // 初始化观察者实例
314
+ const mutationObserver = new MutationObserver(func)
315
+
316
+ return {
317
+ mutationObserver,
318
+ observerConfig
319
+ }
320
+ }
321
+
322
+ /**
323
+ * 复制选中节点元素
324
+ */
325
+ function handleCopy() {
326
+ const data = findSchemaInfoById(pageSchema.schemas, designer.state.checkedNode?.id ?? 'root')
327
+ if (!data) {
328
+ return false
329
+ }
330
+ const { list, schema, index } = data
331
+ const node = generateNewSchema(schema)
332
+ list.splice(index + 1, 0, node)
333
+ designer.setCheckedNode(node)
334
+
335
+ revoke.push(pageSchema.schemas, '复制组件')
336
+ }
337
+
338
+ /**
339
+ * 删除元素
340
+ */
341
+ function handleDelete() {
342
+ const data = findSchemaInfoById(pageSchema.schemas, designer.state.checkedNode?.id ?? 'root')
343
+ if (!data) {
344
+ return false
345
+ }
346
+ let { list, schema: _schema, index } = data
347
+ list.splice(index, 1)
348
+ if (index === list.length) {
349
+ index--
350
+ }
351
+ designer.setCheckedNode(list[index])
352
+ revoke.push(pageSchema.schemas, '删除组件')
353
+ }
354
+
355
+ // 初始化函数,传入一个指向 Epic 编辑范围的引用
356
+ function handleInit(epicEditRangeRef) {
357
+ kEditRange = epicEditRangeRef
358
+ kEditRange?.addEventListener('scroll', () => {
359
+ setSeletorStyle()
360
+ })
361
+
362
+ // 监听选中元素视窗变化
363
+ useResizeObserver(getSelectComponentElement, setSeletorStyle)
364
+ // 监听悬停元素视窗变化
365
+ useResizeObserver(getHoverComponentElement, setHoverStyle)
366
+ }
367
+
368
+
369
+ defineExpose({
370
+ handleInit
371
+ })
372
+
373
+ </script>