@aehrc/smart-forms-renderer 0.37.2 → 0.38.2

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 (53) hide show
  1. package/lib/components/FormComponents/QuantityItem/QuantityComparatorField.d.ts +12 -0
  2. package/lib/components/FormComponents/QuantityItem/QuantityComparatorField.js +13 -0
  3. package/lib/components/FormComponents/QuantityItem/QuantityComparatorField.js.map +1 -0
  4. package/lib/components/FormComponents/QuantityItem/QuantityField.d.ts +15 -0
  5. package/lib/components/FormComponents/QuantityItem/QuantityField.js +14 -0
  6. package/lib/components/FormComponents/QuantityItem/QuantityField.js.map +1 -0
  7. package/lib/components/FormComponents/QuantityItem/QuantityItem.d.ts +9 -0
  8. package/lib/components/FormComponents/QuantityItem/QuantityItem.js +144 -0
  9. package/lib/components/FormComponents/QuantityItem/QuantityItem.js.map +1 -0
  10. package/lib/components/FormComponents/QuantityItem/QuantityUnitField.d.ts +12 -0
  11. package/lib/components/FormComponents/QuantityItem/QuantityUnitField.js +10 -0
  12. package/lib/components/FormComponents/QuantityItem/QuantityUnitField.js.map +1 -0
  13. package/lib/components/FormComponents/SingleItem/SingleItemSwitcher.js +2 -1
  14. package/lib/components/FormComponents/SingleItem/SingleItemSwitcher.js.map +1 -1
  15. package/lib/hooks/useDecimalCalculatedExpression.d.ts +2 -2
  16. package/lib/hooks/useQuantityCalculatedExpression.d.ts +14 -0
  17. package/lib/hooks/useQuantityCalculatedExpression.js +105 -0
  18. package/lib/hooks/useQuantityCalculatedExpression.js.map +1 -0
  19. package/lib/hooks/useRenderingExtensions.d.ts +2 -1
  20. package/lib/hooks/useRenderingExtensions.js +3 -2
  21. package/lib/hooks/useRenderingExtensions.js.map +1 -1
  22. package/lib/hooks/useStringInput.js +1 -0
  23. package/lib/hooks/useStringInput.js.map +1 -1
  24. package/lib/interfaces/valueSet.interface.d.ts +15 -0
  25. package/lib/utils/calculatedExpression.js +4 -1
  26. package/lib/utils/calculatedExpression.js.map +1 -1
  27. package/lib/utils/itemControl.d.ts +7 -1
  28. package/lib/utils/itemControl.js +14 -0
  29. package/lib/utils/itemControl.js.map +1 -1
  30. package/lib/utils/quantity.d.ts +4 -0
  31. package/lib/utils/quantity.js +49 -0
  32. package/lib/utils/quantity.js.map +1 -0
  33. package/lib/utils/valueSet.d.ts +2 -1
  34. package/lib/utils/valueSet.js +22 -0
  35. package/lib/utils/valueSet.js.map +1 -1
  36. package/package.json +1 -1
  37. package/src/components/FormComponents/QuantityItem/QuantityComparatorField.tsx +40 -0
  38. package/src/components/FormComponents/QuantityItem/QuantityField.tsx +60 -0
  39. package/src/components/FormComponents/QuantityItem/QuantityItem.tsx +286 -0
  40. package/src/components/FormComponents/QuantityItem/QuantityUnitField.tsx +38 -0
  41. package/src/components/FormComponents/SingleItem/SingleItemSwitcher.tsx +2 -1
  42. package/src/hooks/useDecimalCalculatedExpression.ts +2 -2
  43. package/src/hooks/useQuantityCalculatedExpression.ts +177 -0
  44. package/src/hooks/useRenderingExtensions.ts +5 -2
  45. package/src/hooks/useStringInput.ts +1 -0
  46. package/src/interfaces/valueSet.interface.ts +19 -0
  47. package/src/stories/assets/questionnaires/QPrePopTester.ts +30 -0
  48. package/src/stories/assets/questionnaires/QQuantity.ts +283 -1
  49. package/src/stories/itemTypes/Quantity.stories.tsx +33 -1
  50. package/src/utils/calculatedExpression.ts +5 -1
  51. package/src/utils/itemControl.ts +19 -1
  52. package/src/utils/quantity.ts +62 -0
  53. package/src/utils/valueSet.ts +32 -1
@@ -182,6 +182,20 @@ export function getTextDisplayPrompt(qItem) {
182
182
  }
183
183
  return '';
184
184
  }
