p-pc-ui 1.3.9 → 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 = { msg?: string, required?: boolean, min?: number, max?: number, decimal?: number }
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", "treeSeect", "date", "datePicker"].includes(renderItem.type) ? "选择" : "输入";
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
- ref="formRef"
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
- :name="renderItem.key"
451
- :colon="renderItem.colon == undefined ? true : renderItem.colon"
452
- :rules="
453
- !renderItem.visibleHook || (renderItem.visibleHook && renderItem.visibleHook(formState))
454
- ? renderItem.rules
455
- : undefined
456
- "
457
- :auto-link="false"
458
- :style="{
459
- marginBottom: isSearchForm ? '20px' : '0px',
460
- }"
461
- :tooltip="renderItem.tooltip"
462
- :label-align="renderItem.labelAlign || 'right'"
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-model:value.number="formState[renderItem.key]"
487
- v-if="renderItem.type == 'input' && renderItem.fieldType == 'number'"
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
- v-model:value="formState[renderItem.key]"
501
- v-if="renderItem.type == 'password'"
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-model:value="formState[renderItem.key]"
512
- v-if="renderItem.type == 'code' && [undefined, 'string'].includes(renderItem.fieldType)"
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
- v-if="
522
- (!renderItem.activityFunc || (renderItem.activityFunc && renderItem.activityFunc(formState))) &&
523
- renderItem.sendStatus != 'sending'
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
- v-model:value="formState[renderItem.key]"
538
- v-if="renderItem.type == 'textarea'"
539
- :placeholder="renderItem.placeholder || `请输入${renderItem.label}`"
540
- :auto-size="{ minRows: 2, maxRows: 10 }"
541
- />
542
-
543
- <a-select
544
- style="min-width: 170px; margin-right: 15px"
545
- v-model:value="formState[renderItem.key]"
546
- :placeholder="renderItem.placeholder || `请选择`"
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
- v-model:value="formState[renderItem.key]"
561
- v-if="renderItem.type === 'datePicker'"
562
- show-time
563
- :placeholder="`请选择${renderItem.label}`"
564
- class="ant-input"
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
- :multiple="true"
582
- :max-count="renderItem?.maxCount || 1"
583
- @preview="handlePicPreview"
584
- :customRequest="
585
- (e) => {
586
- uploadRequest(e, renderItem);
587
- }
588
- "
589
- @change="
590
- (e) => {
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" v-model:[renderItem.key]="formState[renderItem.key]"></component>
613
- </div>
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
 
@@ -53,7 +53,10 @@ const tableData = reactive({
53
53
  const emits = defineEmits(["select"]);
54
54
 
55
55
  const rowSelection = {
56
- onChange: (selectedRowKeys, selectedRows) => {
56
+ get selectedRowKeys() {
57
+ return selectedIds.value;
58
+ },
59
+ onChange: (selectedRowKeys: string[], _selectedRows: any[]) => {
57
60
  selectedIds.value = selectedRowKeys;
58
61
  emits("select", selectedRowKeys);
59
62
  },
@@ -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
- if (value === null || typeof value !== 'object') return value;
38
+ // 1. 基础类型直接返回
39
+ if (value === null || typeof value !== "object") return value;
39
40
 
40
- if (weakMap.has(value)) return weakMap.get(value); // 解决循环引用
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
- result = {};
98
+ // 8. 普通对象
99
+ result = Object.create(Object.getPrototypeOf(value));
54
100
  weakMap.set(value, result);
55
- for (const key in value) {
56
- if (Object.prototype.hasOwnProperty.call(value, key)) {
57
- result[key] = cloneDeep(value[key], weakMap);
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
-
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "p-pc-ui",
3
- "version": "1.3.9",
3
+ "version": "1.3.11",
4
4
  "type": "module",
5
5
  "module": "dist/index.ts",
6
6
  "main": "dist/index.ts",