@aehrc/smart-forms-renderer 0.12.1 → 0.13.1
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/Box.styles.d.ts +6 -0
- package/lib/components/Box.styles.js +29 -1
- package/lib/components/Box.styles.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/ChoiceAutocompleteItem.js +4 -10
- package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.js +4 -9
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.js +4 -9
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.js +4 -10
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.js +4 -10
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.js +4 -10
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.js +4 -10
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.js.map +1 -1
- package/lib/components/FormComponents/CustomDateItem/CustomDateItem.js +2 -2
- package/lib/components/FormComponents/CustomDateItem/CustomDateItem.js.map +1 -1
- package/lib/components/FormComponents/DateItem/DateItem.js +2 -2
- package/lib/components/FormComponents/DateItem/DateItem.js.map +1 -1
- package/lib/components/FormComponents/DateTimeItem/DateTimeItem.js +2 -2
- package/lib/components/FormComponents/DateTimeItem/DateTimeItem.js.map +1 -1
- package/lib/components/FormComponents/DecimalItem/DecimalItem.js +4 -4
- package/lib/components/FormComponents/DecimalItem/DecimalItem.js.map +1 -1
- package/lib/components/FormComponents/IntegerItem/IntegerField.js +1 -1
- package/lib/components/FormComponents/IntegerItem/IntegerField.js.map +1 -1
- package/lib/components/FormComponents/IntegerItem/IntegerItem.js +4 -4
- package/lib/components/FormComponents/IntegerItem/IntegerItem.js.map +1 -1
- package/lib/components/FormComponents/ItemParts/ItemExtensionLabels.d.ts +7 -0
- package/lib/components/FormComponents/{DateItem/DatePickerField.js → ItemParts/ItemExtensionLabels.js} +12 -6
- package/lib/components/FormComponents/ItemParts/ItemExtensionLabels.js.map +1 -0
- package/lib/components/FormComponents/ItemParts/ItemFieldGrid.d.ts +1 -0
- package/lib/components/FormComponents/ItemParts/ItemFieldGrid.js +10 -7
- package/lib/components/FormComponents/ItemParts/ItemFieldGrid.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.js +4 -10
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.js +4 -9
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.js +4 -10
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.js +4 -10
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.js +4 -10
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.js.map +1 -1
- package/lib/components/FormComponents/RepeatItem/RepeatItem.d.ts +1 -2
- package/lib/components/FormComponents/RepeatItem/RepeatItem.js +2 -2
- package/lib/components/FormComponents/RepeatItem/RepeatItem.js.map +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 +4 -4
- package/lib/components/FormComponents/StringItem/StringItem.js.map +1 -1
- package/lib/components/FormComponents/TextItem/TextItem.js +4 -4
- 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 +4 -4
- package/lib/components/FormComponents/UrlItem/UrlItem.js.map +1 -1
- package/lib/components/Renderer/BaseRenderer.js +3 -0
- package/lib/components/Renderer/BaseRenderer.js.map +1 -1
- package/lib/hooks/useRenderingExtensions.d.ts +2 -0
- package/lib/hooks/useRenderingExtensions.js +16 -11
- package/lib/hooks/useRenderingExtensions.js.map +1 -1
- package/lib/hooks/useValidationFeedback.d.ts +3 -0
- package/lib/hooks/useValidationFeedback.js +37 -0
- package/lib/hooks/useValidationFeedback.js.map +1 -0
- package/lib/stores/questionnaireResponseStore.d.ts +8 -1
- package/lib/stores/questionnaireResponseStore.js +22 -0
- package/lib/stores/questionnaireResponseStore.js.map +1 -1
- package/lib/utils/itemControl.d.ts +1 -27
- package/lib/utils/itemControl.js +0 -49
- package/lib/utils/itemControl.js.map +1 -1
- package/lib/utils/mapItem.d.ts +2 -0
- package/lib/utils/mapItem.js +2 -0
- package/lib/utils/mapItem.js.map +1 -1
- package/lib/utils/validateQuestionnaire.d.ts +23 -0
- package/lib/utils/validateQuestionnaire.js +183 -0
- package/lib/utils/validateQuestionnaire.js.map +1 -0
- package/package.json +1 -1
- package/src/components/Box.styles.ts +31 -1
- package/src/components/FormComponents/BooleanItem/BooleanItem.tsx +6 -2
- package/src/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.tsx +19 -23
- package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.tsx +15 -18
- package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.tsx +16 -19
- package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.tsx +15 -19
- package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.tsx +17 -21
- package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.tsx +15 -19
- package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.tsx +17 -21
- package/src/components/FormComponents/CustomDateItem/CustomDateItem.tsx +7 -2
- package/src/components/FormComponents/DateItem/DateItem.tsx +7 -2
- package/src/components/FormComponents/DateTimeItem/DateTimeItem.tsx +7 -2
- package/src/components/FormComponents/DecimalItem/DecimalItem.tsx +9 -3
- package/src/components/FormComponents/IntegerItem/IntegerField.tsx +1 -0
- package/src/components/FormComponents/IntegerItem/IntegerItem.tsx +9 -3
- package/{lib/components/BackToTopButton/BackToTopButton.js → src/components/FormComponents/ItemParts/ItemExtensionLabels.tsx} +23 -15
- package/src/components/FormComponents/ItemParts/ItemFieldGrid.tsx +14 -9
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.tsx +21 -25
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.tsx +20 -23
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.tsx +18 -22
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.tsx +16 -20
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.tsx +17 -21
- package/src/components/FormComponents/RepeatItem/RepeatItem.tsx +8 -4
- package/src/components/FormComponents/SliderItem/SliderItem.tsx +6 -2
- package/src/components/FormComponents/StringItem/StringItem.tsx +9 -3
- package/src/components/FormComponents/TextItem/TextItem.tsx +9 -3
- package/src/components/FormComponents/TimeItem/TimeItem.tsx +7 -2
- package/src/components/FormComponents/UrlItem/UrlItem.tsx +9 -3
- package/src/components/Renderer/BaseRenderer.tsx +3 -0
- package/src/hooks/useRenderingExtensions.ts +17 -11
- package/src/hooks/{useValidationError.ts → useValidationFeedback.ts} +23 -21
- package/src/stores/questionnaireResponseStore.ts +36 -1
- package/src/utils/itemControl.ts +1 -67
- package/src/utils/mapItem.ts +2 -0
- package/src/utils/validateQuestionnaire.ts +273 -0
- package/lib/components/BackToTopButton/BackToTopButton.d.ts +0 -7
- package/lib/components/BackToTopButton/BackToTopButton.js.map +0 -1
- package/lib/components/FormComponents/CustomDateItem/CustomDateField2.d.ts +0 -18
- package/lib/components/FormComponents/CustomDateItem/CustomDateField2.js +0 -31
- package/lib/components/FormComponents/CustomDateItem/CustomDateField2.js.map +0 -1
- package/lib/components/FormComponents/CustomDateItem/CustomDateTimeField.d.ts +0 -9
- package/lib/components/FormComponents/CustomDateItem/CustomDateTimeField.js +0 -75
- package/lib/components/FormComponents/CustomDateItem/CustomDateTimeField.js.map +0 -1
- package/lib/components/FormComponents/CustomDateItem/CustomDateTimePickerText2.d.ts +0 -9
- package/lib/components/FormComponents/CustomDateItem/CustomDateTimePickerText2.js +0 -75
- package/lib/components/FormComponents/CustomDateItem/CustomDateTimePickerText2.js.map +0 -1
- package/lib/components/FormComponents/CustomDateItem/customDateTimePicker/hooks/useParseDates.d.ts +0 -5
- package/lib/components/FormComponents/CustomDateItem/customDateTimePicker/hooks/useParseDates.js +0 -27
- package/lib/components/FormComponents/CustomDateItem/customDateTimePicker/hooks/useParseDates.js.map +0 -1
- package/lib/components/FormComponents/CustomDateItem/customDateTimePickerText.d.ts +0 -9
- package/lib/components/FormComponents/CustomDateItem/customDateTimePickerText.js +0 -71
- package/lib/components/FormComponents/CustomDateItem/customDateTimePickerText.js.map +0 -1
- package/lib/components/FormComponents/DateItem/DatePicker.d.ts +0 -2
- package/lib/components/FormComponents/DateItem/DatePicker.js +0 -42
- package/lib/components/FormComponents/DateItem/DatePicker.js.map +0 -1
- package/lib/components/FormComponents/DateItem/DatePickerField.d.ts +0 -8
- package/lib/components/FormComponents/DateItem/DatePickerField.js.map +0 -1
- package/lib/components/FormComponents/DisplayItem/DisplayBox.d.ts +0 -0
- package/lib/components/FormComponents/DisplayItem/DisplayBox.js +0 -2
- package/lib/components/FormComponents/DisplayItem/DisplayBox.js.map +0 -1
- package/lib/components/FormComponents/DisplayItem/DisplayBox.styles.d.ts +0 -4
- package/lib/components/FormComponents/DisplayItem/DisplayBox.styles.js +0 -35
- package/lib/components/FormComponents/DisplayItem/DisplayBox.styles.js.map +0 -1
- package/lib/components/FormComponents/GroupItem/GroupChildItemSwitcher.d.ts +0 -10
- package/lib/components/FormComponents/GroupItem/GroupChildItemSwitcher.js +0 -73
- package/lib/components/FormComponents/GroupItem/GroupChildItemSwitcher.js.map +0 -1
- package/lib/components/FormComponents/GroupItem/ItemSwitcher.d.ts +0 -10
- package/lib/components/FormComponents/GroupItem/ItemSwitcher.js +0 -81
- package/lib/components/FormComponents/GroupItem/ItemSwitcher.js.map +0 -1
- package/lib/components/FormComponents/GroupItem/TopLevelGroupItemSwitcher.d.ts +0 -10
- package/lib/components/FormComponents/GroupItem/TopLevelGroupItemSwitcher.js +0 -45
- package/lib/components/FormComponents/GroupItem/TopLevelGroupItemSwitcher.js.map +0 -1
- package/lib/components/FormComponents/IntegerItem/SliderItem.d.ts +0 -9
- package/lib/components/FormComponents/IntegerItem/SliderItem.js +0 -75
- package/lib/components/FormComponents/IntegerItem/SliderItem.js.map +0 -1
- package/lib/components/FormComponents/ItemParts/RadioButtons.d.ts +0 -8
- package/lib/components/FormComponents/ItemParts/RadioButtons.js +0 -37
- package/lib/components/FormComponents/ItemParts/RadioButtons.js.map +0 -1
- package/lib/components/FormComponents/ItemParts/RadioButtonsAnswerOption.d.ts +0 -8
- package/lib/components/FormComponents/ItemParts/RadioButtonsAnswerOption.js +0 -37
- package/lib/components/FormComponents/ItemParts/RadioButtonsAnswerOption.js.map +0 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteFieldEndAdornment.d.ts +0 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteFieldEndAdornment.js +0 -2
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteFieldEndAdornment.js.map +0 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionFields.d.ts +0 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionFields.js +0 -2
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionFields.js.map +0 -1
- package/lib/components/FormComponents/RepeatItem/DeleteItemButton.d.ts +0 -10
- package/lib/components/FormComponents/RepeatItem/DeleteItemButton.js +0 -30
- package/lib/components/FormComponents/RepeatItem/DeleteItemButton.js.map +0 -1
- package/lib/components/FormComponents/SliderItem/DisplayBox.styles.d.ts +0 -4
- package/lib/components/FormComponents/SliderItem/DisplayBox.styles.js +0 -35
- package/lib/components/FormComponents/SliderItem/DisplayBox.styles.js.map +0 -1
- package/lib/components/FormComponents/Tables/AddItemButton.d.ts +0 -8
- package/lib/components/FormComponents/Tables/AddItemButton.js +0 -28
- package/lib/components/FormComponents/Tables/AddItemButton.js.map +0 -1
- package/lib/components/FormComponents/Tables/DeleteRowButton.d.ts +0 -10
- package/lib/components/FormComponents/Tables/DeleteRowButton.js +0 -32
- package/lib/components/FormComponents/Tables/DeleteRowButton.js.map +0 -1
- package/lib/components/FormComponents/Tables/GroupTableRows.d.ts +0 -17
- package/lib/components/FormComponents/Tables/GroupTableRows.js +0 -45
- package/lib/components/FormComponents/Tables/GroupTableRows.js.map +0 -1
- package/lib/components/FormComponents/Tables/GroupTableTestRow.d.ts +0 -22
- package/lib/components/FormComponents/Tables/GroupTableTestRow.js +0 -43
- package/lib/components/FormComponents/Tables/GroupTableTestRow.js.map +0 -1
- package/lib/components/FormComponents/Tables/QItemGroupTable.d.ts +0 -10
- package/lib/components/FormComponents/Tables/QItemGroupTable.js +0 -109
- package/lib/components/FormComponents/Tables/QItemGroupTable.js.map +0 -1
- package/lib/components/FormComponents/Tables/QItemGroupTableRow.d.ts +0 -10
- package/lib/components/FormComponents/Tables/QItemGroupTableRow.js +0 -46
- package/lib/components/FormComponents/Tables/QItemGroupTableRow.js.map +0 -1
- package/lib/components/FormComponents/Typography.styles.d.ts +0 -6
- package/lib/components/FormComponents/Typography.styles.js +0 -24
- package/lib/components/FormComponents/Typography.styles.js.map +0 -1
- package/lib/hooks/useBackToTop.d.ts +0 -2
- package/lib/hooks/useBackToTop.js +0 -26
- package/lib/hooks/useBackToTop.js.map +0 -1
- package/lib/hooks/useDateSeparatorValidation.d.ts +0 -2
- package/lib/hooks/useDateSeparatorValidation.js +0 -25
- package/lib/hooks/useDateSeparatorValidation.js.map +0 -1
- package/lib/hooks/useDecimalUpdateFromProp.d.ts +0 -2
- package/lib/hooks/useDecimalUpdateFromProp.js +0 -29
- package/lib/hooks/useDecimalUpdateFromProp.js.map +0 -1
- package/lib/hooks/useIntegerUpdateFromProp.d.ts +0 -2
- package/lib/hooks/useIntegerUpdateFromProp.js +0 -29
- package/lib/hooks/useIntegerUpdateFromProp.js.map +0 -1
- package/lib/hooks/useMinimalStringCalculatedExpression.d.ts +0 -11
- package/lib/hooks/useMinimalStringCalculatedExpression.js +0 -49
- package/lib/hooks/useMinimalStringCalculatedExpression.js.map +0 -1
- package/lib/hooks/useNumberUpdateFromProp.d.ts +0 -2
- package/lib/hooks/useNumberUpdateFromProp.js +0 -29
- package/lib/hooks/useNumberUpdateFromProp.js.map +0 -1
- package/lib/hooks/useRepeatItemState.d.ts +0 -5
- package/lib/hooks/useRepeatItemState.js +0 -35
- package/lib/hooks/useRepeatItemState.js.map +0 -1
- package/lib/hooks/useRepeatItemUpdateFromProp.d.ts +0 -2
- package/lib/hooks/useRepeatItemUpdateFromProp.js +0 -29
- package/lib/hooks/useRepeatItemUpdateFromProp.js.map +0 -1
- package/lib/hooks/useStringField.d.ts +0 -2
- package/lib/hooks/useStringField.js +0 -29
- package/lib/hooks/useStringField.js.map +0 -1
- package/lib/hooks/useStringUpdateFromProp.d.ts +0 -2
- package/lib/hooks/useStringUpdateFromProp.js +0 -29
- package/lib/hooks/useStringUpdateFromProp.js.map +0 -1
- package/lib/hooks/useValidationError.d.ts +0 -3
- package/lib/hooks/useValidationError.js +0 -38
- package/lib/hooks/useValidationError.js.map +0 -1
- package/lib/interfaces/index.d.ts +0 -2
- package/lib/interfaces/index.js +0 -18
- package/lib/interfaces/index.js.map +0 -1
- package/lib/setup-jest.js +0 -1
- package/lib/setup-jest.js.map +0 -1
- package/lib/stores/useQuestionnaireResponseStore.d.ts +0 -27
- package/lib/stores/useQuestionnaireResponseStore.js +0 -49
- package/lib/stores/useQuestionnaireResponseStore.js.map +0 -1
- package/lib/stores/useQuestionnaireStore.d.ts +0 -64
- package/lib/stores/useQuestionnaireStore.js +0 -173
- package/lib/stores/useQuestionnaireStore.js.map +0 -1
- package/lib/stores/useSmartConfigStore.d.ts +0 -14
- package/lib/stores/useSmartConfigStore.js +0 -13
- package/lib/stores/useSmartConfigStore.js.map +0 -1
- package/lib/stores/useTerminologyServerStore.d.ts +0 -7
- package/lib/stores/useTerminologyServerStore.js +0 -25
- package/lib/stores/useTerminologyServerStore.js.map +0 -1
- package/lib/stories/MedicalHistoryTable.stories.js +0 -45
- package/lib/stories/MedicalHistoryTable.stories.js.map +0 -1
- package/lib/stories/SmartFormsRenderer.stories.js +0 -103
- package/lib/stories/SmartFormsRenderer.stories.js.map +0 -1
- package/lib/test.d.ts +0 -4
- package/lib/test.js +0 -18
- package/lib/test.js.map +0 -1
- package/lib/theme/overrides/Backdrop.d.ts +0 -13
- package/lib/theme/overrides/Backdrop.js +0 -32
- package/lib/theme/overrides/Backdrop.js.map +0 -1
- package/lib/theme/overrides/Typography.d.ts +0 -13
- package/lib/theme/overrides/Typography.js +0 -31
- package/lib/theme/overrides/Typography.js.map +0 -1
- package/lib/utils/formChangesOld.d.ts +0 -18
- package/lib/utils/formChangesOld.js +0 -91
- package/lib/utils/formChangesOld.js.map +0 -1
- package/lib/utils/initialiseForm.d.ts +0 -22
- package/lib/utils/initialiseForm.js +0 -53
- package/lib/utils/initialiseForm.js.map +0 -1
- package/lib/utils/launchContext.d.ts +0 -0
- package/lib/utils/launchContext.js +0 -2
- package/lib/utils/launchContext.js.map +0 -1
- package/lib/utils/populateInputParams.d.ts +0 -8
- package/lib/utils/populateInputParams.js +0 -193
- package/lib/utils/populateInputParams.js.map +0 -1
- package/lib/utils/removeHidden.d.ts +0 -16
- package/lib/utils/removeHidden.js +0 -105
- package/lib/utils/removeHidden.js.map +0 -1
- package/lib/utils/repopulate.d.ts +0 -9
- package/lib/utils/repopulate.js +0 -133
- package/lib/utils/repopulate.js.map +0 -1
- package/lib/utils/repopulateGenerateItems.d.ts +0 -9
- package/lib/utils/repopulateGenerateItems.js +0 -133
- package/lib/utils/repopulateGenerateItems.js.map +0 -1
- package/lib/utils/repopulateRepeatGroup.d.ts +0 -4
- package/lib/utils/repopulateRepeatGroup.js +0 -62
- package/lib/utils/repopulateRepeatGroup.js.map +0 -1
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
18
|
import React from 'react';
|
|
19
|
-
import Grid from '@mui/material/Grid';
|
|
20
19
|
import type {
|
|
21
20
|
QuestionnaireItem,
|
|
22
21
|
QuestionnaireItemAnswerOption,
|
|
@@ -31,10 +30,9 @@ import type {
|
|
|
31
30
|
PropsWithParentIsReadOnlyAttribute,
|
|
32
31
|
PropsWithQrItemChangeHandler
|
|
33
32
|
} from '../../../interfaces/renderProps.interface';
|
|
34
|
-
import DisplayInstructions from '../DisplayItem/DisplayInstructions';
|
|
35
|
-
import LabelWrapper from '../ItemParts/ItemLabelWrapper';
|
|
36
33
|
import OpenChoiceSelectAnswerOptionField from './OpenChoiceSelectAnswerOptionField';
|
|
37
34
|
import useReadOnly from '../../../hooks/useReadOnly';
|
|
35
|
+
import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
|
|
38
36
|
|
|
39
37
|
interface OpenChoiceSelectAnswerOptionItemProps
|
|
40
38
|
extends PropsWithQrItemChangeHandler,
|
|
@@ -49,7 +47,7 @@ function OpenChoiceSelectAnswerOptionItem(props: OpenChoiceSelectAnswerOptionIte
|
|
|
49
47
|
const { qItem, qrItem, isRepeated, isTabled, parentIsReadOnly, onQrItemChange } = props;
|
|
50
48
|
|
|
51
49
|
const readOnly = useReadOnly(qItem, parentIsReadOnly);
|
|
52
|
-
const { displayInstructions } = useRenderingExtensions(qItem);
|
|
50
|
+
const { displayInstructions, required } = useRenderingExtensions(qItem);
|
|
53
51
|
|
|
54
52
|
// Init input value
|
|
55
53
|
const answerOptions = qItem.answerOption;
|
|
@@ -109,22 +107,20 @@ function OpenChoiceSelectAnswerOptionItem(props: OpenChoiceSelectAnswerOptionIte
|
|
|
109
107
|
|
|
110
108
|
return (
|
|
111
109
|
<FullWidthFormComponentBox data-test="q-item-open-choice-select-answer-option-box">
|
|
112
|
-
<
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
</Grid>
|
|
127
|
-
</Grid>
|
|
110
|
+
<ItemFieldGrid
|
|
111
|
+
qItem={qItem}
|
|
112
|
+
displayInstructions={displayInstructions}
|
|
113
|
+
required={required}
|
|
114
|
+
readOnly={readOnly}>
|
|
115
|
+
<OpenChoiceSelectAnswerOptionField
|
|
116
|
+
qItem={qItem}
|
|
117
|
+
options={answerOptions}
|
|
118
|
+
valueSelect={valueSelect}
|
|
119
|
+
readOnly={readOnly}
|
|
120
|
+
isTabled={isTabled}
|
|
121
|
+
onChange={handleChange}
|
|
122
|
+
/>
|
|
123
|
+
</ItemFieldGrid>
|
|
128
124
|
</FullWidthFormComponentBox>
|
|
129
125
|
);
|
|
130
126
|
}
|
package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.tsx
CHANGED
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
18
|
import React from 'react';
|
|
19
|
-
import Grid from '@mui/material/Grid';
|
|
20
19
|
import type { Coding, QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
|
|
21
20
|
import { createEmptyQrItem } from '../../../utils/qrItem';
|
|
22
21
|
import { FullWidthFormComponentBox } from '../../Box.styles';
|
|
@@ -28,10 +27,9 @@ import type {
|
|
|
28
27
|
PropsWithParentIsReadOnlyAttribute,
|
|
29
28
|
PropsWithQrItemChangeHandler
|
|
30
29
|
} from '../../../interfaces/renderProps.interface';
|
|
31
|
-
import DisplayInstructions from '../DisplayItem/DisplayInstructions';
|
|
32
|
-
import LabelWrapper from '../ItemParts/ItemLabelWrapper';
|
|
33
30
|
import OpenChoiceSelectAnswerValueSetField from './OpenChoiceSelectAnswerValueSetField';
|
|
34
31
|
import useReadOnly from '../../../hooks/useReadOnly';
|
|
32
|
+
import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
|
|
35
33
|
|
|
36
34
|
interface OpenChoiceSelectAnswerValueSetItemProps
|
|
37
35
|
extends PropsWithQrItemChangeHandler,
|
|
@@ -46,7 +44,7 @@ function OpenChoiceSelectAnswerValueSetItem(props: OpenChoiceSelectAnswerValueSe
|
|
|
46
44
|
const { qItem, qrItem, isRepeated, isTabled, parentIsReadOnly, onQrItemChange } = props;
|
|
47
45
|
|
|
48
46
|
const readOnly = useReadOnly(qItem, parentIsReadOnly);
|
|
49
|
-
const { displayInstructions } = useRenderingExtensions(qItem);
|
|
47
|
+
const { displayInstructions, required } = useRenderingExtensions(qItem);
|
|
50
48
|
|
|
51
49
|
// Init input value
|
|
52
50
|
const qrOpenChoice = qrItem ?? createEmptyQrItem(qItem);
|
|
@@ -93,23 +91,21 @@ function OpenChoiceSelectAnswerValueSetItem(props: OpenChoiceSelectAnswerValueSe
|
|
|
93
91
|
|
|
94
92
|
return (
|
|
95
93
|
<FullWidthFormComponentBox>
|
|
96
|
-
<
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
</Grid>
|
|
112
|
-
</Grid>
|
|
94
|
+
<ItemFieldGrid
|
|
95
|
+
qItem={qItem}
|
|
96
|
+
displayInstructions={displayInstructions}
|
|
97
|
+
required={required}
|
|
98
|
+
readOnly={readOnly}>
|
|
99
|
+
<OpenChoiceSelectAnswerValueSetField
|
|
100
|
+
qItem={qItem}
|
|
101
|
+
options={codings}
|
|
102
|
+
valueSelect={valueSelect}
|
|
103
|
+
serverError={serverError}
|
|
104
|
+
isTabled={isTabled}
|
|
105
|
+
readOnly={readOnly}
|
|
106
|
+
onValueChange={handleValueChange}
|
|
107
|
+
/>
|
|
108
|
+
</ItemFieldGrid>
|
|
113
109
|
</FullWidthFormComponentBox>
|
|
114
110
|
);
|
|
115
111
|
}
|
|
@@ -18,9 +18,9 @@
|
|
|
18
18
|
import React, { useState } from 'react';
|
|
19
19
|
import type {
|
|
20
20
|
PropsWithParentIsReadOnlyAttribute,
|
|
21
|
-
PropsWithQrItemChangeHandler
|
|
21
|
+
PropsWithQrItemChangeHandler,
|
|
22
|
+
PropsWithShowMinimalViewAttribute
|
|
22
23
|
} from '../../../interfaces/renderProps.interface';
|
|
23
|
-
import type { PropsWithShowMinimalViewAttribute } from '../../../interfaces/renderProps.interface';
|
|
24
24
|
import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
|
|
25
25
|
import { nanoid } from 'nanoid';
|
|
26
26
|
import useRenderingExtensions from '../../../hooks/useRenderingExtensions';
|
|
@@ -46,7 +46,7 @@ function RepeatItem(props: RepeatItemProps) {
|
|
|
46
46
|
const { qItem, qrItem, showMinimalView, parentIsReadOnly, onQrItemChange } = props;
|
|
47
47
|
|
|
48
48
|
const readOnly = useReadOnly(qItem, parentIsReadOnly);
|
|
49
|
-
const { displayInstructions } = useRenderingExtensions(qItem);
|
|
49
|
+
const { displayInstructions, required } = useRenderingExtensions(qItem);
|
|
50
50
|
|
|
51
51
|
const initialRepeatAnswers = useInitialiseRepeatAnswers(qItem, qrItem);
|
|
52
52
|
|
|
@@ -119,7 +119,11 @@ function RepeatItem(props: RepeatItemProps) {
|
|
|
119
119
|
|
|
120
120
|
return (
|
|
121
121
|
<FullWidthFormComponentBox data-test="q-item-repeat-box">
|
|
122
|
-
<ItemFieldGrid
|
|
122
|
+
<ItemFieldGrid
|
|
123
|
+
qItem={qItem}
|
|
124
|
+
displayInstructions={displayInstructions}
|
|
125
|
+
required={required}
|
|
126
|
+
readOnly={readOnly}>
|
|
123
127
|
<TransitionGroup>
|
|
124
128
|
{repeatAnswers.map(({ nanoId, answer }, index) => {
|
|
125
129
|
const repeatAnswerQrItem = createEmptyQrItem(qItem);
|
|
@@ -45,7 +45,7 @@ function SliderItem(props: SliderItemProps) {
|
|
|
45
45
|
const { qItem, qrItem, isRepeated, isTabled, parentIsReadOnly, onQrItemChange } = props;
|
|
46
46
|
|
|
47
47
|
const readOnly = useReadOnly(qItem, parentIsReadOnly);
|
|
48
|
-
const { displayInstructions } = useRenderingExtensions(qItem);
|
|
48
|
+
const { displayInstructions, required } = useRenderingExtensions(qItem);
|
|
49
49
|
const { minValue, maxValue, stepValue, minLabel, maxLabel } = useSliderExtensions(qItem);
|
|
50
50
|
|
|
51
51
|
const isInteracted = !!qrItem?.answer;
|
|
@@ -91,7 +91,11 @@ function SliderItem(props: SliderItemProps) {
|
|
|
91
91
|
|
|
92
92
|
return (
|
|
93
93
|
<FullWidthFormComponentBox data-test="q-item-slider-box">
|
|
94
|
-
<ItemFieldGrid
|
|
94
|
+
<ItemFieldGrid
|
|
95
|
+
qItem={qItem}
|
|
96
|
+
displayInstructions={displayInstructions}
|
|
97
|
+
required={required}
|
|
98
|
+
readOnly={readOnly}>
|
|
95
99
|
<Box px={4}>
|
|
96
100
|
<SliderField
|
|
97
101
|
linkId={qItem.linkId}
|
|
@@ -24,7 +24,7 @@ import type {
|
|
|
24
24
|
} from '../../../interfaces/renderProps.interface';
|
|
25
25
|
import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
|
|
26
26
|
import useRenderingExtensions from '../../../hooks/useRenderingExtensions';
|
|
27
|
-
import
|
|
27
|
+
import useValidationFeedback from '../../../hooks/useValidationFeedback';
|
|
28
28
|
import debounce from 'lodash.debounce';
|
|
29
29
|
import { createEmptyQrItem } from '../../../utils/qrItem';
|
|
30
30
|
import { DEBOUNCE_DURATION } from '../../../utils/debounce';
|
|
@@ -52,7 +52,9 @@ function StringItem(props: StringItemProps) {
|
|
|
52
52
|
displayPrompt,
|
|
53
53
|
displayInstructions,
|
|
54
54
|
entryFormat,
|
|
55
|
+
required,
|
|
55
56
|
regexValidation,
|
|
57
|
+
minLength,
|
|
56
58
|
maxLength
|
|
57
59
|
} = useRenderingExtensions(qItem);
|
|
58
60
|
|
|
@@ -64,7 +66,7 @@ function StringItem(props: StringItemProps) {
|
|
|
64
66
|
const [input, setInput] = useStringInput(valueString);
|
|
65
67
|
|
|
66
68
|
// Perform validation checks
|
|
67
|
-
const feedback =
|
|
69
|
+
const feedback = useValidationFeedback(input, regexValidation, minLength, maxLength);
|
|
68
70
|
|
|
69
71
|
// Process calculated expressions
|
|
70
72
|
const { calcExpUpdated } = useStringCalculatedExpression({
|
|
@@ -113,7 +115,11 @@ function StringItem(props: StringItemProps) {
|
|
|
113
115
|
}
|
|
114
116
|
return (
|
|
115
117
|
<FullWidthFormComponentBox data-test="q-item-string-box">
|
|
116
|
-
<ItemFieldGrid
|
|
118
|
+
<ItemFieldGrid
|
|
119
|
+
qItem={qItem}
|
|
120
|
+
displayInstructions={displayInstructions}
|
|
121
|
+
required={required}
|
|
122
|
+
readOnly={readOnly}>
|
|
117
123
|
<StringField
|
|
118
124
|
linkId={qItem.linkId}
|
|
119
125
|
input={input}
|
|
@@ -23,7 +23,7 @@ import type {
|
|
|
23
23
|
} from '../../../interfaces/renderProps.interface';
|
|
24
24
|
import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
|
|
25
25
|
import useRenderingExtensions from '../../../hooks/useRenderingExtensions';
|
|
26
|
-
import
|
|
26
|
+
import useValidationFeedback from '../../../hooks/useValidationFeedback';
|
|
27
27
|
import debounce from 'lodash.debounce';
|
|
28
28
|
import { createEmptyQrItem } from '../../../utils/qrItem';
|
|
29
29
|
import { DEBOUNCE_DURATION } from '../../../utils/debounce';
|
|
@@ -51,7 +51,9 @@ function TextItem(props: TextItemProps) {
|
|
|
51
51
|
displayPrompt,
|
|
52
52
|
displayInstructions,
|
|
53
53
|
entryFormat,
|
|
54
|
+
required,
|
|
54
55
|
regexValidation,
|
|
56
|
+
minLength,
|
|
55
57
|
maxLength
|
|
56
58
|
} = useRenderingExtensions(qItem);
|
|
57
59
|
|
|
@@ -63,7 +65,7 @@ function TextItem(props: TextItemProps) {
|
|
|
63
65
|
const [input, setInput] = useStringInput(valueText);
|
|
64
66
|
|
|
65
67
|
// Perform validation checks
|
|
66
|
-
const feedback =
|
|
68
|
+
const feedback = useValidationFeedback(input, regexValidation, minLength, maxLength);
|
|
67
69
|
|
|
68
70
|
// Process calculated expressions
|
|
69
71
|
const { calcExpUpdated } = useStringCalculatedExpression({
|
|
@@ -111,7 +113,11 @@ function TextItem(props: TextItemProps) {
|
|
|
111
113
|
}
|
|
112
114
|
return (
|
|
113
115
|
<FullWidthFormComponentBox data-test="q-item-text-box">
|
|
114
|
-
<ItemFieldGrid
|
|
116
|
+
<ItemFieldGrid
|
|
117
|
+
qItem={qItem}
|
|
118
|
+
displayInstructions={displayInstructions}
|
|
119
|
+
required={required}
|
|
120
|
+
readOnly={readOnly}>
|
|
115
121
|
<TextField
|
|
116
122
|
linkId={qItem.linkId}
|
|
117
123
|
input={input}
|
|
@@ -45,7 +45,8 @@ function TimeItem(props: TimeItemProps) {
|
|
|
45
45
|
const { qItem, qrItem, isRepeated, isTabled, parentIsReadOnly, onQrItemChange } = props;
|
|
46
46
|
|
|
47
47
|
const readOnly = useReadOnly(qItem, parentIsReadOnly);
|
|
48
|
-
const { displayPrompt, displayInstructions, entryFormat } =
|
|
48
|
+
const { displayPrompt, displayInstructions, entryFormat, required } =
|
|
49
|
+
useRenderingExtensions(qItem);
|
|
49
50
|
|
|
50
51
|
// Init input value
|
|
51
52
|
let timeString: string | null = null;
|
|
@@ -79,7 +80,11 @@ function TimeItem(props: TimeItemProps) {
|
|
|
79
80
|
|
|
80
81
|
return (
|
|
81
82
|
<FullWidthFormComponentBox>
|
|
82
|
-
<ItemFieldGrid
|
|
83
|
+
<ItemFieldGrid
|
|
84
|
+
qItem={qItem}
|
|
85
|
+
displayInstructions={displayInstructions}
|
|
86
|
+
required={required}
|
|
87
|
+
readOnly={readOnly}>
|
|
83
88
|
<TimeField
|
|
84
89
|
value={timeDayJs}
|
|
85
90
|
displayPrompt={displayPrompt}
|
|
@@ -24,7 +24,7 @@ import type {
|
|
|
24
24
|
} from '../../../interfaces/renderProps.interface';
|
|
25
25
|
import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
|
|
26
26
|
import useRenderingExtensions from '../../../hooks/useRenderingExtensions';
|
|
27
|
-
import
|
|
27
|
+
import useValidationFeedback from '../../../hooks/useValidationFeedback';
|
|
28
28
|
import debounce from 'lodash.debounce';
|
|
29
29
|
import { createEmptyQrItem } from '../../../utils/qrItem';
|
|
30
30
|
import { DEBOUNCE_DURATION } from '../../../utils/debounce';
|
|
@@ -50,7 +50,9 @@ function UrlItem(props: UrlItemProps) {
|
|
|
50
50
|
displayPrompt,
|
|
51
51
|
displayInstructions,
|
|
52
52
|
entryFormat,
|
|
53
|
+
required,
|
|
53
54
|
regexValidation,
|
|
55
|
+
minLength,
|
|
54
56
|
maxLength
|
|
55
57
|
} = useRenderingExtensions(qItem);
|
|
56
58
|
|
|
@@ -62,7 +64,7 @@ function UrlItem(props: UrlItemProps) {
|
|
|
62
64
|
const [input, setInput] = useState(valueUri);
|
|
63
65
|
|
|
64
66
|
// Perform validation checks
|
|
65
|
-
const feedback =
|
|
67
|
+
const feedback = useValidationFeedback(input, regexValidation, minLength, maxLength);
|
|
66
68
|
|
|
67
69
|
// Event handlers
|
|
68
70
|
function handleChange(newInput: string) {
|
|
@@ -100,7 +102,11 @@ function UrlItem(props: UrlItemProps) {
|
|
|
100
102
|
}
|
|
101
103
|
return (
|
|
102
104
|
<FullWidthFormComponentBox data-test="q-item-string-box">
|
|
103
|
-
<ItemFieldGrid
|
|
105
|
+
<ItemFieldGrid
|
|
106
|
+
qItem={qItem}
|
|
107
|
+
displayInstructions={displayInstructions}
|
|
108
|
+
required={required}
|
|
109
|
+
readOnly={readOnly}>
|
|
104
110
|
<UrlField
|
|
105
111
|
linkId={qItem.linkId}
|
|
106
112
|
input={input}
|
|
@@ -32,6 +32,7 @@ function BaseRenderer() {
|
|
|
32
32
|
const readOnly = useQuestionnaireStore.use.readOnly();
|
|
33
33
|
|
|
34
34
|
const updatableResponse = useQuestionnaireResponseStore.use.updatableResponse();
|
|
35
|
+
const updateRequiredValidity = useQuestionnaireResponseStore.use.validateQuestionnaire();
|
|
35
36
|
const updateResponse = useQuestionnaireResponseStore.use.updateResponse();
|
|
36
37
|
|
|
37
38
|
const qItemsIndexMap = useMemo(() => mapQItemsIndex(sourceQuestionnaire), [sourceQuestionnaire]);
|
|
@@ -45,6 +46,7 @@ function BaseRenderer() {
|
|
|
45
46
|
updateQrItemsInGroup(newTopLevelQRItem, null, updatedResponse, qItemsIndexMap);
|
|
46
47
|
|
|
47
48
|
updateExpressions(updatedResponse);
|
|
49
|
+
updateRequiredValidity(sourceQuestionnaire, updatedResponse);
|
|
48
50
|
updateResponse(updatedResponse);
|
|
49
51
|
}
|
|
50
52
|
|
|
@@ -57,6 +59,7 @@ function BaseRenderer() {
|
|
|
57
59
|
updateQrItemsInGroup(null, newTopLevelQRItems, updatedResponse, qItemsIndexMap);
|
|
58
60
|
|
|
59
61
|
updateExpressions(updatedResponse);
|
|
62
|
+
updateRequiredValidity(sourceQuestionnaire, updatedResponse);
|
|
60
63
|
updateResponse(updatedResponse);
|
|
61
64
|
}
|
|
62
65
|
|
|
@@ -16,8 +16,6 @@
|
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
18
|
import {
|
|
19
|
-
getMaxLength,
|
|
20
|
-
getReadOnly,
|
|
21
19
|
getRegexValidation,
|
|
22
20
|
getTextDisplayInstructions,
|
|
23
21
|
getTextDisplayPrompt,
|
|
@@ -26,6 +24,7 @@ import {
|
|
|
26
24
|
import type { QuestionnaireItem } from 'fhir/r4';
|
|
27
25
|
import type { RegexValidation } from '../interfaces/regex.interface';
|
|
28
26
|
import { structuredDataCapture } from 'fhir-sdc-helpers';
|
|
27
|
+
import { useMemo } from 'react';
|
|
29
28
|
|
|
30
29
|
interface RenderingExtensions {
|
|
31
30
|
displayUnit: string;
|
|
@@ -33,20 +32,27 @@ interface RenderingExtensions {
|
|
|
33
32
|
displayInstructions: string;
|
|
34
33
|
readOnly: boolean;
|
|
35
34
|
entryFormat: string;
|
|
35
|
+
required: boolean;
|
|
36
36
|
regexValidation: RegexValidation | null;
|
|
37
|
+
minLength: number | null;
|
|
37
38
|
maxLength: number | null;
|
|
38
39
|
}
|
|
39
40
|
|
|
40
41
|
function useRenderingExtensions(qItem: QuestionnaireItem): RenderingExtensions {
|
|
41
|
-
return
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
42
|
+
return useMemo(
|
|
43
|
+
() => ({
|
|
44
|
+
displayUnit: getTextDisplayUnit(qItem),
|
|
45
|
+
displayPrompt: getTextDisplayPrompt(qItem),
|
|
46
|
+
displayInstructions: getTextDisplayInstructions(qItem),
|
|
47
|
+
readOnly: !!qItem.readOnly,
|
|
48
|
+
entryFormat: structuredDataCapture.getEntryFormat(qItem) ?? '',
|
|
49
|
+
required: qItem.required ?? false,
|
|
50
|
+
regexValidation: getRegexValidation(qItem),
|
|
51
|
+
minLength: structuredDataCapture.getMinLength(qItem) ?? null,
|
|
52
|
+
maxLength: qItem.maxLength ?? null
|
|
53
|
+
}),
|
|
54
|
+
[qItem]
|
|
55
|
+
);
|
|
50
56
|
}
|
|
51
57
|
|
|
52
58
|
export default useRenderingExtensions;
|
|
@@ -16,33 +16,35 @@
|
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
18
|
import type { RegexValidation } from '../interfaces/regex.interface';
|
|
19
|
+
import { getInputInvalidType } from '../utils/validateQuestionnaire';
|
|
19
20
|
|
|
20
|
-
function
|
|
21
|
+
function useValidationFeedback(
|
|
21
22
|
input: string,
|
|
22
23
|
regexValidation: RegexValidation | null,
|
|
24
|
+
minLength: number | null,
|
|
23
25
|
maxLength: number | null
|
|
24
26
|
): string {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
if (
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
27
|
+
const invalidType = getInputInvalidType(input, regexValidation, minLength, maxLength);
|
|
28
|
+
|
|
29
|
+
if (!invalidType) {
|
|
30
|
+
return '';
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (invalidType === 'regex' && regexValidation) {
|
|
34
|
+
return `Input should match the specified regex ${regexValidation.expression}`;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Test min character limit
|
|
38
|
+
if (invalidType === 'minLength' && minLength) {
|
|
39
|
+
return `Enter at least ${minLength} characters.`;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Test max character limit
|
|
43
|
+
if (invalidType === 'maxLength' && maxLength) {
|
|
44
|
+
return `Input exceeds maximum character limit of ${maxLength}.`;
|
|
43
45
|
}
|
|
44
46
|
|
|
45
|
-
return
|
|
47
|
+
return '';
|
|
46
48
|
}
|
|
47
49
|
|
|
48
|
-
export default
|
|
50
|
+
export default useValidationFeedback;
|
|
@@ -16,17 +16,26 @@
|
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
18
|
import { createStore } from 'zustand/vanilla';
|
|
19
|
-
import type { QuestionnaireResponse } from 'fhir/r4';
|
|
19
|
+
import type { Questionnaire, QuestionnaireResponse } from 'fhir/r4';
|
|
20
20
|
import { emptyResponse } from '../utils/emptyResource';
|
|
21
21
|
import cloneDeep from 'lodash.clonedeep';
|
|
22
22
|
import type { Diff } from 'deep-diff';
|
|
23
23
|
import { diff } from 'deep-diff';
|
|
24
24
|
import { createSelectors } from './selector';
|
|
25
|
+
import type { InvalidType } from '../utils/validateQuestionnaire';
|
|
26
|
+
import { validateQuestionnaire } from '../utils/validateQuestionnaire';
|
|
27
|
+
import { questionnaireStore } from './questionnaireStore';
|
|
25
28
|
|
|
26
29
|
interface QuestionnaireResponseStoreType {
|
|
27
30
|
sourceResponse: QuestionnaireResponse;
|
|
28
31
|
updatableResponse: QuestionnaireResponse;
|
|
29
32
|
formChangesHistory: (Diff<QuestionnaireResponse, QuestionnaireResponse>[] | null)[];
|
|
33
|
+
invalidItems: Record<string, InvalidType>;
|
|
34
|
+
responseIsValid: boolean;
|
|
35
|
+
validateQuestionnaire: (
|
|
36
|
+
questionnaire: Questionnaire,
|
|
37
|
+
updatedResponse: QuestionnaireResponse
|
|
38
|
+
) => void;
|
|
30
39
|
buildSourceResponse: (response: QuestionnaireResponse) => void;
|
|
31
40
|
setUpdatableResponseAsPopulated: (populatedResponse: QuestionnaireResponse) => void;
|
|
32
41
|
updateResponse: (updatedResponse: QuestionnaireResponse) => void;
|
|
@@ -40,6 +49,32 @@ export const questionnaireResponseStore = createStore<QuestionnaireResponseStore
|
|
|
40
49
|
sourceResponse: cloneDeep(emptyResponse),
|
|
41
50
|
updatableResponse: cloneDeep(emptyResponse),
|
|
42
51
|
formChangesHistory: [],
|
|
52
|
+
invalidItems: {},
|
|
53
|
+
responseIsValid: true,
|
|
54
|
+
validateQuestionnaire: (
|
|
55
|
+
questionnaire: Questionnaire,
|
|
56
|
+
updatedResponse: QuestionnaireResponse
|
|
57
|
+
) => {
|
|
58
|
+
const tempInvalidItems = get().invalidItems;
|
|
59
|
+
|
|
60
|
+
const enableWhenIsActivated = questionnaireStore.getState().enableWhenIsActivated;
|
|
61
|
+
const enableWhenItems = questionnaireStore.getState().enableWhenItems;
|
|
62
|
+
const enableWhenExpressions = questionnaireStore.getState().enableWhenExpressions;
|
|
63
|
+
|
|
64
|
+
validateQuestionnaire({
|
|
65
|
+
questionnaire,
|
|
66
|
+
questionnaireResponse: updatedResponse,
|
|
67
|
+
invalidItems: tempInvalidItems,
|
|
68
|
+
enableWhenIsActivated,
|
|
69
|
+
enableWhenItems,
|
|
70
|
+
enableWhenExpressions
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
set(() => ({
|
|
74
|
+
invalidItems: tempInvalidItems,
|
|
75
|
+
responseIsValid: Object.keys(tempInvalidItems).length === 0
|
|
76
|
+
}));
|
|
77
|
+
},
|
|
43
78
|
buildSourceResponse: (questionnaireResponse: QuestionnaireResponse) => {
|
|
44
79
|
set(() => ({
|
|
45
80
|
sourceResponse: questionnaireResponse,
|
package/src/utils/itemControl.ts
CHANGED
|
@@ -15,13 +15,7 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
-
import type {
|
|
19
|
-
Coding,
|
|
20
|
-
Expression,
|
|
21
|
-
Extension,
|
|
22
|
-
QuestionnaireItem,
|
|
23
|
-
QuestionnaireResponse
|
|
24
|
-
} from 'fhir/r4';
|
|
18
|
+
import type { Coding, Expression, Extension, QuestionnaireItem } from 'fhir/r4';
|
|
25
19
|
import type { RegexValidation } from '../interfaces/regex.interface';
|
|
26
20
|
|
|
27
21
|
/**
|
|
@@ -220,28 +214,6 @@ export function getMarkdownString(qItem: QuestionnaireItem): string | null {
|
|
|
220
214
|
return null;
|
|
221
215
|
}
|
|
222
216
|
|
|
223
|
-
/**
|
|
224
|
-
* Get questionnaire name from questionnaireResponse
|
|
225
|
-
* If questionnaireResponse does not have a name, fallback to questionnaireResponse questionnaireId
|
|
226
|
-
*
|
|
227
|
-
* @author Sean Fong
|
|
228
|
-
*/
|
|
229
|
-
export function getQuestionnaireNameFromResponse(
|
|
230
|
-
questionnaireResponse: QuestionnaireResponse
|
|
231
|
-
): string {
|
|
232
|
-
const itemControl = questionnaireResponse._questionnaire?.extension?.find(
|
|
233
|
-
(extension: Extension) => extension.url === 'http://hl7.org/fhir/StructureDefinition/display'
|
|
234
|
-
);
|
|
235
|
-
|
|
236
|
-
if (itemControl) {
|
|
237
|
-
if (itemControl.valueString) {
|
|
238
|
-
return itemControl.valueString.charAt(0).toUpperCase() + itemControl.valueString.slice(1);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
return questionnaireResponse.id ?? 'Unnamed Response';
|
|
243
|
-
}
|
|
244
|
-
|
|
245
217
|
/**
|
|
246
218
|
* Get text display prompt for items with itemControlCode prompt and has a prompt childItem
|
|
247
219
|
*
|
|
@@ -259,15 +231,6 @@ export function getTextDisplayPrompt(qItem: QuestionnaireItem): string {
|
|
|
259
231
|
return '';
|
|
260
232
|
}
|
|
261
233
|
|
|
262
|
-
/**
|
|
263
|
-
* Check if item is readonly
|
|
264
|
-
*
|
|
265
|
-
* @author Sean Fong
|
|
266
|
-
*/
|
|
267
|
-
export function getReadOnly(qItem: QuestionnaireItem): boolean {
|
|
268
|
-
return !!qItem.readOnly;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
234
|
/**
|
|
272
235
|
* Get decimal text display unit for items with itemControlCode unit and has a unit childItem
|
|
273
236
|
*
|
|
@@ -332,26 +295,6 @@ export function getTextDisplayInstructions(qItem: QuestionnaireItem): string {
|
|
|
332
295
|
return '';
|
|
333
296
|
}
|
|
334
297
|
|
|
335
|
-
/**
|
|
336
|
-
* Get entry format if its extension is present
|
|
337
|
-
* i.e. DD-MM-YYYY for dates, HH:MM for times etc.
|
|
338
|
-
*
|
|
339
|
-
* @author Sean Fong
|
|
340
|
-
*/
|
|
341
|
-
export function getEntryFormat(qItem: QuestionnaireItem): string {
|
|
342
|
-
const itemControl = qItem.extension?.find(
|
|
343
|
-
(extension: Extension) =>
|
|
344
|
-
extension.url === 'http://hl7.org/fhir/StructureDefinition/entryFormat'
|
|
345
|
-
);
|
|
346
|
-
|
|
347
|
-
if (itemControl) {
|
|
348
|
-
if (itemControl.valueString) {
|
|
349
|
-
return itemControl.valueString;
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
return '';
|
|
353
|
-
}
|
|
354
|
-
|
|
355
298
|
/**
|
|
356
299
|
* Get entry format if its extension is present
|
|
357
300
|
* i.e. DD-MM-YYYY for dates, HH:MM for times etc.
|
|
@@ -388,12 +331,3 @@ export function getRegexValidation(qItem: QuestionnaireItem): RegexValidation |
|
|
|
388
331
|
|
|
389
332
|
return null;
|
|
390
333
|
}
|
|
391
|
-
|
|
392
|
-
/**
|
|
393
|
-
* Get maximum length of characters allowed if present
|
|
394
|
-
*
|
|
395
|
-
* @author Sean Fong
|
|
396
|
-
*/
|
|
397
|
-
export function getMaxLength(qItem: QuestionnaireItem): number | null {
|
|
398
|
-
return qItem.maxLength ?? null;
|
|
399
|
-
}
|
package/src/utils/mapItem.ts
CHANGED
|
@@ -23,6 +23,8 @@ import { isRepeatItemAndNotCheckbox } from './qItem';
|
|
|
23
23
|
* QuestionnaireItems without a corresponding QuestionnaireResponseItem is set as undefined.
|
|
24
24
|
* i.e. QItems = [QItem0, QItem1, QItem2]. Only QItem0 and QItem2 have QrItems
|
|
25
25
|
* Generated array: [QrItem0, undefined, QrItem2]
|
|
26
|
+
* Note: There's a bug where if the qItems are child items from a repeat group, the function fails at the isRepeatGroup line.
|
|
27
|
+
* Ensure that repeat groups are handled prior to calling this function.
|
|
26
28
|
*
|
|
27
29
|
* @author Sean Fong
|
|
28
30
|
*/
|