@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.
Files changed (108) hide show
  1. package/lib/components/FormComponents/ItemParts/ItemFieldGrid.js +6 -2
  2. package/lib/components/FormComponents/ItemParts/ItemFieldGrid.js.map +1 -1
  3. package/lib/components/FormComponents/RepeatGroup/RepeatGroup.js +3 -3
  4. package/lib/components/FormComponents/RepeatGroup/RepeatGroup.js.map +1 -1
  5. package/lib/components/FormComponents/RepeatGroup/RepeatGroupView.js +6 -6
  6. package/lib/components/FormComponents/RepeatGroup/RepeatGroupView.js.map +1 -1
  7. package/lib/components/FormComponents/RepeatItem/RepeatItem.js +5 -5
  8. package/lib/components/FormComponents/RepeatItem/RepeatItem.js.map +1 -1
  9. package/lib/components/FormComponents/Tables/GroupTable.js +10 -10
  10. package/lib/components/FormComponents/Tables/GroupTable.js.map +1 -1
  11. package/lib/components/FormComponents/Tables/GroupTableBody.d.ts +1 -1
  12. package/lib/components/FormComponents/Tables/GroupTableBody.js +3 -3
  13. package/lib/components/FormComponents/Tables/GroupTableBody.js.map +1 -1
  14. package/lib/components/FormComponents/Tables/GroupTableRow.d.ts +1 -1
  15. package/lib/components/FormComponents/Tables/GroupTableRow.js +4 -4
  16. package/lib/components/FormComponents/Tables/GroupTableRow.js.map +1 -1
  17. package/lib/components/FormComponents/Tables/GroupTableView.d.ts +1 -1
  18. package/lib/components/Renderer/FormTopLevelItem.js +13 -1
  19. package/lib/components/Renderer/FormTopLevelItem.js.map +1 -1
  20. package/lib/hooks/useDateValidation.js +2 -2
  21. package/lib/hooks/useDateValidation.js.map +1 -1
  22. package/lib/hooks/useGroupTableRows.d.ts +1 -1
  23. package/lib/hooks/useGroupTableRows.js +3 -3
  24. package/lib/hooks/useGroupTableRows.js.map +1 -1
  25. package/lib/hooks/useInitialiseGroupTable.d.ts +1 -1
  26. package/lib/hooks/useInitialiseGroupTable.js +10 -16
  27. package/lib/hooks/useInitialiseGroupTable.js.map +1 -1
  28. package/lib/hooks/useInitialiseRepeatAnswers.d.ts +1 -1
  29. package/lib/hooks/useInitialiseRepeatAnswers.js +9 -12
  30. package/lib/hooks/useInitialiseRepeatAnswers.js.map +1 -1
  31. package/lib/hooks/useInitialiseRepeatGroups.d.ts +2 -2
  32. package/lib/hooks/useInitialiseRepeatGroups.js +11 -20
  33. package/lib/hooks/useInitialiseRepeatGroups.js.map +1 -1
  34. package/lib/hooks/useRepeatGroups.js +6 -2
  35. package/lib/hooks/useRepeatGroups.js.map +1 -1
  36. package/lib/index.d.ts +1 -1
  37. package/lib/index.js +1 -1
  38. package/lib/index.js.map +1 -1
  39. package/lib/interfaces/groupTable.interface.d.ts +1 -1
  40. package/lib/interfaces/repeatGroup.interface.d.ts +1 -1
  41. package/lib/theme/palette.js +0 -4
  42. package/lib/theme/palette.js.map +1 -1
  43. package/lib/utils/groupTable.js +1 -1
  44. package/lib/utils/groupTable.js.map +1 -1
  45. package/lib/utils/index.d.ts +1 -1
  46. package/lib/utils/index.js +1 -1
  47. package/lib/utils/index.js.map +1 -1
  48. package/lib/utils/manageForm.d.ts +7 -0
  49. package/lib/utils/manageForm.js +15 -1
  50. package/lib/utils/manageForm.js.map +1 -1
  51. package/lib/utils/repeatId.d.ts +4 -0
  52. package/lib/utils/repeatId.js +93 -0
  53. package/lib/utils/repeatId.js.map +1 -0
  54. package/package.json +1 -1
  55. package/src/components/FormComponents/ItemParts/ItemFieldGrid.tsx +8 -2
  56. package/src/components/FormComponents/RepeatGroup/RepeatGroup.tsx +3 -3
  57. package/src/components/FormComponents/RepeatGroup/RepeatGroupView.tsx +6 -6
  58. package/src/components/FormComponents/RepeatItem/RepeatItem.tsx +7 -5
  59. package/src/components/FormComponents/Tables/GroupTable.tsx +13 -10
  60. package/src/components/FormComponents/Tables/GroupTableBody.tsx +5 -5
  61. package/src/components/FormComponents/Tables/GroupTableRow.tsx +5 -5
  62. package/src/components/FormComponents/Tables/GroupTableView.tsx +1 -1
  63. package/src/components/Renderer/FormTopLevelItem.tsx +33 -1
  64. package/src/hooks/useDateValidation.tsx +2 -2
  65. package/src/hooks/useGroupTableRows.ts +3 -3
  66. package/src/hooks/useInitialiseGroupTable.ts +13 -17
  67. package/src/hooks/useInitialiseRepeatAnswers.ts +9 -12
  68. package/src/hooks/useInitialiseRepeatGroups.ts +14 -25
  69. package/src/hooks/useRepeatGroups.ts +8 -4
  70. package/src/index.ts +1 -0
  71. package/src/interfaces/groupTable.interface.ts +1 -1
  72. package/src/interfaces/repeatGroup.interface.ts +1 -1
  73. package/src/stories/assets/questionnaires/QIdRemoverDebugger.ts +161 -0
  74. package/src/stories/storybookWrappers/BuildFormButtonForStorybook.tsx +1 -1
  75. package/src/stories/storybookWrappers/IdRemoverButtonForStorybook.tsx +51 -0
  76. package/src/stories/storybookWrappers/IdRemoverDebuggerWrapperForStorybook.tsx +84 -0
  77. package/src/stories/testing/IdRemoverDebuggerWrapper.stories.tsx +39 -0
  78. package/src/tests/extractObservation.test.ts +2 -5
  79. package/src/theme/palette.ts +0 -4
  80. package/src/utils/groupTable.ts +1 -1
  81. package/src/utils/index.ts +7 -1
  82. package/src/utils/manageForm.ts +28 -1
  83. package/src/utils/repeatId.ts +123 -0
  84. package/CHANGELOG.md +0 -43
  85. package/lib/hooks/useRepeatAnswers.d.ts +0 -4
  86. package/lib/hooks/useRepeatAnswers.js +0 -34
  87. package/lib/hooks/useRepeatAnswers.js.map +0 -1
  88. package/lib/interfaces/repeatItem.interface.d.ts +0 -5
  89. package/lib/interfaces/repeatItem.interface.js +0 -2
  90. package/lib/interfaces/repeatItem.interface.js.map +0 -1
  91. package/lib/utils/answerExpression.d.ts +0 -18
  92. package/lib/utils/answerExpression.js +0 -133
  93. package/lib/utils/answerExpression.js.map +0 -1
  94. package/lib/utils/dynamicValueSet.d.ts +0 -5
  95. package/lib/utils/dynamicValueSet.js +0 -96
  96. package/lib/utils/dynamicValueSet.js.map +0 -1
  97. package/lib/utils/fhirpathAsyncUtils/fhirpath-async.d.ts +0 -14
  98. package/lib/utils/fhirpathAsyncUtils/fhirpath-async.js +0 -639
  99. package/lib/utils/fhirpathAsyncUtils/fhirpath-async.js.map +0 -1
  100. package/lib/utils/fhirpathAsyncUtils/outcome-utils.d.ts +0 -3
  101. package/lib/utils/fhirpathAsyncUtils/outcome-utils.js +0 -41
  102. package/lib/utils/fhirpathAsyncUtils/outcome-utils.js.map +0 -1
  103. package/lib/utils/questionnaireStoreUtils/extractPreferredTerminologyServerUrls.d.ts +0 -3
  104. package/lib/utils/questionnaireStoreUtils/extractPreferredTerminologyServerUrls.js +0 -34
  105. package/lib/utils/questionnaireStoreUtils/extractPreferredTerminologyServerUrls.js.map +0 -1
  106. package/lib/utils/updateQr.d.ts +0 -9
  107. package/lib/utils/updateQr.js +0 -55
  108. 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
