Support orderBy as array (#5681)
closes: #4301 --------- Co-authored-by: Félix Malfait <felix.malfait@gmail.com>
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
import { OrderBy } from '@/object-metadata/types/OrderBy';
|
||||
|
||||
export type RecordGqlOperationOrderBy = {
|
||||
export type RecordGqlOperationOrderBy = Array<{
|
||||
[fieldName: string]: OrderBy | { [subFieldName: string]: OrderBy };
|
||||
};
|
||||
}>;
|
||||
|
||||
@ -5,7 +5,7 @@ import { RecoilRoot } from 'recoil';
|
||||
import { useFindManyRecordsQuery } from '@/object-record/hooks/useFindManyRecordsQuery';
|
||||
|
||||
const expectedQueryTemplate = `
|
||||
query FindManyPeople($filter: PersonFilterInput, $orderBy: PersonOrderByInput, $lastCursor: String, $limit: Int) {
|
||||
query FindManyPeople($filter: PersonFilterInput, $orderBy: [PersonOrderByInput], $lastCursor: String, $limit: Int) {
|
||||
people(filter: $filter, orderBy: $orderBy, first: $limit, after: $lastCursor) {
|
||||
edges {
|
||||
node {
|
||||
|
||||
@ -32,9 +32,9 @@ export const useGenerateCombinedFindManyRecordsQuery = ({
|
||||
const orderByPerMetadataItemArray = operationSignatures
|
||||
.map(
|
||||
({ objectNameSingular }) =>
|
||||
`$orderBy${capitalize(objectNameSingular)}: ${capitalize(
|
||||
`$orderBy${capitalize(objectNameSingular)}: [${capitalize(
|
||||
objectNameSingular,
|
||||
)}OrderByInput`,
|
||||
)}OrderByInput]`,
|
||||
)
|
||||
.join(', ');
|
||||
|
||||
|
||||
@ -30,9 +30,11 @@ describe('turnSortsIntoOrderBy', () => {
|
||||
it('should sort by recordPosition if no sorts', () => {
|
||||
const fields = [{ id: 'field1', name: 'createdAt' }] as FieldMetadataItem[];
|
||||
expect(turnSortsIntoOrderBy({ ...objectMetadataItem, fields }, [])).toEqual(
|
||||
{
|
||||
position: 'AscNullsFirst',
|
||||
},
|
||||
[
|
||||
{
|
||||
position: 'AscNullsFirst',
|
||||
},
|
||||
],
|
||||
);
|
||||
});
|
||||
|
||||
@ -47,10 +49,7 @@ describe('turnSortsIntoOrderBy', () => {
|
||||
const fields = [{ id: 'field1', name: 'field1' }] as FieldMetadataItem[];
|
||||
expect(
|
||||
turnSortsIntoOrderBy({ ...objectMetadataItem, fields }, sorts),
|
||||
).toEqual({
|
||||
field1: 'AscNullsFirst',
|
||||
position: 'AscNullsFirst',
|
||||
});
|
||||
).toEqual([{ field1: 'AscNullsFirst' }, { position: 'AscNullsFirst' }]);
|
||||
});
|
||||
|
||||
it('should create OrderByField with multiple sorts', () => {
|
||||
@ -72,11 +71,11 @@ describe('turnSortsIntoOrderBy', () => {
|
||||
] as FieldMetadataItem[];
|
||||
expect(
|
||||
turnSortsIntoOrderBy({ ...objectMetadataItem, fields }, sorts),
|
||||
).toEqual({
|
||||
field1: 'AscNullsFirst',
|
||||
field2: 'DescNullsLast',
|
||||
position: 'AscNullsFirst',
|
||||
});
|
||||
).toEqual([
|
||||
{ field1: 'AscNullsFirst' },
|
||||
{ field2: 'DescNullsLast' },
|
||||
{ position: 'AscNullsFirst' },
|
||||
]);
|
||||
});
|
||||
|
||||
it('should ignore if field not found', () => {
|
||||
@ -87,9 +86,9 @@ describe('turnSortsIntoOrderBy', () => {
|
||||
definition: sortDefinition,
|
||||
},
|
||||
];
|
||||
expect(turnSortsIntoOrderBy(objectMetadataItem, sorts)).toEqual({
|
||||
position: 'AscNullsFirst',
|
||||
});
|
||||
expect(turnSortsIntoOrderBy(objectMetadataItem, sorts)).toEqual([
|
||||
{ position: 'AscNullsFirst' },
|
||||
]);
|
||||
});
|
||||
|
||||
it('should not return position for remotes', () => {
|
||||
@ -102,6 +101,6 @@ describe('turnSortsIntoOrderBy', () => {
|
||||
];
|
||||
expect(
|
||||
turnSortsIntoOrderBy({ ...objectMetadataItem, isRemote: true }, sorts),
|
||||
).toEqual({});
|
||||
).toEqual([]);
|
||||
});
|
||||
});
|
||||
|
||||
@ -15,28 +15,23 @@ export const turnSortsIntoOrderBy = (
|
||||
): RecordGqlOperationOrderBy => {
|
||||
const fields: Pick<Field, 'id' | 'name'>[] = objectMetadataItem?.fields ?? [];
|
||||
const fieldsById = mapArrayToObject(fields, ({ id }) => id);
|
||||
const sortsOrderBy = Object.fromEntries(
|
||||
sorts
|
||||
.map((sort) => {
|
||||
const correspondingField = fieldsById[sort.fieldMetadataId];
|
||||
const sortsOrderBy = sorts
|
||||
.map((sort) => {
|
||||
const correspondingField = fieldsById[sort.fieldMetadataId];
|
||||
|
||||
if (isUndefinedOrNull(correspondingField)) {
|
||||
return undefined;
|
||||
}
|
||||
if (isUndefinedOrNull(correspondingField)) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const direction: OrderBy =
|
||||
sort.direction === 'asc' ? 'AscNullsFirst' : 'DescNullsLast';
|
||||
const direction: OrderBy =
|
||||
sort.direction === 'asc' ? 'AscNullsFirst' : 'DescNullsLast';
|
||||
|
||||
return [correspondingField.name, direction];
|
||||
})
|
||||
.filter(isDefined),
|
||||
);
|
||||
return { [correspondingField.name]: direction };
|
||||
})
|
||||
.filter(isDefined);
|
||||
|
||||
if (hasPositionField(objectMetadataItem)) {
|
||||
return {
|
||||
...sortsOrderBy,
|
||||
position: 'AscNullsFirst',
|
||||
};
|
||||
return [...sortsOrderBy, { position: 'AscNullsFirst' }];
|
||||
}
|
||||
|
||||
return sortsOrderBy;
|
||||
|
||||
@ -11,7 +11,7 @@ import { FieldMetadataType } from '~/generated/graphql';
|
||||
const query = gql`
|
||||
query CombinedFindManyRecords(
|
||||
$filterNameSingular: NameSingularFilterInput
|
||||
$orderByNameSingular: NameSingularOrderByInput
|
||||
$orderByNameSingular: [NameSingularOrderByInput]
|
||||
$lastCursorNameSingular: String
|
||||
$limitNameSingular: Int
|
||||
) {
|
||||
@ -50,7 +50,7 @@ const mocks = [
|
||||
query,
|
||||
variables: {
|
||||
filterNameSingular: { id: { in: ['1'] } },
|
||||
orderByNameSingular: { createdAt: 'DescNullsLast' },
|
||||
orderByNameSingular: [{ createdAt: 'DescNullsLast' }],
|
||||
limitNameSingular: 60,
|
||||
},
|
||||
},
|
||||
@ -63,7 +63,7 @@ const mocks = [
|
||||
query,
|
||||
variables: {
|
||||
filterNameSingular: { and: [{}, { id: { in: ['1'] } }] },
|
||||
orderByNameSingular: { createdAt: 'DescNullsLast' },
|
||||
orderByNameSingular: [{ createdAt: 'DescNullsLast' }],
|
||||
limitNameSingular: 60,
|
||||
},
|
||||
},
|
||||
@ -77,7 +77,7 @@ const mocks = [
|
||||
variables: {
|
||||
limitNameSingular: 60,
|
||||
filterNameSingular: { not: { id: { in: ['1'] } } },
|
||||
orderByNameSingular: { createdAt: 'DescNullsLast' },
|
||||
orderByNameSingular: [{ createdAt: 'DescNullsLast' }],
|
||||
},
|
||||
},
|
||||
result: jest.fn(() => ({
|
||||
|
||||
@ -16,9 +16,7 @@ export const useOrderByFieldPerMetadataItem = ({
|
||||
|
||||
return [
|
||||
`orderBy${capitalize(objectMetadataItem.nameSingular)}`,
|
||||
{
|
||||
...orderByField,
|
||||
},
|
||||
[...orderByField],
|
||||
];
|
||||
})
|
||||
.filter(isDefined),
|
||||
|
||||
@ -21,9 +21,9 @@ query FindMany${capitalize(
|
||||
objectMetadataItem.namePlural,
|
||||
)}($filter: ${capitalize(
|
||||
objectMetadataItem.nameSingular,
|
||||
)}FilterInput, $orderBy: ${capitalize(
|
||||
)}FilterInput, $orderBy: [${capitalize(
|
||||
objectMetadataItem.nameSingular,
|
||||
)}OrderByInput, $lastCursor: String, $limit: Int) {
|
||||
)}OrderByInput], $lastCursor: String, $limit: Int) {
|
||||
${
|
||||
objectMetadataItem.namePlural
|
||||
}(filter: $filter, orderBy: $orderBy, first: $limit, after: $lastCursor){
|
||||
|
||||
Reference in New Issue
Block a user