From f76e177ff39c76e8092b4714753077c79b933365 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3n=20Bjarni=20=C3=93lafsson?= Date: Fri, 27 Sep 2024 15:00:25 +0000 Subject: [PATCH] Involved parties now ready --- .../src/lib/ojoiApplication.resolver.ts | 5 +- .../src/lib/ojoiApplication.service.ts | 5 +- .../models/getUserInvolvedParties.input.ts | 7 ++ .../src/components/form/FormScreen.tsx | 15 ++- .../src/forms/Requirements.ts | 3 +- .../src/graphql/queries.ts | 12 ++ .../src/hooks/useInvolvedParties.ts | 45 ++++++++ .../src/lib/messages/index.ts | 1 + .../src/lib/messages/involved-parties.ts | 56 ++++++++++ .../src/lib/types.ts | 1 + .../src/screens/InvolvedPartyScreen.tsx | 105 ++++++++++++++++-- .../src/lib/ojoiApplicationClient.service.ts | 6 +- 12 files changed, 246 insertions(+), 15 deletions(-) create mode 100644 libs/api/domains/official-journal-of-iceland-application/src/models/getUserInvolvedParties.input.ts create mode 100644 libs/application/templates/official-journal-of-iceland/src/hooks/useInvolvedParties.ts create mode 100644 libs/application/templates/official-journal-of-iceland/src/lib/messages/involved-parties.ts diff --git a/libs/api/domains/official-journal-of-iceland-application/src/lib/ojoiApplication.resolver.ts b/libs/api/domains/official-journal-of-iceland-application/src/lib/ojoiApplication.resolver.ts index 903541bfec0c..24806165906d 100644 --- a/libs/api/domains/official-journal-of-iceland-application/src/lib/ojoiApplication.resolver.ts +++ b/libs/api/domains/official-journal-of-iceland-application/src/lib/ojoiApplication.resolver.ts @@ -24,6 +24,7 @@ import { GetApplicationAttachmentsResponse } from '../models/getApplicationAttac import { DeleteApplicationAttachmentInput } from '../models/deleteApplicationAttachment.input' import type { User } from '@island.is/auth-nest-tools' import { GetUserInvolvedPartiesResponse } from '../models/getUserInvolvedParties.response' +import { GetUserInvolvedPartiesInput } from '../models/getUserInvolvedParties.input' @Scopes(ApiScope.internal) @UseGuards(IdsUserGuard, ScopesGuard) @@ -116,8 +117,8 @@ export class OfficialJournalOfIcelandApplicationResolver { name: 'officialJournalOfIcelandApplicationGetUserInvolvedParties', }) getUserInvolvedParties( - @Args('input', { type: () => GetCommentsInput }) - input: GetCommentsInput, + @Args('input', { type: () => GetUserInvolvedPartiesInput }) + input: GetUserInvolvedPartiesInput, @CurrentUser() user: User, ) { return this.ojoiApplicationService.getUserInvolvedParties(input, user) diff --git a/libs/api/domains/official-journal-of-iceland-application/src/lib/ojoiApplication.service.ts b/libs/api/domains/official-journal-of-iceland-application/src/lib/ojoiApplication.service.ts index 60a912528d76..3e445003a633 100644 --- a/libs/api/domains/official-journal-of-iceland-application/src/lib/ojoiApplication.service.ts +++ b/libs/api/domains/official-journal-of-iceland-application/src/lib/ojoiApplication.service.ts @@ -17,6 +17,7 @@ import { DeleteApplicationAttachmentInput } from '../models/deleteApplicationAtt import { LOGGER_PROVIDER } from '@island.is/logging' import type { Logger } from '@island.is/logging' import { User } from '@island.is/auth-nest-tools' +import { GetUserInvolvedPartiesInput } from '../models/getUserInvolvedParties.input' const LOG_CATEGORY = 'official-journal-of-iceland-application' @@ -167,10 +168,10 @@ export class OfficialJournalOfIcelandApplicationService { } } - async getUserInvolvedParties(input: GetCommentsInput, user: User) { + async getUserInvolvedParties(input: GetUserInvolvedPartiesInput, user: User) { return this.ojoiApplicationService.getUserInvolvedParties( { - id: input.id, + id: input.applicationId, }, user, ) diff --git a/libs/api/domains/official-journal-of-iceland-application/src/models/getUserInvolvedParties.input.ts b/libs/api/domains/official-journal-of-iceland-application/src/models/getUserInvolvedParties.input.ts new file mode 100644 index 000000000000..9f045441743f --- /dev/null +++ b/libs/api/domains/official-journal-of-iceland-application/src/models/getUserInvolvedParties.input.ts @@ -0,0 +1,7 @@ +import { Field, ID, InputType } from '@nestjs/graphql' + +@InputType('GetUserInvolvedPartiesInput') +export class GetUserInvolvedPartiesInput { + @Field(() => ID) + applicationId!: string +} diff --git a/libs/application/templates/official-journal-of-iceland/src/components/form/FormScreen.tsx b/libs/application/templates/official-journal-of-iceland/src/components/form/FormScreen.tsx index 4baca4510fed..e9df089c0bb3 100644 --- a/libs/application/templates/official-journal-of-iceland/src/components/form/FormScreen.tsx +++ b/libs/application/templates/official-journal-of-iceland/src/components/form/FormScreen.tsx @@ -2,11 +2,13 @@ import { AlertMessage, AlertMessageProps, Box, + SkeletonLoader, Text, } from '@island.is/island-ui/core' import * as styles from './FormScreen.css' import { useLocale } from '@island.is/localization' import { general } from '../../lib/messages' +import { OJOI_INPUT_HEIGHT } from '../../lib/constants' type WarningProps = { type?: AlertMessageProps['type'] @@ -20,6 +22,7 @@ type Props = { button?: React.ReactNode warning?: WarningProps children?: React.ReactNode + loading?: boolean } export const FormScreen = ({ @@ -28,6 +31,7 @@ export const FormScreen = ({ button, children, warning, + loading, }: Props) => { const { formatMessage } = useLocale() @@ -61,7 +65,16 @@ export const FormScreen = ({ )} - {children} + {loading ? ( + + ) : ( + {children} + )} ) } diff --git a/libs/application/templates/official-journal-of-iceland/src/forms/Requirements.ts b/libs/application/templates/official-journal-of-iceland/src/forms/Requirements.ts index 5d289e160f5d..eb13107c7e93 100644 --- a/libs/application/templates/official-journal-of-iceland/src/forms/Requirements.ts +++ b/libs/application/templates/official-journal-of-iceland/src/forms/Requirements.ts @@ -16,6 +16,7 @@ import { preview, publishing, summary, + involvedParty, } from '../lib/messages' export const Requirements: Form = buildForm({ id: 'OfficialJournalOfIcelandApplication', @@ -41,7 +42,7 @@ export const Requirements: Form = buildForm({ }), buildSection({ id: Routes.INVOLVED_PARTY, - title: 'Test', + title: involvedParty.general.section, children: [ buildMultiField({ id: Routes.INVOLVED_PARTY, diff --git a/libs/application/templates/official-journal-of-iceland/src/graphql/queries.ts b/libs/application/templates/official-journal-of-iceland/src/graphql/queries.ts index 62a83187a4d0..983c447c0cef 100644 --- a/libs/application/templates/official-journal-of-iceland/src/graphql/queries.ts +++ b/libs/application/templates/official-journal-of-iceland/src/graphql/queries.ts @@ -190,6 +190,18 @@ export const DEPARTMENTS_QUERY = gql` } ` +export const INVOLVED_PARTIES_QUERY = gql` + query InvolvedParties($input: GetUserInvolvedPartiesInput!) { + officialJournalOfIcelandApplicationGetUserInvolvedParties(input: $input) { + involvedParties { + id + title + slug + } + } + } +` + export const CATEGORIES_QUERY = gql` query AdvertCategories($params: OfficialJournalOfIcelandQueryInput!) { officialJournalOfIcelandCategories(params: $params) { diff --git a/libs/application/templates/official-journal-of-iceland/src/hooks/useInvolvedParties.ts b/libs/application/templates/official-journal-of-iceland/src/hooks/useInvolvedParties.ts new file mode 100644 index 000000000000..fa08402685bd --- /dev/null +++ b/libs/application/templates/official-journal-of-iceland/src/hooks/useInvolvedParties.ts @@ -0,0 +1,45 @@ +import { useQuery } from '@apollo/client' +import { OfficialJournalOfIcelandApplicationGetUserInvolvedPartiesResponse } from '@island.is/api/schema' +import { INVOLVED_PARTIES_QUERY } from '../graphql/queries' + +type Props = { + applicationId?: string + onComplete?: (data: InvolvedPartiesResponse) => void + onError?: (error: Error) => void +} + +type InvolvedPartiesResponse = { + officialJournalOfIcelandApplicationGetUserInvolvedParties: OfficialJournalOfIcelandApplicationGetUserInvolvedPartiesResponse +} +export const useInvolvedParties = ({ + applicationId, + onComplete, + onError, +}: Props) => { + const { data, loading, error } = useQuery( + INVOLVED_PARTIES_QUERY, + { + skip: !applicationId, + fetchPolicy: 'no-cache', + variables: { + input: { + applicationId: applicationId, + }, + }, + onCompleted: (data) => { + onComplete && onComplete(data) + }, + onError: (error) => { + onError && onError(error) + }, + }, + ) + + return { + involvedParties: + data?.officialJournalOfIcelandApplicationGetUserInvolvedParties + .involvedParties, + loading, + error, + } +} diff --git a/libs/application/templates/official-journal-of-iceland/src/lib/messages/index.ts b/libs/application/templates/official-journal-of-iceland/src/lib/messages/index.ts index 125c0744b8c7..8e65f42869ce 100644 --- a/libs/application/templates/official-journal-of-iceland/src/lib/messages/index.ts +++ b/libs/application/templates/official-journal-of-iceland/src/lib/messages/index.ts @@ -11,3 +11,4 @@ export * from './publishing' export * from './summary' export * from './signatures' export * from './comments' +export * from './involved-parties' diff --git a/libs/application/templates/official-journal-of-iceland/src/lib/messages/involved-parties.ts b/libs/application/templates/official-journal-of-iceland/src/lib/messages/involved-parties.ts new file mode 100644 index 000000000000..373026a6e22b --- /dev/null +++ b/libs/application/templates/official-journal-of-iceland/src/lib/messages/involved-parties.ts @@ -0,0 +1,56 @@ +import { defineMessages } from 'react-intl' + +export const involvedParty = { + general: defineMessages({ + title: { + id: 'ojoi.application:original.general.title', + defaultMessage: 'Stofnun ', + description: 'Title of the involved party screen', + }, + intro: { + id: 'ojoi.application:original.general.intro', + defaultMessage: + 'Hér getur þú valið stofnun sem þú vilt tengja við umsóknina þína.', + description: 'Intro of the involved party form', + }, + section: { + id: 'ojoi.application:original.general.section', + defaultMessage: 'Stofnanir', + description: 'Title of the involved party section', + }, + }), + inputs: { + select: defineMessages({ + placeholder: { + id: 'ojoi.application:original.inputs.select.placeholder', + defaultMessage: 'Veldu stofnun', + description: 'Placeholder for the select input', + }, + }), + }, + + errors: defineMessages({ + title: { + id: 'ojoi.application:original.error.title', + defaultMessage: 'Þú hefur ekki aðgang', + description: 'Title of the error message', + }, + message: { + id: 'ojoi.application:original.error.message', + defaultMessage: + 'Ekki tókst að sækja stofnanir fyrir aðganginn þinn, ef þú telur þig eiga að hafa aðgang, vinsamlegast hafðu samband við ritstjóra Stjórnartíðnda.', + description: 'Error message', + }, + noDataTitle: { + id: 'ojoi.application:original.error.noDataTitle', + defaultMessage: 'Engar stofnanir', + description: 'Title of the no data message', + }, + noDataMessage: { + id: 'ojoi.application:original.error.noDataMessage', + defaultMessage: + 'Notandinn er ekki tengdur neinum stofnunum, vinsamlegast hafðu samband við ritstjóra Stjórnartíðnda.', + description: 'No data message', + }, + }), +} diff --git a/libs/application/templates/official-journal-of-iceland/src/lib/types.ts b/libs/application/templates/official-journal-of-iceland/src/lib/types.ts index ab0c6d2a68a3..1d4a4ad4cbed 100644 --- a/libs/application/templates/official-journal-of-iceland/src/lib/types.ts +++ b/libs/application/templates/official-journal-of-iceland/src/lib/types.ts @@ -19,6 +19,7 @@ export const InputFields = { categories: 'advert.categories', channels: 'advert.channels', message: 'advert.message', + involvedPartyId: 'advert.involvedPartyId', }, [Routes.SIGNATURE]: { regular: 'signatures.regular', diff --git a/libs/application/templates/official-journal-of-iceland/src/screens/InvolvedPartyScreen.tsx b/libs/application/templates/official-journal-of-iceland/src/screens/InvolvedPartyScreen.tsx index e637a31fe2bd..1529141f3833 100644 --- a/libs/application/templates/official-journal-of-iceland/src/screens/InvolvedPartyScreen.tsx +++ b/libs/application/templates/official-journal-of-iceland/src/screens/InvolvedPartyScreen.tsx @@ -1,18 +1,107 @@ import { useLocale } from '@island.is/localization' import { FormScreen } from '../components/form/FormScreen' -import { original } from '../lib/messages' -import { OJOIFieldBaseProps } from '../lib/types' +import { involvedParty } from '../lib/messages' +import { InputFields, OJOIFieldBaseProps } from '../lib/types' +import { useInvolvedParties } from '../hooks/useInvolvedParties' +import { OJOISelectController } from '../components/input/OJOISelectController' +import { AlertMessage, Box, Stack } from '@island.is/island-ui/core' +import { useApplication } from '../hooks/useUpdateApplication' +import { useFormContext } from 'react-hook-form' +import set from 'lodash/set' -export const InvolvedPartyScreen = (props: OJOIFieldBaseProps) => { +export const InvolvedPartyScreen = ({ + application, + setSubmitButtonDisabled, +}: OJOIFieldBaseProps) => { + const { updateApplication } = useApplication({ + applicationId: application.id, + }) const { formatMessage: f } = useLocale() + const { setValue } = useFormContext() + + const { involvedParties, error, loading } = useInvolvedParties({ + applicationId: application.id, + onError: () => { + setSubmitButtonDisabled && setSubmitButtonDisabled(true) + }, + onComplete: (data) => { + const involvedParties = + data?.officialJournalOfIcelandApplicationGetUserInvolvedParties + .involvedParties + + if (involvedParties.length === 0 || involvedParties.length > 1) { + setSubmitButtonDisabled && setSubmitButtonDisabled(true) + } + + if ( + data.officialJournalOfIcelandApplicationGetUserInvolvedParties + .involvedParties.length === 1 + ) { + const involvedParty = + data.officialJournalOfIcelandApplicationGetUserInvolvedParties + .involvedParties[0] + + setValue(InputFields.advert.involvedPartyId, involvedParty.id) + + const currentAnswers = structuredClone(application.answers) + + const updatedAnswers = set( + currentAnswers, + InputFields.advert.involvedPartyId, + involvedParty.id, + ) + + updateApplication(updatedAnswers) + } + }, + }) + + const options = involvedParties?.map((involvedParty) => ({ + label: involvedParty.title, + value: involvedParty.id, + })) + + const defaultValue = options && options.length === 1 ? options[0].value : '' + + const disableSelect = options?.length === 1 || !!error + return ( - hallo + + {involvedParties?.length === 0 && ( + + )} + {!!error && ( + + )} + + + + setSubmitButtonDisabled && setSubmitButtonDisabled(false) + } + /> + ) } diff --git a/libs/clients/official-journal-of-iceland/application/src/lib/ojoiApplicationClient.service.ts b/libs/clients/official-journal-of-iceland/application/src/lib/ojoiApplicationClient.service.ts index bc1f52ace4e5..0981282acea1 100644 --- a/libs/clients/official-journal-of-iceland/application/src/lib/ojoiApplicationClient.service.ts +++ b/libs/clients/official-journal-of-iceland/application/src/lib/ojoiApplicationClient.service.ts @@ -181,6 +181,10 @@ export class OfficialJournalOfIcelandApplicationClientService { } async getUserInvolvedParties(params: GetInvolvedPartiesRequest, auth: Auth) { - return this.ojoiApplicationApiWithAuth(auth).getInvolvedParties(params) + const data = await this.ojoiApplicationApiWithAuth(auth).getInvolvedParties( + params, + ) + console.log(data) + return data } }