ui-process-h5 0.1.32 → 0.1.36

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 (36) hide show
  1. package/package.json +6 -49
  2. package/packages/components/approval/index.js +0 -0
  3. package/packages/components/process/{index.ts → index.js} +2 -3
  4. package/packages/components/process/src/attchlist-upload.vue +585 -0
  5. package/packages/components/process/src/operation/backNode.vue +141 -0
  6. package/packages/components/process/src/operation/cancel.vue +170 -0
  7. package/packages/components/process/src/operation/ccTask.vue +170 -0
  8. package/packages/components/process/src/operation/complete.vue +224 -0
  9. package/packages/components/process/src/operation/counterSign.vue +178 -0
  10. package/packages/components/process/src/operation/delegateTask.vue +168 -0
  11. package/packages/components/process/src/operation/index.js +9 -0
  12. package/packages/components/process/src/operation/restart.vue +172 -0
  13. package/packages/components/process/src/popup.vue +176 -74
  14. package/packages/components/process/src/process.vue +900 -0
  15. package/packages/components/process/src/tab.vue +189 -197
  16. package/packages/components/process/src/tip.vue +207 -0
  17. package/packages/components/process/theme/img/add-file.png +0 -0
  18. package/packages/components/process/theme/img/del.png +0 -0
  19. package/packages/components/process/theme/img/doc.png +0 -0
  20. package/packages/components/process/theme/img/file.png +0 -0
  21. package/packages/components/process/theme/img/image.png +0 -0
  22. package/packages/components/process/theme/img/pdf.png +0 -0
  23. package/packages/components/process/theme/img/xls.png +0 -0
  24. package/packages/components/process/theme/img/zip.png +0 -0
  25. package/packages/components/process/theme/status/error.png +0 -0
  26. package/packages/components/process/theme/status/loading.png +0 -0
  27. package/packages/components/process/theme/status/success.png +0 -0
  28. package/packages/index.js +4 -0
  29. package/packages/component.ts +0 -4
  30. package/packages/components/process/src/button.vue +0 -55
  31. package/packages/components/process/src/index.vue +0 -447
  32. package/packages/components/utils/request/api.ts +0 -11
  33. package/packages/components/utils/request/cache.d.ts +0 -52
  34. package/packages/components/utils/request/cache.js +0 -99
  35. package/packages/components/utils/request/request.ts +0 -62
  36. package/packages/index.ts +0 -4
@@ -6,7 +6,6 @@
6
6
  class="tops-tab-header-items"
7
7
  :class="[item.key === active ? 'active' : '']"
8
8
  @click="handleActive(item.key, i)"
9
- ref="label"
10
9
  >
11
10
  {{ item.label }}
12
11
  </div>
@@ -32,7 +31,7 @@
32
31
  <iframe
33
32
  v-if="trackUrl"
34
33
  :src="trackUrl"
35
- style="width: 100%; min-height: 500px; border: none;"
34
+ style="width: 100%; height: 100%; border: none;"
36
35
  scrolling="no"
37
36
  frameborder="0"
38
37
  ></iframe>
@@ -44,46 +43,45 @@
44
43
  v-if="item.key === 'c' && item.type === 'default'"
45
44
  :name="item.slot"
46
45
  >
