@aehrc/smart-forms-renderer 0.40.0 → 0.40.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/FormComponents/ItemParts/ItemFieldGrid.js +6 -2
- package/lib/components/FormComponents/ItemParts/ItemFieldGrid.js.map +1 -1
- package/lib/components/FormComponents/RepeatGroup/RepeatGroup.js +3 -3
- package/lib/components/FormComponents/RepeatGroup/RepeatGroup.js.map +1 -1
- package/lib/components/FormComponents/RepeatGroup/RepeatGroupView.js +6 -6
- package/lib/components/FormComponents/RepeatGroup/RepeatGroupView.js.map +1 -1
- package/lib/components/FormComponents/RepeatItem/RepeatItem.js +5 -5
- package/lib/components/FormComponents/RepeatItem/RepeatItem.js.map +1 -1
- package/lib/components/FormComponents/Tables/GroupTable.js +10 -10
- package/lib/components/FormComponents/Tables/GroupTable.js.map +1 -1
- package/lib/components/FormComponents/Tables/GroupTableBody.d.ts +1 -1
- package/lib/components/FormComponents/Tables/GroupTableBody.js +3 -3
- package/lib/components/FormComponents/Tables/GroupTableBody.js.map +1 -1
- package/lib/components/FormComponents/Tables/GroupTableRow.d.ts +1 -1
- package/lib/components/FormComponents/Tables/GroupTableRow.js +4 -4
- package/lib/components/FormComponents/Tables/GroupTableRow.js.map +1 -1
- package/lib/components/FormComponents/Tables/GroupTableView.d.ts +1 -1
- package/lib/components/Renderer/FormTopLevelItem.js +13 -1
- package/lib/components/Renderer/FormTopLevelItem.js.map +1 -1
- package/lib/hooks/useDateValidation.js +2 -2
- package/lib/hooks/useDateValidation.js.map +1 -1
- package/lib/hooks/useGroupTableRows.d.ts +1 -1
- package/lib/hooks/useGroupTableRows.js +3 -3
- package/lib/hooks/useGroupTableRows.js.map +1 -1
- package/lib/hooks/useInitialiseGroupTable.d.ts +1 -1
- package/lib/hooks/useInitialiseGroupTable.js +10 -16
- package/lib/hooks/useInitialiseGroupTable.js.map +1 -1
- package/lib/hooks/useInitialiseRepeatAnswers.d.ts +1 -1
- package/lib/hooks/useInitialiseRepeatAnswers.js +9 -12
- package/lib/hooks/useInitialiseRepeatAnswers.js.map +1 -1
- package/lib/hooks/useInitialiseRepeatGroups.d.ts +2 -2
- package/lib/hooks/useInitialiseRepeatGroups.js +11 -20
- package/lib/hooks/useInitialiseRepeatGroups.js.map +1 -1
- package/lib/hooks/useRepeatGroups.js +6 -2
- package/lib/hooks/useRepeatGroups.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/interfaces/groupTable.interface.d.ts +1 -1
- package/lib/interfaces/repeatGroup.interface.d.ts +1 -1
- package/lib/theme/palette.js +0 -4
- package/lib/theme/palette.js.map +1 -1
- package/lib/utils/groupTable.js +1 -1
- package/lib/utils/groupTable.js.map +1 -1
- package/lib/utils/index.d.ts +1 -1
- package/lib/utils/index.js +1 -1
- package/lib/utils/index.js.map +1 -1
- package/lib/utils/manageForm.d.ts +7 -0
- package/lib/utils/manageForm.js +15 -1
- package/lib/utils/manageForm.js.map +1 -1
- package/lib/utils/repeatId.d.ts +4 -0
- package/lib/utils/repeatId.js +93 -0
- package/lib/utils/repeatId.js.map +1 -0
- package/package.json +1 -1
- package/src/components/FormComponents/ItemParts/ItemFieldGrid.tsx +8 -2
- package/src/components/FormComponents/RepeatGroup/RepeatGroup.tsx +3 -3
- package/src/components/FormComponents/RepeatGroup/RepeatGroupView.tsx +6 -6
- package/src/components/FormComponents/RepeatItem/RepeatItem.tsx +7 -5
- package/src/components/FormComponents/Tables/GroupTable.tsx +13 -10
- package/src/components/FormComponents/Tables/GroupTableBody.tsx +5 -5
- package/src/components/FormComponents/Tables/GroupTableRow.tsx +5 -5
- package/src/components/FormComponents/Tables/GroupTableView.tsx +1 -1
- package/src/components/Renderer/FormTopLevelItem.tsx +33 -1
- package/src/hooks/useDateValidation.tsx +2 -2
- package/src/hooks/useGroupTableRows.ts +3 -3
- package/src/hooks/useInitialiseGroupTable.ts +13 -17
- package/src/hooks/useInitialiseRepeatAnswers.ts +9 -12
- package/src/hooks/useInitialiseRepeatGroups.ts +14 -25
- package/src/hooks/useRepeatGroups.ts +8 -4
- package/src/index.ts +1 -0
- package/src/interfaces/groupTable.interface.ts +1 -1
- package/src/interfaces/repeatGroup.interface.ts +1 -1
- package/src/stories/assets/questionnaires/QIdRemoverDebugger.ts +161 -0
- package/src/stories/storybookWrappers/BuildFormButtonForStorybook.tsx +1 -1
- package/src/stories/storybookWrappers/IdRemoverButtonForStorybook.tsx +51 -0
- package/src/stories/storybookWrappers/IdRemoverDebuggerWrapperForStorybook.tsx +84 -0
- package/src/stories/testing/IdRemoverDebuggerWrapper.stories.tsx +39 -0
- package/src/tests/extractObservation.test.ts +2 -5
- package/src/theme/palette.ts +0 -4
- package/src/utils/groupTable.ts +1 -1
- package/src/utils/index.ts +7 -1
- package/src/utils/manageForm.ts +28 -1
- package/src/utils/repeatId.ts +123 -0
- package/CHANGELOG.md +0 -43
- package/lib/hooks/useRepeatAnswers.d.ts +0 -4
- package/lib/hooks/useRepeatAnswers.js +0 -34
- package/lib/hooks/useRepeatAnswers.js.map +0 -1
- package/lib/interfaces/repeatItem.interface.d.ts +0 -5
- package/lib/interfaces/repeatItem.interface.js +0 -2
- package/lib/interfaces/repeatItem.interface.js.map +0 -1
- package/lib/utils/answerExpression.d.ts +0 -18
- package/lib/utils/answerExpression.js +0 -133
- package/lib/utils/answerExpression.js.map +0 -1
- package/lib/utils/dynamicValueSet.d.ts +0 -5
- package/lib/utils/dynamicValueSet.js +0 -96
- package/lib/utils/dynamicValueSet.js.map +0 -1
- package/lib/utils/fhirpathAsyncUtils/fhirpath-async.d.ts +0 -14
- package/lib/utils/fhirpathAsyncUtils/fhirpath-async.js +0 -639
- package/lib/utils/fhirpathAsyncUtils/fhirpath-async.js.map +0 -1
- package/lib/utils/fhirpathAsyncUtils/outcome-utils.d.ts +0 -3
- package/lib/utils/fhirpathAsyncUtils/outcome-utils.js +0 -41
- package/lib/utils/fhirpathAsyncUtils/outcome-utils.js.map +0 -1
- package/lib/utils/questionnaireStoreUtils/extractPreferredTerminologyServerUrls.d.ts +0 -3
- package/lib/utils/questionnaireStoreUtils/extractPreferredTerminologyServerUrls.js +0 -34
- package/lib/utils/questionnaireStoreUtils/extractPreferredTerminologyServerUrls.js.map +0 -1
- package/lib/utils/updateQr.d.ts +0 -9
- package/lib/utils/updateQr.js +0 -55
- package/lib/utils/updateQr.js.map +0 -1
|
@@ -14,21 +14,18 @@
|
|
|
14
14
|
* See the License for the specific language governing permissions and
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
|
-
import { nanoid } from 'nanoid';
|
|
18
17
|
import { useMemo } from 'react';
|
|
19
|
-
|
|
18
|
+
import { generateExistingRepeatId, generateNewRepeatId } from '../utils/repeatId';
|
|
19
|
+
function useInitialiseRepeatAnswers(linkId, qrItem) {
|
|
20
20
|
return useMemo(() => {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
initialRepeatAnswers = qrItem.answer.map((answer) => {
|
|
24
|
-
if (!answer.id) {
|
|
25
|
-
answer.id = nanoid();
|
|
26
|
-
}
|
|
27
|
-
return answer;
|
|
28
|
-
});
|
|
21
|
+
if (!(qrItem === null || qrItem === void 0 ? void 0 : qrItem.answer)) {
|
|
22
|
+
return [{ id: generateNewRepeatId(linkId) }];
|
|
29
23
|
}
|
|
30
|
-
return
|
|
31
|
-
|
|
24
|
+
return qrItem.answer.map((answer, index) => {
|
|
25
|
+
var _a;
|
|
26
|
+
return (Object.assign(Object.assign({}, answer), { id: (_a = answer.id) !== null && _a !== void 0 ? _a : generateExistingRepeatId(linkId, index) }));
|
|
27
|
+
});
|
|
28
|
+
}, [linkId, qrItem]);
|
|
32
29
|
}
|
|
33
30
|
export default useInitialiseRepeatAnswers;
|
|
34
31
|
//# sourceMappingURL=useInitialiseRepeatAnswers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInitialiseRepeatAnswers.js","sourceRoot":"","sources":["../../src/hooks/useInitialiseRepeatAnswers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"useInitialiseRepeatAnswers.js","sourceRoot":"","sources":["../../src/hooks/useInitialiseRepeatAnswers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAElF,SAAS,0BAA0B,CACjC,MAAc,EACd,MAAwC;IAExC,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,IAAI,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,CAAA,EAAE;YACnB,OAAO,CAAC,EAAE,EAAE,EAAE,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SAC9C;QAED,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;;YAAC,OAAA,iCACvC,MAAM,KACT,EAAE,EAAE,MAAA,MAAM,CAAC,EAAE,mCAAI,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC,IACxD,CAAA;SAAA,CAAC,CAAC;IACN,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AACvB,CAAC;AAED,eAAe,0BAA0B,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { QuestionnaireResponseItem } from 'fhir/r4';
|
|
2
2
|
import type { RepeatGroupSingle } from '../interfaces/repeatGroup.interface';
|
|
3
|
-
declare function useInitialiseRepeatGroups(
|
|
3
|
+
declare function useInitialiseRepeatGroups(linkId: string, qrItems: QuestionnaireResponseItem[]): RepeatGroupSingle[];
|
|
4
4
|
export default useInitialiseRepeatGroups;
|
|
@@ -14,29 +14,20 @@
|
|
|
14
14
|
* See the License for the specific language governing permissions and
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
|
-
import { nanoid } from 'nanoid';
|
|
18
17
|
import { useMemo } from 'react';
|
|
19
|
-
|
|
18
|
+
import { generateExistingRepeatId, generateNewRepeatId } from '../utils/repeatId';
|
|
19
|
+
function useInitialiseRepeatGroups(linkId, qrItems) {
|
|
20
20
|
return useMemo(() => {
|
|
21
|
-
|
|
22
|
-
{
|
|
23
|
-
nanoId: nanoid(),
|
|
24
|
-
qrItem: null
|
|
25
|
-
}
|
|
26
|
-
];
|
|
27
|
-
if (qrItems.length > 0) {
|
|
28
|
-
initialRepeatGroupAnswers = qrItems.map((qrItem) => {
|
|
29
|
-
return {
|
|
30
|
-
nanoId: nanoid(),
|
|
31
|
-
qrItem
|
|
32
|
-
};
|
|
33
|
-
});
|
|
21
|
+
if (qrItems.length === 0) {
|
|
22
|
+
return [{ id: generateNewRepeatId(linkId), qrItem: null }];
|
|
34
23
|
}
|
|
35
|
-
return
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
24
|
+
return qrItems.map((qrItem, index) => {
|
|
25
|
+
return {
|
|
26
|
+
id: generateExistingRepeatId(linkId, index),
|
|
27
|
+
qrItem
|
|
28
|
+
};
|
|
29
|
+
});
|
|
30
|
+
}, [linkId, qrItems]);
|
|
40
31
|
}
|
|
41
32
|
export default useInitialiseRepeatGroups;
|
|
42
33
|
//# sourceMappingURL=useInitialiseRepeatGroups.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInitialiseRepeatGroups.js","sourceRoot":"","sources":["../../src/hooks/useInitialiseRepeatGroups.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"useInitialiseRepeatGroups.js","sourceRoot":"","sources":["../../src/hooks/useInitialiseRepeatGroups.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAElF,SAAS,yBAAyB,CAChC,MAAc,EACd,OAAoC;IAEpC,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YACxB,OAAO,CAAC,EAAE,EAAE,EAAE,mBAAmB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;SAC5D;QAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACnC,OAAO;gBACL,EAAE,EAAE,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC;gBAC3C,MAAM;aACP,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,eAAe,yBAAyB,CAAC"}
|
|
@@ -19,8 +19,12 @@ import _isEqual from 'lodash/isEqual';
|
|
|
19
19
|
function useRepeatGroups(valueFromProps) {
|
|
20
20
|
const [repeatGroups, setRepeatGroups] = useState(valueFromProps);
|
|
21
21
|
useEffect(() => {
|
|
22
|
-
const valueFromPropsQRItems = valueFromProps
|
|
23
|
-
|
|
22
|
+
const valueFromPropsQRItems = valueFromProps
|
|
23
|
+
.map((repeatGroupSingle) => repeatGroupSingle.qrItem)
|
|
24
|
+
.filter((qrItem) => qrItem !== null);
|
|
25
|
+
const repeatGroupsQRItems = repeatGroups
|
|
26
|
+
.map((repeatGroupSingle) => repeatGroupSingle.qrItem)
|
|
27
|
+
.filter((qrItem) => qrItem !== null);
|
|
24
28
|
if (!_isEqual(valueFromPropsQRItems, repeatGroupsQRItems)) {
|
|
25
29
|
setRepeatGroups(valueFromProps);
|
|
26
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRepeatGroups.js","sourceRoot":"","sources":["../../src/hooks/useRepeatGroups.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,QAAQ,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"useRepeatGroups.js","sourceRoot":"","sources":["../../src/hooks/useRepeatGroups.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,SAAS,eAAe,CACtB,cAAmC;IAEnC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;IAEjE,SAAS,CACP,GAAG,EAAE;QACH,MAAM,qBAAqB,GAAG,cAAc;aACzC,GAAG,CAAC,CAAC,iBAAiB,EAAE,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC;aACpD,MAAM,CAAC,CAAC,MAAM,EAAuC,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;QAE5E,MAAM,mBAAmB,GAAG,YAAY;aACrC,GAAG,CAAC,CAAC,iBAAiB,EAAE,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC;aACpD,MAAM,CAAC,CAAC,MAAM,EAAuC,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;QAE5E,IAAI,CAAC,QAAQ,CAAC,qBAAqB,EAAE,mBAAmB,CAAC,EAAE;YACzD,eAAe,CAAC,cAAc,CAAC,CAAC;SACjC;IACH,CAAC;IACD,iDAAiD;IACjD,uDAAuD;IACvD,CAAC,cAAc,CAAC,CACjB,CAAC;IAEF,OAAO,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;AACzC,CAAC;AAED,eAAe,eAAe,CAAC"}
|
package/lib/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export type { QuestionnaireStoreType, QuestionnaireResponseStoreType, SmartConfi
|
|
|
5
5
|
export { questionnaireStore, useQuestionnaireStore, questionnaireResponseStore, useQuestionnaireResponseStore, smartConfigStore, useSmartConfigStore, terminologyServerStore, useTerminologyServerStore } from './stores';
|
|
6
6
|
export { useHidden, useBuildForm, useRendererQueryClient } from './hooks';
|
|
7
7
|
export type { ItemToRepopulate } from './utils';
|
|
8
|
-
export { buildForm, destroyForm, getResponse, removeEmptyAnswersFromResponse, isSpecificItemControl, isRepeatItemAndNotCheckbox, initialiseQuestionnaireResponse, generateItemsToRepopulate, repopulateResponse, extractObservationBased } from './utils';
|
|
8
|
+
export { buildForm, destroyForm, getResponse, removeEmptyAnswersFromResponse, removeInternalIdsFromResponse, isSpecificItemControl, isRepeatItemAndNotCheckbox, initialiseQuestionnaireResponse, generateItemsToRepopulate, repopulateResponse, extractObservationBased } from './utils';
|
|
9
9
|
export { RendererThemeProvider } from './theme';
|
|
10
10
|
export type { InitialiseFormWrapperProps } from './stories/storybookWrappers';
|
|
11
11
|
export { InitialiseFormWrapperForStorybook } from './stories/storybookWrappers';
|
package/lib/index.js
CHANGED
|
@@ -2,7 +2,7 @@ export { SmartFormsRenderer, BaseRenderer, SingleItem, RepeatItem, RepeatGroup,
|
|
|
2
2
|
export { questionnaireStore, useQuestionnaireStore, questionnaireResponseStore, useQuestionnaireResponseStore, smartConfigStore, useSmartConfigStore, terminologyServerStore, useTerminologyServerStore } from './stores';
|
|
3
3
|
// hooks exports
|
|
4
4
|
export { useHidden, useBuildForm, useRendererQueryClient } from './hooks';
|
|
5
|
-
export { buildForm, destroyForm, getResponse, removeEmptyAnswersFromResponse, isSpecificItemControl, isRepeatItemAndNotCheckbox, initialiseQuestionnaireResponse, generateItemsToRepopulate, repopulateResponse, extractObservationBased } from './utils';
|
|
5
|
+
export { buildForm, destroyForm, getResponse, removeEmptyAnswersFromResponse, removeInternalIdsFromResponse, isSpecificItemControl, isRepeatItemAndNotCheckbox, initialiseQuestionnaireResponse, generateItemsToRepopulate, repopulateResponse, extractObservationBased } from './utils';
|
|
6
6
|
// theme provider exports
|
|
7
7
|
export { RendererThemeProvider } from './theme';
|
|
8
8
|
export { InitialiseFormWrapperForStorybook } from './stories/storybookWrappers';
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,UAAU,EACV,UAAU,EACV,WAAW,EACX,UAAU,EACV,SAAS,EACT,0BAA0B,EAC3B,MAAM,cAAc,CAAC;AAStB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,0BAA0B,EAC1B,6BAA6B,EAC7B,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,yBAAyB,EAC1B,MAAM,UAAU,CAAC;AAElB,gBAAgB;AAChB,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAI1E,OAAO,EACL,SAAS,EACT,WAAW,EACX,WAAW,EACX,8BAA8B,EAC9B,qBAAqB,EACrB,0BAA0B,EAC1B,+BAA+B,EAC/B,yBAAyB,EACzB,kBAAkB,EAClB,uBAAuB,EACxB,MAAM,SAAS,CAAC;AAEjB,yBAAyB;AACzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAIhD,OAAO,EAAE,iCAAiC,EAAE,MAAM,6BAA6B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,UAAU,EACV,UAAU,EACV,WAAW,EACX,UAAU,EACV,SAAS,EACT,0BAA0B,EAC3B,MAAM,cAAc,CAAC;AAStB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,0BAA0B,EAC1B,6BAA6B,EAC7B,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,yBAAyB,EAC1B,MAAM,UAAU,CAAC;AAElB,gBAAgB;AAChB,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAI1E,OAAO,EACL,SAAS,EACT,WAAW,EACX,WAAW,EACX,8BAA8B,EAC9B,6BAA6B,EAC7B,qBAAqB,EACrB,0BAA0B,EAC1B,+BAA+B,EAC/B,yBAAyB,EACzB,kBAAkB,EAClB,uBAAuB,EACxB,MAAM,SAAS,CAAC;AAEjB,yBAAyB;AACzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAIhD,OAAO,EAAE,iCAAiC,EAAE,MAAM,6BAA6B,CAAC"}
|
package/lib/theme/palette.js
CHANGED
package/lib/theme/palette.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"palette.js","sourceRoot":"","sources":["../../src/theme/palette.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AA8B5C,MAAM,SAAS,GAAG;IAChB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;IACf,YAAY,EAAE,MAAM;CACrB,CAAC;AAEF,MAAM,OAAO,GAAmB;IAC9B,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;IACxC,SAAS,EAAE,SAAS;IACpB,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,SAAS;KAChB;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,SAAS;KAChB;IACD,IAAI,EAAE;QACJ,OAAO,EAAE,SAAS;QAClB,SAAS,EAAE,SAAS;KACrB;IACD,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;IACjC,IAAI,EAAE;QACJ,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;QACpB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC;QACtB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;KACtB;IACD,
|
|
1
|
+
{"version":3,"file":"palette.js","sourceRoot":"","sources":["../../src/theme/palette.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AA8B5C,MAAM,SAAS,GAAG;IAChB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;IACf,YAAY,EAAE,MAAM;CACrB,CAAC;AAEF,MAAM,OAAO,GAAmB;IAC9B,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;IACxC,SAAS,EAAE,SAAS;IACpB,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,SAAS;KAChB;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,SAAS;KAChB;IACD,IAAI,EAAE;QACJ,OAAO,EAAE,SAAS;QAClB,SAAS,EAAE,SAAS;KACrB;IACD,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;IACjC,IAAI,EAAE;QACJ,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;QACpB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC;QACtB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;KACtB;IACD,gBAAgB,EAAE;QAChB,OAAO,EAAE,SAAS;KACnB;IACD,MAAM,EAAE;QACN,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;QACnB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;QAC/B,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;QAClC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC;QACjC,kBAAkB,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;QAC5C,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;QAC/B,YAAY,EAAE,IAAI;QAClB,eAAe,EAAE,IAAI;KACtB;CACF,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
package/lib/utils/groupTable.js
CHANGED
|
@@ -23,7 +23,7 @@ export function reorderRows(rows, sourceIndex, destinationIndex) {
|
|
|
23
23
|
}
|
|
24
24
|
export function getGroupTableItemsToUpdate(tableRows, selectedIds) {
|
|
25
25
|
return tableRows
|
|
26
|
-
.filter((row) => selectedIds.includes(row.
|
|
26
|
+
.filter((row) => selectedIds.includes(row.id))
|
|
27
27
|
.flatMap((singleRow) => (singleRow.qrItem ? [cloneDeep(singleRow.qrItem)] : []));
|
|
28
28
|
}
|
|
29
29
|
//# sourceMappingURL=groupTable.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"groupTable.js","sourceRoot":"","sources":["../../src/utils/groupTable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,SAAS,MAAM,kBAAkB,CAAC;AAEzC,MAAM,UAAU,WAAW,CACzB,IAA0B,EAC1B,WAAmB,EACnB,gBAAwB;IAExB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAChD,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IAE5C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,SAA+B,EAAE,WAAqB;IAC/F,OAAO,SAAS;SACb,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"groupTable.js","sourceRoot":"","sources":["../../src/utils/groupTable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,SAAS,MAAM,kBAAkB,CAAC;AAEzC,MAAM,UAAU,WAAW,CACzB,IAA0B,EAC1B,WAAmB,EACnB,gBAAwB;IAExB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAChD,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IAE5C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,SAA+B,EAAE,WAAqB;IAC/F,OAAO,SAAS;SACb,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;SAC7C,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACrF,CAAC"}
|
package/lib/utils/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { buildForm, destroyForm, getResponse, removeEmptyAnswersFromResponse } from './manageForm';
|
|
1
|
+
export { buildForm, destroyForm, getResponse, removeEmptyAnswersFromResponse, removeInternalIdsFromResponse } from './manageForm';
|
|
2
2
|
export { initialiseQuestionnaireResponse } from './initialise';
|
|
3
3
|
export { isSpecificItemControl } from './itemControl';
|
|
4
4
|
export { isRepeatItemAndNotCheckbox } from './qItem';
|
package/lib/utils/index.js
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* See the License for the specific language governing permissions and
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
|
-
export { buildForm, destroyForm, getResponse, removeEmptyAnswersFromResponse } from './manageForm';
|
|
17
|
+
export { buildForm, destroyForm, getResponse, removeEmptyAnswersFromResponse, removeInternalIdsFromResponse } from './manageForm';
|
|
18
18
|
export { initialiseQuestionnaireResponse } from './initialise';
|
|
19
19
|
export { isSpecificItemControl } from './itemControl';
|
|
20
20
|
export { isRepeatItemAndNotCheckbox } from './qItem';
|
package/lib/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EACL,SAAS,EACT,WAAW,EACX,WAAW,EACX,8BAA8B,EAC9B,6BAA6B,EAC9B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAErD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -44,6 +44,13 @@ export declare function getResponse(): QuestionnaireResponse;
|
|
|
44
44
|
* @author Sean Fong
|
|
45
45
|
*/
|
|
46
46
|
export declare function removeEmptyAnswersFromResponse(questionnaire: Questionnaire, questionnaireResponse: QuestionnaireResponse): QuestionnaireResponse;
|
|
47
|
+
/**
|
|
48
|
+
* Remove all instances of item.answer.id from the filled QuestionnaireResponse.
|
|
49
|
+
* These IDs are used internally for rendering repeating items, and can be safely left out of the final response.
|
|
50
|
+
*
|
|
51
|
+
* @author Sean Fong
|
|
52
|
+
*/
|
|
53
|
+
export declare function removeInternalIdsFromResponse(questionnaire: Questionnaire, questionnaireResponse: QuestionnaireResponse): QuestionnaireResponse;
|
|
47
54
|
/**
|
|
48
55
|
* Check if a QuestionnaireResponseItem has either an item or an answer property.
|
|
49
56
|
*
|
package/lib/utils/manageForm.js
CHANGED
|
@@ -11,6 +11,9 @@ import { questionnaireResponseStore, questionnaireStore, smartConfigStore, termi
|
|
|
11
11
|
import { initialiseQuestionnaireResponse } from './initialise';
|
|
12
12
|
import { removeEmptyAnswers } from './removeEmptyAnswers';
|
|
13
13
|
import { readEncounter, readPatient, readUser } from '../api/smartClient';
|
|
14
|
+
import cloneDeep from 'lodash.clonedeep';
|
|
15
|
+
import { updateQuestionnaireResponse } from './genericRecursive';
|
|
16
|
+
import { removeInternalRepeatIdsRecursive } from './repeatId';
|
|
14
17
|
/**
|
|
15
18
|
* Build the form with an initial Questionnaire and an optional filled QuestionnaireResponse.
|
|
16
19
|
* If a QuestionnaireResponse is not provided, an empty QuestionnaireResponse is set as the initial QuestionnaireResponse.
|
|
@@ -85,7 +88,8 @@ export function initialiseFhirClient(fhirClient) {
|
|
|
85
88
|
* @author Sean Fong
|
|
86
89
|
*/
|
|
87
90
|
export function getResponse() {
|
|
88
|
-
|
|
91
|
+
const cleanResponse = removeInternalIdsFromResponse(questionnaireStore.getState().sourceQuestionnaire, questionnaireResponseStore.getState().updatableResponse);
|
|
92
|
+
return cloneDeep(cleanResponse);
|
|
89
93
|
}
|
|
90
94
|
/**
|
|
91
95
|
* Remove all empty/hidden answers from the filled QuestionnaireResponse.
|
|
@@ -106,6 +110,16 @@ export function removeEmptyAnswersFromResponse(questionnaire, questionnaireRespo
|
|
|
106
110
|
enableWhenExpressions
|
|
107
111
|
});
|
|
108
112
|
}
|
|
113
|
+
/**
|
|
114
|
+
* Remove all instances of item.answer.id from the filled QuestionnaireResponse.
|
|
115
|
+
* These IDs are used internally for rendering repeating items, and can be safely left out of the final response.
|
|
116
|
+
*
|
|
117
|
+
* @author Sean Fong
|
|
118
|
+
*/
|
|
119
|
+
export function removeInternalIdsFromResponse(questionnaire, questionnaireResponse) {
|
|
120
|
+
const questionnaireResponseToUpdate = cloneDeep(questionnaireResponse);
|
|
121
|
+
return updateQuestionnaireResponse(questionnaire, questionnaireResponseToUpdate, removeInternalRepeatIdsRecursive, undefined);
|
|
122
|
+
}
|
|
109
123
|
/**
|
|
110
124
|
* Check if a QuestionnaireResponseItem has either an item or an answer property.
|
|
111
125
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manageForm.js","sourceRoot":"","sources":["../../src/utils/manageForm.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"manageForm.js","sourceRoot":"","sources":["../../src/utils/manageForm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
|
|
2
|
+
export declare function generateNewRepeatId(linkId: string): string;
|
|
3
|
+
export declare function generateExistingRepeatId(linkId: string, index: number): string;
|
|
4
|
+
export declare function removeInternalRepeatIdsRecursive(qItem: QuestionnaireItem, qrItemOrItems: QuestionnaireResponseItem | QuestionnaireResponseItem[] | null): QuestionnaireResponseItem | QuestionnaireResponseItem[] | null;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2024 Commonwealth Scientific and Industrial Research
|
|
3
|
+
* Organisation (CSIRO) ABN 41 687 119 230.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
18
|
+
var t = {};
|
|
19
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
20
|
+
t[p] = s[p];
|
|
21
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
22
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
23
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
24
|
+
t[p[i]] = s[p[i]];
|
|
25
|
+
}
|
|
26
|
+
return t;
|
|
27
|
+
};
|
|
28
|
+
import { nanoid } from 'nanoid';
|
|
29
|
+
import { getQrItemsIndex, mapQItemsIndex } from './mapItem';
|
|
30
|
+
export function generateNewRepeatId(linkId) {
|
|
31
|
+
return `${linkId}-repeat-${nanoid()}`;
|
|
32
|
+
}
|
|
33
|
+
export function generateExistingRepeatId(linkId, index) {
|
|
34
|
+
const paddedIndex = index.toString().padStart(6, '0');
|
|
35
|
+
return `${linkId}-repeat-${paddedIndex}`;
|
|
36
|
+
}
|
|
37
|
+
export function removeInternalRepeatIdsRecursive(qItem, qrItemOrItems) {
|
|
38
|
+
var _a, _b;
|
|
39
|
+
// Process repeating group items separately
|
|
40
|
+
const hasMultipleAnswers = Array.isArray(qrItemOrItems);
|
|
41
|
+
if (hasMultipleAnswers) {
|
|
42
|
+
return removeInternalRepeatIdsFromRepeatGroup(qItem, qrItemOrItems);
|
|
43
|
+
}
|
|
44
|
+
// At this point qrItemOrItems is a single QuestionnaireResponseItem
|
|
45
|
+
const qrItem = qrItemOrItems;
|
|
46
|
+
// Process items with child items
|
|
47
|
+
const childQItems = (_a = qItem.item) !== null && _a !== void 0 ? _a : [];
|
|
48
|
+
const childQrItems = (_b = qrItem === null || qrItem === void 0 ? void 0 : qrItem.item) !== null && _b !== void 0 ? _b : [];
|
|
49
|
+
const updatedChildQrItems = [];
|
|
50
|
+
if (childQItems.length > 0) {
|
|
51
|
+
const indexMap = mapQItemsIndex(qItem);
|
|
52
|
+
const qrItemsByIndex = getQrItemsIndex(childQItems, childQrItems, indexMap);
|
|
53
|
+
// Iterate child items
|
|
54
|
+
for (const [index, childQItem] of childQItems.entries()) {
|
|
55
|
+
const childQRItemOrItems = qrItemsByIndex[index];
|
|
56
|
+
const updatedChildQRItemOrItems = removeInternalRepeatIdsRecursive(childQItem, childQRItemOrItems !== null && childQRItemOrItems !== void 0 ? childQRItemOrItems : null);
|
|
57
|
+
if (Array.isArray(updatedChildQRItemOrItems)) {
|
|
58
|
+
if (updatedChildQRItemOrItems.length > 0) {
|
|
59
|
+
updatedChildQrItems.push(...updatedChildQRItemOrItems);
|
|
60
|
+
}
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (updatedChildQRItemOrItems) {
|
|
64
|
+
updatedChildQrItems.push(updatedChildQRItemOrItems);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Construct updated qrItem
|
|
69
|
+
return removeInternalRepeatIdsFromItem(qItem, qrItem, updatedChildQrItems);
|
|
70
|
+
}
|
|
71
|
+
function removeInternalRepeatIdsFromRepeatGroup(qItem, qrItems) {
|
|
72
|
+
if (!qItem.item) {
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
return qrItems
|
|
76
|
+
.flatMap((childQrItem) => removeInternalRepeatIdsRecursive(qItem, childQrItem))
|
|
77
|
+
.filter((childQRItem) => !!childQRItem);
|
|
78
|
+
}
|
|
79
|
+
function removeInternalRepeatIdsFromItem(qItem, qrItem, childQrItems) {
|
|
80
|
+
var _a, _b;
|
|
81
|
+
if (!qrItem) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
// Remove internal repeatId from all answers
|
|
85
|
+
const updatedAnswers = (_b = (_a = qrItem.answer) === null || _a === void 0 ? void 0 : _a.map(
|
|
86
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
87
|
+
(_a) => {
|
|
88
|
+
var { id } = _a, rest = __rest(_a, ["id"]);
|
|
89
|
+
return Object.assign({}, rest);
|
|
90
|
+
}).filter((answer) => !!answer && Object.keys(answer).length > 0)) !== null && _b !== void 0 ? _b : [];
|
|
91
|
+
return Object.assign(Object.assign(Object.assign({ linkId: qItem.linkId }, (qItem.text && { text: qItem.text })), (childQrItems.length > 0 && { item: childQrItems })), (updatedAnswers.length > 0 && { answer: updatedAnswers }));
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=repeatId.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repeatId.js","sourceRoot":"","sources":["../../src/utils/repeatId.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -22,6 +22,7 @@ import type { QuestionnaireItem } from 'fhir/r4';
|
|
|
22
22
|
import DisplayInstructions from '../DisplayItem/DisplayInstructions';
|
|
23
23
|
import LabelWrapper from './ItemLabelWrapper';
|
|
24
24
|
import useRenderingExtensions from '../../../hooks/useRenderingExtensions';
|
|
25
|
+
import Box from '@mui/material/Box';
|
|
25
26
|
|
|
26
27
|
interface ItemFieldGridProps {
|
|
27
28
|
children: ReactNode;
|
|
@@ -36,10 +37,15 @@ function ItemFieldGrid(props: ItemFieldGridProps) {
|
|
|
36
37
|
|
|
37
38
|
return (
|
|
38
39
|
<Grid container columnSpacing={4}>
|
|
39
|
-
<Grid item
|
|
40
|
+
<Grid item md={4} xs={12}>
|
|
40
41
|
<LabelWrapper qItem={qItem} readOnly={readOnly} />
|
|
41
42
|
</Grid>
|
|
42
|
-
<
|
|
43
|
+
<Box
|
|
44
|
+
sx={{
|
|
45
|
+
my: { xs: 1.5, md: 0 } // Adds padding for `xs` breakpoint and removes it for `md` and up
|
|
46
|
+
}}
|
|
47
|
+
/>
|
|
48
|
+
<Grid item md={8} xs={12}>
|
|
43
49
|
{children}
|
|
44
50
|
<DisplayInstructions displayInstructions={displayInstructions} readOnly={readOnly} />
|
|
45
51
|
</Grid>
|
|
@@ -24,11 +24,11 @@ import type {
|
|
|
24
24
|
} from '../../../interfaces/renderProps.interface';
|
|
25
25
|
import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
|
|
26
26
|
import useInitialiseRepeatGroups from '../../../hooks/useInitialiseRepeatGroups';
|
|
27
|
-
import { nanoid } from 'nanoid';
|
|
28
27
|
import cloneDeep from 'lodash.clonedeep';
|
|
29
28
|
import { useQuestionnaireStore } from '../../../stores';
|
|
30
29
|
import useRepeatGroups from '../../../hooks/useRepeatGroups';
|
|
31
30
|
import RepeatGroupView from './RepeatGroupView';
|
|
31
|
+
import { generateNewRepeatId } from '../../../utils/repeatId';
|
|
32
32
|
|
|
33
33
|
interface RepeatGroupProps
|
|
34
34
|
extends PropsWithQrRepeatGroupChangeHandler,
|
|
@@ -58,7 +58,7 @@ function RepeatGroup(props: RepeatGroupProps) {
|
|
|
58
58
|
|
|
59
59
|
const mutateRepeatEnableWhenItems = useQuestionnaireStore.use.mutateRepeatEnableWhenItems();
|
|
60
60
|
|
|
61
|
-
const initialRepeatGroups = useInitialiseRepeatGroups(qItem, qrItems);
|
|
61
|
+
const initialRepeatGroups = useInitialiseRepeatGroups(qItem.linkId, qrItems);
|
|
62
62
|
|
|
63
63
|
const [repeatGroups, setRepeatGroups] = useRepeatGroups(initialRepeatGroups);
|
|
64
64
|
|
|
@@ -104,7 +104,7 @@ function RepeatGroup(props: RepeatGroupProps) {
|
|
|
104
104
|
setRepeatGroups([
|
|
105
105
|
...repeatGroups,
|
|
106
106
|
{
|
|
107
|
-
|
|
107
|
+
id: generateNewRepeatId(qItem.linkId),
|
|
108
108
|
qrItem: null
|
|
109
109
|
}
|
|
110
110
|
]);
|
|
@@ -76,7 +76,7 @@ function RepeatGroupView(props: RepeatGroupViewProps) {
|
|
|
76
76
|
return (
|
|
77
77
|
<QGroupContainerBox key={qItem.linkId} cardElevation={groupCardElevation} isRepeated={true}>
|
|
78
78
|
<Card elevation={groupCardElevation} sx={{ p: 2 }}>
|
|
79
|
-
{repeatGroups.map(({
|
|
79
|
+
{repeatGroups.map(({ id, qrItem: nullableQrItem }, index) => {
|
|
80
80
|
const answeredQrItem = createEmptyQrItem(qItem, undefined);
|
|
81
81
|
if (nullableQrItem) {
|
|
82
82
|
answeredQrItem.item = nullableQrItem.item;
|
|
@@ -84,7 +84,7 @@ function RepeatGroupView(props: RepeatGroupViewProps) {
|
|
|
84
84
|
|
|
85
85
|
return (
|
|
86
86
|
<RepeatGroupItem
|
|
87
|
-
key={
|
|
87
|
+
key={id}
|
|
88
88
|
qItem={qItem}
|
|
89
89
|
repeatGroupIndex={index}
|
|
90
90
|
answeredQrItem={answeredQrItem}
|
|
@@ -127,14 +127,14 @@ function RepeatGroupView(props: RepeatGroupViewProps) {
|
|
|
127
127
|
<AccordionDetails sx={{ pt: 0 }}>
|
|
128
128
|
{qItem.text ? <Divider sx={{ mb: 1.5 }} light /> : null}
|
|
129
129
|
<TransitionGroup>
|
|
130
|
-
{repeatGroups.map(({
|
|
130
|
+
{repeatGroups.map(({ id, qrItem: nullableQrItem }, index) => {
|
|
131
131
|
const answeredQrItem = createEmptyQrItem(qItem, undefined);
|
|
132
132
|
if (nullableQrItem) {
|
|
133
133
|
answeredQrItem.item = nullableQrItem.item;
|
|
134
134
|
}
|
|
135
135
|
|
|
136
136
|
return (
|
|
137
|
-
<Collapse key={
|
|
137
|
+
<Collapse key={id} timeout={200}>
|
|
138
138
|
<RepeatGroupItem
|
|
139
139
|
qItem={qItem}
|
|
140
140
|
repeatGroupIndex={index}
|
|
@@ -169,14 +169,14 @@ function RepeatGroupView(props: RepeatGroupViewProps) {
|
|
|
169
169
|
</>
|
|
170
170
|
) : null}
|
|
171
171
|
<TransitionGroup>
|
|
172
|
-
{repeatGroups.map(({
|
|
172
|
+
{repeatGroups.map(({ id, qrItem: nullableQrItem }, index) => {
|
|
173
173
|
const answeredQrItem = createEmptyQrItem(qItem, undefined);
|
|
174
174
|
if (nullableQrItem) {
|
|
175
175
|
answeredQrItem.item = nullableQrItem.item;
|
|
176
176
|
}
|
|
177
177
|
|
|
178
178
|
return (
|
|
179
|
-
<Collapse key={
|
|
179
|
+
<Collapse key={id} timeout={200}>
|
|
180
180
|
<RepeatGroupItem
|
|
181
181
|
qItem={qItem}
|
|
182
182
|
repeatGroupIndex={index}
|
|
@@ -22,7 +22,6 @@ import type {
|
|
|
22
22
|
PropsWithShowMinimalViewAttribute
|
|
23
23
|
} from '../../../interfaces/renderProps.interface';
|
|
24
24
|
import type { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
|
|
25
|
-
import { nanoid } from 'nanoid';
|
|
26
25
|
import { createEmptyQrItem } from '../../../utils/qrItem';
|
|
27
26
|
import { FullWidthFormComponentBox } from '../../Box.styles';
|
|
28
27
|
import AddItemButton from './AddItemButton';
|
|
@@ -33,6 +32,7 @@ import useInitialiseRepeatAnswers from '../../../hooks/useInitialiseRepeatAnswer
|
|
|
33
32
|
import ItemFieldGrid from '../ItemParts/ItemFieldGrid';
|
|
34
33
|
import useReadOnly from '../../../hooks/useReadOnly';
|
|
35
34
|
import { useQuestionnaireStore } from '../../../stores';
|
|
35
|
+
import { generateExistingRepeatId, generateNewRepeatId } from '../../../utils/repeatId';
|
|
36
36
|
|
|
37
37
|
interface RepeatItemProps
|
|
38
38
|
extends PropsWithQrItemChangeHandler,
|
|
@@ -56,7 +56,7 @@ function RepeatItem(props: RepeatItemProps) {
|
|
|
56
56
|
|
|
57
57
|
const readOnly = useReadOnly(qItem, parentIsReadOnly);
|
|
58
58
|
|
|
59
|
-
const repeatAnswers = useInitialiseRepeatAnswers(qrItem);
|
|
59
|
+
const repeatAnswers = useInitialiseRepeatAnswers(qItem.linkId, qrItem);
|
|
60
60
|
|
|
61
61
|
// Event Handlers
|
|
62
62
|
function handleAnswerChange(newQrItem: QuestionnaireResponseItem, index: number) {
|
|
@@ -81,7 +81,7 @@ function RepeatItem(props: RepeatItemProps) {
|
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
function handleAddItem() {
|
|
84
|
-
const updatedRepeatAnswers = [...repeatAnswers, { id:
|
|
84
|
+
const updatedRepeatAnswers = [...repeatAnswers, { id: generateNewRepeatId(qItem.linkId) }];
|
|
85
85
|
|
|
86
86
|
onQrItemChange({
|
|
87
87
|
...createEmptyQrItem(qItem, undefined),
|
|
@@ -100,7 +100,7 @@ function RepeatItem(props: RepeatItemProps) {
|
|
|
100
100
|
|
|
101
101
|
return (
|
|
102
102
|
<RepeatField
|
|
103
|
-
key={answer?.id ??
|
|
103
|
+
key={answer?.id ?? generateExistingRepeatId(qItem.linkId, index)}
|
|
104
104
|
qItem={qItem}
|
|
105
105
|
qrItem={repeatAnswerQrItem}
|
|
106
106
|
answer={answer}
|
|
@@ -131,7 +131,9 @@ function RepeatItem(props: RepeatItemProps) {
|
|
|
131
131
|
}
|
|
132
132
|
|
|
133
133
|
return (
|
|
134
|
-
<Collapse
|
|
134
|
+
<Collapse
|
|
135
|
+
key={answer?.id ?? generateExistingRepeatId(qItem.linkId, index)}
|
|
136
|
+
timeout={200}>
|
|
135
137
|
<RepeatField
|
|
136
138
|
qItem={qItem}
|
|
137
139
|
qrItem={repeatAnswerQrItem}
|