fluent-cerner-js 1.1.0 → 1.1.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/dist/index.cjs +6 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +6 -8
- package/dist/index.js.map +1 -1
- package/package.json +20 -9
- package/src/getValidEncountersAsync.ts +1 -1
- package/src/launchClinicalNoteAsync.ts +5 -3
- package/src/openApplicationAsync.spec.ts +4 -4
- package/src/openApplicationAsync.ts +2 -3
- package/src/openOrganizerTabAsync.spec.ts +22 -28
- package/src/openPatientTabAsync.spec.ts +23 -29
- package/src/submitOrdersAsync.spec.ts +53 -67
- package/src/submitOrdersAsync.ts +5 -0
- package/src/submitPowerOrdersAsync.spec.ts +5 -1
- package/src/submitPowerOrdersAsync.ts +3 -6
- package/src/utils/addNewOrdersToScratchPadAsync.ts +1 -1
- package/src/utils/addPowerPlanWithDetailsAsync.ts +1 -1
- package/src/utils/calculateMOEWBitmask.ts +1 -1
- package/src/utils/getOrdersPlacedAsync.ts +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fluent-cerner-js",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
@@ -31,7 +31,10 @@
|
|
|
31
31
|
"test": "vitest run",
|
|
32
32
|
"test:watch": "vitest",
|
|
33
33
|
"lint": "eslint src",
|
|
34
|
-
"
|
|
34
|
+
"format": "prettier --write \"src/**/*.{ts,json}\"",
|
|
35
|
+
"format:check": "prettier --check \"src/**/*.{ts,json}\"",
|
|
36
|
+
"typecheck": "tsc --noEmit",
|
|
37
|
+
"prepare": "husky && npm run build",
|
|
35
38
|
"size": "size-limit",
|
|
36
39
|
"analyze": "size-limit --why",
|
|
37
40
|
"demo": "npx node demo.js"
|
|
@@ -42,6 +45,15 @@
|
|
|
42
45
|
"singleQuote": true,
|
|
43
46
|
"trailingComma": "es5"
|
|
44
47
|
},
|
|
48
|
+
"lint-staged": {
|
|
49
|
+
"src/**/*.ts": [
|
|
50
|
+
"eslint --fix",
|
|
51
|
+
"prettier --write"
|
|
52
|
+
],
|
|
53
|
+
"*.{json,md,yml,yaml}": [
|
|
54
|
+
"prettier --write"
|
|
55
|
+
]
|
|
56
|
+
},
|
|
45
57
|
"repository": {
|
|
46
58
|
"type": "git",
|
|
47
59
|
"url": "git+https://github.com/geekmdtravis/fluent-cerner-js.git"
|
|
@@ -53,23 +65,22 @@
|
|
|
53
65
|
"devDependencies": {
|
|
54
66
|
"@typescript-eslint/eslint-plugin": "8.57.0",
|
|
55
67
|
"@typescript-eslint/parser": "8.57.0",
|
|
68
|
+
"@vitest/coverage-v8": "^4.1.6",
|
|
56
69
|
"eslint": "10.0.3",
|
|
70
|
+
"husky": "9.1.7",
|
|
57
71
|
"jsdom": "^25.0.0",
|
|
72
|
+
"lint-staged": "17.0.4",
|
|
73
|
+
"prettier": "3.8.3",
|
|
58
74
|
"tslib": "^2.8.0",
|
|
59
75
|
"tsup": "^8.3.0",
|
|
60
76
|
"typescript": "^5.7.0",
|
|
61
|
-
"vitest": "^
|
|
77
|
+
"vitest": "^4.1.6"
|
|
62
78
|
},
|
|
63
79
|
"dependencies": {
|
|
64
80
|
"fast-xml-parser": "^5.5.6"
|
|
65
81
|
},
|
|
66
82
|
"peerDependencies": {
|
|
67
|
-
"easy-ccl-request": "^1.1.
|
|
68
|
-
},
|
|
69
|
-
"overrides": {
|
|
70
|
-
"vite": {
|
|
71
|
-
"esbuild": "^0.25.0"
|
|
72
|
-
}
|
|
83
|
+
"easy-ccl-request": "^1.1.1"
|
|
73
84
|
},
|
|
74
85
|
"jest": {
|
|
75
86
|
"verbose": true,
|
|
@@ -22,7 +22,7 @@ export async function getValidEncountersAsync(
|
|
|
22
22
|
const response = await dcof.GetValidEncounters(personId);
|
|
23
23
|
const eidStr = response.trim();
|
|
24
24
|
if (eidStr === '') return retData;
|
|
25
|
-
eidStr.split(',').forEach(e => {
|
|
25
|
+
eidStr.split(',').forEach((e) => {
|
|
26
26
|
const eid = parseFloat(e);
|
|
27
27
|
if (isNaN(eid)) {
|
|
28
28
|
console.warn(
|
|
@@ -75,8 +75,10 @@ export const launchClinicalNoteAsync = async (
|
|
|
75
75
|
|
|
76
76
|
params.push(`[${eventIds.join('|')}]`);
|
|
77
77
|
params.push(
|
|
78
|
-
`${
|
|
79
|
-
|
|
78
|
+
`${
|
|
79
|
+
windowTitle ||
|
|
80
|
+
`Clinical Note for patient with PID ${patientId} on encounter with EID ${encounterId}`
|
|
81
|
+
}`
|
|
80
82
|
);
|
|
81
83
|
params.push(`${calculateViewOptionFlag(_viewOptsFlags)}`);
|
|
82
84
|
params.push(`${viewName || ''}`);
|
|
@@ -101,7 +103,7 @@ export const launchClinicalNoteAsync = async (
|
|
|
101
103
|
|
|
102
104
|
function calculateViewOptionFlag(viewOptionFlags: Array<ViewOption>): number {
|
|
103
105
|
let total = 0;
|
|
104
|
-
viewOptionFlags.forEach(flag => {
|
|
106
|
+
viewOptionFlags.forEach((flag) => {
|
|
105
107
|
if (flag === 'menu') total += 1;
|
|
106
108
|
if (flag === 'buttons') total += 2;
|
|
107
109
|
if (flag === 'toolbar') total += 4;
|
|
@@ -75,7 +75,7 @@ describe('generateOpenApplicationArgumentString', () => {
|
|
|
75
75
|
];
|
|
76
76
|
|
|
77
77
|
const argString = generateOpenApplicationArgumentString(args);
|
|
78
|
-
expect(argString).toBe('/PERSONID=1 /ENCNTRID=123 /FIRSTTAB=^
|
|
78
|
+
expect(argString).toBe('/PERSONID=1 /ENCNTRID=123 /FIRSTTAB=^Orders^');
|
|
79
79
|
});
|
|
80
80
|
it('Generates a correct argument string with quick open', () => {
|
|
81
81
|
const args: Array<OpenApplicationArgument> = [
|
|
@@ -95,7 +95,7 @@ describe('generateOpenApplicationArgumentString', () => {
|
|
|
95
95
|
];
|
|
96
96
|
|
|
97
97
|
const argString = generateOpenApplicationArgumentString(args);
|
|
98
|
-
expect(argString).toBe('/PERSONID=1 /ENCNTRID=123 /FIRSTTAB=^
|
|
98
|
+
expect(argString).toBe('/PERSONID=1 /ENCNTRID=123 /FIRSTTAB=^Orders+^');
|
|
99
99
|
});
|
|
100
100
|
it('Tabs string is surrounded by ^', () => {
|
|
101
101
|
const args: Array<OpenApplicationArgument> = [
|
|
@@ -106,7 +106,7 @@ describe('generateOpenApplicationArgumentString', () => {
|
|
|
106
106
|
];
|
|
107
107
|
|
|
108
108
|
const argString = generateOpenApplicationArgumentString(args);
|
|
109
|
-
expect(argString).toBe('/FIRSTTAB=^
|
|
109
|
+
expect(argString).toBe('/FIRSTTAB=^Orders^');
|
|
110
110
|
});
|
|
111
111
|
it('Non-tab string is not surrounded by ^', () => {
|
|
112
112
|
const args: Array<OpenApplicationArgument> = [
|
|
@@ -117,6 +117,6 @@ describe('generateOpenApplicationArgumentString', () => {
|
|
|
117
117
|
];
|
|
118
118
|
|
|
119
119
|
const argString = generateOpenApplicationArgumentString(args);
|
|
120
|
-
expect(argString).toBe('/POWERCHART.EXE=
|
|
120
|
+
expect(argString).toBe('/POWERCHART.EXE=Random');
|
|
121
121
|
});
|
|
122
122
|
});
|
|
@@ -98,10 +98,9 @@ export function generateOpenApplicationArgumentString(
|
|
|
98
98
|
const quickOpenStr = quickOpen && isTab && !isOrgLevel ? '+' : '';
|
|
99
99
|
const surroundStr = isTab ? '^' : '';
|
|
100
100
|
|
|
101
|
-
return `/${arg}=${surroundStr}${value}${quickOpenStr}${surroundStr}`;
|
|
101
|
+
return `/${arg.toUpperCase()}=${surroundStr}${value}${quickOpenStr}${surroundStr}`;
|
|
102
102
|
})
|
|
103
|
-
.join(' ')
|
|
104
|
-
.toUpperCase();
|
|
103
|
+
.join(' ');
|
|
105
104
|
}
|
|
106
105
|
|
|
107
106
|
const modeMap = new Map<OpenApplicationMode, 0 | 1 | 100>();
|
|
@@ -13,20 +13,18 @@ describe('openOrganizerTab', () => {
|
|
|
13
13
|
});
|
|
14
14
|
test('returns an appropriately formatted eventString', async () => {
|
|
15
15
|
const { eventString } = await openOrganizerTabAsync('Tab Name');
|
|
16
|
-
expect(eventString).toBe(`/ORGANIZERTAB=^
|
|
16
|
+
expect(eventString).toBe(`/ORGANIZERTAB=^Tab Name^`);
|
|
17
17
|
});
|
|
18
18
|
test('badInput returns false if response is anything other than null', async () => {
|
|
19
19
|
Object.defineProperty(window, 'APPLINK', {
|
|
20
20
|
writable: true,
|
|
21
|
-
value: jest
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
return new Promise(resolve => resolve(''));
|
|
29
|
-
}),
|
|
21
|
+
value: jest.fn().mockImplementation(async function (
|
|
22
|
+
a: string,
|
|
23
|
+
b: string
|
|
24
|
+
): Promise<null | ''> {
|
|
25
|
+
console.debug(`a: ${a}, b: ${b}`);
|
|
26
|
+
return new Promise((resolve) => resolve(''));
|
|
27
|
+
}),
|
|
30
28
|
});
|
|
31
29
|
|
|
32
30
|
const { badInput } = await openOrganizerTabAsync('Tab Name');
|
|
@@ -35,15 +33,13 @@ describe('openOrganizerTab', () => {
|
|
|
35
33
|
test('badInput returns true if response is null', async () => {
|
|
36
34
|
Object.defineProperty(window, 'APPLINK', {
|
|
37
35
|
writable: true,
|
|
38
|
-
value: jest
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
return new Promise(resolve => resolve(null));
|
|
46
|
-
}),
|
|
36
|
+
value: jest.fn().mockImplementation(async function (
|
|
37
|
+
a: string,
|
|
38
|
+
b: string
|
|
39
|
+
): Promise<null | ''> {
|
|
40
|
+
console.debug(`a: ${a}, b: ${b}`);
|
|
41
|
+
return new Promise((resolve) => resolve(null));
|
|
42
|
+
}),
|
|
47
43
|
});
|
|
48
44
|
|
|
49
45
|
const { badInput } = await openOrganizerTabAsync('Tab Name');
|
|
@@ -52,15 +48,13 @@ describe('openOrganizerTab', () => {
|
|
|
52
48
|
test('throws an error when the error type is not one expected to be generated as an "out-of-powerchart" error.', async () => {
|
|
53
49
|
Object.defineProperty(window, 'APPLINK', {
|
|
54
50
|
writable: true,
|
|
55
|
-
value: jest
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
throw new Error('unexpected error');
|
|
63
|
-
}),
|
|
51
|
+
value: jest.fn().mockImplementation(async function (
|
|
52
|
+
a: string,
|
|
53
|
+
b: string
|
|
54
|
+
): Promise<Error> {
|
|
55
|
+
console.debug(`a: ${a}, b: ${b}`);
|
|
56
|
+
throw new Error('unexpected error');
|
|
57
|
+
}),
|
|
64
58
|
});
|
|
65
59
|
|
|
66
60
|
await expect(openOrganizerTabAsync('Tab Name')).rejects.toThrow(Error);
|
|
@@ -14,24 +14,22 @@ describe('openPatientTab', () => {
|
|
|
14
14
|
});
|
|
15
15
|
test('returns an appropriately formatted eventString without quickadd', async () => {
|
|
16
16
|
const { eventString } = await openPatientTabAsync(0, 1, 'Tab Name');
|
|
17
|
-
expect(eventString).toBe(`/PERSONID=0 /ENCNTRID=1 /FIRSTTAB=^
|
|
17
|
+
expect(eventString).toBe(`/PERSONID=0 /ENCNTRID=1 /FIRSTTAB=^Tab Name^`);
|
|
18
18
|
});
|
|
19
19
|
test('returns an appropriately formatted eventString with quickadd', async () => {
|
|
20
20
|
const { eventString } = await openPatientTabAsync(0, 1, 'Tab Name', true);
|
|
21
|
-
expect(eventString).toBe(`/PERSONID=0 /ENCNTRID=1 /FIRSTTAB=^
|
|
21
|
+
expect(eventString).toBe(`/PERSONID=0 /ENCNTRID=1 /FIRSTTAB=^Tab Name+^`);
|
|
22
22
|
});
|
|
23
23
|
test('badInput returns false if response is anything other than null', async () => {
|
|
24
24
|
Object.defineProperty(window, 'APPLINK', {
|
|
25
25
|
writable: true,
|
|
26
|
-
value: jest
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
return new Promise(resolve => resolve(''));
|
|
34
|
-
}),
|
|
26
|
+
value: jest.fn().mockImplementation(async function (
|
|
27
|
+
a: string,
|
|
28
|
+
b: string
|
|
29
|
+
): Promise<null | ''> {
|
|
30
|
+
console.debug(`a: ${a}, b: ${b}`);
|
|
31
|
+
return new Promise((resolve) => resolve(''));
|
|
32
|
+
}),
|
|
35
33
|
});
|
|
36
34
|
|
|
37
35
|
const { badInput } = await openPatientTabAsync(0, 1, 'Tab Name');
|
|
@@ -40,15 +38,13 @@ describe('openPatientTab', () => {
|
|
|
40
38
|
test('badInput returns true if response is null', async () => {
|
|
41
39
|
Object.defineProperty(window, 'APPLINK', {
|
|
42
40
|
writable: true,
|
|
43
|
-
value: jest
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
return new Promise(resolve => resolve(null));
|
|
51
|
-
}),
|
|
41
|
+
value: jest.fn().mockImplementation(async function (
|
|
42
|
+
a: string,
|
|
43
|
+
b: string
|
|
44
|
+
): Promise<null | ''> {
|
|
45
|
+
console.debug(`a: ${a}, b: ${b}`);
|
|
46
|
+
return new Promise((resolve) => resolve(null));
|
|
47
|
+
}),
|
|
52
48
|
});
|
|
53
49
|
|
|
54
50
|
const { badInput } = await openPatientTabAsync(0, 1, 'Tab Name');
|
|
@@ -58,15 +54,13 @@ describe('openPatientTab', () => {
|
|
|
58
54
|
Object.defineProperty(window, 'external', {
|
|
59
55
|
writable: true,
|
|
60
56
|
value: {
|
|
61
|
-
APPLINK: jest
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
return Promise.reject(new Error('unexpected error'));
|
|
69
|
-
}),
|
|
57
|
+
APPLINK: jest.fn().mockImplementation(async function (
|
|
58
|
+
a: string,
|
|
59
|
+
b: string
|
|
60
|
+
): Promise<Error> {
|
|
61
|
+
console.debug(`a: ${a}, b: ${b}`);
|
|
62
|
+
return Promise.reject(new Error('unexpected error'));
|
|
63
|
+
}),
|
|
70
64
|
},
|
|
71
65
|
});
|
|
72
66
|
|
|
@@ -152,15 +152,13 @@ describe('submitOrders', () => {
|
|
|
152
152
|
Object.defineProperty(window, 'external', {
|
|
153
153
|
writable: true,
|
|
154
154
|
value: {
|
|
155
|
-
MPAGES_EVENT: jest
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
return new Promise(resolve =>
|
|
163
|
-
resolve(`<?xml version="1.0"?>
|
|
155
|
+
MPAGES_EVENT: jest.fn().mockImplementation(async function (
|
|
156
|
+
a: string,
|
|
157
|
+
b: string
|
|
158
|
+
): Promise<string> {
|
|
159
|
+
console.debug(`a: ${a}, b: ${b}`);
|
|
160
|
+
return new Promise((resolve) =>
|
|
161
|
+
resolve(`<?xml version="1.0"?>
|
|
164
162
|
<?xml-stylesheet type='text/xml' href='dom.xsl'?>
|
|
165
163
|
<Orders>
|
|
166
164
|
<OrderVersion>1</OrderVersion>
|
|
@@ -176,8 +174,8 @@ describe('submitOrders', () => {
|
|
|
176
174
|
<ClinDisplayLine type="string">0.4 mg, Oral, Cap, Daily, Administration Type NA, Automatic Refill, Order Duration: 30 day, First Dose: 07/23/23 07:00 PDT, Stop Date: 08/22/23 06:59 PDT, 07/23/23 07:00 PDT</ClinDisplayLine>
|
|
177
175
|
</Order>
|
|
178
176
|
</Orders>`)
|
|
179
|
-
|
|
180
|
-
|
|
177
|
+
);
|
|
178
|
+
}),
|
|
181
179
|
},
|
|
182
180
|
});
|
|
183
181
|
|
|
@@ -203,15 +201,13 @@ describe('submitOrders', () => {
|
|
|
203
201
|
Object.defineProperty(window, 'external', {
|
|
204
202
|
writable: true,
|
|
205
203
|
value: {
|
|
206
|
-
MPAGES_EVENT: jest
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
return new Promise(resolve =>
|
|
214
|
-
resolve(`<?xml version="1.0"?>
|
|
204
|
+
MPAGES_EVENT: jest.fn().mockImplementation(async function (
|
|
205
|
+
a: string,
|
|
206
|
+
b: string
|
|
207
|
+
): Promise<string> {
|
|
208
|
+
console.debug(`a: ${a}, b: ${b}`);
|
|
209
|
+
return new Promise((resolve) =>
|
|
210
|
+
resolve(`<?xml version="1.0"?>
|
|
215
211
|
<?xml-stylesheet type='text/xml' href='dom.xsl'?>
|
|
216
212
|
<Orders>
|
|
217
213
|
<OrderVersion>1</OrderVersion>
|
|
@@ -238,8 +234,8 @@ describe('submitOrders', () => {
|
|
|
238
234
|
<ClinDisplayLine type="string">0.4 mg, Oral, Cap, Daily, Administration Type NA, Automatic Refill, Order Duration: 30 day, First Dose: 07/23/23 07:00 PDT, Stop Date: 08/22/23 06:59 PDT, 07/23/23 07:00 PDT</ClinDisplayLine>
|
|
239
235
|
</Order>
|
|
240
236
|
</Orders>`)
|
|
241
|
-
|
|
242
|
-
|
|
237
|
+
);
|
|
238
|
+
}),
|
|
243
239
|
},
|
|
244
240
|
});
|
|
245
241
|
|
|
@@ -276,15 +272,13 @@ describe('submitOrders', () => {
|
|
|
276
272
|
Object.defineProperty(window, 'external', {
|
|
277
273
|
writable: true,
|
|
278
274
|
value: {
|
|
279
|
-
MPAGE_EVENT: jest
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
return new Promise(resolve => resolve({}));
|
|
287
|
-
}),
|
|
275
|
+
MPAGE_EVENT: jest.fn().mockImplementation(async function (
|
|
276
|
+
a: string,
|
|
277
|
+
b: string
|
|
278
|
+
): Promise<object> {
|
|
279
|
+
console.debug(`a: ${a}, b: ${b}`);
|
|
280
|
+
return new Promise((resolve) => resolve({}));
|
|
281
|
+
}),
|
|
288
282
|
},
|
|
289
283
|
});
|
|
290
284
|
const { status } = await submitOrdersAsync(1, 2, [order]);
|
|
@@ -295,15 +289,13 @@ describe('submitOrders', () => {
|
|
|
295
289
|
Object.defineProperty(window, 'external', {
|
|
296
290
|
writable: true,
|
|
297
291
|
value: {
|
|
298
|
-
MPAGES_EVENT: jest
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
return new Promise(resolve => resolve(''));
|
|
306
|
-
}),
|
|
292
|
+
MPAGES_EVENT: jest.fn().mockImplementation(async function (
|
|
293
|
+
a: string,
|
|
294
|
+
b: string
|
|
295
|
+
): Promise<string> {
|
|
296
|
+
console.debug(`a: ${a}, b: ${b}`);
|
|
297
|
+
return new Promise((resolve) => resolve(''));
|
|
298
|
+
}),
|
|
307
299
|
},
|
|
308
300
|
});
|
|
309
301
|
const { status } = await submitOrdersAsync(1, 2, [order]);
|
|
@@ -314,15 +306,13 @@ describe('submitOrders', () => {
|
|
|
314
306
|
Object.defineProperty(window, 'external', {
|
|
315
307
|
writable: true,
|
|
316
308
|
value: {
|
|
317
|
-
MPAGES_EVENT: jest
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
)
|
|
323
|
-
|
|
324
|
-
return new Promise(resolve => resolve('<xml>'));
|
|
325
|
-
}),
|
|
309
|
+
MPAGES_EVENT: jest.fn().mockImplementation(async function (
|
|
310
|
+
a: string,
|
|
311
|
+
b: string
|
|
312
|
+
): Promise<string> {
|
|
313
|
+
console.debug(`a: ${a}, b: ${b}`);
|
|
314
|
+
return new Promise((resolve) => resolve('<xml>'));
|
|
315
|
+
}),
|
|
326
316
|
},
|
|
327
317
|
});
|
|
328
318
|
const { status } = await submitOrdersAsync(1, 2, [order]);
|
|
@@ -333,15 +323,13 @@ describe('submitOrders', () => {
|
|
|
333
323
|
Object.defineProperty(window, 'external', {
|
|
334
324
|
writable: true,
|
|
335
325
|
value: {
|
|
336
|
-
MPAGES_EVENT: jest
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
)
|
|
342
|
-
|
|
343
|
-
return new Promise(resolve => resolve(null));
|
|
344
|
-
}),
|
|
326
|
+
MPAGES_EVENT: jest.fn().mockImplementation(async function (
|
|
327
|
+
a: string,
|
|
328
|
+
b: string
|
|
329
|
+
): Promise<null> {
|
|
330
|
+
console.debug(`a: ${a}, b: ${b}`);
|
|
331
|
+
return new Promise((resolve) => resolve(null));
|
|
332
|
+
}),
|
|
345
333
|
},
|
|
346
334
|
});
|
|
347
335
|
const { status } = await submitOrdersAsync(1, 2, [order]);
|
|
@@ -352,15 +340,13 @@ describe('submitOrders', () => {
|
|
|
352
340
|
test('throws an error when the error type is not one expected to be generated as an "out-of-powerchart" error.', async () => {
|
|
353
341
|
Object.defineProperty(window.external, 'MPAGES_EVENT', {
|
|
354
342
|
writable: true,
|
|
355
|
-
value: jest
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
return Promise.reject(new Error('unexpected error'));
|
|
363
|
-
}),
|
|
343
|
+
value: jest.fn().mockImplementation(async function (
|
|
344
|
+
a: string,
|
|
345
|
+
b: string
|
|
346
|
+
): Promise<Error> {
|
|
347
|
+
console.debug(`a: ${a}, b: ${b}`);
|
|
348
|
+
return Promise.reject(new Error('unexpected error'));
|
|
349
|
+
}),
|
|
364
350
|
});
|
|
365
351
|
|
|
366
352
|
try {
|
package/src/submitOrdersAsync.ts
CHANGED
|
@@ -98,6 +98,7 @@ export type SubmitOrderAsyncReturn = MPageEventReturn & {
|
|
|
98
98
|
status: SubmitOrdersAsyncStatus;
|
|
99
99
|
response: MpagesEventOrdersReturnXML | null;
|
|
100
100
|
ordersPlaced: Array<{ name: string; oid: number; display: string }> | null;
|
|
101
|
+
rawResponse: string | null;
|
|
101
102
|
};
|
|
102
103
|
|
|
103
104
|
export type Order = {
|
|
@@ -156,6 +157,7 @@ export const submitOrdersAsync = async (
|
|
|
156
157
|
status: 'success',
|
|
157
158
|
response: null,
|
|
158
159
|
ordersPlaced: null,
|
|
160
|
+
rawResponse: null,
|
|
159
161
|
};
|
|
160
162
|
|
|
161
163
|
if (dryRun) {
|
|
@@ -169,6 +171,9 @@ export const submitOrdersAsync = async (
|
|
|
169
171
|
eventString
|
|
170
172
|
)) as string;
|
|
171
173
|
|
|
174
|
+
// Store the raw response on the return value for debugging purposes.
|
|
175
|
+
retVal.rawResponse = response;
|
|
176
|
+
|
|
172
177
|
// 'null' must be checked for explicitly, as it is a valid response
|
|
173
178
|
// '!response' will return true for null, undefined, and empty string.
|
|
174
179
|
if (response === null) {
|
|
@@ -72,7 +72,11 @@ describe('submitPowerOrders()', () => {
|
|
|
72
72
|
},
|
|
73
73
|
];
|
|
74
74
|
try {
|
|
75
|
-
await submitPowerOrdersAsync(
|
|
75
|
+
await submitPowerOrdersAsync(
|
|
76
|
+
1,
|
|
77
|
+
1,
|
|
78
|
+
orderArray as unknown as Parameters<typeof submitPowerOrdersAsync>[2]
|
|
79
|
+
);
|
|
76
80
|
} catch (e) {
|
|
77
81
|
expect(e).toBeInstanceOf(SyntaxError);
|
|
78
82
|
expect(e as SyntaxError).toHaveProperty(
|
|
@@ -127,11 +127,8 @@ export const submitPowerOrdersAsync = async (
|
|
|
127
127
|
|
|
128
128
|
// Get required bitmask values for later use in the CreateMOEW function
|
|
129
129
|
// TODO: determine if this should be moved, and maybe simply integrated directly into the CreateMOEW function
|
|
130
|
-
const {
|
|
131
|
-
|
|
132
|
-
dwTabFlag,
|
|
133
|
-
dwTabDisplayOptionsFlag,
|
|
134
|
-
} = calculateMOEWBitmask(targetTab || 'orders tab', moewFlags);
|
|
130
|
+
const { dwCustomizeFlag, dwTabFlag, dwTabDisplayOptionsFlag } =
|
|
131
|
+
calculateMOEWBitmask(targetTab || 'orders tab', moewFlags);
|
|
135
132
|
|
|
136
133
|
let retData: SubmitPowerOrdersReturn = {
|
|
137
134
|
inPowerChart: true,
|
|
@@ -148,7 +145,7 @@ export const submitPowerOrdersAsync = async (
|
|
|
148
145
|
let powerPlanOrders: Array<PowerPlanOrder> = [];
|
|
149
146
|
let standaloneOrders: Array<StandaloneOrder> = [];
|
|
150
147
|
|
|
151
|
-
orders.forEach(order => {
|
|
148
|
+
orders.forEach((order) => {
|
|
152
149
|
if (isPowerPlanOrder(order)) {
|
|
153
150
|
powerPlanOrders.push(order as PowerPlanOrder);
|
|
154
151
|
} else if (isStandaloneOrder(order)) {
|
|
@@ -39,7 +39,7 @@ export async function addNewOrdersToScratchpadAsync(
|
|
|
39
39
|
// Convert the standalone orders provided into the required XML string
|
|
40
40
|
let standaloneOrdersXML: string = '';
|
|
41
41
|
|
|
42
|
-
standaloneOrders.forEach(standaloneOrder => {
|
|
42
|
+
standaloneOrders.forEach((standaloneOrder) => {
|
|
43
43
|
standaloneOrdersXML += `<Order><EOrderOriginationFlag>${
|
|
44
44
|
standaloneOrder.origination === 'inpatient order' ? 0 : 1
|
|
45
45
|
}</EOrderOriginationFlag><SynonymId>${standaloneOrder.synonymId}</SynonymId>
|
|
@@ -50,7 +50,7 @@ export async function addPowerPlanWithDetailsAsync(
|
|
|
50
50
|
}</PersonalizedPlanId><Diagnoses>
|
|
51
51
|
${
|
|
52
52
|
dids
|
|
53
|
-
? dids.map(diagnosisSynonymID => {
|
|
53
|
+
? dids.map((diagnosisSynonymID) => {
|
|
54
54
|
return '<DiagnosisId>' + diagnosisSynonymID + '</DiagnosisId>';
|
|
55
55
|
})
|
|
56
56
|
: ''
|
|
@@ -95,7 +95,7 @@ export const calculateMOEWBitmask = (
|
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
// Calculate the other two parameters (dwCustomizeFlag and dwTabDisplayOptionsFlag) that are also ultimately needed for CreateMOEW()
|
|
98
|
-
cernerFlags.forEach(option => {
|
|
98
|
+
cernerFlags.forEach((option) => {
|
|
99
99
|
switch (option) {
|
|
100
100
|
// Calculate the dwCustomizeFlagParamater
|
|
101
101
|
case 'sign later':
|
|
@@ -48,7 +48,7 @@ export async function getOrdersPlacedAsync(
|
|
|
48
48
|
if (!(parsed.Orders.Order instanceof Array)) {
|
|
49
49
|
parsed.Orders.Order = [parsed.Orders.Order];
|
|
50
50
|
}
|
|
51
|
-
retData.ordersPlaced = parsed.Orders.Order.map(o => ({
|
|
51
|
+
retData.ordersPlaced = parsed.Orders.Order.map((o) => ({
|
|
52
52
|
name: o.OrderedAsMnemonic,
|
|
53
53
|
oid: o.OrderId,
|
|
54
54
|
display: o.ClinDisplayLine,
|