From a1524f01eb2921cc03975b93fe32411041e9b6e9 Mon Sep 17 00:00:00 2001 From: runarvestmann Date: Tue, 11 Jun 2024 16:13:40 +0000 Subject: [PATCH 01/12] Add filter tags to generic list items --- libs/cms/src/lib/generated/contentfulTypes.d.ts | 10 ++++++++-- libs/cms/src/lib/models/genericList.model.ts | 5 +++++ libs/cms/src/lib/models/genericListItem.model.ts | 5 +++++ .../lib/search/importers/genericListItem.service.ts | 6 +++++- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/libs/cms/src/lib/generated/contentfulTypes.d.ts b/libs/cms/src/lib/generated/contentfulTypes.d.ts index 7bdfdf7dddc8..82c4890c4294 100644 --- a/libs/cms/src/lib/generated/contentfulTypes.d.ts +++ b/libs/cms/src/lib/generated/contentfulTypes.d.ts @@ -1548,6 +1548,9 @@ export interface IGenericListFields { /** Item Type */ itemType?: 'Non-clickable' | 'Clickable' | undefined + + /** Filter Tags */ + filterTags?: IGenericTag[] | undefined } /** A list of items which can be embedded into rich text */ @@ -1585,11 +1588,14 @@ export interface IGenericListItemFields { /** Card Intro */ cardIntro?: Document | undefined + /** Slug */ + slug?: string | undefined + /** Content */ content?: Document | undefined - /** Slug */ - slug?: string | undefined + /** Filter Tags */ + filterTags?: IGenericTag[] | undefined } /** An item that belongs to a generic list */ diff --git a/libs/cms/src/lib/models/genericList.model.ts b/libs/cms/src/lib/models/genericList.model.ts index 48622500262f..71612005b311 100644 --- a/libs/cms/src/lib/models/genericList.model.ts +++ b/libs/cms/src/lib/models/genericList.model.ts @@ -5,6 +5,7 @@ import { CacheField } from '@island.is/nest/graphql' import { IGenericList, IGenericListFields } from '../generated/contentfulTypes' import { GenericListItemResponse } from './genericListItemResponse.model' import { GetGenericListItemsInput } from '../dto/getGenericListItems.input' +import { GenericTag, mapGenericTag } from './genericTag.model' enum GenericListItemType { NonClickable = 'NonClickable', @@ -28,6 +29,9 @@ export class GenericList { @CacheField(() => GenericListItemType, { nullable: true }) itemType?: GenericListItemType + + @CacheField(() => [GenericTag], { nullable: true }) + filterTags?: GenericTag[] } const mapItemType = (itemType?: IGenericListFields['itemType']) => @@ -49,4 +53,5 @@ export const mapGenericList = ({ }, searchInputPlaceholder: fields.searchInputPlaceholder, itemType: mapItemType(fields.itemType), + filterTags: fields.filterTags ? fields.filterTags.map(mapGenericTag) : [], }) diff --git a/libs/cms/src/lib/models/genericListItem.model.ts b/libs/cms/src/lib/models/genericListItem.model.ts index d14c6ebc1a59..5754b3757227 100644 --- a/libs/cms/src/lib/models/genericListItem.model.ts +++ b/libs/cms/src/lib/models/genericListItem.model.ts @@ -3,6 +3,7 @@ import { Field, ID, ObjectType } from '@nestjs/graphql' import { SliceUnion, mapDocument } from '../unions/slice.union' import { GenericList, mapGenericList } from './genericList.model' import { IGenericListItem } from '../generated/contentfulTypes' +import { GenericTag, mapGenericTag } from './genericTag.model' @ObjectType() export class GenericListItem { @@ -26,6 +27,9 @@ export class GenericListItem { @Field(() => String, { nullable: true }) slug?: string + + @CacheField(() => [GenericTag], { nullable: true }) + filterTags?: GenericTag[] } export const mapGenericListItem = ({ @@ -45,4 +49,5 @@ export const mapGenericListItem = ({ ? mapDocument(fields.content, `${sys.id}:content`) : [], slug: fields.slug, + filterTags: fields.filterTags ? fields.filterTags.map(mapGenericTag) : [], }) diff --git a/libs/cms/src/lib/search/importers/genericListItem.service.ts b/libs/cms/src/lib/search/importers/genericListItem.service.ts index 6c8e4981c0c4..88291a7f8f24 100644 --- a/libs/cms/src/lib/search/importers/genericListItem.service.ts +++ b/libs/cms/src/lib/search/importers/genericListItem.service.ts @@ -38,7 +38,11 @@ export class GenericListItemSyncService 2, ) - const tags: MappedData['tags'] = [] + const tags: MappedData['tags'] = + mapped.filterTags?.map((tag) => ({ + type: 'genericTag', + key: tag.id, + })) ?? [] if (mapped.genericList) { tags.push({ From 268808316ba98be1fa89745dca34389664541321 Mon Sep 17 00:00:00 2001 From: runarvestmann Date: Wed, 12 Jun 2024 10:35:32 +0000 Subject: [PATCH 02/12] Add query params --- .../components/GenericList/GenericList.tsx | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/apps/web/components/GenericList/GenericList.tsx b/apps/web/components/GenericList/GenericList.tsx index c81fa54c431b..6b8b777e2168 100644 --- a/apps/web/components/GenericList/GenericList.tsx +++ b/apps/web/components/GenericList/GenericList.tsx @@ -1,7 +1,8 @@ -import { useRef, useState } from 'react' +import { useMemo, useRef, useState } from 'react' import { useDebounce } from 'react-use' import { Locale } from 'locale' import { useRouter } from 'next/router' +import { parseAsInteger, useQueryState } from 'next-usequerystate' import { useLazyQuery } from '@apollo/client' import { @@ -17,6 +18,7 @@ import { Stack, Text, } from '@island.is/island-ui/core' +import { stringHash } from '@island.is/shared/utils' import { GenericListItem, GenericListItemResponse, @@ -125,8 +127,15 @@ export const GenericList = ({ searchInputPlaceholder, itemType, }: GenericListProps) => { - const [searchValue, setSearchValue] = useState('') - const [page, setPage] = useState(1) + const hashedId = useMemo(() => { + return stringHash(id).toString().slice(0, 4) + }, [id]) + + const searchQueryId = `${hashedId}q` + const pageQueryId = `${hashedId}page` + + const [searchValue, setSearchValue] = useQueryState(searchQueryId) + const [page, setPage] = useQueryState(pageQueryId, parseAsInteger) const pageRef = useRef(page) const searchValueRef = useRef(searchValue) const [itemsResponse, setItemsResponse] = useState(firstPageItemResponse) @@ -171,8 +180,8 @@ export const GenericList = ({ genericListId: id, size: ITEMS_PER_PAGE, lang: activeLocale, - page, - queryString: searchValue, + page: page ?? 1, + queryString: searchValue || '', }, }, }) @@ -201,12 +210,12 @@ export const GenericList = ({ { - setSearchValue(value) + setSearchValue(value || null) searchValueRef.current = value - setPage(1) + setPage(null) pageRef.current = 1 }} - value={searchValue} + value={searchValue ?? ''} loading={loading} placeholder={searchInputPlaceholder ?? undefined} backgroundColor="white" @@ -232,7 +241,7 @@ export const GenericList = ({ {totalPages > 1 && ( - {activeLocale === 'is' ? 'Síða' : 'Page'} {page}{' '} + {activeLocale === 'is' ? 'Síða' : 'Page'} {page ?? 1}{' '} {activeLocale === 'is' ? 'af' : 'of'} {totalPages} )} @@ -264,13 +273,13 @@ export const GenericList = ({ {totalItems > ITEMS_PER_PAGE && ( (