Skip to content

Commit

Permalink
Add FCEToFHIR converter for only extensions Refs #97
Browse files Browse the repository at this point in the history
  • Loading branch information
ruscoder committed Jan 31, 2025
1 parent 74f27c4 commit 4d7e39a
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 11 deletions.
15 changes: 15 additions & 0 deletions sdc-qrf/src/converter/fceToFhir/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,18 @@ export function fromFirstClassExtension(
return convertQuestionnaireResponse(fceResource);
}
}

export function fromFirstClassExtensionV2(
fceQuestionnaireResponse: FCEQuestionnaireResponse,
): FHIRQuestionnaireResponse;
export function fromFirstClassExtensionV2(fceQuestionnaire: FCEQuestionnaire): FHIRQuestionnaire;
export function fromFirstClassExtensionV2(
fceResource: FCEQuestionnaire | FCEQuestionnaireResponse,
): FHIRQuestionnaireResponse | FHIRQuestionnaire {
switch (fceResource.resourceType) {
case 'Questionnaire':
return convertQuestionnaire(fceResource, true);
case 'QuestionnaireResponse':
return convertQuestionnaireResponse(fceResource);
}
}
13 changes: 10 additions & 3 deletions sdc-qrf/src/converter/fceToFhir/questionnaire/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,16 @@ import { processExtensions } from './processExtensions';
import { processItems } from './processItems';
import { processMeta } from './processMeta';

export function convertQuestionnaire(questionnaire: FCEQuestionnaire): FHIRQuestionnaire {
export function convertQuestionnaire(
questionnaire: FCEQuestionnaire,
onlyExtensions = false,
): FHIRQuestionnaire {
questionnaire = cloneDeep(questionnaire);
questionnaire.meta = questionnaire.meta ? processMeta(questionnaire.meta) : questionnaire.meta;
questionnaire.item = processItems(questionnaire.item ?? []);
if (!onlyExtensions) {
questionnaire.meta = questionnaire.meta
? processMeta(questionnaire.meta)
: questionnaire.meta;
}
questionnaire.item = processItems(questionnaire.item ?? [], onlyExtensions);
return processExtensions(questionnaire) as FHIRQuestionnaire;
}
17 changes: 12 additions & 5 deletions sdc-qrf/src/converter/fceToFhir/questionnaire/processItems.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,10 @@ import {

import { convertFromFHIRExtension, convertToFHIRExtension, toFHIRReference } from '../..';

export function processItems(items: FCEQuestionnaireItem[]): FHIRQuestionnaireItem[] {
export function processItems(
items: FCEQuestionnaireItem[],
onlyExtensions = false,
): FHIRQuestionnaireItem[] {
return items.map((item) => {
const extensions = convertToFHIRExtension(item);
if (extensions.length > 0) {
Expand Down Expand Up @@ -61,23 +64,27 @@ export function processItems(items: FCEQuestionnaireItem[]): FHIRQuestionnaireIt
}

if (answerOption !== undefined) {
fhirItem.answerOption = processAnswerOption(answerOption);
fhirItem.answerOption = onlyExtensions
? answerOption
: processAnswerOption(answerOption);
}

if (enableBehavior !== undefined) {
fhirItem.enableBehavior = enableBehavior as FHIRQuestionnaireItem['enableBehavior'];
}

if (enableWhen !== undefined) {
fhirItem.enableWhen = processEnableWhen(enableWhen);
fhirItem.enableWhen = onlyExtensions
? (enableWhen as FHIRQuestionnaireItemEnableWhen[])
: processEnableWhen(enableWhen);
}

if (initial) {
fhirItem.initial = processInitial(initial);
fhirItem.initial = onlyExtensions ? initial : processInitial(initial);
}

if (nestedItems) {
fhirItem.item = processItems(nestedItems);
fhirItem.item = processItems(nestedItems, onlyExtensions);
}

return fhirItem;
Expand Down
3 changes: 2 additions & 1 deletion sdc-qrf/src/converter/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import {
} from 'shared/src/contrib/aidbox';

import { ExtensionIdentifier, extensionTransformers } from './extensions';
import { fromFirstClassExtension } from './fceToFhir';
import { fromFirstClassExtension, fromFirstClassExtensionV2 } from './fceToFhir';
import { toFirstClassExtension, toFirstClassExtensionV2 } from './fhirToFce';
import { processLaunchContext as processLaunchContextToFce } from './fhirToFce/questionnaire/processExtensions';
export * from './utils';
Expand Down Expand Up @@ -114,5 +114,6 @@ export {
toFirstClassExtension,
toFirstClassExtensionV2,
fromFirstClassExtension,
fromFirstClassExtensionV2,
processLaunchContextToFce,
};
4 changes: 2 additions & 2 deletions web/src/containers/Main/QuestionnaireEditor/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import { toast } from 'react-toastify';
import { YAMLException } from 'js-yaml';
import { RemoteResourceSelect } from 'web/src/components/ResourceSelect';
import { sortKeys } from 'web/src/utils/sort-keys';
import { fromFirstClassExtension, toFirstClassExtensionV2 } from 'sdc-qrf/src/converter';
import { fromFirstClassExtensionV2, toFirstClassExtensionV2 } from 'sdc-qrf/src/converter';

interface Props {
onSave: (resource: Questionnaire) => Promise<RemoteDataResult<any>>;
Expand Down Expand Up @@ -156,7 +156,7 @@ export function QuestionnaireEditor(props: Props) {

if (updatedResource) {
const response = await onSave(
fromFirstClassExtension(updatedResource),
fromFirstClassExtensionV2(updatedResource),
);

if (isSuccess(response)) {
Expand Down

0 comments on commit 4d7e39a

Please sign in to comment.