@openmrs/esm-form-engine-lib 3.1.4-pre.1779 → 3.1.4-pre.1789

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.
Files changed (58) hide show
  1. package/__mocks__/forms/afe-forms/index.ts +9 -0
  2. package/__mocks__/forms/index.ts +19 -0
  3. package/__mocks__/forms/rfe-forms/index.ts +50 -0
  4. package/__mocks__/index.ts +85 -0
  5. package/__mocks__/single-spa-react.js +4 -9
  6. package/dist/openmrs-esm-form-engine-lib.js +1 -1
  7. package/jest.config.js +1 -1
  8. package/package.json +1 -1
  9. package/src/components/inputs/date/date.component.tsx +7 -7
  10. package/src/components/inputs/date/date.test.tsx +2 -22
  11. package/src/components/inputs/markdown/markdown.component.tsx +8 -4
  12. package/src/components/inputs/multi-select/multi-select.component.tsx +11 -15
  13. package/src/components/inputs/multi-select/multi-select.test.tsx +3 -6
  14. package/src/components/inputs/number/number.component.tsx +6 -6
  15. package/src/components/inputs/number/number.test.tsx +6 -4
  16. package/src/components/inputs/radio/radio.component.tsx +2 -2
  17. package/src/components/inputs/radio/radio.test.tsx +3 -5
  18. package/src/components/inputs/select/dropdown.component.tsx +1 -0
  19. package/src/components/inputs/select/dropdown.test.tsx +1 -1
  20. package/src/components/inputs/text/text.component.tsx +9 -9
  21. package/src/components/inputs/text/text.test.tsx +5 -5
  22. package/src/components/inputs/text-area/text-area.component.tsx +2 -2
  23. package/src/components/inputs/toggle/toggle.component.tsx +3 -3
  24. package/src/components/inputs/ui-select-extended/ui-select-extended.test.tsx +11 -21
  25. package/src/components/inputs/unspecified/unspecified.test.tsx +6 -17
  26. package/src/components/label/label.component.tsx +1 -1
  27. package/src/components/renderer/field/fieldLogic.test.ts +4 -10
  28. package/src/components/renderer/field/form-field-renderer.component.tsx +9 -9
  29. package/src/components/sidebar/useCurrentActivePage.test.ts +0 -1
  30. package/src/form-engine.test.tsx +34 -46
  31. package/src/hooks/useFormJson.test.tsx +16 -13
  32. package/src/hooks/useFormWorkspaceSize.test.ts +40 -19
  33. package/src/hooks/useInitialValues.test.ts +3 -2
  34. package/src/hooks/usePostSubmissionActions.test.tsx +0 -2
  35. package/src/setup-tests.ts +35 -0
  36. package/src/transformers/default-schema-transformer.test.ts +1 -1
  37. package/src/utils/common-utils.test.ts +4 -9
  38. package/src/utils/common-utils.ts +9 -2
  39. package/src/utils/forms-loader.test.ts +1 -1
  40. package/src/zscore-tests/bmi-age.test.tsx +2 -7
  41. package/src/zscore-tests/height-age.test.tsx +2 -7
  42. package/src/zscore-tests/weight-height.test.tsx +2 -7
  43. package/tools/update-openmrs-deps.mjs +42 -0
  44. package/src/setupTests.ts +0 -5
  45. /package/__mocks__/forms/afe-forms/{component_art.json → component-art.json} +0 -0
  46. /package/__mocks__/forms/afe-forms/{component_preclinic-review.json → component-preclinic-review.json} +0 -0
  47. /package/__mocks__/forms/afe-forms/{demo_hts-form.json → demo-hts-form.json} +0 -0
  48. /package/__mocks__/forms/rfe-forms/{component_art.json → component-art.json} +0 -0
  49. /package/__mocks__/forms/rfe-forms/{component_preclinic-review.json → component-preclinic-review.json} +0 -0
  50. /package/__mocks__/forms/rfe-forms/{demo_hts-form.json → demo-hts-form.json} +0 -0
  51. /package/__mocks__/forms/rfe-forms/{external_data_source_form.json → external-data-source-form.json} +0 -0
  52. /package/__mocks__/forms/rfe-forms/{labour_and_delivery_test_form.json → labour-and-delivery-test-form.json} +0 -0
  53. /package/__mocks__/forms/rfe-forms/{mockHistoricalvisitsEncounter.json → mock-historical-visits-encounter.json} +0 -0
  54. /package/__mocks__/forms/rfe-forms/{mockSaveEncounter.json → mock-save-encounter.json} +0 -0
  55. /package/__mocks__/forms/rfe-forms/{obs-group-test_form.json → obs-group-test-form.json} +0 -0
  56. /package/__mocks__/forms/rfe-forms/{sample_fields.json → sample-fields.json} +0 -0
  57. /package/__mocks__/forms/rfe-forms/{sample_ui-select-ext.json → sample-ui-select-ext.json} +0 -0
  58. /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
