diff --git a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/GenericComponent.test.tsx b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/GenericComponent.test.tsx index 95288bd1c6f..fdfb7011da0 100644 --- a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/GenericComponent.test.tsx +++ b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/GenericComponent.test.tsx @@ -51,9 +51,7 @@ describe('>>> components/GenericComponent.tsx', () => { const formData = getFormDataStateMock({ formData: { - mockId: { - mockDataBinding: 'value', - }, + mockDataBinding: 'value', }, }); diff --git a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/advanced/AddressComponent.test.tsx b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/advanced/AddressComponent.test.tsx index ed1fad1d7ed..2421089e5d8 100644 --- a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/advanced/AddressComponent.test.tsx +++ b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/advanced/AddressComponent.test.tsx @@ -2,12 +2,13 @@ import { mount, shallow } from 'enzyme'; import 'jest'; import * as React from 'react'; +import { IComponentProps } from 'src/components'; import { AddressComponent } from '../../../src/components/advanced/AddressComponent'; describe('components > advanced > AddressComponent', () => { const mockId = 'mock-id'; const mockFormData = { address: 'adresse 1' }; - const mockHandleDataChange = (data: any) => ''; + const mockHandleDataChange = (data: string) => ''; const mockGetTextResource = (resourceKey: string) => 'test'; const mockIsValid = true; const mockSimplified = true; @@ -48,6 +49,7 @@ describe('components > advanced > AddressComponent', () => { required={mockRequired} language={mockLanguage} textResourceBindings={mocktextResourceBindings} + {...({} as IComponentProps)} />, ); expect(shallowAddressComponent.find('input').length).toBe(3); @@ -68,6 +70,7 @@ describe('components > advanced > AddressComponent', () => { required={mockRequired} language={mockLanguage} textResourceBindings={mocktextResourceBindings} + {...({} as IComponentProps)} />, ); expect(shallowAddressComponent.find('.address-component-small-inputs').hasClass('disabled')).toBe(false); @@ -88,6 +91,7 @@ describe('components > advanced > AddressComponent', () => { required={mockRequired} language={mockLanguage} textResourceBindings={mocktextResourceBindings} + {...({} as IComponentProps)} />, ); shallowAddressComponent.find('input').forEach((node: any) => { @@ -110,6 +114,7 @@ describe('components > advanced > AddressComponent', () => { required={mockRequired} language={mockLanguage} textResourceBindings={mocktextResourceBindings} + {...({} as IComponentProps)} />, ); shallowAddressComponent.find('input').forEach((node: any) => { @@ -133,6 +138,7 @@ describe('components > advanced > AddressComponent', () => { required={false} language={mockLanguage} textResourceBindings={mocktextResourceBindings} + {...({} as IComponentProps)} />, ); expect(shallowAddressComponent.find('span.label-optional')).toHaveLength(2); @@ -154,6 +160,7 @@ describe('components > advanced > AddressComponent', () => { labelSettings={{ optionalIndicator: false }} language={mockLanguage} textResourceBindings={mocktextResourceBindings} + {...({} as IComponentProps)} />, ); expect(shallowAddressComponent.find('.label-optional')).toHaveLength(0); @@ -175,6 +182,7 @@ describe('components > advanced > AddressComponent', () => { required={false} language={mockLanguage} textResourceBindings={mocktextResourceBindings} + {...({} as IComponentProps)} />); const input = component.find(`#address_zip_code_${mockId}`); input.simulate('change', { target: { value: '123'}}) @@ -198,6 +206,7 @@ describe('components > advanced > AddressComponent', () => { required={false} language={mockLanguage} textResourceBindings={mocktextResourceBindings} + {...({} as IComponentProps)} />); const input = component.find(`#address_zip_code_${mockId}`); input.simulate('change', { target: { value: ''}}) diff --git a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/AttachmentListComponent.test.tsx b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/AttachmentListComponent.test.tsx index 7df25274e9a..a5b87c481ad 100644 --- a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/AttachmentListComponent.test.tsx +++ b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/AttachmentListComponent.test.tsx @@ -71,7 +71,7 @@ describe('>>> components/base/FileUploadComponent.tsx', () => { id: mockId, text: 'Attachments', dataTypeIds: ['test-data-type-1'], - }; + } as IAttachmentListProps; return render( diff --git a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/ButtonComponent.test.tsx b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/ButtonComponent.test.tsx index 1291c547248..fc1fd168dff 100644 --- a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/ButtonComponent.test.tsx +++ b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/ButtonComponent.test.tsx @@ -5,6 +5,7 @@ import configureStore from 'redux-mock-store'; import { mount } from 'enzyme'; import { Provider } from 'react-redux'; import { ButtonComponent } from '../../../src/components/base/ButtonComponent'; +import { IComponentProps } from 'src/components'; describe('components/base/ButtonComponent.tsx', () => { let mockId: string; @@ -61,6 +62,7 @@ describe('components/base/ButtonComponent.tsx', () => { disabled={mockDisabled} formDataCount={formDataCount} language={mockLanguage} + {...({} as IComponentProps)} /> ); @@ -78,6 +80,7 @@ describe('components/base/ButtonComponent.tsx', () => { disabled={mockDisabled} formDataCount={formDataCount} language={mockLanguage} + {...({} as IComponentProps)} /> ); diff --git a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/DropdownComponent.test.tsx b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/DropdownComponent.test.tsx index dbb4028f5f1..c095301d8ad 100644 --- a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/DropdownComponent.test.tsx +++ b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/DropdownComponent.test.tsx @@ -4,6 +4,7 @@ import configureStore from 'redux-mock-store'; import { Provider } from 'react-redux'; import { render } from '@testing-library/react'; import DropdownComponent from '../../../src/components/base/DropdownComponent'; +import { IComponentProps } from 'src/components'; describe('>>> components/base/DropdownComponent.tsx --- Snapshot', () => { let mockId: string; @@ -47,6 +48,7 @@ describe('>>> components/base/DropdownComponent.tsx --- Snapshot', () => { optionsId={mockOptionsId} isValid={mockIsValid} readOnly={false} + {...({} as IComponentProps)} /> , ); diff --git a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/FileUploadComponent.test.tsx b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/FileUploadComponent.test.tsx index d53d3a46cc5..53da5ddcf70 100644 --- a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/FileUploadComponent.test.tsx +++ b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/FileUploadComponent.test.tsx @@ -9,6 +9,7 @@ import { render } from '@testing-library/react'; import { bytesInOneMB, FileUploadComponent, IFileUploadProps } from '../../../src/components/base/FileUploadComponent'; import { getFileEnding, removeFileEnding } from '../../../src/utils/attachment'; import { getFileUploadComponentValidations } from '../../../src/utils/formComponentUtils'; +import { IComponentProps } from 'src/components'; describe('>>> components/base/FileUploadComponent.tsx', () => { @@ -79,6 +80,7 @@ describe('>>> components/base/FileUploadComponent.tsx', () => { maxNumberOfAttachments={mockMaxNumberOfAttachments} minNumberOfAttachments={mockMinNumberOfAttachments} readOnly={mockReadOnly} + {...({} as IComponentProps)} /> ); @@ -207,6 +209,7 @@ describe('>>> components/base/FileUploadComponent.tsx', () => { maxNumberOfAttachments={mockMaxNumberOfAttachments} minNumberOfAttachments={mockMinNumberOfAttachments} readOnly={mockReadOnly} + {...({} as IComponentProps)} /> ); @@ -272,7 +275,7 @@ describe('>>> components/base/FileUploadComponent.tsx', () => { minNumberOfAttachments: mockMinNumberOfAttachments, isValid: mockIsValid, readOnly: mockReadOnly, - }; + } as IFileUploadProps; return render( diff --git a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/HeaderComponent.test.tsx b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/HeaderComponent.test.tsx index 632afc63cfe..df803b397e7 100644 --- a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/HeaderComponent.test.tsx +++ b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/HeaderComponent.test.tsx @@ -7,6 +7,7 @@ import { } from '@testing-library/react'; import { HeaderComponent } from '../../../src/components/base/HeaderComponent'; +import { IComponentProps } from 'src/components'; const render = (props = {}) => { const allProps = { @@ -16,7 +17,7 @@ const render = (props = {}) => { language: {}, textResourceBindings: {}, ...props, - }; + } as IComponentProps; rtlRender(); }; diff --git a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/InputComponent.test.tsx b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/InputComponent.test.tsx index c13b0210abb..8656a70d5ec 100644 --- a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/InputComponent.test.tsx +++ b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/InputComponent.test.tsx @@ -4,6 +4,7 @@ import 'jest'; import * as React from 'react'; import { render, fireEvent } from '@testing-library/react'; import { InputComponent, IInputProps } from '../../../src/components/base/InputComponent'; +import { IComponentProps } from 'src/components'; describe('components/base/InputComponent.tsx', () => { let mockId: string; @@ -35,7 +36,7 @@ describe('components/base/InputComponent.tsx', () => { }); test('components/base/InputComponent.tsx -- should have correct value with specified form data', async () => { - const customProps = { formData: 'Test123' }; + const customProps:Partial = { formData: {simpleBinding:'Test123'} }; const { findByTestId } = renderInputComponent(customProps); const inputComponent: any = await findByTestId(mockId); @@ -69,7 +70,7 @@ describe('components/base/InputComponent.tsx', () => { prefix: '$', }, }, - formData: '1234', + formData: {simpleBinding:'1234'}, }); const inputComponent: any = await findByTestId(`${mockId}-formatted-number`); expect(inputComponent.value).toEqual('$1,234'); @@ -83,7 +84,7 @@ describe('components/base/InputComponent.tsx', () => { isValid: mockIsValid, readOnly: mockReadOnly, required: mockRequired, - }; + } as unknown as IInputProps; return render(); } diff --git a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/ParagraphComponent.test.tsx b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/ParagraphComponent.test.tsx index fced72e20cd..a5d11ae7c36 100644 --- a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/ParagraphComponent.test.tsx +++ b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/ParagraphComponent.test.tsx @@ -3,20 +3,16 @@ import { shallow } from 'enzyme'; import 'jest'; import * as React from 'react'; import * as renderer from 'react-test-renderer'; +import { IComponentProps } from 'src/components'; import { ParagraphComponent } from '../../../src/components/base/ParagraphComponent'; import { ITextResourceBindings } from '../../../src/features/form/layout'; describe('>>> components/base/ParagraphComponent.tsx --- Snapshot', () => { - let mockId: string; - let mockText: string; - let mockGetTextResource: (key: string) => string; - let mockLanguage: any; - let mockTextResourceBindings: ITextResourceBindings; - mockId = 'mock-id'; - mockText = 'Here goes a paragraph'; - mockGetTextResource = (key: string) => key; - mockLanguage = {}; - mockTextResourceBindings = { + const mockId = 'mock-id'; + const mockText = 'Here goes a paragraph'; + const mockGetTextResource = (key: string) => key; + const mockLanguage: any = {}; + const mockTextResourceBindings: ITextResourceBindings = { tile: mockText, } @@ -28,6 +24,7 @@ describe('>>> components/base/ParagraphComponent.tsx --- Snapshot', () => { language={mockLanguage} getTextResource={mockGetTextResource} textResourceBindings={mockTextResourceBindings} + {...({} as IComponentProps)} />, ); expect(rendered).toMatchSnapshot(); @@ -40,6 +37,7 @@ describe('>>> components/base/ParagraphComponent.tsx --- Snapshot', () => { language={mockLanguage} getTextResource={mockGetTextResource} textResourceBindings={mockTextResourceBindings} + {...({} as IComponentProps)} />, ); @@ -53,7 +51,8 @@ describe('>>> components/base/ParagraphComponent.tsx --- Snapshot', () => { text={mockText} language={mockLanguage} getTextResource={mockGetTextResource} - textResourceBindings={{ help: 'this is the help text'}} + textResourceBindings={{ help: 'this is the help text' }} + {...({} as IComponentProps)} />, ); diff --git a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/TextAreaComponent.test.tsx b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/TextAreaComponent.test.tsx index 1fe8af75d62..a5f4fa7a287 100644 --- a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/TextAreaComponent.test.tsx +++ b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/base/TextAreaComponent.test.tsx @@ -4,8 +4,9 @@ import * as React from 'react'; import * as renderer from 'react-test-renderer'; import { mount } from 'enzyme'; -import { TextAreaComponent, ITextAreaComponentProps } from '../../../src/components/base/TextAreaComponent'; +import { TextAreaComponent } from '../../../src/components/base/TextAreaComponent'; import { render, fireEvent } from '@testing-library/react'; +import { IComponentProps } from 'src/components'; describe('>>> components/base/TextAreaComponent.tsx', () => { let mockId: string; @@ -30,6 +31,7 @@ describe('>>> components/base/TextAreaComponent.tsx', () => { handleDataChange={mockHandleDataChange} isValid={mockIsValid} readOnly={mockReadOnly} + {...({} as IComponentProps)} />, ); expect(rendered).toMatchSnapshot(); @@ -52,6 +54,7 @@ describe('>>> components/base/TextAreaComponent.tsx', () => { handleDataChange={mockHandleDataChange} isValid={mockIsValid} readOnly={mockReadOnly} + {...({} as IComponentProps)} />, ); expect(wrapper.find('textarea').hasClass('disabled')).toBe(false); @@ -66,20 +69,21 @@ describe('>>> components/base/TextAreaComponent.tsx', () => { handleDataChange={mockHandleDataChange} isValid={mockIsValid} readOnly={true} + {...({} as IComponentProps)} />, ); expect(wrapper.find('textarea').hasClass('disabled')).toBe(true); expect(wrapper.find('textarea').prop('readOnly')).toBe(true); }); - function renderTextAreaComponent(props: Partial = {}) { - const defaultProps: ITextAreaComponentProps = { + function renderTextAreaComponent(props: Partial = {}) { + const defaultProps: IComponentProps = { id: mockId, formData: mockFormData, handleDataChange: mockHandleDataChange, isValid: mockIsValid, readOnly: mockReadOnly, - }; + } as IComponentProps; return render(); } diff --git a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/presentation/NavigationButton.test.tsx b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/presentation/NavigationButton.test.tsx index 1893c542676..f52a5fb5f57 100644 --- a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/presentation/NavigationButton.test.tsx +++ b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/components/presentation/NavigationButton.test.tsx @@ -7,6 +7,7 @@ import { render, screen } from '@testing-library/react'; import configureStore from 'redux-mock-store'; import { getFormLayoutStateMock, getInitialStateMock } from '../../../__mocks__/mocks'; import { NavigationButtons } from '../../../src/components/presentation/NavigationButtons'; +import { IComponentProps } from 'src/components'; describe('>>> components/presentation/NavigationButton.tsx', () => { let mockStore; @@ -92,6 +93,7 @@ describe('>>> components/presentation/NavigationButton.tsx', () => { id='nav-button-1' showBackButton={false} textResourceBindings={null} + {...({} as IComponentProps)} /> , ); @@ -107,6 +109,7 @@ describe('>>> components/presentation/NavigationButton.tsx', () => { id='nav-button-1' showBackButton={true} textResourceBindings={null} + {...({} as IComponentProps)} /> , ); @@ -136,6 +139,7 @@ describe('>>> components/presentation/NavigationButton.tsx', () => { id='nav-button-2' showBackButton={true} textResourceBindings={null} + {...({} as IComponentProps)} /> , ); diff --git a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/features/form/data/submitFormDataSagas.test.ts b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/features/form/data/submitFormDataSagas.test.ts index dae07fa94cb..246eef79069 100644 --- a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/features/form/data/submitFormDataSagas.test.ts +++ b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/features/form/data/submitFormDataSagas.test.ts @@ -53,7 +53,7 @@ describe('submitFormDataSagas', () => { formData: getFormDataStateMock({ formData: { field1: 'value1', - field2: 123, + field2: '123', }, }), }; @@ -89,9 +89,7 @@ describe('submitFormDataSagas', () => { }, formData: { ...stateMock.formData, - formData: { - formData, - }, + formData: formData, }, formLayout: { ...stateMock.formLayout, @@ -125,11 +123,13 @@ describe('submitFormDataSagas', () => { }], ]) .call(saveStatelessData, state, model) - .put(FormDataActions.fetchFormDataFulfilled({ formData: + .put(FormDataActions.fetchFormDataFulfilled({ + formData: { ...formData, 'group.field1': 'value1', - } })) + } + })) .call(FormDynamicsActions.checkIfConditionalRulesShouldRun) .put(FormDataActions.submitFormDataFulfilled()) .run(); diff --git a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/utils/conditionalRendering.test.ts b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/utils/conditionalRendering.test.ts index 7c6a78ff138..a8e62255f6b 100644 --- a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/utils/conditionalRendering.test.ts +++ b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/utils/conditionalRendering.test.ts @@ -156,7 +156,7 @@ describe('>>> utils/conditionalRendering.ts', () => { }; const formData = { - 'mockGroup[0].mockField': 8, + 'mockGroup[0].mockField': '8', }; const result = runConditionalRenderingRules(showRules, formData, repeatingGroups); diff --git a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/utils/formComponentUtils.test.ts b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/utils/formComponentUtils.test.ts index 6af2fda3a90..bde6b60f5dd 100644 --- a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/utils/formComponentUtils.test.ts +++ b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/utils/formComponentUtils.test.ts @@ -1,4 +1,4 @@ -import { getDisplayFormData, getFormDataForComponentInRepeatingGroup, isSimpleComponent } from '../../src/utils/formComponentUtils'; +import { getDisplayFormData, getFormDataForComponentInRepeatingGroup, componentValidationsHandledByGenericComponent } from '../../src/utils/formComponentUtils'; import { IOptions, ITextResource } from '../../src/types'; import { IFormData } from '../../src/features/form/data/formDataReducer'; import { ILayoutComponent, ISelectionComponentProps } from '../../src/features/form/layout'; @@ -85,33 +85,33 @@ describe('>>> utils/formComponentUtils.ts', () => { expect(result).toEqual('RepValue1, RepValue2, RepValue3'); }); - it('+++ isSimpleComponent should return false when dataModelBinding is undefined', () => { + it('+++ componentValidationsHandledByGenericComponent should return false when dataModelBinding is undefined', () => { const genericComponent = { type: 'FileUpload', } - const result = isSimpleComponent(undefined, genericComponent.type); + const result = componentValidationsHandledByGenericComponent(undefined, genericComponent.type); expect(result).toEqual(false); }); - it('+++ isSimpleComponent should return false when component type is Datepicker', () => { + it('+++ componentValidationsHandledByGenericComponent should return false when component type is Datepicker', () => { const genericComponent = { type: 'Datepicker', dataModelBindings: { simpleBinding: 'group.superdate', }, } - const result = isSimpleComponent(genericComponent.dataModelBindings, genericComponent.type); + const result = componentValidationsHandledByGenericComponent(genericComponent.dataModelBindings, genericComponent.type); expect(result).toEqual(false); }); - it('+++ isSimpleComponent should return true when component type is Input', () => { + it('+++ componentValidationsHandledByGenericComponent should return true when component type is Input', () => { const genericComponent = { type: 'Input', dataModelBindings: { simpleBinding: 'group.secretnumber', }, } - const result = isSimpleComponent(genericComponent.dataModelBindings, genericComponent.type); + const result = componentValidationsHandledByGenericComponent(genericComponent.dataModelBindings, genericComponent.type); expect(result).toEqual(true); }); }); diff --git a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/utils/rules.test.tsx b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/utils/rules.test.tsx index ec35849f1c6..045efb7f1ac 100644 --- a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/utils/rules.test.tsx +++ b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/utils/rules.test.tsx @@ -1,12 +1,12 @@ /* eslint-disable no-param-reassign */ /* eslint-disable no-undef */ import 'jest'; -import { IFormData } from '../../src/features/form/data/formDataReducer'; +import { IFormDataState } from '../../src/features/form/data/formDataReducer'; import { checkIfRuleShouldRun, getRuleModelFields } from '../../src/utils/rules'; describe('>>> features/rules checkIfRuleShouldRun', () => { let mockRuleConnectionState: any; - let mockFormDataState: IFormData; + let mockFormDataState: Partial; let mockFormLayoutState: any; let mockLastUpdatedDataBinding: string; let mockRuleHandlerHelper; diff --git a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/utils/validation.test.ts b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/utils/validation.test.ts index caeff3553d4..1f38dd19bfe 100644 --- a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/utils/validation.test.ts +++ b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/__tests__/utils/validation.test.ts @@ -21,8 +21,8 @@ describe('utils > validation', () => { let mockLayoutState: any; let mockJsonSchema: any; let mockInvalidTypes: any; - let mockFormData: IFormData; - let mockValidFormData: IFormData; + let mockFormData: any; + let mockValidFormData: any; let mockFormValidationResult: any; let mockLanguage: any; let mockFormAttachments: any; diff --git a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/GenericComponent.tsx b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/GenericComponent.tsx index a87ac941df7..714e78fd6fd 100644 --- a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/GenericComponent.tsx +++ b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/GenericComponent.tsx @@ -3,14 +3,13 @@ import { shallowEqual } from 'react-redux'; import { getTextResourceByKey } from 'altinn-shared/utils'; import { ILabelSettings, - ITextResource, Triggers, - IComponentValidations, + IComponentValidations } from 'src/types'; import { Grid, makeStyles } from '@material-ui/core'; import classNames from 'classnames'; -import components from '.'; +import components, { IComponentProps } from '.'; import FormDataActions from '../features/form/data/formDataActions'; import { IDataModelBindings, @@ -26,7 +25,7 @@ import Legend from '../features/form/components/Legend'; import { renderValidationMessagesForComponent } from '../utils/render'; import { getFormDataForComponent, - isSimpleComponent, + componentValidationsHandledByGenericComponent, componentHasValidationMessages, getTextResource, isComponentValid, @@ -88,7 +87,6 @@ export function GenericComponent(props: IGenericComponentProps) { const classes = useStyles(props); const GetHiddenSelector = makeGetHidden(); const GetFocusSelector = makeGetFocus(); - const [isSimple, setIsSimple] = React.useState(true); const [hasValidationMessages, setHasValidationMessages] = React.useState(false); @@ -97,7 +95,7 @@ export function GenericComponent(props: IGenericComponentProps) { getFormDataForComponent(state.formData.formData, props.dataModelBindings), shallowEqual, ); - const currentView: string = useAppSelector( + const currentView = useAppSelector( state => state.formLayout.uiConfig.currentView, ); const isValid = useAppSelector(state => @@ -106,8 +104,8 @@ export function GenericComponent(props: IGenericComponentProps) { ), ); const language = useAppSelector(state => state.language.language); - const textResources: ITextResource[] = useAppSelector(state => state.textResources.resources); - const texts: any = useAppSelector(state => + const textResources = useAppSelector(state => state.textResources.resources); + const texts = useAppSelector(state => selectComponentTexts( state.textResources.resources, props.textResourceBindings, @@ -121,10 +119,6 @@ export function GenericComponent(props: IGenericComponentProps) { shallowEqual, ); - React.useEffect(() => { - setIsSimple(isSimpleComponent(props.dataModelBindings, props.type)); - }, []); - React.useEffect(() => { setHasValidationMessages( componentHasValidationMessages(componentValidations), @@ -135,7 +129,7 @@ export function GenericComponent(props: IGenericComponentProps) { return null; } - const handleDataUpdate = (value: any, key = 'simpleBinding') => { + const handleDataUpdate = (value: string, key = 'simpleBinding') => { if (!props.dataModelBindings || !props.dataModelBindings[key]) { return; } @@ -144,12 +138,7 @@ export function GenericComponent(props: IGenericComponentProps) { return; } - if (formData instanceof Object) { - if (formData[key] && formData[key] === value) { - // data unchanged, do nothing - return; - } - } else if (formData && formData === value) { + if (formData[key] === value) { // data unchanged, do nothing return; } @@ -272,7 +261,7 @@ export function GenericComponent(props: IGenericComponentProps) { return getTextResourceByKey(key, textResources); }; - const componentProps = { + const componentProps:IComponentProps = { handleDataChange: handleDataUpdate, handleFocusUpdate, getTextResource: getTextResourceWrapper, @@ -347,7 +336,7 @@ export function GenericComponent(props: IGenericComponentProps) { > - {isSimple && + {componentValidationsHandledByGenericComponent(props.dataModelBindings, props.type) && hasValidationMessages && renderValidationMessagesForComponent( componentValidations?.simpleBinding, diff --git a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/advanced/AddressComponent.tsx b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/advanced/AddressComponent.tsx index ecf78335491..bb1efd78d5f 100644 --- a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/advanced/AddressComponent.tsx +++ b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/advanced/AddressComponent.tsx @@ -6,27 +6,15 @@ import axios from 'axios'; import * as React from 'react'; import { getLanguageFromKey, get } from 'altinn-shared/utils'; import { IComponentValidations, ILabelSettings } from 'src/types'; -import { IDataModelBindings, ITextResourceBindings } from '../../features/form/layout'; import '../../styles/AddressComponent.css'; import '../../styles/shared.css'; import { renderValidationMessagesForComponent } from '../../utils/render'; import classNames from 'classnames'; -import { ILanguage } from 'altinn-shared/types'; +import { IComponentProps } from '..'; -export interface IAddressComponentProps { - id: string; - formData: { [id: string]: string }; - handleDataChange: (value: any, key: string) => void; - getTextResource: (key: string) => string; - isValid?: boolean; +export interface IAddressComponentProps extends IComponentProps { simplified: boolean; - dataModelBindings: IDataModelBindings; - readOnly: boolean; - required: boolean; labelSettings?: ILabelSettings; - language: ILanguage; - textResourceBindings: ITextResourceBindings; - componentValidations?: IComponentValidations; } interface IAddressValidationErrors { diff --git a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/base/AttachmentListComponent.tsx b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/base/AttachmentListComponent.tsx index 4401f134dca..46b79279483 100644 --- a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/base/AttachmentListComponent.tsx +++ b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/base/AttachmentListComponent.tsx @@ -3,10 +3,9 @@ import { AltinnAttachment } from 'altinn-shared/components'; import { mapInstanceAttachments } from 'altinn-shared/utils'; import { Grid, Typography } from '@material-ui/core'; import { useAppSelector } from 'src/common/hooks'; +import { IComponentProps } from '..'; -export interface IAttachmentListProps { - id: string; - text: string; +export interface IAttachmentListProps extends IComponentProps { dataTypeIds?: string[]; } diff --git a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/base/ButtonComponent.tsx b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/base/ButtonComponent.tsx index 7f50c7d5720..037f36996fb 100644 --- a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/base/ButtonComponent.tsx +++ b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/base/ButtonComponent.tsx @@ -5,15 +5,11 @@ import { AltinnLoader } from 'altinn-shared/components'; import { IAltinnWindow } from '../../types'; import FormDataActions from '../../features/form/data/formDataActions'; import { useAppDispatch, useAppSelector } from 'src/common/hooks'; -import { ILanguage } from 'altinn-shared/types'; +import { IComponentProps } from '..'; -export interface IButtonProvidedProps { - id: string; - text: string; +export interface IButtonProvidedProps extends IComponentProps { disabled: boolean; - handleDataChange: (value: any) => void; formDataCount: number; - language: ILanguage; } const buttonStyle = { diff --git a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/base/CheckboxesContainerComponent.tsx b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/base/CheckboxesContainerComponent.tsx index e633e08cf63..343da0a605b 100644 --- a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/base/CheckboxesContainerComponent.tsx +++ b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/base/CheckboxesContainerComponent.tsx @@ -7,22 +7,13 @@ import { AltinnAppTheme } from 'altinn-shared/theme'; import classNames from 'classnames'; import { renderValidationMessagesForComponent } from '../../utils/render'; import { useAppSelector } from 'src/common/hooks'; +import { IComponentProps } from '..'; -export interface ICheckboxContainerProps { - id: string; - formData: any; - handleDataChange: (value: any) => void; - handleFocusUpdate: (value: any) => void; - isValid: boolean; +export interface ICheckboxContainerProps extends IComponentProps { validationMessages: any; options: any[]; optionsId: string; - preselectedOptionIndex: number; - readOnly: boolean; - shouldFocus: boolean; - legend: () => JSX.Element; - getTextResource: (key: string) => JSX.Element; - getTextResourceAsString: (key: string) => string; + preselectedOptionIndex?: number; } export interface IStyledCheckboxProps extends CheckboxProps { @@ -99,11 +90,11 @@ export const CheckboxContainerComponent = (props: ICheckboxContainerProps) => { React.useEffect(() => { returnState(); - }, [props.formData]); + }, [props.formData?.simpleBinding]); const returnState = () => { if ( - !props.formData && + !props.formData?.simpleBinding && props.preselectedOptionIndex >= 0 && options && props.preselectedOptionIndex < options.length @@ -114,7 +105,7 @@ export const CheckboxContainerComponent = (props: ICheckboxContainerProps) => { props.handleDataChange(preSelected[props.preselectedOptionIndex]); setSelected(preSelected); } else { - setSelected(props.formData ? props.formData.toString().split(',') : []); + setSelected(props.formData?.simpleBinding ? props.formData.simpleBinding.split(',') : []); } }; @@ -133,7 +124,7 @@ export const CheckboxContainerComponent = (props: ICheckboxContainerProps) => { }; const handleOnBlur = () => { - props.handleDataChange(props.formData); + props.handleDataChange(props.formData?.simpleBinding ?? ''); }; const selectedHasValues = (select: string[]): boolean => { diff --git a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/base/DatepickerComponent.tsx b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/base/DatepickerComponent.tsx index d7c15a48a12..72e2a29c31a 100644 --- a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/base/DatepickerComponent.tsx +++ b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/base/DatepickerComponent.tsx @@ -17,28 +17,19 @@ import MomentUtils from '@date-io/moment'; import { getLanguageFromKey } from 'altinn-shared/utils'; import { AltinnAppTheme } from 'altinn-shared/theme'; import { - IComponentValidations, IComponentBindingValidation, DateFlags, } from 'src/types'; import { getFlagBasedDate, getISOString } from '../../utils/dateHelpers'; import { renderValidationMessagesForComponent } from '../../utils/render'; import { validateDatepickerFormData } from '../../utils/validation'; -import { ILanguage } from 'altinn-shared/types'; +import { IComponentProps } from '..'; -export interface IDatePickerProps { - id: string; - readOnly: boolean; - required: boolean; - formData: any; - handleDataChange: (value: any) => void; - isValid?: boolean; +export interface IDatePickerProps extends IComponentProps { timeStamp?: boolean; format: string; minDate: string; maxDate: string; - language: ILanguage; - componentValidations: IComponentValidations; } const useStyles = makeStyles({ @@ -152,10 +143,10 @@ function DatepickerComponent(props: IDatePickerProps) { }; React.useEffect(() => { - const dateValue = props.formData ? moment(props.formData) : null; + const dateValue = props.formData?.simpleBinding ? moment(props.formData.simpleBinding) : null; setDate(dateValue); setValidationMessages(getValidationMessages()); - }, [props.formData]); + }, [props.formData?.simpleBinding]); React.useEffect(() => { setValidationMessages(getValidationMessages()); diff --git a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/base/DropdownComponent.tsx b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/base/DropdownComponent.tsx index 15c88c1a791..75dd6207303 100644 --- a/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/base/DropdownComponent.tsx +++ b/src/Altinn.Apps/AppFrontend/react/altinn-app-frontend/src/components/base/DropdownComponent.tsx @@ -5,15 +5,10 @@ import classNames from 'classnames'; import { makeStyles } from '@material-ui/core'; import { AltinnAppTheme } from 'altinn-shared/theme'; import { useAppSelector } from 'src/common/hooks'; +import { IComponentProps } from '..'; -export interface IDropdownProps { - formData: string; - getTextResourceAsString: (resourceKey: string) => string; - handleDataChange: (value: string) => void; - id: string; - isValid?: boolean; +export interface IDropdownProps extends IComponentProps { optionsId: string; - readOnly: boolean; preselectedOptionIndex?: number; } @@ -46,7 +41,7 @@ function DropdownComponent(props: IDropdownProps) { const returnState = () => { if ( - !props.formData && + !props.formData?.simpleBinding && props.preselectedOptionIndex >= 0 && options && props.preselectedOptionIndex < options.length @@ -66,7 +61,7 @@ function DropdownComponent(props: IDropdownProps) { return (