@openmrs/esm-form-engine-lib 2.1.0-pre.1442 → 2.1.0-pre.1443
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/028fb0e475ee0bc4/028fb0e475ee0bc4.gz +0 -0
- package/b7bbd285b8eaabe2/b7bbd285b8eaabe2.gz +0 -0
- package/be488ec37d96a45f/be488ec37d96a45f.gz +0 -0
- package/dist/openmrs-esm-form-engine-lib.js +1 -1
- package/f30893a11ee98562/f30893a11ee98562.gz +0 -0
- package/package.json +1 -1
- package/src/adapters/obs-adapter.test.ts +38 -0
- package/src/adapters/obs-adapter.ts +4 -0
- package/src/components/inputs/date/date.component.tsx +3 -10
- package/src/form-engine.component.tsx +3 -2
- package/src/utils/common-utils.ts +11 -0
Binary file
|
Binary file
|
Binary file
|
@@ -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={8008:(e,r,t)=>{var n={"./start":()=>Promise.all([t.e(901),t.e(501),t.e(72),t.e(
|
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={8008:(e,r,t)=>{var n={"./start":()=>Promise.all([t.e(901),t.e(501),t.e(72),t.e(385),t.e(572)]).then((()=>()=>t(8572)))},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})}},y={};function w(e){var r=y[e];if(void 0!==r)return r.exports;var t=y[e]={id:e,loaded:!1,exports:{}};return b[e].call(t.exports,t,t.exports,w),t.loaded=!0,t.exports}w.m=b,w.c=y,w.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return w.d(r,{a:r}),r},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,w.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);w.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,w.d(o,i),o},w.d=(e,r)=>{for(var t in r)w.o(r,t)&&!w.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},w.f={},w.e=e=>Promise.all(Object.keys(w.f).reduce(((r,t)=>(w.f[t](e,r),r)),[])),w.u=e=>e+".js",w.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),w.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),t={},n="@openmrs/esm-form-engine-lib:",w.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,w.nc&&a.setAttribute("nonce",w.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)}},w.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},w.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{w.S={};var e={},r={};w.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];w.o(w.S,t)||(w.S[t]={});var i=w.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","5.7.3-pre.2161",(()=>Promise.all([w.e(151),w.e(72),w.e(766)]).then((()=>()=>w(5151))))),l("@openmrs/esm-patient-common-lib","8.1.1-pre.5183",(()=>Promise.all([w.e(617),w.e(901),w.e(72),w.e(465),w.e(385),w.e(70)]).then((()=>()=>w(8617))))),l("dayjs","1.11.11",(()=>w.e(353).then((()=>()=>w(4353))))),l("i18next","23.11.4",(()=>w.e(635).then((()=>()=>w(2635))))),l("react-i18next","11.18.6",(()=>Promise.all([w.e(422),w.e(72)]).then((()=>()=>w(4422))))),l("react","18.3.1",(()=>w.e(540).then((()=>()=>w(6540))))),l("swr/_internal","2.2.5",(()=>Promise.all([w.e(993),w.e(72)]).then((()=>()=>w(4993))))),l("swr/immutable","2.2.5",(()=>Promise.all([w.e(225),w.e(72),w.e(465)]).then((()=>()=>w(4225))))),l("swr/infinite","2.2.5",(()=>Promise.all([w.e(41),w.e(72),w.e(465)]).then((()=>()=>w(3041)))))),e[t]=s.length?Promise.all(s).then((()=>e[t]=1)):1}}})(),(()=>{var e;w.g.importScripts&&(e=w.g.location+"");var r=w.g.document;if(!e&&r&&(r.currentScript&&(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(/\/[^\/]+$/,"/"),w.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)=>{var t=e[r];return Object.keys(t).reduce(((e,r)=>!e||!t[e].loaded&&i(e,r)?r:e),0)},u=(e,r,t,n)=>"Unsatisfied version "+t+" from "+(t&&e[r][t].from)+" of shared singleton module "+r+" (required "+a(n)+")",f=(e,r,t,n)=>{var o=s(e,t);return l(n,o)||p(u(e,t,o,n)),d(e[t][o])},p=e=>{"undefined"!=typeof console&&console.warn&&console.warn(e)},d=e=>(e.loaded=1,e.get()),c=(e=>function(r,t,n,o){var i=w.I(r);return i&&i.then?i.then(e.bind(e,r,w.S[r],t,n,o)):e(0,w.S[r],t,n,o)})(((e,r,t,n,o)=>r&&w.o(r,t)?f(r,0,t,n):o())),h={},m={6072:()=>c("default","react",[1,18],(()=>w.e(540).then((()=>()=>w(6540))))),6766:()=>c("default","i18next",[1,23],(()=>w.e(635).then((()=>()=>w(2635))))),8465:()=>c("default","swr/_internal",[1,2],(()=>w.e(993).then((()=>()=>w(4993))))),3941:()=>c("default","react-i18next",[1,11],(()=>w.e(422).then((()=>()=>w(4422))))),5972:()=>c("default","@openmrs/esm-framework",[1,5],(()=>Promise.all([w.e(151),w.e(766)]).then((()=>()=>w(5151))))),6656:()=>c("default","@openmrs/esm-patient-common-lib",[1,8],(()=>Promise.all([w.e(617),w.e(465)]).then((()=>()=>w(8617))))),4209:()=>c("default","swr/immutable",[1,2],(()=>Promise.all([w.e(225),w.e(465)]).then((()=>()=>w(4225))))),231:()=>c("default","dayjs",[1,1],(()=>w.e(353).then((()=>()=>w(4353))))),6339:()=>c("default","swr/infinite",[1,2],(()=>Promise.all([w.e(41),w.e(465)]).then((()=>()=>w(3041)))))},v={70:[4209],72:[6072],385:[3941,5972,6656],465:[8465],572:[231,4209,6339],766:[6766]},g={},w.f.consumes=(e,r)=>{w.o(v,e)&&v[e].forEach((e=>{if(w.o(h,e))return r.push(h[e]);if(!g[e]){var t=r=>{h[e]=0,w.m[e]=t=>{delete w.c[e],t.exports=r()}};g[e]=!0;var n=r=>{delete h[e],w.m[e]=t=>{throw delete w.c[e],r}};try{var o=m[e]();o.then?r.push(h[e]=o.then(t).catch(n)):t(o)}catch(e){n(e)}}}))},(()=>{var e={719:0};w.f.j=(r,t)=>{var n=w.o(e,r)?e[r]:void 0;if(0!==n)if(n)t.push(n[2]);else if(/^(385|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=w.p+w.u(r),a=new Error;w.l(i,(t=>{if(w.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)w.o(a,n)&&(w.m[n]=a[n]);l&&l(w)}for(r&&r(t);s<i.length;s++)o=i[s],w.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))})(),w.nc=void 0;var _=w(8008);_openmrs_esm_form_engine_lib=_})();
|
Binary file
|
package/package.json
CHANGED
@@ -745,6 +745,44 @@ describe('ObsAdapter - getInitialValue', () => {
|
|
745
745
|
});
|
746
746
|
});
|
747
747
|
|
748
|
+
describe('ObsAdapter - getDisplayValue', () => {
|
749
|
+
it('should return the display value for a date', () => {
|
750
|
+
const field: FormField = {
|
751
|
+
label: 'HTS Date',
|
752
|
+
type: 'obs',
|
753
|
+
datePickerFormat: 'calendar',
|
754
|
+
questionOptions: {
|
755
|
+
rendering: 'date',
|
756
|
+
concept: 'j8b6705b-b6d8-4eju-8f37-0b14f5347569',
|
757
|
+
},
|
758
|
+
id: 'hts-date',
|
759
|
+
};
|
760
|
+
|
761
|
+
const dateValue = new Date('2016-11-19T00:00');
|
762
|
+
const displayValue = ObsAdapter.getDisplayValue(field, dateValue);
|
763
|
+
|
764
|
+
expect(displayValue).toBe('19-Nov-2016');
|
765
|
+
});
|
766
|
+
|
767
|
+
it('should return the display value for a datetime', () => {
|
768
|
+
const field: FormField = {
|
769
|
+
label: 'HTS Date',
|
770
|
+
type: 'obs',
|
771
|
+
datePickerFormat: 'both',
|
772
|
+
questionOptions: {
|
773
|
+
rendering: 'date',
|
774
|
+
concept: 'j8b6705b-b6d8-4eju-8f37-0b14f5347569',
|
775
|
+
},
|
776
|
+
id: 'hts-date',
|
777
|
+
};
|
778
|
+
|
779
|
+
const dateValue = new Date('2016-11-19T11:35');
|
780
|
+
const displayValue = ObsAdapter.getDisplayValue(field, dateValue);
|
781
|
+
|
782
|
+
expect(displayValue).toBe('19-Nov-2016, 11:35 AM');
|
783
|
+
});
|
784
|
+
});
|
785
|
+
|
748
786
|
describe('hasPreviousObsValueChanged', () => {
|
749
787
|
it('should support coded values', () => {
|
750
788
|
const codedField = {
|
@@ -14,6 +14,7 @@ import {
|
|
14
14
|
clearSubmission,
|
15
15
|
flattenObsList,
|
16
16
|
parseToLocalDateTime,
|
17
|
+
formatDateAsDisplayString,
|
17
18
|
} from '../utils/common-utils';
|
18
19
|
import { type FormContextProps } from '../provider/form-provider';
|
19
20
|
import { type FormFieldValueAdapter } from '../types';
|
@@ -59,6 +60,9 @@ export const ObsAdapter: FormFieldValueAdapter = {
|
|
59
60
|
if (isEmpty(value)) {
|
60
61
|
return value;
|
61
62
|
}
|
63
|
+
if (value instanceof Date) {
|
64
|
+
return formatDateAsDisplayString(field, value);
|
65
|
+
}
|
62
66
|
if (rendering == 'checkbox') {
|
63
67
|
return value.map(
|
64
68
|
(selected) => field.questionOptions.answers?.find((option) => option.concept == selected)?.label,
|
@@ -8,9 +8,10 @@ import { shouldUseInlineLayout } from '../../../utils/form-helper';
|
|
8
8
|
import { isEmpty } from '../../../validators/form-validator';
|
9
9
|
import FieldValueView from '../../value/view/field-value-view.component';
|
10
10
|
import styles from './date.scss';
|
11
|
-
import { OpenmrsDatePicker
|
11
|
+
import { OpenmrsDatePicker } from '@openmrs/esm-framework';
|
12
12
|
import { useFormProviderContext } from '../../../provider/form-provider';
|
13
13
|
import FieldLabel from '../../field-label/field-label.component';
|
14
|
+
import { formatDateAsDisplayString } from '../../../utils/common-utils';
|
14
15
|
|
15
16
|
const DateField: React.FC<FormFieldInputProps> = ({ field, value: dateValue, errors, warnings, setFieldValue }) => {
|
16
17
|
const { t } = useTranslation();
|
@@ -74,7 +75,7 @@ const DateField: React.FC<FormFieldInputProps> = ({ field, value: dateValue, err
|
|
74
75
|
return sessionMode == 'view' || sessionMode == 'embedded-view' ? (
|
75
76
|
<FieldValueView
|
76
77
|
label={t(field.label)}
|
77
|
-
value={dateValue instanceof Date ?
|
78
|
+
value={dateValue instanceof Date ? formatDateAsDisplayString(field, dateValue) : dateValue}
|
78
79
|
conceptName={field.meta?.concept?.display}
|
79
80
|
isInline={isInline}
|
80
81
|
/>
|
@@ -136,12 +137,4 @@ const DateField: React.FC<FormFieldInputProps> = ({ field, value: dateValue, err
|
|
136
137
|
);
|
137
138
|
};
|
138
139
|
|
139
|
-
function getDisplay(date: Date, rendering: string) {
|
140
|
-
const dateString = formatDate(date);
|
141
|
-
if (rendering == 'both') {
|
142
|
-
return `${dateString} ${formatTime(date)}`;
|
143
|
-
}
|
144
|
-
return dateString;
|
145
|
-
}
|
146
|
-
|
147
140
|
export default DateField;
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
2
2
|
import type { FormField, FormSchema, SessionMode } from './types';
|
3
3
|
import { useSession, type Visit } from '@openmrs/esm-framework';
|
4
|
-
import { useFormJson } from '.';
|
4
|
+
import { isEmpty, useFormJson } from '.';
|
5
5
|
import FormProcessorFactory from './components/processor-factory/form-processor-factory.component';
|
6
6
|
import Loader from './components/loaders/loader.component';
|
7
7
|
import { usePatientData } from './hooks/usePatientData';
|
@@ -62,6 +62,7 @@ const FormEngine = ({
|
|
62
62
|
const [showSidebar, setShowSidebar] = useState(false);
|
63
63
|
const [isSubmitting, setIsSubmitting] = useState(false);
|
64
64
|
const [isFormDirty, setIsFormDirty] = useState(false);
|
65
|
+
const sessionMode = !isEmpty(mode) ? mode : !isEmpty(encounterUUID) ? 'edit' : 'enter';
|
65
66
|
// TODO: Updating this prop triggers a rerender of the entire form. This means whenever we scroll into a new page, the form is rerendered.
|
66
67
|
// Figure out a way to avoid this. Maybe use a ref with an observer instead of a state?
|
67
68
|
const [currentPage, setCurrentPage] = useState('');
|
@@ -110,7 +111,7 @@ const FormEngine = ({
|
|
110
111
|
) : (
|
111
112
|
<FormFactoryProvider
|
112
113
|
patient={patient}
|
113
|
-
sessionMode={
|
114
|
+
sessionMode={sessionMode}
|
114
115
|
sessionDate={sessionDate}
|
115
116
|
formJson={refinedFormJson}
|
116
117
|
workspaceLayout={workspaceLayout}
|
@@ -1,6 +1,7 @@
|
|
1
1
|
import dayjs from 'dayjs';
|
2
2
|
import { type FormField, type OpenmrsObs, type RenderType } from '../types';
|
3
3
|
import { isEmpty } from '../validators/form-validator';
|
4
|
+
import { formatDate, type FormatDateOptions } from '@openmrs/esm-framework';
|
4
5
|
|
5
6
|
export function flattenObsList(obsList: OpenmrsObs[]): OpenmrsObs[] {
|
6
7
|
const flattenedList: OpenmrsObs[] = [];
|
@@ -65,3 +66,13 @@ export function parseToLocalDateTime(dateString: string): Date {
|
|
65
66
|
}
|
66
67
|
return dateObj;
|
67
68
|
}
|
69
|
+
|
70
|
+
export function formatDateAsDisplayString(field: FormField, date: Date) {
|
71
|
+
const options: Partial<FormatDateOptions> = { noToday: true };
|
72
|
+
if (field.datePickerFormat === 'calendar') {
|
73
|
+
options.time = false;
|
74
|
+
} else {
|
75
|
+
options.time = true;
|
76
|
+
}
|
77
|
+
return formatDate(date, options);
|
78
|
+
}
|