import { OrderDirection } from "@dashboard/graphql"; import { findValueInEnum, parseBoolean } from "@dashboard/misc"; import { TableCellHeaderArrowDirection } from "../components/TableCellHeader"; import { Sort } from "../types"; export function getSortUrlVariables( field: TSortKey, params: Sort, ): Sort { if (field === params.sort) { return { asc: !params.asc, sort: field, }; } return { asc: true, sort: field, }; } export function getOrderDirection(asc: boolean): OrderDirection { return asc ? OrderDirection.ASC : OrderDirection.DESC; } export function getArrowDirection(asc: boolean): TableCellHeaderArrowDirection { return asc ? "asc" : "desc"; } // Extracts Sort object from the querystring export function getSortParams< TParams extends Sort, TFields extends string, >(params: TParams): Sort { return { asc: params.asc, sort: params.sort, }; } // Appends Sort object to the querystring params export function asSortParams< TParams extends Record, TFields extends Record, >( params: TParams, fields: TFields, defaultField?: keyof TFields, defaultOrder?: boolean, ): TParams & Sort { return { ...params, asc: parseBoolean( params.asc, defaultOrder === undefined ? true : defaultOrder, ), sort: params.sort ? findValueInEnum(params.sort, fields) : defaultField?.toString() || "name", }; } interface SortingInput { direction: OrderDirection; field: T; } type GetSortQueryField = ( sort: TUrlField, ) => TSortField | undefined; type GetSortQueryVariables< TSortField extends string, TParams extends Record, > = (params: TParams) => SortingInput | undefined; export function createGetSortQueryVariables< TUrlField extends string, TSortField extends string, TParams extends Record, >( getSortQueryField: GetSortQueryField, ): GetSortQueryVariables { return (params: TParams) => { const field = getSortQueryField(params.sort); if (!!field) { return { direction: getOrderDirection(params.asc), field, }; } return undefined; }; }