@aehrc/smart-forms-renderer 1.2.0 → 1.2.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 (135) hide show
  1. package/lib/components/FormComponents/ItemParts/FadingCheckIcon.d.ts +7 -0
  2. package/lib/components/FormComponents/ItemParts/FadingCheckIcon.js +26 -0
  3. package/lib/components/FormComponents/ItemParts/FadingCheckIcon.js.map +1 -0
  4. package/lib/components/FormComponents/ItemParts/ItemLabelText.d.ts +8 -0
  5. package/lib/components/FormComponents/ItemParts/ItemLabelText.js +63 -0
  6. package/lib/components/FormComponents/ItemParts/ItemLabelText.js.map +1 -0
  7. package/lib/components/FormComponents/ItemParts/ItemLabelWrapper.d.ts +8 -0
  8. package/lib/components/FormComponents/ItemParts/ItemLabelWrapper.js +53 -0
  9. package/lib/components/FormComponents/ItemParts/ItemLabelWrapper.js.map +1 -0
  10. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.js +4 -3
  11. package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.js.map +1 -1
  12. package/lib/components/FormComponents/RepeatGroup/DeleteItemButton.d.ts +10 -0
  13. package/lib/components/FormComponents/RepeatGroup/DeleteItemButton.js +30 -0
  14. package/lib/components/FormComponents/RepeatGroup/DeleteItemButton.js.map +1 -0
  15. package/lib/components/FormComponents/SingleItem/SingleItem.js +15 -2
  16. package/lib/components/FormComponents/SingleItem/SingleItem.js.map +1 -1
  17. package/lib/components/FormComponents/SingleItem/SingleNestedItems.js +8 -8
  18. package/lib/components/FormComponents/SingleItem/SingleNestedItems.js.map +1 -1
  19. package/lib/components/Iconify/Iconify.d.ts +10 -0
  20. package/lib/components/Iconify/Iconify.js +26 -0
  21. package/lib/components/Iconify/Iconify.js.map +1 -0
  22. package/lib/components/Renderer/FormBodyPage.d.ts +9 -0
  23. package/lib/components/Renderer/FormBodyPage.js +43 -0
  24. package/lib/components/Renderer/FormBodyPage.js.map +1 -0
  25. package/lib/components/Renderer/FormTitle.d.ts +7 -0
  26. package/lib/components/Renderer/FormTitle.js +30 -0
  27. package/lib/components/Renderer/FormTitle.js.map +1 -0
  28. package/lib/components/Renderer/FormTopLevelPage.d.ts +9 -0
  29. package/lib/components/Renderer/FormTopLevelPage.js +29 -0
  30. package/lib/components/Renderer/FormTopLevelPage.js.map +1 -0
  31. package/lib/components/Tabs/FormBodyTabListWrapper.js +1 -1
  32. package/lib/components/Tabs/FormBodyTabListWrapper.js.map +1 -1
  33. package/lib/hooks/useBooleanCalculatedExpression.d.ts +12 -0
  34. package/lib/hooks/useBooleanCalculatedExpression.js +53 -0
  35. package/lib/hooks/useBooleanCalculatedExpression.js.map +1 -0
  36. package/lib/hooks/useDecimalCalculatedExpression.d.ts +13 -0
  37. package/lib/hooks/useDecimalCalculatedExpression.js +59 -0
  38. package/lib/hooks/useDecimalCalculatedExpression.js.map +1 -0
  39. package/lib/hooks/useIntegerCalculatedExpression.d.ts +12 -0
  40. package/lib/hooks/useIntegerCalculatedExpression.js +56 -0
  41. package/lib/hooks/useIntegerCalculatedExpression.js.map +1 -0
  42. package/lib/hooks/useQuantityCalculatedExpression.d.ts +14 -0
  43. package/lib/hooks/useQuantityCalculatedExpression.js +107 -0
  44. package/lib/hooks/useQuantityCalculatedExpression.js.map +1 -0
  45. package/lib/hooks/useStringCalculatedExpression.d.ts +12 -0
  46. package/lib/hooks/useStringCalculatedExpression.js +58 -0
  47. package/lib/hooks/useStringCalculatedExpression.js.map +1 -0
  48. package/lib/stores/rendererConfigStore.d.ts +1 -1
  49. package/lib/stories/storybookWrappers/InitialiseFormWrapperForStorybook.d.ts +3 -2
  50. package/lib/stories/storybookWrappers/InitialiseFormWrapperForStorybook.js +27 -6
  51. package/lib/stories/storybookWrappers/InitialiseFormWrapperForStorybook.js.map +1 -1
  52. package/lib/stories/storybookWrappers/index.js +1 -1
  53. package/lib/theme/Theme.d.ts +44 -0
  54. package/lib/theme/Theme.js +43 -0
  55. package/lib/theme/Theme.js.map +1 -0
  56. package/lib/theme/customGlobalStyles.d.ts +2 -0
  57. package/lib/theme/customGlobalStyles.js +61 -0
  58. package/lib/theme/customGlobalStyles.js.map +1 -0
  59. package/lib/theme/overrides/Accordion.d.ts +14 -0
  60. package/lib/theme/overrides/Accordion.js +32 -0
  61. package/lib/theme/overrides/Accordion.js.map +1 -0
  62. package/lib/theme/overrides/Autocomplete.d.ts +10 -0
  63. package/lib/theme/overrides/Autocomplete.js +28 -0
  64. package/lib/theme/overrides/Autocomplete.js.map +1 -0
  65. package/lib/theme/overrides/Button.d.ts +33 -0
  66. package/lib/theme/overrides/Button.js +52 -0
  67. package/lib/theme/overrides/Button.js.map +1 -0
  68. package/lib/theme/overrides/Card.d.ts +35 -0
  69. package/lib/theme/overrides/Card.js +49 -0
  70. package/lib/theme/overrides/Card.js.map +1 -0
  71. package/lib/theme/overrides/Input.d.ts +64 -0
  72. package/lib/theme/overrides/Input.js +81 -0
  73. package/lib/theme/overrides/Input.js.map +1 -0
  74. package/lib/theme/overrides/Overrides.d.ts +3 -0
  75. package/lib/theme/overrides/Overrides.js +29 -0
  76. package/lib/theme/overrides/Overrides.js.map +1 -0
  77. package/lib/theme/overrides/Paper.d.ts +12 -0
  78. package/lib/theme/overrides/Paper.js +31 -0
  79. package/lib/theme/overrides/Paper.js.map +1 -0
  80. package/lib/theme/overrides/SpeedDial.d.ts +16 -0
  81. package/lib/theme/overrides/SpeedDial.js +34 -0
  82. package/lib/theme/overrides/SpeedDial.js.map +1 -0
  83. package/lib/theme/overrides/Table.d.ts +12 -0
  84. package/lib/theme/overrides/Table.js +30 -0
  85. package/lib/theme/overrides/Table.js.map +1 -0
  86. package/lib/theme/palette.d.ts +27 -0
  87. package/lib/theme/palette.js +63 -0
  88. package/lib/theme/palette.js.map +1 -0
  89. package/lib/theme/shadows.d.ts +2 -0
  90. package/lib/theme/shadows.js +52 -0
  91. package/lib/theme/shadows.js.map +1 -0
  92. package/lib/utils/calculatedExpression.js +11 -0
  93. package/lib/utils/calculatedExpression.js.map +1 -1
  94. package/lib/utils/dayjsExtend.d.ts +1 -0
  95. package/lib/utils/dayjsExtend.js +22 -0
  96. package/lib/utils/dayjsExtend.js.map +1 -0
  97. package/lib/utils/initialise.js +8 -1
  98. package/lib/utils/initialise.js.map +1 -1
  99. package/lib/utils/itemControl.d.ts +103 -0
  100. package/lib/utils/itemControl.js +350 -0
  101. package/lib/utils/itemControl.js.map +1 -0
  102. package/lib/utils/mapItem.d.ts +1 -1
  103. package/lib/utils/mapItem.js +2 -0
  104. package/lib/utils/mapItem.js.map +1 -1
  105. package/lib/utils/qrItem.d.ts +13 -0
  106. package/lib/utils/qrItem.js +76 -0
  107. package/lib/utils/qrItem.js.map +1 -1
  108. package/lib/utils/questionnaireStoreUtils/addAdditionalVariables.d.ts +2 -0
  109. package/lib/utils/questionnaireStoreUtils/addAdditionalVariables.js +43 -0
  110. package/lib/utils/questionnaireStoreUtils/addAdditionalVariables.js.map +1 -0
  111. package/lib/utils/questionnaireStoreUtils/createQuestionaireModel.d.ts +3 -0
  112. package/lib/utils/questionnaireStoreUtils/createQuestionaireModel.js +101 -0
  113. package/lib/utils/questionnaireStoreUtils/createQuestionaireModel.js.map +1 -0
  114. package/lib/utils/questionnaireStoreUtils/extractOtherExtensions.js +4 -2
  115. package/lib/utils/questionnaireStoreUtils/extractOtherExtensions.js.map +1 -1
  116. package/lib/utils/validateQuestionnaire.d.ts +66 -0
  117. package/lib/utils/validateQuestionnaire.js +559 -0
  118. package/lib/utils/validateQuestionnaire.js.map +1 -0
  119. package/package.json +1 -1
  120. package/src/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.tsx +4 -3
  121. package/src/components/FormComponents/SingleItem/SingleItem.tsx +16 -2
  122. package/src/components/FormComponents/SingleItem/SingleNestedItems.tsx +8 -9
  123. package/src/components/Tabs/FormBodyTabListWrapper.tsx +1 -1
  124. package/src/stores/rendererConfigStore.ts +1 -1
  125. package/src/utils/calculatedExpression.ts +11 -0
  126. package/src/utils/initialise.ts +8 -1
  127. package/src/utils/mapItem.ts +3 -1
  128. package/src/utils/qrItem.ts +91 -0
  129. package/src/utils/questionnaireStoreUtils/extractOtherExtensions.ts +4 -2
  130. package/lib/interfaces/itemPath.interface.d.ts +0 -31
  131. package/lib/interfaces/itemPath.interface.js +0 -2
  132. package/lib/interfaces/itemPath.interface.js.map +0 -1
  133. package/lib/utils/itemPath.d.ts +0 -57
  134. package/lib/utils/itemPath.js +0 -75
  135. package/lib/utils/itemPath.js.map +0 -1
