From 66287cf85a663505cd2098274e9445a45c6552a3 Mon Sep 17 00:00:00 2001 From: HjorturJ Date: Thu, 5 Dec 2024 16:55:12 +0000 Subject: [PATCH 01/10] Early investigation --- .../citizenship/src/forms/CitizenshipForm/index.ts | 14 +++++++++++++- .../ui-shell/src/reducer/ApplicationFormReducer.ts | 1 + .../ui-shell/src/reducer/reducerUtils.ts | 8 ++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/index.ts b/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/index.ts index 643c910a88b3..71b9438b1f48 100644 --- a/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/index.ts +++ b/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/index.ts @@ -1,4 +1,4 @@ -import { buildForm, buildSection } from '@island.is/application/core' +import { buildDescriptionField, buildForm, buildSection } from '@island.is/application/core' import { Form, FormModes, Section } from '@island.is/application/types' import { confirmation, externalData, payment } from '../../lib/messages' import { InformationSection } from './InformationSection' @@ -30,6 +30,18 @@ export const CitizenshipForm: Form = buildForm({ title: externalData.dataProvider.sectionTitle, children: [], }), + buildSection({ + id: 'HjorturJ', + title: 'ASDFGH', + condition: (_answers) => false, + children: [ + buildDescriptionField({ + id: `huehuehue`, + title: 'Brudda', + titleVariant: 'h5', + }), + ], + }), PersonalSection, InformationSection, SupportingDocumentsSection, diff --git a/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts b/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts index dd3cf6c9028b..28e6cd561920 100644 --- a/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts +++ b/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts @@ -25,6 +25,7 @@ export const initializeReducer = ( state.user, ) const screens = convertFormToScreens(form, answers, externalData, state.user) + console.log(screens) const currentScreen = form.mode === FormModes.IN_PROGRESS ? 0 diff --git a/libs/application/ui-shell/src/reducer/reducerUtils.ts b/libs/application/ui-shell/src/reducer/reducerUtils.ts index 72c76a0f9c92..3ef71b0baf96 100644 --- a/libs/application/ui-shell/src/reducer/reducerUtils.ts +++ b/libs/application/ui-shell/src/reducer/reducerUtils.ts @@ -401,6 +401,7 @@ const convertFormNodeToScreens = ( user: BffUser | null, ): FormScreen[] => { const { children } = formNode + //console.log('FormNodeType: ', formNode.type) if (isValidScreen(formNode)) { return convertLeafToScreens( @@ -417,6 +418,12 @@ const convertFormNodeToScreens = ( let screens: FormScreen[] = [] let newScreens: FormScreen[] = [] + // Top level case: If this is a whole section that should not be shown + if(formNode.type === FormItemTypes.SECTION && !shouldShowFormItem(formNode, answers, externalData, user)) { + //console.log('Should not show form thing: ', formNode.id) + //return screens + } + if (children) { for (let i = 0; i < children.length; i++) { const child = children[i] @@ -447,6 +454,7 @@ const convertFormNodeToScreens = ( externalData, user, ) + console.log(`NodeTitle: ${child.id} - NodeType: ${child.type} - isParentNav: ${isParentNavigable}, shouldBeVisible: ${shouldBeVisible}`) newScreens = convertFormNodeToScreens( child, From 0f5a767088f2739343bafb1d43a92050e2772e4a Mon Sep 17 00:00:00 2001 From: andes-it Date: Fri, 6 Dec 2024 13:35:46 +0000 Subject: [PATCH 02/10] chore: nx format:write update dirty files --- .../citizenship/src/forms/CitizenshipForm/index.ts | 6 +++++- .../ui-shell/src/reducer/reducerUtils.ts | 13 +++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/index.ts b/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/index.ts index 71b9438b1f48..3952d45177c4 100644 --- a/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/index.ts +++ b/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/index.ts @@ -1,4 +1,8 @@ -import { buildDescriptionField, buildForm, buildSection } from '@island.is/application/core' +import { + buildDescriptionField, + buildForm, + buildSection, +} from '@island.is/application/core' import { Form, FormModes, Section } from '@island.is/application/types' import { confirmation, externalData, payment } from '../../lib/messages' import { InformationSection } from './InformationSection' diff --git a/libs/application/ui-shell/src/reducer/reducerUtils.ts b/libs/application/ui-shell/src/reducer/reducerUtils.ts index 3ef71b0baf96..c6ce18e10790 100644 --- a/libs/application/ui-shell/src/reducer/reducerUtils.ts +++ b/libs/application/ui-shell/src/reducer/reducerUtils.ts @@ -401,7 +401,7 @@ const convertFormNodeToScreens = ( user: BffUser | null, ): FormScreen[] => { const { children } = formNode - //console.log('FormNodeType: ', formNode.type) + //console.log('FormNodeType: ', formNode.type) if (isValidScreen(formNode)) { return convertLeafToScreens( @@ -419,9 +419,12 @@ const convertFormNodeToScreens = ( let newScreens: FormScreen[] = [] // Top level case: If this is a whole section that should not be shown - if(formNode.type === FormItemTypes.SECTION && !shouldShowFormItem(formNode, answers, externalData, user)) { + if ( + formNode.type === FormItemTypes.SECTION && + !shouldShowFormItem(formNode, answers, externalData, user) + ) { //console.log('Should not show form thing: ', formNode.id) - //return screens + //return screens } if (children) { @@ -454,7 +457,9 @@ const convertFormNodeToScreens = ( externalData, user, ) - console.log(`NodeTitle: ${child.id} - NodeType: ${child.type} - isParentNav: ${isParentNavigable}, shouldBeVisible: ${shouldBeVisible}`) + console.log( + `NodeTitle: ${child.id} - NodeType: ${child.type} - isParentNav: ${isParentNavigable}, shouldBeVisible: ${shouldBeVisible}`, + ) newScreens = convertFormNodeToScreens( child, From 08b67a51fdd78ec76ec48447ec213e7c245229cd Mon Sep 17 00:00:00 2001 From: HjorturJ Date: Fri, 6 Dec 2024 15:16:06 +0000 Subject: [PATCH 03/10] More investigation and testing --- .../src/forms/CitizenshipForm/index.ts | 53 +++++++++++++++++-- .../src/reducer/ApplicationFormReducer.ts | 6 +-- .../ui-shell/src/reducer/reducerUtils.ts | 4 -- 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/index.ts b/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/index.ts index 3952d45177c4..c21245e74763 100644 --- a/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/index.ts +++ b/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/index.ts @@ -1,7 +1,10 @@ import { buildDescriptionField, buildForm, + buildMultiField, + buildRadioField, buildSection, + getValueViaPath, } from '@island.is/application/core' import { Form, FormModes, Section } from '@island.is/application/types' import { confirmation, externalData, payment } from '../../lib/messages' @@ -35,18 +38,60 @@ export const CitizenshipForm: Form = buildForm({ children: [], }), buildSection({ - id: 'HjorturJ', - title: 'ASDFGH', + id: 'NeverGetToMe', + title: 'Never get to me', condition: (_answers) => false, children: [ buildDescriptionField({ - id: `huehuehue`, - title: 'Brudda', + id: `neverBeGottenTo`, + title: 'I should never be gotten to', titleVariant: 'h5', }), ], }), PersonalSection, + buildSection({ + id: 'MultiSection', + title: 'Answer test', + children: [ + buildMultiField({ + id: 'blabla', + title: 'Mega title', + description: 'something', + children: [ + buildDescriptionField({ + id: `huehuehue`, + title: 'Answer me', + titleVariant: 'h5', + }), + buildRadioField({ + id: 'somethingToBeAnswered', + title: '', + backgroundColor: 'blue', + width: 'half', + required: true, + options: [ + { value: 'yes', label: 'Ye' }, + { value: 'no', label: 'Naw' }, + ], + }), + ] + }) + ], + }), + buildSection({ + id: 'OnlyWhenYesWasAnswered', + title: 'OnlyWhenYes', + condition: (formValue) => + getValueViaPath(formValue, 'somethingToBeAnswered') === 'yes', + children: [ + buildDescriptionField({ + id: `haha`, + title: 'Answered!!!!', + titleVariant: 'h5', + }), + ], + }), InformationSection, SupportingDocumentsSection, ...buildSupportingDocumentsSections(), diff --git a/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts b/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts index 28e6cd561920..93ecd7a92936 100644 --- a/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts +++ b/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts @@ -24,7 +24,7 @@ export const initializeReducer = ( externalData, state.user, ) - const screens = convertFormToScreens(form, answers, externalData, state.user) + const screens = convertFormToScreens(form, answers, externalData, state.user).filter(s => s.isNavigable) console.log(screens) const currentScreen = form.mode === FormModes.IN_PROGRESS @@ -61,7 +61,7 @@ const addNewAnswersToState = ( newAnswers, state.application.externalData, state.user, - ), + ).filter(s => s.isNavigable), } } @@ -153,7 +153,7 @@ const expandRepeater = (state: ApplicationUIState): ApplicationUIState => { newAnswers, externalData, state.user, - ) + ).filter(s => s.isNavigable) return { ...state, diff --git a/libs/application/ui-shell/src/reducer/reducerUtils.ts b/libs/application/ui-shell/src/reducer/reducerUtils.ts index c6ce18e10790..98ba3175ae71 100644 --- a/libs/application/ui-shell/src/reducer/reducerUtils.ts +++ b/libs/application/ui-shell/src/reducer/reducerUtils.ts @@ -423,7 +423,6 @@ const convertFormNodeToScreens = ( formNode.type === FormItemTypes.SECTION && !shouldShowFormItem(formNode, answers, externalData, user) ) { - //console.log('Should not show form thing: ', formNode.id) //return screens } @@ -457,9 +456,6 @@ const convertFormNodeToScreens = ( externalData, user, ) - console.log( - `NodeTitle: ${child.id} - NodeType: ${child.type} - isParentNav: ${isParentNavigable}, shouldBeVisible: ${shouldBeVisible}`, - ) newScreens = convertFormNodeToScreens( child, From b07f91b8d0eae8fde9c4ac4c651c80b79e8fe8a8 Mon Sep 17 00:00:00 2001 From: HjorturJ Date: Fri, 6 Dec 2024 15:18:14 +0000 Subject: [PATCH 04/10] Cleaning up a bit --- libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts | 2 +- libs/application/ui-shell/src/reducer/reducerUtils.ts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts b/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts index 93ecd7a92936..884e1533e9f2 100644 --- a/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts +++ b/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts @@ -25,7 +25,7 @@ export const initializeReducer = ( state.user, ) const screens = convertFormToScreens(form, answers, externalData, state.user).filter(s => s.isNavigable) - console.log(screens) + const currentScreen = form.mode === FormModes.IN_PROGRESS ? 0 diff --git a/libs/application/ui-shell/src/reducer/reducerUtils.ts b/libs/application/ui-shell/src/reducer/reducerUtils.ts index 98ba3175ae71..c572e52c159a 100644 --- a/libs/application/ui-shell/src/reducer/reducerUtils.ts +++ b/libs/application/ui-shell/src/reducer/reducerUtils.ts @@ -401,7 +401,6 @@ const convertFormNodeToScreens = ( user: BffUser | null, ): FormScreen[] => { const { children } = formNode - //console.log('FormNodeType: ', formNode.type) if (isValidScreen(formNode)) { return convertLeafToScreens( From e9ca92958dd90230f0824789bd1b8bc8255b84da Mon Sep 17 00:00:00 2001 From: andes-it Date: Fri, 6 Dec 2024 15:22:38 +0000 Subject: [PATCH 05/10] chore: nx format:write update dirty files --- .../citizenship/src/forms/CitizenshipForm/index.ts | 6 +++--- .../ui-shell/src/reducer/ApplicationFormReducer.ts | 13 +++++++++---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/index.ts b/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/index.ts index c21245e74763..f5850851474c 100644 --- a/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/index.ts +++ b/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/index.ts @@ -50,7 +50,7 @@ export const CitizenshipForm: Form = buildForm({ ], }), PersonalSection, - buildSection({ + buildSection({ id: 'MultiSection', title: 'Answer test', children: [ @@ -75,8 +75,8 @@ export const CitizenshipForm: Form = buildForm({ { value: 'no', label: 'Naw' }, ], }), - ] - }) + ], + }), ], }), buildSection({ diff --git a/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts b/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts index 884e1533e9f2..e3240dd7a0b3 100644 --- a/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts +++ b/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts @@ -24,8 +24,13 @@ export const initializeReducer = ( externalData, state.user, ) - const screens = convertFormToScreens(form, answers, externalData, state.user).filter(s => s.isNavigable) - + const screens = convertFormToScreens( + form, + answers, + externalData, + state.user, + ).filter((s) => s.isNavigable) + const currentScreen = form.mode === FormModes.IN_PROGRESS ? 0 @@ -61,7 +66,7 @@ const addNewAnswersToState = ( newAnswers, state.application.externalData, state.user, - ).filter(s => s.isNavigable), + ).filter((s) => s.isNavigable), } } @@ -153,7 +158,7 @@ const expandRepeater = (state: ApplicationUIState): ApplicationUIState => { newAnswers, externalData, state.user, - ).filter(s => s.isNavigable) + ).filter((s) => s.isNavigable) return { ...state, From e30fac18bae6888230656a15c843039e89eb9000 Mon Sep 17 00:00:00 2001 From: HjorturJ Date: Mon, 9 Dec 2024 10:07:39 +0000 Subject: [PATCH 06/10] Changing into a 1 liner change --- .../ui-shell/src/reducer/ApplicationFormReducer.ts | 6 +++--- libs/application/ui-shell/src/reducer/reducerUtils.ts | 10 +--------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts b/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts index 884e1533e9f2..ffc018b7aeb9 100644 --- a/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts +++ b/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts @@ -24,7 +24,7 @@ export const initializeReducer = ( externalData, state.user, ) - const screens = convertFormToScreens(form, answers, externalData, state.user).filter(s => s.isNavigable) + const screens = convertFormToScreens(form, answers, externalData, state.user) const currentScreen = form.mode === FormModes.IN_PROGRESS @@ -61,7 +61,7 @@ const addNewAnswersToState = ( newAnswers, state.application.externalData, state.user, - ).filter(s => s.isNavigable), + ) } } @@ -153,7 +153,7 @@ const expandRepeater = (state: ApplicationUIState): ApplicationUIState => { newAnswers, externalData, state.user, - ).filter(s => s.isNavigable) + ) return { ...state, diff --git a/libs/application/ui-shell/src/reducer/reducerUtils.ts b/libs/application/ui-shell/src/reducer/reducerUtils.ts index c572e52c159a..2de06deb0628 100644 --- a/libs/application/ui-shell/src/reducer/reducerUtils.ts +++ b/libs/application/ui-shell/src/reducer/reducerUtils.ts @@ -417,14 +417,6 @@ const convertFormNodeToScreens = ( let screens: FormScreen[] = [] let newScreens: FormScreen[] = [] - // Top level case: If this is a whole section that should not be shown - if ( - formNode.type === FormItemTypes.SECTION && - !shouldShowFormItem(formNode, answers, externalData, user) - ) { - //return screens - } - if (children) { for (let i = 0; i < children.length; i++) { const child = children[i] @@ -491,7 +483,7 @@ export const convertFormToScreens = ( -1, -1, user, - ) + ).filter(s => s.isNavigable) } export const getNavigableSectionsInForm = ( From 94c4d53d01221d1f86b04df98c2d5232984f66fd Mon Sep 17 00:00:00 2001 From: andes-it Date: Mon, 9 Dec 2024 10:12:13 +0000 Subject: [PATCH 07/10] chore: nx format:write update dirty files --- .../ui-shell/src/reducer/ApplicationFormReducer.ts | 4 ++-- libs/application/ui-shell/src/reducer/reducerUtils.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts b/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts index ffc018b7aeb9..37fd986d39b8 100644 --- a/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts +++ b/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts @@ -25,7 +25,7 @@ export const initializeReducer = ( state.user, ) const screens = convertFormToScreens(form, answers, externalData, state.user) - + const currentScreen = form.mode === FormModes.IN_PROGRESS ? 0 @@ -61,7 +61,7 @@ const addNewAnswersToState = ( newAnswers, state.application.externalData, state.user, - ) + ), } } diff --git a/libs/application/ui-shell/src/reducer/reducerUtils.ts b/libs/application/ui-shell/src/reducer/reducerUtils.ts index 2de06deb0628..094635979272 100644 --- a/libs/application/ui-shell/src/reducer/reducerUtils.ts +++ b/libs/application/ui-shell/src/reducer/reducerUtils.ts @@ -483,7 +483,7 @@ export const convertFormToScreens = ( -1, -1, user, - ).filter(s => s.isNavigable) + ).filter((s) => s.isNavigable) } export const getNavigableSectionsInForm = ( From 84deac6934a889e0248b478f582d28fec42d168a Mon Sep 17 00:00:00 2001 From: HjorturJ Date: Mon, 9 Dec 2024 13:16:55 +0000 Subject: [PATCH 08/10] Reverting test changes --- .../src/forms/CitizenshipForm/index.ts | 63 +------------------ 1 file changed, 1 insertion(+), 62 deletions(-) diff --git a/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/index.ts b/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/index.ts index f5850851474c..643c910a88b3 100644 --- a/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/index.ts +++ b/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/index.ts @@ -1,11 +1,4 @@ -import { - buildDescriptionField, - buildForm, - buildMultiField, - buildRadioField, - buildSection, - getValueViaPath, -} from '@island.is/application/core' +import { buildForm, buildSection } from '@island.is/application/core' import { Form, FormModes, Section } from '@island.is/application/types' import { confirmation, externalData, payment } from '../../lib/messages' import { InformationSection } from './InformationSection' @@ -37,61 +30,7 @@ export const CitizenshipForm: Form = buildForm({ title: externalData.dataProvider.sectionTitle, children: [], }), - buildSection({ - id: 'NeverGetToMe', - title: 'Never get to me', - condition: (_answers) => false, - children: [ - buildDescriptionField({ - id: `neverBeGottenTo`, - title: 'I should never be gotten to', - titleVariant: 'h5', - }), - ], - }), PersonalSection, - buildSection({ - id: 'MultiSection', - title: 'Answer test', - children: [ - buildMultiField({ - id: 'blabla', - title: 'Mega title', - description: 'something', - children: [ - buildDescriptionField({ - id: `huehuehue`, - title: 'Answer me', - titleVariant: 'h5', - }), - buildRadioField({ - id: 'somethingToBeAnswered', - title: '', - backgroundColor: 'blue', - width: 'half', - required: true, - options: [ - { value: 'yes', label: 'Ye' }, - { value: 'no', label: 'Naw' }, - ], - }), - ], - }), - ], - }), - buildSection({ - id: 'OnlyWhenYesWasAnswered', - title: 'OnlyWhenYes', - condition: (formValue) => - getValueViaPath(formValue, 'somethingToBeAnswered') === 'yes', - children: [ - buildDescriptionField({ - id: `haha`, - title: 'Answered!!!!', - titleVariant: 'h5', - }), - ], - }), InformationSection, SupportingDocumentsSection, ...buildSupportingDocumentsSections(), From 2633acb8c3ff954bb73fe1247cf73efabb590396 Mon Sep 17 00:00:00 2001 From: HjorturJ Date: Mon, 9 Dec 2024 16:43:42 +0000 Subject: [PATCH 09/10] Going another route to avoid bugs --- .../ui-shell/src/components/Screen.tsx | 3 +++ .../ui-shell/src/components/ScreenFooter.tsx | 5 +++-- .../ui-shell/src/lib/FormShell.tsx | 2 ++ .../ui-shell/src/reducer/reducerUtils.ts | 21 ++++++++++++++++++- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/libs/application/ui-shell/src/components/Screen.tsx b/libs/application/ui-shell/src/components/Screen.tsx index 52bcbcce6625..907a34d76624 100644 --- a/libs/application/ui-shell/src/components/Screen.tsx +++ b/libs/application/ui-shell/src/components/Screen.tsx @@ -76,6 +76,7 @@ type ScreenProps = { renderLastScreenBackButton?: boolean goToScreen: (id: string) => void setUpdateForbidden: (value: boolean) => void + canGoBack: boolean } const getServerValidationErrors = (error: ApolloError | undefined) => { @@ -107,6 +108,7 @@ const Screen: FC> = ({ renderLastScreenBackButton, screen, sections, + canGoBack, }) => { const { answers: formValue, externalData, id: applicationId } = application const { lang: locale, formatMessage } = useLocale() @@ -416,6 +418,7 @@ const Screen: FC> = ({ numberOfScreens={numberOfScreens} mode={mode} goBack={goBack} + canGoBack={canGoBack} submitField={submitField} loading={loading} canProceed={!isLoadingOrPending} diff --git a/libs/application/ui-shell/src/components/ScreenFooter.tsx b/libs/application/ui-shell/src/components/ScreenFooter.tsx index 253e4665c354..2c6b653dada9 100644 --- a/libs/application/ui-shell/src/components/ScreenFooter.tsx +++ b/libs/application/ui-shell/src/components/ScreenFooter.tsx @@ -27,6 +27,7 @@ interface FooterProps { renderLastScreenBackButton?: boolean submitButtonDisabled?: boolean nextButtonText?: FormText + canGoBack: boolean } type SubmitButton = Omit & { @@ -68,13 +69,13 @@ export const ScreenFooter: FC> = ({ renderLastScreenBackButton, submitButtonDisabled, nextButtonText, + canGoBack, }) => { const { formatMessage } = useLocale() const user = useUserInfo() const hasSubmitField = submitField !== undefined const isLastScreen = activeScreenIndex === numberOfScreens - 1 - const showGoBack = - activeScreenIndex > 0 && (!isLastScreen || renderLastScreenBackButton) + const showGoBack = canGoBack && (!isLastScreen || renderLastScreenBackButton) if ( (isLastScreen && !renderLastScreenButton) || diff --git a/libs/application/ui-shell/src/lib/FormShell.tsx b/libs/application/ui-shell/src/lib/FormShell.tsx index d3be0a1e4747..8e1beef1c9ee 100644 --- a/libs/application/ui-shell/src/lib/FormShell.tsx +++ b/libs/application/ui-shell/src/lib/FormShell.tsx @@ -25,6 +25,7 @@ import { } from '../reducer/ApplicationFormReducer' import { ActionTypes } from '../reducer/ReducerTypes' import * as styles from './FormShell.css' +import { canGoBack } from '../reducer/reducerUtils' export const FormShell: FC< React.PropsWithChildren<{ @@ -142,6 +143,7 @@ export const FormShell: FC< payload, }) }} + canGoBack={canGoBack(screens, activeScreen)} prevScreen={() => dispatch({ type: ActionTypes.PREV_SCREEN })} activeScreenIndex={activeScreen} numberOfScreens={screens.length} diff --git a/libs/application/ui-shell/src/reducer/reducerUtils.ts b/libs/application/ui-shell/src/reducer/reducerUtils.ts index 094635979272..8b3a0b6f38ed 100644 --- a/libs/application/ui-shell/src/reducer/reducerUtils.ts +++ b/libs/application/ui-shell/src/reducer/reducerUtils.ts @@ -181,6 +181,25 @@ export const moveToScreen = ( return screenIndex } +export const canGoBack = ( + screens: FormScreen[], + screenIndex: number, +): boolean => { + // Check if we're already at the start + if (screenIndex <= 0) { + return false + } + + // Look for any navigable screen behind where we are + for (let i = screenIndex - 1; i >= 0; i--) { + if (screens[i].isNavigable) { + return true + } + } + + return false +} + const convertFieldToScreen = ( field: Field, answers: FormValue, @@ -483,7 +502,7 @@ export const convertFormToScreens = ( -1, -1, user, - ).filter((s) => s.isNavigable) + ) } export const getNavigableSectionsInForm = ( From 49a7f51075a5d7e60cb324a93744a3aaca5efc50 Mon Sep 17 00:00:00 2001 From: HjorturJ Date: Mon, 9 Dec 2024 16:45:59 +0000 Subject: [PATCH 10/10] Removing whitespace --- libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts b/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts index 37fd986d39b8..dd3cf6c9028b 100644 --- a/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts +++ b/libs/application/ui-shell/src/reducer/ApplicationFormReducer.ts @@ -25,7 +25,6 @@ export const initializeReducer = ( state.user, ) const screens = convertFormToScreens(form, answers, externalData, state.user) - const currentScreen = form.mode === FormModes.IN_PROGRESS ? 0