@aehrc/smart-forms-renderer 1.2.11 → 1.2.13
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/AttachmentItem/AttachmentItem.js +2 -2
- package/lib/components/FormComponents/AttachmentItem/AttachmentItem.js.map +1 -1
- package/lib/components/FormComponents/BooleanItem/BooleanItem.js +2 -2
- package/lib/components/FormComponents/BooleanItem/BooleanItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/CheckboxOptionList.js +2 -1
- package/lib/components/FormComponents/ChoiceItems/CheckboxOptionList.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteField.d.ts +1 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteField.js +3 -2
- package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteField.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.js +5 -6
- package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.js +2 -2
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.js +2 -2
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.js +2 -2
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.js +2 -2
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioSingle.d.ts +2 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.js +61 -3
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.js +2 -2
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.js +5 -2
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.js +2 -2
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.js.map +1 -1
- package/lib/components/FormComponents/DateTimeItems/CustomDateItem/CustomDateItem.js +2 -2
- package/lib/components/FormComponents/DateTimeItems/CustomDateItem/CustomDateItem.js.map +1 -1
- package/lib/components/FormComponents/DateTimeItems/CustomDateTimeItem/CustomDateTimeItem.js +2 -2
- package/lib/components/FormComponents/DateTimeItems/CustomDateTimeItem/CustomDateTimeItem.js.map +1 -1
- package/lib/components/FormComponents/DateTimeItems/CustomDateTimeItem/CustomTimeField.js +3 -3
- package/lib/components/FormComponents/DateTimeItems/CustomDateTimeItem/CustomTimeField.js.map +1 -1
- package/lib/components/FormComponents/DecimalItem/DecimalItem.js +2 -2
- package/lib/components/FormComponents/DecimalItem/DecimalItem.js.map +1 -1
- package/lib/components/FormComponents/GroupItem/GroupItemView.js +1 -1
- package/lib/components/FormComponents/GroupItem/GroupItemView.js.map +1 -1
- package/lib/components/FormComponents/IntegerItem/IntegerItem.js +2 -2
- package/lib/components/FormComponents/IntegerItem/IntegerItem.js.map +1 -1
- package/lib/components/FormComponents/ItemParts/CheckboxSingle.d.ts +3 -1
- package/lib/components/FormComponents/ItemParts/CheckboxSingle.js +2 -2
- package/lib/components/FormComponents/ItemParts/CheckboxSingle.js.map +1 -1
- package/lib/components/FormComponents/ItemParts/FadingCheckIcon.d.ts +7 -0
- package/lib/components/FormComponents/ItemParts/FadingCheckIcon.js +26 -0
- package/lib/components/FormComponents/ItemParts/FadingCheckIcon.js.map +1 -0
- package/lib/components/FormComponents/ItemParts/ItemLabel.js +1 -7
- package/lib/components/FormComponents/ItemParts/ItemLabel.js.map +1 -1
- package/lib/components/FormComponents/ItemParts/ItemLabelText.d.ts +8 -0
- package/lib/components/FormComponents/ItemParts/ItemLabelText.js +63 -0
- package/lib/components/FormComponents/ItemParts/ItemLabelText.js.map +1 -0
- package/lib/components/FormComponents/ItemParts/ItemLabelWrapper.d.ts +8 -0
- package/lib/components/FormComponents/ItemParts/ItemLabelWrapper.js +53 -0
- package/lib/components/FormComponents/ItemParts/ItemLabelWrapper.js.map +1 -0
- package/lib/components/FormComponents/ItemParts/ItemTextSwitcher copy.d.ts +7 -0
- package/lib/components/FormComponents/ItemParts/ItemTextSwitcher copy.js +39 -0
- package/lib/components/FormComponents/ItemParts/ItemTextSwitcher copy.js.map +1 -0
- package/lib/components/FormComponents/ItemParts/ItemTextSwitcher.js +3 -19
- package/lib/components/FormComponents/ItemParts/ItemTextSwitcher.js.map +1 -1
- package/lib/components/FormComponents/ItemParts/RadioOptionList.js +2 -1
- package/lib/components/FormComponents/ItemParts/RadioOptionList.js.map +1 -1
- package/lib/components/FormComponents/ItemParts/StyledText.d.ts +8 -0
- package/lib/components/FormComponents/ItemParts/StyledText.js +30 -0
- package/lib/components/FormComponents/ItemParts/StyledText.js.map +1 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.d.ts +1 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.js +3 -2
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.js +5 -5
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.js +2 -2
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerValueSetItem.js +2 -2
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerValueSetItem.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.js +2 -2
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerValueSetItem.js +2 -2
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerValueSetItem.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.d.ts +1 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.js +71 -4
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.js +5 -6
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.d.ts +1 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.js +3 -2
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.js +5 -6
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.js.map +1 -1
- package/lib/components/FormComponents/QuantityItem/QuantityItem.js +2 -2
- package/lib/components/FormComponents/QuantityItem/QuantityItem.js.map +1 -1
- package/lib/components/FormComponents/RepeatGroup/DeleteItemButton.d.ts +10 -0
- package/lib/components/FormComponents/RepeatGroup/DeleteItemButton.js +30 -0
- package/lib/components/FormComponents/RepeatGroup/DeleteItemButton.js.map +1 -0
- package/lib/components/FormComponents/SliderItem/Slider.styles.d.ts +1 -1
- package/lib/components/FormComponents/SliderItem/SliderItem.js +2 -2
- package/lib/components/FormComponents/SliderItem/SliderItem.js.map +1 -1
- package/lib/components/FormComponents/StringItem/StringItem.js +2 -2
- package/lib/components/FormComponents/StringItem/StringItem.js.map +1 -1
- package/lib/components/FormComponents/TextItem/TextItem.js +2 -2
- package/lib/components/FormComponents/TextItem/TextItem.js.map +1 -1
- package/lib/components/FormComponents/TimeItem/TimeItem.js +2 -2
- package/lib/components/FormComponents/TimeItem/TimeItem.js.map +1 -1
- package/lib/components/FormComponents/UrlItem/UrlItem.js +2 -2
- package/lib/components/FormComponents/UrlItem/UrlItem.js.map +1 -1
- package/lib/components/Iconify/Iconify.d.ts +10 -0
- package/lib/components/Iconify/Iconify.js +26 -0
- package/lib/components/Iconify/Iconify.js.map +1 -0
- package/lib/components/Renderer/FormBodyPage.d.ts +9 -0
- package/lib/components/Renderer/FormBodyPage.js +43 -0
- package/lib/components/Renderer/FormBodyPage.js.map +1 -0
- package/lib/components/Renderer/FormTitle.d.ts +7 -0
- package/lib/components/Renderer/FormTitle.js +30 -0
- package/lib/components/Renderer/FormTitle.js.map +1 -0
- package/lib/components/Renderer/FormTopLevelPage.d.ts +9 -0
- package/lib/components/Renderer/FormTopLevelPage.js +29 -0
- package/lib/components/Renderer/FormTopLevelPage.js.map +1 -0
- package/lib/hooks/useBooleanCalculatedExpression.d.ts +12 -0
- package/lib/hooks/useBooleanCalculatedExpression.js +52 -0
- package/lib/hooks/useBooleanCalculatedExpression.js.map +1 -0
- package/lib/hooks/useCalculatedExpressionAnimating.d.ts +1 -0
- package/lib/hooks/useCalculatedExpressionAnimating.js +18 -0
- package/lib/hooks/useCalculatedExpressionAnimating.js.map +1 -0
- package/lib/hooks/useCalculatedExpressionUpdated.d.ts +1 -1
- package/lib/hooks/useCalculatedExpressionUpdated.js +18 -9
- package/lib/hooks/useCalculatedExpressionUpdated.js.map +1 -1
- package/lib/hooks/useDecimalCalculatedExpression.d.ts +13 -0
- package/lib/hooks/useDecimalCalculatedExpression.js +58 -0
- package/lib/hooks/useDecimalCalculatedExpression.js.map +1 -0
- package/lib/hooks/useInitialiseGroupTable.d.ts +4 -0
- package/lib/hooks/useInitialiseGroupTable.js +36 -0
- package/lib/hooks/useInitialiseGroupTable.js.map +1 -0
- package/lib/hooks/useIntegerCalculatedExpression.d.ts +12 -0
- package/lib/hooks/useIntegerCalculatedExpression.js +55 -0
- package/lib/hooks/useIntegerCalculatedExpression.js.map +1 -0
- package/lib/hooks/useNumberInput.d.ts +3 -0
- package/lib/hooks/useNumberInput.js +31 -0
- package/lib/hooks/useNumberInput.js.map +1 -0
- package/lib/hooks/useParseXhtml.d.ts +2 -2
- package/lib/hooks/useParseXhtml.js +5 -5
- package/lib/hooks/useParseXhtml.js.map +1 -1
- package/lib/hooks/useRepeatAnswers.d.ts +4 -0
- package/lib/hooks/useRepeatAnswers.js +34 -0
- package/lib/hooks/useRepeatAnswers.js.map +1 -0
- package/lib/hooks/useRepeatGroups.d.ts +4 -0
- package/lib/hooks/useRepeatGroups.js +34 -0
- package/lib/hooks/useRepeatGroups.js.map +1 -0
- package/lib/hooks/useShowFeedback.d.ts +11 -0
- package/lib/hooks/useShowFeedback.js +33 -0
- package/lib/hooks/useShowFeedback.js.map +1 -0
- package/lib/hooks/useStringCalculatedExpression.d.ts +14 -0
- package/lib/hooks/useStringCalculatedExpression.js +69 -0
- package/lib/hooks/useStringCalculatedExpression.js.map +1 -0
- package/lib/hooks/useStringInput.d.ts +3 -0
- package/lib/hooks/useStringInput.js +31 -0
- package/lib/hooks/useStringInput.js.map +1 -0
- package/lib/interfaces/itemPath.interface.d.ts +31 -0
- package/lib/interfaces/itemPath.interface.js +2 -0
- package/lib/interfaces/itemPath.interface.js.map +1 -0
- package/lib/interfaces/repeatItem.interface.d.ts +5 -0
- package/lib/interfaces/repeatItem.interface.js +2 -0
- package/lib/interfaces/repeatItem.interface.js.map +1 -0
- package/lib/stores/questionnaireStore.js +15 -2
- package/lib/stores/questionnaireStore.js.map +1 -1
- package/lib/stores/rendererStylingStore.d.ts +144 -0
- package/lib/stores/rendererStylingStore.js +68 -0
- package/lib/stores/rendererStylingStore.js.map +1 -0
- package/lib/stories/storybookWrappers/InitialiseFormWrapperForStorybook.d.ts +30 -0
- package/lib/stories/storybookWrappers/InitialiseFormWrapperForStorybook.js +46 -0
- package/lib/stories/storybookWrappers/InitialiseFormWrapperForStorybook.js.map +1 -0
- package/lib/stories/storybookWrappers/index.d.ts +2 -0
- package/lib/stories/storybookWrappers/index.js +18 -0
- package/lib/stories/storybookWrappers/index.js.map +1 -0
- package/lib/stories/testUtils.d.ts +23 -0
- package/lib/stories/testUtils.js +249 -0
- package/lib/stories/testUtils.js.map +1 -0
- package/lib/theme/Theme.d.ts +44 -0
- package/lib/theme/Theme.js +45 -0
- package/lib/theme/Theme.js.map +1 -0
- package/lib/theme/customGlobalStyles.d.ts +2 -0
- package/lib/theme/customGlobalStyles.js +61 -0
- package/lib/theme/customGlobalStyles.js.map +1 -0
- package/lib/theme/overrides/Accordion.d.ts +14 -0
- package/lib/theme/overrides/Accordion.js +32 -0
- package/lib/theme/overrides/Accordion.js.map +1 -0
- package/lib/theme/overrides/Autocomplete.d.ts +10 -0
- package/lib/theme/overrides/Autocomplete.js +28 -0
- package/lib/theme/overrides/Autocomplete.js.map +1 -0
- package/lib/theme/overrides/Button.d.ts +33 -0
- package/lib/theme/overrides/Button.js +52 -0
- package/lib/theme/overrides/Button.js.map +1 -0
- package/lib/theme/overrides/Card.d.ts +35 -0
- package/lib/theme/overrides/Card.js +49 -0
- package/lib/theme/overrides/Card.js.map +1 -0
- package/lib/theme/overrides/Input.d.ts +64 -0
- package/lib/theme/overrides/Input.js +81 -0
- package/lib/theme/overrides/Input.js.map +1 -0
- package/lib/theme/overrides/Overrides.d.ts +3 -0
- package/lib/theme/overrides/Overrides.js +29 -0
- package/lib/theme/overrides/Overrides.js.map +1 -0
- package/lib/theme/overrides/Paper.d.ts +12 -0
- package/lib/theme/overrides/Paper.js +31 -0
- package/lib/theme/overrides/Paper.js.map +1 -0
- package/lib/theme/overrides/SpeedDial.d.ts +16 -0
- package/lib/theme/overrides/SpeedDial.js +34 -0
- package/lib/theme/overrides/SpeedDial.js.map +1 -0
- package/lib/theme/overrides/Table.d.ts +12 -0
- package/lib/theme/overrides/Table.js +30 -0
- package/lib/theme/overrides/Table.js.map +1 -0
- package/lib/theme/palette.d.ts +27 -0
- package/lib/theme/palette.js +67 -0
- package/lib/theme/palette.js.map +1 -0
- package/lib/theme/shadows.d.ts +2 -0
- package/lib/theme/shadows.js +52 -0
- package/lib/theme/shadows.js.map +1 -0
- package/lib/utils/answerExpression.d.ts +18 -0
- package/lib/utils/answerExpression.js +133 -0
- package/lib/utils/answerExpression.js.map +1 -0
- package/lib/utils/calculatedExpression.js +1 -5
- package/lib/utils/calculatedExpression.js.map +1 -1
- package/lib/utils/dayjsExtend.d.ts +1 -0
- package/lib/utils/dayjsExtend.js +22 -0
- package/lib/utils/dayjsExtend.js.map +1 -0
- package/lib/utils/dynamicValueSet.d.ts +5 -0
- package/lib/utils/dynamicValueSet.js +96 -0
- package/lib/utils/dynamicValueSet.js.map +1 -0
- package/lib/utils/extensions.d.ts +2 -2
- package/lib/utils/extensions.js +2 -2
- package/lib/utils/extensions.js.map +1 -1
- package/lib/utils/fhirpathAsyncUtils/fhirpath-async.d.ts +14 -0
- package/lib/utils/fhirpathAsyncUtils/fhirpath-async.js +639 -0
- package/lib/utils/fhirpathAsyncUtils/fhirpath-async.js.map +1 -0
- package/lib/utils/fhirpathAsyncUtils/outcome-utils.d.ts +3 -0
- package/lib/utils/fhirpathAsyncUtils/outcome-utils.js +41 -0
- package/lib/utils/fhirpathAsyncUtils/outcome-utils.js.map +1 -0
- package/lib/utils/itemControl.d.ts +97 -0
- package/lib/utils/itemControl.js +336 -0
- package/lib/utils/itemControl.js.map +1 -0
- package/lib/utils/itemPath.d.ts +57 -0
- package/lib/utils/itemPath.js +75 -0
- package/lib/utils/itemPath.js.map +1 -0
- package/lib/utils/manageForm.js +5 -4
- package/lib/utils/manageForm.js.map +1 -1
- package/lib/utils/qrItem.d.ts +6 -0
- package/lib/utils/qrItem.js +11 -0
- package/lib/utils/qrItem.js.map +1 -1
- package/lib/utils/questionnaireStoreUtils/addAdditionalVariables.d.ts +2 -0
- package/lib/utils/questionnaireStoreUtils/addAdditionalVariables.js +43 -0
- package/lib/utils/questionnaireStoreUtils/addAdditionalVariables.js.map +1 -0
- package/lib/utils/questionnaireStoreUtils/createQuestionaireModel.d.ts +3 -0
- package/lib/utils/questionnaireStoreUtils/createQuestionaireModel.js +101 -0
- package/lib/utils/questionnaireStoreUtils/createQuestionaireModel.js.map +1 -0
- package/lib/utils/validateQuestionnaire.d.ts +66 -0
- package/lib/utils/validateQuestionnaire.js +559 -0
- package/lib/utils/validateQuestionnaire.js.map +1 -0
- package/package.json +2 -2
- package/src/components/FormComponents/AttachmentItem/AttachmentItem.tsx +2 -2
- package/src/components/FormComponents/BooleanItem/BooleanItem.tsx +2 -2
- package/src/components/FormComponents/ChoiceItems/CheckboxOptionList.tsx +5 -1
- package/src/components/FormComponents/ChoiceItems/ChoiceAutocompleteField.tsx +5 -0
- package/src/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.tsx +6 -4
- package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.tsx +2 -2
- package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.tsx +2 -2
- package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.tsx +2 -2
- package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.tsx +2 -2
- package/src/components/FormComponents/ChoiceItems/ChoiceRadioSingle.tsx +1 -1
- package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.tsx +93 -4
- package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.tsx +2 -2
- package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.tsx +4 -2
- package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.tsx +2 -2
- package/src/components/FormComponents/DateTimeItems/CustomDateItem/CustomDateItem.tsx +2 -2
- package/src/components/FormComponents/DateTimeItems/CustomDateTimeItem/CustomDateTimeItem.tsx +2 -2
- package/src/components/FormComponents/DateTimeItems/CustomDateTimeItem/CustomTimeField.tsx +3 -1
- package/src/components/FormComponents/DecimalItem/DecimalItem.tsx +2 -2
- package/src/components/FormComponents/GroupItem/GroupItemView.tsx +1 -1
- package/src/components/FormComponents/IntegerItem/IntegerItem.tsx +2 -2
- package/src/components/FormComponents/ItemParts/CheckboxSingle.tsx +4 -2
- package/src/components/FormComponents/ItemParts/ItemLabel.tsx +1 -8
- package/src/components/FormComponents/ItemParts/ItemTextSwitcher.tsx +3 -25
- package/src/components/FormComponents/ItemParts/RadioOptionList.tsx +4 -1
- package/src/components/FormComponents/ItemParts/StyledText.tsx +46 -0
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.tsx +4 -0
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.tsx +6 -3
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.tsx +2 -2
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerValueSetItem.tsx +2 -2
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.tsx +2 -2
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerValueSetItem.tsx +2 -2
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.tsx +86 -3
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.tsx +6 -4
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.tsx +4 -0
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.tsx +6 -4
- package/src/components/FormComponents/QuantityItem/QuantityItem.tsx +2 -2
- package/src/components/FormComponents/SliderItem/SliderItem.tsx +2 -2
- package/src/components/FormComponents/StringItem/StringItem.tsx +2 -2
- package/src/components/FormComponents/TextItem/TextItem.tsx +2 -2
- package/src/components/FormComponents/TimeItem/TimeItem.tsx +2 -2
- package/src/components/FormComponents/UrlItem/UrlItem.tsx +2 -2
- package/src/hooks/useCalculatedExpressionUpdated.ts +25 -11
- package/src/hooks/useParseXhtml.tsx +9 -6
- package/src/stores/questionnaireStore.ts +23 -0
- package/src/utils/calculatedExpression.ts +1 -5
- package/src/utils/extensions.ts +9 -3
- package/src/utils/manageForm.ts +10 -9
- package/src/utils/qrItem.ts +12 -0
|
@@ -36,6 +36,7 @@ import type {
|
|
|
36
36
|
import type { AlertColor } from '@mui/material/Alert';
|
|
37
37
|
import { useRendererConfigStore } from '../../../stores';
|
|
38
38
|
import DisplayUnitText from '../ItemParts/DisplayUnitText';
|
|
39
|
+
import ExpressionUpdateFadingIcon from '../ItemParts/ExpressionUpdateFadingIcon';
|
|
39
40
|
|
|
40
41
|
interface ChoiceAutocompleteFieldsProps
|
|
41
42
|
extends PropsWithIsTabledAttribute,
|
|
@@ -47,6 +48,8 @@ interface ChoiceAutocompleteFieldsProps
|
|
|
47
48
|
loading: boolean;
|
|
48
49
|
feedback: { message: string; color: AlertColor } | null;
|
|
49
50
|
readOnly: boolean;
|
|
51
|
+
calcExpUpdated: boolean;
|
|
52
|
+
|
|
50
53
|
onInputChange: (newInput: string) => void;
|
|
51
54
|
onValueChange: (newValue: Coding | null) => void;
|
|
52
55
|
}
|
|
@@ -59,6 +62,7 @@ function ChoiceAutocompleteField(props: ChoiceAutocompleteFieldsProps) {
|
|
|
59
62
|
loading,
|
|
60
63
|
feedback,
|
|
61
64
|
readOnly,
|
|
65
|
+
calcExpUpdated,
|
|
62
66
|
isTabled,
|
|
63
67
|
renderingExtensions,
|
|
64
68
|
onInputChange,
|
|
@@ -123,6 +127,7 @@ function ChoiceAutocompleteField(props: ChoiceAutocompleteFieldsProps) {
|
|
|
123
127
|
</Tooltip>
|
|
124
128
|
</Fade>
|
|
125
129
|
) : null}
|
|
130
|
+
<ExpressionUpdateFadingIcon fadeIn={calcExpUpdated} disabled={readOnly} />
|
|
126
131
|
{params.InputProps.endAdornment}
|
|
127
132
|
<DisplayUnitText readOnly={readOnly}>{displayUnit}</DisplayUnitText>
|
|
128
133
|
</>
|
|
@@ -26,7 +26,7 @@ import useValidationFeedback from '../../../hooks/useValidationFeedback';
|
|
|
26
26
|
import type { BaseItemProps } from '../../../interfaces/renderProps.interface';
|
|
27
27
|
import { useQuestionnaireStore } from '../../../stores';
|
|
28
28
|
import { AUTOCOMPLETE_DEBOUNCE_DURATION } from '../../../utils/debounce';
|
|
29
|
-
import { createEmptyQrItem } from '../../../utils/qrItem';
|
|
29
|
+
import { createEmptyQrItem, getQRItemId } from '../../../utils/qrItem';
|
|
30
30
|
import { FullWidthFormComponentBox } from '../../Box.styles';
|
|
31
31
|
import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
|
|
32
32
|
import ItemLabel from '../ItemParts/ItemLabel';
|
|
@@ -41,14 +41,14 @@ function ChoiceAutocompleteItem(props: BaseItemProps) {
|
|
|
41
41
|
renderingExtensions,
|
|
42
42
|
parentIsReadOnly,
|
|
43
43
|
feedbackFromParent,
|
|
44
|
-
onQrItemChange
|
|
44
|
+
onQrItemChange,
|
|
45
|
+
calcExpUpdated
|
|
45
46
|
} = props;
|
|
46
|
-
// TODO no calcExpUpdated
|
|
47
47
|
|
|
48
48
|
const onFocusLinkId = useQuestionnaireStore.use.onFocusLinkId();
|
|
49
49
|
|
|
50
50
|
// Init input value
|
|
51
|
-
const answerKey = qrItem?.answer?.[0]?.id;
|
|
51
|
+
const answerKey = getQRItemId(qrItem?.answer?.[0]?.id);
|
|
52
52
|
const qrChoice = qrItem ?? createEmptyQrItem(qItem, answerKey);
|
|
53
53
|
|
|
54
54
|
let valueCoding: Coding | undefined;
|
|
@@ -108,6 +108,7 @@ function ChoiceAutocompleteItem(props: BaseItemProps) {
|
|
|
108
108
|
loading={loading}
|
|
109
109
|
feedback={feedback}
|
|
110
110
|
readOnly={readOnly}
|
|
111
|
+
calcExpUpdated={calcExpUpdated}
|
|
111
112
|
isTabled={isTabled}
|
|
112
113
|
renderingExtensions={renderingExtensions}
|
|
113
114
|
onInputChange={setInput}
|
|
@@ -134,6 +135,7 @@ function ChoiceAutocompleteItem(props: BaseItemProps) {
|
|
|
134
135
|
loading={loading}
|
|
135
136
|
feedback={feedback}
|
|
136
137
|
readOnly={readOnly}
|
|
138
|
+
calcExpUpdated={calcExpUpdated}
|
|
137
139
|
isTabled={isTabled}
|
|
138
140
|
renderingExtensions={renderingExtensions}
|
|
139
141
|
onInputChange={setInput}
|
|
@@ -21,7 +21,7 @@ import useValidationFeedback from '../../../hooks/useValidationFeedback';
|
|
|
21
21
|
import type { BaseItemProps } from '../../../interfaces/renderProps.interface';
|
|
22
22
|
import { useQuestionnaireStore } from '../../../stores';
|
|
23
23
|
import { updateChoiceCheckboxAnswers } from '../../../utils/choice';
|
|
24
|
-
import { createEmptyQrItem } from '../../../utils/qrItem';
|
|
24
|
+
import { createEmptyQrItem, getQRItemId } from '../../../utils/qrItem';
|
|
25
25
|
import { FullWidthFormComponentBox } from '../../Box.styles';
|
|
26
26
|
import DisplayInstructions from '../DisplayItem/DisplayInstructions';
|
|
27
27
|
import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
|
|
@@ -44,7 +44,7 @@ function ChoiceCheckboxAnswerOptionItem(props: BaseItemProps) {
|
|
|
44
44
|
const onFocusLinkId = useQuestionnaireStore.use.onFocusLinkId();
|
|
45
45
|
|
|
46
46
|
// Init input value
|
|
47
|
-
const answerKey = qrItem?.answer?.[0]?.id;
|
|
47
|
+
const answerKey = getQRItemId(qrItem?.answer?.[0]?.id);
|
|
48
48
|
const qrChoiceCheckbox = qrItem ?? createEmptyQrItem(qItem, answerKey);
|
|
49
49
|
const answers = qrChoiceCheckbox.answer ?? [];
|
|
50
50
|
|
|
@@ -23,7 +23,7 @@ import useValueSetCodings from '../../../hooks/useValueSetCodings';
|
|
|
23
23
|
import type { BaseItemProps } from '../../../interfaces/renderProps.interface';
|
|
24
24
|
import { useQuestionnaireStore } from '../../../stores';
|
|
25
25
|
import { convertCodingsToAnswerOptions, updateChoiceCheckboxAnswers } from '../../../utils/choice';
|
|
26
|
-
import { createEmptyQrItem } from '../../../utils/qrItem';
|
|
26
|
+
import { createEmptyQrItem, getQRItemId } from '../../../utils/qrItem';
|
|
27
27
|
import { FullWidthFormComponentBox } from '../../Box.styles';
|
|
28
28
|
import DisplayInstructions from '../DisplayItem/DisplayInstructions';
|
|
29
29
|
import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
|
|
@@ -46,7 +46,7 @@ function ChoiceCheckboxAnswerValueSetItem(props: BaseItemProps) {
|
|
|
46
46
|
const onFocusLinkId = useQuestionnaireStore.use.onFocusLinkId();
|
|
47
47
|
|
|
48
48
|
// Init input value
|
|
49
|
-
const answerKey = qrItem?.answer?.[0]?.id;
|
|
49
|
+
const answerKey = getQRItemId(qrItem?.answer?.[0]?.id);
|
|
50
50
|
const qrChoiceCheckbox = qrItem ?? createEmptyQrItem(qItem, answerKey);
|
|
51
51
|
const answers = qrChoiceCheckbox.answer ?? [];
|
|
52
52
|
|
|
@@ -24,7 +24,7 @@ import { ChoiceItemControl } from '../../../interfaces/choice.enum';
|
|
|
24
24
|
import type { BaseItemProps } from '../../../interfaces/renderProps.interface';
|
|
25
25
|
import { useQuestionnaireStore } from '../../../stores';
|
|
26
26
|
import { findInAnswerOptions, getChoiceControlType, getQrChoiceValue } from '../../../utils/choice';
|
|
27
|
-
import { createEmptyQrItem } from '../../../utils/qrItem';
|
|
27
|
+
import { createEmptyQrItem, getQRItemId } from '../../../utils/qrItem';
|
|
28
28
|
import ChoiceRadioAnswerOptionView from './ChoiceRadioAnswerOptionView';
|
|
29
29
|
import ChoiceSelectAnswerOptionView from './ChoiceSelectAnswerOptionView';
|
|
30
30
|
|
|
@@ -44,7 +44,7 @@ function ChoiceRadioAnswerOptionItem(props: BaseItemProps) {
|
|
|
44
44
|
const onFocusLinkId = useQuestionnaireStore.use.onFocusLinkId();
|
|
45
45
|
|
|
46
46
|
// Init input value
|
|
47
|
-
const answerKey = qrItem?.answer?.[0]?.id;
|
|
47
|
+
const answerKey = getQRItemId(qrItem?.answer?.[0]?.id);
|
|
48
48
|
const qrChoice = qrItem ?? createEmptyQrItem(qItem, answerKey);
|
|
49
49
|
const valueChoice = getQrChoiceValue(qrChoice);
|
|
50
50
|
|
|
@@ -23,7 +23,7 @@ import useValueSetCodings from '../../../hooks/useValueSetCodings';
|
|
|
23
23
|
import type { BaseItemProps } from '../../../interfaces/renderProps.interface';
|
|
24
24
|
import { useQuestionnaireStore } from '../../../stores';
|
|
25
25
|
import { convertCodingsToAnswerOptions, findInAnswerOptions } from '../../../utils/choice';
|
|
26
|
-
import { createEmptyQrItem } from '../../../utils/qrItem';
|
|
26
|
+
import { createEmptyQrItem, getQRItemId } from '../../../utils/qrItem';
|
|
27
27
|
import { FullWidthFormComponentBox } from '../../Box.styles';
|
|
28
28
|
import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
|
|
29
29
|
import ItemLabel from '../ItemParts/ItemLabel';
|
|
@@ -44,7 +44,7 @@ function ChoiceRadioAnswerValueSetItem(props: BaseItemProps) {
|
|
|
44
44
|
const onFocusLinkId = useQuestionnaireStore.use.onFocusLinkId();
|
|
45
45
|
|
|
46
46
|
// Init input value
|
|
47
|
-
const answerKey = qrItem?.answer?.[0]?.id;
|
|
47
|
+
const answerKey = getQRItemId(qrItem?.answer?.[0]?.id);
|
|
48
48
|
const qrChoiceRadio = qrItem ?? createEmptyQrItem(qItem, answerKey);
|
|
49
49
|
|
|
50
50
|
let valueRadio: string | null = null;
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
+
import React from 'react';
|
|
18
19
|
import Autocomplete from '@mui/material/Autocomplete';
|
|
19
20
|
import type { QuestionnaireItem, QuestionnaireItemAnswerOption } from 'fhir/r4';
|
|
20
21
|
import type {
|
|
@@ -28,6 +29,7 @@ import { StyledRequiredTypography } from '../Item.styles';
|
|
|
28
29
|
import DisplayUnitText from '../ItemParts/DisplayUnitText';
|
|
29
30
|
import ExpressionUpdateFadingIcon from '../ItemParts/ExpressionUpdateFadingIcon';
|
|
30
31
|
import { StandardTextField } from '../Textfield.styles';
|
|
32
|
+
import StyledText from '../ItemParts/StyledText';
|
|
31
33
|
|
|
32
34
|
interface ChoiceSelectAnswerOptionFieldsProps
|
|
33
35
|
extends PropsWithIsTabledAttribute,
|
|
@@ -61,6 +63,12 @@ function ChoiceSelectAnswerOptionFields(props: ChoiceSelectAnswerOptionFieldsPro
|
|
|
61
63
|
|
|
62
64
|
const { displayUnit, displayPrompt, entryFormat } = renderingExtensions;
|
|
63
65
|
|
|
66
|
+
const [inputValue, setInputValue] = React.useState('');
|
|
67
|
+
|
|
68
|
+
// Keep track of current selected value when input is changed
|
|
69
|
+
const [currentValueSelect, setCurrentValueSelect] =
|
|
70
|
+
React.useState<QuestionnaireItemAnswerOption | null>(valueSelect);
|
|
71
|
+
|
|
64
72
|
return (
|
|
65
73
|
<>
|
|
66
74
|
<Autocomplete
|
|
@@ -70,15 +78,50 @@ function ChoiceSelectAnswerOptionFields(props: ChoiceSelectAnswerOptionFieldsPro
|
|
|
70
78
|
getOptionDisabled={(option) => isOptionDisabled(option, answerOptionsToggleExpressionsMap)}
|
|
71
79
|
getOptionLabel={(option) => getAnswerOptionLabel(option)}
|
|
72
80
|
isOptionEqualToValue={(option, value) => compareAnswerOptionValue(option, value)}
|
|
73
|
-
onChange={(_, newValue) =>
|
|
81
|
+
onChange={(_, newValue) => {
|
|
82
|
+
onSelectChange(newValue);
|
|
83
|
+
setCurrentValueSelect(newValue);
|
|
84
|
+
}}
|
|
85
|
+
inputValue={inputValue}
|
|
86
|
+
onInputChange={(_, newInputValue, reason) => {
|
|
87
|
+
if (!inputValue && valueSelect && reason !== 'clear') {
|
|
88
|
+
// Convert current input value to be the current value plus additional input
|
|
89
|
+
onSelectChange(null);
|
|
90
|
+
setInputValue(getAnswerOptionLabel(valueSelect) + newInputValue);
|
|
91
|
+
} else {
|
|
92
|
+
setInputValue(newInputValue);
|
|
93
|
+
}
|
|
94
|
+
}}
|
|
95
|
+
onBlur={() => {
|
|
96
|
+
// Set value on blur if there is any current input
|
|
97
|
+
if (currentValueSelect) {
|
|
98
|
+
onSelectChange(currentValueSelect);
|
|
99
|
+
setInputValue(''); // Clear input after blur
|
|
100
|
+
}
|
|
101
|
+
}}
|
|
102
|
+
onKeyDown={(e) => {
|
|
103
|
+
if (e.key === 'Backspace') {
|
|
104
|
+
if (!inputValue && valueSelect) {
|
|
105
|
+
// Convert current selection to input value on backspace when input is empty
|
|
106
|
+
onSelectChange(null);
|
|
107
|
+
setInputValue(getAnswerOptionLabel(valueSelect));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}}
|
|
74
111
|
autoHighlight
|
|
75
|
-
sx={{
|
|
112
|
+
sx={{
|
|
113
|
+
maxWidth: !isTabled ? textFieldWidth : 3000,
|
|
114
|
+
minWidth: 160,
|
|
115
|
+
flexGrow: 1,
|
|
116
|
+
'& .MuiAutocomplete-tag': {
|
|
117
|
+
mx: 0
|
|
118
|
+
}
|
|
119
|
+
}}
|
|
76
120
|
size="small"
|
|
77
121
|
disabled={readOnly && readOnlyVisualStyle === 'disabled'}
|
|
78
122
|
readOnly={readOnly && readOnlyVisualStyle === 'readonly'}
|
|
79
123
|
renderInput={(params) => (
|
|
80
124
|
<StandardTextField
|
|
81
|
-
multiline
|
|
82
125
|
textFieldWidth={textFieldWidth}
|
|
83
126
|
isTabled={isTabled}
|
|
84
127
|
placeholder={entryFormat || displayPrompt}
|
|
@@ -93,11 +136,57 @@ function ChoiceSelectAnswerOptionFields(props: ChoiceSelectAnswerOptionFieldsPro
|
|
|
93
136
|
<ExpressionUpdateFadingIcon fadeIn={expressionUpdated} disabled={readOnly} />
|
|
94
137
|
<DisplayUnitText readOnly={readOnly}>{displayUnit}</DisplayUnitText>
|
|
95
138
|
</>
|
|
96
|
-
)
|
|
139
|
+
),
|
|
140
|
+
sx: {
|
|
141
|
+
'&.MuiOutlinedInput-root.MuiInputBase-sizeSmall .MuiAutocomplete-input': {
|
|
142
|
+
paddingLeft: '0px'
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
inputProps: {
|
|
146
|
+
...params.inputProps,
|
|
147
|
+
...(isTabled
|
|
148
|
+
? { 'aria-label': qItem.text ?? 'Unnamed choice dropdown' }
|
|
149
|
+
: { 'aria-labelledby': `label-${qItem.linkId}` }),
|
|
150
|
+
role: 'combobox'
|
|
151
|
+
}
|
|
97
152
|
}
|
|
98
153
|
}}
|
|
99
154
|
/>
|
|
100
155
|
)}
|
|
156
|
+
renderOption={(optionProps, option) => {
|
|
157
|
+
const { key, ...rest } = optionProps;
|
|
158
|
+
return (
|
|
159
|
+
<li key={key} {...rest}>
|
|
160
|
+
<span>
|
|
161
|
+
{option.valueString ? (
|
|
162
|
+
<StyledText
|
|
163
|
+
textToDisplay={getAnswerOptionLabel(option)}
|
|
164
|
+
element={option._valueString}
|
|
165
|
+
/>
|
|
166
|
+
) : (
|
|
167
|
+
getAnswerOptionLabel(option)
|
|
168
|
+
)}
|
|
169
|
+
</span>
|
|
170
|
+
</li>
|
|
171
|
+
);
|
|
172
|
+
}}
|
|
173
|
+
renderValue={(value, getItemProps) => {
|
|
174
|
+
const selectedOption = options.find((opt) => opt.valueString === value.valueString);
|
|
175
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
176
|
+
const { onDelete, ...rest } = getItemProps();
|
|
177
|
+
return (
|
|
178
|
+
<span {...rest}>
|
|
179
|
+
{value.valueString && selectedOption ? (
|
|
180
|
+
<StyledText
|
|
181
|
+
textToDisplay={getAnswerOptionLabel(value)}
|
|
182
|
+
element={selectedOption._valueString}
|
|
183
|
+
/>
|
|
184
|
+
) : (
|
|
185
|
+
getAnswerOptionLabel(value)
|
|
186
|
+
)}
|
|
187
|
+
</span>
|
|
188
|
+
);
|
|
189
|
+
}}
|
|
101
190
|
/>
|
|
102
191
|
|
|
103
192
|
{feedback ? <StyledRequiredTypography>{feedback}</StyledRequiredTypography> : null}
|
|
@@ -22,7 +22,7 @@ import useValidationFeedback from '../../../hooks/useValidationFeedback';
|
|
|
22
22
|
import type { BaseItemProps } from '../../../interfaces/renderProps.interface';
|
|
23
23
|
import { useQuestionnaireStore } from '../../../stores';
|
|
24
24
|
import { findInAnswerOptions, getQrChoiceValue } from '../../../utils/choice';
|
|
25
|
-
import { createEmptyQrItem } from '../../../utils/qrItem';
|
|
25
|
+
import { createEmptyQrItem, getQRItemId } from '../../../utils/qrItem';
|
|
26
26
|
import ChoiceSelectAnswerOptionView from './ChoiceSelectAnswerOptionView';
|
|
27
27
|
|
|
28
28
|
function ChoiceSelectAnswerOptionItem(props: BaseItemProps) {
|
|
@@ -46,7 +46,7 @@ function ChoiceSelectAnswerOptionItem(props: BaseItemProps) {
|
|
|
46
46
|
const feedback = useValidationFeedback(qItem, feedbackFromParent);
|
|
47
47
|
|
|
48
48
|
// Init input value
|
|
49
|
-
const answerKey = qrItem?.answer?.[0]?.id;
|
|
49
|
+
const answerKey = getQRItemId(qrItem?.answer?.[0]?.id);
|
|
50
50
|
const qrChoice = qrItem ?? createEmptyQrItem(qItem, answerKey);
|
|
51
51
|
const valueChoice = getQrChoiceValue(qrChoice);
|
|
52
52
|
|
|
@@ -85,7 +85,6 @@ function ChoiceSelectAnswerValueSetFields(props: ChoiceSelectAnswerValueSetField
|
|
|
85
85
|
readOnly={readOnly && readOnlyVisualStyle === 'readonly'}
|
|
86
86
|
renderInput={(params) => (
|
|
87
87
|
<StandardTextField
|
|
88
|
-
multiline
|
|
89
88
|
textFieldWidth={textFieldWidth}
|
|
90
89
|
isTabled={isTabled}
|
|
91
90
|
placeholder={entryFormat || displayPrompt}
|
|
@@ -103,7 +102,10 @@ function ChoiceSelectAnswerValueSetFields(props: ChoiceSelectAnswerValueSetField
|
|
|
103
102
|
),
|
|
104
103
|
inputProps: {
|
|
105
104
|
...params.inputProps,
|
|
106
|
-
|
|
105
|
+
...(isTabled
|
|
106
|
+
? { 'aria-label': qItem.text ?? 'Unnamed choice dropdown' }
|
|
107
|
+
: { 'aria-labelledby': `label-${qItem.linkId}` }),
|
|
108
|
+
role: 'combobox'
|
|
107
109
|
}
|
|
108
110
|
}
|
|
109
111
|
}}
|
|
@@ -24,7 +24,7 @@ import useValidationFeedback from '../../../hooks/useValidationFeedback';
|
|
|
24
24
|
import useValueSetCodings from '../../../hooks/useValueSetCodings';
|
|
25
25
|
import type { BaseItemProps } from '../../../interfaces/renderProps.interface';
|
|
26
26
|
import { useQuestionnaireStore } from '../../../stores';
|
|
27
|
-
import { createEmptyQrItem } from '../../../utils/qrItem';
|
|
27
|
+
import { createEmptyQrItem, getQRItemId } from '../../../utils/qrItem';
|
|
28
28
|
import { FullWidthFormComponentBox } from '../../Box.styles';
|
|
29
29
|
import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
|
|
30
30
|
import ItemLabel from '../ItemParts/ItemLabel';
|
|
@@ -46,7 +46,7 @@ function ChoiceSelectAnswerValueSetItem(props: BaseItemProps) {
|
|
|
46
46
|
const onFocusLinkId = useQuestionnaireStore.use.onFocusLinkId();
|
|
47
47
|
|
|
48
48
|
// Init input value
|
|
49
|
-
const answerKey = qrItem?.answer?.[0]?.id;
|
|
49
|
+
const answerKey = getQRItemId(qrItem?.answer?.[0]?.id);
|
|
50
50
|
const qrChoiceSelect = qrItem ?? createEmptyQrItem(qItem, answerKey);
|
|
51
51
|
|
|
52
52
|
let valueCoding: Coding | null = null;
|
|
@@ -20,7 +20,7 @@ import useDateValidation from '../../../../hooks/useDateValidation';
|
|
|
20
20
|
import useReadOnly from '../../../../hooks/useReadOnly';
|
|
21
21
|
import type { BaseItemProps } from '../../../../interfaces/renderProps.interface';
|
|
22
22
|
import { useQuestionnaireStore } from '../../../../stores';
|
|
23
|
-
import { createEmptyQrItem } from '../../../../utils/qrItem';
|
|
23
|
+
import { createEmptyQrItem, getQRItemId } from '../../../../utils/qrItem';
|
|
24
24
|
import { FullWidthFormComponentBox } from '../../../Box.styles';
|
|
25
25
|
import ItemFieldGrid from '../../ItemParts/ItemFieldGrid';
|
|
26
26
|
import ItemLabel from '../../ItemParts/ItemLabel';
|
|
@@ -49,7 +49,7 @@ function CustomDateItem(props: BaseItemProps) {
|
|
|
49
49
|
const { displayPrompt, entryFormat } = renderingExtensions;
|
|
50
50
|
|
|
51
51
|
// Init input value
|
|
52
|
-
const answerKey = qrItem?.answer?.[0]?.id;
|
|
52
|
+
const answerKey = getQRItemId(qrItem?.answer?.[0]?.id);
|
|
53
53
|
const qrDate = qrItem ?? createEmptyQrItem(qItem, answerKey);
|
|
54
54
|
let valueDate: string = '';
|
|
55
55
|
if (qrDate.answer) {
|
package/src/components/FormComponents/DateTimeItems/CustomDateTimeItem/CustomDateTimeItem.tsx
CHANGED
|
@@ -25,7 +25,7 @@ import useReadOnly from '../../../../hooks/useReadOnly';
|
|
|
25
25
|
import useTimeValidation from '../../../../hooks/useTimeValidation';
|
|
26
26
|
import type { BaseItemProps } from '../../../../interfaces/renderProps.interface';
|
|
27
27
|
import { useQuestionnaireStore } from '../../../../stores';
|
|
28
|
-
import { createEmptyQrItem } from '../../../../utils/qrItem';
|
|
28
|
+
import { createEmptyQrItem, getQRItemId } from '../../../../utils/qrItem';
|
|
29
29
|
import { FullWidthFormComponentBox } from '../../../Box.styles';
|
|
30
30
|
import ItemFieldGrid from '../../ItemParts/ItemFieldGrid';
|
|
31
31
|
import ItemLabel from '../../ItemParts/ItemLabel';
|
|
@@ -56,7 +56,7 @@ function CustomDateTimeItem(props: BaseItemProps) {
|
|
|
56
56
|
const { displayPrompt, entryFormat } = renderingExtensions;
|
|
57
57
|
|
|
58
58
|
// Init input value
|
|
59
|
-
const answerKey = qrItem?.answer?.[0]?.id;
|
|
59
|
+
const answerKey = getQRItemId(qrItem?.answer?.[0]?.id);
|
|
60
60
|
const qrDateTime = qrItem ?? createEmptyQrItem(qItem, answerKey);
|
|
61
61
|
|
|
62
62
|
// Store dateTime in FHIR and DayJs formats for downstream parsing
|
|
@@ -25,6 +25,7 @@ import type { PropsWithIsTabledAttribute } from '../../../../interfaces/renderPr
|
|
|
25
25
|
import { useRendererConfigStore } from '../../../../stores';
|
|
26
26
|
import FormControl from '@mui/material/FormControl';
|
|
27
27
|
import MuiTextField from '../../TextItem/MuiTextField';
|
|
28
|
+
import ExpressionUpdateFadingIcon from '../../ItemParts/ExpressionUpdateFadingIcon';
|
|
28
29
|
|
|
29
30
|
interface CustomTimeFieldProps extends PropsWithIsTabledAttribute {
|
|
30
31
|
linkId: string;
|
|
@@ -51,12 +52,12 @@ function CustomTimeField(props: CustomTimeFieldProps) {
|
|
|
51
52
|
feedback,
|
|
52
53
|
displayPrompt,
|
|
53
54
|
readOnly,
|
|
55
|
+
calcExpUpdated,
|
|
54
56
|
isPartOfDateTime,
|
|
55
57
|
isTabled,
|
|
56
58
|
onTimeInputChange,
|
|
57
59
|
onPeriodChange
|
|
58
60
|
} = props;
|
|
59
|
-
// TODO this component doesn't have a calcExpUpdated update animation
|
|
60
61
|
|
|
61
62
|
const readOnlyVisualStyle = useRendererConfigStore.use.readOnlyVisualStyle();
|
|
62
63
|
const textFieldWidth = useRendererConfigStore.use.textFieldWidth();
|
|
@@ -112,6 +113,7 @@ function CustomTimeField(props: CustomTimeFieldProps) {
|
|
|
112
113
|
<MenuItem value="PM">PM</MenuItem>
|
|
113
114
|
</Select>
|
|
114
115
|
</FormControl>
|
|
116
|
+
<ExpressionUpdateFadingIcon fadeIn={calcExpUpdated} disabled={readOnly} />
|
|
115
117
|
</Box>
|
|
116
118
|
<Typography component="span" variant="caption" color="error" sx={{ ml: 1.75, mt: -0.5 }}>
|
|
117
119
|
{feedback}
|
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
parseDecimalStringToFloat,
|
|
28
28
|
parseDecimalStringWithPrecision
|
|
29
29
|
} from '../../../utils/parseInputs';
|
|
30
|
-
import { createEmptyQrItem } from '../../../utils/qrItem';
|
|
30
|
+
import { createEmptyQrItem, getQRItemId } from '../../../utils/qrItem';
|
|
31
31
|
import { FullWidthFormComponentBox } from '../../Box.styles';
|
|
32
32
|
import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
|
|
33
33
|
import ItemLabel from '../ItemParts/ItemLabel';
|
|
@@ -53,7 +53,7 @@ function DecimalItem(props: BaseItemProps) {
|
|
|
53
53
|
const precision = getDecimalPrecision(qItem);
|
|
54
54
|
|
|
55
55
|
// Init input value
|
|
56
|
-
const answerKey = qrItem?.answer?.[0]?.id;
|
|
56
|
+
const answerKey = getQRItemId(qrItem?.answer?.[0]?.id);
|
|
57
57
|
const { initialInput } = readDecimalValue(qrItem, precision);
|
|
58
58
|
|
|
59
59
|
const [input, setInput] = useState(initialInput);
|
|
@@ -87,7 +87,7 @@ function GroupItemView(props: GroupItemViewProps) {
|
|
|
87
87
|
} = props;
|
|
88
88
|
|
|
89
89
|
// If XHTML has styles, pass them to the GroupItemView so it cna be applied down the tree
|
|
90
|
-
const xhtmlStyles = useParseXhtml(qItem)?.styles;
|
|
90
|
+
const xhtmlStyles = useParseXhtml(qItem._text, qItem.text)?.styles;
|
|
91
91
|
|
|
92
92
|
// Combine parent styles with this group's styles
|
|
93
93
|
const combinedStyles = React.useMemo(() => {
|
|
@@ -23,7 +23,7 @@ import type { BaseItemProps } from '../../../interfaces/renderProps.interface';
|
|
|
23
23
|
import { useQuestionnaireStore } from '../../../stores';
|
|
24
24
|
import { DEBOUNCE_DURATION } from '../../../utils/debounce';
|
|
25
25
|
import { parseIntegerString } from '../../../utils/parseInputs';
|
|
26
|
-
import { createEmptyQrItem } from '../../../utils/qrItem';
|
|
26
|
+
import { createEmptyQrItem, getQRItemId } from '../../../utils/qrItem';
|
|
27
27
|
import { FullWidthFormComponentBox } from '../../Box.styles';
|
|
28
28
|
import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
|
|
29
29
|
import ItemLabel from '../ItemParts/ItemLabel';
|
|
@@ -47,7 +47,7 @@ function IntegerItem(props: BaseItemProps) {
|
|
|
47
47
|
const onFocusLinkId = useQuestionnaireStore.use.onFocusLinkId();
|
|
48
48
|
|
|
49
49
|
// Init input value
|
|
50
|
-
const answerKey = qrItem?.answer?.[0]?.id;
|
|
50
|
+
const answerKey = getQRItemId(qrItem?.answer?.[0]?.id);
|
|
51
51
|
const { initialInput } = readIntegerValue(qrItem);
|
|
52
52
|
|
|
53
53
|
const [input, setInput] = useState(initialInput);
|
|
@@ -22,7 +22,8 @@ import { useRendererConfigStore } from '../../../stores';
|
|
|
22
22
|
|
|
23
23
|
interface CheckboxSingleProps {
|
|
24
24
|
value: string;
|
|
25
|
-
label:
|
|
25
|
+
label: React.ReactNode;
|
|
26
|
+
labelText?: string;
|
|
26
27
|
readOnly: boolean;
|
|
27
28
|
disabledViaToggleExpression: boolean;
|
|
28
29
|
fullWidth: boolean;
|
|
@@ -34,6 +35,7 @@ function CheckboxSingle(props: CheckboxSingleProps) {
|
|
|
34
35
|
const {
|
|
35
36
|
value,
|
|
36
37
|
label,
|
|
38
|
+
labelText,
|
|
37
39
|
readOnly,
|
|
38
40
|
disabledViaToggleExpression,
|
|
39
41
|
fullWidth,
|
|
@@ -80,7 +82,7 @@ function CheckboxSingle(props: CheckboxSingleProps) {
|
|
|
80
82
|
}}
|
|
81
83
|
slotProps={{
|
|
82
84
|
input: {
|
|
83
|
-
'aria-label': label ?? 'Unnamed checkbox'
|
|
85
|
+
'aria-label': (typeof label === 'string' ? label : labelText) ?? 'Unnamed checkbox'
|
|
84
86
|
}
|
|
85
87
|
}}
|
|
86
88
|
/>
|
|
@@ -27,8 +27,6 @@ import ItemTextSwitcher from './ItemTextSwitcher';
|
|
|
27
27
|
import Typography from '@mui/material/Typography';
|
|
28
28
|
import FlyoverItem from './FlyoverItem';
|
|
29
29
|
import type { PropsWithParentStylesAttribute } from '../../../interfaces/renderProps.interface';
|
|
30
|
-
import { structuredDataCapture } from 'fhir-sdc-helpers';
|
|
31
|
-
import { default as parseStyleToJs } from 'style-to-js';
|
|
32
30
|
|
|
33
31
|
interface ItemLabelProps extends PropsWithParentStylesAttribute {
|
|
34
32
|
qItem: QuestionnaireItem;
|
|
@@ -53,10 +51,6 @@ const ItemLabel = memo(function ItemLabel(props: ItemLabelProps) {
|
|
|
53
51
|
const readOnlyTextColor = readOnlyVisualStyle === 'disabled' ? 'text.disabled' : 'text.secondary';
|
|
54
52
|
const textColor = parentStyles?.color || (readOnly ? readOnlyTextColor : 'text.primary');
|
|
55
53
|
|
|
56
|
-
// Get styles from qItem._text
|
|
57
|
-
const stylesString = structuredDataCapture.getStyle(qItem._text);
|
|
58
|
-
const itemStyles = stylesString ? parseStyleToJs(stylesString) : {};
|
|
59
|
-
|
|
60
54
|
return (
|
|
61
55
|
<Box display="flex" alignItems="center" justifyContent="space-between">
|
|
62
56
|
<Box position="relative" display="flex" flexGrow={1} alignItems="center">
|
|
@@ -72,8 +66,7 @@ const ItemLabel = memo(function ItemLabel(props: ItemLabelProps) {
|
|
|
72
66
|
sx={{
|
|
73
67
|
mt: 0.5,
|
|
74
68
|
flexGrow: 1,
|
|
75
|
-
...(parentStyles || {})
|
|
76
|
-
...itemStyles
|
|
69
|
+
...(parentStyles || {})
|
|
77
70
|
}}>
|
|
78
71
|
{/* Required asterisk position is in front of text */}
|
|
79
72
|
{required && requiredIndicatorPosition === 'start' ? (
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import React, { memo } from 'react';
|
|
2
|
-
import ReactMarkdown from 'react-markdown';
|
|
3
|
-
import { getMarkdownString } from '../../../utils/extensions';
|
|
4
|
-
import { useParseXhtml } from '../../../hooks/useParseXhtml';
|
|
5
2
|
import useDisplayCqfAndCalculatedExpression from '../../../hooks/useDisplayCqfAndCalculatedExpression';
|
|
6
3
|
import type { QuestionnaireItem } from 'fhir/r4';
|
|
7
4
|
import { getItemTextToDisplay } from '../../../utils/itemTextToDisplay';
|
|
5
|
+
import StyledText from './StyledText';
|
|
8
6
|
|
|
9
7
|
interface ItemTextSwitcherProps {
|
|
10
8
|
qItem: QuestionnaireItem;
|
|
@@ -24,29 +22,9 @@ const ItemTextSwitcher = memo(function ItemTextSwitcher({ qItem }: ItemTextSwitc
|
|
|
24
22
|
const itemTextAriaLabel =
|
|
25
23
|
useDisplayCqfAndCalculatedExpression(qItem, 'item._text.aria-label') ?? undefined;
|
|
26
24
|
|
|
27
|
-
|
|
28
|
-
const parsedXhtml = useParseXhtml(qItem);
|
|
29
|
-
if (parsedXhtml) {
|
|
30
|
-
return <span aria-label={itemTextAriaLabel}>{parsedXhtml.content}</span>;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// parse markdown if found
|
|
34
|
-
const markdownString = getMarkdownString(qItem);
|
|
35
|
-
if (markdownString) {
|
|
36
|
-
return (
|
|
37
|
-
<span aria-label={itemTextAriaLabel}>
|
|
38
|
-
<ReactMarkdown>{markdownString}</ReactMarkdown>
|
|
39
|
-
</span>
|
|
40
|
-
);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// labelText is empty, return null
|
|
44
|
-
if (!itemTextToDisplay) {
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
25
|
+
const content = <StyledText textToDisplay={itemTextToDisplay} element={qItem._text} />;
|
|
47
26
|
|
|
48
|
-
|
|
49
|
-
return <span aria-label={itemTextAriaLabel}>{itemTextToDisplay}</span>;
|
|
27
|
+
return content ? <span aria-label={itemTextAriaLabel}>{content}</span> : null;
|
|
50
28
|
});
|
|
51
29
|
|
|
52
30
|
export default ItemTextSwitcher;
|
|
@@ -19,6 +19,7 @@ import React from 'react';
|
|
|
19
19
|
import ChoiceRadioSingle from '../ChoiceItems/ChoiceRadioSingle';
|
|
20
20
|
import type { QuestionnaireItemAnswerOption } from 'fhir/r4';
|
|
21
21
|
import { isOptionDisabled } from '../../../utils/choice';
|
|
22
|
+
import StyledText from './StyledText';
|
|
22
23
|
|
|
23
24
|
interface RadioOptionListProps {
|
|
24
25
|
options: QuestionnaireItemAnswerOption[];
|
|
@@ -56,7 +57,9 @@ function RadioOptionList(props: RadioOptionListProps) {
|
|
|
56
57
|
<ChoiceRadioSingle
|
|
57
58
|
key={option.valueString}
|
|
58
59
|
value={option.valueString}
|
|
59
|
-
label={
|
|
60
|
+
label={
|
|
61
|
+
<StyledText textToDisplay={option.valueString} element={option._valueString} />
|
|
62
|
+
}
|
|
60
63
|
readOnly={readOnly}
|
|
61
64
|
disabledViaToggleExpression={optionDisabledViaToggleExpression}
|
|
62
65
|
fullWidth={fullWidth}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import ReactMarkdown from 'react-markdown';
|
|
3
|
+
import { getMarkdownString } from '../../../utils/extensions';
|
|
4
|
+
import { useParseXhtml } from '../../../hooks/useParseXhtml';
|
|
5
|
+
import type { Element } from 'fhir/r4';
|
|
6
|
+
import { structuredDataCapture } from 'fhir-sdc-helpers';
|
|
7
|
+
import { default as parseStyleToJs } from 'style-to-js';
|
|
8
|
+
|
|
9
|
+
interface StyledTextProps {
|
|
10
|
+
textToDisplay: string | null;
|
|
11
|
+
element: Element | undefined;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function StyledText({ textToDisplay, element }: StyledTextProps) {
|
|
15
|
+
// parse XHTML if found
|
|
16
|
+
const parsedXhtml = useParseXhtml(element, textToDisplay);
|
|
17
|
+
if (parsedXhtml) {
|
|
18
|
+
return parsedXhtml.content;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// parse markdown if found
|
|
22
|
+
const markdownString = getMarkdownString(element);
|
|
23
|
+
if (markdownString) {
|
|
24
|
+
return (
|
|
25
|
+
<ReactMarkdown
|
|
26
|
+
components={{
|
|
27
|
+
p: (props) => <span {...props} />
|
|
28
|
+
}}>
|
|
29
|
+
{markdownString}
|
|
30
|
+
</ReactMarkdown>
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// labelText is empty, return null
|
|
35
|
+
if (!textToDisplay) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const stylesString = structuredDataCapture.getStyle(element);
|
|
40
|
+
const itemStyles = stylesString ? parseStyleToJs(stylesString) : {};
|
|
41
|
+
|
|
42
|
+
// parse regular text
|
|
43
|
+
return <span style={itemStyles}>{textToDisplay}</span>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export default StyledText;
|