Skip to content

Commit

Permalink
feat: updated status logic
Browse files Browse the repository at this point in the history
  • Loading branch information
thorkellmani committed Dec 4, 2024
1 parent 14b2142 commit 0f766cb
Show file tree
Hide file tree
Showing 9 changed files with 275 additions and 126 deletions.
20 changes: 14 additions & 6 deletions apps/web/screens/Grants/Grant/GrantSidebar.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import { useMemo } from 'react'

import { Box, Button, LinkV2, Stack, Text } from '@island.is/island-ui/core'
import { useLocale } from '@island.is/localization'
import { Locale } from '@island.is/shared/types'
import { isDefined } from '@island.is/shared/utils'
import { InstitutionPanel } from '@island.is/web/components'
import { Grant } from '@island.is/web/graphql/schema'
import { LinkType, useLinkResolver } from '@island.is/web/hooks'

import { m } from '../messages'
import { useLocale } from '@island.is/localization'
import { generateStatusTag } from '../utils'
import { generateStatusTag, parseStatus } from '../utils'

interface Props {
grant: Grant
Expand All @@ -34,6 +34,11 @@ export const GrantSidebar = ({ grant, locale }: Props) => {
const { linkResolver } = useLinkResolver()
const { formatMessage } = useLocale()

const status = useMemo(
() => parseStatus(grant, formatMessage, locale),
[grant, formatMessage, locale],
)

const detailPanelData = useMemo(
() =>
[
Expand Down Expand Up @@ -74,20 +79,23 @@ export const GrantSidebar = ({ grant, locale }: Props) => {
),
generateLine(
formatMessage(m.single.deadline),
grant?.applicationDeadlineStatus ? (
<Text variant="medium">{grant.applicationDeadlineStatus}</Text>
status.deadlineStatus ? (
<Text variant="medium">{status.deadlineStatus}</Text>
) : undefined,
),
generateLine(
formatMessage(m.single.status),
grant?.status ? (
<Text variant="medium">
{generateStatusTag(grant.status, formatMessage)?.label}
{
generateStatusTag(status.applicationStatus, formatMessage)
?.label
}
</Text>
) : undefined,
),
].filter(isDefined) ?? [],
[grant, formatMessage, linkResolver],
[grant, formatMessage, linkResolver, status],
)

const filesPanelData = useMemo(
Expand Down
22 changes: 12 additions & 10 deletions apps/web/screens/Grants/SearchResults/SearchResultsContent.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { useIntl } from 'react-intl'
import { useWindowSize } from 'react-use'
import format from 'date-fns/format'
import { useRouter } from 'next/router'
Expand All @@ -13,7 +12,7 @@ import { Grant } from '@island.is/web/graphql/schema'
import { useLinkResolver } from '@island.is/web/hooks'

import { m } from '../messages'
import { generateStatusTag } from '../utils'
import { generateStatusTag, parseStatus } from '../utils'

interface Props {
grants?: Array<Grant>
Expand Down Expand Up @@ -44,6 +43,7 @@ export const SearchResultsContent = ({ grants, subheader, locale }: Props) => {
return null
}

const status = parseStatus(grant, formatMessage, locale)
return (
<Box key={grant.id}>
{grant.applicationId && (
Expand All @@ -54,11 +54,10 @@ export const SearchResultsContent = ({ grants, subheader, locale }: Props) => {
text={grant.description ?? ''}
logo={grant.fund?.parentOrganization?.logo?.url ?? ''}
logoAlt={grant.fund?.parentOrganization?.logo?.title ?? ''}
tag={
grant.status
? generateStatusTag(grant.status, formatMessage)
: undefined
}
tag={generateStatusTag(
status.applicationStatus,
formatMessage,
)}
cta={{
label: formatMessage(m.general.seeMore),
variant: 'text',
Expand All @@ -80,14 +79,17 @@ export const SearchResultsContent = ({ grants, subheader, locale }: Props) => {
text: `${format(
new Date(grant.dateFrom),
'dd.MM.',
)}-${format(new Date(grant.dateTo), 'dd.MM.yyyy')}`,
)} - ${format(
new Date(grant.dateTo),
'dd.MM.yyyy',
)}`,
}
: null,
grant.applicationDeadlineStatus
status.deadlineStatus
? {
icon: 'time' as const,
//todo: fix when the text is ready
text: grant.applicationDeadlineStatus,
text: status.deadlineStatus,
}
: undefined,
grant.categoryTags
Expand Down
22 changes: 21 additions & 1 deletion apps/web/screens/Grants/messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export const m = {
},
applicationStatus: {
id: 'web.grants:search.applicationStatus',
defaultMessage: 'Staða umsóknar',
defaultMessage: 'Staða umsókna',
},
applicationOpen: {
id: 'web.grants:search.applicationOpen',
Expand All @@ -52,6 +52,26 @@ export const m = {
id: 'web.grants:search.applicationSeeDescription',
defaultMessage: 'Sjá lýsingu',
},
applicationOpensAt: {
id: 'web.grants:search.applicationOpensAt',
defaultMessage: 'Opnar næst {arg}',
},
applicationEstimatedOpensAt: {
id: 'web.grants:search.applicationEstimatedOpensAt',
defaultMessage: 'Áætlað næst í {arg}',
},
applicationOpensTo: {
id: 'web.grants:search.applicationOpensTo',
defaultMessage: 'Frestur til {arg}',
},
applicationWasOpenTo: {
id: 'web.grants:search.applicationWasOpenTo',
defaultMessage: 'Frestur var til {arg}',
},
applicationAlwaysOpen: {
id: 'web.grants:search.applicationAlwaysOpen',
defaultMessage: 'Opið er allt árið',
},
category: {
id: 'web.grants:search.category',
defaultMessage: 'Flokkun',
Expand Down
123 changes: 106 additions & 17 deletions apps/web/screens/Grants/utils.ts
Original file line number Diff line number Diff line change
@@ -1,29 +1,118 @@
import { TagVariant } from '@island.is/island-ui/core'
import format from 'date-fns/format'
import localeEn from 'date-fns/locale/en-GB'
import localeIS from 'date-fns/locale/is'

import { FormatMessage } from '@island.is/localization'
import { GrantStatus } from '@island.is/web/graphql/schema'
import { Locale } from '@island.is/shared/types'
import { Grant, GrantStatus } from '@island.is/web/graphql/schema'

import { m } from './messages'

export const generateStatusTag = (
status: GrantStatus,
interface Status {
applicationStatus: 'open' | 'closed' | 'unknown'
deadlineStatus: string
note?: string
}

const formatDate = (
date: Date,
locale: Locale,
stringFormat = 'dd.MMMM yyyy',
) =>
format(date, stringFormat, {
locale: locale === 'is' ? localeIS : localeEn,
})

export const parseStatus = (
grant: Grant,
formatMessage: FormatMessage,
): { label: string; variant: TagVariant } | undefined => {
switch (status) {
case GrantStatus.Open:
locale: Locale,
): Status => {
switch (grant.status) {
case GrantStatus.Closed: {
return {
applicationStatus: 'closed',
deadlineStatus: grant.dateTo
? formatMessage(m.search.applicationWasOpenTo, {
arg: formatDate(new Date(grant.dateTo), locale),
})
: formatMessage(m.search.applicationClosed),
note: grant.statusText ?? undefined,
}
}
case GrantStatus.ClosedOpeningSoon: {
return {
applicationStatus: 'closed',
deadlineStatus: grant.dateFrom
? formatMessage(m.search.applicationOpensAt, {
arg: formatDate(new Date(grant.dateFrom), locale),
})
: formatMessage(m.search.applicationClosed),
note: grant.statusText ?? undefined,
}
}
case GrantStatus.ClosedOpeningSoonWithEstimation: {
return {
label: formatMessage(m.search.applicationOpen),
variant: 'mint',
applicationStatus: 'closed',
deadlineStatus: grant.dateFrom
? formatMessage(m.search.applicationEstimatedOpensAt, {
arg: formatDate(new Date(grant.dateFrom), locale, 'MMMM yyyy'),
})
: formatMessage(m.search.applicationClosed),
note: grant.statusText ?? undefined,
}
case GrantStatus.Closed:
}
case GrantStatus.ClosedWithNote: {
return {
label: formatMessage(m.search.applicationClosed),
variant: 'rose',
applicationStatus: 'closed',
deadlineStatus: formatMessage(m.search.applicationSeeDescription),
note: grant.statusText ?? undefined,
}
case GrantStatus.SeeDescription:
}
case GrantStatus.AlwaysOpen: {
return {
label: formatMessage(m.search.applicationSeeDescription),
variant: 'purple',
applicationStatus: 'open',
deadlineStatus: formatMessage(m.search.applicationAlwaysOpen),
note: grant.statusText ?? undefined,
}
default:
return
}
case GrantStatus.Open: {
return {
applicationStatus: 'open',
deadlineStatus: grant.dateFrom
? formatMessage(m.search.applicationOpensAt, {
arg: formatDate(new Date(grant.dateFrom), locale, 'dd.MMMM.'),
})
: formatMessage(m.search.applicationOpen),
note: grant.statusText ?? undefined,
}
}
case GrantStatus.OpenWithNote: {
return {
applicationStatus: 'open',
deadlineStatus: formatMessage(m.search.applicationSeeDescription),
note: grant.statusText ?? undefined,
}
}
default: {
return {
applicationStatus: 'unknown',
deadlineStatus: '',
}
}
}
}

export const generateStatusTag = (
status: Status['applicationStatus'],
formatMessage: FormatMessage,
) =>
status !== 'unknown'
? {
label:
status === 'open'
? formatMessage(m.search.applicationOpen)
: formatMessage(m.search.applicationClosed),
variant: status === 'open' ? ('mint' as const) : ('rose' as const),
}
: undefined
5 changes: 4 additions & 1 deletion apps/web/screens/queries/Grants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ export const GET_GRANTS_QUERY = gql`
}
dateFrom
dateTo
isOpen
status
statusText
categoryTags {
id
title
Expand Down Expand Up @@ -69,6 +69,9 @@ export const GET_GRANT_QUERY = gql`
}
applicationDeadlineStatus
status
statusText
dateFrom
dateTo
categoryTags {
id
title
Expand Down
30 changes: 1 addition & 29 deletions libs/cms/src/lib/cms.elasticsearch.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,8 @@ import { GenericListItem } from './models/genericListItem.model'
import { GetTeamMembersInput } from './dto/getTeamMembers.input'
import { TeamMemberResponse } from './models/teamMemberResponse.model'
import { GetGrantsInput } from './dto/getGrants.input'
import { Grant, GrantStatus } from './models/grant.model'
import { Grant } from './models/grant.model'
import { GrantList } from './models/grantList.model'
import { logger } from '@island.is/logging'
import { IGrantFields } from './generated/contentfulTypes'
import { isDefined } from '@island.is/shared/utils'

@Injectable()
export class CmsElasticsearchService {
Expand Down Expand Up @@ -618,7 +615,6 @@ export class CmsElasticsearchService {
search,
page = 1,
size = 8,
statuses,
categories,
types,
organizations,
Expand Down Expand Up @@ -723,30 +719,6 @@ export class CmsElasticsearchService {
})
}

if (statuses) {
must.push({
nested: {
path: 'tags',
query: {
bool: {
must: [
{
terms: {
'tags.key': statuses,
},
},
{
term: {
'tags.type': 'status',
},
},
],
},
},
},
})
}

const grantListResponse: ApiResponse<SearchResponse<MappedData>> =
await this.elasticService.findByQuery(index, {
query: {
Expand Down
20 changes: 15 additions & 5 deletions libs/cms/src/lib/generated/contentfulTypes.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1838,21 +1838,31 @@ export interface IGrantFields {
/** Application hints */
grantApplicationHints?: Document | undefined

/** Date from */
/** Open from */
grantDateFrom?: string | undefined

/** Date to */
/** Open to */
grantDateTo?: string | undefined

/** Is open? */
grantIsOpen?: boolean | undefined
/** From date is estimated */
grantFromDateIsEstimated?: boolean | undefined

/** Status */
grantStatus: 'open' | 'closed' | 'see_description'
grantStatus:
| 'Automatic'
| 'Always open'
| 'Open with note'
| 'Closed with note'

/** Status Note */
grantStatusNote?: string | undefined

/** Files */
grantFiles?: Asset[] | undefined

/** Support links */
grantSupportLinks?: ILinkUrl[] | undefined

/** Category tags */
grantCategoryTags?: IGenericTag[] | undefined

Expand Down
Loading

0 comments on commit 0f766cb

Please sign in to comment.