@medplum/react 0.10.2 → 1.0.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/dist/cjs/AttachmentButton.d.ts +2 -0
- package/dist/cjs/CalendarInput.d.ts +0 -1
- package/dist/cjs/CheckboxFormSection.d.ts +0 -1
- package/dist/cjs/DescriptionList.d.ts +0 -1
- package/dist/cjs/DiagnosticReportDisplay.d.ts +0 -1
- package/dist/cjs/Document.d.ts +0 -1
- package/dist/cjs/FhirPathTable.d.ts +0 -1
- package/dist/cjs/FormSection.d.ts +0 -1
- package/dist/cjs/MedplumLink.d.ts +2 -4
- package/dist/cjs/QuestionnaireBuilder.d.ts +0 -1
- package/dist/cjs/QuestionnaireForm.d.ts +0 -1
- package/dist/cjs/RequestGroupDisplay.d.ts +0 -1
- package/dist/cjs/ResourceBadge.d.ts +0 -1
- package/dist/cjs/ResourceBlame.d.ts +0 -1
- package/dist/cjs/ResourceDiff.d.ts +0 -1
- package/dist/cjs/ResourceDiffTable.d.ts +0 -2
- package/dist/cjs/ResourceName.d.ts +2 -1
- package/dist/cjs/ResourceTimeline.d.ts +0 -1
- package/dist/cjs/Scheduler.d.ts +0 -1
- package/dist/cjs/SearchControl.d.ts +0 -1
- package/dist/cjs/SearchFilterEditor.d.ts +0 -1
- package/dist/cjs/Timeline.d.ts +0 -1
- package/dist/cjs/auth/AuthenticationForm.d.ts +1 -0
- package/dist/cjs/auth/RegisterForm.d.ts +0 -1
- package/dist/cjs/auth/SignInForm.d.ts +1 -1
- package/dist/cjs/index.js +1247 -907
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/index.min.js +1 -1
- package/dist/cjs/index.min.js.map +1 -1
- package/dist/cjs/stories/DescriptionList.stories.d.ts +5 -0
- package/dist/esm/AttachmentArrayInput.js +2 -2
- package/dist/esm/AttachmentArrayInput.js.map +1 -1
- package/dist/esm/AttachmentButton.d.ts +2 -0
- package/dist/esm/AttachmentButton.js +4 -1
- package/dist/esm/AttachmentButton.js.map +1 -1
- package/dist/esm/BackboneElementInput.js +2 -1
- package/dist/esm/BackboneElementInput.js.map +1 -1
- package/dist/esm/CalendarInput.d.ts +0 -1
- package/dist/esm/CalendarInput.js +39 -2
- package/dist/esm/CalendarInput.js.map +1 -1
- package/dist/esm/CheckboxFormSection.d.ts +0 -1
- package/dist/esm/CheckboxFormSection.js +5 -5
- package/dist/esm/CheckboxFormSection.js.map +1 -1
- package/dist/esm/DescriptionList.d.ts +0 -1
- package/dist/esm/DescriptionList.js +23 -1
- package/dist/esm/DescriptionList.js.map +1 -1
- package/dist/esm/DiagnosticReportDisplay.d.ts +0 -1
- package/dist/esm/DiagnosticReportDisplay.js +40 -22
- package/dist/esm/DiagnosticReportDisplay.js.map +1 -1
- package/dist/esm/Document.d.ts +0 -1
- package/dist/esm/Document.js +7 -2
- package/dist/esm/Document.js.map +1 -1
- package/dist/esm/ErrorBoundary.js +2 -1
- package/dist/esm/ErrorBoundary.js.map +1 -1
- package/dist/esm/FhirPathTable.d.ts +0 -1
- package/dist/esm/FhirPathTable.js +5 -5
- package/dist/esm/FhirPathTable.js.map +1 -1
- package/dist/esm/FormSection.d.ts +0 -1
- package/dist/esm/FormSection.js +3 -11
- package/dist/esm/FormSection.js.map +1 -1
- package/dist/esm/MedplumLink.d.ts +2 -4
- package/dist/esm/MedplumLink.js +11 -8
- package/dist/esm/MedplumLink.js.map +1 -1
- package/dist/esm/PlanDefinitionBuilder.js +41 -10
- package/dist/esm/PlanDefinitionBuilder.js.map +1 -1
- package/dist/esm/QuestionnaireBuilder.d.ts +0 -1
- package/dist/esm/QuestionnaireBuilder.js +78 -31
- package/dist/esm/QuestionnaireBuilder.js.map +1 -1
- package/dist/esm/QuestionnaireForm.d.ts +0 -1
- package/dist/esm/QuestionnaireForm.js +26 -16
- package/dist/esm/QuestionnaireForm.js.map +1 -1
- package/dist/esm/RequestGroupDisplay.d.ts +0 -1
- package/dist/esm/RequestGroupDisplay.js +8 -7
- package/dist/esm/RequestGroupDisplay.js.map +1 -1
- package/dist/esm/ResourceBadge.d.ts +0 -1
- package/dist/esm/ResourceBadge.js +2 -1
- package/dist/esm/ResourceBadge.js.map +1 -1
- package/dist/esm/ResourceBlame.d.ts +0 -1
- package/dist/esm/ResourceBlame.js +59 -10
- package/dist/esm/ResourceBlame.js.map +1 -1
- package/dist/esm/ResourceDiff.d.ts +0 -1
- package/dist/esm/ResourceDiff.js +13 -2
- package/dist/esm/ResourceDiff.js.map +1 -1
- package/dist/esm/ResourceDiffTable.d.ts +0 -2
- package/dist/esm/ResourceDiffTable.js +25 -3
- package/dist/esm/ResourceDiffTable.js.map +1 -1
- package/dist/esm/ResourceForm.js +6 -5
- package/dist/esm/ResourceForm.js.map +1 -1
- package/dist/esm/ResourceInput.js +22 -1
- package/dist/esm/ResourceInput.js.map +1 -1
- package/dist/esm/ResourceName.d.ts +2 -1
- package/dist/esm/ResourceName.js +5 -2
- package/dist/esm/ResourceName.js.map +1 -1
- package/dist/esm/ResourcePropertyDisplay.js +6 -6
- package/dist/esm/ResourcePropertyDisplay.js.map +1 -1
- package/dist/esm/ResourceTimeline.d.ts +0 -1
- package/dist/esm/ResourceTimeline.js +78 -25
- package/dist/esm/ResourceTimeline.js.map +1 -1
- package/dist/esm/Scheduler.d.ts +0 -1
- package/dist/esm/Scheduler.js +20 -4
- package/dist/esm/Scheduler.js.map +1 -1
- package/dist/esm/SearchControl.d.ts +0 -1
- package/dist/esm/SearchControl.js +33 -18
- package/dist/esm/SearchControl.js.map +1 -1
- package/dist/esm/SearchFilterEditor.d.ts +0 -1
- package/dist/esm/SearchFilterEditor.js +2 -2
- package/dist/esm/SearchFilterEditor.js.map +1 -1
- package/dist/esm/Timeline.d.ts +0 -1
- package/dist/esm/Timeline.js +13 -16
- package/dist/esm/Timeline.js.map +1 -1
- package/dist/esm/auth/AuthenticationForm.d.ts +1 -0
- package/dist/esm/auth/AuthenticationForm.js +6 -3
- package/dist/esm/auth/AuthenticationForm.js.map +1 -1
- package/dist/esm/auth/ChooseProfileForm.js +3 -3
- package/dist/esm/auth/ChooseProfileForm.js.map +1 -1
- package/dist/esm/auth/NewProjectForm.js +3 -3
- package/dist/esm/auth/NewProjectForm.js.map +1 -1
- package/dist/esm/auth/NewUserForm.js +4 -3
- package/dist/esm/auth/NewUserForm.js.map +1 -1
- package/dist/esm/auth/RegisterForm.d.ts +0 -1
- package/dist/esm/auth/RegisterForm.js.map +1 -1
- package/dist/esm/auth/SignInForm.d.ts +1 -1
- package/dist/esm/auth/SignInForm.js +1 -1
- package/dist/esm/auth/SignInForm.js.map +1 -1
- package/dist/esm/index.min.js +1 -1
- package/dist/esm/index.min.js.map +1 -1
- package/dist/esm/stories/DescriptionList.stories.d.ts +5 -0
- package/package.json +35 -24
- package/rollup.config.mjs +111 -0
- package/dist/cjs/defaulttheme.css +0 -192
- package/dist/cjs/styles.css +0 -528
- package/dist/esm/defaulttheme.css +0 -192
- package/dist/esm/styles.css +0 -528
package/dist/cjs/index.js
CHANGED
|
@@ -1,19 +1,15 @@
|
|
|
1
1
|
(function (global, factory) {
|
|
2
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@medplum/core'), require('react'), require('@mantine/core'), require('@tabler/icons'), require('react-router-dom')) :
|
|
3
|
-
typeof define === 'function' && define.amd ? define(['exports', '@medplum/core', 'react', '@mantine/core', '@tabler/icons', 'react-router-dom'], factory) :
|
|
4
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.medplum = global.medplum || {}, global.medplum.
|
|
5
|
-
})(this, (function (exports, core, React, core$1, icons, reactRouterDom) { 'use strict';
|
|
6
|
-
|
|
7
|
-
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
8
|
-
|
|
9
|
-
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
2
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@medplum/core'), require('react'), require('@mantine/core'), require('@tabler/icons'), require('react-router-dom'), require('@mantine/notifications')) :
|
|
3
|
+
typeof define === 'function' && define.amd ? define(['exports', '@medplum/core', 'react', '@mantine/core', '@tabler/icons', 'react-router-dom', '@mantine/notifications'], factory) :
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.medplum = global.medplum || {}, global.medplum.react = {}), global.medplum.core, global.React, global.mantine.core, global.tabler.icons, global.ReactRouterDOM, global.mantine.notifications));
|
|
5
|
+
})(this, (function (exports, core, React, core$1, icons, reactRouterDom, notifications) { 'use strict';
|
|
10
6
|
|
|
11
7
|
function AddressDisplay(props) {
|
|
12
8
|
const address = props.value;
|
|
13
9
|
if (!address) {
|
|
14
10
|
return null;
|
|
15
11
|
}
|
|
16
|
-
return
|
|
12
|
+
return React.createElement(React.Fragment, null, core.formatAddress(address));
|
|
17
13
|
}
|
|
18
14
|
|
|
19
15
|
function getLine(address, index) {
|
|
@@ -58,14 +54,14 @@
|
|
|
58
54
|
function setPostalCode(postalCode) {
|
|
59
55
|
setValueWrapper(Object.assign(Object.assign({}, valueRef.current), { postalCode }));
|
|
60
56
|
}
|
|
61
|
-
return (
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
57
|
+
return (React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
|
|
58
|
+
React.createElement(core$1.NativeSelect, { "data-testid": "address-use", defaultValue: value === null || value === void 0 ? void 0 : value.use, onChange: (e) => setUse(e.currentTarget.value), data: ['', 'home', 'work', 'temp', 'old', 'billing'] }),
|
|
59
|
+
React.createElement(core$1.NativeSelect, { "data-testid": "address-type", defaultValue: value === null || value === void 0 ? void 0 : value.type, onChange: (e) => setType(e.currentTarget.value), data: ['', 'postal', 'physical', 'both'] }),
|
|
60
|
+
React.createElement(core$1.TextInput, { placeholder: "Line 1", defaultValue: getLine(value, 0), onChange: (e) => setLine1(e.currentTarget.value) }),
|
|
61
|
+
React.createElement(core$1.TextInput, { placeholder: "Line 2", defaultValue: getLine(value, 1), onChange: (e) => setLine2(e.currentTarget.value) }),
|
|
62
|
+
React.createElement(core$1.TextInput, { placeholder: "City", defaultValue: value.city, onChange: (e) => setCity(e.currentTarget.value) }),
|
|
63
|
+
React.createElement(core$1.TextInput, { placeholder: "State", defaultValue: value.state, onChange: (e) => setState(e.currentTarget.value) }),
|
|
64
|
+
React.createElement(core$1.TextInput, { placeholder: "Postal Code", defaultValue: value.postalCode, onChange: (e) => setPostalCode(e.currentTarget.value) })));
|
|
69
65
|
}
|
|
70
66
|
|
|
71
67
|
function AttachmentDisplay(props) {
|
|
@@ -74,20 +70,20 @@
|
|
|
74
70
|
if (!url) {
|
|
75
71
|
return null;
|
|
76
72
|
}
|
|
77
|
-
return (
|
|
78
|
-
(contentType === null || contentType === void 0 ? void 0 : contentType.startsWith('image/')) && (
|
|
79
|
-
(contentType === null || contentType === void 0 ? void 0 : contentType.startsWith('video/')) && (
|
|
80
|
-
|
|
81
|
-
contentType === 'application/pdf' && !(title === null || title === void 0 ? void 0 : title.endsWith('.pdf')) && (
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
73
|
+
return (React.createElement("div", { "data-testid": "attachment-display" },
|
|
74
|
+
(contentType === null || contentType === void 0 ? void 0 : contentType.startsWith('image/')) && (React.createElement("img", { "data-testid": "attachment-image", style: { maxWidth: props.maxWidth }, src: url, alt: value === null || value === void 0 ? void 0 : value.title })),
|
|
75
|
+
(contentType === null || contentType === void 0 ? void 0 : contentType.startsWith('video/')) && (React.createElement("video", { "data-testid": "attachment-video", style: { maxWidth: props.maxWidth }, controls: true },
|
|
76
|
+
React.createElement("source", { type: contentType, src: url }))),
|
|
77
|
+
contentType === 'application/pdf' && !(title === null || title === void 0 ? void 0 : title.endsWith('.pdf')) && (React.createElement("div", { "data-testid": "attachment-pdf", style: { maxWidth: props.maxWidth, minHeight: 400 } },
|
|
78
|
+
React.createElement("iframe", { width: "100%", height: "400", src: url + '#navpanes=0', allowFullScreen: true, frameBorder: 0, seamless: true }))),
|
|
79
|
+
React.createElement("div", { "data-testid": "download-link", style: { padding: '2px 16px 16px 16px' } },
|
|
80
|
+
React.createElement("a", { href: value === null || value === void 0 ? void 0 : value.url, "data-testid": "attachment-details", target: "_blank", rel: "noopener noreferrer" }, (value === null || value === void 0 ? void 0 : value.title) || 'Download'))));
|
|
85
81
|
}
|
|
86
82
|
|
|
87
83
|
function AttachmentArrayDisplay(props) {
|
|
88
|
-
return (
|
|
89
|
-
props.values.map((v, index) => (
|
|
90
|
-
|
|
84
|
+
return (React.createElement("div", null, props.values &&
|
|
85
|
+
props.values.map((v, index) => (React.createElement("div", { key: 'attatchment-' + index },
|
|
86
|
+
React.createElement(AttachmentDisplay, { value: v, maxWidth: props.maxWidth }))))));
|
|
91
87
|
}
|
|
92
88
|
|
|
93
89
|
const reactContext = React.createContext(undefined);
|
|
@@ -112,7 +108,7 @@
|
|
|
112
108
|
return () => medplum.removeEventListeneer('change', eventListener);
|
|
113
109
|
}, [medplum, state]);
|
|
114
110
|
const medplumContext = Object.assign(Object.assign({}, state), { medplum });
|
|
115
|
-
return
|
|
111
|
+
return React.createElement(reactContext.Provider, { value: medplumContext }, props.children);
|
|
116
112
|
}
|
|
117
113
|
/**
|
|
118
114
|
* Returns the MedplumContext instance.
|
|
@@ -196,10 +192,13 @@
|
|
|
196
192
|
if (!fileName) {
|
|
197
193
|
return;
|
|
198
194
|
}
|
|
195
|
+
if (props.onUploadStart) {
|
|
196
|
+
props.onUploadStart();
|
|
197
|
+
}
|
|
199
198
|
const filename = file.name;
|
|
200
199
|
const contentType = file.type || 'application/octet-stream';
|
|
201
200
|
medplum
|
|
202
|
-
.createBinary(file, filename, contentType)
|
|
201
|
+
.createBinary(file, filename, contentType, props.onUploadProgress)
|
|
203
202
|
.then((binary) => {
|
|
204
203
|
props.onUpload({
|
|
205
204
|
contentType: binary.contentType,
|
|
@@ -212,8 +211,8 @@
|
|
|
212
211
|
alert((_c = (_b = (_a = outcome === null || outcome === void 0 ? void 0 : outcome.issue) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.details) === null || _c === void 0 ? void 0 : _c.text);
|
|
213
212
|
});
|
|
214
213
|
}
|
|
215
|
-
return (
|
|
216
|
-
|
|
214
|
+
return (React.createElement(React.Fragment, null,
|
|
215
|
+
React.createElement("input", { type: "file", "data-testid": "upload-file-input", style: { display: 'none' }, ref: fileInputRef, onChange: (e) => onFileChange(e) }),
|
|
217
216
|
props.children({ onClick })));
|
|
218
217
|
}
|
|
219
218
|
|
|
@@ -228,29 +227,29 @@
|
|
|
228
227
|
props.onChange(newValues);
|
|
229
228
|
}
|
|
230
229
|
}
|
|
231
|
-
return (
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
values.map((v, index) => (
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
230
|
+
return (React.createElement("table", { style: { width: '100%' } },
|
|
231
|
+
React.createElement("colgroup", null,
|
|
232
|
+
React.createElement("col", { width: "97%" }),
|
|
233
|
+
React.createElement("col", { width: "3%" })),
|
|
234
|
+
React.createElement("tbody", null,
|
|
235
|
+
values.map((v, index) => (React.createElement("tr", { key: `${index}-${values.length}` },
|
|
236
|
+
React.createElement("td", null,
|
|
237
|
+
React.createElement(AttachmentDisplay, { value: v, maxWidth: 200 })),
|
|
238
|
+
React.createElement("td", null,
|
|
239
|
+
React.createElement(core$1.ActionIcon, { title: "Remove", size: "sm", onClick: (e) => {
|
|
241
240
|
killEvent(e);
|
|
242
241
|
const copy = values.slice();
|
|
243
242
|
copy.splice(index, 1);
|
|
244
243
|
setValuesWrapper(copy);
|
|
245
244
|
} },
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
245
|
+
React.createElement(icons.IconCircleMinus, null)))))),
|
|
246
|
+
React.createElement("tr", null,
|
|
247
|
+
React.createElement("td", null),
|
|
248
|
+
React.createElement("td", null,
|
|
249
|
+
React.createElement(AttachmentButton, { onUpload: (attachment) => {
|
|
251
250
|
setValuesWrapper([...valuesRef.current, attachment]);
|
|
252
|
-
} }, (props) => (
|
|
253
|
-
|
|
251
|
+
} }, (props) => (React.createElement(core$1.ActionIcon, Object.assign({}, props, { title: "Add", size: "sm", color: "green" }),
|
|
252
|
+
React.createElement(icons.IconCloudUpload, { size: 16 })))))))));
|
|
254
253
|
}
|
|
255
254
|
|
|
256
255
|
function AttachmentInput(props) {
|
|
@@ -262,19 +261,23 @@
|
|
|
262
261
|
}
|
|
263
262
|
}
|
|
264
263
|
if (value) {
|
|
265
|
-
return (
|
|
266
|
-
|
|
267
|
-
|
|
264
|
+
return (React.createElement(React.Fragment, null,
|
|
265
|
+
React.createElement(AttachmentDisplay, { value: value, maxWidth: 200 }),
|
|
266
|
+
React.createElement(core$1.Button, { onClick: (e) => {
|
|
268
267
|
killEvent(e);
|
|
269
268
|
setValueWrapper(undefined);
|
|
270
269
|
} }, "Remove")));
|
|
271
270
|
}
|
|
272
|
-
return (
|
|
271
|
+
return (React.createElement(AttachmentButton, { onUpload: setValueWrapper }, (props) => React.createElement(core$1.Button, Object.assign({}, props), "Upload...")));
|
|
273
272
|
}
|
|
274
273
|
|
|
275
274
|
function Document(props) {
|
|
276
|
-
|
|
277
|
-
|
|
275
|
+
let style = undefined;
|
|
276
|
+
if (props.width) {
|
|
277
|
+
style = { maxWidth: props.width };
|
|
278
|
+
}
|
|
279
|
+
return (React.createElement(core$1.Container, null,
|
|
280
|
+
React.createElement(core$1.Paper, { style: style, mx: "auto", my: "lg", p: "lg", shadow: "xs", radius: "sm", withBorder: true }, props.children)));
|
|
278
281
|
}
|
|
279
282
|
|
|
280
283
|
/******************************************************************************
|
|
@@ -362,7 +365,7 @@
|
|
|
362
365
|
}
|
|
363
366
|
|
|
364
367
|
function Form(props) {
|
|
365
|
-
return (
|
|
368
|
+
return (React.createElement("form", { style: props.style, "data-testid": props.testid, onSubmit: (e) => {
|
|
366
369
|
e.preventDefault();
|
|
367
370
|
const formData = parseForm(e.target);
|
|
368
371
|
if (props.onSubmit) {
|
|
@@ -372,13 +375,13 @@
|
|
|
372
375
|
}
|
|
373
376
|
|
|
374
377
|
function Logo(props) {
|
|
375
|
-
return (
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
378
|
+
return (React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 491 491", style: { width: props.size, height: props.size } },
|
|
379
|
+
React.createElement("title", null, "Medplum Logo"),
|
|
380
|
+
React.createElement("path", { fill: props.fill || '#ad7136', d: "M282 67c6-16 16-29 29-40L289 0c-22 17-37 41-43 68l17 23 19-24z" }),
|
|
381
|
+
React.createElement("path", { fill: props.fill || '#946af9', d: "M311 63c-17 0-33 4-48 11-16-7-32-11-49-11-87 0-158 96-158 214s71 214 158 214c17 0 33-4 49-11 15 7 31 11 48 11 87 0 158-96 158-214S398 63 311 63z" }),
|
|
382
|
+
React.createElement("path", { fill: props.fill || '#7857c5', d: "M231 489l-17 2c-87 0-158-96-158-214S127 63 214 63l17 1c-39 12-70 102-70 213s31 201 70 212z" }),
|
|
383
|
+
React.createElement("path", { fill: props.fill || '#40bc26', d: "M207 220a176 176 0 01-177 43A176 176 0 01251 43l1 5c17 59 2 125-45 172z" }),
|
|
384
|
+
React.createElement("path", { fill: props.fill || '#33961e', d: "M252 48A421 421 0 0057 270l-27-7A176 176 0 01251 43l1 5z" })));
|
|
382
385
|
}
|
|
383
386
|
|
|
384
387
|
function getErrorsForInput(outcome, expression) {
|
|
@@ -411,7 +414,7 @@
|
|
|
411
414
|
function NewProjectForm(props) {
|
|
412
415
|
const medplum = useMedplum();
|
|
413
416
|
const [outcome, setOutcome] = React.useState();
|
|
414
|
-
return (
|
|
417
|
+
return (React.createElement(Form, { style: { maxWidth: 400 }, onSubmit: (formData) => __awaiter(this, void 0, void 0, function* () {
|
|
415
418
|
try {
|
|
416
419
|
props.handleAuthResponse(yield medplum.startNewProject({
|
|
417
420
|
login: props.login,
|
|
@@ -422,19 +425,19 @@
|
|
|
422
425
|
setOutcome(err);
|
|
423
426
|
}
|
|
424
427
|
}) },
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
428
|
+
React.createElement(core$1.Center, { sx: { flexDirection: 'column' } },
|
|
429
|
+
React.createElement(Logo, { size: 32 }),
|
|
430
|
+
React.createElement(core$1.Title, null, "Create project")),
|
|
431
|
+
React.createElement(core$1.Stack, { spacing: "xl" },
|
|
432
|
+
React.createElement(core$1.TextInput, { name: "projectName", label: "Project Name", placeholder: "My Project", required: true, autoFocus: true, error: getErrorsForInput(outcome, 'firstName') }),
|
|
433
|
+
React.createElement(core$1.Text, { color: "dimmed", size: "xs" },
|
|
431
434
|
"By clicking submit you agree to the Medplum ",
|
|
432
|
-
|
|
435
|
+
React.createElement("a", { href: "https://www.medplum.com/privacy" }, "Privacy\u00A0Policy"),
|
|
433
436
|
' and ',
|
|
434
|
-
|
|
437
|
+
React.createElement("a", { href: "https://www.medplum.com/terms" }, "Terms\u00A0of\u00A0Service"),
|
|
435
438
|
".")),
|
|
436
|
-
|
|
437
|
-
|
|
439
|
+
React.createElement(core$1.Group, { position: "right", mt: "xl", noWrap: true },
|
|
440
|
+
React.createElement(core$1.Button, { type: "submit" }, "Create project"))));
|
|
438
441
|
}
|
|
439
442
|
|
|
440
443
|
/**
|
|
@@ -477,7 +480,7 @@
|
|
|
477
480
|
if (!googleClientId) {
|
|
478
481
|
return null;
|
|
479
482
|
}
|
|
480
|
-
return
|
|
483
|
+
return React.createElement("div", { ref: parentRef });
|
|
481
484
|
}
|
|
482
485
|
function getGoogleClientId(clientId) {
|
|
483
486
|
var _a, _b;
|
|
@@ -527,7 +530,7 @@
|
|
|
527
530
|
const [outcome, setOutcome] = React.useState();
|
|
528
531
|
const issues = getIssuesForExpression(outcome, undefined);
|
|
529
532
|
React.useEffect(() => initRecaptcha(recaptchaSiteKey), [recaptchaSiteKey]);
|
|
530
|
-
return (
|
|
533
|
+
return (React.createElement(Form, { style: { maxWidth: 400 }, onSubmit: (formData) => __awaiter(this, void 0, void 0, function* () {
|
|
531
534
|
try {
|
|
532
535
|
const recaptchaToken = yield getRecaptcha(recaptchaSiteKey);
|
|
533
536
|
props.handleAuthResponse(yield medplum.startNewUser({
|
|
@@ -545,14 +548,14 @@
|
|
|
545
548
|
setOutcome(err);
|
|
546
549
|
}
|
|
547
550
|
}) },
|
|
548
|
-
|
|
549
|
-
issues && (
|
|
551
|
+
React.createElement(core$1.Center, { sx: { flexDirection: 'column' } }, props.children),
|
|
552
|
+
issues && (React.createElement(core$1.Alert, { icon: React.createElement(icons.IconAlertCircle, { size: 16 }), color: "red" }, issues.map((issue) => {
|
|
550
553
|
var _a, _b;
|
|
551
|
-
return (
|
|
554
|
+
return (React.createElement("div", { "data-testid": "text-field-error", key: (_a = issue.details) === null || _a === void 0 ? void 0 : _a.text }, (_b = issue.details) === null || _b === void 0 ? void 0 : _b.text));
|
|
552
555
|
}))),
|
|
553
|
-
googleClientId && (
|
|
554
|
-
|
|
555
|
-
|
|
556
|
+
googleClientId && (React.createElement(React.Fragment, null,
|
|
557
|
+
React.createElement(core$1.Group, { position: "center", p: "xl", style: { height: 70 } },
|
|
558
|
+
React.createElement(GoogleButton, { googleClientId: googleClientId, handleGoogleCredential: (response) => __awaiter(this, void 0, void 0, function* () {
|
|
556
559
|
try {
|
|
557
560
|
props.handleAuthResponse(yield medplum.startGoogleLogin({
|
|
558
561
|
googleClientId: response.clientId,
|
|
@@ -564,28 +567,28 @@
|
|
|
564
567
|
setOutcome(err);
|
|
565
568
|
}
|
|
566
569
|
}) })),
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
570
|
+
React.createElement(core$1.Divider, { label: "or", labelPosition: "center", my: "lg" }))),
|
|
571
|
+
React.createElement(core$1.Stack, { spacing: "xl" },
|
|
572
|
+
React.createElement(core$1.TextInput, { name: "firstName", type: "text", label: "First name", placeholder: "First name", required: true, autoFocus: true, error: getErrorsForInput(outcome, 'firstName') }),
|
|
573
|
+
React.createElement(core$1.TextInput, { name: "lastName", type: "text", label: "Last name", placeholder: "Last name", required: true, error: getErrorsForInput(outcome, 'lastName') }),
|
|
574
|
+
React.createElement(core$1.TextInput, { name: "email", type: "email", label: "Email", placeholder: "name@domain.com", required: true, error: getErrorsForInput(outcome, 'email') }),
|
|
575
|
+
React.createElement(core$1.PasswordInput, { name: "password", label: "Password", autoComplete: "off", required: true, error: getErrorsForInput(outcome, 'password') }),
|
|
576
|
+
React.createElement(core$1.Text, { color: "dimmed", size: "xs" },
|
|
574
577
|
"By clicking submit you agree to the Medplum ",
|
|
575
|
-
|
|
578
|
+
React.createElement("a", { href: "https://www.medplum.com/privacy" }, "Privacy\u00A0Policy"),
|
|
576
579
|
' and ',
|
|
577
|
-
|
|
580
|
+
React.createElement("a", { href: "https://www.medplum.com/terms" }, "Terms\u00A0of\u00A0Service"),
|
|
578
581
|
"."),
|
|
579
|
-
|
|
582
|
+
React.createElement(core$1.Text, { color: "dimmed", size: "xs" },
|
|
580
583
|
"This site is protected by reCAPTCHA and the Google",
|
|
581
584
|
' ',
|
|
582
|
-
|
|
585
|
+
React.createElement("a", { href: "https://policies.google.com/privacy" }, "Privacy\u00A0Policy"),
|
|
583
586
|
' and ',
|
|
584
|
-
|
|
587
|
+
React.createElement("a", { href: "https://policies.google.com/terms" }, "Terms\u00A0of\u00A0Service"),
|
|
585
588
|
" apply.")),
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
+
React.createElement(core$1.Group, { position: "apart", mt: "xl", noWrap: true },
|
|
590
|
+
React.createElement(core$1.Checkbox, { name: "remember", label: "Remember me", size: "xs" }),
|
|
591
|
+
React.createElement(core$1.Button, { type: "submit" }, "Create account"))));
|
|
589
592
|
}
|
|
590
593
|
|
|
591
594
|
function RegisterForm(props) {
|
|
@@ -613,10 +616,10 @@
|
|
|
613
616
|
setLogin(response.login);
|
|
614
617
|
}
|
|
615
618
|
}
|
|
616
|
-
return (
|
|
617
|
-
outcome &&
|
|
618
|
-
!login && (
|
|
619
|
-
login && type === 'project' &&
|
|
619
|
+
return (React.createElement(Document, { width: 450 },
|
|
620
|
+
outcome && React.createElement("pre", null, JSON.stringify(outcome, null, 2)),
|
|
621
|
+
!login && (React.createElement(NewUserForm, { projectId: projectId, googleClientId: googleClientId, recaptchaSiteKey: recaptchaSiteKey, handleAuthResponse: handleAuthResponse }, props.children)),
|
|
622
|
+
login && type === 'project' && React.createElement(NewProjectForm, { login: login, handleAuthResponse: handleAuthResponse })));
|
|
620
623
|
}
|
|
621
624
|
|
|
622
625
|
function AuthenticationForm(props) {
|
|
@@ -631,11 +634,12 @@
|
|
|
631
634
|
}
|
|
632
635
|
});
|
|
633
636
|
}
|
|
634
|
-
return (
|
|
637
|
+
return (React.createElement(Form, { style: { maxWidth: 400 }, onSubmit: (formData) => {
|
|
635
638
|
startPkce()
|
|
636
639
|
.then(() => medplum.startLogin({
|
|
637
640
|
projectId: props.projectId,
|
|
638
641
|
clientId: props.clientId,
|
|
642
|
+
resourceType: props.resourceType,
|
|
639
643
|
scope: props.scope,
|
|
640
644
|
nonce: props.nonce,
|
|
641
645
|
codeChallenge: props.codeChallenge,
|
|
@@ -647,18 +651,19 @@
|
|
|
647
651
|
.then(props.handleAuthResponse)
|
|
648
652
|
.catch(setOutcome);
|
|
649
653
|
} },
|
|
650
|
-
|
|
651
|
-
issues && (
|
|
654
|
+
React.createElement(core$1.Center, { sx: { flexDirection: 'column' } }, props.children),
|
|
655
|
+
issues && (React.createElement(core$1.Alert, { icon: React.createElement(icons.IconAlertCircle, { size: 16 }), color: "red" }, issues.map((issue) => {
|
|
652
656
|
var _a, _b;
|
|
653
|
-
return (
|
|
657
|
+
return (React.createElement("div", { "data-testid": "text-field-error", key: (_a = issue.details) === null || _a === void 0 ? void 0 : _a.text }, (_b = issue.details) === null || _b === void 0 ? void 0 : _b.text));
|
|
654
658
|
}))),
|
|
655
|
-
googleClientId && (
|
|
656
|
-
|
|
657
|
-
|
|
659
|
+
googleClientId && (React.createElement(React.Fragment, null,
|
|
660
|
+
React.createElement(core$1.Group, { position: "center", p: "xl", style: { height: 70 } },
|
|
661
|
+
React.createElement(GoogleButton, { googleClientId: googleClientId, handleGoogleCredential: (response) => {
|
|
658
662
|
startPkce()
|
|
659
663
|
.then(() => medplum.startGoogleLogin({
|
|
660
664
|
projectId: props.projectId,
|
|
661
665
|
clientId: props.clientId,
|
|
666
|
+
resourceType: props.resourceType,
|
|
662
667
|
scope: props.scope,
|
|
663
668
|
nonce: props.nonce,
|
|
664
669
|
codeChallenge: props.codeChallenge,
|
|
@@ -669,26 +674,26 @@
|
|
|
669
674
|
.then(props.handleAuthResponse)
|
|
670
675
|
.catch(setOutcome);
|
|
671
676
|
} })),
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
props.onForgotPassword && (
|
|
678
|
-
props.onRegister && (
|
|
679
|
-
|
|
680
|
-
|
|
677
|
+
React.createElement(core$1.Divider, { label: "or", labelPosition: "center", my: "lg" }))),
|
|
678
|
+
React.createElement(core$1.Stack, { spacing: "xl" },
|
|
679
|
+
React.createElement(core$1.TextInput, { name: "email", type: "email", label: "Email", placeholder: "name@domain.com", required: true, autoFocus: true, error: getErrorsForInput(outcome, 'email') }),
|
|
680
|
+
React.createElement(core$1.PasswordInput, { name: "password", type: "password", label: "Password", autoComplete: "off", required: true, error: getErrorsForInput(outcome, 'password') })),
|
|
681
|
+
React.createElement(core$1.Group, { position: "apart", mt: "xl", noWrap: true },
|
|
682
|
+
props.onForgotPassword && (React.createElement(core$1.Anchor, { component: "button", type: "button", color: "dimmed", onClick: props.onForgotPassword, size: "xs" }, "Forgot password")),
|
|
683
|
+
props.onRegister && (React.createElement(core$1.Anchor, { component: "button", type: "button", color: "dimmed", onClick: props.onRegister, size: "xs" }, "Register")),
|
|
684
|
+
React.createElement(core$1.Checkbox, { name: "remember", label: "Remember me", size: "xs" }),
|
|
685
|
+
React.createElement(core$1.Button, { type: "submit" }, "Sign in"))));
|
|
681
686
|
}
|
|
682
687
|
|
|
683
688
|
function ChooseProfileForm(props) {
|
|
684
689
|
const medplum = useMedplum();
|
|
685
|
-
return (
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
690
|
+
return (React.createElement(core$1.Stack, null,
|
|
691
|
+
React.createElement(core$1.Center, { sx: { flexDirection: 'column' } },
|
|
692
|
+
React.createElement(Logo, { size: 32 }),
|
|
693
|
+
React.createElement(core$1.Title, null, "Choose profile")),
|
|
689
694
|
props.memberships.map((membership) => {
|
|
690
695
|
var _a, _b;
|
|
691
|
-
return (
|
|
696
|
+
return (React.createElement(core$1.UnstyledButton, { key: membership.id, onClick: () => {
|
|
692
697
|
medplum
|
|
693
698
|
.post('auth/profile', {
|
|
694
699
|
login: props.login,
|
|
@@ -697,11 +702,11 @@
|
|
|
697
702
|
.then(props.handleAuthResponse)
|
|
698
703
|
.catch(console.log);
|
|
699
704
|
} },
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
+
React.createElement(core$1.Group, null,
|
|
706
|
+
React.createElement(core$1.Avatar, { radius: "xl" }),
|
|
707
|
+
React.createElement("div", { style: { flex: 1 } },
|
|
708
|
+
React.createElement(core$1.Text, { size: "sm", weight: 500 }, (_a = membership.profile) === null || _a === void 0 ? void 0 : _a.display),
|
|
709
|
+
React.createElement(core$1.Text, { color: "dimmed", size: "xs" }, (_b = membership.project) === null || _b === void 0 ? void 0 : _b.display)))));
|
|
705
710
|
})));
|
|
706
711
|
}
|
|
707
712
|
|
|
@@ -732,28 +737,27 @@
|
|
|
732
737
|
}
|
|
733
738
|
}
|
|
734
739
|
}
|
|
735
|
-
return (
|
|
740
|
+
return (React.createElement(Document, { width: 450 }, (() => {
|
|
736
741
|
if (!login) {
|
|
737
|
-
return (
|
|
742
|
+
return (React.createElement(AuthenticationForm, { projectId: props.projectId, clientId: props.clientId, resourceType: props.resourceType, scope: props.scope, nonce: props.nonce, googleClientId: props.googleClientId, generatePkce: !props.onCode, codeChallenge: props.codeChallenge, codeChallengeMethod: props.codeChallengeMethod, onForgotPassword: props.onForgotPassword, onRegister: props.onRegister, handleAuthResponse: handleAuthResponse }, props.children));
|
|
738
743
|
}
|
|
739
744
|
else if (memberships) {
|
|
740
|
-
return
|
|
745
|
+
return React.createElement(ChooseProfileForm, { login: login, memberships: memberships, handleAuthResponse: handleAuthResponse });
|
|
741
746
|
}
|
|
742
747
|
else if (props.projectId === 'new') {
|
|
743
|
-
return
|
|
748
|
+
return React.createElement(NewProjectForm, { login: login, handleAuthResponse: handleAuthResponse });
|
|
744
749
|
}
|
|
745
750
|
else {
|
|
746
|
-
return
|
|
751
|
+
return React.createElement("div", null, "Success");
|
|
747
752
|
}
|
|
748
753
|
})()));
|
|
749
754
|
}
|
|
750
755
|
|
|
751
756
|
function CheckboxFormSection(props) {
|
|
752
|
-
return (
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
React__default["default"].createElement("p", null, props.description))));
|
|
757
|
+
return (React.createElement(core$1.Group, { noWrap: true },
|
|
758
|
+
React.createElement("div", null, props.children),
|
|
759
|
+
React.createElement("div", null,
|
|
760
|
+
React.createElement(core$1.Input.Wrapper, { id: props.htmlFor, label: props.title, description: props.description }, (() => null)()))));
|
|
757
761
|
}
|
|
758
762
|
|
|
759
763
|
const DEFAULT_IGNORED_PROPERTIES = [
|
|
@@ -767,16 +771,7 @@
|
|
|
767
771
|
];
|
|
768
772
|
|
|
769
773
|
function FormSection(props) {
|
|
770
|
-
|
|
771
|
-
const invalid = issues && issues.length > 0;
|
|
772
|
-
return (React__default["default"].createElement("fieldset", { className: "medplum-form-section" },
|
|
773
|
-
props.title && React__default["default"].createElement("label", { htmlFor: props.htmlFor }, props.title),
|
|
774
|
-
props.description && React__default["default"].createElement("p", null, props.description),
|
|
775
|
-
props.children,
|
|
776
|
-
invalid && (React__default["default"].createElement("div", { id: props.htmlFor + '-errors', className: "medplum-input-error" }, issues === null || issues === void 0 ? void 0 : issues.map((issue) => {
|
|
777
|
-
var _a, _b;
|
|
778
|
-
return (React__default["default"].createElement("div", { "data-testid": "text-field-error", key: (_a = issue.details) === null || _a === void 0 ? void 0 : _a.text }, (_b = issue.details) === null || _b === void 0 ? void 0 : _b.text));
|
|
779
|
-
})))));
|
|
774
|
+
return (React.createElement(core$1.Input.Wrapper, { id: props.htmlFor, label: props.title, description: props.description, error: getErrorsForInput(props.outcome, props.htmlFor) }, props.children));
|
|
780
775
|
}
|
|
781
776
|
|
|
782
777
|
const system = {
|
|
@@ -851,22 +846,23 @@
|
|
|
851
846
|
}
|
|
852
847
|
}, [medplum, defaultValue]);
|
|
853
848
|
if (!schema || !value) {
|
|
854
|
-
return
|
|
849
|
+
return React.createElement("div", null, "Loading...");
|
|
855
850
|
}
|
|
856
|
-
return (
|
|
851
|
+
return (React.createElement("form", { noValidate: true, autoComplete: "off", onSubmit: (e) => {
|
|
857
852
|
e.preventDefault();
|
|
858
853
|
if (props.onSubmit) {
|
|
859
854
|
props.onSubmit(value);
|
|
860
855
|
}
|
|
861
856
|
} },
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
857
|
+
React.createElement(core$1.Stack, { mb: "xl" },
|
|
858
|
+
React.createElement(FormSection, { title: "Resource Type", htmlFor: "resourceType", outcome: props.outcome },
|
|
859
|
+
React.createElement(core$1.TextInput, { name: "resourceType", defaultValue: value.resourceType, disabled: true })),
|
|
860
|
+
React.createElement(FormSection, { title: "ID", htmlFor: "id", outcome: props.outcome },
|
|
861
|
+
React.createElement(core$1.TextInput, { name: "id", defaultValue: value.id, disabled: true }))),
|
|
862
|
+
React.createElement(BackboneElementInput, { typeName: value.resourceType, defaultValue: value, outcome: props.outcome, onChange: setValue }),
|
|
863
|
+
React.createElement(core$1.Group, null,
|
|
864
|
+
React.createElement(core$1.Button, { type: "submit" }, "OK"),
|
|
865
|
+
props.onDelete && (React.createElement(core$1.Button, { variant: "outline", color: "red", type: "button", onClick: () => {
|
|
870
866
|
props.onDelete(value);
|
|
871
867
|
} }, "Delete")))));
|
|
872
868
|
}
|
|
@@ -884,13 +880,34 @@
|
|
|
884
880
|
return obj;
|
|
885
881
|
}
|
|
886
882
|
|
|
883
|
+
const useStyles$a = core$1.createStyles((theme) => ({
|
|
884
|
+
root: {
|
|
885
|
+
display: 'grid',
|
|
886
|
+
gridTemplateColumns: '30% 70%',
|
|
887
|
+
margin: 0,
|
|
888
|
+
'& > dt, & > dd': {
|
|
889
|
+
padding: `${theme.spacing.sm}px ${theme.spacing.sm}px`,
|
|
890
|
+
borderTop: `0.1px solid ${theme.colors.gray[3]}`,
|
|
891
|
+
margin: 0,
|
|
892
|
+
},
|
|
893
|
+
},
|
|
894
|
+
compact: {
|
|
895
|
+
gridTemplateColumns: '20% 80%',
|
|
896
|
+
'& > dt, & > dd': {
|
|
897
|
+
padding: `0 ${theme.spacing.xs}px ${theme.spacing.xs}px 0`,
|
|
898
|
+
border: 0,
|
|
899
|
+
},
|
|
900
|
+
},
|
|
901
|
+
}));
|
|
887
902
|
function DescriptionList(props) {
|
|
888
|
-
|
|
903
|
+
const { children, compact } = props;
|
|
904
|
+
const { classes, cx } = useStyles$a();
|
|
905
|
+
return React.createElement("dl", { className: cx(classes.root, { [classes.compact]: compact }) }, children);
|
|
889
906
|
}
|
|
890
907
|
function DescriptionListEntry(props) {
|
|
891
|
-
return (
|
|
892
|
-
|
|
893
|
-
|
|
908
|
+
return (React.createElement(React.Fragment, null,
|
|
909
|
+
React.createElement("dt", null, props.term),
|
|
910
|
+
React.createElement("dd", null, props.children)));
|
|
894
911
|
}
|
|
895
912
|
|
|
896
913
|
function BackboneElementDisplay(props) {
|
|
@@ -902,7 +919,7 @@
|
|
|
902
919
|
const typeName = typedValue.type;
|
|
903
920
|
const typeSchema = core.globalSchema.types[typeName];
|
|
904
921
|
if (!typeSchema) {
|
|
905
|
-
return
|
|
922
|
+
return React.createElement("div", null,
|
|
906
923
|
typeName,
|
|
907
924
|
"\u00A0not implemented");
|
|
908
925
|
}
|
|
@@ -910,9 +927,9 @@
|
|
|
910
927
|
// Special case for common BackboneElement pattern
|
|
911
928
|
// Where there is an object with a single property 'name'
|
|
912
929
|
// Just display the name value.
|
|
913
|
-
return
|
|
930
|
+
return React.createElement("div", null, value.name);
|
|
914
931
|
}
|
|
915
|
-
return (
|
|
932
|
+
return (React.createElement(DescriptionList, { compact: props.compact }, Object.entries(typeSchema.properties).map((entry) => {
|
|
916
933
|
const key = entry[0];
|
|
917
934
|
if (DEFAULT_IGNORED_PROPERTIES.indexOf(key) >= 0) {
|
|
918
935
|
return null;
|
|
@@ -923,14 +940,14 @@
|
|
|
923
940
|
(!propertyValue || (Array.isArray(propertyValue) && propertyValue.length === 0))) {
|
|
924
941
|
return null;
|
|
925
942
|
}
|
|
926
|
-
return (
|
|
927
|
-
|
|
943
|
+
return (React.createElement(DescriptionListEntry, { key: key, term: core.getPropertyDisplayName(key) },
|
|
944
|
+
React.createElement(ResourcePropertyDisplay, { property: property, propertyType: propertyType, value: propertyValue, ignoreMissingValues: props.ignoreMissingValues, link: props.link })));
|
|
928
945
|
})));
|
|
929
946
|
}
|
|
930
947
|
|
|
931
948
|
function CodingDisplay(props) {
|
|
932
949
|
var _a, _b;
|
|
933
|
-
return
|
|
950
|
+
return React.createElement(React.Fragment, null, ((_a = props.value) === null || _a === void 0 ? void 0 : _a.display) || ((_b = props.value) === null || _b === void 0 ? void 0 : _b.code));
|
|
934
951
|
}
|
|
935
952
|
|
|
936
953
|
function CodeableConceptDisplay(props) {
|
|
@@ -939,12 +956,12 @@
|
|
|
939
956
|
return null;
|
|
940
957
|
}
|
|
941
958
|
if (value.text) {
|
|
942
|
-
return
|
|
959
|
+
return React.createElement(React.Fragment, null, value.text);
|
|
943
960
|
}
|
|
944
961
|
if (value.coding) {
|
|
945
|
-
return (
|
|
946
|
-
index > 0 &&
|
|
947
|
-
|
|
962
|
+
return (React.createElement(React.Fragment, null, value.coding.map((coding, index) => (React.createElement(React.Fragment, { key: 'coding-' + index },
|
|
963
|
+
index > 0 && React.createElement(React.Fragment, null, ', '),
|
|
964
|
+
React.createElement(CodingDisplay, { value: coding }))))));
|
|
948
965
|
}
|
|
949
966
|
return null;
|
|
950
967
|
}
|
|
@@ -971,7 +988,7 @@
|
|
|
971
988
|
}
|
|
972
989
|
builder.push(']');
|
|
973
990
|
}
|
|
974
|
-
return
|
|
991
|
+
return React.createElement(React.Fragment, null, builder.join('').trim());
|
|
975
992
|
}
|
|
976
993
|
|
|
977
994
|
function ContactDetailDisplay(props) {
|
|
@@ -980,10 +997,10 @@
|
|
|
980
997
|
if (!contactDetail) {
|
|
981
998
|
return null;
|
|
982
999
|
}
|
|
983
|
-
return (
|
|
1000
|
+
return (React.createElement(React.Fragment, null,
|
|
984
1001
|
contactDetail.name,
|
|
985
1002
|
contactDetail.name && ': ', (_a = contactDetail.telecom) === null || _a === void 0 ? void 0 :
|
|
986
|
-
_a.map((telecom, index) => (
|
|
1003
|
+
_a.map((telecom, index) => (React.createElement(ContactPointDisplay, { key: 'telecom-' + index, value: telecom })))));
|
|
987
1004
|
}
|
|
988
1005
|
|
|
989
1006
|
function HumanNameDisplay(props) {
|
|
@@ -991,19 +1008,19 @@
|
|
|
991
1008
|
if (!name) {
|
|
992
1009
|
return null;
|
|
993
1010
|
}
|
|
994
|
-
return
|
|
1011
|
+
return React.createElement(React.Fragment, null, core.formatHumanName(name, props.options));
|
|
995
1012
|
}
|
|
996
1013
|
|
|
997
1014
|
function IdentifierDisplay(props) {
|
|
998
1015
|
var _a, _b;
|
|
999
|
-
return (
|
|
1016
|
+
return (React.createElement("div", null, (_a = props.value) === null || _a === void 0 ? void 0 :
|
|
1000
1017
|
_a.system,
|
|
1001
1018
|
": ", (_b = props.value) === null || _b === void 0 ? void 0 :
|
|
1002
1019
|
_b.value));
|
|
1003
1020
|
}
|
|
1004
1021
|
|
|
1005
1022
|
function QuantityDisplay(props) {
|
|
1006
|
-
return
|
|
1023
|
+
return React.createElement(React.Fragment, null, formatQuantityString(props.value));
|
|
1007
1024
|
}
|
|
1008
1025
|
function formatQuantityString(quantity) {
|
|
1009
1026
|
if (!quantity) {
|
|
@@ -1027,7 +1044,7 @@
|
|
|
1027
1044
|
}
|
|
1028
1045
|
|
|
1029
1046
|
function RangeDisplay(props) {
|
|
1030
|
-
return
|
|
1047
|
+
return React.createElement(React.Fragment, null, formatRangeString(props.value));
|
|
1031
1048
|
}
|
|
1032
1049
|
function formatRangeString(range) {
|
|
1033
1050
|
if (!range || (!range.low && !range.high)) {
|
|
@@ -1047,27 +1064,28 @@
|
|
|
1047
1064
|
if (!value) {
|
|
1048
1065
|
return null;
|
|
1049
1066
|
}
|
|
1050
|
-
return (
|
|
1051
|
-
|
|
1067
|
+
return (React.createElement(React.Fragment, null,
|
|
1068
|
+
React.createElement(QuantityDisplay, { value: value.numerator }),
|
|
1052
1069
|
"\u00A0/\u00A0",
|
|
1053
|
-
|
|
1070
|
+
React.createElement(QuantityDisplay, { value: value.denominator })));
|
|
1054
1071
|
}
|
|
1055
1072
|
|
|
1056
1073
|
function MedplumLink(props) {
|
|
1057
1074
|
const navigate = reactRouterDom.useNavigate();
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1075
|
+
const { to, suffix, label, onClick, children } = props, rest = __rest(props, ["to", "suffix", "label", "onClick", "children"]);
|
|
1076
|
+
let href = getHref(to);
|
|
1077
|
+
if (suffix) {
|
|
1078
|
+
href += '/' + suffix;
|
|
1061
1079
|
}
|
|
1062
|
-
return (
|
|
1080
|
+
return (React.createElement(core$1.Anchor, Object.assign({ href: href, "aria-label": label, onClick: (e) => {
|
|
1063
1081
|
killEvent(e);
|
|
1064
|
-
if (
|
|
1065
|
-
|
|
1082
|
+
if (onClick) {
|
|
1083
|
+
onClick();
|
|
1066
1084
|
}
|
|
1067
|
-
else if (
|
|
1085
|
+
else if (to) {
|
|
1068
1086
|
navigate(href);
|
|
1069
1087
|
}
|
|
1070
|
-
} },
|
|
1088
|
+
} }, rest), children));
|
|
1071
1089
|
}
|
|
1072
1090
|
function getHref(to) {
|
|
1073
1091
|
if (to) {
|
|
@@ -1104,10 +1122,10 @@
|
|
|
1104
1122
|
// The "link" prop defaults to "true"; undefined is treated as "true"
|
|
1105
1123
|
// To disable the link, it must be explicitly "false"
|
|
1106
1124
|
if (props.link !== false && props.value.reference) {
|
|
1107
|
-
return
|
|
1125
|
+
return React.createElement(MedplumLink, { to: props.value }, displayString);
|
|
1108
1126
|
}
|
|
1109
1127
|
else {
|
|
1110
|
-
return
|
|
1128
|
+
return React.createElement(React.Fragment, null, displayString);
|
|
1111
1129
|
}
|
|
1112
1130
|
}
|
|
1113
1131
|
|
|
@@ -1116,8 +1134,8 @@
|
|
|
1116
1134
|
const property = props.property;
|
|
1117
1135
|
const values = (_a = props.values) !== null && _a !== void 0 ? _a : [];
|
|
1118
1136
|
const propertyType = (_c = (_b = property.type) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.code;
|
|
1119
|
-
return (
|
|
1120
|
-
|
|
1137
|
+
return (React.createElement(React.Fragment, null, values.map((v, index) => (React.createElement("div", { key: `${index}-${values.length}` },
|
|
1138
|
+
React.createElement(ResourcePropertyDisplay, { arrayElement: true, property: property, propertyType: propertyType, value: v, ignoreMissingValues: props.ignoreMissingValues, link: props.link }))))));
|
|
1121
1139
|
}
|
|
1122
1140
|
|
|
1123
1141
|
function ResourcePropertyDisplay(props) {
|
|
@@ -1125,13 +1143,13 @@
|
|
|
1125
1143
|
const { property, propertyType, value } = props;
|
|
1126
1144
|
if ((property === null || property === void 0 ? void 0 : property.max) === '*' && !props.arrayElement) {
|
|
1127
1145
|
if (propertyType === 'Attachment') {
|
|
1128
|
-
return
|
|
1146
|
+
return React.createElement(AttachmentArrayDisplay, { values: value, maxWidth: props.maxWidth });
|
|
1129
1147
|
}
|
|
1130
|
-
return (
|
|
1148
|
+
return (React.createElement(ResourceArrayDisplay, { property: property, values: value, ignoreMissingValues: props.ignoreMissingValues, link: props.link }));
|
|
1131
1149
|
}
|
|
1132
1150
|
switch (propertyType) {
|
|
1133
1151
|
case core.PropertyType.boolean:
|
|
1134
|
-
return
|
|
1152
|
+
return React.createElement(React.Fragment, null, value === undefined ? '' : Boolean(value).toString());
|
|
1135
1153
|
case core.PropertyType.SystemString:
|
|
1136
1154
|
case core.PropertyType.code:
|
|
1137
1155
|
case core.PropertyType.date:
|
|
@@ -1141,49 +1159,49 @@
|
|
|
1141
1159
|
case core.PropertyType.unsignedInt:
|
|
1142
1160
|
case core.PropertyType.uri:
|
|
1143
1161
|
case core.PropertyType.url:
|
|
1144
|
-
return
|
|
1162
|
+
return React.createElement(React.Fragment, null, value);
|
|
1145
1163
|
case core.PropertyType.canonical:
|
|
1146
|
-
return
|
|
1164
|
+
return React.createElement(ReferenceDisplay, { value: { reference: value }, link: props.link });
|
|
1147
1165
|
case core.PropertyType.dateTime:
|
|
1148
1166
|
case core.PropertyType.instant:
|
|
1149
|
-
return
|
|
1167
|
+
return React.createElement(React.Fragment, null, core.formatDateTime(value));
|
|
1150
1168
|
case core.PropertyType.markdown:
|
|
1151
|
-
return
|
|
1169
|
+
return React.createElement("pre", null, value);
|
|
1152
1170
|
case core.PropertyType.Address:
|
|
1153
|
-
return
|
|
1171
|
+
return React.createElement(AddressDisplay, { value: value });
|
|
1154
1172
|
case core.PropertyType.Annotation:
|
|
1155
|
-
return
|
|
1173
|
+
return React.createElement(React.Fragment, null, value === null || value === void 0 ? void 0 : value.text);
|
|
1156
1174
|
case core.PropertyType.Attachment:
|
|
1157
|
-
return
|
|
1175
|
+
return React.createElement(AttachmentDisplay, { value: value, maxWidth: props.maxWidth });
|
|
1158
1176
|
case core.PropertyType.CodeableConcept:
|
|
1159
|
-
return
|
|
1177
|
+
return React.createElement(CodeableConceptDisplay, { value: value });
|
|
1160
1178
|
case core.PropertyType.Coding:
|
|
1161
|
-
return
|
|
1179
|
+
return React.createElement(CodingDisplay, { value: value });
|
|
1162
1180
|
case core.PropertyType.ContactDetail:
|
|
1163
|
-
return
|
|
1181
|
+
return React.createElement(ContactDetailDisplay, { value: value });
|
|
1164
1182
|
case core.PropertyType.ContactPoint:
|
|
1165
|
-
return
|
|
1183
|
+
return React.createElement(ContactPointDisplay, { value: value });
|
|
1166
1184
|
case core.PropertyType.HumanName:
|
|
1167
|
-
return
|
|
1185
|
+
return React.createElement(HumanNameDisplay, { value: value });
|
|
1168
1186
|
case core.PropertyType.Identifier:
|
|
1169
|
-
return
|
|
1187
|
+
return React.createElement(IdentifierDisplay, { value: value });
|
|
1170
1188
|
case core.PropertyType.Period:
|
|
1171
|
-
return
|
|
1189
|
+
return React.createElement(React.Fragment, null, core.formatPeriod(value));
|
|
1172
1190
|
case core.PropertyType.Quantity:
|
|
1173
|
-
return
|
|
1191
|
+
return React.createElement(QuantityDisplay, { value: value });
|
|
1174
1192
|
case core.PropertyType.Range:
|
|
1175
|
-
return
|
|
1193
|
+
return React.createElement(RangeDisplay, { value: value });
|
|
1176
1194
|
case core.PropertyType.Ratio:
|
|
1177
|
-
return
|
|
1195
|
+
return React.createElement(RatioDisplay, { value: value });
|
|
1178
1196
|
case core.PropertyType.Reference:
|
|
1179
|
-
return
|
|
1197
|
+
return React.createElement(ReferenceDisplay, { value: value, link: props.link });
|
|
1180
1198
|
case core.PropertyType.Timing:
|
|
1181
|
-
return
|
|
1199
|
+
return React.createElement(React.Fragment, null, core.formatTiming(value));
|
|
1182
1200
|
default:
|
|
1183
1201
|
if (!(property === null || property === void 0 ? void 0 : property.path)) {
|
|
1184
1202
|
throw Error(`Displaying property of type ${props.propertyType} requires element definition path`);
|
|
1185
1203
|
}
|
|
1186
|
-
return (
|
|
1204
|
+
return (React.createElement(BackboneElementDisplay, { value: { type: core.buildTypeName((_a = property === null || property === void 0 ? void 0 : property.path) === null || _a === void 0 ? void 0 : _a.split('.')), value }, compact: true, ignoreMissingValues: props.ignoreMissingValues }));
|
|
1187
1205
|
}
|
|
1188
1206
|
}
|
|
1189
1207
|
/**
|
|
@@ -1225,7 +1243,7 @@
|
|
|
1225
1243
|
props.onChange(newValue);
|
|
1226
1244
|
}
|
|
1227
1245
|
}
|
|
1228
|
-
return (
|
|
1246
|
+
return (React.createElement(core$1.TextInput, { name: props.name, placeholder: "Annotation text", defaultValue: value.text, onChange: (e) => setText(e.currentTarget.value) }));
|
|
1229
1247
|
}
|
|
1230
1248
|
|
|
1231
1249
|
function valueSetElementToAutocompleteItem(element) {
|
|
@@ -1274,7 +1292,7 @@
|
|
|
1274
1292
|
React.useEffect(() => {
|
|
1275
1293
|
loadValues('').catch(console.log);
|
|
1276
1294
|
}, [loadValues]);
|
|
1277
|
-
return (
|
|
1295
|
+
return (React.createElement(core$1.MultiSelect, { data: data, placeholder: props.placeholder, searchable: true, creatable: true, clearable: true, value: textValues, filter: (value, selected, item) => {
|
|
1278
1296
|
var _a, _b;
|
|
1279
1297
|
return !!(textValues.length === 0 &&
|
|
1280
1298
|
!selected &&
|
|
@@ -1295,7 +1313,7 @@
|
|
|
1295
1313
|
props.onChange(newConcept);
|
|
1296
1314
|
}
|
|
1297
1315
|
}
|
|
1298
|
-
return (
|
|
1316
|
+
return (React.createElement(ValueSetAutocomplete, { property: props.property, name: props.name, placeholder: props.placeholder, defaultValue: value && codeableConceptToValueSetElement(value), onChange: handleChange }));
|
|
1299
1317
|
}
|
|
1300
1318
|
function codeableConceptToValueSetElement(concept) {
|
|
1301
1319
|
var _a, _b, _c, _d, _e, _f;
|
|
@@ -1327,7 +1345,7 @@
|
|
|
1327
1345
|
props.onChange(newCode);
|
|
1328
1346
|
}
|
|
1329
1347
|
}
|
|
1330
|
-
return (
|
|
1348
|
+
return (React.createElement(ValueSetAutocomplete, { property: props.property, name: props.name, placeholder: props.placeholder, defaultValue: codeToValueSetElement(value), onChange: handleChange }));
|
|
1331
1349
|
}
|
|
1332
1350
|
function codeToValueSetElement(code) {
|
|
1333
1351
|
return code ? { code } : undefined;
|
|
@@ -1345,7 +1363,7 @@
|
|
|
1345
1363
|
props.onChange(newConcept);
|
|
1346
1364
|
}
|
|
1347
1365
|
}
|
|
1348
|
-
return (
|
|
1366
|
+
return (React.createElement(ValueSetAutocomplete, { property: props.property, name: props.name, placeholder: props.placeholder, defaultValue: value && codingToValueSetElement(value), onChange: handleChange }));
|
|
1349
1367
|
}
|
|
1350
1368
|
function codingToValueSetElement(coding) {
|
|
1351
1369
|
return {
|
|
@@ -1396,10 +1414,10 @@
|
|
|
1396
1414
|
}
|
|
1397
1415
|
setContactPointWrapper(newValue);
|
|
1398
1416
|
}
|
|
1399
|
-
return (
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1417
|
+
return (React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
|
|
1418
|
+
React.createElement(core$1.NativeSelect, { "data-testid": "system", defaultValue: contactPoint === null || contactPoint === void 0 ? void 0 : contactPoint.system, onChange: (e) => setSystem(e.currentTarget.value), data: ['', 'email', 'phone', 'fax', 'pager', 'sms', 'other'] }),
|
|
1419
|
+
React.createElement(core$1.NativeSelect, { "data-testid": "use", defaultValue: contactPoint === null || contactPoint === void 0 ? void 0 : contactPoint.use, onChange: (e) => setUse(e.currentTarget.value), data: ['', 'home', 'work', 'temp', 'old', 'mobile'] }),
|
|
1420
|
+
React.createElement(core$1.TextInput, { placeholder: "Value", defaultValue: contactPoint === null || contactPoint === void 0 ? void 0 : contactPoint.value, onChange: (e) => setValue(e.currentTarget.value) })));
|
|
1403
1421
|
}
|
|
1404
1422
|
|
|
1405
1423
|
function ContactDetailInput(props) {
|
|
@@ -1427,9 +1445,9 @@
|
|
|
1427
1445
|
}
|
|
1428
1446
|
setContactDetailWrapper(newValue);
|
|
1429
1447
|
}
|
|
1430
|
-
return (
|
|
1431
|
-
|
|
1432
|
-
|
|
1448
|
+
return (React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
|
|
1449
|
+
React.createElement(core$1.TextInput, { "data-testid": props.name + '-name', name: props.name + '-name', placeholder: "Name", style: { width: 180 }, defaultValue: contactPoint === null || contactPoint === void 0 ? void 0 : contactPoint.name, onChange: (e) => setName(e.currentTarget.value) }),
|
|
1450
|
+
React.createElement(ContactPointInput, { name: props.name + '-telecom', defaultValue: (_a = contactPoint === null || contactPoint === void 0 ? void 0 : contactPoint.telecom) === null || _a === void 0 ? void 0 : _a[0], onChange: setTelecom })));
|
|
1433
1451
|
}
|
|
1434
1452
|
|
|
1435
1453
|
/**
|
|
@@ -1441,7 +1459,7 @@
|
|
|
1441
1459
|
* @returns The JSX element to render.
|
|
1442
1460
|
*/
|
|
1443
1461
|
function DateTimeInput(props) {
|
|
1444
|
-
return (
|
|
1462
|
+
return (React.createElement(core$1.TextInput, { id: props.name, name: props.name, "data-testid": props.name, placeholder: props.placeholder, type: getInputType(), defaultValue: convertIsoToLocal(props.defaultValue), error: getErrorsForInput(props.outcome, props.name), onChange: (e) => {
|
|
1445
1463
|
if (props.onChange) {
|
|
1446
1464
|
const newValue = e.currentTarget.value;
|
|
1447
1465
|
props.onChange(convertLocalToIso(newValue));
|
|
@@ -1496,7 +1514,7 @@
|
|
|
1496
1514
|
}
|
|
1497
1515
|
|
|
1498
1516
|
function ExtensionInput(props) {
|
|
1499
|
-
return (
|
|
1517
|
+
return (React.createElement(core$1.JsonInput, { id: props.name, name: props.name, "data-testid": "extension-input", defaultValue: core.stringify(props.defaultValue), onChange: (newValue) => {
|
|
1500
1518
|
if (props.onChange) {
|
|
1501
1519
|
props.onChange(JSON.parse(newValue));
|
|
1502
1520
|
}
|
|
@@ -1529,12 +1547,12 @@
|
|
|
1529
1547
|
function setSuffix(suffix) {
|
|
1530
1548
|
setValueWrapper(Object.assign(Object.assign({}, valueRef.current), { suffix: suffix ? suffix.split(' ') : undefined }));
|
|
1531
1549
|
}
|
|
1532
|
-
return (
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1550
|
+
return (React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
|
|
1551
|
+
React.createElement(core$1.NativeSelect, { defaultValue: value === null || value === void 0 ? void 0 : value.use, "data-testid": "use", onChange: (e) => setUse(e.currentTarget.value), data: ['', 'temp', 'old', 'usual', 'official', 'nickname', 'anonymous', 'maiden'] }),
|
|
1552
|
+
React.createElement(core$1.TextInput, { placeholder: "Prefix", defaultValue: (_a = value === null || value === void 0 ? void 0 : value.prefix) === null || _a === void 0 ? void 0 : _a.join(' '), onChange: (e) => setPrefix(e.currentTarget.value) }),
|
|
1553
|
+
React.createElement(core$1.TextInput, { placeholder: "Given", defaultValue: (_b = value === null || value === void 0 ? void 0 : value.given) === null || _b === void 0 ? void 0 : _b.join(' '), onChange: (e) => setGiven(e.currentTarget.value) }),
|
|
1554
|
+
React.createElement(core$1.TextInput, { placeholder: "Family", defaultValue: value === null || value === void 0 ? void 0 : value.family, onChange: (e) => setFamily(e.currentTarget.value) }),
|
|
1555
|
+
React.createElement(core$1.TextInput, { placeholder: "Suffix", defaultValue: (_c = value === null || value === void 0 ? void 0 : value.suffix) === null || _c === void 0 ? void 0 : _c.join(' '), onChange: (e) => setSuffix(e.currentTarget.value) })));
|
|
1538
1556
|
}
|
|
1539
1557
|
|
|
1540
1558
|
function IdentifierInput(props) {
|
|
@@ -1545,9 +1563,9 @@
|
|
|
1545
1563
|
props.onChange(newValue);
|
|
1546
1564
|
}
|
|
1547
1565
|
}
|
|
1548
|
-
return (
|
|
1549
|
-
|
|
1550
|
-
|
|
1566
|
+
return (React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
|
|
1567
|
+
React.createElement(core$1.TextInput, { placeholder: "System", defaultValue: value === null || value === void 0 ? void 0 : value.system, onChange: (e) => setValueWrapper(Object.assign(Object.assign({}, value), { system: e.currentTarget.value })) }),
|
|
1568
|
+
React.createElement(core$1.TextInput, { placeholder: "Value", defaultValue: value === null || value === void 0 ? void 0 : value.value, onChange: (e) => setValueWrapper(Object.assign(Object.assign({}, value), { value: e.currentTarget.value })) })));
|
|
1551
1569
|
}
|
|
1552
1570
|
|
|
1553
1571
|
function PeriodInput(props) {
|
|
@@ -1558,9 +1576,9 @@
|
|
|
1558
1576
|
props.onChange(newValue);
|
|
1559
1577
|
}
|
|
1560
1578
|
}
|
|
1561
|
-
return (
|
|
1562
|
-
|
|
1563
|
-
|
|
1579
|
+
return (React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
|
|
1580
|
+
React.createElement(DateTimeInput, { name: props.name + '.start', placeholder: "Start", defaultValue: value === null || value === void 0 ? void 0 : value.start, onChange: (newValue) => setValueWrapper(Object.assign(Object.assign({}, value), { start: newValue })) }),
|
|
1581
|
+
React.createElement(DateTimeInput, { name: props.name + '.end', placeholder: "End", defaultValue: value === null || value === void 0 ? void 0 : value.end, onChange: (newValue) => setValueWrapper(Object.assign(Object.assign({}, value), { end: newValue })) })));
|
|
1564
1582
|
}
|
|
1565
1583
|
|
|
1566
1584
|
function QuantityInput(props) {
|
|
@@ -1572,10 +1590,10 @@
|
|
|
1572
1590
|
props.onChange(newValue);
|
|
1573
1591
|
}
|
|
1574
1592
|
}
|
|
1575
|
-
return (
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1593
|
+
return (React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
|
|
1594
|
+
React.createElement(core$1.NativeSelect, { style: { width: 80 }, "data-testid": props.name + '-comparator', defaultValue: value === null || value === void 0 ? void 0 : value.comparator, data: ['', '<', '<=', '>=', '>'], onChange: (e) => setValueWrapper(Object.assign(Object.assign({}, value), { comparator: e.currentTarget.value })) }),
|
|
1595
|
+
React.createElement(core$1.TextInput, { id: props.name, name: props.name, "data-testid": props.name, type: "number", step: "any", placeholder: "Value", defaultValue: (_a = value === null || value === void 0 ? void 0 : value.value) === null || _a === void 0 ? void 0 : _a.toString(), onChange: (e) => setValueWrapper(Object.assign(Object.assign({}, value), { value: tryParseNumber(e.currentTarget.value) })) }),
|
|
1596
|
+
React.createElement(core$1.TextInput, { placeholder: "Unit", defaultValue: value === null || value === void 0 ? void 0 : value.unit, onChange: (e) => setValueWrapper(Object.assign(Object.assign({}, value), { unit: e.currentTarget.value })) })));
|
|
1579
1597
|
}
|
|
1580
1598
|
function tryParseNumber(str) {
|
|
1581
1599
|
if (!str) {
|
|
@@ -1598,9 +1616,9 @@
|
|
|
1598
1616
|
props.onChange(newValue);
|
|
1599
1617
|
}
|
|
1600
1618
|
}
|
|
1601
|
-
return (
|
|
1602
|
-
|
|
1603
|
-
|
|
1619
|
+
return (React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
|
|
1620
|
+
React.createElement(QuantityInput, { name: props.name + '-low', defaultValue: value === null || value === void 0 ? void 0 : value.low, onChange: (v) => setValueWrapper(Object.assign(Object.assign({}, value), { low: v })) }),
|
|
1621
|
+
React.createElement(QuantityInput, { name: props.name + '-high', defaultValue: value === null || value === void 0 ? void 0 : value.high, onChange: (v) => setValueWrapper(Object.assign(Object.assign({}, value), { high: v })) })));
|
|
1604
1622
|
}
|
|
1605
1623
|
|
|
1606
1624
|
/**
|
|
@@ -1617,9 +1635,9 @@
|
|
|
1617
1635
|
props.onChange(newValue);
|
|
1618
1636
|
}
|
|
1619
1637
|
}
|
|
1620
|
-
return (
|
|
1621
|
-
|
|
1622
|
-
|
|
1638
|
+
return (React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
|
|
1639
|
+
React.createElement(QuantityInput, { name: props.name + '-numerator', defaultValue: value === null || value === void 0 ? void 0 : value.numerator, onChange: (v) => setValueWrapper(Object.assign(Object.assign({}, value), { numerator: v })) }),
|
|
1640
|
+
React.createElement(QuantityInput, { name: props.name + '-denominator', defaultValue: value === null || value === void 0 ? void 0 : value.denominator, onChange: (v) => setValueWrapper(Object.assign(Object.assign({}, value), { denominator: v })) })));
|
|
1623
1641
|
}
|
|
1624
1642
|
|
|
1625
1643
|
function ResourceAvatar(props) {
|
|
@@ -1632,12 +1650,28 @@
|
|
|
1632
1650
|
delete avatarProps.value;
|
|
1633
1651
|
delete avatarProps.link;
|
|
1634
1652
|
if (props.link) {
|
|
1635
|
-
return (
|
|
1636
|
-
|
|
1653
|
+
return (React.createElement(MedplumLink, { to: resource },
|
|
1654
|
+
React.createElement(core$1.Avatar, Object.assign({ src: imageUrl, alt: text, radius: radius }, avatarProps))));
|
|
1637
1655
|
}
|
|
1638
|
-
return
|
|
1656
|
+
return React.createElement(core$1.Avatar, Object.assign({ src: imageUrl, alt: text, radius: radius }, avatarProps));
|
|
1639
1657
|
}
|
|
1640
1658
|
|
|
1659
|
+
/**
|
|
1660
|
+
* Defines which search parameters will be used by the type ahead to search for each resourceType
|
|
1661
|
+
*/
|
|
1662
|
+
const SEARCH_CODES = {
|
|
1663
|
+
Schedule: '_id',
|
|
1664
|
+
Task: '_id',
|
|
1665
|
+
Patient: 'name',
|
|
1666
|
+
Practitioner: 'name',
|
|
1667
|
+
Questionnaire: 'name',
|
|
1668
|
+
ServiceRequest: '_id',
|
|
1669
|
+
DiagnosticReport: '_id',
|
|
1670
|
+
Specimen: '_id',
|
|
1671
|
+
Observation: 'code',
|
|
1672
|
+
RequestGroup: '_id',
|
|
1673
|
+
ActivityDefinition: 'name',
|
|
1674
|
+
};
|
|
1641
1675
|
function ResourceInput(props) {
|
|
1642
1676
|
const medplum = useMedplum();
|
|
1643
1677
|
const defaultValue = useResource(props.defaultValue);
|
|
@@ -1652,7 +1686,12 @@
|
|
|
1652
1686
|
function loadValues(input) {
|
|
1653
1687
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1654
1688
|
setLoading(true);
|
|
1655
|
-
const
|
|
1689
|
+
const searchCode = SEARCH_CODES[props.resourceType] || 'name';
|
|
1690
|
+
const searchParams = new URLSearchParams({
|
|
1691
|
+
[searchCode]: encodeURIComponent(input),
|
|
1692
|
+
_count: '10',
|
|
1693
|
+
});
|
|
1694
|
+
const resources = yield medplum.searchResources(props.resourceType, searchParams);
|
|
1656
1695
|
setData(resources.map((resource) => ({ value: core.getDisplayString(resource), resource })));
|
|
1657
1696
|
setLoading(false);
|
|
1658
1697
|
});
|
|
@@ -1670,16 +1709,16 @@
|
|
|
1670
1709
|
props.onChange(item.resource);
|
|
1671
1710
|
}
|
|
1672
1711
|
}
|
|
1673
|
-
return (
|
|
1712
|
+
return (React.createElement(core$1.Autocomplete, { itemComponent: ItemComponent, value: value, data: data, placeholder: props.placeholder, onFocus: () => loadValues(value), onChange: handleChange, onItemSubmit: handleSelect, rightSection: loading ? React.createElement(core$1.Loader, { size: 16 }) : null }));
|
|
1674
1713
|
}
|
|
1675
1714
|
const ItemComponent = React.forwardRef((_a, ref) => {
|
|
1676
1715
|
var { value, resource } = _a, others = __rest(_a, ["value", "resource"]);
|
|
1677
|
-
return (
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1716
|
+
return (React.createElement("div", Object.assign({ ref: ref }, others),
|
|
1717
|
+
React.createElement(core$1.Group, { noWrap: true },
|
|
1718
|
+
React.createElement(ResourceAvatar, { value: resource }),
|
|
1719
|
+
React.createElement("div", null,
|
|
1720
|
+
React.createElement(core$1.Text, null, value),
|
|
1721
|
+
React.createElement(core$1.Text, { size: "xs", color: "dimmed" }, resource.birthDate)))));
|
|
1683
1722
|
});
|
|
1684
1723
|
|
|
1685
1724
|
function ReferenceInput(props) {
|
|
@@ -1697,9 +1736,9 @@
|
|
|
1697
1736
|
props.onChange(newValue);
|
|
1698
1737
|
}
|
|
1699
1738
|
}
|
|
1700
|
-
return (
|
|
1701
|
-
targetTypes ? (
|
|
1702
|
-
|
|
1739
|
+
return (React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
|
|
1740
|
+
targetTypes ? (React.createElement(core$1.NativeSelect, { "data-testid": "reference-input-resource-type-select", defaultValue: resourceType, onChange: (e) => setResourceType(e.currentTarget.value), data: targetTypes })) : (React.createElement(core$1.TextInput, { "data-testid": "reference-input-resource-type-input", defaultValue: resourceType, onChange: (e) => setResourceType(e.currentTarget.value) })),
|
|
1741
|
+
React.createElement(ResourceInput, { resourceType: resourceType, name: props.name + '-id', placeholder: props.placeholder, defaultValue: value, onChange: (item) => {
|
|
1703
1742
|
setValueHelper(item ? core.createReference(item) : undefined);
|
|
1704
1743
|
} })));
|
|
1705
1744
|
}
|
|
@@ -1725,36 +1764,36 @@
|
|
|
1725
1764
|
props.onChange(newValues);
|
|
1726
1765
|
}
|
|
1727
1766
|
}
|
|
1728
|
-
return (
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
values.map((v, index) => (
|
|
1734
|
-
|
|
1735
|
-
|
|
1767
|
+
return (React.createElement("table", { style: { width: '100%', borderCollapse: 'collapse' } },
|
|
1768
|
+
React.createElement("colgroup", null,
|
|
1769
|
+
React.createElement("col", { width: "97%" }),
|
|
1770
|
+
React.createElement("col", { width: "3%" })),
|
|
1771
|
+
React.createElement("tbody", null,
|
|
1772
|
+
values.map((v, index) => (React.createElement("tr", { key: `${index}-${values.length}` },
|
|
1773
|
+
React.createElement("td", null,
|
|
1774
|
+
React.createElement(ResourcePropertyInput, { arrayElement: true, property: props.property, name: props.name + '.' + index, defaultValue: v, onChange: (newValue) => {
|
|
1736
1775
|
const copy = [...valuesRef.current];
|
|
1737
1776
|
copy[index] = newValue;
|
|
1738
1777
|
setValuesWrapper(copy);
|
|
1739
1778
|
} })),
|
|
1740
|
-
|
|
1741
|
-
|
|
1779
|
+
React.createElement("td", { style: { textAlign: 'right' } },
|
|
1780
|
+
React.createElement(core$1.ActionIcon, { title: "Remove", size: "sm", onClick: (e) => {
|
|
1742
1781
|
killEvent(e);
|
|
1743
1782
|
const copy = [...valuesRef.current];
|
|
1744
1783
|
copy.splice(index, 1);
|
|
1745
1784
|
setValuesWrapper(copy);
|
|
1746
1785
|
} },
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1786
|
+
React.createElement(icons.IconCircleMinus, null)))))),
|
|
1787
|
+
React.createElement("tr", null,
|
|
1788
|
+
React.createElement("td", null),
|
|
1789
|
+
React.createElement("td", { style: { textAlign: 'right' } },
|
|
1790
|
+
React.createElement(core$1.ActionIcon, { title: "Add", size: "sm", color: "green", onClick: (e) => {
|
|
1752
1791
|
killEvent(e);
|
|
1753
1792
|
const copy = [...valuesRef.current];
|
|
1754
1793
|
copy.push(undefined);
|
|
1755
1794
|
setValuesWrapper(copy);
|
|
1756
1795
|
} },
|
|
1757
|
-
|
|
1796
|
+
React.createElement(icons.IconCirclePlus, null)))))));
|
|
1758
1797
|
}
|
|
1759
1798
|
|
|
1760
1799
|
const daysOfWeek = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
|
|
@@ -1763,11 +1802,11 @@
|
|
|
1763
1802
|
const [open, setOpen] = React.useState(false);
|
|
1764
1803
|
const valueRef = React.useRef();
|
|
1765
1804
|
valueRef.current = value;
|
|
1766
|
-
return (
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1805
|
+
return (React.createElement(React.Fragment, null,
|
|
1806
|
+
React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
|
|
1807
|
+
React.createElement("span", null, core.formatTiming(valueRef.current) || 'No repeat'),
|
|
1808
|
+
React.createElement(core$1.Button, { onClick: () => setOpen(true) }, "Edit")),
|
|
1809
|
+
React.createElement(TimingEditorDialog, { visible: open, defaultValue: valueRef.current, onOk: (newValue) => {
|
|
1771
1810
|
if (props.onChange) {
|
|
1772
1811
|
props.onChange(newValue);
|
|
1773
1812
|
}
|
|
@@ -1816,24 +1855,24 @@
|
|
|
1816
1855
|
setRepeat(Object.assign(Object.assign({}, (_c = valueRef.current) === null || _c === void 0 ? void 0 : _c.repeat), { dayOfWeek: existing.filter((d) => d !== day) }));
|
|
1817
1856
|
}
|
|
1818
1857
|
}
|
|
1819
|
-
return (
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1858
|
+
return (React.createElement(core$1.Modal, { title: "Timing", closeButtonLabel: "Close", opened: props.visible, onClose: () => props.onCancel() },
|
|
1859
|
+
React.createElement("div", { style: { padding: '5px 20px', textAlign: 'left' } },
|
|
1860
|
+
React.createElement(FormSection, { title: "Starts on", htmlFor: 'timing-dialog-start' },
|
|
1861
|
+
React.createElement(DateTimeInput, { name: 'timing-dialog-start', onChange: (newValue) => setStart(newValue) })),
|
|
1862
|
+
React.createElement(FormSection, { title: "Repeat every", htmlFor: 'timing-dialog-period' },
|
|
1863
|
+
React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
|
|
1864
|
+
React.createElement(core$1.TextInput, { type: "number", step: 1, id: "timing-dialog-period", name: "timing-dialog-period", defaultValue: (_a = value === null || value === void 0 ? void 0 : value.repeat) === null || _a === void 0 ? void 0 : _a.period, onChange: (e) => setPeriod(parseInt(e.currentTarget.value)) }),
|
|
1865
|
+
React.createElement(core$1.NativeSelect, { id: "timing-dialog-periodUnit", name: "timing-dialog-periodUnit", defaultValue: (_b = value === null || value === void 0 ? void 0 : value.repeat) === null || _b === void 0 ? void 0 : _b.periodUnit, onChange: (e) => setPeriodUnit(e.currentTarget.value), data: [
|
|
1827
1866
|
{ label: 'day', value: 'd' },
|
|
1828
1867
|
{ label: 'week', value: 'wk' },
|
|
1829
1868
|
{ label: 'month', value: 'mo' },
|
|
1830
1869
|
{ label: 'year', value: 'a' },
|
|
1831
1870
|
] }))),
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1871
|
+
React.createElement(FormSection, { title: "Repeat on" },
|
|
1872
|
+
React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true }, daysOfWeek.map((day) => (React.createElement(React.Fragment, { key: day },
|
|
1873
|
+
React.createElement("label", { htmlFor: 'timing-dialog-repeat-' + day }, day.charAt(0).toUpperCase()),
|
|
1874
|
+
React.createElement(core$1.Checkbox, { id: 'timing-dialog-repeat-' + day, name: 'timing-dialog-repeat-' + day, onChange: (e) => setDayOfWeek(day, e.currentTarget.checked) }))))))),
|
|
1875
|
+
React.createElement(core$1.Button, { onClick: () => props.onOk(value) }, "OK")));
|
|
1837
1876
|
}
|
|
1838
1877
|
|
|
1839
1878
|
function ResourcePropertyInput(props) {
|
|
@@ -1844,16 +1883,16 @@
|
|
|
1844
1883
|
const value = props.defaultValue;
|
|
1845
1884
|
if (property.max === '*' && !props.arrayElement) {
|
|
1846
1885
|
if (propertyType === 'Attachment') {
|
|
1847
|
-
return
|
|
1886
|
+
return React.createElement(AttachmentArrayInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1848
1887
|
}
|
|
1849
|
-
return
|
|
1888
|
+
return React.createElement(ResourceArrayInput, { property: property, name: name, defaultValue: value, onChange: props.onChange });
|
|
1850
1889
|
}
|
|
1851
1890
|
const propertyTypes = property.type;
|
|
1852
1891
|
if (propertyTypes.length > 1) {
|
|
1853
|
-
return
|
|
1892
|
+
return React.createElement(ElementDefinitionInputSelector, Object.assign({ elementDefinitionTypes: propertyTypes }, props));
|
|
1854
1893
|
}
|
|
1855
1894
|
else {
|
|
1856
|
-
return
|
|
1895
|
+
return React.createElement(ElementDefinitionTypeInput, Object.assign({ elementDefinitionType: propertyTypes[0] }, props));
|
|
1857
1896
|
}
|
|
1858
1897
|
}
|
|
1859
1898
|
function ElementDefinitionInputSelector(props) {
|
|
@@ -1866,14 +1905,14 @@
|
|
|
1866
1905
|
initialPropertyType = propertyTypes[0];
|
|
1867
1906
|
}
|
|
1868
1907
|
const [selectedType, setSelectedType] = React.useState(initialPropertyType);
|
|
1869
|
-
return (
|
|
1870
|
-
|
|
1908
|
+
return (React.createElement(core$1.Group, { spacing: "xs", grow: true, noWrap: true },
|
|
1909
|
+
React.createElement(core$1.NativeSelect, { style: { width: '200px' }, defaultValue: selectedType === null || selectedType === void 0 ? void 0 : selectedType.code, onChange: (e) => {
|
|
1871
1910
|
setSelectedType(propertyTypes.find((type) => type.code === e.currentTarget.value));
|
|
1872
1911
|
}, data: propertyTypes.map((type) => ({
|
|
1873
1912
|
value: type.code,
|
|
1874
1913
|
label: type.code,
|
|
1875
1914
|
})) }),
|
|
1876
|
-
|
|
1915
|
+
React.createElement(ElementDefinitionTypeInput, Object.assign({}, props, { elementDefinitionType: selectedType, onChange: (newValue) => {
|
|
1877
1916
|
if (props.onChange) {
|
|
1878
1917
|
props.onChange(newValue, props.name.replace('[x]', core.capitalize(selectedType.code)));
|
|
1879
1918
|
}
|
|
@@ -1894,39 +1933,39 @@
|
|
|
1894
1933
|
case core.PropertyType.time:
|
|
1895
1934
|
case core.PropertyType.uri:
|
|
1896
1935
|
case core.PropertyType.url:
|
|
1897
|
-
return (
|
|
1936
|
+
return (React.createElement(core$1.TextInput, { id: name, name: name, "data-testid": name, defaultValue: value, onChange: (e) => {
|
|
1898
1937
|
if (props.onChange) {
|
|
1899
1938
|
props.onChange(e.currentTarget.value);
|
|
1900
1939
|
}
|
|
1901
1940
|
}, error: getErrorsForInput(props.outcome, name) }));
|
|
1902
1941
|
case core.PropertyType.date:
|
|
1903
|
-
return (
|
|
1942
|
+
return (React.createElement(core$1.TextInput, { type: "date", id: name, name: name, "data-testid": name, defaultValue: value, onChange: (e) => {
|
|
1904
1943
|
if (props.onChange) {
|
|
1905
1944
|
props.onChange(e.currentTarget.value);
|
|
1906
1945
|
}
|
|
1907
1946
|
}, error: getErrorsForInput(props.outcome, name) }));
|
|
1908
1947
|
case core.PropertyType.dateTime:
|
|
1909
1948
|
case core.PropertyType.instant:
|
|
1910
|
-
return
|
|
1949
|
+
return React.createElement(DateTimeInput, { name: name, defaultValue: value, onChange: props.onChange, outcome: props.outcome });
|
|
1911
1950
|
case core.PropertyType.decimal:
|
|
1912
1951
|
case core.PropertyType.integer:
|
|
1913
1952
|
case core.PropertyType.positiveInt:
|
|
1914
1953
|
case core.PropertyType.unsignedInt:
|
|
1915
|
-
return (
|
|
1954
|
+
return (React.createElement(core$1.TextInput, { type: "number", step: propertyType === core.PropertyType.decimal ? 'any' : '1', id: name, name: name, "data-testid": name, defaultValue: value, onChange: (e) => {
|
|
1916
1955
|
if (props.onChange) {
|
|
1917
1956
|
props.onChange(e.currentTarget.valueAsNumber);
|
|
1918
1957
|
}
|
|
1919
1958
|
} }));
|
|
1920
1959
|
case core.PropertyType.code:
|
|
1921
|
-
return
|
|
1960
|
+
return React.createElement(CodeInput, { property: property, name: name, defaultValue: value, onChange: props.onChange });
|
|
1922
1961
|
case core.PropertyType.boolean:
|
|
1923
|
-
return (
|
|
1962
|
+
return (React.createElement(core$1.Checkbox, { id: name, name: name, "data-testid": name, defaultChecked: !!value, onChange: (e) => {
|
|
1924
1963
|
if (props.onChange) {
|
|
1925
1964
|
props.onChange(e.currentTarget.checked);
|
|
1926
1965
|
}
|
|
1927
1966
|
} }));
|
|
1928
1967
|
case core.PropertyType.markdown:
|
|
1929
|
-
return (
|
|
1968
|
+
return (React.createElement(core$1.Textarea, { id: name, name: name, "data-testid": name, defaultValue: value, onChange: (e) => {
|
|
1930
1969
|
if (props.onChange) {
|
|
1931
1970
|
props.onChange(e.currentTarget.value);
|
|
1932
1971
|
}
|
|
@@ -1934,39 +1973,39 @@
|
|
|
1934
1973
|
// 2.24.0.2 Complex Types
|
|
1935
1974
|
// https://www.hl7.org/fhir/datatypes.html#complex
|
|
1936
1975
|
case core.PropertyType.Address:
|
|
1937
|
-
return
|
|
1976
|
+
return React.createElement(AddressInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1938
1977
|
case core.PropertyType.Annotation:
|
|
1939
|
-
return
|
|
1978
|
+
return React.createElement(AnnotationInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1940
1979
|
case core.PropertyType.Attachment:
|
|
1941
|
-
return
|
|
1980
|
+
return React.createElement(AttachmentInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1942
1981
|
case core.PropertyType.CodeableConcept:
|
|
1943
|
-
return
|
|
1982
|
+
return React.createElement(CodeableConceptInput, { property: property, name: name, defaultValue: value, onChange: props.onChange });
|
|
1944
1983
|
case core.PropertyType.Coding:
|
|
1945
|
-
return
|
|
1984
|
+
return React.createElement(CodingInput, { property: property, name: name, defaultValue: value, onChange: props.onChange });
|
|
1946
1985
|
case core.PropertyType.ContactDetail:
|
|
1947
|
-
return
|
|
1986
|
+
return React.createElement(ContactDetailInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1948
1987
|
case core.PropertyType.ContactPoint:
|
|
1949
|
-
return
|
|
1988
|
+
return React.createElement(ContactPointInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1950
1989
|
case core.PropertyType.Extension:
|
|
1951
|
-
return
|
|
1990
|
+
return React.createElement(ExtensionInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1952
1991
|
case core.PropertyType.HumanName:
|
|
1953
|
-
return
|
|
1992
|
+
return React.createElement(HumanNameInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1954
1993
|
case core.PropertyType.Identifier:
|
|
1955
|
-
return
|
|
1994
|
+
return React.createElement(IdentifierInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1956
1995
|
case core.PropertyType.Period:
|
|
1957
|
-
return
|
|
1996
|
+
return React.createElement(PeriodInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1958
1997
|
case core.PropertyType.Quantity:
|
|
1959
|
-
return
|
|
1998
|
+
return React.createElement(QuantityInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1960
1999
|
case core.PropertyType.Range:
|
|
1961
|
-
return
|
|
2000
|
+
return React.createElement(RangeInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1962
2001
|
case core.PropertyType.Ratio:
|
|
1963
|
-
return
|
|
2002
|
+
return React.createElement(RatioInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1964
2003
|
case core.PropertyType.Reference:
|
|
1965
|
-
return (
|
|
2004
|
+
return (React.createElement(ReferenceInput, { name: name, defaultValue: value, targetTypes: getTargetTypes(property), onChange: props.onChange }));
|
|
1966
2005
|
case core.PropertyType.Timing:
|
|
1967
|
-
return
|
|
2006
|
+
return React.createElement(TimingInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1968
2007
|
default:
|
|
1969
|
-
return (
|
|
2008
|
+
return (React.createElement(BackboneElementInput, { typeName: core.buildTypeName((_a = property.path) === null || _a === void 0 ? void 0 : _a.split('.')), defaultValue: value, onChange: props.onChange, outcome: props.outcome }));
|
|
1970
2009
|
}
|
|
1971
2010
|
}
|
|
1972
2011
|
function getTargetTypes(property) {
|
|
@@ -1986,12 +2025,12 @@
|
|
|
1986
2025
|
const typeName = props.typeName;
|
|
1987
2026
|
const typeSchema = core.globalSchema.types[typeName];
|
|
1988
2027
|
if (!typeSchema) {
|
|
1989
|
-
return
|
|
2028
|
+
return React.createElement("div", null,
|
|
1990
2029
|
typeName,
|
|
1991
2030
|
"\u00A0not implemented");
|
|
1992
2031
|
}
|
|
1993
2032
|
const typedValue = { type: typeName, value };
|
|
1994
|
-
return (
|
|
2033
|
+
return (React.createElement(core$1.Stack, null, Object.entries(typeSchema.properties).map((entry) => {
|
|
1995
2034
|
const key = entry[0];
|
|
1996
2035
|
if (key === 'id' || DEFAULT_IGNORED_PROPERTIES.indexOf(key) >= 0) {
|
|
1997
2036
|
return null;
|
|
@@ -2002,33 +2041,53 @@
|
|
|
2002
2041
|
}
|
|
2003
2042
|
const [propertyValue, propertyType] = getValueAndType(typedValue, key);
|
|
2004
2043
|
if (property.type.length === 1 && property.type[0].code === 'boolean') {
|
|
2005
|
-
return (
|
|
2006
|
-
|
|
2044
|
+
return (React.createElement(CheckboxFormSection, { key: key, title: core.getPropertyDisplayName(key), description: property.definition, htmlFor: key },
|
|
2045
|
+
React.createElement(ResourcePropertyInput, { property: property, name: key, defaultValue: propertyValue, defaultPropertyType: propertyType, outcome: props.outcome, onChange: (newValue, propName) => {
|
|
2007
2046
|
setValueWrapper(setPropertyValue(value, key, propName !== null && propName !== void 0 ? propName : key, entry[1], newValue));
|
|
2008
2047
|
} })));
|
|
2009
2048
|
}
|
|
2010
|
-
return (
|
|
2011
|
-
|
|
2049
|
+
return (React.createElement(FormSection, { key: key, title: core.getPropertyDisplayName(key), description: property.definition, htmlFor: key, outcome: props.outcome },
|
|
2050
|
+
React.createElement(ResourcePropertyInput, { property: property, name: key, defaultValue: propertyValue, defaultPropertyType: propertyType, outcome: props.outcome, onChange: (newValue, propName) => {
|
|
2012
2051
|
setValueWrapper(setPropertyValue(value, key, propName !== null && propName !== void 0 ? propName : key, entry[1], newValue));
|
|
2013
2052
|
} })));
|
|
2014
2053
|
})));
|
|
2015
2054
|
}
|
|
2016
2055
|
|
|
2017
2056
|
function ResourceName(props) {
|
|
2018
|
-
const
|
|
2057
|
+
const { value, link } = props, rest = __rest(props, ["value", "link"]);
|
|
2058
|
+
const resource = useResource(value);
|
|
2019
2059
|
if (!resource) {
|
|
2020
2060
|
return null;
|
|
2021
2061
|
}
|
|
2022
2062
|
const text = core.getDisplayString(resource);
|
|
2023
|
-
return
|
|
2063
|
+
return link ? (React.createElement(MedplumLink, Object.assign({ to: resource }, rest), text)) : (React.createElement(core$1.Text, Object.assign({ component: "span" }, rest), text));
|
|
2024
2064
|
}
|
|
2025
2065
|
|
|
2026
2066
|
function ResourceBadge(props) {
|
|
2027
|
-
return (
|
|
2028
|
-
|
|
2029
|
-
|
|
2067
|
+
return (React.createElement(core$1.Group, { spacing: "xs" },
|
|
2068
|
+
React.createElement(ResourceAvatar, { size: 24, radius: 12, value: props.value, link: props.link }),
|
|
2069
|
+
React.createElement(ResourceName, { value: props.value, link: props.link })));
|
|
2030
2070
|
}
|
|
2031
2071
|
|
|
2072
|
+
const useStyles$9 = core$1.createStyles((theme) => ({
|
|
2073
|
+
table: {
|
|
2074
|
+
border: `0.1px solid ${theme.colors.gray[5]}`,
|
|
2075
|
+
borderCollapse: 'collapse',
|
|
2076
|
+
'& td, & th': {
|
|
2077
|
+
border: `0.1px solid ${theme.colors.gray[5]}`,
|
|
2078
|
+
padding: 4,
|
|
2079
|
+
},
|
|
2080
|
+
},
|
|
2081
|
+
criticalRow: {
|
|
2082
|
+
background: theme.colorScheme === 'dark' ? theme.colors.red[7] : theme.colors.red[1],
|
|
2083
|
+
border: `0.1px solid ${theme.colors.red[5]}`,
|
|
2084
|
+
color: theme.colors.red[5],
|
|
2085
|
+
fontWeight: 500,
|
|
2086
|
+
'& td': {
|
|
2087
|
+
border: `0.1px solid ${theme.colors.red[5]}`,
|
|
2088
|
+
},
|
|
2089
|
+
},
|
|
2090
|
+
}));
|
|
2032
2091
|
function DiagnosticReportDisplay(props) {
|
|
2033
2092
|
var _a, _b;
|
|
2034
2093
|
const diagnosticReport = useResource(props.value);
|
|
@@ -2048,69 +2107,68 @@
|
|
|
2048
2107
|
textContent += note.text + '\n\n';
|
|
2049
2108
|
}
|
|
2050
2109
|
}
|
|
2051
|
-
return (
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
diagnosticReport.subject && (
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
2110
|
+
return (React.createElement(core$1.Stack, null,
|
|
2111
|
+
React.createElement(core$1.Title, null, "Diagnostic Report"),
|
|
2112
|
+
React.createElement(core$1.Group, { mt: "md", spacing: 30 },
|
|
2113
|
+
diagnosticReport.subject && (React.createElement("div", null,
|
|
2114
|
+
React.createElement(core$1.Text, { size: "xs", transform: "uppercase", color: "dimmed" }, "Subject"),
|
|
2115
|
+
React.createElement(core$1.Text, null,
|
|
2116
|
+
React.createElement(ResourceBadge, { value: diagnosticReport.subject, link: true })))),
|
|
2058
2117
|
diagnosticReport.resultsInterpreter &&
|
|
2059
|
-
diagnosticReport.resultsInterpreter.map((interpreter) => (
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
diagnosticReport.issued && (
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
diagnosticReport.status && (
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
diagnosticReport.result &&
|
|
2070
|
-
textContent &&
|
|
2118
|
+
diagnosticReport.resultsInterpreter.map((interpreter) => (React.createElement("div", { key: interpreter.reference },
|
|
2119
|
+
React.createElement(core$1.Text, { size: "xs", transform: "uppercase", color: "dimmed" }, "Interpreter"),
|
|
2120
|
+
React.createElement(core$1.Text, null,
|
|
2121
|
+
React.createElement(ResourceBadge, { value: interpreter, link: true }))))),
|
|
2122
|
+
diagnosticReport.issued && (React.createElement("div", null,
|
|
2123
|
+
React.createElement(core$1.Text, { size: "xs", transform: "uppercase", color: "dimmed" }, "Issued"),
|
|
2124
|
+
React.createElement(core$1.Text, null, core.formatDateTime(diagnosticReport.issued)))),
|
|
2125
|
+
diagnosticReport.status && (React.createElement("div", null,
|
|
2126
|
+
React.createElement(core$1.Text, { size: "xs", transform: "uppercase", color: "dimmed" }, "Status"),
|
|
2127
|
+
React.createElement(core$1.Text, null, core.capitalize(diagnosticReport.status))))),
|
|
2128
|
+
diagnosticReport.result && React.createElement(ObservationTable, { value: diagnosticReport.result }),
|
|
2129
|
+
textContent && React.createElement("pre", null, textContent.trim())));
|
|
2071
2130
|
}
|
|
2072
2131
|
function ObservationTable(props) {
|
|
2073
2132
|
var _a;
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2077
|
-
|
|
2078
|
-
|
|
2079
|
-
|
|
2080
|
-
|
|
2081
|
-
|
|
2133
|
+
const { classes } = useStyles$9();
|
|
2134
|
+
return (React.createElement("table", { className: classes.table },
|
|
2135
|
+
React.createElement("thead", null,
|
|
2136
|
+
React.createElement("tr", null,
|
|
2137
|
+
React.createElement("th", null, "Test"),
|
|
2138
|
+
React.createElement("th", null, "Value"),
|
|
2139
|
+
React.createElement("th", null, "Reference Range"),
|
|
2140
|
+
React.createElement("th", null, "Interpretation"))),
|
|
2141
|
+
React.createElement("tbody", null, (_a = props.value) === null || _a === void 0 ? void 0 : _a.map((observation, index) => (React.createElement(ObservationRow, { key: 'obs-' + index, value: observation }))))));
|
|
2082
2142
|
}
|
|
2083
2143
|
function ObservationRow(props) {
|
|
2144
|
+
const { classes, cx } = useStyles$9();
|
|
2084
2145
|
const observation = useResource(props.value);
|
|
2085
2146
|
if (!observation) {
|
|
2086
2147
|
return null;
|
|
2087
2148
|
}
|
|
2088
|
-
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
React__default["default"].createElement("td", null,
|
|
2099
|
-
React__default["default"].createElement(ReferenceRangeDisplay, { value: observation.referenceRange })),
|
|
2100
|
-
React__default["default"].createElement("td", null, observation.interpretation && observation.interpretation.length > 0 && (React__default["default"].createElement(CodeableConceptDisplay, { value: observation.interpretation[0] })))));
|
|
2149
|
+
const critical = isCritical(observation);
|
|
2150
|
+
return (React.createElement("tr", { className: cx({ [classes.criticalRow]: critical }) },
|
|
2151
|
+
React.createElement("td", null,
|
|
2152
|
+
React.createElement(MedplumLink, { to: observation },
|
|
2153
|
+
React.createElement(CodeableConceptDisplay, { value: observation.code }))),
|
|
2154
|
+
React.createElement("td", null,
|
|
2155
|
+
React.createElement(ObservationValueDisplay, { value: observation })),
|
|
2156
|
+
React.createElement("td", null,
|
|
2157
|
+
React.createElement(ReferenceRangeDisplay, { value: observation.referenceRange })),
|
|
2158
|
+
React.createElement("td", null, observation.interpretation && observation.interpretation.length > 0 && (React.createElement(CodeableConceptDisplay, { value: observation.interpretation[0] })))));
|
|
2101
2159
|
}
|
|
2102
2160
|
function ObservationValueDisplay(props) {
|
|
2103
2161
|
var _a;
|
|
2104
2162
|
const obs = props.value;
|
|
2105
2163
|
if (obs === null || obs === void 0 ? void 0 : obs.valueQuantity) {
|
|
2106
|
-
return
|
|
2164
|
+
return React.createElement(QuantityDisplay, { value: (_a = props.value) === null || _a === void 0 ? void 0 : _a.valueQuantity });
|
|
2107
2165
|
}
|
|
2108
2166
|
if (obs === null || obs === void 0 ? void 0 : obs.valueString) {
|
|
2109
|
-
return
|
|
2167
|
+
return React.createElement(React.Fragment, null, obs.valueString);
|
|
2110
2168
|
}
|
|
2111
2169
|
if (obs && 'component' in obs && (obs === null || obs === void 0 ? void 0 : obs.component)) {
|
|
2112
|
-
return (
|
|
2113
|
-
.map((component, index) => (
|
|
2170
|
+
return (React.createElement(React.Fragment, null, obs.component
|
|
2171
|
+
.map((component, index) => (React.createElement(ObservationValueDisplay, { key: `obs-${index}`, value: component })))
|
|
2114
2172
|
.reduce((prev, curr) => [prev, ' / ', curr])));
|
|
2115
2173
|
}
|
|
2116
2174
|
return null;
|
|
@@ -2121,9 +2179,9 @@
|
|
|
2121
2179
|
return null;
|
|
2122
2180
|
}
|
|
2123
2181
|
if (range.text) {
|
|
2124
|
-
return
|
|
2182
|
+
return React.createElement(React.Fragment, null, range.text);
|
|
2125
2183
|
}
|
|
2126
|
-
return
|
|
2184
|
+
return React.createElement(RangeDisplay, { value: range });
|
|
2127
2185
|
}
|
|
2128
2186
|
/**
|
|
2129
2187
|
* Returns true if the observation is critical.
|
|
@@ -2137,7 +2195,28 @@
|
|
|
2137
2195
|
return code === 'AA' || code === 'LL' || code === 'HH' || code === 'RR';
|
|
2138
2196
|
}
|
|
2139
2197
|
|
|
2198
|
+
const useStyles$8 = core$1.createStyles((theme) => ({
|
|
2199
|
+
root: {
|
|
2200
|
+
borderCollapse: 'collapse',
|
|
2201
|
+
width: '100%',
|
|
2202
|
+
'& tr': {
|
|
2203
|
+
borderTop: `0.1px solid ${theme.colors.gray[3]}`,
|
|
2204
|
+
},
|
|
2205
|
+
'& th, & td': {
|
|
2206
|
+
padding: `${theme.spacing.sm}px ${theme.spacing.sm}px`,
|
|
2207
|
+
verticalAlign: 'top',
|
|
2208
|
+
},
|
|
2209
|
+
},
|
|
2210
|
+
removed: {
|
|
2211
|
+
color: theme.colors.red[7],
|
|
2212
|
+
textDecoration: 'line-through',
|
|
2213
|
+
},
|
|
2214
|
+
added: {
|
|
2215
|
+
color: theme.colors.green[7],
|
|
2216
|
+
},
|
|
2217
|
+
}));
|
|
2140
2218
|
function ResourceDiffTable(props) {
|
|
2219
|
+
const { classes } = useStyles$8();
|
|
2141
2220
|
const medplum = useMedplum();
|
|
2142
2221
|
const [schema, setSchema] = React.useState();
|
|
2143
2222
|
React.useEffect(() => {
|
|
@@ -2150,17 +2229,17 @@
|
|
|
2150
2229
|
if (!typeSchema) {
|
|
2151
2230
|
return null;
|
|
2152
2231
|
}
|
|
2153
|
-
return (
|
|
2154
|
-
|
|
2155
|
-
|
|
2156
|
-
|
|
2157
|
-
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
|
|
2163
|
-
|
|
2232
|
+
return (React.createElement("table", { className: classes.root },
|
|
2233
|
+
React.createElement("colgroup", null,
|
|
2234
|
+
React.createElement("col", { style: { width: '30%' } }),
|
|
2235
|
+
React.createElement("col", { style: { width: '35%' } }),
|
|
2236
|
+
React.createElement("col", { style: { width: '35%' } })),
|
|
2237
|
+
React.createElement("thead", null,
|
|
2238
|
+
React.createElement("tr", null,
|
|
2239
|
+
React.createElement("th", null, "Property"),
|
|
2240
|
+
React.createElement("th", null, "Before"),
|
|
2241
|
+
React.createElement("th", null, "After"))),
|
|
2242
|
+
React.createElement("tbody", null, Object.entries(typeSchema.properties).map((entry) => {
|
|
2164
2243
|
const key = entry[0];
|
|
2165
2244
|
if (key === 'id' || key === 'meta') {
|
|
2166
2245
|
return null;
|
|
@@ -2174,12 +2253,12 @@
|
|
|
2174
2253
|
if (core.stringify(originalPropertyValue) === core.stringify(revisedPropertyValue)) {
|
|
2175
2254
|
return null;
|
|
2176
2255
|
}
|
|
2177
|
-
return (
|
|
2178
|
-
|
|
2179
|
-
|
|
2180
|
-
|
|
2181
|
-
|
|
2182
|
-
|
|
2256
|
+
return (React.createElement("tr", { key: key },
|
|
2257
|
+
React.createElement("td", null, core.getPropertyDisplayName(key)),
|
|
2258
|
+
React.createElement("td", { className: classes.removed },
|
|
2259
|
+
React.createElement(ResourcePropertyDisplay, { property: property, propertyType: originalPropertyType, value: originalPropertyValue, ignoreMissingValues: true })),
|
|
2260
|
+
React.createElement("td", { className: classes.added },
|
|
2261
|
+
React.createElement(ResourcePropertyDisplay, { property: property, propertyType: revisedPropertyType, value: revisedPropertyValue, ignoreMissingValues: true }))));
|
|
2183
2262
|
}))));
|
|
2184
2263
|
}
|
|
2185
2264
|
function isEmpty(value) {
|
|
@@ -2200,14 +2279,14 @@
|
|
|
2200
2279
|
if (!schema || !value) {
|
|
2201
2280
|
return null;
|
|
2202
2281
|
}
|
|
2203
|
-
return (
|
|
2282
|
+
return (React.createElement(BackboneElementDisplay, { value: { type: value.resourceType, value }, ignoreMissingValues: props.ignoreMissingValues }));
|
|
2204
2283
|
}
|
|
2205
2284
|
|
|
2206
2285
|
/**
|
|
2207
2286
|
* ErrorBoundary is a React component that handles errors in its child components.
|
|
2208
2287
|
* See: https://reactjs.org/docs/error-boundaries.html
|
|
2209
2288
|
*/
|
|
2210
|
-
class ErrorBoundary extends
|
|
2289
|
+
class ErrorBoundary extends React.Component {
|
|
2211
2290
|
constructor(props) {
|
|
2212
2291
|
super(props);
|
|
2213
2292
|
this.state = {};
|
|
@@ -2220,39 +2299,36 @@
|
|
|
2220
2299
|
}
|
|
2221
2300
|
render() {
|
|
2222
2301
|
if (this.state.error) {
|
|
2223
|
-
return
|
|
2302
|
+
return React.createElement(core$1.Title, null, "Something went wrong.");
|
|
2224
2303
|
}
|
|
2225
2304
|
return this.props.children;
|
|
2226
2305
|
}
|
|
2227
2306
|
}
|
|
2228
2307
|
|
|
2229
2308
|
function Timeline(props) {
|
|
2230
|
-
return
|
|
2309
|
+
return React.createElement(core$1.Container, null, props.children);
|
|
2231
2310
|
}
|
|
2232
2311
|
function TimelineItem(props) {
|
|
2233
2312
|
var _a, _b, _c;
|
|
2234
2313
|
const author = (_a = props.profile) !== null && _a !== void 0 ? _a : (_b = props.resource.meta) === null || _b === void 0 ? void 0 : _b.author;
|
|
2235
|
-
return (
|
|
2236
|
-
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
props.popupMenuItems && (
|
|
2246
|
-
|
|
2247
|
-
|
|
2248
|
-
|
|
2314
|
+
return (React.createElement(core$1.Paper, { "data-testid": "timeline-item", m: "lg", p: "sm", shadow: "xs", radius: "sm", withBorder: true, className: props.className },
|
|
2315
|
+
React.createElement(core$1.Group, { position: "apart", spacing: 8 },
|
|
2316
|
+
React.createElement(ResourceAvatar, { value: author, link: true, size: "md" }),
|
|
2317
|
+
React.createElement("div", { style: { flex: 1 } },
|
|
2318
|
+
React.createElement(core$1.Text, { size: "sm" },
|
|
2319
|
+
React.createElement(ResourceName, { color: "dark", weight: 500, value: author, link: true })),
|
|
2320
|
+
React.createElement(core$1.Text, { size: "xs" },
|
|
2321
|
+
React.createElement(MedplumLink, { color: "dimmed", to: props.resource }, core.formatDateTime((_c = props.resource.meta) === null || _c === void 0 ? void 0 : _c.lastUpdated)),
|
|
2322
|
+
React.createElement(core$1.Text, { component: "span", color: "dimmed", mx: 8 }, "\u00B7"),
|
|
2323
|
+
React.createElement(MedplumLink, { color: "dimmed", to: props.resource }, props.resource.resourceType))),
|
|
2324
|
+
props.popupMenuItems && (React.createElement(core$1.Menu, { position: "bottom-end", shadow: "md", width: 200 },
|
|
2325
|
+
React.createElement(core$1.Menu.Target, null,
|
|
2326
|
+
React.createElement(core$1.ActionIcon, { radius: "xl", "aria-label": `Actions for ${core.getReferenceString(props.resource)}` },
|
|
2327
|
+
React.createElement(icons.IconDots, null))),
|
|
2249
2328
|
props.popupMenuItems))),
|
|
2250
|
-
|
|
2251
|
-
props.padding &&
|
|
2252
|
-
!props.padding &&
|
|
2253
|
-
props.socialEnabled && (React__default["default"].createElement("div", { className: "medplum-timeline-item-footer" },
|
|
2254
|
-
React__default["default"].createElement(core$1.Button, { variant: "subtle" }, "Like"),
|
|
2255
|
-
React__default["default"].createElement(core$1.Button, { variant: "subtle" }, "Comment")))));
|
|
2329
|
+
React.createElement(ErrorBoundary, null,
|
|
2330
|
+
props.padding && React.createElement("div", { style: { padding: '2px 16px 16px 16px' } }, props.children),
|
|
2331
|
+
!props.padding && React.createElement(React.Fragment, null, props.children))));
|
|
2256
2332
|
}
|
|
2257
2333
|
|
|
2258
2334
|
/**
|
|
@@ -2301,6 +2377,11 @@
|
|
|
2301
2377
|
return new Date(dateTime).getTime();
|
|
2302
2378
|
}
|
|
2303
2379
|
|
|
2380
|
+
const useStyles$7 = core$1.createStyles((theme) => ({
|
|
2381
|
+
pinnedComment: {
|
|
2382
|
+
backgroundColor: theme.colors.blue[0],
|
|
2383
|
+
},
|
|
2384
|
+
}));
|
|
2304
2385
|
function ResourceTimeline(props) {
|
|
2305
2386
|
const navigate = reactRouterDom.useNavigate();
|
|
2306
2387
|
const medplum = useMedplum();
|
|
@@ -2389,10 +2470,23 @@
|
|
|
2389
2470
|
}
|
|
2390
2471
|
medplum
|
|
2391
2472
|
.createResource(props.createMedia(resource, sender, attachment))
|
|
2392
|
-
.then((result) =>
|
|
2393
|
-
|
|
2394
|
-
|
|
2395
|
-
|
|
2473
|
+
.then((result) => addResources([result]))
|
|
2474
|
+
.then(() => notifications.updateNotification({
|
|
2475
|
+
id: 'upload-notification',
|
|
2476
|
+
color: 'teal',
|
|
2477
|
+
title: 'Upload complete',
|
|
2478
|
+
message: '',
|
|
2479
|
+
icon: React.createElement(icons.IconCheck, { size: 16 }),
|
|
2480
|
+
autoClose: 2000,
|
|
2481
|
+
}))
|
|
2482
|
+
.catch((reason) => notifications.updateNotification({
|
|
2483
|
+
id: 'upload-notification',
|
|
2484
|
+
color: 'red',
|
|
2485
|
+
title: 'Upload error',
|
|
2486
|
+
message: core.normalizeErrorString(reason),
|
|
2487
|
+
icon: React.createElement(icons.IconFileAlert, { size: 16 }),
|
|
2488
|
+
autoClose: 2000,
|
|
2489
|
+
}));
|
|
2396
2490
|
}
|
|
2397
2491
|
function setPriority(communication, priority) {
|
|
2398
2492
|
return medplum.updateResource(Object.assign(Object.assign({}, communication), { priority }));
|
|
@@ -2416,70 +2510,89 @@
|
|
|
2416
2510
|
var _a;
|
|
2417
2511
|
navigate(`/${version.resourceType}/${version.id}/_history/${(_a = version.meta) === null || _a === void 0 ? void 0 : _a.versionId}`);
|
|
2418
2512
|
}
|
|
2513
|
+
function onUploadStart() {
|
|
2514
|
+
notifications.showNotification({
|
|
2515
|
+
id: 'upload-notification',
|
|
2516
|
+
loading: true,
|
|
2517
|
+
title: 'Initializing upload...',
|
|
2518
|
+
message: 'Please wait...',
|
|
2519
|
+
autoClose: false,
|
|
2520
|
+
disallowClose: true,
|
|
2521
|
+
});
|
|
2522
|
+
}
|
|
2523
|
+
function onUploadProgress(e) {
|
|
2524
|
+
notifications.updateNotification({
|
|
2525
|
+
id: 'upload-notification',
|
|
2526
|
+
loading: true,
|
|
2527
|
+
title: 'Uploading...',
|
|
2528
|
+
message: getProgressMessage(e),
|
|
2529
|
+
autoClose: false,
|
|
2530
|
+
disallowClose: true,
|
|
2531
|
+
});
|
|
2532
|
+
}
|
|
2419
2533
|
if (!resource || !history) {
|
|
2420
|
-
return
|
|
2421
|
-
}
|
|
2422
|
-
return (
|
|
2423
|
-
props.createCommunication && (
|
|
2424
|
-
|
|
2425
|
-
|
|
2426
|
-
|
|
2427
|
-
|
|
2428
|
-
|
|
2429
|
-
|
|
2430
|
-
|
|
2431
|
-
|
|
2432
|
-
|
|
2433
|
-
|
|
2434
|
-
|
|
2435
|
-
|
|
2436
|
-
|
|
2437
|
-
|
|
2438
|
-
|
|
2439
|
-
React__default["default"].createElement(icons.IconCloudUpload, { size: 16 }))))))))),
|
|
2534
|
+
return React.createElement(core$1.Loader, null);
|
|
2535
|
+
}
|
|
2536
|
+
return (React.createElement(Timeline, null,
|
|
2537
|
+
props.createCommunication && (React.createElement(core$1.Paper, { m: "lg", p: "sm", shadow: "xs", radius: "sm", withBorder: true },
|
|
2538
|
+
React.createElement(Form, { testid: "timeline-form", onSubmit: (formData) => {
|
|
2539
|
+
createComment(formData.text);
|
|
2540
|
+
const input = inputRef.current;
|
|
2541
|
+
if (input) {
|
|
2542
|
+
input.value = '';
|
|
2543
|
+
input.focus();
|
|
2544
|
+
}
|
|
2545
|
+
} },
|
|
2546
|
+
React.createElement(core$1.Group, { spacing: "xs", noWrap: true, style: { width: '100%' } },
|
|
2547
|
+
React.createElement(ResourceAvatar, { value: sender }),
|
|
2548
|
+
React.createElement(core$1.TextInput, { name: "text", ref: inputRef, placeholder: "Add comment", style: { width: '100%', maxWidth: 300 } }),
|
|
2549
|
+
React.createElement(core$1.ActionIcon, { type: "submit", radius: "xl", color: "blue", variant: "filled" },
|
|
2550
|
+
React.createElement(icons.IconMessage, { size: 16 })),
|
|
2551
|
+
React.createElement(AttachmentButton, { onUpload: createMedia, onUploadStart: onUploadStart, onUploadProgress: onUploadProgress }, (props) => (React.createElement(core$1.ActionIcon, Object.assign({}, props, { radius: "xl", color: "blue", variant: "filled" }),
|
|
2552
|
+
React.createElement(icons.IconCloudUpload, { size: 16 })))))))),
|
|
2440
2553
|
items.map((item) => {
|
|
2441
2554
|
var _a;
|
|
2442
2555
|
if (item.resourceType === resource.resourceType && item.id === resource.id) {
|
|
2443
|
-
return (
|
|
2556
|
+
return (React.createElement(HistoryTimelineItem, { key: (_a = item.meta) === null || _a === void 0 ? void 0 : _a.versionId, history: history, resource: item, onDetails: onVersionDetails }));
|
|
2444
2557
|
}
|
|
2445
2558
|
const key = `${item.resourceType}/${item.id}`;
|
|
2446
2559
|
switch (item.resourceType) {
|
|
2447
2560
|
case 'AuditEvent':
|
|
2448
|
-
return
|
|
2561
|
+
return React.createElement(AuditEventTimelineItem, { key: key, resource: item, onDetails: onDetails });
|
|
2449
2562
|
case 'Communication':
|
|
2450
|
-
return (
|
|
2563
|
+
return (React.createElement(CommunicationTimelineItem, { key: key, resource: item, onPin: item.priority !== 'stat' ? onPin : undefined, onUnpin: item.priority === 'stat' ? onUnpin : undefined, onDetails: onDetails, onEdit: onEdit, onDelete: onDelete }));
|
|
2451
2564
|
case 'DiagnosticReport':
|
|
2452
|
-
return (
|
|
2565
|
+
return (React.createElement(DiagnosticReportTimelineItem, { key: key, resource: item, onDetails: onDetails, onEdit: onEdit, onDelete: onDelete }));
|
|
2453
2566
|
case 'Media':
|
|
2454
|
-
return (
|
|
2567
|
+
return (React.createElement(MediaTimelineItem, { key: key, resource: item, onDetails: onDetails, onEdit: onEdit, onDelete: onDelete }));
|
|
2455
2568
|
default:
|
|
2456
|
-
return (
|
|
2457
|
-
|
|
2569
|
+
return (React.createElement(TimelineItem, { key: key, resource: item, padding: true },
|
|
2570
|
+
React.createElement(ResourceTable, { value: item, ignoreMissingValues: true })));
|
|
2458
2571
|
}
|
|
2459
2572
|
})));
|
|
2460
2573
|
}
|
|
2461
2574
|
function TimelineItemPopupMenu(props) {
|
|
2462
|
-
return (
|
|
2463
|
-
|
|
2464
|
-
props.onPin && (
|
|
2465
|
-
props.onUnpin && (
|
|
2466
|
-
props.onDetails && (
|
|
2467
|
-
props.onEdit && (
|
|
2468
|
-
props.onDelete && (
|
|
2469
|
-
|
|
2470
|
-
|
|
2471
|
-
|
|
2575
|
+
return (React.createElement(core$1.Menu.Dropdown, null,
|
|
2576
|
+
React.createElement(core$1.Menu.Label, null, "Resource"),
|
|
2577
|
+
props.onPin && (React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconPin, { size: 14 }), onClick: () => props.onPin(props.resource), "aria-label": `Pin ${core.getReferenceString(props.resource)}` }, "Pin")),
|
|
2578
|
+
props.onUnpin && (React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconPinnedOff, { size: 14 }), onClick: () => props.onUnpin(props.resource), "aria-label": `Unpin ${core.getReferenceString(props.resource)}` }, "Unpin")),
|
|
2579
|
+
props.onDetails && (React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconListDetails, { size: 14 }), onClick: () => props.onDetails(props.resource), "aria-label": `Details ${core.getReferenceString(props.resource)}` }, "Details")),
|
|
2580
|
+
props.onEdit && (React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconEdit, { size: 14 }), onClick: () => props.onEdit(props.resource), "aria-label": `Edit ${core.getReferenceString(props.resource)}` }, "Edit")),
|
|
2581
|
+
props.onDelete && (React.createElement(React.Fragment, null,
|
|
2582
|
+
React.createElement(core$1.Menu.Divider, null),
|
|
2583
|
+
React.createElement(core$1.Menu.Label, null, "Danger zone"),
|
|
2584
|
+
React.createElement(core$1.Menu.Item, { color: "red", icon: React.createElement(icons.IconTrash, { size: 14 }), onClick: () => props.onDelete(props.resource), "aria-label": `Delete ${core.getReferenceString(props.resource)}` }, "Delete")))));
|
|
2472
2585
|
}
|
|
2473
2586
|
function HistoryTimelineItem(props) {
|
|
2474
2587
|
const previous = getPrevious(props.history, props.resource);
|
|
2475
2588
|
if (previous) {
|
|
2476
|
-
return (
|
|
2477
|
-
|
|
2589
|
+
return (React.createElement(TimelineItem, { resource: props.resource, padding: true, popupMenuItems: React.createElement(TimelineItemPopupMenu, Object.assign({}, props)) },
|
|
2590
|
+
React.createElement(ResourceDiffTable, { original: previous, revised: props.resource })));
|
|
2478
2591
|
}
|
|
2479
2592
|
else {
|
|
2480
|
-
return (
|
|
2481
|
-
|
|
2482
|
-
|
|
2593
|
+
return (React.createElement(TimelineItem, { resource: props.resource, padding: true, popupMenuItems: React.createElement(TimelineItemPopupMenu, Object.assign({}, props)) },
|
|
2594
|
+
React.createElement("h3", null, "Created"),
|
|
2595
|
+
React.createElement(ResourceTable, { value: props.resource, ignoreMissingValues: true })));
|
|
2483
2596
|
}
|
|
2484
2597
|
}
|
|
2485
2598
|
function getPrevious(history, version) {
|
|
@@ -2492,10 +2605,11 @@
|
|
|
2492
2605
|
}
|
|
2493
2606
|
function CommunicationTimelineItem(props) {
|
|
2494
2607
|
var _a, _b;
|
|
2608
|
+
const { classes } = useStyles$7();
|
|
2495
2609
|
const routine = !props.resource.priority || props.resource.priority === 'routine';
|
|
2496
|
-
const className = routine ?
|
|
2497
|
-
return (
|
|
2498
|
-
|
|
2610
|
+
const className = routine ? undefined : classes.pinnedComment;
|
|
2611
|
+
return (React.createElement(TimelineItem, { resource: props.resource, profile: props.resource.sender, padding: true, className: className, popupMenuItems: React.createElement(TimelineItemPopupMenu, Object.assign({}, props)) },
|
|
2612
|
+
React.createElement("p", null, (_b = (_a = props.resource.payload) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.contentString)));
|
|
2499
2613
|
}
|
|
2500
2614
|
function MediaTimelineItem(props) {
|
|
2501
2615
|
var _a;
|
|
@@ -2504,21 +2618,35 @@
|
|
|
2504
2618
|
!contentType.startsWith('image/') &&
|
|
2505
2619
|
!contentType.startsWith('video/') &&
|
|
2506
2620
|
contentType !== 'application/pdf';
|
|
2507
|
-
return (
|
|
2508
|
-
|
|
2621
|
+
return (React.createElement(TimelineItem, { resource: props.resource, padding: !!padding, popupMenuItems: React.createElement(TimelineItemPopupMenu, Object.assign({}, props)) },
|
|
2622
|
+
React.createElement(AttachmentDisplay, { value: props.resource.content })));
|
|
2509
2623
|
}
|
|
2510
2624
|
function AuditEventTimelineItem(props) {
|
|
2511
|
-
return (
|
|
2512
|
-
|
|
2513
|
-
|
|
2625
|
+
return (React.createElement(TimelineItem, { resource: props.resource, padding: true, popupMenuItems: React.createElement(TimelineItemPopupMenu, Object.assign({}, props)) },
|
|
2626
|
+
React.createElement(core$1.ScrollArea, null,
|
|
2627
|
+
React.createElement("pre", null, props.resource.outcomeDesc))));
|
|
2514
2628
|
}
|
|
2515
2629
|
function DiagnosticReportTimelineItem(props) {
|
|
2516
|
-
return (
|
|
2517
|
-
|
|
2630
|
+
return (React.createElement(TimelineItem, { resource: props.resource, padding: true, popupMenuItems: React.createElement(TimelineItemPopupMenu, Object.assign({}, props)) },
|
|
2631
|
+
React.createElement(DiagnosticReportDisplay, { value: props.resource })));
|
|
2632
|
+
}
|
|
2633
|
+
function getProgressMessage(e) {
|
|
2634
|
+
if (e.lengthComputable) {
|
|
2635
|
+
const percent = (100 * e.loaded) / e.total;
|
|
2636
|
+
return `Uploaded: ${formatFileSize(e.loaded)} / ${formatFileSize(e.total)} ${percent.toFixed(2)}%`;
|
|
2637
|
+
}
|
|
2638
|
+
return `Uploaded: ${formatFileSize(e.loaded)}`;
|
|
2639
|
+
}
|
|
2640
|
+
function formatFileSize(bytes) {
|
|
2641
|
+
if (bytes == 0) {
|
|
2642
|
+
return '0.00 B';
|
|
2643
|
+
}
|
|
2644
|
+
const e = Math.floor(Math.log(bytes) / Math.log(1024));
|
|
2645
|
+
return (bytes / Math.pow(1024, e)).toFixed(2) + ' ' + ' KMGTP'.charAt(e) + 'B';
|
|
2518
2646
|
}
|
|
2519
2647
|
|
|
2520
2648
|
function DefaultResourceTimeline(props) {
|
|
2521
|
-
return (
|
|
2649
|
+
return (React.createElement(ResourceTimeline, { value: props.resource, buildSearchRequests: (resource) => ({
|
|
2522
2650
|
resourceType: 'Bundle',
|
|
2523
2651
|
type: 'batch',
|
|
2524
2652
|
entry: [
|
|
@@ -2539,7 +2667,7 @@
|
|
|
2539
2667
|
}
|
|
2540
2668
|
|
|
2541
2669
|
function EncounterTimeline(props) {
|
|
2542
|
-
return (
|
|
2670
|
+
return (React.createElement(ResourceTimeline, { value: props.encounter, buildSearchRequests: (resource) => ({
|
|
2543
2671
|
resourceType: 'Bundle',
|
|
2544
2672
|
type: 'batch',
|
|
2545
2673
|
entry: [
|
|
@@ -2595,7 +2723,7 @@
|
|
|
2595
2723
|
Received ${value.length} elements \
|
|
2596
2724
|
[${JSON.stringify(value, null, 2)}]`);
|
|
2597
2725
|
}
|
|
2598
|
-
return
|
|
2726
|
+
return React.createElement(ResourcePropertyDisplay, { value: value[0] || '', propertyType: props.propertyType });
|
|
2599
2727
|
}
|
|
2600
2728
|
|
|
2601
2729
|
/**
|
|
@@ -3150,7 +3278,7 @@
|
|
|
3150
3278
|
if (!value) {
|
|
3151
3279
|
return null;
|
|
3152
3280
|
}
|
|
3153
|
-
return (
|
|
3281
|
+
return (React.createElement(ResourcePropertyDisplay, { property: elementDefinition, propertyType: propertyType, value: value, maxWidth: 200, ignoreMissingValues: true, link: false }));
|
|
3154
3282
|
}
|
|
3155
3283
|
/**
|
|
3156
3284
|
* Returns a fragment to be displayed in the search table for a search parameter.
|
|
@@ -3165,9 +3293,9 @@
|
|
|
3165
3293
|
return null;
|
|
3166
3294
|
}
|
|
3167
3295
|
if (elementDefinition) {
|
|
3168
|
-
return (
|
|
3296
|
+
return (React.createElement(ResourcePropertyDisplay, { propertyType: value[0].type, value: value[0].value, maxWidth: 200, ignoreMissingValues: true, link: false }));
|
|
3169
3297
|
}
|
|
3170
|
-
return (
|
|
3298
|
+
return (React.createElement(React.Fragment, null, value.map((v, index) => (React.createElement("span", { key: `${index}-${value.length}` }, typeof v === 'object' ? JSON.stringify(v) : v)))));
|
|
3171
3299
|
}
|
|
3172
3300
|
|
|
3173
3301
|
function SearchFieldEditor(props) {
|
|
@@ -3301,30 +3429,30 @@
|
|
|
3301
3429
|
const available = getFieldsList(typeDef)
|
|
3302
3430
|
.filter((field) => !(selected === null || selected === void 0 ? void 0 : selected.includes(field)))
|
|
3303
3431
|
.sort();
|
|
3304
|
-
return (
|
|
3305
|
-
|
|
3306
|
-
|
|
3307
|
-
|
|
3308
|
-
|
|
3309
|
-
|
|
3310
|
-
|
|
3311
|
-
|
|
3312
|
-
|
|
3313
|
-
|
|
3314
|
-
|
|
3315
|
-
|
|
3316
|
-
|
|
3317
|
-
|
|
3318
|
-
|
|
3319
|
-
|
|
3320
|
-
|
|
3321
|
-
|
|
3322
|
-
|
|
3323
|
-
|
|
3324
|
-
|
|
3325
|
-
|
|
3326
|
-
|
|
3327
|
-
|
|
3432
|
+
return (React.createElement(core$1.Modal, { title: "Fields", closeButtonLabel: "Close", opened: props.visible, onClose: props.onCancel },
|
|
3433
|
+
React.createElement("div", null,
|
|
3434
|
+
React.createElement("table", { style: { margin: 'auto' } },
|
|
3435
|
+
React.createElement("thead", null,
|
|
3436
|
+
React.createElement("tr", null,
|
|
3437
|
+
React.createElement("th", { colSpan: 2, align: "center" }, "Available"),
|
|
3438
|
+
React.createElement("th", { colSpan: 2, align: "center" }, "Selected"))),
|
|
3439
|
+
React.createElement("tbody", null,
|
|
3440
|
+
React.createElement("tr", null,
|
|
3441
|
+
React.createElement("td", { colSpan: 2, align: "center" },
|
|
3442
|
+
React.createElement("select", { ref: availableRef, size: 15, tabIndex: 1, style: { width: '200px' }, onKeyDown: (e) => handleAvailableKeyDown(e), onDoubleClick: () => handleAvailableDoubleClick(), "data-testid": "available" }, available.map((key) => (React.createElement("option", { key: key, value: key }, buildFieldNameString(key)))))),
|
|
3443
|
+
React.createElement("td", { colSpan: 2, align: "center" },
|
|
3444
|
+
React.createElement("select", { ref: selectedRef, size: 15, tabIndex: 4, style: { width: '200px' }, onKeyDown: (e) => handleSelectedKeyDown(e), onDoubleClick: () => handleSelectedDoubleClick(), "data-testid": "selected" }, selected.map((key) => (React.createElement("option", { key: key, value: key }, buildFieldNameString(key)))))))),
|
|
3445
|
+
React.createElement("tfoot", null,
|
|
3446
|
+
React.createElement("tr", null,
|
|
3447
|
+
React.createElement("td", { align: "center" },
|
|
3448
|
+
React.createElement(core$1.Button, { compact: true, variant: "outline", onClick: onAddField }, "Add")),
|
|
3449
|
+
React.createElement("td", { align: "center" },
|
|
3450
|
+
React.createElement(core$1.Button, { compact: true, variant: "outline", onClick: onRemoveField }, "Remove")),
|
|
3451
|
+
React.createElement("td", { align: "center" },
|
|
3452
|
+
React.createElement(core$1.Button, { compact: true, variant: "outline", onClick: onMoveUp }, "Up")),
|
|
3453
|
+
React.createElement("td", { align: "center" },
|
|
3454
|
+
React.createElement(core$1.Button, { compact: true, variant: "outline", onClick: onMoveDown }, "Down")))))),
|
|
3455
|
+
React.createElement(core$1.Button, { onClick: () => props.onOk(state.search) }, "OK")));
|
|
3328
3456
|
}
|
|
3329
3457
|
/**
|
|
3330
3458
|
* Returns a list of fields/columns available for a type.
|
|
@@ -3361,14 +3489,14 @@
|
|
|
3361
3489
|
const searchParam = (_b = (_a = core.globalSchema.types[resourceType]) === null || _a === void 0 ? void 0 : _a.searchParams) === null || _b === void 0 ? void 0 : _b[filter.code];
|
|
3362
3490
|
if (searchParam) {
|
|
3363
3491
|
if (searchParam.type === 'reference') {
|
|
3364
|
-
return
|
|
3492
|
+
return React.createElement(ResourceName, { value: { reference: filter.value } });
|
|
3365
3493
|
}
|
|
3366
3494
|
const searchParamDetails = core.getSearchParameterDetails(resourceType, searchParam);
|
|
3367
3495
|
if (filter.code === '_lastUpdated' || searchParamDetails.type === core.SearchParameterType.DATETIME) {
|
|
3368
|
-
return
|
|
3496
|
+
return React.createElement(React.Fragment, null, core.formatDateTime(filter.value));
|
|
3369
3497
|
}
|
|
3370
3498
|
}
|
|
3371
|
-
return
|
|
3499
|
+
return React.createElement(React.Fragment, null, filter.value);
|
|
3372
3500
|
}
|
|
3373
3501
|
|
|
3374
3502
|
function SearchFilterValueInput(props) {
|
|
@@ -3377,7 +3505,7 @@
|
|
|
3377
3505
|
const name = 'filter-value';
|
|
3378
3506
|
switch (details.type) {
|
|
3379
3507
|
case core.SearchParameterType.REFERENCE:
|
|
3380
|
-
return (
|
|
3508
|
+
return (React.createElement(ReferenceInput, { name: name, defaultValue: { reference: props.defaultValue }, targetTypes: (_a = props.searchParam) === null || _a === void 0 ? void 0 : _a.target, onChange: (newReference) => {
|
|
3381
3509
|
if (newReference) {
|
|
3382
3510
|
props.onChange(newReference.reference);
|
|
3383
3511
|
}
|
|
@@ -3386,15 +3514,15 @@
|
|
|
3386
3514
|
}
|
|
3387
3515
|
} }));
|
|
3388
3516
|
case core.SearchParameterType.BOOLEAN:
|
|
3389
|
-
return (
|
|
3517
|
+
return (React.createElement(core$1.Checkbox, { name: name, "data-testid": name, defaultChecked: props.defaultValue === 'true', onChange: (e) => props.onChange(e.currentTarget.checked.toString()) }));
|
|
3390
3518
|
case core.SearchParameterType.DATE:
|
|
3391
|
-
return (
|
|
3519
|
+
return (React.createElement(core$1.TextInput, { type: "date", name: name, "data-testid": name, defaultValue: props.defaultValue, onChange: (e) => props.onChange(e.currentTarget.value) }));
|
|
3392
3520
|
case core.SearchParameterType.DATETIME:
|
|
3393
|
-
return
|
|
3521
|
+
return React.createElement(DateTimeInput, { name: name, defaultValue: props.defaultValue, onChange: props.onChange });
|
|
3394
3522
|
case core.SearchParameterType.NUMBER:
|
|
3395
|
-
return (
|
|
3523
|
+
return (React.createElement(core$1.TextInput, { type: "number", name: name, "data-testid": name, defaultValue: props.defaultValue, onChange: (e) => props.onChange(e.currentTarget.value) }));
|
|
3396
3524
|
case core.SearchParameterType.QUANTITY:
|
|
3397
|
-
return (
|
|
3525
|
+
return (React.createElement(QuantityInput, { name: name, defaultValue: tryParseQuantity(props.defaultValue), onChange: (newQuantity) => {
|
|
3398
3526
|
if (newQuantity) {
|
|
3399
3527
|
props.onChange(`${newQuantity.value}`);
|
|
3400
3528
|
}
|
|
@@ -3403,7 +3531,7 @@
|
|
|
3403
3531
|
}
|
|
3404
3532
|
} }));
|
|
3405
3533
|
default:
|
|
3406
|
-
return (
|
|
3534
|
+
return (React.createElement(core$1.TextInput, { name: name, "data-testid": name, defaultValue: props.defaultValue, autoFocus: props.autoFocus, onChange: (e) => props.onChange(e.currentTarget.value), placeholder: "Search value" }));
|
|
3407
3535
|
}
|
|
3408
3536
|
}
|
|
3409
3537
|
function tryParseQuantity(value) {
|
|
@@ -3437,24 +3565,24 @@
|
|
|
3437
3565
|
const resourceType = props.search.resourceType;
|
|
3438
3566
|
const searchParams = core.globalSchema.types[resourceType].searchParams;
|
|
3439
3567
|
const filters = search.filters || [];
|
|
3440
|
-
return (
|
|
3441
|
-
|
|
3442
|
-
|
|
3443
|
-
|
|
3444
|
-
|
|
3445
|
-
|
|
3446
|
-
|
|
3447
|
-
|
|
3448
|
-
|
|
3449
|
-
|
|
3450
|
-
|
|
3451
|
-
|
|
3452
|
-
|
|
3453
|
-
|
|
3454
|
-
|
|
3568
|
+
return (React.createElement(core$1.Modal, { title: "Filters", closeButtonLabel: "Close", size: 900, opened: props.visible, onClose: props.onCancel },
|
|
3569
|
+
React.createElement("div", null,
|
|
3570
|
+
React.createElement("table", null,
|
|
3571
|
+
React.createElement("colgroup", null,
|
|
3572
|
+
React.createElement("col", { style: { width: 200 } }),
|
|
3573
|
+
React.createElement("col", { style: { width: 200 } }),
|
|
3574
|
+
React.createElement("col", { style: { width: 380 } }),
|
|
3575
|
+
React.createElement("col", { style: { width: 120 } })),
|
|
3576
|
+
React.createElement("thead", null,
|
|
3577
|
+
React.createElement("tr", null,
|
|
3578
|
+
React.createElement("th", null, "Field"),
|
|
3579
|
+
React.createElement("th", null, "Operation"),
|
|
3580
|
+
React.createElement("th", null, "Value"),
|
|
3581
|
+
React.createElement("th", null, "Actions"))),
|
|
3582
|
+
React.createElement("tbody", null,
|
|
3455
3583
|
filters.map((filter, index) => {
|
|
3456
3584
|
if (index === editingIndex) {
|
|
3457
|
-
return (
|
|
3585
|
+
return (React.createElement(FilterRowInput, { key: `filter-${index}-${filters.length}-input`, resourceType: resourceType, searchParams: searchParams, defaultValue: filter, okText: "Save", onOk: (newFilter) => {
|
|
3458
3586
|
const newFilters = [...filters];
|
|
3459
3587
|
newFilters[index] = newFilter;
|
|
3460
3588
|
setSearch(setFilters(searchRef.current, newFilters));
|
|
@@ -3462,23 +3590,23 @@
|
|
|
3462
3590
|
}, onCancel: () => setEditingIndex(-1) }));
|
|
3463
3591
|
}
|
|
3464
3592
|
else {
|
|
3465
|
-
return (
|
|
3593
|
+
return (React.createElement(FilterRowDisplay, { key: `filter-${index}-${filters.length}-display`, resourceType: resourceType, searchParams: searchParams, filter: filter, onEdit: () => setEditingIndex(index), onDelete: () => setSearch(deleteFilter(searchRef.current, index)) }));
|
|
3466
3594
|
}
|
|
3467
3595
|
}),
|
|
3468
|
-
|
|
3469
|
-
|
|
3470
|
-
|
|
3596
|
+
React.createElement(FilterRowInput, { resourceType: resourceType, searchParams: searchParams, okText: "Add", onOk: onAddFilter })))),
|
|
3597
|
+
React.createElement(core$1.Group, { position: "right", mt: "xl" },
|
|
3598
|
+
React.createElement(core$1.Button, { onClick: () => props.onOk(searchRef.current) }, "OK"))));
|
|
3471
3599
|
}
|
|
3472
3600
|
function FilterRowDisplay(props) {
|
|
3473
3601
|
const { filter } = props;
|
|
3474
|
-
return (
|
|
3475
|
-
|
|
3476
|
-
|
|
3477
|
-
|
|
3478
|
-
|
|
3479
|
-
|
|
3480
|
-
|
|
3481
|
-
|
|
3602
|
+
return (React.createElement("tr", null,
|
|
3603
|
+
React.createElement("td", null, buildFieldNameString(filter.code)),
|
|
3604
|
+
React.createElement("td", null, getOpString(filter.operator)),
|
|
3605
|
+
React.createElement("td", null,
|
|
3606
|
+
React.createElement(SearchFilterValueDisplay, { resourceType: props.resourceType, filter: filter })),
|
|
3607
|
+
React.createElement("td", null,
|
|
3608
|
+
React.createElement(core$1.Button, { compact: true, variant: "outline", onClick: props.onEdit }, "Edit"),
|
|
3609
|
+
React.createElement(core$1.Button, { compact: true, variant: "outline", onClick: props.onDelete }, "Delete"))));
|
|
3482
3610
|
}
|
|
3483
3611
|
function FilterRowInput(props) {
|
|
3484
3612
|
var _a;
|
|
@@ -3496,17 +3624,17 @@
|
|
|
3496
3624
|
}
|
|
3497
3625
|
const searchParam = props.searchParams[value.code];
|
|
3498
3626
|
const operators = searchParam && getSearchOperators(searchParam);
|
|
3499
|
-
return (
|
|
3500
|
-
|
|
3501
|
-
|
|
3502
|
-
|
|
3503
|
-
|
|
3504
|
-
|
|
3505
|
-
value.code && value.operator && value.value && (
|
|
3627
|
+
return (React.createElement("tr", null,
|
|
3628
|
+
React.createElement("td", null,
|
|
3629
|
+
React.createElement(core$1.NativeSelect, { "data-testid": "filter-field", defaultValue: valueRef.current.code, onChange: (e) => setFilterCode(e.currentTarget.value), data: Object.keys(props.searchParams).map((param) => ({ value: param, label: buildFieldNameString(param) })) })),
|
|
3630
|
+
React.createElement("td", null, operators && (React.createElement(core$1.NativeSelect, { "data-testid": "filter-operation", defaultValue: value.operator, onChange: (e) => setFilterOperator(e.currentTarget.value), data: ['', ...operators.map((op) => ({ value: op, label: getOpString(op) }))] }))),
|
|
3631
|
+
React.createElement("td", null, searchParam && value.operator && (React.createElement(SearchFilterValueInput, { resourceType: props.resourceType, searchParam: searchParam, defaultValue: value.value, onChange: setFilterValue }))),
|
|
3632
|
+
React.createElement("td", null,
|
|
3633
|
+
value.code && value.operator && value.value && (React.createElement(core$1.Button, { compact: true, variant: "outline", onClick: () => {
|
|
3506
3634
|
props.onOk(valueRef.current);
|
|
3507
3635
|
setValue({});
|
|
3508
3636
|
} }, props.okText)),
|
|
3509
|
-
props.onCancel && (
|
|
3637
|
+
props.onCancel && (React.createElement(core$1.Button, { compact: true, variant: "outline", onClick: props.onCancel }, "Cancel")))));
|
|
3510
3638
|
}
|
|
3511
3639
|
|
|
3512
3640
|
function SearchFilterValueDialog(props) {
|
|
@@ -3518,11 +3646,11 @@
|
|
|
3518
3646
|
function onOk() {
|
|
3519
3647
|
props.onOk(Object.assign(Object.assign({}, props.filter), { value }));
|
|
3520
3648
|
}
|
|
3521
|
-
return (
|
|
3522
|
-
|
|
3523
|
-
|
|
3524
|
-
|
|
3525
|
-
|
|
3649
|
+
return (React.createElement(core$1.Modal, { title: props.title, size: "xl", opened: props.visible, onClose: props.onCancel },
|
|
3650
|
+
React.createElement("div", { style: { width: 500 } },
|
|
3651
|
+
React.createElement(Form, { onSubmit: onOk },
|
|
3652
|
+
React.createElement(SearchFilterValueInput, { resourceType: props.resourceType, searchParam: props.searchParam, defaultValue: value, autoFocus: true, onChange: setValue }))),
|
|
3653
|
+
React.createElement(core$1.Button, { onClick: onOk }, "OK")));
|
|
3526
3654
|
}
|
|
3527
3655
|
|
|
3528
3656
|
function SearchPopupMenu(props) {
|
|
@@ -3543,26 +3671,26 @@
|
|
|
3543
3671
|
}
|
|
3544
3672
|
// If there is only one search parameter, then show it directly
|
|
3545
3673
|
if (props.searchParams.length === 1) {
|
|
3546
|
-
return (
|
|
3674
|
+
return (React.createElement(SearchParameterSubMenu, { search: props.search, searchParam: props.searchParams[0], onSort: onSort, onPrompt: onPrompt, onChange: onChange, onClear: onClear }));
|
|
3547
3675
|
}
|
|
3548
3676
|
// Otherwise, show a menu, with each search parameter as a sub menu
|
|
3549
|
-
return (
|
|
3677
|
+
return (React.createElement(core$1.Menu.Dropdown, null, props.searchParams.map((searchParam) => (React.createElement(core$1.Menu.Item, { key: searchParam.code }, buildFieldNameString(searchParam.code))))));
|
|
3550
3678
|
}
|
|
3551
3679
|
function SearchParameterSubMenu(props) {
|
|
3552
3680
|
switch (props.searchParam.type) {
|
|
3553
3681
|
case 'date':
|
|
3554
|
-
return
|
|
3682
|
+
return React.createElement(DateFilterSubMenu, Object.assign({}, props));
|
|
3555
3683
|
case 'number':
|
|
3556
3684
|
case 'quantity':
|
|
3557
|
-
return
|
|
3685
|
+
return React.createElement(NumericFilterSubMenu, Object.assign({}, props));
|
|
3558
3686
|
case 'reference':
|
|
3559
|
-
return
|
|
3687
|
+
return React.createElement(ReferenceFilterSubMenu, Object.assign({}, props));
|
|
3560
3688
|
case 'string':
|
|
3561
3689
|
case 'token':
|
|
3562
3690
|
case 'uri':
|
|
3563
|
-
return
|
|
3691
|
+
return React.createElement(TextFilterSubMenu, Object.assign({}, props));
|
|
3564
3692
|
default:
|
|
3565
|
-
return
|
|
3693
|
+
return React.createElement(React.Fragment, null,
|
|
3566
3694
|
"Unknown search param type: ",
|
|
3567
3695
|
props.searchParam.type);
|
|
3568
3696
|
}
|
|
@@ -3570,72 +3698,72 @@
|
|
|
3570
3698
|
function DateFilterSubMenu(props) {
|
|
3571
3699
|
const { searchParam } = props;
|
|
3572
3700
|
const code = searchParam.code;
|
|
3573
|
-
return (
|
|
3574
|
-
|
|
3575
|
-
|
|
3576
|
-
|
|
3577
|
-
|
|
3578
|
-
|
|
3579
|
-
|
|
3580
|
-
|
|
3581
|
-
|
|
3582
|
-
|
|
3583
|
-
|
|
3584
|
-
|
|
3585
|
-
|
|
3586
|
-
|
|
3587
|
-
|
|
3588
|
-
|
|
3589
|
-
|
|
3590
|
-
|
|
3591
|
-
|
|
3592
|
-
|
|
3593
|
-
|
|
3701
|
+
return (React.createElement(core$1.Menu.Dropdown, null,
|
|
3702
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconSortAscending, { size: 14 }), onClick: () => props.onSort(searchParam, false) }, "Sort Oldest to Newest"),
|
|
3703
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconSortDescending, { size: 14 }), onClick: () => props.onSort(searchParam, true) }, "Sort Newest to Oldest"),
|
|
3704
|
+
React.createElement(core$1.Menu.Divider, null),
|
|
3705
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconEqual, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.EQUALS) }, "Equals..."),
|
|
3706
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconEqualNot, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.NOT_EQUALS) }, "Does not equal..."),
|
|
3707
|
+
React.createElement(core$1.Menu.Divider, null),
|
|
3708
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconMathLower, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.ENDS_BEFORE) }, "Before..."),
|
|
3709
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconMathGreater, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.STARTS_AFTER) }, "After..."),
|
|
3710
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconBracketsContain, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.EQUALS) }, "Between..."),
|
|
3711
|
+
React.createElement(core$1.Menu.Divider, null),
|
|
3712
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconCalendar, { size: 14 }), onClick: () => props.onChange(addTomorrowFilter(props.search, code)) }, "Tomorrow"),
|
|
3713
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconCalendar, { size: 14 }), onClick: () => props.onChange(addTodayFilter(props.search, code)) }, "Today"),
|
|
3714
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconCalendar, { size: 14 }), onClick: () => props.onChange(addYesterdayFilter(props.search, code)) }, "Yesterday"),
|
|
3715
|
+
React.createElement(core$1.Menu.Divider, null),
|
|
3716
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconCalendar, { size: 14 }), onClick: () => props.onChange(addNextMonthFilter(props.search, code)) }, "Next Month"),
|
|
3717
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconCalendar, { size: 14 }), onClick: () => props.onChange(addThisMonthFilter(props.search, code)) }, "This Month"),
|
|
3718
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconCalendar, { size: 14 }), onClick: () => props.onChange(addLastMonthFilter(props.search, code)) }, "Last Month"),
|
|
3719
|
+
React.createElement(core$1.Menu.Divider, null),
|
|
3720
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconCalendar, { size: 14 }), onClick: () => props.onChange(addYearToDateFilter(props.search, code)) }, "Year to date"),
|
|
3721
|
+
React.createElement(CommonMenuItems, Object.assign({}, props))));
|
|
3594
3722
|
}
|
|
3595
3723
|
function NumericFilterSubMenu(props) {
|
|
3596
3724
|
const { searchParam } = props;
|
|
3597
|
-
return (
|
|
3598
|
-
|
|
3599
|
-
|
|
3600
|
-
|
|
3601
|
-
|
|
3602
|
-
|
|
3603
|
-
|
|
3604
|
-
|
|
3605
|
-
|
|
3606
|
-
|
|
3607
|
-
|
|
3608
|
-
|
|
3725
|
+
return (React.createElement(core$1.Menu.Dropdown, null,
|
|
3726
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconSortAscending, { size: 14 }), onClick: () => props.onSort(searchParam, false) }, "Sort Smallest to Largest"),
|
|
3727
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconSortDescending, { size: 14 }), onClick: () => props.onSort(searchParam, true) }, "Sort Largest to Smallest"),
|
|
3728
|
+
React.createElement(core$1.Menu.Divider, null),
|
|
3729
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconEqual, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.EQUALS) }, "Equals..."),
|
|
3730
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconEqualNot, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.NOT_EQUALS) }, "Does not equal..."),
|
|
3731
|
+
React.createElement(core$1.Menu.Divider, null),
|
|
3732
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconMathGreater, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.GREATER_THAN) }, "Greater than..."),
|
|
3733
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconSettings, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.GREATER_THAN_OR_EQUALS) }, "Greater than or equal to..."),
|
|
3734
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconMathLower, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.LESS_THAN) }, "Less than..."),
|
|
3735
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconSettings, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.LESS_THAN_OR_EQUALS) }, "Less than or equal to..."),
|
|
3736
|
+
React.createElement(CommonMenuItems, Object.assign({}, props))));
|
|
3609
3737
|
}
|
|
3610
3738
|
function ReferenceFilterSubMenu(props) {
|
|
3611
3739
|
const { searchParam } = props;
|
|
3612
|
-
return (
|
|
3613
|
-
|
|
3614
|
-
|
|
3615
|
-
|
|
3740
|
+
return (React.createElement(core$1.Menu.Dropdown, null,
|
|
3741
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconEqual, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.EQUALS) }, "Equals..."),
|
|
3742
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconEqualNot, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.NOT) }, "Does not equal..."),
|
|
3743
|
+
React.createElement(CommonMenuItems, Object.assign({}, props))));
|
|
3616
3744
|
}
|
|
3617
3745
|
function TextFilterSubMenu(props) {
|
|
3618
3746
|
const { searchParam } = props;
|
|
3619
|
-
return (
|
|
3620
|
-
|
|
3621
|
-
|
|
3622
|
-
|
|
3623
|
-
|
|
3624
|
-
|
|
3625
|
-
|
|
3626
|
-
|
|
3627
|
-
|
|
3628
|
-
|
|
3747
|
+
return (React.createElement(core$1.Menu.Dropdown, null,
|
|
3748
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconSortAscending, { size: 14 }), onClick: () => props.onSort(searchParam, false) }, "Sort A to Z"),
|
|
3749
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconSortDescending, { size: 14 }), onClick: () => props.onSort(searchParam, true) }, "Sort Z to A"),
|
|
3750
|
+
React.createElement(core$1.Menu.Divider, null),
|
|
3751
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconEqual, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.EQUALS) }, "Equals..."),
|
|
3752
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconEqualNot, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.NOT) }, "Does not equal..."),
|
|
3753
|
+
React.createElement(core$1.Menu.Divider, null),
|
|
3754
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconBucket, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.CONTAINS) }, "Contains..."),
|
|
3755
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconBucketOff, { size: 14 }), onClick: () => props.onPrompt(searchParam, core.Operator.EQUALS) }, "Does not contain..."),
|
|
3756
|
+
React.createElement(CommonMenuItems, Object.assign({}, props))));
|
|
3629
3757
|
}
|
|
3630
3758
|
function CommonMenuItems(props) {
|
|
3631
3759
|
const { searchParam } = props;
|
|
3632
3760
|
const code = searchParam.code;
|
|
3633
|
-
return (
|
|
3634
|
-
|
|
3635
|
-
|
|
3636
|
-
|
|
3637
|
-
|
|
3638
|
-
|
|
3761
|
+
return (React.createElement(React.Fragment, null,
|
|
3762
|
+
React.createElement(core$1.Menu.Divider, null),
|
|
3763
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconBleach, { size: 14 }), onClick: () => props.onChange(addMissingFilter(props.search, code)) }, "Missing"),
|
|
3764
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconBleachOff, { size: 14 }), onClick: () => props.onChange(addMissingFilter(props.search, code, false)) }, "Not missing"),
|
|
3765
|
+
React.createElement(core$1.Menu.Divider, null),
|
|
3766
|
+
React.createElement(core$1.Menu.Item, { icon: React.createElement(icons.IconX, { size: 14 }), onClick: () => props.onClear(searchParam) }, "Clear filters")));
|
|
3639
3767
|
}
|
|
3640
3768
|
|
|
3641
3769
|
class SearchChangeEvent extends Event {
|
|
@@ -3657,7 +3785,21 @@
|
|
|
3657
3785
|
this.browserEvent = browserEvent;
|
|
3658
3786
|
}
|
|
3659
3787
|
}
|
|
3660
|
-
const useStyles = core$1.createStyles((theme) => ({
|
|
3788
|
+
const useStyles$6 = core$1.createStyles((theme) => ({
|
|
3789
|
+
root: {
|
|
3790
|
+
maxWidth: '100%',
|
|
3791
|
+
overflow: 'auto',
|
|
3792
|
+
textAlign: 'left',
|
|
3793
|
+
marginBottom: '20px',
|
|
3794
|
+
},
|
|
3795
|
+
table: {
|
|
3796
|
+
cursor: 'pointer',
|
|
3797
|
+
},
|
|
3798
|
+
tr: {
|
|
3799
|
+
'&:hover': {
|
|
3800
|
+
backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[7] : theme.colors.gray[0],
|
|
3801
|
+
},
|
|
3802
|
+
},
|
|
3661
3803
|
th: {
|
|
3662
3804
|
padding: '0 !important',
|
|
3663
3805
|
},
|
|
@@ -3681,7 +3823,7 @@
|
|
|
3681
3823
|
*/
|
|
3682
3824
|
function SearchControl(props) {
|
|
3683
3825
|
var _a, _b;
|
|
3684
|
-
const { classes } = useStyles();
|
|
3826
|
+
const { classes } = useStyles$6();
|
|
3685
3827
|
const medplum = useMedplum();
|
|
3686
3828
|
const [schemaLoaded, setSchemaLoaded] = React.useState(false);
|
|
3687
3829
|
const [outcome, setOutcome] = React.useState();
|
|
@@ -3793,7 +3935,7 @@
|
|
|
3793
3935
|
}, [medplum, props.search.resourceType]);
|
|
3794
3936
|
const typeSchema = schemaLoaded && ((_a = core.globalSchema === null || core.globalSchema === void 0 ? void 0 : core.globalSchema.types) === null || _a === void 0 ? void 0 : _a[props.search.resourceType]);
|
|
3795
3937
|
if (!typeSchema) {
|
|
3796
|
-
return
|
|
3938
|
+
return React.createElement(core$1.Loader, null);
|
|
3797
3939
|
}
|
|
3798
3940
|
const checkboxColumn = props.checkboxesEnabled;
|
|
3799
3941
|
const fields = getFieldDefinitions(search);
|
|
@@ -3805,51 +3947,52 @@
|
|
|
3805
3947
|
const buttonColor = 'gray';
|
|
3806
3948
|
const iconSize = 16;
|
|
3807
3949
|
const isMobile = window.innerWidth < 768;
|
|
3808
|
-
return (
|
|
3809
|
-
!props.hideToolbar && (
|
|
3810
|
-
|
|
3811
|
-
|
|
3812
|
-
|
|
3813
|
-
props.onNew && (
|
|
3814
|
-
!isMobile && props.onExport && (
|
|
3815
|
-
!isMobile && props.onDelete && (
|
|
3816
|
-
!isMobile && props.onBulk && (
|
|
3817
|
-
lastResult && (
|
|
3818
|
-
|
|
3819
|
-
|
|
3820
|
-
|
|
3821
|
-
|
|
3822
|
-
|
|
3823
|
-
|
|
3824
|
-
|
|
3825
|
-
|
|
3826
|
-
|
|
3827
|
-
|
|
3828
|
-
|
|
3829
|
-
|
|
3830
|
-
|
|
3831
|
-
|
|
3832
|
-
|
|
3833
|
-
|
|
3834
|
-
|
|
3835
|
-
|
|
3836
|
-
|
|
3837
|
-
|
|
3838
|
-
React__default["default"].createElement(SearchPopupMenu, { search: props.search, searchParams: field.searchParams, onPrompt: (searchParam, filter) => {
|
|
3950
|
+
return (React.createElement("div", { className: classes.root, "data-testid": "search-control" },
|
|
3951
|
+
!props.hideToolbar && (React.createElement(core$1.Group, { position: "apart", mb: "xl" },
|
|
3952
|
+
React.createElement(core$1.Group, { spacing: 2 },
|
|
3953
|
+
React.createElement(core$1.Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React.createElement(icons.IconFilter, { size: iconSize }), onClick: () => setState(Object.assign(Object.assign({}, stateRef.current), { fieldEditorVisible: true })) }, "Fields"),
|
|
3954
|
+
React.createElement(core$1.Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React.createElement(icons.IconColumns, { size: iconSize }), onClick: () => setState(Object.assign(Object.assign({}, stateRef.current), { filterEditorVisible: true })) }, "Filters"),
|
|
3955
|
+
props.onNew && (React.createElement(core$1.Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React.createElement(icons.IconFilePlus, { size: iconSize }), onClick: props.onNew }, "New...")),
|
|
3956
|
+
!isMobile && props.onExport && (React.createElement(core$1.Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React.createElement(icons.IconTableExport, { size: iconSize }), onClick: props.onExport }, "Export...")),
|
|
3957
|
+
!isMobile && props.onDelete && (React.createElement(core$1.Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React.createElement(icons.IconTrash, { size: iconSize }), onClick: () => props.onDelete(Object.keys(state.selected)) }, "Delete...")),
|
|
3958
|
+
!isMobile && props.onBulk && (React.createElement(core$1.Button, { compact: true, variant: buttonVariant, color: buttonColor, leftIcon: React.createElement(icons.IconBoxMultiple, { size: iconSize }), onClick: () => props.onBulk(Object.keys(state.selected)) }, "Bulk..."))),
|
|
3959
|
+
lastResult && (React.createElement(core$1.Text, { size: "xs", color: "dimmed" },
|
|
3960
|
+
getStart$1(search, lastResult.total),
|
|
3961
|
+
"-",
|
|
3962
|
+
getEnd$1(search, lastResult.total),
|
|
3963
|
+
" of",
|
|
3964
|
+
' ', (_b = lastResult.total) === null || _b === void 0 ? void 0 :
|
|
3965
|
+
_b.toLocaleString())))),
|
|
3966
|
+
React.createElement(core$1.Table, { className: classes.table },
|
|
3967
|
+
React.createElement("thead", null,
|
|
3968
|
+
React.createElement("tr", null,
|
|
3969
|
+
checkboxColumn && (React.createElement("th", null,
|
|
3970
|
+
React.createElement("input", { type: "checkbox", value: "checked", "aria-label": "all-checkbox", "data-testid": "all-checkbox", checked: isAllSelected(), onChange: (e) => handleAllCheckboxClick(e) }))),
|
|
3971
|
+
fields.map((field) => (React.createElement("th", { key: field.name },
|
|
3972
|
+
React.createElement(core$1.Menu, { shadow: "md", width: 240, position: "bottom-end" },
|
|
3973
|
+
React.createElement(core$1.Menu.Target, null,
|
|
3974
|
+
React.createElement(core$1.UnstyledButton, { className: classes.control },
|
|
3975
|
+
React.createElement(core$1.Group, { position: "apart", noWrap: true },
|
|
3976
|
+
React.createElement(core$1.Text, { weight: 500, size: "sm" }, buildFieldNameString(field.name)),
|
|
3977
|
+
React.createElement(core$1.Center, { className: classes.icon },
|
|
3978
|
+
React.createElement(icons.IconAdjustmentsHorizontal, { size: 14, stroke: 1.5 }))))),
|
|
3979
|
+
React.createElement(SearchPopupMenu, { search: props.search, searchParams: field.searchParams, onPrompt: (searchParam, filter) => {
|
|
3839
3980
|
setState(Object.assign(Object.assign({}, stateRef.current), { filterDialogVisible: true, filterDialogSearchParam: searchParam, filterDialogFilter: filter }));
|
|
3840
3981
|
}, onChange: (result) => {
|
|
3841
3982
|
emitSearchChange(result);
|
|
3842
3983
|
} })))))),
|
|
3843
|
-
!props.hideFilters && (
|
|
3844
|
-
checkboxColumn &&
|
|
3845
|
-
fields.map((field) => (
|
|
3846
|
-
|
|
3847
|
-
checkboxColumn && (
|
|
3848
|
-
|
|
3849
|
-
fields.map((field) => (
|
|
3850
|
-
(resources === null || resources === void 0 ? void 0 : resources.length) === 0 && (
|
|
3851
|
-
|
|
3852
|
-
|
|
3984
|
+
!props.hideFilters && (React.createElement("tr", null,
|
|
3985
|
+
checkboxColumn && React.createElement("th", null),
|
|
3986
|
+
fields.map((field) => (React.createElement("th", { key: field.name }, field.searchParams && (React.createElement(FilterDescription, { resourceType: resourceType, searchParams: field.searchParams, filters: props.search.filters })))))))),
|
|
3987
|
+
React.createElement("tbody", null, resources === null || resources === void 0 ? void 0 : resources.map((resource) => resource && (React.createElement("tr", { key: resource.id, className: classes.tr, "data-testid": "search-control-row", onClick: (e) => handleRowClick(e, resource), onAuxClick: (e) => handleRowClick(e, resource) },
|
|
3988
|
+
checkboxColumn && (React.createElement("td", null,
|
|
3989
|
+
React.createElement("input", { type: "checkbox", value: "checked", "data-testid": "row-checkbox", "aria-label": `Checkbox for ${resource.id}`, checked: !!state.selected[resource.id], onChange: (e) => handleSingleCheckboxClick(e, resource.id) }))),
|
|
3990
|
+
fields.map((field) => (React.createElement("td", { key: field.name }, renderValue(resource, field))))))))),
|
|
3991
|
+
(resources === null || resources === void 0 ? void 0 : resources.length) === 0 && (React.createElement(core$1.Container, null,
|
|
3992
|
+
React.createElement(core$1.Center, null,
|
|
3993
|
+
React.createElement(core$1.Text, { size: "xl", color: "dimmed" }, "No results")))),
|
|
3994
|
+
(lastResult === null || lastResult === void 0 ? void 0 : lastResult.total) !== undefined && lastResult.total > 0 && (React.createElement(core$1.Center, { m: "md", p: "md" },
|
|
3995
|
+
React.createElement(core$1.Pagination, { page: getPage(search), total: getTotalPages(search, lastResult.total), onChange: (newPage) => emitSearchChange(setPage(search, newPage)), getItemAriaLabel: (page) => {
|
|
3853
3996
|
switch (page) {
|
|
3854
3997
|
case 'prev':
|
|
3855
3998
|
return 'Previous page';
|
|
@@ -3859,38 +4002,38 @@
|
|
|
3859
4002
|
return undefined;
|
|
3860
4003
|
}
|
|
3861
4004
|
} }))),
|
|
3862
|
-
outcome && (
|
|
3863
|
-
|
|
3864
|
-
|
|
4005
|
+
outcome && (React.createElement("div", { "data-testid": "search-error" },
|
|
4006
|
+
React.createElement("pre", { style: { textAlign: 'left' } }, JSON.stringify(outcome, undefined, 2)))),
|
|
4007
|
+
React.createElement(SearchFieldEditor, { search: props.search, visible: stateRef.current.fieldEditorVisible, onOk: (result) => {
|
|
3865
4008
|
emitSearchChange(result);
|
|
3866
4009
|
setState(Object.assign(Object.assign({}, stateRef.current), { fieldEditorVisible: false }));
|
|
3867
4010
|
}, onCancel: () => {
|
|
3868
4011
|
setState(Object.assign(Object.assign({}, stateRef.current), { fieldEditorVisible: false }));
|
|
3869
4012
|
} }),
|
|
3870
|
-
|
|
4013
|
+
React.createElement(SearchFilterEditor, { search: props.search, visible: stateRef.current.filterEditorVisible, onOk: (result) => {
|
|
3871
4014
|
emitSearchChange(result);
|
|
3872
4015
|
setState(Object.assign(Object.assign({}, stateRef.current), { filterEditorVisible: false }));
|
|
3873
4016
|
}, onCancel: () => {
|
|
3874
4017
|
setState(Object.assign(Object.assign({}, stateRef.current), { filterEditorVisible: false }));
|
|
3875
4018
|
} }),
|
|
3876
|
-
|
|
4019
|
+
React.createElement(SearchFilterValueDialog, { visible: stateRef.current.filterDialogVisible, title: 'Input', resourceType: resourceType, searchParam: state.filterDialogSearchParam, filter: state.filterDialogFilter, defaultValue: '', onOk: (filter) => {
|
|
3877
4020
|
emitSearchChange(addFilter(props.search, filter.code, filter.operator, filter.value));
|
|
3878
4021
|
setState(Object.assign(Object.assign({}, stateRef.current), { filterDialogVisible: false }));
|
|
3879
4022
|
}, onCancel: () => {
|
|
3880
4023
|
setState(Object.assign(Object.assign({}, stateRef.current), { filterDialogVisible: false }));
|
|
3881
4024
|
} })));
|
|
3882
4025
|
}
|
|
3883
|
-
const MemoizedSearchControl =
|
|
4026
|
+
const MemoizedSearchControl = React.memo(SearchControl);
|
|
3884
4027
|
function FilterDescription(props) {
|
|
3885
4028
|
var _a;
|
|
3886
4029
|
const filters = ((_a = props.filters) !== null && _a !== void 0 ? _a : []).filter((f) => props.searchParams.find((p) => p.code === f.code));
|
|
3887
4030
|
if (filters.length === 0) {
|
|
3888
|
-
return
|
|
4031
|
+
return React.createElement("span", null, "no filters");
|
|
3889
4032
|
}
|
|
3890
|
-
return (
|
|
4033
|
+
return (React.createElement(React.Fragment, null, filters.map((filter, index) => (React.createElement("div", { key: `filter-${index}-${filters.length}` },
|
|
3891
4034
|
getOpString(filter.operator),
|
|
3892
4035
|
"\u00A0",
|
|
3893
|
-
|
|
4036
|
+
React.createElement(SearchFilterValueDisplay, { resourceType: props.resourceType, filter: filter }))))));
|
|
3894
4037
|
}
|
|
3895
4038
|
function getPage(search) {
|
|
3896
4039
|
return Math.floor((search.offset || 0) / (search.count || core.DEFAULT_SEARCH_COUNT)) + 1;
|
|
@@ -3994,29 +4137,29 @@
|
|
|
3994
4137
|
}, [medplum, props.resourceType]);
|
|
3995
4138
|
const typeSchema = (_a = schema === null || schema === void 0 ? void 0 : schema.types) === null || _a === void 0 ? void 0 : _a[props.resourceType];
|
|
3996
4139
|
if (!typeSchema) {
|
|
3997
|
-
return
|
|
4140
|
+
return React.createElement(core$1.Loader, null);
|
|
3998
4141
|
}
|
|
3999
4142
|
const checkboxColumn = props.checkboxesEnabled;
|
|
4000
|
-
return (
|
|
4001
|
-
|
|
4002
|
-
|
|
4003
|
-
|
|
4004
|
-
checkboxColumn && (
|
|
4005
|
-
|
|
4006
|
-
fields.map((field) => (
|
|
4007
|
-
|
|
4008
|
-
checkboxColumn && (
|
|
4009
|
-
|
|
4143
|
+
return (React.createElement("div", { onContextMenu: (e) => killEvent(e), "data-testid": "search-control" },
|
|
4144
|
+
React.createElement(core$1.Table, null,
|
|
4145
|
+
React.createElement("thead", null,
|
|
4146
|
+
React.createElement("tr", null,
|
|
4147
|
+
checkboxColumn && (React.createElement("th", null,
|
|
4148
|
+
React.createElement("input", { type: "checkbox", value: "checked", "aria-label": "all-checkbox", "data-testid": "all-checkbox", checked: isAllSelected(), onChange: (e) => handleAllCheckboxClick(e) }))),
|
|
4149
|
+
fields.map((field) => (React.createElement("th", { key: field.name }, field.name))))),
|
|
4150
|
+
React.createElement("tbody", null, (_c = (_b = response === null || response === void 0 ? void 0 : response.data) === null || _b === void 0 ? void 0 : _b.ResourceList) === null || _c === void 0 ? void 0 : _c.map((resource) => resource && (React.createElement("tr", { key: resource.id, "data-testid": "search-control-row", onClick: (e) => handleRowClick(e, resource), onAuxClick: (e) => handleRowClick(e, resource) },
|
|
4151
|
+
checkboxColumn && (React.createElement("td", null,
|
|
4152
|
+
React.createElement("input", { type: "checkbox", value: "checked", "data-testid": "row-checkbox", "aria-label": `Checkbox for ${resource.id}`, checked: !!selected[resource.id], onChange: (e) => handleSingleCheckboxClick(e, resource.id) }))),
|
|
4010
4153
|
fields.map((field) => {
|
|
4011
|
-
return (
|
|
4012
|
-
|
|
4154
|
+
return (React.createElement("td", { key: field.name },
|
|
4155
|
+
React.createElement(FhirPathDisplay, { propertyType: field.propertyType, path: field.fhirPath, resource: resource })));
|
|
4013
4156
|
})))))),
|
|
4014
|
-
((_e = (_d = response === null || response === void 0 ? void 0 : response.data) === null || _d === void 0 ? void 0 : _d.ResourceList) === null || _e === void 0 ? void 0 : _e.length) === 0 &&
|
|
4015
|
-
outcome && (
|
|
4016
|
-
|
|
4017
|
-
props.onBulk && (
|
|
4157
|
+
((_e = (_d = response === null || response === void 0 ? void 0 : response.data) === null || _d === void 0 ? void 0 : _d.ResourceList) === null || _e === void 0 ? void 0 : _e.length) === 0 && React.createElement("div", { "data-testid": "empty-search" }, "No results"),
|
|
4158
|
+
outcome && (React.createElement("div", { "data-testid": "search-error" },
|
|
4159
|
+
React.createElement("pre", { style: { textAlign: 'left' } }, JSON.stringify(outcome, undefined, 2)))),
|
|
4160
|
+
props.onBulk && (React.createElement(core$1.Button, { onClick: () => props.onBulk(Object.keys(selectedRef.current)) }, "Bulk..."))));
|
|
4018
4161
|
}
|
|
4019
|
-
const MemoizedFhirPathTable =
|
|
4162
|
+
const MemoizedFhirPathTable = React.memo(FhirPathTable);
|
|
4020
4163
|
|
|
4021
4164
|
const searches = [
|
|
4022
4165
|
'$/_history',
|
|
@@ -4028,7 +4171,7 @@
|
|
|
4028
4171
|
'ServiceRequest?subject=$',
|
|
4029
4172
|
];
|
|
4030
4173
|
function PatientTimeline(props) {
|
|
4031
|
-
return (
|
|
4174
|
+
return (React.createElement(ResourceTimeline, { value: props.patient, buildSearchRequests: (resource) => ({
|
|
4032
4175
|
resourceType: 'Bundle',
|
|
4033
4176
|
type: 'batch',
|
|
4034
4177
|
entry: searches.map((search) => ({
|
|
@@ -4054,6 +4197,32 @@
|
|
|
4054
4197
|
}) }));
|
|
4055
4198
|
}
|
|
4056
4199
|
|
|
4200
|
+
const useStyles$5 = core$1.createStyles((theme) => ({
|
|
4201
|
+
section: {
|
|
4202
|
+
position: 'relative',
|
|
4203
|
+
margin: '4px 4px 8px 0',
|
|
4204
|
+
padding: '6px 12px 16px 6px',
|
|
4205
|
+
border: `1.5px solid ${theme.colors.gray[1]}`,
|
|
4206
|
+
borderRadius: theme.radius.sm,
|
|
4207
|
+
transition: 'all 0.1s',
|
|
4208
|
+
},
|
|
4209
|
+
hovering: {
|
|
4210
|
+
border: `1.5px solid ${theme.colors.blue[5]}`,
|
|
4211
|
+
},
|
|
4212
|
+
editing: {
|
|
4213
|
+
border: `1.5px solid ${theme.colors.gray[1]}`,
|
|
4214
|
+
borderLeft: `4px solid ${theme.colors.blue[5]}`,
|
|
4215
|
+
},
|
|
4216
|
+
bottomActions: {
|
|
4217
|
+
position: 'absolute',
|
|
4218
|
+
right: 4,
|
|
4219
|
+
bottom: 0,
|
|
4220
|
+
fontSize: theme.fontSizes.xs,
|
|
4221
|
+
'& a': {
|
|
4222
|
+
marginLeft: 8,
|
|
4223
|
+
},
|
|
4224
|
+
},
|
|
4225
|
+
}));
|
|
4057
4226
|
function PlanDefinitionBuilder(props) {
|
|
4058
4227
|
const medplum = useMedplum();
|
|
4059
4228
|
const defaultValue = useResource(props.value);
|
|
@@ -4087,13 +4256,14 @@
|
|
|
4087
4256
|
function changeProperty(property, newValue) {
|
|
4088
4257
|
setValue(Object.assign(Object.assign({}, valueRef.current), { [property]: newValue }));
|
|
4089
4258
|
}
|
|
4090
|
-
return (
|
|
4091
|
-
|
|
4092
|
-
|
|
4093
|
-
|
|
4094
|
-
|
|
4259
|
+
return (React.createElement("div", null,
|
|
4260
|
+
React.createElement(Form, { testid: "questionnaire-form", onSubmit: () => props.onSubmit(value) },
|
|
4261
|
+
React.createElement(core$1.TextInput, { label: "Plan Title", defaultValue: value.title, onChange: (e) => changeProperty('title', e.currentTarget.value) }),
|
|
4262
|
+
React.createElement(ActionArrayBuilder, { actions: value.action || [], selectedKey: selectedKey, setSelectedKey: setSelectedKey, hoverKey: hoverKey, setHoverKey: setHoverKey, onChange: (x) => changeProperty('action', x) }),
|
|
4263
|
+
React.createElement(core$1.Button, { type: "submit" }, "Save"))));
|
|
4095
4264
|
}
|
|
4096
4265
|
function ActionArrayBuilder(props) {
|
|
4266
|
+
const { classes } = useStyles$5();
|
|
4097
4267
|
const actionsRef = React.useRef();
|
|
4098
4268
|
actionsRef.current = props.actions;
|
|
4099
4269
|
function changeAction(changedAction) {
|
|
@@ -4106,16 +4276,17 @@
|
|
|
4106
4276
|
function removeAction(removedAction) {
|
|
4107
4277
|
props.onChange(actionsRef.current.filter((i) => i !== removedAction));
|
|
4108
4278
|
}
|
|
4109
|
-
return (
|
|
4110
|
-
props.actions.map((action) => (
|
|
4111
|
-
|
|
4112
|
-
|
|
4113
|
-
|
|
4279
|
+
return (React.createElement("div", { className: classes.section },
|
|
4280
|
+
props.actions.map((action) => (React.createElement("div", { key: action.id },
|
|
4281
|
+
React.createElement(ActionBuilder, { action: action, selectedKey: props.selectedKey, setSelectedKey: props.setSelectedKey, hoverKey: props.hoverKey, setHoverKey: props.setHoverKey, onChange: changeAction, onRemove: () => removeAction(action) })))),
|
|
4282
|
+
React.createElement("div", { className: classes.bottomActions },
|
|
4283
|
+
React.createElement("a", { href: "#", onClick: (e) => {
|
|
4114
4284
|
killEvent(e);
|
|
4115
4285
|
addAction({ id: generateId$1() });
|
|
4116
4286
|
} }, "Add action"))));
|
|
4117
4287
|
}
|
|
4118
4288
|
function ActionBuilder(props) {
|
|
4289
|
+
const { classes, cx } = useStyles$5();
|
|
4119
4290
|
const { action } = props;
|
|
4120
4291
|
const actionType = getInitialActionType(action);
|
|
4121
4292
|
const editing = props.selectedKey === props.action.id;
|
|
@@ -4128,11 +4299,14 @@
|
|
|
4128
4299
|
killEvent(e);
|
|
4129
4300
|
props.setHoverKey(props.action.id);
|
|
4130
4301
|
}
|
|
4131
|
-
const className =
|
|
4132
|
-
|
|
4133
|
-
|
|
4134
|
-
|
|
4135
|
-
|
|
4302
|
+
const className = cx(classes.section, {
|
|
4303
|
+
[classes.editing]: editing,
|
|
4304
|
+
[classes.hovering]: hovering && !editing,
|
|
4305
|
+
});
|
|
4306
|
+
return (React.createElement("div", { "data-testid": action.id, className: className, onClick: onClick, onMouseOver: onHover },
|
|
4307
|
+
editing ? (React.createElement(ActionEditor, { action: action, actionType: actionType, onChange: props.onChange, selectedKey: props.selectedKey, setSelectedKey: props.setSelectedKey, hoverKey: props.hoverKey, setHoverKey: props.setHoverKey, onRemove: props.onRemove })) : (React.createElement(ActionDisplay, { action: action, actionType: actionType })),
|
|
4308
|
+
React.createElement("div", { className: classes.bottomActions },
|
|
4309
|
+
React.createElement("a", { href: "#", onClick: (e) => {
|
|
4136
4310
|
e.preventDefault();
|
|
4137
4311
|
props.onRemove();
|
|
4138
4312
|
} }, "Remove"))));
|
|
@@ -4146,15 +4320,15 @@
|
|
|
4146
4320
|
function ActionDisplay(props) {
|
|
4147
4321
|
const { action, actionType } = props;
|
|
4148
4322
|
const [propertyValue, propertyType] = getActionTiming(action);
|
|
4149
|
-
return (
|
|
4150
|
-
|
|
4323
|
+
return (React.createElement("div", null,
|
|
4324
|
+
React.createElement("div", null,
|
|
4151
4325
|
action.title || 'Untitled',
|
|
4152
4326
|
" ",
|
|
4153
4327
|
actionType && `(${actionType})`),
|
|
4154
|
-
action.definitionCanonical && (
|
|
4155
|
-
|
|
4156
|
-
propertyValue && (
|
|
4157
|
-
|
|
4328
|
+
action.definitionCanonical && (React.createElement("div", null,
|
|
4329
|
+
React.createElement(ReferenceDisplay, { value: { reference: action.definitionCanonical } }))),
|
|
4330
|
+
propertyValue && (React.createElement("div", null,
|
|
4331
|
+
React.createElement(ResourcePropertyDisplay, { property: timingProperty, propertyType: propertyType, value: propertyValue })))));
|
|
4158
4332
|
}
|
|
4159
4333
|
function ActionEditor(props) {
|
|
4160
4334
|
const { action } = props;
|
|
@@ -4162,35 +4336,34 @@
|
|
|
4162
4336
|
function changeProperty(property, value) {
|
|
4163
4337
|
props.onChange(Object.assign(Object.assign({}, action), { [property]: value }));
|
|
4164
4338
|
}
|
|
4165
|
-
return (
|
|
4166
|
-
|
|
4167
|
-
|
|
4168
|
-
|
|
4169
|
-
action.action && action.action.length > 0 && (
|
|
4339
|
+
return (React.createElement(core$1.Stack, { spacing: "xl" },
|
|
4340
|
+
React.createElement(core$1.TextInput, { name: `actionTitle-${action.id}`, label: "Title", defaultValue: action.title, onChange: (e) => changeProperty('title', e.currentTarget.value) }),
|
|
4341
|
+
React.createElement(core$1.TextInput, { name: `actionDescription-${action.id}`, label: "Description", defaultValue: action.description, onChange: (e) => changeProperty('description', e.currentTarget.value) }),
|
|
4342
|
+
React.createElement(core$1.NativeSelect, { label: "Type of Action", description: "The type of the action to be performed.", name: `actionType-${action.id}`, defaultValue: actionType, onChange: (e) => setActionType(e.currentTarget.value), data: ['', 'appointment', 'lab', 'questionnaire', 'task'] }),
|
|
4343
|
+
action.action && action.action.length > 0 && (React.createElement(ActionArrayBuilder, { actions: action.action, selectedKey: props.selectedKey, setSelectedKey: props.setSelectedKey, hoverKey: props.hoverKey, setHoverKey: props.setHoverKey, onChange: (x) => changeProperty('action', x) })),
|
|
4170
4344
|
(() => {
|
|
4171
4345
|
switch (actionType) {
|
|
4172
4346
|
case 'appointment':
|
|
4173
|
-
return (
|
|
4347
|
+
return (React.createElement(ActionResourceTypeBuilder, { title: "Appointment", description: "The subject must schedule an appointment from the schedule.", resourceType: "Schedule", action: action, onChange: props.onChange }));
|
|
4174
4348
|
case 'lab':
|
|
4175
|
-
return (
|
|
4349
|
+
return (React.createElement(ActionResourceTypeBuilder, { title: "Lab", description: "The subject must complete the following lab panel.", resourceType: "ActivityDefinition", action: action, onChange: props.onChange }));
|
|
4176
4350
|
case 'questionnaire':
|
|
4177
|
-
return (
|
|
4351
|
+
return (React.createElement(ActionResourceTypeBuilder, { title: "Questionnaire", description: "The subject must complete the selected questionnaire.", resourceType: "Questionnaire", action: action, onChange: props.onChange }));
|
|
4178
4352
|
case 'task':
|
|
4179
|
-
return (
|
|
4353
|
+
return (React.createElement(ActionResourceTypeBuilder, { title: "Task", description: "The subject must complete the following task.", resourceType: "ActivityDefinition", action: action, onChange: props.onChange }));
|
|
4180
4354
|
default:
|
|
4181
4355
|
return null;
|
|
4182
4356
|
}
|
|
4183
4357
|
})(),
|
|
4184
|
-
|
|
4185
|
-
|
|
4186
|
-
React__default["default"].createElement(ActionTimingInput, { name: 'timing-' + action.id, action: action, onChange: props.onChange })));
|
|
4358
|
+
React.createElement(FormSection, { title: "Timing", description: "When the action should take place." },
|
|
4359
|
+
React.createElement(ActionTimingInput, { name: 'timing-' + action.id, action: action, onChange: props.onChange }))));
|
|
4187
4360
|
}
|
|
4188
4361
|
function ActionResourceTypeBuilder(props) {
|
|
4189
4362
|
const { id, definitionCanonical } = props.action;
|
|
4190
4363
|
const reference = (definitionCanonical === null || definitionCanonical === void 0 ? void 0 : definitionCanonical.startsWith(props.resourceType + '/'))
|
|
4191
4364
|
? { reference: definitionCanonical }
|
|
4192
4365
|
: undefined;
|
|
4193
|
-
return (
|
|
4366
|
+
return (React.createElement(ResourceInput, { name: id, resourceType: props.resourceType, defaultValue: reference, loadOnFocus: true, onChange: (newValue) => {
|
|
4194
4367
|
if (newValue) {
|
|
4195
4368
|
props.onChange(Object.assign(Object.assign({}, props.action), { definitionCanonical: core.getReferenceString(newValue) }));
|
|
4196
4369
|
}
|
|
@@ -4203,7 +4376,7 @@
|
|
|
4203
4376
|
const value = props.action;
|
|
4204
4377
|
const key = 'timing';
|
|
4205
4378
|
const [propertyValue, propertyType] = getActionTiming(value);
|
|
4206
|
-
return (
|
|
4379
|
+
return (React.createElement(ResourcePropertyInput, { property: timingProperty, name: "timing[x]", defaultValue: propertyValue, defaultPropertyType: propertyType, onChange: (newValue, propName) => {
|
|
4207
4380
|
props.onChange(setPropertyValue(value, key, propName !== null && propName !== void 0 ? propName : key, timingProperty, newValue));
|
|
4208
4381
|
} }));
|
|
4209
4382
|
}
|
|
@@ -4305,14 +4478,15 @@
|
|
|
4305
4478
|
if (!schema || !questionnaire) {
|
|
4306
4479
|
return null;
|
|
4307
4480
|
}
|
|
4308
|
-
return (
|
|
4481
|
+
return (React.createElement(Form, { testid: "questionnaire-form", onSubmit: () => {
|
|
4309
4482
|
if (props.onSubmit && response) {
|
|
4310
4483
|
props.onSubmit(Object.assign(Object.assign({}, response), { questionnaire: core.getReferenceString(questionnaire), subject: props.subject, source: core.createReference(source), authored: new Date().toISOString() }));
|
|
4311
4484
|
}
|
|
4312
4485
|
} },
|
|
4313
|
-
questionnaire.title &&
|
|
4314
|
-
questionnaire.item && (
|
|
4315
|
-
|
|
4486
|
+
questionnaire.title && React.createElement(core$1.Title, null, questionnaire.title),
|
|
4487
|
+
questionnaire.item && (React.createElement(QuestionnaireFormItemArray, { items: questionnaire.item, answers: answers, onChange: setItems })),
|
|
4488
|
+
React.createElement(core$1.Group, { position: "right", mt: "xl" },
|
|
4489
|
+
React.createElement(core$1.Button, { type: "submit" }, props.submitButtonText || 'OK'))));
|
|
4316
4490
|
}
|
|
4317
4491
|
function QuestionnaireFormItemArray(props) {
|
|
4318
4492
|
const [responseItems, setResponseItems] = React.useState(buildInitialResponseItems(props.items));
|
|
@@ -4322,27 +4496,27 @@
|
|
|
4322
4496
|
setResponseItems(newResponseItems);
|
|
4323
4497
|
props.onChange(newResponseItems);
|
|
4324
4498
|
}
|
|
4325
|
-
return (
|
|
4499
|
+
return (React.createElement(core$1.Stack, null, props.items.map((item, index) => {
|
|
4326
4500
|
if (!isQuestionEnabled(item, props.answers)) {
|
|
4327
4501
|
return null;
|
|
4328
4502
|
}
|
|
4329
4503
|
if (item.type === exports.QuestionnaireItemType.display) {
|
|
4330
|
-
return
|
|
4504
|
+
return React.createElement("p", { key: item.linkId }, item.text);
|
|
4331
4505
|
}
|
|
4332
4506
|
if (item.type === exports.QuestionnaireItemType.group) {
|
|
4333
|
-
return (
|
|
4507
|
+
return (React.createElement(QuestionnaireFormItem, { key: item.linkId, item: item, answers: props.answers, onChange: (newResponseItem) => setResponseItem(index, newResponseItem) }));
|
|
4334
4508
|
}
|
|
4335
4509
|
if (item.type === exports.QuestionnaireItemType.boolean) {
|
|
4336
4510
|
const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;
|
|
4337
|
-
return (
|
|
4338
|
-
|
|
4511
|
+
return (React.createElement(CheckboxFormSection, { key: item.linkId, title: item.text, htmlFor: item.linkId },
|
|
4512
|
+
React.createElement(core$1.Checkbox, { id: item.linkId, name: item.linkId, defaultChecked: initial === null || initial === void 0 ? void 0 : initial.valueBoolean, onChange: (e) => setResponseItem(index, {
|
|
4339
4513
|
linkId: item.linkId,
|
|
4340
4514
|
text: item.text,
|
|
4341
4515
|
answer: [{ valueBoolean: e.currentTarget.checked }],
|
|
4342
4516
|
}) })));
|
|
4343
4517
|
}
|
|
4344
|
-
return (
|
|
4345
|
-
|
|
4518
|
+
return (React.createElement(FormSection, { key: item.linkId, htmlFor: item.linkId, title: item.text || '' },
|
|
4519
|
+
React.createElement(QuestionnaireFormItem, { item: item, answers: props.answers, onChange: (newResponseItem) => setResponseItem(index, newResponseItem) })));
|
|
4346
4520
|
})));
|
|
4347
4521
|
}
|
|
4348
4522
|
function QuestionnaireFormItem(props) {
|
|
@@ -4372,39 +4546,39 @@
|
|
|
4372
4546
|
}
|
|
4373
4547
|
switch (type) {
|
|
4374
4548
|
case exports.QuestionnaireItemType.group:
|
|
4375
|
-
return (
|
|
4376
|
-
|
|
4377
|
-
item.item && (
|
|
4549
|
+
return (React.createElement("div", null,
|
|
4550
|
+
React.createElement("h3", null, item.text),
|
|
4551
|
+
item.item && (React.createElement(QuestionnaireFormItemArray, { items: item.item, answers: props.answers, onChange: onChangeItem }))));
|
|
4378
4552
|
case exports.QuestionnaireItemType.boolean:
|
|
4379
|
-
return (
|
|
4553
|
+
return (React.createElement(core$1.Checkbox, { id: name, name: name, defaultChecked: initial === null || initial === void 0 ? void 0 : initial.valueBoolean, onChange: (e) => onChangeAnswer({ valueBoolean: e.currentTarget.checked }) }));
|
|
4380
4554
|
case exports.QuestionnaireItemType.decimal:
|
|
4381
|
-
return (
|
|
4555
|
+
return (React.createElement(core$1.TextInput, { type: "number", step: "any", id: name, name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueDecimal, onChange: (e) => onChangeAnswer({ valueDecimal: e.currentTarget.valueAsNumber }) }));
|
|
4382
4556
|
case exports.QuestionnaireItemType.integer:
|
|
4383
|
-
return (
|
|
4557
|
+
return (React.createElement(core$1.TextInput, { type: "number", step: 1, id: name, name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueInteger, onChange: (e) => onChangeAnswer({ valueInteger: e.currentTarget.valueAsNumber }) }));
|
|
4384
4558
|
case exports.QuestionnaireItemType.date:
|
|
4385
|
-
return (
|
|
4559
|
+
return (React.createElement(core$1.TextInput, { type: "date", id: name, name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueDate, onChange: (e) => onChangeAnswer({ valueDate: e.currentTarget.value }) }));
|
|
4386
4560
|
case exports.QuestionnaireItemType.dateTime:
|
|
4387
|
-
return (
|
|
4561
|
+
return (React.createElement(DateTimeInput, { name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueDateTime, onChange: (newValue) => onChangeAnswer({ valueDateTime: newValue }) }));
|
|
4388
4562
|
case exports.QuestionnaireItemType.time:
|
|
4389
|
-
return (
|
|
4563
|
+
return (React.createElement(core$1.TextInput, { type: "time", id: name, name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueTime, onChange: (e) => onChangeAnswer({ valueTime: e.currentTarget.value }) }));
|
|
4390
4564
|
case exports.QuestionnaireItemType.string:
|
|
4391
4565
|
case exports.QuestionnaireItemType.url:
|
|
4392
|
-
return (
|
|
4566
|
+
return (React.createElement(core$1.TextInput, { id: name, name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueString, onChange: (e) => onChangeAnswer({ valueString: e.currentTarget.value }) }));
|
|
4393
4567
|
case exports.QuestionnaireItemType.text:
|
|
4394
|
-
return (
|
|
4568
|
+
return (React.createElement(core$1.Textarea, { id: name, name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueString, onChange: (e) => onChangeAnswer({ valueString: e.currentTarget.value }) }));
|
|
4395
4569
|
case exports.QuestionnaireItemType.attachment:
|
|
4396
|
-
return (
|
|
4570
|
+
return (React.createElement(AttachmentInput, { name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueAttachment, onChange: (newValue) => onChangeAnswer({ valueAttachment: newValue }) }));
|
|
4397
4571
|
case exports.QuestionnaireItemType.reference:
|
|
4398
|
-
return (
|
|
4572
|
+
return (React.createElement(ReferenceInput, { name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueReference, onChange: (newValue) => onChangeAnswer({ valueReference: newValue }) }));
|
|
4399
4573
|
case exports.QuestionnaireItemType.quantity:
|
|
4400
|
-
return (
|
|
4574
|
+
return (React.createElement(QuantityInput, { name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueQuantity, onChange: (newValue) => onChangeAnswer({ valueQuantity: newValue }) }));
|
|
4401
4575
|
case exports.QuestionnaireItemType.choice:
|
|
4402
4576
|
case exports.QuestionnaireItemType.openChoice:
|
|
4403
4577
|
if (isDropDownChoice(item)) {
|
|
4404
|
-
return (
|
|
4578
|
+
return (React.createElement(QuestionnaireChoiceDropDownInput, { name: name, item: item, initial: initial, onChangeAnswer: onChangeAnswer }));
|
|
4405
4579
|
}
|
|
4406
4580
|
else {
|
|
4407
|
-
return (
|
|
4581
|
+
return (React.createElement(QuestionnaireChoiceRadioInput, { name: name, item: item, initial: initial, onChangeAnswer: onChangeAnswer }));
|
|
4408
4582
|
}
|
|
4409
4583
|
}
|
|
4410
4584
|
return null;
|
|
@@ -4419,7 +4593,7 @@
|
|
|
4419
4593
|
data.push(typedValueToString(optionValue));
|
|
4420
4594
|
}
|
|
4421
4595
|
}
|
|
4422
|
-
return (
|
|
4596
|
+
return (React.createElement(core$1.NativeSelect, { id: name, name: name, onChange: (e) => {
|
|
4423
4597
|
const index = e.currentTarget.selectedIndex;
|
|
4424
4598
|
if (index === 0) {
|
|
4425
4599
|
props.onChangeAnswer({});
|
|
@@ -4447,18 +4621,27 @@
|
|
|
4447
4621
|
const { name, item, initial, onChangeAnswer } = props;
|
|
4448
4622
|
const valueElementDefinition = core.globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];
|
|
4449
4623
|
const initialValue = core.getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value');
|
|
4450
|
-
|
|
4451
|
-
|
|
4624
|
+
const options = [];
|
|
4625
|
+
let defaultValue = undefined;
|
|
4626
|
+
if (item.answerOption) {
|
|
4627
|
+
for (let i = 0; i < item.answerOption.length; i++) {
|
|
4628
|
+
const option = item.answerOption[i];
|
|
4629
|
+
const optionName = `${name}-option-${i}`;
|
|
4452
4630
|
const optionValue = core.getTypedPropertyValue({ type: 'QuestionnaireItemAnswerOption', value: option }, 'value');
|
|
4453
|
-
|
|
4454
|
-
|
|
4455
|
-
|
|
4456
|
-
|
|
4457
|
-
|
|
4458
|
-
|
|
4459
|
-
|
|
4460
|
-
|
|
4461
|
-
|
|
4631
|
+
if (initialValue && core.stringify(optionValue) === core.stringify(initialValue)) {
|
|
4632
|
+
defaultValue = optionName;
|
|
4633
|
+
}
|
|
4634
|
+
options.push([optionName, optionValue]);
|
|
4635
|
+
}
|
|
4636
|
+
}
|
|
4637
|
+
return (React.createElement(core$1.Radio.Group, { name: name, orientation: "vertical", defaultValue: defaultValue, onChange: (newValue) => {
|
|
4638
|
+
const option = options.find((option) => option[0] === newValue);
|
|
4639
|
+
if (option) {
|
|
4640
|
+
const optionValue = option[1];
|
|
4641
|
+
const propertyName = 'value' + core.capitalize(optionValue.type);
|
|
4642
|
+
onChangeAnswer({ [propertyName]: optionValue.value });
|
|
4643
|
+
}
|
|
4644
|
+
} }, options.map(([optionName, optionValue]) => (React.createElement(core$1.Radio, { key: optionName, id: optionName, value: optionName, label: React.createElement(ResourcePropertyDisplay, { property: valueElementDefinition, propertyType: optionValue.type, value: optionValue.value }) })))));
|
|
4462
4645
|
}
|
|
4463
4646
|
function buildInitialResponse(questionnaire) {
|
|
4464
4647
|
const response = {
|
|
@@ -4524,6 +4707,50 @@
|
|
|
4524
4707
|
}
|
|
4525
4708
|
}
|
|
4526
4709
|
|
|
4710
|
+
const useStyles$4 = core$1.createStyles((theme) => ({
|
|
4711
|
+
section: {
|
|
4712
|
+
position: 'relative',
|
|
4713
|
+
margin: '4px 4px 8px 0',
|
|
4714
|
+
padding: '6px 12px 16px 6px',
|
|
4715
|
+
border: `1.5px solid ${theme.colors.gray[1]}`,
|
|
4716
|
+
borderRadius: theme.radius.sm,
|
|
4717
|
+
transition: 'all 0.1s',
|
|
4718
|
+
},
|
|
4719
|
+
hovering: {
|
|
4720
|
+
border: `1.5px solid ${theme.colors.blue[5]}`,
|
|
4721
|
+
},
|
|
4722
|
+
editing: {
|
|
4723
|
+
border: `1.5px solid ${theme.colors.gray[1]}`,
|
|
4724
|
+
borderLeft: `4px solid ${theme.colors.blue[5]}`,
|
|
4725
|
+
},
|
|
4726
|
+
questionBody: {
|
|
4727
|
+
maxWidth: 600,
|
|
4728
|
+
},
|
|
4729
|
+
topActions: {
|
|
4730
|
+
position: 'absolute',
|
|
4731
|
+
right: 4,
|
|
4732
|
+
top: 1,
|
|
4733
|
+
padding: 4,
|
|
4734
|
+
color: theme.colors.gray[5],
|
|
4735
|
+
fontSize: theme.fontSizes.xs,
|
|
4736
|
+
},
|
|
4737
|
+
bottomActions: {
|
|
4738
|
+
position: 'absolute',
|
|
4739
|
+
right: 4,
|
|
4740
|
+
bottom: 0,
|
|
4741
|
+
fontSize: theme.fontSizes.xs,
|
|
4742
|
+
'& a': {
|
|
4743
|
+
marginLeft: 8,
|
|
4744
|
+
},
|
|
4745
|
+
},
|
|
4746
|
+
linkIdInput: {
|
|
4747
|
+
width: 100,
|
|
4748
|
+
marginBottom: 4,
|
|
4749
|
+
},
|
|
4750
|
+
typeSelect: {
|
|
4751
|
+
width: 100,
|
|
4752
|
+
},
|
|
4753
|
+
}));
|
|
4527
4754
|
function QuestionnaireBuilder(props) {
|
|
4528
4755
|
const medplum = useMedplum();
|
|
4529
4756
|
const defaultValue = useResource(props.questionnaire);
|
|
@@ -4552,13 +4779,14 @@
|
|
|
4552
4779
|
if (!schema || !value) {
|
|
4553
4780
|
return null;
|
|
4554
4781
|
}
|
|
4555
|
-
return (
|
|
4556
|
-
|
|
4557
|
-
|
|
4558
|
-
|
|
4782
|
+
return (React.createElement("div", null,
|
|
4783
|
+
React.createElement(Form, { testid: "questionnaire-form", onSubmit: () => props.onSubmit(value) },
|
|
4784
|
+
React.createElement(ItemBuilder, { item: value, selectedKey: selectedKey, setSelectedKey: setSelectedKey, hoverKey: hoverKey, setHoverKey: setHoverKey, onChange: setValue }),
|
|
4785
|
+
React.createElement(core$1.Button, { type: "submit" }, "Save"))));
|
|
4559
4786
|
}
|
|
4560
4787
|
function ItemBuilder(props) {
|
|
4561
4788
|
var _a;
|
|
4789
|
+
const { classes, cx } = useStyles$4();
|
|
4562
4790
|
const resource = props.item;
|
|
4563
4791
|
const item = props.item;
|
|
4564
4792
|
const isResource = 'resourceType' in props.item;
|
|
@@ -4592,41 +4820,43 @@
|
|
|
4592
4820
|
function changeProperty(property, value) {
|
|
4593
4821
|
props.onChange(Object.assign(Object.assign({}, itemRef.current), { [property]: value }));
|
|
4594
4822
|
}
|
|
4595
|
-
const className =
|
|
4596
|
-
|
|
4597
|
-
|
|
4598
|
-
|
|
4599
|
-
|
|
4600
|
-
|
|
4601
|
-
|
|
4602
|
-
|
|
4603
|
-
|
|
4604
|
-
|
|
4605
|
-
|
|
4606
|
-
|
|
4607
|
-
{ value: 'dateTime', label: 'Date/Time' },
|
|
4608
|
-
{ value: 'time', label: 'Time' },
|
|
4609
|
-
{ value: 'string', label: 'String' },
|
|
4610
|
-
{ value: 'text', label: 'Text' },
|
|
4611
|
-
{ value: 'url', label: 'URL' },
|
|
4612
|
-
{ value: 'choice', label: 'Choice' },
|
|
4613
|
-
{ value: 'open-choice', label: 'Open Choice' },
|
|
4614
|
-
{ value: 'attachment', label: 'Attachment' },
|
|
4615
|
-
{ value: 'reference', label: 'Reference' },
|
|
4616
|
-
{ value: 'quantity', label: 'Quantity' },
|
|
4617
|
-
] }))),
|
|
4618
|
-
!isResource && (React__default["default"].createElement(core$1.Textarea, { style: { width: '95%', height: '100px', minHeight: '100px', margin: '8px 4px 4px 4px' }, defaultValue: item.text, onChange: (e) => changeProperty('text', e.currentTarget.value) })),
|
|
4619
|
-
isChoiceQuestion(item) && (React__default["default"].createElement(AnswerBuilder, { options: item.answerOption, onChange: (newOptions) => changeProperty('answerOption', newOptions) })))) : (React__default["default"].createElement(React__default["default"].Fragment, null,
|
|
4620
|
-
resource.title && React__default["default"].createElement("h1", null, resource.title),
|
|
4621
|
-
item.text && React__default["default"].createElement("p", null, item.text),
|
|
4622
|
-
!isContainer && React__default["default"].createElement(QuestionnaireFormItem, { item: item, answers: {}, onChange: () => undefined }))),
|
|
4823
|
+
const className = cx(classes.section, {
|
|
4824
|
+
[classes.editing]: editing,
|
|
4825
|
+
[classes.hovering]: hovering && !editing,
|
|
4826
|
+
});
|
|
4827
|
+
return (React.createElement("div", { "data-testid": item.linkId, className: className, onClick: onClick, onMouseOver: onHover },
|
|
4828
|
+
React.createElement("div", { className: classes.questionBody }, editing ? (React.createElement(React.Fragment, null,
|
|
4829
|
+
isResource && (React.createElement(core$1.TextInput, { size: "xl", defaultValue: resource.title, onChange: (e) => changeProperty('title', e.currentTarget.value) })),
|
|
4830
|
+
!isResource && (React.createElement(core$1.Textarea, { autosize: true, minRows: 2, defaultValue: item.text, onChange: (e) => changeProperty('text', e.currentTarget.value) })),
|
|
4831
|
+
isChoiceQuestion(item) && (React.createElement(AnswerBuilder, { options: item.answerOption, onChange: (newOptions) => changeProperty('answerOption', newOptions) })))) : (React.createElement(React.Fragment, null,
|
|
4832
|
+
resource.title && React.createElement(core$1.Title, null, resource.title),
|
|
4833
|
+
item.text && React.createElement("div", null, item.text),
|
|
4834
|
+
!isContainer && React.createElement(QuestionnaireFormItem, { item: item, answers: {}, onChange: () => undefined })))),
|
|
4623
4835
|
item.item &&
|
|
4624
|
-
item.item.map((i) => (
|
|
4625
|
-
|
|
4626
|
-
!isContainer && (
|
|
4627
|
-
|
|
4628
|
-
isContainer && (
|
|
4629
|
-
|
|
4836
|
+
item.item.map((i) => (React.createElement("div", { key: i.id },
|
|
4837
|
+
React.createElement(ItemBuilder, { item: i, selectedKey: props.selectedKey, setSelectedKey: props.setSelectedKey, hoverKey: props.hoverKey, setHoverKey: props.setHoverKey, onChange: changeItem, onRemove: () => removeItem(i) })))),
|
|
4838
|
+
!isContainer && (React.createElement("div", { className: classes.topActions }, editing ? (React.createElement(React.Fragment, null,
|
|
4839
|
+
React.createElement(core$1.TextInput, { size: "xs", className: classes.linkIdInput, defaultValue: item.linkId, onChange: (e) => changeProperty('linkId', e.currentTarget.value) }),
|
|
4840
|
+
!isContainer && (React.createElement(core$1.NativeSelect, { size: "xs", className: classes.typeSelect, defaultValue: item.type, onChange: (e) => changeProperty('type', e.currentTarget.value), data: [
|
|
4841
|
+
{ value: 'display', label: 'Display' },
|
|
4842
|
+
{ value: 'boolean', label: 'Boolean' },
|
|
4843
|
+
{ value: 'decimal', label: 'Decimal' },
|
|
4844
|
+
{ value: 'integer', label: 'Integer' },
|
|
4845
|
+
{ value: 'date', label: 'Date' },
|
|
4846
|
+
{ value: 'dateTime', label: 'Date/Time' },
|
|
4847
|
+
{ value: 'time', label: 'Time' },
|
|
4848
|
+
{ value: 'string', label: 'String' },
|
|
4849
|
+
{ value: 'text', label: 'Text' },
|
|
4850
|
+
{ value: 'url', label: 'URL' },
|
|
4851
|
+
{ value: 'choice', label: 'Choice' },
|
|
4852
|
+
{ value: 'open-choice', label: 'Open Choice' },
|
|
4853
|
+
{ value: 'attachment', label: 'Attachment' },
|
|
4854
|
+
{ value: 'reference', label: 'Reference' },
|
|
4855
|
+
{ value: 'quantity', label: 'Quantity' },
|
|
4856
|
+
] })))) : (React.createElement("div", null, linkId)))),
|
|
4857
|
+
React.createElement("div", { className: classes.bottomActions },
|
|
4858
|
+
isContainer && (React.createElement(React.Fragment, null,
|
|
4859
|
+
React.createElement("a", { href: "#", onClick: (e) => {
|
|
4630
4860
|
e.preventDefault();
|
|
4631
4861
|
addItem({
|
|
4632
4862
|
id: generateId(),
|
|
@@ -4635,7 +4865,7 @@
|
|
|
4635
4865
|
text: 'Question',
|
|
4636
4866
|
});
|
|
4637
4867
|
} }, "Add item"),
|
|
4638
|
-
|
|
4868
|
+
React.createElement("a", { href: "#", onClick: (e) => {
|
|
4639
4869
|
e.preventDefault();
|
|
4640
4870
|
addItem({
|
|
4641
4871
|
id: generateId(),
|
|
@@ -4644,7 +4874,7 @@
|
|
|
4644
4874
|
text: 'Group',
|
|
4645
4875
|
});
|
|
4646
4876
|
} }, "Add group"))),
|
|
4647
|
-
!isResource && (
|
|
4877
|
+
editing && !isResource && (React.createElement("a", { href: "#", onClick: (e) => {
|
|
4648
4878
|
e.preventDefault();
|
|
4649
4879
|
if (props.onRemove) {
|
|
4650
4880
|
props.onRemove();
|
|
@@ -4655,30 +4885,30 @@
|
|
|
4655
4885
|
var _a;
|
|
4656
4886
|
const property = core.globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];
|
|
4657
4887
|
const options = (_a = props.options) !== null && _a !== void 0 ? _a : [];
|
|
4658
|
-
return (
|
|
4888
|
+
return (React.createElement("div", null,
|
|
4659
4889
|
options.map((option) => {
|
|
4660
4890
|
const [propertyValue, propertyType] = getValueAndType({ type: 'QuestionnaireItemAnswerOption', value: option }, 'value');
|
|
4661
|
-
return (
|
|
4891
|
+
return (React.createElement("div", { key: option.id, style: {
|
|
4662
4892
|
display: 'flex',
|
|
4663
4893
|
flexDirection: 'row',
|
|
4664
4894
|
justifyContent: 'space-between',
|
|
4665
4895
|
alignItems: 'center',
|
|
4666
4896
|
width: '80%',
|
|
4667
4897
|
} },
|
|
4668
|
-
|
|
4669
|
-
|
|
4898
|
+
React.createElement("div", null,
|
|
4899
|
+
React.createElement(ResourcePropertyInput, { key: option.id, name: "value[x]", property: property, defaultPropertyType: propertyType, defaultValue: propertyValue, onChange: (newValue, propName) => {
|
|
4670
4900
|
const newOptions = [...options];
|
|
4671
4901
|
const index = newOptions.findIndex((o) => o.id === option.id);
|
|
4672
4902
|
newOptions[index] = { id: option.id, [propName]: newValue };
|
|
4673
4903
|
props.onChange(newOptions);
|
|
4674
4904
|
} })),
|
|
4675
|
-
|
|
4676
|
-
|
|
4905
|
+
React.createElement("div", null,
|
|
4906
|
+
React.createElement("a", { href: "#", onClick: (e) => {
|
|
4677
4907
|
killEvent(e);
|
|
4678
4908
|
props.onChange(options.filter((o) => o.id !== option.id));
|
|
4679
4909
|
} }, "Remove"))));
|
|
4680
4910
|
}),
|
|
4681
|
-
|
|
4911
|
+
React.createElement("a", { href: "#", onClick: (e) => {
|
|
4682
4912
|
killEvent(e);
|
|
4683
4913
|
props.onChange([
|
|
4684
4914
|
...options,
|
|
@@ -4787,7 +5017,7 @@
|
|
|
4787
5017
|
stat: 'red',
|
|
4788
5018
|
};
|
|
4789
5019
|
function StatusBadge(props) {
|
|
4790
|
-
return
|
|
5020
|
+
return React.createElement(core$1.Badge, { color: statusToColor[props.status] }, props.status);
|
|
4791
5021
|
}
|
|
4792
5022
|
|
|
4793
5023
|
function RequestGroupDisplay(props) {
|
|
@@ -4805,27 +5035,27 @@
|
|
|
4805
5035
|
if (!requestGroup || !responseBundle) {
|
|
4806
5036
|
return null;
|
|
4807
5037
|
}
|
|
4808
|
-
return (
|
|
5038
|
+
return (React.createElement(core$1.Grid, null, (_a = requestGroup.action) === null || _a === void 0 ? void 0 : _a.map((action, index) => {
|
|
4809
5039
|
var _a, _b, _c, _d, _e, _f;
|
|
4810
5040
|
const task = action.resource && findBundleEntry(action.resource);
|
|
4811
5041
|
const taskInput = (_b = (_a = task === null || task === void 0 ? void 0 : task.input) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.valueReference;
|
|
4812
5042
|
const taskOutput = (_d = (_c = task === null || task === void 0 ? void 0 : task.output) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.valueReference;
|
|
4813
|
-
return (
|
|
4814
|
-
|
|
4815
|
-
|
|
4816
|
-
|
|
4817
|
-
action.description &&
|
|
4818
|
-
|
|
5043
|
+
return (React.createElement(React.Fragment, { key: `action-${index}` },
|
|
5044
|
+
React.createElement(core$1.Grid.Col, { span: 1, p: "md" }, (task === null || task === void 0 ? void 0 : task.status) === 'completed' ? React.createElement(icons.IconCheckbox, null) : React.createElement(icons.IconSquare, { color: "gray" })),
|
|
5045
|
+
React.createElement(core$1.Grid.Col, { span: 9, p: "xs" },
|
|
5046
|
+
React.createElement(core$1.Text, { weight: 500 }, action.title),
|
|
5047
|
+
action.description && React.createElement("div", null, action.description),
|
|
5048
|
+
React.createElement("div", null,
|
|
4819
5049
|
"Last edited by\u00A0",
|
|
4820
|
-
|
|
5050
|
+
React.createElement(ResourceName, { value: (_e = task === null || task === void 0 ? void 0 : task.meta) === null || _e === void 0 ? void 0 : _e.author }),
|
|
4821
5051
|
"\u00A0on\u00A0",
|
|
4822
5052
|
core.formatDateTime((_f = task === null || task === void 0 ? void 0 : task.meta) === null || _f === void 0 ? void 0 : _f.lastUpdated)),
|
|
4823
|
-
|
|
5053
|
+
React.createElement("div", null,
|
|
4824
5054
|
"Status: ",
|
|
4825
|
-
|
|
4826
|
-
|
|
4827
|
-
taskInput && !taskOutput &&
|
|
4828
|
-
taskInput && taskOutput && (
|
|
5055
|
+
React.createElement(StatusBadge, { status: (task === null || task === void 0 ? void 0 : task.status) || 'unknown' }))),
|
|
5056
|
+
React.createElement(core$1.Grid.Col, { span: 2, p: "md" },
|
|
5057
|
+
taskInput && !taskOutput && React.createElement(core$1.Button, { onClick: () => props.onStart(task, taskInput) }, "Start"),
|
|
5058
|
+
taskInput && taskOutput && (React.createElement(core$1.Button, { onClick: () => props.onEdit(task, taskInput, taskOutput) }, "Edit")))));
|
|
4829
5059
|
})));
|
|
4830
5060
|
function buildBatchRequest(request) {
|
|
4831
5061
|
var _a;
|
|
@@ -5039,8 +5269,56 @@
|
|
|
5039
5269
|
}
|
|
5040
5270
|
}
|
|
5041
5271
|
|
|
5272
|
+
const useStyles$3 = core$1.createStyles((theme) => ({
|
|
5273
|
+
container: {
|
|
5274
|
+
overflowX: 'auto',
|
|
5275
|
+
},
|
|
5276
|
+
root: {
|
|
5277
|
+
border: `0.1px solid ${theme.colors.gray[3]}`,
|
|
5278
|
+
borderCollapse: 'collapse',
|
|
5279
|
+
borderRadius: theme.radius.sm,
|
|
5280
|
+
borderSpacing: 0,
|
|
5281
|
+
fontSize: theme.fontSizes.xs,
|
|
5282
|
+
width: '100%',
|
|
5283
|
+
'& td': {
|
|
5284
|
+
padding: '2px 4px 0 4px',
|
|
5285
|
+
verticalAlign: 'top',
|
|
5286
|
+
whiteSpace: 'nowrap',
|
|
5287
|
+
},
|
|
5288
|
+
},
|
|
5289
|
+
startRow: {
|
|
5290
|
+
borderTop: `0.1px solid ${theme.colors.gray[3]}`,
|
|
5291
|
+
},
|
|
5292
|
+
normalRow: {
|
|
5293
|
+
borderTop: 0,
|
|
5294
|
+
},
|
|
5295
|
+
author: {
|
|
5296
|
+
lineHeight: '10px',
|
|
5297
|
+
},
|
|
5298
|
+
dateTime: {
|
|
5299
|
+
borderRight: `0.1px solid ${theme.colors.gray[3]}`,
|
|
5300
|
+
lineHeight: '20px',
|
|
5301
|
+
},
|
|
5302
|
+
lineNumber: {
|
|
5303
|
+
backgroundColor: theme.colors.gray[1],
|
|
5304
|
+
border: 0,
|
|
5305
|
+
color: theme.colors.gray[5],
|
|
5306
|
+
fontFamily: theme.fontFamilyMonospace,
|
|
5307
|
+
padding: `${theme.spacing.xs}px ${theme.spacing.sm}px`,
|
|
5308
|
+
textAlign: 'right',
|
|
5309
|
+
},
|
|
5310
|
+
line: {
|
|
5311
|
+
fontFamily: theme.fontFamilyMonospace,
|
|
5312
|
+
fontSize: theme.fontSizes.sm,
|
|
5313
|
+
padding: `${theme.spacing.xs}px ${theme.spacing.sm}px`,
|
|
5314
|
+
},
|
|
5315
|
+
pre: {
|
|
5316
|
+
margin: 0,
|
|
5317
|
+
},
|
|
5318
|
+
}));
|
|
5042
5319
|
function ResourceBlame(props) {
|
|
5043
5320
|
var _a, _b;
|
|
5321
|
+
const { classes } = useStyles$3();
|
|
5044
5322
|
const medplum = useMedplum();
|
|
5045
5323
|
const [value, setValue] = React.useState(props.history);
|
|
5046
5324
|
React.useEffect(() => {
|
|
@@ -5049,20 +5327,21 @@
|
|
|
5049
5327
|
}
|
|
5050
5328
|
}, [medplum, props.history, props.resourceType, props.id]);
|
|
5051
5329
|
if (!value) {
|
|
5052
|
-
return
|
|
5330
|
+
return React.createElement("div", null, "Loading...");
|
|
5053
5331
|
}
|
|
5054
5332
|
const resource = (_b = (_a = value.entry) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.resource;
|
|
5055
5333
|
const table = blame(value);
|
|
5056
|
-
return (
|
|
5057
|
-
|
|
5058
|
-
|
|
5059
|
-
row.span > 0 && (
|
|
5060
|
-
|
|
5061
|
-
|
|
5062
|
-
|
|
5063
|
-
|
|
5064
|
-
|
|
5065
|
-
|
|
5334
|
+
return (React.createElement("div", { className: classes.container },
|
|
5335
|
+
React.createElement("table", { className: classes.root },
|
|
5336
|
+
React.createElement("tbody", null, table.map((row, index) => (React.createElement("tr", { key: 'row-' + index, className: row.span > 0 ? classes.startRow : classes.normalRow },
|
|
5337
|
+
row.span > 0 && (React.createElement(React.Fragment, null,
|
|
5338
|
+
React.createElement("td", { className: classes.author, rowSpan: row.span },
|
|
5339
|
+
React.createElement(ResourceBadge, { value: row.meta.author, link: true })),
|
|
5340
|
+
React.createElement("td", { className: classes.dateTime, rowSpan: row.span },
|
|
5341
|
+
React.createElement(MedplumLink, { to: getVersionUrl$1(resource, row.meta.versionId) }, getTimeString(row.meta.lastUpdated))))),
|
|
5342
|
+
React.createElement("td", { className: classes.lineNumber }, index + 1),
|
|
5343
|
+
React.createElement("td", { className: classes.line },
|
|
5344
|
+
React.createElement("pre", { className: classes.pre }, row.value)))))))));
|
|
5066
5345
|
}
|
|
5067
5346
|
function getVersionUrl$1(resource, versionId) {
|
|
5068
5347
|
return `/${resource.resourceType}/${resource.id}/_history/${versionId}`;
|
|
@@ -5095,6 +5374,15 @@
|
|
|
5095
5374
|
return `${count} ${count === 1 ? noun : noun + 's'} ago`;
|
|
5096
5375
|
}
|
|
5097
5376
|
|
|
5377
|
+
const useStyles$2 = core$1.createStyles((theme) => ({
|
|
5378
|
+
removed: {
|
|
5379
|
+
color: theme.colors.red[7],
|
|
5380
|
+
textDecoration: 'line-through',
|
|
5381
|
+
},
|
|
5382
|
+
added: {
|
|
5383
|
+
color: theme.colors.green[7],
|
|
5384
|
+
},
|
|
5385
|
+
}));
|
|
5098
5386
|
function ResourceDiff(props) {
|
|
5099
5387
|
let originalResource = props.original;
|
|
5100
5388
|
let revisedResource = props.revised;
|
|
@@ -5105,16 +5393,17 @@
|
|
|
5105
5393
|
const original = core.stringify(originalResource, true).match(/[^\r\n]+/g);
|
|
5106
5394
|
const revised = core.stringify(revisedResource, true).match(/[^\r\n]+/g);
|
|
5107
5395
|
const deltas = diff(original, revised);
|
|
5108
|
-
return (
|
|
5396
|
+
return (React.createElement("pre", { style: { color: 'gray' } }, deltas.map((delta, index) => (React.createElement(ChangeDiff, { key: 'delta' + index, delta: delta })))));
|
|
5109
5397
|
}
|
|
5110
5398
|
function ChangeDiff(props) {
|
|
5111
|
-
|
|
5399
|
+
const { classes } = useStyles$2();
|
|
5400
|
+
return (React.createElement(React.Fragment, null,
|
|
5112
5401
|
"...",
|
|
5113
|
-
|
|
5114
|
-
props.delta.original.lines.length > 0 && (
|
|
5115
|
-
props.delta.revised.lines.length > 0 && (
|
|
5402
|
+
React.createElement("br", null),
|
|
5403
|
+
props.delta.original.lines.length > 0 && (React.createElement("div", { className: classes.removed }, props.delta.original.lines.join('\n'))),
|
|
5404
|
+
props.delta.revised.lines.length > 0 && (React.createElement("div", { className: classes.added }, props.delta.revised.lines.join('\n'))),
|
|
5116
5405
|
"...",
|
|
5117
|
-
|
|
5406
|
+
React.createElement("br", null)));
|
|
5118
5407
|
}
|
|
5119
5408
|
|
|
5120
5409
|
function ResourceHistoryTable(props) {
|
|
@@ -5130,30 +5419,30 @@
|
|
|
5130
5419
|
}
|
|
5131
5420
|
}, [medplum, props.history, props.resourceType, props.id]);
|
|
5132
5421
|
if (!value) {
|
|
5133
|
-
return
|
|
5422
|
+
return React.createElement("div", null, "Loading...");
|
|
5134
5423
|
}
|
|
5135
|
-
return (
|
|
5136
|
-
|
|
5137
|
-
|
|
5138
|
-
|
|
5139
|
-
|
|
5140
|
-
|
|
5141
|
-
|
|
5424
|
+
return (React.createElement(core$1.Table, { withBorder: true, withColumnBorders: true },
|
|
5425
|
+
React.createElement("thead", null,
|
|
5426
|
+
React.createElement("tr", null,
|
|
5427
|
+
React.createElement("th", null, "Author"),
|
|
5428
|
+
React.createElement("th", null, "Date"),
|
|
5429
|
+
React.createElement("th", null, "Version"))),
|
|
5430
|
+
React.createElement("tbody", null, (_a = value.entry) === null || _a === void 0 ? void 0 : _a.map((entry, index) => (React.createElement(HistoryRow, { key: 'entry-' + index, entry: entry }))))));
|
|
5142
5431
|
}
|
|
5143
5432
|
function HistoryRow(props) {
|
|
5144
5433
|
var _a, _b, _c;
|
|
5145
5434
|
const { response, resource } = props.entry;
|
|
5146
5435
|
if (resource) {
|
|
5147
|
-
return (
|
|
5148
|
-
|
|
5149
|
-
|
|
5150
|
-
|
|
5151
|
-
|
|
5152
|
-
|
|
5436
|
+
return (React.createElement("tr", null,
|
|
5437
|
+
React.createElement("td", null,
|
|
5438
|
+
React.createElement(ResourceBadge, { value: (_a = resource.meta) === null || _a === void 0 ? void 0 : _a.author, link: true })),
|
|
5439
|
+
React.createElement("td", null, core.formatDateTime((_b = resource.meta) === null || _b === void 0 ? void 0 : _b.lastUpdated)),
|
|
5440
|
+
React.createElement("td", null,
|
|
5441
|
+
React.createElement(MedplumLink, { to: getVersionUrl(resource) }, (_c = resource.meta) === null || _c === void 0 ? void 0 : _c.versionId))));
|
|
5153
5442
|
}
|
|
5154
5443
|
else {
|
|
5155
|
-
return (
|
|
5156
|
-
|
|
5444
|
+
return (React.createElement("tr", null,
|
|
5445
|
+
React.createElement("td", { colSpan: 3 }, core.normalizeErrorString(response === null || response === void 0 ? void 0 : response.outcome))));
|
|
5157
5446
|
}
|
|
5158
5447
|
}
|
|
5159
5448
|
function getVersionUrl(resource) {
|
|
@@ -5161,6 +5450,42 @@
|
|
|
5161
5450
|
return `/${resource.resourceType}/${resource.id}/_history/${(_a = resource.meta) === null || _a === void 0 ? void 0 : _a.versionId}`;
|
|
5162
5451
|
}
|
|
5163
5452
|
|
|
5453
|
+
const useStyles$1 = core$1.createStyles((theme) => ({
|
|
5454
|
+
table: {
|
|
5455
|
+
width: 350,
|
|
5456
|
+
'& th': {
|
|
5457
|
+
fontWeight: 'normal',
|
|
5458
|
+
fontSize: 11,
|
|
5459
|
+
padding: 8,
|
|
5460
|
+
textAlign: 'center',
|
|
5461
|
+
},
|
|
5462
|
+
'& td': {
|
|
5463
|
+
padding: '2px 4px',
|
|
5464
|
+
},
|
|
5465
|
+
'& td button': {
|
|
5466
|
+
width: 44,
|
|
5467
|
+
height: 44,
|
|
5468
|
+
color: theme.colors[theme.primaryColor][5],
|
|
5469
|
+
fontSize: 16,
|
|
5470
|
+
fontWeight: 500,
|
|
5471
|
+
textAlign: 'center',
|
|
5472
|
+
padding: 0,
|
|
5473
|
+
backgroundColor: theme.colors[theme.primaryColor][0],
|
|
5474
|
+
border: 0,
|
|
5475
|
+
borderRadius: '50%',
|
|
5476
|
+
cursor: 'pointer',
|
|
5477
|
+
},
|
|
5478
|
+
'& td button:hover': {
|
|
5479
|
+
backgroundColor: theme.colors[theme.primaryColor][1],
|
|
5480
|
+
},
|
|
5481
|
+
'& td button:disabled': {
|
|
5482
|
+
backgroundColor: 'transparent',
|
|
5483
|
+
cursor: 'default',
|
|
5484
|
+
color: theme.colors.gray[4],
|
|
5485
|
+
fontWeight: 'normal',
|
|
5486
|
+
},
|
|
5487
|
+
},
|
|
5488
|
+
}));
|
|
5164
5489
|
/**
|
|
5165
5490
|
* Returns a month display string (e.g. "January 2020").
|
|
5166
5491
|
* @param date Any date within the month.
|
|
@@ -5170,6 +5495,7 @@
|
|
|
5170
5495
|
return date.toLocaleString('default', { month: 'long' }) + ' ' + date.getFullYear();
|
|
5171
5496
|
}
|
|
5172
5497
|
function CalendarInput(props) {
|
|
5498
|
+
const { classes } = useStyles$1();
|
|
5173
5499
|
const { onChangeMonth, onClick } = props;
|
|
5174
5500
|
const [month, setMonth] = React.useState(getStartMonth);
|
|
5175
5501
|
function moveMonth(delta) {
|
|
@@ -5181,23 +5507,23 @@
|
|
|
5181
5507
|
});
|
|
5182
5508
|
}
|
|
5183
5509
|
const grid = React.useMemo(() => buildGrid(month, props.slots), [month, props.slots]);
|
|
5184
|
-
return (
|
|
5185
|
-
|
|
5186
|
-
|
|
5187
|
-
|
|
5188
|
-
|
|
5189
|
-
|
|
5190
|
-
|
|
5191
|
-
|
|
5192
|
-
|
|
5193
|
-
|
|
5194
|
-
|
|
5195
|
-
|
|
5196
|
-
|
|
5197
|
-
|
|
5198
|
-
|
|
5199
|
-
|
|
5200
|
-
|
|
5510
|
+
return (React.createElement("div", null,
|
|
5511
|
+
React.createElement(core$1.Group, { position: "apart", spacing: "xs", grow: true, noWrap: true },
|
|
5512
|
+
React.createElement("p", { style: { flex: 1 } }, getMonthString(month)),
|
|
5513
|
+
React.createElement(core$1.Group, { position: "right", spacing: "xs" },
|
|
5514
|
+
React.createElement(core$1.Button, { variant: "outline", "aria-label": "Previous month", onClick: () => moveMonth(-1) }, "<"),
|
|
5515
|
+
React.createElement(core$1.Button, { variant: "outline", "aria-label": "Next month", onClick: () => moveMonth(1) }, ">"))),
|
|
5516
|
+
React.createElement("table", { className: classes.table },
|
|
5517
|
+
React.createElement("thead", null,
|
|
5518
|
+
React.createElement("tr", null,
|
|
5519
|
+
React.createElement("th", null, "SUN"),
|
|
5520
|
+
React.createElement("th", null, "MON"),
|
|
5521
|
+
React.createElement("th", null, "TUE"),
|
|
5522
|
+
React.createElement("th", null, "WED"),
|
|
5523
|
+
React.createElement("th", null, "THU"),
|
|
5524
|
+
React.createElement("th", null, "FRI"),
|
|
5525
|
+
React.createElement("th", null, "SAT"))),
|
|
5526
|
+
React.createElement("tbody", null, grid.map((week, weekIndex) => (React.createElement("tr", { key: 'week-' + weekIndex }, week.map((day, dayIndex) => (React.createElement("td", { key: 'day-' + dayIndex }, day && (React.createElement(core$1.Button, { disabled: !day.available, onClick: () => onClick(day.date) }, day.date.getDate()))))))))))));
|
|
5201
5527
|
}
|
|
5202
5528
|
function getStartMonth() {
|
|
5203
5529
|
const result = new Date();
|
|
@@ -5252,8 +5578,24 @@
|
|
|
5252
5578
|
return false;
|
|
5253
5579
|
}
|
|
5254
5580
|
|
|
5581
|
+
const useStyles = core$1.createStyles((theme) => ({
|
|
5582
|
+
container: {
|
|
5583
|
+
display: 'flex',
|
|
5584
|
+
minHeight: 400,
|
|
5585
|
+
},
|
|
5586
|
+
info: {
|
|
5587
|
+
minWidth: 300,
|
|
5588
|
+
padding: 20,
|
|
5589
|
+
borderRight: `1px solid ${theme.colors.gray[3]}`,
|
|
5590
|
+
},
|
|
5591
|
+
selection: {
|
|
5592
|
+
minWidth: 300,
|
|
5593
|
+
padding: 20,
|
|
5594
|
+
},
|
|
5595
|
+
}));
|
|
5255
5596
|
function Scheduler(props) {
|
|
5256
5597
|
var _a;
|
|
5598
|
+
const { classes } = useStyles();
|
|
5257
5599
|
const medplum = useMedplum();
|
|
5258
5600
|
const schedule = useResource(props.schedule);
|
|
5259
5601
|
const questionnaire = useResource(props.questionnaire);
|
|
@@ -5285,30 +5627,30 @@
|
|
|
5285
5627
|
return null;
|
|
5286
5628
|
}
|
|
5287
5629
|
const actor = (_a = schedule.actor) === null || _a === void 0 ? void 0 : _a[0];
|
|
5288
|
-
return (
|
|
5289
|
-
|
|
5290
|
-
actor &&
|
|
5291
|
-
actor && (
|
|
5292
|
-
|
|
5293
|
-
|
|
5294
|
-
date &&
|
|
5295
|
-
slot &&
|
|
5296
|
-
|
|
5297
|
-
!date && (
|
|
5298
|
-
|
|
5299
|
-
|
|
5300
|
-
date && !slot && (
|
|
5301
|
-
|
|
5302
|
-
|
|
5630
|
+
return (React.createElement("div", { className: classes.container, "data-testid": "scheduler" },
|
|
5631
|
+
React.createElement("div", { className: classes.info },
|
|
5632
|
+
actor && React.createElement(ResourceAvatar, { value: actor, size: "xl" }),
|
|
5633
|
+
actor && (React.createElement(core$1.Text, { size: "xl", weight: 500 },
|
|
5634
|
+
React.createElement(ResourceName, { value: actor }))),
|
|
5635
|
+
React.createElement("p", null, "1 hour"),
|
|
5636
|
+
date && React.createElement("p", null, date.toLocaleDateString()),
|
|
5637
|
+
slot && React.createElement("p", null, formatTime(new Date(slot.start)))),
|
|
5638
|
+
React.createElement("div", { className: classes.selection },
|
|
5639
|
+
!date && (React.createElement("div", null,
|
|
5640
|
+
React.createElement("h3", null, "Select date"),
|
|
5641
|
+
React.createElement(CalendarInput, { slots: slots, onChangeMonth: setMonth, onClick: setDate }))),
|
|
5642
|
+
date && !slot && (React.createElement("div", null,
|
|
5643
|
+
React.createElement("h3", null, "Select time"),
|
|
5644
|
+
React.createElement(core$1.Stack, null, slots.map((s) => {
|
|
5303
5645
|
const slotStart = new Date(s.start);
|
|
5304
5646
|
return (slotStart.getTime() > date.getTime() &&
|
|
5305
|
-
slotStart.getTime() < date.getTime() + 24 * 3600 * 1000 && (
|
|
5306
|
-
|
|
5647
|
+
slotStart.getTime() < date.getTime() + 24 * 3600 * 1000 && (React.createElement("div", { key: s.id },
|
|
5648
|
+
React.createElement(core$1.Button, { variant: "outline", style: { width: 150 }, onClick: () => setSlot(s) }, formatTime(slotStart)))));
|
|
5307
5649
|
})))),
|
|
5308
|
-
date && slot && !response && (
|
|
5309
|
-
date && slot && response && (
|
|
5310
|
-
|
|
5311
|
-
|
|
5650
|
+
date && slot && !response && (React.createElement(QuestionnaireForm, { questionnaire: questionnaire, submitButtonText: 'Next', onSubmit: setResponse })),
|
|
5651
|
+
date && slot && response && (React.createElement("div", null,
|
|
5652
|
+
React.createElement("h3", null, "You're all set!"),
|
|
5653
|
+
React.createElement("p", null, "Check your email for a calendar invite."))))));
|
|
5312
5654
|
}
|
|
5313
5655
|
function getStart(month) {
|
|
5314
5656
|
return formatSlotInstant(month.getTime());
|
|
@@ -5324,7 +5666,7 @@
|
|
|
5324
5666
|
}
|
|
5325
5667
|
|
|
5326
5668
|
function ServiceRequestTimeline(props) {
|
|
5327
|
-
return (
|
|
5669
|
+
return (React.createElement(ResourceTimeline, { value: props.serviceRequest, buildSearchRequests: (resource) => ({
|
|
5328
5670
|
resourceType: 'Bundle',
|
|
5329
5671
|
type: 'batch',
|
|
5330
5672
|
entry: [
|
|
@@ -5493,7 +5835,5 @@
|
|
|
5493
5835
|
exports.useMedplumProfile = useMedplumProfile;
|
|
5494
5836
|
exports.useResource = useResource;
|
|
5495
5837
|
|
|
5496
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
5497
|
-
|
|
5498
5838
|
}));
|
|
5499
5839
|
//# sourceMappingURL=index.js.map
|