@@ -0,0 +1,559 @@
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
+ import { getQrItemsIndex, mapQItemsIndex } from './mapItem';
18
+ import { isHiddenByEnableWhen } from './qItem';
19
+ import { getDecimalPrecision, getMaxValue, getMinValue, getRegexString, getRegexValidation, getShortText } from './itemControl';
20
+ import { structuredDataCapture } from 'fhir-sdc-helpers';
21
+ import { parseDecimalStringToFloat } from './parseInputs';
22
+ import dayjs from 'dayjs';
23
+ import { questionnaireStore } from '../stores';
24
+ export var ValidationResult;
25
+ (function (ValidationResult) {
26
+ ValidationResult["unknown"] = "unknown";
27
+ ValidationResult["questionnaireNotFound"] = "questionnaireNotFound";
28
+ ValidationResult["questionnaireInactive"] = "questionnaireInactive";
29
+ ValidationResult["questionnaireDraft"] = "questionnaireDraft";
30
+ ValidationResult["questionnaireRetired"] = "questionnaireRetired";
31
+ ValidationResult["invalidLinkId"] = "invalidLinkId";
32
+ ValidationResult["invalidType"] = "invalidType";
33
+ ValidationResult["invalidAnswerType"] = "invalidAnswerType";
34
+ ValidationResult["invalidAnswerOption"] = "invalidAnswerOption";
35
+ ValidationResult["exclusiveAnswerOption"] = "exclusiveAnswerOption";
36
+ ValidationResult["invalidUrlValue"] = "invalidUrlValue";
37
+ ValidationResult["groupShouldNotHaveAnswers"] = "groupShouldNotHaveAnswers";
38
+ ValidationResult["required"] = "required";
39
+ ValidationResult["invariant"] = "invariant";
40
+ ValidationResult["invariantExecution"] = "invariantExecution";
41
+ ValidationResult["repeats"] = "repeats";
42
+ ValidationResult["minCount"] = "minCount";
43
+ ValidationResult["maxCount"] = "maxCount";
44
+ ValidationResult["minValue"] = "minValue";
45
+ ValidationResult["maxValue"] = "maxValue";
46
+ ValidationResult["maxDecimalPlaces"] = "maxDecimalPlaces";
47
+ ValidationResult["minLength"] = "minLength";
48
+ ValidationResult["maxLength"] = "maxLength";
49
+ ValidationResult["invalidNewLine"] = "invalidNewLine";
50
+ ValidationResult["invalidCoding"] = "invalidCoding";
51
+ ValidationResult["tsError"] = "tsError";
52
+ ValidationResult["maxAttachmentSize"] = "maxAttachmentSize";
53
+ ValidationResult["attachmentSizeInconsistent"] = "attachmentSizeInconsistent";
54
+ ValidationResult["invalidAttachmentType"] = "invalidAttachmentType";
55
+ ValidationResult["displayAnswer"] = "displayAnswer";
56
+ ValidationResult["regex"] = "regex";
57
+ ValidationResult["regexTimeout"] = "regexTimeout";
58
+ ValidationResult["invalidRefValue"] = "invalidRefValue";
59
+ ValidationResult["invalidRefResourceType"] = "invalidRefResourceType";
60
+ ValidationResult["invalidRefResourceTypeRestriction"] = "invalidRefResourceTypeRestriction";
61
+ ValidationResult["minValueIncompatUnits"] = "minValueIncompatUnits";
62
+ ValidationResult["maxValueIncompatUnits"] = "maxValueIncompatUnits";
63
+ ValidationResult["invalidUnit"] = "invalidUnit";
64
+ ValidationResult["invalidUnitValueSet"] = "invalidUnitValueSet"; // The unit provided was not in the provided valueset
65
+ })(ValidationResult || (ValidationResult = {}));
66
+ /**
67
+ * Recursively go through the questionnaireResponse and check for un-filled required qItems
68
+ * At the moment item.required for group items are not checked
69
+ *
70
+ * @author Sean Fong
71
+ */
72
+ export function validateQuestionnaire(params) {
73
+ var _a;
74
+ const { questionnaire, questionnaireResponse } = params;
75
+ const enableWhenIsActivated = questionnaireStore.getState().enableWhenIsActivated;
76
+ const enableWhenItems = questionnaireStore.getState().enableWhenItems;
77
+ const enableWhenExpressions = questionnaireStore.getState().enableWhenExpressions;
78
+ if (!questionnaire.item || questionnaire.item.length === 0) {
79
+ return {};
80
+ }
81
+ if (!questionnaireResponse.item || questionnaireResponse.item.length === 0) {
82
+ questionnaireResponse.item = [];
83
+ }
84
+ const qItemsIndexMap = mapQItemsIndex(questionnaire);
85
+ const topLevelQRItemsByIndex = getQrItemsIndex(questionnaire.item, questionnaireResponse.item, qItemsIndexMap);
86
+ const invalidItems = {};
87
+ let qrItemIndex = 0;
88
+ for (const [index, topLevelQItem] of questionnaire.item.entries()) {
89
+ let repeatGroupInstances = null;
90
+ let topLevelQRItem = (_a = topLevelQRItemsByIndex[index]) !== null && _a !== void 0 ? _a : {
91
+ linkId: topLevelQItem.linkId,
92
+ text: topLevelQItem.text
93
+ };
94
+ // topLevelQRItem being an array means this item is a repeat group
95
+ const isRepeatGroup = Array.isArray(topLevelQRItem);
96
+ if (Array.isArray(topLevelQRItem)) {
97
+ repeatGroupInstances = topLevelQRItem.length;
98
+ topLevelQRItem = {
99
+ linkId: topLevelQItem.linkId,
100
+ text: topLevelQItem.text,
101
+ item: topLevelQRItem
102
+ };
103
+ }
104
+ const locationExpression = `QuestionnaireResponse.item`;
105
+ validateItemRecursive({
106
+ qItem: topLevelQItem,
107
+ qrItem: topLevelQRItem,
108
+ qrItemIndex,
109
+ locationExpression,
110
+ invalidItems,
111
+ enableWhenIsActivated,
112
+ enableWhenItems,
113
+ enableWhenExpressions,
114
+ isRepeatGroupInstance: false
115
+ });
116
+ // Increment qrItemIndex
117
+ // If it's a repeat group, increment by the number of instances so qrItemIndex is correct once we reach the next item
118
+ if (isRepeatGroup && typeof repeatGroupInstances === 'number') {
119
+ qrItemIndex += repeatGroupInstances;
120
+ }
121
+ else {
122
+ qrItemIndex++;
123
+ }
124
+ }
125
+ return invalidItems;
126
+ }
127
+ function validateItemRecursive(params) {
128
+ var _a, _b, _c;
129
+ const { qItem, qrItem, qrItemIndex, invalidItems, enableWhenIsActivated, enableWhenItems, enableWhenExpressions, isRepeatGroupInstance } = params;
130
+ let { locationExpression } = params;
131
+ // If item is hidden by enableWhen, skip validation
132
+ if (isHiddenByEnableWhen({
133
+ linkId: qItem.linkId,
134
+ enableWhenIsActivated,
135
+ enableWhenItems,
136
+ enableWhenExpressions
137
+ })) {
138
+ return;
139
+ }
140
+ // Validate repeat groups
141
+ if (qItem.type === 'group' && qItem.repeats) {
142
+ if (!isRepeatGroupInstance) {
143
+ validateRepeatGroupRecursive({
144
+ qItem,
145
+ qrItem,
146
+ qrItemIndex,
147
+ locationExpression,
148
+ invalidItems,
149
+ enableWhenIsActivated,
150
+ enableWhenItems,
151
+ enableWhenExpressions,
152
+ isRepeatGroupInstance: false
153
+ });
154
+ return;
155
+ }
156
+ }
157
+ locationExpression = `${locationExpression}[${qrItemIndex}]`;
158
+ // Recursively validate groups with child items
159
+ const childQItems = qItem.item;
160
+ if (childQItems && childQItems.length > 0) {
161
+ const childQrItems = (_a = qrItem === null || qrItem === void 0 ? void 0 : qrItem.item) !== null && _a !== void 0 ? _a : [];
162
+ const indexMap = mapQItemsIndex(qItem);
163
+ const qrItemsByIndex = getQrItemsIndex(childQItems, childQrItems, indexMap);
164
+ // Check if group is required and has no answers
165
+ if (qItem.type === 'group' && qItem.required) {
166
+ if (!qrItem || qrItemsByIndex.length === 0) {
167
+ invalidItems[qItem.linkId] = createValidationOperationOutcome(ValidationResult.required, qItem, qrItem, null, locationExpression, (_b = invalidItems[qItem.linkId]) === null || _b === void 0 ? void 0 : _b.issue);
168
+ }
169
+ }
170
+ // Loop through child items
171
+ for (const [index, childQItem] of childQItems.entries()) {
172
+ const childLocationExpression = `${locationExpression}.item`;
173
+ let childQRItem = (_c = qrItemsByIndex[index]) !== null && _c !== void 0 ? _c : {
174
+ linkId: childQItem.linkId,
175
+ text: childQItem.text
176
+ };
177
+ if (Array.isArray(childQRItem)) {
178
+ childQRItem = {
179
+ linkId: childQItem.linkId,
180
+ text: childQItem.text,
181
+ item: childQRItem
182
+ };
183
+ }
184
+ validateItemRecursive({
185
+ qItem: childQItem,
186
+ qrItem: childQRItem,
187
+ qrItemIndex: index,
188
+ locationExpression: childLocationExpression,
189
+ invalidItems: invalidItems,
190
+ enableWhenIsActivated,
191
+ enableWhenItems,
192
+ enableWhenExpressions,
193
+ isRepeatGroupInstance: false
194
+ });
195
+ }
196
+ }
197
+ // Validate the item, note that this can be either a group or a non-group
198
+ validateSingleItem(qItem, qrItem, invalidItems, locationExpression);
199
+ }
200
+ function validateRepeatGroupRecursive(params) {
201
+ var _a;
202
+ const { qItem, qrItem, qrItemIndex, locationExpression, invalidItems, enableWhenIsActivated, enableWhenItems, enableWhenExpressions } = params;
203
+ if (!qItem.item || qItem.item.length === 0 || !qrItem.item || qrItem.item.length === 0) {
204
+ return;
205
+ }
206
+ // Get repeat group answers
207
+ const repeatGroupAnswers = (_a = qrItem.item) !== null && _a !== void 0 ? _a : [];
208
+ for (const [index, repeatGroupAnswer] of repeatGroupAnswers.entries()) {
209
+ // Because the item is a repeat group and might have multiple answer instances, we need to increment the qItemIndex by the instanceIndex
210
+ const updatedQrItemIndex = qrItemIndex + index;
211
+ validateItemRecursive({
212
+ qItem: qItem,
213
+ qrItem: repeatGroupAnswer,
214
+ qrItemIndex: updatedQrItemIndex,
215
+ locationExpression: locationExpression,
216
+ invalidItems: invalidItems,
217
+ enableWhenIsActivated,
218
+ enableWhenItems,
219
+ enableWhenExpressions,
220
+ isRepeatGroupInstance: true
221
+ });
222
+ }
223
+ }
224
+ function validateSingleItem(qItem, qrItem, invalidItems, locationExpression) {
225
+ var _a, _b;
226
+ // Validate item.required first before every other validation check
227
+ if (qItem.type !== 'display') {
228
+ if (qItem.required && !qrItem.answer) {
229
+ invalidItems[qItem.linkId] = createValidationOperationOutcome(ValidationResult.required, qItem, qrItem, null, locationExpression, (_a = invalidItems[qItem.linkId]) === null || _a === void 0 ? void 0 : _a.issue);
230
+ return invalidItems;
231
+ }
232
+ }
233
+ // Validate regex, maxLength and minLength
234
+ if (qrItem.answer) {
235
+ for (const [i, answer] of qrItem.answer.entries()) {
236
+ // Your code here, you can use 'index' and 'answer' as needed
237
+ if (answer.valueString || answer.valueInteger || answer.valueDecimal || answer.valueUri) {
238
+ const invalidInputType = getInputInvalidType({
239
+ qItem,
240
+ input: getInputInString(answer),
241
+ regexValidation: getRegexValidation(qItem),
242
+ minLength: structuredDataCapture.getMinLength(qItem),
243
+ maxLength: qItem.maxLength,
244
+ maxDecimalPlaces: structuredDataCapture.getMaxDecimalPlaces(qItem),
245
+ minValue: getMinValue(qItem),
246
+ maxValue: getMaxValue(qItem)
247
+ });
248
+ if (invalidInputType) {
249
+ invalidItems[qItem.linkId] = createValidationOperationOutcome(invalidInputType, qItem, qrItem, i, locationExpression, (_b = invalidItems[qItem.linkId]) === null || _b === void 0 ? void 0 : _b.issue);
250
+ }
251
+ }
252
+ }
253
+ }
254
+ return invalidItems;
255
+ }
256
+ function getInputInString(answer) {
257
+ if (!answer) {
258
+ return '';
259
+ }
260
+ if (answer.valueString) {
261
+ return answer.valueString;
262
+ }
263
+ else if (answer.valueInteger) {
264
+ return answer.valueInteger.toString();
265
+ }
266
+ else if (answer.valueDecimal) {
267
+ return answer.valueDecimal.toString();
268
+ }
269
+ else if (answer.valueUri) {
270
+ return answer.valueUri;
271
+ }
272
+ return '';
273
+ }
274
+ export function getInputInvalidType(getInputInvalidTypeParams) {
275
+ var _a, _b;
276
+ const { qItem, input, regexValidation, minLength, maxLength, maxDecimalPlaces, minValue, maxValue } = getInputInvalidTypeParams;
277
+ if (input) {
278
+ if (regexValidation && !regexValidation.expression.test(input)) {
279
+ return ValidationResult.regex;
280
+ }
281
+ if (minLength && input.length < minLength) {
282
+ return ValidationResult.minLength;
283
+ }
284
+ if (maxLength && input.length > maxLength) {
285
+ return ValidationResult.maxLength;
286
+ }
287
+ if (maxDecimalPlaces) {
288
+ const decimalPlaces = (_b = (_a = input.split('.')[1]) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0;
289
+ if (decimalPlaces > maxDecimalPlaces) {
290
+ return ValidationResult.maxDecimalPlaces;
291
+ }
292
+ }
293
+ if (minValue) {
294
+ const minValueError = checkMinValue(qItem, input, minValue);
295
+ if (minValueError !== null) {
296
+ return ValidationResult.minValue;
297
+ }
298
+ }
299
+ if (maxValue) {
300
+ const maxValueError = checkMaxValue(qItem, input, maxValue);
301
+ if (maxValueError !== null) {
302
+ return ValidationResult.maxValue;
303
+ }
304
+ }
305
+ }
306
+ return null;
307
+ }
308
+ function checkMinValue(qItem, input, minValue) {
309
+ switch (qItem.type) {
310
+ case 'integer':
311
+ if (typeof minValue === 'number') {
312
+ if (parseInt(input) < minValue) {
313
+ return ValidationResult.minValue;
314
+ }
315
+ }
316
+ break;
317
+ case 'decimal': {
318
+ const precision = getDecimalPrecision(qItem);
319
+ const decimalValue = precision
320
+ ? parseDecimalStringToFloat(input, precision)
321
+ : parseFloat(input);
322
+ if (typeof minValue === 'number') {
323
+ if (decimalValue < minValue) {
324
+ return ValidationResult.minValue;
325
+ }
326
+ }
327
+ break;
328
+ }
329
+ case 'date':
330
+ if (typeof minValue === 'string') {
331
+ if (new Date(input) < new Date(minValue)) {
332
+ return ValidationResult.minValue;
333
+ }
334
+ }
335
+ break;
336
+ case 'dateTime':
337
+ if (typeof minValue === 'string') {
338
+ if (dayjs(input).isBefore(dayjs(minValue))) {
339
+ return ValidationResult.minValue;
340
+ }
341
+ }
342
+ break;
343
+ default:
344
+ return null;
345
+ }
346
+ return null;
347
+ }
348
+ function checkMaxValue(qItem, input, maxValue) {
349
+ switch (qItem.type) {
350
+ case 'integer':
351
+ if (typeof maxValue === 'number') {
352
+ if (parseInt(input) > maxValue) {
353
+ return ValidationResult.maxValue;
354
+ }
355
+ }
356
+ break;
357
+ case 'decimal': {
358
+ const precision = getDecimalPrecision(qItem);
359
+ const decimalValue = precision
360
+ ? parseDecimalStringToFloat(input, precision)
361
+ : parseFloat(input);
362
+ if (typeof maxValue === 'number') {
363
+ if (decimalValue > maxValue) {
364
+ return ValidationResult.maxValue;
365
+ }
366
+ }
367
+ break;
368
+ }
369
+ case 'date':
370
+ if (typeof maxValue === 'string') {
371
+ if (new Date(input) > new Date(maxValue)) {
372
+ return ValidationResult.maxValue;
373
+ }
374
+ }
375
+ break;
376
+ case 'dateTime':
377
+ if (typeof maxValue === 'string') {
378
+ if (dayjs(input).isAfter(dayjs(maxValue))) {
379
+ return ValidationResult.maxValue;
380
+ }
381
+ }
382
+ break;
383
+ default:
384
+ return null;
385
+ }
386
+ return null;
387
+ }
388
+ function createValidationOperationOutcome(error, qItem, qrItem, answerIndex, locationExpression, existingOperationOutcomeIssues = []) {
389
+ return {
390
+ resourceType: 'OperationOutcome',
391
+ issue: existingOperationOutcomeIssues.concat(createValidationOperationOutcomeIssue(error, qItem, qrItem, answerIndex, locationExpression))
392
+ };
393
+ }
394
+ function createValidationOperationOutcomeIssue(error, qItem, qrItem, answerIndex, locationExpression) {
395
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
396
+ const errorCodeSystem = 'http://fhir.forms-lab.com/CodeSystem/errors';
397
+ let detailsText = '';
398
+ let fieldDisplayText = (_d = (_c = (_b = (_a = qrItem === null || qrItem === void 0 ? void 0 : qrItem.text) !== null && _a !== void 0 ? _a : getShortText(qItem)) !== null && _b !== void 0 ? _b : qItem === null || qItem === void 0 ? void 0 : qItem.text) !== null && _c !== void 0 ? _c : qItem.linkId) !== null && _d !== void 0 ? _d : qrItem.linkId;
399
+ if (!fieldDisplayText && fieldDisplayText.endsWith(':')) {
400
+ fieldDisplayText = fieldDisplayText.substring(0, fieldDisplayText.length - 1);
401
+ }
402
+ answerIndex = answerIndex !== null && answerIndex !== void 0 ? answerIndex : 0;
403
+ // create operationOutcomeIssue based on error
404
+ switch (error) {
405
+ case ValidationResult.required: {
406
+ if (qItem.type === 'group') {
407
+ detailsText = `${fieldDisplayText}: Mandatory group does not have answer(s)`;
408
+ }
409
+ else {
410
+ detailsText = `${fieldDisplayText}: Mandatory field does not have an answer`;
411
+ }
412
+ return {
413
+ severity: 'error',
414
+ code: 'required',
415
+ expression: [locationExpression],
416
+ details: {
417
+ coding: [
418
+ {
419
+ system: errorCodeSystem,
420
+ code: error,
421
+ display: 'Required'
422
+ }
423
+ ],
424
+ text: detailsText
425
+ }
426
+ };
427
+ }
428
+ case ValidationResult.regex: {
429
+ detailsText = `${fieldDisplayText}: The value '${getInputInString((_e = qrItem.answer) === null || _e === void 0 ? void 0 : _e[answerIndex])}' does not match the defined format.`;
430
+ if (structuredDataCapture.getEntryFormat(qItem)) {
431
+ detailsText += ` ${structuredDataCapture.getEntryFormat(qItem)}`;
432
+ }
433
+ return {
434
+ severity: 'error',
435
+ code: 'invalid',
436
+ expression: [locationExpression],
437
+ details: {
438
+ coding: [
439
+ {
440
+ system: errorCodeSystem,
441
+ code: error,
442
+ display: 'Invalid format'
443
+ }
444
+ ],
445
+ text: detailsText
446
+ },
447
+ diagnostics: (_f = getRegexString(qItem)) !== null && _f !== void 0 ? _f : undefined
448
+ };
449
+ }
450
+ case ValidationResult.minLength: {
451
+ detailsText = `${fieldDisplayText}: Expected the minimum value ${structuredDataCapture.getMinLength(qItem)} characters, received '${getInputInString((_g = qrItem.answer) === null || _g === void 0 ? void 0 : _g[answerIndex])}'`;
452
+ return {
453
+ severity: 'error',
454
+ code: 'business-rule',
455
+ expression: [locationExpression],
456
+ details: {
457
+ coding: [
458
+ {
459
+ system: errorCodeSystem,
460
+ code: error,
461
+ display: 'Too short'
462
+ }
463
+ ],
464
+ text: detailsText
465
+ }
466
+ };
467
+ }
468
+ case ValidationResult.maxLength: {
469
+ detailsText = `${fieldDisplayText}: Exceeded maximum of ${qItem.maxLength} characters, received '${getInputInString((_h = qrItem.answer) === null || _h === void 0 ? void 0 : _h[answerIndex])}'`;
470
+ return {
471
+ severity: 'error',
472
+ code: 'business-rule',
473
+ expression: [locationExpression],
474
+ details: {
475
+ coding: [
476
+ {
477
+ system: errorCodeSystem,
478
+ code: error,
479
+ display: 'Too long'
480
+ }
481
+ ],
482
+ text: detailsText
483
+ }
484
+ };
485
+ }
486
+ case ValidationResult.maxDecimalPlaces: {
487
+ detailsText = `${fieldDisplayText}: Exceeded maximum decimal places ${structuredDataCapture.getMaxDecimalPlaces(qItem)}, received '${getInputInString((_j = qrItem.answer) === null || _j === void 0 ? void 0 : _j[answerIndex])}'`;
488
+ return {
489
+ severity: 'error',
490
+ code: 'business-rule',
491
+ expression: [locationExpression],
492
+ details: {
493
+ coding: [
494
+ {
495
+ system: errorCodeSystem,
496
+ code: error,
497
+ display: 'Too precise'
498
+ }
499
+ ],
500
+ text: detailsText
501
+ }
502
+ };
503
+ }
504
+ case ValidationResult.minValue: {
505
+ detailsText = `${fieldDisplayText}: Expected the minimum value ${getMinValue(qItem)}, received '${getInputInString((_k = qrItem.answer) === null || _k === void 0 ? void 0 : _k[answerIndex])}'`;
506
+ return {
507
+ severity: 'error',
508
+ code: 'business-rule',
509
+ expression: [locationExpression],
510
+ details: {
511
+ coding: [
512
+ {
513
+ system: errorCodeSystem,
514
+ code: error,
515
+ display: 'Too small'
516
+ }
517
+ ],
518
+ text: detailsText
519
+ }
520
+ };
521
+ }
522
+ case ValidationResult.maxValue: {
523
+ detailsText = `${fieldDisplayText}: Exceeded the maximum value ${getMaxValue(qItem)}, received '${getInputInString((_l = qrItem.answer) === null || _l === void 0 ? void 0 : _l[answerIndex])}'`;
524
+ return {
525
+ severity: 'error',
526
+ code: 'business-rule',
527
+ expression: [locationExpression],
528
+ details: {
529
+ coding: [
530
+ {
531
+ system: errorCodeSystem,
532
+ code: error,
533
+ display: 'Too big'
534
+ }
535
+ ],
536
+ text: detailsText
537
+ }
538
+ };
539
+ }
540
+ // mark unknown issues as fatal
541
+ default: {
542
+ return {
543
+ severity: 'error',
544
+ code: 'unknown',
545
+ expression: [locationExpression],
546
+ details: {
547
+ coding: [
548
+ {
549
+ system: errorCodeSystem,
550
+ code: 'unknown',
551
+ display: 'Unknown'
552
+ }
553
+ ]
554
+ }
555
+ };
556
+ }
557
+ }
558
+ }
559
+ //# sourceMappingURL=validateQuestionnaire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateQuestionnaire.js","sourceRoot":"","sources":["../../src/utils/validateQuestionnaire.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": "1.2.0",
3
+ "version": "1.2.2",
4
4
  "description": "FHIR Structured Data Captured (SDC) rendering engine for Smart Forms",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -114,6 +114,7 @@ function OpenChoiceAutocompleteItem(props: BaseItemProps) {
114
114
  newValue: Coding | string | null,
115
115
  reason: AutocompleteChangeReason | string
116
116
  ) {
117
+ // When the reason is selectOption this function gets called twice. One for the string value and one for the selected option. So we need to make sure we ignore the string value on selectOption
117
118
  // If the reason is reset, then don't change value. Otherwise you will end up with looped setState calls
118
119
  if (reason === 'reset') {
119
120
  return;
@@ -129,7 +130,7 @@ function OpenChoiceAutocompleteItem(props: BaseItemProps) {
129
130
  newValue = '';
130
131
  }
131
132
 
132
- if (typeof newValue === 'string') {
133
+ if (typeof newValue === 'string' && reason === 'input') {
133
134
  if (newValue !== '') {
134
135
  // Check if the newValue is in the options, first check options.display, then check options.code
135
136
  const foundOption = options.find((option) => {
@@ -155,8 +156,8 @@ function OpenChoiceAutocompleteItem(props: BaseItemProps) {
155
156
  // For empty string, update immediately
156
157
  onQrItemChange(createEmptyQrItem(qItem, answerKey));
157
158
  }
158
- } else {
159
- // For coding selection, update immediately (no debounce)
159
+ } else if (typeof newValue === 'object' && reason === 'selectOption') {
160
+ // For coding selection, update immediately (no debounce) i.e reason should be selectOption
160
161
  onQrItemChange({
161
162
  ...createEmptyQrItem(qItem, answerKey),
162
163
  answer: [{ id: answerKey, valueCoding: newValue }]
@@ -76,7 +76,21 @@ function SingleItem(props: SingleItemProps) {
76
76
  parentIsRepeatGroup ? (parentRepeatGroupIndex ?? null) : null
77
77
  );
78
78
 
79
- if (qrItem && qrItem.item && qrItem.item.length > 0) {
79
+ if (qItem && qrItem?.answer && qrItem.answer.length > 0) {
80
+ // Find the matching answer in qrItem by id
81
+ const matchingAnswer = qrItem.answer.find((ans) => ans.id === newQrItem.answer?.[0]?.id);
82
+
83
+ // Create updated newQrItem with the nested items from the matching answer
84
+ const updatedQrItem = {
85
+ ...newQrItem,
86
+ answer: newQrItem.answer?.map((ans) => ({
87
+ ...ans,
88
+ ...(matchingAnswer?.item && { item: matchingAnswer.item })
89
+ }))
90
+ };
91
+
92
+ onQrItemChange(updatedQrItem);
93
+ } else if (qrItem && qrItem.item && qrItem.item.length > 0) {
80
94
  onQrItemChange({ ...newQrItem, item: qrItem.item });
81
95
  } else {
82
96
  onQrItemChange(newQrItem);
@@ -94,7 +108,7 @@ function SingleItem(props: SingleItemProps) {
94
108
 
95
109
  const handleQrItemChangeWithNestedItems = useCallback(
96
110
  (newQrItem: QuestionnaireResponseItem) => {
97
- const updatedQrItem = qrItem ? { ...qrItem, item: newQrItem.item } : newQrItem;
111
+ const updatedQrItem = qrItem ? { ...qrItem, answer: newQrItem.answer } : newQrItem;
98
112
  onQrItemChange(updatedQrItem);
99
113
  },
100
114
  [qrItem, onQrItemChange]