47
- <div
48
- v-if="taskCommentList?.length > 0"
49
- v-for="(item, index) in taskCommentList"
50
- :key="item.id"
51
- class="seal-list__item"
52
- >
53
- <!-- <div v-for="item in list" :key="item.id" class="seal-list__item"> -->
54
- <div>
55
- <div class="seal-list__item--option">
56
- <span>节点名称</span>
57
- <span>{{ item.activityName }}</span>
58
- </div>
59
- <div class="seal-list__item--option">
60
- <span>审批人</span>
61
- <span>{{ item.createUserName }}</span>
62
- </div>
63
- <div class="seal-list__item--option">
64
- <span>审批操作</span>
65
- <span>{{ item.actionName }}</span>
66
- </div>
67
- <div class="seal-list__item--option">
68
- <span>审批意见</span>
69
- <span v-html="item.msg"></span>
70
- </div>
71
- <div class="seal-list__item--option">
72
- <span>审批时间</span>
73
- <span>{{ item.createDate }}</span>
74
- </div>
75
- <div
76
- v-if="
77
- item.metaAnnexList &&
78
- item.metaAnnexList.length
79
- "
80
- class="seal-list__item--attch"
81
- >
82
- <!-- @click="linkUrl(item.metaAnnexList, index)" -->
83
- <span>查看附件</span>
46
+ <template v-if="taskCommentList.length > 0">
47
+ <div
48
+ v-for="(item, index) in taskCommentList"
49
+ :key="item.id"
50
+ class="seal-list__item"
51
+ >
52
+ <div>
53
+ <div class="seal-list__item--option">
54
+ <span>节点名称</span>
55
+ <span>{{ item.activityName }}</span>
56
+ </div>
57
+ <div class="seal-list__item--option">
58
+ <span>审批人</span>
59
+ <span>{{ item.createUserName }}</span>
60
+ </div>
61
+ <div class="seal-list__item--option">
62
+ <span>审批操作</span>
63
+ <span>{{ item.actionName }}</span>
64
+ </div>
65
+ <div class="seal-list__item--option">
66
+ <span>审批意见</span>
67
+ <span v-html="item.msg"></span>
68
+ </div>
69
+ <div class="seal-list__item--option">
70
+ <span>审批时间</span>
71
+ <span>{{ item.createDate }}</span>
72
+ </div>
73
+ <div
74
+ v-if="
75
+ item.metaAnnexList &&
76
+ item.metaAnnexList.length
77
+ "
78
+ class="seal-list__item--attch"
79
+ >
80
+ <span>查看附件</span>
81
+ </div>
84
82
  </div>
85
83
  </div>
86
- </div>
84
+ </template>
87
85
  <div v-else class="textnone">暂无数据</div>
88
86
  </slot>
89
87
  <slot v-if="item.type == 'slot'" :name="item.slot"></slot>
@@ -92,11 +90,8 @@
92
90
  </div>
93
91
  </template>
94
92
 
