tianheng-ui 0.1.0 → 0.1.1

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 (254) hide show
  1. package/README.md +9 -18
  2. package/lib/039af9192b9bb277966ceb4e4ce29c41.js +16 -0
  3. package/lib/2d84c80112a372bc149cad3464e90fa3.js +1617 -0
  4. package/lib/5977b934a4c6b480790864ea01303173.js +10834 -0
  5. package/lib/7745f3e776488705a38e62f85adad54d.js +16 -0
  6. package/lib/de8dee841ffdaaede3a2254deef30376.js +15395 -0
  7. package/lib/e78eab250e7f8ccac3d918dfdb06ca10.js +8904 -0
  8. package/lib/theme-chalk/fonts/PingFang.ttf +0 -0
  9. package/lib/theme-chalk/fonts/bpmn.eot +0 -0
  10. package/lib/theme-chalk/fonts/bpmn.svg +224 -0
  11. package/lib/theme-chalk/fonts/bpmn.ttf +0 -0
  12. package/lib/theme-chalk/fonts/bpmn.woff +0 -0
  13. package/lib/theme-chalk/fonts/bpmn.woff2 +0 -0
  14. package/lib/theme-chalk/fonts/fontawesome-webfont.eot +0 -0
  15. package/lib/theme-chalk/fonts/fontawesome-webfont.svg +2671 -0
  16. package/lib/theme-chalk/fonts/fontawesome-webfont.ttf +0 -0
  17. package/lib/theme-chalk/fonts/fontawesome-webfont.woff +0 -0
  18. package/lib/theme-chalk/fonts/fontawesome-webfont.woff2 +0 -0
  19. package/lib/theme-chalk/fonts/iconfont.eot +0 -0
  20. package/lib/theme-chalk/fonts/iconfont.svg +155 -0
  21. package/lib/theme-chalk/fonts/iconfont.ttf +0 -0
  22. package/lib/theme-chalk/fonts/iconfont.woff +0 -0
  23. package/lib/theme-chalk/fonts/iconfont.woff2 +0 -0
  24. package/lib/theme-chalk/images/notData.png +0 -0
  25. package/lib/theme-chalk/index.scss +31 -0
  26. package/lib/theme-chalk/js/Log.js +99 -0
  27. package/lib/theme-chalk/js/axios.js +86 -0
  28. package/lib/theme-chalk/js/store/getters.js +5 -0
  29. package/lib/theme-chalk/js/store/modules/makingForm.js +21 -0
  30. package/lib/theme-chalk/js/store/store.js +26 -0
  31. package/lib/theme-chalk/styles/button.scss +501 -0
  32. package/lib/theme-chalk/styles/card.scss +29 -0
  33. package/lib/theme-chalk/styles/cell.scss +54 -0
  34. package/lib/theme-chalk/styles/codeEditor.scss +9 -0
  35. package/lib/theme-chalk/styles/col.scss +151 -0
  36. package/lib/theme-chalk/styles/dialog.scss +56 -0
  37. package/lib/theme-chalk/styles/empty.scss +22 -0
  38. package/lib/theme-chalk/styles/feature.scss +46 -0
  39. package/lib/theme-chalk/styles/font.css +7 -0
  40. package/lib/theme-chalk/styles/grid.scss +41 -0
  41. package/lib/theme-chalk/styles/icon.css +1944 -0
  42. package/lib/theme-chalk/styles/imagePreview.scss +113 -0
  43. package/lib/theme-chalk/styles/img.scss +35 -0
  44. package/lib/theme-chalk/styles/reset.scss +17 -0
  45. package/lib/theme-chalk/styles/root.css +64 -0
  46. package/lib/theme-chalk/styles/row.scss +23 -0
  47. package/lib/theme-chalk/styles/upload.scss +744 -0
  48. package/lib/theme-chalk/styles/variable.scss +80 -0
  49. package/lib/tianheng-ui.js +116 -0
  50. package/package.json +86 -48
  51. package/packages/Button/index.js +8 -0
  52. package/packages/Button/index.vue +80 -0
  53. package/packages/Card/index.js +8 -0
  54. package/packages/Card/index.vue +37 -0
  55. package/packages/Cell/index.js +8 -0
  56. package/packages/Cell/index.vue +68 -0
  57. package/packages/CodeEditor/index.js +8 -0
  58. package/packages/CodeEditor/index.vue +177 -0
  59. package/packages/Col/index.js +8 -0
  60. package/packages/Col/index.vue +43 -0
  61. package/packages/Dialog/index.js +8 -0
  62. package/packages/Dialog/index.vue +129 -0
  63. package/packages/Empty/index.js +8 -0
  64. package/packages/Empty/index.vue +35 -0
  65. package/packages/FormMaking/FormConfig.vue +60 -0
  66. package/packages/FormMaking/GenerateForm.vue +308 -0
  67. package/packages/FormMaking/GenerateFormItem.vue +887 -0
  68. package/packages/FormMaking/GenerateFormItemH5.vue +825 -0
  69. package/packages/FormMaking/Upload/index.vue +572 -0
  70. package/packages/FormMaking/WidgetConfig.vue +472 -0
  71. package/packages/FormMaking/WidgetForm.vue +159 -0
  72. package/packages/FormMaking/WidgetFormItem.vue +187 -0
  73. package/packages/FormMaking/custom/config.js +762 -0
  74. package/packages/FormMaking/custom/configs/alliance.vue +0 -0
  75. package/packages/FormMaking/custom/configs/blank.vue +54 -0
  76. package/packages/FormMaking/custom/configs/button.vue +172 -0
  77. package/packages/FormMaking/custom/configs/cascader.vue +175 -0
  78. package/packages/FormMaking/custom/configs/cell.vue +81 -0
  79. package/packages/FormMaking/custom/configs/checkbox.vue +234 -0
  80. package/packages/FormMaking/custom/configs/color.vue +137 -0
  81. package/packages/FormMaking/custom/configs/date.vue +158 -0
  82. package/packages/FormMaking/custom/configs/divider.vue +61 -0
  83. package/packages/FormMaking/custom/configs/editor.vue +71 -0
  84. package/packages/FormMaking/custom/configs/filler.vue +57 -0
  85. package/packages/FormMaking/custom/configs/grid.vue +103 -0
  86. package/packages/FormMaking/custom/configs/image.vue +138 -0
  87. package/packages/FormMaking/custom/configs/input.vue +176 -0
  88. package/packages/FormMaking/custom/configs/number.vue +140 -0
  89. package/packages/FormMaking/custom/configs/radio.vue +211 -0
  90. package/packages/FormMaking/custom/configs/rate.vue +109 -0
  91. package/packages/FormMaking/custom/configs/select.vue +305 -0
  92. package/packages/FormMaking/custom/configs/slider.vue +142 -0
  93. package/packages/FormMaking/custom/configs/switch.vue +130 -0
  94. package/packages/FormMaking/custom/configs/table.vue +105 -0
  95. package/packages/FormMaking/custom/configs/table_h5.vue +102 -0
  96. package/packages/FormMaking/custom/configs/tabs.vue +175 -0
  97. package/packages/FormMaking/custom/configs/text.vue +71 -0
  98. package/packages/FormMaking/custom/configs/textarea.vue +167 -0
  99. package/packages/FormMaking/custom/configs/time.vue +153 -0
  100. package/packages/FormMaking/custom/configs/upload.vue +155 -0
  101. package/packages/FormMaking/custom/index.js +32 -0
  102. package/packages/FormMaking/custom/items/alliance.vue +132 -0
  103. package/packages/FormMaking/custom/items/blank.vue +16 -0
  104. package/packages/FormMaking/custom/items/button.vue +27 -0
  105. package/packages/FormMaking/custom/items/cascader.vue +29 -0
  106. package/packages/FormMaking/custom/items/cell.vue +18 -0
  107. package/packages/FormMaking/custom/items/checkbox.vue +46 -0
  108. package/packages/FormMaking/custom/items/color.vue +19 -0
  109. package/packages/FormMaking/custom/items/date.vue +29 -0
  110. package/packages/FormMaking/custom/items/divider.vue +14 -0
  111. package/packages/FormMaking/custom/items/editor.vue +22 -0
  112. package/packages/FormMaking/custom/items/filler.vue +17 -0
  113. package/packages/FormMaking/custom/items/grid.vue +130 -0
  114. package/packages/FormMaking/custom/items/image.vue +70 -0
  115. package/packages/FormMaking/custom/items/input.vue +33 -0
  116. package/packages/FormMaking/custom/items/login.vue +13 -0
  117. package/packages/FormMaking/custom/items/number.vue +24 -0
  118. package/packages/FormMaking/custom/items/radio.vue +44 -0
  119. package/packages/FormMaking/custom/items/rate.vue +20 -0
  120. package/packages/FormMaking/custom/items/select.vue +32 -0
  121. package/packages/FormMaking/custom/items/slider.vue +34 -0
  122. package/packages/FormMaking/custom/items/switch.vue +22 -0
  123. package/packages/FormMaking/custom/items/table.vue +106 -0
  124. package/packages/FormMaking/custom/items/table_h5.vue +126 -0
  125. package/packages/FormMaking/custom/items/tabs.vue +145 -0
  126. package/packages/FormMaking/custom/items/text.vue +18 -0
  127. package/packages/FormMaking/custom/items/textarea.vue +37 -0
  128. package/packages/FormMaking/custom/items/time.vue +32 -0
  129. package/packages/FormMaking/custom/items/upload.vue +102 -0
  130. package/packages/FormMaking/custom/mixins/index.js +61 -0
  131. package/packages/FormMaking/custom/register.js +18 -0
  132. package/packages/FormMaking/generate.js +5 -0
  133. package/packages/FormMaking/iconfont/demo.css +539 -0
  134. package/packages/FormMaking/iconfont/demo_index.html +1159 -0
  135. package/packages/FormMaking/iconfont/iconfont.css +189 -0
  136. package/packages/FormMaking/iconfont/iconfont.eot +0 -0
  137. package/packages/FormMaking/iconfont/iconfont.js +1 -0
  138. package/packages/FormMaking/iconfont/iconfont.svg +155 -0
  139. package/packages/FormMaking/iconfont/iconfont.ttf +0 -0
  140. package/packages/FormMaking/iconfont/iconfont.woff +0 -0
  141. package/packages/FormMaking/iconfont/iconfont.woff2 +0 -0
  142. package/packages/FormMaking/index.js +33 -0
  143. package/packages/FormMaking/index.vue +807 -0
  144. package/packages/FormMaking/lang/en-US.js +187 -0
  145. package/packages/FormMaking/lang/zh-CN.js +187 -0
  146. package/packages/FormMaking/making.js +9 -0
  147. package/packages/FormMaking/styles/cover.scss +41 -0
  148. package/packages/FormMaking/styles/index.scss +785 -0
  149. package/packages/FormMaking/util/generateCode.js +163 -0
  150. package/packages/FormMaking/util/index.js +33 -0
  151. package/packages/FormMaking/util/request.js +28 -0
  152. package/packages/Grid/index.js +8 -0
  153. package/packages/Grid/index.vue +21 -0
  154. package/packages/GridItem/index.js +8 -0
  155. package/packages/GridItem/index.vue +69 -0
  156. package/packages/Icons/index.js +8 -0
  157. package/packages/Icons/index.vue +377 -0
  158. package/packages/Image/index.js +8 -0
  159. package/packages/Image/index.vue +146 -0
  160. package/packages/ImagePreview/index.js +8 -0
  161. package/packages/ImagePreview/index.vue +386 -0
  162. package/packages/Row/index.js +8 -0
  163. package/packages/Row/index.vue +33 -0
  164. package/packages/Table/action.js +8 -0
  165. package/packages/Table/action.vue +168 -0
  166. package/packages/Table/column.vue +63 -0
  167. package/packages/Table/index.js +8 -0
  168. package/packages/Table/index.vue +327 -0
  169. package/packages/Table/search.js +8 -0
  170. package/packages/Table/search.vue +163 -0
  171. package/packages/Table/tools.js +8 -0
  172. package/packages/Table/tools.vue +49 -0
  173. package/packages/TableMaking/custom/configs/fieldSearch.vue +17 -0
  174. package/packages/TableMaking/custom/configs/fieldTable.vue +15 -0
  175. package/packages/TableMaking/custom/items/search/index.vue +158 -0
  176. package/packages/TableMaking/custom/items/tools/index.vue +49 -0
  177. package/packages/TableMaking/generate.js +5 -0
  178. package/packages/TableMaking/generateTable.vue +560 -0
  179. package/packages/TableMaking/index.vue +234 -0
  180. package/packages/TableMaking/making.js +5 -0
  181. package/packages/TableMaking/util/index.js +433 -0
  182. package/packages/TableMaking/widgetConfig.vue +390 -0
  183. package/packages/TableMaking/widgetTable.vue +305 -0
  184. package/packages/Upload/ajax.js +85 -0
  185. package/packages/Upload/index.js +8 -0
  186. package/packages/Upload/index.vue +325 -0
  187. package/packages/Upload/upload-dragger.vue +70 -0
  188. package/packages/Upload/upload-list.vue +121 -0
  189. package/packages/Upload/upload.vue +193 -0
  190. package/packages/VueEditor/index.js +8 -0
  191. package/packages/VueEditor/index.vue +38 -0
  192. package/packages/Workflow/Log.js +99 -0
  193. package/packages/Workflow/designer/ProcessDesigner.vue +628 -0
  194. package/packages/Workflow/designer/index.js +7 -0
  195. package/packages/Workflow/designer/plugins/content-pad/contentPadProvider.js +390 -0
  196. package/packages/Workflow/designer/plugins/content-pad/index.js +6 -0
  197. package/packages/Workflow/designer/plugins/defaultEmpty.js +24 -0
  198. package/packages/Workflow/designer/plugins/descriptor/activitiDescriptor.json +1071 -0
  199. package/packages/Workflow/designer/plugins/descriptor/camundaDescriptor.json +1087 -0
  200. package/packages/Workflow/designer/plugins/descriptor/flowableDescriptor.json +1215 -0
  201. package/packages/Workflow/designer/plugins/extension-moddle/activiti/activitiExtension.js +74 -0
  202. package/packages/Workflow/designer/plugins/extension-moddle/activiti/index.js +9 -0
  203. package/packages/Workflow/designer/plugins/extension-moddle/camunda/extension.js +148 -0
  204. package/packages/Workflow/designer/plugins/extension-moddle/camunda/index.js +6 -0
  205. package/packages/Workflow/designer/plugins/extension-moddle/flowable/flowableExtension.js +74 -0
  206. package/packages/Workflow/designer/plugins/extension-moddle/flowable/index.js +9 -0
  207. package/packages/Workflow/designer/plugins/palette/CustomPalette.js +156 -0
  208. package/packages/Workflow/designer/plugins/palette/index.js +6 -0
  209. package/packages/Workflow/designer/plugins/palette/paletteProvider.js +160 -0
  210. package/packages/Workflow/designer/plugins/translate/customTranslate.js +41 -0
  211. package/packages/Workflow/designer/plugins/translate/zh.js +238 -0
  212. package/packages/Workflow/highlight/index.js +5 -0
  213. package/packages/Workflow/index.js +34 -0
  214. package/packages/Workflow/index.vue +399 -0
  215. package/packages/Workflow/modules/auto-place/CustomAutoPlace.js +81 -0
  216. package/packages/Workflow/modules/auto-place/index.js +6 -0
  217. package/packages/Workflow/modules/custom-renderer/CustomRenderer.js +17 -0
  218. package/packages/Workflow/modules/custom-renderer/index.js +6 -0
  219. package/packages/Workflow/modules/rules/CustomRules.js +16 -0
  220. package/packages/Workflow/modules/rules/index.js +6 -0
  221. package/packages/Workflow/palette/ProcessPalette.vue +106 -0
  222. package/packages/Workflow/palette/index.js +7 -0
  223. package/packages/Workflow/penal/PropertiesPanel.vue +245 -0
  224. package/packages/Workflow/penal/base/ElementBaseInfo.vue +80 -0
  225. package/packages/Workflow/penal/flow-condition/FlowCondition.vue +142 -0
  226. package/packages/Workflow/penal/form/ElementForm.vue +367 -0
  227. package/packages/Workflow/penal/index.js +7 -0
  228. package/packages/Workflow/penal/listeners/ElementListeners.vue +299 -0
  229. package/packages/Workflow/penal/listeners/UserTaskListeners.vue +322 -0
  230. package/packages/Workflow/penal/listeners/template.js +178 -0
  231. package/packages/Workflow/penal/listeners/utilSelf.js +64 -0
  232. package/packages/Workflow/penal/multi-instance/ElementMultiInstance.vue +200 -0
  233. package/packages/Workflow/penal/other/ElementOtherConfig.vue +59 -0
  234. package/packages/Workflow/penal/properties/ElementProperties.vue +135 -0
  235. package/packages/Workflow/penal/signal-message/SignalAndMessage.vue +104 -0
  236. package/packages/Workflow/penal/task/ElementTask.vue +73 -0
  237. package/packages/Workflow/penal/task/task-components/ReceiveTask.vue +97 -0
  238. package/packages/Workflow/penal/task/task-components/ScriptTask.vue +85 -0
  239. package/packages/Workflow/penal/task/task-components/UserTask.vue +535 -0
  240. package/packages/Workflow/theme/element-variables.scss +70 -0
  241. package/packages/Workflow/theme/index.scss +2 -0
  242. package/packages/Workflow/theme/process-designer.scss +157 -0
  243. package/packages/Workflow/theme/process-panel.scss +107 -0
  244. package/packages/Workflow/translations.js +25 -0
  245. package/packages/Workflow/utils.js +71 -0
  246. package/packages/index.js +160 -0
  247. package/babel.config.js +0 -15
  248. package/index.js +0 -11
  249. package/public/favicon.ico +0 -0
  250. package/public/index.html +0 -17
  251. package/src/App.vue +0 -28
  252. package/src/assets/logo.png +0 -0
  253. package/src/components/HelloWorld.vue +0 -58
  254. package/src/main.js +0 -8
