@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/Header.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Header.js","sources":["../../src/Header.tsx"],"sourcesContent":["import { getReferenceString, ProfileResource } from '@medplum/core';\nimport { HumanName, UserConfiguration } from '@medplum/fhirtypes';\nimport React, { useState } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { Avatar } from './Avatar';\nimport { Button } from './Button';\nimport { HeaderSearchInput, HeaderSearchTypes } from './HeaderSearchInput';\nimport { HumanNameDisplay } from './HumanNameDisplay';\nimport { MedplumLink } from './MedplumLink';\nimport { useMedplumContext } from './MedplumProvider';\nimport { Popup } from './Popup';\nimport './Header.css';\n\nexport interface HeaderProps {\n readonly title?: string;\n readonly bgColor?: string;\n readonly onLogo?: () => void;\n readonly onProfile?: () => void;\n readonly onSignOut?: () => void;\n readonly config?: UserConfiguration;\n}\n\nexport function Header(props: HeaderProps): JSX.Element {\n const navigate = useNavigate();\n const location = useLocation();\n const context = useMedplumContext();\n const medplum = context.medplum;\n const logins = medplum.getLogins();\n const [userMenuVisible, setUserMenuVisible] = useState(false);\n const [sidebarVisible, setSidebarVisible] = useState(false);\n\n return (\n <>\n <header role=\"banner\" data-testid=\"header\" style={{ background: props.bgColor }}>\n <div>\n <MedplumLink\n label=\"Toggle sidebar\"\n testid=\"header-menu-button\"\n onClick={() => setSidebarVisible(!sidebarVisible)}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ width: 20, height: 20, verticalAlign: 'text-top' }}\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 15a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </MedplumLink>\n <MedplumLink id=\"medplum-header-logo\" testid=\"header-logo\" onClick={props.onLogo}>\n {props.title || 'Medplum'}\n </MedplumLink>\n {context.profile && (\n <HeaderSearchInput\n key={`header-input-${location.pathname}`}\n name=\"search\"\n className=\"medplum-nav-search-container\"\n placeholder=\"Search\"\n onChange={(resource: HeaderSearchTypes) => navigate(`/${resource.resourceType}/${resource.id}`)}\n />\n )}\n </div>\n {context.profile && (\n <div className=\"medplum-nav-menu-container\">\n <MedplumLink testid=\"header-profile-menu-button\" onClick={() => setUserMenuVisible(true)}>\n <Avatar size=\"small\" color=\"#f68d42\" value={context.profile} />\n </MedplumLink>\n <Popup\n visible={userMenuVisible}\n autoClose={true}\n activeClassName=\"medplum-nav-menu-popover\"\n onClose={() => setUserMenuVisible(false)}\n >\n <div className=\"medplum-nav-menu\">\n <div style={{ margin: 'auto', padding: '8px' }}>\n <Avatar size=\"large\" value={context.profile} />\n </div>\n <div style={{ margin: 'auto', padding: '8px' }}>\n <div style={{ margin: '4px auto 4px auto', fontWeight: 'bold' }}>\n <HumanNameDisplay value={context.profile?.name?.[0] as HumanName} />\n </div>\n <div style={{ margin: '4px auto 4px auto' }}>{medplum.getActiveLogin()?.project?.display}</div>\n <Button\n testid=\"header-profile-link\"\n onClick={() => {\n setUserMenuVisible(false);\n if (props.onProfile) {\n props.onProfile();\n }\n }}\n >\n Manage your account\n </Button>\n </div>\n {logins.length > 1 && (\n <div>\n <hr />\n {logins.map(\n (login) =>\n login.profile?.reference !== getReferenceString(context.profile as ProfileResource) && (\n <div\n className=\"medplum-nav-menu-profile\"\n key={login.profile?.reference}\n onClick={() => {\n medplum\n .setActiveLogin(login)\n .then(() => {\n setUserMenuVisible(false);\n window.location.reload();\n })\n .catch(console.log);\n }}\n >\n <div className=\"medplum-nav-menu-profile-icon\">\n <Avatar />\n </div>\n <div className=\"medplum-nav-menu-profile-label\">\n {login.profile?.display}\n <div className=\"medplum-nav-menu-profile-help-text\">{login.project?.display}</div>\n </div>\n </div>\n )\n )}\n </div>\n )}\n <hr />\n <div style={{ margin: 'auto', padding: '8px' }}>\n <Button\n testid=\"header-add-account-button\"\n onClick={() => {\n navigate('/signin');\n }}\n >\n Add another account\n </Button>\n </div>\n <hr />\n <div style={{ margin: 'auto', padding: '8px' }}>\n <Button\n testid=\"header-signout-button\"\n onClick={() => {\n setUserMenuVisible(false);\n if (props.onSignOut) {\n props.onSignOut();\n }\n }}\n >\n Sign out of all accounts\n </Button>\n </div>\n <hr />\n <div style={{ margin: 'auto', padding: '8px', fontSize: '12px' }}>\n <a href=\"https://www.medplum.com/terms\">Terms</a>\n <a href=\"https://www.medplum.com/privacy\">Privacy</a>\n </div>\n </div>\n </Popup>\n </div>\n )}\n </header>\n <Popup\n modal={true}\n autoClose={true}\n visible={sidebarVisible}\n activeClassName=\"medplum-sidebar active\"\n inactiveClassName=\"medplum-sidebar\"\n onClose={() => setSidebarVisible(false)}\n >\n {props.config?.menu?.map((menu, index) => (\n <React.Fragment key={`menu-${index}-${props.config?.menu?.length}`}>\n <h5>{menu.title}</h5>\n <ul>\n {menu.link?.map((link) => (\n <li key={link.target}>\n <MedplumLink to={link.target}>{link.name}</MedplumLink>\n </li>\n ))}\n </ul>\n </React.Fragment>\n ))}\n <h5>Settings</h5>\n <ul>\n <li>\n <MedplumLink to={context.profile}>Profile</MedplumLink>\n </li>\n <li>\n <MedplumLink to=\"/changepassword\">Change password</MedplumLink>\n </li>\n </ul>\n </Popup>\n </>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/// <reference types="react" />
|
|
2
|
-
import { Patient, ServiceRequest } from '@medplum/fhirtypes';
|
|
3
|
-
export declare type HeaderSearchTypes = Patient | ServiceRequest;
|
|
4
|
-
export interface HeaderSearchInputProps {
|
|
5
|
-
readonly name: string;
|
|
6
|
-
readonly className?: string;
|
|
7
|
-
readonly placeholder?: string;
|
|
8
|
-
readonly onChange: (value: HeaderSearchTypes) => void;
|
|
9
|
-
}
|
|
10
|
-
export declare function HeaderSearchInput(props: HeaderSearchInputProps): JSX.Element;
|
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from './node_modules/tslib/tslib.es6.js';
|
|
2
|
-
import { isUUID, formatHumanName } from '@medplum/core';
|
|
3
|
-
import React from 'react';
|
|
4
|
-
import { Autocomplete } from './Autocomplete.js';
|
|
5
|
-
import { Avatar } from './Avatar.js';
|
|
6
|
-
import { useMedplum } from './MedplumProvider.js';
|
|
7
|
-
import { ResourceName } from './ResourceName.js';
|
|
8
|
-
|
|
9
|
-
function HeaderSearchInput(props) {
|
|
10
|
-
const medplum = useMedplum();
|
|
11
|
-
return (React.createElement(Autocomplete, { loadOptions: (input, signal) => __awaiter(this, void 0, void 0, function* () {
|
|
12
|
-
return getResourcesFromResponse((yield medplum.graphql(buildGraphQLQuery(input), undefined, undefined, { signal })), input);
|
|
13
|
-
}), getId: (item) => {
|
|
14
|
-
return item.id;
|
|
15
|
-
}, getIcon: (item) => React.createElement(Avatar, { value: item }), getDisplay: (item) => React.createElement(ResourceName, { value: item }), getHelpText: (item) => {
|
|
16
|
-
var _a;
|
|
17
|
-
if (item.resourceType === 'Patient' && item.birthDate) {
|
|
18
|
-
return 'DoB: ' + item.birthDate;
|
|
19
|
-
}
|
|
20
|
-
return (_a = item.subject) === null || _a === void 0 ? void 0 : _a.display;
|
|
21
|
-
}, name: props.name, className: props.className, placeholder: props.placeholder, onChange: (items) => props.onChange(items[0]) }));
|
|
22
|
-
}
|
|
23
|
-
function buildGraphQLQuery(input) {
|
|
24
|
-
const escaped = JSON.stringify(input);
|
|
25
|
-
if (isUUID(input)) {
|
|
26
|
-
return `{
|
|
27
|
-
Patients1: PatientList(_id: ${escaped}, _count: 1) {
|
|
28
|
-
resourceType
|
|
29
|
-
id
|
|
30
|
-
identifier {
|
|
31
|
-
system
|
|
32
|
-
value
|
|
33
|
-
}
|
|
34
|
-
name {
|
|
35
|
-
given
|
|
36
|
-
family
|
|
37
|
-
}
|
|
38
|
-
birthDate
|
|
39
|
-
}
|
|
40
|
-
ServiceRequestList(_id: ${escaped}, _count: 1) {
|
|
41
|
-
resourceType
|
|
42
|
-
id
|
|
43
|
-
identifier {
|
|
44
|
-
system
|
|
45
|
-
value
|
|
46
|
-
}
|
|
47
|
-
subject {
|
|
48
|
-
display
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}`.replace(/\s+/g, ' ');
|
|
52
|
-
}
|
|
53
|
-
return `{
|
|
54
|
-
Patients1: PatientList(name: ${escaped}, _count: 5) {
|
|
55
|
-
resourceType
|
|
56
|
-
id
|
|
57
|
-
identifier {
|
|
58
|
-
system
|
|
59
|
-
value
|
|
60
|
-
}
|
|
61
|
-
name {
|
|
62
|
-
given
|
|
63
|
-
family
|
|
64
|
-
}
|
|
65
|
-
birthDate
|
|
66
|
-
}
|
|
67
|
-
Patients2: PatientList(identifier: ${escaped}, _count: 5) {
|
|
68
|
-
resourceType
|
|
69
|
-
id
|
|
70
|
-
identifier {
|
|
71
|
-
system
|
|
72
|
-
value
|
|
73
|
-
}
|
|
74
|
-
name {
|
|
75
|
-
given
|
|
76
|
-
family
|
|
77
|
-
}
|
|
78
|
-
birthDate
|
|
79
|
-
}
|
|
80
|
-
ServiceRequestList(identifier: ${escaped}, _count: 5) {
|
|
81
|
-
resourceType
|
|
82
|
-
id
|
|
83
|
-
identifier {
|
|
84
|
-
system
|
|
85
|
-
value
|
|
86
|
-
}
|
|
87
|
-
subject {
|
|
88
|
-
display
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}`.replace(/\s+/g, ' ');
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Returns a de-duped and sorted list of resources from the search response.
|
|
95
|
-
* The search request is actually 3+ separate searches, which can include duplicates.
|
|
96
|
-
* This function combines the results, de-dupes, and sorts by relevance.
|
|
97
|
-
* @param response The response from a search query.
|
|
98
|
-
* @param query The user entered search query.
|
|
99
|
-
* @returns The resources to display in the autocomplete.
|
|
100
|
-
*/
|
|
101
|
-
function getResourcesFromResponse(response, query) {
|
|
102
|
-
const resources = [];
|
|
103
|
-
if (response.data.Patients1) {
|
|
104
|
-
resources.push(...response.data.Patients1);
|
|
105
|
-
}
|
|
106
|
-
if (response.data.Patients2) {
|
|
107
|
-
resources.push(...response.data.Patients2);
|
|
108
|
-
}
|
|
109
|
-
if (response.data.ServiceRequestList) {
|
|
110
|
-
resources.push(...response.data.ServiceRequestList);
|
|
111
|
-
}
|
|
112
|
-
return sortByRelevance(dedupeResources(resources), query).slice(0, 5);
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Removes duplicate resources from an array by ID.
|
|
116
|
-
* @param resources The array of resources with possible duplicates.
|
|
117
|
-
* @returns The array of resources with no duplicates.
|
|
118
|
-
*/
|
|
119
|
-
function dedupeResources(resources) {
|
|
120
|
-
const ids = new Set();
|
|
121
|
-
const result = [];
|
|
122
|
-
for (const resource of resources) {
|
|
123
|
-
if (!ids.has(resource.id)) {
|
|
124
|
-
ids.add(resource.id);
|
|
125
|
-
result.push(resource);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
return result;
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Sorts an array of resources by relevance.
|
|
132
|
-
* @param resources The candidate resources.
|
|
133
|
-
* @param query The user entered search string.
|
|
134
|
-
* @returns The sorted array of resources.
|
|
135
|
-
*/
|
|
136
|
-
function sortByRelevance(resources, query) {
|
|
137
|
-
return resources.sort((a, b) => {
|
|
138
|
-
return getResourceScore(b, query) - getResourceScore(a, query);
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Calculates a relevance score of a candidate resource.
|
|
143
|
-
* Higher scores are better.
|
|
144
|
-
* @param resource The candidate resource.
|
|
145
|
-
* @param query The user entered search string.
|
|
146
|
-
* @returns The relevance score of the candidate resource.
|
|
147
|
-
*/
|
|
148
|
-
function getResourceScore(resource, query) {
|
|
149
|
-
let bestScore = 0;
|
|
150
|
-
if (resource.identifier) {
|
|
151
|
-
for (const identifier of resource.identifier) {
|
|
152
|
-
bestScore = Math.max(bestScore, getStringScore(identifier.value, query));
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
if (resource.resourceType === 'Patient' && resource.name) {
|
|
156
|
-
for (const name of resource.name) {
|
|
157
|
-
bestScore = Math.max(bestScore, getStringScore(formatHumanName(name), query));
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
return bestScore;
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Calculates a relevance score of a candidate display string.
|
|
164
|
-
* Higher scores are better.
|
|
165
|
-
* @param str The candidate display string.
|
|
166
|
-
* @param query The user entered search string.
|
|
167
|
-
* @returns The relevance score of the candidate string.
|
|
168
|
-
*/
|
|
169
|
-
function getStringScore(str, query) {
|
|
170
|
-
if (!str) {
|
|
171
|
-
return 0;
|
|
172
|
-
}
|
|
173
|
-
const index = str.toLowerCase().indexOf(query.toLowerCase());
|
|
174
|
-
if (index < 0) {
|
|
175
|
-
return 0;
|
|
176
|
-
}
|
|
177
|
-
return 100 - index;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
export { HeaderSearchInput };
|
|
181
|
-
//# sourceMappingURL=HeaderSearchInput.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"HeaderSearchInput.js","sources":["../../src/HeaderSearchInput.tsx"],"sourcesContent":["import { formatHumanName, isUUID } from '@medplum/core';\nimport { Patient, ServiceRequest } from '@medplum/fhirtypes';\nimport React from 'react';\nimport { Autocomplete } from './Autocomplete';\nimport { Avatar } from './Avatar';\nimport { useMedplum } from './MedplumProvider';\nimport { ResourceName } from './ResourceName';\n\nexport type HeaderSearchTypes = Patient | ServiceRequest;\n\nexport interface HeaderSearchInputProps {\n readonly name: string;\n readonly className?: string;\n readonly placeholder?: string;\n readonly onChange: (value: HeaderSearchTypes) => void;\n}\n\ninterface SearchGraphQLResponse {\n readonly data: {\n readonly Patients1: Patient[] | undefined;\n readonly Patients2: Patient[] | undefined;\n readonly ServiceRequestList: ServiceRequest[] | undefined;\n };\n}\n\nexport function HeaderSearchInput(props: HeaderSearchInputProps): JSX.Element {\n const medplum = useMedplum();\n return (\n <Autocomplete\n loadOptions={async (input: string, signal: AbortSignal): Promise<HeaderSearchTypes[]> => {\n return getResourcesFromResponse(\n (await medplum.graphql(buildGraphQLQuery(input), undefined, undefined, { signal })) as SearchGraphQLResponse,\n input\n );\n }}\n getId={(item: HeaderSearchTypes) => {\n return item.id as string;\n }}\n getIcon={(item: HeaderSearchTypes) => <Avatar value={item} />}\n getDisplay={(item: HeaderSearchTypes) => <ResourceName value={item} />}\n getHelpText={(item: HeaderSearchTypes) => {\n if (item.resourceType === 'Patient' && item.birthDate) {\n return 'DoB: ' + item.birthDate;\n }\n return (item as ServiceRequest).subject?.display;\n }}\n name={props.name}\n className={props.className}\n placeholder={props.placeholder}\n onChange={(items: HeaderSearchTypes[]) => props.onChange(items[0])}\n />\n );\n}\n\nfunction buildGraphQLQuery(input: string): string {\n const escaped = JSON.stringify(input);\n if (isUUID(input)) {\n return `{\n Patients1: PatientList(_id: ${escaped}, _count: 1) {\n resourceType\n id\n identifier {\n system\n value\n }\n name {\n given\n family\n }\n birthDate\n }\n ServiceRequestList(_id: ${escaped}, _count: 1) {\n resourceType\n id\n identifier {\n system\n value\n }\n subject {\n display\n }\n }\n }`.replace(/\\s+/g, ' ');\n }\n return `{\n Patients1: PatientList(name: ${escaped}, _count: 5) {\n resourceType\n id\n identifier {\n system\n value\n }\n name {\n given\n family\n }\n birthDate\n }\n Patients2: PatientList(identifier: ${escaped}, _count: 5) {\n resourceType\n id\n identifier {\n system\n value\n }\n name {\n given\n family\n }\n birthDate\n }\n ServiceRequestList(identifier: ${escaped}, _count: 5) {\n resourceType\n id\n identifier {\n system\n value\n }\n subject {\n display\n }\n }\n }`.replace(/\\s+/g, ' ');\n}\n\n/**\n * Returns a de-duped and sorted list of resources from the search response.\n * The search request is actually 3+ separate searches, which can include duplicates.\n * This function combines the results, de-dupes, and sorts by relevance.\n * @param response The response from a search query.\n * @param query The user entered search query.\n * @returns The resources to display in the autocomplete.\n */\nfunction getResourcesFromResponse(response: SearchGraphQLResponse, query: string): HeaderSearchTypes[] {\n const resources = [];\n if (response.data.Patients1) {\n resources.push(...response.data.Patients1);\n }\n if (response.data.Patients2) {\n resources.push(...response.data.Patients2);\n }\n if (response.data.ServiceRequestList) {\n resources.push(...response.data.ServiceRequestList);\n }\n return sortByRelevance(dedupeResources(resources), query).slice(0, 5);\n}\n\n/**\n * Removes duplicate resources from an array by ID.\n * @param resources The array of resources with possible duplicates.\n * @returns The array of resources with no duplicates.\n */\nfunction dedupeResources(resources: HeaderSearchTypes[]): HeaderSearchTypes[] {\n const ids = new Set<string>();\n const result = [];\n\n for (const resource of resources) {\n if (!ids.has(resource.id as string)) {\n ids.add(resource.id as string);\n result.push(resource);\n }\n }\n\n return result;\n}\n\n/**\n * Sorts an array of resources by relevance.\n * @param resources The candidate resources.\n * @param query The user entered search string.\n * @returns The sorted array of resources.\n */\nfunction sortByRelevance(resources: HeaderSearchTypes[], query: string): HeaderSearchTypes[] {\n return resources.sort((a: HeaderSearchTypes, b: HeaderSearchTypes) => {\n return getResourceScore(b, query) - getResourceScore(a, query);\n });\n}\n\n/**\n * Calculates a relevance score of a candidate resource.\n * Higher scores are better.\n * @param resource The candidate resource.\n * @param query The user entered search string.\n * @returns The relevance score of the candidate resource.\n */\nfunction getResourceScore(resource: HeaderSearchTypes, query: string): number {\n let bestScore = 0;\n\n if (resource.identifier) {\n for (const identifier of resource.identifier) {\n bestScore = Math.max(bestScore, getStringScore(identifier.value, query));\n }\n }\n\n if (resource.resourceType === 'Patient' && resource.name) {\n for (const name of resource.name) {\n bestScore = Math.max(bestScore, getStringScore(formatHumanName(name), query));\n }\n }\n\n return bestScore;\n}\n\n/**\n * Calculates a relevance score of a candidate display string.\n * Higher scores are better.\n * @param str The candidate display string.\n * @param query The user entered search string.\n * @returns The relevance score of the candidate string.\n */\nfunction getStringScore(str: string | undefined, query: string): number {\n if (!str) {\n return 0;\n }\n const index = str.toLowerCase().indexOf(query.toLowerCase());\n if (index < 0) {\n return 0;\n }\n return 100 - index;\n}\n"],"names":[],"mappings":"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"}
|
package/dist/esm/Input.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { OperationOutcome } from '@medplum/fhirtypes';
|
|
2
|
-
import React, { RefObject } from 'react';
|
|
3
|
-
import './Input.css';
|
|
4
|
-
export interface InputProps {
|
|
5
|
-
name?: string;
|
|
6
|
-
type?: string;
|
|
7
|
-
size?: number;
|
|
8
|
-
step?: number | 'any';
|
|
9
|
-
style?: React.CSSProperties;
|
|
10
|
-
defaultValue?: string | number;
|
|
11
|
-
required?: boolean;
|
|
12
|
-
autoCapitalize?: string;
|
|
13
|
-
autoComplete?: string;
|
|
14
|
-
autoFocus?: boolean;
|
|
15
|
-
inputRef?: RefObject<HTMLInputElement>;
|
|
16
|
-
outcome?: OperationOutcome;
|
|
17
|
-
placeholder?: string;
|
|
18
|
-
testid?: string;
|
|
19
|
-
disabled?: boolean;
|
|
20
|
-
onChange?: (newValue: string) => void;
|
|
21
|
-
}
|
|
22
|
-
export declare function Input(props: InputProps): JSX.Element;
|
package/dist/esm/Input.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { getIssuesForExpression } from './utils/outcomes.js';
|
|
3
|
-
|
|
4
|
-
function Input(props) {
|
|
5
|
-
const className = 'medplum-input';
|
|
6
|
-
const issues = getIssuesForExpression(props.outcome, props.name);
|
|
7
|
-
const invalid = issues && issues.length > 0;
|
|
8
|
-
return (React.createElement("input", { id: props.name, name: props.name, type: getInputType(props.type), size: props.size, step: props.step, className: className, style: props.style, defaultValue: props.defaultValue || '', required: props.required, autoCapitalize: props.autoCapitalize, autoComplete: props.autoComplete, autoFocus: props.autoFocus, ref: props.inputRef, "aria-invalid": invalid, "aria-describedby": invalid ? props.name + '-errors' : '', placeholder: props.placeholder, "data-testid": props.testid, disabled: props.disabled, onChange: (e) => {
|
|
9
|
-
if (props.onChange) {
|
|
10
|
-
props.onChange(e.currentTarget.value);
|
|
11
|
-
}
|
|
12
|
-
} }));
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Returns the input type for the requested type.
|
|
16
|
-
* JSDOM does not support many of the valid <input> type attributes.
|
|
17
|
-
* For example, it won't fire change events for <input type="datetime-local">.
|
|
18
|
-
* @param requestedType The optional type as requested by the parent component.
|
|
19
|
-
*/
|
|
20
|
-
function getInputType(requestedType) {
|
|
21
|
-
const result = requestedType || 'text';
|
|
22
|
-
return result;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export { Input };
|
|
26
|
-
//# sourceMappingURL=Input.js.map
|
package/dist/esm/Input.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Input.js","sources":["../../src/Input.tsx"],"sourcesContent":["import { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { RefObject } from 'react';\nimport { getIssuesForExpression } from './utils/outcomes';\nimport './Input.css';\n\nexport interface InputProps {\n name?: string;\n type?: string;\n size?: number;\n step?: number | 'any';\n style?: React.CSSProperties;\n defaultValue?: string | number;\n required?: boolean;\n autoCapitalize?: string;\n autoComplete?: string;\n autoFocus?: boolean;\n inputRef?: RefObject<HTMLInputElement>;\n outcome?: OperationOutcome;\n placeholder?: string;\n testid?: string;\n disabled?: boolean;\n onChange?: (newValue: string) => void;\n}\n\nexport function Input(props: InputProps): JSX.Element {\n const className = 'medplum-input';\n const issues = getIssuesForExpression(props.outcome, props.name);\n const invalid = issues && issues.length > 0;\n return (\n <input\n id={props.name}\n name={props.name}\n type={getInputType(props.type)}\n size={props.size}\n step={props.step}\n className={className}\n style={props.style}\n defaultValue={props.defaultValue || ''}\n required={props.required}\n autoCapitalize={props.autoCapitalize}\n autoComplete={props.autoComplete}\n autoFocus={props.autoFocus}\n ref={props.inputRef}\n aria-invalid={invalid}\n aria-describedby={invalid ? props.name + '-errors' : ''}\n placeholder={props.placeholder}\n data-testid={props.testid}\n disabled={props.disabled}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value);\n }\n }}\n />\n );\n}\n\n/**\n * Returns the input type for the requested type.\n * JSDOM does not support many of the valid <input> type attributes.\n * For example, it won't fire change events for <input type=\"datetime-local\">.\n * @param requestedType The optional type as requested by the parent component.\n */\nfunction getInputType(requestedType: string | undefined): string {\n const result = requestedType || 'text';\n return process.env.NODE_ENV === 'test' ? result.replace(/datetime-local|date/, 'text') : result;\n}\n"],"names":[],"mappings":";;;AAwBM,SAAU,KAAK,CAAC,KAAiB,EAAA;IACrC,MAAM,SAAS,GAAG,eAAe,CAAC;AAClC,IAAA,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5C,QACE,KACE,CAAA,aAAA,CAAA,OAAA,EAAA,EAAA,EAAE,EAAE,KAAK,CAAC,IAAI,EACd,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,EAC9B,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,EAAE,EACtC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,cAAc,EAAE,KAAK,CAAC,cAAc,EACpC,YAAY,EAAE,KAAK,CAAC,YAAY,EAChC,SAAS,EAAE,KAAK,CAAC,SAAS,EAC1B,GAAG,EAAE,KAAK,CAAC,QAAQ,EAAA,cAAA,EACL,OAAO,EAAA,kBAAA,EACH,OAAO,GAAG,KAAK,CAAC,IAAI,GAAG,SAAS,GAAG,EAAE,EACvD,WAAW,EAAE,KAAK,CAAC,WAAW,EACjB,aAAA,EAAA,KAAK,CAAC,MAAM,EACzB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,QAAQ,EAAE,CAAC,CAAC,KAAI;YACd,IAAI,KAAK,CAAC,QAAQ,EAAE;gBAClB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AACvC,aAAA;SACF,EAAA,CACD,EACF;AACJ,CAAC;AAED;;;;;AAKG;AACH,SAAS,YAAY,CAAC,aAAiC,EAAA;AACrD,IAAA,MAAM,MAAM,GAAG,aAAa,IAAI,MAAM,CAAC;IACvC,OAAyF,MAAM,CAAC;AAClG;;;;"}
|
package/dist/esm/InputRow.d.ts
DELETED
package/dist/esm/InputRow.js
DELETED
package/dist/esm/InputRow.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"InputRow.js","sources":["../../src/InputRow.tsx"],"sourcesContent":["import React from 'react';\nimport './InputRow.css';\n\nexport interface InputRowProps {\n justifyContent?: string;\n children: React.ReactNode;\n}\n\nexport function InputRow(props: InputRowProps): JSX.Element {\n return (\n <div className=\"medplum-input-row\" style={{ justifyContent: props.justifyContent }}>\n {props.children}\n </div>\n );\n}\n"],"names":[],"mappings":";;AAQM,SAAU,QAAQ,CAAC,KAAoB,EAAA;IAC3C,QACE,6BAAK,SAAS,EAAC,mBAAmB,EAAC,KAAK,EAAE,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,EAAA,EAC/E,KAAK,CAAC,QAAQ,CACX,EACN;AACJ;;;;"}
|
package/dist/esm/Loading.d.ts
DELETED
package/dist/esm/Loading.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
|
|
3
|
-
function Loading() {
|
|
4
|
-
return (React.createElement("div", { role: "progressbar", "aria-busy": "true", className: "medplum-loading" },
|
|
5
|
-
React.createElement("div", { className: "medplum-loading-container" },
|
|
6
|
-
React.createElement("svg", { className: "medplum-loading-spinner", viewBox: "0 0 100 100" },
|
|
7
|
-
React.createElement("circle", { cx: "50", cy: "50", r: "40" })))));
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export { Loading };
|
|
11
|
-
//# sourceMappingURL=Loading.js.map
|
package/dist/esm/Loading.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Loading.js","sources":["../../src/Loading.tsx"],"sourcesContent":["import React from 'react';\nimport './Loading.css';\n\nexport function Loading(): JSX.Element {\n return (\n <div role=\"progressbar\" aria-busy=\"true\" className=\"medplum-loading\">\n <div className=\"medplum-loading-container\">\n <svg className=\"medplum-loading-spinner\" viewBox=\"0 0 100 100\">\n <circle cx=\"50\" cy=\"50\" r=\"40\" />\n </svg>\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;SAGgB,OAAO,GAAA;IACrB,QACE,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,IAAI,EAAC,aAAa,eAAW,MAAM,EAAC,SAAS,EAAC,iBAAiB,EAAA;QAClE,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,2BAA2B,EAAA;AACxC,YAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,yBAAyB,EAAC,OAAO,EAAC,aAAa,EAAA;AAC5D,gBAAA,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,IAAI,EAAG,CAAA,CAC7B,CACF,CACF,EACN;AACJ;;;;"}
|
package/dist/esm/MenuItem.d.ts
DELETED
package/dist/esm/MenuItem.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
|
|
3
|
-
function MenuItem(props) {
|
|
4
|
-
return (React.createElement("div", { className: "medplum-menu-item", onClick: () => props.onClick(), "aria-label": props.label }, props.children));
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export { MenuItem };
|
|
8
|
-
//# sourceMappingURL=MenuItem.js.map
|
package/dist/esm/MenuItem.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MenuItem.js","sources":["../../src/MenuItem.tsx"],"sourcesContent":["import React from 'react';\nimport './MenuItem.css';\n\ninterface MenuItemProps {\n onClick: () => void;\n label?: string;\n children: React.ReactNode;\n}\n\nexport function MenuItem(props: MenuItemProps): JSX.Element {\n return (\n <div className=\"medplum-menu-item\" onClick={() => props.onClick()} aria-label={props.label}>\n {props.children}\n </div>\n );\n}\n"],"names":[],"mappings":";;AASM,SAAU,QAAQ,CAAC,KAAoB,EAAA;IAC3C,QACE,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,mBAAmB,EAAC,OAAO,EAAE,MAAM,KAAK,CAAC,OAAO,EAAE,EAAc,YAAA,EAAA,KAAK,CAAC,KAAK,EACvF,EAAA,KAAK,CAAC,QAAQ,CACX,EACN;AACJ;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MenuSeparator.js","sources":["../../src/MenuSeparator.tsx"],"sourcesContent":["import React from 'react';\nimport './MenuSeparator.css';\n\nexport function MenuSeparator(): JSX.Element {\n return <div className=\"medplum-menu-separator\" />;\n}\n"],"names":[],"mappings":";;SAGgB,aAAa,GAAA;AAC3B,IAAA,OAAO,KAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,wBAAwB,GAAG,CAAC;AACpD;;;;"}
|
package/dist/esm/Popup.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import './Popup.css';
|
|
3
|
-
interface PopupProps {
|
|
4
|
-
visible: boolean;
|
|
5
|
-
anchor?: DOMRectReadOnly;
|
|
6
|
-
modal?: boolean;
|
|
7
|
-
autoClose?: boolean;
|
|
8
|
-
onClose: () => void;
|
|
9
|
-
activeClassName?: string;
|
|
10
|
-
inactiveClassName?: string;
|
|
11
|
-
children?: React.ReactNode;
|
|
12
|
-
}
|
|
13
|
-
export declare function Popup(props: PopupProps): JSX.Element;
|
|
14
|
-
export {};
|
package/dist/esm/Popup.js
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import React, { useRef, useEffect } from 'react';
|
|
2
|
-
import { useLocation } from 'react-router-dom';
|
|
3
|
-
import { killEvent } from './utils/dom.js';
|
|
4
|
-
|
|
5
|
-
function Popup(props) {
|
|
6
|
-
const ref = useRef(null);
|
|
7
|
-
// Track browser URL location, and the location when the popup becomes visible
|
|
8
|
-
const location = useLocation();
|
|
9
|
-
const locationRef = useRef();
|
|
10
|
-
if (props.visible) {
|
|
11
|
-
if (locationRef.current === undefined) {
|
|
12
|
-
locationRef.current = location;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
else {
|
|
16
|
-
locationRef.current = undefined;
|
|
17
|
-
}
|
|
18
|
-
const propsRef = useRef();
|
|
19
|
-
propsRef.current = props;
|
|
20
|
-
// Listen for clicks outside of the popup
|
|
21
|
-
// If the user clicks outside of the popup, close it
|
|
22
|
-
useEffect(() => {
|
|
23
|
-
function handleClick(e) {
|
|
24
|
-
var _a, _b;
|
|
25
|
-
if (((_a = propsRef.current) === null || _a === void 0 ? void 0 : _a.visible) &&
|
|
26
|
-
((_b = propsRef.current) === null || _b === void 0 ? void 0 : _b.autoClose) &&
|
|
27
|
-
(ref === null || ref === void 0 ? void 0 : ref.current) &&
|
|
28
|
-
!ref.current.contains(e.target)) {
|
|
29
|
-
killEvent(e);
|
|
30
|
-
props.onClose();
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
function handleScroll(e) {
|
|
34
|
-
var _a;
|
|
35
|
-
if ((_a = propsRef.current) === null || _a === void 0 ? void 0 : _a.visible) {
|
|
36
|
-
killEvent(e);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
document.addEventListener('click', handleClick, true);
|
|
40
|
-
window.addEventListener('wheel', handleScroll, { passive: false });
|
|
41
|
-
window.addEventListener('touchmove', handleScroll, true);
|
|
42
|
-
return () => {
|
|
43
|
-
document.removeEventListener('click', handleClick, true);
|
|
44
|
-
window.removeEventListener('wheel', handleScroll);
|
|
45
|
-
window.removeEventListener('touchmove', handleScroll, true);
|
|
46
|
-
};
|
|
47
|
-
}, [props]);
|
|
48
|
-
// Listen for changes in the location
|
|
49
|
-
// If the browser navigates to a new page, close the popup
|
|
50
|
-
useEffect(() => {
|
|
51
|
-
if (props.visible && location !== locationRef.current) {
|
|
52
|
-
props.onClose();
|
|
53
|
-
}
|
|
54
|
-
}, [location, props]);
|
|
55
|
-
const style = {
|
|
56
|
-
display: props.visible ? 'block' : 'none',
|
|
57
|
-
};
|
|
58
|
-
if (props.anchor) {
|
|
59
|
-
if (props.anchor.right + 250 < document.body.clientWidth) {
|
|
60
|
-
style.left = props.anchor.right + 'px';
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
style.right = document.body.clientWidth - props.anchor.left + 'px';
|
|
64
|
-
}
|
|
65
|
-
if (props.anchor.top + 300 < document.body.clientHeight) {
|
|
66
|
-
style.top = props.anchor.top + 'px';
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
style.bottom = document.body.clientHeight - props.anchor.top + 'px';
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
return (React.createElement(React.Fragment, null,
|
|
73
|
-
props.modal && (React.createElement("div", { className: props.visible ? 'medplum-backdrop active' : 'medplum-backdrop', onClick: props.onClose })),
|
|
74
|
-
React.createElement("div", { ref: ref, className: 'medplum-popup ' + (props.visible ? props.activeClassName : props.inactiveClassName), style: style, "data-testid": "popup" }, props.children)));
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
export { Popup };
|
|
78
|
-
//# sourceMappingURL=Popup.js.map
|
package/dist/esm/Popup.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Popup.js","sources":["../../src/Popup.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react';\nimport { Location, useLocation } from 'react-router-dom';\nimport { killEvent } from './utils/dom';\nimport './Popup.css';\n\ninterface PopupProps {\n visible: boolean;\n anchor?: DOMRectReadOnly;\n modal?: boolean;\n autoClose?: boolean;\n onClose: () => void;\n activeClassName?: string;\n inactiveClassName?: string;\n children?: React.ReactNode;\n}\n\nexport function Popup(props: PopupProps): JSX.Element {\n const ref = useRef<HTMLDivElement>(null);\n\n // Track browser URL location, and the location when the popup becomes visible\n const location = useLocation();\n const locationRef = useRef<Location>();\n if (props.visible) {\n if (locationRef.current === undefined) {\n locationRef.current = location;\n }\n } else {\n locationRef.current = undefined;\n }\n\n const propsRef = useRef<PopupProps>();\n propsRef.current = props;\n\n // Listen for clicks outside of the popup\n // If the user clicks outside of the popup, close it\n useEffect(() => {\n function handleClick(e: Event): void {\n if (\n propsRef.current?.visible &&\n propsRef.current?.autoClose &&\n ref?.current &&\n !ref.current.contains(e.target as Node)\n ) {\n killEvent(e);\n props.onClose();\n }\n }\n\n function handleScroll(e: Event): void {\n if (propsRef.current?.visible) {\n killEvent(e);\n }\n }\n\n document.addEventListener('click', handleClick, true);\n window.addEventListener('wheel', handleScroll, { passive: false });\n window.addEventListener('touchmove', handleScroll, true);\n return () => {\n document.removeEventListener('click', handleClick, true);\n window.removeEventListener('wheel', handleScroll);\n window.removeEventListener('touchmove', handleScroll, true);\n };\n }, [props]);\n\n // Listen for changes in the location\n // If the browser navigates to a new page, close the popup\n useEffect(() => {\n if (props.visible && location !== locationRef.current) {\n props.onClose();\n }\n }, [location, props]);\n\n const style: React.CSSProperties = {\n display: props.visible ? 'block' : 'none',\n };\n\n if (props.anchor) {\n if (props.anchor.right + 250 < document.body.clientWidth) {\n style.left = props.anchor.right + 'px';\n } else {\n style.right = document.body.clientWidth - props.anchor.left + 'px';\n }\n\n if (props.anchor.top + 300 < document.body.clientHeight) {\n style.top = props.anchor.top + 'px';\n } else {\n style.bottom = document.body.clientHeight - props.anchor.top + 'px';\n }\n }\n\n return (\n <>\n {props.modal && (\n <div className={props.visible ? 'medplum-backdrop active' : 'medplum-backdrop'} onClick={props.onClose} />\n )}\n <div\n ref={ref}\n className={'medplum-popup ' + (props.visible ? props.activeClassName : props.inactiveClassName)}\n style={style}\n data-testid=\"popup\"\n >\n {props.children}\n </div>\n </>\n );\n}\n"],"names":[],"mappings":"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"}
|
package/dist/esm/Select.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { OperationOutcome } from '@medplum/fhirtypes';
|
|
2
|
-
import React, { RefObject } from 'react';
|
|
3
|
-
import './Select.css';
|
|
4
|
-
export interface SelectProps {
|
|
5
|
-
name?: string;
|
|
6
|
-
defaultValue?: string;
|
|
7
|
-
required?: boolean;
|
|
8
|
-
autoFocus?: boolean;
|
|
9
|
-
inputRef?: RefObject<HTMLSelectElement>;
|
|
10
|
-
children: React.ReactNode;
|
|
11
|
-
outcome?: OperationOutcome;
|
|
12
|
-
testid?: string;
|
|
13
|
-
style?: React.CSSProperties;
|
|
14
|
-
onChange?: (newValue: string) => void;
|
|
15
|
-
}
|
|
16
|
-
export declare function Select(props: SelectProps): JSX.Element;
|
package/dist/esm/Select.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { getIssuesForExpression } from './utils/outcomes.js';
|
|
3
|
-
|
|
4
|
-
function Select(props) {
|
|
5
|
-
const className = 'medplum-select';
|
|
6
|
-
const issues = getIssuesForExpression(props.outcome, props.name);
|
|
7
|
-
const invalid = issues && issues.length > 0;
|
|
8
|
-
return (React.createElement("select", { id: props.name, name: props.name, className: className, defaultValue: props.defaultValue || '', required: props.required, autoFocus: props.autoFocus, ref: props.inputRef, style: props.style, "aria-invalid": invalid, "aria-describedby": invalid ? props.name + '-errors' : '', "data-testid": props.testid, onChange: (e) => {
|
|
9
|
-
if (props.onChange) {
|
|
10
|
-
props.onChange(e.currentTarget.value);
|
|
11
|
-
}
|
|
12
|
-
} }, props.children));
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export { Select };
|
|
16
|
-
//# sourceMappingURL=Select.js.map
|
package/dist/esm/Select.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Select.js","sources":["../../src/Select.tsx"],"sourcesContent":["import { OperationOutcome } from '@medplum/fhirtypes';\nimport React, { RefObject } from 'react';\nimport { getIssuesForExpression } from './utils/outcomes';\nimport './Select.css';\n\nexport interface SelectProps {\n name?: string;\n defaultValue?: string;\n required?: boolean;\n autoFocus?: boolean;\n inputRef?: RefObject<HTMLSelectElement>;\n children: React.ReactNode;\n outcome?: OperationOutcome;\n testid?: string;\n style?: React.CSSProperties;\n onChange?: (newValue: string) => void;\n}\n\nexport function Select(props: SelectProps): JSX.Element {\n const className = 'medplum-select';\n const issues = getIssuesForExpression(props.outcome, props.name);\n const invalid = issues && issues.length > 0;\n return (\n <select\n id={props.name}\n name={props.name}\n className={className}\n defaultValue={props.defaultValue || ''}\n required={props.required}\n autoFocus={props.autoFocus}\n ref={props.inputRef}\n style={props.style}\n aria-invalid={invalid}\n aria-describedby={invalid ? props.name + '-errors' : ''}\n data-testid={props.testid}\n onChange={(e) => {\n if (props.onChange) {\n props.onChange(e.currentTarget.value);\n }\n }}\n >\n {props.children}\n </select>\n );\n}\n"],"names":[],"mappings":";;;AAkBM,SAAU,MAAM,CAAC,KAAkB,EAAA;IACvC,MAAM,SAAS,GAAG,gBAAgB,CAAC;AACnC,IAAA,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5C,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EACE,EAAE,EAAE,KAAK,CAAC,IAAI,EACd,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,EAAE,EACtC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,SAAS,EAAE,KAAK,CAAC,SAAS,EAC1B,GAAG,EAAE,KAAK,CAAC,QAAQ,EACnB,KAAK,EAAE,KAAK,CAAC,KAAK,kBACJ,OAAO,EAAA,kBAAA,EACH,OAAO,GAAG,KAAK,CAAC,IAAI,GAAG,SAAS,GAAG,EAAE,EAC1C,aAAA,EAAA,KAAK,CAAC,MAAM,EACzB,QAAQ,EAAE,CAAC,CAAC,KAAI;YACd,IAAI,KAAK,CAAC,QAAQ,EAAE;gBAClB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AACvC,aAAA;AACH,SAAC,IAEA,KAAK,CAAC,QAAQ,CACR,EACT;AACJ;;;;"}
|
package/dist/esm/SubMenu.d.ts
DELETED
package/dist/esm/SubMenu.js
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import React, { useState, useRef, useEffect } from 'react';
|
|
2
|
-
import { Popup } from './Popup.js';
|
|
3
|
-
|
|
4
|
-
function SubMenu(props) {
|
|
5
|
-
const [hover, setHover] = useState(false);
|
|
6
|
-
const [visible, setVisible] = useState(false);
|
|
7
|
-
const [anchor, setAnchor] = useState(undefined);
|
|
8
|
-
const menuItemRef = useRef(null);
|
|
9
|
-
const hoverRef = useRef(false);
|
|
10
|
-
hoverRef.current = hover;
|
|
11
|
-
const visibleRef = useRef(false);
|
|
12
|
-
visibleRef.current = visible;
|
|
13
|
-
function show() {
|
|
14
|
-
const el = menuItemRef.current;
|
|
15
|
-
if (el) {
|
|
16
|
-
setAnchor(el.getBoundingClientRect());
|
|
17
|
-
setVisible(true);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
useEffect(() => {
|
|
21
|
-
const timerId = window.setInterval(() => {
|
|
22
|
-
if (!visibleRef.current && hoverRef.current) {
|
|
23
|
-
show();
|
|
24
|
-
}
|
|
25
|
-
else if (visibleRef.current && !hoverRef.current) {
|
|
26
|
-
setVisible(false);
|
|
27
|
-
}
|
|
28
|
-
}, 150);
|
|
29
|
-
return () => window.clearInterval(timerId);
|
|
30
|
-
}, []);
|
|
31
|
-
return (React.createElement("div", { ref: menuItemRef, className: "medplum-menu-item medplum-submenu-item", onClick: () => show(), onMouseOver: () => setHover(true), onMouseLeave: () => setHover(false) },
|
|
32
|
-
props.title,
|
|
33
|
-
React.createElement("span", { className: "medplum-submenu-arrow" }, '\u25BA'),
|
|
34
|
-
React.createElement(Popup, { visible: visible, anchor: anchor, autoClose: true, onClose: () => setVisible(false) }, props.children)));
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export { SubMenu };
|
|
38
|
-
//# sourceMappingURL=SubMenu.js.map
|
package/dist/esm/SubMenu.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SubMenu.js","sources":["../../src/SubMenu.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport { Popup } from './Popup';\nimport './SubMenu.css';\n\nexport interface SubMenuProps {\n title: string;\n children: React.ReactNode;\n}\n\nexport function SubMenu(props: SubMenuProps): JSX.Element {\n const [hover, setHover] = useState(false);\n const [visible, setVisible] = useState(false);\n const [anchor, setAnchor] = useState<DOMRectReadOnly | undefined>(undefined);\n const menuItemRef = useRef<HTMLDivElement>(null);\n\n const hoverRef = useRef<boolean>(false);\n hoverRef.current = hover;\n\n const visibleRef = useRef<boolean>(false);\n visibleRef.current = visible;\n\n function show(): void {\n const el = menuItemRef.current;\n if (el) {\n setAnchor(el.getBoundingClientRect());\n setVisible(true);\n }\n }\n\n useEffect(() => {\n const timerId = window.setInterval(() => {\n if (!visibleRef.current && hoverRef.current) {\n show();\n } else if (visibleRef.current && !hoverRef.current) {\n setVisible(false);\n }\n }, 150);\n return () => window.clearInterval(timerId);\n }, []);\n\n return (\n <div\n ref={menuItemRef}\n className=\"medplum-menu-item medplum-submenu-item\"\n onClick={() => show()}\n onMouseOver={() => setHover(true)}\n onMouseLeave={() => setHover(false)}\n >\n {props.title}\n <span className=\"medplum-submenu-arrow\">{'\\u25BA'}</span>\n <Popup visible={visible} anchor={anchor} autoClose={true} onClose={() => setVisible(false)}>\n {props.children}\n </Popup>\n </div>\n );\n}\n"],"names":[],"mappings":";;;AASM,SAAU,OAAO,CAAC,KAAmB,EAAA;IACzC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAA8B,SAAS,CAAC,CAAC;AAC7E,IAAA,MAAM,WAAW,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;AAEjD,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAU,KAAK,CAAC,CAAC;AACxC,IAAA,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;AAEzB,IAAA,MAAM,UAAU,GAAG,MAAM,CAAU,KAAK,CAAC,CAAC;AAC1C,IAAA,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;AAE7B,IAAA,SAAS,IAAI,GAAA;AACX,QAAA,MAAM,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC;AAC/B,QAAA,IAAI,EAAE,EAAE;AACN,YAAA,SAAS,CAAC,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC;YACtC,UAAU,CAAC,IAAI,CAAC,CAAC;AAClB,SAAA;KACF;IAED,SAAS,CAAC,MAAK;AACb,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,MAAK;YACtC,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE;AAC3C,gBAAA,IAAI,EAAE,CAAC;AACR,aAAA;iBAAM,IAAI,UAAU,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;gBAClD,UAAU,CAAC,KAAK,CAAC,CAAC;AACnB,aAAA;SACF,EAAE,GAAG,CAAC,CAAC;QACR,OAAO,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;KAC5C,EAAE,EAAE,CAAC,CAAC;AAEP,IAAA,QACE,KACE,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,GAAG,EAAE,WAAW,EAChB,SAAS,EAAC,wCAAwC,EAClD,OAAO,EAAE,MAAM,IAAI,EAAE,EACrB,WAAW,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,EACjC,YAAY,EAAE,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAA;AAElC,QAAA,KAAK,CAAC,KAAK;AACZ,QAAA,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,uBAAuB,EAAA,EAAE,QAAQ,CAAQ;AACzD,QAAA,KAAA,CAAA,aAAA,CAAC,KAAK,EAAA,EAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC,KAAK,CAAC,EACvF,EAAA,KAAK,CAAC,QAAQ,CACT,CACJ,EACN;AACJ;;;;"}
|
package/dist/esm/TextArea.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { OperationOutcome } from '@medplum/fhirtypes';
|
|
2
|
-
import React, { RefObject } from 'react';
|
|
3
|
-
import './TextArea.css';
|
|
4
|
-
export interface TextAreaProps {
|
|
5
|
-
name?: string;
|
|
6
|
-
defaultValue?: string;
|
|
7
|
-
required?: boolean;
|
|
8
|
-
autoComplete?: string;
|
|
9
|
-
autoFocus?: boolean;
|
|
10
|
-
inputRef?: RefObject<HTMLTextAreaElement>;
|
|
11
|
-
outcome?: OperationOutcome;
|
|
12
|
-
placeholder?: string;
|
|
13
|
-
testid?: string;
|
|
14
|
-
monospace?: boolean;
|
|
15
|
-
style?: React.CSSProperties;
|
|
16
|
-
onChange?: (newValue: string) => void;
|
|
17
|
-
}
|
|
18
|
-
export declare function TextArea(props: TextAreaProps): JSX.Element;
|