@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.
Files changed (141) hide show
  1. package/README.md +57 -12
  2. package/dist/SchemaField.d.ts +1 -1
  3. package/dist/biz-select/BizMultiSelect.d.ts +3 -0
  4. package/dist/biz-select/BizMultiSelect.d.ts.map +1 -0
  5. package/dist/biz-select/BizMultiSelect.js +120 -0
  6. package/dist/biz-select/BizMultiSelect.js.map +1 -0
  7. package/dist/biz-select/BizMultiSelectDisplay.d.ts +3 -0
  8. package/dist/biz-select/BizMultiSelectDisplay.d.ts.map +1 -0
  9. package/dist/biz-select/BizMultiSelectDisplay.js +59 -0
  10. package/dist/biz-select/BizMultiSelectDisplay.js.map +1 -0
  11. package/dist/biz-select/BizSelect.d.ts +3 -0
  12. package/dist/biz-select/BizSelect.d.ts.map +1 -0
  13. package/dist/biz-select/BizSelect.js +87 -0
  14. package/dist/biz-select/BizSelect.js.map +1 -0
  15. package/dist/biz-select/BizSelectDisplay.d.ts +3 -0
  16. package/dist/biz-select/BizSelectDisplay.d.ts.map +1 -0
  17. package/dist/biz-select/BizSelectDisplay.js +58 -0
  18. package/dist/biz-select/BizSelectDisplay.js.map +1 -0
  19. package/dist/biz-select/cache.d.ts +23 -0
  20. package/dist/biz-select/cache.d.ts.map +1 -0
  21. package/dist/biz-select/cache.js +141 -0
  22. package/dist/biz-select/cache.js.map +1 -0
  23. package/dist/biz-select/compile.d.ts +36 -0
  24. package/dist/biz-select/compile.d.ts.map +1 -0
  25. package/dist/biz-select/compile.js +103 -0
  26. package/dist/biz-select/compile.js.map +1 -0
  27. package/dist/biz-select/factories.d.ts +32 -0
  28. package/dist/biz-select/factories.d.ts.map +1 -0
  29. package/dist/biz-select/factories.js +67 -0
  30. package/dist/biz-select/factories.js.map +1 -0
  31. package/dist/biz-select/format.d.ts +66 -0
  32. package/dist/biz-select/format.d.ts.map +1 -0
  33. package/dist/biz-select/format.js +175 -0
  34. package/dist/biz-select/format.js.map +1 -0
  35. package/dist/biz-select/index.d.ts +28 -0
  36. package/dist/biz-select/index.d.ts.map +1 -0
  37. package/dist/biz-select/index.js +26 -0
  38. package/dist/biz-select/index.js.map +1 -0
  39. package/dist/biz-select/key.d.ts +25 -0
  40. package/dist/biz-select/key.d.ts.map +1 -0
  41. package/dist/biz-select/key.js +83 -0
  42. package/dist/biz-select/key.js.map +1 -0
  43. package/dist/biz-select/normalize.d.ts +43 -0
  44. package/dist/biz-select/normalize.d.ts.map +1 -0
  45. package/dist/biz-select/normalize.js +49 -0
  46. package/dist/biz-select/normalize.js.map +1 -0
  47. package/dist/biz-select/registry.d.ts +15 -0
  48. package/dist/biz-select/registry.d.ts.map +1 -0
  49. package/dist/biz-select/registry.js +81 -0
  50. package/dist/biz-select/registry.js.map +1 -0
  51. package/dist/biz-select/resolveBatch.d.ts +34 -0
  52. package/dist/biz-select/resolveBatch.d.ts.map +1 -0
  53. package/dist/biz-select/resolveBatch.js +124 -0
  54. package/dist/biz-select/resolveBatch.js.map +1 -0
  55. package/dist/biz-select/schema.d.ts +5 -0
  56. package/dist/biz-select/schema.d.ts.map +1 -0
  57. package/dist/biz-select/schema.js +28 -0
  58. package/dist/biz-select/schema.js.map +1 -0
  59. package/dist/biz-select/source-id.d.ts +8 -0
  60. package/dist/biz-select/source-id.d.ts.map +1 -0
  61. package/dist/biz-select/source-id.js +10 -0
  62. package/dist/biz-select/source-id.js.map +1 -0
  63. package/dist/biz-select/types.d.ts +160 -0
  64. package/dist/biz-select/types.d.ts.map +1 -0
  65. package/dist/{app-select → biz-select}/types.js.map +1 -1
  66. package/dist/biz-select/useCandidates.d.ts +40 -0
  67. package/dist/biz-select/useCandidates.d.ts.map +1 -0
  68. package/dist/biz-select/useCandidates.js +292 -0
  69. package/dist/biz-select/useCandidates.js.map +1 -0
  70. package/dist/biz-select/useResolvedLabels.d.ts +28 -0
  71. package/dist/biz-select/useResolvedLabels.d.ts.map +1 -0
  72. package/dist/biz-select/useResolvedLabels.js +151 -0
  73. package/dist/biz-select/useResolvedLabels.js.map +1 -0
  74. package/dist/biz-select/useSelectedLabel.d.ts +18 -0
  75. package/dist/biz-select/useSelectedLabel.d.ts.map +1 -0
  76. package/dist/biz-select/useSelectedLabel.js +156 -0
  77. package/dist/biz-select/useSelectedLabel.js.map +1 -0
  78. package/dist/biz-select/useSelectedLabels.d.ts +26 -0
  79. package/dist/biz-select/useSelectedLabels.d.ts.map +1 -0
  80. package/dist/biz-select/useSelectedLabels.js +88 -0
  81. package/dist/biz-select/useSelectedLabels.js.map +1 -0
  82. package/dist/biz-select/useStableSourceKey.d.ts +3 -0
  83. package/dist/biz-select/useStableSourceKey.d.ts.map +1 -0
  84. package/dist/biz-select/useStableSourceKey.js +48 -0
  85. package/dist/biz-select/useStableSourceKey.js.map +1 -0
  86. package/dist/flat.d.ts +43 -0
  87. package/dist/flat.d.ts.map +1 -0
  88. package/dist/flat.js +91 -0
  89. package/dist/flat.js.map +1 -0
  90. package/dist/form/SchemaFormField.d.ts.map +1 -1
  91. package/dist/form/SchemaFormField.js +4 -3
  92. package/dist/form/SchemaFormField.js.map +1 -1
  93. package/dist/form/derive.d.ts +3 -8
  94. package/dist/form/derive.d.ts.map +1 -1
  95. package/dist/form/derive.js +28 -0
  96. package/dist/form/derive.js.map +1 -1
  97. package/dist/index.d.ts +3 -1
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +4 -2
  100. package/dist/index.js.map +1 -1
  101. package/dist/registry.d.ts +6 -1
  102. package/dist/registry.d.ts.map +1 -1
  103. package/dist/registry.js.map +1 -1
  104. package/dist/types.d.ts +7 -2
  105. package/dist/types.d.ts.map +1 -1
  106. package/package.json +1 -1
  107. package/dist/app-select/AppSelect.d.ts +0 -3
  108. package/dist/app-select/AppSelect.d.ts.map +0 -1
  109. package/dist/app-select/AppSelect.js +0 -56
  110. package/dist/app-select/AppSelect.js.map +0 -1
  111. package/dist/app-select/AppSelectDisplay.d.ts +0 -3
  112. package/dist/app-select/AppSelectDisplay.d.ts.map +0 -1
  113. package/dist/app-select/AppSelectDisplay.js +0 -39
  114. package/dist/app-select/AppSelectDisplay.js.map +0 -1
  115. package/dist/app-select/cache.d.ts +0 -26
  116. package/dist/app-select/cache.d.ts.map +0 -1
  117. package/dist/app-select/cache.js +0 -82
  118. package/dist/app-select/cache.js.map +0 -1
  119. package/dist/app-select/hooks.d.ts +0 -56
  120. package/dist/app-select/hooks.d.ts.map +0 -1
  121. package/dist/app-select/hooks.js +0 -322
  122. package/dist/app-select/hooks.js.map +0 -1
  123. package/dist/app-select/index.d.ts +0 -7
  124. package/dist/app-select/index.d.ts.map +0 -1
  125. package/dist/app-select/index.js +0 -6
  126. package/dist/app-select/index.js.map +0 -1
  127. package/dist/app-select/register.d.ts +0 -2
  128. package/dist/app-select/register.d.ts.map +0 -1
  129. package/dist/app-select/register.js +0 -10
  130. package/dist/app-select/register.js.map +0 -1
  131. package/dist/app-select/sources.d.ts +0 -20
  132. package/dist/app-select/sources.d.ts.map +0 -1
  133. package/dist/app-select/sources.js +0 -59
  134. package/dist/app-select/sources.js.map +0 -1
  135. package/dist/app-select/types.d.ts +0 -68
  136. package/dist/app-select/types.d.ts.map +0 -1
  137. package/dist/app-select/utils.d.ts +0 -30
  138. package/dist/app-select/utils.d.ts.map +0 -1
  139. package/dist/app-select/utils.js +0 -76
  140. package/dist/app-select/utils.js.map +0 -1
  141. /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"}