@aehrc/smart-forms-renderer 0.25.0 → 0.25.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 (28) hide show
  1. package/lib/components/FormComponents/DecimalItem/DecimalField.js +1 -1
  2. package/lib/components/FormComponents/DecimalItem/DecimalField.js.map +1 -1
  3. package/lib/components/FormComponents/DecimalItem/DecimalItem.js +9 -4
  4. package/lib/components/FormComponents/DecimalItem/DecimalItem.js.map +1 -1
  5. package/lib/components/FormComponents/IntegerItem/IntegerField.d.ts +1 -1
  6. package/lib/components/FormComponents/IntegerItem/IntegerField.js +2 -2
  7. package/lib/components/FormComponents/IntegerItem/IntegerField.js.map +1 -1
  8. package/lib/components/FormComponents/IntegerItem/IntegerItem.js +21 -14
  9. package/lib/components/FormComponents/IntegerItem/IntegerItem.js.map +1 -1
  10. package/lib/hooks/useDecimalCalculatedExpression.js +4 -4
  11. package/lib/hooks/useDecimalCalculatedExpression.js.map +1 -1
  12. package/lib/hooks/useIntegerCalculatedExpression.d.ts +2 -2
  13. package/lib/hooks/useIntegerCalculatedExpression.js +11 -8
  14. package/lib/hooks/useIntegerCalculatedExpression.js.map +1 -1
  15. package/lib/utils/parseInputs.d.ts +1 -0
  16. package/lib/utils/parseInputs.js +10 -0
  17. package/lib/utils/parseInputs.js.map +1 -1
  18. package/lib/utils/questionnaireResponseStoreUtils/updatableResponseItems.d.ts +2 -0
  19. package/lib/utils/questionnaireResponseStoreUtils/updatableResponseItems.js +47 -0
  20. package/lib/utils/questionnaireResponseStoreUtils/updatableResponseItems.js.map +1 -0
  21. package/package.json +3 -3
  22. package/src/components/FormComponents/DecimalItem/DecimalField.tsx +1 -1
  23. package/src/components/FormComponents/DecimalItem/DecimalItem.tsx +11 -7
  24. package/src/components/FormComponents/IntegerItem/IntegerField.tsx +4 -4
  25. package/src/components/FormComponents/IntegerItem/IntegerItem.tsx +26 -17
  26. package/src/hooks/useDecimalCalculatedExpression.ts +6 -4
  27. package/src/hooks/useIntegerCalculatedExpression.ts +17 -13
  28. package/src/utils/parseInputs.ts +13 -0
@@ -20,7 +20,7 @@ import FadingCheckIcon from '../ItemParts/FadingCheckIcon';
20
20
  import { StandardTextField } from '../Textfield.styles';
