@aehrc/smart-forms-renderer 0.20.0 → 0.21.1
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/interfaces/enableWhen.interface.d.ts +11 -3
- package/lib/interfaces/index.d.ts +1 -1
- package/lib/interfaces/questionnaireStore.interface.d.ts +2 -2
- package/lib/setup-jest.js +1 -0
- package/lib/stores/questionnaireStore.d.ts +3 -3
- package/lib/stores/questionnaireStore.js +20 -5
- package/lib/stores/questionnaireStore.js.map +1 -1
- package/lib/stories/MedicalHistoryTable.stories.js +45 -0
- package/lib/stories/SmartFormsRenderer.stories.js +117 -0
- package/lib/utils/enableWhenExpression.d.ts +22 -5
- package/lib/utils/enableWhenExpression.js +106 -55
- package/lib/utils/enableWhenExpression.js.map +1 -1
- package/lib/utils/fhirpath.d.ts +3 -3
- package/lib/utils/initialise.d.ts +3 -3
- package/lib/utils/qItem.d.ts +2 -2
- package/lib/utils/qItem.js +8 -8
- package/lib/utils/qItem.js.map +1 -1
- package/lib/utils/questionnaireStoreUtils/createQuestionaireModel.js +1 -1
- package/lib/utils/questionnaireStoreUtils/createQuestionaireModel.js.map +1 -1
- package/lib/utils/questionnaireStoreUtils/extractOtherExtensions.d.ts +5 -5
- package/lib/utils/questionnaireStoreUtils/extractOtherExtensions.js +98 -34
- package/lib/utils/questionnaireStoreUtils/extractOtherExtensions.js.map +1 -1
- package/lib/utils/removeEmptyAnswers.d.ts +2 -2
- package/lib/utils/removeEmptyAnswers.js.map +1 -1
- package/lib/utils/repopulateItems.d.ts +2 -2
- package/lib/utils/tabs.d.ts +6 -6
- package/lib/utils/tabs.js +3 -18
- package/lib/utils/tabs.js.map +1 -1
- package/lib/utils/validateQuestionnaire.d.ts +2 -2
- package/lib/utils/validateQuestionnaire.js +0 -7
- package/lib/utils/validateQuestionnaire.js.map +1 -1
- package/package.json +5 -5
- package/src/interfaces/enableWhen.interface.ts +13 -3
- package/src/interfaces/index.ts +4 -2
- package/src/interfaces/questionnaireStore.interface.ts +2 -2
- package/src/stores/questionnaireStore.ts +23 -7
- package/src/utils/enableWhenExpression.ts +221 -83
- package/src/utils/fhirpath.ts +3 -3
- package/src/utils/initialise.ts +3 -3
- package/src/utils/qItem.ts +11 -11
- package/src/utils/questionnaireStoreUtils/createQuestionaireModel.ts +1 -1
- package/src/utils/questionnaireStoreUtils/extractOtherExtensions.ts +158 -39
- package/src/utils/removeEmptyAnswers.ts +4 -4
- package/src/utils/repopulateItems.ts +4 -4
- package/src/utils/tabs.ts +9 -24
- package/src/utils/validateQuestionnaire.ts +3 -11
|
@@ -15,13 +15,21 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
-
import type {
|
|
18
|
+
import type {
|
|
19
|
+
Expression,
|
|
20
|
+
Extension,
|
|
21
|
+
Questionnaire,
|
|
22
|
+
QuestionnaireItem,
|
|
23
|
+
QuestionnaireItemEnableWhen
|
|
24
|
+
} from 'fhir/r4';
|
|
19
25
|
import type { CalculatedExpression } from '../../interfaces/calculatedExpression.interface';
|
|
20
26
|
import type {
|
|
21
|
-
|
|
27
|
+
EnableWhenExpressions,
|
|
22
28
|
EnableWhenItems,
|
|
29
|
+
EnableWhenRepeatExpression,
|
|
23
30
|
EnableWhenRepeatItemProperties,
|
|
24
31
|
EnableWhenRepeatLinkedItem,
|
|
32
|
+
EnableWhenSingleExpression,
|
|
25
33
|
EnableWhenSingleItemProperties,
|
|
26
34
|
EnableWhenSingleLinkedItem
|
|
27
35
|
} from '../../interfaces';
|
|
@@ -32,11 +40,15 @@ import { getTerminologyServerUrl, getValueSetPromise } from '../valueSet';
|
|
|
32
40
|
import type { Variables } from '../../interfaces/variables.interface';
|
|
33
41
|
import { getFhirPathVariables, getXFhirQueryVariables } from './extractVariables';
|
|
34
42
|
import { getRepeatGroupParentItem } from '../misc';
|
|
43
|
+
import { checkItemIsEnabledRepeat } from '../enableWhen';
|
|
44
|
+
import cloneDeep from 'lodash.clonedeep';
|
|
45
|
+
import { emptyResponse } from '../emptyResource';
|
|
46
|
+
import { evaluateEnableWhenRepeatExpressionInstance } from '../enableWhenExpression';
|
|
35
47
|
|
|
36
48
|
interface ReturnParamsRecursive {
|
|
37
49
|
variables: Variables;
|
|
38
50
|
enableWhenItems: EnableWhenItems;
|
|
39
|
-
enableWhenExpressions:
|
|
51
|
+
enableWhenExpressions: EnableWhenExpressions;
|
|
40
52
|
calculatedExpressions: Record<string, CalculatedExpression>;
|
|
41
53
|
answerExpressions: Record<string, AnswerExpression>;
|
|
42
54
|
valueSetPromises: Record<string, ValueSetPromise>;
|
|
@@ -49,7 +61,10 @@ export function extractOtherExtensions(
|
|
|
49
61
|
terminologyServerUrl: string
|
|
50
62
|
): ReturnParamsRecursive {
|
|
51
63
|
const enableWhenItems: EnableWhenItems = { singleItems: {}, repeatItems: {} };
|
|
52
|
-
const enableWhenExpressions:
|
|
64
|
+
const enableWhenExpressions: EnableWhenExpressions = {
|
|
65
|
+
singleExpressions: {},
|
|
66
|
+
repeatExpressions: {}
|
|
67
|
+
};
|
|
53
68
|
const calculatedExpressions: Record<string, CalculatedExpression> = {};
|
|
54
69
|
const answerExpressions: Record<string, AnswerExpression> = {};
|
|
55
70
|
|
|
@@ -57,7 +72,10 @@ export function extractOtherExtensions(
|
|
|
57
72
|
return {
|
|
58
73
|
variables: variables,
|
|
59
74
|
enableWhenItems: { singleItems: {}, repeatItems: {} },
|
|
60
|
-
enableWhenExpressions: {
|
|
75
|
+
enableWhenExpressions: {
|
|
76
|
+
singleExpressions: {},
|
|
77
|
+
repeatExpressions: {}
|
|
78
|
+
},
|
|
61
79
|
calculatedExpressions: {},
|
|
62
80
|
answerExpressions: {},
|
|
63
81
|
valueSetPromises: valueSetPromises
|
|
@@ -95,7 +113,7 @@ interface extractExtensionsFromItemRecursiveParams {
|
|
|
95
113
|
item: QuestionnaireItem;
|
|
96
114
|
variables: Variables;
|
|
97
115
|
enableWhenItems: EnableWhenItems;
|
|
98
|
-
enableWhenExpressions:
|
|
116
|
+
enableWhenExpressions: EnableWhenExpressions;
|
|
99
117
|
calculatedExpressions: Record<string, CalculatedExpression>;
|
|
100
118
|
answerExpressions: Record<string, AnswerExpression>;
|
|
101
119
|
valueSetPromises: Record<string, ValueSetPromise>;
|
|
@@ -149,11 +167,21 @@ function extractExtensionsFromItemRecursive(
|
|
|
149
167
|
}
|
|
150
168
|
}
|
|
151
169
|
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
170
|
+
const initialisedEnableWhenExpressions = initialiseEnableWhenExpression(
|
|
171
|
+
item,
|
|
172
|
+
questionnaire,
|
|
173
|
+
parentRepeatGroupLinkId
|
|
174
|
+
);
|
|
175
|
+
if (initialisedEnableWhenExpressions) {
|
|
176
|
+
const { enableWhenExpressionType, enableWhenExpression } = initialisedEnableWhenExpressions;
|
|
177
|
+
|
|
178
|
+
if (enableWhenExpressionType === 'single') {
|
|
179
|
+
enableWhenExpressions.singleExpressions[item.linkId] =
|
|
180
|
+
enableWhenExpression as EnableWhenSingleExpression;
|
|
181
|
+
} else if (enableWhenExpressionType === 'repeat') {
|
|
182
|
+
enableWhenExpressions.repeatExpressions[item.linkId] =
|
|
183
|
+
enableWhenExpression as EnableWhenRepeatExpression;
|
|
184
|
+
}
|
|
157
185
|
}
|
|
158
186
|
|
|
159
187
|
const calculatedExpression = getCalculatedExpression(item);
|
|
@@ -215,10 +243,16 @@ export function initialiseEnableWhenItemProperties(
|
|
|
215
243
|
enableWhenItemType: 'single' | 'repeat';
|
|
216
244
|
enableWhenItemProperties: EnableWhenSingleItemProperties | EnableWhenRepeatItemProperties;
|
|
217
245
|
} | null {
|
|
246
|
+
const enableWhen = qItem.enableWhen;
|
|
247
|
+
if (!enableWhen) {
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
|
|
218
251
|
// Parent repeat group linkId exist, try to classify this item as a repeat enableWhen item
|
|
219
252
|
if (parentLinkId) {
|
|
220
253
|
const enableWhenRepeatItemProperties = initialiseEnableWhenRepeatItemProperties(
|
|
221
254
|
qItem,
|
|
255
|
+
enableWhen,
|
|
222
256
|
questionnaire,
|
|
223
257
|
parentLinkId
|
|
224
258
|
);
|
|
@@ -232,28 +266,23 @@ export function initialiseEnableWhenItemProperties(
|
|
|
232
266
|
}
|
|
233
267
|
|
|
234
268
|
// If parentLinkId is not provided or item cannot be classified as a repeat enableWhen item, classify it as a single enableWhen item
|
|
235
|
-
const enableWhenSingleItemProperties = initialiseEnableWhenSingleItemProperties(
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
return null;
|
|
269
|
+
const enableWhenSingleItemProperties = initialiseEnableWhenSingleItemProperties(
|
|
270
|
+
qItem,
|
|
271
|
+
enableWhen
|
|
272
|
+
);
|
|
273
|
+
return {
|
|
274
|
+
enableWhenItemType: 'single',
|
|
275
|
+
enableWhenItemProperties: enableWhenSingleItemProperties
|
|
276
|
+
};
|
|
244
277
|
}
|
|
245
278
|
|
|
246
279
|
export function initialiseEnableWhenRepeatItemProperties(
|
|
247
280
|
qItem: QuestionnaireItem,
|
|
281
|
+
enableWhen: QuestionnaireItemEnableWhen[],
|
|
248
282
|
questionnaire: Questionnaire,
|
|
249
283
|
parentLinkId: string
|
|
250
284
|
): EnableWhenRepeatItemProperties | null {
|
|
251
|
-
const
|
|
252
|
-
if (!enableWhen) {
|
|
253
|
-
return null;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
const linkedItems = enableWhen.map((linkedItem): EnableWhenRepeatLinkedItem | null => {
|
|
285
|
+
const linkedItemsNullable = enableWhen.map((linkedItem): EnableWhenRepeatLinkedItem | null => {
|
|
257
286
|
const linkedParentItem = getRepeatGroupParentItem(questionnaire, linkedItem.question);
|
|
258
287
|
// Check if parentLinkId match the linked item's parent linkId
|
|
259
288
|
if (parentLinkId === linkedParentItem?.linkId) {
|
|
@@ -265,16 +294,24 @@ export function initialiseEnableWhenRepeatItemProperties(
|
|
|
265
294
|
});
|
|
266
295
|
|
|
267
296
|
// If any linked item is not valid, exit early
|
|
268
|
-
if (
|
|
297
|
+
if (linkedItemsNullable.some((linkedItem) => linkedItem === null)) {
|
|
269
298
|
return null;
|
|
270
299
|
}
|
|
271
300
|
|
|
272
|
-
|
|
301
|
+
const linkedItems = linkedItemsNullable as EnableWhenRepeatLinkedItem[];
|
|
302
|
+
const enableWhenRepeatItemProperties = {
|
|
273
303
|
linked: linkedItems as EnableWhenRepeatLinkedItem[],
|
|
274
304
|
parentLinkId: parentLinkId,
|
|
275
305
|
enabledIndexes: [false],
|
|
276
306
|
enableBehavior: qItem.enableBehavior
|
|
277
307
|
};
|
|
308
|
+
|
|
309
|
+
enableWhenRepeatItemProperties.enabledIndexes[0] = checkItemIsEnabledRepeat(
|
|
310
|
+
enableWhenRepeatItemProperties,
|
|
311
|
+
0
|
|
312
|
+
);
|
|
313
|
+
|
|
314
|
+
return enableWhenRepeatItemProperties;
|
|
278
315
|
}
|
|
279
316
|
|
|
280
317
|
/**
|
|
@@ -283,22 +320,104 @@ export function initialiseEnableWhenRepeatItemProperties(
|
|
|
283
320
|
* @author Sean Fong
|
|
284
321
|
*/
|
|
285
322
|
export function initialiseEnableWhenSingleItemProperties(
|
|
286
|
-
qItem: QuestionnaireItem
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
323
|
+
qItem: QuestionnaireItem,
|
|
324
|
+
enableWhen: QuestionnaireItemEnableWhen[]
|
|
325
|
+
): EnableWhenSingleItemProperties {
|
|
326
|
+
return {
|
|
327
|
+
linked: enableWhen.map((linkedItem): EnableWhenSingleLinkedItem => {
|
|
328
|
+
return { enableWhen: linkedItem };
|
|
329
|
+
}),
|
|
330
|
+
isEnabled: false,
|
|
331
|
+
enableBehavior: qItem.enableBehavior
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
function initialiseEnableWhenExpressionRepeat(
|
|
336
|
+
enableWhenExpression: Expression,
|
|
337
|
+
questionnaire: Questionnaire,
|
|
338
|
+
parentLinkId: string
|
|
339
|
+
): Expression | null {
|
|
340
|
+
const expression = enableWhenExpression.expression;
|
|
341
|
+
if (!expression) {
|
|
342
|
+
return null;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// Get the last linkId in the expression
|
|
346
|
+
const regExpLinkId = /linkId\s*=\s*'([^']+)'/g;
|
|
347
|
+
const matches = expression.replace(' ', '').match(regExpLinkId);
|
|
348
|
+
if (!matches) {
|
|
349
|
+
return null;
|
|
350
|
+
}
|
|
351
|
+
const linkIdMatches = matches.map((match) =>
|
|
352
|
+
match.substring(match.indexOf("'") + 1, match.lastIndexOf("'"))
|
|
353
|
+
);
|
|
354
|
+
const lastLinkIdMatch = linkIdMatches[linkIdMatches.length - 1];
|
|
355
|
+
|
|
356
|
+
// Use the last linkId as the linkedItem, and get it's repeat group parent item's linkId
|
|
357
|
+
// If both parent linkId matches, this enableWhenExpression is a repeat enableWhenExpression
|
|
358
|
+
const linkedParentItem = getRepeatGroupParentItem(questionnaire, lastLinkIdMatch);
|
|
359
|
+
if (parentLinkId === linkedParentItem?.linkId) {
|
|
360
|
+
return enableWhenExpression;
|
|
297
361
|
}
|
|
298
362
|
|
|
299
363
|
return null;
|
|
300
364
|
}
|
|
301
365
|
|
|
366
|
+
function initialiseEnableWhenExpression(
|
|
367
|
+
qItem: QuestionnaireItem,
|
|
368
|
+
questionnaire: Questionnaire,
|
|
369
|
+
parentLinkId?: string
|
|
370
|
+
): {
|
|
371
|
+
enableWhenExpressionType: 'single' | 'repeat';
|
|
372
|
+
enableWhenExpression: EnableWhenSingleExpression | EnableWhenRepeatExpression;
|
|
373
|
+
} | null {
|
|
374
|
+
const enableWhenExpression = getEnableWhenExpression(qItem);
|
|
375
|
+
if (!enableWhenExpression) {
|
|
376
|
+
return null;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
// Parent repeat group linkId exist, try to classify this item as a repeat enableWhen item
|
|
380
|
+
if (parentLinkId) {
|
|
381
|
+
const expressionRepeat = initialiseEnableWhenExpressionRepeat(
|
|
382
|
+
enableWhenExpression,
|
|
383
|
+
questionnaire,
|
|
384
|
+
parentLinkId
|
|
385
|
+
);
|
|
386
|
+
|
|
387
|
+
if (expressionRepeat) {
|
|
388
|
+
const enableWhenRepeatExpression = {
|
|
389
|
+
expression: `${expressionRepeat.expression}`,
|
|
390
|
+
parentLinkId: parentLinkId,
|
|
391
|
+
enabledIndexes: [false]
|
|
392
|
+
};
|
|
393
|
+
|
|
394
|
+
const { isEnabled } = evaluateEnableWhenRepeatExpressionInstance(
|
|
395
|
+
qItem.linkId,
|
|
396
|
+
{ resource: cloneDeep(emptyResponse) },
|
|
397
|
+
enableWhenRepeatExpression,
|
|
398
|
+
enableWhenRepeatExpression.expression.lastIndexOf('.where(linkId'),
|
|
399
|
+
0
|
|
400
|
+
);
|
|
401
|
+
|
|
402
|
+
if (typeof isEnabled === 'boolean') {
|
|
403
|
+
enableWhenRepeatExpression.enabledIndexes[0] = isEnabled;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
return {
|
|
407
|
+
enableWhenExpressionType: 'repeat',
|
|
408
|
+
enableWhenExpression: enableWhenRepeatExpression
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
return {
|
|
414
|
+
enableWhenExpressionType: 'single',
|
|
415
|
+
enableWhenExpression: {
|
|
416
|
+
expression: `${enableWhenExpression.expression}`
|
|
417
|
+
}
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
|
|
302
421
|
/**
|
|
303
422
|
* Check if an enableWhenExpression extension is present
|
|
304
423
|
*
|
|
@@ -21,7 +21,7 @@ import type {
|
|
|
21
21
|
QuestionnaireResponse,
|
|
22
22
|
QuestionnaireResponseItem
|
|
23
23
|
} from 'fhir/r4';
|
|
24
|
-
import type {
|
|
24
|
+
import type { EnableWhenExpressions, EnableWhenItems } from '../interfaces';
|
|
25
25
|
import { isHiddenByEnableWhen } from './qItem';
|
|
26
26
|
|
|
27
27
|
interface removeEmptyAnswersParams {
|
|
@@ -29,7 +29,7 @@ interface removeEmptyAnswersParams {
|
|
|
29
29
|
questionnaireResponse: QuestionnaireResponse;
|
|
30
30
|
enableWhenIsActivated: boolean;
|
|
31
31
|
enableWhenItems: EnableWhenItems;
|
|
32
|
-
enableWhenExpressions:
|
|
32
|
+
enableWhenExpressions: EnableWhenExpressions;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
/**
|
|
@@ -79,7 +79,7 @@ interface removeEmptyAnswersFromItemRecursiveParams {
|
|
|
79
79
|
qrItem: QuestionnaireResponseItem;
|
|
80
80
|
enableWhenIsActivated: boolean;
|
|
81
81
|
enableWhenItems: EnableWhenItems;
|
|
82
|
-
enableWhenExpressions:
|
|
82
|
+
enableWhenExpressions: EnableWhenExpressions;
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
function removeEmptyAnswersFromItemRecursive(
|
|
@@ -167,7 +167,7 @@ function answerIsEmpty(
|
|
|
167
167
|
qrItem: QuestionnaireResponseItem,
|
|
168
168
|
enableWhenIsActivated: boolean,
|
|
169
169
|
enableWhenItems: EnableWhenItems,
|
|
170
|
-
enableWhenExpressions:
|
|
170
|
+
enableWhenExpressions: EnableWhenExpressions
|
|
171
171
|
) {
|
|
172
172
|
if (
|
|
173
173
|
isHiddenByEnableWhen({
|
|
@@ -26,7 +26,7 @@ import _isEqual from 'lodash/isEqual';
|
|
|
26
26
|
import { containsTabs, isTabContainer } from './tabs';
|
|
27
27
|
import { getShortText, isSpecificItemControl } from './itemControl';
|
|
28
28
|
import { getQrItemsIndex, mapQItemsIndex } from './mapItem';
|
|
29
|
-
import type {
|
|
29
|
+
import type { EnableWhenExpressions, EnableWhenItems } from '../interfaces';
|
|
30
30
|
import { isHiddenByEnableWhen } from './qItem';
|
|
31
31
|
|
|
32
32
|
export interface ItemToRepopulate {
|
|
@@ -49,7 +49,7 @@ interface getItemsToRepopulateParams {
|
|
|
49
49
|
updatableResponse: QuestionnaireResponse;
|
|
50
50
|
enableWhenIsActivated: boolean;
|
|
51
51
|
enableWhenItems: EnableWhenItems;
|
|
52
|
-
enableWhenExpressions:
|
|
52
|
+
enableWhenExpressions: EnableWhenExpressions;
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
export function getItemsToRepopulate(
|
|
@@ -135,7 +135,7 @@ interface getItemsToRepopulateRecursiveParams {
|
|
|
135
135
|
itemsToRepopulate: Record<string, ItemToRepopulate>;
|
|
136
136
|
enableWhenIsActivated: boolean;
|
|
137
137
|
enableWhenItems: EnableWhenItems;
|
|
138
|
-
enableWhenExpressions:
|
|
138
|
+
enableWhenExpressions: EnableWhenExpressions;
|
|
139
139
|
}
|
|
140
140
|
|
|
141
141
|
// 1. Get items to repopulate (only new items)
|
|
@@ -278,7 +278,7 @@ interface getGridTableToRepopulateParams {
|
|
|
278
278
|
itemsToRepopulate: Record<string, ItemToRepopulate>;
|
|
279
279
|
enableWhenIsActivated: boolean;
|
|
280
280
|
enableWhenItems: EnableWhenItems;
|
|
281
|
-
enableWhenExpressions:
|
|
281
|
+
enableWhenExpressions: EnableWhenExpressions;
|
|
282
282
|
}
|
|
283
283
|
|
|
284
284
|
function getGridTableToRepopulate(params: getGridTableToRepopulateParams) {
|
package/src/utils/tabs.ts
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
18
|
import type { Tabs } from '../interfaces/tab.interface';
|
|
19
|
-
import type {
|
|
19
|
+
import type { EnableWhenExpressions, EnableWhenItems } from '../interfaces';
|
|
20
20
|
import type { Coding, QuestionnaireItem } from 'fhir/r4';
|
|
21
21
|
import { isSpecificItemControl } from './itemControl';
|
|
22
22
|
import { isHiddenByEnableWhen } from './qItem';
|
|
@@ -25,10 +25,11 @@ import { structuredDataCapture } from 'fhir-sdc-helpers';
|
|
|
25
25
|
export function getFirstVisibleTab(
|
|
26
26
|
tabs: Tabs,
|
|
27
27
|
enableWhenItems: EnableWhenItems,
|
|
28
|
-
enableWhenExpressions:
|
|
28
|
+
enableWhenExpressions: EnableWhenExpressions
|
|
29
29
|
) {
|
|
30
30
|
// Only singleEnableWhenItems are relevant for tab operations
|
|
31
31
|
const { singleItems } = enableWhenItems;
|
|
32
|
+
const { singleExpressions } = enableWhenExpressions;
|
|
32
33
|
|
|
33
34
|
return Object.entries(tabs)
|
|
34
35
|
.sort(([, tabA], [, tabB]) => tabA.tabIndex - tabB.tabIndex)
|
|
@@ -41,29 +42,13 @@ export function getFirstVisibleTab(
|
|
|
41
42
|
return singleItems[tabLinkId].isEnabled;
|
|
42
43
|
}
|
|
43
44
|
|
|
44
|
-
if (
|
|
45
|
-
return
|
|
45
|
+
if (singleExpressions[tabLinkId]) {
|
|
46
|
+
return singleExpressions[tabLinkId].isEnabled;
|
|
46
47
|
}
|
|
47
48
|
|
|
48
49
|
return true;
|
|
49
50
|
});
|
|
50
51
|
}
|
|
51
|
-
/*
|
|
52
|
-
* Copyright 2024 Commonwealth Scientific and Industrial Research
|
|
53
|
-
* Organisation (CSIRO) ABN 41 687 119 230.
|
|
54
|
-
*
|
|
55
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
56
|
-
* you may not use this file except in compliance with the License.
|
|
57
|
-
* You may obtain a copy of the License at
|
|
58
|
-
*
|
|
59
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
60
|
-
*
|
|
61
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
62
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
63
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
64
|
-
* See the License for the specific language governing permissions and
|
|
65
|
-
* limitations under the License.
|
|
66
|
-
*/
|
|
67
52
|
|
|
68
53
|
/**
|
|
69
54
|
* Checks if any of the items in a qItem array is a tabbed item
|
|
@@ -148,7 +133,7 @@ interface constructTabsWithVisibilityParams {
|
|
|
148
133
|
tabs: Tabs;
|
|
149
134
|
enableWhenIsActivated: boolean;
|
|
150
135
|
enableWhenItems: EnableWhenItems;
|
|
151
|
-
enableWhenExpressions:
|
|
136
|
+
enableWhenExpressions: EnableWhenExpressions;
|
|
152
137
|
}
|
|
153
138
|
|
|
154
139
|
export function constructTabsWithVisibility(
|
|
@@ -176,7 +161,7 @@ interface getNextVisibleTabIndexParams {
|
|
|
176
161
|
currentTabIndex: number;
|
|
177
162
|
enableWhenIsActivated: boolean;
|
|
178
163
|
enableWhenItems: EnableWhenItems;
|
|
179
|
-
enableWhenExpressions:
|
|
164
|
+
enableWhenExpressions: EnableWhenExpressions;
|
|
180
165
|
}
|
|
181
166
|
/**
|
|
182
167
|
* Get index of next visible tab
|
|
@@ -216,7 +201,7 @@ export function findNumOfVisibleTabs(
|
|
|
216
201
|
tabs: Tabs,
|
|
217
202
|
enableWhenIsActivated: boolean,
|
|
218
203
|
enableWhenItems: EnableWhenItems,
|
|
219
|
-
enableWhenExpressions:
|
|
204
|
+
enableWhenExpressions: EnableWhenExpressions
|
|
220
205
|
): number {
|
|
221
206
|
const tabsWithVisibility = constructTabsWithVisibility({
|
|
222
207
|
tabs,
|
|
@@ -244,7 +229,7 @@ interface IsTabHiddenParams {
|
|
|
244
229
|
isTab: boolean;
|
|
245
230
|
enableWhenIsActivated: boolean;
|
|
246
231
|
enableWhenItems: EnableWhenItems;
|
|
247
|
-
enableWhenExpressions:
|
|
232
|
+
enableWhenExpressions: EnableWhenExpressions;
|
|
248
233
|
completedTabsCollapsed: boolean;
|
|
249
234
|
}
|
|
250
235
|
|
|
@@ -23,7 +23,7 @@ import type {
|
|
|
23
23
|
QuestionnaireResponseItemAnswer
|
|
24
24
|
} from 'fhir/r4';
|
|
25
25
|
import { getQrItemsIndex, mapQItemsIndex } from './mapItem';
|
|
26
|
-
import type {
|
|
26
|
+
import type { EnableWhenExpressions, EnableWhenItems } from '../interfaces';
|
|
27
27
|
import { isHiddenByEnableWhen } from './qItem';
|
|
28
28
|
import { getRegexValidation } from './itemControl';
|
|
29
29
|
import { structuredDataCapture } from 'fhir-sdc-helpers';
|
|
@@ -37,7 +37,7 @@ interface ValidateQuestionnaireParams {
|
|
|
37
37
|
invalidItems: Record<string, InvalidType>;
|
|
38
38
|
enableWhenIsActivated: boolean;
|
|
39
39
|
enableWhenItems: EnableWhenItems;
|
|
40
|
-
enableWhenExpressions:
|
|
40
|
+
enableWhenExpressions: EnableWhenExpressions;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
/**
|
|
@@ -107,7 +107,7 @@ interface ValidateItemRecursiveParams {
|
|
|
107
107
|
invalidItems: Record<string, InvalidType>;
|
|
108
108
|
enableWhenIsActivated: boolean;
|
|
109
109
|
enableWhenItems: EnableWhenItems;
|
|
110
|
-
enableWhenExpressions:
|
|
110
|
+
enableWhenExpressions: EnableWhenExpressions;
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
function validateItemRecursive(params: ValidateItemRecursiveParams) {
|
|
@@ -231,14 +231,6 @@ function validateSingleItem(
|
|
|
231
231
|
return invalidItems;
|
|
232
232
|
}
|
|
233
233
|
|
|
234
|
-
// function validateRepeatGroup(
|
|
235
|
-
// qItem: QuestionnaireItem,
|
|
236
|
-
// qrItems: QuestionnaireResponseItem,
|
|
237
|
-
// invalidLinkIds: Record<string, InvalidType>
|
|
238
|
-
// ) {
|
|
239
|
-
// return;
|
|
240
|
-
// }
|
|
241
|
-
|
|
242
234
|
function getInputInString(answer: QuestionnaireResponseItemAnswer) {
|
|
243
235
|
if (answer.valueString) {
|
|
244
236
|
return answer.valueString;
|