95
- <script >
96
- import { defineComponent, ref, watch, onMounted, computed } from "vue-demi";
97
- // import { getProcessStatus } from "../../utils/request/api";
98
-
99
- export default defineComponent({
93
+ <script>
94
+ export default {
100
95
  name: "TopTab",
101
96
  props: {
102
97
  /**
@@ -116,178 +111,168 @@ export default defineComponent({
116
111
  type: Array,
117
112
  default: () => [],
118
113
  },
114
+ track: {
115
+ type: String,
116
+ default: "",
117
+ },
118
+ taskComment: {
119
+ type: Array,
120
+ default: () => [],
121
+ },
119
122
  },
120
- setup(props) {
121
- // 流程图
122
- const trackUrl = ref(
123
- "http://59.53.91.231:8088/portal/r/w?sid=6f714ec1-7570-4525-ac51-b092402d8295&cmd=CLIENT_BPM_FORM_TRACK_OPEN&processInstId=1f6e7196-e1ea-428e-b295-aa23a54a2402&supportCanvas=true&formInfo="
124
- );
125
-
126
- // 审批信息
127
- const taskCommentList = ref([
128
- {
129
- actionName: "提交",
130
- activityName: "部门负责人",
131
- createDate: "2023-04-20 14:47:35",
132
- createUser: "18ccbf63229f0c79f39940ae284c111e",
133
- createUserName: "朱鸿飞",
134
- customUniqueId: "",
135
- departmentName: "测试部",
136
- id: "88df38c8-9756-4b4a-a9b0-dcb0ec1b57d5",
137
- metaAnnexList: null,
138
- msg: "同意",
139
- positionName: "测试部119147",
140
- processInstId: "1f6e7196-e1ea-428e-b295-aa23a54a2402",
141
- taskInstId: "38bbef1c-efbb-456d-bd79-08ed9d96b4b3",
142
- },
143
- ]);
144
-
145
- // 选中
146
- const active = ref("");
147
123
 
148
- // tab 渲染
149
- const defaultTabList = ref([
150
- {
151
- label: "基本信息",
152
- key: "a",
153
- type: "default",
154
- slot: "default",
155
- },
156
- {
157
- label: "流程图",
158
- key: "b",
159
- type: "default",
160
- slot: "tab2",
161
- },
162
- {
163
- label: "审批记录",
164
- key: "c",
165
- type: "default",
166
- slot: "tab3",
124
+ data() {
125
+ return {
126
+ // 流程图
127
+ trackUrl: "",
128
+ // 审批信息
129
+ taskCommentList: [],
130
+ // 选中
131
+ active: "",
132
+
133
+ /* tab 渲染 */
134
+ // 默认弹窗列表
135
+ defaultTabList: [
136
+ {
137
+ label: "基本信息",
138
+ key: "a",
139
+ type: "default",
140
+ slot: "default",
141
+ },
142
+ {
143
+ label: "流程图",
144
+ key: "b",
145
+ type: "default",
146
+ slot: "tab2",
147
+ },
148
+ {
149
+ label: "审批记录",
150
+ key: "c",
151
+ type: "default",
152
+ slot: "tab3",
153
+ },
154
+ ],
155
+ // 弹窗操作
156
+ isTapList: [
157
+ {
158
+ label: "基本信息",
159
+ key: "a",
160
+ type: "default",
161
+ slot: "default",
162
+ },
163
+ {
164
+ label: "流程图",
165
+ key: "b",
166
+ type: "default",
167
+ slot: "tab2",
168
+ },
169
+ {
170
+ label: "审批记录",
171
+ key: "c",
172
+ type: "default",
173
+ slot: "tab3",
174
+ },
175
+ ],
176
+ // 绑定tab块
177
+ label: document.getElementsByClassName("tops-tab-header-items"),
178
+ };
179
+ },
180
+ watch: {
181
+ // 接受外部数组,渲染tab
182
+ tapList: {
183
+ handler(val, preVal) {
184
+ if (!this.selfTapList.length) {
185
+ this.isTapList = [].concat(this.defaultTabList);
186
+ if (val.length > 0) {
187
+ /* return [] */
188
+ val.forEach((v, i) => {
189
+ if (v.sort && v.sort > 1) {
190
+ this.isTapList.splice(v.sort - 1, 0, v);
191
+ } else if (v.sort == 1) {
192
+ this.isTapList.unshift(v);
193
+ } else {
194
+ this.isTapList.push(v);
195
+ }
196
+ });
197
+ }
198
+ this.active = this.isTapList[0].key;
199
+ console.log("isTapList", this.isTapList);
200
+ }
167
201
  },
168
- ]);
169
-
170
- const isTapList = ref([
171
- {
172
- label: "基本信息",
173
- key: "a",
174
- type: "default",
175
- slot: "default",
202
+ immediate: true,
203
+ deep: true,
204
+ },
205
+ // 自定义tab,覆盖默认项
206
+ selfTapList: {
207
+ handler(val, preVal) {
208
+ if (val.length) {
209
+ this.isTapList = [].concat(val);
210
+ this.active = this.isTapList[0].key;
211
+ }
176
212
  },
177
- {
178
- label: "流程图",
179
- key: "b",
180
- type: "default",
181
- slot: "tab2",
213
+ immediate: true,
214
+ deep: true,
215
+ },
216
+ // 流程图链接
217
+ track: {
218
+ handler(val, preVal) {
219
+ if (val) {
220
+ this.trackUrl = val;
221
+ }
182
222
  },
183
- {
184
- label: "审批记录",
185
- key: "c",
186
- type: "default",
187
- slot: "tab3",
223
+ immediate: true,
224
+ deep: true,
225
+ },
226
+ // 审批记录列表
227
+ taskComment: {
228
+ handler(val, preVal) {
229
+ if (val) {
230
+ this.taskCommentList = val;
231
+ }
188
232
  },
189
- ]);
190
-
191
- const label = ref();
233
+ immediate: true,
234
+ deep: true,
235
+ },
236
+ },
192
237
 
193
- // taskNode taskObj
238
+ mounted() {
239
+ // 渲染后初始化为第一个位置
240
+ this.tabAnimation(0);
241
+ },
194
242
 
195
- /* method */
196
- // 选中方法
197
- const handleActive = (e, i) => {
198
- if (e === active.value) {
243
+ methods: {
244
+ // 选中
245
+ handleActive(e, i) {
246
+ if (e === this.active) {
199
247
  return;
200
248
  }
201
249
 
202
- active.value = e;
203
- tabAnimation(i);
204
- };
250
+ this.active = e;
251
+ this.tabAnimation(i);
252
+ },
205
253
 
206
- const tabAnimation = (i) => {
207
- if (label.value.length) {
208
- let doc = (
209
- document.getElementsByClassName("bottom-line")[0]
210
- );
254
+ // tab切换动画
255
+ tabAnimation(i) {
256
+ if (this.label.length) {
257
+ let doc = document.getElementsByClassName("bottom-line")[0];
211
258
  let left;
212
- if (doc.offsetWidth < label.value[i].offsetWidth - 10) {
259
+ if (doc.offsetWidth < this.label[i].offsetWidth - 10) {
213
260
  let num =
214
- (label.value[i].offsetWidth - doc.offsetWidth - 10) / 2;
215
- left = `${label.value[i].offsetLeft + num}px`;
216
- } else if (doc.offsetWidth > label.value[i].offsetWidth - 10) {
261
+ (this.label[i].offsetWidth - doc.offsetWidth - 10) / 2;
262
+ left = `${this.label[i].offsetLeft + num}px`;
263
+ } else if (doc.offsetWidth > this.label[i].offsetWidth - 10) {
217
264
  let num =
218
- (doc.offsetWidth - label.value[i].offsetWidth + 10) / 2;
219
- left = `${label.value[i].offsetLeft - num}px`;
265
+ (doc.offsetWidth - this.label[i].offsetWidth + 10) / 2;
266
+ left = `${this.label[i].offsetLeft - num}px`;
220
267
  } else {
221
- left = `${label.value[i].offsetLeft}px`;
268
+ left = `${this.label[i].offsetLeft}px`;
222
269
  }
223
270
  doc.style.transition = ".3s";
224
271
  doc.style.transform = `translateX(${left})`;
225
272
  }
226
- };
227
-
228
- /* watch */
229
- watch(
230
- () => props.selfTapList,
231
- (val, preVal) => {
232
- if (val.length) {
233
- isTapList.value = [].concat(val);
234
- active.value = isTapList.value[0].key;
235
- }
236
- },
237
- {
238
- //如果加了这个参数,值为true的话,就消除了惰性,watch会在创建后立即执行一次
239
- //那么首次执行,val为默认值,preVal为undefined
240
- immediate: true,
241
- //这个参数代表监听对象时,可以监听深度嵌套的对象属性
242
- deep: true,
243
- }
244
- );
245
-
246
- watch(
247
- () => props.tapList,
248
- (val, preVal) => {
249
- if (!props.selfTapList.length) {
250
- isTapList.value = [].concat(defaultTabList.value);
251
- if (val.length > 0) {
252
- /* return [] */
253
- val.forEach((v, i) => {
254
- if (v.sort && v.sort > 1) {
255
- isTapList.value.splice(v.sort - 1, 0, v);
256
- } else if (v.sort == 1) {
257
- isTapList.value.unshift(v);
258
- } else {
259
- isTapList.value.push(v);
260
- }
261
- });
262
- }
263
- active.value = isTapList.value[0].key;
264
- }
265
- },
266
- {
267
- //如果加了这个参数,值为true的话,就消除了惰性,watch会在创建后立即执行一次
268
- //那么首次执行,val为默认值,preVal为undefined
269
- immediate: true,
270
- //这个参数代表监听对象时,可以监听深度嵌套的对象属性
271
- deep: true,
272
- }
273
- );
274
-
275
- /* mounted */
276
- onMounted(() => {
277
- // 渲染后初始化为第一个位置
278
- tabAnimation(0);
279
- });
280
-
281
- return {
282
- isTapList,
283
- active,
284
- handleActive,
285
- label,
286
- taskCommentList,
287
- trackUrl,
288
- };
273
+ },
289
274
  },
290
- });
275
+ };
291
276
  </script>
292
277
 
293
278
  <style scoped>
@@ -368,7 +353,7 @@ export default defineComponent({
368
353
  z-index: 12;
369
354
  }
370
355
  .tops-tab-body {
371
- height: 100%;
356
+ height: calc(100% - 45px);
372
357
  }
373
358
 
374
359
  .seal-list__item {
@@ -464,4 +449,11 @@ export default defineComponent({
464
449
  .seal-list__item .seal-list__item--actions .van-button:last-child ::after {
465
450
  content: none;
466
451
  }
452
+
453
+ .textnone {
454
+ text-align: center;
455
+ margin-top: 30px;
456
+ color: #999;
457
+ font-size: 14px;
458
+ }
467
459
  </style>
@@ -0,0 +1,207 @@
1
+ <template>
2
+ <div>
3
+ <div
4
+ v-if="!statusTips"
5
+ class="top-tipss"
6
+ :style="
7
+ show
8
+ ? 'visibility: visible; opacity: 1;'
9
+ : 'visibility: hidden; opacity: 0;'
10
+ "
11
+ >
12
+ <div v-if="text" class="top-tipss-text">{{ text }}</div>
13
+ </div>
14
+ <div
15
+ v-else
16
+ class="top-tipss"
17
+ :style="
18
+ show
19
+ ? 'visibility: visible; opacity: 1;'
20
+ : 'visibility: hidden; opacity: 0;'
21
+ "
22
+ >
23
+ <div class="top-tipss-status">
24
+ <div :class="status" v-if="type == 'loading'">
25
+ <img src="../theme/status/loading.png" />
26
+ <div v-if="text" class="top-tipss-status-text">
27
+ {{ text }}
28
+ </div>
29
+ </div>
30
+ <div :class="status" v-if="type == 'success'">
31
+ <img src="../theme/status/success.png" />
32
+ <div v-if="text" class="top-tipss-status-text">
33
+ {{ text }}
34
+ </div>
35
+ </div>
36
+ <div :class="status" v-if="type == 'error'">
37
+ <img src="../theme/status/error.png" />
38
+ <div v-if="text" class="top-tipss-status-text">
39
+ {{ text }}
40
+ </div>
41
+ </div>
42
+ </div>
43
+ </div>
44
+ <div
45
+ class="top-tipss-mask"
46
+ :style="
47
+ show && statusTips
48
+ ? 'visibility: visible; opacity: .7;'
49
+ : 'visibility: hidden; opacity: 0;'
50
+ "
51
+ ></div>
52
+ </div>
53
+ </template>
54
+ <script>
55
+ export default {
56
+ props: {
57
+ text: { default: "", type: String },
58
+ type: { default: "default", type: String },
59
+ statusTips: { default: false, type: Boolean },
60
+ },
61
+ data() {
62
+ return {
63
+ show: false,
64
+ status: "",
65
+ };
66
+ },
67
+ watch: {
68
+ type: {
69
+ handler(val, preVal) {
70
+ switch (val) {
71
+ case "loading":
72
+ this.status = "top-tipss-loadinig";
73
+ break;
74
+ case "success":
75
+ this.status = "top-tipss-success";
76
+ setTimeout(() => {
77
+ this.handleClose();
78
+ }, 1500);
79
+ break;
80
+ case "error":
81
+ this.status = "top-tipss-error";
82
+ setTimeout(() => {
83
+ this.handleClose();
84
+ }, 1500);
85
+ break;
86
+ }
87
+ },
88
+ immediate: true,
89
+ deep: true,
90
+ },
91
+ },
92
+ mounted() {
93
+ this.$nextTick(() => {
94
+ const body = document.querySelector("body");
95
+ if (body.append) {
96
+ body.append(this.$el);
97
+ } else {
98
+ body.appendChild(this.$el);
99
+ }
100
+ });
101
+ },
102
+ methods: {
103
+ handleOpen() {
104
+ if (
105
+ !this.show &&
106
+ (this.type == "success" ||
107
+ this.type == "error" ||
108
+ this.type == "default")
109
+ ) {
110
+ this.show = true;
111
+ setTimeout(() => {
112
+ this.handleClose();
113
+ }, 1500);
114
+ } else {
115
+ this.show = true;
116
+ }
117
+ },
118
+ handleClose() {
119
+ this.show = false;
120
+ },
121
+ },
122
+ };
123
+ </script>
124
+ <style>
125
+ .top-tipss {
126
+ position: absolute;
127
+ z-index: 2999;
128
+ top: 50%;
129
+ left: 50%;
130
+ -webkit-transform: translate(-50%, -50%);
131
+ transform: translate(-50%, -50%);
132
+ text-align: center;
133
+ max-width: 80%;
134
+ transition: all 0.3s ease;
135
+ }
136
+
137
+ .top-tipss-mask {
138
+ position: fixed;
139
+ width: 100vw;
140
+ height: 100vh;
141
+ background-color: #000;
142
+ opacity: 0.7;
143
+ top: 0;
144
+ left: 0;
145
+ z-index: 1999;
146
+ transition: all 0.3s ease;
147
+ }
148
+
149
+ .top-tipss-text {
150
+ display: inline-block;
151
+ vertical-align: middle;
152
+ color: #fff;
153
+ padding: 10px 20px;
154
+ border-radius: 5px;
155
+ font-size: 13px;
156
+ text-align: center;
157
+ max-width: 100%;
158
+ word-break: break-all;
159
+ white-space: normal;
160
+ background-color: rgba(17, 17, 17, 0.7);
161
+ }
162
+ .top-tipss-status {
163
+ width: 120px;
164
+ height: 120px;
165
+ border-radius: 12px;
166
+ background-color: rgba(17, 17, 17, 0.7);
167
+ display: flex;
168
+ }
169
+
170
+ .top-tipss-loadinig,
171
+ .top-tipss-success,
172
+ .top-tipss-error {
173
+ width: 100%;
174
+ height: 100%;
175
+ display: flex;
176
+ align-items: center;
177
+ justify-content: center;
178
+ flex-direction: column;
179
+ }
180
+
181
+ .top-tipss-loadinig img,
182
+ .top-tipss-success img,
183
+ .top-tipss-error img {
184
+ width: 40px;
185
+ height: 40px;
186
+ }
187
+
188
+ .top-tipss-loadinig img {
189
+ -webkit-animation: rotation 0.8s linear infinite;
190
+ animation: rotation 0.8s linear infinite;
191
+ }
192
+
193
+ .top-tipss-status-text {
194
+ color: #fff;
195
+ padding-top: 10px;
196
+ font-size: 12px;
197
+ }
198
+
199
+ @-webkit-keyframes rotation {
200
+ 0% {
201
+ transform: rotate(0deg);
202
+ }
203
+ 100% {
204
+ transform: rotate(360deg);
205
+ }
206
+ }
207
+ </style>