diff --git a/packages/api/src/utils/search.ts b/packages/api/src/utils/search.ts index 5eadf9e11..4769e4638 100644 --- a/packages/api/src/utils/search.ts +++ b/packages/api/src/utils/search.ts @@ -5,8 +5,8 @@ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ import { parse, - SearchParserTextOffset, SearchParserKeyWordOffset, + SearchParserTextOffset, } from 'search-query-parser' import { PageType } from '../generated/graphql' @@ -27,6 +27,7 @@ export type SearchFilter = { inFilter: InFilter readFilter: ReadFilter typeFilter?: PageType | undefined + labelFilters?: string[] } const parseIsFilter = (str: string | undefined): ReadFilter => { @@ -77,6 +78,17 @@ const parseTypeFilter = (str: string | undefined): PageType | undefined => { return undefined } +const parseLabelFilters = ( + str: string | undefined, + labelFilters: string[] | undefined +): string[] | undefined => { + if (str === undefined) { + return labelFilters + } + + return labelFilters ? labelFilters.concat(str) : [str] +} + export const parseSearchQuery = (query: string | undefined): SearchFilter => { const searchQuery = query ? query.replace(/\W\s":/g, '') : undefined const result: SearchFilter = { @@ -94,7 +106,7 @@ export const parseSearchQuery = (query: string | undefined): SearchFilter => { } const parsed = parse(searchQuery, { - keywords: ['in', 'is', 'type'], + keywords: ['in', 'is', 'type', 'label'], tokenize: true, }) if (parsed.offsets) { @@ -133,6 +145,12 @@ export const parseSearchQuery = (query: string | undefined): SearchFilter => { case 'type': result.typeFilter = parseTypeFilter(keyword.value) break + case 'label': + result.labelFilters = parseLabelFilters( + keyword.value, + result.labelFilters + ) + break } } }