@tianyr/schema-antd 0.1.1 → 0.2.0
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 +17 -2
- package/dist/biz-select/BizMultiSelect.d.ts +3 -0
- package/dist/biz-select/BizMultiSelect.d.ts.map +1 -0
- package/dist/biz-select/BizMultiSelect.js +120 -0
- package/dist/biz-select/BizMultiSelect.js.map +1 -0
- package/dist/biz-select/BizMultiSelectDisplay.d.ts +3 -0
- package/dist/biz-select/BizMultiSelectDisplay.d.ts.map +1 -0
- package/dist/biz-select/BizMultiSelectDisplay.js +59 -0
- package/dist/biz-select/BizMultiSelectDisplay.js.map +1 -0
- package/dist/biz-select/BizSelect.d.ts.map +1 -1
- package/dist/biz-select/BizSelect.js +5 -5
- package/dist/biz-select/BizSelect.js.map +1 -1
- package/dist/biz-select/BizSelectDisplay.js +6 -6
- package/dist/biz-select/BizSelectDisplay.js.map +1 -1
- package/dist/biz-select/cache.d.ts +7 -0
- package/dist/biz-select/cache.d.ts.map +1 -1
- package/dist/biz-select/cache.js +11 -0
- package/dist/biz-select/cache.js.map +1 -1
- package/dist/biz-select/compile.d.ts +13 -2
- package/dist/biz-select/compile.d.ts.map +1 -1
- package/dist/biz-select/compile.js +24 -3
- package/dist/biz-select/compile.js.map +1 -1
- package/dist/biz-select/factories.d.ts +22 -13
- package/dist/biz-select/factories.d.ts.map +1 -1
- package/dist/biz-select/factories.js +57 -7
- package/dist/biz-select/factories.js.map +1 -1
- package/dist/biz-select/format.d.ts +29 -11
- package/dist/biz-select/format.d.ts.map +1 -1
- package/dist/biz-select/format.js +100 -35
- package/dist/biz-select/format.js.map +1 -1
- package/dist/biz-select/index.d.ts +7 -2
- package/dist/biz-select/index.d.ts.map +1 -1
- package/dist/biz-select/index.js +4 -0
- package/dist/biz-select/index.js.map +1 -1
- package/dist/biz-select/key.d.ts +12 -2
- package/dist/biz-select/key.d.ts.map +1 -1
- package/dist/biz-select/key.js +14 -0
- package/dist/biz-select/key.js.map +1 -1
- package/dist/biz-select/normalize.d.ts +3 -0
- package/dist/biz-select/normalize.d.ts.map +1 -1
- package/dist/biz-select/normalize.js +4 -1
- package/dist/biz-select/normalize.js.map +1 -1
- package/dist/biz-select/resolveBatch.d.ts +34 -0
- package/dist/biz-select/resolveBatch.d.ts.map +1 -0
- package/dist/biz-select/resolveBatch.js +124 -0
- package/dist/biz-select/resolveBatch.js.map +1 -0
- package/dist/biz-select/schema.d.ts +1 -1
- package/dist/biz-select/schema.d.ts.map +1 -1
- package/dist/biz-select/schema.js +8 -1
- package/dist/biz-select/schema.js.map +1 -1
- package/dist/biz-select/types.d.ts +74 -18
- package/dist/biz-select/types.d.ts.map +1 -1
- package/dist/biz-select/useResolvedLabels.d.ts +28 -0
- package/dist/biz-select/useResolvedLabels.d.ts.map +1 -0
- package/dist/biz-select/useResolvedLabels.js +151 -0
- package/dist/biz-select/useResolvedLabels.js.map +1 -0
- package/dist/biz-select/useSelectedLabel.d.ts +2 -2
- package/dist/biz-select/useSelectedLabel.d.ts.map +1 -1
- package/dist/biz-select/useSelectedLabel.js +14 -16
- package/dist/biz-select/useSelectedLabel.js.map +1 -1
- package/dist/biz-select/useSelectedLabels.d.ts +26 -0
- package/dist/biz-select/useSelectedLabels.d.ts.map +1 -0
- package/dist/biz-select/useSelectedLabels.js +88 -0
- package/dist/biz-select/useSelectedLabels.js.map +1 -0
- package/dist/flat.d.ts +43 -0
- package/dist/flat.d.ts.map +1 -0
- package/dist/flat.js +91 -0
- package/dist/flat.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -7,17 +7,15 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
9
9
|
import { resolveCodeWithCache } from './cache.js';
|
|
10
|
-
import { paramsKeyOf, resolveCacheKey } from './key.js';
|
|
10
|
+
import { codeKeyOf, paramsKeyOf, resolveCacheKey } from './key.js';
|
|
11
11
|
import { hasRequiredParams, normalizeSource } from './normalize.js';
|
|
12
|
+
import { resolveOne } from './resolveBatch.js';
|
|
12
13
|
/** 编码比对统一走字符串:后端可能把 1 和 '1' 当同一个值 */
|
|
13
|
-
function
|
|
14
|
+
function sameValue(a, b) {
|
|
14
15
|
return a !== undefined && b !== undefined && String(a) === String(b);
|
|
15
16
|
}
|
|
16
|
-
function codeKeyOf(code) {
|
|
17
|
-
return code === undefined || code === null ? '' : `${typeof code}:${code}`;
|
|
18
|
-
}
|
|
19
17
|
function findOption(list, code) {
|
|
20
|
-
return list?.find((item) => item.
|
|
18
|
+
return list?.find((item) => item.value === code);
|
|
21
19
|
}
|
|
22
20
|
export function useSelectedLabel({ source, sourceKey, code, valueName, seedOptions, candidates, params, }) {
|
|
23
21
|
const capability = normalizeSource(source);
|
|
@@ -54,8 +52,7 @@ export function useSelectedLabel({ source, sourceKey, code, valueName, seedOptio
|
|
|
54
52
|
useEffect(() => {
|
|
55
53
|
if (code === undefined || hasLocal || hasValueName || !canResolve || blocked)
|
|
56
54
|
return;
|
|
57
|
-
|
|
58
|
-
if (!resolve)
|
|
55
|
+
if (!sourceRef.current)
|
|
59
56
|
return;
|
|
60
57
|
const requested = codeRef.current;
|
|
61
58
|
const key = resolveCacheKey(scope, sourceKey, requested, paramsKey);
|
|
@@ -65,14 +62,15 @@ export function useSelectedLabel({ source, sourceKey, code, valueName, seedOptio
|
|
|
65
62
|
setLoading(true);
|
|
66
63
|
// 不传 AbortSignal:这个 promise 是多个实例共享的,
|
|
67
64
|
// 单个实例卸载不能把别人的请求掐掉,只放弃自己的状态更新即可
|
|
68
|
-
|
|
65
|
+
// 只声明了 resolveMany 的源也能单条回显:批量一条就是单条
|
|
66
|
+
resolveCodeWithCache(key, () => resolveOne(sourceRef.current, requested, paramsRef.current ?? {}))
|
|
69
67
|
.then((option) => {
|
|
70
68
|
if (cancelled || seq !== seqRef.current)
|
|
71
69
|
return;
|
|
72
70
|
// 接口返回了别的编码就别认:认错比认不出更糟,展示层会显示陌生名称。
|
|
73
71
|
// 数字/字符串同一编码(后端序列化常见)认下,但编码归一到值的类型:
|
|
74
72
|
// 否则选项 value 与 Select 的 value 对不上,标签等于白解析
|
|
75
|
-
const matched = option &&
|
|
73
|
+
const matched = option && sameValue(option.value, requested) ? { ...option, value: requested } : null;
|
|
76
74
|
setAsyncResult({ sourceKey, scope, paramsKey, codeKey, option: matched, failed: false });
|
|
77
75
|
})
|
|
78
76
|
.catch(() => {
|
|
@@ -109,7 +107,7 @@ export function useSelectedLabel({ source, sourceKey, code, valueName, seedOptio
|
|
|
109
107
|
const fallback = remembered?.key === memoryKey ? remembered.option : undefined;
|
|
110
108
|
// 1) 对象值自带的名称:详情已经给了,不必再查
|
|
111
109
|
if (valueName)
|
|
112
|
-
return { option: remember({ code,
|
|
110
|
+
return { option: remember({ value: code, label: valueName }), status: 'resolved' };
|
|
113
111
|
// 2) 页面预置的候选
|
|
114
112
|
if (seedHit)
|
|
115
113
|
return { option: remember(seedHit), status: 'resolved' };
|
|
@@ -127,18 +125,18 @@ export function useSelectedLabel({ source, sourceKey, code, valueName, seedOptio
|
|
|
127
125
|
// 解析不到但之前见过这个编码:搜索型源的候选已被关键词换掉,别退回编码
|
|
128
126
|
if (fallback)
|
|
129
127
|
return { option: fallback, status: 'resolved' };
|
|
130
|
-
return { option: { code }, status: asyncResult.failed ? 'error' : 'missing' };
|
|
128
|
+
return { option: { value: code }, status: asyncResult.failed ? 'error' : 'missing' };
|
|
131
129
|
}
|
|
132
130
|
if (fallback)
|
|
133
131
|
return { option: fallback, status: 'resolved' };
|
|
134
132
|
if (!canResolve)
|
|
135
|
-
return { option: { code }, status: 'missing' };
|
|
133
|
+
return { option: { value: code }, status: 'missing' };
|
|
136
134
|
// 用空条件查可能拿到别家数据,宁可不查
|
|
137
135
|
if (blocked)
|
|
138
|
-
return { option: { code }, status: 'blocked' };
|
|
136
|
+
return { option: { value: code }, status: 'blocked' };
|
|
139
137
|
if (loading)
|
|
140
|
-
return { option: { code }, status: 'loading' };
|
|
141
|
-
return { option: { code }, status: 'missing' };
|
|
138
|
+
return { option: { value: code }, status: 'loading' };
|
|
139
|
+
return { option: { value: code }, status: 'missing' };
|
|
142
140
|
}, [
|
|
143
141
|
code,
|
|
144
142
|
valueName,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSelectedLabel.js","sourceRoot":"","sources":["../../src/biz-select/useSelectedLabel.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useSelectedLabel.js","sourceRoot":"","sources":["../../src/biz-select/useSelectedLabel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { SelectedStatus } from './useSelectedLabel.js';
|
|
2
|
+
import type { BizOption, SelectParams, SelectSource, SelectValue } from './types.js';
|
|
3
|
+
export interface UseSelectedLabelsOptions {
|
|
4
|
+
/** 注册名或内联源,写法和组件一致 */
|
|
5
|
+
source?: string | SelectSource;
|
|
6
|
+
/** 内联源显式共享缓存用;注册名自带稳定键 */
|
|
7
|
+
cacheKey?: string;
|
|
8
|
+
/** 已算好的来源键,只用于给记忆分区 */
|
|
9
|
+
sourceKey: string;
|
|
10
|
+
/** 当前选中的编码,顺序即展示顺序 */
|
|
11
|
+
codes: SelectValue[];
|
|
12
|
+
/** 对象值里自带的名称,键是 `String(编码)` */
|
|
13
|
+
valueNames?: Map<string, string>;
|
|
14
|
+
seedOptions?: BizOption[];
|
|
15
|
+
candidates?: BizOption[];
|
|
16
|
+
params?: SelectParams;
|
|
17
|
+
}
|
|
18
|
+
export interface UseSelectedLabelsResult {
|
|
19
|
+
/** 与 `codes` 同序同长;解析不到的是只有 `value` 的占位选项 */
|
|
20
|
+
options: BizOption[];
|
|
21
|
+
status: SelectedStatus;
|
|
22
|
+
/** 批量解析实际发出的请求数,用来判断该不该要批量接口 */
|
|
23
|
+
requests: number;
|
|
24
|
+
}
|
|
25
|
+
export declare function useSelectedLabels({ source, cacheKey, sourceKey, codes, valueNames, seedOptions, candidates, params, }: UseSelectedLabelsOptions): UseSelectedLabelsResult;
|
|
26
|
+
//# sourceMappingURL=useSelectedLabels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSelectedLabels.d.ts","sourceRoot":"","sources":["../../src/biz-select/useSelectedLabels.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAKlF,MAAM,WAAW,wBAAwB;IACvC,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;IAC/B,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB;IACtB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,gCAAgC;IAChC,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,4CAA4C;IAC5C,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,MAAM,EAAE,cAAc,CAAC;IACvB,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,QAAQ,EACR,SAAS,EACT,KAAK,EACL,UAAU,EACV,WAAW,EACX,UAAU,EACV,MAAM,GACP,EAAE,wBAAwB,GAAG,uBAAuB,CA0EpD"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 多选的已选项回显。
|
|
3
|
+
*
|
|
4
|
+
* 优先级和单选的 `useSelectedLabel` 完全一致,只是按编码逐个求:
|
|
5
|
+
* 对象值自带的名称 → seedOptions → 已加载候选 → 批量解析 → 原样显示编码。
|
|
6
|
+
*
|
|
7
|
+
* 不直接改 `useResolvedLabels`:那个是公开 API(表格列回显),语义只有"批量解析"。
|
|
8
|
+
* 回显优先级是组件的事,混进去两边的契约都会变模糊。
|
|
9
|
+
*/
|
|
10
|
+
import { useMemo, useRef } from 'react';
|
|
11
|
+
import { lookupKeyOf, paramsKeyOf } from './key.js';
|
|
12
|
+
import { useResolvedLabels } from './useResolvedLabels.js';
|
|
13
|
+
/** 已选项记忆的上限:搜索型源的候选会被关键词整批换掉,靠它兜底 */
|
|
14
|
+
const MAX_MEMORY = 200;
|
|
15
|
+
export function useSelectedLabels({ source, cacheKey, sourceKey, codes, valueNames, seedOptions, candidates, params, }) {
|
|
16
|
+
// 数组每次渲染都可能是新引用,用字符串当身份
|
|
17
|
+
const codesKey = codes.map(lookupKeyOf).join('|');
|
|
18
|
+
const paramsKey = paramsKeyOf(params);
|
|
19
|
+
// 1) 本地能查到的先命中,不发请求
|
|
20
|
+
const local = useMemo(() => {
|
|
21
|
+
const map = new Map();
|
|
22
|
+
for (const code of codes) {
|
|
23
|
+
const key = lookupKeyOf(code);
|
|
24
|
+
const valueName = valueNames?.get(key);
|
|
25
|
+
if (valueName) {
|
|
26
|
+
map.set(key, { value: code, label: valueName });
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
const seed = seedOptions?.find((item) => lookupKeyOf(item.value) === key);
|
|
30
|
+
if (seed) {
|
|
31
|
+
map.set(key, seed);
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const candidate = candidates?.find((item) => lookupKeyOf(item.value) === key);
|
|
35
|
+
if (candidate)
|
|
36
|
+
map.set(key, candidate);
|
|
37
|
+
}
|
|
38
|
+
return map;
|
|
39
|
+
}, [codesKey, valueNames, seedOptions, candidates]);
|
|
40
|
+
// 2) 剩下的走批量解析;空数组时 Hook 自己会短路
|
|
41
|
+
const missing = useMemo(() => codes.filter((code) => !local.has(lookupKeyOf(code))), [codesKey, local]);
|
|
42
|
+
const batch = useResolvedLabels({ source, cacheKey, values: missing, params });
|
|
43
|
+
/**
|
|
44
|
+
* 已选项兜底记忆。
|
|
45
|
+
*
|
|
46
|
+
* 搜索型源的候选会随关键词整批换掉,重新展开拿到的也只是第一页,
|
|
47
|
+
* 已选项常常不在里面。按「来源 + 条件 + 编码」记住最近一次的命中,
|
|
48
|
+
* 条件一变自然失效——和单选同一套做法。
|
|
49
|
+
*/
|
|
50
|
+
const memoryRef = useRef(new Map());
|
|
51
|
+
const memoryKeyOf = (code) => `${sourceKey}|${paramsKey}|${lookupKeyOf(code)}`;
|
|
52
|
+
return useMemo(() => {
|
|
53
|
+
if (!codes.length)
|
|
54
|
+
return { options: [], status: 'empty', requests: 0 };
|
|
55
|
+
let unresolved = 0;
|
|
56
|
+
const options = codes.map((code) => {
|
|
57
|
+
const key = lookupKeyOf(code);
|
|
58
|
+
const hit = local.get(key) ?? batch.byCode.get(key);
|
|
59
|
+
const option = hit ?? memoryRef.current.get(memoryKeyOf(code)) ?? { value: code };
|
|
60
|
+
if (hit) {
|
|
61
|
+
// 命中的顺手记一笔,下次候选被换掉时有得兜底
|
|
62
|
+
memoryRef.current.set(memoryKeyOf(code), hit);
|
|
63
|
+
if (memoryRef.current.size > MAX_MEMORY) {
|
|
64
|
+
const oldest = memoryRef.current.keys().next();
|
|
65
|
+
if (!oldest.done)
|
|
66
|
+
memoryRef.current.delete(oldest.value);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (option.label === undefined)
|
|
70
|
+
unresolved += 1;
|
|
71
|
+
return option;
|
|
72
|
+
});
|
|
73
|
+
let status = 'resolved';
|
|
74
|
+
if (unresolved > 0) {
|
|
75
|
+
if (batch.loading)
|
|
76
|
+
status = 'loading';
|
|
77
|
+
else if (batch.blocked)
|
|
78
|
+
status = 'blocked';
|
|
79
|
+
else if (batch.error)
|
|
80
|
+
status = 'error';
|
|
81
|
+
else
|
|
82
|
+
status = 'missing';
|
|
83
|
+
}
|
|
84
|
+
return { options, status, requests: batch.requests };
|
|
85
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
86
|
+
}, [codesKey, paramsKey, sourceKey, local, batch.byCode, batch.loading, batch.blocked, batch.error, batch.requests]);
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=useSelectedLabels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSelectedLabels.js","sourceRoot":"","sources":["../../src/biz-select/useSelectedLabels.ts"],"names":[],"mappings":"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"}
|
package/dist/flat.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** 对应关系:表单里哪个字段装对象,平铺结构里哪两个键装值/名称 */
|
|
2
|
+
export interface FlatFieldPair {
|
|
3
|
+
/** 表单里装对象的字段名。只支持顶层字段 */
|
|
4
|
+
readonly field: string;
|
|
5
|
+
/** 平铺结构里装值的键名 */
|
|
6
|
+
readonly value: string;
|
|
7
|
+
/** 平铺结构里装名称的键名;省略表示只回传值 */
|
|
8
|
+
readonly label?: string;
|
|
9
|
+
}
|
|
10
|
+
/** 对象值里装值/名称的键名;不传就与平铺键同名 */
|
|
11
|
+
export interface FlatObjectKeys {
|
|
12
|
+
readonly value?: string;
|
|
13
|
+
readonly label?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface FlatFieldsOptions {
|
|
16
|
+
/**
|
|
17
|
+
* 对象值内部的键名,缺的按平铺键兜底。
|
|
18
|
+
*
|
|
19
|
+
* 默认与平铺键同名——这是新约定的写法:`valueFields` 直接照后端字段名起,
|
|
20
|
+
* 于是对象是 `{ userId, userName }`、平铺也是 `userId` / `userName`。
|
|
21
|
+
* 存量页面对象用的是 antd 默认键时传 `ANTD_OBJECT_KEYS`。
|
|
22
|
+
*/
|
|
23
|
+
readonly objectKeys?: FlatObjectKeys;
|
|
24
|
+
}
|
|
25
|
+
/** 对象值用 antd 默认键 `{ value, label }` 时传它 */
|
|
26
|
+
export declare const ANTD_OBJECT_KEYS: FlatObjectKeys;
|
|
27
|
+
type FlatRecord = Record<string, unknown>;
|
|
28
|
+
export interface FlatFields {
|
|
29
|
+
readonly pairs: readonly FlatFieldPair[];
|
|
30
|
+
/** 详情记录 → 表单值:平铺 → 对象。只产出声明的字段 */
|
|
31
|
+
toForm(record?: FlatRecord | null): FlatRecord;
|
|
32
|
+
/** 表单值 → 提交结构:对象 → 平铺。只产出声明的键 */
|
|
33
|
+
toPayload(values?: FlatRecord | null): FlatRecord;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 声明一份边界对应关系,返回两个纯函数。
|
|
37
|
+
*
|
|
38
|
+
* 声明必须显式写出来:`partyA` → `partyAId` + `partyACompanyName` 这种不对称命名,
|
|
39
|
+
* 任何自动推导都是猜(看到 `Id` 就当值、看到 `Name` 就当名称),猜错会静默串数据。
|
|
40
|
+
*/
|
|
41
|
+
export declare function defineFlatFields(pairs: readonly FlatFieldPair[], options?: FlatFieldsOptions): FlatFields;
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=flat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flat.d.ts","sourceRoot":"","sources":["../src/flat.ts"],"names":[],"mappings":"AAeA,qCAAqC;AACrC,MAAM,WAAW,aAAa;IAC5B,yBAAyB;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iBAAiB;IACjB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,6BAA6B;AAC7B,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC;CACtC;AAED,2CAA2C;AAC3C,eAAO,MAAM,gBAAgB,EAAE,cAAmD,CAAC;AAEnF,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,kCAAkC;IAClC,MAAM,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,GAAG,UAAU,CAAC;IAC/C,iCAAiC;IACjC,SAAS,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,GAAG,UAAU,CAAC;CACnD;AAID;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,aAAa,EAAE,EAC/B,OAAO,GAAE,iBAAsB,GAC9B,UAAU,CAiEZ"}
|
package/dist/flat.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 表单边界转换:对象值 ↔ 平铺值。
|
|
3
|
+
*
|
|
4
|
+
* 解决的是「详情平铺给出 `partyAId` + `partyACompanyName`,表单里想存一个对象」
|
|
5
|
+
* 这一类形状问题,只在两个时刻各做一次:进表单(`toForm`)和出表单(`toPayload`)。
|
|
6
|
+
* 编辑期间表单里只有一份值——不预置、不新增、不隐藏任何字段。
|
|
7
|
+
*
|
|
8
|
+
* 不依赖 React / antd,也完全不认识 BizSelect:它只认 `{ field, value, label }`
|
|
9
|
+
* 三件事的对应关系,所以日期范围、树选择、级联同样能用。
|
|
10
|
+
*
|
|
11
|
+
* 为什么不放进组件:组件只产出一个 name 一个值。任何「读/写别的字段」的能力
|
|
12
|
+
* 都会让它知道提交结构这件事,而提交结构是表单边界的问题,跟用哪个控件无关。
|
|
13
|
+
*/
|
|
14
|
+
import { present } from './biz-select/format.js';
|
|
15
|
+
/** 对象值用 antd 默认键 `{ value, label }` 时传它 */
|
|
16
|
+
export const ANTD_OBJECT_KEYS = { value: 'value', label: 'label' };
|
|
17
|
+
const has = (record, key) => Object.prototype.hasOwnProperty.call(record, key);
|
|
18
|
+
/**
|
|
19
|
+
* 声明一份边界对应关系,返回两个纯函数。
|
|
20
|
+
*
|
|
21
|
+
* 声明必须显式写出来:`partyA` → `partyAId` + `partyACompanyName` 这种不对称命名,
|
|
22
|
+
* 任何自动推导都是猜(看到 `Id` 就当值、看到 `Name` 就当名称),猜错会静默串数据。
|
|
23
|
+
*/
|
|
24
|
+
export function defineFlatFields(pairs, options = {}) {
|
|
25
|
+
// 定义期就挡掉重复:平铺键撞了会让后一个静默覆盖前一个,等到线上才发现
|
|
26
|
+
const fields = new Set();
|
|
27
|
+
const flatKeys = new Set();
|
|
28
|
+
for (const pair of pairs) {
|
|
29
|
+
if (!pair.field || !pair.value) {
|
|
30
|
+
throw new Error('flat fields:field 与 value 都是必填');
|
|
31
|
+
}
|
|
32
|
+
if (fields.has(pair.field)) {
|
|
33
|
+
throw new Error(`flat fields:表单字段重复 ${pair.field}`);
|
|
34
|
+
}
|
|
35
|
+
fields.add(pair.field);
|
|
36
|
+
for (const key of [pair.value, pair.label]) {
|
|
37
|
+
if (!key)
|
|
38
|
+
continue;
|
|
39
|
+
if (flatKeys.has(key))
|
|
40
|
+
throw new Error(`flat fields:平铺键重复 ${key}`);
|
|
41
|
+
flatKeys.add(key);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const objectKeysOf = (pair) => ({
|
|
45
|
+
value: options.objectKeys?.value ?? pair.value,
|
|
46
|
+
label: options.objectKeys?.label ?? pair.label ?? 'label',
|
|
47
|
+
});
|
|
48
|
+
function toForm(record) {
|
|
49
|
+
const source = record ?? {};
|
|
50
|
+
const out = {};
|
|
51
|
+
for (const pair of pairs) {
|
|
52
|
+
const keys = objectKeysOf(pair);
|
|
53
|
+
const value = source[pair.value];
|
|
54
|
+
if (!present(value)) {
|
|
55
|
+
// 显式写 undefined:表单里若有上一次回填的残留,靠这次赋值清掉
|
|
56
|
+
out[pair.field] = undefined;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const nested = { [keys.value]: value };
|
|
60
|
+
const label = pair.label ? source[pair.label] : undefined;
|
|
61
|
+
// 名称缺失就不写这个键,交给组件的 resolve / seedOptions 去补
|
|
62
|
+
if (present(label))
|
|
63
|
+
nested[keys.label] = label;
|
|
64
|
+
out[pair.field] = nested;
|
|
65
|
+
}
|
|
66
|
+
return out;
|
|
67
|
+
}
|
|
68
|
+
function toPayload(values) {
|
|
69
|
+
const form = values ?? {};
|
|
70
|
+
const out = {};
|
|
71
|
+
for (const pair of pairs) {
|
|
72
|
+
// 表单里没有这个键:说明这个表单不产出它,别用 undefined 覆盖调用方 {...data} 里的旧值
|
|
73
|
+
if (!has(form, pair.field))
|
|
74
|
+
continue;
|
|
75
|
+
const keys = objectKeysOf(pair);
|
|
76
|
+
const nested = form[pair.field];
|
|
77
|
+
const readable = nested && typeof nested === 'object' ? nested : undefined;
|
|
78
|
+
// 不是对象时按标量用:兼容迁移途中的页面(同一字段有时是对象、有时是字符串),
|
|
79
|
+
// 这正是 `payer?.value || payer || ''` 这类防御代码的来源
|
|
80
|
+
const value = readable ? readable[keys.value] : nested;
|
|
81
|
+
const label = readable && pair.label ? readable[keys.label] : undefined;
|
|
82
|
+
out[pair.value] = present(value) ? value : undefined;
|
|
83
|
+
// 键存在但值被清空时也显式给 undefined:两个平铺键要一起清,否则旧值从 {...data} 里漏出来
|
|
84
|
+
if (pair.label)
|
|
85
|
+
out[pair.label] = present(label) ? label : undefined;
|
|
86
|
+
}
|
|
87
|
+
return out;
|
|
88
|
+
}
|
|
89
|
+
return { pairs, toForm, toPayload };
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=flat.js.map
|
package/dist/flat.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flat.js","sourceRoot":"","sources":["../src/flat.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -11,6 +11,8 @@ export { SchemaFormField } from './form/SchemaFormField.js';
|
|
|
11
11
|
export type { SchemaFormFieldProps } from './form/SchemaFormField.js';
|
|
12
12
|
export { FormRuntimeHost, FormRuntimeHostProvider, useFormRuntimeHost } from './form/FormRuntimeHost.js';
|
|
13
13
|
export { namePathKey, normalizeNamePath, getNestedValue } from './form/namePath.js';
|
|
14
|
+
export { defineFlatFields, ANTD_OBJECT_KEYS } from './flat.js';
|
|
15
|
+
export type { FlatFieldPair, FlatFields, FlatFieldsOptions, FlatObjectKeys } from './flat.js';
|
|
14
16
|
export * from './biz-select/index.js';
|
|
15
17
|
export * from './editable-table/index.js';
|
|
16
18
|
export * from './full-editable-table/index.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACxF,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACtG,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjF,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACxF,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACtG,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAC5D,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAE3F,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,8 @@ export { SchemaForm } from './SchemaForm.js';
|
|
|
7
7
|
export { SchemaFormField } from './form/SchemaFormField.js';
|
|
8
8
|
export { FormRuntimeHost, FormRuntimeHostProvider, useFormRuntimeHost } from './form/FormRuntimeHost.js';
|
|
9
9
|
export { namePathKey, normalizeNamePath, getNestedValue } from './form/namePath.js';
|
|
10
|
+
// 边界转换:对象值 ↔ 平铺值,与控件无关(日期范围、树选择、级联同样能用)
|
|
11
|
+
export { defineFlatFields, ANTD_OBJECT_KEYS } from './flat.js';
|
|
10
12
|
// BizSelect 不带副作用:字段类型需使用方调 registerBizSelectField() 注册
|
|
11
13
|
export * from './biz-select/index.js';
|
|
12
14
|
export * from './editable-table/index.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAExF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACtG,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjF,wDAAwD;AACxD,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAExF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACtG,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjF,wCAAwC;AACxC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAE5D,wDAAwD;AACxD,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|