Skip to content

Commit e5448c7

Browse files
committed
extend support for printable elements
1 parent 00c3022 commit e5448c7

5 files changed

Lines changed: 156 additions & 39 deletions

File tree

src/converter/__tests__/resources/questionnaire_fce/printable_header.json

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,24 @@
44
"meta": {
55
"profile": ["https://emr-core.beda.software/StructureDefinition/fhir-emr-questionnaire"]
66
},
7-
"printableHeader": {
8-
"contentType": "application/pdf",
9-
"data": "base64-encoded-pdf-data",
10-
"url": "https://example.com/printable-header.pdf"
11-
},
7+
"printableHeader": [
8+
{
9+
"valueAttachment": {
10+
"contentType": "application/pdf",
11+
"data": "base64-encoded-pdf-data",
12+
"url": "https://example.com/printable-header.pdf"
13+
}
14+
},
15+
{
16+
"valueExpression": {
17+
"language": "text/fhirpath",
18+
"expression": "%Patient.name.given[0] + ' ' + %Patient.name.family"
19+
}
20+
},
21+
{
22+
"valueString": "Patient Name"
23+
}
24+
],
1225
"item": [
1326
{
1427
"linkId": "title",

src/converter/__tests__/resources/questionnaire_fhir/printable_header.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,17 @@
1212
"data": "base64-encoded-pdf-data",
1313
"url": "https://example.com/printable-header.pdf"
1414
}
15+
},
16+
{
17+
"url": "https://emr-core.beda.software/StructureDefinition/printable-header",
18+
"valueExpression": {
19+
"language": "text/fhirpath",
20+
"expression": "%Patient.name.given[0] + ' ' + %Patient.name.family"
21+
}
22+
},
23+
{
24+
"url": "https://emr-core.beda.software/StructureDefinition/printable-header",
25+
"valueString": "Patient Name"
1526
}
1627
],
1728
"item": [

src/converter/fceToFhir/questionnaire/processExtensions.ts

Lines changed: 57 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,20 @@
1-
import { FCEQuestionnaire } from '../../../fce.types';
1+
import { FCEPrintableElement, FCEQuestionnaire } from '../../../fce.types';
22
import { Extension as FHIRExtension, Questionnaire as FHIRQuestionnaire } from 'fhir/r4b';
33

4+
function processPrintableElements(url: string, elements: FCEPrintableElement[]): FHIRExtension[] {
5+
return elements.map((element) => {
6+
if ('valueAttachment' in element) {
7+
return { url, valueAttachment: element.valueAttachment };
8+
}
9+
10+
if ('valueExpression' in element) {
11+
return { url, valueExpression: element.valueExpression };
12+
}
13+
14+
return { url, valueString: (element as { valueString: string }).valueString };
15+
});
16+
}
17+
418
export function processExtensions(questionnaire: FCEQuestionnaire): FHIRQuestionnaire {
519
const {
620
launchContext,
@@ -11,8 +25,11 @@ export function processExtensions(questionnaire: FCEQuestionnaire): FHIRQuestion
1125
assembleContext,
1226
itemPopulationContext,
1327
variable,
28+
printableCover,
1429
printableHeader,
30+
printableHeaderFirstPage,
1531
printableFooter,
32+
printableFooterLastPage,
1633
...fhirQuestionnaire
1734
} = questionnaire;
1835

@@ -119,18 +136,49 @@ export function processExtensions(questionnaire: FCEQuestionnaire): FHIRQuestion
119136
);
120137
}
121138

139+
if (printableCover) {
140+
extensions = extensions.concat(
141+
processPrintableElements(
142+
'https://emr-core.beda.software/StructureDefinition/printable-cover',
143+
printableCover,
144+
),
145+
);
146+
}
147+
122148
if (printableHeader) {
123-
extensions.push({
124-
url: 'https://emr-core.beda.software/StructureDefinition/printable-header',
125-
valueAttachment: printableHeader,
126-
});
149+
extensions = extensions.concat(
150+
processPrintableElements(
151+
'https://emr-core.beda.software/StructureDefinition/printable-header',
152+
printableHeader,
153+
),
154+
);
155+
}
156+
157+
if (printableHeaderFirstPage) {
158+
extensions = extensions.concat(
159+
processPrintableElements(
160+
'https://emr-core.beda.software/StructureDefinition/printable-header-first-page',
161+
printableHeaderFirstPage,
162+
),
163+
);
127164
}
128165

