@aehrc/smart-forms-renderer 0.6.7 → 0.7.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.
- package/README.md +13 -10
- package/lib/components/Box.styles.d.ts +1 -0
- package/lib/components/Box.styles.js +5 -1
- package/lib/components/Box.styles.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.js +3 -5
- package/lib/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.js.map +1 -1
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioSingle.js +2 -2
- package/lib/components/FormComponents/ChoiceItems/ChoiceRadioSingle.js.map +1 -1
- package/lib/components/FormComponents/ItemParts/CheckboxSingle.js +2 -2
- package/lib/components/FormComponents/ItemParts/CheckboxSingle.js.map +1 -1
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.js +3 -5
- package/lib/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.js.map +1 -1
- package/lib/components/FormComponents/RepeatGroup/AddItemButton.js +1 -1
- package/lib/components/FormComponents/RepeatGroup/AddItemButton.js.map +1 -1
- package/lib/components/FormComponents/RepeatItem/AddItemButton.js +1 -1
- package/lib/components/FormComponents/RepeatItem/AddItemButton.js.map +1 -1
- package/lib/components/Renderer/FormBodyTabbed.js +2 -2
- package/lib/components/Renderer/FormBodyTabbed.js.map +1 -1
- package/lib/components/Renderer/SmartFormsRenderer.d.ts +1 -0
- package/lib/components/Renderer/SmartFormsRenderer.js +2 -3
- package/lib/components/Renderer/SmartFormsRenderer.js.map +1 -1
- package/lib/components/Tabs/FormBodySingleTab.d.ts +1 -1
- package/lib/components/Tabs/FormBodySingleTab.js +2 -4
- package/lib/components/Tabs/FormBodySingleTab.js.map +1 -1
- package/lib/components/Tabs/FormBodyTabList.d.ts +2 -1
- package/lib/components/Tabs/FormBodyTabList.js +24 -26
- package/lib/components/Tabs/FormBodyTabList.js.map +1 -1
- package/lib/components/Tabs/FormBodyTabListWrapper.d.ts +10 -0
- package/lib/components/Tabs/FormBodyTabListWrapper.js +44 -0
- package/lib/components/Tabs/FormBodyTabListWrapper.js.map +1 -0
- package/lib/hooks/useInitialiseRenderer.d.ts +1 -1
- package/lib/hooks/useInitialiseRenderer.js +17 -3
- package/lib/hooks/useInitialiseRenderer.js.map +1 -1
- package/lib/hooks/useTerminologyServerQuery.d.ts +2 -2
- package/lib/hooks/useTerminologyServerQuery.js +8 -4
- package/lib/hooks/useTerminologyServerQuery.js.map +1 -1
- package/lib/hooks/useValueSetCodings.js +5 -2
- package/lib/hooks/useValueSetCodings.js.map +1 -1
- package/lib/stores/useQuestionnaireStore.d.ts +1 -1
- package/lib/stores/useQuestionnaireStore.js +3 -2
- package/lib/stores/useQuestionnaireStore.js.map +1 -1
- package/lib/stores/useTerminologyServerStore.d.ts +7 -0
- package/{src/theme/overrides/Typography.ts → lib/stores/useTerminologyServerStore.js} +9 -17
- package/lib/stores/useTerminologyServerStore.js.map +1 -0
- package/lib/theme/overrides/Overrides.js +1 -2
- package/lib/theme/overrides/Overrides.js.map +1 -1
- package/lib/utils/isHidden.d.ts +3 -0
- package/lib/utils/isHidden.js +30 -0
- package/lib/utils/isHidden.js.map +1 -0
- package/lib/utils/qItem.d.ts +1 -1
- package/lib/utils/qItem.js +1 -1
- package/lib/utils/questionnaireStoreUtils/createQuestionaireModel.d.ts +1 -1
- package/lib/utils/questionnaireStoreUtils/createQuestionaireModel.js +4 -4
- package/lib/utils/questionnaireStoreUtils/createQuestionaireModel.js.map +1 -1
- package/lib/utils/questionnaireStoreUtils/extractContainedValueSets.d.ts +1 -1
- package/lib/utils/questionnaireStoreUtils/extractContainedValueSets.js +2 -2
- package/lib/utils/questionnaireStoreUtils/extractContainedValueSets.js.map +1 -1
- package/lib/utils/questionnaireStoreUtils/extractOtherExtensions.d.ts +1 -1
- package/lib/utils/questionnaireStoreUtils/extractOtherExtensions.js +6 -4
- package/lib/utils/questionnaireStoreUtils/extractOtherExtensions.js.map +1 -1
- package/lib/utils/questionnaireStoreUtils/resolveValueSets.d.ts +1 -1
- package/lib/utils/questionnaireStoreUtils/resolveValueSets.js +2 -2
- package/lib/utils/questionnaireStoreUtils/resolveValueSets.js.map +1 -1
- package/lib/utils/tabs.d.ts +10 -0
- package/lib/utils/tabs.js +26 -1
- package/lib/utils/tabs.js.map +1 -1
- package/lib/utils/valueSet.d.ts +1 -1
- package/lib/utils/valueSet.js +3 -4
- package/lib/utils/valueSet.js.map +1 -1
- package/package.json +2 -2
- package/src/components/Box.styles.ts +6 -1
- package/src/components/FormComponents/ChoiceItems/ChoiceAutocompleteItem.tsx +5 -7
- package/src/components/FormComponents/ChoiceItems/ChoiceRadioSingle.tsx +2 -2
- package/src/components/FormComponents/ItemParts/CheckboxSingle.tsx +2 -2
- package/src/components/FormComponents/OpenChoiceItems/OpenChoiceAutocompleteItem.tsx +5 -7
- package/src/components/FormComponents/RepeatGroup/AddItemButton.tsx +1 -0
- package/src/components/FormComponents/RepeatItem/AddItemButton.tsx +1 -0
- package/src/components/Renderer/FormBodyTabbed.tsx +2 -2
- package/src/components/Renderer/SmartFormsRenderer.tsx +9 -2
- package/src/components/Tabs/FormBodySingleTab.tsx +3 -6
- package/src/components/Tabs/FormBodyTabList.tsx +41 -41
- package/src/components/Tabs/FormBodyTabListWrapper.tsx +80 -0
- package/src/hooks/useInitialiseRenderer.ts +22 -2
- package/src/hooks/useTerminologyServerQuery.ts +8 -6
- package/src/hooks/useValueSetCodings.ts +5 -2
- package/src/stores/useQuestionnaireStore.ts +10 -3
- package/src/stores/useTerminologyServerStore.ts +34 -0
- package/src/theme/overrides/Overrides.ts +0 -2
- package/src/utils/qItem.ts +1 -1
- package/src/utils/questionnaireStoreUtils/createQuestionaireModel.ts +10 -4
- package/src/utils/questionnaireStoreUtils/extractContainedValueSets.ts +5 -2
- package/src/utils/questionnaireStoreUtils/extractOtherExtensions.ts +8 -4
- package/src/utils/questionnaireStoreUtils/resolveValueSets.ts +3 -2
- package/src/utils/tabs.ts +54 -1
- package/src/utils/valueSet.ts +3 -4
|
@@ -16,23 +16,23 @@
|
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
18
|
import { useQuery } from '@tanstack/react-query';
|
|
19
|
-
import type { Coding, ValueSet } from 'fhir/r4';
|
|
20
|
-
import { getValueSetCodings, getValueSetPromise } from '../utils/valueSet';
|
|
19
|
+
import type { Coding, QuestionnaireItem, ValueSet } from 'fhir/r4';
|
|
20
|
+
import { getTerminologyServerUrl, getValueSetCodings, getValueSetPromise } from '../utils/valueSet';
|
|
21
21
|
|
|
22
22
|
import type { AlertColor } from '@mui/material/Alert';
|
|
23
23
|
import useQuestionnaireStore from '../stores/useQuestionnaireStore';
|
|
24
|
+
import useTerminologyServerStore from '../stores/useTerminologyServerStore';
|
|
24
25
|
|
|
25
26
|
function useTerminologyServerQuery(
|
|
26
|
-
|
|
27
|
+
qItem: QuestionnaireItem,
|
|
27
28
|
maxList: number,
|
|
28
29
|
input: string,
|
|
29
|
-
searchTerm: string
|
|
30
|
-
terminologyServerUrl?: string
|
|
30
|
+
searchTerm: string
|
|
31
31
|
): { options: Coding[]; loading: boolean; feedback?: { message: string; color: AlertColor } } {
|
|
32
32
|
const processedValueSetUrls = useQuestionnaireStore((state) => state.processedValueSetUrls);
|
|
33
|
+
const defaultTerminologyServerUrl = useTerminologyServerStore((state) => state.url);
|
|
33
34
|
|
|
34
35
|
let fullUrl = '';
|
|
35
|
-
|
|
36
36
|
let options: Coding[] = [];
|
|
37
37
|
let loading = false;
|
|
38
38
|
let feedback: { message: string; color: AlertColor } | undefined;
|
|
@@ -46,6 +46,7 @@ function useTerminologyServerQuery(
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
// Restructure url to include filter and count parameters
|
|
49
|
+
let answerValueSetUrl = qItem.answerValueSet;
|
|
49
50
|
if (answerValueSetUrl) {
|
|
50
51
|
if (answerValueSetUrl.startsWith('#')) {
|
|
51
52
|
answerValueSetUrl = answerValueSetUrl.slice(1);
|
|
@@ -62,6 +63,7 @@ function useTerminologyServerQuery(
|
|
|
62
63
|
}
|
|
63
64
|
|
|
64
65
|
// Perform query
|
|
66
|
+
const terminologyServerUrl = getTerminologyServerUrl(qItem) ?? defaultTerminologyServerUrl;
|
|
65
67
|
const { isInitialLoading, error, data } = useQuery<ValueSet>(
|
|
66
68
|
['expandValueSet', fullUrl],
|
|
67
69
|
() => getValueSetPromise(fullUrl, terminologyServerUrl),
|
|
@@ -28,6 +28,7 @@ import fhirpath from 'fhirpath';
|
|
|
28
28
|
import fhirpath_r4_model from 'fhirpath/fhir-context/r4';
|
|
29
29
|
import useSmartConfigStore from '../stores/useSmartConfigStore';
|
|
30
30
|
import useQuestionnaireStore from '../stores/useQuestionnaireStore';
|
|
31
|
+
import useTerminologyServerStore from '../stores/useTerminologyServerStore';
|
|
31
32
|
|
|
32
33
|
function useValueSetCodings(qItem: QuestionnaireItem) {
|
|
33
34
|
const patient = useSmartConfigStore((state) => state.patient);
|
|
@@ -40,6 +41,8 @@ function useValueSetCodings(qItem: QuestionnaireItem) {
|
|
|
40
41
|
const addCodingToCache = useQuestionnaireStore((state) => state.addCodingToCache);
|
|
41
42
|
const { xFhirQueryVariables } = useQuestionnaireStore((state) => state.variables);
|
|
42
43
|
|
|
44
|
+
const defaultTerminologyServerUrl = useTerminologyServerStore((state) => state.url);
|
|
45
|
+
|
|
43
46
|
const valueSetUrl = qItem.answerValueSet;
|
|
44
47
|
let initialCodings = useMemo(() => {
|
|
45
48
|
// set options from cached answer options if present
|
|
@@ -127,8 +130,8 @@ function useValueSetCodings(qItem: QuestionnaireItem) {
|
|
|
127
130
|
const valueSetUrl = qItem.answerValueSet;
|
|
128
131
|
if (!valueSetUrl || codings.length > 0) return;
|
|
129
132
|
|
|
130
|
-
const
|
|
131
|
-
const promise = getValueSetPromise(valueSetUrl,
|
|
133
|
+
const terminologyServerUrl = getTerminologyServerUrl(qItem) ?? defaultTerminologyServerUrl;
|
|
134
|
+
const promise = getValueSetPromise(valueSetUrl, terminologyServerUrl);
|
|
132
135
|
if (promise) {
|
|
133
136
|
promise
|
|
134
137
|
.then((valueSet: ValueSet) => {
|
|
@@ -38,6 +38,7 @@ import { createQuestionnaireModel } from '../utils/questionnaireStoreUtils/creat
|
|
|
38
38
|
import { initialiseFormFromResponse } from '../utils/initialiseForm';
|
|
39
39
|
import { emptyQuestionnaire, emptyResponse } from '../utils/emptyResource';
|
|
40
40
|
import cloneDeep from 'lodash.clonedeep';
|
|
41
|
+
import useTerminologyServerStore from './useTerminologyServerStore';
|
|
41
42
|
|
|
42
43
|
export interface UseQuestionnaireStoreType {
|
|
43
44
|
sourceQuestionnaire: Questionnaire;
|
|
@@ -57,7 +58,8 @@ export interface UseQuestionnaireStoreType {
|
|
|
57
58
|
buildSourceQuestionnaire: (
|
|
58
59
|
questionnaire: Questionnaire,
|
|
59
60
|
questionnaireResponse?: QuestionnaireResponse,
|
|
60
|
-
additionalVariables?: Record<string, object
|
|
61
|
+
additionalVariables?: Record<string, object>,
|
|
62
|
+
terminologyServerUrl?: string
|
|
61
63
|
) => Promise<void>;
|
|
62
64
|
destroySourceQuestionnaire: () => void;
|
|
63
65
|
switchTab: (newTabIndex: number) => void;
|
|
@@ -87,9 +89,14 @@ const useQuestionnaireStore = create<UseQuestionnaireStoreType>()((set, get) =>
|
|
|
87
89
|
buildSourceQuestionnaire: async (
|
|
88
90
|
questionnaire,
|
|
89
91
|
questionnaireResponse = cloneDeep(emptyResponse),
|
|
90
|
-
additionalVariables = {}
|
|
92
|
+
additionalVariables = {},
|
|
93
|
+
terminologyServerUrl = useTerminologyServerStore.getState().url
|
|
91
94
|
) => {
|
|
92
|
-
const questionnaireModel = await createQuestionnaireModel(
|
|
95
|
+
const questionnaireModel = await createQuestionnaireModel(
|
|
96
|
+
questionnaire,
|
|
97
|
+
additionalVariables,
|
|
98
|
+
terminologyServerUrl
|
|
99
|
+
);
|
|
93
100
|
|
|
94
101
|
const {
|
|
95
102
|
initialEnableWhenItems,
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2023 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
|
+
|
|
18
|
+
import { create } from 'zustand';
|
|
19
|
+
|
|
20
|
+
const ONTOSERVER_R4 = 'https://r4.ontoserver.csiro.au/fhir';
|
|
21
|
+
|
|
22
|
+
export interface UseTerminologyServerStoreType {
|
|
23
|
+
url: string;
|
|
24
|
+
setUrl: (newUrl: string) => void;
|
|
25
|
+
resetUrl: () => void;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const useTerminologyServerStore = create<UseTerminologyServerStoreType>()((set) => ({
|
|
29
|
+
url: ONTOSERVER_R4,
|
|
30
|
+
setUrl: (newUrl: string) => set(() => ({ url: newUrl })),
|
|
31
|
+
resetUrl: () => set(() => ({ url: ONTOSERVER_R4 }))
|
|
32
|
+
}));
|
|
33
|
+
|
|
34
|
+
export default useTerminologyServerStore;
|
|
@@ -21,7 +21,6 @@ import Input from './Input';
|
|
|
21
21
|
import Table from './Table';
|
|
22
22
|
import Button from './Button';
|
|
23
23
|
import Backdrop from './Backdrop';
|
|
24
|
-
import Typography from './Typography';
|
|
25
24
|
import Autocomplete from './Autocomplete';
|
|
26
25
|
import Accordion from './Accordion';
|
|
27
26
|
import SpeedDial from './SpeedDial';
|
|
@@ -36,7 +35,6 @@ function ComponentsOverrides(theme: Theme) {
|
|
|
36
35
|
Paper(),
|
|
37
36
|
Button(theme),
|
|
38
37
|
Backdrop(theme),
|
|
39
|
-
Typography(theme),
|
|
40
38
|
Autocomplete(theme),
|
|
41
39
|
SpeedDial(theme)
|
|
42
40
|
);
|
package/src/utils/qItem.ts
CHANGED
|
@@ -32,7 +32,7 @@ interface isHiddenParams {
|
|
|
32
32
|
/**
|
|
33
33
|
* Test the given QItem on a series of checks to verify if the item should be displayed
|
|
34
34
|
* Check if qItem has hidden attribute
|
|
35
|
-
* Check if qItem
|
|
35
|
+
* Check if qItem fulfilled its enableWhen criteria
|
|
36
36
|
*
|
|
37
37
|
* @author Sean Fong
|
|
38
38
|
*/
|
|
@@ -30,7 +30,8 @@ import { addAdditionalVariables } from './addAdditionalVariables';
|
|
|
30
30
|
|
|
31
31
|
export async function createQuestionnaireModel(
|
|
32
32
|
questionnaire: Questionnaire,
|
|
33
|
-
additionalVariables: Record<string, object
|
|
33
|
+
additionalVariables: Record<string, object>,
|
|
34
|
+
terminologyServerUrl: string
|
|
34
35
|
): Promise<QuestionnaireModel> {
|
|
35
36
|
if (!questionnaire.item) {
|
|
36
37
|
return createEmptyModel();
|
|
@@ -43,7 +44,10 @@ export async function createQuestionnaireModel(
|
|
|
43
44
|
let variables: Variables = extractQuestionnaireLevelVariables(questionnaire);
|
|
44
45
|
variables = addAdditionalVariables(variables, additionalVariables);
|
|
45
46
|
|
|
46
|
-
const extractContainedValueSetsResult = extractContainedValueSets(
|
|
47
|
+
const extractContainedValueSetsResult = extractContainedValueSets(
|
|
48
|
+
questionnaire,
|
|
49
|
+
terminologyServerUrl
|
|
50
|
+
);
|
|
47
51
|
let valueSetPromises = extractContainedValueSetsResult.valueSetPromises;
|
|
48
52
|
let processedValueSetCodings = extractContainedValueSetsResult.processedValueSetCodings;
|
|
49
53
|
const processedValueSetUrls = extractContainedValueSetsResult.processedValueSetUrls;
|
|
@@ -51,7 +55,8 @@ export async function createQuestionnaireModel(
|
|
|
51
55
|
const extractOtherExtensionsResult = extractOtherExtensions(
|
|
52
56
|
questionnaire,
|
|
53
57
|
variables,
|
|
54
|
-
valueSetPromises
|
|
58
|
+
valueSetPromises,
|
|
59
|
+
terminologyServerUrl
|
|
55
60
|
);
|
|
56
61
|
|
|
57
62
|
const { enableWhenItems, enableWhenExpressions, calculatedExpressions, answerExpressions } =
|
|
@@ -62,7 +67,8 @@ export async function createQuestionnaireModel(
|
|
|
62
67
|
const resolveValueSetsResult = await resolveValueSets(
|
|
63
68
|
variables,
|
|
64
69
|
valueSetPromises,
|
|
65
|
-
processedValueSetCodings
|
|
70
|
+
processedValueSetCodings,
|
|
71
|
+
terminologyServerUrl
|
|
66
72
|
);
|
|
67
73
|
|
|
68
74
|
variables = resolveValueSetsResult.variables;
|
|
@@ -19,7 +19,10 @@ import type { ValueSetPromise } from '../../interfaces/valueSet.interface';
|
|
|
19
19
|
import { getValueSetCodings, getValueSetPromise } from '../valueSet';
|
|
20
20
|
import type { Coding, Questionnaire, ValueSet } from 'fhir/r4';
|
|
21
21
|
|
|
22
|
-
export function extractContainedValueSets(
|
|
22
|
+
export function extractContainedValueSets(
|
|
23
|
+
questionnaire: Questionnaire,
|
|
24
|
+
terminologyServerUrl: string
|
|
25
|
+
): {
|
|
23
26
|
processedValueSetCodings: Record<string, Coding[]>;
|
|
24
27
|
processedValueSetUrls: Record<string, string>;
|
|
25
28
|
valueSetPromises: Record<string, ValueSetPromise>;
|
|
@@ -47,7 +50,7 @@ export function extractContainedValueSets(questionnaire: Questionnaire): {
|
|
|
47
50
|
const valueSetUrl = getValueSetUrlFromContained(entry);
|
|
48
51
|
if (valueSetUrl) {
|
|
49
52
|
valueSetPromises[entry.id] = {
|
|
50
|
-
promise: getValueSetPromise(valueSetUrl)
|
|
53
|
+
promise: getValueSetPromise(valueSetUrl, terminologyServerUrl)
|
|
51
54
|
};
|
|
52
55
|
continue;
|
|
53
56
|
}
|
|
@@ -41,7 +41,8 @@ interface ReturnParamsRecursive {
|
|
|
41
41
|
export function extractOtherExtensions(
|
|
42
42
|
questionnaire: Questionnaire,
|
|
43
43
|
variables: Variables,
|
|
44
|
-
valueSetPromises: Record<string, ValueSetPromise
|
|
44
|
+
valueSetPromises: Record<string, ValueSetPromise>,
|
|
45
|
+
terminologyServerUrl: string
|
|
45
46
|
): ReturnParamsRecursive {
|
|
46
47
|
const enableWhenItems: Record<string, EnableWhenItemProperties> = {};
|
|
47
48
|
const enableWhenExpressions: Record<string, EnableWhenExpression> = {};
|
|
@@ -67,7 +68,8 @@ export function extractOtherExtensions(
|
|
|
67
68
|
enableWhenExpressions,
|
|
68
69
|
calculatedExpressions,
|
|
69
70
|
answerExpressions,
|
|
70
|
-
valueSetPromises
|
|
71
|
+
valueSetPromises,
|
|
72
|
+
defaultTerminologyServerUrl: terminologyServerUrl
|
|
71
73
|
});
|
|
72
74
|
}
|
|
73
75
|
|
|
@@ -89,6 +91,7 @@ interface extractExtensionsFromItemRecursiveParams {
|
|
|
89
91
|
calculatedExpressions: Record<string, CalculatedExpression>;
|
|
90
92
|
answerExpressions: Record<string, AnswerExpression>;
|
|
91
93
|
valueSetPromises: Record<string, ValueSetPromise>;
|
|
94
|
+
defaultTerminologyServerUrl: string;
|
|
92
95
|
}
|
|
93
96
|
|
|
94
97
|
function extractExtensionsFromItemRecursive(
|
|
@@ -101,7 +104,8 @@ function extractExtensionsFromItemRecursive(
|
|
|
101
104
|
enableWhenExpressions,
|
|
102
105
|
calculatedExpressions,
|
|
103
106
|
answerExpressions,
|
|
104
|
-
valueSetPromises
|
|
107
|
+
valueSetPromises,
|
|
108
|
+
defaultTerminologyServerUrl
|
|
105
109
|
} = params;
|
|
106
110
|
|
|
107
111
|
const items = item.item;
|
|
@@ -145,7 +149,7 @@ function extractExtensionsFromItemRecursive(
|
|
|
145
149
|
const valueSetUrl = item.answerValueSet;
|
|
146
150
|
if (valueSetUrl) {
|
|
147
151
|
if (!valueSetPromises[valueSetUrl] && !valueSetUrl.startsWith('#')) {
|
|
148
|
-
const terminologyServerUrl = getTerminologyServerUrl(item);
|
|
152
|
+
const terminologyServerUrl = getTerminologyServerUrl(item) ?? defaultTerminologyServerUrl;
|
|
149
153
|
valueSetPromises[valueSetUrl] = {
|
|
150
154
|
promise: getValueSetPromise(valueSetUrl, terminologyServerUrl)
|
|
151
155
|
};
|
|
@@ -28,7 +28,8 @@ import type { ValueSetPromise } from '../../interfaces/valueSet.interface';
|
|
|
28
28
|
export async function resolveValueSets(
|
|
29
29
|
variables: Variables,
|
|
30
30
|
valueSetPromises: Record<string, ValueSetPromise>,
|
|
31
|
-
processedValueSetCodings: Record<string, Coding[]
|
|
31
|
+
processedValueSetCodings: Record<string, Coding[]>,
|
|
32
|
+
terminologyServerUrl: string
|
|
32
33
|
): Promise<{ variables: Variables; processedValueSetCodings: Record<string, Coding[]> }> {
|
|
33
34
|
// Create a <valueSetUrl, XFhirQueryVariableName> map
|
|
34
35
|
const valueSetToXFhirQueryVariableNameMap: Record<string, string> =
|
|
@@ -37,7 +38,7 @@ export async function resolveValueSets(
|
|
|
37
38
|
if (Object.keys(valueSetToXFhirQueryVariableNameMap).length > 0) {
|
|
38
39
|
for (const valueSetUrl in valueSetToXFhirQueryVariableNameMap) {
|
|
39
40
|
valueSetPromises[valueSetUrl] = {
|
|
40
|
-
promise: getValueSetPromise(valueSetUrl)
|
|
41
|
+
promise: getValueSetPromise(valueSetUrl, terminologyServerUrl)
|
|
41
42
|
};
|
|
42
43
|
}
|
|
43
44
|
}
|
package/src/utils/tabs.ts
CHANGED
|
@@ -19,7 +19,7 @@ import type { Tabs } from '../interfaces/tab.interface';
|
|
|
19
19
|
import type { EnableWhenExpression, EnableWhenItems } from '../interfaces/enableWhen.interface';
|
|
20
20
|
import type { Coding, QuestionnaireItem } from 'fhir/r4';
|
|
21
21
|
import { hasHiddenExtension, isSpecificItemControl } from './itemControl';
|
|
22
|
-
import { isHiddenByEnableWhens } from './qItem';
|
|
22
|
+
import { isHidden, isHiddenByEnableWhens } from './qItem';
|
|
23
23
|
|
|
24
24
|
export function getFirstVisibleTab(
|
|
25
25
|
tabs: Tabs,
|
|
@@ -253,3 +253,56 @@ export function getContextDisplays(item: QuestionnaireItem): QuestionnaireItem[]
|
|
|
253
253
|
isSpecificItemControl(childItem, 'context-display') && childItem.type === 'display'
|
|
254
254
|
);
|
|
255
255
|
}
|
|
256
|
+
|
|
257
|
+
interface IsTabHiddenParams {
|
|
258
|
+
qItem: QuestionnaireItem;
|
|
259
|
+
contextDisplayItems: QuestionnaireItem[];
|
|
260
|
+
isTab: boolean;
|
|
261
|
+
enableWhenIsActivated: boolean;
|
|
262
|
+
enableWhenItems: EnableWhenItems;
|
|
263
|
+
enableWhenExpressions: Record<string, EnableWhenExpression>;
|
|
264
|
+
completedTabsCollapsed: boolean;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
export function isTabHidden(params: IsTabHiddenParams): boolean {
|
|
268
|
+
const {
|
|
269
|
+
qItem,
|
|
270
|
+
contextDisplayItems,
|
|
271
|
+
isTab,
|
|
272
|
+
enableWhenIsActivated,
|
|
273
|
+
enableWhenItems,
|
|
274
|
+
enableWhenExpressions,
|
|
275
|
+
completedTabsCollapsed
|
|
276
|
+
} = params;
|
|
277
|
+
|
|
278
|
+
if (
|
|
279
|
+
!isTab ||
|
|
280
|
+
isHidden({
|
|
281
|
+
questionnaireItem: qItem,
|
|
282
|
+
enableWhenIsActivated,
|
|
283
|
+
enableWhenItems,
|
|
284
|
+
enableWhenExpressions
|
|
285
|
+
})
|
|
286
|
+
) {
|
|
287
|
+
return true;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
if (completedTabsCollapsed) {
|
|
291
|
+
const completedDisplayItem = contextDisplayItems.find(
|
|
292
|
+
(contextDisplayItem) => contextDisplayItem.text === 'Complete'
|
|
293
|
+
);
|
|
294
|
+
if (
|
|
295
|
+
completedDisplayItem &&
|
|
296
|
+
!isHidden({
|
|
297
|
+
questionnaireItem: completedDisplayItem,
|
|
298
|
+
enableWhenIsActivated,
|
|
299
|
+
enableWhenItems,
|
|
300
|
+
enableWhenExpressions
|
|
301
|
+
})
|
|
302
|
+
) {
|
|
303
|
+
return true;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
return false;
|
|
308
|
+
}
|
package/src/utils/valueSet.ts
CHANGED
|
@@ -35,7 +35,6 @@ const VALID_VALUE_SET_URL_REGEX =
|
|
|
35
35
|
/https?:\/\/(www\.)?[-\w@:%.+~#=]{2,256}\.[a-z]{2,4}\b([-@\w:%+.~#?&/=]*ValueSet[-@\w:%+.~#?&/=]*)/;
|
|
36
36
|
|
|
37
37
|
const VALID_FHIRPATH_VARIABLE_REGEX = /%(.*?)\./;
|
|
38
|
-
const ONTOSERVER_ENDPOINT = 'https://r4.ontoserver.csiro.au/fhir/';
|
|
39
38
|
|
|
40
39
|
export function getTerminologyServerUrl(qItem: QuestionnaireItem): string | undefined {
|
|
41
40
|
const itemControl = qItem.extension?.find(
|
|
@@ -48,18 +47,18 @@ export function getTerminologyServerUrl(qItem: QuestionnaireItem): string | unde
|
|
|
48
47
|
return undefined;
|
|
49
48
|
}
|
|
50
49
|
|
|
51
|
-
export function getValueSetPromise(url: string,
|
|
50
|
+
export function getValueSetPromise(url: string, terminologyServerUrl: string): Promise<ValueSet> {
|
|
52
51
|
let valueSetUrl = url;
|
|
53
52
|
|
|
54
53
|
if (url.includes('ValueSet/$expand?url=')) {
|
|
55
54
|
const splitUrl = url.split('ValueSet/$expand?url=');
|
|
56
|
-
|
|
55
|
+
terminologyServerUrl = splitUrl[0];
|
|
57
56
|
valueSetUrl = splitUrl[1];
|
|
58
57
|
}
|
|
59
58
|
|
|
60
59
|
valueSetUrl = valueSetUrl.replace('|', '&version=');
|
|
61
60
|
|
|
62
|
-
return FHIR.client({ serverUrl:
|
|
61
|
+
return FHIR.client({ serverUrl: terminologyServerUrl }).request({
|
|
63
62
|
url: 'ValueSet/$expand?url=' + valueSetUrl
|
|
64
63
|
});
|
|
65
64
|
}
|