@@ -0,0 +1,628 @@
1
+ <template>
2
+ <div class="my-process-designer">
3
+ <div class="my-process-designer__header">
4
+ <slot name="control-header"></slot>
5
+ <template v-if="!$slots['control-header']">
6
+ <el-button-group key="file-control">
7
+ <el-button
8
+ :size="headerButtonSize"
9
+ :type="headerButtonType"
10
+ icon="el-icon-folder-opened"
11
+ @click="$refs.refFile.click()"
12
+ >打开文件</el-button
13
+ >
14
+ <el-tooltip effect="light">
15
+ <div slot="content">
16
+ <el-button
17
+ :size="headerButtonSize"
18
+ type="text"
19
+ @click="downloadProcessAsXml()"
20
+ >下载为XML文件</el-button
21
+ >
22
+ <br />
23
+ <el-button
24
+ :size="headerButtonSize"
25
+ type="text"
26
+ @click="downloadProcessAsSvg()"
27
+ >下载为SVG文件</el-button
28
+ >
29
+ <br />
30
+ <el-button
31
+ :size="headerButtonSize"
32
+ type="text"
33
+ @click="downloadProcessAsBpmn()"
34
+ >下载为BPMN文件</el-button
35
+ >
36
+ </div>
37
+ <el-button
38
+ :size="headerButtonSize"
39
+ :type="headerButtonType"
40
+ icon="el-icon-download"
41
+ >下载文件</el-button
42
+ >
43
+ </el-tooltip>
44
+ <el-tooltip effect="light">
45
+ <div slot="content">
46
+ <el-button
47
+ :size="headerButtonSize"
48
+ type="text"
49
+ @click="previewProcessXML"
50
+ >预览XML</el-button
51
+ >
52
+ <br />
53
+ <el-button
54
+ :size="headerButtonSize"
55
+ type="text"
56
+ @click="previewProcessJson"
57
+ >预览JSON</el-button
58
+ >
59
+ </div>
60
+ <el-button
61
+ :size="headerButtonSize"
62
+ :type="headerButtonType"
63
+ icon="el-icon-view"
64
+ >预览</el-button
65
+ >
66
+ </el-tooltip>
67
+ <el-tooltip
68
+ v-if="simulation"
69
+ effect="light"
70
+ :content="this.simulationStatus ? '退出模拟' : '开启模拟'"
71
+ >
72
+ <el-button
73
+ :size="headerButtonSize"
74
+ :type="headerButtonType"
75
+ icon="el-icon-cpu"
76
+ @click="processSimulation"
77
+ >
78
+ 模拟
79
+ </el-button>
80
+ </el-tooltip>
81
+ <el-button
82
+ :size="headerButtonSize"
83
+ :type="headerButtonType"
84
+ icon="el-icon-document-checked"
85
+ @click="saveProcess"
86
+ >
87
+ 保存
88
+ </el-button>
89
+ </el-button-group>
90
+ <el-button-group key="align-control">
91
+ <el-tooltip effect="light" content="向左对齐">
92
+ <el-button
93
+ :size="headerButtonSize"
94
+ class="align align-left"
95
+ icon="el-icon-s-data"
96
+ @click="elementsAlign('left')"
97
+ />
98
+ </el-tooltip>
99
+ <el-tooltip effect="light" content="向右对齐">
100
+ <el-button
101
+ :size="headerButtonSize"
102
+ class="align align-right"
103
+ icon="el-icon-s-data"
104
+ @click="elementsAlign('right')"
105
+ />
106
+ </el-tooltip>
107
+ <el-tooltip effect="light" content="向上对齐">
108
+ <el-button
109
+ :size="headerButtonSize"
110
+ class="align align-top"
111
+ icon="el-icon-s-data"
112
+ @click="elementsAlign('top')"
113
+ />
114
+ </el-tooltip>
115
+ <el-tooltip effect="light" content="向下对齐">
116
+ <el-button
117
+ :size="headerButtonSize"
118
+ class="align align-bottom"
119
+ icon="el-icon-s-data"
120
+ @click="elementsAlign('bottom')"
121
+ />
122
+ </el-tooltip>
123
+ <el-tooltip effect="light" content="水平居中">
124
+ <el-button
125
+ :size="headerButtonSize"
126
+ class="align align-center"
127
+ icon="el-icon-s-data"
128
+ @click="elementsAlign('center')"
129
+ />
130
+ </el-tooltip>
131
+ <el-tooltip effect="light" content="垂直居中">
132
+ <el-button
133
+ :size="headerButtonSize"
134
+ class="align align-middle"
135
+ icon="el-icon-s-data"
136
+ @click="elementsAlign('middle')"
137
+ />
138
+ </el-tooltip>
139
+ </el-button-group>
140
+ <el-button-group key="scale-control">
141
+ <el-tooltip effect="light" content="缩小视图">
142
+ <el-button
143
+ :size="headerButtonSize"
144
+ :disabled="defaultZoom < 0.2"
145
+ icon="el-icon-zoom-out"
146
+ @click="processZoomOut()"
147
+ />
148
+ </el-tooltip>
149
+ <el-button :size="headerButtonSize">{{
150
+ Math.floor(this.defaultZoom * 10 * 10) + "%"
151
+ }}</el-button>
152
+ <el-tooltip effect="light" content="放大视图">
153
+ <el-button
154
+ :size="headerButtonSize"
155
+ :disabled="defaultZoom > 4"
156
+ icon="el-icon-zoom-in"
157
+ @click="processZoomIn()"
158
+ />
159
+ </el-tooltip>
160
+ <el-tooltip effect="light" content="重置视图并居中">
161
+ <el-button
162
+ :size="headerButtonSize"
163
+ icon="el-icon-c-scale-to-original"
164
+ @click="processReZoom()"
165
+ />
166
+ </el-tooltip>
167
+ </el-button-group>
168
+ <el-button-group key="stack-control">
169
+ <el-tooltip effect="light" content="撤销">
170
+ <el-button
171
+ :size="headerButtonSize"
172
+ :disabled="!revocable"
173
+ icon="el-icon-refresh-left"
174
+ @click="processUndo()"
175
+ />
176
+ </el-tooltip>
177
+ <el-tooltip effect="light" content="恢复">
178
+ <el-button
179
+ :size="headerButtonSize"
180
+ :disabled="!recoverable"
181
+ icon="el-icon-refresh-right"
182
+ @click="processRedo()"
183
+ />
184
+ </el-tooltip>
185
+ <el-tooltip effect="light" content="重新绘制">
186
+ <el-button
187
+ :size="headerButtonSize"
188
+ icon="el-icon-refresh"
189
+ @click="processRestart"
190
+ />
191
+ </el-tooltip>
192
+ </el-button-group>
193
+ </template>
194
+ <!-- 用于打开本地文件-->
195
+ <input
196
+ type="file"
197
+ id="files"
198
+ ref="refFile"
199
+ style="display: none"
200
+ accept=".xml, .bpmn"
201
+ @change="importLocalFile"
202
+ />
203
+ </div>
204
+ <div class="my-process-designer__container">
205
+ <div class="my-process-designer__canvas" ref="bpmn-canvas"></div>
206
+ </div>
207
+ <el-dialog
208
+ title="预览"
209
+ width="60%"
210
+ :visible.sync="previewModelVisible"
211
+ append-to-body
212
+ destroy-on-close
213
+ >
214
+ <highlightjs :language="previewType" :code="previewResult" />
215
+ </el-dialog>
216
+ </div>
217
+ </template>
218
+
219
+ <script>
220
+ import BpmnModeler from "bpmn-js/lib/Modeler";
221
+ import DefaultEmptyXML from "./plugins/defaultEmpty";
222
+ // 翻译方法
223
+ import customTranslate from "./plugins/translate/customTranslate";
224
+ import translationsCN from "./plugins/translate/zh";
225
+ // 模拟流转流程
226
+ import tokenSimulation from "bpmn-js-token-simulation";
227
+ // 标签解析构建器
228
+ // import bpmnPropertiesProvider from "bpmn-js-properties-panel/lib/provider/bpmn";
229
+ // 标签解析 Moddle
230
+ import camundaModdleDescriptor from "./plugins/descriptor/camundaDescriptor.json";
231
+ import activitiModdleDescriptor from "./plugins/descriptor/activitiDescriptor.json";
232
+ import flowableModdleDescriptor from "./plugins/descriptor/flowableDescriptor.json";
233
+ // 标签解析 Extension
234
+ import camundaModdleExtension from "./plugins/extension-moddle/camunda";
235
+ import activitiModdleExtension from "./plugins/extension-moddle/activiti";
236
+ import flowableModdleExtension from "./plugins/extension-moddle/flowable";
237
+ // 引入json转换与高亮
238
+ import X2JS from "x2js";
239
+
240
+ export default {
241
+ name: "MyProcessDesigner",
242
+ componentName: "MyProcessDesigner",
243
+ props: {
244
+ value: String, // xml 字符串
245
+ processId: String,
246
+ processName: String,
247
+ translations: Object, // 自定义的翻译文件
248
+ options: {
249
+ type: Object,
250
+ default: () => ({}),
251
+ }, // 自定义的翻译文件
252
+ additionalModel: [Object, Array], // 自定义model
253
+ moddleExtension: Object, // 自定义moddle
254
+ onlyCustomizeAddi: {
255
+ type: Boolean,
256
+ default: false,
257
+ },
258
+ onlyCustomizeModdle: {
259
+ type: Boolean,
260
+ default: false,
261
+ },
262
+ simulation: {
263
+ type: Boolean,
264
+ default: true,
265
+ },
266
+ keyboard: {
267
+ type: Boolean,
268
+ default: true,
269
+ },
270
+ prefix: {
271
+ type: String,
272
+ default: "camunda",
273
+ },
274
+ events: {
275
+ type: Array,
276
+ default: () => ["element.click"],
277
+ },
278
+ headerButtonSize: {
279
+ type: String,
280
+ default: "small",
281
+ validator: (value) =>
282
+ ["default", "medium", "small", "mini"].indexOf(value) !== -1,
283
+ },
284
+ headerButtonType: {
285
+ type: String,
286
+ default: "primary",
287
+ validator: (value) =>
288
+ ["default", "primary", "success", "warning", "danger", "info"].indexOf(
289
+ value
290
+ ) !== -1,
291
+ },
292
+ },
293
+ data() {
294
+ return {
295
+ defaultZoom: 1,
296
+ previewModelVisible: false,
297
+ simulationStatus: false,
298
+ previewResult: "",
299
+ previewType: "xml",
300
+ recoverable: false,
301
+ revocable: false,
302
+ };
303
+ },
304
+ computed: {
305
+ additionalModules() {
306
+ const Modules = [];
307
+ // 仅保留用户自定义扩展模块
308
+ if (this.onlyCustomizeAddi) {
309
+ if (
310
+ Object.prototype.toString.call(this.additionalModel) ===
311
+ "[object Array]"
312
+ ) {
313
+ return this.additionalModel || [];
314
+ }
315
+ return [this.additionalModel];
316
+ }
317
+
318
+ // 插入用户自定义扩展模块
319
+ if (
320
+ Object.prototype.toString.call(this.additionalModel) ===
321
+ "[object Array]"
322
+ ) {
323
+ Modules.push(...this.additionalModel);
324
+ } else {
325
+ this.additionalModel && Modules.push(this.additionalModel);
326
+ }
327
+
328
+ // 翻译模块
329
+ const TranslateModule = {
330
+ translate: [
331
+ "value",
332
+ customTranslate(this.translations || translationsCN),
333
+ ],
334
+ };
335
+ Modules.push(TranslateModule);
336
+
337
+ // 模拟流转模块
338
+ if (this.simulation) {
339
+ Modules.push(tokenSimulation);
340
+ }
341
+
342
+ // 根据需要的流程类型设置扩展元素构建模块
343
+ // if (this.prefix === "bpmn") {
344
+ // Modules.push(bpmnModdleExtension);
345
+ // }
346
+ if (this.prefix === "camunda") {
347
+ Modules.push(camundaModdleExtension);
348
+ }
349
+ if (this.prefix === "flowable") {
350
+ Modules.push(flowableModdleExtension);
351
+ }
352
+ if (this.prefix === "activiti") {
353
+ Modules.push(activitiModdleExtension);
354
+ }
355
+
356
+ return Modules;
357
+ },
358
+ moddleExtensions() {
359
+ const Extensions = {};
360
+ // 仅使用用户自定义模块
361
+ if (this.onlyCustomizeModdle) {
362
+ return this.moddleExtension || null;
363
+ }
364
+
365
+ // 插入用户自定义模块
366
+ if (this.moddleExtension) {
367
+ for (let key in this.moddleExtension) {
368
+ Extensions[key] = this.moddleExtension[key];
369
+ }
370
+ }
371
+
372
+ // 根据需要的 "流程类型" 设置 对应的解析文件
373
+ if (this.prefix === "activiti") {
374
+ Extensions.activiti = activitiModdleDescriptor;
375
+ }
376
+ if (this.prefix === "flowable") {
377
+ Extensions.flowable = flowableModdleDescriptor;
378
+ }
379
+ if (this.prefix === "camunda") {
380
+ Extensions.camunda = camundaModdleDescriptor;
381
+ }
382
+
383
+ return Extensions;
384
+ },
385
+ },
386
+ mounted() {
387
+ this.initBpmnModeler();
388
+ this.createNewDiagram(this.value);
389
+ this.$once("hook:beforeDestroy", () => {
390
+ if (this.bpmnModeler) this.bpmnModeler.destroy();
391
+ this.$emit("destroy", this.bpmnModeler);
392
+ this.bpmnModeler = null;
393
+ });
394
+ },
395
+ methods: {
396
+ initBpmnModeler() {
397
+ if (this.bpmnModeler) return;
398
+ this.bpmnModeler = new BpmnModeler({
399
+ container: this.$refs["bpmn-canvas"],
400
+ keyboard: this.keyboard ? { bindTo: document } : null,
401
+ additionalModules: this.additionalModules,
402
+ moddleExtensions: this.moddleExtensions,
403
+ ...this.options,
404
+ });
405
+ this.$emit("init-finished", this.bpmnModeler);
406
+ this.initModelListeners();
407
+ },
408
+ initModelListeners() {
409
+ const EventBus = this.bpmnModeler.get("eventBus");
410
+ const that = this;
411
+ // 注册需要的监听事件, 将. 替换为 - , 避免解析异常
412
+ this.events.forEach((event) => {
413
+ EventBus.on(event, function (eventObj) {
414
+ let eventName = event.replace(/\./g, "-");
415
+ let element = eventObj ? eventObj.element : null;
416
+ that.$emit(eventName, element, eventObj);
417
+ });
418
+ });
419
+ // 监听图形改变返回xml
420
+ EventBus.on("commandStack.changed", async (event) => {
421
+ try {
422
+ this.recoverable = this.bpmnModeler.get("commandStack").canRedo();
423
+ this.revocable = this.bpmnModeler.get("commandStack").canUndo();
424
+ let { xml } = await this.bpmnModeler.saveXML({ format: true });
425
+ this.$emit("commandStack-changed", event);
426
+ this.$emit("input", xml);
427
+ this.$emit("change", xml);
428
+ } catch (e) {
429
+ console.error(`[Process Designer Warn]: ${e.message || e}`);
430
+ }
431
+ });
432
+ // 监听视图缩放变化
433
+ this.bpmnModeler.on("canvas.viewbox.changed", ({ viewbox }) => {
434
+ this.$emit("canvas-viewbox-changed", { viewbox });
435
+ const { scale } = viewbox;
436
+ this.defaultZoom = Math.floor(scale * 100) / 100;
437
+ });
438
+ },
439
+ /* 创建新的流程图 */
440
+ async createNewDiagram(xml) {
441
+ // 将字符串转换成图显示出来
442
+ let newId = this.processId || `Process_${new Date().getTime()}`;
443
+ let newName = this.processName || `业务流程_${new Date().getTime()}`;
444
+ let xmlString = xml || DefaultEmptyXML(newId, newName, this.prefix);
445
+ try {
446
+ let { warnings } = await this.bpmnModeler.importXML(xmlString);
447
+ if (warnings && warnings.length) {
448
+ warnings.forEach((warn) => console.warn(warn));
449
+ }
450
+ } catch (e) {
451
+ console.error(`[Process Designer Warn]: ${e?.message || e}`);
452
+ }
453
+ },
454
+
455
+ // 下载流程图到本地
456
+ /**
457
+ * @param {string} type
458
+ * @param {*} name
459
+ */
460
+ async downloadProcess(type, name) {
461
+ try {
462
+ const _this = this;
463
+ // 按需要类型创建文件并下载
464
+ if (type === "xml" || type === "bpmn") {
465
+ const { err, xml } = await this.bpmnModeler.saveXML();
466
+ // 读取异常时抛出异常
467
+ if (err) {
468
+ console.error(`[Process Designer Warn ]: ${err.message || err}`);
469
+ }
470
+ let { href, filename } = _this.setEncoded(
471
+ type.toUpperCase(),
472
+ name,
473
+ xml
474
+ );
475
+ downloadFunc(href, filename);
476
+ } else {
477
+ const { err, svg } = await this.bpmnModeler.saveSVG();
478
+ // 读取异常时抛出异常
479
+ if (err) {
480
+ return console.error(err);
481
+ }
482
+ let { href, filename } = _this.setEncoded("SVG", name, svg);
483
+ downloadFunc(href, filename);
484
+ }
485
+ } catch (e) {
486
+ console.error(`[Process Designer Warn ]: ${e.message || e}`);
487
+ }
488
+ // 文件下载方法
489
+ function downloadFunc(href, filename) {
490
+ if (href && filename) {
491
+ let a = document.createElement("a");
492
+ a.download = filename; //指定下载的文件名
493
+ a.href = href; // URL对象
494
+ a.click(); // 模拟点击
495
+ URL.revokeObjectURL(a.href); // 释放URL 对象
496
+ }
497
+ }
498
+ },
499
+
500
+ // 根据所需类型进行转码并返回下载地址
501
+ setEncoded(type, filename = "diagram", data) {
502
+ const encodedData = encodeURIComponent(data);
503
+ return {
504
+ filename: `${filename}.${type}`,
505
+ href: `data:application/${
506
+ type === "svg" ? "text/xml" : "bpmn20-xml"
507
+ };charset=UTF-8,${encodedData}`,
508
+ data: data,
509
+ };
510
+ },
511
+
512
+ // 加载本地文件
513
+ importLocalFile() {
514
+ const that = this;
515
+ const file = this.$refs.refFile.files[0];
516
+ const reader = new FileReader();
517
+ reader.readAsText(file);
518
+ reader.onload = function () {
519
+ let xmlStr = this.result;
520
+ that.$emit("localFile", xmlStr);
521
+ that.createNewDiagram(xmlStr);
522
+ };
523
+ },
524
+ /* ------------------------------------------------ refs methods ------------------------------------------------------ */
525
+ downloadProcessAsXml() {
526
+ this.downloadProcess("xml");
527
+ },
528
+ downloadProcessAsBpmn() {
529
+ this.downloadProcess("bpmn");
530
+ },
531
+ downloadProcessAsSvg() {
532
+ this.downloadProcess("svg");
533
+ },
534
+ saveProcess() {
535
+ this.$emit("element-save");
536
+ },
537
+ processSimulation() {
538
+ this.simulationStatus = !this.simulationStatus;
539
+ this.simulation && this.bpmnModeler.get("toggleMode").toggleMode();
540
+ },
541
+ processRedo() {
542
+ this.bpmnModeler.get("commandStack").redo();
543
+ },
544
+ processUndo() {
545
+ this.bpmnModeler.get("commandStack").undo();
546
+ },
547
+ processZoomIn(zoomStep = 0.1) {
548
+ let newZoom = Math.floor(this.defaultZoom * 100 + zoomStep * 100) / 100;
549
+ if (newZoom > 4) {
550
+ throw new Error(
551
+ "[Process Designer Warn ]: The zoom ratio cannot be greater than 4"
552
+ );
553
+ }
554
+ this.defaultZoom = newZoom;
555
+ this.bpmnModeler.get("canvas").zoom(this.defaultZoom);
556
+ },
557
+ processZoomOut(zoomStep = 0.1) {
558
+ let newZoom = Math.floor(this.defaultZoom * 100 - zoomStep * 100) / 100;
559
+ if (newZoom < 0.2) {
560
+ throw new Error(
561
+ "[Process Designer Warn ]: The zoom ratio cannot be less than 0.2"
562
+ );
563
+ }
564
+ this.defaultZoom = newZoom;
565
+ this.bpmnModeler.get("canvas").zoom(this.defaultZoom);
566
+ },
567
+ processZoomTo(newZoom = 1) {
568
+ if (newZoom < 0.2) {
569
+ throw new Error(
570
+ "[Process Designer Warn ]: The zoom ratio cannot be less than 0.2"
571
+ );
572
+ }
573
+ if (newZoom > 4) {
574
+ throw new Error(
575
+ "[Process Designer Warn ]: The zoom ratio cannot be greater than 4"
576
+ );
577
+ }
578
+ this.defaultZoom = newZoom;
579
+ this.bpmnModeler.get("canvas").zoom(newZoom);
580
+ },
581
+ processReZoom() {
582
+ this.defaultZoom = 1;
583
+ this.bpmnModeler.get("canvas").zoom("fit-viewport", "auto");
584
+ },
585
+ processRestart() {
586
+ this.recoverable = false;
587
+ this.revocable = false;
588
+ this.createNewDiagram(null);
589
+ },
590
+ elementsAlign(align) {
591
+ const Align = this.bpmnModeler.get("alignElements");
592
+ const Selection = this.bpmnModeler.get("selection");
593
+ const SelectedElements = Selection.get();
594
+ if (!SelectedElements || SelectedElements.length <= 1) {
595
+ this.$message.warning("请按住 Ctrl 键选择多个元素对齐");
596
+ return;
597
+ }
598
+ this.$confirm("自动对齐可能造成图形变形,是否继续?", "警告", {
599
+ confirmButtonText: "确定",
600
+ cancelButtonText: "取消",
601
+ type: "warning",
602
+ }).then(() => Align.trigger(SelectedElements, align));
603
+ },
604
+ /*----------------------------- 方法结束 ---------------------------------*/
605
+ previewProcessXML() {
606
+ this.bpmnModeler.saveXML({ format: true }).then(({ xml }) => {
607
+ this.previewResult = xml;
608
+ this.previewType = "xml";
609
+ this.previewModelVisible = true;
610
+ });
611
+ },
612
+ previewProcessJson() {
613
+ const newConvert = new X2JS();
614
+ this.bpmnModeler.saveXML({ format: true }).then(({ xml }) => {
615
+ const { definitions } = newConvert.xml2js(xml);
616
+ if (definitions) {
617
+ this.previewResult = JSON.stringify(definitions, null, 4);
618
+ } else {
619
+ this.previewResult = "";
620
+ }
621
+
622
+ this.previewType = "json";
623
+ this.previewModelVisible = true;
624
+ });
625
+ },
626
+ },
627
+ };
628
+ </script>
@@ -0,0 +1,7 @@
1
+ import MyProcessDesigner from "./ProcessDesigner.vue";
2
+
3
+ MyProcessDesigner.install = function(Vue) {
4
+ Vue.component(MyProcessDesigner.name, MyProcessDesigner);
5
+ };
6
+
7
+ export default MyProcessDesigner;