@openmrs/esm-generic-patient-widgets-app 11.3.1-pre.9462 → 11.3.1-pre.9480
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/.turbo/turbo-build.log +8 -8
- package/dist/1936.js +1 -1
- package/dist/1936.js.map +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/openmrs-esm-generic-patient-widgets-app.js +1 -1
- package/dist/openmrs-esm-generic-patient-widgets-app.js.buildmanifest.json +7 -7
- package/dist/routes.json +1 -1
- package/package.json +2 -2
- package/src/config-schema-obs-switchable.ts +7 -1
- package/src/obs-switchable/obs-switchable.test.tsx +86 -10
- package/src/obs-table/obs-table.component.tsx +98 -17
|
@@ -1 +1 @@
|
|
|
1
|
-
var _openmrs_esm_generic_patient_widgets_app;(()=>{"use strict";var e,r,t,n,o,a,i,s,l,u,p,f,d,c,h,m,g,v,b,w,y,_={45684:(e,r,t)=>{var n={"./start":()=>Promise.all([t.e(2606),t.e(3204),t.e(5641),t.e(5434),t.e(8571),t.e(1936)]).then((()=>()=>t(61936)))},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),a=(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:()=>a})}},P={};function j(e){var r=P[e];if(void 0!==r)return r.exports;var t=P[e]={id:e,exports:{}};return _[e].call(t.exports,t,t.exports,j),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 a={};e=e||[null,r({}),r([]),r(r)];for(var i=2&n&&t;"object"==typeof i&&!~e.indexOf(i);i=r(i))Object.getOwnPropertyNames(i).forEach((e=>a[e]=()=>t[e]));return a.default=()=>t,j.d(o,a),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-generic-patient-widgets-app:",j.l=(e,r,o,a)=>{if(t[e])t[e].push(r);else{var i,s;if(void 0!==o)for(var l=document.getElementsByTagName("script"),u=0;u<l.length;u++){var p=l[u];if(p.getAttribute("src")==e||p.getAttribute("data-webpack")==n+o){i=p;break}}i||(s=!0,(i=document.createElement("script")).charset="utf-8",i.timeout=120,j.nc&&i.setAttribute("nonce",j.nc),i.setAttribute("data-webpack",n+o),i.src=e),t[e]=[r];var f=(r,n)=>{i.onerror=i.onload=null,clearTimeout(d);var o=t[e];if(delete t[e],i.parentNode&&i.parentNode.removeChild(i),o&&o.forEach((e=>e(n))),r)return r(n)},d=setTimeout(f.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=f.bind(null,i.onerror),i.onload=f.bind(null,i.onload),s&&document.head.appendChild(i)}},j.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{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 a=j.S[t],i="@openmrs/esm-generic-patient-widgets-app",s=(e,r,t,n)=>{var o=a[e]=a[e]||{},s=o[r];(!s||!s.loaded&&(!n!=!s.eager?n:i>s.from))&&(o[r]={get:t,from:i,eager:!!n})},l=[];return"default"===t&&(s("@openmrs/esm-framework","8.0.1-pre.3518",(()=>Promise.all([j.e(7545),j.e(2606),j.e(5670),j.e(5641),j.e(5434),j.e(8382),j.e(8571)]).then((()=>()=>j(55670))))),s("@openmrs/esm-patient-common-lib","11.3.1-pre.
|
|
1
|
+
var _openmrs_esm_generic_patient_widgets_app;(()=>{"use strict";var e,r,t,n,o,a,i,s,l,u,p,f,d,c,h,m,g,v,b,w,y,_={45684:(e,r,t)=>{var n={"./start":()=>Promise.all([t.e(2606),t.e(3204),t.e(5641),t.e(5434),t.e(8571),t.e(1936)]).then((()=>()=>t(61936)))},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),a=(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:()=>a})}},P={};function j(e){var r=P[e];if(void 0!==r)return r.exports;var t=P[e]={id:e,exports:{}};return _[e].call(t.exports,t,t.exports,j),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 a={};e=e||[null,r({}),r([]),r(r)];for(var i=2&n&&t;"object"==typeof i&&!~e.indexOf(i);i=r(i))Object.getOwnPropertyNames(i).forEach((e=>a[e]=()=>t[e]));return a.default=()=>t,j.d(o,a),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-generic-patient-widgets-app:",j.l=(e,r,o,a)=>{if(t[e])t[e].push(r);else{var i,s;if(void 0!==o)for(var l=document.getElementsByTagName("script"),u=0;u<l.length;u++){var p=l[u];if(p.getAttribute("src")==e||p.getAttribute("data-webpack")==n+o){i=p;break}}i||(s=!0,(i=document.createElement("script")).charset="utf-8",i.timeout=120,j.nc&&i.setAttribute("nonce",j.nc),i.setAttribute("data-webpack",n+o),i.src=e),t[e]=[r];var f=(r,n)=>{i.onerror=i.onload=null,clearTimeout(d);var o=t[e];if(delete t[e],i.parentNode&&i.parentNode.removeChild(i),o&&o.forEach((e=>e(n))),r)return r(n)},d=setTimeout(f.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=f.bind(null,i.onerror),i.onload=f.bind(null,i.onload),s&&document.head.appendChild(i)}},j.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{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 a=j.S[t],i="@openmrs/esm-generic-patient-widgets-app",s=(e,r,t,n)=>{var o=a[e]=a[e]||{},s=o[r];(!s||!s.loaded&&(!n!=!s.eager?n:i>s.from))&&(o[r]={get:t,from:i,eager:!!n})},l=[];return"default"===t&&(s("@openmrs/esm-framework","8.0.1-pre.3518",(()=>Promise.all([j.e(7545),j.e(2606),j.e(5670),j.e(5641),j.e(5434),j.e(8382),j.e(8571)]).then((()=>()=>j(55670))))),s("@openmrs/esm-patient-common-lib","11.3.1-pre.9480",(()=>Promise.all([j.e(7545),j.e(2606),j.e(5641),j.e(5434),j.e(8382),j.e(8571),j.e(4341)]).then((()=>()=>j(94341))))),s("dayjs","1.11.13",(()=>j.e(3464).then((()=>()=>j(23464))))),s("react-i18next","16.0.0",(()=>Promise.all([j.e(6336),j.e(5641)]).then((()=>()=>j(16336))))),s("react-router-dom","6.16.0",(()=>Promise.all([j.e(2913),j.e(5641)]).then((()=>()=>j(52913))))),s("react","18.3.1",(()=>j.e(4041).then((()=>()=>j(14041))))),s("rxjs","6.6.7",(()=>j.e(2457).then((()=>()=>j(82457))))),s("swr/_internal","2.2.5",(()=>Promise.all([j.e(2372),j.e(5641)]).then((()=>()=>j(42372))))),s("swr/immutable","2.2.5",(()=>Promise.all([j.e(5641),j.e(5434),j.e(7495)]).then((()=>()=>j(29876))))),s("swr/infinite","2.2.5",(()=>Promise.all([j.e(5641),j.e(5434),j.e(89)]).then((()=>()=>j(52470)))))),e[t]=l.length?Promise.all(l).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(/^blob:/,"").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},a=(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],a=(typeof n)[0];if(t>=r.length)return"u"==a;var i=r[t],s=(typeof i)[0];if(a!=s)return"o"==a&&"n"==s||"s"==s||"u"==a;if("o"!=a&&"u"!=a&&n!=i)return n<i;t++}},i=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(s=e[o]))[0]?"-":(n>0?".":"")+(n=2,s);return t}var a=[];for(o=1;o<e.length;o++){var s=e[o];a.push(0===s?"not("+l()+")":1===s?"("+l()+" || "+l()+")":2===s?a.pop()+" "+a.pop():i(s))}return l();function l(){return a.pop().replace(/^\((.+)\)$/,"$1")}},s=(e,r)=>{if(0 in e){r=o(r);var t=e[0],n=t<0;n&&(t=-t-1);for(var a=0,i=1,l=!0;;i++,a++){var u,p,f=i<e.length?(typeof e[i])[0]:"";if(a>=r.length||"o"==(p=(typeof(u=r[a]))[0]))return!l||("u"==f?i>t&&!n:""==f!=n);if("u"==p){if(!l||"u"!=f)return!1}else if(l)if(f==p)if(i<=t){if(u!=e[i])return!1}else{if(n?u>e[i]:u<e[i])return!1;u!=e[i]&&(l=!1)}else if("s"!=f&&"n"!=f){if(n||i<=t)return!1;l=!1,i--}else{if(i<=t||p<f!=n)return!1;l=!1}else"s"!=f&&"n"!=f&&(l=!1,i--)}}var d=[],c=d.pop.bind(d);for(a=1;a<e.length;a++){var h=e[a];d.push(1==h?c()|c():2==h?c()&c():h?s(h,r):!c())}return!!c()},l=(e,r)=>e&&j.o(e,r),u=e=>(e.loaded=1,e.get()),p=e=>Object.keys(e).reduce(((r,t)=>(e[t].eager&&(r[t]=e[t]),r)),{}),f=(e,r,t)=>{var n=t?p(e[r]):e[r];return Object.keys(n).reduce(((e,r)=>!e||!n[e].loaded&&a(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 "+i(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),g=(e=>function(r,t,n,o,a){var i=j.I(r);return i&&i.then&&!n?i.then(e.bind(e,r,j.S[r],t,!1,o,a)):e(r,j.S[r],t,n,o,a)})(((e,r,t,n,o,a)=>{if(!l(r,t))return m(e,t,a);var i=f(r,t,n);return s(o,i)||h(d(r,t,i,o)),u(r[t][i])})),v={},b={75641:()=>g("default","react",!1,[1,18,2,0],(()=>j.e(4041).then((()=>()=>j(14041))))),55434:()=>g("default","swr/_internal",!1,[1,2],(()=>j.e(2372).then((()=>()=>j(42372))))),8877:()=>g("default","react-router-dom",!1,[1,6],(()=>j.e(2913).then((()=>()=>j(52913))))),24818:()=>g("default","rxjs",!1,[1,6],(()=>j.e(2457).then((()=>()=>j(82457))))),46372:()=>g("default","dayjs",!1,[1,1],(()=>j.e(3464).then((()=>()=>j(23464))))),98394:()=>g("default","swr/infinite",!1,[1,2],(()=>j.e(2470).then((()=>()=>j(52470))))),54440:()=>g("default","@openmrs/esm-framework",!1,[1,8],(()=>Promise.all([j.e(7545),j.e(5670),j.e(8382)]).then((()=>()=>j(55670))))),72339:()=>g("default","react-i18next",!1,[1,16],(()=>j.e(6336).then((()=>()=>j(16336))))),88010:()=>g("default","swr/immutable",!1,[1,2],(()=>j.e(9876).then((()=>()=>j(29876))))),36274:()=>g("default","@openmrs/esm-patient-common-lib",!1,[1,11],(()=>Promise.all([j.e(7545),j.e(8382),j.e(4341)]).then((()=>()=>j(94341)))))},w={1936:[36274],5434:[55434],5641:[75641],8382:[8877,24818,46372,98394],8571:[54440,72339,88010]},y={},j.f.consumes=(e,r)=>{j.o(w,e)&&w[e].forEach((e=>{if(j.o(v,e))return r.push(v[e]);if(!y[e]){var t=r=>{v[e]=0,j.m[e]=t=>{delete j.c[e],t.exports=r()}};y[e]=!0;var n=r=>{delete v[e],j.m[e]=t=>{throw delete j.c[e],r}};try{var o=b[e]();o.then?r.push(v[e]=o.then(t).catch(n)):t(o)}catch(e){n(e)}}}))},(()=>{var e={3461: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(/^(5434|5641|8382|8571)$/.test(r))e[r]=0;else{var o=new Promise(((t,o)=>n=e[r]=[t,o]));t.push(n[2]=o);var a=j.p+j.u(r),i=new Error;j.l(a,(t=>{if(j.o(e,r)&&(0!==(n=e[r])&&(e[r]=void 0),n)){var o=t&&("load"===t.type?"missing":t.type),a=t&&t.target&&t.target.src;i.message="Loading chunk "+r+" failed.\n("+o+": "+a+")",i.name="ChunkLoadError",i.type=o,i.request=a,n[1](i)}}),"chunk-"+r,r)}};var r=(r,t)=>{var n,o,[a,i,s]=t,l=0;if(a.some((r=>0!==e[r]))){for(n in i)j.o(i,n)&&(j.m[n]=i[n]);s&&s(j)}for(r&&r(t);l<a.length;l++)o=a[l],j.o(e,o)&&e[o]&&e[o][0](),e[o]=0},t=globalThis.webpackChunk_openmrs_esm_generic_patient_widgets_app=globalThis.webpackChunk_openmrs_esm_generic_patient_widgets_app||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})(),j.nc=void 0;var S=j(45684);_openmrs_esm_generic_patient_widgets_app=S})();
|
|
@@ -183,9 +183,9 @@
|
|
|
183
183
|
"initial": false,
|
|
184
184
|
"entry": false,
|
|
185
185
|
"recorded": false,
|
|
186
|
-
"size":
|
|
186
|
+
"size": 182596,
|
|
187
187
|
"sizes": {
|
|
188
|
-
"javascript":
|
|
188
|
+
"javascript": 182554,
|
|
189
189
|
"consume-shared": 42
|
|
190
190
|
},
|
|
191
191
|
"names": [],
|
|
@@ -199,7 +199,7 @@
|
|
|
199
199
|
"auxiliaryFiles": [
|
|
200
200
|
"1936.js.map"
|
|
201
201
|
],
|
|
202
|
-
"hash": "
|
|
202
|
+
"hash": "0c358309feb64cf8",
|
|
203
203
|
"childrenByOrder": {}
|
|
204
204
|
},
|
|
205
205
|
{
|
|
@@ -450,7 +450,7 @@
|
|
|
450
450
|
"auxiliaryFiles": [
|
|
451
451
|
"openmrs-esm-generic-patient-widgets-app.js.map"
|
|
452
452
|
],
|
|
453
|
-
"hash": "
|
|
453
|
+
"hash": "07be38d78397886b",
|
|
454
454
|
"childrenByOrder": {}
|
|
455
455
|
},
|
|
456
456
|
{
|
|
@@ -1270,10 +1270,10 @@
|
|
|
1270
1270
|
"initial": true,
|
|
1271
1271
|
"entry": true,
|
|
1272
1272
|
"recorded": false,
|
|
1273
|
-
"size":
|
|
1273
|
+
"size": 3814253,
|
|
1274
1274
|
"sizes": {
|
|
1275
1275
|
"consume-shared": 252,
|
|
1276
|
-
"javascript":
|
|
1276
|
+
"javascript": 3790890,
|
|
1277
1277
|
"share-init": 420,
|
|
1278
1278
|
"runtime": 22691
|
|
1279
1279
|
},
|
|
@@ -1290,7 +1290,7 @@
|
|
|
1290
1290
|
"auxiliaryFiles": [
|
|
1291
1291
|
"main.js.map"
|
|
1292
1292
|
],
|
|
1293
|
-
"hash": "
|
|
1293
|
+
"hash": "a1b36ab304015f42",
|
|
1294
1294
|
"childrenByOrder": {}
|
|
1295
1295
|
},
|
|
1296
1296
|
{
|
package/dist/routes.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"$schema":"https://json.openmrs.org/routes.schema.json","backendDependencies":{"fhir2":">=1.2"},"extensions":[{"name":"obs-by-encounter-widget","component":"switchableObs","online":true,"offline":true,"meta":{"fullWidth":false}},{"name":"obs-table-horizontal-widget-small","component":"obsTableHorizontal","online":true,"offline":true,"meta":{"fullWidth":false}},{"name":"obs-table-horizontal-widget","component":"obsTableHorizontal","online":true,"offline":true,"meta":{"fullWidth":true}}],"version":"11.3.1-pre.
|
|
1
|
+
{"$schema":"https://json.openmrs.org/routes.schema.json","backendDependencies":{"fhir2":">=1.2"},"extensions":[{"name":"obs-by-encounter-widget","component":"switchableObs","online":true,"offline":true,"meta":{"fullWidth":false}},{"name":"obs-table-horizontal-widget-small","component":"obsTableHorizontal","online":true,"offline":true,"meta":{"fullWidth":false}},{"name":"obs-table-horizontal-widget","component":"obsTableHorizontal","online":true,"offline":true,"meta":{"fullWidth":true}}],"version":"11.3.1-pre.9480"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openmrs/esm-generic-patient-widgets-app",
|
|
3
|
-
"version": "11.3.1-pre.
|
|
3
|
+
"version": "11.3.1-pre.9480",
|
|
4
4
|
"license": "MPL-2.0",
|
|
5
5
|
"description": "Generic widgets for the patient chart",
|
|
6
6
|
"browser": "dist/openmrs-esm-generic-patient-widgets-app.js",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"swr": "2.x"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
|
-
"@openmrs/esm-patient-common-lib": "11.3.1-pre.
|
|
55
|
+
"@openmrs/esm-patient-common-lib": "11.3.1-pre.9480",
|
|
56
56
|
"webpack": "^5.99.9"
|
|
57
57
|
},
|
|
58
58
|
"stableVersion": "11.3.0"
|
|
@@ -13,7 +13,12 @@ export const configSchemaSwitchable = {
|
|
|
13
13
|
},
|
|
14
14
|
graphOldestFirst: {
|
|
15
15
|
_type: Type.Boolean,
|
|
16
|
-
_description: '
|
|
16
|
+
_description: 'Plot values from oldest (left) to newest (right)',
|
|
17
|
+
_default: false,
|
|
18
|
+
},
|
|
19
|
+
tableSortOldestFirst: {
|
|
20
|
+
_type: Type.Boolean,
|
|
21
|
+
_description: 'Sort table by default from oldest to newest',
|
|
17
22
|
_default: false,
|
|
18
23
|
},
|
|
19
24
|
interpretationSlot: {
|
|
@@ -98,6 +103,7 @@ export interface ConfigObjectSwitchable {
|
|
|
98
103
|
title: string;
|
|
99
104
|
resultsName: string;
|
|
100
105
|
graphOldestFirst: boolean;
|
|
106
|
+
tableSortOldestFirst: boolean;
|
|
101
107
|
interpretationSlot: string;
|
|
102
108
|
data: Array<{
|
|
103
109
|
concept: string;
|
|
@@ -116,17 +116,17 @@ describe('ObsSwitchable', () => {
|
|
|
116
116
|
expect(headerRow).toHaveTextContent('Chief Complaint');
|
|
117
117
|
expect(headerRow).toHaveTextContent('Power Level');
|
|
118
118
|
const firstRow = screen.getAllByRole('row')[1];
|
|
119
|
-
expect(firstRow).toHaveTextContent('
|
|
120
|
-
expect(firstRow).toHaveTextContent('
|
|
121
|
-
expect(firstRow).toHaveTextContent('
|
|
122
|
-
expect(firstRow).toHaveTextContent('
|
|
123
|
-
expect(firstRow).toHaveTextContent('
|
|
119
|
+
expect(firstRow).toHaveTextContent('Feb');
|
|
120
|
+
expect(firstRow).toHaveTextContent('182');
|
|
121
|
+
expect(firstRow).toHaveTextContent('72');
|
|
122
|
+
expect(firstRow).toHaveTextContent('--');
|
|
123
|
+
expect(firstRow).toHaveTextContent('--');
|
|
124
124
|
const secondRow = screen.getAllByRole('row')[2];
|
|
125
|
-
expect(secondRow).toHaveTextContent('
|
|
126
|
-
expect(secondRow).toHaveTextContent('
|
|
127
|
-
expect(secondRow).toHaveTextContent('
|
|
128
|
-
expect(secondRow).toHaveTextContent('
|
|
129
|
-
expect(secondRow).toHaveTextContent('
|
|
125
|
+
expect(secondRow).toHaveTextContent('Jan');
|
|
126
|
+
expect(secondRow).toHaveTextContent('180');
|
|
127
|
+
expect(secondRow).toHaveTextContent('70');
|
|
128
|
+
expect(secondRow).toHaveTextContent('Too strong');
|
|
129
|
+
expect(secondRow).toHaveTextContent('9001');
|
|
130
130
|
|
|
131
131
|
const user = userEvent.setup();
|
|
132
132
|
const chartViewButton = screen.getByLabelText('Chart view');
|
|
@@ -182,6 +182,82 @@ describe('ObsSwitchable', () => {
|
|
|
182
182
|
);
|
|
183
183
|
});
|
|
184
184
|
|
|
185
|
+
it('should sort by date and by obs correctly', async () => {
|
|
186
|
+
mockUseObs.mockReturnValue({
|
|
187
|
+
data: { observations: mockObsData as Array<ObsResult>, concepts: mockConceptData, encounters: mockEncounters },
|
|
188
|
+
error: null,
|
|
189
|
+
isLoading: false,
|
|
190
|
+
isValidating: false,
|
|
191
|
+
mutate: jest.fn(),
|
|
192
|
+
});
|
|
193
|
+
mockUseConfig.mockReturnValue({
|
|
194
|
+
...(getDefaultsFromConfigSchema(configSchemaSwitchable) as Object),
|
|
195
|
+
title: 'My Stats',
|
|
196
|
+
data: [
|
|
197
|
+
{
|
|
198
|
+
concept: '5090AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
|
|
199
|
+
label: 'Tallitude',
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
concept: '2154AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
|
|
203
|
+
},
|
|
204
|
+
{ concept: '164162AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' },
|
|
205
|
+
{ concept: '164163AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' },
|
|
206
|
+
],
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
render(<ObsSwitchable patientUuid="123" />);
|
|
210
|
+
|
|
211
|
+
const user = userEvent.setup();
|
|
212
|
+
|
|
213
|
+
const firstRowInitial = screen.getAllByRole('row')[1];
|
|
214
|
+
expect(firstRowInitial).toHaveTextContent('01 — Feb — 2021');
|
|
215
|
+
const secondRowInitial = screen.getAllByRole('row')[2];
|
|
216
|
+
expect(secondRowInitial).toHaveTextContent('01 — Jan — 2021');
|
|
217
|
+
|
|
218
|
+
const dateHeader = screen.getByText('Date and time');
|
|
219
|
+
await user.click(dateHeader);
|
|
220
|
+
const firstRow = screen.getAllByRole('row')[1];
|
|
221
|
+
expect(firstRow).toHaveTextContent('01 — Feb — 2021');
|
|
222
|
+
const secondRow = screen.getAllByRole('row')[2];
|
|
223
|
+
expect(secondRow).toHaveTextContent('01 — Jan — 2021');
|
|
224
|
+
|
|
225
|
+
await user.click(dateHeader);
|
|
226
|
+
const firstRow2 = screen.getAllByRole('row')[1];
|
|
227
|
+
expect(firstRow2).toHaveTextContent('01 — Jan — 2021');
|
|
228
|
+
const secondRow2 = screen.getAllByRole('row')[2];
|
|
229
|
+
expect(secondRow2).toHaveTextContent('01 — Feb — 2021');
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
it('supports table sorting oldest to newest', async () => {
|
|
233
|
+
mockUseObs.mockReturnValue({
|
|
234
|
+
data: { observations: mockObsData as Array<ObsResult>, concepts: mockConceptData, encounters: mockEncounters },
|
|
235
|
+
error: null,
|
|
236
|
+
isLoading: false,
|
|
237
|
+
isValidating: false,
|
|
238
|
+
mutate: jest.fn(),
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
mockUseConfig.mockReturnValue({
|
|
242
|
+
...(getDefaultsFromConfigSchema(configSchemaSwitchable) as Object),
|
|
243
|
+
title: 'My Stats',
|
|
244
|
+
data: [{ concept: '5090AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' }, { concept: '2154AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' }],
|
|
245
|
+
tableSortOldestFirst: true,
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
render(<ObsSwitchable patientUuid="123" />);
|
|
249
|
+
|
|
250
|
+
const user = userEvent.setup();
|
|
251
|
+
|
|
252
|
+
const dateHeader = screen.getByText('Date and time');
|
|
253
|
+
await user.click(dateHeader);
|
|
254
|
+
|
|
255
|
+
const firstRow = screen.getAllByRole('row')[1];
|
|
256
|
+
expect(firstRow).toHaveTextContent('01 — Jan — 2021');
|
|
257
|
+
const secondRow = screen.getAllByRole('row')[2];
|
|
258
|
+
expect(secondRow).toHaveTextContent('01 — Feb — 2021');
|
|
259
|
+
});
|
|
260
|
+
|
|
185
261
|
it('should support showing graph tab by default', async () => {
|
|
186
262
|
mockUseObs.mockReturnValue({
|
|
187
263
|
data: { observations: mockObsData as Array<ObsResult>, concepts: mockConceptData, encounters: mockEncounters },
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { useMemo, useState, useCallback } from 'react';
|
|
2
2
|
import {
|
|
3
3
|
DataTable,
|
|
4
4
|
Table,
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
TableHead,
|
|
9
9
|
TableHeader,
|
|
10
10
|
TableRow,
|
|
11
|
+
type DataTableSortState,
|
|
11
12
|
} from '@carbon/react';
|
|
12
13
|
import { usePagination, useConfig, formatDatetime, formatDate, formatTime } from '@openmrs/esm-framework';
|
|
13
14
|
import { PatientChartPagination } from '@openmrs/esm-patient-common-lib';
|
|
@@ -20,6 +21,20 @@ interface ObsTableProps {
|
|
|
20
21
|
patientUuid: string;
|
|
21
22
|
}
|
|
22
23
|
|
|
24
|
+
interface Row {
|
|
25
|
+
id: string;
|
|
26
|
+
date: string;
|
|
27
|
+
rawDate: string;
|
|
28
|
+
encounter: string;
|
|
29
|
+
[conceptUuid: string]: string | number;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
interface Header {
|
|
33
|
+
key: string;
|
|
34
|
+
header: string;
|
|
35
|
+
sortFunc: (rowA: Row, rowB: Row) => number;
|
|
36
|
+
}
|
|
37
|
+
|
|
23
38
|
const ObsTable: React.FC<ObsTableProps> = ({ patientUuid }) => {
|
|
24
39
|
const { t } = useTranslation();
|
|
25
40
|
const config = useConfig<ConfigObjectSwitchable>();
|
|
@@ -32,24 +47,51 @@ const ObsTable: React.FC<ObsTableProps> = ({ patientUuid }) => {
|
|
|
32
47
|
observations.filter((o) => o.encounter.reference === reference),
|
|
33
48
|
);
|
|
34
49
|
|
|
35
|
-
const tableHeaders =
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
50
|
+
const tableHeaders: Array<Header> = useMemo(() => {
|
|
51
|
+
const headers: Array<Header> = [
|
|
52
|
+
{
|
|
53
|
+
key: 'date',
|
|
54
|
+
header: t('dateAndTime', 'Date and time'),
|
|
55
|
+
sortFunc: (rowA: Row, rowB: Row) => new Date(rowB.rawDate).getTime() - new Date(rowA.rawDate).getTime(),
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
if (config.showEncounterType) {
|
|
59
|
+
headers.splice(1, 0, {
|
|
60
|
+
key: 'encounter',
|
|
61
|
+
header: t('encounterType', 'Encounter type'),
|
|
62
|
+
sortFunc: (rowA: Row, rowB: Row) => rowA.encounter.localeCompare(rowB.encounter) as 1 | -1,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
headers.push(
|
|
66
|
+
...config.data.map(({ concept, label }) => ({
|
|
67
|
+
key: concept,
|
|
68
|
+
header: label || concepts.find((c) => c.uuid == concept)?.display,
|
|
69
|
+
sortFunc: (rowA: Row, rowB: Row) => {
|
|
70
|
+
const a = rowA[concept];
|
|
71
|
+
const b = rowB[concept];
|
|
72
|
+
if (a === b) {
|
|
73
|
+
return 0;
|
|
74
|
+
}
|
|
75
|
+
if (a == null) {
|
|
76
|
+
return 1;
|
|
77
|
+
}
|
|
78
|
+
if (b == null) {
|
|
79
|
+
return -1;
|
|
80
|
+
}
|
|
81
|
+
return a < b ? 1 : -1;
|
|
82
|
+
},
|
|
83
|
+
})),
|
|
84
|
+
);
|
|
85
|
+
return headers;
|
|
86
|
+
}, [t, config.data, config.showEncounterType, concepts]);
|
|
87
|
+
|
|
88
|
+
const tableRows: Array<Row> = React.useMemo(
|
|
48
89
|
() =>
|
|
49
90
|
obssGroupedByEncounters?.map((obss, index) => {
|
|
50
91
|
const rowData = {
|
|
51
92
|
id: `${index}`,
|
|
52
93
|
date: formatDatetime(new Date(obss[0].effectiveDateTime), { mode: 'wide' }),
|
|
94
|
+
rawDate: obss[0].effectiveDateTime,
|
|
53
95
|
encounter: obss[0].encounter.name,
|
|
54
96
|
};
|
|
55
97
|
|
|
@@ -101,11 +143,50 @@ const ObsTable: React.FC<ObsTableProps> = ({ patientUuid }) => {
|
|
|
101
143
|
[config.data, config?.dateFormat, obssGroupedByEncounters],
|
|
102
144
|
);
|
|
103
145
|
|
|
104
|
-
const {
|
|
146
|
+
const [sortParams, setSortParams] = useState<{ key: string; sortDirection: 'ASC' | 'DESC' | 'NONE' }>({
|
|
147
|
+
key: 'date',
|
|
148
|
+
sortDirection: config.tableSortOldestFirst ? 'ASC' : 'DESC',
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
const handleSorting = useCallback(
|
|
152
|
+
(cellA: any, cellB: any, { key, sortDirection }: { key: string; sortDirection: DataTableSortState }) => {
|
|
153
|
+
// Use setTimeout to avoid setState during render
|
|
154
|
+
setTimeout(() => {
|
|
155
|
+
if (sortDirection === 'NONE') {
|
|
156
|
+
setSortParams({ key: '', sortDirection });
|
|
157
|
+
} else {
|
|
158
|
+
setSortParams({ key, sortDirection });
|
|
159
|
+
}
|
|
160
|
+
}, 0);
|
|
161
|
+
return 0;
|
|
162
|
+
},
|
|
163
|
+
[],
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
const sortedData: Array<any> = useMemo(() => {
|
|
167
|
+
if (sortParams.sortDirection === 'NONE') {
|
|
168
|
+
return tableRows;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const header = tableHeaders.find((header) => header.key === sortParams.key);
|
|
172
|
+
|
|
173
|
+
if (!header) {
|
|
174
|
+
return tableRows;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const sortedRows = tableRows.slice().sort((rowA, rowB) => {
|
|
178
|
+
const sortingNum = header.sortFunc(rowA, rowB);
|
|
179
|
+
return sortParams.sortDirection === 'DESC' ? sortingNum : -sortingNum;
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
return sortedRows;
|
|
183
|
+
}, [tableHeaders, tableRows, sortParams]);
|
|
184
|
+
|
|
185
|
+
const { results, goTo, currentPage } = usePagination(sortedData, config.table.pageSize);
|
|
105
186
|
|
|
106
187
|
return (
|
|
107
188
|
<div>
|
|
108
|
-
<DataTable rows={results} headers={tableHeaders} isSortable size="sm" useZebraStyles>
|
|
189
|
+
<DataTable rows={results} headers={tableHeaders} isSortable sortRow={handleSorting} size="sm" useZebraStyles>
|
|
109
190
|
{({ rows, headers, getHeaderProps, getTableProps }) => (
|
|
110
191
|
<TableContainer>
|
|
111
192
|
<Table {...getTableProps()} className={styles.customRow}>
|
|
@@ -138,7 +219,7 @@ const ObsTable: React.FC<ObsTableProps> = ({ patientUuid }) => {
|
|
|
138
219
|
</DataTable>
|
|
139
220
|
<PatientChartPagination
|
|
140
221
|
pageNumber={currentPage}
|
|
141
|
-
totalItems={
|
|
222
|
+
totalItems={sortedData.length}
|
|
142
223
|
currentItems={results.length}
|
|
143
224
|
pageSize={config.table.pageSize}
|
|
144
225
|
onPageNumberChange={({ page }) => goTo(page)}
|