@aehrc/smart-forms-renderer 0.23.2 → 0.25.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.
Files changed (80) hide show
  1. package/lib/components/FormComponents/BooleanItem/BooleanField.d.ts +1 -0
  2. package/lib/components/FormComponents/BooleanItem/BooleanField.js +3 -1
  3. package/lib/components/FormComponents/BooleanItem/BooleanField.js.map +1 -1
  4. package/lib/components/FormComponents/BooleanItem/BooleanItem.js +10 -3
  5. package/lib/components/FormComponents/BooleanItem/BooleanItem.js.map +1 -1
  6. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.d.ts +2 -2
  7. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.js +4 -1
  8. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.js.map +1 -1
  9. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.d.ts +2 -2
  10. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.js +4 -1
  11. package/lib/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.js.map +1 -1
  12. package/lib/components/FormComponents/ChoiceItems/ChoiceItemSwitcher.d.ts +1 -1
  13. package/lib/components/FormComponents/ChoiceItems/ChoiceItemSwitcher.js +10 -5
  14. package/lib/components/FormComponents/ChoiceItems/ChoiceItemSwitcher.js.map +1 -1
  15. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionFields.d.ts +3 -1
  16. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionFields.js +9 -3
  17. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionFields.js.map +1 -1
  18. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.d.ts +2 -2
  19. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.js +39 -17
  20. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.js.map +1 -1
  21. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionView.d.ts +13 -0
  22. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionView.js +31 -0
  23. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionView.js.map +1 -0
  24. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetFields.d.ts +3 -1
  25. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetFields.js +11 -5
  26. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetFields.js.map +1 -1
  27. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.d.ts +2 -2
  28. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.js +16 -9
  29. package/lib/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.js.map +1 -1
  30. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.d.ts +1 -0
  31. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.js +3 -2
  32. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.js.map +1 -1
  33. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.js +18 -21
  34. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.js.map +1 -1
  35. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionView.d.ts +13 -0
  36. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionView.js +31 -0
  37. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionView.js.map +1 -0
  38. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.d.ts +1 -0
  39. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.js +3 -1
  40. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.js.map +1 -1
  41. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.js +17 -3
  42. package/lib/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.js.map +1 -1
  43. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.js.map +1 -1
  44. package/lib/hooks/useBooleanCalculatedExpression.d.ts +11 -0
  45. package/lib/hooks/useBooleanCalculatedExpression.js +47 -0
  46. package/lib/hooks/useBooleanCalculatedExpression.js.map +1 -0
  47. package/lib/hooks/useCodingCalculatedExpression.d.ts +11 -0
  48. package/lib/hooks/useCodingCalculatedExpression.js +51 -0
  49. package/lib/hooks/useCodingCalculatedExpression.js.map +1 -0
  50. package/lib/interfaces/calculatedExpression.interface.d.ts +1 -1
  51. package/lib/utils/choice.d.ts +8 -2
  52. package/lib/utils/choice.js +20 -14
  53. package/lib/utils/choice.js.map +1 -1
  54. package/lib/utils/enableWhen.js +11 -10
  55. package/lib/utils/enableWhen.js.map +1 -1
  56. package/lib/utils/initialise.js +6 -0
  57. package/lib/utils/initialise.js.map +1 -1
  58. package/package.json +1 -1
  59. package/src/components/FormComponents/BooleanItem/BooleanField.tsx +5 -1
  60. package/src/components/FormComponents/BooleanItem/BooleanItem.tsx +11 -0
  61. package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerOptionItem.tsx +7 -0
  62. package/src/components/FormComponents/ChoiceItems/ChoiceCheckboxAnswerValueSetItem.tsx +7 -0
  63. package/src/components/FormComponents/ChoiceItems/ChoiceItemSwitcher.tsx +10 -1
  64. package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionFields.tsx +25 -11
  65. package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.tsx +65 -32
  66. package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionView.tsx +83 -0
  67. package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetFields.tsx +41 -19
  68. package/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.tsx +24 -10
  69. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionFields.tsx +5 -2
  70. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.tsx +30 -39
  71. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionView.tsx +83 -0
  72. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.tsx +13 -2
  73. package/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.tsx +20 -0
  74. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceSelectAnswerValueSetItem.tsx +1 -0
  75. package/src/hooks/useBooleanCalculatedExpression.ts +75 -0
  76. package/src/hooks/useCodingCalculatedExpression.ts +80 -0
  77. package/src/interfaces/calculatedExpression.interface.ts +1 -1
  78. package/src/utils/choice.ts +23 -13
  79. package/src/utils/enableWhen.ts +32 -10
  80. package/src/utils/initialise.ts +7 -0
