p-pc-ui 1.3.10 → 1.3.11
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.
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
|
|
2
|
-
type FieldRule = {
|
|
2
|
+
type FieldRule = {
|
|
3
|
+
msg?: string,
|
|
4
|
+
required?: boolean,
|
|
5
|
+
min?: number,
|
|
6
|
+
max?: number,
|
|
7
|
+
decimal?: number,
|
|
8
|
+
regex?: RegExp,
|
|
9
|
+
}
|
|
3
10
|
|
|
4
11
|
interface Base<K extends string = string> {
|
|
5
12
|
key: K,
|
|
@@ -76,13 +83,13 @@ interface UploadBase<K extends string = string> extends Base<K> {
|
|
|
76
83
|
|
|
77
84
|
export interface UploadOss<K extends string = string> extends UploadBase<K> {
|
|
78
85
|
type: 'uploadOss',
|
|
79
|
-
getOssToken: ({ file_name }) => Promise<any>,
|
|
86
|
+
getOssToken: ({ file_name }: { file_name: string }) => Promise<any>,
|
|
80
87
|
baseOssUrl: string,
|
|
81
88
|
}
|
|
82
89
|
|
|
83
90
|
export interface UploadTos<K extends string = string> extends UploadBase<K> {
|
|
84
91
|
type: 'uploadTos',
|
|
85
|
-
getTosToken: ({ file_name }) => Promise<any>,
|
|
92
|
+
getTosToken: ({ file_name }: { file_name: string }) => Promise<any>,
|
|
86
93
|
baseTosUrl: string,
|
|
87
94
|
}
|
|
88
95
|
|
|
@@ -23,6 +23,7 @@ import * as _ from "../../utils/dataUtils";
|
|
|
23
23
|
import { api as viewerApi } from "v-viewer";
|
|
24
24
|
import dayjs from "dayjs";
|
|
25
25
|
import { UploadOutlined, PlusOutlined } from "@ant-design/icons-vue";
|
|
26
|
+
import { log } from "echarts/types/src/util/log.js";
|
|
26
27
|
|
|
27
28
|
const uSlots = useSlots();
|
|
28
29
|
|
|
@@ -82,12 +83,11 @@ const disposeRenderData = async (renderData: FormDataItem[]) => {
|
|
|
82
83
|
let { fieldType, fieldRules, label } = renderItem;
|
|
83
84
|
// 处理校验规则
|
|
84
85
|
const rules: any = [];
|
|
85
|
-
const operateType = ["select", "
|
|
86
|
+
const operateType = ["select", "treeSelect", "date", "datePicker"].includes(renderItem.type) ? "选择" : "输入";
|
|
86
87
|
for (const fieldRule of fieldRules || []) {
|
|
87
|
-
const { msg, required, min, max } = fieldRule;
|
|
88
|
+
const { msg, required, min, max, regex } = fieldRule;
|
|
88
89
|
|
|
89
90
|
// 图片需要额外处理
|
|
90
|
-
|
|
91
91
|
if (
|
|
92
92
|
(renderItem.type == "uploadOss" || renderItem.type == "uploadTos" || renderItem.type == "upload") &&
|
|
93
93
|
renderItem.fieldType == "string"
|
|
@@ -95,12 +95,13 @@ const disposeRenderData = async (renderData: FormDataItem[]) => {
|
|
|
95
95
|
fieldType = "array";
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
+
|
|
98
99
|
if (required) {
|
|
99
100
|
rules.push({
|
|
100
101
|
type: renderItem.type == "uploadOss" || renderItem.type == "uploadTos" ? "array" : renderItem.fieldType,
|
|
101
102
|
required: true,
|
|
102
103
|
message: msg || `请${operateType}${label}`,
|
|
103
|
-
trigger: "blur",
|
|
104
|
+
trigger: ["blur", "change"],
|
|
104
105
|
});
|
|
105
106
|
}
|
|
106
107
|
if (min) {
|
|
@@ -108,7 +109,7 @@ const disposeRenderData = async (renderData: FormDataItem[]) => {
|
|
|
108
109
|
type: fieldType,
|
|
109
110
|
min: min,
|
|
110
111
|
message: msg || `${label}需大于等于${min}${fieldType == "string" ? "个字符" : ""}`,
|
|
111
|
-
trigger: "blur",
|
|
112
|
+
trigger: ["blur", "change"],
|
|
112
113
|
});
|
|
113
114
|
}
|
|
114
115
|
|
|
@@ -117,10 +118,21 @@ const disposeRenderData = async (renderData: FormDataItem[]) => {
|
|
|
117
118
|
type: fieldType,
|
|
118
119
|
max: max,
|
|
119
120
|
message: `${label}需小于等于${max}${fieldType == "string" ? "个字符" : ""}`,
|
|
120
|
-
trigger: "blur",
|
|
121
|
+
trigger: ["blur", "change"],
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
if (regex) {
|
|
125
|
+
rules.push({
|
|
126
|
+
type: fieldType,
|
|
127
|
+
pattern: regex,
|
|
128
|
+
message: msg || `${label}格式错误`,
|
|
129
|
+
trigger: ["blur", "change"],
|
|
121
130
|
});
|
|
122
131
|
}
|
|
123
132
|
}
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
|
|
124
136
|
renderItem.rules = rules;
|
|
125
137
|
|
|
126
138
|
// 处理下拉选择
|
|
@@ -433,47 +445,26 @@ defineExpose({
|
|
|
433
445
|
</script>
|
|
434
446
|
|
|
435
447
|
<template>
|
|
436
|
-
<a-form
|
|
437
|
-
|
|
438
|
-
:model="formState"
|
|
439
|
-
name="basic"
|
|
440
|
-
autocomplete="off"
|
|
441
|
-
:layout="layout"
|
|
442
|
-
:required-mark="requiredMark"
|
|
443
|
-
>
|
|
448
|
+
<a-form ref="formRef" :model="formState" name="basic" autocomplete="off" :layout="layout"
|
|
449
|
+
:required-mark="requiredMark">
|
|
444
450
|
<div v-for="(renderItem, index) in renderData">
|
|
445
|
-
<a-form-item
|
|
446
|
-
:label-col="{ span: renderItem.hideLabel ? 0 : renderItem.labelSpan || labelSpan }"
|
|
451
|
+
<a-form-item :label-col="{ span: renderItem.hideLabel ? 0 : renderItem.labelSpan || labelSpan }"
|
|
447
452
|
:wrapper-col="{ span: renderItem.hideLabel ? undefined : renderItem.valueSpan || valueSpan }"
|
|
448
453
|
v-show="!renderItem.visibleHook || (renderItem.visibleHook && renderItem.visibleHook(formState))"
|
|
449
|
-
:label="renderItem.label && !renderItem.hideLabel ? renderItem.label : ''"
|
|
450
|
-
:
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
?
|
|
455
|
-
|
|
456
|
-
"
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
>
|
|
464
|
-
<div
|
|
465
|
-
:style="{
|
|
466
|
-
pointerEvents: renderItem.disabled ? 'none' : 'auto',
|
|
467
|
-
opacity: renderItem.disabled ? 0.6 : 1,
|
|
468
|
-
cursor: renderItem.disabled ? 'not-allowed' : 'auto',
|
|
469
|
-
}"
|
|
470
|
-
>
|
|
471
|
-
<a-input
|
|
472
|
-
v-model:value="formState[renderItem.key]"
|
|
473
|
-
v-if="renderItem.type == 'input' && [undefined, 'string'].includes(renderItem.fieldType)"
|
|
474
|
-
type="text"
|
|
475
|
-
:placeholder="renderItem.placeholder || `请输入${renderItem.label}`"
|
|
476
|
-
>
|
|
454
|
+
:label="renderItem.label && !renderItem.hideLabel ? renderItem.label : ''" :name="renderItem.key"
|
|
455
|
+
:colon="renderItem.colon == undefined ? true : renderItem.colon" :rules="!renderItem.visibleHook || (renderItem.visibleHook && renderItem.visibleHook(formState))
|
|
456
|
+
? renderItem.rules
|
|
457
|
+
: undefined
|
|
458
|
+
" :style="{
|
|
459
|
+
marginBottom: isSearchForm ? '20px' : '0px',
|
|
460
|
+
}" :tooltip="renderItem.tooltip" :label-align="renderItem.labelAlign || 'right'">
|
|
461
|
+
<div :style="{
|
|
462
|
+
opacity: renderItem.disabled ? 0.6 : 1,
|
|
463
|
+
cursor: renderItem.disabled ? 'not-allowed' : 'auto',
|
|
464
|
+
}">
|
|
465
|
+
<a-input v-model:value="formState[renderItem.key]"
|
|
466
|
+
v-if="renderItem.type == 'input' && [undefined, 'string'].includes(renderItem.fieldType)" type="text"
|
|
467
|
+
:disabled="renderItem.disabled" :placeholder="renderItem.placeholder || `请输入${renderItem.label}`">
|
|
477
468
|
<template v-if="renderItem.prefix" v-slot:prefix>
|
|
478
469
|
<component :is="renderItem.prefix" />
|
|
479
470
|
</template>
|
|
@@ -482,12 +473,9 @@ defineExpose({
|
|
|
482
473
|
</template>
|
|
483
474
|
</a-input>
|
|
484
475
|
|
|
485
|
-
<a-input
|
|
486
|
-
v-
|
|
487
|
-
|
|
488
|
-
type="number"
|
|
489
|
-
:placeholder="renderItem.placeholder || `请输入${renderItem.label}`"
|
|
490
|
-
>
|
|
476
|
+
<a-input v-model:value.number="formState[renderItem.key]"
|
|
477
|
+
v-if="renderItem.type == 'input' && renderItem.fieldType == 'number'" type="number"
|
|
478
|
+
:disabled="renderItem.disabled" :placeholder="renderItem.placeholder || `请输入${renderItem.label}`">
|
|
491
479
|
<template v-if="renderItem.prefix" v-slot:prefix>
|
|
492
480
|
<component :is="renderItem.prefix" />
|
|
493
481
|
</template>
|
|
@@ -496,35 +484,25 @@ defineExpose({
|
|
|
496
484
|
</template>
|
|
497
485
|
</a-input>
|
|
498
486
|
|
|
499
|
-
<a-input-password
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
type="password"
|
|
503
|
-
:placeholder="renderItem.placeholder || `请输入${renderItem.label}`"
|
|
504
|
-
>
|
|
487
|
+
<a-input-password v-model:value="formState[renderItem.key]" v-if="renderItem.type == 'password'"
|
|
488
|
+
type="password" :disabled="renderItem.disabled"
|
|
489
|
+
:placeholder="renderItem.placeholder || `请输入${renderItem.label}`">
|
|
505
490
|
<template v-if="renderItem.prefix" v-slot:prefix>
|
|
506
491
|
<component :is="renderItem.prefix" />
|
|
507
492
|
</template>
|
|
508
493
|
</a-input-password>
|
|
509
494
|
|
|
510
|
-
<a-input
|
|
511
|
-
v-
|
|
512
|
-
|
|
513
|
-
type="text"
|
|
514
|
-
:placeholder="renderItem.placeholder || `请输入${renderItem.label}`"
|
|
515
|
-
>
|
|
495
|
+
<a-input v-model:value="formState[renderItem.key]"
|
|
496
|
+
v-if="renderItem.type == 'code' && [undefined, 'string'].includes(renderItem.fieldType)" type="text"
|
|
497
|
+
:disabled="renderItem.disabled" :placeholder="renderItem.placeholder || `请输入${renderItem.label}`">
|
|
516
498
|
<template v-if="renderItem.prefix" v-slot:prefix>
|
|
517
499
|
<component :is="renderItem.prefix" />
|
|
518
500
|
</template>
|
|
519
501
|
<template v-slot:suffix>
|
|
520
|
-
<span
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
"
|
|
525
|
-
class="send-notice send-notice-activity"
|
|
526
|
-
@click="sendNoticeClick(renderItem)"
|
|
527
|
-
>
|
|
502
|
+
<span v-if="
|
|
503
|
+
(!renderItem.activityFunc || (renderItem.activityFunc && renderItem.activityFunc(formState))) &&
|
|
504
|
+
renderItem.sendStatus != 'sending'
|
|
505
|
+
" class="send-notice send-notice-activity" @click="sendNoticeClick(renderItem)">
|
|
528
506
|
{{ renderItem.codeName }}
|
|
529
507
|
</span>
|
|
530
508
|
<span v-else class="send-notice">
|
|
@@ -533,69 +511,44 @@ defineExpose({
|
|
|
533
511
|
</template>
|
|
534
512
|
</a-input>
|
|
535
513
|
|
|
536
|
-
<a-textarea
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
:
|
|
547
|
-
v-if="renderItem.type == 'select'"
|
|
548
|
-
:fieldNames="renderItem.fieldNames || { label: 'label', value: 'value' }"
|
|
549
|
-
:options="renderItem.optionList"
|
|
550
|
-
:mode="renderItem.isMultiple ? 'multiple' : undefined"
|
|
551
|
-
></a-select>
|
|
552
|
-
|
|
553
|
-
<a-radio-group v-if="renderItem.type == 'radio'" v-model:value="formState[renderItem.key]">
|
|
514
|
+
<a-textarea v-model:value="formState[renderItem.key]" v-if="renderItem.type == 'textarea'"
|
|
515
|
+
:disabled="renderItem.disabled" :placeholder="renderItem.placeholder || `请输入${renderItem.label}`"
|
|
516
|
+
:auto-size="{ minRows: 2, maxRows: 10 }" />
|
|
517
|
+
|
|
518
|
+
<a-select style="min-width: 170px; margin-right: 15px" v-model:value="formState[renderItem.key]"
|
|
519
|
+
:placeholder="renderItem.placeholder || `请选择`" v-if="renderItem.type == 'select'"
|
|
520
|
+
:disabled="renderItem.disabled" :fieldNames="renderItem.fieldNames || { label: 'label', value: 'value' }"
|
|
521
|
+
:options="renderItem.optionList" :mode="renderItem.isMultiple ? 'multiple' : undefined"></a-select>
|
|
522
|
+
|
|
523
|
+
<a-radio-group v-if="renderItem.type == 'radio'" v-model:value="formState[renderItem.key]"
|
|
524
|
+
:disabled="renderItem.disabled">
|
|
554
525
|
<a-radio v-for="item in renderItem.optionList" :value="item[renderItem.fieldNames?.value || 'value']">
|
|
555
526
|
{{ item[renderItem.fieldNames?.label || "label"] }}
|
|
556
527
|
</a-radio>
|
|
557
528
|
</a-radio-group>
|
|
558
529
|
|
|
559
|
-
<a-date-picker
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
format="YYYY-MM-DD HH:mm:ss"
|
|
566
|
-
value-format="YYYY-MM-DD HH:mm:ss"
|
|
567
|
-
/>
|
|
568
|
-
|
|
569
|
-
<a-tree-select
|
|
570
|
-
style="min-width: 170px; margin-right: 15px"
|
|
571
|
-
v-model:value="formState[renderItem.key]"
|
|
572
|
-
:tree-data="renderItem.optionList"
|
|
573
|
-
v-if="renderItem.type == 'treeSelect'"
|
|
530
|
+
<a-date-picker v-model:value="formState[renderItem.key]" v-if="renderItem.type === 'datePicker'" show-time
|
|
531
|
+
:disabled="renderItem.disabled" :placeholder="`请选择${renderItem.label}`" class="ant-input"
|
|
532
|
+
format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" />
|
|
533
|
+
|
|
534
|
+
<a-tree-select style="min-width: 170px; margin-right: 15px" v-model:value="formState[renderItem.key]"
|
|
535
|
+
:tree-data="renderItem.optionList" v-if="renderItem.type == 'treeSelect'" :disabled="renderItem.disabled"
|
|
574
536
|
:fieldNames="renderItem.fieldNames || { children: 'children', label: 'name', value: 'id' }"
|
|
575
|
-
:placeholder="renderItem.placeholder || `请选择`"
|
|
576
|
-
></a-tree-select>
|
|
537
|
+
:placeholder="renderItem.placeholder || `请选择`"></a-tree-select>
|
|
577
538
|
|
|
578
539
|
<a-upload
|
|
579
540
|
v-if="renderItem.type == 'uploadOss' || renderItem.type == 'uploadTos' || renderItem.type == 'upload'"
|
|
580
|
-
:file-list="formState[renderItem.key]"
|
|
581
|
-
:
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
uploadChange(e, renderItem);
|
|
592
|
-
}
|
|
593
|
-
"
|
|
594
|
-
:headers="{
|
|
595
|
-
'Cache-Control': 'max-age=15552000',
|
|
596
|
-
}"
|
|
597
|
-
:list-type="renderItem.uploadType == 'pic' ? 'picture-card' : undefined"
|
|
598
|
-
>
|
|
541
|
+
:file-list="formState[renderItem.key]" :multiple="true" :max-count="renderItem?.maxCount || 1"
|
|
542
|
+
@preview="handlePicPreview" :customRequest="(e) => {
|
|
543
|
+
uploadRequest(e, renderItem);
|
|
544
|
+
}
|
|
545
|
+
" @change="
|
|
546
|
+
(e) => {
|
|
547
|
+
uploadChange(e, renderItem);
|
|
548
|
+
}
|
|
549
|
+
" :headers="{
|
|
550
|
+
'Cache-Control': 'max-age=15552000',
|
|
551
|
+
}" :list-type="renderItem.uploadType == 'pic' ? 'picture-card' : undefined">
|
|
599
552
|
<div v-if="renderItem.uploadType == 'pic'">
|
|
600
553
|
<plus-outlined />
|
|
601
554
|
<div style="margin-top: 8px">{{ renderItem.label }}</div>
|
|
@@ -609,8 +562,9 @@ defineExpose({
|
|
|
609
562
|
</div>
|
|
610
563
|
</a-upload>
|
|
611
564
|
|
|
612
|
-
<component v-if="renderItem.type == 'component'" :is="renderItem.component"
|
|
613
|
-
|
|
565
|
+
<component v-if="renderItem.type == 'component'" :is="renderItem.component"
|
|
566
|
+
v-model:[renderItem.key]="formState[renderItem.key]"></component>
|
|
567
|
+
</div>
|
|
614
568
|
</a-form-item>
|
|
615
569
|
</div>
|
|
616
570
|
|
package/dist/utils/dataUtils.ts
CHANGED
|
@@ -35,33 +35,77 @@ export const isEmpty = (value: any): boolean => {
|
|
|
35
35
|
|
|
36
36
|
|
|
37
37
|
export const cloneDeep = <T>(value: T, weakMap = new WeakMap()): T => {
|
|
38
|
-
|
|
38
|
+
// 1. 基础类型直接返回
|
|
39
|
+
if (value === null || typeof value !== "object") return value;
|
|
39
40
|
|
|
40
|
-
|
|
41
|
+
// 2. 处理循环引用
|
|
42
|
+
if (weakMap.has(value as any)) {
|
|
43
|
+
return weakMap.get(value as any);
|
|
44
|
+
}
|
|
41
45
|
|
|
42
46
|
let result: any;
|
|
43
47
|
|
|
48
|
+
// 3. RegExp
|
|
49
|
+
if (value instanceof RegExp) {
|
|
50
|
+
result = new RegExp(value.source, value.flags);
|
|
51
|
+
weakMap.set(value, result);
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// 4. Date
|
|
56
|
+
if (value instanceof Date) {
|
|
57
|
+
result = new Date(value.getTime());
|
|
58
|
+
weakMap.set(value, result);
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// 5. Map
|
|
63
|
+
if (value instanceof Map) {
|
|
64
|
+
result = new Map();
|
|
65
|
+
weakMap.set(value, result);
|
|
66
|
+
|
|
67
|
+
value.forEach((v, k) => {
|
|
68
|
+
result.set(k, cloneDeep(v, weakMap));
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// 6. Set
|
|
75
|
+
if (value instanceof Set) {
|
|
76
|
+
result = new Set();
|
|
77
|
+
weakMap.set(value, result);
|
|
78
|
+
|
|
79
|
+
value.forEach((v) => {
|
|
80
|
+
result.add(cloneDeep(v, weakMap));
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// 7. Array
|
|
44
87
|
if (Array.isArray(value)) {
|
|
45
88
|
result = [];
|
|
46
89
|
weakMap.set(value, result);
|
|
90
|
+
|
|
47
91
|
for (const item of value) {
|
|
48
92
|
result.push(cloneDeep(item, weakMap));
|
|
49
93
|
}
|
|
94
|
+
|
|
50
95
|
return result;
|
|
51
96
|
}
|
|
52
97
|
|
|
53
|
-
|
|
98
|
+
// 8. 普通对象
|
|
99
|
+
result = Object.create(Object.getPrototypeOf(value));
|
|
54
100
|
weakMap.set(value, result);
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
101
|
+
|
|
102
|
+
for (const key of Object.keys(value as any)) {
|
|
103
|
+
result[key] = cloneDeep((value as any)[key], weakMap);
|
|
59
104
|
}
|
|
60
105
|
|
|
61
106
|
return result;
|
|
62
107
|
};
|
|
63
108
|
|
|
64
|
-
|
|
65
109
|
export const isArray = (value: any) => {
|
|
66
110
|
return Array.isArray(value);
|
|
67
111
|
};
|
|
@@ -134,21 +178,3 @@ const paramsToString = (params) => {
|
|
|
134
178
|
return url
|
|
135
179
|
}
|
|
136
180
|
|
|
137
|
-
|
|
138
|
-
export const navTo = (url, params = {}) => {
|
|
139
|
-
uni.navigateTo({ url: url + paramsToString(params) })
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
export const dirTo = (url, params = {}) => {
|
|
144
|
-
uni.redirectTo({ url: url + paramsToString(params) })
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
export const switchTo = (url) => {
|
|
148
|
-
uni.switchTab({ url })
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
export const backTo = (delta = 1) => {
|
|
152
|
-
uni.navigateBack({ delta })
|
|
153
|
-
}
|
|
154
|
-
|