185
+ /**
186
+ * Get Quantity unit for items with itemControlCode unit and has a unit childItem
187
+ *
188
+ * @author Sean Fong
189
+ */
190
+ export function getQuantityUnit(qItem) {
191
+ var _a;
192
+ // Otherwise, check if the item has a unit extension
193
+ const itemControl = (_a = qItem.extension) === null || _a === void 0 ? void 0 : _a.find((extension) => extension.url === 'http://hl7.org/fhir/StructureDefinition/questionnaire-unit');
194
+ if (itemControl && itemControl.valueCoding) {
195
+ return itemControl;
196
+ }
197
+ return null;
198
+ }
185
199
  /**
186
200
  * Get decimal text display unit for items with itemControlCode unit and has a unit childItem
187
201
  *
@@ -1 +1 @@
1
- {"version":3,"file":"itemControl.js","sourceRoot":"","sources":["../../src/utils/itemControl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,SAAS,kBAAkB,CAAC,KAAwB;;IAClD,OAAO,CAAC,CAAC,CAAA,MAAA,KAAK,CAAC,SAAS,0CAAE,IAAI,CAC5B,CAAC,SAAoB,EAAE,EAAE,CACvB,SAAS,CAAC,GAAG,KAAK,uEAAuE,CAC5F,CAAA,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAwB;;IAC9C,OAAO,CAAC,CAAC,CAAA,MAAA,KAAK,CAAC,SAAS,0CAAE,IAAI,CAC5B,CAAC,SAAoB,EAAE,EAAE,CACvB,SAAS,CAAC,GAAG,KAAK,mEAAmE,CACxF,CAAA,CAAC;AACJ,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,uBAAuB,CAAC,KAAwB;;IAC9D,OAAO,CAAC,CAAA,MAAA,KAAK,CAAC,IAAI,0CAAE,KAAK,CACvB,CAAC,SAAS,EAAE,EAAE,CACZ,SAAS,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,IAAI,cAAc,CAAC,SAAS,CAAC,CAAC,CAC/F,CAAA,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAwB,EAAE,eAAuB;;IACrF,MAAM,WAAW,GAAG,MAAA,KAAK,CAAC,SAAS,0CAAE,IAAI,CACvC,CAAC,SAAoB,EAAE,EAAE,CACvB,SAAS,CAAC,GAAG,KAAK,mEAAmE,CACxF,CAAC;IACF,IAAI,WAAW,EAAE;QACf,MAAM,IAAI,GAAG,MAAA,MAAA,WAAW,CAAC,oBAAoB,0CAAE,MAAM,0CAAE,IAAI,CACzD,CAAC,MAAc,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,eAAe,CACpD,CAAC;QACF,IAAI,IAAI,EAAE;YACR,OAAO,IAAI,CAAC;SACb;KACF;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CACvC,KAAwB,EACxB,eAAuB;;IAEvB,MAAM,eAAe,GAAG,MAAA,KAAK,CAAC,SAAS,0CAAE,IAAI,CAC3C,CAAC,SAAoB,EAAE,EAAE,CACvB,SAAS,CAAC,GAAG,KAAK,uEAAuE,CAC5F,CAAC;IACF,IAAI,eAAe,EAAE;QACnB,MAAM,IAAI,GAAG,MAAA,MAAA,eAAe,CAAC,oBAAoB,0CAAE,MAAM,0CAAE,IAAI,CAC7D,CAAC,MAAc,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,eAAe,CACpD,CAAC;QACF,IAAI,IAAI,EAAE;YACR,OAAO,IAAI,CAAC;SACb;KACF;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,KAAwB;;IACnD,MAAM,WAAW,GAAG,MAAA,KAAK,CAAC,SAAS,0CAAE,IAAI,CACvC,CAAC,SAAoB,EAAE,EAAE,CACvB,SAAS,CAAC,GAAG,KAAK,4EAA4E,CACjG,CAAC;IACF,IAAI,WAAW,EAAE;QACf,IAAI,WAAW,CAAC,WAAW,EAAE;YAC3B,OAAO,WAAW,CAAC,WAAW,CAAC;SAChC;KACF;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAwB;;IACzD,MAAM,WAAW,GAAG,MAAA,KAAK,CAAC,SAAS,0CAAE,IAAI,CACvC,CAAC,SAAoB,EAAE,EAAE,CACvB,SAAS,CAAC,GAAG,KAAK,8DAA8D,CACnF,CAAC;IAEF,IAAI,WAAW,EAAE;QACf,IAAI,WAAW,CAAC,YAAY,EAAE;YAC5B,OAAO,IAAI,CAAC;SACb;KACF;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAwB;;IACvD,MAAM,WAAW,GAAG,MAAA,KAAK,CAAC,SAAS,0CAAE,IAAI,CACvC,CAAC,SAAoB,EAAE,EAAE,CACvB,SAAS,CAAC,GAAG,KAAK,4EAA4E,CACjG,CAAC;IACF,IAAI,WAAW,EAAE;QACf,IAAI,WAAW,CAAC,WAAW,EAAE;YAC3B,OAAO,WAAW,CAAC,WAAW,CAAC;SAChC;KACF;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAwB;;IAC1D,MAAM,WAAW,GAAG,MAAA,KAAK,CAAC,SAAS,0CAAE,IAAI,CACvC,CAAC,SAAoB,EAAE,EAAE,CACvB,SAAS,CAAC,GAAG,KAAK,4DAA4D,CACjF,CAAC;IACF,IAAI,WAAW,EAAE;QACf,IAAI,WAAW,CAAC,YAAY,EAAE;YAC5B,OAAO,WAAW,CAAC,YAAY,CAAC;SACjC;KACF;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAAwB;;IACrD,IAAI,WAAW,GAAG,IAAI,CAAC;IACvB,IAAI,KAAK,CAAC,SAAS,EAAE;QACnB,WAAW,GAAG,2BAA2B,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC3D,IAAI,WAAW,EAAE;YACf,OAAO,WAAW,CAAC;SACpB;KACF;IAED,IAAI,MAAA,KAAK,CAAC,KAAK,0CAAE,SAAS,EAAE;QAC1B,WAAW,GAAG,2BAA2B,CAAC,MAAA,KAAK,CAAC,KAAK,0CAAE,SAAS,CAAC,CAAC;QAClE,IAAI,WAAW,EAAE;YACf,OAAO,WAAW,CAAC;SACpB;KACF;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,UAAuB;IACjE,MAAM,WAAW,GAAG,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAAI,CAClC,CAAC,SAAoB,EAAE,EAAE,CACvB,SAAS,CAAC,GAAG,KAAK,yDAAyD,CAC9E,CAAC;IAEF,IAAI,WAAW,EAAE;QACf,IAAI,WAAW,CAAC,WAAW,EAAE;YAC3B,OAAO,WAAW,CAAC,WAAW,CAAC;SAChC;KACF;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAwB;;IACxD,MAAM,WAAW,GAAG,MAAA,MAAA,KAAK,CAAC,KAAK,0CAAE,SAAS,0CAAE,IAAI,CAC9C,CAAC,SAAoB,EAAE,EAAE,CACvB,SAAS,CAAC,GAAG,KAAK,4DAA4D,CACjF,CAAC;IAEF,IAAI,WAAW,EAAE;QACf,IAAI,WAAW,CAAC,aAAa,EAAE;YAC7B,OAAO,WAAW,CAAC,aAAa,CAAC;SAClC;KACF;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAwB;IAC3D,IAAI,KAAK,CAAC,IAAI,EAAE;QACd,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE;YAClC,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,IAAI,qBAAqB,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE;gBAC9E,MAAM,UAAU,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;gBACvC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;aAC9D;SACF;KACF;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAwB;;IACzD,iDAAiD;IACjD,IAAI,KAAK,CAAC,IAAI,EAAE;QACd,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE;YAClC,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,IAAI,qBAAqB,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE;gBAC5E,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;aAC5B;SACF;KACF;IAED,oDAAoD;IACpD,MAAM,WAAW,GAAG,MAAA,KAAK,CAAC,SAAS,0CAAE,IAAI,CACvC,CAAC,SAAoB,EAAE,EAAE,CACvB,SAAS,CAAC,GAAG,KAAK,4DAA4D,CACjF,CAAC;IACF,IAAI,WAAW,IAAI,WAAW,CAAC,WAAW,EAAE;QAC1C,OAAO,MAAA,WAAW,CAAC,WAAW,CAAC,OAAO,mCAAI,EAAE,CAAC;KAC9C;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAwB;IAC1D,IAAI,KAAK,CAAC,IAAI,EAAE;QACd,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE;YAClC,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,IAAI,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE;gBAC7E,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;aAC5B;SACF;KACF;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAwB;IAC1D,IAAI,KAAK,CAAC,IAAI,EAAE;QACd,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE;YAClC,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,IAAI,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE;gBAC7E,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;aAC5B;SACF;KACF;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,KAAwB;IACjE,IAAI,KAAK,CAAC,IAAI,EAAE;QACd,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE;YAClC,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,IAAI,yBAAyB,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE;gBACxF,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;aAC5B;SACF;KACF;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAwB;IAC5D,IAAI,KAAK,CAAC,IAAI,EAAE;QACd,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE;YAClC,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,IAAI,qBAAqB,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE;gBAC/E,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;aAC5B;SACF;KACF;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAwB;IACzD,sCAAsC;IACtC,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,WAAW,EAAE;QACf,OAAO,EAAE,UAAU,EAAE,IAAI,MAAM,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;KAChE;IAED,uEAAuE;IACvE,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE;QACxB,OAAO,EAAE,UAAU,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,yCAAyC,EAAE,CAAC;KACjG;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAwB;;IACrD,MAAM,WAAW,GAAG,MAAA,KAAK,CAAC,SAAS,0CAAE,IAAI,CACvC,CAAC,SAAoB,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,KAAK,+CAA+C,CAC5F,CAAC;IAEF,IAAI,WAAW,EAAE;QACf,MAAM,eAAe,GAAG,WAAW,CAAC,WAAW,CAAC;QAChD,IAAI,eAAe,EAAE;YACnB,IAAI,WAAW,CAAC;YAChB,IAAI,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;gBACxC,WAAW,GAAG,eAAe,CAAC,SAAS,CACrC,eAAe,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC,MAAM,EACzD,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAClC,CAAC;aACH;iBAAM;gBACL,WAAW,GAAG,eAAe,CAAC;aAC/B;YAED,OAAO,WAAW,CAAC;SACpB;KACF;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAwB;;IAClD,QAAQ,KAAK,CAAC,IAAI,EAAE;QAClB,KAAK,SAAS;YACZ,OAAO,qBAAqB,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC3D,KAAK,SAAS;YACZ,uEAAuE;YACvE,OAAO,CACL,MAAA,qBAAqB,CAAC,oBAAoB,CAAC,KAAK,CAAC,mCACjD,qBAAqB,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAClD,CAAC;QACJ,KAAK,MAAM;YACT,OAAO,qBAAqB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACxD,KAAK,UAAU;YACb,qEAAqE;YACrE,OAAO,CACL,MAAA,qBAAqB,CAAC,qBAAqB,CAAC,KAAK,CAAC,mCAClD,qBAAqB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAC/C,CAAC;QACJ;YACE,OAAO,SAAS,CAAC;KACpB;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAwB;;IAClD,QAAQ,KAAK,CAAC,IAAI,EAAE;QAClB,KAAK,SAAS;YACZ,OAAO,qBAAqB,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC3D,KAAK,SAAS;YACZ,uEAAuE;YACvE,OAAO,CACL,MAAA,qBAAqB,CAAC,oBAAoB,CAAC,KAAK,CAAC,mCACjD,qBAAqB,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAClD,CAAC;QACJ,KAAK,MAAM;YACT,OAAO,qBAAqB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACxD,KAAK,UAAU;YACb,qEAAqE;YACrE,OAAO,CACL,MAAA,qBAAqB,CAAC,qBAAqB,CAAC,KAAK,CAAC,mCAClD,qBAAqB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAC/C,CAAC;QACJ;YACE,OAAO,SAAS,CAAC;KACpB;AACH,CAAC"}
1
+ {"version":3,"file":"itemControl.js","sourceRoot":"","sources":["../../src/utils/itemControl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Quantity, QuestionnaireItemAnswerOption, QuestionnaireResponseItemAnswer } from 'fhir/r4';
2
+ export declare const quantityComparators: Quantity['comparator'][];
3
+ export declare function stringIsComparator(str: string | undefined): str is Quantity['comparator'];
4
+ export declare function createQuantityItemAnswer(precision: number | null, parsedNewInput: string, comparatorInput: Quantity['comparator'] | null, unitInput: QuestionnaireItemAnswerOption | null): QuestionnaireResponseItemAnswer[];
@@ -0,0 +1,49 @@
1
+ /*
2
+ * Copyright 2024 Commonwealth Scientific and Industrial Research
3
+ * Organisation (CSIRO) ABN 41 687 119 230.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import { parseDecimalStringToFloat } from './parseInputs';
18
+ export const quantityComparators = ['<', '<=', '>=', '>'];
19
+ export function stringIsComparator(str) {
20
+ return str === '<' || str === '<=' || str === '>=' || str === '>';
21
+ }
22
+ export function createQuantityItemAnswer(precision, parsedNewInput, comparatorInput, unitInput) {
23
+ var _a, _b, _c, _d, _e, _f;
24
+ if (precision) {
25
+ return [
26
+ {
27
+ valueQuantity: {
28
+ value: parseDecimalStringToFloat(parsedNewInput, precision),
29
+ comparator: comparatorInput !== null && comparatorInput !== void 0 ? comparatorInput : undefined,
30
+ unit: (_a = unitInput === null || unitInput === void 0 ? void 0 : unitInput.valueCoding) === null || _a === void 0 ? void 0 : _a.display,
31
+ system: (_b = unitInput === null || unitInput === void 0 ? void 0 : unitInput.valueCoding) === null || _b === void 0 ? void 0 : _b.system,
32
+ code: (_c = unitInput === null || unitInput === void 0 ? void 0 : unitInput.valueCoding) === null || _c === void 0 ? void 0 : _c.code
33
+ }
34
+ }
35
+ ];
36
+ }
37
+ return [
38
+ {
39
+ valueQuantity: {
40
+ value: parseFloat(parsedNewInput),
41
+ comparator: comparatorInput !== null && comparatorInput !== void 0 ? comparatorInput : undefined,
42
+ unit: (_d = unitInput === null || unitInput === void 0 ? void 0 : unitInput.valueCoding) === null || _d === void 0 ? void 0 : _d.display,
43
+ system: (_e = unitInput === null || unitInput === void 0 ? void 0 : unitInput.valueCoding) === null || _e === void 0 ? void 0 : _e.system,
44
+ code: (_f = unitInput === null || unitInput === void 0 ? void 0 : unitInput.valueCoding) === null || _f === void 0 ? void 0 : _f.code
45
+ }
46
+ }
47
+ ];
48
+ }
49
+ //# sourceMappingURL=quantity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quantity.js","sourceRoot":"","sources":["../../src/utils/quantity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE1D,MAAM,CAAC,MAAM,mBAAmB,GAA6B,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AAEpF,MAAM,UAAU,kBAAkB,CAAC,GAAuB;IACxD,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,GAAG,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,SAAwB,EACxB,cAAsB,EACtB,eAA8C,EAC9C,SAA+C;;IAE/C,IAAI,SAAS,EAAE;QACb,OAAO;YACL;gBACE,aAAa,EAAE;oBACb,KAAK,EAAE,yBAAyB,CAAC,cAAc,EAAE,SAAS,CAAC;oBAC3D,UAAU,EAAE,eAAe,aAAf,eAAe,cAAf,eAAe,GAAI,SAAS;oBACxC,IAAI,EAAE,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,WAAW,0CAAE,OAAO;oBACrC,MAAM,EAAE,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,WAAW,0CAAE,MAAM;oBACtC,IAAI,EAAE,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,WAAW,0CAAE,IAAI;iBACnC;aACF;SACF,CAAC;KACH;IAED,OAAO;QACL;YACE,aAAa,EAAE;gBACb,KAAK,EAAE,UAAU,CAAC,cAAc,CAAC;gBACjC,UAAU,EAAE,eAAe,aAAf,eAAe,cAAf,eAAe,GAAI,SAAS;gBACxC,IAAI,EAAE,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,WAAW,0CAAE,OAAO;gBACrC,MAAM,EAAE,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,WAAW,0CAAE,MAAM;gBACtC,IAAI,EAAE,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,WAAW,0CAAE,IAAI;aACnC;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -1,9 +1,10 @@
1
1
  import type { Coding, Encounter, Expression, FhirResource, Patient, Practitioner, QuestionnaireItem, ValueSet } from 'fhir/r4';
2
2
  import type { FhirResourceString } from '../interfaces/populate.interface';
3
3
  import type { VariableXFhirQuery } from '../interfaces/variables.interface';
4
- import type { ValueSetPromise } from '../interfaces/valueSet.interface';
4
+ import type { ValidateCodeResponse, ValueSetPromise } from '../interfaces/valueSet.interface';
5
5
  export declare function getTerminologyServerUrl(qItem: QuestionnaireItem): string | undefined;
6
6
  export declare function getValueSetPromise(url: string, terminologyServerUrl: string): Promise<ValueSet>;
7
+ export declare function validateCodePromise(url: string, system: string, code: string, terminologyServerUrl: string): Promise<ValidateCodeResponse | null>;
7
8
  export declare function resolveValueSetPromises(valueSetPromises: Record<string, ValueSetPromise>): Promise<Record<string, ValueSetPromise>>;
8
9
  /**
9
10
  * Sets an array of codings with the values from a valueSet
@@ -48,6 +48,28 @@ export function getValueSetPromise(url, terminologyServerUrl) {
48
48
  url: 'ValueSet/$expand?url=' + valueSetUrl
49
49
  });
50
50
  }
51
+ function validateCodeResponseIsValid(response) {
52
+ return (response &&
53
+ response.resourceType === 'Parameters' &&
54
+ response.parameter &&
55
+ response.parameter.find((p) => p.name === 'code') &&
56
+ response.parameter.find((p) => p.name === 'code').valueCode &&
57
+ response.parameter.find((p) => p.name === 'system') &&
58
+ response.parameter.find((p) => p.name === 'system').valueUri &&
59
+ response.parameter.find((p) => p.name === 'display') &&
60
+ response.parameter.find((p) => p.name === 'display').valueString);
61
+ }
62
+ export function validateCodePromise(url, system, code, terminologyServerUrl) {
63
+ return __awaiter(this, void 0, void 0, function* () {
64
+ const validateCodeResponse = yield FHIR.client({ serverUrl: terminologyServerUrl }).request({
65
+ url: `ValueSet/$validate-code?url=${url}&system=${system}&code=${code}`
66
+ });
67
+ if (validateCodeResponse && validateCodeResponseIsValid(validateCodeResponse)) {
68
+ return validateCodeResponse;
69
+ }
70
+ return null;
71
+ });
72
+ }
51
73
  function addTimeoutToPromise(promise, timeoutMs) {
52
74
  return __awaiter(this, void 0, void 0, function* () {
53
75
  const timeoutPromise = new Promise((_, reject) => {
@@ -1 +1 @@
1
- {"version":3,"file":"valueSet.js","sourceRoot":"","sources":["../../src/utils/valueSet.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"valueSet.js","sourceRoot":"","sources":["../../src/utils/valueSet.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aehrc/smart-forms-renderer",
3
- "version": "0.37.2",
3
+ "version": "0.38.2",
4
4
  "description": "FHIR Structured Data Captured (SDC) rendering engine for Smart Forms",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -0,0 +1,40 @@
1
+ import React from 'react';
2
+ import Autocomplete from '@mui/material/Autocomplete';
3
+ import type { PropsWithIsTabledAttribute } from '../../../interfaces/renderProps.interface';
4
+ import MuiTextField from '../TextItem/MuiTextField';
5
+ import Box from '@mui/material/Box';
6
+ import Typography from '@mui/material/Typography';
7
+ import type { Quantity } from 'fhir/r4';
8
+
9
+ interface QuantityComparatorFieldProps extends PropsWithIsTabledAttribute {
10
+ linkId: string;
11
+ options: Quantity['comparator'][];
12
+ valueSelect: Quantity['comparator'] | null;
13
+ readOnly: boolean;
14
+ onChange: (newValue: Quantity['comparator'] | null) => void;
15
+ }
16
+
17
+ function QuantityComparatorField(props: QuantityComparatorFieldProps) {
18
+ const { linkId, options, valueSelect, readOnly, onChange } = props;
19
+
20
+ return (
21
+ <Box>
22
+ <Autocomplete
23
+ id={linkId + '-comparator'}
24
+ value={valueSelect ?? null}
25
+ options={options}
26
+ onChange={(_, newValue) => onChange(newValue as Quantity['comparator'])}
27
+ autoHighlight
28
+ sx={{ width: 88 }}
29
+ disabled={readOnly}
30
+ size="small"
31
+ renderInput={(params) => <MuiTextField sx={{ width: 88 }} {...params} />}
32
+ />
33
+ <Typography variant="caption" color="text.secondary">
34
+ Symbol (optional)
35
+ </Typography>
36
+ </Box>
37
+ );
38
+ }
39
+
40
+ export default QuantityComparatorField;
@@ -0,0 +1,60 @@
1
+ import React from 'react';
2
+ import InputAdornment from '@mui/material/InputAdornment';
3
+ import FadingCheckIcon from '../ItemParts/FadingCheckIcon';
4
+ import { StandardTextField } from '../Textfield.styles';
5
+ import type { PropsWithIsTabledAttribute } from '../../../interfaces/renderProps.interface';
6
+
7
+ interface QuantityFieldProps extends PropsWithIsTabledAttribute {
8
+ linkId: string;
9
+ input: string;
10
+ feedback: string;
11
+ displayPrompt: string;
12
+ displayUnit: string;
13
+ entryFormat: string;
14
+ readOnly: boolean;
15
+ calcExpUpdated: boolean;
16
+ onInputChange: (value: string) => void;
17
+ }
18
+
19
+ function QuantityField(props: QuantityFieldProps) {
20
+ const {
21
+ linkId,
22
+ input,
23
+ feedback,
24
+ displayPrompt,
25
+ displayUnit,
26
+ entryFormat,
27
+ readOnly,
28
+ calcExpUpdated,
29
+ isTabled,
30
+ onInputChange
31
+ } = props;
32
+
33
+ return (
34
+ <StandardTextField
35
+ id={linkId}
36
+ value={input}
37
+ error={!!feedback}
38
+ onChange={(event) => onInputChange(event.target.value)}
39
+ disabled={readOnly}
40
+ label={displayPrompt}
41
+ placeholder={entryFormat === '' ? '0.0' : entryFormat}
42
+ fullWidth
43
+ isTabled={isTabled}
44
+ size="small"
45
+ inputProps={{ inputMode: 'numeric', pattern: '[0-9]*' }}
46
+ InputProps={{
47
+ endAdornment: (
48
+ <InputAdornment position={'end'}>
49
+ <FadingCheckIcon fadeIn={calcExpUpdated} disabled={readOnly} />
50
+ {displayUnit}
51
+ </InputAdornment>
52
+ )
53
+ }}
54
+ helperText={feedback}
55
+ data-test="q-item-quantity-field"
56
+ />
57
+ );
58
+ }
59
+
60
+ export default QuantityField;
@@ -0,0 +1,286 @@
1
+ import React, { useCallback, useMemo, useState } from 'react';
2
+ import type {
3
+ PropsWithIsRepeatedAttribute,
4
+ PropsWithIsTabledAttribute,
5
+ PropsWithParentIsReadOnlyAttribute,
6
+ PropsWithQrItemChangeHandler
7
+ } from '../../../interfaces/renderProps.interface';
8
+ import type {
9
+ Quantity,
10
+ QuestionnaireItem,
11
+ QuestionnaireItemAnswerOption,
12
+ QuestionnaireResponseItem
13
+ } from 'fhir/r4';
14
+ import useRenderingExtensions from '../../../hooks/useRenderingExtensions';
15
+ import { FullWidthFormComponentBox } from '../../Box.styles';
16
+ import useValidationFeedback from '../../../hooks/useValidationFeedback';
17
+ import debounce from 'lodash.debounce';
18
+ import { DEBOUNCE_DURATION } from '../../../utils/debounce';
19
+ import { createEmptyQrItem } from '../../../utils/qrItem';
20
+ import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
21
+ import { parseDecimalStringWithPrecision } from '../../../utils/parseInputs';
22
+ import { getDecimalPrecision } from '../../../utils/itemControl';
23
+ import useStringInput from '../../../hooks/useStringInput';
24
+ import useReadOnly from '../../../hooks/useReadOnly';
25
+ import { useQuestionnaireStore } from '../../../stores';
26
+ import Box from '@mui/material/Box';
27
+ import QuantityField from './QuantityField';
28
+ import QuantityUnitField from './QuantityUnitField';
29
+ import {
30
+ createQuantityItemAnswer,
31
+ quantityComparators,
32
+ stringIsComparator
33
+ } from '../../../utils/quantity';
34
+ import QuantityComparatorField from './QuantityComparatorField';
35
+ import useQuantityCalculatedExpression from '../../../hooks/useQuantityCalculatedExpression';
36
+
37
+ interface QuantityItemProps
38
+ extends PropsWithQrItemChangeHandler,
39
+ PropsWithIsRepeatedAttribute,
40
+ PropsWithIsTabledAttribute,
41
+ PropsWithParentIsReadOnlyAttribute {
42
+ qItem: QuestionnaireItem;
43
+ qrItem: QuestionnaireResponseItem | null;
44
+ }
45
+
46
+ function QuantityItem(props: QuantityItemProps) {
47
+ const { qItem, qrItem, isRepeated, isTabled, parentIsReadOnly, onQrItemChange } = props;
48
+
49
+ const onFocusLinkId = useQuestionnaireStore.use.onFocusLinkId();
50
+
51
+ const readOnly = useReadOnly(qItem, parentIsReadOnly);
52
+ const precision = getDecimalPrecision(qItem);
53
+ const { displayUnit, displayPrompt, entryFormat, quantityUnit } = useRenderingExtensions(qItem);
54
+
55
+ // Get units options if present
56
+ const unitOptions = useMemo(
57
+ () =>
58
+ qItem.extension?.filter(
59
+ (f) => f.url === 'http://hl7.org/fhir/StructureDefinition/questionnaire-unitOption'
60
+ ) ?? [],
61
+ [qItem]
62
+ );
63
+
64
+ // Init inputs
65
+ let valueQuantity: Quantity = {};
66
+ let initialValueInput = '';
67
+ let initialComparatorInput: Quantity['comparator'] | null = null;
68
+ let initialUnitInput: QuestionnaireItemAnswerOption | null =
69
+ quantityUnit ?? unitOptions?.at(0) ?? null;
70
+ if (qrItem?.answer) {
71
+ if (qrItem?.answer[0].valueQuantity) {
72
+ valueQuantity = qrItem.answer[0].valueQuantity;
73
+ }
74
+
75
+ initialValueInput =
76
+ (precision ? valueQuantity.value?.toFixed(precision) : valueQuantity.value?.toString()) || '';
77
+
78
+ if (valueQuantity.comparator && stringIsComparator(valueQuantity.comparator)) {
79
+ initialComparatorInput = valueQuantity.comparator;
80
+ }
81
+
82
+ if (valueQuantity.code && valueQuantity.system) {
83
+ initialUnitInput = {
84
+ valueCoding: {
85
+ code: valueQuantity.code,
86
+ system: valueQuantity.system,
87
+ display: valueQuantity.unit
88
+ }
89
+ };
90
+ }
91
+ }
92
+
93
+ // input states
94
+ const [valueInput, setValueInput] = useStringInput(initialValueInput);
95
+ const [comparatorInput, setComparatorInput] = useState<Quantity['comparator'] | null>(
96
+ initialComparatorInput
97
+ );
98
+ const [unitInput, setUnitInput] = useState<QuestionnaireItemAnswerOption | null>(
99
+ initialUnitInput
100
+ );
101
+
102
+ // Perform validation checks
103
+ const feedback = useValidationFeedback(qItem, valueInput);
104
+
105
+ // Process calculated expressions
106
+ const { calcExpUpdated } = useQuantityCalculatedExpression({
107
+ qItem: qItem,
108
+ inputValue: valueInput,
109
+ precision: precision,
110
+ onChangeByCalcExpressionDecimal: (newValueDecimal: number) => {
111
+ setValueInput(
112
+ typeof precision === 'number'
113
+ ? newValueDecimal.toFixed(precision)
114
+ : newValueDecimal.toString()
115
+ );
116
+ onQrItemChange({
117
+ ...createEmptyQrItem(qItem),
118
+ answer: [
119
+ {
120
+ valueQuantity: {
121
+ value: newValueDecimal,
122
+ unit: unitInput?.valueCoding?.display,
123
+ system: unitInput?.valueCoding?.system,
124
+ code: unitInput?.valueCoding?.code
125
+ }
126
+ }
127
+ ]
128
+ });
129
+ },
130
+ onChangeByCalcExpressionQuantity: (
131
+ newValueDecimal: number,
132
+ newUnitSystem,
133
+ newUnitCode,
134
+ newUnitDisplay
135
+ ) => {
136
+ setValueInput(
137
+ typeof precision === 'number'
138
+ ? newValueDecimal.toFixed(precision)
139
+ : newValueDecimal.toString()
140
+ );
141
+ onQrItemChange({
142
+ ...createEmptyQrItem(qItem),
143
+ answer: [
144
+ {
145
+ valueQuantity: {
146
+ value: newValueDecimal,
147
+ unit: newUnitDisplay,
148
+ system: newUnitSystem,
149
+ code: newUnitCode
150
+ }
151
+ }
152
+ ]
153
+ });
154
+ },
155
+ onChangeByCalcExpressionNull: () => {
156
+ setValueInput('');
157
+ onQrItemChange(createEmptyQrItem(qItem));
158
+ }
159
+ });
160
+
161
+ // Event handlers
162
+ function handleComparatorInputChange(newComparatorInput: Quantity['comparator'] | null) {
163
+ setComparatorInput(newComparatorInput);
164
+
165
+ if (!valueInput) return;
166
+
167
+ onQrItemChange({
168
+ ...createEmptyQrItem(qItem),
169
+ answer: createQuantityItemAnswer(precision, valueInput, newComparatorInput, unitInput)
170
+ });
171
+ }
172
+
173
+ function handleUnitInputChange(newUnitInput: QuestionnaireItemAnswerOption | null) {
174
+ setUnitInput(newUnitInput);
175
+
176
+ if (!valueInput) return;
177
+
178
+ onQrItemChange({
179
+ ...createEmptyQrItem(qItem),
180
+ answer: createQuantityItemAnswer(precision, valueInput, comparatorInput, newUnitInput)
181
+ });
182
+ }
183
+
184
+ function handleValueInputChange(newInput: string) {
185
+ const parsedNewInput: string = parseDecimalStringWithPrecision(newInput, precision);
186
+
187
+ setValueInput(parsedNewInput);
188
+ updateQrItemWithDebounce(parsedNewInput);
189
+ }
190
+
191
+ // eslint-disable-next-line react-hooks/exhaustive-deps
192
+ const updateQrItemWithDebounce = useCallback(
193
+ debounce((parsedNewInput: string) => {
194
+ if (parsedNewInput === '') {
195
+ onQrItemChange(createEmptyQrItem(qItem));
196
+ } else {
197
+ onQrItemChange({
198
+ ...createEmptyQrItem(qItem),
199
+ answer: createQuantityItemAnswer(precision, parsedNewInput, comparatorInput, unitInput)
200
+ });
201
+ }
202
+ }, DEBOUNCE_DURATION),
203
+ [onQrItemChange, qItem, displayUnit, precision, comparatorInput, unitInput]
204
+ ); // Dependencies are tested, debounce is causing eslint to not recognise dependencies
205
+
206
+ if (isRepeated) {
207
+ return (
208
+ <Box data-test="q-item-quantity-box" display="flex" gap={1}>
209
+ <QuantityComparatorField
210
+ linkId={qItem.linkId}
211
+ options={quantityComparators}
212
+ valueSelect={comparatorInput}
213
+ readOnly={readOnly}
214
+ isTabled={isTabled}
215
+ onChange={handleComparatorInputChange}
216
+ />
217
+ <QuantityField
218
+ linkId={qItem.linkId}
219
+ input={valueInput}
220
+ feedback={feedback}
221
+ displayPrompt={displayPrompt}
222
+ displayUnit={displayUnit}
223
+ entryFormat={entryFormat}
224
+ readOnly={readOnly}
225
+ calcExpUpdated={calcExpUpdated}
226
+ isTabled={isTabled}
227
+ onInputChange={handleValueInputChange}
228
+ />
229
+ {unitOptions.length > 0 ? (
230
+ <QuantityUnitField
231
+ linkId={qItem.linkId}
232
+ options={unitOptions}
233
+ valueSelect={unitInput}
234
+ readOnly={readOnly}
235
+ isTabled={isTabled}
236
+ onChange={handleUnitInputChange}
237
+ />
238
+ ) : null}
239
+ </Box>
240
+ );
241
+ }
242
+
243
+ return (
244
+ <FullWidthFormComponentBox
245
+ data-test="q-item-quantity-box"
246
+ data-linkid={qItem.linkId}
247
+ onClick={() => onFocusLinkId(qItem.linkId)}>
248
+ <ItemFieldGrid qItem={qItem} readOnly={readOnly}>
249
+ <Box display="flex" gap={1}>
250
+ <QuantityComparatorField
251
+ linkId={qItem.linkId}
252
+ options={quantityComparators}
253
+ valueSelect={comparatorInput}
254
+ readOnly={readOnly}
255
+ isTabled={isTabled}
256
+ onChange={handleComparatorInputChange}
257
+ />
258
+ <QuantityField
259
+ linkId={qItem.linkId}
260
+ input={valueInput}
261
+ feedback={feedback}
262
+ displayPrompt={displayPrompt}
263
+ displayUnit={displayUnit}
264
+ entryFormat={entryFormat}
265
+ readOnly={readOnly}
266
+ calcExpUpdated={calcExpUpdated}
267
+ isTabled={isTabled}
268
+ onInputChange={handleValueInputChange}
269
+ />
270
+ {unitOptions.length > 0 ? (
271
+ <QuantityUnitField
272
+ linkId={qItem.linkId}
273
+ options={unitOptions}
274
+ valueSelect={unitInput}
275
+ readOnly={readOnly}
276
+ isTabled={isTabled}
277
+ onChange={handleUnitInputChange}
278
+ />
279
+ ) : null}
280
+ </Box>
281
+ </ItemFieldGrid>
282
+ </FullWidthFormComponentBox>
283
+ );
284
+ }
285
+
286
+ export default QuantityItem;
@@ -0,0 +1,38 @@
1
+ import React from 'react';
2
+ import { getAnswerOptionLabel } from '../../../utils/openChoice';
3
+ import { StandardTextField, TEXT_FIELD_WIDTH } from '../Textfield.styles';
4
+ import Autocomplete from '@mui/material/Autocomplete';
5
+ import type { QuestionnaireItemAnswerOption } from 'fhir/r4';
6
+ import type { PropsWithIsTabledAttribute } from '../../../interfaces/renderProps.interface';
7
+
8
+ interface QuantityUnitFieldProps extends PropsWithIsTabledAttribute {
9
+ linkId: string;
10
+ options: QuestionnaireItemAnswerOption[];
11
+ valueSelect: QuestionnaireItemAnswerOption | null;
12
+ readOnly: boolean;
13
+ onChange: (newValue: QuestionnaireItemAnswerOption | null) => void;
14
+ }
15
+
16
+ function QuantityUnitField(props: QuantityUnitFieldProps) {
17
+ const { linkId, options, valueSelect, readOnly, isTabled, onChange } = props;
18
+
19
+ return (
20
+ <Autocomplete
21
+ id={linkId + '-unit'}
22
+ value={valueSelect ?? null}
23
+ isOptionEqualToValue={(option, value) =>
24
+ option.valueCoding?.code === value?.valueCoding?.code
25
+ }
26
+ options={options}
27
+ getOptionLabel={(option) => getAnswerOptionLabel(option)}
28
+ onChange={(_, newValue) => onChange(newValue as QuestionnaireItemAnswerOption | null)}
29
+ autoHighlight
30
+ sx={{ maxWidth: !isTabled ? TEXT_FIELD_WIDTH : 3000, minWidth: 160, flexGrow: 1 }}
31
+ disabled={readOnly}
32
+ size="small"
33
+ renderInput={(params) => <StandardTextField isTabled={isTabled} {...params} />}
34
+ />
35
+ );
36
+ }
37
+
38
+ export default QuantityUnitField;
@@ -40,6 +40,7 @@ import SliderItem from '../SliderItem/SliderItem';
40
40
  import IntegerItem from '../IntegerItem/IntegerItem';
41
41
  import AttachmentItem from '../AttachmentItem/AttachmentItem';
42
42
  import CustomDateTimeItem from '../DateTimeItems/CustomDateTimeItem/CustomDateTimeItem';
43
+ import QuantityItem from '../QuantityItem/QuantityItem';
43
44
 
44
45
  interface SingleItemSwitcherProps
45
46
  extends PropsWithQrItemChangeHandler,
@@ -219,7 +220,7 @@ function SingleItemSwitcher(props: SingleItemSwitcherProps) {
219
220
  case 'quantity':
220
221
  // FIXME quantity item uses the same component as decimal item currently
221
222
  return (
222
- <DecimalItem
223
+ <QuantityItem
223
224
  qItem={qItem}
224
225
  qrItem={qrItem}
225
226
  isRepeated={isRepeated}
@@ -23,7 +23,7 @@ interface UseDecimalCalculatedExpression {
23
23
  calcExpUpdated: boolean;
24
24
  }
25
25
 
26
- interface useDecimalCalculatedExpressionProps {
26
+ interface UseDecimalCalculatedExpressionProps {
27
27
  qItem: QuestionnaireItem;
28
28
  inputValue: string;
29
29
  precision: number | null;
@@ -32,7 +32,7 @@ interface useDecimalCalculatedExpressionProps {
32
32
  }
33
33
 
34
34
  function useDecimalCalculatedExpression(
35
- props: useDecimalCalculatedExpressionProps
35
+ props: UseDecimalCalculatedExpressionProps
36
36
  ): UseDecimalCalculatedExpression {
37
37
  const {
38
38
  qItem,