@openmrs/esm-form-engine-lib 3.1.4-pre.1779 → 3.1.4-pre.1783
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/__mocks__/forms/afe-forms/index.ts +9 -0
- package/__mocks__/forms/index.ts +19 -0
- package/__mocks__/forms/rfe-forms/index.ts +50 -0
- package/__mocks__/index.ts +85 -0
- package/__mocks__/single-spa-react.js +4 -9
- package/jest.config.js +1 -1
- package/package.json +1 -1
- package/src/components/inputs/date/date.component.tsx +7 -7
- package/src/components/inputs/date/date.test.tsx +2 -22
- package/src/components/inputs/markdown/markdown.component.tsx +8 -4
- package/src/components/inputs/multi-select/multi-select.component.tsx +11 -15
- package/src/components/inputs/multi-select/multi-select.test.tsx +3 -6
- package/src/components/inputs/number/number.component.tsx +6 -6
- package/src/components/inputs/number/number.test.tsx +6 -4
- package/src/components/inputs/radio/radio.component.tsx +2 -2
- package/src/components/inputs/radio/radio.test.tsx +3 -5
- package/src/components/inputs/select/dropdown.component.tsx +1 -0
- package/src/components/inputs/select/dropdown.test.tsx +1 -1
- package/src/components/inputs/text/text.component.tsx +9 -9
- package/src/components/inputs/text/text.test.tsx +5 -5
- package/src/components/inputs/text-area/text-area.component.tsx +2 -2
- package/src/components/inputs/toggle/toggle.component.tsx +3 -3
- package/src/components/inputs/ui-select-extended/ui-select-extended.test.tsx +11 -21
- package/src/components/inputs/unspecified/unspecified.test.tsx +6 -17
- package/src/components/label/label.component.tsx +1 -1
- package/src/components/renderer/field/fieldLogic.test.ts +4 -10
- package/src/components/renderer/field/form-field-renderer.component.tsx +9 -9
- package/src/components/sidebar/useCurrentActivePage.test.ts +0 -1
- package/src/form-engine.test.tsx +34 -46
- package/src/hooks/useFormJson.test.tsx +16 -13
- package/src/hooks/useFormWorkspaceSize.test.ts +40 -19
- package/src/hooks/useInitialValues.test.ts +3 -2
- package/src/hooks/usePostSubmissionActions.test.tsx +0 -2
- package/src/setup-tests.ts +35 -0
- package/src/transformers/default-schema-transformer.test.ts +1 -1
- package/src/utils/common-utils.test.ts +4 -9
- package/src/utils/common-utils.ts +9 -2
- package/src/utils/forms-loader.test.ts +1 -1
- package/src/zscore-tests/bmi-age.test.tsx +2 -7
- package/src/zscore-tests/height-age.test.tsx +2 -7
- package/src/zscore-tests/weight-height.test.tsx +2 -7
- package/src/setupTests.ts +0 -5
- /package/__mocks__/forms/afe-forms/{component_art.json → component-art.json} +0 -0
- /package/__mocks__/forms/afe-forms/{component_preclinic-review.json → component-preclinic-review.json} +0 -0
- /package/__mocks__/forms/afe-forms/{demo_hts-form.json → demo-hts-form.json} +0 -0
- /package/__mocks__/forms/rfe-forms/{component_art.json → component-art.json} +0 -0
- /package/__mocks__/forms/rfe-forms/{component_preclinic-review.json → component-preclinic-review.json} +0 -0
- /package/__mocks__/forms/rfe-forms/{demo_hts-form.json → demo-hts-form.json} +0 -0
- /package/__mocks__/forms/rfe-forms/{external_data_source_form.json → external-data-source-form.json} +0 -0
- /package/__mocks__/forms/rfe-forms/{labour_and_delivery_test_form.json → labour-and-delivery-test-form.json} +0 -0
- /package/__mocks__/forms/rfe-forms/{mockHistoricalvisitsEncounter.json → mock-historical-visits-encounter.json} +0 -0
- /package/__mocks__/forms/rfe-forms/{mockSaveEncounter.json → mock-save-encounter.json} +0 -0
- /package/__mocks__/forms/rfe-forms/{obs-group-test_form.json → obs-group-test-form.json} +0 -0
- /package/__mocks__/forms/rfe-forms/{sample_fields.json → sample-fields.json} +0 -0
- /package/__mocks__/forms/rfe-forms/{sample_ui-select-ext.json → sample-ui-select-ext.json} +0 -0
- /package/__mocks__/forms/rfe-forms/{sample_unspecified-form.json → sample-unspecified-form.json} +0 -0
@@ -0,0 +1,9 @@
|
|
1
|
+
export { default as artComponentSkeleton } from './component-art.json';
|
2
|
+
export { default as demoHtsOpenmrsForm } from './demo-hts-form.json';
|
3
|
+
export { default as formComponentSkeleton } from './form-component.json';
|
4
|
+
export { default as miniFormSkeleton } from './mini-form.json';
|
5
|
+
export { default as nestedForm1Skeleton } from './nested-form1.json';
|
6
|
+
export { default as nestedForm2Skeleton } from './nested-form2.json';
|
7
|
+
export { default as preclinicReviewComponentSkeleton } from './component-preclinic-review.json';
|
8
|
+
export { default as testForm } from './test-schema-transformer-form.json';
|
9
|
+
export { default as testOrdersForm } from './test-orders.json';
|
@@ -0,0 +1,19 @@
|
|
1
|
+
// RFE Forms
|
2
|
+
export * from './rfe-forms';
|
3
|
+
|
4
|
+
// AFE Forms
|
5
|
+
export * from './afe-forms';
|
6
|
+
|
7
|
+
// Form Components
|
8
|
+
export { default as artComponentBody } from './rfe-forms/component-art.json';
|
9
|
+
export { default as artComponentSkeleton } from './afe-forms/component-art.json';
|
10
|
+
export { default as formComponentBody } from './rfe-forms/form-component.json';
|
11
|
+
export { default as formComponentSkeleton } from './afe-forms/form-component.json';
|
12
|
+
export { default as miniFormBody } from './rfe-forms/mini-form.json';
|
13
|
+
export { default as miniFormSkeleton } from './afe-forms/mini-form.json';
|
14
|
+
export { default as nestedForm1Body } from './rfe-forms/nested-form1.json';
|
15
|
+
export { default as nestedForm1Skeleton } from './afe-forms/nested-form1.json';
|
16
|
+
export { default as nestedForm2Body } from './rfe-forms/nested-form2.json';
|
17
|
+
export { default as nestedForm2Skeleton } from './afe-forms/nested-form2.json';
|
18
|
+
export { default as preclinicReviewComponentBody } from './rfe-forms/component-preclinic-review.json';
|
19
|
+
export { default as preclinicReviewComponentSkeleton } from './afe-forms/component-preclinic-review.json';
|
@@ -0,0 +1,50 @@
|
|
1
|
+
export { default as ageValidationForm } from './age-validation-form.json';
|
2
|
+
export { default as artComponentBody } from './component-art.json';
|
3
|
+
export { default as bmiForAgeScoreTestSchema } from './zscore-bmi-for-age-form.json';
|
4
|
+
export { default as bmiForm } from './bmi-test-form.json';
|
5
|
+
export { default as bsaForm } from './bsa-test-form.json';
|
6
|
+
export { default as conditionalAnsweredForm } from './conditional-answered-form.json';
|
7
|
+
export { default as conditionalRequiredTestForm } from './conditional-required-form.json';
|
8
|
+
export { default as defaultValuesForm } from './default-values-form.json';
|
9
|
+
export { default as demoHtsForm } from './demo-hts-form.json';
|
10
|
+
export { default as diagnosisForm } from './diagnosis-test-form.json';
|
11
|
+
export { default as eddForm } from './edd-test-form.json';
|
12
|
+
export { default as externalDataSourceForm } from './external-data-source-form.json';
|
13
|
+
export { default as filterAnswerOptionsTestForm } from './filter-answer-options-test-form.json';
|
14
|
+
export { default as formComponentBody } from './form-component.json';
|
15
|
+
export { default as heightForAgeZscoreTestSchema } from './zscore-height-for-age-form.json';
|
16
|
+
export { default as hidePagesAndSectionsForm } from './hide-pages-and-sections-form.json';
|
17
|
+
export { default as historicalExpressionsForm } from './historical-expressions-form.json';
|
18
|
+
export { default as htsPocForm } from './demo-hts-form.json';
|
19
|
+
export { default as jsExpressionValidationForm } from './js-expression-validation-form.json';
|
20
|
+
export { default as labourAndDeliveryTestForm } from './labour-and-delivery-test-form.json';
|
21
|
+
export { default as miniFormBody } from './mini-form.json';
|
22
|
+
export { default as mockConceptsForm } from './sample-fields.json';
|
23
|
+
export { default as mockHxpEncounter } from './mock-historical-visits-encounter.json';
|
24
|
+
export { default as mockSaveEncounter } from './mock-save-encounter.json';
|
25
|
+
export { default as monthsOnArtForm } from './months-on-art-form.json';
|
26
|
+
export { default as multiSelectFormSchema } from './multi-select-form.json';
|
27
|
+
export { default as nestedForm1Body } from './nested-form1.json';
|
28
|
+
export { default as nestedForm2Body } from './nested-form2.json';
|
29
|
+
export { default as nextVisitForm } from './next-visit-test-form.json';
|
30
|
+
export { default as obsGroupTestForm } from './obs-group-test-form.json';
|
31
|
+
export { default as postSubmissionTestForm } from './post-submission-test-form.json';
|
32
|
+
export { default as preclinicReviewComponentBody } from './component-preclinic-review.json';
|
33
|
+
export { default as radioButtonFormSchema } from './radio-button-form.json';
|
34
|
+
export { default as readOnlyValidationForm } from './read-only-validation-form.json';
|
35
|
+
export { default as referenceByMappingForm } from './reference-by-mapping-form.json';
|
36
|
+
export { default as requiredTestForm } from './required-form.json';
|
37
|
+
export { default as sampleFieldsForm } from './sample-fields.json';
|
38
|
+
export { default as testEnrolmentForm } from './test-enrolment-form.json';
|
39
|
+
export { default as uiSelectExtForm } from './sample-ui-select-ext.json';
|
40
|
+
export { default as unspecifiedForm } from './sample-unspecified-form.json';
|
41
|
+
export { default as viralLoadStatusForm } from './viral-load-status-form.json';
|
42
|
+
export { default as weightForHeightZscoreTestSchema } from './zscore-weight-height-form.json';
|
43
|
+
|
44
|
+
export { obsList } from './obs-list-data';
|
45
|
+
export {
|
46
|
+
htsHivtestResultingSchemaV2,
|
47
|
+
htsRetrospectiveResultingSchemaV2,
|
48
|
+
htsWildcardResultingSchemaV2,
|
49
|
+
testSchemaV2,
|
50
|
+
} from './forms-loader.test.schema';
|
@@ -0,0 +1,85 @@
|
|
1
|
+
// Form mocks
|
2
|
+
export * from './forms';
|
3
|
+
|
4
|
+
// Patient mocks
|
5
|
+
export { mockPatient } from './patient.mock';
|
6
|
+
|
7
|
+
// Session mocks
|
8
|
+
export { mockSessionDataResponse } from './session.mock';
|
9
|
+
export { mockVisit } from './visit.mock';
|
10
|
+
|
11
|
+
// Form schemas
|
12
|
+
export { default as ageValidationForm } from './forms/rfe-forms/age-validation-form.json';
|
13
|
+
export { default as bmiForAgeScoreTestSchema } from './forms/rfe-forms/zscore-bmi-for-age-form.json';
|
14
|
+
export { default as bmiForm } from './forms/rfe-forms/bmi-test-form.json';
|
15
|
+
export { default as bsaForm } from './forms/rfe-forms/bsa-test-form.json';
|
16
|
+
export { default as conditionalAnsweredForm } from './forms/rfe-forms/conditional-answered-form.json';
|
17
|
+
export { default as conditionalRequiredTestForm } from './forms/rfe-forms/conditional-required-form.json';
|
18
|
+
export { default as defaultValuesForm } from './forms/rfe-forms/default-values-form.json';
|
19
|
+
export { default as demoHtsForm } from './forms/rfe-forms/demo-hts-form.json';
|
20
|
+
export { default as demoHtsOpenmrsForm } from './forms/afe-forms/demo-hts-form.json';
|
21
|
+
export { default as diagnosisForm } from './forms/rfe-forms/diagnosis-test-form.json';
|
22
|
+
export { default as eddForm } from './forms/rfe-forms/edd-test-form.json';
|
23
|
+
export { default as externalDataSourceForm } from './forms/rfe-forms/external-data-source-form.json';
|
24
|
+
export { default as filterAnswerOptionsTestForm } from './forms/rfe-forms/filter-answer-options-test-form.json';
|
25
|
+
export { default as heightForAgeZscoreTestSchema } from './forms/rfe-forms/zscore-height-for-age-form.json';
|
26
|
+
export { default as hidePagesAndSectionsForm } from './forms/rfe-forms/hide-pages-and-sections-form.json';
|
27
|
+
export { default as historicalExpressionsForm } from './forms/rfe-forms/historical-expressions-form.json';
|
28
|
+
export { default as htsPocForm } from './forms/rfe-forms/demo-hts-form.json';
|
29
|
+
export { default as jsExpressionValidationForm } from './forms/rfe-forms/js-expression-validation-form.json';
|
30
|
+
export { default as labourAndDeliveryTestForm } from './forms/rfe-forms/labour-and-delivery-test-form.json';
|
31
|
+
export { default as mockConceptsForm } from './forms/rfe-forms/sample-fields.json';
|
32
|
+
export { default as mockHxpEncounter } from './forms/rfe-forms/mock-historical-visits-encounter.json';
|
33
|
+
export { default as mockSaveEncounter } from './forms/rfe-forms/mock-save-encounter.json';
|
34
|
+
export { default as monthsOnArtForm } from './forms/rfe-forms/months-on-art-form.json';
|
35
|
+
export { default as multiSelectFormSchema } from './forms/rfe-forms/multi-select-form.json';
|
36
|
+
export { default as nextVisitForm } from './forms/rfe-forms/next-visit-test-form.json';
|
37
|
+
export { default as obsGroupTestForm } from './forms/rfe-forms/obs-group-test-form.json';
|
38
|
+
export { default as postSubmissionTestForm } from './forms/rfe-forms/post-submission-test-form.json';
|
39
|
+
export { default as radioButtonFormSchema } from './forms/rfe-forms/radio-button-form.json';
|
40
|
+
export { default as readOnlyValidationForm } from './forms/rfe-forms/read-only-validation-form.json';
|
41
|
+
export { default as referenceByMappingForm } from './forms/rfe-forms/reference-by-mapping-form.json';
|
42
|
+
export { default as requiredTestForm } from './forms/rfe-forms/required-form.json';
|
43
|
+
export { default as sampleFieldsForm } from './forms/rfe-forms/sample-fields.json';
|
44
|
+
export { default as testEnrolmentForm } from './forms/rfe-forms/test-enrolment-form.json';
|
45
|
+
export { default as testForm } from './forms/afe-forms/test-schema-transformer-form.json';
|
46
|
+
export { default as testOrdersForm } from './forms/afe-forms/test-orders.json';
|
47
|
+
export { default as uiSelectExtForm } from './forms/rfe-forms/sample-ui-select-ext.json';
|
48
|
+
export { default as viralLoadStatusForm } from './forms/rfe-forms/viral-load-status-form.json';
|
49
|
+
export { default as weightForHeightZscoreTestSchema } from './forms/rfe-forms/zscore-weight-height-form.json';
|
50
|
+
|
51
|
+
// Form components
|
52
|
+
export { default as artComponentBody } from './forms/rfe-forms/component-art.json';
|
53
|
+
export { default as artComponentSkeleton } from './forms/afe-forms/component-art.json';
|
54
|
+
export { default as formComponentBody } from './forms/rfe-forms/form-component.json';
|
55
|
+
export { default as formComponentSkeleton } from './forms/afe-forms/form-component.json';
|
56
|
+
export { default as miniFormBody } from './forms/rfe-forms/mini-form.json';
|
57
|
+
export { default as miniFormSkeleton } from './forms/afe-forms/mini-form.json';
|
58
|
+
export { default as nestedForm1Body } from './forms/rfe-forms/nested-form1.json';
|
59
|
+
export { default as nestedForm1Skeleton } from './forms/afe-forms/nested-form1.json';
|
60
|
+
export { default as nestedForm2Body } from './forms/rfe-forms/nested-form2.json';
|
61
|
+
export { default as nestedForm2Skeleton } from './forms/afe-forms/nested-form2.json';
|
62
|
+
export { default as preclinicReviewComponentBody } from './forms/rfe-forms/component-preclinic-review.json';
|
63
|
+
export { default as preclinicReviewComponentSkeleton } from './forms/afe-forms/component-preclinic-review.json';
|
64
|
+
|
65
|
+
// Concepts
|
66
|
+
export { default as mockConcepts } from './concepts.mock.json';
|
67
|
+
|
68
|
+
export { obsList } from './forms/rfe-forms/obs-list-data';
|
69
|
+
export {
|
70
|
+
testSchemaV2,
|
71
|
+
htsRetrospectiveResultingSchemaV2,
|
72
|
+
htsHivtestResultingSchemaV2,
|
73
|
+
htsWildcardResultingSchemaV2,
|
74
|
+
} from './forms/rfe-forms/forms-loader.test.schema';
|
75
|
+
|
76
|
+
export const formMocks = {
|
77
|
+
rfe: {
|
78
|
+
ageValidation: require('./forms/rfe-forms/age-validation-form.json'),
|
79
|
+
bmiForAge: require('./forms/rfe-forms/zscore-bmi-for-age-form.json'),
|
80
|
+
// ... other RFE forms
|
81
|
+
},
|
82
|
+
afe: {
|
83
|
+
// ... AFE forms
|
84
|
+
},
|
85
|
+
} as const;
|
@@ -1,11 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
const React = require("react");
|
4
|
-
//const context = require("../src/view-components/widget/testHelpers");
|
1
|
+
import React, { createContext } from 'react';
|
2
|
+
import { jest } from '@jest/globals';
|
5
3
|
|
6
|
-
const SingleSpaContext =
|
4
|
+
const SingleSpaContext = createContext({ mountParcel: () => jest.fn() });
|
7
5
|
|
8
|
-
|
9
|
-
module.exports = {
|
10
|
-
SingleSpaContext: SingleSpaContext
|
11
|
-
};
|
6
|
+
export { SingleSpaContext };
|
package/jest.config.js
CHANGED
@@ -26,6 +26,6 @@ module.exports = {
|
|
26
26
|
'react-markdown': '<rootDir>/__mocks__/react-markdown.tsx',
|
27
27
|
'^uuid$': '<rootDir>/node_modules/uuid/dist/index.js',
|
28
28
|
},
|
29
|
-
setupFilesAfterEnv: ['<rootDir>/src/
|
29
|
+
setupFilesAfterEnv: ['<rootDir>/src/setup-tests.ts'],
|
30
30
|
testEnvironment: 'jsdom',
|
31
31
|
};
|
package/package.json
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
2
|
+
import classNames from 'classnames';
|
2
3
|
import { useTranslation } from 'react-i18next';
|
3
4
|
import { Layer, TimePicker } from '@carbon/react';
|
4
|
-
import
|
5
|
-
import {
|
5
|
+
import { OpenmrsDatePicker } from '@openmrs/esm-framework';
|
6
|
+
import { formatDateAsDisplayString } from '../../../utils/common-utils';
|
7
|
+
import { isEmpty } from '../../../validators/form-validator';
|
6
8
|
import { isTrue } from '../../../utils/boolean-utils';
|
7
9
|
import { shouldUseInlineLayout } from '../../../utils/form-helper';
|
8
|
-
import { isEmpty } from '../../../validators/form-validator';
|
9
|
-
import FieldValueView from '../../value/view/field-value-view.component';
|
10
|
-
import styles from './date.scss';
|
11
|
-
import { OpenmrsDatePicker } from '@openmrs/esm-framework';
|
12
10
|
import { useFormProviderContext } from '../../../provider/form-provider';
|
11
|
+
import { type FormFieldInputProps } from '../../../types';
|
13
12
|
import FieldLabel from '../../field-label/field-label.component';
|
14
|
-
import
|
13
|
+
import FieldValueView from '../../value/view/field-value-view.component';
|
14
|
+
import styles from './date.scss';
|
15
15
|
|
16
16
|
const DateField: React.FC<FormFieldInputProps> = ({ field, value: dateValue, errors, warnings, setFieldValue }) => {
|
17
17
|
const { t } = useTranslation();
|
@@ -1,10 +1,8 @@
|
|
1
1
|
import React from 'react';
|
2
2
|
import { act, render, screen } from '@testing-library/react';
|
3
|
-
import {
|
3
|
+
import { type FormField } from '../../../types';
|
4
|
+
import { useFormProviderContext } from '../../../provider/form-provider';
|
4
5
|
import DateField from './date.component';
|
5
|
-
import { type FormField } from 'src/types';
|
6
|
-
import { OpenmrsDatePicker } from '@openmrs/esm-framework';
|
7
|
-
import dayjs from 'dayjs';
|
8
6
|
|
9
7
|
jest.mock('src/provider/form-provider', () => ({
|
10
8
|
useFormProviderContext: jest.fn(),
|
@@ -13,24 +11,6 @@ jest.mock('src/provider/form-provider', () => ({
|
|
13
11
|
const mockUseFormProviderContext = useFormProviderContext as jest.Mock;
|
14
12
|
const mockSetFieldValue = jest.fn();
|
15
13
|
|
16
|
-
const mockOpenmrsDatePicker = jest.mocked(OpenmrsDatePicker);
|
17
|
-
|
18
|
-
mockOpenmrsDatePicker.mockImplementation(({ id, labelText, value, onChange, isInvalid, invalidText }) => {
|
19
|
-
return (
|
20
|
-
<>
|
21
|
-
<label htmlFor={id}>{labelText}</label>
|
22
|
-
<input
|
23
|
-
id={id}
|
24
|
-
value={value ? dayjs(value as unknown as string).format('DD/MM/YYYY') : ''}
|
25
|
-
onChange={(evt) => {
|
26
|
-
onChange(dayjs(evt.target.value).toDate());
|
27
|
-
}}
|
28
|
-
/>
|
29
|
-
{isInvalid && <span>{invalidText}</span>}
|
30
|
-
</>
|
31
|
-
);
|
32
|
-
});
|
33
|
-
|
34
14
|
const dateFieldMock: FormField = {
|
35
15
|
id: 'test-date-field',
|
36
16
|
label: 'Test Date Field',
|
@@ -1,12 +1,16 @@
|
|
1
1
|
import React from 'react';
|
2
2
|
import { useTranslation } from 'react-i18next';
|
3
|
-
import MarkdownWrapper from './markdown-wrapper.component';
|
4
3
|
import { type FormFieldInputProps } from '../../../types';
|
4
|
+
import MarkdownWrapper from './markdown-wrapper.component';
|
5
5
|
|
6
6
|
const Markdown: React.FC<FormFieldInputProps> = ({ field }) => {
|
7
7
|
const { t } = useTranslation();
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
const markdownContent =
|
9
|
+
typeof field.value === 'string'
|
10
|
+
? t(field.value, { defaultValue: field.value, interpolation: { escapeValue: false } })
|
11
|
+
: field.value;
|
12
|
+
|
13
|
+
return !field.isHidden && <MarkdownWrapper markdown={markdownContent} />;
|
11
14
|
};
|
15
|
+
|
12
16
|
export default Markdown;
|
@@ -1,21 +1,21 @@
|
|
1
1
|
import React, { useEffect, useMemo, useRef, useState } from 'react';
|
2
|
-
import {
|
2
|
+
import { Checkbox, CheckboxGroup, FilterableMultiSelect, Layer, Tag } from '@carbon/react';
|
3
3
|
import { useTranslation } from 'react-i18next';
|
4
|
+
import { isTrue } from '../../../utils/boolean-utils';
|
5
|
+
import { shouldUseInlineLayout } from '../../../utils/form-helper';
|
4
6
|
import { type FormFieldInputProps } from '../../../types';
|
7
|
+
import { useFormProviderContext } from '../../../provider/form-provider';
|
5
8
|
import { ValueEmpty } from '../../value/value.component';
|
6
|
-
import
|
7
|
-
import { isTrue } from '../../../utils/boolean-utils';
|
9
|
+
import FieldLabel from '../../field-label/field-label.component';
|
8
10
|
import FieldValueView from '../../value/view/field-value-view.component';
|
9
11
|
import styles from './multi-select.scss';
|
10
|
-
import { useFormProviderContext } from '../../../provider/form-provider';
|
11
|
-
import FieldLabel from '../../field-label/field-label.component';
|
12
12
|
|
13
13
|
const MultiSelect: React.FC<FormFieldInputProps> = ({ field, value, errors, warnings, setFieldValue }) => {
|
14
14
|
const { t } = useTranslation();
|
15
|
+
const { layoutType, sessionMode, workspaceLayout, formFieldAdapters } = useFormProviderContext();
|
15
16
|
const [counter, setCounter] = useState(0);
|
16
17
|
const [initiallyCheckedQuestionItems, setInitiallyCheckedQuestionItems] = useState([]);
|
17
18
|
const isFirstRender = useRef(true);
|
18
|
-
const { layoutType, sessionMode, workspaceLayout, formFieldAdapters } = useFormProviderContext();
|
19
19
|
|
20
20
|
const selectOptions = field.questionOptions.answers
|
21
21
|
.filter((answer) => !answer.isHidden)
|
@@ -117,18 +117,14 @@ const MultiSelect: React.FC<FormFieldInputProps> = ({ field, value, errors, warn
|
|
117
117
|
{field.questionOptions.answers?.map((value, index) => {
|
118
118
|
return (
|
119
119
|
<Checkbox
|
120
|
-
key={`${field.id}-${value.concept}`}
|
121
120
|
className={styles.checkbox}
|
122
|
-
labelText={t(value.label)}
|
123
|
-
id={`${field.id}-${value.concept}`}
|
124
|
-
onChange={() => {
|
125
|
-
handleSelectCheckbox(value);
|
126
|
-
}}
|
127
|
-
name={value.concept}
|
128
|
-
defaultChecked={initiallyCheckedQuestionItems.some((item) => item === value.concept)}
|
129
121
|
checked={initiallyCheckedQuestionItems.some((item) => item === value.concept)}
|
130
|
-
onBlur={onblur}
|
131
122
|
disabled={value.disable?.isDisabled}
|
123
|
+
id={`${field.id}-${value.concept}`}
|
124
|
+
key={`${field.id}-${value.concept}-${index}`}
|
125
|
+
labelText={t(value.label)}
|
126
|
+
name={value.concept}
|
127
|
+
onChange={() => handleSelectCheckbox(value)}
|
132
128
|
readOnly={isTrue(field.readonly)}
|
133
129
|
/>
|
134
130
|
);
|
@@ -1,14 +1,11 @@
|
|
1
1
|
import React from 'react';
|
2
|
-
import { act, render, screen } from '@testing-library/react';
|
3
2
|
import userEvent from '@testing-library/user-event';
|
3
|
+
import { act, render, screen } from '@testing-library/react';
|
4
4
|
import { type FetchResponse, openmrsFetch, usePatient, useSession } from '@openmrs/esm-framework';
|
5
5
|
import { type FormSchema } from '../../../types';
|
6
|
-
import { mockPatient } from '__mocks__
|
7
|
-
import {
|
8
|
-
import { mockVisit } from '__mocks__/visit.mock';
|
9
|
-
import multiSelectFormSchema from '__mocks__/forms/rfe-forms/multi-select-form.json';
|
6
|
+
import { mockPatient, mockSessionDataResponse, mockVisit } from '__mocks__';
|
7
|
+
import { multiSelectFormSchema } from '__mocks__/forms';
|
10
8
|
import FormEngine from '../../../form-engine.component';
|
11
|
-
global.ResizeObserver = require('resize-observer-polyfill');
|
12
9
|
|
13
10
|
const mockOpenmrsFetch = jest.mocked(openmrsFetch);
|
14
11
|
const mockUseSession = jest.mocked(useSession);
|
@@ -1,15 +1,15 @@
|
|
1
1
|
import React, { useCallback, useMemo } from 'react';
|
2
|
-
import { Layer, NumberInput } from '@carbon/react';
|
3
2
|
import classNames from 'classnames';
|
3
|
+
import { useTranslation } from 'react-i18next';
|
4
|
+
import { Layer, NumberInput } from '@carbon/react';
|
5
|
+
import { isEmpty } from '../../../validators/form-validator';
|
4
6
|
import { isTrue } from '../../../utils/boolean-utils';
|
5
|
-
import { shouldUseInlineLayout } from '../../../utils/form-helper';
|
6
|
-
import FieldValueView from '../../value/view/field-value-view.component';
|
7
7
|
import { type FormFieldInputProps } from '../../../types';
|
8
|
-
import
|
9
|
-
import { useTranslation } from 'react-i18next';
|
8
|
+
import { shouldUseInlineLayout } from '../../../utils/form-helper';
|
10
9
|
import { useFormProviderContext } from '../../../provider/form-provider';
|
11
10
|
import FieldLabel from '../../field-label/field-label.component';
|
12
|
-
import
|
11
|
+
import FieldValueView from '../../value/view/field-value-view.component';
|
12
|
+
import styles from './number.scss';
|
13
13
|
|
14
14
|
const NumberField: React.FC<FormFieldInputProps> = ({ field, value, errors, warnings, setFieldValue }) => {
|
15
15
|
const { t } = useTranslation();
|
@@ -1,9 +1,10 @@
|
|
1
1
|
import React from 'react';
|
2
|
-
import
|
3
|
-
import {
|
2
|
+
import userEvent from '@testing-library/user-event';
|
3
|
+
import { act, render, screen } from '@testing-library/react';
|
4
|
+
import { useFormProviderContext } from '../../../provider/form-provider';
|
4
5
|
import NumberField from './number.component';
|
5
6
|
|
6
|
-
jest.mock('
|
7
|
+
jest.mock('../../../provider/form-provider', () => ({
|
7
8
|
useFormProviderContext: jest.fn(),
|
8
9
|
}));
|
9
10
|
|
@@ -64,6 +65,7 @@ describe('NumberField Component', () => {
|
|
64
65
|
});
|
65
66
|
|
66
67
|
it('calls setFieldValue on input change', async () => {
|
68
|
+
const user = userEvent.setup();
|
67
69
|
const mockSetFieldValue = jest.fn();
|
68
70
|
|
69
71
|
await renderNumberField({
|
@@ -75,7 +77,7 @@ describe('NumberField Component', () => {
|
|
75
77
|
});
|
76
78
|
|
77
79
|
const inputElement = screen.getByLabelText('Weight(kg):') as HTMLInputElement;
|
78
|
-
|
80
|
+
await user.type(inputElement, '150');
|
79
81
|
|
80
82
|
expect(mockSetFieldValue).toHaveBeenCalledWith(150);
|
81
83
|
});
|
@@ -4,10 +4,10 @@ import { FormGroup, RadioButtonGroup, RadioButton } from '@carbon/react';
|
|
4
4
|
import { type FormFieldInputProps } from '../../../types';
|
5
5
|
import { isTrue } from '../../../utils/boolean-utils';
|
6
6
|
import { shouldUseInlineLayout } from '../../../utils/form-helper';
|
7
|
-
import FieldValueView from '../../value/view/field-value-view.component';
|
8
|
-
import styles from './radio.scss';
|
9
7
|
import { useFormProviderContext } from '../../../provider/form-provider';
|
10
8
|
import FieldLabel from '../../field-label/field-label.component';
|
9
|
+
import FieldValueView from '../../value/view/field-value-view.component';
|
10
|
+
import styles from './radio.scss';
|
11
11
|
|
12
12
|
const Radio: React.FC<FormFieldInputProps> = ({ field, value, errors, warnings, setFieldValue }) => {
|
13
13
|
const { t } = useTranslation();
|
@@ -1,12 +1,10 @@
|
|
1
1
|
import React from 'react';
|
2
2
|
import { act, render, screen } from '@testing-library/react';
|
3
3
|
import { type FetchResponse, openmrsFetch, usePatient, useSession } from '@openmrs/esm-framework';
|
4
|
-
import { mockPatient } from '__mocks__
|
5
|
-
import {
|
6
|
-
import { mockVisit } from '__mocks__/visit.mock';
|
7
|
-
import radioButtonFormSchema from '__mocks__/forms/rfe-forms/radio-button-form.json';
|
8
|
-
import Radio from './radio.component';
|
4
|
+
import { mockPatient, mockSessionDataResponse, mockVisit } from '__mocks__';
|
5
|
+
import { radioButtonFormSchema } from '__mocks__/forms';
|
9
6
|
import { useFormProviderContext } from 'src/provider/form-provider';
|
7
|
+
import Radio from './radio.component';
|
10
8
|
|
11
9
|
const mockOpenmrsFetch = jest.mocked(openmrsFetch);
|
12
10
|
const mockUseSession = jest.mocked(useSession);
|
@@ -69,6 +69,7 @@ const Dropdown: React.FC<FormFieldInputProps> = ({ field, value, errors, warning
|
|
69
69
|
invalidText={errors[0]?.message}
|
70
70
|
items={items}
|
71
71
|
itemToString={itemToString}
|
72
|
+
label=""
|
72
73
|
onChange={handleChange}
|
73
74
|
readOnly={isTrue(field.readonly)}
|
74
75
|
selectedItem={isEmpty(value) ? NullSelectOption : value}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import React from 'react';
|
2
2
|
import { act, fireEvent, render, screen } from '@testing-library/react';
|
3
|
-
import Dropdown from './dropdown.component';
|
4
3
|
import { type FormField } from '../../../types';
|
5
4
|
import { type OpenmrsResource } from '@openmrs/esm-framework';
|
5
|
+
import Dropdown from './dropdown.component';
|
6
6
|
|
7
7
|
const question: FormField = {
|
8
8
|
label: 'Patient past program.',
|
@@ -1,18 +1,18 @@
|
|
1
1
|
import React, { useMemo, useState } from 'react';
|
2
2
|
import { useTranslation } from 'react-i18next';
|
3
3
|
import { Layer, TextInput } from '@carbon/react';
|
4
|
-
import styles from './text.scss';
|
5
4
|
import { useFormProviderContext } from '../../../provider/form-provider';
|
6
5
|
import { type FormFieldInputProps } from '../../../types';
|
7
6
|
import { isTrue } from '../../../utils/boolean-utils';
|
8
7
|
import { shouldUseInlineLayout } from '../../../utils/form-helper';
|
9
8
|
import FieldValueView from '../../value/view/field-value-view.component';
|
10
9
|
import FieldLabel from '../../field-label/field-label.component';
|
10
|
+
import styles from './text.scss';
|
11
11
|
|
12
12
|
const TextField: React.FC<FormFieldInputProps> = ({ field, value, errors, warnings, setFieldValue }) => {
|
13
13
|
const { t } = useTranslation();
|
14
|
-
const [lastBlurredValue, setLastBlurredValue] = useState(null);
|
15
14
|
const { layoutType, sessionMode, workspaceLayout } = useFormProviderContext();
|
15
|
+
const [lastBlurredValue, setLastBlurredValue] = useState(null);
|
16
16
|
|
17
17
|
const onBlur = (event) => {
|
18
18
|
event.preventDefault();
|
@@ -40,21 +40,21 @@ const TextField: React.FC<FormFieldInputProps> = ({ field, value, errors, warnin
|
|
40
40
|
<div className={styles.boldedLabel}>
|
41
41
|
<Layer>
|
42
42
|
<TextInput
|
43
|
+
disabled={field.isDisabled}
|
43
44
|
id={field.id}
|
45
|
+
invalid={errors.length > 0}
|
46
|
+
invalidText={errors[0]?.message}
|
44
47
|
labelText={<FieldLabel field={field} />}
|
48
|
+
maxLength={field.questionOptions.max || TextInput.maxLength}
|
49
|
+
name={field.id}
|
50
|
+
onBlur={onBlur}
|
45
51
|
onChange={(event) => {
|
46
52
|
setFieldValue(event.target.value);
|
47
53
|
}}
|
48
|
-
onBlur={onBlur}
|
49
|
-
name={field.id}
|
50
|
-
value={value}
|
51
|
-
disabled={field.isDisabled}
|
52
54
|
readOnly={isTrue(field.readonly)}
|
53
|
-
|
54
|
-
invalidText={errors[0]?.message}
|
55
|
+
value={value ?? ''}
|
55
56
|
warn={warnings.length > 0}
|
56
57
|
warnText={warnings.length > 0 ? warnings[0].message : undefined}
|
57
|
-
maxLength={field.questionOptions.max || TextInput.maxLength}
|
58
58
|
/>
|
59
59
|
</Layer>
|
60
60
|
</div>
|
@@ -1,13 +1,13 @@
|
|
1
1
|
import React from 'react';
|
2
|
+
import userEvent from '@testing-library/user-event';
|
2
3
|
import { render, screen, act } from '@testing-library/react';
|
3
|
-
import TextField from './text.component';
|
4
4
|
import { type FetchResponse, openmrsFetch, usePatient, useSession } from '@openmrs/esm-framework';
|
5
5
|
import { mockSessionDataResponse } from '__mocks__/session.mock';
|
6
6
|
import { mockPatient } from '__mocks__/patient.mock';
|
7
7
|
import { mockVisit } from '__mocks__/visit.mock';
|
8
|
-
import textFieldFormJson from '__mocks__/forms/rfe-forms/sample_fields.json';
|
9
8
|
import { useFormProviderContext } from 'src/provider/form-provider';
|
10
|
-
import
|
9
|
+
import { sampleFieldsForm } from '__mocks__/forms';
|
10
|
+
import TextField from './text.component';
|
11
11
|
|
12
12
|
const mockOpenmrsFetch = jest.mocked(openmrsFetch);
|
13
13
|
const mockUseSession = jest.mocked(useSession);
|
@@ -128,7 +128,7 @@ const mockProviderValues = {
|
|
128
128
|
formFieldAdapters: {},
|
129
129
|
patient: mockPatient,
|
130
130
|
methods: undefined,
|
131
|
-
formJson:
|
131
|
+
formJson: sampleFieldsForm,
|
132
132
|
visit: mockVisit,
|
133
133
|
sessionDate: new Date(),
|
134
134
|
location: mockVisit.location,
|
@@ -143,7 +143,7 @@ describe('Text field input', () => {
|
|
143
143
|
getInitialValues: jest.fn(),
|
144
144
|
};
|
145
145
|
mockOpenmrsFetch.mockResolvedValue({
|
146
|
-
data: { results: [{ ...
|
146
|
+
data: { results: [{ ...sampleFieldsForm }] },
|
147
147
|
} as unknown as FetchResponse);
|
148
148
|
mockUseSession.mockReturnValue(mockSessionDataResponse.data);
|
149
149
|
mockUsePatient.mockReturnValue({
|
@@ -4,10 +4,10 @@ import { Layer, TextArea as TextAreaInput } from '@carbon/react';
|
|
4
4
|
import { shouldUseInlineLayout } from '../../../utils/form-helper';
|
5
5
|
import { isTrue } from '../../../utils/boolean-utils';
|
6
6
|
import { type FormFieldInputProps } from '../../../types';
|
7
|
-
import FieldValueView from '../../value/view/field-value-view.component';
|
8
|
-
import styles from './text-area.scss';
|
9
7
|
import { useFormProviderContext } from '../../../provider/form-provider';
|
10
8
|
import FieldLabel from '../../field-label/field-label.component';
|
9
|
+
import FieldValueView from '../../value/view/field-value-view.component';
|
10
|
+
import styles from './text-area.scss';
|
11
11
|
|
12
12
|
const TextArea: React.FC<FormFieldInputProps> = ({ field, value, errors, warnings, setFieldValue }) => {
|
13
13
|
const { t } = useTranslation();
|
@@ -1,13 +1,13 @@
|
|
1
1
|
import React, { useEffect, useMemo } from 'react';
|
2
|
+
import { useTranslation } from 'react-i18next';
|
2
3
|
import { Toggle as ToggleInput } from '@carbon/react';
|
3
4
|
import { type FormFieldInputProps } from '../../../types';
|
4
5
|
import { isTrue } from '../../../utils/boolean-utils';
|
5
6
|
import { shouldUseInlineLayout } from '../../../utils/form-helper';
|
6
|
-
import FieldValueView from '../../value/view/field-value-view.component';
|
7
7
|
import { isEmpty } from '../../../validators/form-validator';
|
8
|
-
import styles from './toggle.scss';
|
9
|
-
import { useTranslation } from 'react-i18next';
|
10
8
|
import { useFormProviderContext } from '../../../provider/form-provider';
|
9
|
+
import FieldValueView from '../../value/view/field-value-view.component';
|
10
|
+
import styles from './toggle.scss';
|
11
11
|
|
12
12
|
const Toggle: React.FC<FormFieldInputProps> = ({ field, value, errors, warnings, setFieldValue }) => {
|
13
13
|
const { t } = useTranslation();
|