import { findValueInEnum, parseBoolean } from "@saleor/misc"; import { TableCellHeaderArrowDirection } from "../components/TableCellHeader"; import { Sort } from "../types"; import { OrderDirection } from "../types/globalTypes"; 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; type GetSortQueryVariables< TSortField extends string, TParams extends Record > = (params: TParams) => SortingInput; 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; }; }