Skip to content

Commit 00dbc4e

Browse files
atrakhConvex, Inc.
authored and
Convex, Inc.
committed
dashboard: fix parsing of paginated table documents index values (#37320)
GitOrigin-RevId: b8c3f7c87ae10f7c5bb1d0b6d111be9b9b7792bf
1 parent ade1327 commit 00dbc4e

File tree

1 file changed

+35
-6
lines changed
  • npm-packages/system-udfs/convex/_system/frontend/lib

1 file changed

+35
-6
lines changed

npm-packages/system-udfs/convex/_system/frontend/lib/filters.ts

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,16 @@ export type FilterCommon = {
2828
export type FilterByIndex = {
2929
type: "indexEq";
3030
enabled: boolean;
31-
value?: Value;
31+
value?: JSONValue | Value;
3232
};
3333

3434
export type FilterByIndexRange = {
3535
type: "indexRange";
3636
enabled: boolean;
3737
lowerOp?: "gte" | "gt";
38-
lowerValue?: Value;
38+
lowerValue?: JSONValue | Value;
3939
upperOp?: "lte" | "lt";
40-
upperValue?: Value;
40+
upperValue?: JSONValue | Value;
4141
};
4242

4343
export type FilterByBuiltin = {
@@ -300,7 +300,9 @@ export function applyIndexFilters(
300300
if (filter.type === "indexEq") {
301301
builder = builder.eq(
302302
selectedIndex.fields[i],
303-
filter.value === UNDEFINED_PLACEHOLDER ? undefined : filter.value,
303+
filter.value === UNDEFINED_PLACEHOLDER
304+
? undefined
305+
: jsonToConvexOrValue(filter.value),
304306
);
305307
} else {
306308
if (i !== enabledClauses.length - 1) {
@@ -311,15 +313,15 @@ export function applyIndexFilters(
311313
selectedIndex.fields[i],
312314
filter.lowerValue === UNDEFINED_PLACEHOLDER
313315
? undefined
314-
: filter.lowerValue,
316+
: jsonToConvexOrValue(filter.lowerValue),
315317
);
316318
}
317319
if (filter.upperOp) {
318320
builder = builder[filter.upperOp](
319321
selectedIndex.fields[i],
320322
filter.upperValue === UNDEFINED_PLACEHOLDER
321323
? undefined
322-
: filter.upperValue,
324+
: jsonToConvexOrValue(filter.upperValue),
323325
);
324326
}
325327
}
@@ -455,3 +457,30 @@ export function findIndexByName(
455457
): Index | undefined {
456458
return indexes.find((i) => i.indexDescriptor === indexName);
457459
}
460+
461+
// If the value is not a valid JSON value, return the value as is.
462+
function jsonToConvexOrValue(
463+
value: JSONValue | Value | undefined,
464+
): Value | undefined {
465+
if (value === undefined) {
466+
return undefined;
467+
}
468+
if (isBigIntOrArrayBufferInValue(value)) {
469+
return value;
470+
}
471+
try {
472+
return jsonToConvex(value);
473+
} catch (e) {
474+
return value;
475+
}
476+
}
477+
478+
// If the value has a bigint or array buffer in it, it's definitely not a JSONValue
479+
function isBigIntOrArrayBufferInValue(
480+
value: JSONValue | Value,
481+
): value is Value {
482+
if (Array.isArray(value)) {
483+
return value.some(isBigIntOrArrayBufferInValue);
484+
}
485+
return typeof value === "bigint" || value instanceof ArrayBuffer;
486+
}

0 commit comments

Comments
 (0)