@medplum/react 0.9.38 → 0.10.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 +9 -0
- package/dist/cjs/CodeInput.d.ts +2 -1
- package/dist/cjs/CodeableConceptInput.d.ts +1 -0
- package/dist/cjs/CodingInput.d.ts +1 -0
- package/dist/cjs/DateTimeInput.d.ts +9 -2
- package/dist/cjs/ReferenceInput.d.ts +1 -0
- package/dist/cjs/ResourceAvatar.d.ts +8 -0
- package/dist/cjs/ResourceBadge.d.ts +0 -1
- package/dist/cjs/ResourceInput.d.ts +2 -3
- package/dist/cjs/SearchPopupMenu.d.ts +0 -4
- package/dist/cjs/SearchUtils.d.ts +5 -5
- package/dist/cjs/ValueSetAutocomplete.d.ts +10 -0
- package/dist/cjs/auth/RegisterForm.d.ts +0 -1
- package/dist/cjs/auth/SignInForm.d.ts +0 -1
- package/dist/cjs/defaulttheme.css +0 -51
- package/dist/cjs/index.d.ts +3 -14
- package/dist/cjs/index.js +793 -1493
- 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/{UploadButton.stories.d.ts → AttachmentButton.stories.d.ts} +1 -0
- package/dist/cjs/stories/{Input.stories.d.ts → PeriodInput.stories.d.ts} +1 -1
- package/dist/cjs/stories/{Avatar.stories.d.ts → ResourceAvatar.stories.d.ts} +0 -0
- package/dist/cjs/stories/ResourceForm.stories.d.ts +1 -0
- package/dist/cjs/stories/{Dialog.stories.d.ts → ResourceInput.stories.d.ts} +2 -1
- package/dist/cjs/stories/SearchControl.stories.d.ts +1 -0
- package/dist/cjs/styles.css +70 -1053
- package/dist/cjs/utils/outcomes.d.ts +1 -0
- package/dist/esm/AddressInput.js +9 -21
- package/dist/esm/AddressInput.js.map +1 -1
- package/dist/esm/AnnotationInput.js +2 -2
- package/dist/esm/AnnotationInput.js.map +1 -1
- package/dist/esm/AttachmentArrayInput.js +11 -8
- package/dist/esm/AttachmentArrayInput.js.map +1 -1
- package/dist/esm/AttachmentButton.d.ts +9 -0
- package/dist/esm/{UploadButton.js → AttachmentButton.js} +9 -9
- package/dist/esm/AttachmentButton.js.map +1 -0
- package/dist/esm/AttachmentInput.js +3 -3
- package/dist/esm/AttachmentInput.js.map +1 -1
- package/dist/esm/CalendarInput.js +6 -7
- package/dist/esm/CalendarInput.js.map +1 -1
- package/dist/esm/CodeInput.d.ts +2 -1
- package/dist/esm/CodeInput.js +16 -21
- package/dist/esm/CodeInput.js.map +1 -1
- package/dist/esm/CodeableConceptInput.d.ts +1 -0
- package/dist/esm/CodeableConceptInput.js +18 -33
- package/dist/esm/CodeableConceptInput.js.map +1 -1
- package/dist/esm/CodingInput.d.ts +1 -0
- package/dist/esm/CodingInput.js +24 -23
- package/dist/esm/CodingInput.js.map +1 -1
- package/dist/esm/ContactDetailInput.js +3 -4
- package/dist/esm/ContactDetailInput.js.map +1 -1
- package/dist/esm/ContactPointInput.js +5 -21
- package/dist/esm/ContactPointInput.js.map +1 -1
- package/dist/esm/DateTimeInput.d.ts +9 -2
- package/dist/esm/DateTimeInput.js +13 -3
- package/dist/esm/DateTimeInput.js.map +1 -1
- package/dist/esm/DiagnosticReportDisplay.js +16 -1
- package/dist/esm/DiagnosticReportDisplay.js.map +1 -1
- package/dist/esm/EncounterTimeline.js +2 -0
- package/dist/esm/EncounterTimeline.js.map +1 -1
- package/dist/esm/ExtensionInput.js +2 -2
- package/dist/esm/ExtensionInput.js.map +1 -1
- package/dist/esm/FhirPathTable.js +4 -5
- package/dist/esm/FhirPathTable.js.map +1 -1
- package/dist/esm/HumanNameInput.js +7 -17
- package/dist/esm/HumanNameInput.js.map +1 -1
- package/dist/esm/IdentifierInput.js +4 -5
- package/dist/esm/IdentifierInput.js.map +1 -1
- package/dist/esm/Logo.js +4 -4
- package/dist/esm/Logo.js.map +1 -1
- package/dist/esm/PatientTimeline.js +2 -0
- package/dist/esm/PatientTimeline.js.map +1 -1
- package/dist/esm/PeriodInput.js +5 -5
- package/dist/esm/PeriodInput.js.map +1 -1
- package/dist/esm/PlanDefinitionBuilder.js +17 -29
- package/dist/esm/PlanDefinitionBuilder.js.map +1 -1
- package/dist/esm/QuantityInput.js +5 -12
- package/dist/esm/QuantityInput.js.map +1 -1
- package/dist/esm/QuestionnaireBuilder.js +22 -25
- package/dist/esm/QuestionnaireBuilder.js.map +1 -1
- package/dist/esm/QuestionnaireForm.js +35 -29
- package/dist/esm/QuestionnaireForm.js.map +1 -1
- package/dist/esm/RangeInput.js +2 -2
- package/dist/esm/RangeInput.js.map +1 -1
- package/dist/esm/RatioInput.js +2 -2
- package/dist/esm/RatioInput.js.map +1 -1
- package/dist/esm/ReferenceInput.d.ts +1 -0
- package/dist/esm/ReferenceInput.js +4 -6
- package/dist/esm/ReferenceInput.js.map +1 -1
- package/dist/esm/RequestGroupDisplay.js +1 -1
- package/dist/esm/RequestGroupDisplay.js.map +1 -1
- package/dist/esm/ResourceArrayInput.js +10 -7
- package/dist/esm/ResourceArrayInput.js.map +1 -1
- package/dist/esm/ResourceAvatar.d.ts +8 -0
- package/dist/esm/ResourceAvatar.js +24 -0
- package/dist/esm/ResourceAvatar.js.map +1 -0
- package/dist/esm/ResourceBadge.d.ts +0 -1
- package/dist/esm/ResourceBadge.js +2 -3
- package/dist/esm/ResourceBadge.js.map +1 -1
- package/dist/esm/ResourceBlame.js +3 -3
- package/dist/esm/ResourceBlame.js.map +1 -1
- package/dist/esm/ResourceForm.js +10 -10
- package/dist/esm/ResourceForm.js.map +1 -1
- package/dist/esm/ResourceInput.d.ts +2 -3
- package/dist/esm/ResourceInput.js +37 -29
- package/dist/esm/ResourceInput.js.map +1 -1
- package/dist/esm/ResourcePropertyInput.js +30 -18
- package/dist/esm/ResourcePropertyInput.js.map +1 -1
- package/dist/esm/ResourceTimeline.js +19 -15
- package/dist/esm/ResourceTimeline.js.map +1 -1
- package/dist/esm/Scheduler.js +7 -7
- package/dist/esm/Scheduler.js.map +1 -1
- package/dist/esm/SearchControl.js +76 -58
- package/dist/esm/SearchControl.js.map +1 -1
- package/dist/esm/SearchControlField.js.map +1 -1
- package/dist/esm/SearchFieldEditor.js +7 -7
- package/dist/esm/SearchFieldEditor.js.map +1 -1
- package/dist/esm/SearchFilterEditor.js +10 -15
- package/dist/esm/SearchFilterEditor.js.map +1 -1
- package/dist/esm/SearchFilterValueDialog.js +4 -3
- package/dist/esm/SearchFilterValueDialog.js.map +1 -1
- package/dist/esm/SearchFilterValueInput.js +6 -7
- package/dist/esm/SearchFilterValueInput.js.map +1 -1
- package/dist/esm/SearchPopupMenu.d.ts +0 -4
- package/dist/esm/SearchPopupMenu.js +59 -73
- package/dist/esm/SearchPopupMenu.js.map +1 -1
- package/dist/esm/SearchUtils.d.ts +5 -5
- package/dist/esm/SearchUtils.js +11 -12
- package/dist/esm/SearchUtils.js.map +1 -1
- package/dist/esm/ServiceRequestTimeline.js +2 -0
- package/dist/esm/ServiceRequestTimeline.js.map +1 -1
- package/dist/esm/Timeline.js +12 -20
- package/dist/esm/Timeline.js.map +1 -1
- package/dist/esm/TimingInput.js +14 -17
- package/dist/esm/TimingInput.js.map +1 -1
- package/dist/esm/ValueSetAutocomplete.d.ts +10 -0
- package/dist/esm/ValueSetAutocomplete.js +57 -0
- package/dist/esm/ValueSetAutocomplete.js.map +1 -0
- package/dist/esm/auth/AuthenticationForm.js +12 -20
- package/dist/esm/auth/AuthenticationForm.js.map +1 -1
- package/dist/esm/auth/ChooseProfileForm.js +10 -10
- package/dist/esm/auth/ChooseProfileForm.js.map +1 -1
- package/dist/esm/auth/NewProjectForm.js +12 -15
- package/dist/esm/auth/NewProjectForm.js.map +1 -1
- package/dist/esm/auth/NewUserForm.js +25 -33
- 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 +0 -1
- package/dist/esm/auth/SignInForm.js.map +1 -1
- package/dist/esm/defaulttheme.css +0 -51
- package/dist/esm/index.d.ts +3 -14
- package/dist/esm/index.js +4 -15
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.min.js +1 -1
- package/dist/esm/index.min.js.map +1 -1
- package/dist/esm/node_modules/tslib/tslib.es6.js +13 -1
- package/dist/esm/node_modules/tslib/tslib.es6.js.map +1 -1
- package/dist/esm/stories/{UploadButton.stories.d.ts → AttachmentButton.stories.d.ts} +1 -0
- package/dist/{cjs/stories/Select.stories.d.ts → esm/stories/PeriodInput.stories.d.ts} +1 -1
- package/dist/esm/stories/{Avatar.stories.d.ts → ResourceAvatar.stories.d.ts} +0 -0
- package/dist/esm/stories/ResourceForm.stories.d.ts +1 -0
- package/dist/{cjs/stories/FormSection.stories.d.ts → esm/stories/ResourceInput.stories.d.ts} +2 -2
- package/dist/esm/stories/SearchControl.stories.d.ts +1 -0
- package/dist/esm/styles.css +70 -1053
- package/dist/esm/utils/outcomes.d.ts +1 -0
- package/dist/esm/utils/outcomes.js +5 -1
- package/dist/esm/utils/outcomes.js.map +1 -1
- package/package.json +27 -19
- package/dist/cjs/Autocomplete.d.ts +0 -20
- package/dist/cjs/Avatar.d.ts +0 -12
- package/dist/cjs/Button.d.ts +0 -15
- package/dist/cjs/Checkbox.d.ts +0 -12
- package/dist/cjs/Dialog.d.ts +0 -10
- package/dist/cjs/Header.d.ts +0 -12
- package/dist/cjs/HeaderSearchInput.d.ts +0 -10
- package/dist/cjs/Input.d.ts +0 -22
- package/dist/cjs/InputRow.d.ts +0 -7
- package/dist/cjs/Loading.d.ts +0 -3
- package/dist/cjs/MenuItem.d.ts +0 -9
- package/dist/cjs/MenuSeparator.d.ts +0 -3
- package/dist/cjs/Popup.d.ts +0 -14
- package/dist/cjs/Select.d.ts +0 -16
- package/dist/cjs/SubMenu.d.ts +0 -7
- package/dist/cjs/TextArea.d.ts +0 -18
- package/dist/cjs/UploadButton.d.ts +0 -7
- package/dist/cjs/stories/Autocomplete.stories.d.ts +0 -9
- package/dist/cjs/stories/Button.stories.d.ts +0 -9
- package/dist/cjs/stories/Header.stories.d.ts +0 -8
- package/dist/cjs/stories/Loading.stories.d.ts +0 -5
- package/dist/esm/Autocomplete.d.ts +0 -20
- package/dist/esm/Autocomplete.js +0 -281
- package/dist/esm/Autocomplete.js.map +0 -1
- package/dist/esm/Avatar.d.ts +0 -12
- package/dist/esm/Avatar.js +0 -24
- package/dist/esm/Avatar.js.map +0 -1
- package/dist/esm/Button.d.ts +0 -15
- package/dist/esm/Button.js +0 -13
- package/dist/esm/Button.js.map +0 -1
- package/dist/esm/Checkbox.d.ts +0 -12
- package/dist/esm/Checkbox.js +0 -13
- package/dist/esm/Checkbox.js.map +0 -1
- package/dist/esm/Dialog.d.ts +0 -10
- package/dist/esm/Dialog.js +0 -43
- package/dist/esm/Dialog.js.map +0 -1
- package/dist/esm/Header.d.ts +0 -12
- package/dist/esm/Header.js +0 -99
- package/dist/esm/Header.js.map +0 -1
- package/dist/esm/HeaderSearchInput.d.ts +0 -10
- package/dist/esm/HeaderSearchInput.js +0 -181
- package/dist/esm/HeaderSearchInput.js.map +0 -1
- package/dist/esm/Input.d.ts +0 -22
- package/dist/esm/Input.js +0 -26
- package/dist/esm/Input.js.map +0 -1
- package/dist/esm/InputRow.d.ts +0 -7
- package/dist/esm/InputRow.js +0 -8
- package/dist/esm/InputRow.js.map +0 -1
- package/dist/esm/Loading.d.ts +0 -3
- package/dist/esm/Loading.js +0 -11
- package/dist/esm/Loading.js.map +0 -1
- package/dist/esm/MenuItem.d.ts +0 -9
- package/dist/esm/MenuItem.js +0 -8
- package/dist/esm/MenuItem.js.map +0 -1
- package/dist/esm/MenuSeparator.d.ts +0 -3
- package/dist/esm/MenuSeparator.js +0 -8
- package/dist/esm/MenuSeparator.js.map +0 -1
- package/dist/esm/Popup.d.ts +0 -14
- package/dist/esm/Popup.js +0 -78
- package/dist/esm/Popup.js.map +0 -1
- package/dist/esm/Select.d.ts +0 -16
- package/dist/esm/Select.js +0 -16
- package/dist/esm/Select.js.map +0 -1
- package/dist/esm/SubMenu.d.ts +0 -7
- package/dist/esm/SubMenu.js +0 -38
- package/dist/esm/SubMenu.js.map +0 -1
- package/dist/esm/TextArea.d.ts +0 -18
- package/dist/esm/TextArea.js +0 -16
- package/dist/esm/TextArea.js.map +0 -1
- package/dist/esm/UploadButton.d.ts +0 -7
- package/dist/esm/UploadButton.js.map +0 -1
- package/dist/esm/stories/Autocomplete.stories.d.ts +0 -9
- package/dist/esm/stories/Button.stories.d.ts +0 -9
- package/dist/esm/stories/Dialog.stories.d.ts +0 -5
- package/dist/esm/stories/FormSection.stories.d.ts +0 -6
- package/dist/esm/stories/Header.stories.d.ts +0 -8
- package/dist/esm/stories/Input.stories.d.ts +0 -6
- package/dist/esm/stories/Loading.stories.d.ts +0 -5
- package/dist/esm/stories/Select.stories.d.ts +0 -6
package/dist/esm/Timeline.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Timeline.js","sources":["../../src/Timeline.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"Timeline.js","sources":["../../src/Timeline.tsx"],"sourcesContent":["import { ActionIcon, Button, Menu } from '@mantine/core';\nimport { formatDateTime, getReferenceString } from '@medplum/core';\nimport { Reference, Resource } from '@medplum/fhirtypes';\nimport { IconDots } from '@tabler/icons';\nimport React from 'react';\nimport { ErrorBoundary } from './ErrorBoundary';\nimport { MedplumLink } from './MedplumLink';\nimport { ResourceAvatar } from './ResourceAvatar';\nimport { ResourceName } from './ResourceName';\n\nimport './Timeline.css';\n\nexport interface TimelineProps {\n children?: React.ReactNode;\n}\n\nexport function Timeline(props: TimelineProps): JSX.Element {\n return <main className=\"medplum-document medplum-timeline\">{props.children}</main>;\n}\n\nexport interface TimelineItemProps {\n resource: Resource;\n profile?: Reference;\n socialEnabled?: boolean;\n children?: React.ReactNode;\n padding?: boolean;\n className?: string;\n popupMenuItems?: React.ReactNode;\n}\n\nexport function TimelineItem(props: TimelineItemProps): JSX.Element {\n const author = props.profile ?? props.resource.meta?.author;\n return (\n <article className={props.className || 'medplum-timeline-item'} data-testid=\"timeline-item\">\n <div className=\"medplum-timeline-item-header\">\n <div className=\"medplum-timeline-item-avatar\">\n <ResourceAvatar value={author} link={true} size=\"md\" />\n </div>\n <div className=\"medplum-timeline-item-title\">\n <ResourceName value={author} link={true} />\n <div className=\"medplum-timeline-item-subtitle\">\n <MedplumLink to={props.resource}>{formatDateTime(props.resource.meta?.lastUpdated)}</MedplumLink>\n <span>·</span>\n <MedplumLink to={props.resource}>{props.resource.resourceType}</MedplumLink>\n </div>\n </div>\n {props.popupMenuItems && (\n <Menu position=\"bottom-end\" shadow=\"md\" width={200}>\n <Menu.Target>\n <ActionIcon radius=\"xl\" aria-label={`Actions for ${getReferenceString(props.resource)}`}>\n <IconDots />\n </ActionIcon>\n </Menu.Target>\n {props.popupMenuItems}\n </Menu>\n )}\n </div>\n <ErrorBoundary>\n {props.padding && <div style={{ padding: '2px 16px 16px 16px' }}>{props.children}</div>}\n {!props.padding && <>{props.children}</>}\n </ErrorBoundary>\n {props.socialEnabled && (\n <div className=\"medplum-timeline-item-footer\">\n <Button variant=\"subtle\">Like</Button>\n <Button variant=\"subtle\">Comment</Button>\n </div>\n )}\n </article>\n );\n}\n"],"names":[],"mappings":"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"}
|
package/dist/esm/TimingInput.js
CHANGED
|
@@ -1,13 +1,8 @@
|
|
|
1
|
+
import { Group, Button, Modal, TextInput, NativeSelect, Checkbox } from '@mantine/core';
|
|
1
2
|
import { formatTiming } from '@medplum/core';
|
|
2
3
|
import React, { useState, useRef } from 'react';
|
|
3
|
-
import { Button } from './Button.js';
|
|
4
|
-
import { Checkbox } from './Checkbox.js';
|
|
5
4
|
import { DateTimeInput } from './DateTimeInput.js';
|
|
6
|
-
import { Dialog } from './Dialog.js';
|
|
7
5
|
import { FormSection } from './FormSection.js';
|
|
8
|
-
import { Input } from './Input.js';
|
|
9
|
-
import { InputRow } from './InputRow.js';
|
|
10
|
-
import { Select } from './Select.js';
|
|
11
6
|
|
|
12
7
|
const daysOfWeek = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
|
|
13
8
|
function TimingInput(props) {
|
|
@@ -16,7 +11,7 @@ function TimingInput(props) {
|
|
|
16
11
|
const valueRef = useRef();
|
|
17
12
|
valueRef.current = value;
|
|
18
13
|
return (React.createElement(React.Fragment, null,
|
|
19
|
-
React.createElement(
|
|
14
|
+
React.createElement(Group, { spacing: "xs", grow: true, noWrap: true },
|
|
20
15
|
React.createElement("span", null, formatTiming(valueRef.current) || 'No repeat'),
|
|
21
16
|
React.createElement(Button, { onClick: () => setOpen(true) }, "Edit")),
|
|
22
17
|
React.createElement(TimingEditorDialog, { visible: open, defaultValue: valueRef.current, onOk: (newValue) => {
|
|
@@ -68,22 +63,24 @@ function TimingEditorDialog(props) {
|
|
|
68
63
|
setRepeat(Object.assign(Object.assign({}, (_c = valueRef.current) === null || _c === void 0 ? void 0 : _c.repeat), { dayOfWeek: existing.filter((d) => d !== day) }));
|
|
69
64
|
}
|
|
70
65
|
}
|
|
71
|
-
return (React.createElement(
|
|
66
|
+
return (React.createElement(Modal, { title: "Timing", closeButtonLabel: "Close", opened: props.visible, onClose: () => props.onCancel() },
|
|
72
67
|
React.createElement("div", { style: { padding: '5px 20px', textAlign: 'left' } },
|
|
73
68
|
React.createElement(FormSection, { title: "Starts on", htmlFor: 'timing-dialog-start' },
|
|
74
69
|
React.createElement(DateTimeInput, { name: 'timing-dialog-start', onChange: (newValue) => setStart(newValue) })),
|
|
75
70
|
React.createElement(FormSection, { title: "Repeat every", htmlFor: 'timing-dialog-period' },
|
|
76
|
-
React.createElement(
|
|
77
|
-
React.createElement(
|
|
78
|
-
React.createElement(
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
71
|
+
React.createElement(Group, { spacing: "xs", grow: true, noWrap: true },
|
|
72
|
+
React.createElement(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)) }),
|
|
73
|
+
React.createElement(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: [
|
|
74
|
+
{ label: 'day', value: 'd' },
|
|
75
|
+
{ label: 'week', value: 'wk' },
|
|
76
|
+
{ label: 'month', value: 'mo' },
|
|
77
|
+
{ label: 'year', value: 'a' },
|
|
78
|
+
] }))),
|
|
83
79
|
React.createElement(FormSection, { title: "Repeat on" },
|
|
84
|
-
React.createElement(
|
|
80
|
+
React.createElement(Group, { spacing: "xs", grow: true, noWrap: true }, daysOfWeek.map((day) => (React.createElement(React.Fragment, { key: day },
|
|
85
81
|
React.createElement("label", { htmlFor: 'timing-dialog-repeat-' + day }, day.charAt(0).toUpperCase()),
|
|
86
|
-
React.createElement(Checkbox, { name: 'timing-dialog-repeat-' + day, onChange: (
|
|
82
|
+
React.createElement(Checkbox, { id: 'timing-dialog-repeat-' + day, name: 'timing-dialog-repeat-' + day, onChange: (e) => setDayOfWeek(day, e.currentTarget.checked) }))))))),
|
|
83
|
+
React.createElement(Button, { onClick: () => props.onOk(value) }, "OK")));
|
|
87
84
|
}
|
|
88
85
|
|
|
89
86
|
export { TimingInput };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimingInput.js","sources":["../../src/TimingInput.tsx"],"sourcesContent":["import { formatTiming } from '@medplum/core';\nimport { Timing, TimingRepeat } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { Button } from './Button';\nimport { Checkbox } from './Checkbox';\nimport { DateTimeInput } from './DateTimeInput';\nimport { Dialog } from './Dialog';\nimport { FormSection } from './FormSection';\nimport { Input } from './Input';\nimport { InputRow } from './InputRow';\nimport { Select } from './Select';\n\nconst daysOfWeek = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];\n\ntype DayOfWeek = 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat';\n\nexport interface TimingInputProps {\n name: string;\n defaultValue?: Timing;\n onChange?: (newValue: Timing) => void;\n}\n\nexport function TimingInput(props: TimingInputProps): JSX.Element {\n const [value, setValue] = useState<Timing>(props.defaultValue || {});\n const [open, setOpen] = useState(false);\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n return (\n <>\n <InputRow>\n <span>{formatTiming(valueRef.current) || 'No repeat'}</span>\n <Button onClick={() => setOpen(true)}>Edit</Button>\n </InputRow>\n <TimingEditorDialog\n visible={open}\n defaultValue={valueRef.current}\n onOk={(newValue) => {\n if (props.onChange) {\n props.onChange(newValue);\n }\n setValue(newValue);\n setOpen(false);\n }}\n onCancel={() => setOpen(false)}\n />\n </>\n );\n}\n\ninterface TimingEditorDialogProps {\n visible: boolean;\n defaultValue?: Timing;\n onOk: (newValue: Timing) => void;\n onCancel: () => void;\n}\n\nfunction TimingEditorDialog(props: TimingEditorDialogProps): JSX.Element {\n const [value, setValue] = useState<Timing>(props.defaultValue || {});\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n function setStart(newStart: string): void {\n setValue({ ...valueRef.current, event: [newStart] });\n }\n\n function setRepeat(repeat: TimingRepeat): void {\n setValue({ ...valueRef.current, repeat });\n }\n\n function setPeriod(newPeriod: number | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, period: newPeriod });\n }\n\n function setPeriodUnit(newPeriodUnit: 'a' | 's' | 'min' | 'h' | 'd' | 'wk' | 'mo' | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, periodUnit: newPeriodUnit });\n }\n\n function setDayOfWeek(day: DayOfWeek, enabled: boolean): void {\n if (enabled) {\n addDayOfWeek(day);\n } else {\n removeDayOfWeek(day);\n }\n }\n\n function addDayOfWeek(day: DayOfWeek): void {\n const existing = valueRef.current?.repeat?.dayOfWeek || [];\n if (!existing.includes(day)) {\n setRepeat({ ...valueRef.current?.repeat, dayOfWeek: [...existing, day] });\n }\n }\n\n function removeDayOfWeek(day: DayOfWeek): void {\n const existing = valueRef.current?.repeat?.dayOfWeek || [];\n if (existing.includes(day)) {\n setRepeat({ ...valueRef.current?.repeat, dayOfWeek: existing.filter((d) => d !== day) });\n }\n }\n\n return (\n <Dialog title=\"Timing\" visible={props.visible} onOk={() => props.onOk(value)} onCancel={() => props.onCancel()}>\n <div style={{ padding: '5px 20px', textAlign: 'left' }}>\n <FormSection title=\"Starts on\" htmlFor={'timing-dialog-start'}>\n <DateTimeInput name={'timing-dialog-start'} onChange={(newValue) => setStart(newValue)} />\n </FormSection>\n <FormSection title=\"Repeat every\" htmlFor={'timing-dialog-period'}>\n <InputRow>\n <Input\n type=\"number\"\n step={1}\n name={'timing-dialog-period'}\n defaultValue={value?.repeat?.period}\n onChange={(newValue) => setPeriod(parseInt(newValue))}\n />\n <Select\n name={'timing-dialog-periodUnit'}\n defaultValue={value?.repeat?.periodUnit}\n onChange={(newValue) => setPeriodUnit(newValue as 'a' | 'd' | 'wk' | 'mo' | undefined)}\n >\n <option value=\"d\">day</option>\n <option value=\"wk\">week</option>\n <option value=\"mo\">month</option>\n <option value=\"a\">year</option>\n </Select>\n </InputRow>\n </FormSection>\n <FormSection title=\"Repeat on\">\n <InputRow>\n {daysOfWeek.map((day) => (\n <React.Fragment key={day}>\n <label htmlFor={'timing-dialog-repeat-' + day}>{day.charAt(0).toUpperCase()}</label>\n <Checkbox\n name={'timing-dialog-repeat-' + day}\n onChange={(newValue) => setDayOfWeek(day as DayOfWeek, newValue)}\n />\n </React.Fragment>\n ))}\n </InputRow>\n </FormSection>\n </div>\n </Dialog>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TimingInput.js","sources":["../../src/TimingInput.tsx"],"sourcesContent":["import { Button, Checkbox, Group, Modal, NativeSelect, TextInput } from '@mantine/core';\nimport { formatTiming } from '@medplum/core';\nimport { Timing, TimingRepeat } from '@medplum/fhirtypes';\nimport React, { useRef, useState } from 'react';\nimport { DateTimeInput } from './DateTimeInput';\nimport { FormSection } from './FormSection';\n\nconst daysOfWeek = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];\n\ntype DayOfWeek = 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat';\n\nexport interface TimingInputProps {\n name: string;\n defaultValue?: Timing;\n onChange?: (newValue: Timing) => void;\n}\n\nexport function TimingInput(props: TimingInputProps): JSX.Element {\n const [value, setValue] = useState<Timing>(props.defaultValue || {});\n const [open, setOpen] = useState(false);\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n return (\n <>\n <Group spacing=\"xs\" grow noWrap>\n <span>{formatTiming(valueRef.current) || 'No repeat'}</span>\n <Button onClick={() => setOpen(true)}>Edit</Button>\n </Group>\n <TimingEditorDialog\n visible={open}\n defaultValue={valueRef.current}\n onOk={(newValue) => {\n if (props.onChange) {\n props.onChange(newValue);\n }\n setValue(newValue);\n setOpen(false);\n }}\n onCancel={() => setOpen(false)}\n />\n </>\n );\n}\n\ninterface TimingEditorDialogProps {\n visible: boolean;\n defaultValue?: Timing;\n onOk: (newValue: Timing) => void;\n onCancel: () => void;\n}\n\nfunction TimingEditorDialog(props: TimingEditorDialogProps): JSX.Element {\n const [value, setValue] = useState<Timing>(props.defaultValue || {});\n\n const valueRef = useRef<Timing>();\n valueRef.current = value;\n\n function setStart(newStart: string): void {\n setValue({ ...valueRef.current, event: [newStart] });\n }\n\n function setRepeat(repeat: TimingRepeat): void {\n setValue({ ...valueRef.current, repeat });\n }\n\n function setPeriod(newPeriod: number | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, period: newPeriod });\n }\n\n function setPeriodUnit(newPeriodUnit: 'a' | 's' | 'min' | 'h' | 'd' | 'wk' | 'mo' | undefined): void {\n setRepeat({ ...valueRef.current?.repeat, periodUnit: newPeriodUnit });\n }\n\n function setDayOfWeek(day: DayOfWeek, enabled: boolean): void {\n if (enabled) {\n addDayOfWeek(day);\n } else {\n removeDayOfWeek(day);\n }\n }\n\n function addDayOfWeek(day: DayOfWeek): void {\n const existing = valueRef.current?.repeat?.dayOfWeek || [];\n if (!existing.includes(day)) {\n setRepeat({ ...valueRef.current?.repeat, dayOfWeek: [...existing, day] });\n }\n }\n\n function removeDayOfWeek(day: DayOfWeek): void {\n const existing = valueRef.current?.repeat?.dayOfWeek || [];\n if (existing.includes(day)) {\n setRepeat({ ...valueRef.current?.repeat, dayOfWeek: existing.filter((d) => d !== day) });\n }\n }\n\n return (\n <Modal title=\"Timing\" closeButtonLabel=\"Close\" opened={props.visible} onClose={() => props.onCancel()}>\n <div style={{ padding: '5px 20px', textAlign: 'left' }}>\n <FormSection title=\"Starts on\" htmlFor={'timing-dialog-start'}>\n <DateTimeInput name={'timing-dialog-start'} onChange={(newValue) => setStart(newValue)} />\n </FormSection>\n <FormSection title=\"Repeat every\" htmlFor={'timing-dialog-period'}>\n <Group spacing=\"xs\" grow noWrap>\n <TextInput\n type=\"number\"\n step={1}\n id=\"timing-dialog-period\"\n name=\"timing-dialog-period\"\n defaultValue={value?.repeat?.period}\n onChange={(e) => setPeriod(parseInt(e.currentTarget.value))}\n />\n <NativeSelect\n id=\"timing-dialog-periodUnit\"\n name=\"timing-dialog-periodUnit\"\n defaultValue={value?.repeat?.periodUnit}\n onChange={(e) => setPeriodUnit(e.currentTarget.value as 'a' | 'd' | 'wk' | 'mo' | undefined)}\n data={[\n { label: 'day', value: 'd' },\n { label: 'week', value: 'wk' },\n { label: 'month', value: 'mo' },\n { label: 'year', value: 'a' },\n ]}\n />\n </Group>\n </FormSection>\n <FormSection title=\"Repeat on\">\n <Group spacing=\"xs\" grow noWrap>\n {daysOfWeek.map((day) => (\n <React.Fragment key={day}>\n <label htmlFor={'timing-dialog-repeat-' + day}>{day.charAt(0).toUpperCase()}</label>\n <Checkbox\n id={'timing-dialog-repeat-' + day}\n name={'timing-dialog-repeat-' + day}\n onChange={(e) => setDayOfWeek(day as DayOfWeek, e.currentTarget.checked)}\n />\n </React.Fragment>\n ))}\n </Group>\n </FormSection>\n </div>\n <Button onClick={() => props.onOk(value)}>OK</Button>\n </Modal>\n );\n}\n"],"names":[],"mappings":";;;;;;AAOA,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAU/D,SAAU,WAAW,CAAC,KAAuB,EAAA;AACjD,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAS,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IACrE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AAExC,IAAA,MAAM,QAAQ,GAAG,MAAM,EAAU,CAAC;AAClC,IAAA,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;AAEzB,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA;QACE,KAAC,CAAA,aAAA,CAAA,KAAK,IAAC,OAAO,EAAC,IAAI,EAAC,IAAI,QAAC,MAAM,EAAA,IAAA,EAAA;YAC7B,KAAO,CAAA,aAAA,CAAA,MAAA,EAAA,IAAA,EAAA,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,WAAW,CAAQ;AAC5D,YAAA,KAAA,CAAA,aAAA,CAAC,MAAM,EAAA,EAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAAA,EAAA,MAAA,CAAe,CAC7C;AACR,QAAA,KAAA,CAAA,aAAA,CAAC,kBAAkB,EACjB,EAAA,OAAO,EAAE,IAAI,EACb,YAAY,EAAE,QAAQ,CAAC,OAAO,EAC9B,IAAI,EAAE,CAAC,QAAQ,KAAI;gBACjB,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,oBAAA,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC1B,iBAAA;gBACD,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACnB,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,aAAC,EACD,QAAQ,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,EAC9B,CAAA,CACD,EACH;AACJ,CAAC;AASD,SAAS,kBAAkB,CAAC,KAA8B,EAAA;;AACxD,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAS,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;AAErE,IAAA,MAAM,QAAQ,GAAG,MAAM,EAAU,CAAC;AAClC,IAAA,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;IAEzB,SAAS,QAAQ,CAAC,QAAgB,EAAA;QAChC,QAAQ,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAM,QAAQ,CAAC,OAAO,CAAA,EAAA,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAA,CAAA,CAAG,CAAC;KACtD;IAED,SAAS,SAAS,CAAC,MAAoB,EAAA;AACrC,QAAA,QAAQ,iCAAM,QAAQ,CAAC,OAAO,CAAE,EAAA,EAAA,MAAM,IAAG,CAAC;KAC3C;IAED,SAAS,SAAS,CAAC,SAA6B,EAAA;;AAC9C,QAAA,SAAS,CAAM,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,CAAA,EAAA,GAAA,QAAQ,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,CAAA,EAAA,EAAE,MAAM,EAAE,SAAS,EAAA,CAAA,CAAG,CAAC;KAC/D;IAED,SAAS,aAAa,CAAC,aAAsE,EAAA;;AAC3F,QAAA,SAAS,CAAM,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,CAAA,EAAA,GAAA,QAAQ,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,CAAA,EAAA,EAAE,UAAU,EAAE,aAAa,EAAA,CAAA,CAAG,CAAC;KACvE;AAED,IAAA,SAAS,YAAY,CAAC,GAAc,EAAE,OAAgB,EAAA;AACpD,QAAA,IAAI,OAAO,EAAE;YACX,YAAY,CAAC,GAAG,CAAC,CAAC;AACnB,SAAA;AAAM,aAAA;YACL,eAAe,CAAC,GAAG,CAAC,CAAC;AACtB,SAAA;KACF;IAED,SAAS,YAAY,CAAC,GAAc,EAAA;;AAClC,QAAA,MAAM,QAAQ,GAAG,CAAA,CAAA,EAAA,GAAA,MAAA,QAAQ,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,SAAS,KAAI,EAAE,CAAC;AAC3D,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC3B,YAAA,SAAS,iCAAM,CAAA,EAAA,GAAA,QAAQ,CAAC,OAAO,0CAAE,MAAM,CAAA,EAAA,EAAE,SAAS,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,CAAC,IAAG,CAAC;AAC3E,SAAA;KACF;IAED,SAAS,eAAe,CAAC,GAAc,EAAA;;AACrC,QAAA,MAAM,QAAQ,GAAG,CAAA,CAAA,EAAA,GAAA,MAAA,QAAQ,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,SAAS,KAAI,EAAE,CAAC;AAC3D,QAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YAC1B,SAAS,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAM,CAAA,EAAA,GAAA,QAAQ,CAAC,OAAO,0CAAE,MAAM,CAAA,EAAA,EAAE,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAA,CAAA,CAAG,CAAC;AAC1F,SAAA;KACF;IAED,QACE,KAAC,CAAA,aAAA,CAAA,KAAK,EAAC,EAAA,KAAK,EAAC,QAAQ,EAAC,gBAAgB,EAAC,OAAO,EAAC,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAA;QACnG,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,EAAA;YACpD,KAAC,CAAA,aAAA,CAAA,WAAW,IAAC,KAAK,EAAC,WAAW,EAAC,OAAO,EAAE,qBAAqB,EAAA;AAC3D,gBAAA,KAAA,CAAA,aAAA,CAAC,aAAa,EAAC,EAAA,IAAI,EAAE,qBAAqB,EAAE,QAAQ,EAAE,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,CAAC,GAAI,CAC9E;YACd,KAAC,CAAA,aAAA,CAAA,WAAW,IAAC,KAAK,EAAC,cAAc,EAAC,OAAO,EAAE,sBAAsB,EAAA;gBAC/D,KAAC,CAAA,aAAA,CAAA,KAAK,IAAC,OAAO,EAAC,IAAI,EAAC,IAAI,QAAC,MAAM,EAAA,IAAA,EAAA;oBAC7B,KAAC,CAAA,aAAA,CAAA,SAAS,IACR,IAAI,EAAC,QAAQ,EACb,IAAI,EAAE,CAAC,EACP,EAAE,EAAC,sBAAsB,EACzB,IAAI,EAAC,sBAAsB,EAC3B,YAAY,EAAE,CAAA,EAAA,GAAA,KAAK,KAAL,IAAA,IAAA,KAAK,uBAAL,KAAK,CAAE,MAAM,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,MAAM,EACnC,QAAQ,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAC3D,CAAA;AACF,oBAAA,KAAA,CAAA,aAAA,CAAC,YAAY,EACX,EAAA,EAAE,EAAC,0BAA0B,EAC7B,IAAI,EAAC,0BAA0B,EAC/B,YAAY,EAAE,CAAA,EAAA,GAAA,KAAK,aAAL,KAAK,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAL,KAAK,CAAE,MAAM,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,UAAU,EACvC,QAAQ,EAAE,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,KAA4C,CAAC,EAC5F,IAAI,EAAE;AACJ,4BAAA,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE;AAC5B,4BAAA,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE;AAC9B,4BAAA,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;AAC/B,4BAAA,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE;AAC9B,yBAAA,EAAA,CACD,CACI,CACI;AACd,YAAA,KAAA,CAAA,aAAA,CAAC,WAAW,EAAA,EAAC,KAAK,EAAC,WAAW,EAAA;gBAC5B,KAAC,CAAA,aAAA,CAAA,KAAK,EAAC,EAAA,OAAO,EAAC,IAAI,EAAC,IAAI,EAAC,IAAA,EAAA,MAAM,EAC5B,IAAA,EAAA,EAAA,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,MAClB,KAAA,CAAA,aAAA,CAAC,KAAK,CAAC,QAAQ,EAAA,EAAC,GAAG,EAAE,GAAG,EAAA;AACtB,oBAAA,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,EAAO,OAAO,EAAE,uBAAuB,GAAG,GAAG,EAAG,EAAA,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAS;AACpF,oBAAA,KAAA,CAAA,aAAA,CAAC,QAAQ,EACP,EAAA,EAAE,EAAE,uBAAuB,GAAG,GAAG,EACjC,IAAI,EAAE,uBAAuB,GAAG,GAAG,EACnC,QAAQ,EAAE,CAAC,CAAC,KAAK,YAAY,CAAC,GAAgB,EAAE,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,EACxE,CAAA,CACa,CAClB,CAAC,CACI,CACI,CACV;AACN,QAAA,KAAA,CAAA,aAAA,CAAC,MAAM,EAAC,EAAA,OAAO,EAAE,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAa,EAAA,IAAA,CAAA,CAC/C,EACR;AACJ;;;;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';
|
|
3
|
+
export interface ValueSetAutocompleteProps {
|
|
4
|
+
property: ElementDefinition;
|
|
5
|
+
name: string;
|
|
6
|
+
placeholder?: string;
|
|
7
|
+
defaultValue?: ValueSetExpansionContains;
|
|
8
|
+
onChange?: (value: ValueSetExpansionContains) => void;
|
|
9
|
+
}
|
|
10
|
+
export declare function ValueSetAutocomplete(props: ValueSetAutocompleteProps): JSX.Element;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { __awaiter } from './node_modules/tslib/tslib.es6.js';
|
|
2
|
+
import { Autocomplete, Loader } from '@mantine/core';
|
|
3
|
+
import React, { useState } from 'react';
|
|
4
|
+
import { useMedplum } from './MedplumProvider.js';
|
|
5
|
+
|
|
6
|
+
function ValueSetAutocomplete(props) {
|
|
7
|
+
const medplum = useMedplum();
|
|
8
|
+
const defaultValue = props.defaultValue;
|
|
9
|
+
const [value, setValue] = useState(defaultValue);
|
|
10
|
+
const [text, setText] = useState(defaultValue ? getDisplay(defaultValue) : '');
|
|
11
|
+
const [loading, setLoading] = useState(false);
|
|
12
|
+
const [data, setData] = useState([]);
|
|
13
|
+
function loadValues(input) {
|
|
14
|
+
var _a, _b;
|
|
15
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
16
|
+
setLoading(true);
|
|
17
|
+
const system = (_a = props.property.binding) === null || _a === void 0 ? void 0 : _a.valueSet;
|
|
18
|
+
const valueSet = yield medplum.searchValueSet(system, input);
|
|
19
|
+
const valueSetElements = (_b = valueSet.expansion) === null || _b === void 0 ? void 0 : _b.contains;
|
|
20
|
+
setData(valueSetElements.map((element) => ({ value: getDisplay(element), element })));
|
|
21
|
+
setLoading(false);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function handleChange(val) {
|
|
25
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
26
|
+
setText(val);
|
|
27
|
+
return loadValues(val);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function handleSelect(item) {
|
|
31
|
+
setValue(item.element);
|
|
32
|
+
setText(item.value);
|
|
33
|
+
setData([]);
|
|
34
|
+
if (props.onChange) {
|
|
35
|
+
props.onChange(item.element);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function handleBlur(val) {
|
|
39
|
+
if (!value) {
|
|
40
|
+
const unstructured = {
|
|
41
|
+
display: val,
|
|
42
|
+
code: val,
|
|
43
|
+
};
|
|
44
|
+
setValue(unstructured);
|
|
45
|
+
if (props.onChange) {
|
|
46
|
+
props.onChange(unstructured);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return (React.createElement(Autocomplete, { value: text, data: data, placeholder: props.placeholder, onFocus: () => loadValues(text), onBlur: () => handleBlur(text), onChange: handleChange, onItemSubmit: handleSelect, rightSection: loading ? React.createElement(Loader, { size: 16 }) : null }));
|
|
51
|
+
}
|
|
52
|
+
function getDisplay(item) {
|
|
53
|
+
return item.display || item.code || '';
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export { ValueSetAutocomplete };
|
|
57
|
+
//# sourceMappingURL=ValueSetAutocomplete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValueSetAutocomplete.js","sources":["../../src/ValueSetAutocomplete.tsx"],"sourcesContent":["import { Autocomplete, Loader } from '@mantine/core';\nimport { ElementDefinition, ValueSetExpansionContains } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { useMedplum } from './MedplumProvider';\n\nexport interface ValueSetAutocompleteProps {\n property: ElementDefinition;\n name: string;\n placeholder?: string;\n defaultValue?: ValueSetExpansionContains;\n onChange?: (value: ValueSetExpansionContains) => void;\n}\n\ninterface ValueSetAutocompleteItem {\n value: string;\n element: ValueSetExpansionContains;\n}\n\nexport function ValueSetAutocomplete(props: ValueSetAutocompleteProps): JSX.Element {\n const medplum = useMedplum();\n const defaultValue = props.defaultValue;\n const [value, setValue] = useState<ValueSetExpansionContains | undefined>(defaultValue);\n const [text, setText] = useState<string>(defaultValue ? getDisplay(defaultValue) : '');\n const [loading, setLoading] = useState(false);\n const [data, setData] = useState<ValueSetAutocompleteItem[]>([]);\n\n async function loadValues(input: string): Promise<void> {\n setLoading(true);\n const system = props.property.binding?.valueSet as string;\n const valueSet = await medplum.searchValueSet(system, input);\n const valueSetElements = valueSet.expansion?.contains as ValueSetExpansionContains[];\n setData(valueSetElements.map((element) => ({ value: getDisplay(element), element })));\n setLoading(false);\n }\n\n async function handleChange(val: string): Promise<void> {\n setText(val);\n return loadValues(val);\n }\n\n function handleSelect(item: ValueSetAutocompleteItem): void {\n setValue(item.element);\n setText(item.value);\n setData([]);\n if (props.onChange) {\n props.onChange(item.element);\n }\n }\n\n function handleBlur(val: string): void {\n if (!value) {\n const unstructured: ValueSetExpansionContains = {\n display: val,\n code: val,\n };\n setValue(unstructured);\n if (props.onChange) {\n props.onChange(unstructured);\n }\n }\n }\n\n return (\n <Autocomplete\n value={text}\n data={data}\n placeholder={props.placeholder}\n onFocus={() => loadValues(text)}\n onBlur={() => handleBlur(text)}\n onChange={handleChange}\n onItemSubmit={handleSelect}\n rightSection={loading ? <Loader size={16} /> : null}\n />\n );\n}\n\nfunction getDisplay(item: ValueSetExpansionContains): string {\n return item.display || item.code || '';\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
import { __awaiter } from '../node_modules/tslib/tslib.es6.js';
|
|
2
|
+
import { Group, Divider, Stack, TextInput, PasswordInput, Anchor, Checkbox, Button } from '@mantine/core';
|
|
2
3
|
import React, { useState } from 'react';
|
|
3
|
-
import { Button } from '../Button.js';
|
|
4
4
|
import { Form } from '../Form.js';
|
|
5
|
-
import { FormSection } from '../FormSection.js';
|
|
6
5
|
import { getGoogleClientId, GoogleButton } from '../GoogleButton.js';
|
|
7
|
-
import { Input } from '../Input.js';
|
|
8
|
-
import { MedplumLink } from '../MedplumLink.js';
|
|
9
6
|
import { useMedplum } from '../MedplumProvider.js';
|
|
10
|
-
import { getIssuesForExpression } from '../utils/outcomes.js';
|
|
7
|
+
import { getIssuesForExpression, getErrorsForInput } from '../utils/outcomes.js';
|
|
11
8
|
|
|
12
9
|
function AuthenticationForm(props) {
|
|
13
10
|
const medplum = useMedplum();
|
|
@@ -43,7 +40,7 @@ function AuthenticationForm(props) {
|
|
|
43
40
|
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));
|
|
44
41
|
}))),
|
|
45
42
|
googleClientId && (React.createElement(React.Fragment, null,
|
|
46
|
-
React.createElement(
|
|
43
|
+
React.createElement(Group, { position: "center", p: "xl", style: { height: 70 } },
|
|
47
44
|
React.createElement(GoogleButton, { googleClientId: googleClientId, handleGoogleCredential: (response) => {
|
|
48
45
|
startPkce()
|
|
49
46
|
.then(() => medplum.startGoogleLogin({
|
|
@@ -59,20 +56,15 @@ function AuthenticationForm(props) {
|
|
|
59
56
|
.then(props.handleAuthResponse)
|
|
60
57
|
.catch(setOutcome);
|
|
61
58
|
} })),
|
|
62
|
-
React.createElement(
|
|
63
|
-
React.createElement(
|
|
64
|
-
React.createElement(
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
React.createElement("div", null,
|
|
72
|
-
React.createElement("input", { type: "checkbox", id: "remember", name: "remember", value: "true" }),
|
|
73
|
-
React.createElement("label", { htmlFor: "remember" }, "Remember me")),
|
|
74
|
-
React.createElement("div", null,
|
|
75
|
-
React.createElement(Button, { type: "submit", testid: "submit" }, "Sign in")))));
|
|
59
|
+
React.createElement(Divider, { label: "or", labelPosition: "center", my: "lg" }))),
|
|
60
|
+
React.createElement(Stack, { spacing: "xl" },
|
|
61
|
+
React.createElement(TextInput, { name: "email", type: "email", label: "Email", placeholder: "name@domain.com", required: true, autoFocus: true, error: getErrorsForInput(outcome, 'email') }),
|
|
62
|
+
React.createElement(PasswordInput, { name: "password", type: "password", label: "Password", autoComplete: "off", required: true, error: getErrorsForInput(outcome, 'password') })),
|
|
63
|
+
React.createElement(Group, { position: "apart", mt: "xl", noWrap: true },
|
|
64
|
+
props.onForgotPassword && (React.createElement(Anchor, { component: "button", type: "button", color: "dimmed", onClick: props.onForgotPassword, size: "xs" }, "Forgot password")),
|
|
65
|
+
props.onRegister && (React.createElement(Anchor, { component: "button", type: "button", color: "dimmed", onClick: props.onRegister, size: "xs" }, "Register")),
|
|
66
|
+
React.createElement(Checkbox, { name: "remember", label: "Remember me", size: "xs" }),
|
|
67
|
+
React.createElement(Button, { type: "submit" }, "Sign in"))));
|
|
76
68
|
}
|
|
77
69
|
|
|
78
70
|
export { AuthenticationForm };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthenticationForm.js","sources":["../../../src/auth/AuthenticationForm.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"AuthenticationForm.js","sources":["../../../src/auth/AuthenticationForm.tsx"],"sourcesContent":["import { Anchor, Button, Checkbox, Divider, Group, PasswordInput, Stack, TextInput } from '@mantine/core';\nimport { GoogleCredentialResponse, LoginAuthenticationResponse } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Form } from '../Form';\nimport { getGoogleClientId, GoogleButton } from '../GoogleButton';\nimport { useMedplum } from '../MedplumProvider';\nimport { getErrorsForInput, getIssuesForExpression } from '../utils/outcomes';\n\nexport interface AuthenticationFormProps {\n readonly projectId?: string;\n readonly clientId?: string;\n readonly scope?: string;\n readonly nonce?: string;\n readonly googleClientId?: string;\n readonly generatePkce?: boolean;\n readonly codeChallenge?: string;\n readonly codeChallengeMethod?: string;\n readonly onForgotPassword?: () => void;\n readonly onRegister?: () => void;\n readonly handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n readonly children?: React.ReactNode;\n}\n\nexport function AuthenticationForm(props: AuthenticationFormProps): JSX.Element {\n const medplum = useMedplum();\n const googleClientId = getGoogleClientId(props.googleClientId);\n const [outcome, setOutcome] = useState<OperationOutcome>();\n const issues = getIssuesForExpression(outcome, undefined);\n\n async function startPkce(): Promise<void> {\n if (props.generatePkce) {\n await medplum.startPkce();\n }\n }\n\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={(formData: Record<string, string>) => {\n startPkce()\n .then(() =>\n medplum.startLogin({\n projectId: props.projectId,\n clientId: props.clientId,\n scope: props.scope,\n nonce: props.nonce,\n codeChallenge: props.codeChallenge,\n codeChallengeMethod: props.codeChallengeMethod,\n email: formData.email,\n password: formData.password,\n remember: formData.remember === 'true',\n })\n )\n .then(props.handleAuthResponse)\n .catch(setOutcome);\n }}\n >\n <div className=\"medplum-center\">{props.children}</div>\n {issues && (\n <div className=\"medplum-input-error\">\n {issues.map((issue) => (\n <div data-testid=\"text-field-error\" key={issue.details?.text}>\n {issue.details?.text}\n </div>\n ))}\n </div>\n )}\n {googleClientId && (\n <>\n <Group position=\"center\" p=\"xl\" style={{ height: 70 }}>\n <GoogleButton\n googleClientId={googleClientId}\n handleGoogleCredential={(response: GoogleCredentialResponse) => {\n startPkce()\n .then(() =>\n medplum.startGoogleLogin({\n projectId: props.projectId,\n clientId: props.clientId,\n scope: props.scope,\n nonce: props.nonce,\n codeChallenge: props.codeChallenge,\n codeChallengeMethod: props.codeChallengeMethod,\n googleClientId: response.clientId,\n googleCredential: response.credential,\n })\n )\n .then(props.handleAuthResponse)\n .catch(setOutcome);\n }}\n />\n </Group>\n <Divider label=\"or\" labelPosition=\"center\" my=\"lg\" />\n </>\n )}\n <Stack spacing=\"xl\">\n <TextInput\n name=\"email\"\n type=\"email\"\n label=\"Email\"\n placeholder=\"name@domain.com\"\n required={true}\n autoFocus={true}\n error={getErrorsForInput(outcome, 'email')}\n />\n <PasswordInput\n name=\"password\"\n type=\"password\"\n label=\"Password\"\n autoComplete=\"off\"\n required={true}\n error={getErrorsForInput(outcome, 'password')}\n />\n </Stack>\n <Group position=\"apart\" mt=\"xl\" noWrap>\n {props.onForgotPassword && (\n <Anchor component=\"button\" type=\"button\" color=\"dimmed\" onClick={props.onForgotPassword} size=\"xs\">\n Forgot password\n </Anchor>\n )}\n {props.onRegister && (\n <Anchor component=\"button\" type=\"button\" color=\"dimmed\" onClick={props.onRegister} size=\"xs\">\n Register\n </Anchor>\n )}\n <Checkbox name=\"remember\" label=\"Remember me\" size=\"xs\" />\n <Button type=\"submit\">Sign in</Button>\n </Group>\n </Form>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
+
import { Stack, Text, UnstyledButton, Group, Avatar } from '@mantine/core';
|
|
1
2
|
import React from 'react';
|
|
2
|
-
import { Avatar } from '../Avatar.js';
|
|
3
3
|
import { Logo } from '../Logo.js';
|
|
4
4
|
import { useMedplum } from '../MedplumProvider.js';
|
|
5
5
|
|
|
6
6
|
function ChooseProfileForm(props) {
|
|
7
7
|
const medplum = useMedplum();
|
|
8
|
-
return (React.createElement(
|
|
8
|
+
return (React.createElement(Stack, null,
|
|
9
9
|
React.createElement("div", { className: "medplum-center" },
|
|
10
10
|
React.createElement(Logo, { size: 32 }),
|
|
11
|
-
React.createElement("
|
|
11
|
+
React.createElement(Text, { size: "lg", weight: 500 }, "Choose profile")),
|
|
12
12
|
props.memberships.map((membership) => {
|
|
13
|
-
var _a, _b
|
|
14
|
-
return (React.createElement(
|
|
13
|
+
var _a, _b;
|
|
14
|
+
return (React.createElement(UnstyledButton, { key: membership.id, onClick: () => {
|
|
15
15
|
medplum
|
|
16
16
|
.post('auth/profile', {
|
|
17
17
|
login: props.login,
|
|
@@ -20,11 +20,11 @@ function ChooseProfileForm(props) {
|
|
|
20
20
|
.then(props.handleAuthResponse)
|
|
21
21
|
.catch(console.log);
|
|
22
22
|
} },
|
|
23
|
-
React.createElement(
|
|
24
|
-
React.createElement(Avatar, {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
React.createElement(Group, null,
|
|
24
|
+
React.createElement(Avatar, { radius: "xl" }),
|
|
25
|
+
React.createElement("div", { style: { flex: 1 } },
|
|
26
|
+
React.createElement(Text, { size: "sm", weight: 500 }, (_a = membership.profile) === null || _a === void 0 ? void 0 : _a.display),
|
|
27
|
+
React.createElement(Text, { color: "dimmed", size: "xs" }, (_b = membership.project) === null || _b === void 0 ? void 0 : _b.display)))));
|
|
28
28
|
})));
|
|
29
29
|
}
|
|
30
30
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChooseProfileForm.js","sources":["../../../src/auth/ChooseProfileForm.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"ChooseProfileForm.js","sources":["../../../src/auth/ChooseProfileForm.tsx"],"sourcesContent":["import { Avatar, Group, Stack, Text, UnstyledButton } from '@mantine/core';\nimport { ProjectMembership } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Logo } from '../Logo';\nimport { useMedplum } from '../MedplumProvider';\n\nexport interface ChooseProfileFormProps {\n login: string;\n memberships: ProjectMembership[];\n handleAuthResponse: (response: any) => void;\n}\n\nexport function ChooseProfileForm(props: ChooseProfileFormProps): JSX.Element {\n const medplum = useMedplum();\n return (\n <Stack>\n <div className=\"medplum-center\">\n <Logo size={32} />\n <Text size=\"lg\" weight={500}>\n Choose profile\n </Text>\n </div>\n {props.memberships.map((membership: ProjectMembership) => (\n <UnstyledButton\n key={membership.id}\n onClick={() => {\n medplum\n .post('auth/profile', {\n login: props.login,\n profile: membership.id,\n })\n .then(props.handleAuthResponse)\n .catch(console.log);\n }}\n >\n <Group>\n <Avatar radius=\"xl\" />\n <div style={{ flex: 1 }}>\n <Text size=\"sm\" weight={500}>\n {membership.profile?.display}\n </Text>\n <Text color=\"dimmed\" size=\"xs\">\n {membership.project?.display}\n </Text>\n </div>\n </Group>\n </UnstyledButton>\n ))}\n </Stack>\n );\n}\n"],"names":[],"mappings":";;;;;AAYM,SAAU,iBAAiB,CAAC,KAA6B,EAAA;AAC7D,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,QACE,oBAAC,KAAK,EAAA,IAAA;QACJ,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,gBAAgB,EAAA;AAC7B,YAAA,KAAA,CAAA,aAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAE,EAAE,EAAI,CAAA;YAClB,KAAC,CAAA,aAAA,CAAA,IAAI,EAAC,EAAA,IAAI,EAAC,IAAI,EAAC,MAAM,EAAE,GAAG,EAAA,EAAA,gBAAA,CAEpB,CACH;QACL,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAA6B,KAAI;;AAAC,YAAA,QACxD,KAAA,CAAA,aAAA,CAAC,cAAc,EAAA,EACb,GAAG,EAAE,UAAU,CAAC,EAAE,EAClB,OAAO,EAAE,MAAK;oBACZ,OAAO;yBACJ,IAAI,CAAC,cAAc,EAAE;wBACpB,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,OAAO,EAAE,UAAU,CAAC,EAAE;qBACvB,CAAC;AACD,yBAAA,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;AAC9B,yBAAA,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;iBACvB,EAAA;AAED,gBAAA,KAAA,CAAA,aAAA,CAAC,KAAK,EAAA,IAAA;AACJ,oBAAA,KAAA,CAAA,aAAA,CAAC,MAAM,EAAA,EAAC,MAAM,EAAC,IAAI,EAAG,CAAA;AACtB,oBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAA;AACrB,wBAAA,KAAA,CAAA,aAAA,CAAC,IAAI,EAAC,EAAA,IAAI,EAAC,IAAI,EAAC,MAAM,EAAE,GAAG,EAAA,EACxB,MAAA,UAAU,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,OAAO,CACvB;wBACP,KAAC,CAAA,aAAA,CAAA,IAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,EAAC,IAAI,EAAA,EAC3B,MAAA,UAAU,CAAC,OAAO,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAO,CACvB,CACH,CACA,CACO,EAClB;SAAA,CAAC,CACI,EACR;AACJ;;;;"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { __awaiter } from '../node_modules/tslib/tslib.es6.js';
|
|
2
|
+
import { Stack, TextInput, Text, Group, Button } from '@mantine/core';
|
|
2
3
|
import React, { useState } from 'react';
|
|
3
|
-
import { Button } from '../Button.js';
|
|
4
4
|
import { Form } from '../Form.js';
|
|
5
|
-
import { FormSection } from '../FormSection.js';
|
|
6
|
-
import { Input } from '../Input.js';
|
|
7
5
|
import { Logo } from '../Logo.js';
|
|
8
6
|
import { useMedplum } from '../MedplumProvider.js';
|
|
7
|
+
import { getErrorsForInput } from '../utils/outcomes.js';
|
|
9
8
|
|
|
10
9
|
function NewProjectForm(props) {
|
|
11
10
|
const medplum = useMedplum();
|
|
@@ -24,18 +23,16 @@ function NewProjectForm(props) {
|
|
|
24
23
|
React.createElement("div", { className: "medplum-center" },
|
|
25
24
|
React.createElement(Logo, { size: 32 }),
|
|
26
25
|
React.createElement("h1", null, "Create project")),
|
|
27
|
-
React.createElement(
|
|
28
|
-
React.createElement(
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
React.createElement(
|
|
36
|
-
React.createElement("
|
|
37
|
-
React.createElement("div", null,
|
|
38
|
-
React.createElement(Button, { type: "submit", testid: "submit" }, "Create project")))));
|
|
26
|
+
React.createElement(Stack, { spacing: "xl" },
|
|
27
|
+
React.createElement(TextInput, { name: "projectName", label: "Project Name", placeholder: "My Project", required: true, autoFocus: true, error: getErrorsForInput(outcome, 'firstName') }),
|
|
28
|
+
React.createElement(Text, { color: "dimmed", size: "xs" },
|
|
29
|
+
"By clicking submit you agree to the Medplum ",
|
|
30
|
+
React.createElement("a", { href: "https://www.medplum.com/privacy" }, "Privacy\u00A0Policy"),
|
|
31
|
+
' and ',
|
|
32
|
+
React.createElement("a", { href: "https://www.medplum.com/terms" }, "Terms\u00A0of\u00A0Service"),
|
|
33
|
+
".")),
|
|
34
|
+
React.createElement(Group, { position: "right", mt: "xl", noWrap: true },
|
|
35
|
+
React.createElement(Button, { type: "submit" }, "Create project"))));
|
|
39
36
|
}
|
|
40
37
|
|
|
41
38
|
export { NewProjectForm };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NewProjectForm.js","sources":["../../../src/auth/NewProjectForm.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"NewProjectForm.js","sources":["../../../src/auth/NewProjectForm.tsx"],"sourcesContent":["import { Button, Group, Stack, Text, TextInput } from '@mantine/core';\nimport { LoginAuthenticationResponse } from '@medplum/core';\nimport { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { Form } from '../Form';\nimport { Logo } from '../Logo';\nimport { useMedplum } from '../MedplumProvider';\nimport { getErrorsForInput } from '../utils/outcomes';\n\nexport interface NewProjectFormProps {\n login: string;\n handleAuthResponse: (response: LoginAuthenticationResponse) => void;\n}\n\nexport function NewProjectForm(props: NewProjectFormProps): JSX.Element {\n const medplum = useMedplum();\n const [outcome, setOutcome] = useState<OperationOutcome | undefined>();\n return (\n <Form\n style={{ maxWidth: 400 }}\n onSubmit={async (formData: Record<string, string>) => {\n try {\n props.handleAuthResponse(\n await medplum.startNewProject({\n login: props.login,\n projectName: formData.projectName,\n })\n );\n } catch (err) {\n setOutcome(err as OperationOutcome);\n }\n }}\n >\n <div className=\"medplum-center\">\n <Logo size={32} />\n <h1>Create project</h1>\n </div>\n <Stack spacing=\"xl\">\n <TextInput\n name=\"projectName\"\n label=\"Project Name\"\n placeholder=\"My Project\"\n required={true}\n autoFocus={true}\n error={getErrorsForInput(outcome, 'firstName')}\n />\n <Text color=\"dimmed\" size=\"xs\">\n By clicking submit you agree to the Medplum <a href=\"https://www.medplum.com/privacy\">Privacy Policy</a>\n {' and '}\n <a href=\"https://www.medplum.com/terms\">Terms of Service</a>.\n </Text>\n </Stack>\n <Group position=\"right\" mt=\"xl\" noWrap>\n <Button type=\"submit\">Create project</Button>\n </Group>\n </Form>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AAcM,SAAU,cAAc,CAAC,KAA0B,EAAA;AACvD,IAAA,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAgC,CAAC;AACvE,IAAA,QACE,KAAC,CAAA,aAAA,CAAA,IAAI,EACH,EAAA,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EACxB,QAAQ,EAAE,CAAO,QAAgC,KAAI,SAAA,CAAA,IAAA,EAAA,KAAA,CAAA,EAAA,KAAA,CAAA,EAAA,aAAA;YACnD,IAAI;AACF,gBAAA,KAAK,CAAC,kBAAkB,CACtB,MAAM,OAAO,CAAC,eAAe,CAAC;oBAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,WAAW,EAAE,QAAQ,CAAC,WAAW;AAClC,iBAAA,CAAC,CACH,CAAC;AACH,aAAA;AAAC,YAAA,OAAO,GAAG,EAAE;gBACZ,UAAU,CAAC,GAAuB,CAAC,CAAC;AACrC,aAAA;AACH,SAAC,CAAA,EAAA;QAED,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,gBAAgB,EAAA;AAC7B,YAAA,KAAA,CAAA,aAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAE,EAAE,EAAI,CAAA;AAClB,YAAA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAA,gBAAA,CAAuB,CACnB;AACN,QAAA,KAAA,CAAA,aAAA,CAAC,KAAK,EAAA,EAAC,OAAO,EAAC,IAAI,EAAA;AACjB,YAAA,KAAA,CAAA,aAAA,CAAC,SAAS,EAAA,EACR,IAAI,EAAC,aAAa,EAClB,KAAK,EAAC,cAAc,EACpB,WAAW,EAAC,YAAY,EACxB,QAAQ,EAAE,IAAI,EACd,SAAS,EAAE,IAAI,EACf,KAAK,EAAE,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC,EAC9C,CAAA;YACF,KAAC,CAAA,aAAA,CAAA,IAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,EAAC,IAAI,EAAA;;gBACgB,KAAG,CAAA,aAAA,CAAA,GAAA,EAAA,EAAA,IAAI,EAAC,iCAAiC,EAAwB,EAAA,qBAAA,CAAA;gBAC5G,OAAO;gBACR,KAAG,CAAA,aAAA,CAAA,GAAA,EAAA,EAAA,IAAI,EAAC,+BAA+B,EAA+B,EAAA,4BAAA,CAAA;oBACjE,CACD;QACR,KAAC,CAAA,aAAA,CAAA,KAAK,EAAC,EAAA,QAAQ,EAAC,OAAO,EAAC,EAAE,EAAC,IAAI,EAAC,MAAM,EAAA,IAAA,EAAA;YACpC,KAAC,CAAA,aAAA,CAAA,MAAM,IAAC,IAAI,EAAC,QAAQ,EAAwB,EAAA,gBAAA,CAAA,CACvC,CACH,EACP;AACJ;;;;"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { __awaiter } from '../node_modules/tslib/tslib.es6.js';
|
|
2
|
+
import { Group, Divider, Stack, TextInput, PasswordInput, Text, Checkbox, Button } from '@mantine/core';
|
|
2
3
|
import React, { useState, useEffect } from 'react';
|
|
3
|
-
import { Button } from '../Button.js';
|
|
4
4
|
import { Form } from '../Form.js';
|
|
5
|
-
import { FormSection } from '../FormSection.js';
|
|
6
5
|
import { getGoogleClientId, GoogleButton } from '../GoogleButton.js';
|
|
7
|
-
import { Input } from '../Input.js';
|
|
8
6
|
import { useMedplum } from '../MedplumProvider.js';
|
|
9
|
-
import { getIssuesForExpression } from '../utils/outcomes.js';
|
|
7
|
+
import { getIssuesForExpression, getErrorsForInput } from '../utils/outcomes.js';
|
|
10
8
|
import { initRecaptcha, getRecaptcha } from '../utils/recaptcha.js';
|
|
11
9
|
|
|
12
10
|
function NewUserForm(props) {
|
|
@@ -40,7 +38,7 @@ function NewUserForm(props) {
|
|
|
40
38
|
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));
|
|
41
39
|
}))),
|
|
42
40
|
googleClientId && (React.createElement(React.Fragment, null,
|
|
43
|
-
React.createElement(
|
|
41
|
+
React.createElement(Group, { position: "center", p: "xl", style: { height: 70 } },
|
|
44
42
|
React.createElement(GoogleButton, { googleClientId: googleClientId, handleGoogleCredential: (response) => __awaiter(this, void 0, void 0, function* () {
|
|
45
43
|
try {
|
|
46
44
|
props.handleAuthResponse(yield medplum.startGoogleLogin({
|
|
@@ -53,34 +51,28 @@ function NewUserForm(props) {
|
|
|
53
51
|
setOutcome(err);
|
|
54
52
|
}
|
|
55
53
|
}) })),
|
|
56
|
-
React.createElement(
|
|
57
|
-
React.createElement(
|
|
58
|
-
React.createElement(
|
|
59
|
-
|
|
60
|
-
React.createElement(
|
|
61
|
-
|
|
62
|
-
React.createElement(
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
React.createElement(
|
|
77
|
-
"
|
|
78
|
-
React.createElement("div", { className: "medplum-signin-buttons" },
|
|
79
|
-
React.createElement("div", null,
|
|
80
|
-
React.createElement("input", { type: "checkbox", id: "remember", name: "remember", value: "true" }),
|
|
81
|
-
React.createElement("label", { htmlFor: "remember" }, "Remember me")),
|
|
82
|
-
React.createElement("div", null,
|
|
83
|
-
React.createElement(Button, { type: "submit", testid: "submit" }, "Create account")))));
|
|
54
|
+
React.createElement(Divider, { label: "or", labelPosition: "center", my: "lg" }))),
|
|
55
|
+
React.createElement(Stack, { spacing: "xl" },
|
|
56
|
+
React.createElement(TextInput, { name: "firstName", type: "text", label: "First name", placeholder: "First name", required: true, autoFocus: true, error: getErrorsForInput(outcome, 'firstName') }),
|
|
57
|
+
React.createElement(TextInput, { name: "lastName", type: "text", label: "Last name", placeholder: "Last name", required: true, error: getErrorsForInput(outcome, 'lastName') }),
|
|
58
|
+
React.createElement(TextInput, { name: "email", type: "email", label: "Email", placeholder: "name@domain.com", required: true, error: getErrorsForInput(outcome, 'email') }),
|
|
59
|
+
React.createElement(PasswordInput, { name: "password", label: "Password", autoComplete: "off", required: true, error: getErrorsForInput(outcome, 'password') }),
|
|
60
|
+
React.createElement(Text, { color: "dimmed", size: "xs" },
|
|
61
|
+
"By clicking submit you agree to the Medplum ",
|
|
62
|
+
React.createElement("a", { href: "https://www.medplum.com/privacy" }, "Privacy\u00A0Policy"),
|
|
63
|
+
' and ',
|
|
64
|
+
React.createElement("a", { href: "https://www.medplum.com/terms" }, "Terms\u00A0of\u00A0Service"),
|
|
65
|
+
"."),
|
|
66
|
+
React.createElement(Text, { color: "dimmed", size: "xs" },
|
|
67
|
+
"This site is protected by reCAPTCHA and the Google",
|
|
68
|
+
' ',
|
|
69
|
+
React.createElement("a", { href: "https://policies.google.com/privacy" }, "Privacy\u00A0Policy"),
|
|
70
|
+
' and ',
|
|
71
|
+
React.createElement("a", { href: "https://policies.google.com/terms" }, "Terms\u00A0of\u00A0Service"),
|
|
72
|
+
" apply.")),
|
|
73
|
+
React.createElement(Group, { position: "apart", mt: "xl", noWrap: true },
|
|
74
|
+
React.createElement(Checkbox, { name: "remember", label: "Remember me", size: "xs" }),
|
|
75
|
+
React.createElement(Button, { type: "submit" }, "Create account"))));
|
|
84
76
|
}
|
|
85
77
|
|
|
86
78
|
export { NewUserForm };
|