diff --git a/packages/smart-forms-renderer/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.tsx b/packages/smart-forms-renderer/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.tsx index 22b0f0c0..b8ae1d9b 100644 --- a/packages/smart-forms-renderer/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.tsx +++ b/packages/smart-forms-renderer/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerOptionItem.tsx @@ -63,7 +63,7 @@ function ChoiceRadioAnswerOptionItem(props: ChoiceRadioAnswerOptionItemProps) { const { calcExpUpdated } = useCodingCalculatedExpression({ qItem: qItem, valueInString: valueChoice ?? '', - onChangeByCalcExpressionString: (newValueString: string) => { + onChangeByCalcExpressionString: (newValueString: string | null) => { handleChange(newValueString); }, onChangeByCalcExpressionNull: () => { diff --git a/packages/smart-forms-renderer/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.tsx b/packages/smart-forms-renderer/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.tsx index 1e0e2f13..400a1e66 100644 --- a/packages/smart-forms-renderer/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.tsx +++ b/packages/smart-forms-renderer/src/components/FormComponents/ChoiceItems/ChoiceRadioAnswerValueSetItem.tsx @@ -65,8 +65,8 @@ function ChoiceRadioAnswerValueSetItem(props: ChoiceRadioAnswerValueSetItemProps const { calcExpUpdated } = useCodingCalculatedExpression({ qItem: qItem, valueInString: valueRadio ?? '', - onChangeByCalcExpressionString: (newValueString: string) => { - handleChange(newValueString); + onChangeByCalcExpressionString: (newValueString: string | null) => { + handleChange(newValueString ?? ''); }, onChangeByCalcExpressionNull: () => { onQrItemChange(createEmptyQrItem(qItem)); diff --git a/packages/smart-forms-renderer/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.tsx b/packages/smart-forms-renderer/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.tsx index 1fd6ff42..008d3a26 100644 --- a/packages/smart-forms-renderer/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.tsx +++ b/packages/smart-forms-renderer/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerOptionItem.tsx @@ -62,8 +62,8 @@ function ChoiceSelectAnswerOptionItem(props: ChoiceSelectAnswerOptionItemProps) const { calcExpUpdated } = useCodingCalculatedExpression({ qItem: qItem, valueInString: valueChoice ?? '', - onChangeByCalcExpressionString: (newValueString: string) => { - handleChange(newValueString); + onChangeByCalcExpressionString: (newValueString: string | null) => { + handleChange(newValueString ?? ''); }, onChangeByCalcExpressionNull: () => { onQrItemChange(createEmptyQrItem(qItem)); diff --git a/packages/smart-forms-renderer/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.tsx b/packages/smart-forms-renderer/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.tsx index 6f3f0f23..9edc8578 100644 --- a/packages/smart-forms-renderer/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.tsx +++ b/packages/smart-forms-renderer/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetFields.tsx @@ -115,6 +115,17 @@ function ChoiceSelectAnswerValueSetFields(props: ChoiceSelectAnswerValueSetField ); } + if (codings.length === 0) { + return ( + + + There are no options available for {terminologyError.answerValueSet} + + + ); + } + + // Fallback when something went wrong return ( diff --git a/packages/smart-forms-renderer/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.tsx b/packages/smart-forms-renderer/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.tsx index dffb07b6..70d9cd73 100644 --- a/packages/smart-forms-renderer/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.tsx +++ b/packages/smart-forms-renderer/src/components/FormComponents/ChoiceItems/ChoiceSelectAnswerValueSetItem.tsx @@ -58,7 +58,7 @@ function ChoiceSelectAnswerValueSetItem(props: ChoiceSelectAnswerValueSetItemPro } // Get codings/options from valueSet - const { codings, isLoading, terminologyError } = useValueSetCodings(qItem, () => { + const { codings, isLoading, terminologyError, setCodings } = useValueSetCodings(qItem, () => { onQrItemChange(createEmptyQrItem(qItem)); }); @@ -83,19 +83,41 @@ function ChoiceSelectAnswerValueSetItem(props: ChoiceSelectAnswerValueSetItemPro [] ); - const answerOptions = useMemo(() => convertCodingsToAnswerOptions(codings), [codings]); - // Process calculated expressions const { calcExpUpdated } = useCodingCalculatedExpression({ qItem: qItem, valueInString: valueCoding?.code ?? '', - onChangeByCalcExpressionString: (newValueString) => { - if (codings.length > 0) { - const qrAnswer = findInAnswerOptions(answerOptions, newValueString); + onChangeByCalcExpressionString: (newValueString, newCodings) => { + // no new calcexp value and no newCodings + if (newValueString === null && newCodings.length === 0) { + return; + } + + // no new calcexp value only + if (newValueString === null) { + setCodings(newCodings); + createEmptyQrItem(qItem); + return; + } + + // no newCodings + if (newCodings.length === 0) { + const qrAnswer = findInAnswerOptions(codings, newValueString); onQrItemChange( qrAnswer ? { ...createEmptyQrItem(qItem), answer: [qrAnswer] } : createEmptyQrItem(qItem) ); + return; } + + // both is updated + const qrAnswer = findInAnswerOptions( + convertCodingsToAnswerOptions(newCodings), + newValueString + ); + setCodings(newCodings); + onQrItemChange( + qrAnswer ? { ...createEmptyQrItem(qItem), answer: [qrAnswer] } : createEmptyQrItem(qItem) + ); }, onChangeByCalcExpressionNull: () => { onQrItemChange(createEmptyQrItem(qItem)); diff --git a/packages/smart-forms-renderer/src/components/Renderer/BaseRenderer.tsx b/packages/smart-forms-renderer/src/components/Renderer/BaseRenderer.tsx index 9bb53c68..c09fb79d 100644 --- a/packages/smart-forms-renderer/src/components/Renderer/BaseRenderer.tsx +++ b/packages/smart-forms-renderer/src/components/Renderer/BaseRenderer.tsx @@ -39,29 +39,26 @@ function BaseRenderer() { const readOnly = useQuestionnaireStore.use.readOnly(); const updatableResponse = useQuestionnaireResponseStore.use.updatableResponse(); - const validateQuestionnaire = useQuestionnaireResponseStore.use.validateQuestionnaire(); const updateResponse = useQuestionnaireResponseStore.use.updateResponse(); const qItemsIndexMap = useMemo(() => mapQItemsIndex(sourceQuestionnaire), [sourceQuestionnaire]); - function handleTopLevelQRItemSingleChange(newTopLevelQRItem: QuestionnaireResponseItem) { + async function handleTopLevelQRItemSingleChange(newTopLevelQRItem: QuestionnaireResponseItem) { const updatedResponse: QuestionnaireResponse = cloneDeep(updatableResponse); updateQrItemsInGroup(newTopLevelQRItem, null, updatedResponse, qItemsIndexMap); - updateExpressions(updatedResponse); - validateQuestionnaire(sourceQuestionnaire, updatedResponse); updateResponse(updatedResponse); + await updateExpressions(updatedResponse); } - function handleTopLevelQRItemMultipleChange(newTopLevelQRItems: QrRepeatGroup) { + async function handleTopLevelQRItemMultipleChange(newTopLevelQRItems: QrRepeatGroup) { const updatedResponse: QuestionnaireResponse = cloneDeep(updatableResponse); updateQrItemsInGroup(null, newTopLevelQRItems, updatedResponse, qItemsIndexMap); - updateExpressions(updatedResponse); - validateQuestionnaire(sourceQuestionnaire, updatedResponse); updateResponse(updatedResponse); + await updateExpressions(updatedResponse); } const topLevelQItems = sourceQuestionnaire.item; diff --git a/packages/smart-forms-renderer/src/hooks/useCodingCalculatedExpression.ts b/packages/smart-forms-renderer/src/hooks/useCodingCalculatedExpression.ts index 565d7f10..245f895b 100644 --- a/packages/smart-forms-renderer/src/hooks/useCodingCalculatedExpression.ts +++ b/packages/smart-forms-renderer/src/hooks/useCodingCalculatedExpression.ts @@ -16,8 +16,9 @@ */ import { useEffect, useState } from 'react'; -import type { QuestionnaireItem } from 'fhir/r4'; +import type { Coding, QuestionnaireItem } from 'fhir/r4'; import { useQuestionnaireStore } from '../stores'; +import { AnswerExpression } from '../interfaces/answerExpression.interface'; interface UseCodingCalculatedExpression { calcExpUpdated: boolean; @@ -26,7 +27,7 @@ interface UseCodingCalculatedExpression { interface UseCodingCalculatedExpressionProps { qItem: QuestionnaireItem; valueInString: string; - onChangeByCalcExpressionString: (newValueInString: string) => void; + onChangeByCalcExpressionString: (newValueInString: string | null, newCodings: Coding[]) => void; onChangeByCalcExpressionNull: () => void; } @@ -38,50 +39,55 @@ function useCodingCalculatedExpression( props; const calculatedExpressions = useQuestionnaireStore.use.calculatedExpressions(); + const answerExpressions = useQuestionnaireStore.use.answerExpressions(); const [calcExpUpdated, setCalcExpUpdated] = useState(false); + const answerExpression: AnswerExpression | null = answerExpressions[qItem.linkId] ?? null; useEffect( () => { const calcExpression = calculatedExpressions[qItem.linkId]?.find( (exp) => exp.from === 'item' ); - if (!calcExpression) { - return; + let newCodings: Coding[] = []; + if (Array.isArray(answerExpression.options)) { + newCodings = answerExpression.options as Coding[]; } - // only update if calculated value is different from current value - if ( - calcExpression.value !== valueInString && - (typeof calcExpression.value === 'string' || - typeof calcExpression.value === 'number' || - calcExpression.value === null) - ) { - // update ui to show calculated value changes - setCalcExpUpdated(true); - setTimeout(() => { - setCalcExpUpdated(false); - }, 500); + let newValueString: string | null = null; + if (calcExpression) { + // only update if calculated value is different from current value + if ( + calcExpression.value !== valueInString && + (typeof calcExpression.value === 'string' || + typeof calcExpression.value === 'number' || + calcExpression.value === null) + ) { + // update ui to show calculated value changes + setCalcExpUpdated(true); + setTimeout(() => { + setCalcExpUpdated(false); + }, 500); - // calculatedExpression value is null - if (calcExpression.value === null) { - onChangeByCalcExpressionNull(); - return; - } - - // calculatedExpression value is a string or number - const newValueString = - typeof calcExpression.value === 'string' - ? calcExpression.value - : calcExpression.value.toString(); + // calculatedExpression value is null + if (calcExpression.value === null) { + onChangeByCalcExpressionNull(); + return; + } - onChangeByCalcExpressionString(newValueString); + // calculatedExpression value is a string or number + newValueString = + typeof calcExpression.value === 'string' + ? calcExpression.value + : calcExpression.value.toString(); + } } + onChangeByCalcExpressionString(newValueString, newCodings); }, // Only trigger this effect if calculatedExpression of item changes // eslint-disable-next-line react-hooks/exhaustive-deps - [calculatedExpressions] + [calculatedExpressions, answerExpression.version] ); return { calcExpUpdated: calcExpUpdated }; diff --git a/packages/smart-forms-renderer/src/hooks/useValueSetCodings.ts b/packages/smart-forms-renderer/src/hooks/useValueSetCodings.ts index 068427cd..6901b884 100644 --- a/packages/smart-forms-renderer/src/hooks/useValueSetCodings.ts +++ b/packages/smart-forms-renderer/src/hooks/useValueSetCodings.ts @@ -43,6 +43,7 @@ function useValueSetCodings( codings: Coding[]; isLoading: boolean; terminologyError: TerminologyError; + setCodings: (codings: Coding[]) => void; } { const patient = useSmartConfigStore.use.patient(); const user = useSmartConfigStore.use.user(); @@ -163,10 +164,6 @@ function useValueSetCodings( promise .then(async (valueSet: ValueSet) => { const codings = getValueSetCodings(valueSet); - if (qItem.linkId === 'scenario-3-associated-site') { - console.log('codings____'); - console.log(codings); - } addDisplayToCodingArray(codings, terminologyServerUrl) .then((codingsWithDisplay) => { @@ -196,18 +193,6 @@ function useValueSetCodings( } }, [qItem, dynamicValueSet?.version]); - // Instead of using dynamic answerValueSets, use answerExpressions - // useEffect(() => { - // const answerExpression = answerExpressions[qItem.linkId]; - // - // if (!answerExpression) { - // return; - // } - // - // console.log('answerExpression____'); - // console.log(answerExpression); - // }, [answerExpressions]); - // get options from answerValueSet on render useEffect(() => { const valueSetUrl = qItem.answerValueSet; @@ -239,6 +224,7 @@ function useValueSetCodings( return { codings, + setCodings, isLoading: loading, terminologyError: { error: serverError, answerValueSet: valueSetUrl ?? '' } }; diff --git a/packages/smart-forms-renderer/src/interfaces/answerExpression.interface.ts b/packages/smart-forms-renderer/src/interfaces/answerExpression.interface.ts index a0c74946..efe35f27 100644 --- a/packages/smart-forms-renderer/src/interfaces/answerExpression.interface.ts +++ b/packages/smart-forms-renderer/src/interfaces/answerExpression.interface.ts @@ -19,5 +19,6 @@ import type { QuestionnaireItemAnswerOption } from 'fhir/r4'; export interface AnswerExpression { expression: string; - value?: QuestionnaireItemAnswerOption; + version: number; + options?: QuestionnaireItemAnswerOption[]; } diff --git a/packages/smart-forms-renderer/src/stores/questionnaireStore.ts b/packages/smart-forms-renderer/src/stores/questionnaireStore.ts index dfc7d671..f616fe9e 100644 --- a/packages/smart-forms-renderer/src/stores/questionnaireStore.ts +++ b/packages/smart-forms-renderer/src/stores/questionnaireStore.ts @@ -134,7 +134,7 @@ export interface QuestionnaireStoreType { actionType: 'add' | 'remove' ) => void; toggleEnableWhenActivation: (isActivated: boolean) => void; - updateExpressions: (updatedResponse: QuestionnaireResponse) => void; + updateExpressions: (updatedResponse: QuestionnaireResponse) => Promise; addCodingToCache: (valueSetUrl: string, codings: Coding[]) => void; updatePopulatedProperties: ( populatedResponse: QuestionnaireResponse, @@ -335,6 +335,7 @@ export const questionnaireStore = createStore()((set, ge updatedResponseItemMap, enableWhenExpressions: get().enableWhenExpressions, calculatedExpressions: get().calculatedExpressions, + answerExpressions: get().answerExpressions, variablesFhirPath: get().variables.fhirPathVariables, dynamicValueSets: get().dynamicValueSets, existingFhirPathContext: get().fhirPathContext @@ -347,7 +348,7 @@ export const questionnaireStore = createStore()((set, ge dynamicValueSets: updatedDynamicValueSets, fhirPathContext: updatedFhirPathContext })); - return 0; + return; } set(() => ({ diff --git a/packages/smart-forms-renderer/src/utils/answerExpression.ts b/packages/smart-forms-renderer/src/utils/answerExpression.ts new file mode 100644 index 00000000..a948f103 --- /dev/null +++ b/packages/smart-forms-renderer/src/utils/answerExpression.ts @@ -0,0 +1,101 @@ +/* + * Copyright 2024 Commonwealth Scientific and Industrial Research + * Organisation (CSIRO) ABN 41 687 119 230. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * Copyright 2024 Commonwealth Scientific and Industrial Research + * Organisation (CSIRO) ABN 41 687 119 230. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AnswerExpression } from '../interfaces/answerExpression.interface'; +import fhirpath from 'fhirpath'; +import fhirpath_r4_model from 'fhirpath/fhir-context/r4'; +import _isEqual from 'lodash/isEqual'; +import { LookupResponse } from '@aehrc/sdc-populate/lib/SDCPopulateQuestionnaireOperation/api/lookupCodeSystem'; + +export function evaluateAnswerExpressions( + fhirPathContext: Record, + answerExpressions: Record +): { + answerExpsIsUpdated: boolean; + updatedAnswerExpressions: Record; +} { + const updatedAnswerExpressions: Record = { + ...answerExpressions + }; + + let isUpdated = false; + for (const linkId in answerExpressions) { + const answerExpression = answerExpressions[linkId]; + + try { + const result = fhirpath.evaluate( + {}, + answerExpression.expression, + fhirPathContext, + fhirpath_r4_model + ); + + // Update calculatedExpressions if length of result array > 0 + // Only update when current calcExpression value is different from the result, otherwise it will result in an infinite loop as per issue #733 + if (result.length > 0 && !_isEqual(answerExpression.options, result)) { + isUpdated = true; + answerExpression.options = result; + answerExpression.version = answerExpression.version + 1; + } + + // Update calculatedExpression value to null if no result is returned + if (result.length === 0 && answerExpression.options !== null) { + isUpdated = true; + answerExpression.options = []; + answerExpression.version = answerExpression.version + 1; + } + } catch (e) { + console.warn(e.message, `LinkId: ${linkId}\nExpression: ${answerExpression.options}`); + } + + console.log(answerExpression); + + updatedAnswerExpressions[linkId] = answerExpression; + } + + return { + answerExpsIsUpdated: isUpdated, + updatedAnswerExpressions: updatedAnswerExpressions + }; +} + +export function answerExpressionOptionsIsValid(response: any): response is LookupResponse { + return ( + response && + response.resourceType === 'Parameters' && + response.parameter && + response.parameter.find((p: any) => p.name === 'display') && + response.parameter.find((p: any) => p.name === 'display').valueString + ); +} diff --git a/packages/smart-forms-renderer/src/utils/dynamicValueSet.ts b/packages/smart-forms-renderer/src/utils/dynamicValueSet.ts index 0149c313..6d417393 100644 --- a/packages/smart-forms-renderer/src/utils/dynamicValueSet.ts +++ b/packages/smart-forms-renderer/src/utils/dynamicValueSet.ts @@ -63,9 +63,8 @@ export function evaluateDynamicValueSets( const evaluatedFhirPathEmbeddingsTuple = Object.entries( evaluatedFhirPathEmbeddingsMap - ).filter(([embedding, value]) => value != ''); + ).filter(([, value]) => value != ''); - // console.log(evaluatedFhirPathEmbeddingsTuple); for (const filter of include.filter) { evaluatedFhirPathEmbeddingsTuple.forEach(([embedding, value]) => { const filterValue = filter.value; @@ -108,7 +107,6 @@ function evaluateFhirPathEmbeddings( const result = fhirpath.evaluate({}, `%${embedding}`, fhirPathContext, fhirpath_r4_model)[0]; if (result !== undefined && result !== null) { - console.log(result); fhirPathEmbeddingsMap[embedding] = result; } } catch (e) { diff --git a/packages/smart-forms-renderer/src/utils/fhirpath.ts b/packages/smart-forms-renderer/src/utils/fhirpath.ts index 3f2ecbd7..55154312 100644 --- a/packages/smart-forms-renderer/src/utils/fhirpath.ts +++ b/packages/smart-forms-renderer/src/utils/fhirpath.ts @@ -26,12 +26,16 @@ import { DynamicValueSet } from '../interfaces/valueSet.interface'; import { evaluateDynamicValueSets } from './dynamicValueSet'; import { evaluateFhirpathAsync } from './fhirpathAsyncUtils/fhirpath-async'; import { DomainResource } from 'fhir/r4b'; +import { AnswerExpression } from '../interfaces/answerExpression.interface'; +import { evaluateAnswerExpressions } from './answerExpression'; +import cloneDeep from 'lodash.clonedeep'; interface EvaluateUpdatedExpressionsParams { updatedResponse: QuestionnaireResponse; updatedResponseItemMap: Record; calculatedExpressions: Record; enableWhenExpressions: EnableWhenExpressions; + answerExpressions: Record; variablesFhirPath: Record; dynamicValueSets: Record; existingFhirPathContext: Record; @@ -43,6 +47,7 @@ export async function evaluateUpdatedExpressions( isUpdated: boolean; updatedEnableWhenExpressions: EnableWhenExpressions; updatedCalculatedExpressions: Record; + updatedAnswerExpressions: Record; updatedDynamicValueSets: Record; updatedFhirPathContext: Record; }> { @@ -51,6 +56,7 @@ export async function evaluateUpdatedExpressions( updatedResponseItemMap, enableWhenExpressions, calculatedExpressions, + answerExpressions, variablesFhirPath, dynamicValueSets, existingFhirPathContext @@ -64,6 +70,7 @@ export async function evaluateUpdatedExpressions( isUpdated: false, updatedEnableWhenExpressions: enableWhenExpressions, updatedCalculatedExpressions: calculatedExpressions, + updatedAnswerExpressions: answerExpressions, updatedDynamicValueSets: dynamicValueSets, updatedFhirPathContext: existingFhirPathContext }; @@ -76,7 +83,7 @@ export async function evaluateUpdatedExpressions( existingFhirPathContext ); - console.log(updatedFhirPathContext); + console.log(cloneDeep(updatedFhirPathContext)); // Update enableWhenExpressions const { enableWhenExpsIsUpdated, updatedEnableWhenExpressions } = evaluateEnableWhenExpressions( @@ -90,18 +97,29 @@ export async function evaluateUpdatedExpressions( calculatedExpressions ); + // Update answerExpressions + const { answerExpsIsUpdated, updatedAnswerExpressions } = evaluateAnswerExpressions( + updatedFhirPathContext, + answerExpressions + ); + // Update dynamicValueSets const { dynamicValueSetsIsUpdated, updatedDynamicValueSets } = evaluateDynamicValueSets( updatedFhirPathContext, dynamicValueSets ); - const isUpdated = enableWhenExpsIsUpdated || calculatedExpsIsUpdated || dynamicValueSetsIsUpdated; + const isUpdated = + enableWhenExpsIsUpdated || + calculatedExpsIsUpdated || + answerExpsIsUpdated || + dynamicValueSetsIsUpdated; return { isUpdated, updatedEnableWhenExpressions, updatedCalculatedExpressions, + updatedAnswerExpressions, updatedDynamicValueSets, updatedFhirPathContext }; diff --git a/packages/smart-forms-renderer/src/utils/fhirpathAsyncUtils/fhirpath-async.ts b/packages/smart-forms-renderer/src/utils/fhirpathAsyncUtils/fhirpath-async.ts index ecc02fd1..1f14ca46 100644 --- a/packages/smart-forms-renderer/src/utils/fhirpathAsyncUtils/fhirpath-async.ts +++ b/packages/smart-forms-renderer/src/utils/fhirpathAsyncUtils/fhirpath-async.ts @@ -166,7 +166,7 @@ export async function evaluateFhirpathAsync( let iterations = 0; do { - context = { ...context, resource: fhirData, rootResource: fhirData }; + context = { ...context, resource: fhirData, rootResource: fhirData, terminologies: {} }; iterations++; // Perform the async calls required (none first time in) if (asyncCallsRequired.size > 0) { @@ -481,7 +481,6 @@ async function memberOfAsync( if (response) { const resultJson = await response.json(); - console.log(resultJson); const params = resultJson as Parameters; if (params && params.parameter) { const param = params.parameter.find((p) => p.name === 'result'); diff --git a/packages/smart-forms-renderer/src/utils/fhirpathAsyncUtils/outcome-utils.ts b/packages/smart-forms-renderer/src/utils/fhirpathAsyncUtils/outcome-utils.ts index c514cf2f..2d6b81f1 100644 --- a/packages/smart-forms-renderer/src/utils/fhirpathAsyncUtils/outcome-utils.ts +++ b/packages/smart-forms-renderer/src/utils/fhirpathAsyncUtils/outcome-utils.ts @@ -66,7 +66,6 @@ export function logMessage( data?: any ) { if (enabled) { - console.log(message, data); // and append it into the outcome issues var issue: OperationOutcomeIssue = { severity: 'information', diff --git a/packages/smart-forms-renderer/src/utils/questionnaireStoreUtils/extractOtherExtensions.ts b/packages/smart-forms-renderer/src/utils/questionnaireStoreUtils/extractOtherExtensions.ts index 960e0595..df26808d 100644 --- a/packages/smart-forms-renderer/src/utils/questionnaireStoreUtils/extractOtherExtensions.ts +++ b/packages/smart-forms-renderer/src/utils/questionnaireStoreUtils/extractOtherExtensions.ts @@ -222,7 +222,8 @@ function extractExtensionsFromItemRecursive( const answerExpression = getAnswerExpression(item); if (answerExpression) { answerExpressions[item.linkId] = { - expression: `${answerExpression.expression}` + expression: `${answerExpression.expression}`, + version: 0 }; }