- function useInitialiseRepeatAnswers(qrItem) {
18
+ import { generateExistingRepeatId, generateNewRepeatId } from '../utils/repeatId';
19
+ function useInitialiseRepeatAnswers(linkId, qrItem) {
20
20
  return useMemo(() => {
21
- let initialRepeatAnswers = [{ id: nanoid() }];
22
- if (qrItem === null || qrItem === void 0 ? void 0 : qrItem.answer) {
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 initialRepeatAnswers;
31
- }, [qrItem]);
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,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,SAAS,0BAA0B,CACjC,MAAwC;IAExC,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,IAAI,oBAAoB,GAA+C,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QAE1F,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,EAAE;YAClB,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBAClD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE;oBACd,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;iBACtB;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC,CAAC,CAAC;SACJ;QAED,OAAO,oBAAoB,CAAC;IAC9B,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AACf,CAAC;AAED,eAAe,0BAA0B,CAAC"}
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 { QuestionnaireItem, QuestionnaireResponseItem } from 'fhir/r4';
1
+ import type { QuestionnaireResponseItem } from 'fhir/r4';
2
2
  import type { RepeatGroupSingle } from '../interfaces/repeatGroup.interface';
3
- declare function useInitialiseRepeatGroups(qItem: QuestionnaireItem, qrItems: QuestionnaireResponseItem[]): RepeatGroupSingle[];
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
- function useInitialiseRepeatGroups(qItem, qrItems) {
18
+ import { generateExistingRepeatId, generateNewRepeatId } from '../utils/repeatId';
19
+ function useInitialiseRepeatGroups(linkId, qrItems) {
20
20
  return useMemo(() => {
21
- let initialRepeatGroupAnswers = [
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 initialRepeatGroupAnswers;
36
- },
37
- // Requires checking of both qItem and qrItems
38
- // eslint-disable-next-line react-hooks/exhaustive-deps
39
- [qItem, qrItems]);
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;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,SAAS,yBAAyB,CAChC,KAAwB,EACxB,OAAoC;IAEpC,OAAO,OAAO,CACZ,GAAG,EAAE;QACH,IAAI,yBAAyB,GAAwB;YACnD;gBACE,MAAM,EAAE,MAAM,EAAE;gBAChB,MAAM,EAAE,IAAI;aACb;SACF,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YACtB,yBAAyB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBACjD,OAAO;oBACL,MAAM,EAAE,MAAM,EAAE;oBAChB,MAAM;iBACP,CAAC;YACJ,CAAC,CAAC,CAAC;SACJ;QACD,OAAO,yBAAyB,CAAC;IACnC,CAAC;IACD,8CAA8C;IAC9C,uDAAuD;IACvD,CAAC,KAAK,EAAE,OAAO,CAAC,CACjB,CAAC;AACJ,CAAC;AAED,eAAe,yBAAyB,CAAC"}
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.map((repeatGroupSingle) => repeatGroupSingle.qrItem);
23
- const repeatGroupsQRItems = repeatGroups.map((repeatGroupSingle) => repeatGroupSingle.qrItem);
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;AAEtC,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,CAAC,GAAG,CAC9C,CAAC,iBAAiB,EAAE,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAChD,CAAC;QACF,MAAM,mBAAmB,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,iBAAiB,EAAE,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAE9F,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"}
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"}
@@ -1,5 +1,5 @@
1
1
  import type { QuestionnaireResponseItem } from 'fhir/r4';
2
2
  export interface GroupTableRowModel {
3
- nanoId: string;
3
+ id: string;
4
4
  qrItem: QuestionnaireResponseItem | null;
5
5
  }
@@ -4,6 +4,6 @@ export interface QrRepeatGroup {
4
4
  qrItems: QuestionnaireResponseItem[];
5
5
  }
6
6
  export interface RepeatGroupSingle {
7
- nanoId: string;
7
+ id: string;
8
8
  qrItem: QuestionnaireResponseItem | null;
9
9
  }
@@ -45,10 +45,6 @@ const palette = {
45
45
  secondary: grey['600'],
46
46
  disabled: grey['500']
47
47
  },
48
- background: {
49
- paper: '#fff',
50
- default: grey['50']
51
- },
52
48
  customBackground: {
53
49
  neutral: '#F4F6F8'
54
50
  },
@@ -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,UAAU,EAAE;QACV,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;KACpB;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"}
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"}
@@ -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.nanoId))
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,MAAM,CAAC,CAAC;SACjD,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"}
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"}
@@ -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';
@@ -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';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AACnG,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"}
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
  *
@@ -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
- return questionnaireResponseStore.getState().updatableResponse;
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":"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"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aehrc/smart-forms-renderer",
3
- "version": "0.40.0",
3
+ "version": "0.40.2",
4
4
  "description": "FHIR Structured Data Captured (SDC) rendering engine for Smart Forms",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -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 xs={4}>
40
+ <Grid item md={4} xs={12}>
40
41
  <LabelWrapper qItem={qItem} readOnly={readOnly} />
41
42
  </Grid>
42
- <Grid item xs={8}>
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
- nanoId: nanoid(),
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(({ nanoId, qrItem: nullableQrItem }, index) => {
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={nanoId}
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(({ nanoId, qrItem: nullableQrItem }, index) => {
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={nanoId} timeout={200}>
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(({ nanoId, qrItem: nullableQrItem }, index) => {
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={nanoId} timeout={200}>
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: nanoid() }];
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 ?? nanoid()}
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 key={answer?.id ?? nanoid()} timeout={200}>
134
+ <Collapse
135
+ key={answer?.id ?? generateExistingRepeatId(qItem.linkId, index)}
136
+ timeout={200}>
135
137
  <RepeatField
136
138
  qItem={qItem}
137
139
  qrItem={repeatAnswerQrItem}