129166
if (printableFooter) {
130-
extensions.push({
131-
url: 'https://emr-core.beda.software/StructureDefinition/printable-footer',
132-
valueAttachment: printableFooter,
133-
});
167+
extensions = extensions.concat(
168+
processPrintableElements(
169+
'https://emr-core.beda.software/StructureDefinition/printable-footer',
170+
printableFooter,
171+
),
172+
);
173+
}
174+
175+
if (printableFooterLastPage) {
176+
extensions = extensions.concat(
177+
processPrintableElements(
178+
'https://emr-core.beda.software/StructureDefinition/printable-footer-last-page',
179+
printableFooterLastPage,
180+
),
181+
);
134182
}
135183

136184
if (extensions.length) {

src/converter/fhirToFce/questionnaire/processExtensions.ts

Lines changed: 48 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { Questionnaire as FHIRQuestionnaire, Expression as FHIRExpression, Attachment } from 'fhir/r4b';
1+
import { Questionnaire as FHIRQuestionnaire, Expression as FHIRExpression } from 'fhir/r4b';
2+
import { FCEPrintableElement } from '../../../fce.types';
23

34
export function processExtensions(fhirQuestionnaire: FHIRQuestionnaire): {
45
launchContext?: any[];
@@ -9,8 +10,11 @@ export function processExtensions(fhirQuestionnaire: FHIRQuestionnaire): {
910
assembleContext?: string[];
1011
itemPopulationContext?: FHIRExpression;
1112
variable?: FHIRExpression[];
12-
printableHeader?: Attachment;
13-
printableFooter?: Attachment;
13+
printableCover?: FCEPrintableElement[];
14+
printableHeader?: FCEPrintableElement[];
15+
printableHeaderFirstPage?: FCEPrintableElement[];
16+
printableFooter?: FCEPrintableElement[];
17+
printableFooterLastPage?: FCEPrintableElement[];
1418
} {
1519
const launchContext = processLaunchContext(fhirQuestionnaire);
1620
const mapping = processMapping(fhirQuestionnaire);
@@ -20,8 +24,26 @@ export function processExtensions(fhirQuestionnaire: FHIRQuestionnaire): {
2024
const assembleContext = processAssembleContext(fhirQuestionnaire);
2125
const itemPopulationContext = processItemPopulationContext(fhirQuestionnaire);
2226
const variable = processVariable(fhirQuestionnaire);
23-
const printableHeader = processPrintableHeader(fhirQuestionnaire);
24-
const printableFooter = processPrintableFooter(fhirQuestionnaire);
27+
const printableCover = processPrintableElements(
28+
fhirQuestionnaire,
29+
'https://emr-core.beda.software/StructureDefinition/printable-cover',
30+
);
31+
const printableHeader = processPrintableElements(
32+
fhirQuestionnaire,
33+
'https://emr-core.beda.software/StructureDefinition/printable-header',
34+
);
35+
const printableHeaderFirstPage = processPrintableElements(
36+
fhirQuestionnaire,
37+
'https://emr-core.beda.software/StructureDefinition/printable-header-first-page',
38+
);
39+
const printableFooter = processPrintableElements(
40+
fhirQuestionnaire,
41+
'https://emr-core.beda.software/StructureDefinition/printable-footer',
42+
);
43+
const printableFooterLastPage = processPrintableElements(
44+
fhirQuestionnaire,
45+
'https://emr-core.beda.software/StructureDefinition/printable-footer-last-page',
46+
);
2547

2648
return {
2749
launchContext: launchContext?.length ? launchContext : undefined,
@@ -32,8 +54,11 @@ export function processExtensions(fhirQuestionnaire: FHIRQuestionnaire): {
3254
assembleContext: assembleContext.length ? assembleContext : undefined,
3355
itemPopulationContext: itemPopulationContext ? itemPopulationContext : undefined,
3456
variable: variable?.length ? variable : undefined,
35-
printableHeader: printableHeader ? printableHeader : undefined,
36-
printableFooter: printableFooter ? printableFooter : undefined,
57+
printableCover: printableCover?.length ? printableCover : undefined,
58+
printableHeader: printableHeader?.length ? printableHeader : undefined,
59+
printableHeaderFirstPage: printableHeaderFirstPage?.length ? printableHeaderFirstPage : undefined,
60+
printableFooter: printableFooter?.length ? printableFooter : undefined,
61+
printableFooterLastPage: printableFooterLastPage?.length ? printableFooterLastPage : undefined,
3762
};
3863
}
3964

@@ -163,26 +188,26 @@ function processVariable(fhirQuestionnaire: FHIRQuestionnaire): FHIRExpression[]
163188
return extensions.map((ext) => ext.valueExpression!);
164189
}
165190

166-
function processPrintableHeader(fhirQuestionnaire: FHIRQuestionnaire): Attachment | undefined {
167-
const extension = fhirQuestionnaire.extension?.find(
168-
(ext) => ext.url === 'https://emr-core.beda.software/StructureDefinition/printable-header',
169-
);
170-
171-
if (!extension) {
191+
function processPrintableElements(
192+
fhirQuestionnaire: FHIRQuestionnaire,
193+
extensionUrl: string,
194+
): FCEPrintableElement[] | undefined {
195+
const extensions = fhirQuestionnaire.extension?.filter((ext) => ext.url === extensionUrl);
196+
if (!extensions?.length) {
172197
return undefined;
173198
}
174199

175-
return extension.valueAttachment;
176-
}
177-
178-
function processPrintableFooter(fhirQuestionnaire: FHIRQuestionnaire): Attachment | undefined {
179-
const extension = fhirQuestionnaire.extension?.find(
180-
(ext) => ext.url === 'https://emr-core.beda.software/StructureDefinition/printable-footer',
181-
);
200+
const elements: FCEPrintableElement[] = [];
182201

183-
if (!extension) {
184-
return undefined;
202+
for (const ext of extensions) {
203+
if (ext.valueAttachment) {
204+
elements.push({ valueAttachment: ext.valueAttachment });
205+
} else if (ext.valueExpression) {
206+
elements.push({ valueExpression: ext.valueExpression });
207+
} else if (ext.valueString !== undefined) {
208+
elements.push({ valueString: ext.valueString });
209+
}
185210
}
186211

187-
return extension.valueAttachment;
212+
return elements.length ? elements : undefined;
188213
}

src/fce.types.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,16 @@ export interface FCEQuestionnaire extends Questionnaire {
3232
/** NOTE: from extension http://hl7.org/fhir/StructureDefinition/variable */
3333
/** Variable specifying a logic to generate a variable for use in subsequent logic. The name of the variable will be added to FHIRPath's context when processing descendants of the element that contains this extension. */
3434
variable?: Expression[];
35+
/** NOTE: from extension https://emr-core.beda.software/StructureDefinition/printable-cover */
36+
printableCover?: FCEPrintableElement[];
3537
/** NOTE: from extension https://emr-core.beda.software/StructureDefinition/printable-header */
36-
printableHeader?: Attachment;
38+
printableHeader?: FCEPrintableElement[];
39+
/** NOTE: from extension https://emr-core.beda.software/StructureDefinition/printable-header-first-page */
40+
printableHeaderFirstPage?: FCEPrintableElement[];
3741
/** NOTE: from extension https://emr-core.beda.software/StructureDefinition/printable-footer */
38-
printableFooter?: Attachment;
42+
printableFooter?: FCEPrintableElement[];
43+
/** NOTE: from extension https://emr-core.beda.software/StructureDefinition/printable-footer-last-page */
44+
printableFooterLastPage?: FCEPrintableElement[];
3945
/** NOTE: from extension http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-targetStructureMap */
4046
targetStructureMap?: string[];
4147
}
@@ -216,3 +222,17 @@ export interface FCEQuestionnaireMappingReference {
216222
export interface FCEQuestionnaireMappingExpression {
217223
valueExpression: Expression;
218224
}
225+
226+
export interface FCEPrintableAttachmentElement {
227+
valueAttachment: Attachment;
228+
}
229+
export interface FCEPrintableExpressionElement {
230+
valueExpression: Expression;
231+
}
232+
export interface FCEPrintableStringElement {
233+
valueString: string;
234+
}
235+
export type FCEPrintableElement =
236+
| FCEPrintableAttachmentElement
237+
| FCEPrintableExpressionElement
238+
| FCEPrintableStringElement;

0 commit comments

Comments
 (0)