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,248 @@
1
+ <template>
2
+ <!-- 工具条 start -->
3
+ <div class="epic-edit-toolbar flex items-center justify-between px-4">
4
+ <div class="flex-1 h-full flex items-center">
5
+ <div :title="item.title" class="epic-action-item h-90% px-10px flex items-center cursor-pointer"
6
+ v-for="(item, index) in actionOptions" :class="{ disabled: item.disabled }" :key="index"
7
+ @click="item.on">
8
+ <EIcon :name="item.icon"></EIcon>
9
+ </div>
10
+ </div>
11
+
12
+ <input type="file" ref="fileRef" accept=".json,.txt" v-show="false" @change="handleFileSelected">
13
+
14
+ <div class="flex-1 h-full flex items-center justify-center">
15
+ <div :title="item.title" class="epic-device-item h-90% px-10px flex items-center cursor-pointer"
16
+ :class="{ checked: item.key === checkedKey }" v-for="item in deviceOptions" :key="item.key"
17
+ @click="handleSetCanvas(item.key)">
18
+ <EIcon :name="item.icon"></EIcon>
19
+ </div>
20
+ </div>
21
+ <div class="flex-1 h-full flex items-center justify-end">
22
+
23
+ <!-- 缩放操作 start -->
24
+ <div v-if="!disabledZoom" class="flex items-center ml-12px">
25
+ <div class="pr-8px w-82px cursor-pointer">
26
+ <Select v-model:value="canvasScaleComuted" v-model="canvasScaleComuted"
27
+ :options="canvasScaleOptions" size="small"></Select>
28
+ </div>
29
+ <div class="w-90px cursor-pointer">
30
+ <Slider :min="0.6" :max="1.4" :step="0.01" :tooltip="false" v-model:value="canvasScale"
31
+ v-model="canvasScale" />
32
+ </div>
33
+ </div>
34
+ <!-- 缩放操作 end -->
35
+ </div>
36
+ </div>
37
+ <EPreviewJson ref="previewJson" />
38
+ <!-- 工具条 end -->
39
+ </template>
40
+ <script lang="ts" setup>
41
+ import { useShareStore, pluginManager, revoke, deepCompareAndModify, convertKFormData } from '@epic-designer/utils'
42
+ import type { PageSchema, Designer } from '../../../../../types/epic-designer'
43
+ import { computed, inject, ref } from 'vue'
44
+ import EIcon from '../../../../icon'
45
+ import EPreviewJson from './previewJson.vue'
46
+
47
+ const Slider = pluginManager.getComponent('slider')
48
+ const Select = pluginManager.getComponent('select')
49
+
50
+ const { canvasScale, disabledZoom } = useShareStore()
51
+ const checkedKey = ref('pc')
52
+ const pageSchema = inject('pageSchema') as PageSchema
53
+ const designer = inject('designer') as Designer
54
+ const previewJson = ref<InstanceType<typeof EPreviewJson> | null>(null)
55
+
56
+ const deviceOptions = [
57
+ {
58
+ icon: 'icon-a-diannaotoubu',
59
+ title: 'pc',
60
+ key: 'pc'
61
+ },
62
+ {
63
+ icon: 'icon-a-pingbantoubu',
64
+ title: '平板',
65
+ key: 'pad'
66
+ },
67
+ {
68
+ icon: 'icon-a-shoujitoubu',
69
+ title: '手机',
70
+ key: 'mobile'
71
+ },
72
+ ]
73
+
74
+ const recordList = revoke.recordList
75
+ const undoList = revoke.undoList
76
+
77
+
78
+
79
+ const actionOptions = computed(() => {
80
+ return [
81
+ {
82
+ icon: 'icon-daima1',
83
+ title: '查看数据',
84
+ on: () => handlePreview()
85
+ },
86
+ {
87
+ icon: 'icon-shangchuan1',
88
+ title: '导入数据',
89
+ on: handleOpenFileSelector
90
+ },
91
+ {
92
+ icon: 'icon-shanchu1',
93
+ title: '清空',
94
+ on: handleReset
95
+ },
96
+ {
97
+ icon: 'icon-chexiao2x',
98
+ title: '撤销',
99
+ on: handleUndo,
100
+ disabled: !recordList.value.length
101
+ },
102
+ {
103
+ icon: 'icon-fanhui2x',
104
+ title: '重做',
105
+ on: handleRedo,
106
+ disabled: !undoList.value.length
107
+ },
108
+
109
+ ]
110
+ })
111
+
112
+ const fileRef = ref<HTMLInputElement | null>(null)
113
+ const canvasScaleComuted = computed({
114
+ get() {
115
+ return `${(canvasScale.value * 100).toFixed(0)}%`
116
+ },
117
+ set(value) {
118
+ canvasScale.value = Number(value)
119
+ }
120
+ })
121
+
122
+ const canvasScaleOptions = [
123
+ {
124
+ label: "60%",
125
+ value: "0.6",
126
+ },
127
+ {
128
+ label: "80%",
129
+ value: "0.8",
130
+ },
131
+ {
132
+ label: "100%",
133
+ value: "1.0",
134
+ },
135
+ {
136
+ label: "120%",
137
+ value: "1.2",
138
+ },
139
+ {
140
+ label: "140%",
141
+ value: "1.4",
142
+ },
143
+ ]
144
+
145
+ /**
146
+ * 撤销操作
147
+ */
148
+ function handleUndo() {
149
+ const componentSchema = revoke.undo()
150
+ if (!componentSchema) return
151
+ deepCompareAndModify(pageSchema.schemas, componentSchema)
152
+ designer.setCheckedNode(pageSchema.schemas[0])
153
+ }
154
+
155
+ /**
156
+ * 重做操作
157
+ */
158
+ function handleRedo() {
159
+ const componentSchema = revoke.redo()
160
+ if (!componentSchema) return
161
+ deepCompareAndModify(pageSchema.schemas, componentSchema)
162
+ designer.setCheckedNode(pageSchema.schemas[0])
163
+ }
164
+
165
+
166
+ /**
167
+ * 重置页面数据
168
+ */
169
+ function handleReset() {
170
+ designer.reset()
171
+ }
172
+
173
+ // 预览数据
174
+ function handlePreview() {
175
+ previewJson.value!.handleOpen()
176
+ }
177
+
178
+
179
+ /**
180
+ * 打开文件选择器
181
+ */
182
+ function handleOpenFileSelector() {
183
+ fileRef.value?.click()
184
+ }
185
+
186
+ // 选择文件
187
+ function handleFileSelected(e) {
188
+ const file = e.target.files?.[0]
189
+ if (!file) return
190
+ e.target.value = null
191
+
192
+ // 通过json文件导入
193
+ const reader = new FileReader();
194
+ reader.readAsText(file);
195
+ reader.onload = (res) => {
196
+ handleImporttData(res.target?.result as string);
197
+
198
+ };
199
+ }
200
+
201
+ /**
202
+ * 导入数据
203
+ */
204
+ function handleImporttData(content?: string) {
205
+ // 导入JSON
206
+ try {
207
+
208
+ let schema = JSON.parse(content ?? '')
209
+ if (!schema.schemas) {
210
+ schema = convertKFormData(schema)
211
+ }
212
+
213
+ // 调用 deepCompareAndModify 函数比较 pageSchema 和传入的 schema,进行修改
214
+ deepCompareAndModify(pageSchema, schema)
215
+
216
+
217
+ } catch (error) {
218
+ console.error(error);
219
+ }
220
+ }
221
+
222
+ /**
223
+ * 设置画布宽高
224
+ * @param type
225
+ */
226
+ function handleSetCanvas(type: string) {
227
+ designer.handleToggleDeviceMode(type)
228
+ checkedKey.value = type
229
+ const canvasConfigs = {
230
+ pc: {
231
+
232
+ },
233
+ pad: {
234
+ width: '800px',
235
+ mode:type
236
+ },
237
+ mobile: {
238
+ width: '420px',
239
+ mode:type
240
+ },
241
+ }
242
+
243
+ pageSchema.canvas = canvasConfigs[type]
244
+ }
245
+
246
+
247
+
248
+ </script>
@@ -0,0 +1,16 @@
1
+ // 头部
2
+ .epic-header-container {
3
+ border: 1px solid var(--epic-border-color);
4
+ border-bottom: 0;
5
+ }
6
+
7
+ .epic-header,
8
+ .epic-header a {
9
+ height: 42px;
10
+ background-color: var(--epic-header-color);
11
+ display: flex;
12
+ align-items: center;
13
+ justify-content: space-between;
14
+ padding: 0 12px;
15
+ color: var(--epic-text-main);
16
+ }
@@ -0,0 +1,60 @@
1
+ <template>
2
+ <header class="epic-header relative">
3
+ <div class="epic-header-item flex-1 items-center flex">
4
+ <slot name="prefix">
5
+ <a class="decoration-none items-center flex" href="https://github.com/Kchengz/epic-designer" target="_blank">
6
+ <img src="../../../../../static/logo.png" class="w-18px h-18px" alt="" srcset="">
7
+ <span class="ml-3">EpicDesigner</span>
8
+ </a>
9
+ </slot>
10
+ </div>
11
+
12
+ <div class="epic-header-item flex-1 flex justify-center text-12px">
13
+ <slot name="title">
14
+ {{ designerProps.title }}
15
+ </slot>
16
+ </div>
17
+ <div class="epic-header-item flex-1 flex justify-end items-center">
18
+ <slot name="right-prefix"></slot>
19
+ <slot name="right-action">
20
+ <div>
21
+ <Button size="small" @click="handlePreview">
22
+ <EIcon name="icon-yulan" style="margin-right:6px" />
23
+ 预览
24
+ </Button>
25
+ </div>
26
+ <div class="ml-2">
27
+ <Button size="small" @click="handleSave">
28
+ <EIcon name="icon-baocun" style="margin-right:6px" />
29
+ 保存
30
+ </Button>
31
+ </div>
32
+ </slot>
33
+ <slot name="right-suffix"></slot>
34
+ </div>
35
+ </header>
36
+ </template>
37
+ <script lang="ts" setup>
38
+ import { inject, type Ref } from 'vue'
39
+ import { pluginManager } from '@epic-designer/utils'
40
+ import EIcon from '../../../../icon'
41
+ import { DesignerProps } from '../../types'
42
+ const emits = defineEmits(['save', 'reset', 'preview'])
43
+ const Button = pluginManager.getComponent('button')
44
+ const designerProps = inject('designerProps') as Ref<DesignerProps>
45
+
46
+ /**
47
+ * 预览
48
+ */
49
+ function handlePreview() {
50
+ emits('preview')
51
+ }
52
+
53
+ /**
54
+ * 触发保存操作
55
+ */
56
+ function handleSave() {
57
+ emits('save')
58
+ }
59
+
60
+ </script>
@@ -0,0 +1,7 @@
1
+ .epic-outline {
2
+ overflow: auto;
3
+ height: 100%;
4
+ box-sizing: border-box;
5
+ }
6
+
7
+
@@ -0,0 +1,39 @@
1
+ <template>
2
+ <div class="epic-outline">
3
+ <ETree :options="pageSchema.schemas" draggable :selected-keys="selectedKeys" :hover-key="designer.state.hoverNode?.id"
4
+ @nodeClick="handleNodeClick">
5
+ <template #tree-node="{ schema }">
6
+ <div class="epic-text-padding" @mouseenter.stop="designer.setHoverNode(schema)"
7
+ @mouseleave.stop="designer.setHoverNode(null)">
8
+ {{ schema.label ??
9
+ pluginManager.getComponentConfingByType(schema.type)?.defaultSchema.label }}
10
+ <span class="epic-node-type-text">
11
+ {{ schema.type }}
12
+ </span>
13
+ </div>
14
+ </template>
15
+ </ETree>
16
+ </div>
17
+ </template>
18
+ <script lang="ts" setup>
19
+ import ETree from '../../../../tree'
20
+ import { inject, computed } from 'vue'
21
+ import { PageSchema, Designer } from '../../../../../types/epic-designer'
22
+ import { pluginManager } from '@epic-designer/utils'
23
+
24
+ const designer = inject('designer') as Designer
25
+ const pageSchema = inject('pageSchema') as PageSchema
26
+
27
+
28
+ // 计算选中节点值
29
+ const selectedKeys = computed(() => {
30
+ const id = designer.state.checkedNode?.id
31
+ return id ? [id] : []
32
+ })
33
+
34
+ // 设置选中节点
35
+ function handleNodeClick(e: any) {
36
+ designer.setCheckedNode(e.componentSchema)
37
+ }
38
+
39
+ </script>
@@ -0,0 +1,71 @@
1
+ <template>
2
+ <Modal v-model="visible" title="预览" class="w-900px" width="900px" @close="handleClose" @ok="handleOk" okText="输出结果">
3
+ <div class="min-w-750px rounded">
4
+ <EBuilder :key="EBuilderKey" ref="kb" :page-schema="pageSchema" />
5
+
6
+ <!-- 输出结果 start -->
7
+ <Modal v-model="dataVisible" title="表单数据" class="w-860px" width="860px" @close="handleCloseData" @ok="handleCloseData">
8
+ <div class="h-full rounded">
9
+ <MonacoEditor ref="monacoEditorRef" autoToggleTheme class="h-full editor" :model-value="formValues" />
10
+ </div>
11
+ </Modal>
12
+ <!-- 输出结果 end -->
13
+ </div>
14
+ </Modal>
15
+ </template>
16
+ <script lang="ts" setup>
17
+ import EBuilder from '../../../../builder'
18
+ import { pluginManager, getUUID } from '@epic-designer/utils'
19
+ import { ref, inject, nextTick } from 'vue'
20
+ import { PageSchema } from '../../../../../types/epic-designer'
21
+ const MonacoEditor = pluginManager.getComponent('monacoEditor')
22
+ const Modal = pluginManager.getComponent('modal')
23
+ const monacoEditorRef = ref<any>(null)
24
+
25
+
26
+ const visible = ref(false)
27
+ const dataVisible = ref(false)
28
+ const formValues = ref({})
29
+
30
+ const pageSchema = inject('pageSchema') as PageSchema
31
+ const kb = ref<any>(null)
32
+ const EBuilderKey = ref('')
33
+
34
+ function handleCloseData() {
35
+ dataVisible.value = false
36
+ }
37
+
38
+ function handleClose() {
39
+ visible.value = false
40
+ }
41
+
42
+
43
+
44
+ function handleOpen() {
45
+ visible.value = true
46
+ // 通过修改key重新渲染组件
47
+ EBuilderKey.value = getUUID()
48
+ }
49
+
50
+ async function handleOk() {
51
+ try {
52
+ const values = await kb.value.validate()
53
+ console.log('表单结果为:', values)
54
+ formValues.value = JSON.stringify(values, null, 2)
55
+ nextTick(() => {
56
+ monacoEditorRef.value?.setValue(formValues.value)
57
+ })
58
+ dataVisible.value = true
59
+ } catch (err) {
60
+ if (typeof err === 'string') {
61
+ alert(err + '\r\n请添加表单组件后再尝试!')
62
+ }
63
+ console.error(err)
64
+ }
65
+
66
+ }
67
+
68
+ defineExpose({
69
+ handleOpen
70
+ })
71
+ </script>
@@ -0,0 +1,30 @@
1
+ <template>
2
+ <div class="epic-breadcrumb pl-4 py-2 truncate">
3
+ <span v-for="(item, index) in designer.state.matched" :key="index">
4
+ <span v-if="index > (designer.state.matched.length - 4)">
5
+ <span v-if="designer.state.matched.length > 3 && index === (designer.state.matched.length - 3)">...</span>
6
+ <EIcon v-if="index !== 0" class="m-1" name="icon-zhankai" />
7
+ <span class="node-item cursor-pointer" @click="handleSelect(item)" @mouseenter.stop="designer.setHoverNode(item)"
8
+ @mouseleave.stop="designer.setHoverNode(null)">
9
+ {{ item.label ?? pluginManager.getComponentConfingByType(item.type)?.defaultSchema.label }}
10
+ </span>
11
+ </span>
12
+
13
+ </span>
14
+ </div>
15
+ </template>
16
+ <script lang="ts" setup>
17
+ import { inject } from 'vue'
18
+ import { Designer, ComponentSchema } from '../../../../../types/epic-designer'
19
+ import EIcon from '../../../../icon'
20
+ import { pluginManager } from '@epic-designer/utils'
21
+ const designer = inject('designer') as Designer
22
+ /**
23
+ * 选中点击节点元素
24
+ * @param schema
25
+ */
26
+ function handleSelect(schema: ComponentSchema) {
27
+ designer.setCheckedNode(schema)
28
+ }
29
+
30
+ </script>
@@ -0,0 +1,75 @@
1
+ .epic-right-sidebar-container {
2
+ background-color: var(--epic-view-color);
3
+ }
4
+
5
+ .epic-right-sidebar-hide-btn {
6
+ background-color: var(--epic-view-color);
7
+ color: var(--epic-text-helper);
8
+ // box-shadow: 2px 5px 6px 3px #ffffff36;
9
+ box-shadow: var(--epic-shadow-color) 0px 1px 4px;
10
+ }
11
+
12
+ .epic-right-sidebar {
13
+ background-color: var(--epic-view-color);
14
+ overflow-x: hidden;
15
+ overflow-y: auto;
16
+ transition: width 0.3s;
17
+ height: 100%;
18
+ display: flex;
19
+ flex-direction: column;
20
+ border-left: 1px solid var(--epic-border-color);
21
+ border-right: 1px solid var(--epic-border-color);
22
+ &.hide {
23
+ width: 0;
24
+ border: 0;
25
+ }
26
+
27
+ .epic-breadcrumb {
28
+ border-bottom: 1px solid var(--epic-border-color);
29
+ color: var(--epic-text-main);
30
+ .iconfont {
31
+ color: var(--epic-text-secondary);
32
+ font-size: var(--epic-text-sm);
33
+ }
34
+ }
35
+
36
+ .epic-actions-container {
37
+ display: flex;
38
+ // border : 1px solid #f89;
39
+
40
+ .epic-action-item {
41
+ padding: 8px 8px;
42
+ flex: 1;
43
+ text-align: center;
44
+ border-bottom: 1px solid var(--epic-border-color);
45
+ cursor: pointer;
46
+ &::after {
47
+ content: "";
48
+ width: 0%;
49
+ left: 50%;
50
+ }
51
+
52
+ &.checked {
53
+ color: var(--epic-primary-color);
54
+ position: relative;
55
+ transition: 0.3s all;
56
+
57
+ &::after {
58
+ content: "";
59
+ position: absolute;
60
+ bottom: 0;
61
+ left: 0;
62
+ width: 100%;
63
+ height: 2px;
64
+ background-color: var(--epic-primary-color);
65
+ transition: 0.3s all;
66
+ }
67
+ }
68
+ }
69
+ }
70
+
71
+ .epic-sidebar-content {
72
+ flex: 1;
73
+ overflow: auto;
74
+ }
75
+ }
@@ -0,0 +1,58 @@
1
+ <template>
2
+ <div v-if="sidebarComponent" class="epic-right-sidebar-container relative">
3
+ <!-- 折叠按钮 start -->
4
+ <div
5
+ class="epic-right-sidebar-hide-btn absolute left--18px top-80px cursor-pointer rounded-full flex justify-center items-center w-28px h-28px z-9"
6
+ @click="handleHideRight">
7
+ <EIcon prefix="" class="iconfont transition-all" :class="{ 'rotate-180': hideRightMain }"
8
+ name="epic-icon-zhankai" />
9
+ </div>
10
+ <div class="w-10px"></div>
11
+ <!-- 折叠按钮 end -->
12
+
13
+ <div class="epic-right-sidebar w-280px" :class="{ hide: hideRightMain }">
14
+ <div class="w-280px">
15
+ <EBreadcrumb />
16
+ <ul class="epic-actions-container">
17
+ <li v-for="(item, index) in rightSidebars" :key="index" class="epic-action-item" :title="item.title"
18
+ :class="{ checked: actionBarCheckedIndex === index }" @click="handleClick(item, index)">
19
+ {{ item.title }}
20
+ </li>
21
+ </ul>
22
+ <div class="epic-sidebar-content">
23
+ <component :is="sidebarComponent" />
24
+ </div>
25
+ </div>
26
+ </div>
27
+
28
+ </div>
29
+ </template>
30
+ <script lang="ts" setup>
31
+ import { ref, computed, shallowRef } from 'vue'
32
+ import { pluginManager } from '@epic-designer/utils'
33
+ import { RightSidebarModel } from '@epic-designer/utils'
34
+ import EBreadcrumb from './breadcrumb.vue'
35
+ import EIcon from "../../../../icon";
36
+
37
+ const hideRightMain = ref(false)
38
+
39
+ const rightSidebars = computed(() => {
40
+ return pluginManager.viewsContainers.rightSidebars.value.filter(item => item.visible)
41
+ })
42
+
43
+ const actionBarCheckedIndex = ref<number | null>(0)
44
+ const sidebarComponent = shallowRef<any>(null)
45
+ sidebarComponent.value = rightSidebars.value[0]?.component
46
+
47
+ function handleHideRight() {
48
+ hideRightMain.value = !hideRightMain.value
49
+ }
50
+
51
+ function handleClick(item: RightSidebarModel, index: number) {
52
+ if (actionBarCheckedIndex.value === index) {
53
+ return false
54
+ }
55
+ sidebarComponent.value = item.component
56
+ actionBarCheckedIndex.value = index
57
+ }
58
+ </script>
@@ -0,0 +1,7 @@
1
+ .epic-sound-code {
2
+ height: 100%;
3
+ }
4
+
5
+ .epic-editor {
6
+ height: 100%;
7
+ }
@@ -0,0 +1,34 @@
1
+ <template>
2
+ <div class="epic-sound-code">
3
+ <MonacoEditor ref="monacoEditorRef" autoToggleTheme class="epic-editor" :model-value="initModelValue"
4
+ lineNumbers="off" @update:model-value="setSchemas" />
5
+ </div>
6
+ </template>
7
+ <script lang="ts" setup>
8
+ import { inject, ref, toRaw, watch } from 'vue'
9
+ import { pluginManager, deepEqual, deepCompareAndModify } from '@epic-designer/utils'
10
+ import { Designer } from '../../../../../types/epic-designer'
11
+ const MonacoEditor = pluginManager.getComponent('monacoEditor')
12
+ const monacoEditorRef = ref<any>(null)
13
+ const designer = inject('designer') as Designer
14
+ let oldVal: any = {}
15
+ watch(() => designer.state.checkedNode, (newVal: any) => {
16
+ if (!deepEqual(oldVal, toRaw(newVal))) {
17
+ monacoEditorRef.value?.setValue(JSON.stringify(newVal, null, 2))
18
+ }
19
+ }, {
20
+ deep: true
21
+ })
22
+
23
+ const initModelValue = JSON.stringify(designer.state.checkedNode, null, 2)
24
+
25
+ function setSchemas(e: string) {
26
+ try {
27
+ if (!designer.state.checkedNode) { return false }
28
+ oldVal = JSON.parse(e)
29
+ deepCompareAndModify(designer.state.checkedNode, oldVal)
30
+ } catch (error) {
31
+ console.warn("[epic-desinger:源码]异常:", error);
32
+ }
33
+ }
34
+ </script>
@@ -0,0 +1,9 @@
1
+ import { PageSchema } from "../../../types/epic-designer";
2
+
3
+ export interface DesignerProps {
4
+ disabledZoom?: boolean;
5
+ hiddenHeader?: boolean;
6
+ lockDefaultSchemaEdit?: boolean;
7
+ title?: string;
8
+ defaultSchema?: PageSchema;
9
+ }
@@ -0,0 +1,2 @@
1
+ import EIcon from './src/icon.vue'
2
+ export default EIcon
@@ -0,0 +1,15 @@
1
+ <template>
2
+ <span class="iconfont" :class="props.prefix + props.name" />
3
+ </template>
4
+ <script lang="ts" setup>
5
+ defineOptions({
6
+ name: 'EIcon'
7
+ })
8
+ const props = withDefaults(defineProps<{
9
+ name: string;
10
+ prefix?: string;
11
+ }>(), {
12
+ prefix: 'epic-'
13
+ })
14
+
15
+ </script>
@@ -0,0 +1,2 @@
1
+ import ENode from './src/node.vue'
2
+ export default ENode