@asteby/metacore-runtime-react 39.2.6 → 39.2.8
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/CHANGELOG.md +12 -0
- package/dist/api-context.d.ts.map +1 -1
- package/dist/api-context.js +10 -2
- package/dist/dynamic-table.d.ts.map +1 -1
- package/dist/dynamic-table.js +8 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/list-include.d.ts +9 -0
- package/dist/list-include.d.ts.map +1 -0
- package/dist/list-include.js +36 -0
- package/dist/query-batch.d.ts +60 -0
- package/dist/query-batch.d.ts.map +1 -0
- package/dist/query-batch.js +306 -0
- package/dist/use-options-resolver.d.ts.map +1 -1
- package/dist/use-options-resolver.js +28 -2
- package/package.json +1 -1
- package/src/api-context.tsx +10 -2
- package/src/dynamic-table.tsx +10 -2
- package/src/index.ts +15 -0
- package/src/list-include.test.ts +33 -0
- package/src/list-include.ts +34 -0
- package/src/query-batch.test.ts +67 -0
- package/src/query-batch.ts +354 -0
- package/src/use-options-resolver.ts +29 -2
- package/vitest.config.ts +1 -0
- package/vitest.setup.ts +29 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @asteby/metacore-runtime-react
|
|
2
2
|
|
|
3
|
+
## 39.2.8
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 871800c: useApi().get agrupa lista, metadata y options en un POST /api/q, guarda cada id de un in: durante 30 s y DynamicTable pide include= solo de las columnas visibles.
|
|
8
|
+
|
|
9
|
+
## 39.2.7
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 6006eff: Los pickers de una misma pantalla salen en un solo POST /api/q.
|
|
14
|
+
|
|
3
15
|
## 39.2.6
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-context.d.ts","sourceRoot":"","sources":["../src/api-context.tsx"],"names":[],"mappings":"AAIA,OAAO,
|
|
1
|
+
{"version":3,"file":"api-context.d.ts","sourceRoot":"","sources":["../src/api-context.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA6C,MAAM,OAAO,CAAA;AAGjE,uEAAuE;AACvE,MAAM,WAAW,SAAS;IACtB,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,GAAG,CAAC;QAAC,OAAO,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC,CAAA;IACzE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,GAAG,CAAC;QAAC,OAAO,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC,CAAA;IACtF,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,GAAG,CAAC;QAAC,OAAO,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC,CAAA;IACrF,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,GAAG,CAAC;QAAC,OAAO,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC,CAAA;CAC/E;AAID,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,SAAS,CAAA;IACjB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC5B;AAED,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,gBAAgB,qBAEjE;AAED,mFAAmF;AACnF,wBAAgB,MAAM,IAAI,SAAS,CAalC;AAED;;wEAEwE;AACxE,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CACzC;AAID,MAAM,WAAW,mBAAmB;IAChC,MAAM,EAAE,WAAW,CAAA;IACnB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC5B;AAED,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,mBAAmB,qBAEvE;AAED,wBAAgB,gBAAgB,IAAI,WAAW,CAE9C"}
|
package/dist/api-context.js
CHANGED
|
@@ -3,7 +3,8 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
3
3
|
// runtime-react components (DynamicTable, dialogs, action dispatcher) can
|
|
4
4
|
// talk to the backend without a bundler alias to `@/lib/api`. Hosts wrap
|
|
5
5
|
// their app in <ApiProvider value={axiosInstance}> once at the root.
|
|
6
|
-
import { createContext, useContext } from 'react';
|
|
6
|
+
import { createContext, useContext, useMemo } from 'react';
|
|
7
|
+
import { batchGet } from './query-batch';
|
|
7
8
|
const ApiContext = createContext(null);
|
|
8
9
|
export function ApiProvider({ client, children }) {
|
|
9
10
|
return _jsx(ApiContext.Provider, { value: client, children: children });
|
|
@@ -14,7 +15,14 @@ export function useApi() {
|
|
|
14
15
|
if (!ctx) {
|
|
15
16
|
throw new Error('useApi() requires an <ApiProvider> ancestor. Hosts must inject an axios-like client via runtime-react ApiProvider.');
|
|
16
17
|
}
|
|
17
|
-
|
|
18
|
+
// List, metadata and options GETs share one POST /api/q. Mutations stay
|
|
19
|
+
// on the host client. The wrapper is stable while the host client is.
|
|
20
|
+
return useMemo(() => ({
|
|
21
|
+
get: (url, config) => batchGet(ctx, url, config),
|
|
22
|
+
post: (url, body, config) => ctx.post(url, body, config),
|
|
23
|
+
put: (url, body, config) => ctx.put(url, body, config),
|
|
24
|
+
delete: (url, config) => ctx.delete(url, config),
|
|
25
|
+
}), [ctx]);
|
|
18
26
|
}
|
|
19
27
|
const BranchContext = createContext({ id: undefined });
|
|
20
28
|
export function BranchProvider({ branch, children }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-table.d.ts","sourceRoot":"","sources":["../src/dynamic-table.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAKH,KAAK,SAAS,EAajB,MAAM,uBAAuB,CAAA;AAgC9B,OAAO,KAAK,EAAsB,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"dynamic-table.d.ts","sourceRoot":"","sources":["../src/dynamic-table.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAKH,KAAK,SAAS,EAajB,MAAM,uBAAuB,CAAA;AAgC9B,OAAO,KAAK,EAAsB,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAwGnF,MAAM,WAAW,iBAAiB;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB;;;;;;;;;OASG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,CAAA;IAC7C;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAA;IAC/B,cAAc,CAAC,EAAE,GAAG,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACpC,YAAY,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAA;IAC/B;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;;;;;;;;OAaG;IACH,UAAU,CAAC,EAAE,OAAO,GAAG,UAAU,CAAA;IACjC;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;CACpC;AAQD,wBAAgB,YAAY,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,gBAAgB,EAChB,aAAoB,EACpB,UAAU,EACV,UAAU,EACV,aAAkB,EAClB,iBAAiB,EACjB,QAAQ,EACR,UAAU,EACV,cAAc,EACd,cAAc,EACd,YAAiB,EACjB,iBAA4C,EAC5C,QAAQ,EACR,QAAQ,EACR,UAAU,EAAE,cAAc,EAC1B,cAAc,EAAE,kBAA0B,EAC1C,cAAc,GACjB,EAAE,iBAAiB,+BAuiDnB"}
|
package/dist/dynamic-table.js
CHANGED
|
@@ -31,6 +31,7 @@ import { dedupeById, useInfiniteScrollSentinel } from './use-infinite-scroll';
|
|
|
31
31
|
import { DYNAMIC_TABLE_CARD_ESTIMATE_PX, DYNAMIC_TABLE_ROW_ESTIMATE_PX, resolveVirtualizeThreshold, } from './table-virtualization';
|
|
32
32
|
import { OptionsContext } from './options-context';
|
|
33
33
|
import { getSearchableColumnKeys } from './column-visibility';
|
|
34
|
+
import { visibleRelationInclude } from './list-include';
|
|
34
35
|
import { useDebouncedValue } from './use-debounced-value';
|
|
35
36
|
import { useCan, usePermissionsActive, gateTableMetadata } from './permissions-context';
|
|
36
37
|
import { useDynamicRowActions } from './dynamic-row-actions';
|
|
@@ -649,6 +650,7 @@ export function DynamicTable({ model, endpoint, mutationEndpoint, enableUrlSync
|
|
|
649
650
|
set.add(k);
|
|
650
651
|
return Array.from(set);
|
|
651
652
|
}, [hiddenColumns, scopeHiddenColumns]);
|
|
653
|
+
const relationInclude = useMemo(() => visibleRelationInclude(metadata?.columns, effectiveHiddenColumns), [metadata, effectiveHiddenColumns]);
|
|
652
654
|
const buildFilterParams = useCallback(() => {
|
|
653
655
|
const params = {};
|
|
654
656
|
if (sorting.length > 0) {
|
|
@@ -719,6 +721,8 @@ export function DynamicTable({ model, endpoint, mutationEndpoint, enableUrlSync
|
|
|
719
721
|
per_page: pagination.pageSize,
|
|
720
722
|
...buildFilterParams(),
|
|
721
723
|
};
|
|
724
|
+
if (relationInclude)
|
|
725
|
+
params.include = relationInclude;
|
|
722
726
|
const res = await api.get(endpoint || `/data/${model}`, { params });
|
|
723
727
|
setForbidden(false);
|
|
724
728
|
if (res.data.success) {
|
|
@@ -746,7 +750,7 @@ export function DynamicTable({ model, endpoint, mutationEndpoint, enableUrlSync
|
|
|
746
750
|
finally {
|
|
747
751
|
setLoadingData(false);
|
|
748
752
|
}
|
|
749
|
-
}, [model, metadata, pagination, buildFilterParams, refreshTrigger, endpoint, currentBranch?.id, api, enableUrlSync]);
|
|
753
|
+
}, [model, metadata, pagination, buildFilterParams, refreshTrigger, endpoint, currentBranch?.id, api, enableUrlSync, relationInclude]);
|
|
750
754
|
// Columns whose metadata opts into a footer total (display_config.aggregate
|
|
751
755
|
// → styleConfig.aggregate). When empty, no footer row is rendered and no
|
|
752
756
|
// aggregate request is made.
|
|
@@ -784,6 +788,8 @@ export function DynamicTable({ model, endpoint, mutationEndpoint, enableUrlSync
|
|
|
784
788
|
per_page: infPageSize,
|
|
785
789
|
...buildFilterParams(),
|
|
786
790
|
};
|
|
791
|
+
if (relationInclude)
|
|
792
|
+
params.include = relationInclude;
|
|
787
793
|
const res = (await api.get(endpoint || `/data/${model}`, {
|
|
788
794
|
params,
|
|
789
795
|
}));
|
|
@@ -823,7 +829,7 @@ export function DynamicTable({ model, endpoint, mutationEndpoint, enableUrlSync
|
|
|
823
829
|
else
|
|
824
830
|
setLoadingData(false);
|
|
825
831
|
}
|
|
826
|
-
}, [metadata, buildFilterParams, endpoint, model, api, currentBranch?.id, enableUrlSync]);
|
|
832
|
+
}, [metadata, buildFilterParams, endpoint, model, api, currentBranch?.id, enableUrlSync, relationInclude]);
|
|
827
833
|
// Signature of everything that must reset the incremental list to page 1:
|
|
828
834
|
// the filters/search AND the sort (both live in buildFilterParams).
|
|
829
835
|
const filterSignature = useMemo(() => JSON.stringify(buildFilterParams()), [buildFilterParams]);
|
package/dist/index.d.ts
CHANGED
|
@@ -74,6 +74,7 @@ export { DynamicRelation, type DynamicRelationProps, type DynamicRelationStrings
|
|
|
74
74
|
export { DynamicRelations, resolveParentId, buildRelationFilters, isEmbedded, type DynamicRelationsProps, } from './dynamic-relations';
|
|
75
75
|
export { registerModelExtension, getModelExtension, clearModelExtensions, type ModelExtension, type ModelExtensionProps, } from './model-extension-registry';
|
|
76
76
|
export { isColumnVisibleInTable, isColumnVisibleInModal, isColumnVisibleInLineSubtable, AUDIT_SUBTABLE_COLUMN_KEYS, getSearchableColumnKeys, } from './column-visibility';
|
|
77
|
+
export { batchGet, loadQueryPart, nameBatchTokens, narrowInToken, optionsBatchToken, optionsModelFromUrl, rememberInRows, resetQueryBatchCache, splitInToken, tokenForGet, type InListToken, type NarrowedIn, type QueryPart, } from './query-batch';
|
|
77
78
|
export { useOptionsResolver, projectOption, type ResolvedOption, type OptionsMeta, type UseOptionsResolverArgs, type UseOptionsResolverResult, } from './use-options-resolver';
|
|
78
79
|
export { setOrgConfigBridge, getOrgConfigBridge, resolveValidatorToken, type OrgConfigBridge, } from './use-org-config-bridge';
|
|
79
80
|
export { registerValidator, getDependsOn, resolveDependsValue, getOptionsConfig, resolveOptionsSource, getVisibleWhen, evaluateVisibleWhen, scopeValueFromFilterToken, buildListScopeValues, evaluateVisibleWhenForListScope, applyLineItemRowFormulas, computeLineItemTotals, toNumber, } from './dynamic-form-schema';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -74,6 +74,7 @@ export { DynamicRelation, buildRelationFilterParams, buildCreatePayload, deriveR
|
|
|
74
74
|
export { DynamicRelations, resolveParentId, buildRelationFilters, isEmbedded, } from './dynamic-relations';
|
|
75
75
|
export { registerModelExtension, getModelExtension, clearModelExtensions, } from './model-extension-registry';
|
|
76
76
|
export { isColumnVisibleInTable, isColumnVisibleInModal, isColumnVisibleInLineSubtable, AUDIT_SUBTABLE_COLUMN_KEYS, getSearchableColumnKeys, } from './column-visibility';
|
|
77
|
+
export { batchGet, loadQueryPart, nameBatchTokens, narrowInToken, optionsBatchToken, optionsModelFromUrl, rememberInRows, resetQueryBatchCache, splitInToken, tokenForGet, } from './query-batch';
|
|
77
78
|
export { useOptionsResolver, projectOption, } from './use-options-resolver';
|
|
78
79
|
export { setOrgConfigBridge, getOrgConfigBridge, resolveValidatorToken, } from './use-org-config-bridge';
|
|
79
80
|
export { registerValidator, getDependsOn, resolveDependsValue, getOptionsConfig, resolveOptionsSource, getVisibleWhen, evaluateVisibleWhen, scopeValueFromFilterToken, buildListScopeValues, evaluateVisibleWhenForListScope, applyLineItemRowFormulas, computeLineItemTotals, toNumber, } from './dynamic-form-schema';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ColumnDefinition } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Columns whose labels come from a relation lookup. The list asks the server
|
|
4
|
+
* to resolve only these, so hidden foreign keys do not each become a query.
|
|
5
|
+
* Returns undefined when nothing relational is visible: the server then keeps
|
|
6
|
+
* resolving everything, which is what hosts do before they send `include=`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function visibleRelationInclude(columns: ColumnDefinition[] | undefined, hidden?: string[]): string | undefined;
|
|
9
|
+
//# sourceMappingURL=list-include.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-include.d.ts","sourceRoot":"","sources":["../src/list-include.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAClC,OAAO,EAAE,gBAAgB,EAAE,GAAG,SAAS,EACvC,MAAM,GAAE,MAAM,EAAO,GACtB,MAAM,GAAG,SAAS,CAYpB"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Columns whose labels come from a relation lookup. The list asks the server
|
|
3
|
+
* to resolve only these, so hidden foreign keys do not each become a query.
|
|
4
|
+
* Returns undefined when nothing relational is visible: the server then keeps
|
|
5
|
+
* resolving everything, which is what hosts do before they send `include=`.
|
|
6
|
+
*/
|
|
7
|
+
export function visibleRelationInclude(columns, hidden = []) {
|
|
8
|
+
if (!columns?.length)
|
|
9
|
+
return undefined;
|
|
10
|
+
const hide = new Set(hidden);
|
|
11
|
+
const keys = [];
|
|
12
|
+
for (const col of columns) {
|
|
13
|
+
if (!col?.key || col.hidden || hide.has(col.key))
|
|
14
|
+
continue;
|
|
15
|
+
if (col.visibility === 'modal' || col.visibility === 'list')
|
|
16
|
+
continue;
|
|
17
|
+
if (!columnNeedsRelation(col))
|
|
18
|
+
continue;
|
|
19
|
+
keys.push(col.key);
|
|
20
|
+
}
|
|
21
|
+
if (keys.length === 0)
|
|
22
|
+
return undefined;
|
|
23
|
+
return keys.join(',');
|
|
24
|
+
}
|
|
25
|
+
function columnNeedsRelation(col) {
|
|
26
|
+
if (col.type === 'relation' || col.type === 'relation-badge-list' || col.type === 'creator' || col.type === 'user') {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
if (col.cellStyle === 'relation' || col.cellStyle === 'reference')
|
|
30
|
+
return true;
|
|
31
|
+
if (col.ref)
|
|
32
|
+
return true;
|
|
33
|
+
if (col.itemFields?.length || col.item_fields?.length)
|
|
34
|
+
return true;
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coalesces concurrent reads into one POST /api/q.
|
|
3
|
+
*
|
|
4
|
+
* Callers enqueue a batch token (`o:Customer?field=id&q=lop`). Tokens that
|
|
5
|
+
* arrive inside an 8ms window share one request. Each part keeps its own
|
|
6
|
+
* success, data and etag. A failed part does not reject the others.
|
|
7
|
+
*/
|
|
8
|
+
import type { ApiClient } from './api-context';
|
|
9
|
+
export interface QueryPart {
|
|
10
|
+
success: boolean;
|
|
11
|
+
data?: unknown;
|
|
12
|
+
meta?: unknown;
|
|
13
|
+
message?: string;
|
|
14
|
+
etag?: string;
|
|
15
|
+
not_modified?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface InListToken {
|
|
18
|
+
field: string;
|
|
19
|
+
ids: string[];
|
|
20
|
+
shape: string;
|
|
21
|
+
}
|
|
22
|
+
/** A concrete `t:` `in:` list. `@` references stay whole: the ids are not known yet. */
|
|
23
|
+
export declare function splitInToken(token: string): InListToken | null;
|
|
24
|
+
export interface NarrowedIn {
|
|
25
|
+
wire: string;
|
|
26
|
+
rows: Record<string, unknown>[];
|
|
27
|
+
missingIds: string[];
|
|
28
|
+
field: string;
|
|
29
|
+
shape: string;
|
|
30
|
+
}
|
|
31
|
+
/** Drops ids already cached for this shape. An empty wire means nothing has to travel. */
|
|
32
|
+
export declare function narrowInToken(token: string, now?: number): NarrowedIn | null;
|
|
33
|
+
/** Stores one row per requested id. An id with no row is remembered as empty. */
|
|
34
|
+
export declare function rememberInRows(token: string, ids: string[], rows: unknown, now?: number): void;
|
|
35
|
+
export declare function resetQueryBatchCache(): void;
|
|
36
|
+
export declare function optionsModelFromUrl(url: string): string | null;
|
|
37
|
+
export declare function optionsBatchToken(model: string, field: string, query: string, limit: number | undefined, filter: string | undefined): string;
|
|
38
|
+
/** Names each distinct token so the server can key the response. */
|
|
39
|
+
export declare function nameBatchTokens(tokens: string[]): {
|
|
40
|
+
name: string;
|
|
41
|
+
token: string;
|
|
42
|
+
plan: string;
|
|
43
|
+
}[];
|
|
44
|
+
export declare function loadQueryPart(api: ApiClient, token: string): Promise<QueryPart>;
|
|
45
|
+
/**
|
|
46
|
+
* Token for a host GET that the batch can serve. Custom endpoints, aggregates
|
|
47
|
+
* and `/me` stay on the legacy GET.
|
|
48
|
+
*/
|
|
49
|
+
export declare function tokenForGet(url: string, params?: Record<string, unknown>): string | null;
|
|
50
|
+
/**
|
|
51
|
+
* GET through the batch when the URL is a list, table metadata, modal metadata
|
|
52
|
+
* or options read. Anything the batch refuses falls back to the original GET.
|
|
53
|
+
*/
|
|
54
|
+
export declare function batchGet(api: ApiClient, url: string, config?: {
|
|
55
|
+
params?: Record<string, unknown>;
|
|
56
|
+
}): Promise<{
|
|
57
|
+
data: any;
|
|
58
|
+
headers?: any;
|
|
59
|
+
}>;
|
|
60
|
+
//# sourceMappingURL=query-batch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-batch.d.ts","sourceRoot":"","sources":["../src/query-batch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAE9C,MAAM,WAAW,SAAS;IACtB,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,OAAO,CAAA;CACzB;AAsBD,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CAChB;AAED,wFAAwF;AACxF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAsB9D;AAaD,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAC/B,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CAChB;AAED,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,UAAU,GAAG,IAAI,CAsBhF;AAED,iFAAiF;AACjF,wBAAgB,cAAc,CAC1B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EAAE,EACb,IAAI,EAAE,OAAO,EACb,GAAG,SAAa,GACjB,IAAI,CAqBN;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAM3C;AAsBD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG9D;AAED,wBAAgB,iBAAiB,CAC7B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,MAAM,GAAG,SAAS,GAC3B,MAAM,CAOR;AAED,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAYjG;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAsB/E;AA6DD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CA2BxF;AAMD;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE;;;GAwBxG"}
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
const WINDOW_MS = 8;
|
|
2
|
+
const PART_TTL_MS = 30_000;
|
|
3
|
+
const ENTITY_TTL_MS = 30_000;
|
|
4
|
+
const partCache = new Map();
|
|
5
|
+
const entityCache = new Map();
|
|
6
|
+
/** A concrete `t:` `in:` list. `@` references stay whole: the ids are not known yet. */
|
|
7
|
+
export function splitInToken(token) {
|
|
8
|
+
const q = token.indexOf('?');
|
|
9
|
+
if (q < 0 || !token.startsWith('t:'))
|
|
10
|
+
return null;
|
|
11
|
+
const model = token.slice(2, q);
|
|
12
|
+
if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(model))
|
|
13
|
+
return null;
|
|
14
|
+
const params = new URLSearchParams(token.slice(q + 1));
|
|
15
|
+
let field = '';
|
|
16
|
+
let ids = [];
|
|
17
|
+
for (const [key, value] of params.entries()) {
|
|
18
|
+
if (!value.startsWith('in:'))
|
|
19
|
+
continue;
|
|
20
|
+
if (field || value.includes('@'))
|
|
21
|
+
return null;
|
|
22
|
+
field = key;
|
|
23
|
+
ids = value
|
|
24
|
+
.slice(3)
|
|
25
|
+
.split(',')
|
|
26
|
+
.map((id) => id.trim())
|
|
27
|
+
.filter(Boolean);
|
|
28
|
+
}
|
|
29
|
+
if (!field || ids.length === 0)
|
|
30
|
+
return null;
|
|
31
|
+
const keys = [...new Set(params.keys())].sort();
|
|
32
|
+
const bits = keys.map((key) => `${key}=${key === field ? 'in:$1' : (params.get(key) ?? '')}`);
|
|
33
|
+
return { field, ids, shape: `t:${model}?${bits.join('&')}` };
|
|
34
|
+
}
|
|
35
|
+
function entityKey(scope, shape, id) {
|
|
36
|
+
return `${scope}\n${shape}\n${id}`;
|
|
37
|
+
}
|
|
38
|
+
function replaceInIds(token, field, ids) {
|
|
39
|
+
const q = token.indexOf('?');
|
|
40
|
+
const params = new URLSearchParams(token.slice(q + 1));
|
|
41
|
+
params.set(field, `in:${ids.join(',')}`);
|
|
42
|
+
return `${token.slice(0, q)}?${params.toString()}`;
|
|
43
|
+
}
|
|
44
|
+
/** Drops ids already cached for this shape. An empty wire means nothing has to travel. */
|
|
45
|
+
export function narrowInToken(token, now = Date.now()) {
|
|
46
|
+
const parsed = splitInToken(token);
|
|
47
|
+
if (!parsed)
|
|
48
|
+
return null;
|
|
49
|
+
const scope = cacheScope();
|
|
50
|
+
const rows = [];
|
|
51
|
+
const missingIds = [];
|
|
52
|
+
for (const id of parsed.ids) {
|
|
53
|
+
const hit = entityCache.get(entityKey(scope, parsed.shape, id));
|
|
54
|
+
if (!hit || now - hit.at >= ENTITY_TTL_MS) {
|
|
55
|
+
missingIds.push(id);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (hit.row)
|
|
59
|
+
rows.push(hit.row);
|
|
60
|
+
}
|
|
61
|
+
if (missingIds.length === parsed.ids.length)
|
|
62
|
+
return null;
|
|
63
|
+
return {
|
|
64
|
+
wire: missingIds.length === 0 ? '' : replaceInIds(token, parsed.field, missingIds),
|
|
65
|
+
rows,
|
|
66
|
+
missingIds,
|
|
67
|
+
field: parsed.field,
|
|
68
|
+
shape: parsed.shape,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/** Stores one row per requested id. An id with no row is remembered as empty. */
|
|
72
|
+
export function rememberInRows(token, ids, rows, now = Date.now()) {
|
|
73
|
+
const parsed = splitInToken(token);
|
|
74
|
+
if (!parsed)
|
|
75
|
+
return;
|
|
76
|
+
const scope = cacheScope();
|
|
77
|
+
const seen = new Set();
|
|
78
|
+
if (Array.isArray(rows)) {
|
|
79
|
+
for (const row of rows) {
|
|
80
|
+
if (!row || typeof row !== 'object')
|
|
81
|
+
continue;
|
|
82
|
+
const id = String(row[parsed.field] ?? '').trim();
|
|
83
|
+
if (!id)
|
|
84
|
+
continue;
|
|
85
|
+
seen.add(id);
|
|
86
|
+
entityCache.set(entityKey(scope, parsed.shape, id), {
|
|
87
|
+
row: row,
|
|
88
|
+
at: now,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
for (const id of ids) {
|
|
93
|
+
if (seen.has(id))
|
|
94
|
+
continue;
|
|
95
|
+
entityCache.set(entityKey(scope, parsed.shape, id), { row: null, at: now });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
export function resetQueryBatchCache() {
|
|
99
|
+
partCache.clear();
|
|
100
|
+
entityCache.clear();
|
|
101
|
+
waiters = [];
|
|
102
|
+
if (timer != null)
|
|
103
|
+
clearTimeout(timer);
|
|
104
|
+
timer = null;
|
|
105
|
+
}
|
|
106
|
+
let waiters = [];
|
|
107
|
+
let timer = null;
|
|
108
|
+
let transport = null;
|
|
109
|
+
function mergeCachedRows(cached, part) {
|
|
110
|
+
if (!cached?.length)
|
|
111
|
+
return part;
|
|
112
|
+
const fresh = Array.isArray(part.data) ? part.data : [];
|
|
113
|
+
return { ...part, data: [...cached, ...fresh] };
|
|
114
|
+
}
|
|
115
|
+
function cacheScope() {
|
|
116
|
+
if (typeof localStorage === 'undefined')
|
|
117
|
+
return '';
|
|
118
|
+
try {
|
|
119
|
+
const raw = localStorage.getItem('auth_user');
|
|
120
|
+
if (!raw)
|
|
121
|
+
return '';
|
|
122
|
+
return String(JSON.parse(raw).organization_id ?? '');
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return '';
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
export function optionsModelFromUrl(url) {
|
|
129
|
+
const match = url.match(/^\/options\/([A-Za-z][A-Za-z0-9_]*)$/);
|
|
130
|
+
return match ? match[1] : null;
|
|
131
|
+
}
|
|
132
|
+
export function optionsBatchToken(model, field, query, limit, filter) {
|
|
133
|
+
const params = new URLSearchParams();
|
|
134
|
+
params.set('field', field);
|
|
135
|
+
if (query)
|
|
136
|
+
params.set('q', query);
|
|
137
|
+
if (typeof limit === 'number' && limit > 0)
|
|
138
|
+
params.set('limit', String(limit));
|
|
139
|
+
if (filter)
|
|
140
|
+
params.set('filter_value', filter);
|
|
141
|
+
return `o:${model}?${params.toString()}`;
|
|
142
|
+
}
|
|
143
|
+
/** Names each distinct token so the server can key the response. */
|
|
144
|
+
export function nameBatchTokens(tokens) {
|
|
145
|
+
const unique = [];
|
|
146
|
+
const seen = new Set();
|
|
147
|
+
for (const token of tokens) {
|
|
148
|
+
if (seen.has(token))
|
|
149
|
+
continue;
|
|
150
|
+
seen.add(token);
|
|
151
|
+
unique.push(token);
|
|
152
|
+
}
|
|
153
|
+
return unique.map((token, index) => {
|
|
154
|
+
const name = `q${index + 1}`;
|
|
155
|
+
return { name, token, plan: `${name}=${token}` };
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
export function loadQueryPart(api, token) {
|
|
159
|
+
const cached = partCache.get(`${cacheScope()}\n${token}`);
|
|
160
|
+
if (cached && Date.now() - cached.at < PART_TTL_MS && cached.part.success) {
|
|
161
|
+
return Promise.resolve(cached.part);
|
|
162
|
+
}
|
|
163
|
+
const narrowed = narrowInToken(token);
|
|
164
|
+
if (narrowed && narrowed.wire === '') {
|
|
165
|
+
return Promise.resolve({ success: true, data: narrowed.rows, meta: { total: narrowed.rows.length } });
|
|
166
|
+
}
|
|
167
|
+
return new Promise((resolve, reject) => {
|
|
168
|
+
transport = api;
|
|
169
|
+
waiters.push({
|
|
170
|
+
token,
|
|
171
|
+
wire: narrowed?.wire ?? token,
|
|
172
|
+
resolve,
|
|
173
|
+
reject,
|
|
174
|
+
cachedRows: narrowed?.rows,
|
|
175
|
+
missingIds: narrowed?.missingIds,
|
|
176
|
+
field: narrowed?.field,
|
|
177
|
+
});
|
|
178
|
+
if (timer == null)
|
|
179
|
+
timer = setTimeout(() => void flushQueryBatch(), WINDOW_MS);
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
async function flushQueryBatch() {
|
|
183
|
+
timer = null;
|
|
184
|
+
const batch = waiters;
|
|
185
|
+
waiters = [];
|
|
186
|
+
const api = transport;
|
|
187
|
+
if (!api || batch.length === 0)
|
|
188
|
+
return;
|
|
189
|
+
const named = nameBatchTokens(batch.map((waiter) => waiter.wire));
|
|
190
|
+
const byToken = new Map(named.map((part) => [part.token, part.name]));
|
|
191
|
+
const inm = {};
|
|
192
|
+
const scope = cacheScope();
|
|
193
|
+
for (const part of named) {
|
|
194
|
+
const cached = partCache.get(`${scope}\n${part.token}`);
|
|
195
|
+
if (cached?.part.etag)
|
|
196
|
+
inm[part.name] = cached.part.etag;
|
|
197
|
+
}
|
|
198
|
+
try {
|
|
199
|
+
const res = await api.post('/q', { parts: named.map((part) => part.plan), inm });
|
|
200
|
+
const body = res?.data;
|
|
201
|
+
if (!body || body.success !== true || !body.parts) {
|
|
202
|
+
throw new Error('batch unavailable');
|
|
203
|
+
}
|
|
204
|
+
for (const waiter of batch) {
|
|
205
|
+
const name = byToken.get(waiter.wire);
|
|
206
|
+
const part = name ? body.parts[name] : undefined;
|
|
207
|
+
if (!part) {
|
|
208
|
+
waiter.reject(new Error('batch part missing'));
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
if (part.not_modified) {
|
|
212
|
+
const cached = partCache.get(`${scope}\n${waiter.token}`);
|
|
213
|
+
if (cached) {
|
|
214
|
+
waiter.resolve(cached.part);
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
const merged = mergeCachedRows(waiter.cachedRows, part);
|
|
219
|
+
if (waiter.missingIds && waiter.field) {
|
|
220
|
+
rememberInRows(waiter.token, waiter.missingIds, part.data);
|
|
221
|
+
}
|
|
222
|
+
if (part.success) {
|
|
223
|
+
partCache.set(`${scope}\n${waiter.token}`, { part: merged, at: Date.now() });
|
|
224
|
+
}
|
|
225
|
+
waiter.resolve(merged);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
230
|
+
for (const waiter of batch)
|
|
231
|
+
waiter.reject(error);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
function canonicalParams(params) {
|
|
235
|
+
if (!params)
|
|
236
|
+
return '';
|
|
237
|
+
const keys = Object.keys(params)
|
|
238
|
+
.filter((key) => params[key] != null && params[key] !== '')
|
|
239
|
+
.sort();
|
|
240
|
+
const search = new URLSearchParams();
|
|
241
|
+
for (const key of keys)
|
|
242
|
+
search.set(key, String(params[key]));
|
|
243
|
+
return search.toString();
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Token for a host GET that the batch can serve. Custom endpoints, aggregates
|
|
247
|
+
* and `/me` stay on the legacy GET.
|
|
248
|
+
*/
|
|
249
|
+
export function tokenForGet(url, params) {
|
|
250
|
+
const [path, query = ''] = url.split('?');
|
|
251
|
+
const table = path.match(/^\/metadata\/table\/([A-Za-z][A-Za-z0-9_]*)$/);
|
|
252
|
+
if (table)
|
|
253
|
+
return `m:${table[1]}`;
|
|
254
|
+
const modal = path.match(/^\/metadata\/modal\/([A-Za-z][A-Za-z0-9_]*)$/);
|
|
255
|
+
if (modal)
|
|
256
|
+
return `mm:${modal[1]}`;
|
|
257
|
+
const list = path.match(/^\/data\/([A-Za-z][A-Za-z0-9_]*)$/);
|
|
258
|
+
if (list) {
|
|
259
|
+
const q = canonicalParams(params);
|
|
260
|
+
return q ? `t:${list[1]}?${q}` : `t:${list[1]}`;
|
|
261
|
+
}
|
|
262
|
+
const opt = path.match(/^\/options\/([A-Za-z][A-Za-z0-9_]*)$/);
|
|
263
|
+
if (!opt)
|
|
264
|
+
return null;
|
|
265
|
+
const search = new URLSearchParams(query);
|
|
266
|
+
if (params) {
|
|
267
|
+
for (const [key, value] of Object.entries(params)) {
|
|
268
|
+
if (value != null && value !== '')
|
|
269
|
+
search.set(key, String(value));
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
const limit = Number(search.get('limit'));
|
|
273
|
+
return optionsBatchToken(opt[1], search.get('field') || 'id', search.get('q') || search.get('search') || '', Number.isFinite(limit) && limit > 0 ? limit : undefined, search.get('filter_value') || undefined);
|
|
274
|
+
}
|
|
275
|
+
function batchForbidden(message) {
|
|
276
|
+
return /forbidden|permiso/i.test(message || '');
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* GET through the batch when the URL is a list, table metadata, modal metadata
|
|
280
|
+
* or options read. Anything the batch refuses falls back to the original GET.
|
|
281
|
+
*/
|
|
282
|
+
export async function batchGet(api, url, config) {
|
|
283
|
+
const token = tokenForGet(url, config?.params);
|
|
284
|
+
if (!token)
|
|
285
|
+
return api.get(url, config);
|
|
286
|
+
try {
|
|
287
|
+
const part = await loadQueryPart(api, token);
|
|
288
|
+
if (!part.success) {
|
|
289
|
+
if (batchForbidden(part.message)) {
|
|
290
|
+
const err = new Error(part.message || 'forbidden');
|
|
291
|
+
err.status = 403;
|
|
292
|
+
err.response = { status: 403 };
|
|
293
|
+
throw err;
|
|
294
|
+
}
|
|
295
|
+
return api.get(url, config);
|
|
296
|
+
}
|
|
297
|
+
return { data: { success: true, data: part.data, meta: part.meta } };
|
|
298
|
+
}
|
|
299
|
+
catch (err) {
|
|
300
|
+
const status = err?.status
|
|
301
|
+
?? err?.response?.status;
|
|
302
|
+
if (status === 403)
|
|
303
|
+
throw err;
|
|
304
|
+
return api.get(url, config);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-options-resolver.d.ts","sourceRoot":"","sources":["../src/use-options-resolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-options-resolver.d.ts","sourceRoot":"","sources":["../src/use-options-resolver.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,cAAc;IAC3B,8CAA8C;IAC9C,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,2DAA2D;IAC3D,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AAED,MAAM,WAAW,WAAW;IACxB,oEAAoE;IACpE,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAA;IACnC,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,sBAAsB;IACnC;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,wBAAwB;IACrC,OAAO,EAAE,cAAc,EAAE,CAAA;IACzB,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,8DAA8D;IAC9D,OAAO,EAAE,MAAM,IAAI,CAAA;CACtB;AAoBD,wBAAgB,iBAAiB,CAC7B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,MAAM,GAAG,SAAS,GAC3B,MAAM,CAER;AA8BD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,GAAG,wBAAwB,CA4JzF;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,cAAc,CAatD"}
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
// free; legacy callers that still ship `searchEndpoint` keep working.
|
|
13
13
|
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
14
14
|
import { useApi } from './api-context';
|
|
15
|
+
import { loadQueryPart, optionsBatchToken, optionsModelFromUrl } from './query-batch';
|
|
15
16
|
/**
|
|
16
17
|
* Resolves select options for a field via the canonical
|
|
17
18
|
* `/api/options/:model?field=…` endpoint. Returns the v0.9.0 envelope
|
|
@@ -126,7 +127,32 @@ export function useOptionsResolver(args) {
|
|
|
126
127
|
params.limit = limit;
|
|
127
128
|
if (filterValue)
|
|
128
129
|
params.filter_value = filterValue;
|
|
129
|
-
|
|
130
|
+
const model = optionsModelFromUrl(url);
|
|
131
|
+
pending = (async () => {
|
|
132
|
+
if (model) {
|
|
133
|
+
try {
|
|
134
|
+
const part = await loadQueryPart(api, optionsBatchToken(model, effectiveField, query ?? '', limit, filterValue));
|
|
135
|
+
if (!part.success) {
|
|
136
|
+
throw new Error(part.message || 'options resolver: unsuccessful response');
|
|
137
|
+
}
|
|
138
|
+
const payload = readOptionsEnvelope({
|
|
139
|
+
success: true,
|
|
140
|
+
data: part.data,
|
|
141
|
+
meta: part.meta,
|
|
142
|
+
});
|
|
143
|
+
if ((optionsEpoch.get(key) ?? 0) === epoch) {
|
|
144
|
+
optionsCache.set(key, { payload, at: Date.now() });
|
|
145
|
+
}
|
|
146
|
+
return payload;
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
const msg = err instanceof Error ? err.message : '';
|
|
150
|
+
const batchMiss = msg === 'batch unavailable' || msg === 'batch part missing';
|
|
151
|
+
if (!batchMiss)
|
|
152
|
+
throw err;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const res = await api.get(url, { params });
|
|
130
156
|
const body = res.data;
|
|
131
157
|
if (!body || body.success !== true) {
|
|
132
158
|
throw new Error(body?.message || 'options resolver: unsuccessful response');
|
|
@@ -136,7 +162,7 @@ export function useOptionsResolver(args) {
|
|
|
136
162
|
optionsCache.set(key, { payload, at: Date.now() });
|
|
137
163
|
}
|
|
138
164
|
return payload;
|
|
139
|
-
}).finally(() => {
|
|
165
|
+
})().finally(() => {
|
|
140
166
|
if (optionsInflight.get(key) === pending)
|
|
141
167
|
optionsInflight.delete(key);
|
|
142
168
|
});
|