- // In __mocks__/single-spa-react.js
2
- //import context from "../src/view-components/widget/testHelpers";
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 = React.createContext({ mountParcel: () => jest.fn() });
4
+ const SingleSpaContext = createContext({ mountParcel: () => jest.fn() });
7
5
 
8
- //constexport default mock;
9
- module.exports = {
10
- SingleSpaContext: SingleSpaContext
11
- };
6
+ export { SingleSpaContext };
@@ -1 +1 @@
1
- var _openmrs_esm_form_engine_lib;(()=>{"use strict";var e,r,t,n,o,i,a,l,s,u,f,p,d,c,h,m,v,g,b,y,w,_={8008:(e,r,t)=>{var n={"./start":()=>Promise.all([t.e(262),t.e(469),t.e(72),t.e(465),t.e(299),t.e(929)]).then((()=>()=>t(2929)))},o=(e,r)=>(t.R=r,r=t.o(n,e)?n[e]():Promise.resolve().then((()=>{throw new Error('Module "'+e+'" does not exist in container.')})),t.R=void 0,r),i=(e,r)=>{if(t.S){var n="default",o=t.S[n];if(o&&o!==e)throw new Error("Container initialization failed as it has already been initialized with a different share scope");return t.S[n]=e,t.I(n,r)}};t.d(r,{get:()=>o,init:()=>i})}},P={};function j(e){var r=P[e];if(void 0!==r)return r.exports;var t=P[e]={id:e,loaded:!1,exports:{}};return _[e].call(t.exports,t,t.exports,j),t.loaded=!0,t.exports}j.m=_,j.c=P,j.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return j.d(r,{a:r}),r},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,j.t=function(t,n){if(1&n&&(t=this(t)),8&n)return t;if("object"==typeof t&&t){if(4&n&&t.__esModule)return t;if(16&n&&"function"==typeof t.then)return t}var o=Object.create(null);j.r(o);var i={};e=e||[null,r({}),r([]),r(r)];for(var a=2&n&&t;"object"==typeof a&&!~e.indexOf(a);a=r(a))Object.getOwnPropertyNames(a).forEach((e=>i[e]=()=>t[e]));return i.default=()=>t,j.d(o,i),o},j.d=(e,r)=>{for(var t in r)j.o(r,t)&&!j.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},j.f={},j.e=e=>Promise.all(Object.keys(j.f).reduce(((r,t)=>(j.f[t](e,r),r)),[])),j.u=e=>e+".js",j.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),j.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),t={},n="@openmrs/esm-form-engine-lib:",j.l=(e,r,o,i)=>{if(t[e])t[e].push(r);else{var a,l;if(void 0!==o)for(var s=document.getElementsByTagName("script"),u=0;u<s.length;u++){var f=s[u];if(f.getAttribute("src")==e||f.getAttribute("data-webpack")==n+o){a=f;break}}a||(l=!0,(a=document.createElement("script")).charset="utf-8",a.timeout=120,j.nc&&a.setAttribute("nonce",j.nc),a.setAttribute("data-webpack",n+o),a.src=e),t[e]=[r];var p=(r,n)=>{a.onerror=a.onload=null,clearTimeout(d);var o=t[e];if(delete t[e],a.parentNode&&a.parentNode.removeChild(a),o&&o.forEach((e=>e(n))),r)return r(n)},d=setTimeout(p.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=p.bind(null,a.onerror),a.onload=p.bind(null,a.onload),l&&document.head.appendChild(a)}},j.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},j.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),j.j=719,(()=>{j.S={};var e={},r={};j.I=(t,n)=>{n||(n=[]);var o=r[t];if(o||(o=r[t]={}),!(n.indexOf(o)>=0)){if(n.push(o),e[t])return e[t];j.o(j.S,t)||(j.S[t]={});var i=j.S[t],a="@openmrs/esm-form-engine-lib",l=(e,r,t,n)=>{var o=i[e]=i[e]||{},l=o[r];(!l||!l.loaded&&(!n!=!l.eager?n:a>l.from))&&(o[r]={get:t,from:a,eager:!!n})},s=[];return"default"===t&&(l("@openmrs/esm-framework","6.2.1-pre.2843",(()=>Promise.all([j.e(151),j.e(72),j.e(766)]).then((()=>()=>j(5151))))),l("@openmrs/esm-patient-common-lib","9.2.3-pre.7233",(()=>Promise.all([j.e(262),j.e(522),j.e(72),j.e(465),j.e(299),j.e(499)]).then((()=>()=>j(9522))))),l("dayjs","1.11.13",(()=>j.e(353).then((()=>()=>j(6734))))),l("i18next","23.16.0",(()=>j.e(635).then((()=>()=>j(2635))))),l("react-i18next","11.18.6",(()=>Promise.all([j.e(184),j.e(72)]).then((()=>()=>j(4422))))),l("react","18.3.1",(()=>j.e(540).then((()=>()=>j(6540))))),l("swr/_internal","2.2.5",(()=>Promise.all([j.e(993),j.e(72)]).then((()=>()=>j(4993))))),l("swr/immutable","2.2.5",(()=>Promise.all([j.e(72),j.e(465),j.e(225)]).then((()=>()=>j(4225))))),l("swr/infinite","2.2.5",(()=>Promise.all([j.e(72),j.e(465),j.e(422)]).then((()=>()=>j(3041)))))),e[t]=s.length?Promise.all(s).then((()=>e[t]=1)):1}}})(),(()=>{var e;j.g.importScripts&&(e=j.g.location+"");var r=j.g.document;if(!e&&r&&(r.currentScript&&"SCRIPT"===r.currentScript.tagName.toUpperCase()&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var n=t.length-1;n>-1&&(!e||!/^http(s?):/.test(e));)e=t[n--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),j.p=e})(),o=e=>{var r=e=>e.split(".").map((e=>+e==e?+e:e)),t=/^([^-+]+)?(?:-([^+]+))?(?:\+(.+))?$/.exec(e),n=t[1]?r(t[1]):[];return t[2]&&(n.length++,n.push.apply(n,r(t[2]))),t[3]&&(n.push([]),n.push.apply(n,r(t[3]))),n},i=(e,r)=>{e=o(e),r=o(r);for(var t=0;;){if(t>=e.length)return t<r.length&&"u"!=(typeof r[t])[0];var n=e[t],i=(typeof n)[0];if(t>=r.length)return"u"==i;var a=r[t],l=(typeof a)[0];if(i!=l)return"o"==i&&"n"==l||"s"==l||"u"==i;if("o"!=i&&"u"!=i&&n!=a)return n<a;t++}},a=e=>{var r=e[0],t="";if(1===e.length)return"*";if(r+.5){t+=0==r?">=":-1==r?"<":1==r?"^":2==r?"~":r>0?"=":"!=";for(var n=1,o=1;o<e.length;o++)n--,t+="u"==(typeof(l=e[o]))[0]?"-":(n>0?".":"")+(n=2,l);return t}var i=[];for(o=1;o<e.length;o++){var l=e[o];i.push(0===l?"not("+s()+")":1===l?"("+s()+" || "+s()+")":2===l?i.pop()+" "+i.pop():a(l))}return s();function s(){return i.pop().replace(/^\((.+)\)$/,"$1")}},l=(e,r)=>{if(0 in e){r=o(r);var t=e[0],n=t<0;n&&(t=-t-1);for(var i=0,a=1,s=!0;;a++,i++){var u,f,p=a<e.length?(typeof e[a])[0]:"";if(i>=r.length||"o"==(f=(typeof(u=r[i]))[0]))return!s||("u"==p?a>t&&!n:""==p!=n);if("u"==f){if(!s||"u"!=p)return!1}else if(s)if(p==f)if(a<=t){if(u!=e[a])return!1}else{if(n?u>e[a]:u<e[a])return!1;u!=e[a]&&(s=!1)}else if("s"!=p&&"n"!=p){if(n||a<=t)return!1;s=!1,a--}else{if(a<=t||f<p!=n)return!1;s=!1}else"s"!=p&&"n"!=p&&(s=!1,a--)}}var d=[],c=d.pop.bind(d);for(i=1;i<e.length;i++){var h=e[i];d.push(1==h?c()|c():2==h?c()&c():h?l(h,r):!c())}return!!c()},s=(e,r)=>e&&j.o(e,r),u=e=>(e.loaded=1,e.get()),f=e=>Object.keys(e).reduce(((r,t)=>(e[t].eager&&(r[t]=e[t]),r)),{}),p=(e,r,t)=>{var n=t?f(e[r]):e[r];return Object.keys(n).reduce(((e,r)=>!e||!n[e].loaded&&i(e,r)?r:e),0)},d=(e,r,t,n)=>"Unsatisfied version "+t+" from "+(t&&e[r][t].from)+" of shared singleton module "+r+" (required "+a(n)+")",c=e=>{throw new Error(e)},h=e=>{"undefined"!=typeof console&&console.warn&&console.warn(e)},m=(e,r,t)=>t?t():((e,r)=>c("Shared module "+r+" doesn't exist in shared scope "+e))(e,r),v=(e=>function(r,t,n,o,i){var a=j.I(r);return a&&a.then&&!n?a.then(e.bind(e,r,j.S[r],t,!1,o,i)):e(r,j.S[r],t,n,o,i)})(((e,r,t,n,o,i)=>{if(!s(r,t))return m(e,t,i);var a=p(r,t,n);return l(o,a)||h(d(r,t,a,o)),u(r[t][a])})),g={},b={6072:()=>v("default","react",!1,[1,18],(()=>j.e(540).then((()=>()=>j(6540))))),6766:()=>v("default","i18next",!1,[1,23],(()=>j.e(635).then((()=>()=>j(2635))))),8465:()=>v("default","swr/_internal",!1,[1,2],(()=>j.e(993).then((()=>()=>j(4993))))),2731:()=>v("default","@openmrs/esm-patient-common-lib",!1,[1,9],(()=>j.e(522).then((()=>()=>j(9522))))),3941:()=>v("default","react-i18next",!1,[1,11],(()=>j.e(184).then((()=>()=>j(4422))))),9197:()=>v("default","@openmrs/esm-framework",!1,[1,6],(()=>Promise.all([j.e(151),j.e(766)]).then((()=>()=>j(5151))))),4209:()=>v("default","swr/immutable",!1,[1,2],(()=>j.e(606).then((()=>()=>j(4225))))),231:()=>v("default","dayjs",!1,[1,1],(()=>j.e(353).then((()=>()=>j(6734))))),6339:()=>v("default","swr/infinite",!1,[1,2],(()=>j.e(41).then((()=>()=>j(3041)))))},y={72:[6072],299:[2731,3941,9197],465:[8465],499:[4209],766:[6766],929:[231,4209,6339]},w={},j.f.consumes=(e,r)=>{j.o(y,e)&&y[e].forEach((e=>{if(j.o(g,e))return r.push(g[e]);if(!w[e]){var t=r=>{g[e]=0,j.m[e]=t=>{delete j.c[e],t.exports=r()}};w[e]=!0;var n=r=>{delete g[e],j.m[e]=t=>{throw delete j.c[e],r}};try{var o=b[e]();o.then?r.push(g[e]=o.then(t).catch(n)):t(o)}catch(e){n(e)}}}))},(()=>{var e={719:0};j.f.j=(r,t)=>{var n=j.o(e,r)?e[r]:void 0;if(0!==n)if(n)t.push(n[2]);else if(/^(299|465|72|766)$/.test(r))e[r]=0;else{var o=new Promise(((t,o)=>n=e[r]=[t,o]));t.push(n[2]=o);var i=j.p+j.u(r),a=new Error;j.l(i,(t=>{if(j.o(e,r)&&(0!==(n=e[r])&&(e[r]=void 0),n)){var o=t&&("load"===t.type?"missing":t.type),i=t&&t.target&&t.target.src;a.message="Loading chunk "+r+" failed.\n("+o+": "+i+")",a.name="ChunkLoadError",a.type=o,a.request=i,n[1](a)}}),"chunk-"+r,r)}};var r=(r,t)=>{var n,o,[i,a,l]=t,s=0;if(i.some((r=>0!==e[r]))){for(n in a)j.o(a,n)&&(j.m[n]=a[n]);l&&l(j)}for(r&&r(t);s<i.length;s++)o=i[s],j.o(e,o)&&e[o]&&e[o][0](),e[o]=0},t=globalThis.webpackChunk_openmrs_esm_form_engine_lib=globalThis.webpackChunk_openmrs_esm_form_engine_lib||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})(),j.nc=void 0;var S=j(8008);_openmrs_esm_form_engine_lib=S})();
1
+ var _openmrs_esm_form_engine_lib;(()=>{"use strict";var e,r,t,n,o,i,a,l,s,u,f,p,d,c,h,m,v,g,b,y,w,_={8008:(e,r,t)=>{var n={"./start":()=>Promise.all([t.e(842),t.e(103),t.e(72),t.e(465),t.e(299),t.e(929)]).then((()=>()=>t(2929)))},o=(e,r)=>(t.R=r,r=t.o(n,e)?n[e]():Promise.resolve().then((()=>{throw new Error('Module "'+e+'" does not exist in container.')})),t.R=void 0,r),i=(e,r)=>{if(t.S){var n="default",o=t.S[n];if(o&&o!==e)throw new Error("Container initialization failed as it has already been initialized with a different share scope");return t.S[n]=e,t.I(n,r)}};t.d(r,{get:()=>o,init:()=>i})}},P={};function j(e){var r=P[e];if(void 0!==r)return r.exports;var t=P[e]={id:e,loaded:!1,exports:{}};return _[e].call(t.exports,t,t.exports,j),t.loaded=!0,t.exports}j.m=_,j.c=P,j.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return j.d(r,{a:r}),r},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,j.t=function(t,n){if(1&n&&(t=this(t)),8&n)return t;if("object"==typeof t&&t){if(4&n&&t.__esModule)return t;if(16&n&&"function"==typeof t.then)return t}var o=Object.create(null);j.r(o);var i={};e=e||[null,r({}),r([]),r(r)];for(var a=2&n&&t;"object"==typeof a&&!~e.indexOf(a);a=r(a))Object.getOwnPropertyNames(a).forEach((e=>i[e]=()=>t[e]));return i.default=()=>t,j.d(o,i),o},j.d=(e,r)=>{for(var t in r)j.o(r,t)&&!j.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},j.f={},j.e=e=>Promise.all(Object.keys(j.f).reduce(((r,t)=>(j.f[t](e,r),r)),[])),j.u=e=>e+".js",j.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),j.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),t={},n="@openmrs/esm-form-engine-lib:",j.l=(e,r,o,i)=>{if(t[e])t[e].push(r);else{var a,l;if(void 0!==o)for(var s=document.getElementsByTagName("script"),u=0;u<s.length;u++){var f=s[u];if(f.getAttribute("src")==e||f.getAttribute("data-webpack")==n+o){a=f;break}}a||(l=!0,(a=document.createElement("script")).charset="utf-8",a.timeout=120,j.nc&&a.setAttribute("nonce",j.nc),a.setAttribute("data-webpack",n+o),a.src=e),t[e]=[r];var p=(r,n)=>{a.onerror=a.onload=null,clearTimeout(d);var o=t[e];if(delete t[e],a.parentNode&&a.parentNode.removeChild(a),o&&o.forEach((e=>e(n))),r)return r(n)},d=setTimeout(p.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=p.bind(null,a.onerror),a.onload=p.bind(null,a.onload),l&&document.head.appendChild(a)}},j.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},j.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),j.j=719,(()=>{j.S={};var e={},r={};j.I=(t,n)=>{n||(n=[]);var o=r[t];if(o||(o=r[t]={}),!(n.indexOf(o)>=0)){if(n.push(o),e[t])return e[t];j.o(j.S,t)||(j.S[t]={});var i=j.S[t],a="@openmrs/esm-form-engine-lib",l=(e,r,t,n)=>{var o=i[e]=i[e]||{},l=o[r];(!l||!l.loaded&&(!n!=!l.eager?n:a>l.from))&&(o[r]={get:t,from:a,eager:!!n})},s=[];return"default"===t&&(l("@openmrs/esm-framework","6.2.1-pre.2854",(()=>Promise.all([j.e(151),j.e(72),j.e(766)]).then((()=>()=>j(5151))))),l("@openmrs/esm-patient-common-lib","9.2.3-pre.7311",(()=>Promise.all([j.e(842),j.e(239),j.e(72),j.e(465),j.e(299),j.e(499)]).then((()=>()=>j(7239))))),l("dayjs","1.11.13",(()=>j.e(353).then((()=>()=>j(6734))))),l("i18next","23.16.0",(()=>j.e(635).then((()=>()=>j(2635))))),l("react-i18next","11.18.6",(()=>Promise.all([j.e(72),j.e(979)]).then((()=>()=>j(2979))))),l("react","18.3.1",(()=>j.e(540).then((()=>()=>j(6540))))),l("swr/_internal","2.2.5",(()=>Promise.all([j.e(993),j.e(72)]).then((()=>()=>j(4993))))),l("swr/immutable","2.2.5",(()=>Promise.all([j.e(72),j.e(465),j.e(606)]).then((()=>()=>j(4225))))),l("swr/infinite","2.2.5",(()=>Promise.all([j.e(72),j.e(465),j.e(422)]).then((()=>()=>j(3041)))))),e[t]=s.length?Promise.all(s).then((()=>e[t]=1)):1}}})(),(()=>{var e;j.g.importScripts&&(e=j.g.location+"");var r=j.g.document;if(!e&&r&&(r.currentScript&&"SCRIPT"===r.currentScript.tagName.toUpperCase()&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var n=t.length-1;n>-1&&(!e||!/^http(s?):/.test(e));)e=t[n--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),j.p=e})(),o=e=>{var r=e=>e.split(".").map((e=>+e==e?+e:e)),t=/^([^-+]+)?(?:-([^+]+))?(?:\+(.+))?$/.exec(e),n=t[1]?r(t[1]):[];return t[2]&&(n.length++,n.push.apply(n,r(t[2]))),t[3]&&(n.push([]),n.push.apply(n,r(t[3]))),n},i=(e,r)=>{e=o(e),r=o(r);for(var t=0;;){if(t>=e.length)return t<r.length&&"u"!=(typeof r[t])[0];var n=e[t],i=(typeof n)[0];if(t>=r.length)return"u"==i;var a=r[t],l=(typeof a)[0];if(i!=l)return"o"==i&&"n"==l||"s"==l||"u"==i;if("o"!=i&&"u"!=i&&n!=a)return n<a;t++}},a=e=>{var r=e[0],t="";if(1===e.length)return"*";if(r+.5){t+=0==r?">=":-1==r?"<":1==r?"^":2==r?"~":r>0?"=":"!=";for(var n=1,o=1;o<e.length;o++)n--,t+="u"==(typeof(l=e[o]))[0]?"-":(n>0?".":"")+(n=2,l);return t}var i=[];for(o=1;o<e.length;o++){var l=e[o];i.push(0===l?"not("+s()+")":1===l?"("+s()+" || "+s()+")":2===l?i.pop()+" "+i.pop():a(l))}return s();function s(){return i.pop().replace(/^\((.+)\)$/,"$1")}},l=(e,r)=>{if(0 in e){r=o(r);var t=e[0],n=t<0;n&&(t=-t-1);for(var i=0,a=1,s=!0;;a++,i++){var u,f,p=a<e.length?(typeof e[a])[0]:"";if(i>=r.length||"o"==(f=(typeof(u=r[i]))[0]))return!s||("u"==p?a>t&&!n:""==p!=n);if("u"==f){if(!s||"u"!=p)return!1}else if(s)if(p==f)if(a<=t){if(u!=e[a])return!1}else{if(n?u>e[a]:u<e[a])return!1;u!=e[a]&&(s=!1)}else if("s"!=p&&"n"!=p){if(n||a<=t)return!1;s=!1,a--}else{if(a<=t||f<p!=n)return!1;s=!1}else"s"!=p&&"n"!=p&&(s=!1,a--)}}var d=[],c=d.pop.bind(d);for(i=1;i<e.length;i++){var h=e[i];d.push(1==h?c()|c():2==h?c()&c():h?l(h,r):!c())}return!!c()},s=(e,r)=>e&&j.o(e,r),u=e=>(e.loaded=1,e.get()),f=e=>Object.keys(e).reduce(((r,t)=>(e[t].eager&&(r[t]=e[t]),r)),{}),p=(e,r,t)=>{var n=t?f(e[r]):e[r];return Object.keys(n).reduce(((e,r)=>!e||!n[e].loaded&&i(e,r)?r:e),0)},d=(e,r,t,n)=>"Unsatisfied version "+t+" from "+(t&&e[r][t].from)+" of shared singleton module "+r+" (required "+a(n)+")",c=e=>{throw new Error(e)},h=e=>{"undefined"!=typeof console&&console.warn&&console.warn(e)},m=(e,r,t)=>t?t():((e,r)=>c("Shared module "+r+" doesn't exist in shared scope "+e))(e,r),v=(e=>function(r,t,n,o,i){var a=j.I(r);return a&&a.then&&!n?a.then(e.bind(e,r,j.S[r],t,!1,o,i)):e(r,j.S[r],t,n,o,i)})(((e,r,t,n,o,i)=>{if(!s(r,t))return m(e,t,i);var a=p(r,t,n);return l(o,a)||h(d(r,t,a,o)),u(r[t][a])})),g={},b={6072:()=>v("default","react",!1,[1,18],(()=>j.e(540).then((()=>()=>j(6540))))),6766:()=>v("default","i18next",!1,[1,23],(()=>j.e(635).then((()=>()=>j(2635))))),8465:()=>v("default","swr/_internal",!1,[1,2],(()=>j.e(993).then((()=>()=>j(4993))))),2731:()=>v("default","@openmrs/esm-patient-common-lib",!1,[1,9],(()=>j.e(239).then((()=>()=>j(7239))))),3941:()=>v("default","react-i18next",!1,[1,11],(()=>j.e(360).then((()=>()=>j(2979))))),9197:()=>v("default","@openmrs/esm-framework",!1,[1,6],(()=>Promise.all([j.e(151),j.e(766)]).then((()=>()=>j(5151))))),4209:()=>v("default","swr/immutable",!1,[1,2],(()=>j.e(225).then((()=>()=>j(4225))))),231:()=>v("default","dayjs",!1,[1,1],(()=>j.e(353).then((()=>()=>j(6734))))),6339:()=>v("default","swr/infinite",!1,[1,2],(()=>j.e(41).then((()=>()=>j(3041)))))},y={72:[6072],299:[2731,3941,9197],465:[8465],499:[4209],766:[6766],929:[231,4209,6339]},w={},j.f.consumes=(e,r)=>{j.o(y,e)&&y[e].forEach((e=>{if(j.o(g,e))return r.push(g[e]);if(!w[e]){var t=r=>{g[e]=0,j.m[e]=t=>{delete j.c[e],t.exports=r()}};w[e]=!0;var n=r=>{delete g[e],j.m[e]=t=>{throw delete j.c[e],r}};try{var o=b[e]();o.then?r.push(g[e]=o.then(t).catch(n)):t(o)}catch(e){n(e)}}}))},(()=>{var e={719:0};j.f.j=(r,t)=>{var n=j.o(e,r)?e[r]:void 0;if(0!==n)if(n)t.push(n[2]);else if(/^(299|465|72|766)$/.test(r))e[r]=0;else{var o=new Promise(((t,o)=>n=e[r]=[t,o]));t.push(n[2]=o);var i=j.p+j.u(r),a=new Error;j.l(i,(t=>{if(j.o(e,r)&&(0!==(n=e[r])&&(e[r]=void 0),n)){var o=t&&("load"===t.type?"missing":t.type),i=t&&t.target&&t.target.src;a.message="Loading chunk "+r+" failed.\n("+o+": "+i+")",a.name="ChunkLoadError",a.type=o,a.request=i,n[1](a)}}),"chunk-"+r,r)}};var r=(r,t)=>{var n,o,[i,a,l]=t,s=0;if(i.some((r=>0!==e[r]))){for(n in a)j.o(a,n)&&(j.m[n]=a[n]);l&&l(j)}for(r&&r(t);s<i.length;s++)o=i[s],j.o(e,o)&&e[o]&&e[o][0](),e[o]=0},t=globalThis.webpackChunk_openmrs_esm_form_engine_lib=globalThis.webpackChunk_openmrs_esm_form_engine_lib||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})(),j.nc=void 0;var S=j(8008);_openmrs_esm_form_engine_lib=S})();
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/setupTests.ts'],
29
+ setupFilesAfterEnv: ['<rootDir>/src/setup-tests.ts'],
30
30
  testEnvironment: 'jsdom',
