tianheng-ui 0.1.0 → 0.1.2
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.
- package/README.md +9 -18
- package/lib/039af9192b9bb277966ceb4e4ce29c41.js +16 -0
- package/lib/2d84c80112a372bc149cad3464e90fa3.js +1617 -0
- package/lib/5977b934a4c6b480790864ea01303173.js +10834 -0
- package/lib/7745f3e776488705a38e62f85adad54d.js +16 -0
- package/lib/de8dee841ffdaaede3a2254deef30376.js +15395 -0
- package/lib/e78eab250e7f8ccac3d918dfdb06ca10.js +8904 -0
- package/lib/theme-chalk/fonts/PingFang.ttf +0 -0
- package/lib/theme-chalk/fonts/bpmn.eot +0 -0
- package/lib/theme-chalk/fonts/bpmn.svg +224 -0
- package/lib/theme-chalk/fonts/bpmn.ttf +0 -0
- package/lib/theme-chalk/fonts/bpmn.woff +0 -0
- package/lib/theme-chalk/fonts/bpmn.woff2 +0 -0
- package/lib/theme-chalk/fonts/fontawesome-webfont.eot +0 -0
- package/lib/theme-chalk/fonts/fontawesome-webfont.svg +2671 -0
- package/lib/theme-chalk/fonts/fontawesome-webfont.ttf +0 -0
- package/lib/theme-chalk/fonts/fontawesome-webfont.woff +0 -0
- package/lib/theme-chalk/fonts/fontawesome-webfont.woff2 +0 -0
- package/lib/theme-chalk/fonts/iconfont.eot +0 -0
- package/lib/theme-chalk/fonts/iconfont.svg +155 -0
- package/lib/theme-chalk/fonts/iconfont.ttf +0 -0
- package/lib/theme-chalk/fonts/iconfont.woff +0 -0
- package/lib/theme-chalk/fonts/iconfont.woff2 +0 -0
- package/lib/theme-chalk/images/notData.png +0 -0
- package/lib/theme-chalk/index.scss +31 -0
- package/lib/theme-chalk/js/Log.js +99 -0
- package/lib/theme-chalk/js/axios.js +86 -0
- package/lib/theme-chalk/js/store/getters.js +5 -0
- package/lib/theme-chalk/js/store/modules/makingForm.js +21 -0
- package/lib/theme-chalk/js/store/store.js +26 -0
- package/lib/theme-chalk/styles/button.scss +501 -0
- package/lib/theme-chalk/styles/card.scss +29 -0
- package/lib/theme-chalk/styles/cell.scss +54 -0
- package/lib/theme-chalk/styles/codeEditor.scss +9 -0
- package/lib/theme-chalk/styles/col.scss +151 -0
- package/lib/theme-chalk/styles/dialog.scss +56 -0
- package/lib/theme-chalk/styles/empty.scss +22 -0
- package/lib/theme-chalk/styles/feature.scss +46 -0
- package/lib/theme-chalk/styles/font.css +7 -0
- package/lib/theme-chalk/styles/grid.scss +41 -0
- package/lib/theme-chalk/styles/icon.css +1944 -0
- package/lib/theme-chalk/styles/imagePreview.scss +113 -0
- package/lib/theme-chalk/styles/img.scss +35 -0
- package/lib/theme-chalk/styles/reset.scss +17 -0
- package/lib/theme-chalk/styles/root.css +64 -0
- package/lib/theme-chalk/styles/row.scss +23 -0
- package/lib/theme-chalk/styles/upload.scss +744 -0
- package/lib/theme-chalk/styles/variable.scss +80 -0
- package/lib/tianheng-ui.js +116 -0
- package/package.json +86 -48
- package/packages/Button/index.js +8 -0
- package/packages/Button/index.vue +80 -0
- package/packages/Card/index.js +8 -0
- package/packages/Card/index.vue +37 -0
- package/packages/Cell/index.js +8 -0
- package/packages/Cell/index.vue +68 -0
- package/packages/CodeEditor/index.js +8 -0
- package/packages/CodeEditor/index.vue +177 -0
- package/packages/Col/index.js +8 -0
- package/packages/Col/index.vue +43 -0
- package/packages/Dialog/index.js +8 -0
- package/packages/Dialog/index.vue +129 -0
- package/packages/Empty/index.js +8 -0
- package/packages/Empty/index.vue +35 -0
- package/packages/FormMaking/FormConfig.vue +60 -0
- package/packages/FormMaking/GenerateForm.vue +308 -0
- package/packages/FormMaking/GenerateFormItem.vue +887 -0
- package/packages/FormMaking/GenerateFormItemH5.vue +825 -0
- package/packages/FormMaking/Upload/index.vue +572 -0
- package/packages/FormMaking/WidgetConfig.vue +472 -0
- package/packages/FormMaking/WidgetForm.vue +159 -0
- package/packages/FormMaking/WidgetFormItem.vue +187 -0
- package/packages/FormMaking/custom/config.js +762 -0
- package/packages/FormMaking/custom/configs/alliance.vue +0 -0
- package/packages/FormMaking/custom/configs/blank.vue +54 -0
- package/packages/FormMaking/custom/configs/button.vue +172 -0
- package/packages/FormMaking/custom/configs/cascader.vue +175 -0
- package/packages/FormMaking/custom/configs/cell.vue +81 -0
- package/packages/FormMaking/custom/configs/checkbox.vue +234 -0
- package/packages/FormMaking/custom/configs/color.vue +137 -0
- package/packages/FormMaking/custom/configs/date.vue +158 -0
- package/packages/FormMaking/custom/configs/divider.vue +61 -0
- package/packages/FormMaking/custom/configs/editor.vue +71 -0
- package/packages/FormMaking/custom/configs/filler.vue +57 -0
- package/packages/FormMaking/custom/configs/grid.vue +103 -0
- package/packages/FormMaking/custom/configs/image.vue +138 -0
- package/packages/FormMaking/custom/configs/input.vue +176 -0
- package/packages/FormMaking/custom/configs/number.vue +140 -0
- package/packages/FormMaking/custom/configs/radio.vue +211 -0
- package/packages/FormMaking/custom/configs/rate.vue +109 -0
- package/packages/FormMaking/custom/configs/select.vue +305 -0
- package/packages/FormMaking/custom/configs/slider.vue +142 -0
- package/packages/FormMaking/custom/configs/switch.vue +130 -0
- package/packages/FormMaking/custom/configs/table.vue +105 -0
- package/packages/FormMaking/custom/configs/table_h5.vue +102 -0
- package/packages/FormMaking/custom/configs/tabs.vue +175 -0
- package/packages/FormMaking/custom/configs/text.vue +71 -0
- package/packages/FormMaking/custom/configs/textarea.vue +167 -0
- package/packages/FormMaking/custom/configs/time.vue +153 -0
- package/packages/FormMaking/custom/configs/upload.vue +155 -0
- package/packages/FormMaking/custom/index.js +32 -0
- package/packages/FormMaking/custom/items/alliance.vue +132 -0
- package/packages/FormMaking/custom/items/blank.vue +16 -0
- package/packages/FormMaking/custom/items/button.vue +27 -0
- package/packages/FormMaking/custom/items/cascader.vue +29 -0
- package/packages/FormMaking/custom/items/cell.vue +18 -0
- package/packages/FormMaking/custom/items/checkbox.vue +46 -0
- package/packages/FormMaking/custom/items/color.vue +19 -0
- package/packages/FormMaking/custom/items/date.vue +29 -0
- package/packages/FormMaking/custom/items/divider.vue +14 -0
- package/packages/FormMaking/custom/items/editor.vue +22 -0
- package/packages/FormMaking/custom/items/filler.vue +17 -0
- package/packages/FormMaking/custom/items/grid.vue +130 -0
- package/packages/FormMaking/custom/items/image.vue +70 -0
- package/packages/FormMaking/custom/items/input.vue +33 -0
- package/packages/FormMaking/custom/items/login.vue +13 -0
- package/packages/FormMaking/custom/items/number.vue +24 -0
- package/packages/FormMaking/custom/items/radio.vue +44 -0
- package/packages/FormMaking/custom/items/rate.vue +20 -0
- package/packages/FormMaking/custom/items/select.vue +32 -0
- package/packages/FormMaking/custom/items/slider.vue +34 -0
- package/packages/FormMaking/custom/items/switch.vue +22 -0
- package/packages/FormMaking/custom/items/table.vue +106 -0
- package/packages/FormMaking/custom/items/table_h5.vue +126 -0
- package/packages/FormMaking/custom/items/tabs.vue +145 -0
- package/packages/FormMaking/custom/items/text.vue +18 -0
- package/packages/FormMaking/custom/items/textarea.vue +37 -0
- package/packages/FormMaking/custom/items/time.vue +32 -0
- package/packages/FormMaking/custom/items/upload.vue +102 -0
- package/packages/FormMaking/custom/mixins/index.js +61 -0
- package/packages/FormMaking/custom/register.js +18 -0
- package/packages/FormMaking/generate.js +5 -0
- package/packages/FormMaking/iconfont/demo.css +539 -0
- package/packages/FormMaking/iconfont/demo_index.html +1159 -0
- package/packages/FormMaking/iconfont/iconfont.css +189 -0
- package/packages/FormMaking/iconfont/iconfont.eot +0 -0
- package/packages/FormMaking/iconfont/iconfont.js +1 -0
- package/packages/FormMaking/iconfont/iconfont.svg +155 -0
- package/packages/FormMaking/iconfont/iconfont.ttf +0 -0
- package/packages/FormMaking/iconfont/iconfont.woff +0 -0
- package/packages/FormMaking/iconfont/iconfont.woff2 +0 -0
- package/packages/FormMaking/index.js +33 -0
- package/packages/FormMaking/index.vue +807 -0
- package/packages/FormMaking/lang/en-US.js +187 -0
- package/packages/FormMaking/lang/zh-CN.js +187 -0
- package/packages/FormMaking/making.js +9 -0
- package/packages/FormMaking/styles/cover.scss +41 -0
- package/packages/FormMaking/styles/index.scss +785 -0
- package/packages/FormMaking/util/generateCode.js +163 -0
- package/packages/FormMaking/util/index.js +33 -0
- package/packages/FormMaking/util/request.js +28 -0
- package/packages/Grid/index.js +8 -0
- package/packages/Grid/index.vue +21 -0
- package/packages/GridItem/index.js +8 -0
- package/packages/GridItem/index.vue +69 -0
- package/packages/Icons/index.js +8 -0
- package/packages/Icons/index.vue +377 -0
- package/packages/Image/index.js +8 -0
- package/packages/Image/index.vue +146 -0
- package/packages/ImagePreview/index.js +8 -0
- package/packages/ImagePreview/index.vue +386 -0
- package/packages/Row/index.js +8 -0
- package/packages/Row/index.vue +33 -0
- package/packages/Table/action.js +8 -0
- package/packages/Table/action.vue +168 -0
- package/packages/Table/column.vue +63 -0
- package/packages/Table/index.js +8 -0
- package/packages/Table/index.vue +327 -0
- package/packages/Table/search.js +8 -0
- package/packages/Table/search.vue +163 -0
- package/packages/Table/tools.js +8 -0
- package/packages/Table/tools.vue +49 -0
- package/packages/TableMaking/custom/configs/fieldSearch.vue +17 -0
- package/packages/TableMaking/custom/configs/fieldTable.vue +15 -0
- package/packages/TableMaking/custom/items/search/index.vue +158 -0
- package/packages/TableMaking/custom/items/tools/index.vue +49 -0
- package/packages/TableMaking/generate.js +5 -0
- package/packages/TableMaking/generateTable.vue +560 -0
- package/packages/TableMaking/index.vue +229 -0
- package/packages/TableMaking/making.js +5 -0
- package/packages/TableMaking/util/index.js +433 -0
- package/packages/TableMaking/widgetConfig.vue +390 -0
- package/packages/TableMaking/widgetTable.vue +305 -0
- package/packages/Upload/ajax.js +85 -0
- package/packages/Upload/index.js +8 -0
- package/packages/Upload/index.vue +325 -0
- package/packages/Upload/upload-dragger.vue +70 -0
- package/packages/Upload/upload-list.vue +121 -0
- package/packages/Upload/upload.vue +193 -0
- package/packages/VueEditor/index.js +8 -0
- package/packages/VueEditor/index.vue +38 -0
- package/packages/Workflow/Log.js +99 -0
- package/packages/Workflow/designer/ProcessDesigner.vue +628 -0
- package/packages/Workflow/designer/index.js +7 -0
- package/packages/Workflow/designer/plugins/content-pad/contentPadProvider.js +390 -0
- package/packages/Workflow/designer/plugins/content-pad/index.js +6 -0
- package/packages/Workflow/designer/plugins/defaultEmpty.js +24 -0
- package/packages/Workflow/designer/plugins/descriptor/activitiDescriptor.json +1071 -0
- package/packages/Workflow/designer/plugins/descriptor/camundaDescriptor.json +1087 -0
- package/packages/Workflow/designer/plugins/descriptor/flowableDescriptor.json +1215 -0
- package/packages/Workflow/designer/plugins/extension-moddle/activiti/activitiExtension.js +74 -0
- package/packages/Workflow/designer/plugins/extension-moddle/activiti/index.js +9 -0
- package/packages/Workflow/designer/plugins/extension-moddle/camunda/extension.js +148 -0
- package/packages/Workflow/designer/plugins/extension-moddle/camunda/index.js +6 -0
- package/packages/Workflow/designer/plugins/extension-moddle/flowable/flowableExtension.js +74 -0
- package/packages/Workflow/designer/plugins/extension-moddle/flowable/index.js +9 -0
- package/packages/Workflow/designer/plugins/palette/CustomPalette.js +156 -0
- package/packages/Workflow/designer/plugins/palette/index.js +6 -0
- package/packages/Workflow/designer/plugins/palette/paletteProvider.js +160 -0
- package/packages/Workflow/designer/plugins/translate/customTranslate.js +41 -0
- package/packages/Workflow/designer/plugins/translate/zh.js +238 -0
- package/packages/Workflow/highlight/index.js +5 -0
- package/packages/Workflow/index.js +34 -0
- package/packages/Workflow/index.vue +399 -0
- package/packages/Workflow/modules/auto-place/CustomAutoPlace.js +81 -0
- package/packages/Workflow/modules/auto-place/index.js +6 -0
- package/packages/Workflow/modules/custom-renderer/CustomRenderer.js +17 -0
- package/packages/Workflow/modules/custom-renderer/index.js +6 -0
- package/packages/Workflow/modules/rules/CustomRules.js +16 -0
- package/packages/Workflow/modules/rules/index.js +6 -0
- package/packages/Workflow/palette/ProcessPalette.vue +106 -0
- package/packages/Workflow/palette/index.js +7 -0
- package/packages/Workflow/penal/PropertiesPanel.vue +245 -0
- package/packages/Workflow/penal/base/ElementBaseInfo.vue +80 -0
- package/packages/Workflow/penal/flow-condition/FlowCondition.vue +142 -0
- package/packages/Workflow/penal/form/ElementForm.vue +367 -0
- package/packages/Workflow/penal/index.js +7 -0
- package/packages/Workflow/penal/listeners/ElementListeners.vue +299 -0
- package/packages/Workflow/penal/listeners/UserTaskListeners.vue +322 -0
- package/packages/Workflow/penal/listeners/template.js +178 -0
- package/packages/Workflow/penal/listeners/utilSelf.js +64 -0
- package/packages/Workflow/penal/multi-instance/ElementMultiInstance.vue +200 -0
- package/packages/Workflow/penal/other/ElementOtherConfig.vue +59 -0
- package/packages/Workflow/penal/properties/ElementProperties.vue +135 -0
- package/packages/Workflow/penal/signal-message/SignalAndMessage.vue +104 -0
- package/packages/Workflow/penal/task/ElementTask.vue +73 -0
- package/packages/Workflow/penal/task/task-components/ReceiveTask.vue +97 -0
- package/packages/Workflow/penal/task/task-components/ScriptTask.vue +85 -0
- package/packages/Workflow/penal/task/task-components/UserTask.vue +535 -0
- package/packages/Workflow/theme/element-variables.scss +70 -0
- package/packages/Workflow/theme/index.scss +2 -0
- package/packages/Workflow/theme/process-designer.scss +157 -0
- package/packages/Workflow/theme/process-panel.scss +107 -0
- package/packages/Workflow/translations.js +25 -0
- package/packages/Workflow/utils.js +71 -0
- package/packages/index.js +160 -0
- package/babel.config.js +0 -15
- package/index.js +0 -11
- package/public/favicon.ico +0 -0
- package/public/index.html +0 -17
- package/src/App.vue +0 -28
- package/src/assets/logo.png +0 -0
- package/src/components/HelloWorld.vue +0 -58
- 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>
|