n20-common-lib 3.3.0 → 3.3.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n20-common-lib",
3
- "version": "3.3.0",
3
+ "version": "3.3.2",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "serve": "vue-cli-service serve",
@@ -10,7 +10,7 @@
10
10
  "test:unit": "vue-cli-service test:unit",
11
11
  "lint": "vue-cli-service lint",
12
12
  "build:Jenkins_1": "vue-cli-service build --serverConfig ./server-config-jenkins.jsonc",
13
- "build:css": "node build_css",
13
+ "build:css": "node build_css.js",
14
14
  "build:dev": "vue-cli-service build",
15
15
  "build:doc": "node versionInfo.js && vue-cli-service build --testTheme",
16
16
  "build:gzip": "vue-cli-service build --gzip",
@@ -60,6 +60,7 @@
60
60
  @import './v3/collapse.scss';
61
61
  @import './v3/collapse-link.scss';
62
62
  @import './v3/anchor.scss';
63
+ @import './v3/approval-card.scss';
63
64
  @import './info-card.scss';
64
65
 
65
66
  //临时引入
@@ -0,0 +1,513 @@
1
+ /* v3 版本 ApprovalCard 审批卡片样式 */
2
+ .v3-approval-card,
3
+ .v3-approval-card__preview-drawer {
4
+ --v3-approval-primary: var(--primary-6, #007aff);
5
+ --v3-approval-success: var(--success-7, #2db185);
6
+ --v3-approval-danger: var(--danger-6, #f53f3f);
7
+ --v3-approval-warning: var(--warning-6, #ff7d00);
8
+ --v3-approval-text-1: var(--text-1, #1d2129);
9
+ --v3-approval-text-2: var(--text-2, #4e5969);
10
+ --v3-approval-text-3: var(--text-3, #86909c);
11
+ --v3-approval-border: var(--border-2, #e5e6eb);
12
+ --v3-approval-fill: var(--fill-1, #f7f8fa);
13
+ }
14
+
15
+ .v3-approval-card {
16
+ box-sizing: border-box;
17
+ width: 100%;
18
+ color: var(--v3-approval-text-1);
19
+ font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif;
20
+ font-size: 14px;
21
+ }
22
+
23
+ .v3-approval-card *,
24
+ .v3-approval-card *::before,
25
+ .v3-approval-card *::after {
26
+ box-sizing: border-box;
27
+ }
28
+
29
+ .v3-approval-card__timeline {
30
+ width: 100%;
31
+ }
32
+
33
+ .v3-approval-card__item {
34
+ position: relative;
35
+ width: 100%;
36
+ padding: 0 0 32px 24px;
37
+ }
38
+
39
+ .v3-approval-card__item:last-child {
40
+ padding-bottom: 0;
41
+ }
42
+
43
+ .v3-approval-card__track {
44
+ position: absolute;
45
+ top: 10px;
46
+ bottom: -10px;
47
+ left: 7px;
48
+ width: 1px;
49
+ background: var(--v3-approval-border);
50
+ }
51
+
52
+ .v3-approval-card__dot {
53
+ position: absolute;
54
+ top: 8px;
55
+ left: 5px;
56
+ width: 6px;
57
+ height: 6px;
58
+ border-radius: 1px;
59
+ background: var(--v3-approval-primary);
60
+ }
61
+
62
+ .v3-approval-card__item.is-waiting .v3-approval-card__dot {
63
+ background: #c9cdd4;
64
+ }
65
+
66
+ .v3-approval-card__item.is-approval .v3-approval-card__dot {
67
+ background: var(--v3-approval-success);
68
+ }
69
+
70
+ .v3-approval-card__item.is-reject .v3-approval-card__dot {
71
+ background: var(--v3-approval-danger);
72
+ }
73
+
74
+ .v3-approval-card__item.is-revocation .v3-approval-card__dot {
75
+ background: var(--v3-approval-warning);
76
+ }
77
+
78
+ .v3-approval-card__node-header {
79
+ display: flex;
80
+ flex-direction: column;
81
+ gap: 4px;
82
+ min-width: 0;
83
+ }
84
+
85
+ .v3-approval-card__title-row,
86
+ .v3-approval-card__organization-row,
87
+ .v3-approval-card__review-header,
88
+ .v3-approval-card__drawer-header,
89
+ .v3-approval-card__child-title-row {
90
+ display: flex;
91
+ align-items: center;
92
+ }
93
+
94
+ .v3-approval-card__title {
95
+ overflow: hidden;
96
+ color: var(--v3-approval-text-1);
97
+ font-weight: 500;
98
+ line-height: 22px;
99
+ text-overflow: ellipsis;
100
+ white-space: nowrap;
101
+ }
102
+
103
+ .v3-approval-card__item.is-reject .v3-approval-card__title {
104
+ color: var(--v3-approval-danger);
105
+ }
106
+
107
+ .v3-approval-card__item.is-revocation .v3-approval-card__title {
108
+ color: var(--v3-approval-warning);
109
+ }
110
+
111
+ .v3-approval-card__count {
112
+ flex: none;
113
+ color: var(--v3-approval-text-2);
114
+ font-size: 12px;
115
+ line-height: 20px;
116
+ }
117
+
118
+ .v3-approval-card__meta {
119
+ display: flex;
120
+ align-items: center;
121
+ gap: 12px;
122
+ color: var(--v3-approval-text-3);
123
+ font-size: 12px;
124
+ line-height: 20px;
125
+ }
126
+
127
+ .v3-approval-card__meta-divider,
128
+ .v3-approval-card__file-divider {
129
+ width: 1px;
130
+ height: 12px;
131
+ background: var(--v3-approval-border);
132
+ }
133
+
134
+ .v3-approval-card__cost {
135
+ display: inline-flex;
136
+ align-items: center;
137
+ gap: 4px;
138
+ color: var(--v3-approval-text-2);
139
+ }
140
+
141
+ .v3-approval-card__cost i {
142
+ font-size: 14px;
143
+ }
144
+
145
+ .v3-approval-card__panel,
146
+ .v3-approval-card__add-task {
147
+ width: 100%;
148
+ margin-top: 8px;
149
+ border-radius: 4px;
150
+ }
151
+
152
+ .v3-approval-card__panel {
153
+ padding: 8px 12px;
154
+ background: var(--v3-approval-fill);
155
+ }
156
+
157
+ .v3-approval-card__item.is-approval .v3-approval-card__person-panel,
158
+ .v3-approval-card__item.is-reject .v3-approval-card__person-panel {
159
+ border: 1px solid var(--v3-approval-border);
160
+ background: #fff;
161
+ }
162
+
163
+ .v3-approval-card__panel-title {
164
+ margin-bottom: 8px;
165
+ color: var(--v3-approval-text-2);
166
+ font-weight: 500;
167
+ line-height: 22px;
168
+ }
169
+
170
+ .v3-approval-card__pending-users {
171
+ display: flex;
172
+ flex-wrap: wrap;
173
+ gap: 12px 4px;
174
+ width: 100%;
175
+ }
176
+
177
+ .v3-approval-card__pending-user {
178
+ display: inline-flex;
179
+ align-items: center;
180
+ gap: 4px;
181
+ line-height: 22px;
182
+ white-space: nowrap;
183
+ }
184
+
185
+ .v3-approval-card__separator {
186
+ color: var(--v3-approval-text-3);
187
+ font-weight: 500;
188
+ }
189
+
190
+ .v3-approval-card__avatar {
191
+ display: inline-flex;
192
+ flex: none;
193
+ align-items: center;
194
+ justify-content: center;
195
+ overflow: hidden;
196
+ width: 24px;
197
+ height: 24px;
198
+ border: 1px solid var(--v3-approval-border);
199
+ border-radius: 50%;
200
+ background: #fff;
201
+ color: var(--v3-approval-primary);
202
+ font-size: 14px;
203
+ }
204
+
205
+ .v3-approval-card__avatar--small {
206
+ width: 20px;
207
+ height: 20px;
208
+ font-size: 12px;
209
+ }
210
+
211
+ .v3-approval-card__avatar img {
212
+ display: block;
213
+ width: 100%;
214
+ height: 100%;
215
+ object-fit: cover;
216
+ }
217
+
218
+ .v3-approval-card__add-task {
219
+ display: flex;
220
+ align-items: center;
221
+ gap: 4px;
222
+ padding: 6px 12px;
223
+ background: #e8f7ff;
224
+ color: var(--v3-approval-text-2);
225
+ line-height: 22px;
226
+ }
227
+
228
+ .v3-approval-card__add-task-tag {
229
+ margin-left: 4px;
230
+ color: var(--v3-approval-primary);
231
+ }
232
+
233
+ .v3-approval-card__organization-row,
234
+ .v3-approval-card__review-header,
235
+ .v3-approval-card__drawer-header,
236
+ .v3-approval-card__child-title-row {
237
+ justify-content: space-between;
238
+ gap: 12px;
239
+ }
240
+
241
+ .v3-approval-card__organization {
242
+ min-width: 0;
243
+ overflow: hidden;
244
+ color: var(--v3-approval-text-1);
245
+ line-height: 22px;
246
+ text-overflow: ellipsis;
247
+ white-space: nowrap;
248
+ }
249
+
250
+ .v3-approval-card__link-button,
251
+ .v3-approval-card__sub-process-trigger,
252
+ .v3-approval-card__file-actions button,
253
+ .v3-approval-card__child-file {
254
+ padding: 0;
255
+ border: 0;
256
+ background: transparent;
257
+ font: inherit;
258
+ cursor: pointer;
259
+ }
260
+
261
+ .v3-approval-card__link-button {
262
+ flex: none;
263
+ color: var(--v3-approval-primary);
264
+ font-size: 13px;
265
+ line-height: 22px;
266
+ }
267
+
268
+ .v3-approval-card__assignee-pill {
269
+ display: inline-flex;
270
+ align-items: center;
271
+ max-width: 100%;
272
+ margin-top: 8px;
273
+ padding: 2px 12px 2px 2px;
274
+ border: 1px solid var(--v3-approval-border);
275
+ border-radius: 40px;
276
+ background: #fff;
277
+ line-height: 22px;
278
+ }
279
+
280
+ .v3-approval-card__assignee-name {
281
+ overflow: hidden;
282
+ margin-left: 4px;
283
+ text-overflow: ellipsis;
284
+ white-space: nowrap;
285
+ }
286
+
287
+ .v3-approval-card__terminal {
288
+ flex: none;
289
+ margin-left: 4px;
290
+ color: var(--v3-approval-text-2);
291
+ font-size: 13px;
292
+ }
293
+
294
+ .v3-approval-card__secondary-line {
295
+ margin-top: 8px;
296
+ color: var(--v3-approval-text-2);
297
+ line-height: 22px;
298
+ }
299
+
300
+ .v3-approval-card__opinion,
301
+ .v3-approval-card__review-content {
302
+ margin-top: 8px;
303
+ padding: 4px 12px;
304
+ border-radius: 2px;
305
+ background: rgba(0, 0, 0, 0.04);
306
+ color: var(--v3-approval-text-2);
307
+ font-size: 13px;
308
+ line-height: 22px;
309
+ }
310
+
311
+ .v3-approval-card__review-panel,
312
+ .v3-approval-card__file-panel,
313
+ .v3-approval-card__sub-process {
314
+ color: var(--v3-approval-text-1);
315
+ }
316
+
317
+ .v3-approval-card__collapse-button {
318
+ display: inline-flex;
319
+ align-items: center;
320
+ gap: 4px;
321
+ }
322
+
323
+ .v3-approval-card__review-row {
324
+ display: flex;
325
+ justify-content: space-between;
326
+ gap: 16px;
327
+ }
328
+
329
+ .v3-approval-card__review-row + .v3-approval-card__review-row {
330
+ margin-top: 4px;
331
+ }
332
+
333
+ .v3-approval-card__review-row.is-stacked {
334
+ align-items: flex-start;
335
+ flex-direction: column;
336
+ gap: 4px;
337
+ }
338
+
339
+ .v3-approval-card__sub-process-trigger {
340
+ display: flex;
341
+ align-items: center;
342
+ justify-content: space-between;
343
+ width: 100%;
344
+ color: var(--v3-approval-primary);
345
+ line-height: 22px;
346
+ text-align: left;
347
+ }
348
+
349
+ .v3-approval-card__child-list {
350
+ margin-top: 8px;
351
+ padding-top: 8px;
352
+ border-top: 1px solid var(--v3-approval-border);
353
+ }
354
+
355
+ .v3-approval-card__child-item + .v3-approval-card__child-item {
356
+ margin-top: 12px;
357
+ padding-top: 12px;
358
+ border-top: 1px dashed var(--v3-approval-border);
359
+ }
360
+
361
+ .v3-approval-card__child-title {
362
+ color: var(--v3-approval-text-1);
363
+ font-weight: 500;
364
+ }
365
+
366
+ .v3-approval-card__child-title.is-reject,
367
+ .v3-approval-card__child-title.is-reject .v3-approval-card__title {
368
+ color: var(--v3-approval-danger);
369
+ }
370
+
371
+ .v3-approval-card__child-title.is-revocation {
372
+ color: var(--v3-approval-warning);
373
+ }
374
+
375
+ .v3-approval-card__child-time {
376
+ flex: none;
377
+ color: var(--v3-approval-text-3);
378
+ font-size: 12px;
379
+ }
380
+
381
+ .v3-approval-card__child-files {
382
+ display: flex;
383
+ flex-wrap: wrap;
384
+ gap: 8px;
385
+ margin-top: 8px;
386
+ }
387
+
388
+ .v3-approval-card__child-review {
389
+ margin-top: 8px;
390
+ }
391
+
392
+ .v3-approval-card__child-file {
393
+ color: var(--v3-approval-primary);
394
+ }
395
+
396
+ .v3-approval-card__file-list {
397
+ display: flex;
398
+ flex-direction: column;
399
+ gap: 8px;
400
+ }
401
+
402
+ .v3-approval-card__file-item {
403
+ display: flex;
404
+ align-items: center;
405
+ justify-content: space-between;
406
+ min-width: 0;
407
+ padding: 8px;
408
+ border: 1px solid var(--v3-approval-border);
409
+ border-radius: 4px;
410
+ background: #fff;
411
+ }
412
+
413
+ .v3-approval-card__file-main,
414
+ .v3-approval-card__file-actions {
415
+ display: flex;
416
+ align-items: center;
417
+ }
418
+
419
+ .v3-approval-card__file-main {
420
+ min-width: 0;
421
+ gap: 8px;
422
+ }
423
+
424
+ .v3-approval-card__file-icon {
425
+ display: block;
426
+ flex: none;
427
+ width: 24px;
428
+ height: 24px;
429
+ }
430
+
431
+ .v3-approval-card__file-name {
432
+ overflow: hidden;
433
+ font-size: 13px;
434
+ line-height: 22px;
435
+ text-overflow: ellipsis;
436
+ white-space: nowrap;
437
+ }
438
+
439
+ .v3-approval-card__file-actions {
440
+ flex: none;
441
+ gap: 12px;
442
+ margin-left: 16px;
443
+ }
444
+
445
+ .v3-approval-card__file-actions button {
446
+ color: var(--v3-approval-text-2);
447
+ font-size: 14px;
448
+ line-height: 1;
449
+ }
450
+
451
+ .v3-approval-card__file-actions button:hover {
452
+ color: var(--v3-approval-primary);
453
+ }
454
+
455
+ .v3-approval-card__preview-drawer .el-drawer__header {
456
+ margin-bottom: 0;
457
+ padding: 16px 20px;
458
+ border-bottom: 1px solid var(--v3-approval-border);
459
+ }
460
+
461
+ .v3-approval-card__drawer-header {
462
+ width: 100%;
463
+ padding-right: 16px;
464
+ }
465
+
466
+ .v3-approval-card__drawer-title {
467
+ color: var(--v3-approval-text-1);
468
+ font-size: 16px;
469
+ font-weight: 500;
470
+ }
471
+
472
+ .v3-approval-card__drawer-body {
473
+ height: 100%;
474
+ padding: 16px 20px 20px;
475
+ }
476
+
477
+ .v3-approval-card__preview-content {
478
+ display: block;
479
+ width: 100%;
480
+ height: 100%;
481
+ border: 0;
482
+ }
483
+
484
+ .v3-approval-card__preview-fallback {
485
+ display: flex;
486
+ align-items: center;
487
+ justify-content: center;
488
+ flex-direction: column;
489
+ gap: 16px;
490
+ height: 100%;
491
+ color: var(--v3-approval-text-3);
492
+ }
493
+
494
+ .v3-approval-card__preview-fallback > i {
495
+ font-size: 60px;
496
+ }
497
+
498
+ @media (max-width: 768px) {
499
+ .v3-approval-card__preview-drawer .v3-approval-card__drawer {
500
+ width: 100% !important;
501
+ }
502
+
503
+ .v3-approval-card__meta,
504
+ .v3-approval-card__review-row {
505
+ align-items: flex-start;
506
+ flex-direction: column;
507
+ gap: 4px;
508
+ }
509
+
510
+ .v3-approval-card__meta-divider {
511
+ display: none;
512
+ }
513
+ }
@@ -0,0 +1,87 @@
1
+ import getJsonc from '../../assets/getJsonc.js'
2
+ import axios from '../../utils/axios'
3
+
4
+ const DYNAMIC_CONFIG_URL = '/bems/portal/sysAppConfig/listAllConfig'
5
+ const DYNAMIC_CONFIG_QUERY = {
6
+ systemNos: ['BEMS'],
7
+ menuNos: ['BG_CONFIG'],
8
+ moduleNos: ['activiti'],
9
+ groupNos: [],
10
+ configKeys: []
11
+ }
12
+
13
+ let backendConfigPromise
14
+
15
+ function parseConfigValue(value) {
16
+ if (typeof value !== 'string') return value
17
+ try {
18
+ return JSON.parse(value)
19
+ } catch (error) {
20
+ return value
21
+ }
22
+ }
23
+
24
+ function setConfigValue(target, path, value) {
25
+ path.reduce((current, key, index) => {
26
+ if (index === path.length - 1) {
27
+ current[key] = value
28
+ return current
29
+ }
30
+ if (!current[key] || typeof current[key] !== 'object') {
31
+ current[key] = {}
32
+ }
33
+ return current[key]
34
+ }, target)
35
+ }
36
+
37
+ function decodeConfigList(base64) {
38
+ if (!base64) return []
39
+ const binary = window.atob(base64)
40
+ const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0))
41
+ const configList = JSON.parse(new TextDecoder('utf-8').decode(bytes))
42
+ return Array.isArray(configList) ? configList : []
43
+ }
44
+
45
+ function mergeConfigList(configList) {
46
+ return configList.reduce((config, item) => {
47
+ if (!item || !item.configKey) return config
48
+ setConfigValue(config, item.configKey.split('.'), parseConfigValue(item.configValue))
49
+ return config
50
+ }, {})
51
+ }
52
+
53
+ async function getBackendConfig() {
54
+ if (!backendConfigPromise) {
55
+ backendConfigPromise = (async () => {
56
+ const { data } = await axios.post(DYNAMIC_CONFIG_URL, DYNAMIC_CONFIG_QUERY, {
57
+ loading: false,
58
+ noMsg: true
59
+ })
60
+ const config = mergeConfigList(decodeConfigList(data))
61
+ return {
62
+ ...config,
63
+ ...(config.nstc && config.nstc.activiti ? config.nstc.activiti : {})
64
+ }
65
+ })()
66
+ }
67
+
68
+ try {
69
+ return await backendConfigPromise
70
+ } catch (error) {
71
+ // 接口不可用时不缓存失败结果,后续组件实例仍可重新探测新配置接口。
72
+ backendConfigPromise = undefined
73
+ throw error
74
+ }
75
+ }
76
+
77
+ /**
78
+ * 优先读取后台管理配置,低版本门户未提供接口时回退 JSONC。
79
+ * @returns {Promise<Object>}
80
+ */
81
+ export default async function getApprovalConfig() {
82
+ try {
83
+ return await getBackendConfig()
84
+ } catch (error) {
85
+ return getJsonc('portal/server-config.jsonc', null, true)
86
+ }
87
+ }
@@ -349,6 +349,7 @@ import ShowAppOpi from './showAppOpi.vue'
349
349
  import ShowOtherAtt from './showOtherAttr.vue'
350
350
  import ShowOtherAttNew from './showOtherAttrNew.vue'
351
351
  import { toExaminePath } from './specialHandle'
352
+ import getApprovalConfig from './getApprovalConfig'
352
353
 
353
354
  import getJsonc from '../../assets/getJsonc.js'
354
355
  import { closeTagsForBackPage } from '../../plugins/CompatibleOld'
@@ -644,23 +645,19 @@ export default {
644
645
  console.log(code, data)
645
646
  },
646
647
  // 意见是否必填
647
- getConfiguration() {
648
- getJsonc('portal/server-config.jsonc', null, true)
649
- .then(({ opinionRequired, showApproveTo }) => {
650
- this.requiredC = opinionRequired ?? this.required
651
- this.showApproveTo = showApproveTo ?? true
652
- // 读取该工作流是否意见必填
653
- if (this.$route.query.remarkIsMust !== undefined) {
654
- this.requiredC = this.$route.query.remarkIsMust === '1'
655
- }
656
- })
657
- .catch(() => {
658
- this.requiredC = this.required
659
- // 读取该工作流是否意见必填
660
- if (this.$route.query.remarkIsMust !== undefined) {
661
- this.requiredC = this.$route.query.remarkIsMust === '1'
662
- }
663
- })
648
+ async getConfiguration() {
649
+ try {
650
+ const { opinionRequired, showApproveTo } = await getApprovalConfig()
651
+ this.requiredC = opinionRequired ?? this.required
652
+ this.showApproveTo = showApproveTo ?? true
653
+ } catch (error) {
654
+ this.requiredC = this.required
655
+ } finally {
656
+ // 工作流节点配置优先于全局审批意见必填配置。
657
+ if (this.$route.query.remarkIsMust !== undefined) {
658
+ this.requiredC = this.$route.query.remarkIsMust === '1'
659
+ }
660
+ }
664
661
  },
665
662
  getTodoList() {
666
663
  return new Promise((resolve, reject) => {
@@ -61,7 +61,7 @@
61
61
  import expandableWrap from '../Expandable/main.vue'
62
62
  import approvalCard from '../ApprovalCard/index.vue'
63
63
  import approvalImg from './approvalImg.vue'
64
- import getJsonc from '../../assets/getJsonc'
64
+ import getApprovalConfig from '../ApprovalButtons/getApprovalConfig'
65
65
  export default {
66
66
  name: 'ApprovalRecord',
67
67
  components: {
@@ -99,10 +99,14 @@ export default {
99
99
  return this.procInstId || this.$route.query.processInstanceId
100
100
  }
101
101
  },
102
- mounted() {
103
- getJsonc('portal/server-config.jsonc').then(({ approvalMode }) => {
102
+ async mounted() {
103
+ try {
104
+ const { approvalMode } = await getApprovalConfig()
104
105
  this.approvalMode = approvalMode || 'dialog'
105
- })
106
+ } catch (error) {
107
+ // 后台配置和旧 JSONC 都不可用时保留原有弹窗展示模式。
108
+ this.approvalMode = 'dialog'
109
+ }
106
110
  }
107
111
  }
108
112
  </script>