@medplum/react 0.10.1 → 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 +1252 -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/cjs/stories/PlanDefinitionBuilder.stories.d.ts +2 -0
- package/dist/cjs/stories/RequestGroupDisplay.stories.d.ts +1 -0
- package/dist/cjs/stories/ResourceTable.stories.d.ts +4 -0
- package/dist/cjs/stories/covid19.d.ts +15 -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 +28 -2
- 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/dist/esm/stories/PlanDefinitionBuilder.stories.d.ts +2 -0
- package/dist/esm/stories/RequestGroupDisplay.stories.d.ts +1 -0
- package/dist/esm/stories/ResourceTable.stories.d.ts +4 -0
- package/dist/esm/stories/covid19.d.ts +15 -0
- package/package.json +35 -23
- 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,22 +1650,48 @@
|
|
|
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);
|
|
1644
1678
|
const [value, setValue] = React.useState(defaultValue ? core.getDisplayString(defaultValue) : '');
|
|
1645
1679
|
const [loading, setLoading] = React.useState(false);
|
|
1646
1680
|
const [data, setData] = React.useState([]);
|
|
1681
|
+
React.useEffect(() => {
|
|
1682
|
+
if (defaultValue) {
|
|
1683
|
+
setValue(core.getDisplayString(defaultValue));
|
|
1684
|
+
}
|
|
1685
|
+
}, [defaultValue, setValue]);
|
|
1647
1686
|
function loadValues(input) {
|
|
1648
1687
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1649
1688
|
setLoading(true);
|
|
1650
|
-
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);
|
|
1651
1695
|
setData(resources.map((resource) => ({ value: core.getDisplayString(resource), resource })));
|
|
1652
1696
|
setLoading(false);
|
|
1653
1697
|
});
|
|
@@ -1665,16 +1709,16 @@
|
|
|
1665
1709
|
props.onChange(item.resource);
|
|
1666
1710
|
}
|
|
1667
1711
|
}
|
|
1668
|
-
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 }));
|
|
1669
1713
|
}
|
|
1670
1714
|
const ItemComponent = React.forwardRef((_a, ref) => {
|
|
1671
1715
|
var { value, resource } = _a, others = __rest(_a, ["value", "resource"]);
|
|
1672
|
-
return (
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
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)))));
|
|
1678
1722
|
});
|
|
1679
1723
|
|
|
1680
1724
|
function ReferenceInput(props) {
|
|
@@ -1692,9 +1736,9 @@
|
|
|
1692
1736
|
props.onChange(newValue);
|
|
1693
1737
|
}
|
|
1694
1738
|
}
|
|
1695
|
-
return (
|
|
1696
|
-
targetTypes ? (
|
|
1697
|
-
|
|
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) => {
|
|
1698
1742
|
setValueHelper(item ? core.createReference(item) : undefined);
|
|
1699
1743
|
} })));
|
|
1700
1744
|
}
|
|
@@ -1720,36 +1764,36 @@
|
|
|
1720
1764
|
props.onChange(newValues);
|
|
1721
1765
|
}
|
|
1722
1766
|
}
|
|
1723
|
-
return (
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
values.map((v, index) => (
|
|
1729
|
-
|
|
1730
|
-
|
|
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) => {
|
|
1731
1775
|
const copy = [...valuesRef.current];
|
|
1732
1776
|
copy[index] = newValue;
|
|
1733
1777
|
setValuesWrapper(copy);
|
|
1734
1778
|
} })),
|
|
1735
|
-
|
|
1736
|
-
|
|
1779
|
+
React.createElement("td", { style: { textAlign: 'right' } },
|
|
1780
|
+
React.createElement(core$1.ActionIcon, { title: "Remove", size: "sm", onClick: (e) => {
|
|
1737
1781
|
killEvent(e);
|
|
1738
1782
|
const copy = [...valuesRef.current];
|
|
1739
1783
|
copy.splice(index, 1);
|
|
1740
1784
|
setValuesWrapper(copy);
|
|
1741
1785
|
} },
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
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) => {
|
|
1747
1791
|
killEvent(e);
|
|
1748
1792
|
const copy = [...valuesRef.current];
|
|
1749
1793
|
copy.push(undefined);
|
|
1750
1794
|
setValuesWrapper(copy);
|
|
1751
1795
|
} },
|
|
1752
|
-
|
|
1796
|
+
React.createElement(icons.IconCirclePlus, null)))))));
|
|
1753
1797
|
}
|
|
1754
1798
|
|
|
1755
1799
|
const daysOfWeek = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
|
|
@@ -1758,11 +1802,11 @@
|
|
|
1758
1802
|
const [open, setOpen] = React.useState(false);
|
|
1759
1803
|
const valueRef = React.useRef();
|
|
1760
1804
|
valueRef.current = value;
|
|
1761
|
-
return (
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
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) => {
|
|
1766
1810
|
if (props.onChange) {
|
|
1767
1811
|
props.onChange(newValue);
|
|
1768
1812
|
}
|
|
@@ -1811,24 +1855,24 @@
|
|
|
1811
1855
|
setRepeat(Object.assign(Object.assign({}, (_c = valueRef.current) === null || _c === void 0 ? void 0 : _c.repeat), { dayOfWeek: existing.filter((d) => d !== day) }));
|
|
1812
1856
|
}
|
|
1813
1857
|
}
|
|
1814
|
-
return (
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
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: [
|
|
1822
1866
|
{ label: 'day', value: 'd' },
|
|
1823
1867
|
{ label: 'week', value: 'wk' },
|
|
1824
1868
|
{ label: 'month', value: 'mo' },
|
|
1825
1869
|
{ label: 'year', value: 'a' },
|
|
1826
1870
|
] }))),
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
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")));
|
|
1832
1876
|
}
|
|
1833
1877
|
|
|
1834
1878
|
function ResourcePropertyInput(props) {
|
|
@@ -1839,16 +1883,16 @@
|
|
|
1839
1883
|
const value = props.defaultValue;
|
|
1840
1884
|
if (property.max === '*' && !props.arrayElement) {
|
|
1841
1885
|
if (propertyType === 'Attachment') {
|
|
1842
|
-
return
|
|
1886
|
+
return React.createElement(AttachmentArrayInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1843
1887
|
}
|
|
1844
|
-
return
|
|
1888
|
+
return React.createElement(ResourceArrayInput, { property: property, name: name, defaultValue: value, onChange: props.onChange });
|
|
1845
1889
|
}
|
|
1846
1890
|
const propertyTypes = property.type;
|
|
1847
1891
|
if (propertyTypes.length > 1) {
|
|
1848
|
-
return
|
|
1892
|
+
return React.createElement(ElementDefinitionInputSelector, Object.assign({ elementDefinitionTypes: propertyTypes }, props));
|
|
1849
1893
|
}
|
|
1850
1894
|
else {
|
|
1851
|
-
return
|
|
1895
|
+
return React.createElement(ElementDefinitionTypeInput, Object.assign({ elementDefinitionType: propertyTypes[0] }, props));
|
|
1852
1896
|
}
|
|
1853
1897
|
}
|
|
1854
1898
|
function ElementDefinitionInputSelector(props) {
|
|
@@ -1861,14 +1905,14 @@
|
|
|
1861
1905
|
initialPropertyType = propertyTypes[0];
|
|
1862
1906
|
}
|
|
1863
1907
|
const [selectedType, setSelectedType] = React.useState(initialPropertyType);
|
|
1864
|
-
return (
|
|
1865
|
-
|
|
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) => {
|
|
1866
1910
|
setSelectedType(propertyTypes.find((type) => type.code === e.currentTarget.value));
|
|
1867
1911
|
}, data: propertyTypes.map((type) => ({
|
|
1868
1912
|
value: type.code,
|
|
1869
1913
|
label: type.code,
|
|
1870
1914
|
})) }),
|
|
1871
|
-
|
|
1915
|
+
React.createElement(ElementDefinitionTypeInput, Object.assign({}, props, { elementDefinitionType: selectedType, onChange: (newValue) => {
|
|
1872
1916
|
if (props.onChange) {
|
|
1873
1917
|
props.onChange(newValue, props.name.replace('[x]', core.capitalize(selectedType.code)));
|
|
1874
1918
|
}
|
|
@@ -1889,39 +1933,39 @@
|
|
|
1889
1933
|
case core.PropertyType.time:
|
|
1890
1934
|
case core.PropertyType.uri:
|
|
1891
1935
|
case core.PropertyType.url:
|
|
1892
|
-
return (
|
|
1936
|
+
return (React.createElement(core$1.TextInput, { id: name, name: name, "data-testid": name, defaultValue: value, onChange: (e) => {
|
|
1893
1937
|
if (props.onChange) {
|
|
1894
1938
|
props.onChange(e.currentTarget.value);
|
|
1895
1939
|
}
|
|
1896
1940
|
}, error: getErrorsForInput(props.outcome, name) }));
|
|
1897
1941
|
case core.PropertyType.date:
|
|
1898
|
-
return (
|
|
1942
|
+
return (React.createElement(core$1.TextInput, { type: "date", id: name, name: name, "data-testid": name, defaultValue: value, onChange: (e) => {
|
|
1899
1943
|
if (props.onChange) {
|
|
1900
1944
|
props.onChange(e.currentTarget.value);
|
|
1901
1945
|
}
|
|
1902
1946
|
}, error: getErrorsForInput(props.outcome, name) }));
|
|
1903
1947
|
case core.PropertyType.dateTime:
|
|
1904
1948
|
case core.PropertyType.instant:
|
|
1905
|
-
return
|
|
1949
|
+
return React.createElement(DateTimeInput, { name: name, defaultValue: value, onChange: props.onChange, outcome: props.outcome });
|
|
1906
1950
|
case core.PropertyType.decimal:
|
|
1907
1951
|
case core.PropertyType.integer:
|
|
1908
1952
|
case core.PropertyType.positiveInt:
|
|
1909
1953
|
case core.PropertyType.unsignedInt:
|
|
1910
|
-
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) => {
|
|
1911
1955
|
if (props.onChange) {
|
|
1912
1956
|
props.onChange(e.currentTarget.valueAsNumber);
|
|
1913
1957
|
}
|
|
1914
1958
|
} }));
|
|
1915
1959
|
case core.PropertyType.code:
|
|
1916
|
-
return
|
|
1960
|
+
return React.createElement(CodeInput, { property: property, name: name, defaultValue: value, onChange: props.onChange });
|
|
1917
1961
|
case core.PropertyType.boolean:
|
|
1918
|
-
return (
|
|
1962
|
+
return (React.createElement(core$1.Checkbox, { id: name, name: name, "data-testid": name, defaultChecked: !!value, onChange: (e) => {
|
|
1919
1963
|
if (props.onChange) {
|
|
1920
1964
|
props.onChange(e.currentTarget.checked);
|
|
1921
1965
|
}
|
|
1922
1966
|
} }));
|
|
1923
1967
|
case core.PropertyType.markdown:
|
|
1924
|
-
return (
|
|
1968
|
+
return (React.createElement(core$1.Textarea, { id: name, name: name, "data-testid": name, defaultValue: value, onChange: (e) => {
|
|
1925
1969
|
if (props.onChange) {
|
|
1926
1970
|
props.onChange(e.currentTarget.value);
|
|
1927
1971
|
}
|
|
@@ -1929,39 +1973,39 @@
|
|
|
1929
1973
|
// 2.24.0.2 Complex Types
|
|
1930
1974
|
// https://www.hl7.org/fhir/datatypes.html#complex
|
|
1931
1975
|
case core.PropertyType.Address:
|
|
1932
|
-
return
|
|
1976
|
+
return React.createElement(AddressInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1933
1977
|
case core.PropertyType.Annotation:
|
|
1934
|
-
return
|
|
1978
|
+
return React.createElement(AnnotationInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1935
1979
|
case core.PropertyType.Attachment:
|
|
1936
|
-
return
|
|
1980
|
+
return React.createElement(AttachmentInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1937
1981
|
case core.PropertyType.CodeableConcept:
|
|
1938
|
-
return
|
|
1982
|
+
return React.createElement(CodeableConceptInput, { property: property, name: name, defaultValue: value, onChange: props.onChange });
|
|
1939
1983
|
case core.PropertyType.Coding:
|
|
1940
|
-
return
|
|
1984
|
+
return React.createElement(CodingInput, { property: property, name: name, defaultValue: value, onChange: props.onChange });
|
|
1941
1985
|
case core.PropertyType.ContactDetail:
|
|
1942
|
-
return
|
|
1986
|
+
return React.createElement(ContactDetailInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1943
1987
|
case core.PropertyType.ContactPoint:
|
|
1944
|
-
return
|
|
1988
|
+
return React.createElement(ContactPointInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1945
1989
|
case core.PropertyType.Extension:
|
|
1946
|
-
return
|
|
1990
|
+
return React.createElement(ExtensionInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1947
1991
|
case core.PropertyType.HumanName:
|
|
1948
|
-
return
|
|
1992
|
+
return React.createElement(HumanNameInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1949
1993
|
case core.PropertyType.Identifier:
|
|
1950
|
-
return
|
|
1994
|
+
return React.createElement(IdentifierInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1951
1995
|
case core.PropertyType.Period:
|
|
1952
|
-
return
|
|
1996
|
+
return React.createElement(PeriodInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1953
1997
|
case core.PropertyType.Quantity:
|
|
1954
|
-
return
|
|
1998
|
+
return React.createElement(QuantityInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1955
1999
|
case core.PropertyType.Range:
|
|
1956
|
-
return
|
|
2000
|
+
return React.createElement(RangeInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1957
2001
|
case core.PropertyType.Ratio:
|
|
1958
|
-
return
|
|
2002
|
+
return React.createElement(RatioInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1959
2003
|
case core.PropertyType.Reference:
|
|
1960
|
-
return (
|
|
2004
|
+
return (React.createElement(ReferenceInput, { name: name, defaultValue: value, targetTypes: getTargetTypes(property), onChange: props.onChange }));
|
|
1961
2005
|
case core.PropertyType.Timing:
|
|
1962
|
-
return
|
|
2006
|
+
return React.createElement(TimingInput, { name: name, defaultValue: value, onChange: props.onChange });
|
|
1963
2007
|
default:
|
|
1964
|
-
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 }));
|
|
1965
2009
|
}
|
|
1966
2010
|
}
|
|
1967
2011
|
function getTargetTypes(property) {
|
|
@@ -1981,12 +2025,12 @@
|
|
|
1981
2025
|
const typeName = props.typeName;
|
|
1982
2026
|
const typeSchema = core.globalSchema.types[typeName];
|
|
1983
2027
|
if (!typeSchema) {
|
|
1984
|
-
return
|
|
2028
|
+
return React.createElement("div", null,
|
|
1985
2029
|
typeName,
|
|
1986
2030
|
"\u00A0not implemented");
|
|
1987
2031
|
}
|
|
1988
2032
|
const typedValue = { type: typeName, value };
|
|
1989
|
-
return (
|
|
2033
|
+
return (React.createElement(core$1.Stack, null, Object.entries(typeSchema.properties).map((entry) => {
|
|
1990
2034
|
const key = entry[0];
|
|
1991
2035
|
if (key === 'id' || DEFAULT_IGNORED_PROPERTIES.indexOf(key) >= 0) {
|
|
1992
2036
|
return null;
|
|
@@ -1997,33 +2041,53 @@
|
|
|
1997
2041
|
}
|
|
1998
2042
|
const [propertyValue, propertyType] = getValueAndType(typedValue, key);
|
|
1999
2043
|
if (property.type.length === 1 && property.type[0].code === 'boolean') {
|
|
2000
|
-
return (
|
|
2001
|
-
|
|
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) => {
|
|
2002
2046
|
setValueWrapper(setPropertyValue(value, key, propName !== null && propName !== void 0 ? propName : key, entry[1], newValue));
|
|
2003
2047
|
} })));
|
|
2004
2048
|
}
|
|
2005
|
-
return (
|
|
2006
|
-
|
|
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) => {
|
|
2007
2051
|
setValueWrapper(setPropertyValue(value, key, propName !== null && propName !== void 0 ? propName : key, entry[1], newValue));
|
|
2008
2052
|
} })));
|
|
2009
2053
|
})));
|
|
2010
2054
|
}
|
|
2011
2055
|
|
|
2012
2056
|
function ResourceName(props) {
|
|
2013
|
-
const
|
|
2057
|
+
const { value, link } = props, rest = __rest(props, ["value", "link"]);
|
|
2058
|
+
const resource = useResource(value);
|
|
2014
2059
|
if (!resource) {
|
|
2015
2060
|
return null;
|
|
2016
2061
|
}
|
|
2017
2062
|
const text = core.getDisplayString(resource);
|
|
2018
|
-
return
|
|
2063
|
+
return link ? (React.createElement(MedplumLink, Object.assign({ to: resource }, rest), text)) : (React.createElement(core$1.Text, Object.assign({ component: "span" }, rest), text));
|
|
2019
2064
|
}
|
|
2020
2065
|
|
|
2021
2066
|
function ResourceBadge(props) {
|
|
2022
|
-
return (
|
|
2023
|
-
|
|
2024
|
-
|
|
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 })));
|
|
2025
2070
|
}
|
|
2026
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
|
+
}));
|
|
2027
2091
|
function DiagnosticReportDisplay(props) {
|
|
2028
2092
|
var _a, _b;
|
|
2029
2093
|
const diagnosticReport = useResource(props.value);
|
|
@@ -2043,69 +2107,68 @@
|
|
|
2043
2107
|
textContent += note.text + '\n\n';
|
|
2044
2108
|
}
|
|
2045
2109
|
}
|
|
2046
|
-
return (
|
|
2047
|
-
|
|
2048
|
-
|
|
2049
|
-
diagnosticReport.subject && (
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
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 })))),
|
|
2053
2117
|
diagnosticReport.resultsInterpreter &&
|
|
2054
|
-
diagnosticReport.resultsInterpreter.map((interpreter) => (
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
diagnosticReport.issued && (
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
diagnosticReport.status && (
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
diagnosticReport.result &&
|
|
2065
|
-
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())));
|
|
2066
2130
|
}
|
|
2067
2131
|
function ObservationTable(props) {
|
|
2068
2132
|
var _a;
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
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 }))))));
|
|
2077
2142
|
}
|
|
2078
2143
|
function ObservationRow(props) {
|
|
2144
|
+
const { classes, cx } = useStyles$9();
|
|
2079
2145
|
const observation = useResource(props.value);
|
|
2080
2146
|
if (!observation) {
|
|
2081
2147
|
return null;
|
|
2082
2148
|
}
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
React__default["default"].createElement("td", null,
|
|
2094
|
-
React__default["default"].createElement(ReferenceRangeDisplay, { value: observation.referenceRange })),
|
|
2095
|
-
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] })))));
|
|
2096
2159
|
}
|
|
2097
2160
|
function ObservationValueDisplay(props) {
|
|
2098
2161
|
var _a;
|
|
2099
2162
|
const obs = props.value;
|
|
2100
2163
|
if (obs === null || obs === void 0 ? void 0 : obs.valueQuantity) {
|
|
2101
|
-
return
|
|
2164
|
+
return React.createElement(QuantityDisplay, { value: (_a = props.value) === null || _a === void 0 ? void 0 : _a.valueQuantity });
|
|
2102
2165
|
}
|
|
2103
2166
|
if (obs === null || obs === void 0 ? void 0 : obs.valueString) {
|
|
2104
|
-
return
|
|
2167
|
+
return React.createElement(React.Fragment, null, obs.valueString);
|
|
2105
2168
|
}
|
|
2106
2169
|
if (obs && 'component' in obs && (obs === null || obs === void 0 ? void 0 : obs.component)) {
|
|
2107
|
-
return (
|
|
2108
|
-
.map((component, index) => (
|
|
2170
|
+
return (React.createElement(React.Fragment, null, obs.component
|
|
2171
|
+
.map((component, index) => (React.createElement(ObservationValueDisplay, { key: `obs-${index}`, value: component })))
|
|
2109
2172
|
.reduce((prev, curr) => [prev, ' / ', curr])));
|
|
2110
2173
|
}
|
|
2111
2174
|
return null;
|
|
@@ -2116,9 +2179,9 @@
|
|
|
2116
2179
|
return null;
|
|
2117
2180
|
}
|
|
2118
2181
|
if (range.text) {
|
|
2119
|
-
return
|
|
2182
|
+
return React.createElement(React.Fragment, null, range.text);
|
|
2120
2183
|
}
|
|
2121
|
-
return
|
|
2184
|
+
return React.createElement(RangeDisplay, { value: range });
|
|
2122
2185
|
}
|
|
2123
2186
|
/**
|
|
2124
2187
|
* Returns true if the observation is critical.
|
|
@@ -2132,7 +2195,28 @@
|
|
|
2132
2195
|
return code === 'AA' || code === 'LL' || code === 'HH' || code === 'RR';
|
|
2133
2196
|
}
|
|
2134
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
|
+
}));
|
|
2135
2218
|
function ResourceDiffTable(props) {
|
|
2219
|
+
const { classes } = useStyles$8();
|
|
2136
2220
|
const medplum = useMedplum();
|
|
2137
2221
|
const [schema, setSchema] = React.useState();
|
|
2138
2222
|
React.useEffect(() => {
|
|
@@ -2145,17 +2229,17 @@
|
|
|
2145
2229
|
if (!typeSchema) {
|
|
2146
2230
|
return null;
|
|
2147
2231
|
}
|
|
2148
|
-
return (
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
|
|
2155
|
-
|
|
2156
|
-
|
|
2157
|
-
|
|
2158
|
-
|
|
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) => {
|
|
2159
2243
|
const key = entry[0];
|
|
2160
2244
|
if (key === 'id' || key === 'meta') {
|
|
2161
2245
|
return null;
|
|
@@ -2169,12 +2253,12 @@
|
|
|
2169
2253
|
if (core.stringify(originalPropertyValue) === core.stringify(revisedPropertyValue)) {
|
|
2170
2254
|
return null;
|
|
2171
2255
|
}
|
|
2172
|
-
return (
|
|
2173
|
-
|
|
2174
|
-
|
|
2175
|
-
|
|
2176
|
-
|
|
2177
|
-
|
|
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 }))));
|
|
2178
2262
|
}))));
|
|
2179
2263
|
}
|
|
2180
2264
|
function isEmpty(value) {
|
|
@@ -2195,14 +2279,14 @@
|
|
|
2195
2279
|
if (!schema || !value) {
|
|
2196
2280
|
return null;
|
|
2197
2281
|
}
|
|
2198
|
-
return (
|
|
2282
|
+
return (React.createElement(BackboneElementDisplay, { value: { type: value.resourceType, value }, ignoreMissingValues: props.ignoreMissingValues }));
|
|
2199
2283
|
}
|
|
2200
2284
|
|
|
2201
2285
|
/**
|
|
2202
2286
|
* ErrorBoundary is a React component that handles errors in its child components.
|
|
2203
2287
|
* See: https://reactjs.org/docs/error-boundaries.html
|
|
2204
2288
|
*/
|
|
2205
|
-
class ErrorBoundary extends
|
|
2289
|
+
class ErrorBoundary extends React.Component {
|
|
2206
2290
|
constructor(props) {
|
|
2207
2291
|
super(props);
|
|
2208
2292
|
this.state = {};
|
|
@@ -2215,39 +2299,36 @@
|
|
|
2215
2299
|
}
|
|
2216
2300
|
render() {
|
|
2217
2301
|
if (this.state.error) {
|
|
2218
|
-
return
|
|
2302
|
+
return React.createElement(core$1.Title, null, "Something went wrong.");
|
|
2219
2303
|
}
|
|
2220
2304
|
return this.props.children;
|
|
2221
2305
|
}
|
|
2222
2306
|
}
|
|
2223
2307
|
|
|
2224
2308
|
function Timeline(props) {
|
|
2225
|
-
return
|
|
2309
|
+
return React.createElement(core$1.Container, null, props.children);
|
|
2226
2310
|
}
|
|
2227
2311
|
function TimelineItem(props) {
|
|
2228
2312
|
var _a, _b, _c;
|
|
2229
2313
|
const author = (_a = props.profile) !== null && _a !== void 0 ? _a : (_b = props.resource.meta) === null || _b === void 0 ? void 0 : _b.author;
|
|
2230
|
-
return (
|
|
2231
|
-
|
|
2232
|
-
|
|
2233
|
-
|
|
2234
|
-
|
|
2235
|
-
|
|
2236
|
-
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
props.popupMenuItems && (
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
|
|
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))),
|
|
2244
2328
|
props.popupMenuItems))),
|
|
2245
|
-
|
|
2246
|
-
props.padding &&
|
|
2247
|
-
!props.padding &&
|
|
2248
|
-
props.socialEnabled && (React__default["default"].createElement("div", { className: "medplum-timeline-item-footer" },
|
|
2249
|
-
React__default["default"].createElement(core$1.Button, { variant: "subtle" }, "Like"),
|
|
2250
|
-
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))));
|
|
2251
2332
|
}
|
|
2252
2333
|
|
|
2253
2334
|
/**
|
|
@@ -2296,6 +2377,11 @@
|
|
|
2296
2377
|
return new Date(dateTime).getTime();
|
|
2297
2378
|
}
|
|
2298
2379
|
|
|
2380
|
+
const useStyles$7 = core$1.createStyles((theme) => ({
|
|
2381
|
+
pinnedComment: {
|
|
2382
|
+
backgroundColor: theme.colors.blue[0],
|
|
2383
|
+
},
|
|
2384
|
+
}));
|
|
2299
2385
|
function ResourceTimeline(props) {
|
|
2300
2386
|
const navigate = reactRouterDom.useNavigate();
|
|
2301
2387
|
const medplum = useMedplum();
|
|
@@ -2384,10 +2470,23 @@
|
|
|
2384
2470
|
}
|
|
2385
2471
|
medplum
|
|
2386
2472
|
.createResource(props.createMedia(resource, sender, attachment))
|
|
2387
|
-
.then((result) =>
|
|
2388
|
-
|
|
2389
|
-
|
|
2390
|
-
|
|
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
|
+
}));
|
|
2391
2490
|
}
|
|
2392
2491
|
function setPriority(communication, priority) {
|
|
2393
2492
|
return medplum.updateResource(Object.assign(Object.assign({}, communication), { priority }));
|
|
@@ -2411,70 +2510,89 @@
|
|
|
2411
2510
|
var _a;
|
|
2412
2511
|
navigate(`/${version.resourceType}/${version.id}/_history/${(_a = version.meta) === null || _a === void 0 ? void 0 : _a.versionId}`);
|
|
2413
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
|
+
}
|
|
2414
2533
|
if (!resource || !history) {
|
|
2415
|
-
return
|
|
2416
|
-
}
|
|
2417
|
-
return (
|
|
2418
|
-
props.createCommunication && (
|
|
2419
|
-
|
|
2420
|
-
|
|
2421
|
-
|
|
2422
|
-
|
|
2423
|
-
|
|
2424
|
-
|
|
2425
|
-
|
|
2426
|
-
|
|
2427
|
-
|
|
2428
|
-
|
|
2429
|
-
|
|
2430
|
-
|
|
2431
|
-
|
|
2432
|
-
|
|
2433
|
-
|
|
2434
|
-
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 })))))))),
|
|
2435
2553
|
items.map((item) => {
|
|
2436
2554
|
var _a;
|
|
2437
2555
|
if (item.resourceType === resource.resourceType && item.id === resource.id) {
|
|
2438
|
-
return (
|
|
2556
|
+
return (React.createElement(HistoryTimelineItem, { key: (_a = item.meta) === null || _a === void 0 ? void 0 : _a.versionId, history: history, resource: item, onDetails: onVersionDetails }));
|
|
2439
2557
|
}
|
|
2440
2558
|
const key = `${item.resourceType}/${item.id}`;
|
|
2441
2559
|
switch (item.resourceType) {
|
|
2442
2560
|
case 'AuditEvent':
|
|
2443
|
-
return
|
|
2561
|
+
return React.createElement(AuditEventTimelineItem, { key: key, resource: item, onDetails: onDetails });
|
|
2444
2562
|
case 'Communication':
|
|
2445
|
-
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 }));
|
|
2446
2564
|
case 'DiagnosticReport':
|
|
2447
|
-
return (
|
|
2565
|
+
return (React.createElement(DiagnosticReportTimelineItem, { key: key, resource: item, onDetails: onDetails, onEdit: onEdit, onDelete: onDelete }));
|
|
2448
2566
|
case 'Media':
|
|
2449
|
-
return (
|
|
2567
|
+
return (React.createElement(MediaTimelineItem, { key: key, resource: item, onDetails: onDetails, onEdit: onEdit, onDelete: onDelete }));
|
|
2450
2568
|
default:
|
|
2451
|
-
return (
|
|
2452
|
-
|
|
2569
|
+
return (React.createElement(TimelineItem, { key: key, resource: item, padding: true },
|
|
2570
|
+
React.createElement(ResourceTable, { value: item, ignoreMissingValues: true })));
|
|
2453
2571
|
}
|
|
2454
2572
|
})));
|
|
2455
2573
|
}
|
|
2456
2574
|
function TimelineItemPopupMenu(props) {
|
|
2457
|
-
return (
|
|
2458
|
-
|
|
2459
|
-
props.onPin && (
|
|
2460
|
-
props.onUnpin && (
|
|
2461
|
-
props.onDetails && (
|
|
2462
|
-
props.onEdit && (
|
|
2463
|
-
props.onDelete && (
|
|
2464
|
-
|
|
2465
|
-
|
|
2466
|
-
|
|
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")))));
|
|
2467
2585
|
}
|
|
2468
2586
|
function HistoryTimelineItem(props) {
|
|
2469
2587
|
const previous = getPrevious(props.history, props.resource);
|
|
2470
2588
|
if (previous) {
|
|
2471
|
-
return (
|
|
2472
|
-
|
|
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 })));
|
|
2473
2591
|
}
|
|
2474
2592
|
else {
|
|
2475
|
-
return (
|
|
2476
|
-
|
|
2477
|
-
|
|
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 })));
|
|
2478
2596
|
}
|
|
2479
2597
|
}
|
|
2480
2598
|
function getPrevious(history, version) {
|
|
@@ -2487,10 +2605,11 @@
|
|
|
2487
2605
|
}
|
|
2488
2606
|
function CommunicationTimelineItem(props) {
|
|
2489
2607
|
var _a, _b;
|
|
2608
|
+
const { classes } = useStyles$7();
|
|
2490
2609
|
const routine = !props.resource.priority || props.resource.priority === 'routine';
|
|
2491
|
-
const className = routine ?
|
|
2492
|
-
return (
|
|
2493
|
-
|
|
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)));
|
|
2494
2613
|
}
|
|
2495
2614
|
function MediaTimelineItem(props) {
|
|
2496
2615
|
var _a;
|
|
@@ -2499,21 +2618,35 @@
|
|
|
2499
2618
|
!contentType.startsWith('image/') &&
|
|
2500
2619
|
!contentType.startsWith('video/') &&
|
|
2501
2620
|
contentType !== 'application/pdf';
|
|
2502
|
-
return (
|
|
2503
|
-
|
|
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 })));
|
|
2504
2623
|
}
|
|
2505
2624
|
function AuditEventTimelineItem(props) {
|
|
2506
|
-
return (
|
|
2507
|
-
|
|
2508
|
-
|
|
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))));
|
|
2509
2628
|
}
|
|
2510
2629
|
function DiagnosticReportTimelineItem(props) {
|
|
2511
|
-
return (
|
|
2512
|
-
|
|
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';
|
|
2513
2646
|
}
|
|
2514
2647
|
|
|
2515
2648
|
function DefaultResourceTimeline(props) {
|
|
2516
|
-
return (
|
|
2649
|
+
return (React.createElement(ResourceTimeline, { value: props.resource, buildSearchRequests: (resource) => ({
|
|
2517
2650
|
resourceType: 'Bundle',
|
|
2518
2651
|
type: 'batch',
|
|
2519
2652
|
entry: [
|
|
@@ -2534,7 +2667,7 @@
|
|
|
2534
2667
|
}
|
|
2535
2668
|
|
|
2536
2669
|
function EncounterTimeline(props) {
|
|
2537
|
-
return (
|
|
2670
|
+
return (React.createElement(ResourceTimeline, { value: props.encounter, buildSearchRequests: (resource) => ({
|
|
2538
2671
|
resourceType: 'Bundle',
|
|
2539
2672
|
type: 'batch',
|
|
2540
2673
|
entry: [
|
|
@@ -2590,7 +2723,7 @@
|
|
|
2590
2723
|
Received ${value.length} elements \
|
|
2591
2724
|
[${JSON.stringify(value, null, 2)}]`);
|
|
2592
2725
|
}
|
|
2593
|
-
return
|
|
2726
|
+
return React.createElement(ResourcePropertyDisplay, { value: value[0] || '', propertyType: props.propertyType });
|
|
2594
2727
|
}
|
|
2595
2728
|
|
|
2596
2729
|
/**
|
|
@@ -3145,7 +3278,7 @@
|
|
|
3145
3278
|
if (!value) {
|
|
3146
3279
|
return null;
|
|
3147
3280
|
}
|
|
3148
|
-
return (
|
|
3281
|
+
return (React.createElement(ResourcePropertyDisplay, { property: elementDefinition, propertyType: propertyType, value: value, maxWidth: 200, ignoreMissingValues: true, link: false }));
|
|
3149
3282
|
}
|
|
3150
3283
|
/**
|
|
3151
3284
|
* Returns a fragment to be displayed in the search table for a search parameter.
|
|
@@ -3160,9 +3293,9 @@
|
|
|
3160
3293
|
return null;
|
|
3161
3294
|
}
|
|
3162
3295
|
if (elementDefinition) {
|
|
3163
|
-
return (
|
|
3296
|
+
return (React.createElement(ResourcePropertyDisplay, { propertyType: value[0].type, value: value[0].value, maxWidth: 200, ignoreMissingValues: true, link: false }));
|
|
3164
3297
|
}
|
|
3165
|
-
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)))));
|
|
3166
3299
|
}
|
|
3167
3300
|
|
|
3168
3301
|
function SearchFieldEditor(props) {
|
|
@@ -3296,30 +3429,30 @@
|
|
|
3296
3429
|
const available = getFieldsList(typeDef)
|
|
3297
3430
|
.filter((field) => !(selected === null || selected === void 0 ? void 0 : selected.includes(field)))
|
|
3298
3431
|
.sort();
|
|
3299
|
-
return (
|
|
3300
|
-
|
|
3301
|
-
|
|
3302
|
-
|
|
3303
|
-
|
|
3304
|
-
|
|
3305
|
-
|
|
3306
|
-
|
|
3307
|
-
|
|
3308
|
-
|
|
3309
|
-
|
|
3310
|
-
|
|
3311
|
-
|
|
3312
|
-
|
|
3313
|
-
|
|
3314
|
-
|
|
3315
|
-
|
|
3316
|
-
|
|
3317
|
-
|
|
3318
|
-
|
|
3319
|
-
|
|
3320
|
-
|
|
3321
|
-
|
|
3322
|
-
|
|
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")));
|
|
3323
3456
|
}
|
|
3324
3457
|
/**
|
|
3325
3458
|
* Returns a list of fields/columns available for a type.
|
|
@@ -3356,14 +3489,14 @@
|
|
|
3356
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];
|
|
3357
3490
|
if (searchParam) {
|
|
3358
3491
|
if (searchParam.type === 'reference') {
|
|
3359
|
-
return
|
|
3492
|
+
return React.createElement(ResourceName, { value: { reference: filter.value } });
|
|
3360
3493
|
}
|
|
3361
3494
|
const searchParamDetails = core.getSearchParameterDetails(resourceType, searchParam);
|
|
3362
3495
|
if (filter.code === '_lastUpdated' || searchParamDetails.type === core.SearchParameterType.DATETIME) {
|
|
3363
|
-
return
|
|
3496
|
+
return React.createElement(React.Fragment, null, core.formatDateTime(filter.value));
|
|
3364
3497
|
}
|
|
3365
3498
|
}
|
|
3366
|
-
return
|
|
3499
|
+
return React.createElement(React.Fragment, null, filter.value);
|
|
3367
3500
|
}
|
|
3368
3501
|
|
|
3369
3502
|
function SearchFilterValueInput(props) {
|
|
@@ -3372,7 +3505,7 @@
|
|
|
3372
3505
|
const name = 'filter-value';
|
|
3373
3506
|
switch (details.type) {
|
|
3374
3507
|
case core.SearchParameterType.REFERENCE:
|
|
3375
|
-
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) => {
|
|
3376
3509
|
if (newReference) {
|
|
3377
3510
|
props.onChange(newReference.reference);
|
|
3378
3511
|
}
|
|
@@ -3381,15 +3514,15 @@
|
|
|
3381
3514
|
}
|
|
3382
3515
|
} }));
|
|
3383
3516
|
case core.SearchParameterType.BOOLEAN:
|
|
3384
|
-
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()) }));
|
|
3385
3518
|
case core.SearchParameterType.DATE:
|
|
3386
|
-
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) }));
|
|
3387
3520
|
case core.SearchParameterType.DATETIME:
|
|
3388
|
-
return
|
|
3521
|
+
return React.createElement(DateTimeInput, { name: name, defaultValue: props.defaultValue, onChange: props.onChange });
|
|
3389
3522
|
case core.SearchParameterType.NUMBER:
|
|
3390
|
-
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) }));
|
|
3391
3524
|
case core.SearchParameterType.QUANTITY:
|
|
3392
|
-
return (
|
|
3525
|
+
return (React.createElement(QuantityInput, { name: name, defaultValue: tryParseQuantity(props.defaultValue), onChange: (newQuantity) => {
|
|
3393
3526
|
if (newQuantity) {
|
|
3394
3527
|
props.onChange(`${newQuantity.value}`);
|
|
3395
3528
|
}
|
|
@@ -3398,7 +3531,7 @@
|
|
|
3398
3531
|
}
|
|
3399
3532
|
} }));
|
|
3400
3533
|
default:
|
|
3401
|
-
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" }));
|
|
3402
3535
|
}
|
|
3403
3536
|
}
|
|
3404
3537
|
function tryParseQuantity(value) {
|
|
@@ -3432,24 +3565,24 @@
|
|
|
3432
3565
|
const resourceType = props.search.resourceType;
|
|
3433
3566
|
const searchParams = core.globalSchema.types[resourceType].searchParams;
|
|
3434
3567
|
const filters = search.filters || [];
|
|
3435
|
-
return (
|
|
3436
|
-
|
|
3437
|
-
|
|
3438
|
-
|
|
3439
|
-
|
|
3440
|
-
|
|
3441
|
-
|
|
3442
|
-
|
|
3443
|
-
|
|
3444
|
-
|
|
3445
|
-
|
|
3446
|
-
|
|
3447
|
-
|
|
3448
|
-
|
|
3449
|
-
|
|
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,
|
|
3450
3583
|
filters.map((filter, index) => {
|
|
3451
3584
|
if (index === editingIndex) {
|
|
3452
|
-
return (
|
|
3585
|
+
return (React.createElement(FilterRowInput, { key: `filter-${index}-${filters.length}-input`, resourceType: resourceType, searchParams: searchParams, defaultValue: filter, okText: "Save", onOk: (newFilter) => {
|
|
3453
3586
|
const newFilters = [...filters];
|
|
3454
3587
|
newFilters[index] = newFilter;
|
|
3455
3588
|
setSearch(setFilters(searchRef.current, newFilters));
|
|
@@ -3457,23 +3590,23 @@
|
|
|
3457
3590
|
}, onCancel: () => setEditingIndex(-1) }));
|
|
3458
3591
|
}
|
|
3459
3592
|
else {
|
|
3460
|
-
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)) }));
|
|
3461
3594
|
}
|
|
3462
3595
|
}),
|
|
3463
|
-
|
|
3464
|
-
|
|
3465
|
-
|
|
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"))));
|
|
3466
3599
|
}
|
|
3467
3600
|
function FilterRowDisplay(props) {
|
|
3468
3601
|
const { filter } = props;
|
|
3469
|
-
return (
|
|
3470
|
-
|
|
3471
|
-
|
|
3472
|
-
|
|
3473
|
-
|
|
3474
|
-
|
|
3475
|
-
|
|
3476
|
-
|
|
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"))));
|
|
3477
3610
|
}
|
|
3478
3611
|
function FilterRowInput(props) {
|
|
3479
3612
|
var _a;
|
|
@@ -3491,17 +3624,17 @@
|
|
|
3491
3624
|
}
|
|
3492
3625
|
const searchParam = props.searchParams[value.code];
|
|
3493
3626
|
const operators = searchParam && getSearchOperators(searchParam);
|
|
3494
|
-
return (
|
|
3495
|
-
|
|
3496
|
-
|
|
3497
|
-
|
|
3498
|
-
|
|
3499
|
-
|
|
3500
|
-
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: () => {
|
|
3501
3634
|
props.onOk(valueRef.current);
|
|
3502
3635
|
setValue({});
|
|
3503
3636
|
} }, props.okText)),
|
|
3504
|
-
props.onCancel && (
|
|
3637
|
+
props.onCancel && (React.createElement(core$1.Button, { compact: true, variant: "outline", onClick: props.onCancel }, "Cancel")))));
|
|
3505
3638
|
}
|
|
3506
3639
|
|
|
3507
3640
|
function SearchFilterValueDialog(props) {
|
|
@@ -3513,11 +3646,11 @@
|
|
|
3513
3646
|
function onOk() {
|
|
3514
3647
|
props.onOk(Object.assign(Object.assign({}, props.filter), { value }));
|
|
3515
3648
|
}
|
|
3516
|
-
return (
|
|
3517
|
-
|
|
3518
|
-
|
|
3519
|
-
|
|
3520
|
-
|
|
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")));
|
|
3521
3654
|
}
|
|
3522
3655
|
|
|
3523
3656
|
function SearchPopupMenu(props) {
|
|
@@ -3538,26 +3671,26 @@
|
|
|
3538
3671
|
}
|
|
3539
3672
|
// If there is only one search parameter, then show it directly
|
|
3540
3673
|
if (props.searchParams.length === 1) {
|
|
3541
|
-
return (
|
|
3674
|
+
return (React.createElement(SearchParameterSubMenu, { search: props.search, searchParam: props.searchParams[0], onSort: onSort, onPrompt: onPrompt, onChange: onChange, onClear: onClear }));
|
|
3542
3675
|
}
|
|
3543
3676
|
// Otherwise, show a menu, with each search parameter as a sub menu
|
|
3544
|
-
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))))));
|
|
3545
3678
|
}
|
|
3546
3679
|
function SearchParameterSubMenu(props) {
|
|
3547
3680
|
switch (props.searchParam.type) {
|
|
3548
3681
|
case 'date':
|
|
3549
|
-
return
|
|
3682
|
+
return React.createElement(DateFilterSubMenu, Object.assign({}, props));
|
|
3550
3683
|
case 'number':
|
|
3551
3684
|
case 'quantity':
|
|
3552
|
-
return
|
|
3685
|
+
return React.createElement(NumericFilterSubMenu, Object.assign({}, props));
|
|
3553
3686
|
case 'reference':
|
|
3554
|
-
return
|
|
3687
|
+
return React.createElement(ReferenceFilterSubMenu, Object.assign({}, props));
|
|
3555
3688
|
case 'string':
|
|
3556
3689
|
case 'token':
|
|
3557
3690
|
case 'uri':
|
|
3558
|
-
return
|
|
3691
|
+
return React.createElement(TextFilterSubMenu, Object.assign({}, props));
|
|
3559
3692
|
default:
|
|
3560
|
-
return
|
|
3693
|
+
return React.createElement(React.Fragment, null,
|
|
3561
3694
|
"Unknown search param type: ",
|
|
3562
3695
|
props.searchParam.type);
|
|
3563
3696
|
}
|
|
@@ -3565,72 +3698,72 @@
|
|
|
3565
3698
|
function DateFilterSubMenu(props) {
|
|
3566
3699
|
const { searchParam } = props;
|
|
3567
3700
|
const code = searchParam.code;
|
|
3568
|
-
return (
|
|
3569
|
-
|
|
3570
|
-
|
|
3571
|
-
|
|
3572
|
-
|
|
3573
|
-
|
|
3574
|
-
|
|
3575
|
-
|
|
3576
|
-
|
|
3577
|
-
|
|
3578
|
-
|
|
3579
|
-
|
|
3580
|
-
|
|
3581
|
-
|
|
3582
|
-
|
|
3583
|
-
|
|
3584
|
-
|
|
3585
|
-
|
|
3586
|
-
|
|
3587
|
-
|
|
3588
|
-
|
|
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))));
|
|
3589
3722
|
}
|
|
3590
3723
|
function NumericFilterSubMenu(props) {
|
|
3591
3724
|
const { searchParam } = props;
|
|
3592
|
-
return (
|
|
3593
|
-
|
|
3594
|
-
|
|
3595
|
-
|
|
3596
|
-
|
|
3597
|
-
|
|
3598
|
-
|
|
3599
|
-
|
|
3600
|
-
|
|
3601
|
-
|
|
3602
|
-
|
|
3603
|
-
|
|
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))));
|
|
3604
3737
|
}
|
|
3605
3738
|
function ReferenceFilterSubMenu(props) {
|
|
3606
3739
|
const { searchParam } = props;
|
|
3607
|
-
return (
|
|
3608
|
-
|
|
3609
|
-
|
|
3610
|
-
|
|
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))));
|
|
3611
3744
|
}
|
|
3612
3745
|
function TextFilterSubMenu(props) {
|
|
3613
3746
|
const { searchParam } = props;
|
|
3614
|
-
return (
|
|
3615
|
-
|
|
3616
|
-
|
|
3617
|
-
|
|
3618
|
-
|
|
3619
|
-
|
|
3620
|
-
|
|
3621
|
-
|
|
3622
|
-
|
|
3623
|
-
|
|
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))));
|
|
3624
3757
|
}
|
|
3625
3758
|
function CommonMenuItems(props) {
|
|
3626
3759
|
const { searchParam } = props;
|
|
3627
3760
|
const code = searchParam.code;
|
|
3628
|
-
return (
|
|
3629
|
-
|
|
3630
|
-
|
|
3631
|
-
|
|
3632
|
-
|
|
3633
|
-
|
|
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")));
|
|
3634
3767
|
}
|
|
3635
3768
|
|
|
3636
3769
|
class SearchChangeEvent extends Event {
|
|
@@ -3652,7 +3785,21 @@
|
|
|
3652
3785
|
this.browserEvent = browserEvent;
|
|
3653
3786
|
}
|
|
3654
3787
|
}
|
|
3655
|
-
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
|
+
},
|
|
3656
3803
|
th: {
|
|
3657
3804
|
padding: '0 !important',
|
|
3658
3805
|
},
|
|
@@ -3676,7 +3823,7 @@
|
|
|
3676
3823
|
*/
|
|
3677
3824
|
function SearchControl(props) {
|
|
3678
3825
|
var _a, _b;
|
|
3679
|
-
const { classes } = useStyles();
|
|
3826
|
+
const { classes } = useStyles$6();
|
|
3680
3827
|
const medplum = useMedplum();
|
|
3681
3828
|
const [schemaLoaded, setSchemaLoaded] = React.useState(false);
|
|
3682
3829
|
const [outcome, setOutcome] = React.useState();
|
|
@@ -3788,7 +3935,7 @@
|
|
|
3788
3935
|
}, [medplum, props.search.resourceType]);
|
|
3789
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]);
|
|
3790
3937
|
if (!typeSchema) {
|
|
3791
|
-
return
|
|
3938
|
+
return React.createElement(core$1.Loader, null);
|
|
3792
3939
|
}
|
|
3793
3940
|
const checkboxColumn = props.checkboxesEnabled;
|
|
3794
3941
|
const fields = getFieldDefinitions(search);
|
|
@@ -3800,51 +3947,52 @@
|
|
|
3800
3947
|
const buttonColor = 'gray';
|
|
3801
3948
|
const iconSize = 16;
|
|
3802
3949
|
const isMobile = window.innerWidth < 768;
|
|
3803
|
-
return (
|
|
3804
|
-
!props.hideToolbar && (
|
|
3805
|
-
|
|
3806
|
-
|
|
3807
|
-
|
|
3808
|
-
props.onNew && (
|
|
3809
|
-
!isMobile && props.onExport && (
|
|
3810
|
-
!isMobile && props.onDelete && (
|
|
3811
|
-
!isMobile && props.onBulk && (
|
|
3812
|
-
lastResult && (
|
|
3813
|
-
|
|
3814
|
-
|
|
3815
|
-
|
|
3816
|
-
|
|
3817
|
-
|
|
3818
|
-
|
|
3819
|
-
|
|
3820
|
-
|
|
3821
|
-
|
|
3822
|
-
|
|
3823
|
-
|
|
3824
|
-
|
|
3825
|
-
|
|
3826
|
-
|
|
3827
|
-
|
|
3828
|
-
|
|
3829
|
-
|
|
3830
|
-
|
|
3831
|
-
|
|
3832
|
-
|
|
3833
|
-
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) => {
|
|
3834
3980
|
setState(Object.assign(Object.assign({}, stateRef.current), { filterDialogVisible: true, filterDialogSearchParam: searchParam, filterDialogFilter: filter }));
|
|
3835
3981
|
}, onChange: (result) => {
|
|
3836
3982
|
emitSearchChange(result);
|
|
3837
3983
|
} })))))),
|
|
3838
|
-
!props.hideFilters && (
|
|
3839
|
-
checkboxColumn &&
|
|
3840
|
-
fields.map((field) => (
|
|
3841
|
-
|
|
3842
|
-
checkboxColumn && (
|
|
3843
|
-
|
|
3844
|
-
fields.map((field) => (
|
|
3845
|
-
(resources === null || resources === void 0 ? void 0 : resources.length) === 0 && (
|
|
3846
|
-
|
|
3847
|
-
|
|
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) => {
|
|
3848
3996
|
switch (page) {
|
|
3849
3997
|
case 'prev':
|
|
3850
3998
|
return 'Previous page';
|
|
@@ -3854,38 +4002,38 @@
|
|
|
3854
4002
|
return undefined;
|
|
3855
4003
|
}
|
|
3856
4004
|
} }))),
|
|
3857
|
-
outcome && (
|
|
3858
|
-
|
|
3859
|
-
|
|
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) => {
|
|
3860
4008
|
emitSearchChange(result);
|
|
3861
4009
|
setState(Object.assign(Object.assign({}, stateRef.current), { fieldEditorVisible: false }));
|
|
3862
4010
|
}, onCancel: () => {
|
|
3863
4011
|
setState(Object.assign(Object.assign({}, stateRef.current), { fieldEditorVisible: false }));
|
|
3864
4012
|
} }),
|
|
3865
|
-
|
|
4013
|
+
React.createElement(SearchFilterEditor, { search: props.search, visible: stateRef.current.filterEditorVisible, onOk: (result) => {
|
|
3866
4014
|
emitSearchChange(result);
|
|
3867
4015
|
setState(Object.assign(Object.assign({}, stateRef.current), { filterEditorVisible: false }));
|
|
3868
4016
|
}, onCancel: () => {
|
|
3869
4017
|
setState(Object.assign(Object.assign({}, stateRef.current), { filterEditorVisible: false }));
|
|
3870
4018
|
} }),
|
|
3871
|
-
|
|
4019
|
+
React.createElement(SearchFilterValueDialog, { visible: stateRef.current.filterDialogVisible, title: 'Input', resourceType: resourceType, searchParam: state.filterDialogSearchParam, filter: state.filterDialogFilter, defaultValue: '', onOk: (filter) => {
|
|
3872
4020
|
emitSearchChange(addFilter(props.search, filter.code, filter.operator, filter.value));
|
|
3873
4021
|
setState(Object.assign(Object.assign({}, stateRef.current), { filterDialogVisible: false }));
|
|
3874
4022
|
}, onCancel: () => {
|
|
3875
4023
|
setState(Object.assign(Object.assign({}, stateRef.current), { filterDialogVisible: false }));
|
|
3876
4024
|
} })));
|
|
3877
4025
|
}
|
|
3878
|
-
const MemoizedSearchControl =
|
|
4026
|
+
const MemoizedSearchControl = React.memo(SearchControl);
|
|
3879
4027
|
function FilterDescription(props) {
|
|
3880
4028
|
var _a;
|
|
3881
4029
|
const filters = ((_a = props.filters) !== null && _a !== void 0 ? _a : []).filter((f) => props.searchParams.find((p) => p.code === f.code));
|
|
3882
4030
|
if (filters.length === 0) {
|
|
3883
|
-
return
|
|
4031
|
+
return React.createElement("span", null, "no filters");
|
|
3884
4032
|
}
|
|
3885
|
-
return (
|
|
4033
|
+
return (React.createElement(React.Fragment, null, filters.map((filter, index) => (React.createElement("div", { key: `filter-${index}-${filters.length}` },
|
|
3886
4034
|
getOpString(filter.operator),
|
|
3887
4035
|
"\u00A0",
|
|
3888
|
-
|
|
4036
|
+
React.createElement(SearchFilterValueDisplay, { resourceType: props.resourceType, filter: filter }))))));
|
|
3889
4037
|
}
|
|
3890
4038
|
function getPage(search) {
|
|
3891
4039
|
return Math.floor((search.offset || 0) / (search.count || core.DEFAULT_SEARCH_COUNT)) + 1;
|
|
@@ -3989,29 +4137,29 @@
|
|
|
3989
4137
|
}, [medplum, props.resourceType]);
|
|
3990
4138
|
const typeSchema = (_a = schema === null || schema === void 0 ? void 0 : schema.types) === null || _a === void 0 ? void 0 : _a[props.resourceType];
|
|
3991
4139
|
if (!typeSchema) {
|
|
3992
|
-
return
|
|
4140
|
+
return React.createElement(core$1.Loader, null);
|
|
3993
4141
|
}
|
|
3994
4142
|
const checkboxColumn = props.checkboxesEnabled;
|
|
3995
|
-
return (
|
|
3996
|
-
|
|
3997
|
-
|
|
3998
|
-
|
|
3999
|
-
checkboxColumn && (
|
|
4000
|
-
|
|
4001
|
-
fields.map((field) => (
|
|
4002
|
-
|
|
4003
|
-
checkboxColumn && (
|
|
4004
|
-
|
|
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) }))),
|
|
4005
4153
|
fields.map((field) => {
|
|
4006
|
-
return (
|
|
4007
|
-
|
|
4154
|
+
return (React.createElement("td", { key: field.name },
|
|
4155
|
+
React.createElement(FhirPathDisplay, { propertyType: field.propertyType, path: field.fhirPath, resource: resource })));
|
|
4008
4156
|
})))))),
|
|
4009
|
-
((_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 &&
|
|
4010
|
-
outcome && (
|
|
4011
|
-
|
|
4012
|
-
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..."))));
|
|
4013
4161
|
}
|
|
4014
|
-
const MemoizedFhirPathTable =
|
|
4162
|
+
const MemoizedFhirPathTable = React.memo(FhirPathTable);
|
|
4015
4163
|
|
|
4016
4164
|
const searches = [
|
|
4017
4165
|
'$/_history',
|
|
@@ -4023,7 +4171,7 @@
|
|
|
4023
4171
|
'ServiceRequest?subject=$',
|
|
4024
4172
|
];
|
|
4025
4173
|
function PatientTimeline(props) {
|
|
4026
|
-
return (
|
|
4174
|
+
return (React.createElement(ResourceTimeline, { value: props.patient, buildSearchRequests: (resource) => ({
|
|
4027
4175
|
resourceType: 'Bundle',
|
|
4028
4176
|
type: 'batch',
|
|
4029
4177
|
entry: searches.map((search) => ({
|
|
@@ -4049,6 +4197,32 @@
|
|
|
4049
4197
|
}) }));
|
|
4050
4198
|
}
|
|
4051
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
|
+
}));
|
|
4052
4226
|
function PlanDefinitionBuilder(props) {
|
|
4053
4227
|
const medplum = useMedplum();
|
|
4054
4228
|
const defaultValue = useResource(props.value);
|
|
@@ -4082,13 +4256,14 @@
|
|
|
4082
4256
|
function changeProperty(property, newValue) {
|
|
4083
4257
|
setValue(Object.assign(Object.assign({}, valueRef.current), { [property]: newValue }));
|
|
4084
4258
|
}
|
|
4085
|
-
return (
|
|
4086
|
-
|
|
4087
|
-
|
|
4088
|
-
|
|
4089
|
-
|
|
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"))));
|
|
4090
4264
|
}
|
|
4091
4265
|
function ActionArrayBuilder(props) {
|
|
4266
|
+
const { classes } = useStyles$5();
|
|
4092
4267
|
const actionsRef = React.useRef();
|
|
4093
4268
|
actionsRef.current = props.actions;
|
|
4094
4269
|
function changeAction(changedAction) {
|
|
@@ -4101,16 +4276,17 @@
|
|
|
4101
4276
|
function removeAction(removedAction) {
|
|
4102
4277
|
props.onChange(actionsRef.current.filter((i) => i !== removedAction));
|
|
4103
4278
|
}
|
|
4104
|
-
return (
|
|
4105
|
-
props.actions.map((action) => (
|
|
4106
|
-
|
|
4107
|
-
|
|
4108
|
-
|
|
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) => {
|
|
4109
4284
|
killEvent(e);
|
|
4110
4285
|
addAction({ id: generateId$1() });
|
|
4111
4286
|
} }, "Add action"))));
|
|
4112
4287
|
}
|
|
4113
4288
|
function ActionBuilder(props) {
|
|
4289
|
+
const { classes, cx } = useStyles$5();
|
|
4114
4290
|
const { action } = props;
|
|
4115
4291
|
const actionType = getInitialActionType(action);
|
|
4116
4292
|
const editing = props.selectedKey === props.action.id;
|
|
@@ -4123,11 +4299,14 @@
|
|
|
4123
4299
|
killEvent(e);
|
|
4124
4300
|
props.setHoverKey(props.action.id);
|
|
4125
4301
|
}
|
|
4126
|
-
const className =
|
|
4127
|
-
|
|
4128
|
-
|
|
4129
|
-
|
|
4130
|
-
|
|
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) => {
|
|
4131
4310
|
e.preventDefault();
|
|
4132
4311
|
props.onRemove();
|
|
4133
4312
|
} }, "Remove"))));
|
|
@@ -4141,15 +4320,15 @@
|
|
|
4141
4320
|
function ActionDisplay(props) {
|
|
4142
4321
|
const { action, actionType } = props;
|
|
4143
4322
|
const [propertyValue, propertyType] = getActionTiming(action);
|
|
4144
|
-
return (
|
|
4145
|
-
|
|
4323
|
+
return (React.createElement("div", null,
|
|
4324
|
+
React.createElement("div", null,
|
|
4146
4325
|
action.title || 'Untitled',
|
|
4147
4326
|
" ",
|
|
4148
4327
|
actionType && `(${actionType})`),
|
|
4149
|
-
action.definitionCanonical && (
|
|
4150
|
-
|
|
4151
|
-
propertyValue && (
|
|
4152
|
-
|
|
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 })))));
|
|
4153
4332
|
}
|
|
4154
4333
|
function ActionEditor(props) {
|
|
4155
4334
|
const { action } = props;
|
|
@@ -4157,35 +4336,34 @@
|
|
|
4157
4336
|
function changeProperty(property, value) {
|
|
4158
4337
|
props.onChange(Object.assign(Object.assign({}, action), { [property]: value }));
|
|
4159
4338
|
}
|
|
4160
|
-
return (
|
|
4161
|
-
|
|
4162
|
-
|
|
4163
|
-
|
|
4164
|
-
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) })),
|
|
4165
4344
|
(() => {
|
|
4166
4345
|
switch (actionType) {
|
|
4167
4346
|
case 'appointment':
|
|
4168
|
-
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 }));
|
|
4169
4348
|
case 'lab':
|
|
4170
|
-
return (
|
|
4349
|
+
return (React.createElement(ActionResourceTypeBuilder, { title: "Lab", description: "The subject must complete the following lab panel.", resourceType: "ActivityDefinition", action: action, onChange: props.onChange }));
|
|
4171
4350
|
case 'questionnaire':
|
|
4172
|
-
return (
|
|
4351
|
+
return (React.createElement(ActionResourceTypeBuilder, { title: "Questionnaire", description: "The subject must complete the selected questionnaire.", resourceType: "Questionnaire", action: action, onChange: props.onChange }));
|
|
4173
4352
|
case 'task':
|
|
4174
|
-
return (
|
|
4353
|
+
return (React.createElement(ActionResourceTypeBuilder, { title: "Task", description: "The subject must complete the following task.", resourceType: "ActivityDefinition", action: action, onChange: props.onChange }));
|
|
4175
4354
|
default:
|
|
4176
4355
|
return null;
|
|
4177
4356
|
}
|
|
4178
4357
|
})(),
|
|
4179
|
-
|
|
4180
|
-
|
|
4181
|
-
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 }))));
|
|
4182
4360
|
}
|
|
4183
4361
|
function ActionResourceTypeBuilder(props) {
|
|
4184
4362
|
const { id, definitionCanonical } = props.action;
|
|
4185
4363
|
const reference = (definitionCanonical === null || definitionCanonical === void 0 ? void 0 : definitionCanonical.startsWith(props.resourceType + '/'))
|
|
4186
4364
|
? { reference: definitionCanonical }
|
|
4187
4365
|
: undefined;
|
|
4188
|
-
return (
|
|
4366
|
+
return (React.createElement(ResourceInput, { name: id, resourceType: props.resourceType, defaultValue: reference, loadOnFocus: true, onChange: (newValue) => {
|
|
4189
4367
|
if (newValue) {
|
|
4190
4368
|
props.onChange(Object.assign(Object.assign({}, props.action), { definitionCanonical: core.getReferenceString(newValue) }));
|
|
4191
4369
|
}
|
|
@@ -4198,7 +4376,7 @@
|
|
|
4198
4376
|
const value = props.action;
|
|
4199
4377
|
const key = 'timing';
|
|
4200
4378
|
const [propertyValue, propertyType] = getActionTiming(value);
|
|
4201
|
-
return (
|
|
4379
|
+
return (React.createElement(ResourcePropertyInput, { property: timingProperty, name: "timing[x]", defaultValue: propertyValue, defaultPropertyType: propertyType, onChange: (newValue, propName) => {
|
|
4202
4380
|
props.onChange(setPropertyValue(value, key, propName !== null && propName !== void 0 ? propName : key, timingProperty, newValue));
|
|
4203
4381
|
} }));
|
|
4204
4382
|
}
|
|
@@ -4300,14 +4478,15 @@
|
|
|
4300
4478
|
if (!schema || !questionnaire) {
|
|
4301
4479
|
return null;
|
|
4302
4480
|
}
|
|
4303
|
-
return (
|
|
4481
|
+
return (React.createElement(Form, { testid: "questionnaire-form", onSubmit: () => {
|
|
4304
4482
|
if (props.onSubmit && response) {
|
|
4305
4483
|
props.onSubmit(Object.assign(Object.assign({}, response), { questionnaire: core.getReferenceString(questionnaire), subject: props.subject, source: core.createReference(source), authored: new Date().toISOString() }));
|
|
4306
4484
|
}
|
|
4307
4485
|
} },
|
|
4308
|
-
questionnaire.title &&
|
|
4309
|
-
questionnaire.item && (
|
|
4310
|
-
|
|
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'))));
|
|
4311
4490
|
}
|
|
4312
4491
|
function QuestionnaireFormItemArray(props) {
|
|
4313
4492
|
const [responseItems, setResponseItems] = React.useState(buildInitialResponseItems(props.items));
|
|
@@ -4317,27 +4496,27 @@
|
|
|
4317
4496
|
setResponseItems(newResponseItems);
|
|
4318
4497
|
props.onChange(newResponseItems);
|
|
4319
4498
|
}
|
|
4320
|
-
return (
|
|
4499
|
+
return (React.createElement(core$1.Stack, null, props.items.map((item, index) => {
|
|
4321
4500
|
if (!isQuestionEnabled(item, props.answers)) {
|
|
4322
4501
|
return null;
|
|
4323
4502
|
}
|
|
4324
4503
|
if (item.type === exports.QuestionnaireItemType.display) {
|
|
4325
|
-
return
|
|
4504
|
+
return React.createElement("p", { key: item.linkId }, item.text);
|
|
4326
4505
|
}
|
|
4327
4506
|
if (item.type === exports.QuestionnaireItemType.group) {
|
|
4328
|
-
return (
|
|
4507
|
+
return (React.createElement(QuestionnaireFormItem, { key: item.linkId, item: item, answers: props.answers, onChange: (newResponseItem) => setResponseItem(index, newResponseItem) }));
|
|
4329
4508
|
}
|
|
4330
4509
|
if (item.type === exports.QuestionnaireItemType.boolean) {
|
|
4331
4510
|
const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;
|
|
4332
|
-
return (
|
|
4333
|
-
|
|
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, {
|
|
4334
4513
|
linkId: item.linkId,
|
|
4335
4514
|
text: item.text,
|
|
4336
4515
|
answer: [{ valueBoolean: e.currentTarget.checked }],
|
|
4337
4516
|
}) })));
|
|
4338
4517
|
}
|
|
4339
|
-
return (
|
|
4340
|
-
|
|
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) })));
|
|
4341
4520
|
})));
|
|
4342
4521
|
}
|
|
4343
4522
|
function QuestionnaireFormItem(props) {
|
|
@@ -4367,39 +4546,39 @@
|
|
|
4367
4546
|
}
|
|
4368
4547
|
switch (type) {
|
|
4369
4548
|
case exports.QuestionnaireItemType.group:
|
|
4370
|
-
return (
|
|
4371
|
-
|
|
4372
|
-
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 }))));
|
|
4373
4552
|
case exports.QuestionnaireItemType.boolean:
|
|
4374
|
-
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 }) }));
|
|
4375
4554
|
case exports.QuestionnaireItemType.decimal:
|
|
4376
|
-
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 }) }));
|
|
4377
4556
|
case exports.QuestionnaireItemType.integer:
|
|
4378
|
-
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 }) }));
|
|
4379
4558
|
case exports.QuestionnaireItemType.date:
|
|
4380
|
-
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 }) }));
|
|
4381
4560
|
case exports.QuestionnaireItemType.dateTime:
|
|
4382
|
-
return (
|
|
4561
|
+
return (React.createElement(DateTimeInput, { name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueDateTime, onChange: (newValue) => onChangeAnswer({ valueDateTime: newValue }) }));
|
|
4383
4562
|
case exports.QuestionnaireItemType.time:
|
|
4384
|
-
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 }) }));
|
|
4385
4564
|
case exports.QuestionnaireItemType.string:
|
|
4386
4565
|
case exports.QuestionnaireItemType.url:
|
|
4387
|
-
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 }) }));
|
|
4388
4567
|
case exports.QuestionnaireItemType.text:
|
|
4389
|
-
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 }) }));
|
|
4390
4569
|
case exports.QuestionnaireItemType.attachment:
|
|
4391
|
-
return (
|
|
4570
|
+
return (React.createElement(AttachmentInput, { name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueAttachment, onChange: (newValue) => onChangeAnswer({ valueAttachment: newValue }) }));
|
|
4392
4571
|
case exports.QuestionnaireItemType.reference:
|
|
4393
|
-
return (
|
|
4572
|
+
return (React.createElement(ReferenceInput, { name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueReference, onChange: (newValue) => onChangeAnswer({ valueReference: newValue }) }));
|
|
4394
4573
|
case exports.QuestionnaireItemType.quantity:
|
|
4395
|
-
return (
|
|
4574
|
+
return (React.createElement(QuantityInput, { name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueQuantity, onChange: (newValue) => onChangeAnswer({ valueQuantity: newValue }) }));
|
|
4396
4575
|
case exports.QuestionnaireItemType.choice:
|
|
4397
4576
|
case exports.QuestionnaireItemType.openChoice:
|
|
4398
4577
|
if (isDropDownChoice(item)) {
|
|
4399
|
-
return (
|
|
4578
|
+
return (React.createElement(QuestionnaireChoiceDropDownInput, { name: name, item: item, initial: initial, onChangeAnswer: onChangeAnswer }));
|
|
4400
4579
|
}
|
|
4401
4580
|
else {
|
|
4402
|
-
return (
|
|
4581
|
+
return (React.createElement(QuestionnaireChoiceRadioInput, { name: name, item: item, initial: initial, onChangeAnswer: onChangeAnswer }));
|
|
4403
4582
|
}
|
|
4404
4583
|
}
|
|
4405
4584
|
return null;
|
|
@@ -4414,7 +4593,7 @@
|
|
|
4414
4593
|
data.push(typedValueToString(optionValue));
|
|
4415
4594
|
}
|
|
4416
4595
|
}
|
|
4417
|
-
return (
|
|
4596
|
+
return (React.createElement(core$1.NativeSelect, { id: name, name: name, onChange: (e) => {
|
|
4418
4597
|
const index = e.currentTarget.selectedIndex;
|
|
4419
4598
|
if (index === 0) {
|
|
4420
4599
|
props.onChangeAnswer({});
|
|
@@ -4442,18 +4621,27 @@
|
|
|
4442
4621
|
const { name, item, initial, onChangeAnswer } = props;
|
|
4443
4622
|
const valueElementDefinition = core.globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];
|
|
4444
4623
|
const initialValue = core.getTypedPropertyValue({ type: 'QuestionnaireItemInitial', value: initial }, 'value');
|
|
4445
|
-
|
|
4446
|
-
|
|
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}`;
|
|
4447
4630
|
const optionValue = core.getTypedPropertyValue({ type: 'QuestionnaireItemAnswerOption', value: option }, 'value');
|
|
4448
|
-
|
|
4449
|
-
|
|
4450
|
-
|
|
4451
|
-
|
|
4452
|
-
|
|
4453
|
-
|
|
4454
|
-
|
|
4455
|
-
|
|
4456
|
-
|
|
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 }) })))));
|
|
4457
4645
|
}
|
|
4458
4646
|
function buildInitialResponse(questionnaire) {
|
|
4459
4647
|
const response = {
|
|
@@ -4519,6 +4707,50 @@
|
|
|
4519
4707
|
}
|
|
4520
4708
|
}
|
|
4521
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
|
+
}));
|
|
4522
4754
|
function QuestionnaireBuilder(props) {
|
|
4523
4755
|
const medplum = useMedplum();
|
|
4524
4756
|
const defaultValue = useResource(props.questionnaire);
|
|
@@ -4547,13 +4779,14 @@
|
|
|
4547
4779
|
if (!schema || !value) {
|
|
4548
4780
|
return null;
|
|
4549
4781
|
}
|
|
4550
|
-
return (
|
|
4551
|
-
|
|
4552
|
-
|
|
4553
|
-
|
|
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"))));
|
|
4554
4786
|
}
|
|
4555
4787
|
function ItemBuilder(props) {
|
|
4556
4788
|
var _a;
|
|
4789
|
+
const { classes, cx } = useStyles$4();
|
|
4557
4790
|
const resource = props.item;
|
|
4558
4791
|
const item = props.item;
|
|
4559
4792
|
const isResource = 'resourceType' in props.item;
|
|
@@ -4587,41 +4820,43 @@
|
|
|
4587
4820
|
function changeProperty(property, value) {
|
|
4588
4821
|
props.onChange(Object.assign(Object.assign({}, itemRef.current), { [property]: value }));
|
|
4589
4822
|
}
|
|
4590
|
-
const className =
|
|
4591
|
-
|
|
4592
|
-
|
|
4593
|
-
|
|
4594
|
-
|
|
4595
|
-
|
|
4596
|
-
|
|
4597
|
-
|
|
4598
|
-
|
|
4599
|
-
|
|
4600
|
-
|
|
4601
|
-
|
|
4602
|
-
{ value: 'dateTime', label: 'Date/Time' },
|
|
4603
|
-
{ value: 'time', label: 'Time' },
|
|
4604
|
-
{ value: 'string', label: 'String' },
|
|
4605
|
-
{ value: 'text', label: 'Text' },
|
|
4606
|
-
{ value: 'url', label: 'URL' },
|
|
4607
|
-
{ value: 'choice', label: 'Choice' },
|
|
4608
|
-
{ value: 'open-choice', label: 'Open Choice' },
|
|
4609
|
-
{ value: 'attachment', label: 'Attachment' },
|
|
4610
|
-
{ value: 'reference', label: 'Reference' },
|
|
4611
|
-
{ value: 'quantity', label: 'Quantity' },
|
|
4612
|
-
] }))),
|
|
4613
|
-
!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) })),
|
|
4614
|
-
isChoiceQuestion(item) && (React__default["default"].createElement(AnswerBuilder, { options: item.answerOption, onChange: (newOptions) => changeProperty('answerOption', newOptions) })))) : (React__default["default"].createElement(React__default["default"].Fragment, null,
|
|
4615
|
-
resource.title && React__default["default"].createElement("h1", null, resource.title),
|
|
4616
|
-
item.text && React__default["default"].createElement("p", null, item.text),
|
|
4617
|
-
!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 })))),
|
|
4618
4835
|
item.item &&
|
|
4619
|
-
item.item.map((i) => (
|
|
4620
|
-
|
|
4621
|
-
!isContainer && (
|
|
4622
|
-
|
|
4623
|
-
isContainer && (
|
|
4624
|
-
|
|
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) => {
|
|
4625
4860
|
e.preventDefault();
|
|
4626
4861
|
addItem({
|
|
4627
4862
|
id: generateId(),
|
|
@@ -4630,7 +4865,7 @@
|
|
|
4630
4865
|
text: 'Question',
|
|
4631
4866
|
});
|
|
4632
4867
|
} }, "Add item"),
|
|
4633
|
-
|
|
4868
|
+
React.createElement("a", { href: "#", onClick: (e) => {
|
|
4634
4869
|
e.preventDefault();
|
|
4635
4870
|
addItem({
|
|
4636
4871
|
id: generateId(),
|
|
@@ -4639,7 +4874,7 @@
|
|
|
4639
4874
|
text: 'Group',
|
|
4640
4875
|
});
|
|
4641
4876
|
} }, "Add group"))),
|
|
4642
|
-
!isResource && (
|
|
4877
|
+
editing && !isResource && (React.createElement("a", { href: "#", onClick: (e) => {
|
|
4643
4878
|
e.preventDefault();
|
|
4644
4879
|
if (props.onRemove) {
|
|
4645
4880
|
props.onRemove();
|
|
@@ -4650,30 +4885,30 @@
|
|
|
4650
4885
|
var _a;
|
|
4651
4886
|
const property = core.globalSchema.types['QuestionnaireItemAnswerOption'].properties['value[x]'];
|
|
4652
4887
|
const options = (_a = props.options) !== null && _a !== void 0 ? _a : [];
|
|
4653
|
-
return (
|
|
4888
|
+
return (React.createElement("div", null,
|
|
4654
4889
|
options.map((option) => {
|
|
4655
4890
|
const [propertyValue, propertyType] = getValueAndType({ type: 'QuestionnaireItemAnswerOption', value: option }, 'value');
|
|
4656
|
-
return (
|
|
4891
|
+
return (React.createElement("div", { key: option.id, style: {
|
|
4657
4892
|
display: 'flex',
|
|
4658
4893
|
flexDirection: 'row',
|
|
4659
4894
|
justifyContent: 'space-between',
|
|
4660
4895
|
alignItems: 'center',
|
|
4661
4896
|
width: '80%',
|
|
4662
4897
|
} },
|
|
4663
|
-
|
|
4664
|
-
|
|
4898
|
+
React.createElement("div", null,
|
|
4899
|
+
React.createElement(ResourcePropertyInput, { key: option.id, name: "value[x]", property: property, defaultPropertyType: propertyType, defaultValue: propertyValue, onChange: (newValue, propName) => {
|
|
4665
4900
|
const newOptions = [...options];
|
|
4666
4901
|
const index = newOptions.findIndex((o) => o.id === option.id);
|
|
4667
4902
|
newOptions[index] = { id: option.id, [propName]: newValue };
|
|
4668
4903
|
props.onChange(newOptions);
|
|
4669
4904
|
} })),
|
|
4670
|
-
|
|
4671
|
-
|
|
4905
|
+
React.createElement("div", null,
|
|
4906
|
+
React.createElement("a", { href: "#", onClick: (e) => {
|
|
4672
4907
|
killEvent(e);
|
|
4673
4908
|
props.onChange(options.filter((o) => o.id !== option.id));
|
|
4674
4909
|
} }, "Remove"))));
|
|
4675
4910
|
}),
|
|
4676
|
-
|
|
4911
|
+
React.createElement("a", { href: "#", onClick: (e) => {
|
|
4677
4912
|
killEvent(e);
|
|
4678
4913
|
props.onChange([
|
|
4679
4914
|
...options,
|
|
@@ -4782,7 +5017,7 @@
|
|
|
4782
5017
|
stat: 'red',
|
|
4783
5018
|
};
|
|
4784
5019
|
function StatusBadge(props) {
|
|
4785
|
-
return
|
|
5020
|
+
return React.createElement(core$1.Badge, { color: statusToColor[props.status] }, props.status);
|
|
4786
5021
|
}
|
|
4787
5022
|
|
|
4788
5023
|
function RequestGroupDisplay(props) {
|
|
@@ -4800,27 +5035,27 @@
|
|
|
4800
5035
|
if (!requestGroup || !responseBundle) {
|
|
4801
5036
|
return null;
|
|
4802
5037
|
}
|
|
4803
|
-
return (
|
|
5038
|
+
return (React.createElement(core$1.Grid, null, (_a = requestGroup.action) === null || _a === void 0 ? void 0 : _a.map((action, index) => {
|
|
4804
5039
|
var _a, _b, _c, _d, _e, _f;
|
|
4805
5040
|
const task = action.resource && findBundleEntry(action.resource);
|
|
4806
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;
|
|
4807
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;
|
|
4808
|
-
return (
|
|
4809
|
-
|
|
4810
|
-
|
|
4811
|
-
|
|
4812
|
-
action.description &&
|
|
4813
|
-
|
|
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,
|
|
4814
5049
|
"Last edited by\u00A0",
|
|
4815
|
-
|
|
5050
|
+
React.createElement(ResourceName, { value: (_e = task === null || task === void 0 ? void 0 : task.meta) === null || _e === void 0 ? void 0 : _e.author }),
|
|
4816
5051
|
"\u00A0on\u00A0",
|
|
4817
5052
|
core.formatDateTime((_f = task === null || task === void 0 ? void 0 : task.meta) === null || _f === void 0 ? void 0 : _f.lastUpdated)),
|
|
4818
|
-
|
|
5053
|
+
React.createElement("div", null,
|
|
4819
5054
|
"Status: ",
|
|
4820
|
-
|
|
4821
|
-
|
|
4822
|
-
taskInput && !taskOutput &&
|
|
4823
|
-
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")))));
|
|
4824
5059
|
})));
|
|
4825
5060
|
function buildBatchRequest(request) {
|
|
4826
5061
|
var _a;
|
|
@@ -5034,8 +5269,56 @@
|
|
|
5034
5269
|
}
|
|
5035
5270
|
}
|
|
5036
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
|
+
}));
|
|
5037
5319
|
function ResourceBlame(props) {
|
|
5038
5320
|
var _a, _b;
|
|
5321
|
+
const { classes } = useStyles$3();
|
|
5039
5322
|
const medplum = useMedplum();
|
|
5040
5323
|
const [value, setValue] = React.useState(props.history);
|
|
5041
5324
|
React.useEffect(() => {
|
|
@@ -5044,20 +5327,21 @@
|
|
|
5044
5327
|
}
|
|
5045
5328
|
}, [medplum, props.history, props.resourceType, props.id]);
|
|
5046
5329
|
if (!value) {
|
|
5047
|
-
return
|
|
5330
|
+
return React.createElement("div", null, "Loading...");
|
|
5048
5331
|
}
|
|
5049
5332
|
const resource = (_b = (_a = value.entry) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.resource;
|
|
5050
5333
|
const table = blame(value);
|
|
5051
|
-
return (
|
|
5052
|
-
|
|
5053
|
-
|
|
5054
|
-
row.span > 0 && (
|
|
5055
|
-
|
|
5056
|
-
|
|
5057
|
-
|
|
5058
|
-
|
|
5059
|
-
|
|
5060
|
-
|
|
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)))))))));
|
|
5061
5345
|
}
|
|
5062
5346
|
function getVersionUrl$1(resource, versionId) {
|
|
5063
5347
|
return `/${resource.resourceType}/${resource.id}/_history/${versionId}`;
|
|
@@ -5090,6 +5374,15 @@
|
|
|
5090
5374
|
return `${count} ${count === 1 ? noun : noun + 's'} ago`;
|
|
5091
5375
|
}
|
|
5092
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
|
+
}));
|
|
5093
5386
|
function ResourceDiff(props) {
|
|
5094
5387
|
let originalResource = props.original;
|
|
5095
5388
|
let revisedResource = props.revised;
|
|
@@ -5100,16 +5393,17 @@
|
|
|
5100
5393
|
const original = core.stringify(originalResource, true).match(/[^\r\n]+/g);
|
|
5101
5394
|
const revised = core.stringify(revisedResource, true).match(/[^\r\n]+/g);
|
|
5102
5395
|
const deltas = diff(original, revised);
|
|
5103
|
-
return (
|
|
5396
|
+
return (React.createElement("pre", { style: { color: 'gray' } }, deltas.map((delta, index) => (React.createElement(ChangeDiff, { key: 'delta' + index, delta: delta })))));
|
|
5104
5397
|
}
|
|
5105
5398
|
function ChangeDiff(props) {
|
|
5106
|
-
|
|
5399
|
+
const { classes } = useStyles$2();
|
|
5400
|
+
return (React.createElement(React.Fragment, null,
|
|
5107
5401
|
"...",
|
|
5108
|
-
|
|
5109
|
-
props.delta.original.lines.length > 0 && (
|
|
5110
|
-
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'))),
|
|
5111
5405
|
"...",
|
|
5112
|
-
|
|
5406
|
+
React.createElement("br", null)));
|
|
5113
5407
|
}
|
|
5114
5408
|
|
|
5115
5409
|
function ResourceHistoryTable(props) {
|
|
@@ -5125,30 +5419,30 @@
|
|
|
5125
5419
|
}
|
|
5126
5420
|
}, [medplum, props.history, props.resourceType, props.id]);
|
|
5127
5421
|
if (!value) {
|
|
5128
|
-
return
|
|
5422
|
+
return React.createElement("div", null, "Loading...");
|
|
5129
5423
|
}
|
|
5130
|
-
return (
|
|
5131
|
-
|
|
5132
|
-
|
|
5133
|
-
|
|
5134
|
-
|
|
5135
|
-
|
|
5136
|
-
|
|
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 }))))));
|
|
5137
5431
|
}
|
|
5138
5432
|
function HistoryRow(props) {
|
|
5139
5433
|
var _a, _b, _c;
|
|
5140
5434
|
const { response, resource } = props.entry;
|
|
5141
5435
|
if (resource) {
|
|
5142
|
-
return (
|
|
5143
|
-
|
|
5144
|
-
|
|
5145
|
-
|
|
5146
|
-
|
|
5147
|
-
|
|
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))));
|
|
5148
5442
|
}
|
|
5149
5443
|
else {
|
|
5150
|
-
return (
|
|
5151
|
-
|
|
5444
|
+
return (React.createElement("tr", null,
|
|
5445
|
+
React.createElement("td", { colSpan: 3 }, core.normalizeErrorString(response === null || response === void 0 ? void 0 : response.outcome))));
|
|
5152
5446
|
}
|
|
5153
5447
|
}
|
|
5154
5448
|
function getVersionUrl(resource) {
|
|
@@ -5156,6 +5450,42 @@
|
|
|
5156
5450
|
return `/${resource.resourceType}/${resource.id}/_history/${(_a = resource.meta) === null || _a === void 0 ? void 0 : _a.versionId}`;
|
|
5157
5451
|
}
|
|
5158
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
|
+
}));
|
|
5159
5489
|
/**
|
|
5160
5490
|
* Returns a month display string (e.g. "January 2020").
|
|
5161
5491
|
* @param date Any date within the month.
|
|
@@ -5165,6 +5495,7 @@
|
|
|
5165
5495
|
return date.toLocaleString('default', { month: 'long' }) + ' ' + date.getFullYear();
|
|
5166
5496
|
}
|
|
5167
5497
|
function CalendarInput(props) {
|
|
5498
|
+
const { classes } = useStyles$1();
|
|
5168
5499
|
const { onChangeMonth, onClick } = props;
|
|
5169
5500
|
const [month, setMonth] = React.useState(getStartMonth);
|
|
5170
5501
|
function moveMonth(delta) {
|
|
@@ -5176,23 +5507,23 @@
|
|
|
5176
5507
|
});
|
|
5177
5508
|
}
|
|
5178
5509
|
const grid = React.useMemo(() => buildGrid(month, props.slots), [month, props.slots]);
|
|
5179
|
-
return (
|
|
5180
|
-
|
|
5181
|
-
|
|
5182
|
-
|
|
5183
|
-
|
|
5184
|
-
|
|
5185
|
-
|
|
5186
|
-
|
|
5187
|
-
|
|
5188
|
-
|
|
5189
|
-
|
|
5190
|
-
|
|
5191
|
-
|
|
5192
|
-
|
|
5193
|
-
|
|
5194
|
-
|
|
5195
|
-
|
|
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()))))))))))));
|
|
5196
5527
|
}
|
|
5197
5528
|
function getStartMonth() {
|
|
5198
5529
|
const result = new Date();
|
|
@@ -5247,8 +5578,24 @@
|
|
|
5247
5578
|
return false;
|
|
5248
5579
|
}
|
|
5249
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
|
+
}));
|
|
5250
5596
|
function Scheduler(props) {
|
|
5251
5597
|
var _a;
|
|
5598
|
+
const { classes } = useStyles();
|
|
5252
5599
|
const medplum = useMedplum();
|
|
5253
5600
|
const schedule = useResource(props.schedule);
|
|
5254
5601
|
const questionnaire = useResource(props.questionnaire);
|
|
@@ -5280,30 +5627,30 @@
|
|
|
5280
5627
|
return null;
|
|
5281
5628
|
}
|
|
5282
5629
|
const actor = (_a = schedule.actor) === null || _a === void 0 ? void 0 : _a[0];
|
|
5283
|
-
return (
|
|
5284
|
-
|
|
5285
|
-
actor &&
|
|
5286
|
-
actor && (
|
|
5287
|
-
|
|
5288
|
-
|
|
5289
|
-
date &&
|
|
5290
|
-
slot &&
|
|
5291
|
-
|
|
5292
|
-
!date && (
|
|
5293
|
-
|
|
5294
|
-
|
|
5295
|
-
date && !slot && (
|
|
5296
|
-
|
|
5297
|
-
|
|
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) => {
|
|
5298
5645
|
const slotStart = new Date(s.start);
|
|
5299
5646
|
return (slotStart.getTime() > date.getTime() &&
|
|
5300
|
-
slotStart.getTime() < date.getTime() + 24 * 3600 * 1000 && (
|
|
5301
|
-
|
|
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)))));
|
|
5302
5649
|
})))),
|
|
5303
|
-
date && slot && !response && (
|
|
5304
|
-
date && slot && response && (
|
|
5305
|
-
|
|
5306
|
-
|
|
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."))))));
|
|
5307
5654
|
}
|
|
5308
5655
|
function getStart(month) {
|
|
5309
5656
|
return formatSlotInstant(month.getTime());
|
|
@@ -5319,7 +5666,7 @@
|
|
|
5319
5666
|
}
|
|
5320
5667
|
|
|
5321
5668
|
function ServiceRequestTimeline(props) {
|
|
5322
|
-
return (
|
|
5669
|
+
return (React.createElement(ResourceTimeline, { value: props.serviceRequest, buildSearchRequests: (resource) => ({
|
|
5323
5670
|
resourceType: 'Bundle',
|
|
5324
5671
|
type: 'batch',
|
|
5325
5672
|
entry: [
|
|
@@ -5488,7 +5835,5 @@
|
|
|
5488
5835
|
exports.useMedplumProfile = useMedplumProfile;
|
|
5489
5836
|
exports.useResource = useResource;
|
|
5490
5837
|
|
|
5491
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
5492
|
-
|
|
5493
5838
|
}));
|
|
5494
5839
|
//# sourceMappingURL=index.js.map
|