@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,292 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 候选选项:加载、搜索、防抖、取消、参数失效。
|
|
3
|
+
*
|
|
4
|
+
* 关键约束(设计文档 §5.3):**effect / useCallback 的依赖里不出现源对象和其中的函数**。
|
|
5
|
+
* 源一律从 ref 读,依赖只保留 sourceKey / paramsKey 这类字符串。
|
|
6
|
+
* 违反这条的直接后果是:父组件每渲染一次,列表里每个单元格各发一次请求。
|
|
7
|
+
*/
|
|
8
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
9
|
+
import { dropCandidateCache, loadCandidatesWithCache } from './cache.js';
|
|
10
|
+
import { candidatesCacheKey, paramsKeyOf } from './key.js';
|
|
11
|
+
import { hasRequiredParams, normalizeSource } from './normalize.js';
|
|
12
|
+
import { resolveSelectSource } from './registry.js';
|
|
13
|
+
import { useStableSourceKey } from './useStableSourceKey.js';
|
|
14
|
+
import { filterOptions } from './format.js';
|
|
15
|
+
const EMPTY_OPTIONS = [];
|
|
16
|
+
export function useCandidates({ source: sourceProp, cacheKey, params, searchFields, debounceMs = 300, }) {
|
|
17
|
+
const source = resolveSelectSource(sourceProp);
|
|
18
|
+
// 订阅版本在这里:失效 / 重注册后键会变,已挂载的实例才会重新取数
|
|
19
|
+
const sourceKey = useStableSourceKey(sourceProp, cacheKey);
|
|
20
|
+
const capability = normalizeSource(source);
|
|
21
|
+
const { candidateMode, requiredParams, needsFetch } = capability;
|
|
22
|
+
const paramsKey = paramsKeyOf(params);
|
|
23
|
+
const blocked = !hasRequiredParams(requiredParams, params);
|
|
24
|
+
// 源与参数只走 ref:它们可以每帧变化,但绝不能成为 effect 依赖
|
|
25
|
+
const sourceRef = useRef(source);
|
|
26
|
+
sourceRef.current = source;
|
|
27
|
+
const paramsRef = useRef(params);
|
|
28
|
+
paramsRef.current = params;
|
|
29
|
+
const scopeRef = useRef('');
|
|
30
|
+
scopeRef.current = source?.namespace?.() ?? '';
|
|
31
|
+
// 当前作用域参与结果归属判断:只进缓存键不够,租户切换后旧候选仍会显示
|
|
32
|
+
const scope = scopeRef.current;
|
|
33
|
+
const sourceKeyRef = useRef(sourceKey);
|
|
34
|
+
sourceKeyRef.current = sourceKey;
|
|
35
|
+
const [loadState, setLoadState] = useState(null);
|
|
36
|
+
const [searchState, setSearchState] = useState(null);
|
|
37
|
+
const [keyword, setKeyword] = useState('');
|
|
38
|
+
// reload 在回调里要读当前关键词,不能进依赖(否则每次输入都换新函数)
|
|
39
|
+
const keywordRef = useRef('');
|
|
40
|
+
keywordRef.current = keyword;
|
|
41
|
+
// load 与 search 各记一份:共用会互相覆盖,一个结束就把另一个的「进行中」抹掉
|
|
42
|
+
const [loadLoading, setLoadLoading] = useState(false);
|
|
43
|
+
const [searchLoading, setSearchLoading] = useState(false);
|
|
44
|
+
const [error, setError] = useState(false);
|
|
45
|
+
/** 递增表示「需要拉一次候选」:展开下拉或手动重载 */
|
|
46
|
+
const [loadTick, setLoadTick] = useState(0);
|
|
47
|
+
/** 下拉是否展开:纯搜索型只在展开时才跟着源 / 条件变化重查 */
|
|
48
|
+
const openedRef = useRef(false);
|
|
49
|
+
const seqRef = useRef(0);
|
|
50
|
+
const abortRef = useRef(null);
|
|
51
|
+
const timerRef = useRef(null);
|
|
52
|
+
const cancelPending = useCallback(() => {
|
|
53
|
+
if (timerRef.current) {
|
|
54
|
+
clearTimeout(timerRef.current);
|
|
55
|
+
timerRef.current = null;
|
|
56
|
+
}
|
|
57
|
+
abortRef.current?.abort();
|
|
58
|
+
abortRef.current = null;
|
|
59
|
+
// 作废版本号才是正确性保障:abort 只是优化,源不认 signal 时仍会 resolve,
|
|
60
|
+
// 那时 seq 已经对不上,不会把旧结果写成 error / 空列表
|
|
61
|
+
seqRef.current += 1;
|
|
62
|
+
// 被作废的请求不再回来收尾,loading 得在这里结束:否则关掉下拉后就一直转圈
|
|
63
|
+
setSearchLoading(false);
|
|
64
|
+
}, []);
|
|
65
|
+
useEffect(() => cancelPending, [cancelPending]);
|
|
66
|
+
// 加载全集:只在展开下拉之后发生,依赖全是字符串,源从 ref 取
|
|
67
|
+
useEffect(() => {
|
|
68
|
+
const current = sourceRef.current;
|
|
69
|
+
const load = current?.load;
|
|
70
|
+
// 上一次的请求被这次变更作废(cancelled)后不会自己收尾,提前返回时必须补关 loading
|
|
71
|
+
if (!loadTick || blocked || !load) {
|
|
72
|
+
setLoadLoading(false);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const key = candidatesCacheKey(scope, sourceKey, paramsKey);
|
|
76
|
+
let cancelled = false;
|
|
77
|
+
setLoadLoading(true);
|
|
78
|
+
setError(false);
|
|
79
|
+
loadCandidatesWithCache(key, () => load(paramsRef.current ?? {}, undefined))
|
|
80
|
+
.then((list) => {
|
|
81
|
+
if (!cancelled)
|
|
82
|
+
setLoadState({ sourceKey, scope, paramsKey, list });
|
|
83
|
+
})
|
|
84
|
+
.catch(() => {
|
|
85
|
+
if (!cancelled) {
|
|
86
|
+
setLoadState({ sourceKey, scope, paramsKey, list: EMPTY_OPTIONS });
|
|
87
|
+
setError(true);
|
|
88
|
+
}
|
|
89
|
+
})
|
|
90
|
+
.finally(() => {
|
|
91
|
+
if (!cancelled)
|
|
92
|
+
setLoadLoading(false);
|
|
93
|
+
});
|
|
94
|
+
return () => {
|
|
95
|
+
cancelled = true;
|
|
96
|
+
};
|
|
97
|
+
}, [loadTick, sourceKey, scope, paramsKey, blocked, candidateMode]);
|
|
98
|
+
// 身份变化(条件 / 来源 / 租户):取消在途请求,旧结果靠三元比对自动失效。
|
|
99
|
+
// scope 必须在这里:租户切了但 sourceKey、paramsKey 没变,在途请求照样得作废
|
|
100
|
+
useEffect(() => {
|
|
101
|
+
cancelPending();
|
|
102
|
+
setKeyword('');
|
|
103
|
+
}, [paramsKey, sourceKey, scope, cancelPending]);
|
|
104
|
+
const runSearch = useCallback((keywordValue, key) => {
|
|
105
|
+
// 缺必需参数一律不查。open / reload 是公开入口(树、弹窗也会调),
|
|
106
|
+
// 光靠组件上的 disabled 挡不住,守卫必须收在真正发请求的这一处
|
|
107
|
+
if (blocked)
|
|
108
|
+
return;
|
|
109
|
+
const current = sourceRef.current;
|
|
110
|
+
const search = current?.search;
|
|
111
|
+
if (!search)
|
|
112
|
+
return;
|
|
113
|
+
const seq = seqRef.current + 1;
|
|
114
|
+
seqRef.current = seq;
|
|
115
|
+
const controller = new AbortController();
|
|
116
|
+
abortRef.current = controller;
|
|
117
|
+
// 归属信息在发请求时定格:结果回来后要能证明它属于哪个源、哪个租户
|
|
118
|
+
const sourceKeyAtRequest = sourceKeyRef.current;
|
|
119
|
+
const scopeAtRequest = scopeRef.current;
|
|
120
|
+
setSearchLoading(true);
|
|
121
|
+
setError(false);
|
|
122
|
+
search(keywordValue, paramsRef.current ?? {}, controller.signal)
|
|
123
|
+
.then((list) => {
|
|
124
|
+
if (seq !== seqRef.current)
|
|
125
|
+
return;
|
|
126
|
+
setSearchState({
|
|
127
|
+
sourceKey: sourceKeyAtRequest,
|
|
128
|
+
scope: scopeAtRequest,
|
|
129
|
+
paramsKey: key,
|
|
130
|
+
keyword: keywordValue,
|
|
131
|
+
list,
|
|
132
|
+
});
|
|
133
|
+
})
|
|
134
|
+
.catch(() => {
|
|
135
|
+
if (seq !== seqRef.current)
|
|
136
|
+
return;
|
|
137
|
+
setSearchState({
|
|
138
|
+
sourceKey: sourceKeyAtRequest,
|
|
139
|
+
scope: scopeAtRequest,
|
|
140
|
+
paramsKey: key,
|
|
141
|
+
keyword: keywordValue,
|
|
142
|
+
list: EMPTY_OPTIONS,
|
|
143
|
+
});
|
|
144
|
+
setError(true);
|
|
145
|
+
})
|
|
146
|
+
.finally(() => {
|
|
147
|
+
if (seq === seqRef.current)
|
|
148
|
+
setSearchLoading(false);
|
|
149
|
+
});
|
|
150
|
+
}, [blocked]);
|
|
151
|
+
const search = useCallback((keywordValue) => {
|
|
152
|
+
setKeyword(keywordValue);
|
|
153
|
+
if (blocked || !needsFetch || candidateMode === 'load')
|
|
154
|
+
return;
|
|
155
|
+
if (candidateMode !== 'search' && candidateMode !== 'hybrid')
|
|
156
|
+
return;
|
|
157
|
+
cancelPending();
|
|
158
|
+
const key = paramsKeyOf(paramsRef.current);
|
|
159
|
+
timerRef.current = setTimeout(() => {
|
|
160
|
+
timerRef.current = null;
|
|
161
|
+
runSearch(keywordValue, key);
|
|
162
|
+
}, debounceMs);
|
|
163
|
+
}, [blocked, needsFetch, candidateMode, debounceMs, cancelPending, runSearch]);
|
|
164
|
+
const searchStateRef = useRef(null);
|
|
165
|
+
searchStateRef.current = searchState;
|
|
166
|
+
const open = useCallback(() => {
|
|
167
|
+
openedRef.current = true;
|
|
168
|
+
setLoadTick((tick) => tick + 1);
|
|
169
|
+
// 纯搜索型没有全集,展开时先取一次默认候选;已经取过就不重复请求
|
|
170
|
+
const current = sourceRef.current;
|
|
171
|
+
if (!current?.search || current.load)
|
|
172
|
+
return;
|
|
173
|
+
const key = paramsKeyOf(paramsRef.current);
|
|
174
|
+
const state = searchStateRef.current;
|
|
175
|
+
// 换了源或租户,旧结果不再代表当前范围,必须重查
|
|
176
|
+
if (!state ||
|
|
177
|
+
state.sourceKey !== sourceKeyRef.current ||
|
|
178
|
+
state.scope !== scopeRef.current ||
|
|
179
|
+
state.paramsKey !== key ||
|
|
180
|
+
state.keyword !== '') {
|
|
181
|
+
runSearch('', key);
|
|
182
|
+
}
|
|
183
|
+
}, [runSearch]);
|
|
184
|
+
/** 收起下拉:清关键字并作废在途搜索,避免关掉之后才回来的结果写进状态 */
|
|
185
|
+
const resetKeyword = useCallback(() => {
|
|
186
|
+
openedRef.current = false;
|
|
187
|
+
cancelPending();
|
|
188
|
+
setKeyword('');
|
|
189
|
+
}, [cancelPending]);
|
|
190
|
+
/** 手动重取:绕开缓存。有关键词就重跑搜索,否则重拉全集 */
|
|
191
|
+
const reload = useCallback(() => {
|
|
192
|
+
cancelPending();
|
|
193
|
+
const key = paramsKeyOf(paramsRef.current);
|
|
194
|
+
const current = sourceRef.current;
|
|
195
|
+
if (keywordRef.current && current?.search) {
|
|
196
|
+
runSearch(keywordRef.current, key);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
if (current?.load) {
|
|
200
|
+
// 先删缓存再 bump,否则 effect 跑起来又会命中同一份
|
|
201
|
+
dropCandidateCache(candidatesCacheKey(scopeRef.current, sourceKeyRef.current, key));
|
|
202
|
+
setLoadTick((tick) => tick + 1);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (current?.search)
|
|
206
|
+
runSearch('', key);
|
|
207
|
+
}, [cancelPending, runSearch]);
|
|
208
|
+
/**
|
|
209
|
+
* 纯搜索型没有 load effect 兜底:源失效、或父字段改了条件,而下拉还开着时,
|
|
210
|
+
* 旧候选会一直挂在列表里(可能是别的仓库的记录)。这里补一次重查。
|
|
211
|
+
* 带 load 的源由加载 effect 负责,不重复发请求。
|
|
212
|
+
*/
|
|
213
|
+
const identityRef = useRef({ sourceKey, paramsKey, scope });
|
|
214
|
+
useEffect(() => {
|
|
215
|
+
const previous = identityRef.current;
|
|
216
|
+
identityRef.current = { sourceKey, paramsKey, scope };
|
|
217
|
+
if (!openedRef.current)
|
|
218
|
+
return;
|
|
219
|
+
if (previous.sourceKey === sourceKey &&
|
|
220
|
+
previous.paramsKey === paramsKey &&
|
|
221
|
+
previous.scope === scope) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
const current = sourceRef.current;
|
|
225
|
+
if (!current?.search || current.load)
|
|
226
|
+
return;
|
|
227
|
+
runSearch('', paramsKeyOf(paramsRef.current));
|
|
228
|
+
}, [sourceKey, paramsKey, scope, runSearch]);
|
|
229
|
+
const loadValid = Boolean(loadState &&
|
|
230
|
+
loadState.sourceKey === sourceKey &&
|
|
231
|
+
loadState.scope === scope &&
|
|
232
|
+
loadState.paramsKey === paramsKey);
|
|
233
|
+
const searchValid = Boolean(searchState &&
|
|
234
|
+
searchState.sourceKey === sourceKey &&
|
|
235
|
+
searchState.scope === scope &&
|
|
236
|
+
searchState.paramsKey === paramsKey &&
|
|
237
|
+
searchState.keyword === keyword);
|
|
238
|
+
const options = useMemo(() => {
|
|
239
|
+
if (blocked || candidateMode === 'invalid' || candidateMode === 'none')
|
|
240
|
+
return EMPTY_OPTIONS;
|
|
241
|
+
// 同步全集也要过本地过滤:filterOption=false 已关掉 antd 自带过滤,
|
|
242
|
+
// 这里不处理的话静态源在输入框里根本筛不动
|
|
243
|
+
if (candidateMode === 'sync') {
|
|
244
|
+
return filterOptions(source?.options ?? EMPTY_OPTIONS, keyword, searchFields);
|
|
245
|
+
}
|
|
246
|
+
if (candidateMode === 'load') {
|
|
247
|
+
if (!loadValid || !loadState)
|
|
248
|
+
return EMPTY_OPTIONS;
|
|
249
|
+
// 全集已在前端,关键字只做本地过滤
|
|
250
|
+
return filterOptions(loadState.list, keyword, searchFields);
|
|
251
|
+
}
|
|
252
|
+
if (candidateMode === 'hybrid') {
|
|
253
|
+
if (keyword)
|
|
254
|
+
return searchValid && searchState ? searchState.list : EMPTY_OPTIONS;
|
|
255
|
+
return loadValid && loadState ? loadState.list : EMPTY_OPTIONS;
|
|
256
|
+
}
|
|
257
|
+
return searchValid && searchState ? searchState.list : EMPTY_OPTIONS;
|
|
258
|
+
}, [
|
|
259
|
+
blocked,
|
|
260
|
+
candidateMode,
|
|
261
|
+
source,
|
|
262
|
+
loadValid,
|
|
263
|
+
loadState,
|
|
264
|
+
searchValid,
|
|
265
|
+
searchState,
|
|
266
|
+
keyword,
|
|
267
|
+
searchFields,
|
|
268
|
+
]);
|
|
269
|
+
// 回显要用未过滤的候选:已选项可能正好被关键词筛掉
|
|
270
|
+
const echoOptions = useMemo(() => {
|
|
271
|
+
if (candidateMode === 'sync')
|
|
272
|
+
return source?.options ?? EMPTY_OPTIONS;
|
|
273
|
+
if (loadValid && loadState)
|
|
274
|
+
return loadState.list;
|
|
275
|
+
// 纯搜索型没有全集,只能用手上这批
|
|
276
|
+
return options;
|
|
277
|
+
}, [candidateMode, source, loadValid, loadState, options]);
|
|
278
|
+
return {
|
|
279
|
+
sourceKey,
|
|
280
|
+
options,
|
|
281
|
+
echoOptions,
|
|
282
|
+
keyword,
|
|
283
|
+
loading: loadLoading || searchLoading,
|
|
284
|
+
error,
|
|
285
|
+
blocked,
|
|
286
|
+
open,
|
|
287
|
+
search,
|
|
288
|
+
resetKeyword,
|
|
289
|
+
reload,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=useCandidates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCandidates.js","sourceRoot":"","sources":["../../src/biz-select/useCandidates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { BizOption, SelectParams, SelectSource, SelectValue } from './types.js';
|
|
2
|
+
export interface UseResolvedLabelsOptions {
|
|
3
|
+
/** 注册名或内联源;解析与来源键都在 Hook 内完成,调用方别自己拼 */
|
|
4
|
+
source?: string | SelectSource;
|
|
5
|
+
/** 这一屏出现的编码,重复的、空值的会被去掉 */
|
|
6
|
+
values?: ReadonlyArray<SelectValue | null | undefined>;
|
|
7
|
+
/** 传给源的查询条件,参与缓存键;缺 requiredParams 就不查 */
|
|
8
|
+
params?: SelectParams;
|
|
9
|
+
/** 内联源需要跨实例共享缓存时显式指定;注册名自带稳定键 */
|
|
10
|
+
cacheKey?: string;
|
|
11
|
+
/** 每批最多多少个编码,按接口上限配,默认 100 */
|
|
12
|
+
batchSize?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface UseResolvedLabelsResult {
|
|
15
|
+
/** 编码 → 选项,键不带类型前缀,列表行里的原始值能直接查 */
|
|
16
|
+
byCode: Map<string, BizOption>;
|
|
17
|
+
/** 解析到的全部选项,可直接当 `seedOptions` 传给表格单元格 */
|
|
18
|
+
options: BizOption[];
|
|
19
|
+
loading: boolean;
|
|
20
|
+
error: boolean;
|
|
21
|
+
/** 缺 requiredParams,一个请求都没发 */
|
|
22
|
+
blocked: boolean;
|
|
23
|
+
/** 这次实际发起的请求数;没声明 `resolveMany` 时等于不同编码的个数 */
|
|
24
|
+
requests: number;
|
|
25
|
+
reload(): void;
|
|
26
|
+
}
|
|
27
|
+
export declare function useResolvedLabels({ source: sourceProp, values, params, cacheKey, batchSize, }: UseResolvedLabelsOptions): UseResolvedLabelsResult;
|
|
28
|
+
//# sourceMappingURL=useResolvedLabels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useResolvedLabels.d.ts","sourceRoot":"","sources":["../../src/biz-select/useResolvedLabels.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAElF,MAAM,WAAW,wBAAwB;IACvC,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;IAC/B,2BAA2B;IAC3B,MAAM,CAAC,EAAE,aAAa,CAAC,WAAW,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACvD,0CAA0C;IAC1C,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,mCAAmC;IACnC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC/B,0CAA0C;IAC1C,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,+BAA+B;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,IAAI,IAAI,CAAC;CAChB;AA8BD,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EAAE,UAAU,EAClB,MAAM,EACN,MAAM,EACN,QAAQ,EACR,SAA8B,GAC/B,EAAE,wBAAwB,GAAG,uBAAuB,CA6HpD"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 一屏编码 → 名称:表格列这类「只有 id、没有名称」的批量回显。
|
|
3
|
+
*
|
|
4
|
+
* 和 `useCandidates` 对称:那边拿候选全集,这边只拿已解析的这几条。
|
|
5
|
+
* 页面调一次,结果既能直接当 `seedOptions` 传给单元格,也能按编码查表渲染文本。
|
|
6
|
+
*
|
|
7
|
+
* 依赖里同样只放字符串(sourceKey / paramsKey / codesKey),源从 ref 读——
|
|
8
|
+
* 否则父组件每渲染一次就会重发一轮批量请求。
|
|
9
|
+
*/
|
|
10
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
11
|
+
import { IS_DEV } from '../env.js';
|
|
12
|
+
import { lookupKeyOf, paramsKeyOf } from './key.js';
|
|
13
|
+
import { normalizeSource } from './normalize.js';
|
|
14
|
+
import { resolveSelectSource } from './registry.js';
|
|
15
|
+
import { DEFAULT_BATCH_SIZE, resolveCodes } from './resolveBatch.js';
|
|
16
|
+
import { useStableSourceKey } from './useStableSourceKey.js';
|
|
17
|
+
const EMPTY_MAP = new Map();
|
|
18
|
+
const EMPTY_OPTIONS = [];
|
|
19
|
+
/** 编码集合的稳定身份:排序后拼接,行顺序变了不算变化 */
|
|
20
|
+
function codesKeyOf(values) {
|
|
21
|
+
const keys = [];
|
|
22
|
+
const seen = new Set();
|
|
23
|
+
for (const value of values) {
|
|
24
|
+
if (value === undefined || value === null || value === '')
|
|
25
|
+
continue;
|
|
26
|
+
const key = lookupKeyOf(value);
|
|
27
|
+
if (seen.has(key))
|
|
28
|
+
continue;
|
|
29
|
+
seen.add(key);
|
|
30
|
+
keys.push(key);
|
|
31
|
+
}
|
|
32
|
+
return keys.sort().join('|');
|
|
33
|
+
}
|
|
34
|
+
export function useResolvedLabels({ source: sourceProp, values, params, cacheKey, batchSize = DEFAULT_BATCH_SIZE, }) {
|
|
35
|
+
const source = resolveSelectSource(sourceProp);
|
|
36
|
+
const sourceKey = useStableSourceKey(sourceProp, cacheKey);
|
|
37
|
+
const scope = source?.namespace?.() ?? '';
|
|
38
|
+
const paramsKey = paramsKeyOf(params);
|
|
39
|
+
const codesKey = codesKeyOf(values ?? []);
|
|
40
|
+
const sourceRef = useRef(source);
|
|
41
|
+
sourceRef.current = source;
|
|
42
|
+
const paramsRef = useRef(params);
|
|
43
|
+
paramsRef.current = params;
|
|
44
|
+
const valuesRef = useRef(values);
|
|
45
|
+
valuesRef.current = values;
|
|
46
|
+
const [state, setState] = useState(null);
|
|
47
|
+
const [loading, setLoading] = useState(false);
|
|
48
|
+
const [error, setError] = useState(false);
|
|
49
|
+
const [nonce, setNonce] = useState(0);
|
|
50
|
+
const warnedRef = useRef(new Set());
|
|
51
|
+
/** reload 是一次性的:用完就清,否则之后换页也会一直绕开缓存 */
|
|
52
|
+
const forceRef = useRef(false);
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
if (!codesKey) {
|
|
55
|
+
setState(null);
|
|
56
|
+
setLoading(false);
|
|
57
|
+
setError(false);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const current = sourceRef.current;
|
|
61
|
+
// 没有按值查询能力:不发请求,展示层会退回编码
|
|
62
|
+
if (!normalizeSource(current).canResolve) {
|
|
63
|
+
setState(null);
|
|
64
|
+
setLoading(false);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
let cancelled = false;
|
|
68
|
+
setLoading(true);
|
|
69
|
+
setError(false);
|
|
70
|
+
const force = forceRef.current;
|
|
71
|
+
forceRef.current = false;
|
|
72
|
+
resolveCodes({
|
|
73
|
+
source: current,
|
|
74
|
+
sourceKey,
|
|
75
|
+
scope,
|
|
76
|
+
params: paramsRef.current,
|
|
77
|
+
codes: valuesRef.current ?? [],
|
|
78
|
+
batchSize,
|
|
79
|
+
force,
|
|
80
|
+
})
|
|
81
|
+
.then((result) => {
|
|
82
|
+
if (cancelled)
|
|
83
|
+
return;
|
|
84
|
+
// 没声明批量接口时,这一屏就是 N 个请求——开发态提示一次,
|
|
85
|
+
// 用来收集「哪个页面真的需要后端批量接口」,而不是靠感觉判断
|
|
86
|
+
if (IS_DEV && !current?.resolveMany && result.requests > 1 && !warnedRef.current.has(sourceKey)) {
|
|
87
|
+
warnedRef.current.add(sourceKey);
|
|
88
|
+
console.warn(`[schema] 本次为 ${result.requests} 个不同编码各发了一次请求。` +
|
|
89
|
+
'源支持 IN 过滤时请声明 resolveMany;不支持的话,表格列应改用 load 型源一次拉全量');
|
|
90
|
+
}
|
|
91
|
+
setState({
|
|
92
|
+
sourceKey,
|
|
93
|
+
scope,
|
|
94
|
+
paramsKey,
|
|
95
|
+
codesKey,
|
|
96
|
+
byCode: result.byCode,
|
|
97
|
+
options: [...result.byCode.values()],
|
|
98
|
+
blocked: result.blocked,
|
|
99
|
+
requests: result.requests,
|
|
100
|
+
});
|
|
101
|
+
})
|
|
102
|
+
.catch(() => {
|
|
103
|
+
if (cancelled)
|
|
104
|
+
return;
|
|
105
|
+
// 批量失败就是整片失败:不自动降级成逐条重试,否则一次故障放大成 N 个请求
|
|
106
|
+
setState(null);
|
|
107
|
+
setError(true);
|
|
108
|
+
})
|
|
109
|
+
.finally(() => {
|
|
110
|
+
if (!cancelled)
|
|
111
|
+
setLoading(false);
|
|
112
|
+
});
|
|
113
|
+
return () => {
|
|
114
|
+
cancelled = true;
|
|
115
|
+
};
|
|
116
|
+
// sourceKey / scope / paramsKey / codesKey 都是字符串,源与参数从 ref 读
|
|
117
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
118
|
+
}, [sourceKey, scope, paramsKey, codesKey, batchSize, nonce]);
|
|
119
|
+
const reload = useCallback(() => {
|
|
120
|
+
forceRef.current = true;
|
|
121
|
+
setNonce((value) => value + 1);
|
|
122
|
+
}, []);
|
|
123
|
+
return useMemo(() => {
|
|
124
|
+
const matched = state &&
|
|
125
|
+
state.sourceKey === sourceKey &&
|
|
126
|
+
state.scope === scope &&
|
|
127
|
+
state.paramsKey === paramsKey &&
|
|
128
|
+
state.codesKey === codesKey;
|
|
129
|
+
if (!matched || !state) {
|
|
130
|
+
return {
|
|
131
|
+
byCode: EMPTY_MAP,
|
|
132
|
+
options: EMPTY_OPTIONS,
|
|
133
|
+
loading,
|
|
134
|
+
error,
|
|
135
|
+
blocked: false,
|
|
136
|
+
requests: 0,
|
|
137
|
+
reload,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
byCode: state.byCode,
|
|
142
|
+
options: state.options,
|
|
143
|
+
loading,
|
|
144
|
+
error,
|
|
145
|
+
blocked: state.blocked,
|
|
146
|
+
requests: state.requests,
|
|
147
|
+
reload,
|
|
148
|
+
};
|
|
149
|
+
}, [state, sourceKey, scope, paramsKey, codesKey, loading, error, reload]);
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=useResolvedLabels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useResolvedLabels.js","sourceRoot":"","sources":["../../src/biz-select/useResolvedLabels.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { BizOption, SelectParams, SelectSource, SelectValue } from './types.js';
|
|
2
|
+
export type SelectedStatus = 'empty' | 'loading' | 'resolved' | 'missing' | 'blocked' | 'error';
|
|
3
|
+
export interface UseSelectedLabelOptions {
|
|
4
|
+
source?: SelectSource;
|
|
5
|
+
sourceKey: string;
|
|
6
|
+
code?: SelectValue;
|
|
7
|
+
/** 对象值里自带的名称 */
|
|
8
|
+
valueName?: string;
|
|
9
|
+
seedOptions?: BizOption[];
|
|
10
|
+
candidates?: BizOption[];
|
|
11
|
+
params?: SelectParams;
|
|
12
|
+
}
|
|
13
|
+
export interface UseSelectedLabelResult {
|
|
14
|
+
option: BizOption | null;
|
|
15
|
+
status: SelectedStatus;
|
|
16
|
+
}
|
|
17
|
+
export declare function useSelectedLabel({ source, sourceKey, code, valueName, seedOptions, candidates, params, }: UseSelectedLabelOptions): UseSelectedLabelResult;
|
|
18
|
+
//# sourceMappingURL=useSelectedLabel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSelectedLabel.d.ts","sourceRoot":"","sources":["../../src/biz-select/useSelectedLabel.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAElF,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEhG,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,gBAAgB;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,cAAc,CAAC;CACxB;AAqBD,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,SAAS,EACT,IAAI,EACJ,SAAS,EACT,WAAW,EACX,UAAU,EACV,MAAM,GACP,EAAE,uBAAuB,GAAG,sBAAsB,CAkJlD"}
|