@cmk/fe_utils
Version:
frontend utility library
120 lines (111 loc) • 3.93 kB
text/typescript
import { GenericFilterType } from './types'
import { TableUiType } from './useTableController'
export type MakeFilterUrlParams = {
url: string
searchValue?: string
externalFilters?: GenericFilterType[]
disablePagination?: boolean
preprocessFilters?: (filters: GenericFilterType[]) => GenericFilterType[]
postprocessFilters?: (filters: GenericFilterType[]) => GenericFilterType[]
searchParamIn?: TableUiType['searchParam']
filters?: TableUiType['filters']
pageNumber: number
itemsPerPage: number
}
export const makeFilterUrl = (params: MakeFilterUrlParams) => {
const {
url,
searchValue,
externalFilters,
disablePagination,
preprocessFilters,
postprocessFilters,
searchParamIn,
filters,
pageNumber = 1,
itemsPerPage = 20,
} = params
const searchParam = searchValue ?? searchParamIn
const searchTerms = !searchParam
? ''
: 'search_term=' +
searchParam
.split(' ')
.filter((searchTerm) => searchTerm !== '')
.join('&search_term=')
const transformedExternalFilters =
preprocessFilters && externalFilters
? preprocessFilters?.(externalFilters)
: externalFilters
const transformedInternalFilters = preprocessFilters
? preprocessFilters?.(filters ?? [])
: filters
const adjInternalFilters = transformedInternalFilters?.filter((uiFilter) =>
!transformedExternalFilters?.length
? true
: !transformedExternalFilters?.find(
(externalFilter) => externalFilter.filterKey === uiFilter?.filterKey
) ||
transformedExternalFilters?.find(
(externalFilter) =>
externalFilter.filterKey === uiFilter?.filterKey &&
uiFilter?.value === externalFilter?.value
)
)
const adjPostProcessedInternalFilters = postprocessFilters
? postprocessFilters(adjInternalFilters ?? [])
: adjInternalFilters
const filterTermArray = adjPostProcessedInternalFilters?.map(
(filter, fIdx) => `${!fIdx ? '' : '&'}${filter?.filterKey}=${filter.value}`
)
const filterTerms = filterTermArray?.join?.('') || ''
const externalFilterTermArray = (
transformedExternalFilters?.length
? transformedExternalFilters?.filter(
(externalFilter) =>
!transformedInternalFilters?.find(
(uiFilter) => uiFilter?.filterKey === externalFilter.filterKey //&& uiFilter?.value === externalFilter?.value
)
)
: []
)
// ? []
// : transformedExternalFilters
?.map(
(externalFilter, eIdx) =>
`${!eIdx ? '' : '&'}${externalFilter?.filterKey}=${
externalFilter.value
}`
)
const externalFilterTerms = externalFilterTermArray?.join?.('') ?? ''
const fullUrl = disablePagination
? `${url}?${searchTerms}${
filterTerms && searchTerms ? '&' : ''
}${filterTerms}${
externalFilterTerms && (searchTerms || filterTerms) ? '&' : ''
}${externalFilterTerms}`
: `${url}?page_number=${pageNumber}&page_size=${itemsPerPage}${
searchTerms ? '&' : ''
}${searchTerms}${filterTerms ? '&' : ''}${filterTerms}${
externalFilterTerms ? '&' : ''
}${externalFilterTerms}`
const paramsString = disablePagination
? `${searchTerms}${filterTerms && searchTerms ? '&' : ''}${filterTerms}${
externalFilterTerms && (searchTerms || filterTerms) ? '&' : ''
}${externalFilterTerms}`
: `page_number=${pageNumber}&page_size=${itemsPerPage}${
searchTerms ? '&' : ''
}${searchTerms}${filterTerms ? '&' : ''}${filterTerms}${
externalFilterTerms ? '&' : ''
}${externalFilterTerms}`
const unpaginatedParamsString = `${searchTerms}${
!searchTerms ? '' : '&'
}${filterTerms}${
(!searchTerms && !filterTerms) || !externalFilterTerms ? '' : '&'
}${externalFilterTerms}`
return {
fullUrl,
paramsString,
unpaginatedParamsString,
}
}