Skip to content

Commit 0a9c991

Browse files
committed
Enhance sorting functionality in ObjectStackAdapter and ListView; support multiple sort formats in QueryParams
1 parent 508ac7c commit 0a9c991

File tree

3 files changed

+24
-8
lines changed

3 files changed

+24
-8
lines changed

packages/data-objectstack/src/index.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -505,10 +505,22 @@ export class ObjectStackAdapter<T = unknown> implements DataSource<T> {
505505

506506
// Sorting - convert to ObjectStack format
507507
if (params.$orderby) {
508-
const sortArray = Object.entries(params.$orderby).map(([field, order]) => {
509-
return order === 'desc' ? `-${field}` : field;
510-
});
511-
options.sort = sortArray;
508+
if (Array.isArray(params.$orderby)) {
509+
// Handle array format ['name', '-age'] or [{ field: 'name', order: 'asc' }]
510+
options.sort = params.$orderby.map(item => {
511+
if (typeof item === 'string') return item;
512+
// Handle object format { field: 'name', order: 'desc' }
513+
const field = item.field;
514+
const order = item.order || 'asc';
515+
return order === 'desc' ? `-${field}` : field;
516+
});
517+
} else {
518+
// Handle Record format { name: 'asc', age: 'desc' }
519+
const sortArray = Object.entries(params.$orderby).map(([field, order]) => {
520+
return order === 'desc' ? `-${field}` : field;
521+
});
522+
options.sort = sortArray;
523+
}
512524
}
513525

514526
// Pagination

packages/plugin-list/src/ListView.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,11 @@ export const ListView: React.FC<ListViewProps> = ({
147147
}
148148

149149
// Convert sort to query format
150-
// ObjectQL uses simple object: { field: 'asc' }
151-
const sort: any = currentSort.length > 0
152-
? currentSort.reduce((acc, item) => ({ ...acc, [item.field]: item.order }), {})
150+
// Use array format to ensure order is preserved (Object keys are not guaranteed ordered)
151+
const sort: any = currentSort.length > 0
152+
? currentSort
153+
.filter(item => item.field) // Ensure field is selected
154+
.map(item => ({ field: item.field, order: item.order }))
153155
: undefined;
154156

155157
const results = await dataSource.find(schema.objectName, {

packages/types/src/data.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,11 @@ export interface QueryParams {
3535

3636
/**
3737
* Sort order
38+
* Can be a Map { field: 'asc' }, an Array of strings ['field', '-field'], or Array of sort objects
3839
* @example { createdAt: 'desc', name: 'asc' }
40+
* @example ['name', '-createdAt']
3941
*/
40-
$orderby?: Record<string, 'asc' | 'desc'>;
42+
$orderby?: Record<string, 'asc' | 'desc'> | string[] | Array<{ field: string; order?: 'asc' | 'desc' }>;
4143

4244
/**
4345
* Number of records to skip (for pagination)

0 commit comments

Comments
 (0)