@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.
- package/lib/components/FormComponents/DecimalItem/DecimalField.js +1 -1
- package/lib/components/FormComponents/DecimalItem/DecimalField.js.map +1 -1
- package/lib/components/FormComponents/DecimalItem/DecimalItem.js +9 -4
- package/lib/components/FormComponents/DecimalItem/DecimalItem.js.map +1 -1
- package/lib/components/FormComponents/IntegerItem/IntegerField.d.ts +1 -1
- package/lib/components/FormComponents/IntegerItem/IntegerField.js +2 -2
- package/lib/components/FormComponents/IntegerItem/IntegerField.js.map +1 -1
- package/lib/components/FormComponents/IntegerItem/IntegerItem.js +21 -14
- package/lib/components/FormComponents/IntegerItem/IntegerItem.js.map +1 -1
- package/lib/hooks/useDecimalCalculatedExpression.js +4 -4
- package/lib/hooks/useDecimalCalculatedExpression.js.map +1 -1
- package/lib/hooks/useIntegerCalculatedExpression.d.ts +2 -2
- package/lib/hooks/useIntegerCalculatedExpression.js +11 -8
- package/lib/hooks/useIntegerCalculatedExpression.js.map +1 -1
- package/lib/utils/parseInputs.d.ts +1 -0
- package/lib/utils/parseInputs.js +10 -0
- package/lib/utils/parseInputs.js.map +1 -1
- package/lib/utils/questionnaireResponseStoreUtils/updatableResponseItems.d.ts +2 -0
- package/lib/utils/questionnaireResponseStoreUtils/updatableResponseItems.js +47 -0
- package/lib/utils/questionnaireResponseStoreUtils/updatableResponseItems.js.map +1 -0
- package/package.json +3 -3
- package/src/components/FormComponents/DecimalItem/DecimalField.tsx +1 -1
- package/src/components/FormComponents/DecimalItem/DecimalItem.tsx +11 -7
- package/src/components/FormComponents/IntegerItem/IntegerField.tsx +4 -4
- package/src/components/FormComponents/IntegerItem/IntegerItem.tsx +26 -17
- package/src/hooks/useDecimalCalculatedExpression.ts +6 -4
- package/src/hooks/useIntegerCalculatedExpression.ts +17 -13
- 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,
|
|
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 = '
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAQ3C,OAAO,sBAAsB,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,qBAAqB,MAAM,sCAAsC,CAAC;AACzE,OAAO,QAAQ,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,aAAa,MAAM,4BAA4B,CAAC;AACvD,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EACL,yBAAyB,EACzB,+BAA+B,EAChC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,8BAA8B,MAAM,+CAA+C,CAAC;AAC3F,OAAO,cAAc,MAAM,+BAA+B,CAAC;AAC3D,OAAO,WAAW,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAWxD,SAAS,WAAW,CAAC,KAAuB;IAC1C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IAExF,MAAM,aAAa,GAAG,qBAAqB,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAEhE,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAElF,mBAAmB;IACnB,IAAI,YAAY,GAAG,GAAG,CAAC;IACvB,IAAI,YAAY,GAAG,
|
|
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
|
-
|
|
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,
|
|
23
|
-
return (React.createElement(StandardTextField, { id: linkId, value:
|
|
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,
|
|
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 {
|
|
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 [
|
|
48
|
+
const [input, setInput] = useStringInput(initialInput);
|
|
47
49
|
// Perform validation checks
|
|
48
|
-
const feedback = useValidationFeedback(qItem,
|
|
50
|
+
const feedback = useValidationFeedback(qItem, input);
|
|
49
51
|
// Process calculated expressions
|
|
50
52
|
const { calcExpUpdated } = useIntegerCalculatedExpression({
|
|
51
53
|
qItem: qItem,
|
|
52
|
-
inputValue:
|
|
53
|
-
setInputValue: (
|
|
54
|
-
|
|
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
|
|
61
|
-
|
|
62
|
-
updateQrItemWithDebounce(
|
|
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((
|
|
66
|
-
|
|
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,
|
|
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,
|
|
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":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAQ3C,OAAO,sBAAsB,MAAM,uCAAuC,CAAC;AAC3E,OAAO,qBAAqB,MAAM,sCAAsC,CAAC;AACzE,OAAO,QAAQ,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,8BAA8B,MAAM,+CAA+C,CAAC;AAC3F,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"IntegerItem.js","sourceRoot":"","sources":["../../../../src/components/FormComponents/IntegerItem/IntegerItem.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAQ3C,OAAO,sBAAsB,MAAM,uCAAuC,CAAC;AAC3E,OAAO,qBAAqB,MAAM,sCAAsC,CAAC;AACzE,OAAO,QAAQ,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,8BAA8B,MAAM,+CAA+C,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,aAAa,MAAM,4BAA4B,CAAC;AACvD,OAAO,WAAW,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,cAAc,MAAM,+BAA+B,CAAC;AAW3D,SAAS,WAAW,CAAC,KAAuB;IAC1C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IAExF,MAAM,aAAa,GAAG,qBAAqB,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAEhE,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACtD,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAElF,mBAAmB;IACnB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,EAAE;QAClB,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,CAAC,CAAC,EAAE,YAAY,EAAE;YAClC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;SAC9C;QAED,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,CAAC,CAAC,EAAE,YAAY,EAAE;YAClC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;SAC1D;QAED,YAAY,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;KACxC;IAED,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IAEvD,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAErD,iCAAiC;IACjC,MAAM,EAAE,cAAc,EAAE,GAAG,8BAA8B,CAAC;QACxD,KAAK,EAAE,KAAK;QACZ,UAAU,EAAE,KAAK;QACjB,aAAa,EAAE,CAAC,QAAQ,EAAE,EAAE;YAC1B,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC;QACD,cAAc,EAAE,cAAc;KAC/B,CAAC,CAAC;IAEH,iBAAiB;IACjB,SAAS,iBAAiB,CAAC,QAAgB;QACzC,MAAM,cAAc,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAEpD,QAAQ,CAAC,cAAc,CAAC,CAAC;QACzB,wBAAwB,CAAC,cAAc,CAAC,CAAC;IAC3C,CAAC;IAED,uDAAuD;IACvD,MAAM,wBAAwB,GAAG,WAAW,CAC1C,QAAQ,CAAC,CAAC,cAAsB,EAAE,EAAE;QAClC,IAAI,cAAc,KAAK,EAAE,EAAE;YACzB,cAAc,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;SAC1C;aAAM;YACL,cAAc,iCACT,iBAAiB,CAAC,KAAK,CAAC,KAC3B,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,IACpD,CAAC;SACJ;IACH,CAAC,EAAE,iBAAiB,CAAC,EACrB,CAAC,cAAc,EAAE,KAAK,EAAE,WAAW,CAAC,CACrC,CAAC,CAAC,oFAAoF;IAEvF,IAAI,UAAU,EAAE;QACd,OAAO,CACL,oBAAC,YAAY,IACX,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,iBAAiB,GAChC,CACH,CAAC;KACH;IAED,OAAO,CACL,oBAAC,yBAAyB,iBACd,oBAAoB,iBACjB,KAAK,CAAC,MAAM,EACzB,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC;QAC1C,oBAAC,aAAa,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ;YAC7C,oBAAC,YAAY,IACX,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,iBAAiB,GAChC,CACY,CACU,CAC7B,CAAC;AACJ,CAAC;AAED,eAAe,WAAW,CAAC"}
|
|
@@ -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
|
|
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 (
|
|
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 ?
|
|
44
|
-
onQrItemChange(Object.assign(Object.assign({}, createEmptyQrItem(qItem)), { answer: [{ valueDecimal:
|
|
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,
|
|
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:
|
|
8
|
-
setInputValue: (value:
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
setCalcExpUpdated(
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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;
|
|
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;
|
package/lib/utils/parseInputs.js
CHANGED
|
@@ -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,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.
|
|
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": "
|
|
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.
|
|
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 = '
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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={
|
|
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 {
|
|
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
|
-
|
|
71
|
+
|
|
72
|
+
const [input, setInput] = useStringInput(initialInput);
|
|
68
73
|
|
|
69
74
|
// Perform validation checks
|
|
70
|
-
const feedback = useValidationFeedback(qItem,
|
|
75
|
+
const feedback = useValidationFeedback(qItem, input);
|
|
71
76
|
|
|
72
77
|
// Process calculated expressions
|
|
73
78
|
const { calcExpUpdated } = useIntegerCalculatedExpression({
|
|
74
79
|
qItem: qItem,
|
|
75
|
-
inputValue:
|
|
76
|
-
setInputValue: (
|
|
77
|
-
|
|
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
|
|
89
|
+
const parsedNewInput = parseIntegerString(newInput);
|
|
85
90
|
|
|
86
|
-
|
|
87
|
-
updateQrItemWithDebounce(
|
|
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((
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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 (
|
|
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(
|
|
69
|
+
setInputValue(
|
|
70
|
+
precision ? calcExpressionValue.toFixed(precision) : calcExpressionValue.toString()
|
|
71
|
+
);
|
|
70
72
|
onQrItemChange({
|
|
71
73
|
...createEmptyQrItem(qItem),
|
|
72
|
-
answer: [{ valueDecimal:
|
|
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:
|
|
30
|
-
setInputValue: (value:
|
|
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
|
-
|
|
56
|
-
setCalcExpUpdated(true);
|
|
57
|
-
setTimeout(() => {
|
|
58
|
-
setCalcExpUpdated(false);
|
|
59
|
-
}, 500);
|
|
55
|
+
const calcExpressionValue = calcExpression.value;
|
|
60
56
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
package/src/utils/parseInputs.ts
CHANGED
|
@@ -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();
|