@tianyr/schema-antd 0.1.0 → 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 +57 -12
- package/dist/SchemaField.d.ts +1 -1
- 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 +3 -0
- package/dist/biz-select/BizSelect.d.ts.map +1 -0
- package/dist/biz-select/BizSelect.js +87 -0
- package/dist/biz-select/BizSelect.js.map +1 -0
- package/dist/biz-select/BizSelectDisplay.d.ts +3 -0
- package/dist/biz-select/BizSelectDisplay.d.ts.map +1 -0
- package/dist/biz-select/BizSelectDisplay.js +58 -0
- package/dist/biz-select/BizSelectDisplay.js.map +1 -0
- package/dist/biz-select/cache.d.ts +23 -0
- package/dist/biz-select/cache.d.ts.map +1 -0
- package/dist/biz-select/cache.js +141 -0
- package/dist/biz-select/cache.js.map +1 -0
- package/dist/biz-select/compile.d.ts +36 -0
- package/dist/biz-select/compile.d.ts.map +1 -0
- package/dist/biz-select/compile.js +103 -0
- package/dist/biz-select/compile.js.map +1 -0
- package/dist/biz-select/factories.d.ts +32 -0
- package/dist/biz-select/factories.d.ts.map +1 -0
- package/dist/biz-select/factories.js +67 -0
- package/dist/biz-select/factories.js.map +1 -0
- package/dist/biz-select/format.d.ts +66 -0
- package/dist/biz-select/format.d.ts.map +1 -0
- package/dist/biz-select/format.js +175 -0
- package/dist/biz-select/format.js.map +1 -0
- package/dist/biz-select/index.d.ts +28 -0
- package/dist/biz-select/index.d.ts.map +1 -0
- package/dist/biz-select/index.js +26 -0
- package/dist/biz-select/index.js.map +1 -0
- package/dist/biz-select/key.d.ts +25 -0
- package/dist/biz-select/key.d.ts.map +1 -0
- package/dist/biz-select/key.js +83 -0
- package/dist/biz-select/key.js.map +1 -0
- package/dist/biz-select/normalize.d.ts +43 -0
- package/dist/biz-select/normalize.d.ts.map +1 -0
- package/dist/biz-select/normalize.js +49 -0
- package/dist/biz-select/normalize.js.map +1 -0
- package/dist/biz-select/registry.d.ts +15 -0
- package/dist/biz-select/registry.d.ts.map +1 -0
- package/dist/biz-select/registry.js +81 -0
- package/dist/biz-select/registry.js.map +1 -0
- 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 +5 -0
- package/dist/biz-select/schema.d.ts.map +1 -0
- package/dist/biz-select/schema.js +28 -0
- package/dist/biz-select/schema.js.map +1 -0
- package/dist/biz-select/source-id.d.ts +8 -0
- package/dist/biz-select/source-id.d.ts.map +1 -0
- package/dist/biz-select/source-id.js +10 -0
- package/dist/biz-select/source-id.js.map +1 -0
- package/dist/biz-select/types.d.ts +160 -0
- package/dist/biz-select/types.d.ts.map +1 -0
- package/dist/{app-select → biz-select}/types.js.map +1 -1
- package/dist/biz-select/useCandidates.d.ts +40 -0
- package/dist/biz-select/useCandidates.d.ts.map +1 -0
- package/dist/biz-select/useCandidates.js +292 -0
- package/dist/biz-select/useCandidates.js.map +1 -0
- 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 +18 -0
- package/dist/biz-select/useSelectedLabel.d.ts.map +1 -0
- package/dist/biz-select/useSelectedLabel.js +156 -0
- package/dist/biz-select/useSelectedLabel.js.map +1 -0
- 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/biz-select/useStableSourceKey.d.ts +3 -0
- package/dist/biz-select/useStableSourceKey.d.ts.map +1 -0
- package/dist/biz-select/useStableSourceKey.js +48 -0
- package/dist/biz-select/useStableSourceKey.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/form/SchemaFormField.d.ts.map +1 -1
- package/dist/form/SchemaFormField.js +4 -3
- package/dist/form/SchemaFormField.js.map +1 -1
- package/dist/form/derive.d.ts +3 -8
- package/dist/form/derive.d.ts.map +1 -1
- package/dist/form/derive.js +28 -0
- package/dist/form/derive.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/registry.d.ts +6 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js.map +1 -1
- package/dist/types.d.ts +7 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/app-select/AppSelect.d.ts +0 -3
- package/dist/app-select/AppSelect.d.ts.map +0 -1
- package/dist/app-select/AppSelect.js +0 -56
- package/dist/app-select/AppSelect.js.map +0 -1
- package/dist/app-select/AppSelectDisplay.d.ts +0 -3
- package/dist/app-select/AppSelectDisplay.d.ts.map +0 -1
- package/dist/app-select/AppSelectDisplay.js +0 -39
- package/dist/app-select/AppSelectDisplay.js.map +0 -1
- package/dist/app-select/cache.d.ts +0 -26
- package/dist/app-select/cache.d.ts.map +0 -1
- package/dist/app-select/cache.js +0 -82
- package/dist/app-select/cache.js.map +0 -1
- package/dist/app-select/hooks.d.ts +0 -56
- package/dist/app-select/hooks.d.ts.map +0 -1
- package/dist/app-select/hooks.js +0 -322
- package/dist/app-select/hooks.js.map +0 -1
- package/dist/app-select/index.d.ts +0 -7
- package/dist/app-select/index.d.ts.map +0 -1
- package/dist/app-select/index.js +0 -6
- package/dist/app-select/index.js.map +0 -1
- package/dist/app-select/register.d.ts +0 -2
- package/dist/app-select/register.d.ts.map +0 -1
- package/dist/app-select/register.js +0 -10
- package/dist/app-select/register.js.map +0 -1
- package/dist/app-select/sources.d.ts +0 -20
- package/dist/app-select/sources.d.ts.map +0 -1
- package/dist/app-select/sources.js +0 -59
- package/dist/app-select/sources.js.map +0 -1
- package/dist/app-select/types.d.ts +0 -68
- package/dist/app-select/types.d.ts.map +0 -1
- package/dist/app-select/utils.d.ts +0 -30
- package/dist/app-select/utils.d.ts.map +0 -1
- package/dist/app-select/utils.js +0 -76
- package/dist/app-select/utils.js.map +0 -1
- /package/dist/{app-select → biz-select}/types.js +0 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/** 与 read.tsx 的 EMPTY_TEXT 保持一致;接 BMS 时由覆盖层决定最终观感 */
|
|
2
|
+
export const EMPTY = '—';
|
|
3
|
+
/** `V-L` 的连接符:场景不多,不做配置 */
|
|
4
|
+
export const LABEL_SEPARATOR = '-';
|
|
5
|
+
const DEFAULT_VALUE_FIELDS = { value: 'value', label: 'label' };
|
|
6
|
+
export function present(value) {
|
|
7
|
+
return value !== undefined && value !== null && value !== '';
|
|
8
|
+
}
|
|
9
|
+
export function isEmptyValue(value) {
|
|
10
|
+
return value === undefined || value === null || value === '';
|
|
11
|
+
}
|
|
12
|
+
/** 展示模式 → 默认的搜索字段 */
|
|
13
|
+
export function defaultSearchFields(mode) {
|
|
14
|
+
if (mode === 'V')
|
|
15
|
+
return 'value';
|
|
16
|
+
if (mode === 'V-L')
|
|
17
|
+
return 'both';
|
|
18
|
+
return 'label';
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 拼接展示文本。
|
|
22
|
+
* 降级规则:`L` 缺名称用值,`V` 缺值用名称,`V-L` 缺一侧就只显示另一侧。
|
|
23
|
+
*/
|
|
24
|
+
export function formatLabel(option, mode, separator = LABEL_SEPARATOR) {
|
|
25
|
+
const { value, label } = option;
|
|
26
|
+
if (mode === 'V-L') {
|
|
27
|
+
// 缺一侧时不留下悬挂的分隔符
|
|
28
|
+
return [value, label].filter(present).join(separator) || EMPTY;
|
|
29
|
+
}
|
|
30
|
+
const preferred = mode === 'V' ? value : label;
|
|
31
|
+
const fallback = mode === 'V' ? label : value;
|
|
32
|
+
const text = present(preferred) ? preferred : present(fallback) ? fallback : EMPTY;
|
|
33
|
+
return String(text);
|
|
34
|
+
}
|
|
35
|
+
/** 关键字是否命中:空关键字一律命中,前端过滤只管 `options` / `load` 两类源 */
|
|
36
|
+
export function matchKeyword(option, keyword, fields) {
|
|
37
|
+
const word = keyword.trim().toLowerCase();
|
|
38
|
+
if (!word)
|
|
39
|
+
return true;
|
|
40
|
+
const value = present(option.value) ? String(option.value).toLowerCase() : '';
|
|
41
|
+
const label = present(option.label) ? String(option.label).toLowerCase() : '';
|
|
42
|
+
// 名称缺失时回退值:展示层是这么降级的,搜索必须同口径,否则「看得见却搜不到」
|
|
43
|
+
if (!label)
|
|
44
|
+
return value.includes(word);
|
|
45
|
+
if (fields === 'value')
|
|
46
|
+
return value.includes(word);
|
|
47
|
+
if (fields === 'label')
|
|
48
|
+
return label.includes(word);
|
|
49
|
+
return value.includes(word) || label.includes(word);
|
|
50
|
+
}
|
|
51
|
+
/** 本地过滤:候选全集已在前端时用;关键词为空直接返回原数组,避免多余遍历 */
|
|
52
|
+
export function filterOptions(list, keyword, fields) {
|
|
53
|
+
if (!keyword.trim())
|
|
54
|
+
return list;
|
|
55
|
+
return list.filter((item) => matchKeyword(item, keyword, fields));
|
|
56
|
+
}
|
|
57
|
+
/** 按内容判断候选是否真的变了:内联数组每次新建也能对上 */
|
|
58
|
+
export function optionsContentKey(list) {
|
|
59
|
+
if (!list || !list.length)
|
|
60
|
+
return '';
|
|
61
|
+
return JSON.stringify(list.map((item) => [typeof item.value, item.value, item.label ?? null, item.disabled ?? false]));
|
|
62
|
+
}
|
|
63
|
+
/** 契约选项 → antd 需要的 `{ value, label }`;形状一致,这里只负责拼展示文本 */
|
|
64
|
+
export function toAntOption(option, mode) {
|
|
65
|
+
return {
|
|
66
|
+
value: option.value,
|
|
67
|
+
label: formatLabel(option, mode),
|
|
68
|
+
disabled: option.disabled,
|
|
69
|
+
raw: option,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
export function resolveValueFields(fields) {
|
|
73
|
+
return {
|
|
74
|
+
value: fields?.value || DEFAULT_VALUE_FIELDS.value,
|
|
75
|
+
label: fields?.label || DEFAULT_VALUE_FIELDS.label,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/** 从值里取出编码,标量与对象两种形态统一到一处 */
|
|
79
|
+
export function readValue(value, valueMode, fields) {
|
|
80
|
+
if (isEmptyValue(value))
|
|
81
|
+
return undefined;
|
|
82
|
+
if (valueMode === 'primitive')
|
|
83
|
+
return value;
|
|
84
|
+
if (!value || typeof value !== 'object')
|
|
85
|
+
return undefined;
|
|
86
|
+
const keys = resolveValueFields(fields);
|
|
87
|
+
const raw = value[keys.value];
|
|
88
|
+
return isEmptyValue(raw) ? undefined : raw;
|
|
89
|
+
}
|
|
90
|
+
/** 从对象值里取出已带的名称,命中就不必再 resolve */
|
|
91
|
+
export function readObjectLabel(value, valueMode, fields) {
|
|
92
|
+
if (valueMode !== 'object' || !value || typeof value !== 'object')
|
|
93
|
+
return undefined;
|
|
94
|
+
const keys = resolveValueFields(fields);
|
|
95
|
+
const raw = value[keys.label];
|
|
96
|
+
return present(raw) ? String(raw) : undefined;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* 标量值 + 选项 → 对象值;名称缺失时留空串,由展示层降级到值本身。
|
|
100
|
+
*
|
|
101
|
+
* 只输出 valueFields 指定的两个键。改选是换成另一条记录,旧对象上的 id /
|
|
102
|
+
* 部门等字段属于上一条,跟着搬过去就是串数据;拿不到新名称时也不能沿用旧名称,
|
|
103
|
+
* 那会把「张三」显示成「李四」的编码。需要附加字段的业务从 onChange 的
|
|
104
|
+
* 第二个参数 `option.raw` 里取。
|
|
105
|
+
*/
|
|
106
|
+
export function buildObjectValue(value, option, fields) {
|
|
107
|
+
const keys = resolveValueFields(fields);
|
|
108
|
+
return { [keys.value]: value, [keys.label]: option?.label ?? '' };
|
|
109
|
+
}
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
// 多选
|
|
112
|
+
//
|
|
113
|
+
// 空值一律归成空数组,对外只输出 `undefined`:
|
|
114
|
+
// 与 `ctx.clear()` 一致,也让 antd 的 `required` 规则天然生效(它拿 `[]` 没辙)。
|
|
115
|
+
// 不认逗号串、不把单值当数组——猜形状比报错难查。
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
/**
|
|
118
|
+
* 值 → 编码数组。
|
|
119
|
+
*
|
|
120
|
+
* 输入接受 `undefined` / `null` / `[]` 和各种混杂形态,输出永远是数组;
|
|
121
|
+
* 空值一律给 `[]`(调用方判断"有没有值"用长度,不用再区分 undefined)。
|
|
122
|
+
*/
|
|
123
|
+
export function readValues(value, valueMode, fields) {
|
|
124
|
+
if (value === undefined || value === null)
|
|
125
|
+
return [];
|
|
126
|
+
const list = Array.isArray(value) ? value : [value];
|
|
127
|
+
const codes = [];
|
|
128
|
+
for (const item of list) {
|
|
129
|
+
if (valueMode === 'primitive') {
|
|
130
|
+
if (isEmptyValue(item))
|
|
131
|
+
continue;
|
|
132
|
+
codes.push(item);
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (!item || typeof item !== 'object')
|
|
136
|
+
continue;
|
|
137
|
+
const raw = item[resolveValueFields(fields).value];
|
|
138
|
+
if (isEmptyValue(raw))
|
|
139
|
+
continue;
|
|
140
|
+
codes.push(raw);
|
|
141
|
+
}
|
|
142
|
+
return codes;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* 对象数组 → 编码 → 名称的映射。
|
|
146
|
+
* 只服务于回显里的第一优先级「值自己带着名称」,没有名称的键不写。
|
|
147
|
+
*/
|
|
148
|
+
export function readObjectLabels(value, valueMode, fields) {
|
|
149
|
+
const names = new Map();
|
|
150
|
+
if (valueMode !== 'object' || value === undefined || value === null)
|
|
151
|
+
return names;
|
|
152
|
+
const keys = resolveValueFields(fields);
|
|
153
|
+
const list = Array.isArray(value) ? value : [value];
|
|
154
|
+
for (const item of list) {
|
|
155
|
+
if (!item || typeof item !== 'object')
|
|
156
|
+
continue;
|
|
157
|
+
const record = item;
|
|
158
|
+
const raw = record[keys.value];
|
|
159
|
+
if (isEmptyValue(raw))
|
|
160
|
+
continue;
|
|
161
|
+
const name = record[keys.label];
|
|
162
|
+
if (present(name))
|
|
163
|
+
names.set(String(raw), String(name));
|
|
164
|
+
}
|
|
165
|
+
return names;
|
|
166
|
+
}
|
|
167
|
+
/** 编码数组 + 已解析选项 → 对象数组;缺名称的留空串,由展示层降级到编码本身 */
|
|
168
|
+
export function buildObjectValues(codes, options, fields) {
|
|
169
|
+
const keys = resolveValueFields(fields);
|
|
170
|
+
return codes.map((code) => ({
|
|
171
|
+
[keys.value]: code,
|
|
172
|
+
[keys.label]: options.get(String(code))?.label ?? '',
|
|
173
|
+
}));
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/biz-select/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BizSelect 对外出口。
|
|
3
|
+
*
|
|
4
|
+
* 刻意不在这里 import './schema.js':字段类型由使用方显式注册,
|
|
5
|
+
* 包默认只提供标准 antd 控件,避免导入即产生副作用。
|
|
6
|
+
*
|
|
7
|
+
* 公开面刻意收窄:只导出发出去就形成兼容责任的东西。
|
|
8
|
+
* 键推导、能力归一化、AntD 选项转换、格式化这些都留在内部模块,
|
|
9
|
+
* 需要时直接从对应文件引用,不要经由本文件对外承诺。
|
|
10
|
+
*/
|
|
11
|
+
export { BizSelect } from './BizSelect.js';
|
|
12
|
+
export { BizSelectDisplay } from './BizSelectDisplay.js';
|
|
13
|
+
export { BizMultiSelect } from './BizMultiSelect.js';
|
|
14
|
+
export { BizMultiSelectDisplay } from './BizMultiSelectDisplay.js';
|
|
15
|
+
export { registerBizSelectField } from './schema.js';
|
|
16
|
+
export type { BizSelectSchemaProps, ParamsFromEntry } from './schema.js';
|
|
17
|
+
/** 候选取数:给下拉以外的 UI(树 / 弹窗列表)复用同一份数据 */
|
|
18
|
+
export { useCandidates } from './useCandidates.js';
|
|
19
|
+
export type { UseCandidatesOptions, UseCandidatesResult } from './useCandidates.js';
|
|
20
|
+
/** 批量按值解析:表格列这类「只有 id、没有名称」的一屏回显 */
|
|
21
|
+
export { useResolvedLabels } from './useResolvedLabels.js';
|
|
22
|
+
export type { UseResolvedLabelsOptions, UseResolvedLabelsResult } from './useResolvedLabels.js';
|
|
23
|
+
/** 源工厂:三种能力组合,别处不再分类 */
|
|
24
|
+
export { staticList, loaded, remote } from './factories.js';
|
|
25
|
+
export { registerSelectSource, defineSelectSources, unregisterSelectSource, invalidateSelectSource, getSelectSource, getRegisteredSelectSourceNames, clearSelectSources, } from './registry.js';
|
|
26
|
+
export { clearSelectCache } from './cache.js';
|
|
27
|
+
export type { BizMultiSelectDisplayProps, BizMultiSelectProps, BizObjectValue, BizOption, BizSelectDisplayProps, BizSelectProps, DisplayMode, RecordFieldNames, SearchFields, SelectParams, SelectSource, SelectValue, SelectValues, ValueFieldMap, ValueMode, } from './types.js';
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/biz-select/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAClD,YAAY,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEtE,sCAAsC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEjF,oCAAoC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE7F,wBAAwB;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EACf,8BAA8B,EAC9B,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAIpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C,YAAY,EACV,0BAA0B,EAC1B,mBAAmB,EACnB,cAAc,EACd,SAAS,EACT,qBAAqB,EACrB,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,aAAa,EACb,SAAS,GACV,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BizSelect 对外出口。
|
|
3
|
+
*
|
|
4
|
+
* 刻意不在这里 import './schema.js':字段类型由使用方显式注册,
|
|
5
|
+
* 包默认只提供标准 antd 控件,避免导入即产生副作用。
|
|
6
|
+
*
|
|
7
|
+
* 公开面刻意收窄:只导出发出去就形成兼容责任的东西。
|
|
8
|
+
* 键推导、能力归一化、AntD 选项转换、格式化这些都留在内部模块,
|
|
9
|
+
* 需要时直接从对应文件引用,不要经由本文件对外承诺。
|
|
10
|
+
*/
|
|
11
|
+
export { BizSelect } from './BizSelect.js';
|
|
12
|
+
export { BizSelectDisplay } from './BizSelectDisplay.js';
|
|
13
|
+
export { BizMultiSelect } from './BizMultiSelect.js';
|
|
14
|
+
export { BizMultiSelectDisplay } from './BizMultiSelectDisplay.js';
|
|
15
|
+
export { registerBizSelectField } from './schema.js';
|
|
16
|
+
/** 候选取数:给下拉以外的 UI(树 / 弹窗列表)复用同一份数据 */
|
|
17
|
+
export { useCandidates } from './useCandidates.js';
|
|
18
|
+
/** 批量按值解析:表格列这类「只有 id、没有名称」的一屏回显 */
|
|
19
|
+
export { useResolvedLabels } from './useResolvedLabels.js';
|
|
20
|
+
/** 源工厂:三种能力组合,别处不再分类 */
|
|
21
|
+
export { staticList, loaded, remote } from './factories.js';
|
|
22
|
+
export { registerSelectSource, defineSelectSources, unregisterSelectSource, invalidateSelectSource, getSelectSource, getRegisteredSelectSourceNames, clearSelectSources, } from './registry.js';
|
|
23
|
+
// 源解析与来源键不对外:useCandidates 内部已经做好,放出去只会让调用方自己拼身份、
|
|
24
|
+
// 绕开注册名的版本订阅。确实需要读源的话用 getSelectSource。
|
|
25
|
+
export { clearSelectCache } from './cache.js';
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/biz-select/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAGlD,sCAAsC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,oCAAoC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,wBAAwB;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EACf,8BAA8B,EAC9B,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAEpB,kDAAkD;AAClD,wCAAwC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SelectParams, SelectSource, SelectValue } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* 源的稳定身份,参与缓存键。
|
|
4
|
+
*
|
|
5
|
+
* 注册名带版本号:重新注册或主动失效后,已挂载的实例会换 key 重新取数,
|
|
6
|
+
* 而不是继续用挂载时捕获的旧函数。
|
|
7
|
+
*/
|
|
8
|
+
export declare function selectSourceKey(source?: string | SelectSource, cacheKey?: string): string;
|
|
9
|
+
/** 键序稳定的序列化:对象字面量顺序不同不算参数变化 */
|
|
10
|
+
export declare function stableStringify(value: unknown): string;
|
|
11
|
+
export declare function paramsKeyOf(params?: SelectParams): string;
|
|
12
|
+
/**
|
|
13
|
+
* 编码的字符串身份:带类型前缀,缓存键用它区分 1 和 '1'。
|
|
14
|
+
* 给调用方查表时用 `lookupKeyOf`——那里反过来要求两种类型能对上。
|
|
15
|
+
*/
|
|
16
|
+
export declare function codeKeyOf(value: SelectValue | null | undefined): string;
|
|
17
|
+
/**
|
|
18
|
+
* 对外查表用的键:**不带类型**。
|
|
19
|
+
* 后端常把 1 序列化成 '1',调用方拿着列表行里的原始值来查,必须能命中。
|
|
20
|
+
*/
|
|
21
|
+
export declare function lookupKeyOf(value: SelectValue | null | undefined): string;
|
|
22
|
+
/** 来源键固定占第二段,清理单个源的缓存时按它匹配 */
|
|
23
|
+
export declare function candidatesCacheKey(scope: string, sourceKey: string, paramsKey: string): string;
|
|
24
|
+
export declare function resolveCacheKey(scope: string, sourceKey: string, code: SelectValue, paramsKey: string): string;
|
|
25
|
+
//# sourceMappingURL=key.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key.d.ts","sourceRoot":"","sources":["../../src/biz-select/key.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAevE;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,EAC9B,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAiBR;AAED,+BAA+B;AAC/B,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAStD;AAED,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,CAEzD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAEvE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAEzE;AAED,8BAA8B;AAC9B,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE9F;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,WAAW,EACjB,SAAS,EAAE,MAAM,GAChB,MAAM,CAER"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 稳定键推导。
|
|
3
|
+
*
|
|
4
|
+
* 缓存和 effect 都只认一个字符串,所以「源是谁」必须能算成一个 key。
|
|
5
|
+
* 四档由强到弱:注册名 → 显式 cacheKey → 纯数据内容 → 函数引用。
|
|
6
|
+
* 只有最后一档会在内联箭头函数下抖动,此时退化为实例级缓存(见设计文档 §7)。
|
|
7
|
+
*/
|
|
8
|
+
import { getSelectSourceVersion } from './registry.js';
|
|
9
|
+
import { nameSourceKey } from './source-id.js';
|
|
10
|
+
import { optionsContentKey } from './format.js';
|
|
11
|
+
const fnIds = new WeakMap();
|
|
12
|
+
let fnIdSeq = 0;
|
|
13
|
+
/** 函数引用 → 稳定编号;模块级导出的函数因此可以跨实例共享缓存 */
|
|
14
|
+
function fnId(fn) {
|
|
15
|
+
const hit = fnIds.get(fn);
|
|
16
|
+
if (hit !== undefined)
|
|
17
|
+
return hit;
|
|
18
|
+
fnIdSeq += 1;
|
|
19
|
+
fnIds.set(fn, fnIdSeq);
|
|
20
|
+
return fnIdSeq;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 源的稳定身份,参与缓存键。
|
|
24
|
+
*
|
|
25
|
+
* 注册名带版本号:重新注册或主动失效后,已挂载的实例会换 key 重新取数,
|
|
26
|
+
* 而不是继续用挂载时捕获的旧函数。
|
|
27
|
+
*/
|
|
28
|
+
export function selectSourceKey(source, cacheKey) {
|
|
29
|
+
// 注册名本身就是跨实例稳定的身份,版本号也在里面:再传 cacheKey 只会把它盖掉,
|
|
30
|
+
// 连带绕过 invalidate / 重注册的失效机制。cacheKey 只服务内联源。
|
|
31
|
+
if (typeof source === 'string') {
|
|
32
|
+
return nameSourceKey(source, getSelectSourceVersion(source));
|
|
33
|
+
}
|
|
34
|
+
if (cacheKey)
|
|
35
|
+
return `c:${cacheKey}`;
|
|
36
|
+
if (!source)
|
|
37
|
+
return '';
|
|
38
|
+
const parts = [source.load, source.search, source.resolve, source.namespace].map((fn) => fn ? fnId(fn) : '-');
|
|
39
|
+
if (parts.every((part) => part === '-')) {
|
|
40
|
+
// 纯数据源没有闭包,按内容识别才安全,且写在 JSX 里也能命中同一份缓存
|
|
41
|
+
return `d:${optionsContentKey(source.options)}`;
|
|
42
|
+
}
|
|
43
|
+
return `f:${parts.join('.')}`;
|
|
44
|
+
}
|
|
45
|
+
/** 键序稳定的序列化:对象字面量顺序不同不算参数变化 */
|
|
46
|
+
export function stableStringify(value) {
|
|
47
|
+
if (value === undefined)
|
|
48
|
+
return 'undefined';
|
|
49
|
+
if (value === null || typeof value !== 'object')
|
|
50
|
+
return JSON.stringify(value);
|
|
51
|
+
if (Array.isArray(value))
|
|
52
|
+
return `[${value.map(stableStringify).join(',')}]`;
|
|
53
|
+
const record = value;
|
|
54
|
+
const keys = Object.keys(record).sort();
|
|
55
|
+
return `{${keys
|
|
56
|
+
.map((key) => `${JSON.stringify(key)}:${stableStringify(record[key])}`)
|
|
57
|
+
.join(',')}}`;
|
|
58
|
+
}
|
|
59
|
+
export function paramsKeyOf(params) {
|
|
60
|
+
return stableStringify(params ?? null);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 编码的字符串身份:带类型前缀,缓存键用它区分 1 和 '1'。
|
|
64
|
+
* 给调用方查表时用 `lookupKeyOf`——那里反过来要求两种类型能对上。
|
|
65
|
+
*/
|
|
66
|
+
export function codeKeyOf(value) {
|
|
67
|
+
return value === undefined || value === null ? '' : `${typeof value}:${value}`;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 对外查表用的键:**不带类型**。
|
|
71
|
+
* 后端常把 1 序列化成 '1',调用方拿着列表行里的原始值来查,必须能命中。
|
|
72
|
+
*/
|
|
73
|
+
export function lookupKeyOf(value) {
|
|
74
|
+
return value === undefined || value === null ? '' : String(value);
|
|
75
|
+
}
|
|
76
|
+
/** 来源键固定占第二段,清理单个源的缓存时按它匹配 */
|
|
77
|
+
export function candidatesCacheKey(scope, sourceKey, paramsKey) {
|
|
78
|
+
return `${scope}|${sourceKey}|${paramsKey}`;
|
|
79
|
+
}
|
|
80
|
+
export function resolveCacheKey(scope, sourceKey, code, paramsKey) {
|
|
81
|
+
return `${scope}|${sourceKey}|r|${typeof code}:${code}|${paramsKey}`;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key.js","sourceRoot":"","sources":["../../src/biz-select/key.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 能力推导:从源「提供了什么」推「该怎么做」,不看类型标签。
|
|
3
|
+
*
|
|
4
|
+
* 这张推导表同时解释了三种来源(静态 / 有限枚举 / 无限表)——
|
|
5
|
+
* 它们不是三种类型,是三种能力组合。
|
|
6
|
+
*/
|
|
7
|
+
import type { SelectParams, SelectSource } from './types.js';
|
|
8
|
+
export type CandidateMode =
|
|
9
|
+
/** 同步全集,无需请求 */
|
|
10
|
+
'sync'
|
|
11
|
+
/** 异步全集,一次拉完前端过滤 */
|
|
12
|
+
| 'load'
|
|
13
|
+
/** 只有关键词搜索,过滤在后端 */
|
|
14
|
+
| 'search'
|
|
15
|
+
/** 空关键词走全集,有关键词走后端 */
|
|
16
|
+
| 'hybrid'
|
|
17
|
+
/** 没有候选能力,只能按编码解析(只读展示可用) */
|
|
18
|
+
| 'none'
|
|
19
|
+
/** 什么能力都没有,配置非法 */
|
|
20
|
+
| 'invalid';
|
|
21
|
+
export interface SourceCapability {
|
|
22
|
+
source?: SelectSource;
|
|
23
|
+
candidateMode: CandidateMode;
|
|
24
|
+
/** 候选是否需要发请求 */
|
|
25
|
+
needsFetch: boolean;
|
|
26
|
+
/** 是否在前端做关键词过滤 */
|
|
27
|
+
canLocalFilter: boolean;
|
|
28
|
+
/** 搜索交给后端 */
|
|
29
|
+
canSearch: boolean;
|
|
30
|
+
/** 能按值精确回显:单条或批量任一即可 */
|
|
31
|
+
canResolve: boolean;
|
|
32
|
+
/** 声明了批量接口,表格列可以一次查多条 */
|
|
33
|
+
canResolveMany: boolean;
|
|
34
|
+
requiredParams: string[];
|
|
35
|
+
namespace?: () => string;
|
|
36
|
+
}
|
|
37
|
+
export declare function normalizeSource(source?: SelectSource): SourceCapability;
|
|
38
|
+
/**
|
|
39
|
+
* 必需的查询参数是否齐备。
|
|
40
|
+
* 缺任何一个都不该发请求——用空条件查,可能拿到别的租户/省份的记录。
|
|
41
|
+
*/
|
|
42
|
+
export declare function hasRequiredParams(required: string[] | undefined, params: SelectParams | undefined): boolean;
|
|
43
|
+
//# sourceMappingURL=normalize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/biz-select/normalize.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE1D,MAAM,MAAM,aAAa;AACvB,gBAAgB;AACd,MAAM;AACR,oBAAoB;GAClB,MAAM;AACR,oBAAoB;GAClB,QAAQ;AACV,sBAAsB;GACpB,QAAQ;AACV,6BAA6B;GAC3B,MAAM;AACR,mBAAmB;GACjB,SAAS,CAAC;AAEd,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,aAAa,EAAE,aAAa,CAAC;IAC7B,gBAAgB;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB;IAClB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,wBAAwB;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,yBAAyB;IACzB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,gBAAgB,CA2BvE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,EAC9B,MAAM,EAAE,YAAY,GAAG,SAAS,GAC/B,OAAO,CAQT"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export function normalizeSource(source) {
|
|
2
|
+
const hasOptions = Array.isArray(source?.options);
|
|
3
|
+
const canLoad = typeof source?.load === 'function';
|
|
4
|
+
const canSearch = typeof source?.search === 'function';
|
|
5
|
+
const canResolveMany = typeof source?.resolveMany === 'function';
|
|
6
|
+
// 只有批量接口也能单条用:批量一条就是单条,不必逼调用方再写一个 resolve
|
|
7
|
+
const canResolve = typeof source?.resolve === 'function' || canResolveMany;
|
|
8
|
+
let candidateMode;
|
|
9
|
+
if (hasOptions)
|
|
10
|
+
candidateMode = 'sync';
|
|
11
|
+
else if (canLoad && canSearch)
|
|
12
|
+
candidateMode = 'hybrid';
|
|
13
|
+
else if (canLoad)
|
|
14
|
+
candidateMode = 'load';
|
|
15
|
+
else if (canSearch)
|
|
16
|
+
candidateMode = 'search';
|
|
17
|
+
else if (canResolve)
|
|
18
|
+
candidateMode = 'none';
|
|
19
|
+
else
|
|
20
|
+
candidateMode = 'invalid';
|
|
21
|
+
return {
|
|
22
|
+
source,
|
|
23
|
+
candidateMode,
|
|
24
|
+
needsFetch: candidateMode === 'load' || candidateMode === 'search' || candidateMode === 'hybrid',
|
|
25
|
+
canLocalFilter: hasOptions || canLoad,
|
|
26
|
+
canSearch,
|
|
27
|
+
canResolve,
|
|
28
|
+
canResolveMany,
|
|
29
|
+
requiredParams: source?.requiredParams ?? [],
|
|
30
|
+
namespace: source?.namespace,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 必需的查询参数是否齐备。
|
|
35
|
+
* 缺任何一个都不该发请求——用空条件查,可能拿到别的租户/省份的记录。
|
|
36
|
+
*/
|
|
37
|
+
export function hasRequiredParams(required, params) {
|
|
38
|
+
if (!required || !required.length)
|
|
39
|
+
return true;
|
|
40
|
+
return required.every((key) => {
|
|
41
|
+
const value = params?.[key];
|
|
42
|
+
if (value === undefined || value === null || value === '')
|
|
43
|
+
return false;
|
|
44
|
+
if (Array.isArray(value) && value.length === 0)
|
|
45
|
+
return false;
|
|
46
|
+
return true;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/biz-select/normalize.ts"],"names":[],"mappings":"AAuCA,MAAM,UAAU,eAAe,CAAC,MAAqB;IACnD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,OAAO,MAAM,EAAE,IAAI,KAAK,UAAU,CAAC;IACnD,MAAM,SAAS,GAAG,OAAO,MAAM,EAAE,MAAM,KAAK,UAAU,CAAC;IACvD,MAAM,cAAc,GAAG,OAAO,MAAM,EAAE,WAAW,KAAK,UAAU,CAAC;IACjE,0CAA0C;IAC1C,MAAM,UAAU,GAAG,OAAO,MAAM,EAAE,OAAO,KAAK,UAAU,IAAI,cAAc,CAAC;IAE3E,IAAI,aAA4B,CAAC;IACjC,IAAI,UAAU;QAAE,aAAa,GAAG,MAAM,CAAC;SAClC,IAAI,OAAO,IAAI,SAAS;QAAE,aAAa,GAAG,QAAQ,CAAC;SACnD,IAAI,OAAO;QAAE,aAAa,GAAG,MAAM,CAAC;SACpC,IAAI,SAAS;QAAE,aAAa,GAAG,QAAQ,CAAC;SACxC,IAAI,UAAU;QAAE,aAAa,GAAG,MAAM,CAAC;;QACvC,aAAa,GAAG,SAAS,CAAC;IAE/B,OAAO;QACL,MAAM;QACN,aAAa;QACb,UAAU,EAAE,aAAa,KAAK,MAAM,IAAI,aAAa,KAAK,QAAQ,IAAI,aAAa,KAAK,QAAQ;QAChG,cAAc,EAAE,UAAU,IAAI,OAAO;QACrC,SAAS;QACT,UAAU;QACV,cAAc;QACd,cAAc,EAAE,MAAM,EAAE,cAAc,IAAI,EAAE;QAC5C,SAAS,EAAE,MAAM,EAAE,SAAS;KAC7B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAA8B,EAC9B,MAAgC;IAEhC,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QAC5B,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;YAAE,OAAO,KAAK,CAAC;QACxE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { SelectSource } from './types.js';
|
|
2
|
+
export declare function subscribeSelectSourceVersion(name: string, listener: () => void): () => void;
|
|
3
|
+
export declare function registerSelectSource(name: string, source: SelectSource): void;
|
|
4
|
+
/** 批量注册:应用启动时一次写完 */
|
|
5
|
+
export declare function defineSelectSources(map: Record<string, SelectSource>): void;
|
|
6
|
+
export declare function unregisterSelectSource(name: string): void;
|
|
7
|
+
/** 让已挂载的实例重新取数:版本 +1 换 key,同时清掉旧结果 */
|
|
8
|
+
export declare function invalidateSelectSource(name: string): void;
|
|
9
|
+
export declare function getSelectSource(name?: string): SelectSource | undefined;
|
|
10
|
+
export declare function getSelectSourceVersion(name: string): number;
|
|
11
|
+
/** 注册名或内联源统一解析;传对象时直接用,不看名字 */
|
|
12
|
+
export declare function resolveSelectSource(source?: string | SelectSource): SelectSource | undefined;
|
|
13
|
+
export declare function getRegisteredSelectSourceNames(): string[];
|
|
14
|
+
export declare function clearSelectSources(): void;
|
|
15
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/biz-select/registry.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAY5C,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAQ3F;AAYD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAM7E;AAED,qBAAqB;AACrB,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,IAAI,CAE3E;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAKzD;AAED,sCAAsC;AACtC,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAIzD;AAED,wBAAgB,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEvE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,+BAA+B;AAC/B,wBAAgB,mBAAmB,CACjC,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,GAC7B,YAAY,GAAG,SAAS,CAG1B;AAED,wBAAgB,8BAA8B,IAAI,MAAM,EAAE,CAEzD;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAMzC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 业务下拉数据源注册表。
|
|
3
|
+
*
|
|
4
|
+
* 注册表存在的两个理由:给缓存一个稳定标识,给 schema 一个可序列化的引用
|
|
5
|
+
* (schema 是数据,装不下函数)。
|
|
6
|
+
*/
|
|
7
|
+
import { clearSelectCache, clearSelectCacheOfSource } from './cache.js';
|
|
8
|
+
import { nameSourceKey } from './source-id.js';
|
|
9
|
+
const sources = new Map();
|
|
10
|
+
/** 每次注册/失效都递增,进入来源键:已挂载实例因此能感知到源被换掉 */
|
|
11
|
+
const versions = new Map();
|
|
12
|
+
/**
|
|
13
|
+
* 版本订阅。版本号只存在 Map 里,单单改值不会让任何组件重渲染,
|
|
14
|
+
* 所以「失效后已挂载实例重新取数」必须靠订阅把变化推给组件。
|
|
15
|
+
*/
|
|
16
|
+
const versionListeners = new Map();
|
|
17
|
+
export function subscribeSelectSourceVersion(name, listener) {
|
|
18
|
+
const listeners = versionListeners.get(name) ?? new Set();
|
|
19
|
+
listeners.add(listener);
|
|
20
|
+
versionListeners.set(name, listeners);
|
|
21
|
+
return () => {
|
|
22
|
+
listeners.delete(listener);
|
|
23
|
+
if (!listeners.size)
|
|
24
|
+
versionListeners.delete(name);
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function bumpVersion(name) {
|
|
28
|
+
versions.set(name, (versions.get(name) ?? 0) + 1);
|
|
29
|
+
versionListeners.get(name)?.forEach((listener) => listener());
|
|
30
|
+
}
|
|
31
|
+
/** 换实现时清掉上一版的缓存,否则旧结果会留到 TTL 结束 */
|
|
32
|
+
function clearPrevious(name, previousVersion) {
|
|
33
|
+
clearSelectCacheOfSource(nameSourceKey(name, previousVersion));
|
|
34
|
+
}
|
|
35
|
+
export function registerSelectSource(name, source) {
|
|
36
|
+
const previous = versions.get(name) ?? 0;
|
|
37
|
+
sources.set(name, source);
|
|
38
|
+
bumpVersion(name);
|
|
39
|
+
// 同名重注册(HMR / 动态切换)后旧缓存不再代表当前实现
|
|
40
|
+
clearPrevious(name, previous);
|
|
41
|
+
}
|
|
42
|
+
/** 批量注册:应用启动时一次写完 */
|
|
43
|
+
export function defineSelectSources(map) {
|
|
44
|
+
for (const [name, source] of Object.entries(map))
|
|
45
|
+
registerSelectSource(name, source);
|
|
46
|
+
}
|
|
47
|
+
export function unregisterSelectSource(name) {
|
|
48
|
+
const previous = versions.get(name) ?? 0;
|
|
49
|
+
sources.delete(name);
|
|
50
|
+
bumpVersion(name);
|
|
51
|
+
clearPrevious(name, previous);
|
|
52
|
+
}
|
|
53
|
+
/** 让已挂载的实例重新取数:版本 +1 换 key,同时清掉旧结果 */
|
|
54
|
+
export function invalidateSelectSource(name) {
|
|
55
|
+
const previous = versions.get(name) ?? 0;
|
|
56
|
+
bumpVersion(name);
|
|
57
|
+
clearPrevious(name, previous);
|
|
58
|
+
}
|
|
59
|
+
export function getSelectSource(name) {
|
|
60
|
+
return name ? sources.get(name) : undefined;
|
|
61
|
+
}
|
|
62
|
+
export function getSelectSourceVersion(name) {
|
|
63
|
+
return versions.get(name) ?? 0;
|
|
64
|
+
}
|
|
65
|
+
/** 注册名或内联源统一解析;传对象时直接用,不看名字 */
|
|
66
|
+
export function resolveSelectSource(source) {
|
|
67
|
+
if (!source)
|
|
68
|
+
return undefined;
|
|
69
|
+
return typeof source === 'string' ? sources.get(source) : source;
|
|
70
|
+
}
|
|
71
|
+
export function getRegisteredSelectSourceNames() {
|
|
72
|
+
return [...sources.keys()];
|
|
73
|
+
}
|
|
74
|
+
export function clearSelectSources() {
|
|
75
|
+
sources.clear();
|
|
76
|
+
versions.clear();
|
|
77
|
+
// 版本 Map 一起清掉了,不主动通知的话订阅方永远等不到变化
|
|
78
|
+
versionListeners.forEach((listeners) => listeners.forEach((listener) => listener()));
|
|
79
|
+
clearSelectCache();
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/biz-select/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { BizOption, SelectParams, SelectSource, SelectValue } from './types.js';
|
|
2
|
+
/** 每批最多多少个编码。接口有更小的上限时由调用方传 batchSize */
|
|
3
|
+
export declare const DEFAULT_BATCH_SIZE = 100;
|
|
4
|
+
export interface ResolveCodesOptions {
|
|
5
|
+
/** 已经解析过的源对象(注册名要先经 resolveSelectSource 换掉) */
|
|
6
|
+
source?: SelectSource;
|
|
7
|
+
/** 来源键,和组件共用同一个身份,缓存才对得上 */
|
|
8
|
+
sourceKey: string;
|
|
9
|
+
/** 租户/权限作用域,缺省取源自己的 namespace */
|
|
10
|
+
scope?: string;
|
|
11
|
+
params?: SelectParams;
|
|
12
|
+
/** 一屏里出现的所有编码,重复的会被去掉 */
|
|
13
|
+
codes: ReadonlyArray<SelectValue | null | undefined>;
|
|
14
|
+
batchSize?: number;
|
|
15
|
+
/** 绕开缓存重查:`reload()` 用,否则重新查一遍还是命中同一份结果 */
|
|
16
|
+
force?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface ResolveCodesResult {
|
|
19
|
+
/** 编码 → 选项,键是 `lookupKeyOf(编码)`,不带类型前缀,列表行原始值能直接查 */
|
|
20
|
+
byCode: Map<string, BizOption>;
|
|
21
|
+
/** 没解析到的编码(接口没返回、或返回了别的值) */
|
|
22
|
+
missing: string[];
|
|
23
|
+
/** 缺 requiredParams,一个请求都没发 */
|
|
24
|
+
blocked: boolean;
|
|
25
|
+
/** 实际发起的请求数;开发态用它判断这个页面是不是真的需要批量接口 */
|
|
26
|
+
requests: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 单条解析:源只声明了批量接口时,批量一条等价于单条,
|
|
30
|
+
* 不必逼调用方再写一个一模一样的 `resolve`。
|
|
31
|
+
*/
|
|
32
|
+
export declare function resolveOne(source: SelectSource | undefined, value: SelectValue, params: SelectParams): Promise<BizOption | null>;
|
|
33
|
+
export declare function resolveCodes(options: ResolveCodesOptions): Promise<ResolveCodesResult>;
|
|
34
|
+
//# sourceMappingURL=resolveBatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveBatch.d.ts","sourceRoot":"","sources":["../../src/biz-select/resolveBatch.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAElF,yCAAyC;AACzC,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC,MAAM,WAAW,mBAAmB;IAClC,+CAA+C;IAC/C,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,yBAAyB;IACzB,KAAK,EAAE,aAAa,CAAC,WAAW,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,qDAAqD;IACrD,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC/B,6BAA6B;IAC7B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,+BAA+B;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,YAAY,GAAG,SAAS,EAChC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAQ3B;AAiCD,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAqE5F"}
|