@aehrc/smart-forms-renderer 0.7.1 → 0.8.0
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/README.md +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.js +1 -2
- package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionFields.d.ts +12 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionFields.js +39 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionFields.js.map +1 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.d.ts +3 -3
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.js +14 -27
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetFields.d.ts +13 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetFields.js +42 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetFields.js.map +1 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.d.ts +4 -3
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.js +14 -22
- package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceItemSwitcher.d.ts +2 -2
- package/lib/components/FormComponents/ChoiceItems/ChoiceItemSwitcher.js +3 -3
- package/lib/components/FormComponents/ChoiceItems/ChoiceItemSwitcher.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionFields.d.ts +12 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionFields.js +27 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionFields.js.map +1 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.d.ts +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.js +9 -24
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetFields.d.ts +14 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetFields.js +42 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetFields.js.map +1 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.d.ts +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.js +8 -21
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.d.ts +10 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.js +41 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.js.map +1 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.js +7 -23
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.d.ts +12 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.js +42 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.js.map +1 -0
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.js +8 -18
- package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.js.map +1 -1
- package/lib/components/FormComponents/DecimalItem/DecimalItem.js +3 -2
- package/lib/components/FormComponents/DecimalItem/DecimalItem.js.map +1 -1
- package/lib/components/FormComponents/GridGroup/GridGroup.js +2 -2
- package/lib/components/FormComponents/GridGroup/GridGroup.js.map +1 -1
- package/lib/components/FormComponents/GridGroup/GridRow.js +2 -2
- package/lib/components/FormComponents/GridGroup/GridRow.js.map +1 -1
- package/lib/components/FormComponents/GroupItem/GroupChildItemSwitcher.d.ts +10 -0
- package/lib/components/FormComponents/GroupItem/GroupChildItemSwitcher.js +73 -0
- package/lib/components/FormComponents/GroupItem/GroupChildItemSwitcher.js.map +1 -0
- package/lib/components/FormComponents/GroupItem/GroupItem.js +3 -3
- package/lib/components/FormComponents/GroupItem/GroupItem.js.map +1 -1
- package/lib/components/FormComponents/GroupItem/GroupItemSwitcher.js +4 -4
- package/lib/components/FormComponents/GroupItem/GroupItemSwitcher.js.map +1 -1
- package/lib/components/FormComponents/GroupItem/ItemSwitcher.d.ts +10 -0
- package/lib/components/FormComponents/GroupItem/ItemSwitcher.js +81 -0
- package/lib/components/FormComponents/GroupItem/ItemSwitcher.js.map +1 -0
- package/lib/components/FormComponents/GroupItem/TopLevelGroupItemSwitcher.d.ts +10 -0
- package/lib/components/FormComponents/GroupItem/TopLevelGroupItemSwitcher.js +45 -0
- package/lib/components/FormComponents/GroupItem/TopLevelGroupItemSwitcher.js.map +1 -0
- package/lib/components/FormComponents/IntegerItem/IntegerItem.js +3 -2
- package/lib/components/FormComponents/IntegerItem/IntegerItem.js.map +1 -1
- package/lib/components/FormComponents/Item.styles.d.ts +2 -2
- package/lib/components/FormComponents/Item.styles.js +2 -2
- package/lib/components/FormComponents/Item.styles.js.map +1 -1
- package/lib/components/FormComponents/ItemParts/RadioAnswerOptionButtons.d.ts +8 -0
- package/lib/components/FormComponents/ItemParts/RadioAnswerOptionButtons.js +37 -0
- package/lib/components/FormComponents/ItemParts/RadioAnswerOptionButtons.js.map +1 -0
- package/lib/components/FormComponents/ItemParts/RadioButtons.d.ts +8 -0
- package/lib/components/FormComponents/ItemParts/RadioButtons.js +37 -0
- package/lib/components/FormComponents/ItemParts/RadioButtons.js.map +1 -0
- package/lib/components/FormComponents/ItemParts/RadioButtonsAnswerOption.d.ts +8 -0
- package/lib/components/FormComponents/ItemParts/RadioButtonsAnswerOption.js +37 -0
- package/lib/components/FormComponents/ItemParts/RadioButtonsAnswerOption.js.map +1 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.d.ts +20 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.js +49 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.js.map +1 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteFieldEndAdornment.d.ts +0 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteFieldEndAdornment.js +2 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteFieldEndAdornment.js.map +1 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.js +11 -35
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionFields.d.ts +17 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionFields.js +42 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionFields.js.map +1 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.d.ts +3 -3
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.js +23 -36
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceItemSwitcher.d.ts +2 -2
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceItemSwitcher.js +3 -3
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceItemSwitcher.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionFields.d.ts +15 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionFields.js +29 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionFields.js.map +1 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.d.ts +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.js +3 -23
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.d.ts +11 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.js +14 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.js.map +1 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionFields.d.ts +0 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionFields.js +2 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionFields.js.map +1 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.js +18 -23
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.d.ts +12 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.js +16 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.js.map +1 -0
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.js +8 -14
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.js.map +1 -1
- package/lib/components/FormComponents/RepeatGroup/RepeatGroup.js +4 -3
- package/lib/components/FormComponents/RepeatGroup/RepeatGroup.js.map +1 -1
- package/lib/components/FormComponents/RepeatGroup/index.d.ts +1 -0
- package/lib/components/FormComponents/RepeatGroup/index.js +18 -0
- package/lib/components/FormComponents/RepeatGroup/index.js.map +1 -0
- package/lib/components/FormComponents/RepeatItem/RepeatItem.js +1 -1
- package/lib/components/FormComponents/RepeatItem/RepeatItem.js.map +1 -1
- package/lib/components/FormComponents/SingleItem/SingleItem.d.ts +2 -2
- package/lib/components/FormComponents/SingleItem/SingleItem.js +2 -2
- package/lib/components/FormComponents/SingleItem/SingleItem.js.map +1 -1
- package/lib/components/FormComponents/SingleItem/SingleItemSwitcher.d.ts +2 -2
- package/lib/components/FormComponents/SingleItem/SingleItemSwitcher.js +3 -3
- package/lib/components/FormComponents/SingleItem/SingleItemSwitcher.js.map +1 -1
- package/lib/components/FormComponents/SingleItem/index.d.ts +1 -0
- package/lib/components/FormComponents/SingleItem/index.js +18 -0
- package/lib/components/FormComponents/SingleItem/index.js.map +1 -0
- package/lib/components/FormComponents/StringItem/StringItem.js +3 -2
- package/lib/components/FormComponents/StringItem/StringItem.js.map +1 -1
- package/lib/components/FormComponents/Tables/AddItemButton.d.ts +8 -0
- package/lib/components/FormComponents/Tables/AddItemButton.js +28 -0
- package/lib/components/FormComponents/Tables/AddItemButton.js.map +1 -0
- package/lib/components/FormComponents/Tables/AddRowButton.d.ts +8 -0
- package/lib/components/FormComponents/Tables/AddRowButton.js +28 -0
- package/lib/components/FormComponents/Tables/AddRowButton.js.map +1 -0
- package/lib/components/FormComponents/Tables/GroupTable.d.ts +10 -0
- package/lib/components/FormComponents/Tables/GroupTable.js +108 -0
- package/lib/components/FormComponents/Tables/GroupTable.js.map +1 -0
- package/lib/components/FormComponents/Tables/GroupTableRow.d.ts +10 -0
- package/lib/components/FormComponents/Tables/GroupTableRow.js +46 -0
- package/lib/components/FormComponents/Tables/GroupTableRow.js.map +1 -0
- package/lib/components/FormComponents/Tables/QItemGroupTable.js +7 -5
- package/lib/components/FormComponents/Tables/QItemGroupTable.js.map +1 -1
- package/lib/components/FormComponents/Tables/QItemGroupTableRow.js +2 -2
- package/lib/components/FormComponents/Tables/QItemGroupTableRow.js.map +1 -1
- package/lib/components/FormComponents/Tables/index.d.ts +1 -0
- package/lib/components/FormComponents/Tables/index.js +18 -0
- package/lib/components/FormComponents/Tables/index.js.map +1 -0
- package/lib/components/FormComponents/TextItem/TextItem.js +3 -2
- package/lib/components/FormComponents/TextItem/TextItem.js.map +1 -1
- package/lib/components/FormComponents/index.d.ts +3 -0
- package/lib/components/FormComponents/index.js +20 -0
- package/lib/components/FormComponents/index.js.map +1 -0
- package/lib/components/Renderer/BaseRenderer.js +26 -14
- package/lib/components/Renderer/BaseRenderer.js.map +1 -1
- package/lib/components/Renderer/FormBodyCollapsible.js +2 -2
- package/lib/components/Renderer/FormBodyCollapsible.js.map +1 -1
- package/lib/components/Renderer/FormBodyTabbed.js +3 -3
- package/lib/components/Renderer/FormBodyTabbed.js.map +1 -1
- package/lib/components/Renderer/FormTopLevelItem.d.ts +4 -4
- package/lib/components/Renderer/FormTopLevelItem.js +14 -1
- package/lib/components/Renderer/FormTopLevelItem.js.map +1 -1
- package/lib/components/Tabs/FormBodySingleTab.js +1 -1
- package/lib/components/Tabs/FormBodySingleTab.js.map +1 -1
- package/lib/components/Tabs/FormBodyTabList.d.ts +1 -0
- package/lib/components/Tabs/FormBodyTabList.js +3 -4
- package/lib/components/Tabs/FormBodyTabList.js.map +1 -1
- package/lib/components/Tabs/FormBodyTabListWrapper.d.ts +1 -1
- package/lib/components/Tabs/FormBodyTabListWrapper.js +6 -13
- package/lib/components/Tabs/FormBodyTabListWrapper.js.map +1 -1
- package/lib/components/Tabs/ShowCompletedTabsSection.d.ts +7 -0
- package/lib/components/Tabs/ShowCompletedTabsSection.js +34 -0
- package/lib/components/Tabs/ShowCompletedTabsSection.js.map +1 -0
- package/lib/components/index.d.ts +1 -0
- package/lib/components/index.js +1 -0
- package/lib/components/index.js.map +1 -1
- package/lib/hooks/index.d.ts +1 -0
- package/lib/hooks/index.js +2 -0
- package/lib/hooks/index.js.map +1 -0
- package/lib/hooks/useContextDisplayItems.d.ts +6 -0
- package/lib/hooks/useContextDisplayItems.js +30 -0
- package/lib/hooks/useContextDisplayItems.js.map +1 -0
- package/lib/hooks/useDecimalUpdateFromProp.d.ts +2 -0
- package/lib/hooks/useDecimalUpdateFromProp.js +29 -0
- package/lib/hooks/useDecimalUpdateFromProp.js.map +1 -0
- package/lib/hooks/useInitialiseRenderer.js +2 -2
- package/lib/hooks/useInitialiseRenderer.js.map +1 -1
- package/lib/hooks/useInitialiseRepeatAnswers.d.ts +2 -2
- package/lib/hooks/useInitialiseRepeatAnswers.js +21 -15
- package/lib/hooks/useInitialiseRepeatAnswers.js.map +1 -1
- package/lib/hooks/useInitialiseRepeatGroups.d.ts +2 -1
- package/lib/hooks/useInitialiseRepeatGroups.js +21 -15
- package/lib/hooks/useInitialiseRepeatGroups.js.map +1 -1
- package/lib/hooks/useIntegerUpdateFromProp.d.ts +2 -0
- package/lib/hooks/useIntegerUpdateFromProp.js +29 -0
- package/lib/hooks/useIntegerUpdateFromProp.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/useNumberUpdateFromProp.d.ts +2 -0
- package/lib/hooks/useNumberUpdateFromProp.js +29 -0
- package/lib/hooks/useNumberUpdateFromProp.js.map +1 -0
- package/lib/hooks/useRepeatItemState.d.ts +5 -0
- package/lib/hooks/useRepeatItemState.js +35 -0
- package/lib/hooks/useRepeatItemState.js.map +1 -0
- package/lib/hooks/useRepeatItemUpdateFromProp.d.ts +2 -0
- package/lib/hooks/useRepeatItemUpdateFromProp.js +29 -0
- package/lib/hooks/useRepeatItemUpdateFromProp.js.map +1 -0
- package/lib/hooks/useStringField.d.ts +2 -0
- package/lib/hooks/useStringField.js +29 -0
- package/lib/hooks/useStringField.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/hooks/useStringUpdateFromProp.d.ts +2 -0
- package/lib/hooks/useStringUpdateFromProp.js +29 -0
- package/lib/hooks/useStringUpdateFromProp.js.map +1 -0
- package/lib/hooks/useTerminologyServerQuery.js +3 -6
- package/lib/hooks/useTerminologyServerQuery.js.map +1 -1
- package/lib/index.d.ts +16 -0
- package/lib/index.js +29 -2
- package/lib/index.js.map +1 -1
- package/lib/interfaces/questionnaireStore.interface.d.ts +1 -0
- package/lib/interfaces/renderProps.interface.d.ts +3 -0
- package/lib/stores/useQuestionnaireResponseStore.d.ts +2 -1
- package/lib/stores/useQuestionnaireResponseStore.js +17 -10
- package/lib/stores/useQuestionnaireResponseStore.js.map +1 -1
- package/lib/stores/useQuestionnaireStore.d.ts +2 -1
- package/lib/stores/useQuestionnaireStore.js +5 -2
- package/lib/stores/useQuestionnaireStore.js.map +1 -1
- package/lib/theme/overrides/Overrides.js +1 -2
- package/lib/theme/overrides/Overrides.js.map +1 -1
- package/lib/utils/calculatedExpression.js +2 -2
- package/lib/utils/calculatedExpression.js.map +1 -1
- package/lib/utils/formChanges.d.ts +18 -0
- package/lib/utils/formChanges.js +91 -0
- package/lib/utils/formChanges.js.map +1 -0
- package/lib/utils/formChangesOld.d.ts +18 -0
- package/lib/utils/formChangesOld.js +91 -0
- package/lib/utils/formChangesOld.js.map +1 -0
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/index.js +18 -0
- package/lib/utils/index.js.map +1 -0
- package/lib/utils/mapItem.d.ts +2 -2
- package/lib/utils/mapItem.js +3 -3
- package/lib/utils/mapItem.js.map +1 -1
- package/lib/utils/qItem.d.ts +2 -0
- package/lib/utils/qItem.js +22 -0
- package/lib/utils/qItem.js.map +1 -1
- package/lib/utils/qrItem.d.ts +3 -4
- package/lib/utils/qrItem.js +94 -96
- package/lib/utils/qrItem.js.map +1 -1
- package/lib/utils/questionnaireStoreUtils/createQuestionaireModel.js +4 -0
- package/lib/utils/questionnaireStoreUtils/createQuestionaireModel.js.map +1 -1
- package/lib/utils/repopulate.d.ts +9 -0
- package/lib/utils/repopulate.js +133 -0
- package/lib/utils/repopulate.js.map +1 -0
- package/lib/utils/repopulateGenerateItems.d.ts +9 -0
- package/lib/utils/repopulateGenerateItems.js +133 -0
- package/lib/utils/repopulateGenerateItems.js.map +1 -0
- package/lib/utils/repopulateIntoResponse.d.ts +3 -0
- package/lib/utils/repopulateIntoResponse.js +92 -0
- package/lib/utils/repopulateIntoResponse.js.map +1 -0
- package/lib/utils/repopulateItems.d.ts +9 -0
- package/lib/utils/repopulateItems.js +130 -0
- package/lib/utils/repopulateItems.js.map +1 -0
- package/lib/utils/repopulateRepeatGroup.d.ts +4 -0
- package/lib/utils/repopulateRepeatGroup.js +54 -0
- package/lib/utils/repopulateRepeatGroup.js.map +1 -0
- package/package.json +7 -5
- package/src/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.tsx +1 -2
- package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionFields.tsx +85 -0
- package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.tsx +35 -58
- package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetFields.tsx +79 -0
- package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.tsx +37 -50
- package/src/components/FormComponents/ChoiceItems/ChoiceItemSwitcher.tsx +10 -5
- package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionFields.tsx +48 -0
- package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.tsx +25 -53
- package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetFields.tsx +83 -0
- package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.tsx +27 -49
- package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.tsx +81 -0
- package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.tsx +19 -54
- package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.tsx +97 -0
- package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.tsx +22 -60
- package/src/components/FormComponents/DecimalItem/DecimalItem.tsx +3 -2
- package/src/components/FormComponents/GridGroup/GridGroup.tsx +2 -2
- package/src/components/FormComponents/GridGroup/GridRow.tsx +2 -2
- package/src/components/FormComponents/GroupItem/GroupItem.tsx +3 -3
- package/src/components/FormComponents/GroupItem/GroupItemSwitcher.tsx +4 -4
- package/src/components/FormComponents/IntegerItem/IntegerItem.tsx +3 -2
- package/src/components/FormComponents/Item.styles.ts +2 -2
- package/src/components/FormComponents/ItemParts/RadioAnswerOptionButtons.tsx +72 -0
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteField.tsx +131 -0
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.tsx +38 -93
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionFields.tsx +112 -0
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceCheckboxAnswerOptionItem.tsx +57 -76
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceItemSwitcher.tsx +8 -5
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionFields.tsx +72 -0
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceRadioAnswerOptionItem.tsx +12 -59
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionField.tsx +54 -0
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerOptionItem.tsx +40 -64
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetField.tsx +63 -0
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.tsx +22 -50
- package/src/components/FormComponents/RepeatGroup/RepeatGroup.tsx +4 -3
- package/src/{theme/overrides/Backdrop.ts → components/FormComponents/RepeatGroup/index.ts} +1 -17
- package/src/components/FormComponents/RepeatItem/RepeatItem.tsx +1 -1
- package/src/components/FormComponents/SingleItem/SingleItem.tsx +6 -3
- package/src/components/FormComponents/SingleItem/SingleItemSwitcher.tsx +7 -3
- package/src/components/FormComponents/SingleItem/index.ts +18 -0
- package/src/components/FormComponents/StringItem/StringItem.tsx +3 -2
- package/src/components/FormComponents/Tables/AddRowButton.tsx +49 -0
- package/src/components/FormComponents/Tables/{QItemGroupTable.tsx → GroupTable.tsx} +21 -23
- package/src/components/FormComponents/Tables/{QItemGroupTableRow.tsx → GroupTableRow.tsx} +4 -4
- package/src/components/FormComponents/Tables/index.ts +18 -0
- package/src/components/FormComponents/TextItem/TextItem.tsx +3 -2
- package/src/components/FormComponents/index.ts +20 -0
- package/src/components/Renderer/BaseRenderer.tsx +39 -18
- package/src/components/Renderer/FormBodyCollapsible.tsx +2 -2
- package/src/components/Renderer/FormBodyTabbed.tsx +3 -3
- package/src/components/Renderer/FormTopLevelItem.tsx +33 -4
- package/src/components/Tabs/FormBodySingleTab.tsx +1 -1
- package/src/components/Tabs/FormBodyTabList.tsx +5 -8
- package/src/components/Tabs/FormBodyTabListWrapper.tsx +15 -26
- package/src/components/Tabs/ShowCompletedTabsSection.tsx +52 -0
- package/src/components/index.ts +1 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useContextDisplayItems.ts +40 -0
- package/src/hooks/useInitialiseRenderer.ts +2 -2
- package/src/hooks/useInitialiseRepeatAnswers.ts +28 -17
- package/src/hooks/useInitialiseRepeatGroups.ts +28 -17
- package/src/hooks/useNumberInput.ts +38 -0
- package/src/hooks/useStringInput.ts +38 -0
- package/src/hooks/useTerminologyServerQuery.ts +3 -6
- package/src/index.ts +45 -2
- package/src/interfaces/questionnaireStore.interface.ts +1 -0
- package/src/interfaces/renderProps.interface.ts +4 -0
- package/src/stores/useQuestionnaireResponseStore.ts +15 -10
- package/src/stores/useQuestionnaireStore.ts +10 -3
- package/src/theme/overrides/Overrides.ts +0 -2
- package/src/utils/calculatedExpression.ts +2 -2
- package/src/utils/formChanges.ts +141 -0
- package/src/utils/index.ts +18 -0
- package/src/utils/mapItem.ts +6 -4
- package/src/utils/qItem.ts +29 -0
- package/src/utils/qrItem.ts +108 -97
- package/src/utils/questionnaireStoreUtils/createQuestionaireModel.ts +4 -0
- package/src/utils/repopulateIntoResponse.ts +153 -0
- package/src/utils/repopulateItems.ts +206 -0
- package/src/utils/repopulateRepeatGroup.ts +68 -0
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
-
import React, { useCallback
|
|
18
|
+
import React, { useCallback } from 'react';
|
|
19
19
|
import type {
|
|
20
20
|
PropsWithIsRepeatedAttribute,
|
|
21
21
|
PropsWithIsTabledAttribute,
|
|
@@ -31,6 +31,7 @@ import { FullWidthFormComponentBox } from '../../Box.styles';
|
|
|
31
31
|
import StringField from './StringField';
|
|
32
32
|
import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
|
|
33
33
|
import useStringCalculatedExpression from '../../../hooks/useStringCalculatedExpression';
|
|
34
|
+
import useStringInput from '../../../hooks/useStringInput';
|
|
34
35
|
|
|
35
36
|
interface StringItemProps
|
|
36
37
|
extends PropsWithQrItemChangeHandler<QuestionnaireResponseItem>,
|
|
@@ -58,7 +59,7 @@ function StringItem(props: StringItemProps) {
|
|
|
58
59
|
if (qrItem?.answer && qrItem?.answer[0].valueString) {
|
|
59
60
|
valueString = qrItem.answer[0].valueString;
|
|
60
61
|
}
|
|
61
|
-
const [input, setInput] =
|
|
62
|
+
const [input, setInput] = useStringInput(valueString);
|
|
62
63
|
|
|
63
64
|
// Perform validation checks
|
|
64
65
|
const feedback = useValidationError(input, regexValidation, maxLength);
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2023 Commonwealth Scientific and Industrial Research
|
|
3
|
+
* Organisation (CSIRO) ABN 41 687 119 230.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import React from 'react';
|
|
19
|
+
import Box from '@mui/material/Box';
|
|
20
|
+
import Button from '@mui/material/Button';
|
|
21
|
+
import AddIcon from '@mui/icons-material/Add';
|
|
22
|
+
import type { RepeatGroupSingle } from '../../../interfaces/repeatGroup.interface';
|
|
23
|
+
|
|
24
|
+
interface AddItemButtonProps {
|
|
25
|
+
repeatGroups: RepeatGroupSingle[];
|
|
26
|
+
onAddItem: () => void;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function AddRowButton(props: AddItemButtonProps) {
|
|
30
|
+
const { repeatGroups, onAddItem } = props;
|
|
31
|
+
|
|
32
|
+
const isDisabled = repeatGroups[repeatGroups.length - 1].qrItem === null;
|
|
33
|
+
|
|
34
|
+
return (
|
|
35
|
+
<Box display="flex" flexDirection="row-reverse">
|
|
36
|
+
<Button
|
|
37
|
+
variant="contained"
|
|
38
|
+
size="small"
|
|
39
|
+
startIcon={<AddIcon />}
|
|
40
|
+
disabled={isDisabled}
|
|
41
|
+
onClick={onAddItem}
|
|
42
|
+
data-test="button-add-repeat-item">
|
|
43
|
+
Add Row
|
|
44
|
+
</Button>
|
|
45
|
+
</Box>
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export default AddRowButton;
|
|
@@ -18,10 +18,8 @@
|
|
|
18
18
|
import React, { useMemo, useState } from 'react';
|
|
19
19
|
|
|
20
20
|
import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
|
|
21
|
-
import Button from '@mui/material/Button';
|
|
22
21
|
import Divider from '@mui/material/Divider';
|
|
23
22
|
import Paper from '@mui/material/Paper';
|
|
24
|
-
import Stack from '@mui/material/Stack';
|
|
25
23
|
import Table from '@mui/material/Table';
|
|
26
24
|
import TableBody from '@mui/material/TableBody';
|
|
27
25
|
import TableCell from '@mui/material/TableCell';
|
|
@@ -29,9 +27,7 @@ import TableContainer from '@mui/material/TableContainer';
|
|
|
29
27
|
import TableHead from '@mui/material/TableHead';
|
|
30
28
|
import TableRow from '@mui/material/TableRow';
|
|
31
29
|
import Typography from '@mui/material/Typography';
|
|
32
|
-
|
|
33
|
-
import AddIcon from '@mui/icons-material/Add';
|
|
34
|
-
import QItemGroupTableRow from './QItemGroupTableRow';
|
|
30
|
+
import GroupTableRow from './GroupTableRow';
|
|
35
31
|
import { HeaderTableCell } from './Table.styles';
|
|
36
32
|
import { QGroupContainerBox } from '../../Box.styles';
|
|
37
33
|
import { mapQItemsIndex } from '../../../utils/mapItem';
|
|
@@ -41,6 +37,8 @@ import { nanoid } from 'nanoid';
|
|
|
41
37
|
import { createEmptyQrItem } from '../../../utils/qrItem';
|
|
42
38
|
import DeleteRowButton from './DeleteRowButton';
|
|
43
39
|
import LabelWrapper from '../ItemParts/ItemLabelWrapper';
|
|
40
|
+
import cloneDeep from 'lodash.clonedeep';
|
|
41
|
+
import AddRowButton from './AddRowButton';
|
|
44
42
|
|
|
45
43
|
interface Props extends PropsWithQrRepeatGroupChangeHandler {
|
|
46
44
|
qItem: QuestionnaireItem;
|
|
@@ -48,7 +46,7 @@ interface Props extends PropsWithQrRepeatGroupChangeHandler {
|
|
|
48
46
|
groupCardElevation: number;
|
|
49
47
|
}
|
|
50
48
|
|
|
51
|
-
function
|
|
49
|
+
function GroupTable(props: Props) {
|
|
52
50
|
const { qItem, qrItems, groupCardElevation, onQrRepeatGroupChange } = props;
|
|
53
51
|
|
|
54
52
|
const initialisedGroupTables = useInitialiseGroupTable(qrItems);
|
|
@@ -84,7 +82,9 @@ function QItemGroupTable(props: Props) {
|
|
|
84
82
|
setTableRows(updatedTableRows);
|
|
85
83
|
onQrRepeatGroupChange({
|
|
86
84
|
linkId: qItem.linkId,
|
|
87
|
-
qrItems: updatedTableRows.flatMap((singleRow) =>
|
|
85
|
+
qrItems: updatedTableRows.flatMap((singleRow) =>
|
|
86
|
+
singleRow.qrItem ? [cloneDeep(singleRow.qrItem)] : []
|
|
87
|
+
)
|
|
88
88
|
});
|
|
89
89
|
}
|
|
90
90
|
|
|
@@ -96,7 +96,9 @@ function QItemGroupTable(props: Props) {
|
|
|
96
96
|
setTableRows(updatedTableRows);
|
|
97
97
|
onQrRepeatGroupChange({
|
|
98
98
|
linkId: qItem.linkId,
|
|
99
|
-
qrItems: updatedTableRows.flatMap((singleRow) =>
|
|
99
|
+
qrItems: updatedTableRows.flatMap((singleRow) =>
|
|
100
|
+
singleRow.qrItem ? [cloneDeep(singleRow.qrItem)] : []
|
|
101
|
+
)
|
|
100
102
|
});
|
|
101
103
|
}
|
|
102
104
|
|
|
@@ -112,22 +114,18 @@ function QItemGroupTable(props: Props) {
|
|
|
112
114
|
|
|
113
115
|
return (
|
|
114
116
|
<QGroupContainerBox cardElevation={groupCardElevation} isRepeated={false} py={3}>
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
117
|
+
{groupCardElevation !== 1 ? (
|
|
118
|
+
<>
|
|
119
|
+
<Typography fontSize={13} variant="h6">
|
|
120
|
+
<LabelWrapper qItem={qItem} />
|
|
121
|
+
</Typography>
|
|
122
|
+
<Divider sx={{ my: 1 }} light />
|
|
123
|
+
</>
|
|
124
|
+
) : null}
|
|
119
125
|
<TableContainer component={Paper} elevation={groupCardElevation}>
|
|
120
126
|
<Table>
|
|
121
127
|
<caption>
|
|
122
|
-
<
|
|
123
|
-
<Button
|
|
124
|
-
variant="contained"
|
|
125
|
-
size="small"
|
|
126
|
-
startIcon={<AddIcon />}
|
|
127
|
-
onClick={handleAddRow}>
|
|
128
|
-
Add Row
|
|
129
|
-
</Button>
|
|
130
|
-
</Stack>
|
|
128
|
+
<AddRowButton repeatGroups={tableRows} onAddItem={handleAddRow} />
|
|
131
129
|
</caption>
|
|
132
130
|
<TableHead>
|
|
133
131
|
<TableRow>
|
|
@@ -146,7 +144,7 @@ function QItemGroupTable(props: Props) {
|
|
|
146
144
|
|
|
147
145
|
return (
|
|
148
146
|
<TableRow key={nanoId}>
|
|
149
|
-
<
|
|
147
|
+
<GroupTableRow
|
|
150
148
|
qItem={qItem}
|
|
151
149
|
qrItem={answeredQrItem}
|
|
152
150
|
qItemsIndexMap={qItemsIndexMap}
|
|
@@ -167,4 +165,4 @@ function QItemGroupTable(props: Props) {
|
|
|
167
165
|
);
|
|
168
166
|
}
|
|
169
167
|
|
|
170
|
-
export default
|
|
168
|
+
export default GroupTable;
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
import React from 'react';
|
|
19
19
|
import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
|
|
20
|
-
import { createQrGroup,
|
|
20
|
+
import { createQrGroup, updateQrItemsInGroup } from '../../../utils/qrItem';
|
|
21
21
|
import SingleItem from '../SingleItem/SingleItem';
|
|
22
22
|
import { getQrItemsIndex } from '../../../utils/mapItem';
|
|
23
23
|
import { StandardTableCell } from './Table.styles';
|
|
@@ -29,7 +29,7 @@ interface Props extends PropsWithQrItemChangeHandler<QuestionnaireResponseItem>
|
|
|
29
29
|
qItemsIndexMap: Record<string, number>;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
function
|
|
32
|
+
function GroupTableRow(props: Props) {
|
|
33
33
|
const { qItem, qrItem, qItemsIndexMap, onQrItemChange } = props;
|
|
34
34
|
|
|
35
35
|
const rowItems = qItem.item;
|
|
@@ -42,7 +42,7 @@ function QItemGroupTableRow(props: Props) {
|
|
|
42
42
|
|
|
43
43
|
function handleQrRowItemChange(newQrRowItem: QuestionnaireResponseItem) {
|
|
44
44
|
const qrRow: QuestionnaireResponseItem = { ...row };
|
|
45
|
-
|
|
45
|
+
updateQrItemsInGroup(newQrRowItem, null, qrRow, qItemsIndexMap);
|
|
46
46
|
onQrItemChange(qrRow);
|
|
47
47
|
}
|
|
48
48
|
|
|
@@ -74,4 +74,4 @@ function QItemGroupTableRow(props: Props) {
|
|
|
74
74
|
);
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
export default
|
|
77
|
+
export default GroupTableRow;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2023 Commonwealth Scientific and Industrial Research
|
|
3
|
+
* Organisation (CSIRO) ABN 41 687 119 230.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
export { default as GroupTable } from './GroupTable';
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
-
import React, { useCallback
|
|
18
|
+
import React, { useCallback } from 'react';
|
|
19
19
|
import type {
|
|
20
20
|
PropsWithIsRepeatedAttribute,
|
|
21
21
|
PropsWithQrItemChangeHandler
|
|
@@ -30,6 +30,7 @@ import { FullWidthFormComponentBox } from '../../Box.styles';
|
|
|
30
30
|
import TextField from './TextField';
|
|
31
31
|
import useStringCalculatedExpression from '../../../hooks/useStringCalculatedExpression';
|
|
32
32
|
import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
|
|
33
|
+
import useStringInput from '../../../hooks/useStringInput';
|
|
33
34
|
|
|
34
35
|
interface TextItemProps
|
|
35
36
|
extends PropsWithQrItemChangeHandler<QuestionnaireResponseItem>,
|
|
@@ -57,7 +58,7 @@ function TextItem(props: TextItemProps) {
|
|
|
57
58
|
if (qrItem?.answer && qrItem?.answer[0].valueString) {
|
|
58
59
|
valueText = qrItem.answer[0].valueString;
|
|
59
60
|
}
|
|
60
|
-
const [input, setInput] =
|
|
61
|
+
const [input, setInput] = useStringInput(valueText);
|
|
61
62
|
|
|
62
63
|
// Perform validation checks
|
|
63
64
|
const feedback = useValidationError(input, regexValidation, maxLength);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2023 Commonwealth Scientific and Industrial Research
|
|
3
|
+
* Organisation (CSIRO) ABN 41 687 119 230.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
export * from './SingleItem';
|
|
19
|
+
export * from './RepeatGroup';
|
|
20
|
+
export * from './Tables';
|
|
@@ -15,13 +15,17 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
-
import React from 'react';
|
|
18
|
+
import React, { useMemo } from 'react';
|
|
19
19
|
import Container from '@mui/material/Container';
|
|
20
20
|
import Fade from '@mui/material/Fade';
|
|
21
21
|
import FormTopLevelItem from './FormTopLevelItem';
|
|
22
22
|
import type { QuestionnaireResponse, QuestionnaireResponseItem } from 'fhir/r4';
|
|
23
23
|
import useQuestionnaireStore from '../../stores/useQuestionnaireStore';
|
|
24
24
|
import useQuestionnaireResponseStore from '../../stores/useQuestionnaireResponseStore';
|
|
25
|
+
import cloneDeep from 'lodash.clonedeep';
|
|
26
|
+
import { getQrItemsIndex, mapQItemsIndex } from '../../utils/mapItem';
|
|
27
|
+
import { updateQrItemsInGroup } from '../../utils/qrItem';
|
|
28
|
+
import type { QrRepeatGroup } from '../../interfaces/repeatGroup.interface';
|
|
25
29
|
|
|
26
30
|
function BaseRenderer() {
|
|
27
31
|
const sourceQuestionnaire = useQuestionnaireStore((state) => state.sourceQuestionnaire);
|
|
@@ -29,48 +33,65 @@ function BaseRenderer() {
|
|
|
29
33
|
const updatableResponse = useQuestionnaireResponseStore((state) => state.updatableResponse);
|
|
30
34
|
const updateResponse = useQuestionnaireResponseStore((state) => state.updateResponse);
|
|
31
35
|
|
|
32
|
-
|
|
33
|
-
|
|
36
|
+
const qItemsIndexMap = useMemo(() => mapQItemsIndex(sourceQuestionnaire), [sourceQuestionnaire]);
|
|
37
|
+
|
|
38
|
+
function handleTopLevelQRItemSingleChange(
|
|
39
|
+
newTopLevelQRItem: QuestionnaireResponseItem,
|
|
40
|
+
index: number
|
|
41
|
+
) {
|
|
42
|
+
const updatedResponse: QuestionnaireResponse = cloneDeep(updatableResponse);
|
|
43
|
+
if (!updatedResponse.item || updatedResponse.item.length === 0) {
|
|
34
44
|
return;
|
|
35
45
|
}
|
|
36
46
|
|
|
37
|
-
const updatedItems = [...
|
|
38
|
-
updatedItems[index] =
|
|
47
|
+
const updatedItems = [...updatedResponse.item]; // Copy the original array of items
|
|
48
|
+
updatedItems[index] = newTopLevelQRItem; // Modify the item at the specified index
|
|
39
49
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
50
|
+
updatedResponse.item = updatedItems;
|
|
51
|
+
|
|
52
|
+
updateExpressions(updatedResponse);
|
|
53
|
+
updateResponse(updatedResponse);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function handleTopLevelQRItemMultipleChange(newTopLevelQRItems: QrRepeatGroup) {
|
|
57
|
+
const updatedResponse: QuestionnaireResponse = cloneDeep(updatableResponse);
|
|
58
|
+
if (!updatedResponse.item || updatedResponse.item.length === 0) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
updateQrItemsInGroup(null, newTopLevelQRItems, updatedResponse, qItemsIndexMap);
|
|
44
63
|
|
|
45
64
|
updateExpressions(updatedResponse);
|
|
46
65
|
updateResponse(updatedResponse);
|
|
47
66
|
}
|
|
48
67
|
|
|
49
68
|
const topLevelQItems = sourceQuestionnaire.item;
|
|
50
|
-
const topLevelQRItems = updatableResponse.item;
|
|
69
|
+
const topLevelQRItems = cloneDeep(updatableResponse.item) ?? [];
|
|
51
70
|
|
|
52
71
|
if (!topLevelQItems) {
|
|
53
72
|
return <>Questionnaire does not have any items</>;
|
|
54
73
|
}
|
|
55
74
|
|
|
75
|
+
// If an item has multiple answers, it is a repeat group
|
|
76
|
+
const topLevelQRItemsByIndex: (QuestionnaireResponseItem | QuestionnaireResponseItem[])[] =
|
|
77
|
+
getQrItemsIndex(topLevelQItems, topLevelQRItems, qItemsIndexMap);
|
|
78
|
+
|
|
56
79
|
return (
|
|
57
80
|
<Fade in={true} timeout={500}>
|
|
58
81
|
<Container maxWidth="xl">
|
|
59
82
|
{topLevelQItems.map((qItem, index) => {
|
|
60
|
-
const
|
|
61
|
-
? topLevelQRItems[index]
|
|
62
|
-
: {
|
|
63
|
-
linkId: qItem.linkId,
|
|
64
|
-
text: qItem.text
|
|
65
|
-
};
|
|
83
|
+
const qrItemOrItems = topLevelQRItemsByIndex[index];
|
|
66
84
|
|
|
67
85
|
return (
|
|
68
86
|
<FormTopLevelItem
|
|
69
87
|
key={qItem.linkId}
|
|
70
88
|
topLevelQItem={qItem}
|
|
71
|
-
|
|
89
|
+
topLevelQRItemOrItems={qrItemOrItems}
|
|
72
90
|
onQrItemChange={(newTopLevelQRItem) =>
|
|
73
|
-
|
|
91
|
+
handleTopLevelQRItemSingleChange(newTopLevelQRItem, index)
|
|
92
|
+
}
|
|
93
|
+
onQrRepeatGroupChange={(newTopLevelQRItems) =>
|
|
94
|
+
handleTopLevelQRItemMultipleChange(newTopLevelQRItems)
|
|
74
95
|
}
|
|
75
96
|
/>
|
|
76
97
|
);
|
|
@@ -19,7 +19,7 @@ import React, { useMemo } from 'react';
|
|
|
19
19
|
import Stack from '@mui/material/Stack';
|
|
20
20
|
import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
|
|
21
21
|
import { getQrItemsIndex, mapQItemsIndex } from '../../utils/mapItem';
|
|
22
|
-
import {
|
|
22
|
+
import { updateQrItemsInGroup } from '../../utils/qrItem';
|
|
23
23
|
import type { PropsWithQrItemChangeHandler } from '../../interfaces/renderProps.interface';
|
|
24
24
|
import useQuestionnaireStore from '../../stores/useQuestionnaireStore';
|
|
25
25
|
import FormBodySingleCollapsibleWrapper from './FormBodySingleCollapsibleWrapper';
|
|
@@ -46,7 +46,7 @@ function FormBodyCollapsibleWrapper(props: FormBodyCollapsibleProps) {
|
|
|
46
46
|
const qrItems = topLevelQRItem.item;
|
|
47
47
|
|
|
48
48
|
function handleQrGroupChange(qrItem: QuestionnaireResponseItem) {
|
|
49
|
-
|
|
49
|
+
updateQrItemsInGroup(qrItem, null, topLevelQRItem, indexMap);
|
|
50
50
|
onQrItemChange(topLevelQRItem);
|
|
51
51
|
}
|
|
52
52
|
|
|
@@ -22,7 +22,7 @@ import TabContext from '@mui/lab/TabContext';
|
|
|
22
22
|
import TabPanel from '@mui/lab/TabPanel';
|
|
23
23
|
import { getQrItemsIndex, mapQItemsIndex } from '../../utils/mapItem';
|
|
24
24
|
import GroupItem from '../FormComponents/GroupItem/GroupItem';
|
|
25
|
-
import {
|
|
25
|
+
import { updateQrItemsInGroup } from '../../utils/qrItem';
|
|
26
26
|
import FormBodyTabListWrapper from '../Tabs/FormBodyTabListWrapper';
|
|
27
27
|
import type { PropsWithQrItemChangeHandler } from '../../interfaces/renderProps.interface';
|
|
28
28
|
import useQuestionnaireStore from '../../stores/useQuestionnaireStore';
|
|
@@ -47,7 +47,7 @@ function FormBodyTabbed(props: FormBodyTabbedProps) {
|
|
|
47
47
|
const qrItems = topLevelQRItem.item;
|
|
48
48
|
|
|
49
49
|
function handleQrGroupChange(qrItem: QuestionnaireResponseItem) {
|
|
50
|
-
|
|
50
|
+
updateQrItemsInGroup(qrItem, null, topLevelQRItem, indexMap);
|
|
51
51
|
onQrItemChange(topLevelQRItem);
|
|
52
52
|
}
|
|
53
53
|
|
|
@@ -61,7 +61,7 @@ function FormBodyTabbed(props: FormBodyTabbedProps) {
|
|
|
61
61
|
<Grid container spacing={2}>
|
|
62
62
|
<TabContext value={currentTab.toString()}>
|
|
63
63
|
<Grid item xs={12} md={3.5} lg={3} xl={2.75}>
|
|
64
|
-
<FormBodyTabListWrapper
|
|
64
|
+
<FormBodyTabListWrapper topLevelItems={qItems} currentTabIndex={currentTab} tabs={tabs} />
|
|
65
65
|
</Grid>
|
|
66
66
|
|
|
67
67
|
<Grid item xs={12} md={8.5} lg={9} xl={9.25}>
|
|
@@ -21,17 +21,24 @@ import FormBodyTabbed from './FormBodyTabbed';
|
|
|
21
21
|
import { containsTabs, isTabContainer } from '../../utils/tabs';
|
|
22
22
|
import GroupItem from '../FormComponents/GroupItem/GroupItem';
|
|
23
23
|
import SingleItem from '../FormComponents/SingleItem/SingleItem';
|
|
24
|
-
import type {
|
|
24
|
+
import type {
|
|
25
|
+
PropsWithQrItemChangeHandler,
|
|
26
|
+
PropsWithQrRepeatGroupChangeHandler
|
|
27
|
+
} from '../../interfaces/renderProps.interface';
|
|
25
28
|
import FormBodyCollapsible from './FormBodyCollapsible';
|
|
26
29
|
import useResponsive from '../../hooks/useResponsive';
|
|
30
|
+
import useHidden from '../../hooks/useHidden';
|
|
31
|
+
import GroupItemSwitcher from '../FormComponents/GroupItem/GroupItemSwitcher';
|
|
27
32
|
|
|
28
|
-
interface FormTopLevelItemProps
|
|
33
|
+
interface FormTopLevelItemProps
|
|
34
|
+
extends PropsWithQrItemChangeHandler<QuestionnaireResponseItem>,
|
|
35
|
+
PropsWithQrRepeatGroupChangeHandler {
|
|
29
36
|
topLevelQItem: QuestionnaireItem;
|
|
30
|
-
|
|
37
|
+
topLevelQRItemOrItems: QuestionnaireResponseItem | QuestionnaireResponseItem[];
|
|
31
38
|
}
|
|
32
39
|
|
|
33
40
|
function FormTopLevelItem(props: FormTopLevelItemProps) {
|
|
34
|
-
const { topLevelQItem,
|
|
41
|
+
const { topLevelQItem, topLevelQRItemOrItems, onQrItemChange, onQrRepeatGroupChange } = props;
|
|
35
42
|
|
|
36
43
|
const itemIsTabContainer = isTabContainer(topLevelQItem);
|
|
37
44
|
const itemContainsTabs = containsTabs(topLevelQItem);
|
|
@@ -40,6 +47,28 @@ function FormTopLevelItem(props: FormTopLevelItemProps) {
|
|
|
40
47
|
|
|
41
48
|
const itemIsGroup = topLevelQItem.type === 'group';
|
|
42
49
|
|
|
50
|
+
const itemIsHidden = useHidden(topLevelQItem);
|
|
51
|
+
if (itemIsHidden) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// If item has multiple answers, use a group item switcher to determine how to render it.
|
|
56
|
+
const hasMultipleAnswers = Array.isArray(topLevelQRItemOrItems);
|
|
57
|
+
if (hasMultipleAnswers) {
|
|
58
|
+
return (
|
|
59
|
+
<GroupItemSwitcher
|
|
60
|
+
qItem={topLevelQItem}
|
|
61
|
+
qrItemOrItems={topLevelQRItemOrItems}
|
|
62
|
+
groupCardElevation={1}
|
|
63
|
+
onQrItemChange={onQrItemChange}
|
|
64
|
+
onQrRepeatGroupChange={onQrRepeatGroupChange}
|
|
65
|
+
/>
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// At this point, item only has one answer
|
|
70
|
+
const topLevelQRItem = topLevelQRItemOrItems;
|
|
71
|
+
|
|
43
72
|
// If form is tabbed, it is rendered as a tabbed form
|
|
44
73
|
if (itemContainsTabs || itemIsTabContainer) {
|
|
45
74
|
if (isDesktop) {
|
|
@@ -46,7 +46,7 @@ const FormBodySingleTab = memo(function FormBodySingleTab(props: FormBodySingleT
|
|
|
46
46
|
<>
|
|
47
47
|
<ListItemButton
|
|
48
48
|
selected={selected}
|
|
49
|
-
sx={{ my: 0.
|
|
49
|
+
sx={{ my: 0.15, minHeight: '36px' }}
|
|
50
50
|
onClick={handleTabClick}>
|
|
51
51
|
<ListItemText
|
|
52
52
|
primary={
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
-
import React, { memo
|
|
18
|
+
import React, { memo } from 'react';
|
|
19
19
|
import Collapse from '@mui/material/Collapse';
|
|
20
20
|
import { TransitionGroup } from 'react-transition-group';
|
|
21
21
|
import { getShortText } from '../../utils/itemControl';
|
|
@@ -23,27 +23,24 @@ import type { QuestionnaireItem } from 'fhir/r4';
|
|
|
23
23
|
import FormBodySingleTab from './FormBodySingleTab';
|
|
24
24
|
import type { Tabs } from '../../interfaces/tab.interface';
|
|
25
25
|
import useQuestionnaireStore from '../../stores/useQuestionnaireStore';
|
|
26
|
-
import {
|
|
26
|
+
import { isTabHidden } from '../../utils/tabs';
|
|
27
27
|
|
|
28
28
|
interface FormBodyTabListProps {
|
|
29
29
|
topLevelItems: QuestionnaireItem[];
|
|
30
30
|
currentTabIndex: number;
|
|
31
31
|
tabs: Tabs;
|
|
32
32
|
completedTabsCollapsed: boolean;
|
|
33
|
+
allContextDisplayItems: QuestionnaireItem[][];
|
|
33
34
|
}
|
|
34
35
|
|
|
35
36
|
const FormBodyTabList = memo(function FormBodyTabList(props: FormBodyTabListProps) {
|
|
36
|
-
const { topLevelItems, currentTabIndex, tabs, completedTabsCollapsed } =
|
|
37
|
+
const { topLevelItems, currentTabIndex, tabs, completedTabsCollapsed, allContextDisplayItems } =
|
|
38
|
+
props;
|
|
37
39
|
|
|
38
40
|
const enableWhenIsActivated = useQuestionnaireStore((state) => state.enableWhenIsActivated);
|
|
39
41
|
const enableWhenItems = useQuestionnaireStore((state) => state.enableWhenItems);
|
|
40
42
|
const enableWhenExpressions = useQuestionnaireStore((state) => state.enableWhenExpressions);
|
|
41
43
|
|
|
42
|
-
const allContextDisplayItems = useMemo(
|
|
43
|
-
() => topLevelItems.map((topLevelItem) => getContextDisplays(topLevelItem)),
|
|
44
|
-
[topLevelItems]
|
|
45
|
-
);
|
|
46
|
-
|
|
47
44
|
return (
|
|
48
45
|
<TransitionGroup>
|
|
49
46
|
{topLevelItems.map((qItem, i) => {
|
|
@@ -21,15 +21,13 @@ import Card from '@mui/material/Card';
|
|
|
21
21
|
import { PrimarySelectableList } from '../Lists.styles';
|
|
22
22
|
import type { QuestionnaireItem } from 'fhir/r4';
|
|
23
23
|
import type { Tabs } from '../../interfaces/tab.interface';
|
|
24
|
-
import { IconButton } from '@mui/material';
|
|
25
|
-
import ExpandLess from '@mui/icons-material/ExpandLess';
|
|
26
|
-
import ExpandMore from '@mui/icons-material/ExpandMore';
|
|
27
|
-
import Typography from '@mui/material/Typography';
|
|
28
24
|
import Divider from '@mui/material/Divider';
|
|
29
25
|
import FormBodyTabList from './FormBodyTabList';
|
|
26
|
+
import ShowCompletedTabsSection from './ShowCompletedTabsSection';
|
|
27
|
+
import useContextDisplayItems from '../../hooks/useContextDisplayItems';
|
|
30
28
|
|
|
31
29
|
interface FormBodyTabListWrapperProps {
|
|
32
|
-
|
|
30
|
+
topLevelItems: QuestionnaireItem[];
|
|
33
31
|
currentTabIndex: number;
|
|
34
32
|
tabs: Tabs;
|
|
35
33
|
}
|
|
@@ -37,39 +35,30 @@ interface FormBodyTabListWrapperProps {
|
|
|
37
35
|
const FormBodyTabListWrapper = memo(function FormBodyTabListWrapper(
|
|
38
36
|
props: FormBodyTabListWrapperProps
|
|
39
37
|
) {
|
|
40
|
-
const {
|
|
38
|
+
const { topLevelItems, currentTabIndex, tabs } = props;
|
|
41
39
|
|
|
42
40
|
const [completedTabsExpanded, setCompletedTabsExpanded] = useState(true);
|
|
43
41
|
|
|
42
|
+
const { allContextDisplayItems, completedDisplayItemExists } =
|
|
43
|
+
useContextDisplayItems(topLevelItems);
|
|
44
|
+
|
|
44
45
|
return (
|
|
45
46
|
<Card sx={{ p: 0.75, mb: 2 }}>
|
|
46
47
|
<Box sx={{ flexGrow: 1 }}>
|
|
47
48
|
<PrimarySelectableList dense disablePadding sx={{ mb: 1 }} data-test="renderer-tab-list">
|
|
48
|
-
|
|
49
|
-
<
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
</Typography>
|
|
55
|
-
<IconButton
|
|
56
|
-
size="small"
|
|
57
|
-
onClick={() => {
|
|
58
|
-
setCompletedTabsExpanded(!completedTabsExpanded);
|
|
59
|
-
}}>
|
|
60
|
-
{completedTabsExpanded ? (
|
|
61
|
-
<ExpandLess fontSize="small" />
|
|
62
|
-
) : (
|
|
63
|
-
<ExpandMore fontSize="small" />
|
|
64
|
-
)}
|
|
65
|
-
</IconButton>
|
|
66
|
-
</Box>
|
|
49
|
+
{completedDisplayItemExists ? (
|
|
50
|
+
<ShowCompletedTabsSection
|
|
51
|
+
completedTabsExpanded={completedTabsExpanded}
|
|
52
|
+
setCompletedTabsExpanded={setCompletedTabsExpanded}
|
|
53
|
+
/>
|
|
54
|
+
) : null}
|
|
67
55
|
<Divider sx={{ mx: 1 }} light />
|
|
68
56
|
<FormBodyTabList
|
|
69
|
-
topLevelItems={
|
|
57
|
+
topLevelItems={topLevelItems}
|
|
70
58
|
currentTabIndex={currentTabIndex}
|
|
71
59
|
tabs={tabs}
|
|
72
60
|
completedTabsCollapsed={!completedTabsExpanded}
|
|
61
|
+
allContextDisplayItems={allContextDisplayItems}
|
|
73
62
|
/>
|
|
74
63
|
</PrimarySelectableList>
|
|
75
64
|
</Box>
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2023 Commonwealth Scientific and Industrial Research
|
|
3
|
+
* Organisation (CSIRO) ABN 41 687 119 230.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import React from 'react';
|
|
19
|
+
import Box from '@mui/material/Box';
|
|
20
|
+
import Typography from '@mui/material/Typography';
|
|
21
|
+
import { IconButton } from '@mui/material';
|
|
22
|
+
import ExpandLess from '@mui/icons-material/ExpandLess';
|
|
23
|
+
import ExpandMore from '@mui/icons-material/ExpandMore';
|
|
24
|
+
|
|
25
|
+
interface ShowCompletedTabsSectionProps {
|
|
26
|
+
completedTabsExpanded: boolean;
|
|
27
|
+
setCompletedTabsExpanded: (newExpanded: boolean) => void;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function ShowCompletedTabsSection(props: ShowCompletedTabsSectionProps) {
|
|
31
|
+
const { completedTabsExpanded, setCompletedTabsExpanded } = props;
|
|
32
|
+
|
|
33
|
+
return (
|
|
34
|
+
<Box display="flex" justifyContent="center" alignItems="center" mx={2} columnGap={0.5}>
|
|
35
|
+
<Typography
|
|
36
|
+
variant="overline"
|
|
37
|
+
fontSize={9}
|
|
38
|
+
color={completedTabsExpanded ? 'text.secondary' : 'text.disabled'}>
|
|
39
|
+
Completed tabs {completedTabsExpanded ? 'shown' : 'hidden'}
|
|
40
|
+
</Typography>
|
|
41
|
+
<IconButton
|
|
42
|
+
size="small"
|
|
43
|
+
onClick={() => {
|
|
44
|
+
setCompletedTabsExpanded(!completedTabsExpanded);
|
|
45
|
+
}}>
|
|
46
|
+
{completedTabsExpanded ? <ExpandLess fontSize="small" /> : <ExpandMore fontSize="small" />}
|
|
47
|
+
</IconButton>
|
|
48
|
+
</Box>
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export default ShowCompletedTabsSection;
|