21
21
  function DecimalField(props) {
22
22
  const { linkId, input, feedback, displayPrompt, displayUnit, entryFormat, readOnly, calcExpUpdated, isTabled, onInputChange } = props;
23
- return (React.createElement(StandardTextField, { id: linkId, value: input, error: !!feedback, onChange: (event) => onInputChange(event.target.value), disabled: readOnly, label: displayPrompt, placeholder: entryFormat, fullWidth: true, isTabled: isTabled, size: "small", inputProps: { inputMode: 'numeric', pattern: '[0-9]*' }, InputProps: {
23
+ return (React.createElement(StandardTextField, { id: linkId, value: input, error: !!feedback, onChange: (event) => onInputChange(event.target.value), disabled: readOnly, label: displayPrompt, placeholder: entryFormat === '' ? '0.0' : entryFormat, fullWidth: true, isTabled: isTabled, size: "small", inputProps: { inputMode: 'numeric', pattern: '[0-9]*' }, InputProps: {
24
24
  endAdornment: (React.createElement(InputAdornment, { position: 'end' },
25
25
  React.createElement(FadingCheckIcon, { fadeIn: calcExpUpdated }),
26
26
  displayUnit))
@@ -1 +1 @@
1
- {"version":3,"file":"DecimalField.js","sourceRoot":"","sources":["../../../../src/components/FormComponents/DecimalItem/DecimalField.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,cAAc,MAAM,8BAA8B,CAAC;AAC1D,OAAO,eAAe,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAexD,SAAS,YAAY,CAAC,KAAwB;IAC5C,MAAM,EACJ,MAAM,EACN,KAAK,EACL,QAAQ,EACR,aAAa,EACb,WAAW,EACX,WAAW,EACX,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,aAAa,EACd,GAAG,KAAK,CAAC;IAEV,OAAO,CACL,oBAAC,iBAAiB,IAChB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,CAAC,CAAC,QAAQ,EACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EACtD,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,WAAW,EACxB,SAAS,QACT,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAC,OAAO,EACZ,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EACvD,UAAU,EAAE;YACV,YAAY,EAAE,CACZ,oBAAC,cAAc,IAAC,QAAQ,EAAE,KAAK;gBAC7B,oBAAC,eAAe,IAAC,MAAM,EAAE,cAAc,GAAI;gBAC1C,WAAW,CACG,CAClB;SACF,EACD,UAAU,EAAE,QAAQ,eACV,sBAAsB,GAChC,CACH,CAAC;AACJ,CAAC;AAED,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"DecimalField.js","sourceRoot":"","sources":["../../../../src/components/FormComponents/DecimalItem/DecimalField.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,cAAc,MAAM,8BAA8B,CAAC;AAC1D,OAAO,eAAe,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAexD,SAAS,YAAY,CAAC,KAAwB;IAC5C,MAAM,EACJ,MAAM,EACN,KAAK,EACL,QAAQ,EACR,aAAa,EACb,WAAW,EACX,WAAW,EACX,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,aAAa,EACd,GAAG,KAAK,CAAC;IAEV,OAAO,CACL,oBAAC,iBAAiB,IAChB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,CAAC,CAAC,QAAQ,EACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EACtD,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,EACrD,SAAS,QACT,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAC,OAAO,EACZ,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EACvD,UAAU,EAAE;YACV,YAAY,EAAE,CACZ,oBAAC,cAAc,IAAC,QAAQ,EAAE,KAAK;gBAC7B,oBAAC,eAAe,IAAC,MAAM,EAAE,cAAc,GAAI;gBAC1C,WAAW,CACG,CAClB;SACF,EACD,UAAU,EAAE,QAAQ,eACV,sBAAsB,GAChC,CACH,CAAC;AACJ,CAAC;AAED,eAAe,YAAY,CAAC"}
@@ -37,7 +37,7 @@ function DecimalItem(props) {
37
37
  const { displayUnit, displayPrompt, entryFormat } = useRenderingExtensions(qItem);
38
38
  // Init input value
39
39
  let valueDecimal = 0.0;
40
- let initialInput = '0';
40
+ let initialInput = '';
41
41
  if (qrItem === null || qrItem === void 0 ? void 0 : qrItem.answer) {
42
42
  if (qrItem === null || qrItem === void 0 ? void 0 : qrItem.answer[0].valueDecimal) {
43
43
  valueDecimal = qrItem.answer[0].valueDecimal;
@@ -68,9 +68,14 @@ function DecimalItem(props) {
68
68
  }
69
69
  // eslint-disable-next-line react-hooks/exhaustive-deps
70
70
  const updateQrItemWithDebounce = useCallback(debounce((parsedNewInput) => {
71
- onQrItemChange(Object.assign(Object.assign({}, createEmptyQrItem(qItem)), { answer: precision
72
- ? [{ valueDecimal: parseDecimalStringToFloat(parsedNewInput, precision) }]
73
- : [{ valueDecimal: parseFloat(parsedNewInput) }] }));
71
+ if (parsedNewInput === '') {
72
+ onQrItemChange(createEmptyQrItem(qItem));
73
+ }
74
+ else {
75
+ onQrItemChange(Object.assign(Object.assign({}, createEmptyQrItem(qItem)), { answer: precision
76
+ ? [{ valueDecimal: parseDecimalStringToFloat(parsedNewInput, precision) }]
77
+ : [{ valueDecimal: parseFloat(parsedNewInput) }] }));
78
+ }
74
79
  }, DEBOUNCE_DURATION), [onQrItemChange, qItem, displayUnit, precision]); // Dependencies are tested, debounce is causing eslint to not recognise dependencies
75
80
  if (isRepeated) {
76
81
  return (React.createElement(DecimalField, { linkId: qItem.linkId, input: input, feedback: feedback, displayPrompt: displayPrompt, displayUnit: displayUnit, entryFormat: entryFormat, readOnly: readOnly, calcExpUpdated: calcExpUpdated, isTabled: isTabled, onInputChange: handleInputChange }));
@@ -1 +1 @@
1
- {"version":3,"file":"DecimalItem.js","sourceRoot":"","sources":["../../../../src/components/FormComponents/DecimalItem/DecimalItem.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DecimalItem.js","sourceRoot":"","sources":["../../../../src/components/FormComponents/DecimalItem/DecimalItem.tsx"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import type { PropsWithIsTabledAttribute } from '../../../interfaces/renderProps.interface';
3
3
  interface IntegerFieldProps extends PropsWithIsTabledAttribute {
4
4
  linkId: string;
5
- value: number;
5
+ input: string;
6
6
  feedback: string;
7
7
  displayPrompt: string;
8
8
  displayUnit: string;
@@ -19,8 +19,8 @@ import InputAdornment from '@mui/material/InputAdornment';
19
19
  import { StandardTextField } from '../Textfield.styles';
20
20
  import FadingCheckIcon from '../ItemParts/FadingCheckIcon';
21
21
  function IntegerField(props) {
22
- const { linkId, value, feedback, displayPrompt, displayUnit, entryFormat, readOnly, calcExpUpdated, isTabled, onInputChange } = props;
23
- return (React.createElement(StandardTextField, { id: linkId, value: value.toString(), error: !!feedback, helperText: feedback, onChange: (event) => onInputChange(event.target.value), disabled: readOnly, label: displayPrompt, placeholder: entryFormat, fullWidth: true, isTabled: isTabled, size: "small", inputProps: { inputMode: 'numeric', pattern: '[0-9]*' }, InputProps: {
22
+ const { linkId, input, feedback, displayPrompt, displayUnit, entryFormat, readOnly, calcExpUpdated, isTabled, onInputChange } = props;
23
+ return (React.createElement(StandardTextField, { id: linkId, value: input, error: !!feedback, helperText: feedback, onChange: (event) => onInputChange(event.target.value), disabled: readOnly, label: displayPrompt, placeholder: entryFormat === '' ? '0' : entryFormat, fullWidth: true, isTabled: isTabled, size: "small", inputProps: { inputMode: 'numeric', pattern: '[0-9]*' }, InputProps: {
24
24
  endAdornment: (React.createElement(InputAdornment, { position: 'end' },
25
25
  React.createElement(FadingCheckIcon, { fadeIn: calcExpUpdated }),
26
26
  displayUnit))
@@ -1 +1 @@
1
- {"version":3,"file":"IntegerField.js","sourceRoot":"","sources":["../../../../src/components/FormComponents/IntegerItem/IntegerField.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,cAAc,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,eAAe,MAAM,8BAA8B,CAAC;AAc3D,SAAS,YAAY,CAAC,KAAwB;IAC5C,MAAM,EACJ,MAAM,EACN,KAAK,EACL,QAAQ,EACR,aAAa,EACb,WAAW,EACX,WAAW,EACX,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,aAAa,EACd,GAAG,KAAK,CAAC;IAEV,OAAO,CACL,oBAAC,iBAAiB,IAChB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,EACvB,KAAK,EAAE,CAAC,CAAC,QAAQ,EACjB,UAAU,EAAE,QAAQ,EACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EACtD,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,WAAW,EACxB,SAAS,QACT,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAC,OAAO,EACZ,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EACvD,UAAU,EAAE;YACV,YAAY,EAAE,CACZ,oBAAC,cAAc,IAAC,QAAQ,EAAE,KAAK;gBAC7B,oBAAC,eAAe,IAAC,MAAM,EAAE,cAAc,GAAI;gBAC1C,WAAW,CACG,CAClB;SACF,eACS,sBAAsB,GAChC,CACH,CAAC;AACJ,CAAC;AAED,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"IntegerField.js","sourceRoot":"","sources":["../../../../src/components/FormComponents/IntegerItem/IntegerField.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,cAAc,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,eAAe,MAAM,8BAA8B,CAAC;AAc3D,SAAS,YAAY,CAAC,KAAwB;IAC5C,MAAM,EACJ,MAAM,EACN,KAAK,EACL,QAAQ,EACR,aAAa,EACb,WAAW,EACX,WAAW,EACX,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,aAAa,EACd,GAAG,KAAK,CAAC;IAEV,OAAO,CACL,oBAAC,iBAAiB,IAChB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,CAAC,CAAC,QAAQ,EACjB,UAAU,EAAE,QAAQ,EACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EACtD,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EACnD,SAAS,QACT,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAC,OAAO,EACZ,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EACvD,UAAU,EAAE;YACV,YAAY,EAAE,CACZ,oBAAC,cAAc,IAAC,QAAQ,EAAE,KAAK;gBAC7B,oBAAC,eAAe,IAAC,MAAM,EAAE,cAAc,GAAI;gBAC1C,WAAW,CACG,CAClB;SACF,eACS,sBAAsB,GAChC,CACH,CAAC;AACJ,CAAC;AAED,eAAe,YAAY,CAAC"}
@@ -23,11 +23,11 @@ import { DEBOUNCE_DURATION } from '../../../utils/debounce';
23
23
  import { FullWidthFormComponentBox } from '../../Box.styles';
24
24
  import IntegerField from './IntegerField';
25
25
  import useIntegerCalculatedExpression from '../../../hooks/useIntegerCalculatedExpression';
26
- import { parseValidInteger } from '../../../utils/parseInputs';
26
+ import { parseIntegerString } from '../../../utils/parseInputs';
27
27
  import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
28
- import useNumberInput from '../../../hooks/useNumberInput';
29
28
  import useReadOnly from '../../../hooks/useReadOnly';
30
29
  import { useQuestionnaireStore } from '../../../stores';
30
+ import useStringInput from '../../../hooks/useStringInput';
31
31
  function IntegerItem(props) {
32
32
  const { qItem, qrItem, isRepeated, isTabled, parentIsReadOnly, onQrItemChange } = props;
33
33
  const onFocusLinkId = useQuestionnaireStore.use.onFocusLinkId();
@@ -35,6 +35,7 @@ function IntegerItem(props) {
35
35
  const { displayUnit, displayPrompt, entryFormat } = useRenderingExtensions(qItem);
36
36
  // Init input value
37
37
  let valueInteger = 0;
38
+ let initialInput = '';
38
39
  if (qrItem === null || qrItem === void 0 ? void 0 : qrItem.answer) {
39
40
  if (qrItem === null || qrItem === void 0 ? void 0 : qrItem.answer[0].valueInteger) {
40
41
  valueInteger = qrItem.answer[0].valueInteger;
@@ -42,35 +43,41 @@ function IntegerItem(props) {
42
43
  if (qrItem === null || qrItem === void 0 ? void 0 : qrItem.answer[0].valueDecimal) {
43
44
  valueInteger = Math.round(qrItem.answer[0].valueDecimal);
44
45
  }
46
+ initialInput = valueInteger.toString();
45
47
  }
46
- const [value, setValue] = useNumberInput(valueInteger);
48
+ const [input, setInput] = useStringInput(initialInput);
47
49
  // Perform validation checks
48
- const feedback = useValidationFeedback(qItem, value.toString());
50
+ const feedback = useValidationFeedback(qItem, input);
49
51
  // Process calculated expressions
50
52
  const { calcExpUpdated } = useIntegerCalculatedExpression({
51
53
  qItem: qItem,
52
- inputValue: value,
53
- setInputValue: (newValue) => {
54
- setValue(newValue);
54
+ inputValue: input,
55
+ setInputValue: (newInput) => {
56
+ setInput(newInput);
55
57
  },
56
58
  onQrItemChange: onQrItemChange
57
59
  });
58
60
  // Event handlers
59
61
  function handleInputChange(newInput) {
60
- const newValue = parseValidInteger(newInput);
61
- setValue(newValue);
62
- updateQrItemWithDebounce(newValue);
62
+ const parsedNewInput = parseIntegerString(newInput);
63
+ setInput(parsedNewInput);
64
+ updateQrItemWithDebounce(parsedNewInput);
63
65
  }
64
66
  // eslint-disable-next-line react-hooks/exhaustive-deps
65
- const updateQrItemWithDebounce = useCallback(debounce((newValue) => {
66
- onQrItemChange(Object.assign(Object.assign({}, createEmptyQrItem(qItem)), { answer: [{ valueInteger: newValue }] }));
67
+ const updateQrItemWithDebounce = useCallback(debounce((parsedNewInput) => {
68
+ if (parsedNewInput === '') {
69
+ onQrItemChange(createEmptyQrItem(qItem));
70
+ }
71
+ else {
72
+ onQrItemChange(Object.assign(Object.assign({}, createEmptyQrItem(qItem)), { answer: [{ valueInteger: parseInt(parsedNewInput) }] }));
73
+ }
67
74
  }, DEBOUNCE_DURATION), [onQrItemChange, qItem, displayUnit]); // Dependencies are tested, debounce is causing eslint to not recognise dependencies
68
75
  if (isRepeated) {
69
- return (React.createElement(IntegerField, { linkId: qItem.linkId, value: value, feedback: feedback, displayPrompt: displayPrompt, displayUnit: displayUnit, entryFormat: entryFormat, readOnly: readOnly, calcExpUpdated: calcExpUpdated, isTabled: isTabled, onInputChange: handleInputChange }));
76
+ return (React.createElement(IntegerField, { linkId: qItem.linkId, input: input, feedback: feedback, displayPrompt: displayPrompt, displayUnit: displayUnit, entryFormat: entryFormat, readOnly: readOnly, calcExpUpdated: calcExpUpdated, isTabled: isTabled, onInputChange: handleInputChange }));
70
77
  }
71
78
  return (React.createElement(FullWidthFormComponentBox, { "data-test": "q-item-integer-box", "data-linkid": qItem.linkId, onClick: () => onFocusLinkId(qItem.linkId) },
72
79
  React.createElement(ItemFieldGrid, { qItem: qItem, readOnly: readOnly },
73
- React.createElement(IntegerField, { linkId: qItem.linkId, value: value, feedback: feedback, displayPrompt: displayPrompt, displayUnit: displayUnit, entryFormat: entryFormat, readOnly: readOnly, calcExpUpdated: calcExpUpdated, isTabled: isTabled, onInputChange: handleInputChange }))));
80
+ React.createElement(IntegerField, { linkId: qItem.linkId, input: input, feedback: feedback, displayPrompt: displayPrompt, displayUnit: displayUnit, entryFormat: entryFormat, readOnly: readOnly, calcExpUpdated: calcExpUpdated, isTabled: isTabled, onInputChange: handleInputChange }))));
74
81
  }
75
82
  export default IntegerItem;
76
83
  //# sourceMappingURL=IntegerItem.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"IntegerItem.js","sourceRoot":"","sources":["../../../../src/components/FormComponents/IntegerItem/IntegerItem.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"IntegerItem.js","sourceRoot":"","sources":["../../../../src/components/FormComponents/IntegerItem/IntegerItem.tsx"],"names":[],"mappings":"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"}
@@ -29,19 +29,19 @@ function useDecimalCalculatedExpression(props) {
29
29
  }
30
30
  // only update if calculated value is different from current value
31
31
  if (calcExpression.value !== inputValue && typeof calcExpression.value === 'number') {
32
- const value = precision
32
+ const calcExpressionValue = precision
33
33
  ? parseFloat(calcExpression.value.toFixed(precision))
34
34
  : calcExpression.value;
35
35
  // only update if calculated value is different from current value
36
- if (value !== parseFloat(inputValue)) {
36
+ if (calcExpressionValue !== parseFloat(inputValue)) {
37
37
  // update ui to show calculated value changes
38
38
  setCalcExpUpdated(true);
39
39
  setTimeout(() => {
40
40
  setCalcExpUpdated(false);
41
41
  }, 500);
42
42
  // update questionnaireResponse
43
- setInputValue(precision ? value.toFixed(precision) : value.toString());
44
- onQrItemChange(Object.assign(Object.assign({}, createEmptyQrItem(qItem)), { answer: [{ valueDecimal: value }] }));
43
+ setInputValue(precision ? calcExpressionValue.toFixed(precision) : calcExpressionValue.toString());
44
+ onQrItemChange(Object.assign(Object.assign({}, createEmptyQrItem(qItem)), { answer: [{ valueDecimal: calcExpressionValue }] }));
45
45
  }
46
46
  }
47
47
  },
@@ -1 +1 @@
1
- {"version":3,"file":"useDecimalCalculatedExpression.js","sourceRoot":"","sources":["../../src/hooks/useDecimalCalculatedExpression.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAclD,SAAS,8BAA8B,CACrC,KAA0C;IAE1C,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IAE9E,MAAM,qBAAqB,GAAG,qBAAqB,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;IAEhF,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5D,SAAS,CACP,GAAG,EAAE;;QACH,MAAM,cAAc,GAAG,MAAA,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,0CAAE,IAAI,CAC9D,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,CAC7B,CAAC;QAEF,IAAI,CAAC,cAAc,EAAE;YACnB,OAAO;SACR;QAED,kEAAkE;QAClE,IAAI,cAAc,CAAC,KAAK,KAAK,UAAU,IAAI,OAAO,cAAc,CAAC,KAAK,KAAK,QAAQ,EAAE;YACnF,MAAM,KAAK,GAAG,SAAS;gBACrB,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACrD,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC;YAEzB,kEAAkE;YAClE,IAAI,KAAK,KAAK,UAAU,CAAC,UAAU,CAAC,EAAE;gBACpC,6CAA6C;gBAC7C,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBACxB,UAAU,CAAC,GAAG,EAAE;oBACd,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBAC3B,CAAC,EAAE,GAAG,CAAC,CAAC;gBAER,+BAA+B;gBAC/B,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACvE,cAAc,iCACT,iBAAiB,CAAC,KAAK,CAAC,KAC3B,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,IACjC,CAAC;aACJ;SACF;IACH,CAAC;IACD,mEAAmE;IACnE,uDAAuD;IACvD,CAAC,qBAAqB,CAAC,CACxB,CAAC;IAEF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AAC5C,CAAC;AAED,eAAe,8BAA8B,CAAC"}
1
+ {"version":3,"file":"useDecimalCalculatedExpression.js","sourceRoot":"","sources":["../../src/hooks/useDecimalCalculatedExpression.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAclD,SAAS,8BAA8B,CACrC,KAA0C;IAE1C,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IAE9E,MAAM,qBAAqB,GAAG,qBAAqB,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;IAEhF,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5D,SAAS,CACP,GAAG,EAAE;;QACH,MAAM,cAAc,GAAG,MAAA,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,0CAAE,IAAI,CAC9D,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,CAC7B,CAAC;QAEF,IAAI,CAAC,cAAc,EAAE;YACnB,OAAO;SACR;QAED,kEAAkE;QAClE,IAAI,cAAc,CAAC,KAAK,KAAK,UAAU,IAAI,OAAO,cAAc,CAAC,KAAK,KAAK,QAAQ,EAAE;YACnF,MAAM,mBAAmB,GAAG,SAAS;gBACnC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACrD,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC;YAEzB,kEAAkE;YAClE,IAAI,mBAAmB,KAAK,UAAU,CAAC,UAAU,CAAC,EAAE;gBAClD,6CAA6C;gBAC7C,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBACxB,UAAU,CAAC,GAAG,EAAE;oBACd,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBAC3B,CAAC,EAAE,GAAG,CAAC,CAAC;gBAER,+BAA+B;gBAC/B,aAAa,CACX,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,QAAQ,EAAE,CACpF,CAAC;gBACF,cAAc,iCACT,iBAAiB,CAAC,KAAK,CAAC,KAC3B,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,mBAAmB,EAAE,CAAC,IAC/C,CAAC;aACJ;SACF;IACH,CAAC;IACD,mEAAmE;IACnE,uDAAuD;IACvD,CAAC,qBAAqB,CAAC,CACxB,CAAC;IAEF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AAC5C,CAAC;AAED,eAAe,8BAA8B,CAAC"}
@@ -4,8 +4,8 @@ interface UseIntegerCalculatedExpression {
4
4
  }
5
5
  interface useIntegerCalculatedExpressionProps {
6
6
  qItem: QuestionnaireItem;
7
- inputValue: number;
8
- setInputValue: (value: number) => void;
7
+ inputValue: string;
8
+ setInputValue: (value: string) => void;
9
9
  onQrItemChange: (qrItem: QuestionnaireResponseItem) => void;
10
10
  }
11
11
  declare function useIntegerCalculatedExpression(props: useIntegerCalculatedExpressionProps): UseIntegerCalculatedExpression;
@@ -29,14 +29,17 @@ function useIntegerCalculatedExpression(props) {
29
29
  }
30
30
  // only update if calculated value is different from current value
31
31
  if (calcExpression.value !== inputValue && typeof calcExpression.value === 'number') {
32
- // update ui to show calculated value changes
33
- setCalcExpUpdated(true);
34
- setTimeout(() => {
35
- setCalcExpUpdated(false);
36
- }, 500);
37
- // update questionnaireResponse
38
- setInputValue(calcExpression.value);
39
- onQrItemChange(Object.assign(Object.assign({}, createEmptyQrItem(qItem)), { answer: [{ valueInteger: calcExpression.value }] }));
32
+ const calcExpressionValue = calcExpression.value;
33
+ if (calcExpressionValue !== parseInt(inputValue)) {
34
+ // update ui to show calculated value changes
35
+ setCalcExpUpdated(true);
36
+ setTimeout(() => {
37
+ setCalcExpUpdated(false);
38
+ }, 500);
39
+ // update questionnaireResponse
40
+ setInputValue(calcExpressionValue.toString());
41
+ onQrItemChange(Object.assign(Object.assign({}, createEmptyQrItem(qItem)), { answer: [{ valueInteger: calcExpressionValue }] }));
42
+ }
40
43
  }
41
44
  },
42
45
  // Only trigger this effect if calculatedExpression of item changes
@@ -1 +1 @@
1
- {"version":3,"file":"useIntegerCalculatedExpression.js","sourceRoot":"","sources":["../../src/hooks/useIntegerCalculatedExpression.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAarE,SAAS,8BAA8B,CACrC,KAA0C;IAE1C,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IAEnE,MAAM,qBAAqB,GAAG,qBAAqB,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;IAEhF,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5D,SAAS,CACP,GAAG,EAAE;;QACH,MAAM,cAAc,GAAG,MAAA,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,0CAAE,IAAI,CAC9D,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,CAC7B,CAAC;QAEF,IAAI,CAAC,cAAc,EAAE;YACnB,OAAO;SACR;QAED,kEAAkE;QAClE,IAAI,cAAc,CAAC,KAAK,KAAK,UAAU,IAAI,OAAO,cAAc,CAAC,KAAK,KAAK,QAAQ,EAAE;YACnF,6CAA6C;YAC7C,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACxB,UAAU,CAAC,GAAG,EAAE;gBACd,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC,EAAE,GAAG,CAAC,CAAC;YAER,+BAA+B;YAC/B,aAAa,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YACpC,cAAc,iCACT,iBAAiB,CAAC,KAAK,CAAC,KAC3B,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC,IAChD,CAAC;SACJ;IACH,CAAC;IACD,mEAAmE;IACnE,uDAAuD;IACvD,CAAC,qBAAqB,CAAC,CACxB,CAAC;IAEF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AAC5C,CAAC;AAED,eAAe,8BAA8B,CAAC"}
1
+ {"version":3,"file":"useIntegerCalculatedExpression.js","sourceRoot":"","sources":["../../src/hooks/useIntegerCalculatedExpression.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAarE,SAAS,8BAA8B,CACrC,KAA0C;IAE1C,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IAEnE,MAAM,qBAAqB,GAAG,qBAAqB,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;IAEhF,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5D,SAAS,CACP,GAAG,EAAE;;QACH,MAAM,cAAc,GAAG,MAAA,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,0CAAE,IAAI,CAC9D,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,CAC7B,CAAC;QAEF,IAAI,CAAC,cAAc,EAAE;YACnB,OAAO;SACR;QAED,kEAAkE;QAClE,IAAI,cAAc,CAAC,KAAK,KAAK,UAAU,IAAI,OAAO,cAAc,CAAC,KAAK,KAAK,QAAQ,EAAE;YACnF,MAAM,mBAAmB,GAAG,cAAc,CAAC,KAAK,CAAC;YAEjD,IAAI,mBAAmB,KAAK,QAAQ,CAAC,UAAU,CAAC,EAAE;gBAChD,6CAA6C;gBAC7C,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBACxB,UAAU,CAAC,GAAG,EAAE;oBACd,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBAC3B,CAAC,EAAE,GAAG,CAAC,CAAC;gBAER,+BAA+B;gBAC/B,aAAa,CAAC,mBAAmB,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC9C,cAAc,iCACT,iBAAiB,CAAC,KAAK,CAAC,KAC3B,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,mBAAmB,EAAE,CAAC,IAC/C,CAAC;aACJ;SACF;IACH,CAAC;IACD,mEAAmE;IACnE,uDAAuD;IACvD,CAAC,qBAAqB,CAAC,CACxB,CAAC;IAEF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AAC5C,CAAC;AAED,eAAe,8BAA8B,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export declare function parseValidInteger(input: string): number;
2
2
  export declare function parseValidNumericString(input: string): string;
3
+ export declare function parseIntegerString(input: string): string;
3
4
  export declare function parseDecimalStringWithPrecision(input: string, precision: number | null): string;
4
5
  export declare function parseDecimalStringToFloat(input: string, precision: number): number;
@@ -25,7 +25,17 @@ export function parseValidNumericString(input) {
25
25
  }
26
26
  return input;
27
27
  }
28
+ export function parseIntegerString(input) {
29
+ if (input === '') {
30
+ return '';
31
+ }
32
+ input = parseValidNumericString(input);
33
+ return parseInt(input).toString();
34
+ }
28
35
  export function parseDecimalStringWithPrecision(input, precision) {
36
+ if (input === '') {
37
+ return '';
38
+ }
29
39
  input = parseValidNumericString(input);
30
40
  let parsedInput = parseFloat(input).toString();
31
41
  // restore decimal digits if parseFloat() removes them
@@ -1 +1 @@
1
- {"version":3,"file":"parseInputs.js","sourceRoot":"","sources":["../../src/utils/parseInputs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,MAAM,kBAAkB,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAE1D,OAAO,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QAC1B,OAAO,GAAG,CAAC;KACZ;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,KAAa,EAAE,SAAwB;IACrF,KAAK,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAEvC,IAAI,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;IAE/C,sDAAsD;IACtD,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE;QACvB,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAChD,IAAI,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE;YACnC,WAAW,IAAI,aAAa,CAAC;SAC9B;KACF;IAED,6CAA6C;IAC7C,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9C,IAAI,SAAS,IAAI,kBAAkB,KAAK,CAAC,CAAC,EAAE;QAC1C,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,kBAAkB,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC;KAC5E;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAa,EAAE,SAAiB;IACxE,OAAO,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;AAC1D,CAAC"}
1
+ {"version":3,"file":"parseInputs.js","sourceRoot":"","sources":["../../src/utils/parseInputs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,MAAM,kBAAkB,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAE1D,OAAO,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QAC1B,OAAO,GAAG,CAAC;KACZ;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,IAAI,KAAK,KAAK,EAAE,EAAE;QAChB,OAAO,EAAE,CAAC;KACX;IAED,KAAK,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IACvC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,KAAa,EAAE,SAAwB;IACrF,IAAI,KAAK,KAAK,EAAE,EAAE;QAChB,OAAO,EAAE,CAAC;KACX;IAED,KAAK,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAEvC,IAAI,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;IAE/C,sDAAsD;IACtD,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE;QACvB,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAChD,IAAI,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE;YACnC,WAAW,IAAI,aAAa,CAAC;SAC9B;KACF;IAED,6CAA6C;IAC7C,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9C,IAAI,SAAS,IAAI,kBAAkB,KAAK,CAAC,CAAC,EAAE;QAC1C,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,kBAAkB,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC;KAC5E;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAa,EAAE,SAAiB;IACxE,OAAO,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { QuestionnaireResponse, QuestionnaireResponseItem } from 'fhir/r4';
2
+ export declare function createQuestionnaireResponseItemMap(questionnaireResponse: QuestionnaireResponse): Record<string, QuestionnaireResponseItem[]>;
@@ -0,0 +1,47 @@
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
+ export function createQuestionnaireResponseItemMap(questionnaireResponse) {
18
+ if (!questionnaireResponse.item) {
19
+ return {};
20
+ }
21
+ const questionnaireResponseItemMap = {};
22
+ for (const topLevelQRItem of questionnaireResponse.item) {
23
+ fillQuestionnaireResponseItemMapRecursive(topLevelQRItem, questionnaireResponseItemMap);
24
+ }
25
+ return questionnaireResponseItemMap;
26
+ }
27
+ function fillQuestionnaireResponseItemMapRecursive(qrItem, questionnaireResponseItemMap) {
28
+ const qrItems = qrItem.item;
29
+ if (qrItems && qrItems.length > 0) {
30
+ // iterate through items of item recursively
31
+ for (const childQRItem of qrItems) {
32
+ fillQuestionnaireResponseItemMapRecursive(childQRItem, questionnaireResponseItemMap);
33
+ }
34
+ }
35
+ fillQuestionnaireResponseItemMap(qrItem, questionnaireResponseItemMap);
36
+ }
37
+ function fillQuestionnaireResponseItemMap(qrItem, questionnaireResponseItemMap) {
38
+ // linkId already exists in questionnaireResponseItemMap, it would be a repeat group
39
+ if (qrItem.linkId in questionnaireResponseItemMap) {
40
+ questionnaireResponseItemMap[qrItem.linkId].push(qrItem);
41
+ }
42
+ // Add item to questionnaireResponseItemMap
43
+ else {
44
+ questionnaireResponseItemMap[qrItem.linkId] = [qrItem];
45
+ }
46
+ }
47
+ //# sourceMappingURL=updatableResponseItems.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updatableResponseItems.js","sourceRoot":"","sources":["../../../src/utils/questionnaireResponseStoreUtils/updatableResponseItems.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,MAAM,UAAU,kCAAkC,CAChD,qBAA4C;IAE5C,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE;QAC/B,OAAO,EAAE,CAAC;KACX;IAED,MAAM,4BAA4B,GAAgD,EAAE,CAAC;IACrF,KAAK,MAAM,cAAc,IAAI,qBAAqB,CAAC,IAAI,EAAE;QACvD,yCAAyC,CAAC,cAAc,EAAE,4BAA4B,CAAC,CAAC;KACzF;IAED,OAAO,4BAA4B,CAAC;AACtC,CAAC;AAED,SAAS,yCAAyC,CAChD,MAAiC,EACjC,4BAAyE;IAEzE,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;IAC5B,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;QACjC,4CAA4C;QAC5C,KAAK,MAAM,WAAW,IAAI,OAAO,EAAE;YACjC,yCAAyC,CAAC,WAAW,EAAE,4BAA4B,CAAC,CAAC;SACtF;KACF;IAED,gCAAgC,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,gCAAgC,CACvC,MAAiC,EACjC,4BAAyE;IAEzE,oFAAoF;IACpF,IAAI,MAAM,CAAC,MAAM,IAAI,4BAA4B,EAAE;QACjD,4BAA4B,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KAC1D;IACD,2CAA2C;SACtC;QACH,4BAA4B,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;KACxD;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aehrc/smart-forms-renderer",
3
- "version": "0.25.0",
3
+ "version": "0.25.2",
4
4
  "description": "FHIR Structured Data Captured (SDC) rendering engine for Smart Forms",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -30,7 +30,7 @@
30
30
  "deep-diff": "^1.0.2",
31
31
  "fhirclient": "^2.5.2",
32
32
  "fhirpath": "^3.7.1",
33
- "html-react-parser": "5.1.10",
33
+ "html-react-parser": "4.2.10",
34
34
  "lodash.clonedeep": "^4.5.0",
35
35
  "lodash.debounce": "^4.0.8",
36
36
  "nanoid": "^5.0.1",
@@ -59,7 +59,7 @@
59
59
  "@storybook/addon-onboarding": "^8.0.0",
60
60
  "@storybook/addon-styling": "^1.3.7",
61
61
  "@storybook/blocks": "^7.5.2",
62
- "@storybook/react": "^8.0.5",
62
+ "@storybook/react": "^8.0.9",
63
63
  "@storybook/react-vite": "^7.4.5",
64
64
  "@storybook/testing-library": "^0.2.1",
65
65
  "@swc/cli": "^0.1.63",
@@ -55,7 +55,7 @@ function DecimalField(props: DecimalFieldProps) {
55
55
  onChange={(event) => onInputChange(event.target.value)}
56
56
  disabled={readOnly}
57
57
  label={displayPrompt}
58
- placeholder={entryFormat}
58
+ placeholder={entryFormat === '' ? '0.0' : entryFormat}
59
59
  fullWidth
60
60
  isTabled={isTabled}
61
61
  size="small"
@@ -61,7 +61,7 @@ function DecimalItem(props: DecimalItemProps) {
61
61
 
62
62
  // Init input value
63
63
  let valueDecimal = 0.0;
64
- let initialInput = '0';
64
+ let initialInput = '';
65
65
  if (qrItem?.answer) {
66
66
  if (qrItem?.answer[0].valueDecimal) {
67
67
  valueDecimal = qrItem.answer[0].valueDecimal;
@@ -100,12 +100,16 @@ function DecimalItem(props: DecimalItemProps) {
100
100
  // eslint-disable-next-line react-hooks/exhaustive-deps
101
101
  const updateQrItemWithDebounce = useCallback(
102
102
  debounce((parsedNewInput: string) => {
103
- onQrItemChange({
104
- ...createEmptyQrItem(qItem),
105
- answer: precision
106
- ? [{ valueDecimal: parseDecimalStringToFloat(parsedNewInput, precision) }]
107
- : [{ valueDecimal: parseFloat(parsedNewInput) }]
108
- });
103
+ if (parsedNewInput === '') {
104
+ onQrItemChange(createEmptyQrItem(qItem));
105
+ } else {
106
+ onQrItemChange({
107
+ ...createEmptyQrItem(qItem),
108
+ answer: precision
109
+ ? [{ valueDecimal: parseDecimalStringToFloat(parsedNewInput, precision) }]
110
+ : [{ valueDecimal: parseFloat(parsedNewInput) }]
111
+ });
112
+ }
109
113
  }, DEBOUNCE_DURATION),
110
114
  [onQrItemChange, qItem, displayUnit, precision]
111
115
  ); // Dependencies are tested, debounce is causing eslint to not recognise dependencies
@@ -23,7 +23,7 @@ import FadingCheckIcon from '../ItemParts/FadingCheckIcon';
23
23
 
24
24
  interface IntegerFieldProps extends PropsWithIsTabledAttribute {
25
25
  linkId: string;
26
- value: number;
26
+ input: string;
27
27
  feedback: string;
28
28
  displayPrompt: string;
29
29
  displayUnit: string;
@@ -36,7 +36,7 @@ interface IntegerFieldProps extends PropsWithIsTabledAttribute {
36
36
  function IntegerField(props: IntegerFieldProps) {
37
37
  const {
38
38
  linkId,
39
- value,
39
+ input,
40
40
  feedback,
41
41
  displayPrompt,
42
42
  displayUnit,
@@ -50,13 +50,13 @@ function IntegerField(props: IntegerFieldProps) {
50
50
  return (
51
51
  <StandardTextField
52
52
  id={linkId}
53
- value={value.toString()}
53
+ value={input}
54
54
  error={!!feedback}
55
55
  helperText={feedback}
56
56
  onChange={(event) => onInputChange(event.target.value)}
57
57
  disabled={readOnly}
58
58
  label={displayPrompt}
59
- placeholder={entryFormat}
59
+ placeholder={entryFormat === '' ? '0' : entryFormat}
60
60
  fullWidth
61
61
  isTabled={isTabled}
62
62
  size="small"
@@ -31,11 +31,11 @@ import { DEBOUNCE_DURATION } from '../../../utils/debounce';
31
31
  import { FullWidthFormComponentBox } from '../../Box.styles';
32
32
  import IntegerField from './IntegerField';
33
33
  import useIntegerCalculatedExpression from '../../../hooks/useIntegerCalculatedExpression';
34
- import { parseValidInteger } from '../../../utils/parseInputs';
34
+ import { parseIntegerString } from '../../../utils/parseInputs';
35
35
  import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
36
- import useNumberInput from '../../../hooks/useNumberInput';
37
36
  import useReadOnly from '../../../hooks/useReadOnly';
38
37
  import { useQuestionnaireStore } from '../../../stores';
38
+ import useStringInput from '../../../hooks/useStringInput';
39
39
 
40
40
  interface IntegerItemProps
41
41
  extends PropsWithQrItemChangeHandler,
@@ -56,44 +56,53 @@ function IntegerItem(props: IntegerItemProps) {
56
56
 
57
57
  // Init input value
58
58
  let valueInteger = 0;
59
+ let initialInput = '';
59
60
  if (qrItem?.answer) {
60
61
  if (qrItem?.answer[0].valueInteger) {
61
62
  valueInteger = qrItem.answer[0].valueInteger;
62
63
  }
64
+
63
65
  if (qrItem?.answer[0].valueDecimal) {
64
66
  valueInteger = Math.round(qrItem.answer[0].valueDecimal);
65
67
  }
68
+
69
+ initialInput = valueInteger.toString();
66
70
  }
67
- const [value, setValue] = useNumberInput(valueInteger);
71
+
72
+ const [input, setInput] = useStringInput(initialInput);
68
73
 
69
74
  // Perform validation checks
70
- const feedback = useValidationFeedback(qItem, value.toString());
75
+ const feedback = useValidationFeedback(qItem, input);
71
76
 
72
77
  // Process calculated expressions
73
78
  const { calcExpUpdated } = useIntegerCalculatedExpression({
74
79
  qItem: qItem,
75
- inputValue: value,
76
- setInputValue: (newValue) => {
77
- setValue(newValue);
80
+ inputValue: input,
81
+ setInputValue: (newInput) => {
82
+ setInput(newInput);
78
83
  },
79
84
  onQrItemChange: onQrItemChange
80
85
  });
81
86
 
82
87
  // Event handlers
83
88
  function handleInputChange(newInput: string) {
84
- const newValue = parseValidInteger(newInput);
89
+ const parsedNewInput = parseIntegerString(newInput);
85
90
 
86
- setValue(newValue);
87
- updateQrItemWithDebounce(newValue);
91
+ setInput(parsedNewInput);
92
+ updateQrItemWithDebounce(parsedNewInput);
88
93
  }
89
94
 
90
95
  // eslint-disable-next-line react-hooks/exhaustive-deps
91
96
  const updateQrItemWithDebounce = useCallback(
92
- debounce((newValue: number) => {
93
- onQrItemChange({
94
- ...createEmptyQrItem(qItem),
95
- answer: [{ valueInteger: newValue }]
96
- });
97
+ debounce((parsedNewInput: string) => {
98
+ if (parsedNewInput === '') {
99
+ onQrItemChange(createEmptyQrItem(qItem));
100
+ } else {
101
+ onQrItemChange({
102
+ ...createEmptyQrItem(qItem),
103
+ answer: [{ valueInteger: parseInt(parsedNewInput) }]
104
+ });
105
+ }
97
106
  }, DEBOUNCE_DURATION),
98
107
  [onQrItemChange, qItem, displayUnit]
99
108
  ); // Dependencies are tested, debounce is causing eslint to not recognise dependencies
@@ -102,7 +111,7 @@ function IntegerItem(props: IntegerItemProps) {
102
111
  return (
103
112
  <IntegerField
104
113
  linkId={qItem.linkId}
105
- value={value}
114
+ input={input}
106
115
  feedback={feedback}
107
116
  displayPrompt={displayPrompt}
108
117
  displayUnit={displayUnit}
@@ -123,7 +132,7 @@ function IntegerItem(props: IntegerItemProps) {
123
132
  <ItemFieldGrid qItem={qItem} readOnly={readOnly}>
124
133
  <IntegerField
125
134
  linkId={qItem.linkId}
126
- value={value}
135
+ input={input}
127
136
  feedback={feedback}
128
137
  displayPrompt={displayPrompt}
129
138
  displayUnit={displayUnit}
@@ -53,12 +53,12 @@ function useDecimalCalculatedExpression(
53
53
 
54
54
  // only update if calculated value is different from current value
55
55
  if (calcExpression.value !== inputValue && typeof calcExpression.value === 'number') {
56
- const value = precision
56
+ const calcExpressionValue = precision
57
57
  ? parseFloat(calcExpression.value.toFixed(precision))
58
58
  : calcExpression.value;
59
59
 
60
60
  // only update if calculated value is different from current value
61
- if (value !== parseFloat(inputValue)) {
61
+ if (calcExpressionValue !== parseFloat(inputValue)) {
62
62
  // update ui to show calculated value changes
63
63
  setCalcExpUpdated(true);
64
64
  setTimeout(() => {
@@ -66,10 +66,12 @@ function useDecimalCalculatedExpression(
66
66
  }, 500);
67
67
 
68
68
  // update questionnaireResponse
69
- setInputValue(precision ? value.toFixed(precision) : value.toString());
69
+ setInputValue(
70
+ precision ? calcExpressionValue.toFixed(precision) : calcExpressionValue.toString()
71
+ );
70
72
  onQrItemChange({
71
73
  ...createEmptyQrItem(qItem),
72
- answer: [{ valueDecimal: value }]
74
+ answer: [{ valueDecimal: calcExpressionValue }]
73
75
  });
74
76
  }
75
77
  }
@@ -26,8 +26,8 @@ interface UseIntegerCalculatedExpression {
26
26
 
27
27
  interface useIntegerCalculatedExpressionProps {
28
28
  qItem: QuestionnaireItem;
29
- inputValue: number;
30
- setInputValue: (value: number) => void;
29
+ inputValue: string;
30
+ setInputValue: (value: string) => void;
31
31
  onQrItemChange: (qrItem: QuestionnaireResponseItem) => void;
32
32
  }
33
33
 
@@ -52,18 +52,22 @@ function useIntegerCalculatedExpression(
52
52
 
53
53
  // only update if calculated value is different from current value
54
54
  if (calcExpression.value !== inputValue && typeof calcExpression.value === 'number') {
55
- // update ui to show calculated value changes
56
- setCalcExpUpdated(true);
57
- setTimeout(() => {
58
- setCalcExpUpdated(false);
59
- }, 500);
55
+ const calcExpressionValue = calcExpression.value;
60
56
 
61
- // update questionnaireResponse
62
- setInputValue(calcExpression.value);
63
- onQrItemChange({
64
- ...createEmptyQrItem(qItem),
65
- answer: [{ valueInteger: calcExpression.value }]
66
- });
57
+ if (calcExpressionValue !== parseInt(inputValue)) {
58
+ // update ui to show calculated value changes
59
+ setCalcExpUpdated(true);
60
+ setTimeout(() => {
61
+ setCalcExpUpdated(false);
62
+ }, 500);
63
+
64
+ // update questionnaireResponse
65
+ setInputValue(calcExpressionValue.toString());
66
+ onQrItemChange({
67
+ ...createEmptyQrItem(qItem),
68
+ answer: [{ valueInteger: calcExpressionValue }]
69
+ });
70
+ }
67
71
  }
68
72
  },
69
73
  // Only trigger this effect if calculatedExpression of item changes
@@ -30,7 +30,20 @@ export function parseValidNumericString(input: string): string {
30
30
  return input;
31
31
  }
32
32
 
33
+ export function parseIntegerString(input: string): string {
34
+ if (input === '') {
35
+ return '';
36
+ }
37
+
38
+ input = parseValidNumericString(input);
39
+ return parseInt(input).toString();
40
+ }
41
+
33
42
  export function parseDecimalStringWithPrecision(input: string, precision: number | null): string {
43
+ if (input === '') {
44
+ return '';
45
+ }
46
+
34
47
  input = parseValidNumericString(input);
35
48
 
36
49
  let parsedInput = parseFloat(input).toString();