31
31
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openmrs/esm-form-engine-lib",
3
- "version": "3.1.4-pre.1779",
3
+ "version": "3.1.4-pre.1789",
4
4
  "description": "React Form Engine for O3",
5
5
  "browser": "dist/openmrs-esm-form-engine-lib.js",
6
6
  "main": "src/index.ts",
@@ -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 classNames from 'classnames';
5
- import { type FormFieldInputProps } from '../../../types';
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 { formatDateAsDisplayString } from '../../../utils/common-utils';
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 { useFormProviderContext } from 'src/provider/form-provider';
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
- return !field.isHidden && <MarkdownWrapper
9
- markdown={t(field.value, { defaultValue: field.value, interpolation: { escapeValue: false } })}
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 { FilterableMultiSelect, Layer, Tag, CheckboxGroup, Checkbox } from '@carbon/react';
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 { shouldUseInlineLayout } from '../../../utils/form-helper';
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__/patient.mock';
7
- import { mockSessionDataResponse } from '__mocks__/session.mock';
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 styles from './number.scss';
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 { isEmpty } from '../../../validators/form-validator';
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 { act, render, screen, fireEvent } from '@testing-library/react';
3
- import { useFormProviderContext } from 'src/provider/form-provider';
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('src/provider/form-provider', () => ({
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
- fireEvent.change(inputElement, { target: { value: '150' } });
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__/patient.mock';
5
- import { mockSessionDataResponse } from '__mocks__/session.mock';
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
- invalid={errors.length > 0}
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 userEvent from '@testing-library/user-event';
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: textFieldFormJson as any,
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: [{ ...textFieldFormJson }] },
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();