diff --git a/apps/web/components/GenericList/GenericList.tsx b/apps/web/components/GenericList/GenericList.tsx index 36002ccc3a3e..3cce3c13913e 100644 --- a/apps/web/components/GenericList/GenericList.tsx +++ b/apps/web/components/GenericList/GenericList.tsx @@ -26,12 +26,14 @@ import { } from '@island.is/island-ui/core' import { theme } from '@island.is/island-ui/theme' import { Locale } from '@island.is/shared/types' +import { NewsCard } from '@island.is/web/components' import { GenericListItem, GenericListItemResponse, GenericTag, GetGenericListItemsInputOrderBy, GetGenericListItemsQueryVariables, + Image as ImageSchema, Query, } from '@island.is/web/graphql/schema' import { useWindowSize } from '@island.is/web/hooks/useViewport' @@ -89,7 +91,7 @@ export const NonClickableItem = ({ item }: ItemProps) => { {item.date && ( - {format(new Date(item.date), 'dd.MM.yyyy')} + {format(new Date(item.date), 'do MMMM yyyy')} )} @@ -144,6 +146,27 @@ export const ClickableItem = ({ item, baseUrl }: ClickableItemProps) => { const filterTags = item.filterTags ?? [] + if (item.image) { + return ( + 0 && ( + {webRichText(item.cardIntro ?? [])} + ) + } + href={href ?? ''} + image={item.image as ImageSchema} + readMoreText="" + titleAs="h3" + titleVariant="h3" + titleTextColor="blue400" + date={item.date ?? ''} + dateTextColor="purple400" + /> + ) + } + return ( { - {format(new Date(item.date), 'dd.MM.yyyy')} + {format(new Date(item.date), 'do MMMM yyyy')} {icon && ( > = ({ dateTextColor = 'dark400', titleVariant = 'h2', titleAs = 'h3', + titleTextColor = 'dark400', mini, }) => { const [ref, { width }] = useMeasure() @@ -67,7 +69,7 @@ export const NewsCard: React.FC> = ({ {formattedDate} )} - + {title} @@ -107,7 +109,7 @@ export const NewsCard: React.FC> = ({ {formattedDate} - + {title} {React.isValidElement(introduction) ? ( @@ -130,7 +132,7 @@ export const NewsCard: React.FC> = ({ )} - {!!showImage && ( + {!!showImage && image && ( = ({ {item.date && ( - {format(new Date(item.date), 'dd.MM.yyyy')} + {format(new Date(item.date), 'do MMMM yyyy')} )} @@ -41,6 +45,26 @@ const GenericListItemPage: Screen = ({ {showReadspeaker && } + {item.image && ( + + + + )} {webRichText(item.content ?? [])} diff --git a/apps/web/screens/queries/GenericList.ts b/apps/web/screens/queries/GenericList.ts index 5bfab44d76bf..f59c85a7fe3f 100644 --- a/apps/web/screens/queries/GenericList.ts +++ b/apps/web/screens/queries/GenericList.ts @@ -25,6 +25,12 @@ export const GET_GENERIC_LIST_ITEMS_QUERY = gql` slug assetUrl externalUrl + image { + url + title + width + height + } } total } @@ -43,6 +49,13 @@ export const GET_GENERIC_LIST_ITEM_BY_SLUG_QUERY = gql` ...AllSlices ${nestedFields} } + image { + url + title + width + height + } + fullWidthImageInContent } } ${slices} diff --git a/apps/web/screens/queries/fragments.ts b/apps/web/screens/queries/fragments.ts index 9ae4b8f8f083..1c3c4983b1ec 100644 --- a/apps/web/screens/queries/fragments.ts +++ b/apps/web/screens/queries/fragments.ts @@ -976,6 +976,12 @@ export const slices = gql` } slug assetUrl + image { + url + title + width + height + } } } } diff --git a/libs/cms/src/lib/generated/contentfulTypes.d.ts b/libs/cms/src/lib/generated/contentfulTypes.d.ts index 8754335947f6..d49adeb37337 100644 --- a/libs/cms/src/lib/generated/contentfulTypes.d.ts +++ b/libs/cms/src/lib/generated/contentfulTypes.d.ts @@ -1684,6 +1684,12 @@ export interface IGenericListItemFields { /** External Link */ externalLink?: ILinkUrl | undefined + + /** Image */ + image?: Asset | undefined + + /** Full Width Image In Content */ + fullWidthImageInContent?: boolean | undefined } /** An item that belongs to a generic list */ diff --git a/libs/cms/src/lib/models/genericListItem.model.ts b/libs/cms/src/lib/models/genericListItem.model.ts index 39fe5dc37b6e..8f7e6b7d3fdb 100644 --- a/libs/cms/src/lib/models/genericListItem.model.ts +++ b/libs/cms/src/lib/models/genericListItem.model.ts @@ -4,6 +4,7 @@ import { SliceUnion, mapDocument } from '../unions/slice.union' import { GenericList, mapGenericList } from './genericList.model' import { IGenericListItem } from '../generated/contentfulTypes' import { GenericTag, mapGenericTag } from './genericTag.model' +import { Image, mapImage } from './image.model' @ObjectType() export class GenericListItem { @@ -36,6 +37,12 @@ export class GenericListItem { @CacheField(() => [GenericTag], { nullable: true }) filterTags?: GenericTag[] + + @CacheField(() => Image, { nullable: true }) + image?: Image | null + + @Field(() => Boolean, { nullable: true }) + fullWidthImageInContent?: boolean } export const mapGenericListItem = ({ @@ -67,5 +74,7 @@ export const mapGenericListItem = ({ assetUrl, externalUrl: fields.externalLink?.fields?.url ?? '', filterTags: fields.filterTags ? fields.filterTags.map(mapGenericTag) : [], + image: fields.image ? mapImage(fields.image) : null, + fullWidthImageInContent: fields.fullWidthImageInContent ?? true, } }