@@ -25,6 +25,23 @@ import type {
25
25
  import { ChoiceItemControl, ChoiceItemOrientation } from '../interfaces/choice.enum';
26
26
  import { isSpecificItemControl } from './itemControl';
27
27
 
28
+ /**
29
+ * Convert codings to Questionnaire answer options
30
+ *
31
+ * @author Sean Fong
32
+ */
33
+ export function convertCodingsToAnswerOptions(codings: Coding[]): QuestionnaireItemAnswerOption[] {
34
+ return codings.map(
35
+ (coding): QuestionnaireItemAnswerOption => ({
36
+ valueCoding: {
37
+ system: coding.system,
38
+ code: coding.code,
39
+ display: coding.display
40
+ }
41
+ })
42
+ );
43
+ }
44
+
28
45
  /**
29
46
  * Find and return corresponding answerOption based on selected answer in form
30
47
  *
@@ -32,11 +49,11 @@ import { isSpecificItemControl } from './itemControl';
32
49
  */
33
50
  export function findInAnswerOptions(
34
51
  options: QuestionnaireItemAnswerOption[],
35
- str: string
52
+ valueInString: string
36
53
  ): QuestionnaireResponseItemAnswer | undefined {
37
54
  for (const option of options) {
38
55
  if (option.valueCoding) {
39
- if (str === option.valueCoding.code) {
56
+ if (valueInString === option.valueCoding.code) {
40
57
  return {
41
58
  valueCoding: option.valueCoding
42
59
  };
@@ -44,7 +61,7 @@ export function findInAnswerOptions(
44
61
  }
45
62
 
46
63
  if (option.valueString) {
47
- if (str === option.valueString) {
64
+ if (valueInString === option.valueString) {
48
65
  return {
49
66
  valueString: option.valueString
50
67
  };
@@ -52,7 +69,7 @@ export function findInAnswerOptions(
52
69
  }
53
70
 
54
71
  if (option.valueInteger) {
55
- if (str === option.valueInteger.toString()) {
72
+ if (valueInString === option.valueInteger.toString()) {
56
73
  return {
57
74
  valueInteger: option.valueInteger
58
75
  };
@@ -69,7 +86,6 @@ export function findInAnswerOptions(
69
86
  * @author Sean Fong
70
87
  */
71
88
  export function getChoiceControlType(qItem: QuestionnaireItem) {
72
- const dropdownOptionsCount = 5;
73
89
  if (isSpecificItemControl(qItem, 'autocomplete')) {
74
90
  return ChoiceItemControl.Autocomplete;
75
91
  }
@@ -86,17 +102,11 @@ export function getChoiceControlType(qItem: QuestionnaireItem) {
86
102
  return ChoiceItemControl.Select;
87
103
  }
88
104
 
89
- if (qItem.answerOption) {
90
- return qItem.answerOption.length > 0 && qItem.answerOption.length < dropdownOptionsCount
91
- ? ChoiceItemControl.Radio
92
- : ChoiceItemControl.Select;
93
- } else {
94
- return ChoiceItemControl.Select;
95
- }
105
+ return ChoiceItemControl.Select;
96
106
  }
97
107
 
98
108
  /**
99
- * Find and return corresponding coding from AnswerValyeSet based on selected answer in form
109
+ * Find and return corresponding coding from AnswerValueSet based on selected answer in form
100
110
  *
101
111
  * @author Sean Fong
102
112
  */
@@ -68,51 +68,73 @@ export function isEnabledAnswerTypeSwitcher(
68
68
  enableWhen: QuestionnaireItemEnableWhen,
69
69
  answer: QuestionnaireResponseItemAnswer
70
70
  ): boolean {
71
- if (enableWhen['answerBoolean'] !== undefined && enableWhen.operator === 'exists') {
71
+ if (typeof enableWhen.answerBoolean === 'boolean' && enableWhen.operator === 'exists') {
72
72
  return answerOperatorSwitcher(enableWhen.answerBoolean, answer, enableWhen.operator);
73
- } else if (enableWhen['answerBoolean'] !== undefined && answer.valueBoolean !== undefined) {
73
+ }
74
+
75
+ if (typeof enableWhen.answerBoolean === 'boolean' && typeof answer.valueBoolean === 'boolean') {
74
76
  return answerOperatorSwitcher(
75
77
  enableWhen.answerBoolean,
76
78
  answer.valueBoolean,
77
79
  enableWhen.operator
78
80
  );
79
- } else if (enableWhen['answerDecimal'] && answer.valueDecimal) {
81
+ }
82
+
83
+ if (typeof enableWhen.answerDecimal === 'number' && typeof answer.valueDecimal === 'number') {
80
84
  return answerOperatorSwitcher(
81
85
  enableWhen.answerDecimal,
82
86
  answer.valueDecimal,
83
87
  enableWhen.operator
84
88
  );
85
- } else if (enableWhen['answerInteger'] !== undefined && answer.valueInteger !== undefined) {
89
+ }
90
+
91
+ if (typeof enableWhen.answerInteger === 'number' && typeof answer.valueInteger === 'number') {
86
92
  return answerOperatorSwitcher(
87
93
  enableWhen.answerInteger,
88
94
  answer.valueInteger,
89
95
  enableWhen.operator
90
96
  );
91
- } else if (enableWhen['answerDate'] && answer.valueDate) {
97
+ }
98
+
99
+ if (typeof enableWhen.answerDate === 'string' && typeof answer.valueDate === 'string') {
92
100
  return answerOperatorSwitcher(enableWhen.answerDate, answer.valueDate, enableWhen.operator);
93
- } else if (enableWhen['answerDateTime'] && answer.valueDateTime) {
101
+ }
102
+
103
+ if (typeof enableWhen.answerDateTime === 'string' && typeof answer.valueDateTime === 'string') {
94
104
  return answerOperatorSwitcher(
95
105
  enableWhen.answerDateTime,
96
106
  answer.valueDateTime,
97
107
  enableWhen.operator
98
108
  );
99
- } else if (enableWhen['answerTime'] && answer.valueTime) {
109
+ }
110
+
111
+ if (typeof enableWhen.answerTime === 'string' && typeof answer.valueTime === 'string') {
100
112
  return answerOperatorSwitcher(enableWhen.answerTime, answer.valueTime, enableWhen.operator);
101
- } else if (enableWhen['answerString'] && answer.valueString) {
113
+ }
114
+
115
+ if (typeof enableWhen.answerString === 'string' && typeof answer.valueString === 'string') {
102
116
  return answerOperatorSwitcher(enableWhen.answerString, answer.valueString, enableWhen.operator);
103
- } else if (enableWhen['answerCoding']?.code && answer.valueCoding?.code) {
117
+ }
118
+
119
+ if (
120
+ typeof enableWhen.answerCoding?.code === 'string' &&
121
+ typeof answer.valueCoding?.code === 'string'
122
+ ) {
104
123
  return answerOperatorSwitcher(
105
124
  enableWhen.answerCoding.code,
106
125
  answer.valueCoding.code,
107
126
  enableWhen.operator
108
127
  );
109
- } else if (enableWhen['answerQuantity'] && answer.valueQuantity) {
128
+ }
129
+
130
+ if (enableWhen.answerQuantity && answer.valueQuantity) {
110
131
  return answerOperatorSwitcher(
111
132
  enableWhen.answerQuantity,
112
133
  answer.valueQuantity,
113
134
  enableWhen.operator
114
135
  );
115
136
  }
137
+
116
138
  return false;
117
139
  }
118
140
 
@@ -73,6 +73,13 @@ export function initialiseQuestionnaireResponse(
73
73
  questionnaireResponse.questionnaire = createQuestionnaireReference(questionnaire);
74
74
  }
75
75
 
76
+ // Add "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaireresponse" profile
77
+ const profiles: string[] = [
78
+ 'http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaireresponse'
79
+ ];
80
+ questionnaireResponse.meta = questionnaireResponse.meta || {};
81
+ questionnaireResponse.meta.profile = profiles;
82
+
76
83
  return questionnaireResponse;
77
84
  }
78
85